Ankündigung

Einklappen
Keine Ankündigung bisher.

Lock Item mit Timeout

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

    Lock Item mit Timeout

    Jetzt habe ich auch mal eine Frage an den Rest hier - in der hoffnung dass es dazu schon eine Lösung gibt:

    Ich bräuchte ein Lock-Item, dass nach bspw. 2 Minuten "released" (= wieder auf 0 gesetzt) wird.

    problem: wenn mein tor zufährt, zirkuliert der status blinkend zw. 1-0-1-0-1-0-1-... um die Bewegung zu signalisieren bzw das licht blinken zu lassen.
    jetzt möchte ich beim öffnen aber das licht im haus anschalten, wenn der dämmerungswert niedrig genug ist.

    wenn ich also den ersten state change von 1 auf 0 kriege, will ich für n sekunden die logik via sperritem sperren. habe ich nach release des lock einen statechange von 0 auf 1, kann ich relativ sicher sagen tor geht auf und das licht im flur schalten, sofern der dämmerungswert niedrig genug ist.. hätte ich kein lock item, würde sofort nach 1-0-1 das licht wieder angehen, das möchte ich beim verlassen natürlich nicht haben..
    Zuletzt geändert von psilo; 14.11.2016, 19:25.

    #2
    Hi,

    hier mein Pattern für Präsenz, die immer fünf Minuten länger als der Melder Präsenz meldet aktiv ist:
    Code:
            [Praesenz]
                name = Präsenz aktuell
                type = bool
                cache = True
                knx_dpt = 1
                knx_listen = 6/0/20
                [[Fuenf]]
                    name = Präsenz in den letzten 5 Minuten
                    type = num
                    knx_dpt = 1
                    knx_send = 6/0/21
                    knx_reply = 6/0/21
                    value = 2
                    autotimer = 5m = 2
                    eval = sh.Praesenz() if int(value) > 1 else 1
                    eval_trigger = Praesenz
    Das Item "Fuenf" wird getriggert mit der ersten 1 des PM und fällt auf 0, wenn der PM 5 Minuten lang 0 war. Ignoriert also alle 1-0-1 wechsel dazwischen. Solltest Du für Dein Problem adaptieren können.

    Gruß, Waldemar
    OpenKNX www.openknx.de

    Kommentar


      #3
      mumpf cool, vielen dank.. und: ja sieht gut aus

      Kommentar


        #4
        Freut mich, wenn es hilft.

        Gruß, Waldemar
        OpenKNX www.openknx.de

        Kommentar


          #5
          Hi, hast Du noch eine Ahnung, wie ich dem Ding sagen kann, dass es beim INIT noch nicht eval macht?

          Kommentar


            #6
            Zitat von mumpf Beitrag anzeigen
            Code:
            [Praesenz]
            name = Präsenz aktuell
            type = bool
            cache = True
            knx_dpt = 1
            knx_listen = 6/0/20
            [[Fuenf]]
            name = Präsenz in den letzten 5 Minuten
            type = num
            knx_dpt = 1
            knx_send = 6/0/21
            knx_reply = 6/0/21
            value = 2
            autotimer = 5m = 2
            eval = sh.Praesenz() if int(value) > 1 else 1
            eval_trigger = Praesenz
            mir fällt es noch total schwer mich in diesen smarthome eval & trigger & autotimer-foo reinzudenken...

            Code:
            eval = sh.Praesenz() if int(value) > 1 else 1
            eval_trigger = Praesenz
            eval wird getriggered, wenn sich Praesenz aendert?
            die value im trigger bezieht sich aber trotzdem auf den eigenen wert von Fuenf?
            praesenz als bool wird als wert in fuenf uebernommen wenn der fuenf-wert bereits groesser 1 ist?

            ich blicke diese logiken noch gar nicht... magst du das nochmal fuer einen beschraenkten erklaeren, waldemar?

            Kommentar


              #7
              Zitat von psilo Beitrag anzeigen
              Hi, hast Du noch eine Ahnung, wie ich dem Ding sagen kann, dass es beim INIT noch nicht eval macht?
              Ich würde mal versuchen, ob weglassen von value = 2 hilft. Dieses setzt ja den Wert beim Init.

              Kommentar


                #8
                smai nein, der wert 2 wäre super, leider triggert auch der EVAL (beim setzen des wertes denke ich). da mein tor dann zu ist und ich ein '"not" im eval habe, triggert das, und es steht keine 2 mehr im item.. das ist dumm..
                Code:
                        [[[driveway]]]
                            [[[[state]]]]
                                type = bool
                                visu_acl = r
                                knx_dpt = 1
                                knx_cache = 2/5/150
                                cache = yes
                                [[[[[lock]]]]]
                                    type = num
                                    value = 2
                                    autotimer = 1m = 2
                                    eval = not sh.outside.gate.driveway.state() if int(value) > 1 else 1
                                    eval_trigger = outside.gate.driveway.state

                Kommentar


                  #9
                  Der eval triggert meines Wissens immer und bedingungslos.

                  Aber das 2 soll auch auch genau bewirken, dass getriggert wird. Wenn du es einfach weglässt, hat "lock" beim Start keinen Wert (None), was meines Wissens als False interpretiert wird.

                  Den Wert 2 wird das Item gar nie annehmen. Durch das eval kann lock ja nur entweder 1 oder 0 sein. Wird 2 als Wert übergeben, wird der Wert von state übernommen (bzw. der int 0 bei False und 1 bei True).

                  Willst du explizit beim Init auf 0 setzen, wäre folgendes möglich. Damit wird das Item beim Wert 3 aus dem Init-value auf 0 und beim Wert 2 aus dem autotimer auf den Wert von state gesetzt.
                  Code:
                  value = 3
                  autotimer = 1m = 2
                  eval = not sh.outside.gate.driveway.state() if int(value) == 2 else 0 if int(value) == 3 else 1

                  BTW: Statt sh.outside.gate.driveway.state() könnte übrigens auch das relative self.return_parent() verwendet werden.

                  Kommentar


                    #10
                    ich bin irgendwie doch zu dumm..

                    nochmal mein bedarf: ich will ein zeitlich begrenztes lock wenn das tor zu faehrt

                    1) Tor offen:
                    Initial state = 1
                    ich schliesse es: 1 (intial) - 0 - 1 - 0 - 1 - [...] - 1 - 0 (zu)
                    2) Tor zu:
                    initial state = 0
                    ich öffne es: 0 (initial) - 1 (auf) - kein "blinken"

                    Das Eval kann zwar im Übergang 1 - 0 mit dem NOT reagieren, aber es reagiert auch, wenn es zu ist und der timer zuende ist (weil dann der wert auch 0 ist). Ich will das lock aber wirklich nur haben, wenn ich die "schliessen" bewegung - also das blinken - auslöse.
                    Genauso würde der ausdruck ohne das NOT bereits schalten, wenn das Tor offen ist. Alles unabh. von der Torbewegung. mit prev_value bringt vermutlich auch nichts zu arbeiten.. ggf. mit last change.

                    irgendwie habe ich eine denkblockade..
                    Zuletzt geändert von psilo; 16.11.2016, 17:16.

                    Kommentar


                      #11
                      Ich weiss nicht genau, was du mit Lock Item meinst.
                      Das Beispiel von Waldemar bildet ein Item, welches den Status von Praesen wiederspiegelt, aber erst 5 Minuten später ausschaltet (beschreibt er ja auch so).

                      Du hast nun versucht das mit not zu invertieren. Um die Invertierung vollständig zu machen, müsste die 1 am Ende des eval aber ebenfalls zu 0 invertiert werden.

                      Wenn du aber ein Item willst, dass jeweils ab dem Schliessen 1 Minute lang true bleibt, sollte folgendes funktionieren:
                      Code:
                      eval = 0 if int(value) == 2 else 1 if int(value) == 1 else None
                      autotimer = 1m = 2
                      value = 2
                      Initial ist kein Lock gesetzt. Beim Schliessen (also Wechsel von state auf 1) wird der Lock gesetzt und nach 1 Min durch autotimer wieder gelöst. Beim Öffnen geschieht gar nichts (None).

                      Kommentar


                        #12
                        Hi,

                        ich glaube, der letzte Vorschlag von smai sollte funktionieren. Ich verwende statt none immer gerne den Wert des Items selbst, da bei None immer Warnings ins Log geschrieben werden.

                        Und zu

                        Zitat von hotzen Beitrag anzeigen
                        ich blicke diese logiken noch gar nicht... magst du das nochmal fuer einen beschraenkten erklaeren, waldemar?
                        Ich erkläre das gerne, will aber damit nicht sagen, dass ich Dich für beschränkt halte

                        Was man wissen muss (hab ich alles durch ausprobieren rausgefunden):
                        • eval wird immer ausgeführt, wenn das Item einen Wert gesetzt bekommt, egal durch welche Quelle (KNX, cycle, eval_trigger, Logiken, Plugins etc.)
                        • Das Item hat noch den alten Wert, der neue Wert steht in der Variable value
                        • value ist immer vom Typ des callers, also desjenigen, der die Wertänderung anstößt (ein Bool-Item kann sehr wohl im eval auf value == "test" prüfen, weil es weiß, dass es von einem string-Item getriggert wird)
                        • Init triggert auch ein Item und damit ein eval, zumindest wenn das Item über das attribut value (nicht zu verwechseln mit value im eval) vorbelegt werden soll.
                        Mein Item "Fuenf" wird von Init, Praesenz und autotimer getriggert:
                        • Beim Init wird das eval mit value = 2 aufgerufen, was dazu führt, dass Fuenf den Wert von Praesenz annimmt, das wiederum je nach cache 0 oder 1 sein kann (Bool und Int sind zuweisungskompatibel, False = 0 und True = 1). Gleichzeitig läuft der autotimer an.
                        • Bisher war es einfach, ab jetzt wird es kompliziert, wir gehen alle möglichen Fälle durch:
                          1. Fuenf = 0, autotimer läuft, Präsenz 0->1 (meint: geht von 0 auf 1)
                            eval wird mit value=1 aufgerufen, geht in den else-Fall und Fuenf geht auf 1, autotimer läuft neu an (nachtriggern)
                          2. Fuenf = 0, autotimer läuft nicht, Präsenz 0->1
                            eval wird mit value=1 aufgerufen, geht in den else-Fall und Fuenf geht auf 1, autotimer läuft an
                          3. Fuenf = 1, autotimer läuft, Präsenz 1->0
                            eval wird mit value=0 aufgerufen, geht in den else-Fall und Fuenf bleibt 1, autotimer läuft weiter
                          4. Fuenf = 1, autotimer läuft, Präsenz 0->1
                            eval wird mit value=1 aufgerufen, geht in den else-Fall und Fuenf bleibt 1, autotimer läuft weiter
                          5. Fuenf = 1, autotimer läuft ab, Präsenz = 1
                            eval wird mit value=2 aufgerufen, liefert den Wert von Präsenz (1) und Fuenf bleibt 1, autotimer bleibt aus
                          6. Fuenf = 1, autotimer läuft nicht, Präsenz 1->0
                            eval wird mit value=0 aufgerufen, geht in den else-Fall und Fuenf bleibt 1, autotimer bleibt aus !!!FALSCH!!!
                          7. Fuenf = 1, autotimer läuft ab, Präsenz = 0
                            eval wird mit value=2 aufgerufen, liefert den Wert von Präsenz (0) und Fuenf geht auf 0, autotimer läuft an
                          8. Fuenf = 0, autotimer läuft ab, Präsenz = 0
                            eval wird mit value=2 aufgerufen, liefert den Wert von Präsenz (0) und Fuenf bleibt auf 0, autotimer bleibt aus
                        Mit diesen Fällen kann man jetzt alle erdenklichen Situationen durchspielen:
                        2 -> 3 -> 7 -> 8
                        oder
                        2 -> 3 -> 4 -> 3 -> 4 -> 3 -> 7 -> 8
                        oder
                        2 -> 5 -> 6 !!! Hier habe ich während der Erklärung einen Denkfehler gefunden !!! Dies ist ein Fall, bei dem Fuenf nicht mehr nach 5 Minuten zurückgesetzt wird. Muss ich mir noch was einfallen lassen Ist der Fall, bei dem man mehr als 5 Minuten lang "Präsenz = True" hat, ohne dazwischen mal auf False zu gehen. Passiert wohl bei uns nicht so oft, denn in der Praxis hatte ich den Fall noch nie!

                        Ich hoffe, das reicht als Erklärung, auch wenn noch ein Bug drin ist.
                        Gruß, Waldemar







                        OpenKNX www.openknx.de

                        Kommentar


                          #13
                          smai nur zur erklärung was ich meine: ich brauche ein item, was während das Tor sich schliesst eine logik nicht mehr ausführen lässt (=sperrt). ich möchte nur beim öffnen des tores das licht im flur schalten, ein "schliessen" enthält aber die gleichen signale wie ein öffnen (0-1). ich will ja nicht das haus verlassen und das licht hinter mir anschalten. daher sollte bei einem übergang von 1-0 (schliessen) das lock setzen, so dass der folgende 0 - 1er Übergang so lange ignoriert wird, bis das tor zu ist.. das stoppe ich per uhr und setze den timer mit entsprechendem puffer

                          ich teste das jetzt mal schnell bevor ich ins büro fahre
                          Zuletzt geändert von psilo; 17.11.2016, 05:48.

                          Kommentar


                            #14
                            smai also klappt auch nicht, da beim öffnen ja auch ein wechsel von 0 auf 1 ist.. auf jdn fall ist das lock gerade beim öffnen auf 1 gesprungen. hilft also leider so immer noch nicht :-(

                            Kommentar


                              #15
                              psilo Du hattest nie erwähnt, welche Polarität state hat. Ist dies 1 bei geschlossen oder 1 bei offen?
                              Aus deinem Versuch oben hatte ich gefolgert, dass es 1 bei offen ist. Falls umgekehrt, gilt folgendes:
                              Code:
                              eval = 0 if int(value) == 2 else 1 if int(value) == [B][COLOR=#FF0000]0[/COLOR][/B] else None
                              So wird der Lock beim Wechsel von 1 auf 0 gesetzt, nicht aber bei 0 auf 1.

                              mumpf das mit dem None stimmt schon. Der Nachteil vom Eigenwert setzen ist halt, dass zumindest bei gesetztem enforce_updates dann was gesendet wird.
                              Da dies hier nicht der Fall ist, könnte man also auch schreiben:
                              Code:
                              eval = 0 if int(value) == 2 else 1 if int(value) == 0 else self()

                              Kommentar

                              Lädt...
                              X