cron Ausdruck und Visual Studio Code

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
hardl
Beiträge: 347
Registriert: 10. Mai 2018 09:46
Answers: 1

cron Ausdruck und Visual Studio Code

Beitrag von hardl »

Bitte um Hilfe

1. Warum funktioniert der Ausdruck:

Time cron "0 */1 * * * ?" und

Time cron "0 */1 * * * 1-5" oder
Time cron "0 */1 * * MON-FRI" nicht ?

2. Es dauert immer ein paar Minuten nach Aenderungen von Regeln im VS bis im Log Viewer . "Refreshing model "xy"" erscheint und weitere 2-3 Minuten bis die geänderte Regel aktiv ist.
Ist das bei ca. 200 Zeilen in der Regel normal.

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

Re: cron Ausdruck und Visual Studio Code

Beitrag von udo1toni »

Time Cron ist in openHAB die Quartz Variante. Die Definition bedeutet hier

Code: Alles auswählen

"s m h D M W Y"
wobei s Sekunde, m Minute, h Stunde, D Tag im Monat, M Monat im Jahr, W Wochentag in der Woche und Y Jahr bedeutet. Y ist optional, alle anderen Werte müssen gesetzt werden, falls einer der Werte keine Rolle spielen soll, wird er mit einem Stern egalisiert. Aber dabei gilt, dass entweder der Wochentag oder der Tag im Jahr mit einem Fragezeichen besetzt wird. Es muss exakt ein Fragezeichen vorkommen.
Der korrekte Time cron Ausdruck sieht also so aus:

Code: Alles auswählen

Time cron "0 * * ? * 1-5"
Alternativ kann man natürich auch ein 0/1 für jede Zahl inclusive 0 verwenden, oder */1, aber das ist nur unnötig kompliziert.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

hardl
Beiträge: 347
Registriert: 10. Mai 2018 09:46
Answers: 1

Re: cron Ausdruck und Visual Studio Code

Beitrag von hardl »

Danke, das scheint zu funktionieren

Im englischsprachigen Forum habe ich gestern den Tip erhalten:
Time cron " 0 0/1 * ? * MON,TUE,WED,THU,FRI *"
Da kommt auch keine Fehlermeldung.

Aber ich kriege noch folgenden Fehler:

2018-10-18 16:10:14.197 [ERROR] [ntime.internal.engine.ExecuteRuleJob] - Error during the execution of rule 'Schaltuhr EZ Mo-Fr': An error occurred during the script execution: Couldn't invoke 'assignValueTo' for feature JvmVoid: (eProxyURI: Thermostat.rules#|::0.2.8.2.0.0::0::/1)

rule "Schaltuhr WZ Mo-Fr"
when
Time cron " 0 0/1 * ? * 1-5"
then
soll1EinWZ = (Uhr1_M_Ein_WZ.state as Number).intValue + 60 * (Uhr1_H_Ein_WZ.state as Number).intValue
soll1AusWZ = (Uhr1_M_Aus_WZ.state as Number).intValue + 60 * (Uhr1_H_Aus_WZ.state as Number).intValue
soll2EinWZ = (Uhr2_M_Ein_WZ.state as Number).intValue + 60 * (Uhr2_H_Ein_WZ.state as Number).intValue
soll2AusWZ = (Uhr2_M_Aus_WZ.state as Number).intValue + 60 * (Uhr2_H_Aus_WZ.state as Number).intValue
logInfo("default.rules", 1 )
if (Schalter_manu_WZ.state == OFF) {
if (soll1EinWZ == now.getMinuteOfDay) {
if ((Thermostat_WZ.state as Number) != var_switch_WZ) {
Thermostat_WZ.sendCommand(var_switch_WZ)
}
}
else if (soll1AusWZ == now.getMinuteOfDay) {
var_switch_WZ = 11 // aus
if ((Thermostat_WZ.state as Number) != var_switch_WZ) {
Thermostat_WZ.sendCommand(var_switch_WZ)
}
}
else if (Uhr_2_WZ.state == ON) {
if (soll2EinWZ == now.getMinuteOfDay) {
var_switch_WZ = 1 //2. ein
if ((Thermostat_WZ.state as Number) != var_switch_WZ) {
Thermostat_WZ.sendCommand(var_switch_WZ)
}
}
else if (soll2AusWZ == now.getMinuteOfDay) {
var_switch_WZ = 11 // 2. aus
if ((Thermostat_WZ.state as Number) != var_switch_WZ) {
Thermostat_WZ.sendCommand(var_switch_WZ)
}
}
}
}

