Seite 1 von 1

Member of Group - last Item falsch

Verfasst: 13. Apr 2021 13:16
von mcdandrew
Ich habe verschiedene Items welche einfache nur via Ping auf Verfügbarkeit gecheckt werden.
Beispielsweise für unsere Fernseher gibt es folgende Items, welche alle einer Gruppe angehören

Code: Alles auswählen

Group:Switch:OR(ON,OFF) gfernseher		"Fernseher"

Switch phillips_tv	"Fernseher Wohnzimmer [MAP(pingdevice.map):%s]"	(gfernseher) {channel="network:pingdevice:phillips_tv:online"}
Switch samsung_gz_tv "Fernseher Gästezimmer[MAP(pingdevice.map):%s]"	(gfernseher) {channel="network:pingdevice:samsung_gz_tv:online"}
Switch samsung_oben_tv "Fernseher oben[MAP(pingdevice.map):%s]"		(gfernseher) {channel="network:pingdevice:samsung_jolin_tv:online"}
Um den Fernsehkonsum unserer Kinder kontrollieren zu können, hätte ich gerne bei jedem Eisnchalten und Abschalten eine Nachricht auf mein Handy.
Um nun nicht für jeden Fernseher eine eigene Rule zu erstellen, dachte ich mir ich erstelle eine Rule und lasse diese auf die Gruppe triggern. In einer Liste wird dann das letzte Element ausgelesen, welches seinen Status geändert hat.
So recht funktioniert das aber nicht....die Nachtricht kommt zwar an aber mit dem falschen Gerät.
Das Problem eigentlich nur bei der "Offline" Regel auf.

Code: Alles auswählen

rule "fernseher_offline"
when
	Member of gfernseher changed from ON to OFF 
then 
	val lastItem = gfernseher.members.filter[i | i.state==OFF ].head
	val labelOfItem = lastItem.label
	
	sendNotification("xxxxxxxxxx", labelOfItem + " - ausgeschalten")	
end


rule "fernseher_online"
when
	Member of gfernseher changed from OFF to ON 
then 
	
	val lastItem = gfernseher.members.filter[i | i.state==ON ].head
	val labelOfItem = lastItem.label
		
	sendNotification("xxxxxxxxx", labelOfItem + " - eingeschalten")
end

Re: Member of Group - last Item falsch

Verfasst: 13. Apr 2021 14:23
von Anbeku
Ich kenne mich mit der DSL nicht so aus, aber wenn ich das richtig interpretiere, schaust du nur was das erste Element der Gruppe ist, welches eingeschaltet (oder ausgeschaltet) ist. Die Reihenfolge dürfte da völlig willkürlich sein. Das muss nicht das Element sein, dass diese Rule ausgelöst hat. Ich denke du kkannst einfach die Variable "triggeringItem" nehmen, die enthält immer das Item, das getriggert hat. Damit dürftest du deine Rule auch deutlich verkürzen können.

Re: Member of Group - last Item falsch

Verfasst: 13. Apr 2021 18:30
von udo1toni
Warum überhaupt zwei Rules? Warum der Umweg über die Gruppenmember? Du brauchst lediglich diese Rule:

Code: Alles auswählen

rule "Fernseher on-off"
when
    Member of gfernseher changed
then
    val String strState = if(triggeringItem.state == ON) "ein" else "aus"
    sendNotification("xxxxxxxxxx", triggeringItem.label + " - " + strState + "geschalten")
end
triggeringItem enthält das Item, welches die Rule ausgelöst hat.

Re: Member of Group - last Item falsch

Verfasst: 13. Apr 2021 22:09
von mcdandrew
Manchmal kann es doch so einfach sein :lol:

Ich danke euch!