Ankündigung

Einklappen
Keine Ankündigung bisher.

Zeitschleife in Logik

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

    Zeitschleife in Logik

    Hallo, ich suche folgende Funktionen:

    a) eine Logik soll mit einem Item angestoßen werden (Watch_Item) allerdings soll das Item eine Zeit "X" auf einem Wert sein, bevor die Logik läuft

    b) innerhalb einer Logik soll eine Wenn dann Bedingung erst dann zu einem "Wenn" führen, wenn ein bestimmtes Item eine Zeit "X" einen bestimmten wert hat.

    könnt ihr mit mit dem Syntax helfen?

    Danke!
    Gruß Marian

    #2
    item.age() ist vermutlich, was Du suchst (Angabe in Sekunden):
    if sh.item.subitem.age() > 30:
    Für Frage a) müsste man den gewünschten item-Wert wohl noch mit UND verbinden:
    if sh.item.subitem() and sh.item.subitem.age() > 30:

    Kommentar


      #3
      So direkt geht das m.W. nach nicht, daher verwende ich ein Hilfsitem, welches via .timer(x,y) aktiviert wird.
      Wenn die Zeit abgelaufen ist kommt es zu einem Trigger der dann prüft.

      Kommentar


        #4
        Zitat von Sandman60 Beitrag anzeigen
        So direkt geht das m.W. nach nicht, daher verwende ich ein Hilfsitem, welches via .timer(x,y) aktiviert wird.
        Wenn die Zeit abgelaufen ist kommt es zu einem Trigger der dann prüft.
        Hmmm, sollte gemäß Marcus eigentlich laufen - siehe seine Antwort in diesem Fred (die mit dem epischen Satz "sleep ist böse" ).

        Kommentar


          #5
          Hi Tom,

          ja, thx, den Thread kenne ich und das wird auch so beschrieben funktionieren, allerdings habe ich Fragestellung des TE anders verstanden.

          Mir ist nicht ganz klar wie der Trigger bei Verwendung von .age() klappen soll, daher habe ich das bei mir über den Timer gebaut.

          Bspw. grob skizziert: Fenster wird geöffnet > Löst Timer-Triggerlogik aus > Timertriggerlogik geht auf 0 > Löst Heizungsabsenkungslogik aus. Special: Wenn das Fenster innerhalb der Karenzzeit geschlossen wird setzt die Timer-Triggerlogik die Timerzeit hart auf 0 und alles ist gut. Oder: Während einem gesetztem Timer wird die Triggerautomatik abgeschalten, dann löst das Abschalten des Items auch einen harten Timer=0 aus.

          Wenn ich bspw. mit age() hier arbeite ist mir nicht klar wie ich die Logik triggere und v.a. wie ich eine getriggerte Zeitlogik ausschalte.

          Daher war mein Hinweis weniger auf Deinen Post gemünzt als auf den des TE. 1000 Wege führen nach Rom

          Cheers,
          Oliver

          Kommentar


            #6
            Hi Oliver,

            hmmm, hatte eigentlich folgende Ansatz im Hinterkopf:
            • cycle=xx Sekunden in der logic.conf
            • enforce_updates=true in der items.conf

            Einen bereits erfolgten Schaltvorgang muß ich mir natürlich merken, z.B. über eine Hilfsvariable/ein Hilfsitem. Oder eben das zu schaltende Item direct abfragen, wie sein aktueller Status ist - das spart evtl. die Hilfsvariable.

            Ist aber eher geraten als gewußt - steht mir erst noch für meine KWL-Schaltung bevor (wenn aus --> schalte ein und warte 30s, bis die Lüftungsstufe eingestellt wird, damit alles in Ruhe anlaufen kann).

            Wie Du schon sagst: Viele Wege führen nach Rom ...

            /tom

            Kommentar


              #7
              Hi Tom,

              ja, stimmt, mit cycle könnte es laufen. Hatte ich mich dagegen entschieden, irgendwie mag ich keine Cycles, oder nur im Notfall.

              Wie gesagt, habe das bei mir nun inzwischen mit dem .timer zuverlässig am Laufen. Da laufen im Hintergrund inzwischen knapp 70 Timer individuell und alles 1A stable. Bin immer wieder begeistert was da so alles auf dem kleinen PI alles läuft.
              Als nächstes werden noch so rund 300 Timer mitzukommen sobald ich meine Emailreminder am Laufen habe. Klar, da läuft nicht alles parallel, aber aktuell dürften schon immer rund 50 Timer parallel im Hintergrund ticken.

              Cheers,
              Oliver

              Kommentar


                #8
                Ich hab das ganze auch noch ganz old-school mit cycle am laufen ... macht seit 1.5 Jahren seinen Dienst:

                logic.conf
                Code:
                [praesenz]
                   filename = praesenz.py
                   watch_item = ow.ibutton
                   cycle = 3600
                praesenz.py
                Code:
                #/logics/praesenz.py
                #!/usr/bin/env python
                # Schaltet die globale Praesenz 0/7/0 wenn ein iButton (0/7/1,2,3,4,5) angemeldet ist.
                
                #Letzte Statusaenderung auf FALSE vor mehr als 4 Minuten
                if sh.ow.ibutton.last_change() <= sh.now() - datetime.timedelta(seconds=240) and sh.ow.ibutton() == False:
                    #setzt den Stauts Praesenz (ow.praesenz) gleich mit dem iButton Status (ow.ibutton) -> FALSE / Abwesend
                    sh.ow.praesenz(sh.ow.ibutton())
                    logger.info('Alle iButtons abgemeldet')
                
                #Letzte Statusaenderung auf FALSE vor weniger als 5 Minuten
                else:
                    if sh.ow.ibutton() == False:
                        # ruf diese Logik in 5 Minuten noch einmal auf
                        logic.trigger(dt=sh.now() + datetime.timedelta(seconds=300))
                        logger.info('Recall')
                
                #Letzte Statusaenderung auf TRUE    
                if sh.ow.ibutton() == True:
                    #setzt den Stauts Praesenz (ow.praesenz) gleich mit dem iButton Status (ow.ibutton) -> TRUE / Anwesend
                    sh.ow.praesenz(sh.ow.ibutton())
                    logger.info('Ein iButton angemeldet')
                Umgezogen? Ja! ... Fertig? Nein!
                Baustelle 2.0 !

                Kommentar


                  #9
                  Zunächst einmal vielen Dank für die Ganzen Vorschläge.
                  Aber rein Programmiertechnische mag ich das irgendwie nicht mit den Hilfsitems... Ich würde nur ungerne für jede Variable ein Item anlagen.
                  Lieber arbeite ich mit Variablen im Logik-Code..

                  Momentan habe ich das über das "böse" Time.sleep(..) gelöst....

                  Die Funktion sh.item.age() geht ja nur bei Items und ist nicht als python befehl da oder?

                  Also um es genauer zu machen:
                  Code:
                  if bedigung ==('1):
                     time.sleep(5)  
                     Variable = '1'
                  Erreichen möchte ich, wenn die Bedingung 5sec lang "1" hat, dann soll er loslegen. Am besten ohne "Hilfsitem" sonden als Code in der Logik.

                  Gruß Marian

                  Kommentar


                    #10
                    Zitat von marian Beitrag anzeigen
                    Erreichen möchte ich, wenn die Bedingung 5sec lang "1" hat, dann soll er loslegen.
                    Die Gurus mögen das anders sehen - aber 5 Sekunden halte ich bei "Sleep" für unkritisch. Es geht ja darum, mit sleep nicht das System mit schlafenden Threads zuzumüllen, so dass dann irgenwann keine neuen mehr erstellt werden können. Aber wieviele neue Threads sollen denn in 5 Sekunden schon entstehen ...

                    Ansonsten wie geschrieben - wenn kein Hilfsitem gewünscht, dann frage halt age() beim Hauptitem ab, das die Schaltung ausgelöst hat - hängt halt vom konkreten Anwendungsfall ab ...

                    /tom

                    Kommentar


                      #11
                      Full ack Tom!

                      Die Frage ist wieviele Sleeps und wie lange, denn die Anzahl der Workers-Threads sind limitiert.

                      Ja, das Arbeiten mit Hilfsitems ist gewöhnungsbedürftig und ja, ich versuche auch alles in eine Logik zu packen und nicht in zwei, andererseits versuche ich bspw. umgekehrt möglichst wenig spezielle Logiken zu bauen sondern stattdessen eher soviel allgemeine Logiken wie möglich zu verwenden. Bspw. brauche ich bei 15 Räumen mit Fenstern nicht 15-Solltemp.-Absenkungslogiken, sondern eben nur eine welche dann in der Items-Hierarchie rauf und runterspringt (Stichwort Triggeritem). Ich habe da ehrlich gesagt keine Ahnung wie sich das verhält wenn die Logik noch schläft und bspw. ein weiteres Fenster die Logik dann aufruft. Bei 5 Sekunden sicherlich unwahrscheinlich, aber konsistent?

                      Ich nehme mal ein extremeres Beispiel: KNX-Geräteüberwachung. Dort überwache ich mit einem meist 10 Minuten Fenster ob sich ein KNX-Gerät bspw. innerhalb des Fensters gemeldet hat oder nicht. Wenn ich da mit dem Sleep von 10 Minuten arbeite und dann knapp 60 Geräte überwache ist's halt Essig mit Sleep.

                      Just my 5 cents, aber wie immer: 1000 Wege führen nach Rom.

                      Cheers,
                      Oliver

                      Kommentar


                        #12
                        Klingt alles logisch :-) denke bleibe bei sleep...
                        da ich aber das sleep unterbrechen möchte, ist es am Ende dann nur 1sec lang in einer While oder If schleife...

                        In so fern glaub ich nicht, das es hier problematisch wird :-)

                        nochmals Danke für die Unterstützung!


                        Gruß Marian

                        Kommentar

                        Lädt...
                        X