end

Hast Du eine Idee?
Außerdem das Problem mit der Geschwindigkeit: Nach dem Aendern der Regel dauerte es 14 Minuten bis im Protokoll das Refresh der Rule angezeigt und ausgeführt wurde.

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

Re: cron Ausdruck und Visual Studio Code

Beitrag von udo1toni »

Code bitte immer als Code posten :) einfach der Lesbarkeit wegen.

Wo ist die Definition von var_switch_WZ?
Wo ist die Definition von soll1EinWZ, soll1AusWZ, soll2EinWZ und soll2AusWZ?

Das logInfo mag funktionieren, ist aber in dieser Form nicht korrekt. Die Funktion ist als logInfo(String,String) definiert, Du übergibst aber als 2. Parameter eine Zahl. Dass das eventuell trotzdem funktioniert, liegt nur daran, dass openHAB die Zahl als Bestandteil von Number betrachtet, und Number hat eine Methode .toString, die automatisch verwendet wird.

Deine Rule wird jede Minute aufgerufen, falls die Abarbeitung der Rule aus irgendeinem Grund länger dauert, könnte die Rule auch mehrfach gestartet werden und sich dann selbst in die Quere kommen.

Der Ansatz hinter dem Code ist zumindest ungünstig, denn Du musst jede Minute einmal die Variablen neu berechnen. Besser wäre es, Timer einzusetzen. Grundsätzlich geht das so:

Code: Alles auswählen

// globale Variablen
var Timer timer1 = null
var Timer timer2 = null

// Rules
rule "timer setzen"
when
    Time cron "0 0 0 ? * 1-5" or  // Mitternacht, Montag bis Freitag
    Item Uhr1_M_Ein_WZ changed or      // Zeit wurde geändert
    Item Uhr1_H_Ein_WZ changed or      //      "
    Item Uhr1_M_Aus_WZ changed or      //      "
    Item Uhr1_H_Aus_WZ changed         //      "
then
    logInfo("timer","Rule getriggert!")
    if(now.getDayOfWeek < 6) {    // Montag bis Freitag, wegen weiteren Triggern
        logInfo("timer","Wochentag ist {}",now.getDayOfWeek)
        var Number soll1EinWZ = (Uhr1_M_Ein_WZ.state as Number) + 60 * (Uhr1_H_Ein_WZ.state as Number)
        var Number soll1AusWZ = (Uhr1_M_Aus_WZ.state as Number) + 60 * (Uhr1_H_Aus_WZ.state as Number)
        logInfo("timer","Einschaltzeit {}",now.withTimeAtStartOfDay.plusMinutes(soll1EinWZ.intValue))
        logInfo("timer","Ausschaltzeit {}",now.withTimeAtStartOfDay.plusMinutes(soll1AusWZ.intValue))
        if(timer1 !== null) timer1.cancel                                   // Timer aktiv, also zuerst löschen
        timer1 = createTimer(now.withTimeAtStartOfDay.plusMinutes(soll1EinWZ.intValue), [
            if (Schalter_manu_WZ.state == OFF) {
                logInfo("timer","Einschaltzeit erreicht und Automatik aktiv!")
                if ((Thermostat_WZ.state as Number) != 1) Thermostat_WZ.sendCommand(1)
            }
            timer1 = null
        ])

        if(timer2 !== null) timer2.cancel                                   // Timer aktiv, also zuerst löschen
        timer2 = createTimer(now.withTimeAtStartOfDay.plusMinutes(soll1AusWZ.intValue), [
            if (Schalter_manu_WZ.state == OFF) {
                logInfo("timer","Ausschaltzeit erreicht und Automatik aktiv!")
                if ((Thermostat_WZ.state as Number) != 11) Thermostat_WZ.sendCommand(11)
            }
            timer2 = null
        ])
    }
