Script execution of rule failed

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
kaloschke
Beiträge: 175
Registriert: 29. Jan 2019 07:20

Script execution of rule failed

Beitrag von kaloschke »

Hallo,

ich bekomme beim START von Openhab (V3.3) diese Meldung:

Code: Alles auswählen

Script execution of rule with UID 'garden-34' failed: Could not cast NULL to java.lang.Number; line 393, column 39, length 30 in garden
Die betreffende Zeile ist die letzte unten ...

Code: Alles auswählen

rule "Update Terrasse"
    when
        Item HLightNorth received update
    then
        var String NewState = HLightNorth.state.toString
        logInfo("HLightNorth", "Status "+NewState)   
        switch(NewState) {
            case "OFF" : {
                        val dimVal = (IntensityNorth.state as Number)
                         .
                         .
Ist das nur ein Startproblem? Die Regel funktioniert sonst.
Viele Grüße

Ach ja. Ich habe noch zwei weitere gleiche Regeln, nur für andere Geräte. Die werden nicht moniert .

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

Re: Script execution of rule failed

Beitrag von udo1toni »

Ja, das Problem dürfte sein ,dass IntensityNorth zum Zeitpunkt des ersten Updates von HLightNorth noch nicht initialisiert ist.
Wenn Du Itemstates in einen bestimmten Datentyp castest (...as ...) musst Du vorher sicherstellen, dass der Status auch diesen Datentyp enthält. Dafür gibt es den Operator instanceof. Je nach Anwendung kannst Du entweder einen default Wert setzen oder die Rule kontrolliert abbrechen.

Aber es fängt noch vorher an. Warum der Trigger received upüdate?
Warum überhaupt eine Variable NewState?

Code: Alles auswählen

rule "Update Terrasse"
 when
    Item HLightNorth changed
 then
    logInfo("HLightNorth", "Status {}",newState)   
        switch(newState.toString) {
            case "OFF" : {
                        val dimVal = if(IntensityNorth.state instanceof Number) (IntensityNorth.state as Number) else 0
                         .
                         .
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

kaloschke
Beiträge: 175
Registriert: 29. Jan 2019 07:20

Re: Script execution of rule failed

Beitrag von kaloschke »

Vielen Dank für die Infos.
Das Ganze ist Teil der Steuerung meiner Netatmo Presence Geräte. Die Steuerung kann sowohl über Sitemaps als auch über Habpanel und Fernsteuerung erfolgen. Dafür benötige ich einige Variablen.
Die Regel ist "irgendwie" gewachsen. Wahrscheinlich wusste ich nicht, wie ich sonst die Fälle unterscheiden kann. Die Zeile, die Ärger macht, hast Du ja freundlicherweise schon erläutert.
Aber wenn wir schon dabei sind, wie würdest Du es denn schreiben :-) :

Code: Alles auswählen

rule "Update Terrasse"
    when
        Item HLightNorth received update
    then
        var String NewState = HLightNorth.state.toString
        switch(NewState) {
            case "OFF" : {
                        sendHttpGetRequest("http://192.168.2.222/presence_state.php?camera=Norden&state=off")
                        LightNorth.postUpdate(OFF)
                        LastLight = 0
                       }     
            case "ON"  : {
                        val dimVal = (IntensityNorth.state as Number)
                        sendHttpGetRequest("http://192.168.2.222/presence_intensity.php?camera=Norden&intensity="+dimVal.toString)       
                        Thread::sleep(1000)
                        sendHttpGetRequest("http://192.168.2.222/presence_state.php?camera=Norden&state=on")
                        LightNorth.postUpdate(dimVal.toString)
                        LastLight = 1
                       } 
		}
end

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

Re: Script execution of rule failed

Beitrag von udo1toni »

Ich weiß ja nicht, was die http-Aufrufe bewirken, aber mein Rule sähe so aus:

Code: Alles auswählen

rule "Update Terrasse"
 when
    Item HLightNorth changed
 then
    if(newState == OFF) {
        sendHttpGetRequest("http://192.168.2.222/presence_state.php?camera=Norden&state=off")
        LightNorth.postUpdate(OFF)
        LastLight = 0
    } else {
        val dimVal = IntensityNorth.state.toString
        sendHttpGetRequest("http://192.168.2.222/presence_intensity.php?camera=Norden&intensity=" + dimVal)
        Thread::sleep(1000)
        sendHttpGetRequest("http://192.168.2.222/presence_state.php?camera=Norden&state=on")
        LightNorth.postUpdate(dimVal)
        LastLight = 1
    }
end
switch() bringt hier keinen Vorteil, es gibt ohnehin nur zwei mögliche Zustände (wenn man mal vom gezielten Umsteuern per Rule absieht)
jeder Status kann immer als String ausgedrückt werden, die Fehlermeldung bekommt man also leicht weg. Bleibt noch die Frage, was passiert, wenn die Adresse mit leerem Parameter aufgerufen wird. Ansosnten musst Du halt sicherstellen, dass IntensityNorth immer eine gültige Zahl enthält, unter allen Umständen...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

kaloschke
Beiträge: 175
Registriert: 29. Jan 2019 07:20

Re: Script execution of rule failed

Beitrag von kaloschke »

Hmm. Müsste statt <newstate> nicht <HLightNorth.state> stehen?

Die HTTP-Aufrufe rufen über ein PHP-Script das API von Netatmo auf und steuern so die Presence Kameras, die ja auch LED-Strahler sind. Mittlerweile gibt es auch ein Binding dafür, aber über dieses kann man nicht die Lichtintensität steuern.

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

Re: Script execution of rule failed

Beitrag von udo1toni »

kaloschke hat geschrieben: 27. Nov 2022 17:46 Hmm. Müsste statt <newstate> nicht <HLightNorth.state> stehen?
Nein, das ist ja der Witz. Die Rule triggert über changed (nicht über received update)
Jede Rule, die über changed getriggert wurde, hat drei implizite Variablen:

triggeringItemName (nicht zu verwechseln mit triggeringItem.name!)
previousState (nicht zu verwechseln mit Item.previousState!)
und newState.
Die Namen sind sprechend :)
Natürlich kannst Du auch HLightNorth.state verwenden, das ist in diesem Fall das Gleiche, aber newState ist kürzer :)

Die Verwendung von newState hat allerdings eine direkte Folge, man kann die Rule dann nicht über den run-Knopf in der UI starten (bzw. es kommt dann zu einem Fehler).
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

kaloschke
Beiträge: 175
Registriert: 29. Jan 2019 07:20

Re: Script execution of rule failed

Beitrag von kaloschke »

Ach das ist ja ein witziger Zufall (? erinnere mich nicht mehr), dass ich meine Variable auch fast so genannt hatte. Habe die Kleinschreibung gar nicht mitbekommen :-).

