Ankündigung

Einklappen
Keine Ankündigung bisher.

Temperaturprogramme nach verschiedenen Gegebenheiten (Wochentag, Urlaub, etc) steuern

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

    Temperaturprogramme nach verschiedenen Gegebenheiten (Wochentag, Urlaub, etc) steuern

    Hallo zusammen,

    ich stehe aktuell ein bisschen auf dem Schlauch und brauche mal Tipps.

    Ich arbeite gerade an meiner Heizungssteuerung. Hier habe ich mir Programme erstellt, welche je nach Wochentag zu verschiedenen Tageszeiten verschiedene Temperaturen in den Räumen einstellen. Morgens geht zum Beispiel die Temperatur im Bad und in der Küche hoch, geht dann wieder runter (wenn wir arbeiten sind) und steigt dann abends zum Feierabend wieder, für die Nacht wird dann ebenfalls wieder abgesenkt. Natürlich nur ein paar Grad, ansonsten ist das ganze ja Kontraproduktiv. Am Wochenende läuft dann eine andere Temperaturverteilung ab.

    Das ganze funktioniert auch sehr gut. Zur Tagesermittlung arbeite ich mit "Time cron" sowie "getdayofweek".

    Nun habe ich zusätzlich noch das Caldav Binding eingebracht wo ich dann z.B. Urlaub eintrage. Steht im Kalender "Urlaub" wird das Heizungsprogramm auch an Wochentagen das Heizprogramm "Wochenende" verwendet. Das habe ich gelöst, indem die rules ins Caldav schauen, die Wochentagsrule läuft nur dann wenn im Kalender nicht "Urlaub" steht. Die Wochenende rule prüft ob im Kalender "Urlaub" steht, ist dies der Fall läuft die Rule entsprechend auch ab. Die Wochentags rule läuft wiederum nicht, denn es steht ja "Urlaub" im Kalender. So habe ich es hinbekommen, dass die Rules sich nicht gegenseitig außer Kraft treten.

    Nun steht aber zum ersten mal eine Abwesenheit an... wir waren am Wochenende zu den Schwiegereltern (als wäre dies nicht schon schlimm genug.... Spaß, wir verstehen uns super ) hier würde nun natürlich das Haus unnötig gehzeit werden, weil ja die rules ablaufen. Wenns nicht anders geht setze ich vor Abreise die Rules außer Kraft, aber eigentlich möchte ich gerne über caldav "Weg" als Status beziehen und dann alle Heizkörper dauerhaft auf eine Temperatur stellen. Was gleichermaßen natürlich bedeutet, dass die anderen Rules nicht ablaufen dürfen.

    Da ich ohnehin das Gefühl habe, dass ich das alles unnötig kompliziert umgesetzt habe, wäre meine Frage an euch, wie ich diese neue Gegebenheit ("Weg") einbinde, oder ggf. auch meine ganze Einstellung vereinfache. Wahrscheinlich kommen in Zukunft auch noch weitere Gegebenheiten hinzu wie zb "Weg Rückkehr" also der Tag an dem man zurück kommt, wo die Temperatur dann schon wieder ansteigen soll.

    Um euch darzustellen wie ich das umgesetzt habe, hier mal meine Rules für den Morgen, einmal für den Wochentag und einmal fürs Wochenende.

    PHP-Code:
    rule "Temperatursteigerung morgens Wochentag"
    when
        Time cron 
    "0 0 6 ? * MON,TUE,WED,THU,FRI *"
    then
        
    if (CalDav_Termin1 .state != "Urlaub" && CalDav_Termin2.state != "Urlaub" && CalDav_Termin3.state != "Urlaub" && CalDav_Termin4.state != "Urlaub" && CalDav_Termin5.state != "Urlaub")
        
    sendCommand(EG_Flur_Heizung17)
        
    sendCommand(EG_GaesteBad_Heizung_Wand18)
        
    sendCommand(EG_GaesteBad_Heizung_Boden15)
        
    sendCommand(EG_Esszimmer_Heizung19)
        
    sendCommand(EG_Wohnzimmer_Heizung19)
        
    sendCommand(EG_Kueche_Heizung21)
        
    sendCommand(OG_Kind1_Heizung  15)
        
    sendCommand(OG_Kind2_Heizung15)
        
    sendCommand(OG_Bad_Heizung_Wand21)
        
    sendCommand(OG_Bad_Heizung_Boden21)
        
    sendCommand(OG_Ankleidezimmer_Heizung19)
        
    sendCommand(OG_Fitness_Heizung16)
        
    sendCommand(OG_Schlafzimmer_Heizung19)
        
    sendCommand(EG_Buero_Heizung19)
    end 
    PHP-Code:
    rule "Temperatursteigerung morgens Wochenende"
    when
        Time cron 
    "0 0 7 * * ?"
    then
        
    if (now.getDayOfWeek>|| CalDav_Termin1 .state == "Urlaub" || CalDav_Termin2.state == "Urlaub" || CalDav_Termin3.state == "Urlaub" || CalDav_Termin4.state == "Urlaub" || CalDav_Termin5.state == "Urlaub")
        
    sendCommand(EG_Flur_Heizung17)
        
    sendCommand(EG_GaesteBad_Heizung_Wand18)
        
    sendCommand(EG_GaesteBad_Heizung_Boden15)
        
    sendCommand(EG_Esszimmer_Heizung21)
        
    sendCommand(EG_Wohnzimmer_Heizung21
        sendCommand
    (EG_Kueche_Heizung21)
        
    sendCommand(OG_Kind1_Heizung  15)
        
    sendCommand(OG_Kind2_Heizung15)
        
    sendCommand(OG_Bad_Heizung_Wand21)
        
    sendCommand(OG_Bad_Heizung_Boden21)
        
    sendCommand(OG_Ankleidezimmer_Heizung19)
        
    sendCommand(OG_Fitness_Heizung16)
        
    sendCommand(OG_Schlafzimmer_Heizung19)
        
    sendCommand(EG_Buero_Heizung19)
    end 
    Von diesen "Blöcken" habe ich insgesamt pro Tagesart 4 Stück, weil ich die Temperatur 1. morgens steigere 2. anschließend wieder senke 3. späten nachmittag wieder steigere 4. Nachts absenke. Die Rules Datei für die Heizung hat also ingesamt 8 solcher Blöcke.

    Wäre für Ideen sehr dankbar.
    Zuletzt geändert von c0rtez; 27.01.2020, 21:47.

    #2
    Mein Tipp wäre, ein Proxy Item einzuführen, in dem der Sollzustand (Tagbetrieb oder Nachtbetrieb) gespeichert wird. Dazu kommt eine Rule, welche auf die Zeiten und die Schalter triggert (abwesend, Urlaub usw.)
    In der Rule setzt Du einen Default (z.B. Tag) und prüfst dann nacheinander die verschiedenen Bedingungen, die zum Nachtbetrieb führen.
    Wenn das Proxy Item sich ändert, triggert eine andere Rule, welche die verschiedenen Temperaturen setzt. Dadurch kannst Du von verschiedenen Rules aus die Betriebsart umaschalten, was es eventuell einfacher machen kann, z.B. einen Masterschalter zu definieren.

    Kommentar


      #3
      Ok, also ich versuche mal es in meinen Worten wieder zu geben.
      Ich erzeuge mir ein Item indem ich quasi die Gegebenheit einlese, also es Default z.B. auf "Wochentag" steht und am Samstag/Sonntag auf Wochenende wechselt sowie aus Caldav Zustände wie "Urlaub" oder "Weg" einliest.

      Dieses Item gibt dem Haus dann immer an welche Gegebenheit heute vorliegt.

      Soweit so gut.... eine echte Idee für den Quellcode habe ich als Anfänger natürlich gerade absolut nicht... aber erstmal will ich es ja auch verstehen.

      Sagen wir also ich habe jetzt das Item was mir diesen Wert immer angibt.

      Nun muss entsprechend der Gegebenheit ein Programm ablaufen. Da ich hier auf dauer sehr verschiedene Durchläufe machen würde, würde ich glaube ich bei meinen Blöcken bleiben. Das heißt für jede Gegebenheit gibt es einen Block, bei dem Block wird am Anfang immer die Gegebenheit abgefragt. Liegt diese vor läuft nur der Block.

      So könnte es in der Tat gehen.... cool.

      Allerdings habe ich echt noch keine Idee wie das mit dem Gegebenheitem Item Aufgebaut werden könnte. Kannst du mir da evtl. zumindest ein bisschen genauer beschreiben wie man es machen könnte....?

      Kommentar


        #4
        Es gibt ja verschiedene Bereiche, also z.B. der Kalender. Es wäre geschickt, alle Items in eine Gruppe zu packen, so:
        Code:
        Switch isHoliday "Urlaub [%s]"
        Group:String gTermine
        String CalDav_Termin1 "Termin 1" (gTermine) {...}
        String CalDav_Termin2 "Termin 2" (gTermine) {...}
        String CalDav_Termin3 "Termin 3" (gTermine) {...}
        String CalDav_Termin4 "Termin 4" (gTermine) {...}
        String CalDav_Termin5 "Termin 5" (gTermine) {...}
        Dazu ein Rule:
        Code:
        rule "Urlaub setzen"
        when
            Member of gTermine changed
        then
            isHoliday.postUpdate(if(gTermine.members.filter[i|i.state.toString.toLower.contains("urlaub")].size > 0) ON else OFF)
        end
        Diese Rule setzt also das Item isHoliday auf ON, sobald eines der zugeordneten Items das Wort "Urlaub" enthält (Groß-/Kleinschreibung spielt keine Rolle, es darf auch weiterer Text im Item sein). Kommt in keinem der Items das Wort Urlaub vor, wird das Item auf OFF gesetzt. Weiter:
        Code:
        Switch isDay "Tagbetrieb"
        Ein Satz Rules:
        Code:
        rule "Tag-Nacht Umschaltung 1"
        when
            Time cron "0 0 6 ? * MON-FRI" or // Werktag
            Time cron "0 0 7 ? * *" // Immer
        then
            if(isHoliday.state == OFF || isHoliday.state == ON && now.getHourOfDay > 6)
               isDay.postUpdate(ON)
        end
        
        rule "Tag-Nacht Umschaltung 2"
        when
            Time cron "0 0 22 ? * SUN,MON-THU" or
            Time cron "0 0 23 ? * FRI-SAT"
        then
            if(isHoliday.state == OFF || isHoliday.state == ON && now.getHourOfDay > 22)
                isDay.postUpdate(OFF)
        end
        Die eine Rule schaltet von Nacht auf Tag, die andere übernimmt die andere Richtung. Man beachte, dass Freitags und Samstags später auf Nacht geschaltet wird. Dabei prüft die Rule aber zusätzllich die Urlaubsinformation.
        Nun die Steuerung der Temperatur:
        Code:
        rule "Heizung"
        when
            Item isDay changed or
            Item isAway changed
        then
            if(isAway.state == ON || (isAway.state == OFF && isDay.state == OFF)) {
                // hier Nachttemperaturen eintragen
            } else {
                EG_GaesteBad_Heizung_Boden.sendCommand(15)
                OG_Kind1_Heizung.sendCommand(15)
                OG_Kind2_Heizung.sendCommand(15)
                OG_Fitness_Heizung.sendCommand(16)
                EG_Flur_Heizung.sendCommand(17)
                EG_GaesteBad_Heizung_Wand.sendCommand(18)
                EG_Esszimmer_Heizung.sendCommand(19)
                EG_Wohnzimmer_Heizung.sendCommand(19)
                EG_Buero_Heizung.sendCommand(19)
                OG_Ankleidezimmer_Heizung.sendCommand(19)
                OG_Schlafzimmer_Heizung.sendCommand(19)
                EG_Kueche_Heizung.sendCommand(21)
                OG_Bad_Heizung_Wand.sendCommand(21)
                OG_Bad_Heizung_Boden.sendCommand(21)
            }
        end
        Der Schalter isAway wäre dann die Möglichkeit, die Nachtabsenkung dauerhaft zu aktivieren.

        Es böte sich an, die letzte Rule etwas eleganter zu gestalten, leider haben wir aber recht viele unterschiedliche Temperaturen.
        Zumindest ist nun aber die Temperatur pro Raum nur an einer Stelle zu konfigurieren. Man könnte hier mit einer Hashmap arbeiten, allerdings sind die Itemnamen dafür auch suboptimal (besser wäre es, BadBoden, BadWand, GaesteBadBoden und GaesteBadWand als Namen zu nutzen, dann wären alle Items (in einer Gruppe zusammengefasst) eindeutig durch den zweiten Teilstring identifizierbar.

        Kommentar


          #5
          Zitat von udo1toni Beitrag anzeigen
          Es gibt ja verschiedene Bereiche, also z.B. der Kalender. Es wäre geschickt, alle Items ....
          Wow. Vielen vielen Dank. Ich hatte jetzt auf ein paar Tipps gehofft wie ich es umsetzen könnte. Aber gleich die ganze Lösung fertig serviert zu bekommen .... wow. Vielen Dank.

          Ich hatte mich zwischenzeitlich selbst schon mal weiter an die Umsetzung gemacht. Der Mix aus meinem Code und den Infos und dem Code von dir wird mir jetzt glaube ich genau das Ergebnis bringen was ich brauche.
          Kurze Info zu dem was ich jetzt anders gelöst habe. Ich habe das was du mit den Terminen über die Groups gelöst hast über ein Item als Speicher gemacht. Ich habe ein Item erzeugt "Tagesart". Eine Rule schaut zu Tagesbeginn den Kalender durch ob dort "Urlaub" oder "Weg" gefunden wird, it das nicht der Fall wird geprüft welcher Tag der Woche ist und je nach Wert "Wochentag" bzw "Wochenende" definiert. Ich habe also ein Item was mir immer angibt ob "Urlaub" "Weg" "Wochentag" oder "Wochenende" vorliegt. Dieses kann ich dann abfragen um zu steuern welcher Modus laufen soll. Außerdem zeige ich es in meiner Sitemap mit an um direkt zu wissen, ob ich auch dran gedacht habe z.B. "Weg" auch einzutragen.

          Das werden ich jetzt mit deinem Input kombinieren. Vielen Dank für die wertvollen Infos.

          Kommentar


            #6
            Prima!

            Kommentar

            Lädt...
            X