In einer Rule String to Item

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Caddy
Beiträge: 117
Registriert: 16. Nov 2018 08:21
Answers: 0

In einer Rule String to Item

Beitrag von Caddy »

Hallo,

kann mal jemand vorlesen was ich falsch mache :-)

Das triggered Item heißt Sonoff01_State und kann sein ON oder OFF
Das Item welches geschaltet werden soll heißt Sonoff_Light und kann sein ON oder OFF

Hintergrund ist das ich beim Booten die Statis der Icons und Schalte richtig setzen möchte
Das Versuche ich so:

Code: Alles auswählen

rule "gSetIcon_state_changed"
when
    // Member of gSetIcon changed 
	Member of gSetIcon received update
then
	logWarn("Rule.Testrule","triggeringItem.name: {} ",triggeringItem.name)
	
	val nameItem = triggeringItem.name.toString.split("_")
	val ItemNameNew = nameItem.get(0) + "_Light"
	val foundItem = gSetIcon.members.findFirst[ i | i.name.toString == ItemNameNew.toString ]

	logWarn("Rule.Testrule","ItemNameNew: {} ",foundItem)

	if (triggeringItem.state != NULL){
		logWarn("Rule.Testrule","geschaltet 1")
		foundItem.sendcommand(OFF)
	} 
end

Im Log erscheint darauf hin das

Code: Alles auswählen

2019-02-08 08:39:22.596 [WARN ] [smarthome.model.script.Rule.Testrule] - triggeringItem.name: Sonoff02_State 
2019-02-08 08:39:22.624 [WARN ] [smarthome.model.script.Rule.Testrule] - ItemNameNew: {} 
2019-02-08 08:39:22.628 [WARN ] [smarthome.model.script.Rule.Testrule] - geschaltet 1
2019-02-08 08:39:23.751 [WARN ] [smarthome.model.script.Rule.Testrule] - triggeringItem.name: Sonoff09_State 
2019-02-08 08:39:23.798 [WARN ] [smarthome.model.script.Rule.Testrule] - ItemNameNew: {} 
2019-02-08 08:39:23.805 [WARN ] [smarthome.model.script.Rule.Testrule] - geschaltet 1

also keine Fehler aber die Variable ist leer …

habe es auch schon mit Postupdate versucht was ja richtiger wäre klappt aber auch nicht

Hilfe ....

Danke Caddy

mamoel
Beiträge: 137
Registriert: 12. Jan 2019 19:56
Answers: 0

Re: In einer Rule String to Item

Beitrag von mamoel »

Code: Alles auswählen

val nameItem = triggeringItem.name.toString.split("_")
würde ich ändern auf

Code: Alles auswählen

val nameItem = triggeringItem.name.split('_')
Ich schätze ".name" ist schon vom Typ "string". Außerdem sollte das Zeichen bei dem gesplittet wird in einfachen Hochkomma stehen (soweit ich weiß).
Also ' statt ".

Noch kürzer wäre

Code: Alles auswählen

val ItemNameNew = triggeringItem.name.split('_').get(0) + "_Light"
openHAB 2.5 (M1) in Docker auf NAS: Synology DS418play
mit Homematic, Hue, TP-Link, AVM Fritz!, FritzboxTR064, Nuki, Amazon Echo, Sonos, Harmony, zigbee2mqtt, Denon/Marantz, ...

Benutzeravatar
udo1toni
Beiträge: 15246
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: In einer Rule String to Item

Beitrag von udo1toni »

In der Rules DSL ist es (zumindest in diesem Fall) gleichgültig, ob man einfache oder doppelte Anführungszeichen verwendet.

.name ist schon String, ich bin mir noch nicht mal sicher, ob es an dieser Stelle die Methode .toString überhaupt gibt.
die Methode heißt .sendCommand() oder alternativ .postUpdate() Jedes Zeichen muss exakt so eingegeben werden! PostUpdate ist genauso falsch wie sendcommand.
Das Ganze rumgevalle ;) ist auch nur Ballast. schau mal:

Code: Alles auswählen

rule "gSetIcon state changed"
when
    // Member of gSetIcon changed 
    Member of gSetIcon received update
then
    logInfo("gSetIcon","triggering Item: {} ",triggeringItem.name)
    var foundItem = gSetIcon.members.filter[ i|i.name == triggeringItem.name.split("_").get(0)+"_Light" ].head
    logInfo("gSetIcon","found Item: {} ",foundItem.name)
    if (triggeringItem.state != NULL){
        logInfo("gSetIcon","geschaltet 1")
        foundItem.postUpdate(triggeringItem.state)
    }
end
logInfo ist hier korrekt, denn für korrektes Verhalten sollte keine Warnung ausgespuckt werden.
In der Loggingquelle steht bereits drin, dass der Trigger eine Rule ist (schau dir den vorderen Teil mal an) entsprechend ist ein kurzer Name, der am besten auch noch mit der Rule korrespondiert sinnvoller.
filter[ ].head gibt das erste Item der gefilterten Liste zurück.

Allerdings verstehe ich den Anlass des ganzen nicht so ganz. Bei Systemstart sollten die Status (jep, das ist der Plural) nach und nach eingelesen werden. Bei MQTT ergibt sich das Problem, dass hier der Status aktiv ausgelesen werden müsste. Das macht man aber anders. Nehmen wir an, Du hast eine Gruppe aller Sonoff Items, die für den Schaltkanal eines Devices stehen. Das Item sollte bidirektional funktionieren, also ein Topic für cmnd und ein Topic für stat haben. Bei Systemstart bekommt openHAB keinen Status, erst, wenn das Item geschaltet wird. Man kann aber das Senden der Status erzwingen, indem man einen leeren Power-Befehl sendet. vermutlich müsste man dazu ein zweites Item pro Sonoff-Kanal anlegen, oder alternativ die mqtt action bemühen. Dazu muss man allerdings die Topics innerhalb einer Rule generieren, das funktioniert natürlich nur, wenn die Topics aller Sonoffs einer passenden Logik folgen.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten