Ankündigung

Einklappen
Keine Ankündigung bisher.

Weihnachtsbeleuchtung per Rule schalten

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

    Weihnachtsbeleuchtung per Rule schalten

    Hallo zusammen,

    ich möchte gerne meine Weihnachtsbeleuchtung außen per Regel schalten. Die Regel soll immer zwischen dem 26.11 und dem 16.01 laufen.

    Wenn die Dämmerung (ws_daemmerung) auf an springt, dann soll in dem genannten Zeitraum die Beleuchtung angeschaltet werden.
    Springt die Dämmerung auf aus, soll die Beleuchtung im genannten Zeitraum wieder ausgeschaltet werden.

    So wie ich es aktuell gestaltet habe, funktioniert es nicht. Hat jemand eine Idee?


    Code:
    rule "Weihnachtsbeleuchtung Ende November bis Mitte Januar"
    when
    
    Item ws_daemmerung received command
    
    then
    
    if (receivedCommand==ON) { 
    
    if((now.getMonth == 11 && now.DayOfMonth > 26) || (now.getMonth == 12) || (now.getMonth == 1 && now.getDayOfMonth < 16)) {
    
    au_terrasse_st.sendCommand(ON)
    au_eingang_st.sendCommand(ON)
    
    }
    }
    else {
    
    if (receivedCommand==OFF) { 
    
    if((now.getMonth == 11 && now.DayOfMonth > 26) || (now.getMonth == 12) || (now.getMonth == 1 && now.getDayOfMonth < 16)) {
    
    au_terrasse_st.sendCommand(OFF)
    au_eingang_st.sendCommand(OFF)
    
    }
    }
    }


    #2
    Du verwendest zweimal now.DayOfMonth statt now.getDayOfMonth

    Kommentar


      #3
      Die Rule lässt sich vereinfachen:
      Code:
      rule "Weihnachtsbeleuchtung Ende November bis Mitte Januar"
      when
          Item ws_daemmerung received command
      then
         val Integer iDay = now.plusDays(35)).getDayOfYear
         var sState = receivedCommand
         if(iDay = 52) sState = OFF
         if(iDay < 53) {
             au_terrasse_st.sendCommand(sState)
             au_eingang_st.sendCommand(sState)
         }
      end
      Zunächst werden zum aktuellen Datum 35 Tage hinzugezählt. Der 26. November wird damit zum 1. Januar. Der Tag des Jahres wird anschließend in iDay gespeichert.
      Danach wird sState auf receivedCommand gesetzt.
      Falls iDay = 52 ist (ein Tag nach dem 16. Januar) wird receivedCommand auf OFF gesetzt.
      Zum Schluss werden die Items geschaltet, falls iDay < 53 ist.

      Kommentar


        #4
        Zitat von udo1toni Beitrag anzeigen

        Zunächst werden zum aktuellen Datum 35 Tage hinzugezählt. .
        warum 35? möchte die rule für meine Daten anpassen und verstehe das nicht so ganz.
        wenn ich also ab 1.12 was schalten möchte muss ich 31 addieren . und wenn ich nur bis 2.1 was schalte muss, vergleichen ich mit 33 iDay oder?
        Zuletzt geändert von djuscha; 29.11.2019, 08:48.

        Kommentar


          #5
          Zitat von udo1toni Beitrag anzeigen
          Die Rule lässt sich vereinfachen:

          Zunächst werden zum aktuellen Datum 35 Tage hinzugezählt. Der 26. November wird damit zum 1. Januar. Der Tag des Jahres wird anschließend in iDay gespeichert.
          Danach wird sState auf receivedCommand gesetzt.
          Falls iDay = 52 ist (ein Tag nach dem 16. Januar) wird receivedCommand auf OFF gesetzt.
          Zum Schluss werden die Items geschaltet, falls iDay < 53 ist.
          Der Code mag vielleicht kürzer sein, einfacher zu verstehen ist er aber sicher nicht.
          Warum soll ich im Kopf rumrechnen obs jetzt 51 oder 52 Tage sind, das kann der PC schneller.

          Ich würde das ganze komplett entkoppeln. Zwei Rules mit Cron, die am Startdatum ein Switch Item (z.B. mit Namen XmasTimeSwitch) auf ON setzen und am Endtag auf OFF.
          Und in den anderen Rules würd ich dann das XmasTimeSwitch Item abfragen bzw. auf dessen Änderung und die Dämmerung reagieren.

          Update:
          Ach ja übrigens, bei dem Code ganz oben gibt's eine Randbedingung:

          Wenn die Beleuchtung am 15.1. zur Dämmerung eingeschaltet wird und erst am 16.1. wieder abgeschaltet werden soll, dann bleibt der Schalter an, weil auch bei OFF auf day < 16 geprüft wird. Die Beleuchtung ist dann bis zum 27.11. an.
          Zuletzt geändert von Shoko; 29.11.2019, 12:29.

          Kommentar


            #6
            Die Rule ist nicht nur kürzer sie kommt mit zwei einfachen Vergleichen aus.

            Du hast explizit nach dem 26.11. und dem 16.01. gefragt, woraus sich die beiden Eckdaten ergeben. Natürlich könntest Du statt +35 auch +31+4 schreiben und statt 52 31+4+17.

            Ich nutze für die Steuerung der Außensteckdosen ein Regel, welche sich nach dem 1. Adventssonntag richtet und den 6.1. als Enddatum ansetzt. Damit wird die Beleuchtung also "kirchengerecht" geschaltet, wobei der 6.1. auch nur eines von mehreren möglichen Daten ist, zu dem die Weihnachtszeit endet.

            Kommentar


              #7
              Wenn ich deinem Code irgendjemandem vorlege und frage "Was macht der" bin ich sehr sicher, dass der um einiges länger braucht den zu verstehen als wenn ich den Code vom OP herzeige.
              Ob das ein oder zwei Vergleiche weniger sind ist bei der Rechenleistung auf der Openhab läuft völlig irrelevant. Da hab ich lieber lesbaren Code, bei dem ich auch 2 Jahre später noch auf Anhieb erkenne was er macht, ohne mir über irgendwelche Magic Numbers den Kopf zerbrechen zu müssen.

              Kommentar


                #8
                Zitat von udo1toni Beitrag anzeigen

                Ich nutze für die Steuerung der Außensteckdosen ein Regel, welche sich nach dem 1. Adventssonntag richtet und den 6.1. als Enddatum ansetzt. Damit wird die Beleuchtung also "kirchengerecht" geschaltet.
                könntest du dein rules posten ? Wie geht das mit 1Advendsontag ?

                Kommentar


                  #9
                  Das ist Ansichtssache

                  Mindestens die Umstellung, zuerst den Zeitraum zu prüfen und anschließend in Abhängigkeit vom Schaltbefehl zu schalten, ist eine Vereinfachung, die den Code nicht nur kürzer, sondern auch lesbarer macht.

                  Kommentar


                    #10
                    Zitat von djuscha Beitrag anzeigen

                    könntest du dein rules posten ? Wie geht das mit 1Advendsontag ?
                    So:
                    Code:
                    intStAdvent = parse(now.getYear + "-12-25").minusDays(((parse(now.getYear + "-12-25").getDayOfWeek) + 21)).getDayOfYear
                    Ich ziehe vom 25.12. den Wochentag ab und lande damit auf Sonntag. Anschließend ziehe ich noch 21 Tage ab, um statt auf dem 4. auf dem 1. Advent zu landen.

                    Kommentar


                      #11
                      wollte mir eigentlich ne rules anlegen die Weihnachtsbeleuchtung schaltet vom ersten Advent bis 6.1 ,mit Dämmerung und ausschaltet um 12 uhr
                      aber irgendwie blicke ich nicht mehr durch

                      wäre das richtig? oder geht das irgentwie noch einfacher?

                      Code:
                          rule "Weihnachtsmodus an"
                      when
                          Time cron "0 0 0 * * ?" or
                          System started
                      then
                          val year = now.getYear
                          val month = now.getMonthOfYear
                          val day = now.getDayOfMonth
                          val sdatum = year+"-"+month+"-"+day
                          val DateTime datum = parse(sdatum)
                          val DateTime stAdvent = parse(year + "-12-25").minusDays(((parse(year + "-12-25").getDayOfWeek) + 21))
                          val DateTime endWeih = parse(year + "-1-6")
                          logInfo("RULE", "--> Weihnachtsmodus. Datum: " + datum.toString + ". 1. Advent: " + stAdvent.toString + ". Heilig Dreikönig: " + endWeih.toString)
                          if ( stAdvent <= datum || datum <= endWeih ) {
                              Weihnachtsbeleuchtung.sendCommand(ON)
                              }
                          else
                             { Weihnachtsbeleuchtung.sendCommand(OFF)
                              logInfo("RULE", "--> Weihnachtsmodus ON")
                             }
                      end
                      
                      
                      rule "Weihnachtslicht an"
                          when
                              Channel 'astro:sun:home1:set#event' triggered START  //astrothings
                          then
                               if ( Weihnachtsbeleuchtung.state == ON ) {
                               sendCommand (Shelly251,ON)
                              sendCommand (OsramSmartPlug_State,ON)
                               }
                      end
                      
                      
                      
                      
                      rule "Weihnachtslicht  23.45 Uhr aus"
                      when
                         Time cron "0 45 23 * * ?"
                          
                      then
                      if ( Weihnachtsbeleuchtung.state == ON ) {
                         Shelly251.sendCommand ("OFF")
                         OsramSmartPlug_State.sendCommand ("OFF")
                         logInfo("rule","weihnachtslicht aus")
                         
                      }
                      end
                      Zuletzt geändert von djuscha; 01.12.2019, 14:05.

                      Kommentar


                        #12
                        Zitat von djuscha Beitrag anzeigen

                        könntest du dein rules posten ? Wie geht das mit 1Advendsontag ?
                        Hi zusammen,

                        warum benutzt ihr nicht das holiyday.script => https://knx-user-forum.de/forum/supp...55#post1422655

                        Dies berechnet alle Feiertage (die bundesweiten wie auch nach Bundesland separiert; zumindest wenn man es entsprechend anpasst)
                        Dann noch eine Rule "wenn heute => 1. advent dann setze Adventzeit auf ein" und eine "wenn heute 6.1. (wenn dies das gewünschte datum ist) dann Adventzeit aus aus"
                        Und dann eben mit SOnnenuntergang => Wenn Adventzeit, dann lampen an.

                        So plane ich dies, bin aber erst noch beim Umstieg auf 2.5.x und mache vorher keine Änderungen an den Regeln

                        Kommentar


                          #13
                          Zitat von djuscha Beitrag anzeigen
                          wäre das richtig? oder geht das irgentwie noch einfacher?
                          Du denkst zu kompliziert, Du musst nur schauen, ob der aktuelle Tag des Jahres (now.getDayOfYear) kleiner 7 oder größer gleich stAdvent ist. Wenn ich zuhause bin, schick ich die entsprechende Regel.

                          JoergA wo man die Berechnung macht, ist letztlich egal. In der aktuellen Milestone Version sollte man eher zu Ephemeris greifen und gar keine Scripte nutzen.

                          Kommentar


                            #14
                            Zitat von udo1toni Beitrag anzeigen

                            Du denkst zu kompliziert, Du musst nur schauen, ob der aktuelle Tag des Jahres (now.getDayOfYear) kleiner 7 oder größer gleich stAdvent ist. Wenn ich zuhause bin, schick ich die entsprechende Regel.

                            JoergA wo man die Berechnung macht, ist letztlich egal. In der aktuellen Milestone Version sollte man eher zu Ephemeris greifen und gar keine Scripte nutzen.
                            Hmm, das klingt interessant. Ist zwar auch nur ein weiteres Script, aber noch mächtiger. Derzeit habe ich noch nicht gefunden, wie ich damit den 1. Advent Ode4 Ostersonntag berechne? Aber habe sicher auch noch nicht alle Quellen gelesen.
                            Zuletzt geändert von JoergA; 01.12.2019, 23:02.

                            Kommentar


                              #15
                              Ephemeris ist kein Script, sondern eine eingebaute Funktion, mittels derer nach bestimmten Regeln zu bestimmten Daten bestimmte Status gesetzt werden. Dabei ist das Format ein allgemein gebräuchliche, es gibt die (XML?) Dateien im Internet frei verfügbar.

                              Ich muss aber gestehen, dass ich mich bisher auch noch drum gedrückt habe.

                              Kommentar

                              Lädt...
                              X