Ankündigung

Einklappen
Keine Ankündigung bisher.

match_items: Filter für Attribute nachrüsten / watch_item: in Item-List umwandeln

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

    [Featurewunsch] match_items: Filter für Attribute nachrüsten / watch_item: in Item-List umwandeln

    Hi!

    In den "watch_item" für die Logiken geht ja nun dankenswerterweise ein Filter "blaitem:attribut", um nur bestimmte Item zu abonnieren.

    Leider musste ich gerade sehen, dass dies scheinbar nicht in match_items nachgerüstet wurde, sondern als Sonderlocke in logic.py:

    PHP-Code:
                    for entry in logic.watch_item:
                        
    itemexprsepattribute entry.partition(':')
                        
    itemexpr itemexpr.strip()
                        if 
    attribute != '':
                            
    attribute attribute.strip()
                        else:
                            
    attribute False
                        
    for item in self._sh.match_items(itemexpr):
                            if 
    attribute:
                                if 
    attribute in item.conf:
                                    
    item.add_logic_trigger(logic)
                            else:
                                
    item.add_logic_trigger(logic
    Imho könnte doch der Code quasi copy&paste direkt in match_items, so dass man das auch kompakt in Logiken selber abfeiern kann.

    Und wo ich schon am Nerven bin:

    Könnte man dann nicht "watch_item" nach dem Start in eine Item-Liste wandeln? Weil sonst muss eine Logik, um eine Liste ihrer Trigger zu erhalten, erst das oben stehende Feuerwerk (oder eben zumindest match_items(hier-sogar-iterieren-weil-watch_item-eine-Liste-ist!)) abfahren.

    Also kurz:

    - sh.match_items kann direkt ':attribut'
    - logic.watch_item nach Start keine Str-Liste sondern Item-Liste

    Denke das haut nix kaputt und macht Logiken erheblich effizienter.

    Danke & Grüße
    Robert
    HM-KNX - KNX-Interface für Hörmann Garagentorantriebe: http://www.ing-budde.de

    #2
    Patch der obiges ändert und (evtl.) noch bei den eval_trigger die "relativen Pfade" einbaut (das kriegt man leider ohne weiteres nicht in match_items integriert, da dem der absolute Pfad des Aufrufenden unbekannt ist)

    PHP-Code:
    diff --git a/bin/smarthome.py b/bin/smarthome.py
    index 3b890ff
    ..be2d5c2 100755
    --- a/bin/smarthome.py
    +++ b/bin/smarthome.py
    @@ -412,+412,14 @@ class SmartHome():
                 yield 
    self.__item_dict[item]

         
    def match_items(selfregex):
    +        
    matches = []
    +        
    regexsepattribute regex.partition(':')
             
    regex regex.replace('.''\.').replace('*''.*') + '$'
             
    regex re.compile(regex)
    -        return [
    self.__item_dict[item] for item in self.__items if regex.match(item)]
    +        
    attribute attribute.strip()
    +        for 
    item in self.__items:
    +            if 
    regex.match(item) and ((attribute == '') or (attribute in self.__item_dict[item].conf)):
    +                yield 
    self.__item_dict[item]

         
    def find_items(selfconf):
             for 
    item in self.__items:
    diff --git a/lib/item.py b/lib/item.py
    index ddb3b28
    ..e7068d6 100755
    --- a/lib/item.py
    +++ b/lib/item.py
    @@ -161,+161,@@ class Item():
             if 
    'eval_trigger' in self.conf:
                 
    triggers = []
                 for 
    trigger in self.conf['eval_trigger']:
    +                if 
    trigger.startswith('-'):
    +                    
    split trigger.split('.',1)
    +                    
    trigger str(self).rsplit('.',split[0].count('-'))[0] + '.' split[1]
                     
    triggers += self._sh.match_items(trigger)
                 for 
    item in triggers:
                     if 
    item != self:  # prevent loop
    diff --git a/lib/logic.py b/lib/logic.py
    index 1488ca9
    ..6fa9997 100755
    --- a/lib/logic.py
    +++ b/lib/logic.py
    @@ -56,19 +56,12 @@ class Logics():
                 if 
    hasattr(logic'watch_item'):
                     if 
    isinstance(logic.watch_itemstr):
                         
    logic.watch_item = [logic.watch_item]
    +                
    item_list = []
                     for 
    entry in logic.watch_item:
    -                    
    itemexprsepattribute entry.partition(':')
    -                    
    itemexpr itemexpr.strip()
    -                    if 
    attribute != '':
    -                        
    attribute attribute.strip()
    -                    else:
    -                        
    attribute False
    -                    for item in self._sh.match_items(itemexpr):
    -                        if 
    attribute:
    -                            if 
    attribute in item.conf:
    -                                
    item.add_logic_trigger(logic)
    -                        else:
    -                            
    item.add_logic_trigger(logic)
    +                    
    item_list += self._sh.match_items(entry)
    +                for 
    item in item_list:
    +                    
    item.add_logic_trigger(logic)
    +                
    logic.watch_item item_list

         def _read_logics
    (selffilenamedirectory):
             
    logger.debug("Reading Logics from {}".format(filename)) 
    HM-KNX - KNX-Interface für Hörmann Garagentorantriebe: http://www.ing-budde.de

    Kommentar


      #3
      Hi Robert,

      das muss ich mir, in einer ruhigen Minute, noch einmal durch den Kopf gehen lassen.

      Bis bald

      Marcus

      Kommentar


        #4
        Hallo Robert,

        Zitat von Robert Beitrag anzeigen
        Könnte man dann nicht "watch_item" nach dem Start in eine Item-Liste wandeln? Weil sonst muss eine Logik, um eine Liste ihrer Trigger zu erhalten, erst das oben stehende Feuerwerk (oder eben zumindest match_items(hier-sogar-iterieren-weil-watch_item-eine-Liste-ist!)) abfahren.
        den Code verstehe ich, aber was möchtest Du eigentlich erreichen?
        Liste? Wieso eine Liste aller Items die eine Logik triggern können?

        Bis bald

        Marcus

        Kommentar


          #5
          Hi Markus,

          genau, eine Liste aller Items, die eine Logic triggern können. Bzw. lass es uns erst mal zweiteilen:
          1. Das "match_items" auch anhand von Attributen filtern können sollte wäre doch sinnig, oder? So hätte man die gleiche Schnittstelle wie in den Conf-Dateien. Wenn ich irgendwo in einer Logik (oder Plugin) sonst den Effekt haben will, muss ich erst zusätzlichen Code einfügen, der anderswo (in lib/item.py) schon existiert. Wenn das schon mal rein käme, wäre mir schon geholfen.
          2. Die Liste der Trigger-Items brauche ich in zwei - wie ich meine üblichen - Logiken:

            Nachtbeleuchtung: Das typische "Nachdimmen" auf die Trigger der "watch_item". Wenn jetzt der Nachtmodus selber ein/ausgeschaltet wird, iteriere ich über die "watch_item", um beim Aktivieren Lichter die eingeschaltet sind entsprechend zu dimmen bzw. beim Deaktivieren diese dann auf "Normalhelligkeit" zu setzen. Dafür brauche ich die Liste! Momentan müsste ich erst match_items zum Finden aller Lichter bemühen, dann alle Lichter ohne entsprechendes "night_brightness" Attribut rausfiltern. Das jedesmal oder bei "init" eine Sonderbehandlung um das einmalig zu machen. Auch nicht übersichtlich und effizient. Alternativ: Einfach die "konvertierte" "watch_item" nehmen - fertig.

            Verschlussüberwachung: Die Fenster-Kontakte laufen auf die "watch_item". Wenn sich jetzt bei vermeintlicher "Abwesenheit" (durch eine andere Logik detektiert) ein Fenster öffnet, soll geschaut werden, welche anderen Fenster schon auf waren und ob wohl eine Fehldetektion vorliegt oder vorher schon ein anderes Fenster auf war. Hier sollen auch über Attribute verschiedene Dringlichkeiten kodiert sein, also Fenster im EG/Keller haben andere Auswirkungen (aber nicht alle, EG ist bei Hanglage auch nicht immer "zugänglich"). Ergo: Auch hier würde ich gerne über andere Fenster iterieren.

          Kurzum: Geht alles auch so, klar. Zur Not mit "hasattr" checken und sonst beim ersten Run erstellen. Nur: Warum? Die Liste fällt beim Init der Logik eh an und "watch_item" ist - wenn mit regulären Erweiterungen benutzt - für alle andere als "match_item" eh recht untauglich!?

          Wie gesagt, die Erweiterung von "match_item" für Attribute würde mich schon mal weiterbringen. Der Rest wäre imho elegant - aber auch so zu frickeln.

          Grüße
          Robert
          HM-KNX - KNX-Interface für Hörmann Garagentorantriebe: http://www.ing-budde.de

          Kommentar


            #6
            Hallo Robert,

            das match_items werde ich generell um Attribute ergänzen.

            Was hälst Du davon das Item-Object direkt als Trigger mitzugeben?

            Bis bald

            Marcus

            Kommentar


              #7
              Zitat von mknx Beitrag anzeigen
              das match_items werde ich generell um Attribute ergänzen.
              Vielen Dank!

              Zitat von mknx Beitrag anzeigen
              Was hälst Du davon das Item-Object direkt als Trigger mitzugeben?
              Wenn ich dich richtig verstehe: du willst das Dictionary "trigger" erweitern und nicht nur den Namen sondern das Item-Handle mitgeben? - Das würde die Sache mit den "watch_item" (was eben die ganze Liste der möglichen Trigger umfasst) natürlich nicht lösen, würde aber wohl insgesamt effizienter sein. Denn die Wandlung (in einer Logik) "trigger['source'] -> str(trigger['source'])" ist wesentlich effizienter als "trigger['source'] -> self.find_item(trigger['source'])". Habe aber gerade nicht auf dem Schirm, ob bei trigger['source'] ausschließlich Items vorkommen können!?

              Oder habe ich dich missverstanden?

              Viele Grüße
              Robert
              HM-KNX - KNX-Interface für Hörmann Garagentorantriebe: http://www.ing-budde.de

              Kommentar

              Lädt...
              X