Seite 3 von 6

Re: Mal wieder eine "rule" Frage

Verfasst: 11. Aug 2019 20:44
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 :?: :?: :?:

Re: Mal wieder eine "rule" Frage

Verfasst: 11. Aug 2019 23:27
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.

Re: Mal wieder eine "rule" Frage

Verfasst: 12. Aug 2019 09:31
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.

Re: Mal wieder eine "rule" Frage

Verfasst: 12. Aug 2019 13:03
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.

Re: Mal wieder eine "rule" Frage

Verfasst: 12. Aug 2019 15:29
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.

Re: Mal wieder eine "rule" Frage

Verfasst: 12. Aug 2019 16:13
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 ?

Re: Mal wieder eine "rule" Frage

Verfasst: 12. Aug 2019 17:53
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:

Re: Mal wieder eine "rule" Frage

Verfasst: 12. Aug 2019 20:23
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.

Re: Mal wieder eine "rule" Frage

Verfasst: 12. Aug 2019 20:54
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

Re: Mal wieder eine "rule" Frage

Verfasst: 12. Aug 2019 23:32
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.