Seite 1 von 1

Keyfob rule triggert nicht / Item name nicht korrekt?

Verfasst: 3. Apr 2020 00:05
von Pogo
Hallo,

ich bin leider neu in diesem Stoff, daher ist meine Frage wohl etwas beginnerlike aber dadurch vielleicht schnell zu klären. Mir werden inzwischen alle Google-Links zu dem Thema als gelesen markiert und ich weiß irgendwie nicht mehr weiter:
Ich versuche einen Fibaro Keyfob in mein OpenHAB einzubinden, das scheint auch gemäß events.log grundsätzlich zu funktionieren:

Code: Alles auswählen

[vent.ItemStateChangedEvent] - KeyfobTest_SceneNumber changed from 2.0 to 1.0
Der Keyfob selbst wird mir als KeyfobTest zwave:device:3ab768e4:node15 in der PaperUI (über die es auch eingebunden wurde) unter Things angezeigt.

Nun möchte ich natürlich die einzelnen Tastenereignisse innerhalb eines .rules-Files auswerten und entsprechenden Kommandos zuordnen. Dazu habe ich ein bei https://community.openhab.org/t/how-to- ... it/41044/4 gefundenes Gerüst verwendet und Informationen von anderer Stelle einfließen lassen. Meine "keyfob.rules" sieht testweise entsprechend nun so aus:

Code: Alles auswählen

rule "Keyfob"
when
	Item KeyfobTest received update
then
		logInfo("then-Block wird durchlaufen!")
		var swState = KeyfobTest.state as Number
		var name = "KeyfobRule"
		logInfo(name, "Update: " + swState.toString)
		
		switch swState {
			case 1.0: {
				logInfo(name, "Square1xClick")
				StudioRolloRechts_BlindsControl.sendCommand(UP)
			}
			...
		}
end
Problem: Die logInfo, die wohl eigentlich in der openhab.log erscheinen sollte, wird nicht ausgegeben. D.h. die Bedingung wird offensichtlich nicht erfüllt.
Frage: Muss ich in der Bedingung einen anderen Item-Name verwenden? Da in der events.log immer von "KeyfobTest_SceneNumber changed..." zu lesen ist, habe ich in der .rules-Datei "KeyfobTest" durch z.B. "Keyfob_SceneNumber" ersetzt. Dann erhalte ich in der openhab.log allerdings folgende Meldung:

Code: Alles auswählen

[ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Keyfob': An error occurred during the script execution: index=1, size=1
Jetzt stehe ich ziemlich auf dem Schlauch. Wie kann ich das Ereignis in der .rules abfangen?

Vielen Dank vorab. Ich hoffe die Formatierung ist ok so.

Re: Keyfob rule triggert nicht / Item name nicht korrekt?

Verfasst: 3. Apr 2020 01:24
von udo1toni
Die Fehlermeldung kommt von der falschen Nutzung des log-Befehls. logInfo (wie auch die anderen log-Varianten) erwartet exakt zwei Strings als Argumente, wobei der erste String der Loggername ist, der zweite String übergibt die auszugebende Meldung. Der Loggername setzt sich aus einem generischen und einem speziellen Teil zusammen, im log-Befehl wird nur der spezielle Teil genannnt, der generische Teil wird automatisch vorangestellt. Das liegt daran, dass das Logging in Rules nur ein kleines Puzzlestück im Logging ist. Jeder Bestandteil von openHAB nutzt innerhalb der Hierarchie eigene Loggernamen, so auch die Rules.

Dein Aufruf sollte also besser so aussehen:

Code: Alles auswählen

logInfo("keyfob","Keffob Rule getriggert!")
Wenn Du im Logging eine Variable verwenden willst, kanst Du die einfach einbetten:

Code: Alles auswählen

var Integer iMyInt = (KeyfobTest.state as Number).intValue
logInfo("keyfob","KefobTest Status ist {}",iMyInt)
Und wenn Du die Variable passend definierst (eben als Integer) sind die Chancen für ein funktionierendes switch-case auch besser ;)

Im Log Auszug heißt das Item allerdings nicht KeyfobTest sondern KeyfobTest_SceneNumber, da müsstest Du auch noch mal schauen, welcher Name nun der Richtige ist.

Re: Keyfob rule triggert nicht / Item name nicht korrekt?

Verfasst: 3. Apr 2020 11:45
von Pogo
Danke udo1toni, das hat mir sehr weitergeholen. Ich musste das jetzt für mich folgendermaßen anpassen:

Code: Alles auswählen

rule "Keyfob"
when
	Item KeyfobTest_SceneNumber received update
