Seite 1 von 1

LWT Online/Offline Erkennung

Verfasst: 14. Feb 2020 08:33
von seppy
Hallo Zusammen,
in verschiedenen Tgreads ist das Thema immer mal wieder angesprochen worden, aber ich konnte mir bisher keine zufriedenstellende Gesamtlösung bilden.
Herrausforderung:
Ich habe inzwischen an sehr vielen Großverbrauchern (Weiße Ware, Kühlschrank, etc.) schaltbare Strommesssteckdosen die ich mit Tasmota beglückt habe. Das funktioniert auch wunderbar ... Jetzt ist es passiert, dass eines der Kinder die Steckdose meines Bier!!kühlschranks in der Garage ausgesteckt hat, weil der junge Mann sein ferngesteuertes Auto laden wollte. Ich bekomme davon natürlich nichts mit ... Folge ... Bier warm.

Lösungsansatz:
Im Konzept von MQTT gibt es ja das Last Will Testament (LWT) Konzept, was meinem Verständnis nach genau für solche Dinge gedacht ist. Ich verstehe aber noch nicht wie ich das konfiguriere?. Ich habe einen Testaufbau mit einer weiteren Zwischensteckdose gemacht, habe ein Channel auf das LWT Topic gesetzt und ein entsprechendes String Item angelegt. Ich dachte wenn ich jetzt die Dose einfach ausstecke müsste irgendwann der Broker eine LWT Message absetzen. Aber wann? es passiert leider nichts.

Hier gibt es doch einige die schon lange mit MQTT arbeiten und mir evtl. auf die Sprünge helfen können.
Danke und Grüße,
Seppy

Re: LWT Online/Offline Erkennung

Verfasst: 14. Feb 2020 12:53
von udo1toni
LWT funktioniert folgendermaßen:

Schritt 1: Das Gerät meldet sich beim Broker an.
Schritt 2: es übermittelt das LWT topic und die Information, dieses (z.B.) auf OFFLINE zu setzen.
Schritt 3: Das Gerät setzt das Topic auf ONLINE.

Wenn nun die Verbindung zwischen Broker und Client verloren geht, setzt der Broker unmittelbar das entsprechende Topic auf OFFLINE, stellvertretend für das Gerät, welches das ja nicht mehr selbst tun kann.
Welche Werte hinterlegt werden, ist nicht definiert, da könnte auch Humdidumm oder 0815 stehen :)
Wichtig ist aber, dass das Tasmota Gerät das LWT setzt, das sollte regulär der Fall sein. Das LWT Topic wäre tele/%topic%/LWT, die Werte Online und Offline. Das LWT sollte auch auf Retain stehen.
Entsprechend müsste ein Channel in openHAB dafür so aussehen:

Code: Alles auswählen

Type switch: lwt "LWT" [ stateTopic="tele/topic/LWT",on="Online",off="Offline" ] 
Prüfe über mqtt spy oder ein anderes Tool, ob Du das LWT zu Gesicht bekommst.

Re: LWT Online/Offline Erkennung

Verfasst: 14. Feb 2020 17:22
von seppy
Hm, ich dachte so hätt eich das gelöst. Dann muss ich heute abend mal in Ruhe schauen.
Melde mich wieder.

Re: LWT Online/Offline Erkennung

Verfasst: 14. Feb 2020 22:46
von peter-pan
...das geht ja gar nicht, wenn das "wichtigste" Haushaltgerät nicht mehr unsere "Grundnahrungsmittel" in der richtigen Kühlung halten kann. :o

Im Prinzip hat ja Udo alles schon gesagt.

Zur Veranschaulichung hier mal einBeispiel aus meinem SetUp. Es ist zwar ein Basic, aber die anderen funktionieren ja eh gleich.

.items

Code: Alles auswählen

Group:Switch:OR(OFF,ON)   gLWT           "Tasmotas Online [%s]"                             <siren1>                

