Seite 1 von 4

OH3 Timer

Verfasst: 7. Nov 2021 14:17
von hulda
Hallo zusammen,
nächstes Problem beim Umstellen auf OH 3.
Wieso funktioniert der Timer nicht mehr?
Muß man auch da beim Umstellen auf OH3 etwas ändern?



Code: Alles auswählen

rule "Timer Beduftung starten"
when
    Time cron "0 0 14 ? * MON-FRI" or                                                             // Montag bis Freitag 14 Uhr
    Time cron "0 0 12 ? * SAT,SUN" or                                                             // Samstag und Sonntag 12 Uhr
    Item Beduftunghauptschalter received command ON                                               // Hauptschalter wurde geschaltet
then
    var Integer iStart = 14                                                                       // Startzeitvariable
    if(now.getDayOfWeek > 5) iStart = 12                                                          // Falls Wochenende
    if((receivedCommand === null && Beduftunghauptschalter.state != ON)
        || (receivedCommand == ON && now.plusHours(3).getHourOfDay <= iStart + 2))                     // Siehe Text
        return;
    tAuto?.cancel                                                                                 // eventuell vorhandenen Timer entfernen
    tAuto = createTimer(now.plusMillis(10), [|                                                    // Timer initialisieren
        if(Beduftung_An_Aus.state != ON) {                                                        // Falls Beduftung aus
            var Integer iOnTime = 10                                                              // Default ON-Zeit
            if(Beduftung_Timer_Anzeit.state instanceof Number)                                    // falls gültiger Wert
                iOnTime = (Beduftung_Timer_Anzeit.state as Number).intValue                       // übernimm ON-Zeit aus Item
            Beduftung_An_Aus.sendCommand(ON)                                                      //Beduftung an
            tAuto.reschedule(now.plusSeconds(iOnTime))                                            // Timer bis zum erneuten Ausschalten
        } else {                                                                                  // ansonsten
            var Integer iOffTime = 290                                                            // Default OFF-Zeit
            if(Beduftung_Timer_Auszeit.state instanceof Number)                                   // falls gültiger Wert
                iOffTime = (Beduftung_Timer_Auszeit.state as Number).intValue                     // übernimm OFF-Zeit aus Item
            Beduftung_An_Aus.sendCommand(OFF)                                                     // Beduftung aus
            tAuto.reschedule(now.plusSeconds(iOffTime))                                           // Timer bis zum erneuten Einschalten
        }
    ])
end

rule "Timer Beduftung stoppen"
when
    Time cron "0 0 21 * * ?" or                                                                   // täglich um 21 Uhr
    Item Beduftunghauptschalter received command OFF                                              // Hauptschalter wurde geschaltet
then
    Beduftung_An_Aus.sendCommand(OFF)                                                             // Beduftung abschalten
    tAuto?.cancel                                                                                 // und Timer stopppen
end



Gruß Dirk

Re: OH3 Timer

Verfasst: 7. Nov 2021 15:01
von peter-pan
Da hab ich was im internationalen Forum gefunden.

Wenn es wirklich nur um den timer geht, könntest du ja das now.plusMillis(10) durch now.plusNanos(100000) ersetzen. So verstehe ich das zumindest.

Re: OH3 Timer

Verfasst: 8. Nov 2021 00:12
von udo1toni
getHourOfDay muss auch noch auf getHour geändert werden.

Re: OH3 Timer

Verfasst: 8. Nov 2021 06:57
von hulda
Hallo,
habe mal beides eingetragen.
Leider ohne Erfolg..
Timer läuft nicht.
Kann man irgendwo sehen ob der Timer läuft? Oder nur an der Reaktion des Schalters...

Code: Alles auswählen



rule "Timer Beduftung starten"
when
    Time cron "0 0 6 ? * MON-FRI" or                                                             // Montag bis Freitag 14 Uhr
    Time cron "0 0 12 ? * SAT,SUN" or                                                             // Samstag und Sonntag 12 Uhr
    Item Beduftunghauptschalter received command ON                                               // Hauptschalter wurde geschaltet
