Ankündigung

Einklappen

Serverwartung 21.2.



Am 21.2. im Laufe des späten Abends wird eine Serverwartung durchgeführt. Das Forum ist dadurch für gut zwei Stunden nicht erreichbar.
Es wird eine Wartungsseite geschaltet.

Mehr anzeigen
Weniger anzeigen

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