//192.168.178.xx                         basic-03                                           
Switch    Sonoff_Basic_03                "Schreibtischlampe Büro [MAP(de.map):%s]"          <tablelamp>             (EG_Buro,gSonoff,gLight)     { channel="mqtt:topic:hans:basic03:power" }
Number    Sonoff_Basic_03_RSSI           "Schreibtischlampe Büro RSSI [%s]"                 <qualityofservice>      (EG_Buro,gRSSI)              { channel="mqtt:topic:hans:basic03:rssi" } 
String    Sonoff_Basic_03_Version        "Schreibtischlampe Version 31[%s]"                 <sonoff_basic>          (gSonoffs,gVer)              { channel="mqtt:topic:hans:basic03:version" } 
Switch    Sonoff_Basic_03_Unreach        "Schreibtischlampe Ereichbarkeit [%s]"             <siren1>                (EG_Buro,gLWT)               { channel="mqtt:topic:hans:basic03:reachable" }
String    Sonoff_Basic_03_Hardware       "Schreibtischlampe ChipSet 31[%s]"                 <sonoff_basic>          (gSonoffs,gHard)             { channel="mqtt:topic:hans:basic03:hardware" } 
String    Sonoff_Basic_03_IPAddress      "Schreibtischlampe IP-Address [%s]"                <sonoff_basic>          (gSonoffs,gHard)             { channel="mqtt:topic:hans:basic03:ipaddress" } 
.things

Code: Alles auswählen

    Thing topic basic03 "Sonoff Basic 03 Schreibtischlampe" @ "MQTT2" {
    Channels:
        Type switch : power     "Power "                 [ stateTopic="stat/basic_03/POWER", commandTopic="cmnd/basic_03/POWER" ]
        Type number : rssi      "WiFi Signal Strength"   [ stateTopic="tele/basic_03/STATE", transformationPattern="JSONPATH:$.Wifi.RSSI"]
        Type string : version   "Firmware Version    "   [ stateTopic="stat/basic_03/STATUS2", transformationPattern="JSONPATH:$.StatusFWR.Version"]
        Type switch : reachable "Reachable"              [ stateTopic="tele/basic_03/LWT",transformationPattern="MAP:reachable.map" ]
        Type string : hardware  "Chip Set            "   [ stateTopic="stat/basic_03/STATUS2", transformationPattern="JSONPATH:$.StatusFWR.Hardware"]
        Type string : ipaddress "IP Address          "   [ stateTopic="stat/basic_03/STATUS5", transformationPattern="JSONPATH:$.StatusNET.IPAddress"]


//        Type switch : powerx     "Power X"                 [ stateTopic="stat/basic_03/POWER", trigger=true ]  // Trigger Channel; no need to define an item // Test with Channel Event Trigger - test_mqtt.rules
    }
reachable.map

Code: Alles auswählen

Online=ON
Offline=OFF
online=ON
offline=OFF
-=Undefined
Connected=ON
"Connection Lost"=OFF
.rules

Code: Alles auswählen

import org.eclipse.smarthome.model.script.ScriptServiceUtil

rule "gLWT_Logging"

when Member of gLWT changed // to OFF
then
   if(Sonoff_LWT_Logging.state == ON) {
      var GenericItem tempItemName = ScriptServiceUtil.getItemRegistry.getItem(triggeringItem.name.replace("_Unreach","_Version")) as  GenericItem
      logInfo ("sonoff_gLWT_Logging", "Ausgabe-Gerät: "  + triggeringItem.label + ": " +triggeringItem.state.toString + " : " + triggeringItem.name + " Release-Version: " + tempItemName.state.toString)     
    }
end
//===============================================================================================
Die Regel wird getriggert über das Gruppen-Item. (OFF,ON)
Ich habe das LWT-Thing mit einem TransformationPattern umgesetzt (weiss aber nicht mehr warum- wahrscheinlich geklaut :oops: )

Beim Systemstart, wird schon bemerkt, wenn eine Item nicht mehr da ist(in diesem Fall die Schreibtischlampe:

Code: Alles auswählen

2020-02-14 22:15:44.041 [INFO ] [ome.model.script.sonoff_gLWT_Logging] - Ausgabe-Gerät: Deckenlampe York Ereichbarkeit: ON : Sonoff_T1_01_Unreach Release-Version: NULL
2020-02-14 22:15:44.048 [INFO ] [ome.model.script.sonoff_gLWT_Logging] - Ausgabe-Gerät: Schreibtischlampe Ereichbarkeit: OFF : Sonoff_Basic_03_Unreach Release-Version: NULL
2020-02-14 22:15:44.070 [INFO ] [ome.model.script.sonoff_gLWT_Logging] - Ausgabe-Gerät: Steckdose RasPi 3b+ Ereichbarkeit: ON : Sonoff_socket_03_Unreach Release-Version: NULL
...............................................
Das Ganze sieht dann in der SiteMap so aus:
Übersicht:
lwt.jpg
Detail:
lwt-det.jpg
Wenn das Gerät wieder online ist triggert die Rule im Logger

Code: Alles auswählen

2020-02-14 22:40:56.107 [INFO ] [ome.model.script.sonoff_gLWT_Logging] - Ausgabe-Gerät: Schreibtischlampe Ereichbarkeit: ON : Sonoff_Basic_03_Unreach Release-Version: NULL
In deinem Falle wäre es natürlich besser, wenn die Regel beim Rausziehen des Steckers, die Alarmanlage mit Blaulicht anschalten würde, damit man den Temperaturanstieg in Grenzen halten kann. ;)