end
Die Erweiterung auf vier Timer läuft natürlich genauso. Die Idee dahinter ist folgende:
Zu Beginn eines Werktages (Nun ja, Montag bis Freitag) oder auch jedesmal, wenn eine der zwei Schaltzeiten angepasst wird, werden die Timer angelegt. Falls die Timer bereits aktiv sind, werden sie vorher gelöscht (timer1.cancel). Die Timer werden mit der korrekten Schaltzeit angelegt. Wenn der Timer abläuft, wird das Lambda (der Teil zwischen [ und ]) ausgeführt. Konkret prüft der Code, ob der Timer ausgeführt werden soll (Manuell OFF), und falls das der Fall ist wird der Status gesetzt, falls er vom Soll abweicht. Ich habe hier bewusst auf eine variable verzichtet, das hat keinen Mehrwert...
Am Ende des Lambdas wird der Timer deinitialisiert. (timer1 = null)

Was ist jetzt der Unterschied? Die Rule wird nur dann getriggert, wenn es entweder Mitternacht ist oder Minuten bzw. Stunden verstellt werden. Der auszuführende Code wird exakt zur gewünschten Zeit exakt einmal ausgeführt.

EDIT: Code ein 2. Mal von Fehlern befreit (wegen Referenzierung)
Zuletzt geändert von udo1toni am 22. Okt 2018 16:36, insgesamt 2-mal geändert.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

hardl
Beiträge: 347
Registriert: 10. Mai 2018 09:46
Answers: 1

Re: cron Ausdruck und Visual Studio Code

Beitrag von hardl »

Ich dachte den Fehler gefunden zu haben:
Mit der fehlende Variablen-Deklaration:soll1EinWZ, soll1AusWZ, soll2EinWZ und soll2AusWZ
Die var_switch_WZ ist vorhanden und alle var sind zu beginn der Thermostat.rules definiert.
Aber ein zusätzlicher Fehler taucht auf:
2018-10-18 17:28:14.117 [ERROR] [ntime.internal.engine.ExecuteRuleJob] - Error during the execution of rule 'Schaltuhr WZ Mo-Fr': An error occurred during the script execution: Could not invoke method: org.eclipse.smarthome.model.script.actions.LogAction.logInfo(java.lang.String,java.lang.String,java.lang.Object[]) on instance: null

Ich schaue mir Deine Anregungen morgen genau an, da ich jetzt weg muss.
Danke einstweilen.

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

Re: cron Ausdruck und Visual Studio Code

Beitrag von udo1toni »

Ja, ich hab grade nochmal geschaut. getAsText ist leider eine der Methoden, die gar nicht vorhanden sind. Wenn Du das .getAsText weg nimmst, sollte das Logging funktionieren.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

hardl
Beiträge: 347
Registriert: 10. Mai 2018 09:46
Answers: 1

Re: cron Ausdruck und Visual Studio Code

Beitrag von hardl »

Leider verstehe ich nicht, wo ich die Methode verwendet habe.

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

Re: cron Ausdruck und Visual Studio Code

Beitrag von udo1toni »

Wenn Du Dir meine Rule oben anschausst, da habe ich .getAsText als Methode innerhalb logInfo verwendet. Das geht so leider nicht (diese Methode steht in Java zur Verfügung, aber nicht in openHAB)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

hardl
Beiträge: 347
Registriert: 10. Mai 2018 09:46
Answers: 1

Re: cron Ausdruck und Visual Studio Code

Beitrag von hardl »

Hallo udo1toni,
nochmals vielen Dank für Deine Mühe. Du hast viel Zeit für meine Probleme investiert.
Den Ansatz zu Deinem Timer finde ich sehr gut.
Ich habe den Ansatz für "meine" Schaltuhr auch aus einem Beispiel hier im Forum, aber ich werde den Ansatz von Dir gerne übernehmen.
Allerdings habe ich einen Probelauf mit Deinen Daten gemacht und komme schon nicht über das "when":

Code: Alles auswählen

2018-10-19 18:19:14.378 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'Thermostat.rules' has errors, therefore ignoring it:
[169,5]: no viable alternative at input 'Uhr1_M_Ein_WZ'
[170,5]: no viable alternative at input 'Uhr1_H_Ein_WZ'
[171,5]: no viable alternative at input 'Uhr1_M_Aus_WZ'
[172,5]: no viable alternative at input 'Uhr1_H_Aus_WZ'
Kannst Du mir bitte nochmals helfen?

03chris
Beiträge: 28
Registriert: 4. Feb 2018 17:10
Answers: 1

Re: cron Ausdruck und Visual Studio Code

Beitrag von 03chris »

Da fehlt 'Item' vor 'Uhr1_M_Ein_WZ'

Antworten