Ankündigung

Einklappen
Keine Ankündigung bisher.

Problem bei der Erstellung eines SmartPlugin

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

    Problem bei der Erstellung eines SmartPlugin

    Ich habe mir vor langer Zeit und einige Versionswechselein eigenes Plugin gebastelt.
    Hier lese ich Daten aus verschieden Talenein sortiere diese und erstelle diverse Excel-tabellen.

    Jetzt, unter dem Druck mich an die tolle Neuentwicklung anzupassen, habe ich versucht SmartPLUGI nachzurüsten.

    Alles soweit ok, solange ich innerhalb des Logins über LOGICS die einzelnen DEFs aufrufe.

    Jedocf die DEFs die Daten in die ITEMS zur Anzeige in der amartvisu aufbereiten brigen den Fehler:

    " #Name des "itemname:Feldname" sind im Plugin "PLUINname, WP2 nicht enthalten-

    Im Admin Interface sieht man die Felder:
    Irgendwie bekomme ich die Items nicht in das SmartPlugin bzw. aus dem SmartPlugin in die Items.

    AttributeError: 'SmartHome' object has no attribute 'folio'

    Wo finde ich Informationen oder ein kleines Musterbeispiel?

    Code:
    2021-03-13  17:39:28 INFO     plugins.aaeigwp2    A15 A18_satzlesen beendet
    2021-03-13  17:39:28 INFO     plugins.aaeigwp2    A15 Ende : 48
    2021-03-13  17:39:28 INFO     plugins.aaeigwp2    A15 Ende i: 49
    2021-03-13  17:39:28 INFO     plugins.aaeigwp2    A15 TestISIN 0 : DE0007236101
    2021-03-13  17:39:28 INFO     plugins.aaeigwp2    A15 Unzahl Sätze: 49
    2021-03-13  17:39:28 ERROR    lib.plugin          Plugin 'aaeigwp2' from section 'wp' exception: 'SmartHome' object has no attribute 'pfolio'
    Traceback (most recent call last):
      File "/usr/local/smarthome/lib/plugin.py", line 161, in __init__
        plugin_thread = PluginWrapper(smarthome, plugin, classname, classpath, args, instance, self.meta, self._configfile)
      File "/usr/local/smarthome/lib/plugin.py", line 628, in __init__
        exec("self.plugin.__init__(smarthome{0}{1})".format("," if len(arglist) else "", argstring))
      File "<string>", line 1, in <module>
      File "/usr/local/smarthome/plugins/aaeigwp2/__init__.py", line 238, in __init__
        self.A02_check_db()
      File "/usr/local/smarthome/plugins/aaeigwp2/__init__.py", line 427, in A02_check_db
        self.A03_auswertung()
      File "/usr/local/smarthome/plugins/aaeigwp2/__init__.py", line 558, in A03_auswertung
        self.A15_arrayaufbau()
      File "/usr/local/smarthome/plugins/aaeigwp2/__init__.py", line 2363, in A15_arrayaufbau
        self._sh.pfolio.anzrecords(anzrec)
    AttributeError: 'SmartHome' object has no attribute 'folio'
    Zuletzt geändert von bmx; 25.03.2021, 08:01.

    #2
    Mit den wenigen Informationen wird Dir wohl niemand helfen können. Du kannst natürlich unter dev/sample_plugin mal schauen.
    Wenn Du mehr Hilfe brauchst, musst Du schon ein wenig die Hosen runterlassen

    Kommentar


      #3
      Wie schon unter #1 erwähnt habe ich eine selbstgebastelte Plugin versucht auf Smartplugin umzustellen und scheitere an der Rückübertragung ermittelter Rechenergebnissen an das ITEM zur späteren Darstellung
      Laut Leitfaden habe ich hoffentlich alle Erfordernisse erfüllt-
      Für Smartplugin habe ich leider nur unter der Entwickler-DOKU 1.7 eine Programmierhilfe der Funktionen gefunden. Vielleich führt mich diese in die Irre
      Korrektur; gibt es auch in 1.8.x

      smarthome/plugins/aaeigwp3/plugin.yaml

      Code:
      # Metadata for the Smart-Plugin
      plugin:
      # Global plugin attributes
          type: web # plugin type (gateway, interface, protocol, system, web)
          description: # Alternative: description in multiple languages
              de: 'Database plugin, mit Unterstützung für MySQL '
              en: 'Database plugin, with support for MySQL'
          maintainer: schloessl
          tester: schloessl
          state: 'test'
          keywords: aaeigwp3
          documentation: [URL="http://smarthomeng.de/user/plugins/database/user_doc.html"]http://smarthomeng.de/user/plugins/d.../user_doc.html[/URL]
          support: [URL="https://knx-user-forum.de/forum/supportforen/smarthome-py/1021844-neues-database-plugin"]https://knx-user-forum.de/forum/supp...atabase-plugin[/URL]
          version: 1.3.1 # Plugin version
          sh_minversion: 1.8.1 # minimum shNG version to use this plugin
          #sh_maxversion: # maximum shNG version to use this plugin (leave empty if latest)
          multi_instance: False # plugin supports multi instance
          restartable: unknown
          classname: wp # class containing the plugin
      
      parameters:
          # Definition of parameters to be configured in etc/plugin.yaml
          driver:
              type: str
              default: 'pymysql'
              description:
                  de: 'Spezifiziert das DB-API2 Treiber Modul'
                  en: 'specifies the DB-API2 driver module (e.g. Python includes the SQLite driver by importing the module sqlite3, to use it here just set the driver parameter to the module name sqlite3)'
      Für alle Items ein Eintrag unter item_atributes angelegt

      Code:
      item_attributes:
          aaeigwp3_data_type:
              type: str
              mandatory: True
              description:
                  de: 'aaeigwp Datentyp des jeweiligen Items.'
                  en: 'aaeigwp Data Type of the respective item.'
              valid_list:
                  - 'start'
                  - 'intfunkt'
                  - 'intabruf'
                  - 'traceTEST'
                  - 'traceWERTE'
                  - 'traceUPDATE'
                  - 'mytempmin'
                  - 'mytempmax'
                  - 'suche'
                  - 'neu'
                  - 'lesen'
                  - 'update'
      Danach ein Abbild der Items

      Code:
      start:
          # name: Start nach Laden
          type: bool
          description:
             de: 'Start nach Laden'
             en: ' no'
      
      intabruf:
          # name: Aktuell=0/Statistik=1
          type: num
          description:
              de: ' '
              en: ' no'
      
      traceTEST:
          # name: traceTEST
          type: num
          description:
              de: ' '
              en: ' no'
      
      traceWerte:
          # name: traceWerte
          type: num
          description:
              de: ' '
              en: ' no'
      
      traceUPDATE:
          # name: traceUPDATE
          type: num
          description:
              de: ' '
              en: ' no'
      
      mytempmin:
          # name: tempmin
          type: num
          description:
              de: ' '
              en: ' no'
      
      mytempmax:
          # name: tempmax
          type: num
          description:
              de: ' '
              en: ' no'
      und soweiter für alle Felder des Items

      Code:
      item_structs: NONE
      # Definition of item-structure templates for this plugin
      
      logic_parameters: NONE
      # Definition of logic parameters defined by this plugin
      
      plugin_functions:
      # Definition of function interface of the plugin
      Das Sammeln der Daten von verschiedenen Messgeräten und Verbrauchern in und das Einstellen in eine MySQL-Tabelle klappt wie gehabt. Durch Berechnungen ergeben sich neue Daten
      Diese Daten können nach verschiedenen Kriterien sortiert und über Exceltabellen ausgewertet werden.
      In der VISU habe ich eine Lösung zur Anteige. Über Buttons in der Maske kann ich nach Gerät / Standort oder Zeitraum durch die Datenbank scrollen und anzeigen.
      Genau dort hänge ich jetzt seit Tagen fest. Ich bringe unter „Smartplugin“ meine Daten nicht mehr in die ITEM-Felder zurück.
      Speziell der Parameter item.conf ist mir unklar. Xxxx ist das Item-Feld

      [CODE]
      if self.has_iattr(item.conf, 'xxxx'):
      logger.debug("aaeigwp Item {0} with value {1} found!".format(item,self.get_iattr_value(item.conf ,'xxxx')))
      return self.update_item
      else:
      return None
      [CODE]

      Was ist bitte ITEM.CONF, bzw, was muss hier stehen?

      Ebenso versucht;

      Code:
      def set_attr_value(self, conf, attr, value):
          self.logger.info("ITEM {} in set_attr ".format(attr))
          __attr = self.__get_attr_conf(conf,attr)
          if __attr is not None:
              Conf[self.__get_iattr(attr)] = value
      Code:
      def set_attr_value(self, conf, attr, value): # conf = ???
          self.logger.info("ITEM {} in set_attr ".format(attr))
          __attr = self.__get_attr_conf(conf,attr)
          if __attr is not None:
              Conf[self.__get_iattr(attr)] = value
      
      
      def update_minmax_test(self,item.conf):
          caller = "aaeigwp3"
          self.logger.info("ITEM {} ".format(item.conf))
          self.logger.info("Anzahl Openconnect = {0}".format(myanzOpenConnect))
      
      self.logger.info("Caller '{}' ".format(caller))
      # self.logger.info("item.conf = '{}' ".format(item.conf))
      #
      # if caller != 'DuW': #test variert
      # self.logger.info("nach Caller = '{}'".format(caller))
      # self.logger.info("Anzahl Openconnect = '{}'".format(caller)) Jeweis Fehler item.conf ????
      
      ##`_minint`
      # if self.has_iattr(item.conf, 'minint'):
      # self.logger.info("Wert des Feldes minint ='{}'".format(_minint))
      
      ##`_maxint`
      # if self.has_iattr(item.conf, 'maxint'):
      # self.logger.info("Wert des Feldes maxint = '{}' !".format(_maxint))
      Simple Frage also, wie bringe ich Daten wieder zurück in das ITEM?

      Ich habe jetzt eine Woche getestet und gesucht. Leider den Weg noch nicht gefunden.
      Ich bitte um Hilfe!
      Zuletzt geändert von bmx; 25.03.2021, 08:14. Grund: [CODE] ... [/CODE] eingefügt und Einrückungen korrigiert

      Kommentar


        #4
        Ich habe lange überlegt, ob ich was schreiben soll.

        Wenn du so dringend Hilfe brauchst, wäre es angemessen, deinen Helfern etwas Höflichkeit und Respekt entgegenzubringen.

        Beide Postings von dir sind vor Schreibfehlern teilweise kaum verständlich, spätestens bei (anscheinend) auch falsch geschriebenen Namen oder Fehlern ist ein Nachvollziehen kaum noch möglich.

        An manchen Stellen wäre es auch gut, wenn du uns ein bisschen deutlicher erklärst, was du eigentlich willst - also was das Plugin _genau_ machen soll. Aus dem Namen und deiner Beschreibung werde ich daraus nicht schlau.

        Weiterhin ist im Forum oben angehängt eine Anleitung, wie man Code richtig einfügt. Durch das Kraut und Rüben oben in deinem Posting will sich doch niemand erst durchwühlen, wenn es nicht mal ansatzweise lesbar ist.

        Vielleicht überarbeitest du deine Beiträge nochmal, und dann finden sich sicher auch Leute, die gern helfen. _So_ habe ich da keine Lust zu und werde mir das auch nicht im Detail ansehen, sorry.

        Kommentar


          #5
          Ich bitte um Entschuldigung, der Frust über das Nichtgelingen haben mich zu einer unstruktutierten Darstellung verleitet.

          Ich hatte alle Softwareteile in ein Texzdokument kopiert und hier auf die Seite kopiert. Da waren natürlich die Einrückungen verschwunden.
          Nach einem Zermin habe ichnoch versucht an den wichtigsten Stellen die Einrückungen nachzutragen.

          Mein Problem ist leicht darzustellen. Das Pugin läuft!

          Nur kann ich erechnete Datenfelder, oder Datenfelder bleim Blättern in der Datenbank nicht in die Items schreiben.

          Das Sammeln der Daten von verschiedenen Messgeräten und Verbrauchern in und das Einstellen in eine MySQL-Tabelle klappt wie gehabt. Durch Berechnungen ergeben sich neue Daten
          Diese Daten können nach verschiedenen Kriterien sortiert und über Exceltabellen ausgewertet werden.
          In der VISU habe ich eine Lösung zur Anteige. Über Buttons in der Maske kann ich nach Gerät / Standort oder Zeitraum durch die Datenbank scrollen und anzeigen.
          Genau dort hänge ich jetzt seit Tagen fest. Ich bringe unter „Smartplugin“ meine Daten nicht mehr in die ITEM-Felder zurück.
          Speziell der Parameter item.conf ist mir unklar. Xxxx ist das Item-Feld

          Ich nutze folgende DEF aus der Entwickler-Doku

          Fehlermeldung ist immer conf bzw item.conf - Syntaxfehler.

          Wie ist bitte ist item.coc, bzw. conf zu definieren oder mit welchem Wert zu ersetzen??

          Um den Fragen vorzubeugen, ob den die Daten unter dem Plugin definiert sind, habe ich Teile vorhin einkopiert, (mit Einrückungsfehlern)


          Ich erbitte hier eine Musterzeile oder einen Hinweis, wie und wo item.conf / conf belegt werden oder wo die Definition liegt, bzw. nicht versorgt wird-

          Code:
              def parse_item(self, item):
                  """
                  Default plugin parse_item method. Is called when the plugin is initialized.
                  The plugin can, corresponding to its attribute keywords, decide what to do with
                  the item in future, like adding it to an internal array for future reference
                  :param item:    The item to process.
                  :return:        If the plugin needs to be informed of an items change you should return a call back function
                                  like the function update_item down below. An example when this is needed is the knx plugin
                                  where parse_item returns the update_item function when the attribute knx_send is found.
                                  This means that when the items value is about to be updated, the call back function is called
                                  with the item, caller, source and dest as arguments and in case of the knx plugin the value
                                  can be sent to the knx with a knx write function within the knx plugin.
                  """
                  if self.has_iattr(item.conf, 'foo_itemtag'):
                      self.logger.debug("parse item: {}".format(item))
          
                  # todo
                  # if interesting item for sending values:
                  #   return self.update_item
          
              def parse_logic(self, logic):
                  """
                  Default plugin parse_logic method
                  """
                  if 'xxx' in logic.conf:
                      # self.function(logic['name'])
                      pass
          
              def update_item(self, item, caller=None, source=None, dest=None):
                  """
                  Item has been updated
          
                  This method is called, if the value of an item has been updated by SmartHomeNG.
                  It should write the changed value out to the device (hardware/interface) that
                  is managed by this plugin.
          
                  :param item: item to be updated towards the plugin
                  :param caller: if given it represents the callers name
                  :param source: if given it represents the source
                  :param dest: if given it represents the dest
                  """
                  if self.alive and caller != self.get_shortname():
                      # code to execute if the plugin is not stopped
                      # and only, if the item has not been changed by this this plugin:
                      self.logger.info("Update item: {}, item has been changed outside this plugin".format(item.id()))
          
                      if self.has_iattr(item.conf, 'foo_itemtag'):
                          self.logger.debug("update_item was called with item '{}' from caller '{}', source '{}' and dest '{}'".format(item,
                                                                                                                         caller, source, dest))
                      pass
          Ich bitte nochmals um Entschuldigung!

          In Demut Wolfgang

          Kommentar


            #6
            Muss ja nicht gleich Demut sein, aber so kann man zumindest erstmal verstehen, was du willst

            item.conf bildet die Eigenschaften bzw. Attribute der jeweiligen Items ab, also die Konfigurationen, die du dem jeweiligen Item mitgegeben hast. In der aktuellen Version von shng ist das in den Yaml-Dateien im Pfad items/ gespeichert.

            Du willst bei Änderungen an Werten diese Werte den Items zuweisen? Du hast doch sicher irgendwo im Plugin das Item gespeichert, also eine Variable, mit der du auf das Item zugreifen kannst?

            Wenn die Variable item1 heißt, dann könntest du einfach item1(Wert) aufrufen und das Item erhält den neuen Wert. Das ist aber im Vergleich zu vor-SmartPlugin-Zeiten meines Wissens unverändert.

            Wie hast du es denn vorher gemacht?

            Und dein Codebeispiel oben: parse_item() wird beim Start von shng für jedes Item aufgerufen und dein Plugin kann dann prüfen, ob das Item ein Attribut hat (einen "Konfigurationseintrag"), der für dein Plugin wichtig ist:

            Code:
            eg:
                licht:
                    type: bool
                    attr1: wert
            In dem Fall kannst du schauen, ob item.conf "attr1" enthält, und wenn ja, kannst du den Wert lesen. Hier kannst du dann auch das Item in einer Liste oder einem Dict im Plugin speichern, damit du später drauf zugreifen kannst. Außerdem kannst du hier eine Referenz auf update_item() zurückgeben, wenn das Item von anderen geändert werden kann und dein Plugin darauf reagieren können soll.

            In dem Fall update_item() wird aufgerufen, wenn das Item außerhalb des Plugins geändert wird. Dann hast du wieder dein Item und den neuen Wert und kannst damit etwas anstellen.

            Ich empfehle dir tatsächlich, dir mal das ganze SmartPlugin-Codebeispiel durchzulesen und zu versuchen zu verstehen, wie das funktioniert und was da passiert. Es ist auch kommentiert.

            Ansonsten such dir ein beliebiges Plugin und schau, ob dir das weiter hilft.
            Zuletzt geändert von Morg; 24.03.2021, 20:51.

            Kommentar


              #7
              Außerdem gibt es in der Dokumentation einen umfangreichen Abschnitt zur Entwicklung von Plugons, der Dir weiterhelfen sollte: https://www.smarthomeng.de/user/entw...s/plugins.html
              Viele Grüße
              Martin

              There is no cloud. It's only someone else's computer.

              Kommentar


                #8
                Stimmt, ich erinnere mich. Hätte ich auch mal dran denken können

                Kommentar


                  #9
                  Zitat von schloessl Beitrag anzeigen
                  Nur kann ich erechnete Datenfelder, oder Datenfelder bleim Blättern in der Datenbank nicht in die Items schreiben.
                  Hallo,

                  ich hatte bei der Pluginentwicklung auch ein paar Probleme die Werte wieder ins entsprechende Item zurückzuschreiben.
                  Wenn das auch dein Problem ist, dann hier ein kleiner Tipp:
                  Item library laden:
                  Code:
                  from lib.item import Items
                  Danach musst du die Items suchen und kannst die dann zurückschreiben.
                  Mehrere Wege führen nach Rom, aber mein erster Ansatz (quick and dirty) war der:
                  Code:
                  items = Items.get_instance()
                  for item in items.find_items('aaeigwp3_data_type'):
                      item("Beispielwert",self.get_shortname())
                  pass
                  Was man auch immer noch brauchen kann: item.conf['aaeigwp3_data_type']

                  Auch sehr geholfen hat mir das hier:
                  https://www.smarthomeng.de/developer/lib/item.html

                  Gruß,
                  Michael

                  Kommentar

                  Lädt...
                  X