then
    var Integer iStart = 14                                                                       // Startzeitvariable
    if(now.getDayOfWeek > 5) iStart = 12                                                          // Falls Wochenende
    if((receivedCommand === null && Beduftunghauptschalter.state != ON)
        || (receivedCommand == ON && now.plusHours(3).getHour <= iStart + 2))                     // Siehe Text
        return;
    tAuto?.cancel                                                                                 // eventuell vorhandenen Timer entfernen
    tAuto = createTimer(now.plusNanos(100000), [|                                                    // Timer initialisieren
        if(Beduftung_An_Aus.state != ON) {                                                        // Falls Beduftung aus
            var Integer iOnTime = 10                                                              // Default ON-Zeit
            if(Beduftung_Timer_Anzeit.state instanceof Number)                                    // falls gültiger Wert
                iOnTime = (Beduftung_Timer_Anzeit.state as Number).intValue                       // übernimm ON-Zeit aus Item
            Beduftung_An_Aus.sendCommand(ON)                                                      //Beduftung an
            tAuto.reschedule(now.plusSeconds(iOnTime))                                            // Timer bis zum erneuten Ausschalten
        } else {                                                                                  // ansonsten
            var Integer iOffTime = 290                                                            // Default OFF-Zeit
            if(Beduftung_Timer_Auszeit.state instanceof Number)                                   // falls gültiger Wert
                iOffTime = (Beduftung_Timer_Auszeit.state as Number).intValue                     // übernimm OFF-Zeit aus Item
            Beduftung_An_Aus.sendCommand(OFF)                                                     // Beduftung aus
            tAuto.reschedule(now.plusSeconds(iOffTime))                                           // Timer bis zum erneuten Einschalten
        }
    ])
end

rule "Timer Beduftung stoppen"
when
    Time cron "0 0 21 * * ?" or                                                                   // täglich um 21 Uhr
    Item Beduftunghauptschalter received command OFF                                              // Hauptschalter wurde geschaltet
then
    Beduftung_An_Aus.sendCommand(OFF)                                                             // Beduftung abschalten
    tAuto?.cancel                                                                                 // und Timer stopppen
end

Re: OH3 Timer

Verfasst: 8. Nov 2021 08:14
von peter-pan
hulda hat geschrieben: 8. Nov 2021 06:57 Timer läuft nicht.

Code: Alles auswählen

rule "Timer Beduftung starten"
when
    Time cron "0 0 6 ? * MON-FRI" or                                                             // Montag bis Freitag 14 Uhr
    Time cron "0 0 12 ? * SAT,SUN" or                                                             // Samstag und Sonntag 12 Uhr
    Item Beduftunghauptschalter received command ON                                               // Hauptschalter wurde geschaltet
then
    var Integer iStart = 14                                                                       // Startzeitvariable
    if(now.getDayOfWeek > 5) iStart = 12                                                          // Falls Wochenende
    if((receivedCommand === null && Beduftunghauptschalter.state != ON)
        || (receivedCommand == ON && now.plusHours(3).getHour <= iStart + 2))                     // Siehe Text
        logInfo("Beduftung","Regel abgebrochen")
        return;
    tAuto?.cancel                                                                                 // eventuell vorhandenen Timer entfernen
    tAuto = createTimer(now.plusNanos(100000), [|                                                    // Timer initialisieren
        logInfo("Beduftung","Timer initialisiert")
    
        if(Beduftung_An_Aus.state != ON) {                                                        // Falls Beduftung aus
            var Integer iOnTime = 10                                                              // Default ON-Zeit
            if(Beduftung_Timer_Anzeit.state instanceof Number)                                    // falls gültiger Wert
                iOnTime = (Beduftung_Timer_Anzeit.state as Number).intValue                       // übernimm ON-Zeit aus Item
            Beduftung_An_Aus.sendCommand(ON)                                                      //Beduftung an
            tAuto.reschedule(now.plusSeconds(iOnTime))                                            // Timer bis zum erneuten Ausschalten
        } else {                                                                                  // ansonsten
            var Integer iOffTime = 290                                                            // Default OFF-Zeit
            if(Beduftung_Timer_Auszeit.state instanceof Number)                                   // falls gültiger Wert
                iOffTime = (Beduftung_Timer_Auszeit.state as Number).intValue                     // übernimm OFF-Zeit aus Item
            Beduftung_An_Aus.sendCommand(OFF)                                                     // Beduftung aus
            tAuto.reschedule(now.plusSeconds(iOffTime))                                           // Timer bis zum erneuten Einschalten
        }
    ])