then
		var swState = (KeyfobTest_SceneNumber.state as Number)
		var String name = "KeyfobRule"
		logInfo(name, "then-Block wird durchlaufen!")
		logInfo(name, "Update: " + swState.toString)
		
		switch swState {
			case 1.0: {
				logInfo(name, "Square1xClick")
				StudioRolloRechts_BlindsControl.sendCommand(UP)
			}
		...
end
Da die Rückgabewerte von "Keyfob_SceneNumber" offenbar keine Zahlen sind (stattdessen "1.0", etc), habe ich das Definieren von swState als Integer weggelassen. Sind es Strings? Wenn ich daraus Integers mache, dann bricht openHAB das runter auf irgendwelche Zahlenwerte. In obigen Code-Zustand liefert mir das Log nun folgendes:

Code: Alles auswählen

[INFO ] [se.smarthome.model.script.KeyfobRule] - then-Block wird durchlaufen!
[INFO ] [se.smarthome.model.script.KeyfobRule] - Update: 1.0
[INFO ] [se.smarthome.model.script.KeyfobRule] - Square1xClick
Damit bin ich sehr zufrieden :-) Die Aktion wird auch ausgeführt.
Keine Ahnung, ob das so jetzt sauber ist oder ob man den Typ noch explizit mitgeben sollte.

Re: Keyfob rule triggert nicht / Item name nicht korrekt?

Verfasst: 3. Apr 2020 12:13
von udo1toni
Pogo hat geschrieben: 3. Apr 2020 11:45 Da die Rückgabewerte von "Keyfob_SceneNumber" offenbar keine Zahlen sind (stattdessen "1.0", etc), habe ich das Definieren von swState als Integer weggelassen. Sind es Strings? Wenn ich daraus Integers mache, dann bricht openHAB das runter auf irgendwelche Zahlenwerte. In obigen Code-Zustand liefert mir das Log nun folgendes:

Code: Alles auswählen

[INFO ] [se.smarthome.model.script.KeyfobRule] - then-Block wird durchlaufen!
[INFO ] [se.smarthome.model.script.KeyfobRule] - Update: 1.0
[INFO ] [se.smarthome.model.script.KeyfobRule] - Square1xClick
Damit bin ich sehr zufrieden :-) Die Aktion wird auch ausgeführt.
Keine Ahnung, ob das so jetzt sauber ist oder ob man den Typ noch explizit mitgeben sollte.
Nein, das sind ganz normale Zahlen, ganz sicher, denn die Zeile im Code

Code: Alles auswählen

var swState = (KeyfobTest_SceneNumber.state as Number)
castet den Status ja nach Number. 1.0 ist halt eine Float Zahl. Aber ein

Code: Alles auswählen

var Integer swState = (KeyfobTest_SceneNumber.state as Number).intValue
sollte entsprechend eine 1 ergeben, nicht irgendeinen anderen Wert.
Lass doch bitte das Wort Rule im Loggernamen weg, das ist doppelt gemoppelt.
Eine wichtige Programmierregel ist, Redundanzen so weit möglich zu vermeiden. ;)

Lass Dir vom logInfo den Wert ausgeben:

Code: Alles auswählen

    logInfo(name, "Update: {} ",(KeyfobTest_SceneNumber.state as Number))
    logInfo(name, "Update: {}",(KeyfobTest_SceneNumber.state as Number).intValue)
dann wirst Du sehen, dass da immer der gleiche Wert raus kommt.

Re: Keyfob rule triggert nicht / Item name nicht korrekt?

Verfasst: 3. Apr 2020 21:16
von Pogo
Danke. Ich habe das jetzt mal durchgetestet. Setze ich ein "as Number" dahinter, verändert sich nichts (1.0). Mit ".IntValue" wird es dann zur 1 (für meinen Fall dann unbrauchbar). Habe jetzt nichts am Typ geändert und es funzt. Also:

Code: Alles auswählen

var swState = (KeyfobTest_SceneNumber.state)
Vielen Dank

Re: Keyfob rule triggert nicht / Item name nicht korrekt?

Verfasst: 3. Apr 2020 23:23
von udo1toni
Warum ist 1 unbrauchbar?

EDIT: Ah, ich sehe gerade, es wird tatsächlich auch die Stelle hinter dem Komma verwendet, um Informationen zu übertragen. Dann geht natürlich ein Integer nicht.
Wobei ich dann trotzdem dazu tendieren würde, die Zahl mit 10 zu multiplizieren und doch ein Integer zu verwenden, einfach weil ein Integer Wert immer eindeutig ist, ein Float Wert ist aber immer mit einer Ungenauigkeit behaftet.

Re: Keyfob rule triggert nicht / Item name nicht korrekt?

Verfasst: 6. Apr 2020 22:22
von Pogo
Ja genau. Die Ziffer wird verwendet.
Danke für die Info. Das sehe ich ein :-) Bin noch in der Aufbauphase...dann kommen die höheren Weihen.