Ankündigung

Einklappen
Keine Ankündigung bisher.

- √ - logic/item Verständnisfrage

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

    [Codebeispiel] - √ - logic/item Verständnisfrage

    Ob es nun eine Frage der logic oder des items ist weiß ich nicht. Jedenfalls weise ich hier noch ein großes smarthome.py/Python Defizit auf:

    Wenn einer der 5 iButtons im Haus ist möchte ich Aktion xyz durchführen. Momentan hängt nur ein Schlüssel ...

    logic.conf
    Code:
    [praesenz]
       filename = praesenz.py
       crontab = init | * * * *
    item.conf
    Code:
    [ow]
        [[ibutton]]
            name = Praesenz
            type = bool
            #knx_send = 0/7/0
            #knx_reply = 0/7/0   
           
            [[[blau]]]
                name = Blau
                type = bool
                ow_addr = 01.XX55B0150000
                ow_sensor = B 
                #knx_send = 0/7/3
                #knx_reply = 0/7/3
            
            [[[juliane]]]
                name = Juliane
                type = bool
                ow_addr = 01.XX8A5B130000
                ow_sensor = B
                #knx_send = 0/7/2
                #knx_reply = 0/7/2
                
            [[[gelb]]]
                name = Gelb
                type = bool
                ow_addr = 01.XXF8B0150000
                ow_sensor = B
                #knx_send = 0/7/5
                #knx_reply = 0/7/5
            
            [[[mirko]]]
                name = Mirko
                type = bool
                ow_addr = 01.XXB8B0150000
                ow_sensor = B
                #knx_send = 0/7/1
                #knx_reply = 0/7/1
            
            [[[rot]]]
                name = Rot
                type = bool
                ow_addr = 01.XX5F58150000
                ow_sensor = B
                #knx_send = 0/7/4
                #knx_reply = 0/7/4
    praesenz.py
    Code:
    #!/usr/bin/env python
    # Schaltet die globale Praesenz 0/7/0 wenn ein iButton (0/7/1,2,3,4,5) angemeldet ist.
    # Ausschaltverzoegerung 5 Minuten
    logger.info('LOGIC------TEST RUN')
    
    self.ibuttons = sh.find_children(sh.ow.ibutton, 'ow_addr')
    for self.ibutton in self.ibuttons:
        if self.ibutton() == True:
            logger.info('LOGIC------TEST ANWESEND: {0}'.format(self.ibutton))
        else:
            logger.info('LOGIC------TEST ANWESEND: {0}'.format(self.ibutton))
    log
    Code:
    2013-06-09 00:04:00,204 praesenz     INFO     LOGIC------TEST RUN -- praesenz.py:<module>:8
    2013-06-09 00:04:00,212 praesenz     INFO     LOGIC------TEST ANWESEND: Blau -- praesenz.py:<module>:15
    2013-06-09 00:04:00,221 praesenz     INFO     LOGIC------TEST ANWESEND: Juliane -- praesenz.py:<module>:15
    2013-06-09 00:04:00,237 praesenz     INFO     LOGIC------TEST ANWESEND: Gelb -- praesenz.py:<module>:15
    2013-06-09 00:04:00,242 praesenz     INFO     LOGIC------TEST ANWESEND: Mirko -- praesenz.py:<module>:13
    2013-06-09 00:04:00,254 praesenz     INFO     LOGIC------TEST ANWESEND: Rot -- praesenz.py:<module>:15
    Umgezogen? Ja! ... Fertig? Nein!
    Baustelle 2.0 !

    #2
    logic/item Verständnisfrage

    Keine Ahnung, ob das der Fehler ist, aber mach mal die ganzen "self." weg. Das brauchst du nur bei Instanzvariablen... da du die Liste der Sensoren aber eh jedes mal neu holst musst du sie nicht in der Instanz ablegen.
    Mit freundlichen Grüßen
    Niko Will

    Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
    - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

    Kommentar


      #3
      Hallo Mirko,

      welche Frage hast Du denn?

      Ich sehe ein paar Dinge die man optimieren kann:

      Zitat von JuMi2006 Beitrag anzeigen
      logic.conf
      Code:
      [praesenz]
         filename = praesenz.py
         crontab = init | * * * *
      Code:
      [praesenz]
         filename = praesenz.py
         watch_item = ow.ibutton.*
      Was wolltest Du denn mit '* * * *' erreichen? Das es jede Minute ausgeführt wird?
      Da empfände ich ein cycle = 60 einfacher nachvollziehbar.

      Bei den Buttons fehlt noch ein (auskommentiert) knx_dpt = 1.

      Zitat von JuMi2006 Beitrag anzeigen
      praesenz.py
      Code:
      #!/usr/bin/env python
      # Schaltet die globale Praesenz 0/7/0 wenn ein iButton (0/7/1,2,3,4,5) angemeldet ist.
      # Ausschaltverzoegerung 5 Minuten
      logger.info('LOGIC------TEST RUN')
      
      self.ibuttons = sh.find_children(sh.ow.ibutton, 'ow_addr')
      for self.ibutton in self.ibuttons:
          if self.ibutton() == True:
              logger.info('LOGIC------TEST ANWESEND: {0}'.format(self.ibutton))
          else:
              logger.info('LOGIC------TEST [COLOR="Red"]AN[/COLOR]WESEND: {0}'.format(self.ibutton))

      Code:
      #!/usr/bin/env python
      # Schaltet die globale Praesenz 0/7/0 wenn ein iButton (0/7/1,2,3,4,5) angemeldet ist.
      # Ausschaltverzoegerung 5 Minuten
      logger.info('LOGIC------TEST RUN')
      
      for ibutton in sh.ow.ibutton:
          if ibutton():
              logger.info('LOGIC------TEST ANWESEND: {0}'.format(ibutton))
          else:
              logger.info('LOGIC------TEST [COLOR="Red"]AB[/COLOR]WESEND: {0}'.format(ibutton))
      [/QUOTE]

      und ja, das self sollte hier auf jeden Fall nicht verwendet werden! Das ist nur für die Programmierung bei Klassen notwendig.

      Alternativ zu der Logic, könnt man diese einfach Abhängigkeit auch in der items.conf realisieren:

      Code:
      [ow]
          [[ibutton]]
              type = bool
              eval = or
              eval_trigger = ow.ibutton.*
      Und ich würde für die Ausschaltverzoegerung bzw. für den Haus-Status ein separates Item/Logik verwenden.

      Pseudecode:
      Code:
      if sh.ow.ibutton.last_change() <= vor 5 Minuten:
        sh.haus.bewohnt(sh.ow.ibutton())  # setzt den Haus Status bewohnt mit dem iButton Status
      else:
        logic.trigger(dt=in 5 Minuten)  # ruf diese Logik in 5 Minuten noch einmal auf
      Bis bald

      Marcus

      Kommentar


        #4
        Zitat von mknx Beitrag anzeigen
        Hallo Mirko,
        welche Frage hast Du denn?
        Hallo Niko und Marcus,

        sorry ... es war wohl doch zu spät gestern ... natürlich fehlt die eigentliche Frage, aber ihr habt schon gut kombiniert .

        Ich möchte eine Ausschaltverzögerung von 5 Minuten erreichen sobald eben kein iButton mehr am Schlüsselbrett hängt.


        Zitat von mknx Beitrag anzeigen
        Code:
        [praesenz]
           filename = praesenz.py
           watch_item = ow.ibutton.*
        Was wolltest Du denn mit '* * * *' erreichen? Das es jede Minute ausgeführt wird?
        Da empfände ich ein cycle = 60 einfacher nachvollziehbar.

        Bei den Buttons fehlt noch ein (auskommentiert) knx_dpt = 1.
        Das mit dem auskommentierten knx_dpt ist natürlich richtig, da das ganze noch nicht produktiv läuft erstmal unproblematisch.
        watch_item und cycle sind natürlich auch sehr elegant...finde ich bestimmt Verwendung für.

        Zitat von mknx Beitrag anzeigen

        Code:
        n sh.ow.ibutton:
            if ibutton():
                logger.info('LOGIC------TEST ANWESEND: {0}'.format(ibutton))
            else:
                logger.info('LOGIC------TEST [COLOR="Red"]AB[/COLOR]WESEND: {0}'.format(ibutton))
        und ja, das self sollte hier auf jeden Fall nicht verwendet werden! Das ist nur für die Programmierung bei Klassen notwendig.
        Toller c&p Fehler ... schieb ich jetzt mal auf die Uhrzeit. Danach stimmt jetzt auch das log - sorry.
        Das mit den Instanzen ist noch ein grober Knoten im Hirn, für ein PythonBuch fehlt derzeit aber die Zeit.

        Zitat von mknx Beitrag anzeigen
        Alternativ zu der Logic, könnt man diese einfach Abhängigkeit auch in der items.conf realisieren:

        Code:
        [ow]
            [[ibutton]]
                type = bool
                eval = or
                eval_trigger = ow.ibutton.*
        Und ich würde für die Ausschaltverzoegerung bzw. für den Haus-Status ein separates Item/Logik verwenden.

        Pseudecode:
        Code:
        if sh.ow.ibutton.last_change() <= vor 5 Minuten:
          sh.haus.bewohnt(sh.ow.ibutton())  # setzt den Haus Status bewohnt mit dem iButton Status
        else:
          logic.trigger(dt=in 5 Minuten)  # ruf diese Logik in 5 Minuten noch einmal auf
        Der Übersichtlichkeit halber finde ich es schöner die Logik möglichst an einer Stelle zu definieren. Vielleicht ist hier auch einfach ein stärkeres Umdenken meinerseits zu den WireGate-Plugins nötig.
        Damit hast Du ja eine einsatzfähige Möglichkeit aufgezeigt und ein paar Kniffe schaue ich mir für spätere Logiken garantiert ab.

        Jetzt bleiben doch noch ein paar Fragen/Ansatzpunkte:

        - ich würde ungern noch ein item haus.bewohnt einführen wollen sondern gleich auf ow.ibutton gehen
        - so wie ich Deine Logik jetzt interpretiere würde aber auch bei einem ow.ibutton = True die Verzögerung greifen? Kann man aber sicherlich mit einigen if/else filtern
        - kann ich in einer logic persistente (bis zum Neustart) Variablen definieren oder geht das nur über items (ist ja eigentlich nichts anderes)
        - haus.bewohnt müsste ich dann irgendeiner item.conf vorher definieren ?

        Danke und Grüße
        Mirko


        EDIT:
        Wie greife ich auf sh.now und dt zu ... hier steh ich jetzt völlig auf dem Schlauch
        Code:
        if sh.ow.ibutton.last_change() <= [B]????[/B]: #Letzte Statusaenderung vor 5 Minuten
            sh.ow.praesenz(sh.ow.ibutton())  # setzt den Haus Status bewohnt mit dem iButton Status
            logger.info('LOGIC------TEST ABWESEND')
        else:
            logic.trigger(dt=[B]300 ???[/B])  # ruf diese Logik in 5 Minuten noch einmal auf
            logger.info('LOGIC------TEST RECALL 300')
        Das dieses Codefragment allein nicht genügt ist klar, mir gehts hier im wesentlichen um das handling von/mit dt und sh.now.
        Umgezogen? Ja! ... Fertig? Nein!
        Baustelle 2.0 !

        Kommentar


          #5
          Hallo Mirko,

          probier mal:
          Code:
          vor5m = sh.now() - dateutil.relativedelta.relativedelta(seconds=300)
          in5m = sh.now() + dateutil.relativedelta.relativedelta(seconds=301)
          ich würde ungern noch ein item haus.bewohnt einführen wollen sondern gleich auf ow.ibutton gehen"
          dann musst Du das knx_send aber in der Logik machen und nicht in dem Item, sonst wird es sofort geschickt.

          so wie ich Deine Logik jetzt interpretiere würde aber auch bei einem ow.ibutton = True die Verzögerung greifen? Kann man aber sicherlich mit einigen if/else filtern
          Beides korrekt.

          kann ich in einer logic persistente (bis zum Neustart) Variablen definieren oder geht das nur über items (ist ja eigentlich nichts anderes)
          Geht nur über Items (mit cache = yes)

          haus.bewohnt müsste ich dann irgendeiner item.conf vorher definieren ?
          yepp.

          Bis bald

          Marcus

          Kommentar


            #6
            Das sollte so jetzt funktionieren, wobei ich mit dem "Zustand" von ow.praesenz beim Neustart von smarthome.py noch nicht ganz glücklich bin.
            Eigentlich muss nur verhindert werden dass im Falle von Anwesenheit ein ow.praesenz=False über den Bus rauscht. Sollte aber so der Fall sein sofern man dann mal die hashes vor den knx-Attributen entfernt ?

            Code:
            #items/onewire.conf
            [ow]    
                [[praesenz]]
                    name = global_praesenz
                    type = bool
                    value = True
                
                [[ibutton]]
                    name = ibutton
                    type = bool
                    eval = or
                    eval_trigger = ow.ibutton.*
                    enforce_updates = True
                    #knx_send = 0/7/0
                    #knx_reply = 0/7/0
                    #knx_dpt = 1
                   
                    [[[blau]]]
                        name = Blau
                        type = bool
                        ow_addr = 01.XX55B0150000
                        ow_sensor = B 
                        #knx_send = 0/7/3
                        #knx_reply = 0/7/3
                        #knx_dpt = 1
                    
                    [[[juliane]]]
                        name = Juliane
                        type = bool
                        ow_addr = 01.XX8A5B130000
                        ow_sensor = B
                        #knx_send = 0/7/2
                        #knx_reply = 0/7/2
                        #knx_dpt = 1
                        
                    [[[gelb]]]
                        name = Gelb
                        type = bool
                        ow_addr = 01.XXF8B0150000
                        ow_sensor = B
                        #knx_send = 0/7/5
                        #knx_reply = 0/7/5
                        #knx_dpt = 1
                    
                    [[[mirko]]]
                        name = Mirko
                        type = bool
                        ow_addr = 01.XXB8B0150000
                        ow_sensor = B
                        #knx_send = 0/7/1
                        #knx_reply = 0/7/1
                        #knx_dpt = 1
                    
                    [[[rot]]]
                        name = Rot
                        type = bool
                        ow_addr = 01.XX5F58150000
                        ow_sensor = B
                        #knx_send = 0/7/4
                        #knx_reply = 0/7/4
                        #knx_dpt = 1
            Code:
            #logic.conf
               
            [praesenz]
               filename = praesenz.py
               watch_item = ow.ibutton
            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
                logger.info('LOGIC------TEST ABWESEND')
                sh.ow.praesenz(sh.ow.ibutton()) 
            
            #Letzte Statusaenderung auf FALSE vor weniger als 5 Minuten
            else:
                if sh.ow.ibutton() == False:
                    # ruf diese Logik in 5 Minuten noch einmal auf
                    logger.info('LOGIC------TEST RECALL LOGIC')
                    logic.trigger(dt=sh.now() + datetime.timedelta(seconds=300))  
            
            #Letzte Statusaenderung auf TRUE    
            if sh.ow.ibutton() == True:
                #setzt den Stauts Praesenz (ow.praesenz) gleich mit dem iButton Status (ow.ibutton) -> TRUE / Anwesend
                logger.info('LOGIC------TEST ANWESEND')
                sh.ow.praesenz(sh.ow.ibutton())
            Grüße

            P.S.:
            Fragen/Featurewünsche - Beispiel wäre das item ow.praesenz.

            ow.praesenz.prev_change() zeigt mir die Länge des vorherigen Zustandes eines items an, richtig?

            Kann man nicht noch ein ow.praesenz.age() bauen dass mir das Alter des Zustandes gibt? Das macht das Leben in Plugins deutlich einfacher.

            ow.praesenz(1) setzt das item auf 1, wäre ein ow.praesenz(1,delay=300) auch denkbar ?
            Umgezogen? Ja! ... Fertig? Nein!
            Baustelle 2.0 !

            Kommentar


              #7
              Hallo Mirko,

              dann setze doch bei ow.presence das Attribute cache = yes, und dort sollten auch die #knx_* stehen, sonst wird die Änderung sofort über den Bus geschickt.

              Das ow.ibutton braucht kein enforce_updates.


              ow.praesenz.prev_change() zeigt mir die Länge des vorherigen Zustandes eines items an, richtig?
              ja, in Sekunden.

              item.age() gibt es jetzt in github.

              ow.praesenz(1) setzt das item auf 1, wäre ein ow.praesenz(1,delay=300) auch denkbar ?
              denkbar ja, ist aber in Deinem Fall aber wahrscheinlich nicht sinnvoll, da Du ja explizit checken musst ob es sich nicht geändert hat.

              Bis bald

              Marcus

              Kommentar


                #8
                Zitat von mknx Beitrag anzeigen
                dann setze doch bei ow.presence das Attribute cache = yes, und dort sollten auch die #knx_* stehen, sonst wird die Änderung sofort über den Bus geschickt.

                Das ow.ibutton braucht kein enforce_updates.
                Das mit dem cache ist ne super Möglichkeit ... man staunt immer was man hier für Möglichkeiten hat. Das mit den knx-Attributen ist beim jetzigen Lesen natürlich auch klar...Altlast.

                Zitat von mknx Beitrag anzeigen
                item.age() gibt es jetzt in github.
                Super!

                Zitat von mknx Beitrag anzeigen
                denkbar ja, ist aber in Deinem Fall aber wahrscheinlich nicht sinnvoll, da Du ja explizit checken musst ob es sich nicht geändert hat.
                Man müsste es so einbauen dass ein erneutes Ändern des items den "delay-Auftrag" löscht -> Luxusprobleme.

                Besten Dank! Damit ist mein erstes (und wichtigstes) WireGate-Plugin umgezogen...noch nicht produktiv, aber zumindest theoretisch. Damit lässt sich ohne vollkommenen WAF-Verlust experimentieren.

                Grüße
                Umgezogen? Ja! ... Fertig? Nein!
                Baustelle 2.0 !

                Kommentar


                  #9
                  Ich muss nochmal nachhaken.

                  Warum funktioniert das:
                  Code:
                  if sh.ow.praesenz():
                  und das nicht:
                  Code:
                  if sh.ow.praesenz() == 'True':
                  während mir hiermit:
                  Code:
                  logger.info('praesenz? : {0}'.format(sh.ow.praesenz()))
                  Code:
                  INFO     praesenz? : True -- zirkulation.py:<module>:11
                  ins Log geschrieben wird ???
                  Umgezogen? Ja! ... Fertig? Nein!
                  Baustelle 2.0 !

                  Kommentar


                    #10
                    Das ist ein String!

                    'True' != True

                    Kommentar


                      #11
                      Tja, da hätt ich auch selbst drauf kommen können. Danke!
                      Umgezogen? Ja! ... Fertig? Nein!
                      Baustelle 2.0 !

                      Kommentar

                      Lädt...
                      X