Ankündigung

Einklappen
Keine Ankündigung bisher.

Relative adressierung von Items

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

    Relative adressierung von Items

    Hallo,

    ist es möglich/wäre es machbar, dass items relativ adressierbar sind?

    Z.B:

    Code:
    [Allgemein]
        [[Lampen]]
        sv_page=Strom
        name = Strom
        visu=yes
    	[[[FlurVorne]]]
    	name=FlurVorne
    	  [[[[Leistung]]]]
    	    type=num
    		value=50
    	  [[[[Dimmwert]]]]
    	    type=num
    		cache=yes
    	    sqlite = yes
    	    knx_listen = 1/1/13		
    	  [[[[Verbrauch]]]]
    	    type = num
    		cache=yes
    	    sqlite = yes
    	    knx_dpt = 12
    	    enforce_updates=yes
    		eval="..Dimmwert*..Leistung*Dimmwert.age()/60.0/60.0"
    (In dem Beispiel möchte ich den Verbrauch der Lampe loggen).

    Gruß,
    Hendrik

    #2
    Hallo Hendrik,

    leider nein.

    Bis bald

    Marcus

    Kommentar


      #3
      dann hätte ich ein Feature Request.

      Gerade bei wiederkehrenden Items (ähnliche Räume) würde dies das Copy&Paste Drama vereinfachen...

      Könnte man einen Platzhalter (parent) oder ähnliches implementieren?

      Gruß,
      Hendrik

      Kommentar


        #4
        grad keine Muße es auszuprobieren, aber

        Das geht doch!?

        ne Orgie von "sh.parent_item(self).irgendwas"?

        Oder übersehe ich was?

        Kommentar


          #5
          Hallo Robert,

          danke für den Tipp!

          Code:
          [Allgemein]
              [[Lampen]]
              sv_page=Strom
              name = Strom
              visu=yes
          	[[[FlurVorne]]]
          	name=FlurVorne
          	  [[[[Leistung]]]]
          	    type=num
          		value=50
          	  [[[[Dimmwert]]]]
          	    type=num
          		cache=yes
          	    sqlite = yes
          	    knx_listen = 1/1/13	
          		knx_init = 1/1/13	
          		knx_dpt=5
          	  [[[[Verbrauch]]]]
          	    type = num
          		name=FlurLampeVerbrauch
          		cache=yes
          	    sqlite = yes
          	    knx_dpt = 12
          	    enforce_updates=yes
          		eval="sh.Allgemein.Lampen.FlurVorne.Verbrauch()+sh.Allgemein.Lampen.FlurVorne.Dimmwert()*sh.Allgemein.Lampen.FlurVorne.Leistung()*sh.Allgemein.Lampen.FlurVorne.Dimmwert.age()/255.0/60.0/60.0"
          		eval_trigger="Allgemein.Lampen.FlurVorne.Dimmwert"
          		sv_widget="{{ plot.period('p998dljsd71', 'item', 'avg', '12h') }}"
          	  [[[[Verbrauch_self]]]]
          	    type = num
          		name=FlurLampeVerbrauch
          		cache=yes
          	    sqlite = yes
          	    knx_dpt = 12
          	    enforce_updates=yes
          		eval="sh.Allgemein.Lampen.FlurVorne.Verbrauch_self()+sh.parent_item(self).Dimmwert()*sh.parent_item(self).Leistung()*sh.parent_item(self).Dimmwert.age()/255.0/60.0/60.0"
          		eval_trigger="Allgemein.Lampen.FlurVorne.Dimmwert"
          		sv_widget="{{ plot.period('p998dljsd71', 'item', 'avg', '12h') }}"
          Die erste Variante geht, die zweite nicht.
          Habe ich etwas falsch umgesetzt?

          Gruß,
          Hendrik

          Kommentar


            #6
            Hi Hendrik,

            das self in dem eval ist etwas tricky zu erklären. Es klappt nicht.

            Was aber gehen müsste ist
            Code:
            sh.mein_item.return_parent().Child()
            .

            Bis bald

            Marcus

            P.S. ich habe Deine Frage falsch interpretiert.

            Kommentar


              #7
              weiß nicht, glaub sh.parent_item will einen Namen, also self._name.

              Aber warum nicht "self._parent.irgendwas"?

              Kurz: guck mal in die lib/item.py bei "_run_eval". In dem Kontext läuft das eval. Meines Erachtens kannst du dich da mit "self._parent" hochhangeln.

              Wobei mir bei deinem Konstrukt auch oberflächlich betrachtet auch der Zirkelbezug nicht gefällt. Auch wenn der Trigger ein anderer ist, kommt mir das sehr gefährlich vor?

              /ok, Marcus schreibt das gleiche, nur geht er über die Funktion und nicht direkt über das (eigene) private Item.
              //ok, doch noch Nachfrage: Marcus: das "self." geht wirklich nicht? Weil "sh.mein_item." braucht ja eben wieder die explizite Angabe des Item-Namens/Pfads...

              Kommentar


                #8
                Code:
                [Squeezebox_1]
                  [[Volume]]
                    type = num
                    visu = yes
                    squeezebox_send = <playerid> mixer volume {}
                    squeezebox_recv = <playerid> prefset server volume
                    squeezebox_init = <playerid> mixer volume
                  [[Horst]]
                    type = num
                    eval = "self._parent.Volume()+1000"
                    eval_trigger="Squeezebox_1.Volume"
                funktioniert absolut streifenfrei...

                jetzt brauchen wir nur noch für den eval_trigger eine Möglichkeit des Selbstbezuges auf den Parent... So in der Art "-1.Volume". "-1" ist eh kein gültiger Name für ein Item und könnte direkt ersetzt werden... Oder "[Parent].Volume"

                Kommentar


                  #9
                  Hallo,

                  Objekte/Werte mit einem _ am Anfang sind "privat" und sollen nicht ausserhalb des Objektes verwendet werden. Sie können/werden ohne Rücksicht verändert/gelöscht.

                  Deswegen besser die oben genannte Methode verwenden.

                  Bis bald

                  Marcus

                  Kommentar


                    #10
                    Danke euch beiden!

                    Kommentar


                      #11
                      Der Patch ermöglicht die Angabe (beliebiger) relativer Pfade für "eval_trigger".

                      -.Volume wandert eine Ebene höher

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

                      nur .Volume (ohne Minus) nimmt das Child!

                      Code:
                      diff --git a/lib/item.py b/lib/item.py
                      index 48ab8ac..8b8af1f 100755
                      --- a/lib/item.py
                      +++ b/lib/item.py
                      @@ -161,6 +161,9 @@ class Item():
                               if 'eval_trigger' in self.conf:
                                   triggers = []
                                   for trigger in self.conf['eval_trigger']:
                      +                if trigger.startswith('-') or 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
                      Beispiel:

                      Code:
                      [Squeezebox_1]
                        [[Volume]]
                          type = num
                          visu = yes
                          squeezebox_send = <playerid> mixer volume {}
                          squeezebox_recv = <playerid> prefset server volume
                          squeezebox_init = <playerid> mixer volume
                        [[Horst]]
                          type = num
                          eval = "self.return_parent().Volume()+1000"
                          eval_trigger="-.Volume"

                      Kommentar


                        #12
                        Das gefällt mir sehr gut!
                        Das kann wirklich einiges an Tipparbeit sparen und für Übersichtlichkeit sorgen!

                        Danke!

                        Kommentar


                          #13
                          Habs mir jetzt nicht im Detail angesehen, aber evtl. wäre es einfacher mit einer Logik und Wildcards im watch_item zu machen.
                          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


                            #14
                            Ja, das ist auch eine Möglichkeit/Idee.
                            Ich denke nochmal drüber nach.

                            Aber ich wäre dafür, den Patch zu übernehmen.

                            Gruß,
                            Hendrik

                            Kommentar

                            Lädt...
                            X