Mal wieder eine "rule" Frage

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

atk69
Beiträge: 95
Registriert: 15. Jan 2019 19:07
Answers: 1
Wohnort: Weil am Rhein

Re: Mal wieder eine "rule" Frage

Beitrag von atk69 »

ergebnis:

Code: Alles auswählen

[ipse.smarthome.model.script.Luminanz] - Rule Luminanz Timer started Varibale nTime = 1 Varibale nLum = 1
2019-08-11 20:41:27.602 [INFO ] [ipse.smarthome.model.script.Luminanz] - Rule Luminanz ausgelöst Case default Varibale nTime = 1 Varibale nLum = 1
weiter kommt er ncht :?: :?: :?:
and IT works ;)

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

Re: Mal wieder eine "rule" Frage

Beitrag von udo1toni »

Also, mal ein paar Schritte zurück... Ausgehend von der (fehlerkorrigierten) Rule ist es sinnvoll, strategisch Logging einzubauen.

Code: Alles auswählen

// Globale Variablen immer zu Beginn der Datei definieren!
var Timer tLum = null 
var Number nLum = 0


rule "Luminanz"
when
    Item dataLum changed
then
    logInfo("luminanz","Rule getriggert!")
    if(!(dataLum.state instanceof Number)) {
        logWarn("luminanz","dataLum enthält keinen gültigen Wert!")
        return;
    }
    logInfo("luminanz","dataLum: {}; tLum: {}",dataLum.state,tLum)

    if ((dataLum.state as Number) < 4 && now.getHourOfDay > 17 && now.getHourOfDay < 23 && tLum === null) {
        logInfo("luminanz","Timer wird angelegt!")
        nLum = 0
        tLum = createTimer(now.plusSeconds(1), [|
            logInfo("luminanz","Timer wird ausgeführt! nLum: {}",nLum)
            var Number nTime = 1
            nLum += 1
            switch nLum {
                case 1: {
                    Markise.sendCommand(DOWN)
                    nTime = 60
                }
                case 2: {
                    Roll_WZ_W_li.sendCommand(DOWN)
                }
                case 3: {
                    Roll_WZ_W_re.sendCommand(DOWN)
                }
                case 4: {
                    Markise.sendCommand(DOWN)
                }
                case 5: {
                    Roll_WZ_W_li.sendCommand(DOWN)
                }
                case 6: {
                    Roll_WZ_W_re.sendCommand(DOWN)
                    nTime = 600
                }
                default: {
                    nTime = 0
                }
            }
            if(nTime > 0)
                tLum.reschedule(now.plusSeconds(nTime))
            else {
                tLum = null
            }
        ])
    }
end
Die Rule ist eigentlich narrensicher :)

Das erste Logging ist zu Beginn der Rule. Falls kein gültiger Wert zur Verfügung steht, kommt ohnehin eine Warnung.
Ist soweit erst mal alles in Ordnung, wird eine Zeile mit dem konkreten Wert und der Variablen tLum ausgegeben.
Ist der Wert zu hoch oder die Timer Variable ist nicht null, (oder das Zeitfenster stimmt nicht... Zeitstempel steht vorne) wird der Timer nicht angelegt (was ja auch korrekt ist).
Falls die Bedingungne aber erfüllt sind, wird der Timer angelegt.
Bei jeder Ausführung des Timers wird ebenfalls eine Logzeile ausgegeben, zusammen mit dem Zählerstand.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
peter-pan
Beiträge: 2564
Registriert: 28. Nov 2018 12:03
Answers: 25
Wohnort: Schwäbisch Gmünd

Re: Mal wieder eine "rule" Frage

Beitrag von peter-pan »

P.S. in deiner rule waren ein paar Klammerfehler. Denke, habe es korrigiert bekommen ;) ;) ;)
Eigentlich hab ich nur ein paar "logInfos" in deine Rule eingebaut und mich nicht so um die Syntax gekümmert.

Aber immerhin hast du erkennen können, dass keine deiner Vorgaben (switch/case) erfüllt wurden und er deshalb auf den "case default" zurückgegriffen hat
Code: Alles auswählen

[ipse.smarthome.model.script.Luminanz] - Rule Luminanz Timer started Varibale nTime = 1 Varibale nLum = 1
2019-08-11 20:41:27.602 [INFO ] [ipse.smarthome.model.script.Luminanz] - Rule Luminanz ausgelöst Case default Varibale nTime = 1 Varibale nLum = 1

weiter kommt er ncht :?: :?: :?:
und da soll ja nichts passieren. Was mich allerdings gewundert hat, ist die Tatsache, dass keine weiteren "logInfos" ausgegeben wurden. Das würde eigentlich bedeuten, dass die Rule ewig läuft :?:

