Ankündigung

Einklappen
Keine Ankündigung bisher.

Rule Zeitschaltung

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Rule Zeitschaltung

    Entschuldigt, die Anfrage müßte in den Openhab Bereich. Kann das verschoben werden??


    Hallo, ich möchte das über eine Rule die Außenbeleuchtung geschaltet wird. Jede 10 Minute zwischen 17 und 18 Uhr wird die Helligkeit auf <10 Lux und der Status der Außenbeleuchtung geprüft. Die Beuleuchtung soll ab der Schaltung auf ON nach 90 Minuten wieder auf Off geschaltet werden. Also müßte die Rule bei eingetretenen Bedingungen ab 17:00 wieder um 18:30 auf off geschaltet werden. Das macht sie aber nicht. Sie leuchtet weiter...

    Ohne die Statusprüfung würde die Rule ja quasi bis 18:00 Uhr prüfen und ab diesem Zeitpunkt bis 19:30 eingeschaltet sein. Habt ihr einen Tipp? Oder muss ich die Off-Schaltung in einer weiteren Rule laufen lassen?

    HTML-Code:
    rule"Außenbeleuchtung Zeitschaltung"
    whenTimecron"0 0/10 17-18 ? * * *"//Alle 10 Minuten zwischen 17 und 18 UHr läuft die Prüfung
    then
    if(Helligkeit.state <10 && Hausbeleuchtung.state ==OFF)
    {
    Hausbeleuchtung.sendCommand(ON)
    createTimer(now.plusMinutes(90))
    [|
    Hausbeleuchtung.sendCommand(OFF)
    ]
    }
    end
    Zuletzt geändert von Nerz; 20.12.2020, 11:53.

    #2
    Wenn die Rule wie vorgesehen arbeitet, schaltet sie das Licht im Zeitraum von 17 - 18 Uhr zur vollen 10 Minuten ein, falls das Licht aus war und die Helligkeit unter 10.
    Weiterhin startet sie einen Timer der nach 90 Minuten das Licht ausschaltet.

    Die Rule sollte so funktionieren

    Warum es nicht funktioniert, wäre zu klären, im Zweifel könnte vielleicht in openhab.log etwas dazu stehen.

    Allgemein ist es besser, einen Handle für einen Timer zu haben. So:
    Code:
    var Timer tLicht = null
    
    rule "Außenbeleuchtung Zeitschaltung"
    when
        Time cron "0 0/10 17-18 * * ?" // Alle 10 Minuten zwischen 17 und 18 UHr läuft die Prüfung
    then
        if(Helligkeit.state < 10 && Hausbeleuchtung.state == OFF) {
            Hausbeleuchtung.sendCommand(ON)
            tLicht?.cancel
            tLicht = createTimer(now.plusMinutes(90), [|
                Hausbeleuchtung.sendCommand(OFF)
            ])
        }
    end

    Kommentar


      #3
      Eine Kleinigkeit: "Helligkeit" dürfte eine Number sein. Daher muss auf
      Code:
          if (Helligkeit.state.intValue < 10 ...
      geprüft werden.

      Allerdings hat das mit dem ursprüglichen Problem nichts zu tun. Wenn das Licht eingeschaltet wird, sollte es gemäß Code auch wieder ausgeschaltet werden.
      openHAB 4.2

      Kommentar


        #4
        Danke für Eure Unterstützung. Ich versuche das mal über einen Handle. Verstehe das auch soweit. Nur was bedeutet
        tLicht?.cancel ?? bzw. für was steht das Fragezeichen?

        Habe eben auch gesehen dass ich zwei geschlossene Klammern hinter der 90 geschrieben habe. Habe micht jetzt an der Schreibweise von udotoni orientiert.

        Danke! Ich gebe Bescheid wenn es funzt
        Zuletzt geändert von Nerz; 21.12.2020, 09:34.

        Kommentar


          #5
          Deine Rule war so, wie Du sie geschrieben hast, schon korrekt und sollte auch funktionieren.
          Es ist immer eine gute Idee, einen Handle auf einen Timer zu haben, wenn man ihn anlegt. Dazu dient das Objekt tLicht. Nun könnte es sein, dass schon ein Timer existiert, der im Handle gespeichert ist. Falls (und nur falls) das der Fall ist, sollte dieser Timer zuerst abgebrochen und gelöscht werden. Das geschieht mit der Funktion .cancel, die für Timer-Objekte zur Verfügung steht. Es könnte aber genauso gut sein, dass kein Timer existiert. Dann gäbe es eine Fehlermeldung.
          Um diese Fehlermeldung zu vermeiden, muss man also zunächst prüfen, ob ein Timer existiert, das ginge mit if(tLicht !== null) (das doppelte = ist korrekt). Da Programmierer aber im allgemeinen faul sind, und diese Prüfung eigentlich jedes Mal notwendig ist (es sei denn, man befindet sich in einem Codeteil, der nur ausgeführt wird, wenn der Timer existiert), gibt es eine Kurzform für diese Prüfung, das ist das ?.
          tLicht?.cancel bedeutet also das gleiche wie if(tLicht !== null) tLicht.cancel

          Was die doppelt schließende Klammer betrifft: Man kann das Lambda (der auszuführende Code, wenn der Timer abläuft) entweder hinter dem Timer angeben, oder als Teil der Funktion. Ich bevorzuge letztere Variante, weil dann klar ist, dass das Lambda ein Parameter der Funktion ist. Da es sich um den 2. Parameter handelt, muss man natürlich noch ein Komma nach dem 1. Parameter setzen...

          Kommentar


            #6
            Nun habe ich das noch mal getestet. Die Rule funktioniert soweit und das Licht schaltet sich um 18:30 aus wenn es um 17:00 eingeschaltet wurde. Um 18:40 schaltet sich das Licht aber wieder ein. Dabei läuft doch die Time Prüfung nur von 17 bis 18 Uhr. Oder ist es tatsächlich so, dass die letzte Prüfung um 18:59 bzw. in meinem Fall um 18:50 laufen kann?

            Kommentar


              #7
              Genau, Du hast ja für die Stunde 17-18 angegeben, das ist also im zehn-Minuten-Interval gültig für

              17:00:00, 17:10:00, 17:20:00, 17:30:00, 17:40:00, 17:50:00, 18:00:00, 18:10:00, 18:20:00, 18:30:00, 18:40:00 und 18:50:00 Uhr

              Kommentar


                #8
                OK, da hatte ich einen Denkfehler. Dachte dass die Prüfung bis 18:00 Uhr läuft. Danke für die Infos!

                Kommentar

                Lädt...
                X