Ankündigung

Einklappen
Keine Ankündigung bisher.

Logik für Zirkulationspumpe - meine erste Logik in SmartHome.py

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

    Logik für Zirkulationspumpe - meine erste Logik in SmartHome.py

    Hallo Liebe KNX & SmartHome.py Gemeinde,

    seit kurzem fange ich nun an mich das erste mal mit dem Themengebiet Logiken in SmartHome.py zu beschäftigen und hab viel gelesen aber noch nichts gefunden, wo ich nun Anfangen kann.
    Meine erste Logik soll die Zirkulationspumpe für das WW rudimentär einmal am Tag ansteuern und zwar dann wenn das erste mal der Lichtschalter im Bad in einem definiertem Zeitfenster betrieben wird und dies dann nur einmal am Tag.

    Ich bin absoluter PYTHON Noob und das ist wohl auch der Grund warum es mir so schwer fällt.

    Wäre vielleicht jemand von euch so lieb mir ein Beispiel vorzugeben, an welchem ich mich dann entlang hangeln kann?

    Lichtschalter vom Bad hängt an einem Binäreingang, welcher dann einen Aktor triggert um das Licht ein oder aus zu schalten. Alternativ kann das Licht auch über die Visu geschaltet werden.
    Die Zirkulationspumpe beim WW-Speicher, hängt ebenfalls an einem Aktor und kann aktuell nur über die Visu ein oder ausgeschaltet werden.

    Nun stelle ich mir die Logik wie folgt vor:

    Wenn der Aktor Licht im Bad einschaltet, dann prüfe ob es zwischen 06 und 10 Uhr ist, und ob heute die Zirkulationspumpe noch nicht betrieben wurde, wenn dies wahr ist, dann schalte die Zirkulationspumpe für 3 Minuten an und dann wieder ab. Ist dies falsch dann mache nichts.

    Wenn ich dies nun richtig sehe, benutze ich das ITEM welches die Zirkulatinspumpe in der Visu steuert als Watch Item und dann brauche ich eine Variable in welcher ich den letzten AN Zustand für die Zirkulationspumpe abfrage, sowie eine Variable welche die aktuelle Zeit erfasst. Eine weitere Variable wird dann noch für den 3 Minuten Timer gebraucht.

    So und nun stehe ich vor der Frage, wie sieht dafür wohl das Python Skript aus.

    Wäre jemand so lieb mir hier Starthilfe zu geben?

    Viele Grüße
    Jannis
    Zuletzt geändert von startrix; 20.12.2018, 14:03. Grund: Gelöst

    #2
    Gibt doch mal Deine Item Struktur vor...

    IMHO kannst Du das mit crontab, eval und eval_trigger lösen und brauchst noch nicht einmal eine Logik.
    Sowas könnte gehen (ungetestet)

    Code:
    Zirkulationspumpe:
        type: bool
        autotimer: 3m = 0
    
    Zirkulation_einmal_am_Tag:
        type: bool
        crontab: 0 0 * * = 0
        eval_trigger: Lichtschalter
        eval: Lichtschalter or value
        on_change: sh.Zirkulationspumpe = 1
    
    Lichtschalter:
        type: bool
        knx_listen: 1/2/3

    Kommentar


      #3
      Beispiele für Logiken findest Du z.B. hier: https://www.smarthomeng.de/tag/logiken
      Viele Grüße
      Martin

      Stay away from negative people. They have a problem for every solution.

      Kommentar


        #4
        Zitat von bmx Beitrag anzeigen
        Gibt doch mal Deine Item Struktur vor...

        IMHO kannst Du das mit crontab, eval und eval_trigger lösen und brauchst noch nicht einmal eine Logik.
        Sowas könnte gehen (ungetestet)
        Erstmal Danke für die 2 super schnellen Antworten.
        Msinn : danke für den Link ich hab da schon ein paar mal durchgeklickt. Und werde es bestimmt auch noch oft machen. Aber bei meinem konkretem vorhaben bin ich mit den Beispielen leider nicht weitergekommen.

        bmx: gibt es Vor- / Nachteile bei deinem Lösungsansatz gegenüber einer Lösung via Logik? Klingt auf jeden Fall interessant und über diese Option hab ich noch gar nicht nachgedacht, da hab ich noch nachhol Bedarf was crontab, eval und eval trigger angeht, das hab ich noch gar nicht verwendet.

        Bzgl. der Item Struktur, gebe ich dir gerne Input, ich habe div. YAML Dateien wo die ITEMS drin sind. Damit es nicht unübersichtlich wird, kopier ich die hier nicht alle rein, ein Auzug der Betroffenen ITEMS dürfte ja reichen:

        Code:
        Aktor_SiKa_Keller:
               Zirkulationspumpe:
                        name: Schaltaktor
                        type: bool
                        knx_dpt: 1
                        knx_send: 11/0/2
                        knx_init: 11/0/2
        
         Lampen:
                Bad_Deckenlampe:
                        name: Deckenlicht
                        type: bool
                        knx_dpt: 1
                        knx_send: 1/1/7
                        knx_init: 1/1/7
        Wenn ich dich nun korrekt verstehe müsste ich das ITEM Zirkulationspumpe wie folgt erweitern und Zusätzlich das ITEM "Zirkulation_einmal_am_Tag" noch mit einbinden:

        Code:
        Aktor_SiKa_Keller:
               Zirkulationspumpe:
                        name: Schaltaktor
                        type: bool
                        knx_dpt: 1
                        knx_send: 11/0/2
                        knx_init: 11/0/2
                        autotimer: 3m = 0
               Zirkulation_einmal_am_Tag:
                        type: bool
                        crontab: 0 0 * * = 0
                        eval_trigger: Lampen.Bad_Deckenlampe
                        eval: Lampen.Bad_Deckenlampe or value
                        on_change: sh.Aktor_SiKa_Keller.Zirkulationspumpe = 1
        Kannst du mir erklären, was die crontab Zeile bewirkt (also wie sich dies gliedert), ansonsten bemüh ich nachher mal google. Ich muss ja mit den "nullen" mit Sicherheit die Uhrzeit eingrenzen oder? Und was bei eval der Zusatz "or value" bewirkt?

        Außerdem würden mich wie oben schon gesagt die Vor-/ Nachteile in Bezug auf Logik interessieren.

        Da es nicht meine KNX Anlage ist und ich das nicht nur remote implementiere, werde ich wohl erst am Samstag dazu kommen das mal dort einzuspielen.

        Mich würde dennoch sehr interessieren wie eine Logik für mein Vorhaben aussehen könnte, ich komme mit einem Live Beispiel einfach besser in die Geschichte rein.

        Viele Grüße & besten Dank
        Jannis
        Zuletzt geändert von startrix; 12.11.2018, 20:35. Grund: Code formatiert

        Kommentar


          #5
          Zitat von bmx Beitrag anzeigen

          Code:
          Zirkulationspumpe:
          type: bool
          autotimer: 3m = 0
          Wenn ich mein ITEM Zirkulationspumpe mit dem o. g. autotimer versehe, dann würde sie aber auch nach "Handbetrieb" über die Visu oder den Aktor nach 3 min. ausgehen, oder? Ob das den Besitzer stört - denke wohl eher nicht... Aber könnte in Bezug auf andere Dinge Problematisch werden, oder?

          VG Jannis

          Kommentar


            #6
            Zitat von startrix Beitrag anzeigen
            gibt es Vor- / Nachteile bei deinem Lösungsansatz gegenüber einer Lösung via Logik?


            crontab: 0 0 * * = 0 sorgt dafür das um Mitternacht Zirkulation_einmal_am_Tag auf 0 bzw. False gesetzt wird.

            Somit wird das eval dafür sorgen, das durch die or Verknüpfung dieses Flag dann wieder auf 1 geht und damit einmalig am Tag die Zirkulationspumpe ansteuert.

            Eval & Co. in den Items:
            Vorteile: Es ist alles kompakt beieinander in Items und übersichtlich
            Nachteile: Zum Testen muß SHNG neu gestartet werden, eval & Co. sind manchmal in den Möglichkeiten begrenzt

            Logik:
            Vorteile: Kann während der Laufzeit von SHNG getestet werden (Logikeditor im Backend) Logging kann auch über Print in eine externe Datei erfolgen die man mit einem Editor auf Änderungen verfolgt Es sind viele Zeile Code möglich
            Nachteile: Manchmal wird es unübersichtlicher durch eine Logik. Evtl. muß man auch beim Logikbeginn prüfen, wodurch eine Logik getriggert wurde, das bläht das ganze gerne mal auf.

            Bestimmt gibt es noch weitere Punkte. Wenn Du Dich durch die Doku gearbeitet hast, würde ich mich über einen Blogartikel (www.smarthomeng.de) freuen damit andere auch was von Deinen Erkenntnissen haben. Und da Du damit gerade anfängst, hast Du auch noch nicht so die Scheuklappen auf wie jemand der das schon lange macht.

            Kommentar


              #7
              Hi,

              die Idee von bmx ist gut, aber da ist ein kleiner Bug drin (den Du als Anfänger nicht so einfach findest):
              Code:
              Zirkulation_einmal_am_Tag:
                              type: bool
                              crontab: 0 0 * * = -1
                              eval_trigger: Lampen.Bad_Deckenlampe
                              eval: int(value) != -1
                              on_change: sh.Aktor_SiKa_Keller.Zirkulationspumpe = 1
              Gewollt ist, dass "Zirkulation_einmal_am_Tag" true wird, sobald die Deckenlampe an geht und dann bis Mitternacht true bleibt. Bei der Formulierung vorher würde es aber jedes mal wenn das Licht ausgeht auch false werden.

              Gruß, Waldemar

              Kommentar


                #8
                Hallo,
                sehr interessanter Ansatz.
                Könnte man ohne Logik auch das Zeitfenster 6.00 bis 10.00 Uhr noch mit abprüfen?

                Michael

                Kommentar


                  #9
                  Hi,

                  auch ohne es getestet zu haben...
                  Code:
                  Zeitfenster:
                      type: bool
                      crontab: 
                          - 0 6 * * = 1
                          - 0 10 * * = 0
                  Zirkulation_einmal_am_Tag:
                          eval: int(value) != -1 and sh.Zeitfenster() 
                          on_change: Aktor_SiKa_Keller.Zirkulationspumpe = value
                  Bei Zirkulation_einmal_am_Tag muss sonst alles so bleiben, wie es war, Zeitfenster kommt neu dazu. Und das "value" im on_change hätte auch schon vorher da sein sollen (statt der 1), denn sonst läuft um Mitternacht auch nochmal die Zirkulationspumpe an...

                  Gruß, Waldemar

                  Kommentar


                    #10
                    bmx Danke für deine Erklärung - Einen Blogartikel kann ich bestimmt dazu beisteuern und Scheuklappen hab ich wenn ich mir manche Beiträge der Cracks ansehe mit Sicherheit noch nicht. Vielen Dank auch bzgl. der Übersicht mit Vor- / Nachteil.

                    mumpf Vielen Dank für die Ergänzung bzgl. der Uhrzeit und die Anpassung des Codes, den Fehler hätte ich so schnell bestimmt nicht gefunden, ohne Hilfe.

                    Ich werde dies mal am kommenden Samstag bei meinem Freund implementieren, die sind eh gerade im Urlaub... Und wenn das klappt dann wird die Steckdose für meine Zirkulationspumpe mit dem Aktor verkabelt... Bisher läuft da nur eine doofe aber zuverlässige analoge Zeitschaltuhr...

                    Viele Grüße
                    Jannis

                    Kommentar


                      #11
                      Wenn Du noch Messwerte hast, kannst Du die Temperatur der Zirkulationsleitung messen (fällt schneller ab, als man denkt) und diese mit einbeziehen. Weiterhin kann man die Zirkulationspumpe anmachen, wenn der Speicher geladen wird (also kurz vor abschalten des Speichers). Alles kleine Optimierungen
                      Derzeit zwischen Kistenauspacken und Garten anlegen.
                      Baublog im Profil.

                      Kommentar


                        #12
                        Zitat von greentux Beitrag anzeigen
                        Wenn Du noch Messwerte hast, kannst Du die Temperatur der Zirkulationsleitung messen (fällt schneller ab, als man denkt) und diese mit einbeziehen. Weiterhin kann man die Zirkulationspumpe anmachen, wenn der Speicher geladen wird (also kurz vor abschalten des Speichers). Alles kleine Optimierungen
                        Danke greentux - die Temperatur des WW-Speichers lesen wir aktuell über einen Raspi aus. Mal gucken ob da noch mehr nötig ist. Ich denke in dem 2 Personenhaushalt (beide Vollzeit am Arbeiten) - geht es erstmal nur darum Wasser zu sparen wenn morgens Duschen & Zähneputzen angesagt ist... Da der Bruder von meinem Freund "Gas-Wasser-Scheiße" macht, vermute ich mal das die Laufzeit mit 3 Minuten relativ genau auf Leitungslänge etc. berechnet oder auch gemessen wurde. Ich werde Ihn mal Fragen.

                        Was ich nicht verstehe, warum sollte ich kurz bevor das Neubefüllen des Speichers endet, die Zirkulation einschalten? Da versteh ich denn Sinnn nicht.

                        Kurze Nebeninformation - der Speicher wird nicht rein durch die Gastherme genutzt, sondern da hängt noch eine relativ große Photovoltaik Anlage auf dem Dach mit dran. Aber für Details wäre ich aktuell überfragt.

                        Viele Grüße
                        Jannis

                        Kommentar


                          #13
                          Naja, wenn Du die Zirkulation während des Laden des Speichers kalt läßt, dann kommt dieses kalte Wasser ggf dann demnächst bald in deinen Speicher... So wirds gleich mit erhitzt.
                          Ist akademisch, ich weiß
                          Derzeit zwischen Kistenauspacken und Garten anlegen.
                          Baublog im Profil.

                          Kommentar


                            #14
                            So, Hallo Zusammen ich hoffe Ihr habt ein schönes Wochenende...

                            Leider komme ich bei der Umsetzung seit ein paar Stunden hier nicht weiter.

                            mumpf wenn ich es so einbinde wie du oben beschrieben hattest (zumindest so ähnlich, ITEM kommt unten noch), bekomme ich einen Fehler im Log bzg. eval:
                            1. 2018-11-17 14:04:03 WARNING item Crontab.Zirkulation_einmal_am_Tag_b-eval Item Crontab.Zirkulation_einmal_am_Tag_b: problem evaluating int(value) != -1 and sh.Crontab.Zeitfenster(): invalid literal for int() with base 10: 'true' -- item.py:__run_eval:675

                            In der yaml Datei sieht es so aus und wird auch im Backend angezeigt:
                            Code:
                            # crontab.yaml
                            Crontab:    
                                Zeitfenster:
                                    type: bool
                                    crontab:
                                        - 0 6 * * = 1
                                        - 0 10 * * = 0
                                Zirkulation_einmal_am_Tag_b:
                                    type: bool
                                    eval: int(value) != -1 and sh.Crontab.Zeitfenster()
                                    eval_trigger: Lampen.Bad_Deckenlampe        
                                    on_change: Aktor_SiKa_Keller.Zirkulationspumpe = value
                            Wenn ich mir das ganze so einbinde dann wird der Wert von Crontab.Zirkulation_einmal_am_Tag zumindest bei Licht an im Bad auf TRUE gesetzt und bei Licht aus auf FALSE, jedoch wird die Zirkulationspumpe nicht angesteuert. Auch die Zeiteinschränkung 6 - 10 Uhr wird ignoriert.

                            Code:
                            # crontab.yaml
                            Crontab:    
                                Zirkulation_einmal_am_Tag:
                                    type: bool
                                    crontab:
                                        - 0 6 * * = 1
                                        - 0 10 * * = 0
                                    eval: sh.Lampen.Bad_Deckenlampe()
                                    eval_trigger: Lampen.Bad_Deckenlampe      
                                    on_change: Aktor_SiKa_Keller.Zirkulationspumpe = 1
                            Wo ist mein Fehler, was mach ich falsch? Jemand einen Tipp für mich?

                            Viele Grüße & euch ein schönes Wochenende
                            Jannis

                            UPDATE: nach dem ich nun auf Version 1.5.1 ein update gemacht habe geht auch der on_change Befehlt (hatte vorher nur die 1.3 hier installiert. Dennoch wird der Zeitfilter ignoriert.
                            Zuletzt geändert von startrix; 17.11.2018, 15:34.

                            Kommentar


                              #15
                              Hi Jannis,

                              Zitat von startrix Beitrag anzeigen
                              invalid literal for int() with base 10: 'true'
                              das muss ein neuer Fehler in shNG.py sein. Er kommt daher, dass das value im eval durch einen String 'true' ersetzt wird, anstatt durch den Wert des triggernden Items (der dann True wäre). Da ich hier den Grund nicht kenne, kann ich Dir da nicht wirklich weiter helfen. Es könnte sein, dass es durch folgende Einstellung umgangen werden kann:

                              Code:
                              # smarthome.yaml
                              assign_compatibility: compat_1.2
                              Das könntest Du ausprobieren. Hier nochmal das korrekte Item (Du hast crontab vergessen):
                              Code:
                              # crontab.yaml
                              Crontab:    
                                  Zeitfenster:
                                      type: bool
                                      crontab:
                                          - 0 6 * * = 1
                                          - 0 10 * * = 0
                                  Zirkulation_einmal_am_Tag_b:
                                      type: bool
                                      crontab: 0 0 * * = -1
                                      eval: int(value) != -1 and sh.Crontab.Zeitfenster()
                                      eval_trigger: Lampen.Bad_Deckenlampe        
                                      on_change: Aktor_SiKa_Keller.Zirkulationspumpe = value
                              Zu Deinem Versuch:
                              Zitat von startrix Beitrag anzeigen
                              Wo ist mein Fehler, was mach ich falsch?
                              crontab ist keine Zeiteinschränkung, sondern eine zeitbasierte Aktion. So wie Du das verwendest, bringt das nichts.

                              Ich habe noch eine andere Idee, nicht so gut wie die alte, aber wahrscheinlich ausreichend:
                              Code:
                              # crontab.yaml
                              Crontab:    
                                  Zeitfenster:
                                      type: bool
                                      crontab:
                                          - 0 6 * * = 1
                                          - 0 10 * * = 0
                                  Zirkulation_einmal_am_Tag_b:
                                      type: bool
                                      crontab: 0 0 * * = 0
                                      eval: sh.Crontab.Zeitfenster()
                                      eval_trigger: Lampen.Bad_Deckenlampe        
                                      on_change: Aktor_SiKa_Keller.Zirkulationspumpe = value
                              Der Nachteil bei dieser Lösung: Wenn vor 6:00 Uhr das Licht eingeschaltet wird, und es nach 6:00 Uhr ausgeht, dann wird dieses Ausschalten die Zirkulation einschalten. Der Vorteil ist, diese Lösung kommt ohne die int() Konvertierung aus.
                              Ansonsten sollte es wie erwartet funktionieren.

                              Gruß, Waldemar

                              Kommentar

                              Lädt...
                              X