Seite 2 von 4

Re: OH3 Timer

Verfasst: 8. Nov 2021 21:52
von peter-pan
Also, da waren beim "schnell, schnell ein paar Logs" ein paar Klammern zu wenig. Und es war noch eine kleine Nachbesserung an der Bedingung

Code: Alles auswählen

if(now.getDayOfWeek.getValue > 5) iStart = 12
notwendig. Da hat das ".getValue" gefehlt. Was natürlich auch noch unbedingt sein muss, ist die Timer-Variable am Anfang deiner .rules-Datei steht

Da mir die Items fehlen, konnte ich nur bedingt testen.

Also noch ein Versuch:

Code: Alles auswählen

var Timer tAuto = null

rule "Timer Beduftung starten jetzt"
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.getValue > 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(10000000), [|                                                    // 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 hoffe das klappt besser. Und beim Speichern der Rule unbedingt darauf achten, dass die Info, wie von Udo beschrieben, auch kommt.

Was mir auch noch aufgefallen ist, ist das da eine Fehlermeldung für "timer-3" und "timer-1" kommt. Da passt also noch was nicht.

Re: OH3 Timer

Verfasst: 9. Nov 2021 07:51
von hulda
Hallo,
also das ist der letzte Stand.
Die Regel wird richtig geladen.
Wenn ich den Hauptschalter ein schalte kommt: " logInfo("Beduftung","Regel abgebrochen")"

Code: Alles auswählen

var Timer tAuto = null

rule "Timer Beduftung starten jetzt"
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.getValue > 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(10000000), [|                                                    // 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

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: 9. Nov 2021 09:03
von peter-pan
hulda hat geschrieben: 9. Nov 2021 07:51 Die Regel wird richtig geladen.
Wenn ich den Hauptschalter ein schalte kommt: " logInfo("Beduftung","Regel abgebrochen")"
Das ist ja schon mal nicht schlecht. Die Meldung bedeutet, dass deine Bedingungen nicht erfüllt sind und deshalb die Regel abgebrochen wird.

Bedingung:

Code: Alles auswählen

    if((receivedCommand === null && Beduftunghauptschalter.state != ON)
        || (receivedCommand == ON && now.plusHours(3).getHour <= iStart + 2)) { 
        logInfo("Beduftung","Regel abgebrochen")
        return;
Der Beduftungsschalter ist zwar an, aber es ist halt noch nicht 16 Uhr (iStart + 2). So verstehe ich das. Du könntest zum testen eventuell mal das "istart + 2" einfach mal durch einen Wert (z.B.: 8) ersetzen.

Edit: Oder die Variable iStart auf 6 ;)

Re: OH3 Timer

Verfasst: 9. Nov 2021 14:14
von hulda
:lol:

Es läuft!!!
Vielen Dank!!!

Re: OH3 Timer

Verfasst: 9. Nov 2021 17:44
von peter-pan
Gerne. :)
Wenn du die Logs nicht mehr brauchst oder haben willst, kannst du sie einfach auskommentieren.

Re: OH3 Timer

Verfasst: 5. Jan 2023 11:20
von hulda
Hallo zusammen,
ich muß mal das Thema wieder hoch holen.
Wieso setzt der Timer immer wieder aus ?
Immer nach der gleichen Zeit egal auf welche Zeit der Timer eingestellt ist.

Code: Alles auswählen

var Timer tAuto = null

rule "Timer Beduftung starten jetzt"
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 or                                           // Hauptschalter wurde geschaltet
    Item KWL_Wochenprogrammhauptschalter received command ON or                                  //Kalender Hauptschalter 
  Item KWL_Manuell changed                                                                      //Lüftungszustand
then
    var Integer iStart = 7       // Startzeitvariable
                                                                   
    if(now.getDayOfWeek.getValue > 5) iStart = 12                                                          // Falls Wochenende
    if((receivedCommand === null && Beduftunghauptschalter.state != ON)
        || (receivedCommand == ON && now.plusHours(3).getHour <= iStart + 2) )               
         {                   
        logInfo("Beduftung","Regel abgebrochen")
        return;
    }

     if (Beduftunghauptschalter.state != ON ||  KWL_Manuell.state !=0 || KWL_Wochenprogrammhauptschalter.state != ON) 
            {                    // Siehe Text
        logInfo("Beduftung","Regel abgebrochen nicht alle Zustände")
        return;
    } 



    tAuto?.cancel                                                                                 // eventuell vorhandenen Timer entfernen
    tAuto = createTimer(now.plusNanos(10000000), [|                                                    // Timer initialisieren
        logInfo("Beduftung","Timer initialisiert")
    
        if(Beduftungtempswitch.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
            Beduftungtempswitch.sendCommand(ON) 
            logInfo("beduftung", "switch=" + Beduftungtempswitch)
            tAuto.reschedule(now.plusSeconds(iOnTime)) 
            logInfo("Beduftung","Timer Anzeit")                                                  // 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
            Beduftungtempswitch.sendCommand(OFF)   
            logInfo("beduftung", "switch=" + Beduftungtempswitch)
        //    Beduftung_An_Aus_on_off.postUpdate(0)                                                  // Beduftung aus
            tAuto.reschedule(now.plusSeconds(iOffTime)) 
            logInfo("Beduftung","Timer Auszeit")                                          // Timer bis zum erneuten Einschalten
        }
    ])
end




rule "Timer Beduftung Test stoppen"
when
    Time cron "0 0 21 * * ?" or                                                                   // täglich um 21 Uhr
    Item Beduftunghauptschalter received command OFF or                                             // Hauptschalter wurde geschaltet
    Item KWL_Manuell received update 1 or                                                      //Lüftung OG steht auf manuell aus
    Item KWL_Wochenprogrammhauptschalter received command OFF                                 //ist der Hauptschalter an oder der Kalenderbefehl kommt
                                                   
then
if(Beduftunghauptschalter.state != ON ||  KWL_Manuell.state == 1 || KWL_Wochenprogrammhauptschalter.state != ON)
{
   logInfo("Beduftung","Regel abgebrochen nicht alle Zustaende erreicht stoppen")
if((Beduftunghauptschalter.state != OFF) || (KWL_Manuell.state == 1 ))

}
    Beduftungtempswitch.sendCommand(OFF)                                                             // Beduftung abschalten
    tAuto?.cancel                                                                                 // und Timer stopppen
end
Bild
Bild


Vielen Dank für eure Hilfe
Gruß Dirk

Re: OH3 Timer

Verfasst: 5. Jan 2023 14:18
von int5749
Hi,

auch wenn für mich auch dem Graphen nicht ersichtlich ist, nach welcher Zeit der Timer beendet wird, nehme ich an, dass es die default Zeiten sind?
Ich würde mal ein Logging bei dem setzen der neuen Zeiten einbauen, ober der neue Werte auch wirklich in iOffTime und iOnTime übernommen wird? Oder was sagt denn das Log dazu? Wenn es einen Fehler gibt, sollte dieser dort auch aufgeführt sein.

Viele Grüße

Re: OH3 Timer

Verfasst: 5. Jan 2023 15:23
von hulda
Das ist das Log:
die zeiten sind unverändert auf 1 s an und 1s aus . Aber nach irgendeiner Zeit kommt 2 mal hintereinander OFF oder ON
aber warum?
  • 2023-01-05 15:18:28.264 [INFO ] [.openhab.core.model.script.beduftung] - switch=Beduftungtempswitch (Type=SwitchItem, State=OFF, Label=null, Category=null)
    2023-01-05 15:18:28.265 [INFO ] [.openhab.core.model.script.Beduftung] - Timer Auszeit
    2023-01-05 15:18:29.275 [INFO ] [.openhab.core.model.script.Beduftung] - Timer initialisiert
    2023-01-05 15:18:29.276 [INFO ] [.openhab.core.model.script.beduftung] - switch=Beduftungtempswitch (Type=SwitchItem, State=ON, Label=null, Category=null)
    2023-01-05 15:18:29.276 [INFO ] [.openhab.core.model.script.Beduftung] - Timer Anzeit
    2023-01-05 15:18:30.295 [INFO ] [.openhab.core.model.script.Beduftung] - Timer initialisiert
    2023-01-05 15:18:30.308 [INFO ] [.openhab.core.model.script.beduftung] - switch=Beduftungtempswitch (Type=SwitchItem, State=OFF, Label=null, Category=null)
    2023-01-05 15:18:30.314 [INFO ] [.openhab.core.model.script.Beduftung] - Timer Auszeit
    2023-01-05 15:18:31.322 [INFO ] [.openhab.core.model.script.Beduftung] - Timer initialisiert
    2023-01-05 15:18:31.330 [INFO ] [.openhab.core.model.script.beduftung] - switch=Beduftungtempswitch (Type=SwitchItem, State=ON, Label=null, Category=null)
    2023-01-05 15:18:31.332 [INFO ] [.openhab.core.model.script.Beduftung] - Timer Anzeit
    2023-01-05 15:18:32.350 [INFO ] [.openhab.core.model.script.Beduftung] - Timer initialisiert
    2023-01-05 15:18:32.360 [INFO ] [.openhab.core.model.script.beduftung] - switch=Beduftungtempswitch (Type=SwitchItem, State=OFF, Label=null, Category=null)
    2023-01-05 15:18:32.361 [INFO ] [.openhab.core.model.script.Beduftung] - Timer Auszeit
    2023-01-05 15:18:33.371 [INFO ] [.openhab.core.model.script.Beduftung] - Timer initialisiert
    2023-01-05 15:18:33.373 [INFO ] [.openhab.core.model.script.beduftung] - switch=Beduftungtempswitch (Type=SwitchItem, State=OFF, Label=null, Category=null)
    2023-01-05 15:18:33.377 [INFO ] [.openhab.core.model.script.Beduftung] - Timer Anzeit
    2023-01-05 15:18:34.374 [INFO ] [.openhab.core.model.script.Beduftung] - Timer initialisiert
    2023-01-05 15:18:34.376 [INFO ] [.openhab.core.model.script.beduftung] - switch=Beduftungtempswitch (Type=SwitchItem, State=ON, Label=null, Category=null)
    2023-01-05 15:18:34.377 [INFO ] [.openhab.core.model.script.Beduftung] - Timer Auszeit
    2023-01-05 15:18:35.386 [INFO ] [.openhab.core.model.script.Beduftung] - Timer initialisiert
    2023-01-05 15:18:35.388 [INFO ] [.openhab.core.model.script.beduftung] - switch=Beduftungtempswitch (Type=SwitchItem, State=OFF, Label=null, Category=null)
    2023-01-05 15:18:35.389 [INFO ] [.openhab.core.model.script.Beduftung] - Timer Anzeit
    2023-01-05 15:18:36.402 [INFO ] [.openhab.core.model.script.Beduftung] - Timer initialisiert
    2023-01-05 15:18:36.405 [INFO ] [.openhab.core.model.script.beduftung] - switch=Beduftungtempswitch (Type=SwitchItem, State=ON, Label=null, Category=null)
    2023-01-05 15:18:36.407 [INFO ] [.openhab.core.model.script.Beduftung] - Timer Auszeit
    2023-01-05 15:18:37.437 [INFO ] [.openhab.core.model.script.Beduftung] - Timer initialisiert
    2023-01-05 15:18:37.444 [INFO ] [.openhab.core.model.script.beduftung] - switch=Beduftungtempswitch (Type=SwitchItem, State=ON, Label=null, Category=null)
    2023-01-05 15:18:37.446 [INFO ] [.openhab.core.model.script.Beduftung] - Timer Anzeit

Re: OH3 Timer

Verfasst: 5. Jan 2023 19:33
von int5749
Ok, dort ist kein Fehler gelogged. Seltsam, aber erst mal OK.

Ändere mal die Zeile:

Code: Alles auswählen

logInfo("Beduftung","Timer Anzeit")
nach

Code: Alles auswählen

logInfo("Beduftung","Timer Anzeit: " + iOnTime.state as Number)
Natürlich genauso für OffTime, damit die Werte im Log sind, wie der Timer laufen müsste.
Wenn die Werte nicht richtig übergeben werden, wird dies auch transparent!

Re: OH3 Timer

Verfasst: 5. Jan 2023 19:42
von udo1toni
Grundsätzlich sehe ich erst mal keinen Fehler im Code des Timers, wobei mir noch nicht ganz klar ist, was die Steuerung vorne macht, aber das hat ja mit dem Problem erst mal nur am Rande zu tun.

Dennoch möchte ich den Timer Code leicht abgewandelt anbieten:

Code: Alles auswählen

    tAuto = createTimer(now.plusNanos(10000000), [|                                               // Timer initialisieren
        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
        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
        logInfo("Beduftung","Timer initialisiert - iOnTime = {}, iOffTime = {}",iOnTime,iOffTime) // gewählte Zeiten ausgeben
        val Soll = if(Beduftungtempswitch.state != ON) ON else OFF                                // Nächster Zustand
        val SollTime = if(Soll == ON) iOnTime else iOffTime                                       // nächste Zeit
        val SollLog  = if(Soll == ON) "n" else "us"                                               // Teilstring für Meldung
        Beduftungtempswitch.sendCommand(Soll.toString)                                            // Befehl absetzen
        logInfo("beduftung", "Timer A{}zeit {}", SollLog, SollTime)                               // loggen
        tAuto.reschedule(now.plusSeconds(iOnTime))                                                // Timer erneut planen
    ])
Hauptunterschiede:
  • Die Initialisierung läuft immer vollständig. Dafür werden die Zeiten auch direkt geloggt.
  • Der neue Zustand wird abhängig vom aktuellen Zustand berechnet.
  • Davon abhängig wird die Zeit ausgewählt und ein Teilstring gesetzt.
  • Der Schalter wird gesetzt und passend dazu die Meldung generiert
  • Der Timer wird erneut geplant.
Grundsätzlich sollte ein Wechsel im Sekundentakt locker funktionieren, allerdings könnte es Seiteneffekte geben, die dazu führen, dass der Schaltbefehl zu spät ausgeführt wird. auch daran denken: Der Status eines Items wird gewöhnlich vom verknüpften Channel geliefert. Sollte dieses Gerät Probleme damit haben, einmal pro Sekunde geschaltet zu werden, wäre im Ergebnis dasselbe Holpern zu sehen. Mein erster Vorschalg wäre also (eben um dieses Risiko zu minimieren) eine längere Zeit zu wählen, z.B. zwei Sekunden. ;)

Die zweite Rule (die zum Abschalten) hat einen schwerwiegenden Fehler (if ohne nachfolgenden Befehl), es irritiert mich etwas, dass diese Rule nicht zu einem entsprechenden Fehler führt.