Aber Udo hat sich das ja nochmal genauer angeschaut und überarbeitet. Jetzt sollte es klappen.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.1 openhabian

atk69
Beiträge: 95
Registriert: 15. Jan 2019 19:07
Answers: 1
Wohnort: Weil am Rhein

Re: Mal wieder eine "rule" Frage

Beitrag von atk69 »

Hallo zusamman

vielen Dank für euren unermüdlichen Einsatz udo1toni und peter-pan :mrgreen:

ich werde die rule heute Abend testen.
peter-pan hat geschrieben: 12. Aug 2019 09:31
und da soll ja nichts passieren. Was mich allerdings gewundert hat, ist die Tatsache, dass keine weiteren "logInfos" ausgegeben wurden. Das würde eigentlich bedeuten, dass die Rule ewig läuft :?:
Richtig , die rule läuft ewig, die Einträge kommen alle 2min.
and IT works ;)

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

Re: Mal wieder eine "rule" Frage

Beitrag von udo1toni »

Die Rule selbst sollte nur wenige Millisekunden laufen. Die Log Meldung wird (weil der Platz, an dem Du die Zeile eingefügt hast ungünstig gewählt war) nur ausgegeben, wenn nLum = 1 ist. Schau Dir meinen Code oben an... ;)

Ein möglicher Fehler könnte beim hochzählen der Variablen nLum liegen. Du kannst

Code: Alles auswählen

nLum += 1
durch

Code: Alles auswählen

nLum = nLum + 1
ersetzen. Allerdings sollte die Kurzform auch funktionieren.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
peter-pan
Beiträge: 2564
Registriert: 28. Nov 2018 12:03
Answers: 25
Wohnort: Schwäbisch Gmünd

Re: Mal wieder eine "rule" Frage

Beitrag von peter-pan »

Richtig , die rule läuft ewig, die Einträge kommen alle 2min.
So hatte ich das eigentlich nicht gemeint :) . Dass die Regel immer wieder getriggert wird, wenn sich "dataLum" ändert, ist mir klar. So wie Udo sagt, sollte die Rule eigentlich nur Millisekunden laufen

Aber, dass die letzte logInfo logInfo("Luminanz", "Rule Luminanz - Ende der Rule") // for testing only, also die zwischen } und end nicht erscheint, verwundert mich dann doch. Da sind doch alle Bedingungen abgearbeitet. Oder mach ich hier einen Denkfehler ?
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.1 openhabian

atk69
Beiträge: 95
Registriert: 15. Jan 2019 19:07
Answers: 1
Wohnort: Weil am Rhein

Re: Mal wieder eine "rule" Frage

Beitrag von atk69 »