<newstate> kannte ich gar nicht. Sehr schön. Wieder was gelernt.
Vielen Dank und schönen Abend noch.

J-N-K
Beiträge: 126
Registriert: 20. Jun 2020 12:21
Answers: 4
Wohnort: Gelsenkirchen, NRW

Re: Script execution of rule failed

Beitrag von J-N-K »

https://www.openhab.org/docs/configurat ... s-dsl.html

Die anderen impliziten Variablen stehen übrigens hier.
openHAB 4.0.0-SNAPSHOT - - local build -
APU2, 4GB RAM, 32GB SSD, Debian Buster
openHAB Core/Distro/Addons & SmartHome/J Maintainer

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

Re: Script execution of rule failed

Beitrag von udo1toni »

Und es lohnt auch als ganz alter Hase, ab und zu mal wieder einen tieferen Blick in die Doku zu werfen (also nach großen Updates...)
Was da in den letzten Jahren alles an neuen Funktionen dazu gekommen ist (auch und gerade bei den impliziten Variablen).
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

J-N-K
Beiträge: 126
Registriert: 20. Jun 2020 12:21
Answers: 4
Wohnort: Gelsenkirchen, NRW

Re: Script execution of rule failed

Beitrag von J-N-K »

Ab 3.4 gibt es übrigens einen Cache für beliebige Werte, der zwischen UI rules, file-based Rules und verschiedenen Sprachen geteilt wird. Nur schonmal als Vorwarnung, sind ja nur noch 2 Wochen.
openHAB 4.0.0-SNAPSHOT - - local build -
APU2, 4GB RAM, 32GB SSD, Debian Buster
openHAB Core/Distro/Addons & SmartHome/J Maintainer

Antworten