Ankündigung

Einklappen
Keine Ankündigung bisher.

Support Thread für das Tasmota Plugin

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

    #46
    Hallo,
    Die letzten Änderungen im Develop stammen wahrscheinlich von mir, und es läuft auch mit dem aktuellen Master.
    Das Problem, dass das Dict im Plugin verändert wird und das Plugin dann nicht geladen wird, ist da aber auch noch enthalten. I h könnte die Ursache noch nicht finden. Ich schau aber kommende Woche nochmal.
    Beste Grüße

    Kommentar


      #47
      Danke Euch!

      Kommentar


        #48
        Hallo,

        Zitat von Sisamiwe Beitrag anzeigen
        Hallo,
        Ich schau aber kommende Woche nochmal.
        im letzten master von deinem Github habe ich das Problem auch.
        Übrigens habe ich das Problem nicht sporadisch, sondern sehr reproduzierbar. Mich wundert, dass ihr das Plugin scheinbar nutzen könnt. Irgenwas muss bei mir ja anders sein. Was mir dazu einfällt: Ich habe die Tasmota-Geräte natürlich (bzw. ausschließlich, denn ich habe noch keine Items für das Tasmota-Plugin) noch über das mqtt modul eingebunden. Kann es daran liegen?

        Zur Ursachenforschung
        In der Schleife wird ja nur zweimal ein Publish gemacht. Es wäre natürlich möglich, dass darauf auch wieder "gehört" wird und von einem anderen Thread des Plugins die liste tasmota_devices geändert wird.
        Aber dafür kenne ich mich nicht gut genug aus.

        Wie auch immer:
        Wäre es nicht möglich einfach das Dict vor der Iteration totzukopieren? (Edit: Funktioniert hier erstmal...)
        statt
        Code:
        for topic in self.tasmota_devices:
        Code:
        td=self.tasmota_devices.copy()
        for topic in td:
        Wenn in einem anderen Thread nun etwas an tasmota_devices gemacht wird, dann bekommt das die Schleife nicht mit. Aber dann halt bei der nächsten Ausführung.

        Das Komische: Das Problem besteht auch, wenn das Plugin deaktiviert ist:
        Code:
        tasmo_plugin:
        plugin_name: tasmota
        plugin_enabled: false
        
        2021-11-07 12:00:23 ERROR lib.plugin Plugin 'tasmota' exception in run() method: dictionary changed size during iteration
        Traceback (most recent call last):
        File "/usr/local/smarthome/lib/plugin.py", line 675, in run
        self.plugin.run()
        File "/usr/local/smarthome/plugins/tasmota/__init__.py", line 121, in run
        for topic in self.tasmota_devices:
        RuntimeError: dictionary changed size during iteration
        Gruß,
        Hendrik
        Zuletzt geändert von henfri; 07.11.2021, 12:14.

        Kommentar


          #49
          henfri

          Probier bitte mal folgende Änderung in der __init__.py aus:
          Code:
              def run(self):
                  """
                  Run method for the plugin
                  """
                  self.logger.debug("Run method called")
          
                  # start subscription to all topics
                  self.start_subscriptions()
          
                  # Discover Tasmota Device
                  key_list = list(self.tasmota_devices.keys())        # use copy of keys to iterate to prevent changing dict during iteration
                  for topic in key_list:
                      # ask for status info of each known tasmota_topic, collected during parse_item
          Um zu verhindern, dass das dict sich während der Iteration ändert, wir eine Kopie der dict keys erstellt und darüber iteriert.

          Zitat von henfri Beitrag anzeigen
          Was mir dazu einfällt: Ich habe die Tasmota-Geräte natürlich (bzw. ausschließlich, denn ich habe noch keine Items für das Tasmota-Plugin) noch über das mqtt modul eingebunden. Kann es daran liegen?
          Was meinst Du damit?

          Kommentar


            #50
            Hallo,


            Zitat von Sisamiwe Beitrag anzeigen
            henfri

            Probier bitte mal folgende Änderung in der __init__.py aus:
            Das macht doch das Gleiche wie mein Vorschlag, ist aber nicht so explizit in dem, was es macht...


            Code:
            thisdict = {
            "brand": "Ford",
            "model": "Mustang",
            "year": 1964
            }
            
            #print(thisdict)
            
            it=list(thisdict.keys())
            
            for i in it:
            print(i)
            thisdict["variant"]="convertible"
            
            
            print("var 2")
            
            thisdict = {
            "brand": "Ford",
            "model": "Mustang",
            "year": 1964
            }
            
            it=thisdict.copy()
            
            for i in it:
            print(i)
            thisdict["variant"]="convertible"
            
            
            thisdict = {
            "brand": "Ford",
            "model": "Mustang",
            "year": 1964
            }
            
            print("original")
            
            
            for i in thisdict:
            print(i)
            thisdict["variant"]="convertible"
            Output:
            Code:
            brand
            model
            year
            var 2
            brand
            model
            year
            original
            brand
            Traceback (most recent call last):
            
            File "C:\Users\henfri\.spyder-py3\temp.py", line 47, in <module>
            for i in thisdict:
            
            RuntimeError: dictionary changed size during iteration
            Meine Variante habe ich jetzt mal am laufen. Bisher kein Problem (und das kam immer direkt am Start). Werde berichten.

            Was meinst Du damit?
            Na, ich hatte schon Tasmota-Devices bevor es das Plugin gab. Die sind weiterhin so eingebunden:
            Code:
            SteckdoseFunk:
                type: bool
                knx_dpt: 1
                mqtt_topic_in:  stat/gosundXX/POWER
                mqtt_topic_out: cmnd/gosundXX/power
                hilfs_item:
                  type: dict
                  mqtt_topic_in:  tele/gosundXXX/SENSOR
                  on_change:
                    - ..Leistung = value['ENERGY']['Power']
                    - ..Scheinleistung= value['ENERGY']['ReactivePower']
                    - ..Factor=value['ENERGY']['Factor']
                    - ..Strom=value['ENERGY']['Current']
                    - ..Verbrauch=value['ENERGY']['Total']
            und die Frage ist, ob das irgendwie mit dem Tasmota-Plugin interferieren kann - es muss ja einen Grund geben, warum ihr das Problem mit dem Dict nicht/oder selten, ich aber immer habe.

            Gruß,
            Hendrik
            Zuletzt geändert von henfri; 08.11.2021, 21:47.

            Kommentar

            Lädt...
            X