Ankündigung

Einklappen
Keine Ankündigung bisher.

relative Bezeichnung von Items in conf

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

    relative Bezeichnung von Items in conf

    Guten Tag,

    ich möchte in meiner items.conf nen eval_trigger verwenden, der ein Item der gleichen Hierarchiestufe abfrägt. Um das Ganze möglichst gut mehrmals verwenden zu können, möchte ich nicht den ganzen (festen) Namen in den Code schreiben, sondern das irgendwie verkürzen.
    Ich versuch's mal mit nem Beispiel:
    Code:
    [EG]
        [[Wohnzimmer]]
            [[[Heizung]]]
                [[[[stellwert]]]]
                    type = num
                    visu = true
                    knx_dpt = 5001
                    knx_init = 4/4/121
                    knx_cache = 4/4/121
                    sqlite = yes
                [[[[heizen]]]]
                    type = bool
                    visu = true
                    eval = 0 if value == 0 else 1
                    eval_trigger = [COLOR=Red][B]EG.Wohnzimmer.Heizung[/B][/COLOR].stellwert
    Den roten Teil würde ich gerne ersetzen durch irgendwas wie parent.stellwert
    Es gibt ja ne Funktion return_parent(), aber return_parent().stellwert kommt mir irgendwie falsch vor....
    CU,
    Mathias

    #2
    relative Items

    Hi Matthias,

    ich habe da mal was gebaut was vermutlich so was in der Richtung ist, was Du möchtest. Dazu muß die Smarthome.py/lib/Item.py geändert werden:

    Code:
            #############################################################
            # Item Attributes
            #############################################################
            for attr, value in config.items():
                if not isinstance(value, dict):
                    if attr in ['cycle', 'eval', 'name', 'type', 'value']:
                        setattr(self, '_' + attr, value)
                    elif attr in ['cache', 'enforce_updates']:  # cast to bool
                        try:
                            setattr(self, '_' + attr, _cast_bool(value))
                        except:
                            logger.warning("Item '{0}': problem parsing '{1}'.".format(self._path, attr))
                            continue
                    elif attr in ['eval_trigger']:  # cast to list
                        ## extend here for two dots '..' which means parent
                        ## this will result in a lot of writing work less when you have 
                        ## an item which is to be triggered by its parent
                        if isinstance(value, str):
                            if value == '..':
                                logger.info("Parsing {0} we found eval_trigger = ..  will be converted to its parent: {1}".format(self.id(), self.id()))
                                value = self.return_parent().id()
                            value = [value, ]
                        setattr(self, '_' + attr, value)
                    elif attr in ['crontab']:  # cast to list
                        if isinstance(value, str):
                            value = [value, ]
                        setattr(self, '_' + attr, value)
                    elif attr == 'autotimer':
                        time, __, value = value.partition('=')
                        if value is not None:
                            self._autotimer = time, value
                    elif attr == 'threshold':
                        low, __, high = value.rpartition(':')
                        if not low:
                            low = high
                        self._threshold = True
                        self.__th_crossed = False
                        self.__th_low = float(low.strip())
                        self.__th_high = float(high.strip())
                        logger.debug("Item {}: set threshold => low: {} high: {}".format(self._path, self.__th_low, self.__th_high))
                    else:
                        self.conf[attr] = value
    Verwendungsbeispiel:
    Code:
    [ArbeitszimmerOG]
        name = Arbeitszimmer Obergeschoss
        sv_page = ArbeitszimmerOG
        [[Deckenlicht]]
            type = bool
            visu_acl = rw
            knx_dpt = 1
            knx_cache = 1/4/17
            knx_send = 1/0/17
            [[[LastUpdate]]]
                name = letztes Update von
                type = foo
                cache = yes
                eval = self.return_parent().last_update().strftime('%a %d.%m. %H:%M:%S')
                eval_trigger = ..
    Derzeit kann über ".." nur das übergeordnete Item angesprochen werden. Es ist aber sicher möglich da sowas wie eine Directory Navigation draus zu machen.

    Da das aber ein tiefer Eingriff in die Eingeweide vom Smarthomy.py ist, wollte ich dazu eigentlich erst Marcus konsultieren, bin aber noch nicht dazu gekommen ...

    Gruß,
    Bernd

    Kommentar


      #3
      Hi,

      danke vielmals, auch wenn ich es noch nicht ganz verstehe (hab's aber auch bisher nur überflogen)
      Mit den passenden Suchbegriffen ist mir gerade noch dieser Thread in die Hände gefallen: https://knx-user-forum.de/smarthome-...von-items.html - ich glaub, das dürfte so ziemlich das sein, was ich brauche...
      CU,
      Mathias

      Kommentar


        #4
        Den Thread kannte ich. IMHO fehlte noch wie Post #8 beschrieben das relative nach oben. Das findest Du jetzt hier :-)

        Gruß,
        Bernd

        Kommentar


          #5
          Gibt es dazu schon einen Pull-Request in github ?
          Das ist wohl der beste Weg um solche netten Änderungen für alle zugänglich zu machen. Für Marcus ist es so jedenfalls am einfachsten zu übernehmen .
          Umgezogen? Ja! ... Fertig? Nein!
          Baustelle 2.0 !

          Kommentar


            #6
            Er hatte es doch damals abgelehnt, oder?

            Kommentar


              #7
              Hallo,

              ich war/bin gegen die Syntax gewesen.

              -.Volume wandert eine Ebene höher

              --.irgend.was wandert zwei höher und dann wieder zwei runter...

              nur .Volume (ohne Minus) nimmt das Child!
              Mir erscheint es zu komplex. Ein einfaches ".." erscheint mir verständlicher.

              Momentan, nehme ich aber kein Pull-Requests für den Core an, da ich hier einiges überarbeitet habe. Mehr dazu demnächst.

              Bis bald

              Marcus

              Kommentar


                #8
                Nur um es nochmal los zu werden, ein solches Feature würde die items.conf deutlich angenehmer machen. Vielleicht kommt's ja in ähnlicher Form und passender Syntax in den neuen Core.
                Umgezogen? Ja! ... Fertig? Nein!
                Baustelle 2.0 !

                Kommentar


                  #9
                  Hi,
                  Zitat von mknx Beitrag anzeigen
                  Mir erscheint es zu komplex. Ein einfaches ".." erscheint mir verständlicher.
                  Das mit den Punkten dürfte sich aber als unpraktisch herausstellen, da der Punkt halt nunmal bereits der Trenner zwischen den Item-Ebenen ist. Und ne Linux-artige Syntax wie ../../item wäre dann wieder inkonsistent. Da müsste dann schon ein anderes Zeichen her (wird \ schon anderweitig verwendet?) oder ein Schlüsselwort für parent-item (für's obige Beispiel z.B. pitem.stellwert)
                  CU,
                  Mathias

                  Kommentar


                    #10
                    Das mit den Punkten dürfte sich aber als unpraktisch herausstellen, da der Punkt halt nunmal bereits der Trenner zwischen den Item-Ebenen ist.
                    Naja, das ist ja gerade der Witz. Per Definition sollte ein valides Item höchstens einen Punkt zwischen Buchstaben bzw. zwischen einer abschließenden Zahl und einem neue Anfangsbuchstaben haben. Insofern ist es sehr einfach diese Fall festzustellen.

                    Und ne Linux-artige Syntax wie ../../item wäre dann wieder inkonsistent. Da müsste dann schon ein anderes Zeichen her (wird \ schon anderweitig verwendet?) oder ein Schlüsselwort für
                    Naja es wäre recht pragmatisch einfach für jedes übergeordnete Item einen zusätzlichen Punkt hinzuzufügen.

                    Also:
                    Eine Ebene höher: ..
                    Zwei Ebenen höher: ...
                    Drei Ebenen höher: ....
                    und dann einfach die Kind Items dranhängen

                    parent-item (für's obige Beispiel z.B. pitem.stellwert)
                    Das halte ich nun für falsch: damit reservierst Du ein zusätzliches Schlüsselwort was nicht sein muß. Außerdem muß dann wieder mehr geschrieben werden.

                    Gruß,
                    Bernd

                    Kommentar


                      #11
                      Zitat von bmx Beitrag anzeigen
                      Also:
                      Eine Ebene höher: ..
                      Zwei Ebenen höher: ...
                      Drei Ebenen höher: ....
                      und dann einfach die Kind Items dranhängen
                      Stimmt - so hab ich es noch gar nicht betrachtet.
                      Ich dachte in die "Directory"-Richtung mit ..(Trenner)..(Trenner)
                      CU,
                      Mathias

                      Kommentar


                        #12
                        Gibt es hierzu mittlerweile etwas neues?

                        Bin gerade beim Anlegen der Items fürs Autoblind-Plugin...
                        da wären diese Abkürzungen seeehr praktisch.
                        Code:
                        [EG]
                            [[wohnen]]
                                [[[raffstore]]]
                                    [[[[couch]]]]
                                        name = Raffstore Wohnen Couch
                                        type = bool
                                        as_plugin = active
                                        as_lock_item = .auto_lock
                                        as_suspend_item = .auto_suspend
                                        as_suspend_time = 7200
                                        as_suspend_watch = .updown | room1.raffstore.stepstop
                                        as_laststate_item_id = .auto_laststate_id
                                        as_laststate_item_name = .auto_laststate_name        
                                        as_item_height = .height
                                        as_item_lamella = .lamella
                                        as_item_brightness = weatherstation.brightness
                                        [[[[[night]]]]]
                                            ...
                                        [[[[[day]]]]]
                                            ...
                                            
                                        [[[[[auto_lock]]]]]                               
                                            ...
                                        [[[[[auto_suspend]]]]]                           
                                            ...  
                                        [[[[[auto_laststate_id]]]]]
                                            ...
                                        [[[[[auto_laststate_name]]]]]
                                            ...
                                        [[[[[updown]]]]]
                                           ...
                                        [[[[[stepstop]]]]]
                                            ...
                                        [[[[[height]]]]]
                                            ...
                                        [[[[[lamella]]]]]
                                            ...
                        cu Yfkt5A
                        DALI(ABB DG/S1.1), KODI Odroid, TrueNAS, Zehnder ComfoAir 200 L Luxe
                        microk8s-Cluster: HomeAssistant, MusicAssistant, mosquitto, TVHeadend, jellyfin

                        Kommentar


                          #13
                          Hallo,

                          hat es das relative adressieren von Items eigentlich in smarthome-ng geschafft?

                          Gruß,
                          Hendrik

                          Kommentar


                            #14
                            ja im DEV, hier bspw. der commit der tests: https://github.com/smarthomeNG/smart...2d52360fa5e7f3


                            Oder siehe: https://github.com/smarthomeNG/smart...martHomeNG-1.3 (work in progress)

                            Kommentar


                              #15
                              Soweit ich weiß: Ja. Wohl ab dem kommenden Release. Endlich kein "verbiegen" mehr ...

                              /tom

                              Kommentar

                              Lädt...
                              X