Also jetzt der aktuelle Stand:
zum testen habe ich udo1toni`s neue Version leicht abgeändert:

Code: Alles auswählen

if ((dataLum.state as Number) < 8000 && now.getHourOfDay > 12 && now.getHourOfDay < 23 && tLum === null) {
also nur Lum-wert und zeitfenster.
im Log erscheint das:

Code: Alles auswählen

2019-08-12 17:46:00.841 [INFO ] [el.core.internal.ModelRepositoryImpl] - Refreshing model 'WZ_WI_ROLL_LUM.rules'
2019-08-12 17:47:29.173 [INFO ] [ipse.smarthome.model.script.luminanz] - Rule getriggert!
2019-08-12 17:47:29.178 [INFO ] [ipse.smarthome.model.script.luminanz] - dataLum: 3460; tLum: null
2019-08-12 17:47:29.187 [INFO ] [ipse.smarthome.model.script.luminanz] - Timer wird angelegt!
2019-08-12 17:47:30.193 [INFO ] [ipse.smarthome.model.script.luminanz] - Timer wird ausgeführt! nLum: 0
2019-08-12 17:49:27.807 [INFO ] [ipse.smarthome.model.script.luminanz] - Rule getriggert!
2019-08-12 17:49:27.812 [INFO ] [ipse.smarthome.model.script.luminanz] - dataLum: 3198; tLum: null
2019-08-12 17:49:27.823 [INFO ] [ipse.smarthome.model.script.luminanz] - Timer wird angelegt!
2019-08-12 17:49:28.843 [INFO ] [ipse.smarthome.model.script.luminanz] - Timer wird ausgeführt! nLum: 0
passieren tut aber nichts ?!
Aber, dass die letzte logInfo logInfo("Luminanz", "Rule Luminanz - Ende der Rule") // for testing only, also die zwischen } und end nicht erscheint, verwundert mich dann doch. Da sind doch alle Bedingungen abgearbeitet. Oder mach ich hier einen Denkfehler ?
Nein, kein Denkfehler. Ich musste die Zeile weglassen, da OH2 das nicht mochte. Hat dauernd gemeckert wegen "anderes Zeichen erwartet" . Habs nicht hinbekommen :oops:
and IT works ;)

Benutzeravatar
peter-pan
Beiträge: 2564
Registriert: 28. Nov 2018 12:03
Answers: 25
Wohnort: Schwäbisch Gmünd

Re: Mal wieder eine "rule" Frage

Beitrag von peter-pan »

Du siehst mich geplättet :o . Ich benutze so eine Info am Ende einer Rule regelmässig beim testen und hatte noch nie Probleme damit. Mich würde die Meldung aus dem Logger doch exakt interessieren. Kannst du das vielleicht nochmal rekonstruieren und die Fehlermeldung posten ?

Aber anhand deines Logs (frontail) sieht es so aus, als würde das alles passen und die Rule wird auch ausgeführt. Du siehst aber leider nicht, ob dein Zähler "nLum" erhöht wird. Vielleicht probierst du doch mal die zweite Alternative zum Hochzählen von Udo aus
nLum = nLum + 1
Vielleicht klappt es damit besser.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.1 openhabian

atk69
Beiträge: 95
Registriert: 15. Jan 2019 19:07
Answers: 1
Wohnort: Weil am Rhein

Re: Mal wieder eine "rule" Frage

Beitrag von atk69 »

@peter-pan
Habe deine eweiterte rule nochmal geladen:

Code: Alles auswählen

2019-08-12 20:43:52.843 [INFO ] [el.core.internal.ModelRepositoryImpl] - Loading model 'WZ_WI_ROLL_LUM - Copy.rules'
2019-08-12 20:45:29.470 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'WZ_WI_ROLL_LUM.rules' has errors, therefore ignoring it: [59,13]: mismatched input 'else' expecting ']'
[64,9]: mismatched input ']' expecting '}'
[66,6]: mismatched input '}' expecting 'end'
Sobald ich das doch recht eindeutige Ergebnis korrigiere, hängt er am "else"

auch der wechsel in die momentanen Version von udo1toni :
nLum = nLum + 1
bringt keine Besserung.
Zur Info: ich betreibe Openhab 2.4.0.001 für synology (DS-213+).
Am Wochenende wollte ich umziehen auf ein Qnap t453
and IT works ;)

Benutzeravatar
peter-pan
Beiträge: 2564
Registriert: 28. Nov 2018 12:03
Answers: 25
Wohnort: Schwäbisch Gmünd

Re: Mal wieder eine "rule" Frage

Beitrag von peter-pan »

Irgendwie kommen wir hier so nicht weiter :?: .
Ich habe jetzt die Regel von Udo genommen und die benutzt du jetzt. Es ist eine Zeile ergänzt und zwar die Zeile 56. An den If-Bedingungen habe ich nichts verändert. Du kannst die erste Bedingung, wenn du willst, nach deinen Bedürfnissen anpassen. "if ((dataLum.state as Number) < 8000 && now.getHourOfDay > 12 && now.getHourOfDay < 23 && tLum === null) ". Bitte sonst keine Änderungen.

Regel:

Code: Alles auswählen

// Globale Variablen immer zu Beginn der Datei definieren!
var Timer tLum = null 
var Number nLum = 0


rule "Luminanz"
when
    Item dataLum changed
then
    logInfo("luminanz_test","Rule getriggert!")
    if(!(dataLum.state instanceof Number)) {
        logWarn("luminanz_test","dataLum enthält keinen gültigen Wert!")
        return;
    }
    logInfo("luminanz_test","dataLum: {}; tLum: {}",dataLum.state,tLum)

    if ((dataLum.state as Number) < 4 && now.getHourOfDay > 17 && now.getHourOfDay < 23 && tLum === null) {
        logInfo("luminanz_test","Timer wird angelegt!")
        nLum = 0
        tLum = createTimer(now.plusSeconds(1), [|
            logInfo("luminanz_test","Timer wird ausgeführt! nLum: {}",nLum)
            var Number nTime = 1
            nLum += 1
            switch nLum {
                case 1: {
                    Markise.sendCommand(DOWN)
                    nTime = 60
                }
                case 2: {
                    Roll_WZ_W_li.sendCommand(DOWN)
                }
                case 3: {
                    Roll_WZ_W_re.sendCommand(DOWN)
                }
                case 4: {
                    Markise.sendCommand(DOWN)
                }
                case 5: {
                    Roll_WZ_W_li.sendCommand(DOWN)
                }
                case 6: {
                    Roll_WZ_W_re.sendCommand(DOWN)
                    nTime = 600
                }
                default: {
                    nTime = 0
                }
            }
            if(nTime > 0)
                tLum.reschedule(now.plusSeconds(nTime))
            else {
                tLum = null
            }
        ])
    }
 logInfo("luminanz_test"," Ende der Rule")
end
Das Ergebnis des Loggers kannst du dann posten.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.1 openhabian

Antworten