Ich habe vor viele Rules die das selbe machen, in eine Rule zu verwandeln mit variablen, anstelle itemname mit variablen.
Ein teil habe ich schon geschafft aber der letzte teil möchte nicht gehen. Das Lastupdate beschäftigt mich noch.
Idee:
Irgendein Schalter in der Gruppe Spricht an
--> log info Welcher Schalter (danach telegram aber loginfo ist besser zum debugen)
--> Setzt XX_LastUpdate die Aktuelle zeit
--> setzt XX_LastUpdateHB auf on
Im Prinzip geht es, aber die Vielen If möchte ich auch noch eliminieren. Da die Regel so auch noch angepasst werden muss wenn weitere Schalter hinzugefügt werden.
Wo ich noch an stehe ist:
Der zusammen gebaute String (ich vermute es ist ein String da postUpdate(LastUpdateHB,"ON") die "" benötigt ) akzeptiert die aktuelle Zeit nicht.
Ich vermute es ist ein Konvertierung Problem. Da stehe ich aktuell auf dem Schlauch.
Die Seiten https://community.openhab.org/t/datetim ... 3-x/107197 und https://community.openhab.org/t/datetim ... -2-x/54266 und diverse suchmaschinen stunden haben mich noch nicht auf die richtige variante gemacht.
Vielleicht weiss jemand von euch wie das optimal geht.
System / Version:
Als Tests System benutze ich
- Windows 10
- Openhab 3.0.2
- docker für openhablog files
sitemap
Code: Alles auswählen
sitemap default label="Test" {
Frame label="TestGruppe"
{
Switch item=TestGruppe
Switch item=Bli1
Switch item=Bli2
Switch item=Bli3
}
Frame label="Letztes update"
{
Text item=Bli1_LastUpdate valuecolor=[>30="red",>10="orange",<=10="green"]
Switch item=Bli1_LastUpdateHB
Text item=Bli2_LastUpdate valuecolor=[>30="red",>10="orange",<=10="green"]
Switch item=Bli2_LastUpdateHB
Text item=Bli3_LastUpdate valuecolor=[>30="red",>10="orange",<=10="green"]
Switch item=Bli3_LastUpdateHB
}
Frame label="Info"
{
Text item=info_text
}
}
items
Code: Alles auswählen
Group:Switch TestGruppe "Gruppe Bli "
Group:Switch LastUpdateHB "Last Update HB"
// Schalter
Switch Bli1 "Bli 1 " (TestGruppe)
Switch Bli2 "Bli 2 " (TestGruppe)
Switch Bli3 "Bli 3 " (TestGruppe)
String info_text "[%S]"
//Letztes Mal updatet
DateTime Bli1_LastUpdate "Bli1 Last seen [%1$tY-%1$tm %1$tH:%1$tM:%1$tS]" <time>
DateTime Bli2_LastUpdate "Bli2 Last seen [%1$tY-%1$tm %1$tH:%1$tM:%1$tS]" <time>
DateTime Bli3_LastUpdate "Bli3 Last seen [%1$tY-%1$tm %1$tH:%1$tM:%1$tS]" <time>
//wenn expire Zeit abgelaufen ist aktion ausführen
Switch Bli1_LastUpdateHB "Bli1 LastUpdateHB [%s]" (LastUpdateHB) {expire="5s,command=OFF"}
Switch Bli2_LastUpdateHB "Bli2 LastUpdateHB [%s]" (LastUpdateHB) {expire="5s,command=OFF"}
Switch Bli3_LastUpdateHB "Bli3 LastUpdateHB [%s]" (LastUpdateHB) {expire="5s,command=OFF"}
rules
Zeile 30 und 31
Code: Alles auswählen
//https://community.openhab.org/t/group-rules-trigger/38512
rule "Member pressed"
when
//https://www.openhab.org/docs/configuration/rules-dsl.html#member-of-triggers
Member of TestGruppe received update
then
// give persistence time to catch up
Thread::sleep(500)
// persistence MapDB installieren
val status = TestGruppe.members.filter[s|s.lastUpdate("mapdb") !==null].sortBy[lastUpdate("mapdb")].last as SwitchItem
val Werwares = status.name.toString
//Antelle loginfo Telegram
logInfo("GroupTest", "Item "+ Werwares +" wechsel auf " + status.state )
info_text.sendCommand( Werwares +" wechsel auf " + status.state)
//Zu letzt gesehen
if (Werwares=="Bli1") { postUpdate(Bli1_LastUpdate, new DateTimeType()) postUpdate(Bli1_LastUpdateHB,ON) }
if (Werwares=="Bli2") { postUpdate(Bli2_LastUpdate, new DateTimeType()) postUpdate(Bli2_LastUpdateHB,ON) }
if (Werwares=="Bli3") { postUpdate(Bli3_LastUpdate, new DateTimeType()) postUpdate(Bli3_LastUpdateHB,ON) }
// vereinfachung Versuche Item Name zu generienren
val LastUpdate = triggeringItem.name +"_LastUpdate"
val LastUpdateHB = triggeringItem.name +"_LastUpdateHB"
logInfo("GroupTest", LastUpdate + " / " + LastUpdateHB )
//postUpdate(LastUpdate, new DateTimeType())
postUpdate(LastUpdateHB,"ON")
//oder
val LastUpdate1 = Werwares +"_LastUpdate"
val LastUpdateHB1 = Werwares +"_LastUpdateHB"
logInfo("GroupTest", LastUpdate1 + " / " + LastUpdateHB1 )
//postUpdate(LastUpdate1, new DateTimeType())
//postUpdate(LastUpdateHB1,"ON")
end
rule "Zeitvergleich"
when
Member of LastUpdateHB received update
then
// give persistence time to catch up
Thread::sleep(500)
// persistence MapDB Persistence
val zeitstatus = LastUpdateHB.members.filter[s|s.lastUpdate("mapdb") !==null].sortBy[lastUpdate("mapdb")].last as SwitchItem
val zeitWerwares = zeitstatus.name.toString
//ein ein HB heartbeat kanal auf Off geht kam keine update mehr
if (zeitstatus.state==OFF)
{
//Info Logfile das update nicht mehr kommt
logInfo("GroupTest", "Letztes Update von "+ zeitWerwares +" ist älter als LastUpdateHB definirt ")
}
end