Ankündigung

Einklappen
Keine Ankündigung bisher.

Beispiel Plugin

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

    Beispiel Plugin

    Hi,

    ich habe mir mal bisschen die Plugins angeschaut. Vieles verstehe ich auch auf anhieb.

    hier ist meine "items.conf"

    Code:
    [HelloWorld]
        [[test]]
            type = num
            test_val = 0
    In meiner HTML Datei (pages), steht rudimentaer folgendes:
    Zyklisch wird der nachfolgende Parameter (self.test_val) in meiner "refresh-Methode" hochgezaehlt.

    Ein Auszug aus meinem Plugin sieht wie folgt aus:
    Code:
        def __init__(self, smarthome, host, port, cycle=240):
        #...
        self.test_val = 0
        def parse_item(self, item):
            # Attribute und Parameter werden regelmäßig ausgelesen        if 'test_val' in item.conf:
                self._items.append(item)
                return self.update_item
    In der Html Datei sieht es derzeit so aus, dass ich den Wert "test_val" wie folgt anzeigen lassen will:

    Code:
    {{ basic.value('value', 'HelloWorld.test') }}
    Wo wird aber aus meinem Plugin nun der Wert "test_val" an die Smartvisu uebergeben? Wie muesste das aussehen?!

    Vielen Dank schon mal und viele Grueße...
    P.

    #2
    Gar nicht, dazu müsstest du das Visu Plugin erweitern. Warum schreibst du den Wert nicht in das Item selber, dann ginge das out of the box
    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
      Zitat von 2ndsky Beitrag anzeigen
      Gar nicht, dazu müsstest du das Visu Plugin erweitern. Warum schreibst du den Wert nicht in das Item selber, dann ginge das out of the box
      Gibts hierzu ein Beispiel!?

      Kommentar


        #4
        Für welche Variante? Wert in Item schreiben oder Visu Plugin erweitern? Letzteres muss mit Marcus abgestimmt werden oder kann nur lokal verwendet werden und müsste dann bei upstream changes jedes mal manuell gemerged werden. Marcus wird Änderungen am Visu Plugin nur zulassen, wenn es dadurch einen deutlichen Mehrwert für alle User gibt.
        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


          #5
          Den Wert in ins Item schreiben... kann ich denn dann aus der Visu darauf zugreifen oder geht das nicht, also so wie ich es geschrieben hab

          Code:
          {{ basic.value('value', 'HelloWorld.test') }}

          Kommentar


            #6
            So wird auf den Itemwert zugegriffen, das geht also. Damit liest du aber den Wert des Items aus und nicht von test_val, das muss dir klar sein. test_val dient also im Plugin nur dazu, Items zu identifizieren, mit denen das Plugin arbeiten soll und evtl. die Abarbeitung im Plugin für jedes Item zu steuern. Beispiel:

            Code:
            if item.conf['test_val'] == 0:
                item(0)
            else:
                item(1)
            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


              #7
              Danke fuer deine Antwort. Ich bin gerad irgendwie abgehaengt und ich steh auf dem Schlauch.

              mein Plugin sieht wie folgt aus:

              Code:
              # header...
              logger = logging.getLogger('HelloWorld')
              
              
              class HelloWorld():
                  _items = []
                  
                  def __init__(self, smarthome,cycle=5):
                      self._sh = smarthome
                      self._cycle = int(cycle)
                      self.eineVariable = 0 
                      self._lock = threading.Lock()
                      self.refresh_cycle = self._cycle
                      
                  def run(self):
                      self.alive = True
                      self._sh.scheduler.add('HelloWorldd', self.refresh, prio=5, cycle=self._cycle, offset=2)
                      # if you want to create child threads, do not make them daemon = True!
                      # They will not shutdown properly. (It's a python bug)
                      # if not self.alive:
                          # break
                  
                  
                  def refresh(self):
                      for item in self._items:
                          time.sleep(1)
                          self.eineVariable = self.eineVariable+1 
                          logger.info("Refresh: {%i}", (self.eineVariable))
                          item(0)
                                      
                  def stop(self):
                      self.alive = False
                  
                          
                          
                  def parse_item(self, item):
                      if 'test_val' in item.conf:
                          logger.debug("Parse item: {0}".format(item))
                          eineVariable = item.conf['test_val'] 
                          self._items.append(eineVariable)
                          return self.update_item
                      else:
                          return None
                  
                  
                  def update_item(self, item, caller=None, source=None, dest=None):
                      if caller != 'HelloWorld':
                          logger.info("Uupdate item: {0}".format(item))
                          item(self.eineVariable, 'HelloWorld')
              wie kriege ich nun den aktuellen Wert, den ich in der Methode "refresh" zyklisch inkrementiere, an die Smartvisu uebergeben?!

              Kommentar


                #8
                Code:
                def refresh(self):
                        for item in self._items:
                            [COLOR="DarkOrange"]# time.sleep(1) # das könnte nach hinten losgehen wenn Du mehr als fünf Items verwendest. Dann hast Du auf einmal mehrere parallel laufende Logiken[/COLOR]
                            self.eineVariable = self.eineVariable+1 
                            logger.info("Refresh: {%i}", (self.eineVariable))
                            item([COLOR="Red"]self.eineVariable[/COLOR])

                Kommentar


                  #9
                  Da self.eineVariable nicht je Item sondern einmal im Plugin vorkommt, wäre die einfachste Möglichkeit, den Wert in ein speziell dafür vorgesehenes Item deiner Config zu schreiben.

                  Code:
                  # items/speziell.conf
                  [eineVariable]
                      type = num
                      visu_acl = rw
                      ...
                  und dann anstatt self.eineVariable verwendest du self._sh.eineVariable(self._sh.eineVariable() + 1).

                  Noch schöner wäre sowas:

                  Code:
                  # items/speziell.conf
                  [irgendeinname]
                      type = num
                      visu_acl = rw
                      test_variable = eineVariable
                      ...
                  und im Plugin dann:

                  Code:
                      _variablen = {}
                  
                      def parse_item(self, item):
                          if 'test_variable' in item.conf:
                              self._variablen[item.conf['test_variable']] = item
                  
                      def refresh(self):
                          for item in self._items:
                              time.sleep(1)
                              if 'eineVariable' in self._variablen:
                                  var eineVariable = self._variablen['eineVariable']
                                  eineVariable(eineVariable + 1)
                                  logger.info("Refresh: {%i}", (eineVariable()))
                              item(0)
                  ACHTUNG: nicht getestet!

                  Mit letzterem könntest du dann auch mehrere "Variablen" in deiner Item config hinterlegen, die du alle von deinem Plugin aus beschreiben kannst. Außerdem bist du nicht darauf angewiesen, dass es ein Item mit einem bestimmten Namen gibt, wie im ersten Fall.
                  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


                    #10
                    Zitat von mknx Beitrag anzeigen
                    Code:
                    def refresh(self):
                            for item in self._items:
                                [COLOR="DarkOrange"]# time.sleep(1) # das könnte nach hinten losgehen wenn Du mehr als fünf Items verwendest. Dann hast Du auf einmal mehrere parallel laufende Logiken[/COLOR]
                                self.eineVariable = self.eineVariable+1 
                                logger.info("Refresh: {%i}", (self.eineVariable))
                                item([COLOR="Red"]self.eineVariable[/COLOR])
                    Hallo Marcus,

                    dein Code schreibt den Wert aber in das Item, über das iteriert wird. Da eineVariable aber jedesmal inkrementiert wird, wenn ein Item in refresh durchlaufen wird, geht das so nicht. Da dann jedes Item einen anderen Wert hat als eineVariable. Außer das sollte eigentlich so sein und die ursprüngliche Implementierung war zu ungenau/falsch.
                    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

                    Lädt...
                    X