end
Ich hab mal auf die Schnelle zwei Logs eingeschoben. Vielleicht kannst du da schon was erkennen.

Re: OH3 Timer

Verfasst: 8. Nov 2021 08:15
von int5749
hulda hat geschrieben: 8. Nov 2021 06:57 Kann man irgendwo sehen ob der Timer läuft? Oder nur an der Reaktion des Schalters...
now.plusNanos(100000) entspricht ja gerade einmal 0,1ms.
10ms ist schon sehr wenig, ein Timer von 0,1mms evtl. doch schon zu kurz??

Wenn es wirklich 10ms sein sollte und dies bisher funktioniert hat, dann:

Code: Alles auswählen

now.plusNanos(10000000)
hulda hat geschrieben: 8. Nov 2021 06:57 Kann man irgendwo sehen ob der Timer läuft? Oder nur an der Reaktion des Schalters...
Du könntest noch Log Einträge erstellen, damit Du siehst wo in der Rule es hakt. <<== Dies hat ja auch schon Peter (etwas schneller) eingebaut :)

VG

Re: OH3 Timer

Verfasst: 8. Nov 2021 08:24
von peter-pan
int5749 hat geschrieben: 8. Nov 2021 08:15 Wenn es wirklich 10ms sein sollte und dies bisher funktioniert hat, dann:
Sorry, mit den Nullen hab' ich's nicht so :oops: ;)

Re: OH3 Timer

Verfasst: 8. Nov 2021 08:33
von int5749
peter-pan hat geschrieben: 8. Nov 2021 08:24
int5749 hat geschrieben: 8. Nov 2021 08:15 Wenn es wirklich 10ms sein sollte und dies bisher funktioniert hat, dann:
Sorry, mit den Nullen hab' ich's nicht so :oops: ;)
:) Not your fault, kam mir nur zu wenig vor und dank google gibt es ja schöne Online Konverter.
Denn auch ich vergesse da gerne mal eine 0 :lol:

Re: OH3 Timer

Verfasst: 8. Nov 2021 15:50
von udo1toni
Die 10 ms sind im Übrigen nicht unbedingt nötig. Es geht dabei darum, dass openHAB den Code schon komplett im Scheduler eingetragen hat, bis der Timer abläuft.

Bist Du sicher, dass die Rule überhaupt fehlerfrei geladen wird? Siehst Du in openhab.log eine Meldung in der Art wie

Code: Alles auswählen

2021-11-08 15:48:36.146 [INFO ] [el.core.internal.ModelRepositoryImpl] - Loading model 'my.rules'
?
Werden evtl. zum Zeitpunkt der Ausführung irgendwelche Fehler ausgegeben?

Re: OH3 Timer

Verfasst: 8. Nov 2021 19:01
von hulda
Das sind die Fehlermeldungen die ich gefunden habe

Code: Alles auswählen

Script execution of rule with UID 'timer-3' failed: class java.lang.Integer cannot be cast to class java.lang.Enum (java.lang.Integer and java.lang.Enum are in module java.base of loader 'bootstrap') in timer

Code: Alles auswählen

 Validation issues found in configuration model 'timer.rules', using it anyway:
Unreachable expression.

Code: Alles auswählen

- Script execution of rule with UID 'timer-1' failed: class java.lang.Integer cannot be cast to class java.lang.Enum (java.lang.Integer and java.lang.Enum are in module java.base of loader 'bootstrap') in timer