MQTT Device "nicht verfügbar" anzeigen

Begonnen von Pulsar07, 19 Dezember 2021, 09:14:56

Vorheriges Thema - Nächstes Thema

Pulsar07

Habe auf Basis von ESP8266 mehrere unterschiedliche MQTT devices erstellt.
Solange diese eingeschaltet sind, senden diese diverse Daten (normallerweise alle 10s).
Wenn ich diese Geräte nicht benötige (z.B. Temperatur- und Rauchüberwachung meines 3D-Druckers), sind diese Geräte stromlos und senden deshalb nichts.

Gibt es einen Weg diesen Zustand "nicht verfügbar" abzubilden, so das das Gerät z.B. in seinem StateFormat "ausgeschaltet" anzeigt?

Wäre für nen Tipp dankbar.
Gruß Rainer

Beta-User

no info => no info

Glaskugel-Stichwort: LWT (iVm. Perl-stateFormat oder -devStateIcon)
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Pulsar07

Danke für deine Antwort, habe die kryptische Antwort vermutlich nur zum Teil verstanden ;-)
Aber das Stichwort LWT oder eben Last Will and Testament, das im MQTT Protokoll vorhanden ist, hat deutlich Licht in die Sache gebracht.
Um allen evtl. Nachlesern die Mühe zu ersparen hier in kurzen Worten das Resultat meiner Recherche:
LWT ist ein Feature des MQTT Protokolls.
Man kann bei der Verwendung einer MQTT-Client-Lib (ich verwende PubSubClient) beim Aufruf der connect()-Methode ein frei wählbares LastWill-Topic und einen LastWill-Payload (z.B. "offline) mitgeben. Dieser wird an alle Subscriber des Topics gesendet, für den Fall dass, der Client die Verbindung zum Broker verliert (z.B. durch Ausschalten der Sensor Hardware (bei mir Wemos D1))
Wird in der Implementierung dasselbe Topic mit einem anderen Wert (z.B. "online") nach erfolgreicher Verbindung mit dem Broker gesendet, dann wird natürlich dieser Wert angezeigt.

Gruß Rainer

mike1969bln

Haben denn deine Devices ein LWT-Topic? Ich habe mit Tasmota geflashte Geräte, bei denen gibt es das standardmäßig.

Ich habe es dann so gelöst:


attr XXX stateFormat 1:state\2:LWT
attr devStateIcon 1.An:general_an@green 1.Aus:general_aus@red
2.Online:it_wifi@green 2.Offline:it_wifi@red

Pulsar07

Jetzt haben sie ein LWT Topic, nachdem ich wie beschrieben gelernt habe, dass es sowas gibt ;-).
Auch meine Tasmota-Steckdosen haben ein LWT Topic, aber auch über die von mir benutzten attrTemplates wird das LWT nicht ausgewertet, obwohl es da ist und funktioniert. Aber wenn man nicht weiß, dass es das Feature gibt und nicht weiß wie es heißt, tut man sich schwer es zu finden.
Habe bei meinem Client mal folgende Perl basiertes stateFormat, was gut funktioniert:
{
  if (ReadingsVal($name,"LWT",0) =~ m/offline/) {
    return "offline";
  } else {
    return "Power: ".ReadingsVal($name,"power",0)
     ."/".ReadingsVal($name,"pwm_heatcontroller",0)
     ."/".ReadingsVal($name,"heatpower",0)."%"
     ."/".ReadingsVal($name,"heatpwmctrl",0)
     ."/".ReadingsVal($name,"heatduration",0)."dhm, "
     ."TT:".ReadingsVal($name,"target",0)."°C, "
     ."NT:".ReadingsVal($name,"temp_near",0)."°C, "
     ."FT:".ReadingsVal($name,"temp_far",0)."°C"
     ;
  }
}

Gruß Rainer