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
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
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
durch
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
Re: Mal wieder eine "rule" Frage
Verfasst: 12. Aug 2019 20:23
von peter-pan
Du siehst mich geplättet
. 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.