Re: LWT Online/Offline Erkennung

Verfasst: 16. Feb 2020 14:38
von seppy
Hi und danke Euch.
Mit dem Gedankenanstoß habe ich es in etwa so gebaut wie Du. Aber ich habe eine "Optimierung" vorgenommen. Ich nutze die regelmäßigen Messages um den Status zu validieren.
Da sich die Devices ja nur nach einem Neustart mit ihrem LWT = Online melden, aber nicht wenn der Broker mal weg war, oder die Netzwerkverbindung einen Hickup hatte, habe ich noch folgenden Helfer gebaut:

Auszug things

Code: Alles auswählen

Type number : uptimesec
            "UptimeSec"
            [stateTopic="tele/mqttclient_smartplug8/STATE", transformationPattern="JSONPATH:$.UptimeSec" ]
Auszug items

Code: Alles auswählen

Number SmartPlug8UPTIMESEC 
    (gMQTTDeviceUPTIMESEC)
    {channel="mqtt:topic:ThgSmartPlug8:uptimesec"}
Passende Regel:

Code: Alles auswählen

rule "Event_MQTTUnreachedUpdate"
when
	Member of gMQTTDeviceUPTIMESEC changed
then
	logDebug("HomeBox.Event_MQTTUnreachedUpdate", "Item {} hat ausgelöst",triggeringItem.name)
    val replace = newArrayList("UPTIMESEC","ENERGYCurrent","ENERGYToday","ENERGYTotal","StateRes","Res","CurState","State")
    var trigger = null
    replace.forEach[x|
		if (triggeringItem.name.toString.trim().contains(x)){
			logDebug("HomeBox.Event_MQTTUnreachedUpdate", "Ersetze {} durch UNREACH",x)
        	trigger = triggeringItem.name.toString.trim().replaceAll(x,"UNREACH")
		}
    ]
	if (trigger !== null) {
		val mqttItem = ScriptServiceUtil.getItemRegistry?.getItem(trigger)
		logDebug("HomeBox.Event_MQTTUnreachedUpdate", "Item {} in Registry gesucht",mqttItem.name)
		// Setze den UnreachedState auf OFF da das Thing gesehen wurde
		if (mqttItem.state != OFF) {
			logInfo("HomeBox.Event_MQTTUnreachedUpdate", "Item {} --> Setze entsprechendes Thing via {} Online",trigger,mqttItem.name.toString)
			mqttItem.sendCommand(OFF)
		}
	}
end 
In der Regel sind noch die Optionen für weitere Trigger. Die habe ich noch nicht zurückgebaut.
Gibt es Kommentare, bzw. andere Lösungen für das Problem?

Grüße,
Seppy

Re: LWT Online/Offline Erkennung

Verfasst: 16. Feb 2020 16:15
von peter-pan
Das hört sich interessant an. Komme aber heute nicht mehr dazu, es genauer anzuschauen. Ich werde mich mal im Laufe der nächsten Woche in das Thema vertiefen.

Gruss - Peter

Re: LWT Online/Offline Erkennung

Verfasst: 17. Feb 2020 00:09
von udo1toni
seppy hat geschrieben: 16. Feb 2020 14:38 Da sich die Devices ja nur nach einem Neustart mit ihrem LWT = Online melden, aber nicht wenn der Broker mal weg war
Wenn der Client den Kontakt zum Broker verliert und wieder erlangt, muss er das LWT erneut setzen. Ist das nicht der Fall, dann ist das ein Fehler in der Implementation.
Der Client muss davon ausgehen, dass der Kontakt zum Broker nur für den Client verloren gegangen war und somit der Broker das LWT gesetzt hat.

Re: LWT Online/Offline Erkennung

Verfasst: 17. Feb 2020 08:25
von seppy
Dann vermute ich, dass die Tasmota Implementierung an der Stelle nicht sauber ist. Denn genau dieses Verhalten hatte ich bei mir.