Seite 1 von 1

DSL Rule immer wieder Probleme

Verfasst: 9. Jul 2022 15:13
von maddin2020
Hallo zusammen,

ich habe recht einfache Rules die bei mir eine Pushover Nachricht verschicken. Leider habe ich immer wieder Probleme mit den Rules und komme nicht weiter.

Code: Alles auswählen

//-------------  Büro --------------------
val bueroactions = getActions("pushover", "pushover:pushover-account:account")


rule "FensterBueroGeoffnet"
    when
        Item Fenster_Buero changed from CLOSED to OPEN
    then
        bueroactions.sendMessage("Fenster Büro wurde geöffnet","Home")
end

rule "FensterBueroGeschlossen"
    when
        Item Fenster_Buero changed from OPEN to CLOSED
    then
        bueroactions.sendMessage("Fenster Büro wurde geschlossen","Home")
end
Ich bekomme immer folgenden Fehlercode angezeigt.

Code: Alles auswählen

2022-07-09 09:34:21.466 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID '205_Buero-1' failed: null in 205_Buero
2022-07-09 09:34:21.972 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID '205_Buero-2' failed: null in 205_Buero
Kommentiere ich allerdings die Punkte mit dem Zugriff auf die Variable bueroactions aus und danach wieder ein läuft das ganze wieder eine Zeit lang. Was mach ich dort falsch anscheinend wird auf die Variable bueroactions nichts oder zu spät zugewiesen.

Danke vorab für eure Hilfe

Re: DSL Rule immer wieder Probleme

Verfasst: 9. Jul 2022 20:46
von udo1toni
Du müsstest die Definition der Variablen nicht mal ausklammern, es würde schon reichen, ein touch auf die Datei zu schicken.
Das Problem ist, dass Du den Handle auf die pushover Action als globale Konstante definiert hast. Dadurch wird dieser Handle ausschließlich beim beim (Re-)load der rules-Datei gesetzt. Der Handle ist aber nicht unbedingt fix, weshalb es besser ist, diesen in der Rule selbst zu definieren. Du brauchst außerdem nur eine Rule :)

Code: Alles auswählen

rule "Fenster Büro"
when
    Item Fenster_Buero changed
then
    val bueroactions = getActions("pushover", "pushover:pushover-account:account")
    var String strState = "wurde "
    if(previousState == NULL)
        strState = "ist "

    if(newState == OPEN)
        strState = strState + "geöffnet."
    else
        strState = strState + "geschlossen."

    bueroactions.sendMessage("Fenster Büro " + strState,"Home")
end
Die Rule löst aus, wenn sich der Status von Fenster_Buero geändert hat.
Es gibt vier verschiedene Möglichkeiten. Die ersten beiden Möglichkeiten ergeben sich daraus, dass der Status vorher NULL war. Dies geschieht gewöhnlich, wenn openHAB neu gestartet wurde.
Der neue Zustand ist dann entweder offen oder geschlossen, was auch den letzten beiden Zuständen entspricht, denen aber nicht NULL als Status voranging.
Die Rule definiert also über die Variable strState den Textbaustein "wurde ". Falls der alte Status NULL war, wird der Textbaustein durch "ist " ersetzt.
Im Anschluss wird der Textbaustein ergänzt. Falls der aktuelle Zustand OPEN ist, wird das Wort "geöffnet." ergänzt, sonst "geschlossen."

Als Meldung gibt es dann vier verschiedene Meldungen:
"Fenster Büro ist geöffnet."
"Fenster Büro ist geschlossen."
"Fenster Büro wurde geöffnet."
"Fenster Büro wurde geschlossen."

Wenn Du an den ersten beiden Meldungen nicht interessiert bist, kannst Du die Zeile strState = "ist " durch die Zeile return; ersetzen. Dann wird die Textausgabe unterdrückt, wenn der alte Status NULL war. Es ist natürlich sinnvoll, diesen Code ganz zu Anfang der Rule zu schreiben, damit der Handle nicht unnötig gesetzt werden muss. Der wichtige Teil ist aber vor allem, dass der Handle innerhalb der Rule gesetzt wird, nur so ist sichergestellt, dass der Handle auf jeden Fall gültig ist.

Re: DSL Rule immer wieder Probleme

Verfasst: 9. Jul 2022 21:44
von maddin2020
ein Traum danke Udo für die Hilfe. Ich sehe das nicht als selbstverständlich so schnell und kompetent Hilfe zu bekommen. GROSSEN RESPEKT - DANKE