Ankündigung

Einklappen
Keine Ankündigung bisher.

Parse Function

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

    Parse Function

    Ich habe ein Problem mit dem Aufruf einer Logic im Plugin.

    Ichhabe eine Datenbank erstellt und mit Daten gefüllt. In der Visu konnte ich verschiedene Logiken starte, wie
    Springe zum ersten Datensatz, zum letzten Datensatz, Neuer Satz, Änderungen speichern, usw



    In den Items habe ich z.B. my_Plugin_Function: 'A61_test' eingefügt und in parse_item
    eingelesen.



    test:
    ....name: Test A61
    ....type: bool
    ....visu_acl: rw
    ....enforce_updates: 'true'
    ....enforce_change: 'true'
    ....my_Plugin_Function: 'A61_test'

    refresh:
    ....name: refresch
    ....type: bool
    ....visu_acl: rw
    ....enforce_updates: 'true'
    ....enforce_change: 'true'
    ....my_Plugin_Function: 'refresh'
    2023-12-04 14:08:49 CET WARNING plugins.aastockwert __init__ parse_item ln:773 Start parse_item ---- Main
    2023-12-04 14:08:49 CET WARNING plugins.aastockwert __init__ parse_item ln:776 parse item: Test A61 ---- Main
    2023-12-04 14:08:49 CET WARNING plugins.aastockwert __init__ parse_item ln:777 Oooh ein Item für meine Plugin Logics : Test A61 ---- Main
    2023-12-04 14:08:49 CET ERROR lib.item.item item __init__ ln:359 Item pfolio.test: problem creating: name 'my_Plugin_Function' is not defined ---- Main
    Traceback (most recent call last):
    File "/usr/local/smarthome/lib/item/item.py", line 357, in __init__
    child = Item(smarthome, self, child_path, value)
    File "/usr/local/smarthome/lib/item/item.py", line 440, in __init__
    update = plugin.parse_item(self)
    File "/usr/local/smarthome/plugins/aastockwert/__init__.py", line 781, in parse_item
    self.logger.warning("781 aastockwert my_Plugin_Function: parseFunction {0} defined".format(my_Plugin_Function))
    NameError: name 'my_Plugin_Function' is not defined

    2023-12-04 14:08:49 CET WARNING plugins.aastockwert __init__ parse_item ln:773 Start parse_item ---- Main
    2023-12-04 14:08:49 CET WARNING plugins.aastockwert __init__ parse_item ln:776 parse item: refresch ---- Main
    2023-12-04 14:08:49 CET WARNING plugins.aastockwert __init__ parse_item ln:777 Oooh ein Item für meine Plugin Logics : refresch ---- Main
    2023-12-04 14:08:49 CET ERROR lib.item.item item __init__ ln:359 Item pfolio.refresh: problem creating: name 'my_Plugin_Function' is not defined ---- Main
    Traceback (most recent call last):
    File "/usr/local/smarthome/lib/item/item.py", line 357, in __init__
    child = Item(smarthome, self, child_path, value)
    File "/usr/local/smarthome/lib/item/item.py", line 440, in __init__
    update = plugin.parse_item(self)
    File "/usr/local/smarthome/plugins/aastockwert/__init__.py", line 781, in parse_item
    self.logger.warning("781 aastockwert my_Plugin_Function: parseFunction {0} defined".format(my_Plugin_Function))
    NameError: name 'my_Plugin_Function' is not defined
    Hier liegt mein Problem!

    'my_Plugin_Function' is not defined, wo muss es als Feld definiert werden?

    Danke für jede Hilfe.

    LG Wolfgang

    ​​​​​​​
    Zuletzt geändert von schloessl; 04.12.2023, 16:49.

    #2
    In item_attributes im plugin.yaml des Plugins

    Kommentar


      #3
      Äh... wenn ich das Log richtig lese, wird das Attribut geparst (parse_item spricht drauf an), und der Fehler für unbekannte Attribute sieht anders aus.

      Die Exception heißt, dass er die Funktion nicht findet, wenn versucht wird, sie aufzurufen.

      Ohne Code ist das alles etwas Raterei, musst du vielleicht self.my_plugin_function() aufrufen?

      Code würde helfen, mindestens die parse_item-Funktion...

      Kommentar


        #4
        Besten Dank an Morg und Onkelandy für Eure Antworten.

        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.
                """
                self.logger.warning("Start parse_item")
        
                if self.has_iattr(item.conf, 'my_Plugin_Function'):
                    self.logger.warning(f"parse item: {item}")
                    self.logger.warning(f"Oooh ein Item für meine Plugin Logics : {item}")
                    item = self.get_iattr_value(item.conf,'my_Plugin_Function')
        
        #xx            self.logger.warning(f"parse Funktion: {my_Plugin_Function}")
                    self.logger.warning("781 aastockwert my_Plugin_Function: parseFunction {0} defined".format(my_Plugin_Function))
        
        #            self.logger.warning(f"parse Funktion: {knx_listen}")
        #            self.logger.warning("aastockwert 793: parseFunction {0} defined".format(knx_listen))
        
        
        #xx            self.logger.warning("parse Funktion {}".format(item.id()))
        #xx            self.logger.warning("Test PARSE_ITEM / LOGIC")
        
                    self.logger.warning(f"790 OOh ein Item für meine Plugin Logics : {item}")
                    return self.update_item
                else:
                    self.logger.warning("Item {} nicht in aastockwert my_Plugin_Function defined".format(item))
        
        
        
                if self.has_iattr(item.conf, 'aastockwert_data_type'):
                    self.logger.warning("parse item: {}".format(item.id()))
                    _item = self.get_iattr_value(item.conf, 'aastockwert_data_type')
                    item = self.get_iattr_value(item.conf, 'aastockwert_data_type')
        
                    self.logger.warning("parse item: {}".format(item))
                    self.logger.warning("parse itemID: {}".format(item.id()))
        
                    # Add items to internal array
                    if not _item in self._items:
                        self._items[_item] = []
                    self._items[_item].append(item)
                    self.logger.warning("aastockwert: parseEnde {0} defined".format(item))
                    return self.update_item
        Zustand. Aktuelle Smarthome 1.8.5, update durchgeführt.
        In den Funktionsauslösende Items my_Plugin_Function: NAME eingefügt siehe #1


        Unter parse_item werden alle Items ohne "my_Plugin_Function" überlesen und sind im Admin unter Items sichtbar
        Für die Items mit "my_Plugin_Function" wird der Name richtig angezeigt sind aber im Admin nicht mehr sichtbar!!

        Hier ist sicherlich der Fehler in der lib.item schuld:
        Oooh ein Item für meine Plugin Logics : refresch ---- Main
        2023-12-04 14:08:49 CET ERROR lib.item.item item __init__ ln:359 Item pfolio.refresh: problem creating: name 'my_Plugin_Function' is not defined ---- Main
        Traceback (most recent call last):
        File "/usr/local/smarthome/lib/item/item.py", line 357, in __init__

        Bei einem "True" im entsprechenden Item würde ich gerne die entsprechende Logic ausführen.

        Meine veralteten Logics stehen noch unter Logics und werden unter parse_logic im Logging ausgewiesen.
        Hier bin ich unschlüssig, die bereinigten Logics über parse_logic nutzen oderdie Logic im Code hinterlegen?

        Onkelandys-Hinweis übernommen:
        my_Plugin_Function:
        ...type: str
        ...default: ' '
        ...description:
        ...de: 'Plugin Function'
        ...en: 'Plugin Function'

        Danke für Eure Hilfe

        LG Wolfgang

        Kommentar


          #5
          Hier noch der aktuelle Test.

          File "/usr/local/smarthome/plugins/aastockwert/__init__.py", line 781, in parse_item
          self.logger.warning("781 aastockwert my_Plugin_Function: parseFunction {0} defined".format(my_Plugin_Function))
          NameError: name 'my_Plugin_Function' is not defined
          2023-12-05 15:36:26 CET WARNING plugins.aastockwert __init__ parse_item ln:773 Start parse_item ---- Main
          2023-12-05 15:36:26 CET WARNING plugins.aastockwert __init__ parse_item ln:776 parse item: Anfang ---- Main
          2023-12-05 15:36:26 CET WARNING plugins.aastockwert __init__ parse_item ln:777 Oooh ein Item für meine Plugin Logics : Anfang ---- Main
          2023-12-05 15:36:26 CET ERROR lib.item.item item __init__ ln:359 Item pfolio.anf: problem creating: name 'my_Plugin_Function' is not defined ---- Main
          Traceback (most recent call last):
          File "/usr/local/smarthome/lib/item/item.py", line 357, in __init__
          child = Item(smarthome, self, child_path, value)
          File "/usr/local/smarthome/lib/item/item.py", line 440, in __init__
          update = plugin.parse_item(self)
          File "/usr/local/smarthome/plugins/aastockwert/__init__.py", line 781, in parse_item
          self.logger.warning("781 aastockwert my_Plugin_Function: parseFunction {0} defined".format(my_Plugin_Function))
          NameError: name 'my_Plugin_Function' is not defined

          Kommentar


            #6
            Wer auch immer das geschrieben hat, hat noch Probleme mit dem Verständnis von Python...

            Code:
            item = self.get_iattr_value(item.conf,'my_Plugin_Function')
            Hier wird aus dem Item das Attribut "my_Plugin_Function" ausgelesen, und item zugewiesen - damit wird das eigentliche Item überschrieben ("kaputt gemacht") und durch den Wert des Attributes ersetzt. Das Item gibt es ab jetzt nicht mehr (zumindest nicht unter diesem Namen).

            Von hier an kannst du auch in parse_item nicht mehr auf das Item zugreifen.

            Code:
            self.logger.warning(f"parse Funktion: {my_Plugin_Function}")
            Hier soll er die Variable "my_Plugin_Function" ausgeben, die Variable gibt es aber gar nicht, die ist nirgendwo definiert und hat deshalb nichtmal "keinen Wert", sondern sie ist nicht existent, darum wirft Python auch die erste exception. (Die nächste Zeile mit logger und format macht denselben Fehler)

            Ich glaube nicht, dass es zielführend ist, wenn ich jetzt Zeile für Zeile durchgehe, wenn schon hier so schwerwiegende Fehler drin sind.

            Wenn das dein Code ist, empfehle ich dir, dir nochmal ein Python-Tutorial durchzuarbeiten, auch wenn das dem Drang, das Plugin weiterzuschreiben, (zeitlich) erheblich im Weg steht. Es wird später dann aber einfacher.

            Wenn du es nicht geschrieben hast, dann empfehle ich, es zu löschen und neu zu schreiben. Wenn dir das schwerfällt, dann siehe den vorherigen Punkt

            Aber vielleicht bringen dich ja die beiden Hinweise oben schon auf den Weg...

            Kommentar

            Lädt...
            X