Ankündigung

Einklappen
Keine Ankündigung bisher.

Abwesenheit/Anwesenheit in Logik umsetzen

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

    Abwesenheit/Anwesenheit in Logik umsetzen

    Ich möchte eine Abwesenheit/Anweisenheitsfunktion realisieren. Dabei stelle ich mir das so vor:

    1. Eingangstür wurde geschlossen (Wechsel von offen zu geschlossen) und 5 Minuten keine Präsenz im Haus -> Szene Abwesend aktivieren
    2. 12 Stunden keine Präsenz im Haus -> Szene Urlaub aktivieren
    3. Eingangstür wurde geschlossen (Wechsel von offen zu geschlossen) -> Szene Anwesend aktivieren

    Mir ist nur nicht klar, wie ich das realisieren soll. Logiken mit contab habe ich schon ein paar geschrieben. Aber hier muss ich ja auf einen KNX-Element triggern und dann auch noch die Zeitfenster abfragen.

    #2
    Zeitverzögerungen (12h) kannst Du mit dem Item Attribut Autotimer realisieren. Du musst jetzt nur über ein Item welches den Anwesenheitsstatus hält, die Urlaubsdzene sperren oder freigeben.
    Viele Grüße
    Martin

    There is no cloud. It's only someone else's computer.

    Kommentar


      #3
      Hi,

      ich nutze für so etwas keine Logik... dafür sind Items da (meine Meinung) oder Zustandsautomaten. Ich gehe mal davon aus, dass Du ein Item für "Präsenz im Haus" und eines für "Tür verschlossen" hast. Dann sieht das Ganze in etwa so aus (ist nicht getestet, aber grob sollte es laufen):

      Code:
      [Zentral]
          [[Verschlossen]]
              name = Haustür ist verschlossen
              type = bool
              ...
          [[Praesenz]]
              name = Präsenz Haus aktuell
              type = bool
              ...
              [[[Fuenf]]]
                  name = Präsenz im Haus in den letzten 5 Minuten
                  type = num
                  value = 2
                  autotimer = 300 = 2
                  eval = sh.Zentral.Praesenz() if int(value) > 1 else 1
                  eval_trigger = Zentral.Praesenz
              [[[ZwoelfStunden]]]
                  name = Präsenz im Haus in den letzten 12 Stunden
                  type = num
                  value = 2
                  autotimer = 720m = 2
                  eval = sh.Zentral.Praesenz() if int(value) > 1 else 1
                  eval_trigger = Zentral.Praesenz
          [[Abwesend]]
              name = Szene Abwesend senden
              type = num
              eval = 1 if sh.Zentral.Praesenz.Fuenf() == 0 and sh.Zentral.Verschlossen() else none
              eval_trigger = Zentral.Praesenz.Fuenf
              enforce_updates = yes
              ...
          [[Urlaub]]
              name = Szene Urlaub senden
              type = num
              eval = 2 if sh.Zentral.Praesenz.ZwoelfStunden() == 0 and sh.Zentral.Verschlossen() else none
              eval_trigger = Zentrla.Praesenz.ZwoelfStunden
              enforce_updates = yes
              ...
          [[Anwesend]]
              name = Szene Anwesend senden
              type = num
              eval = 3 if not sh.Zentral.Verschlossen() else none
              eval_trigger = Zentral.Verschlossen
              enforce_updates = yes
              ...
      Die Szenennummern musst Du natürlich anpassen und noch passende knx_.-Attribute zufügen. Ansonsten ist das ja recht überschaubar und macht nicht viel außer den Sachen, die Du oben beschrieben hast (wobei ich davon ausgehe, dass Du Punkt 3 so meinst, wie ich ihn gemacht habe und nicht wie geschrieben).

      Gruß, Waldemar

      P.S.: Sorry, ist noch die alte conf-Schreibweise, ich hab den Teil noch nicht nach yaml transferiert.
      Zuletzt geändert von mumpf; 08.07.2018, 13:50.
      OpenKNX www.openknx.de

      Kommentar


        #4
        Zitat von Msinn Beitrag anzeigen
        Zeitverzögerungen (12h) kannst Du mit dem Item Attribut Autotimer realisieren. Du musst jetzt nur über ein Item welches den Anwesenheitsstatus hält, die Urlaubsdzene sperren oder freigeben.
        Danke für den Ansatz. Damit habe ich dadurch schon probiert.

        Zitat von mumpf Beitrag anzeigen
        ich nutze für so etwas keine Logik... dafür sind Items da (meine Meinung) oder Zustandsautomaten. Ich gehe mal davon aus, dass Du ein Item für "Präsenz im Haus" und eines für "Tür verschlossen" hast. Dann sieht das Ganze in etwa so aus (ist nicht getestet, aber grob sollte es laufen):

        Die Szenennummern musst Du natürlich anpassen und noch passende knx_.-Attribute zufügen. Ansonsten ist das ja recht überschaubar und macht nicht viel außer den Sachen, die Du oben beschrieben hast (wobei ich davon ausgehe, dass Du Punkt 3 so meinst, wie ich ihn gemacht habe und nicht wie geschrieben)
        Grundsätzlich habe ich das auch mal zusammengebastelt, aber die Tür noch raus gelassen. Der entscheidene Punkt ist nämlich auch, dass die Aktion mit der Zeit nur ausgelöst werden soll, wenn sich der Status der Tür ändert. Also die Tür soll nicht verschlossen sein, sondern sie soll nur geschlossen sein.

        Code:
        Zentral:
            Praesenz:
                type: bool
                knx_dpt: 1
                knx_cache: 8/0/0
                visu_acl: rw
                kurzAbwesend:
                    type: bool
                    autotimer = 5m = True
                    eval: False if sh.Zentral.Praesenz() else True
                    eval_trigger: Zentral.Praesenz
                langAbwesend:
                    type: bool
                    autotimer = 12h = True
                    eval: False if sh.Zentral.Praesenz() else True
                    eval_trigger: Zentral.Praesenz
            Anwesend:
                type: num
                knx_dpt: 1
                knx_send: 10/3/0
                enforce_updates: yes
                eval: 1 if sh.Zentral.Praesenz.kurzAbwesend() = False else none
                eval_trigger: Zentral.Praesenz.kurzAbwesend
            Abwesend:
                type: num
                knx_dpt: 1
                knx_send: 10/3/0
                eval: 2 if sh.Zentral.Praesenz.kurzAbwesend() = True else none
                eval_trigger: Zentral.Praesenz.kurzAbwesend
                enforce_updates: yes
            Urlaub:
                type: num
                knx_dpt: 1
                knx_send: 10/3/0
                eval: 3 if sh.Zentral.Praesenz.langAbwesend()= True else none
                eval_trigger: Zentral.Praesenz.langAbwesend
                enforce_updates: yes
        Also im Prinzip fehlen 2 Sachen, um das vernünftig zu realisieren:

        1. Der Überwachungstimer soll los laufen, wenn die Tür geschlossen worden ist.
        2. Die Überwachung soll beendet werden, wenn die Tür wieder göffnet wurde.
        Zuletzt geändert von Cannon; 08.07.2018, 16:50.

        Kommentar


          #5
          Noch mal ein Nachtrag. Kann man den Trigger nicht direkt auf die Tür setzen, denn die ist ja das, was überhaupt alles auslösen soll? So hier:

          Code:
          Zentral:
              Praesenz:
                  type: bool
                  knx_dpt: 1
                  knx_cache: 8/0/0
                  visu_acl: rw
                  kurzAbwesend:
                      type: bool
                      autotimer = 5m = True
                      eval: False if sh.Zentral.Praesenz() else True
                      eval_trigger: EG.Diele.Tuer.geschlossen
                  langAbwesend:
                      type: bool
                      autotimer = 12h = True
                      eval: False if sh.Zentral.Praesenz() else True
                      eval_trigger: EG.Diele.Tuer.geschlossen
              Anwesend:
                  type: num
                  knx_dpt: 1
                  knx_send: 10/3/0
                  enforce_updates: yes
                  eval: 1 if sh.Zentral.Praesenz.kurzAbwesend() = False else none
                  eval_trigger: Zentral.Praesenz.kurzAbwesend
              Abwesend:
                  type: num
                  knx_dpt: 1
                  knx_send: 10/3/0
                  enforce_updates: yes
                  eval: 2 if sh.Zentral.Praesenz.kurzAbwesend() = True else none
                  eval_trigger: Zentral.Praesenz.kurzAbwesend
              Urlaub:
                  type: num
                  knx_dpt: 1
                  knx_send: 10/3/0
                  enforce_updates: yes
                  eval: 3 if sh.Zentral.Praesenz.langAbwesend()= True else none
                  eval_trigger: Zentral.Praesenz.langAbwesend

          Kommentar


            #6
            Hi,

            natürlich kannst Du es so machen, wie Du es willst. Wenn Du die "Überprüfung" nur mit der Tür starten/stoppen willst, dann musst Du Logiken verwenden. Ich verstehe nur nicht, warum? Es geht ja um die Funktion, nicht darum, was die Logikengine macht.

            Ferner wird Deine Logik oben nicht funktionieren (also nicht das machen, was Du beabsichtigst). Ich gehe jetzt nicht alles durch, aber das Beispiel "kurzAbwesend":
            1. Tür wird geöffnet, jemand ist im Haus
              Ich gehe mal davon aus, dass kurzAbwesend = false ist. Durch das öffnen wird kurzAbwesend getriggert, es war false und bleibt false, da Präsenz true ist. Autotimer wird nicht getriggert, nichts passiert.
            2. Tür wird geschlossen, jemand ist im Haus
              Die Tür wird wieder geschlossen. kurzAbwesend wird wieder getriggert, Präsenz ist noch immer true, es passiert gleiches wie oben, also nichts.
            3. Tür wird geschlossen, keiner ist im Haus
              Falls aber von außen geschlossen wurde, passiert noch immer nichts, denn Du wirst ja mit dem Schließen nicht warten, bis die Nachlaufzeit Deiner PM abgelaufen ist. Somit ist zum Zeitpunkt des Schließens von außen, wenn kurzAbwesend getriggert wird, Präsenz ist noch true und es passiert nichts.
            4. Tür wird geöffnet, keiner ist im Haus
              Das ist der Fall, wenn keiner im Haus war und dann die Tür aufgeht: kurzAbwesend wird getriggert, Präsenz ist hier sicherlich false, somit wird kurzAbwesend true. Das würde Deine Abwesend-Szene triggern. Wenn Du die Tür schließt oder einfach reingehst und ohne zu schließen 5 Minuten wartest, wird kurzAbwesend wieder getriggert und geht dann auf false und löst damit die Anwesend-Szene aus.
            Wenn Du schrittweise meinen Vorschlag durchgehst, wirst Du sehen, dass es eher Deine Wünsche erfüllt.

            Gruß, Waldemar

            P.S.: Meine Lösung entspricht aber nicht Deiner Lösung von 17:47 Uhr. Die Vereinfachungen klappen so nicht...
            Zuletzt geändert von mumpf; 08.07.2018, 18:40. Grund: PS zugefügt
            OpenKNX www.openknx.de

            Kommentar


              #7
              Zitat von mumpf Beitrag anzeigen
              natürlich kannst Du es so machen, wie Du es willst. Wenn Du die "Überprüfung" nur mit der Tür starten/stoppen willst, dann musst Du Logiken verwenden. Ich verstehe nur nicht, warum? Es geht ja um die Funktion, nicht darum, was die Logikengine macht.
              Naja der Ansatz ist ja, dass das Ganze nur ausgelöst wird, wenn überhaupt die Tür geschlossen wird. Und ich meine wirklich geschlossen. Das heißt sobald ich die Tür schließe, soll geschaut werden, ob noch jemand im Haus ist. Das funktioniert so mit deiner Lösung aber nicht - auch wenn der Ansatz schon mal sehr hilfreich ist! :-)

              Deshalb habe ich noch mal alles umgebaut und es funktioniert schon ein Stückchen mehr.

              Code:
                      kurz:
                          type: num
                          value: 2
                          visu_acl: rw
                          autotimer: 1m = 2
                          eval: sh.Zentral.Praesenz() if int(value) > 1 else 1
                          eval_trigger:
                              - Zentral.Praesenz
                              - EG.Diele.Tuer.geschlossen
              Das Problem ist aber, die Abwesenheit wird nicht nur von der Tür zurückgesetzt, sondern auch vom Präsenzmelder, was ich ja eigentlich nicht will. Die Frage ist, wie bekomme ich das unter einem Hut?

              Kommentar


                #8
                Zitat von Cannon Beitrag anzeigen
                Das heißt sobald ich die Tür schließe, soll geschaut werden, ob noch jemand im Haus ist. Das funktioniert so mit deiner Lösung aber nicht
                Hi,
                das sehe ich anders . Ich denke wahrscheinlich nur irgendwie andersrum... Ich versuch mal zu erklären:

                Items:
                • Praesenz - aktuelle Präsenz, wie auch immer Du sie ermittelst und wie lange auch immer dieser Wert "true" bleibt
                • Praesenz.Fuenf - geht immer erst 5 Minuten später als "Praesenz" auf 0, mit dem Item weiß man zuverlässig, dass es fünf Minuten keine Präsenz gegeben hat, wenn es auf 0 geht
                • Praesenz.ZwoelfStunden - wie das obige, nur für 12 Stunden. Wenn das Item auf 0 geht, gab es 12 Stunden lang keine Präsenz im Haus.
                • Verschlossen - gibt an, ob die Tür zu ist, wie auch immer Du dieses Signal ermittelst
                Mir diesen Infos hast Du jetzt alles, um die 3 Szenen auszulösen:
                • Abwesend - wird getriggert bei Präsenz und wenn 5 Minuten keine Präsenz da ist. Es prüft auf Präsenz.Fünf == 0 (also seit fünf Minuten keiner da) und Verschlossen = true (also Tür zu).
                • Urlaub - wird getriggert bei Präsenz und wenn 12 Stunden keine Präsenz da ist. Es prüft auf Präsenz.ZwölfStunden == 0 (also 12 Stunden Abwesenheit) und Verschlossen = true.
                • Anwesend - wird getriggert bei Tür auf und Tür zu. Es prüft aber auf Verschlossen = false, also auf Tür auf. Hier könnte man auch noch auf Präsenz.Fünf == 0 prüfen, damit die Szene "Anwesend" nur verschickt wird, wenn vorher mindestens ein "Abwesend" gesendet worden ist.
                Man muss mit dem Tür Schließen nicht irgendwas starten, Du gewinnst damit nichts. Um ein Beispiel zu bringen: Wenn Du beim Schließen der Tür einen Timer starten würdest, der nach 5 Minuten prüft, ob noch jemand im Haus ist, bräuchtest Du ja immer noch das Item Präsenz.Fünf, das genau die Information hält. Und Dein 5 MInuten-Timer würde auch nur ein Item "Abwesend" triggern, dass im eval auf "Präsenz.Fuenf" und "Verschlossen" prüft. Genau das passiert aber mit meinem Vorschlag auch und ergibt das selbe Ergebnis.

                So, jetzt muss ich aber ins Bett, wenn Du noch Fragen hast, melde Dich.

                Gruß, Waldemar

                P.S.: Jetzt fällt mir auch ein Satz ein, mit dem Ich meinen Gedankengang beschreiben kann: "Fünf Minuten, nachdem alle aus dem Haus sind, wird geschaut, ob die Tür verschlossen ist." So rum denke ich...
                Zuletzt geändert von mumpf; 09.07.2018, 01:26.
                OpenKNX www.openknx.de

                Kommentar


                  #9
                  Zitat von mumpf Beitrag anzeigen
                  das sehe ich anders . Ich denke wahrscheinlich nur irgendwie andersrum... Ich versuch mal zu erklären
                  Wahrscheinlich ist es manchmal schwierig Gedanken zusammenzuführen, wenn beide völlig unterschiedlich denken. Andererseits stelle ich mich vielleicht zu blöd an.

                  Ein wichtiger Punkt bei dem ganzen ist aber, dass die Tür nie verschlossen ist, sondern nur geschlossen. Und deshalb sehe ich genau da das Problem. Denn wenn alle fest schlafen und dadurch möglicherweise keine Präsenz ausgelöst wird und die Tür natürlich geschlossen ist, dann wird hier eine Abwesenheit gesetzt richtig?

                  Ich versuche das jetzt mal mit "age" aus dem Item zu probieren.

                  Kommentar


                    #10
                    Zitat von Cannon Beitrag anzeigen
                    Ein wichtiger Punkt bei dem ganzen ist aber, dass die Tür nie verschlossen ist, sondern nur geschlossen.
                    OK, jetzt verstehe ich eher, was Dein Problem ist. Aber das hat nicht wirklich was mit der Lösung zu tun, sondern mit der unvollständigen Angabe der Abhängigkeiten. Bei mir im Haus sind es mehrere Faktoren, die die hausweite Präsenz beeinflussen. Z.B. wirkt der Zustand "Schlafen" durchaus auch auf die Präsenz (in der naheliegenden Annahme, dass man nur Schlafmodus einschaltet, wenn man da ist und schlafen will).

                    Um mal Deinen Gedankengang mit meinen Worten zu wiederholen:
                    • Du willst beim schließen der Tür eine Art "Aufpasser" starten, der erstmal 5 Minuten läuft.
                    • Wenn in der Zwischenzeit Bewegung festgestellt wurde, wird der "Aufpasser" zurückgesetzt und es passiert nichts.
                    • Wenn in der Zwischenzeit die Tür geöffnet wurde, wird der "Aufpasser" zurückgesetzt und es passiert gar nichts.
                    • Wenn der Aufpasser nach 5 Minuten noch läuft, dann wird "Abwesend" gesetzt, falls Präsenz = false.
                    • "Abwesend" startet einen neuen "Aufpasser", der 12 Stunden läuft.
                    • Wenn in der Zwischenzeit Bewegung festgestellt wurde, wird der "Aufpasser" zurückgesetzt und "Anwesend" wird gesetzt.
                    • Wenn in der Zwischenzeit die Tür geöffnet wurde, wird der "Aufpasser" zurückgesetzt und und "Anwesend" wird gesetzt.
                    • Wenn der "Aufpasser" nach 12 Stunden noch läuft, wird "Urlaub" gesetzt.
                    • Wenn jetzt Bewegung oder Tür auf festgestellt wird, dann wird "Anwesend" gesetzt.
                    Wenn ich das richtig verstanden habe, ist das ein Paradefall für Zustandsautomaten, aber das bekommt man auch mit Items hin. Allerdings ist das kein zuverlässig funktionierender Ansatz. Beispiele, die mir einfallen:
                    • Du gehst raus, Deine Frau schläft -> nach 5 Minuten gibt es Abwesend.
                    • Du gehst raus, Deine Frau liest oder schaut fern und bewegt sich nicht -> nach 5 Minuten gibt es Abwesend (der Fall mit Lesen ist auch bei mir noch nicht abgedeckt; ein laufender Fernseher setzt bei mir zu Hause Präsenz = true)

                    Ein erster Vorschlag wäre das hier (nicht ausprobiert und nur aus dem Kopf zusammengeschrieben):
                    Code:
                    Zentral:
                        Praesenz:
                            type: bool
                            knx_dpt: 1
                            knx_cache: 8/0/0
                            visu_acl: rw
                        Tuer:
                            type: num
                            eval: int(value)
                            eval_trigger: EG.Diele.Tuer.geschlossen
                            # geschlossen: true, offen: false
                            kurzAufpassen:
                                # das Item ist 0 wenn Aufpasser aus, 1 wenn an und 2 wenn 5 Minuten an. 
                                # Test - Ausgangssituation: Item = 0, Präsenz = 1, Tür = 1 (geschlossen)
                                # - Praesenz geht auf 0 -> eval = 0, keine Änderung, autotimer bleibt aus
                                # - Praesenz geht wieder auf 1 -> eval = 0, keine Änderung, autotimer bleibt aus
                                # - Tuer wird geöffnet (0) -> eval = 0, keine Änderung, autotimer bleibt aus
                                # - Tuer wird geschlossen (1) -> eval = 1, autotimer läuft an
                                #   - Tuer bleibt 1, Präsenz geht auf 0 -> eval = 1, autotimer läuft weiter
                                #     - autotimer läuft ab (2) -> eval = 2, autotimer läuft erneut an (HIER KANN ABWESEND gestartet werden)
                                #       - autotimer läuft erneut ab (2) -> eval = 0, autotimer läuft erneut an
                                #         - autotimer läuft erneut ab (2) -> eval = 0, keine Änderung
                                #   - Tuer bleibt 1, Präsenz geht wieder auf 1 -> eval = 0, autotimer läuft erneut an
                                #     - autotimer läuft ab (2) -> eval = 0, keine Änderung
                                #   - Tuer geht auf (0) -> eval = 0, autotimer läuft erneut an
                                #     - autotimer läuft ab (2) -> eval = 0, keine Änderung
                                # weitere Fälle fallen mir nicht ein...
                                type: num
                                autotimer: 5m = 2
                                eval: 1 if (sh.Zentral.Tuer.age() < 1 and sh.Zentral.Tuer() == 1) or (sh.self() == 1 and not sh.Zentral.Praesenz() and sh.Zentral.Tuer() == 1) else 2 if value == 2 and sh.self() == 1 else 0
                                eval_trigger: 
                                    - ..
                                    - ...Praesenz
                            langAufpassen:
                                # das Item ist 0 wenn Tür offen, 1 wenn geschlossen und 2 wenn 12 Stunden geschlossen. 
                                type: num
                                autotimer: 12h = 2
                                eval: 1 if (sh.Zentral.Tuer.age() < 1 and sh.Zentral.Tuer() == 1) or (sh.self() == 1 and not sh.Zentral.Praesenz() and sh.Zentral.Tuer() == 1) else 2 if value == 2 and sh.self() == 1 else 0
                                eval_trigger: 
                                    - ..
                                    - ...Praesenz
                        Anwesend:
                            type: num
                            knx_dpt: 1
                            knx_send: 10/3/0
                            enforce_updates: yes
                            eval: 1 if not sh.Zentral.Tuer() else none
                            eval_trigger: Zentral.Tuer
                        Abwesend:
                            type: num
                            knx_dpt: 1
                            knx_send: 10/3/0
                            enforce_updates: yes
                            eval: 2 if sh.Zentral.Tuer.kurzAufpassen() == 2 and not sh.Zentral.Praesenz() else none
                            eval_trigger: Zentral.Praesenz.kurzAufpassen
                        Urlaub:
                            type: num
                            knx_dpt: 1
                            knx_send: 10/3/0
                            enforce_updates: yes
                            eval: 2 if sh.Zentral.Tuer.langAufpassen() == 2 and not sh.Zentral.Praesenz() else none
                            eval_trigger: Zentral.Praesenz.langAufpassen
                    OpenKNX www.openknx.de

                    Kommentar


                      #11
                      Zitat von mumpf Beitrag anzeigen
                      • Du willst beim schließen der Tür eine Art "Aufpasser" starten, der erstmal 5 Minuten läuft.
                      • Wenn in der Zwischenzeit Bewegung festgestellt wurde, wird der "Aufpasser" zurückgesetzt und es passiert nichts.
                      • Wenn in der Zwischenzeit die Tür geöffnet wurde, wird der "Aufpasser" zurückgesetzt und es passiert gar nichts.
                      • Wenn der Aufpasser nach 5 Minuten noch läuft, dann wird "Abwesend" gesetzt, falls Präsenz = false.
                      • "Abwesend" startet einen neuen "Aufpasser", der 12 Stunden läuft.
                      • Wenn in der Zwischenzeit Bewegung festgestellt wurde, wird der "Aufpasser" zurückgesetzt und "Anwesend" wird gesetzt.
                      • Wenn in der Zwischenzeit die Tür geöffnet wurde, wird der "Aufpasser" zurückgesetzt und und "Anwesend" wird gesetzt.
                      • Wenn der "Aufpasser" nach 12 Stunden noch läuft, wird "Urlaub" gesetzt.
                      • Wenn jetzt Bewegung oder Tür auf festgestellt wird, dann wird "Anwesend" gesetzt.
                      So detailiert habe ich das natürlich nicht aufgeschrieben. Allerdings habe ich immer wieder betont, dass es nur um eine geschlossene Türe geht. Aber verschlossen und geschlossen ist leicht zu verwechseln. ;-)
                      Das stimmt jetzt fast. Nur der letzte Schritt muss angepasst werden, also Bewegung beendet den Urlaub nicht - nur Tür auf/zu. Damit kann ich das auch als Alarmquelle nutzen, wenn denn im Urlaub Präsenz ausgelöst wird. Die Präsenzmeldung ist nur für die ersten Minuten. Danach gehe ich davon aus, dass niemand da ist und auch nicht plötzlich im Haus erscheint. ;-)

                      Zitat von mumpf Beitrag anzeigen
                      Wenn ich das richtig verstanden habe, ist das ein Paradefall für Zustandsautomaten, aber das bekommt man auch mit Items hin. Allerdings ist das kein zuverlässig funktionierender Ansatz. Beispiele, die mir einfallen:
                      • Du gehst raus, Deine Frau schläft -> nach 5 Minuten gibt es Abwesend.
                      • Du gehst raus, Deine Frau liest oder schaut fern und bewegt sich nicht -> nach 5 Minuten gibt es Abwesend (der Fall mit Lesen ist auch bei mir noch nicht abgedeckt; ein laufender Fernseher setzt bei mir zu Hause Präsenz = true)
                      Im schlimmsten Fall, kann man die 5 Minuten noch erweitern. Das müsste man Testen. Schlafen heißt ja nicht, dass man sich nicht bewegt. Vor allem und das ist glaube ich der entscheidene Faktor, dass sofort nach dem Schließen der Tür keine Bewegung mehr erkannt wird. Wird danach noch eine erkannt, dann bricht der "Aufpasser" sofort ab. Wobei auch hier noch mal zu prüfen ist, wie das mit den Präsenzmelder zu realisieren ist, denn auch die Alarm-Funktion schaltet im Prinzip immer nur ein und/oder aus. Hier müsste der Präsenzmelder auch direkt beim schließen der Tür "zurückgesetzt" werden. Und ich kann das Schaltfenster (die 5 Minuten) dann direkt im Präsenzmelder festlegen.

                      Ich danke für deine tatkräftige Unterstützung und schaue mir das Beispiel noch mal detailiert an. Ich denke so Stück für Stück finde ich dank deiner Hilfe auch den richtigen Weg. :-)

                      Kommentar


                        #12
                        Viel Erfolg
                        OpenKNX www.openknx.de

                        Kommentar


                          #13
                          Diese Skriptsprache ist eine Katastrophe, wie ich finde. Ständig sind da Fehler, weil z.B. "true" nicht gültig ist und es True heißen muss. Das gleiche gilt für none und false. sh.self() gibt es auch nicht. Also irgendwie kriege ich es dennoch nicht hin.

                          Ich habe aber einen anderen, evtl. einfacheren Ansatz. Dazu wäre es vorab wichtig zu wissen, ob der autotimer das unterstützt. Ich habe es probiert, aber es brachte nicht den gewünschten Erfolg. Ich könnte nämlich den autotimer selbst für eine Wertzuweisung nutzen:

                          Code:
                          autotimer: 5m = True if not sh.Zentral.Praesenz.age() > 299 else False
                          Das ist nur ein Beispiel, aber ginge es grundsätzlich, dass er entsprechend True oder False nach 5 Minuten dem item zuweist?

                          Kommentar


                            #14
                            Zitat von Cannon Beitrag anzeigen
                            Diese Skriptsprache ist eine Katastrophe, wie ich finde.
                            Nein, es ist python (zumindest das, was im eval steht).

                            Zitat von Cannon Beitrag anzeigen
                            "true" nicht gültig ist und es True heißen muss
                            Das ist wiederum so in yaml definiert und steht - wenn ich mich recht erinnere - auch so in der Doku. Wenn Du einen Editor verwendest, der yaml versteht, bekommst Du so etwas normalerweise angezeigt.

                            Zitat von Cannon Beitrag anzeigen
                            sh.self() gibt es auch nicht
                            Das ist wohl mein Fehler, muss wohl laut Doku .self() heißen... wie gesagt, ich hatte es nicht ausprobiert.

                            Zitat von Cannon Beitrag anzeigen
                            ob der autotimer das unterstützt.
                            Nein! Siehe https://www.smarthomeng.de/user/konf...autotimer.html. Aber Deine Idee ist sicherlich etwas für die Wunschliste für zukünftige Features.

                            Gruß, Waldemar
                            OpenKNX www.openknx.de

                            Kommentar


                              #15
                              Zitat von mumpf Beitrag anzeigen
                              Nein! Siehe https://www.smarthomeng.de/user/konf...autotimer.html. Aber Deine Idee ist sicherlich etwas für die Wunschliste für zukünftige Features.
                              Ich habs gelesen auf der Seite, aber explizit stand es da nicht, dass es geht oder nicht geht. Oder ich bin blind. ;-)

                              Ich glaube ich habe die Lösung jetzt. Etwas anders als gedacht. Es ist erforderlich, dass ich den Tür-Status in regelmäßigen Abständen sende. Dann brauche ich auch keinen autotimer mehr. Damit wird die Abfrage immer automatisch getriggert.

                              Code:
                              Zentral:
                                  Praesenz:
                                      type: bool
                                      knx_dpt: 1
                                      # zum testen nur HWR
                                      knx_cache: 8/0/4
                                      visu_acl: rw
                              
                                  Anwesend:
                                      type: bool
                                      value: True
                                      enforce_updates: yes
                                      visu_acl: rw
                                      eval: False if sh...kurzAbwesend() or sh...langeAbwesend() else True
                                      eval_trigger:
                                          - ..kurzAbwesend
                                          - ..langeAbwesend
                              
                                  kurzAbwesend:
                                      type: bool
                                      value: False
                                      enforce_updates: yes
                                      visu_acl: rw
                                      eval: True if sh.EG.Diele.Tuer.geschlossen() and sh.EG.Diele.Tuer.geschlossen.age() > 300 and sh.EG.Diele.Tuer.geschlossen.age() <= 43200 and not sh...Praesenz() and sh...Praesenz.age() > 60 else False
                                      eval_trigger: EG.Diele.Tuer.geschlossen
                              
                                  langeAbwesend:
                                      type: bool
                                      value: False
                                      enforce_updates: yes
                                      visu_acl: rw
                                      eval: True if sh.EG.Diele.Tuer.geschlossen() and sh.EG.Diele.Tuer.geschlossen.age() > 300 and not sh...Praesenz() and sh...Praesenz.age() > 43200 else False
                                      eval_trigger: EG.Diele.Tuer.geschlossen
                              
                                  SzeneAnwesend:
                                      type: num
                                      knx_dpt: 1
                                      knx_send: 10/3/0
                                      enforce_updates: yes
                                      eval: 1 if value else None
                                      eval_trigger: ..Anwesend
                              
                                  SzenekurzAbwesend:
                                      type: num
                                      knx_dpt: 1
                                      knx_send: 10/3/0
                                      enforce_updates: yes
                                      eval: 2 if value else None
                                      eval_trigger: ..kurzAbwesend
                              
                                  SzenelangeAbwesend:
                                      type: num
                                      knx_dpt: 1
                                      knx_send: 10/3/0
                                      enforce_updates: yes
                                      eval: 3 if value else None
                                      eval_trigger: ..langeAbwesend
                              Ich habe die Szenen jetzt auch extra als Item gesetzt, damit man die Abwesenheiten auch in der VISU abfragen kann. Einziger Mangel bei dem Ganzen ist, dass die Szenen gleich mit dem Trigger gesendet werden, also immer wieder beim triggern und das ist eigentlich nicht so optimal.

                              Kommentar

                              Lädt...
                              X