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

  • henfri
    antwortet
    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.

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    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?

    Einen Kommentar schreiben:


  • henfri
    antwortet
    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.

    Einen Kommentar schreiben:


  • henfri
    antwortet
    Danke Euch!

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    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

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    Sorry,

    ich hatte mich verklickt:

    Code:
        sh_minversion: 1.7.2
    Das tasmota Plugin sollte also im aktuellem master laufen.

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    In den Metadaten des Plugins steht:

    Code:
        sh_minversion: 1.8.2a
    Also muss die Version des Core höher sein als 1.8.2 (das besagte der Buchstabe am Ende der Versionsnummer)

    Das Plugin aus dem develop Branch funktioniert also NICHT mit dem aktuellen master.

    Falls Du es in den master installierst, würde SmartHomeNG es einfach nicht laden und einen Log Eintrag schreiben, dass das Plugin zu neu für den laufenden Core ist.

    Einen Kommentar schreiben:


  • henfri
    antwortet
    OK,
    weißt du, ob die aktuelle Version des Plugins in Develop mit dem letzten Release des Core kompatibel ist?

    Gruß
    Hendrik

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    Zitat von henfri Beitrag anzeigen
    Hast du dich mit dem Problem schon wieder befasst?
    Nein,
    es kann aber sein, dass das Problem trotzdem behoben ist. (die letzten Änderungen an dem Plugin stammen nicht von mir).

    Einen Kommentar schreiben:


  • henfri
    antwortet
    Hallo,
    Zitat von henfri Beitrag anzeigen
    Das ist ein Fehler, der auftritt, wenn verschiedene Threads das dict zeitgleich verändern. So ein Fehler tritt generell nur ab und zu auf und muss vermutlich durch Locks abgefangen werden
    @Msinn: Hast du dich mit dem Problem schon wieder befasst?
    Ich hätte gerade wieder einen Anwedungsfall.

    Gruß,
    Hendrik

    Einen Kommentar schreiben:


  • henfri
    antwortet
    Hallo,

    ui, das hatte ich überhaupt nicht mehr in Erinnerung... Blackout.
    Ich hab diese Version genutzt https://raw.githubusercontent.com/sm...ta/__init__.py
    Der Ordner tasmota_dev ist vorhanden, aber unbenutzt - sorry, dazu war ich noch nicht gekommen. Erstmal mit dem "basic" Tasmota-Plugin befassen, bevor ich deine Änderung teste.
    Ich fürchte also, der Fehler existiert schon im Release.
    @Msinn: Es eilt nicht.
    Zitat von Msinn Beitrag anzeigen
    Das ist ein Fehler, der auftritt, wenn verschiedene Threads das dict zeitgleich verändern. So ein Fehler tritt generell nur ab und zu auf und muss vermutlich durch Locks abgefangen werden
    Ich habe den Eindruck, dass das Problem hier immer auftritt. Jedenfalls habe ich mehrfach sh.py neugestartet und immer war das Plugin inaktiv (vermutlich aufgrund des Fehlers oben).

    Gruß,
    Hendrik

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    Zitat von henfri Beitrag anzeigen
    Hallo,

    vielen Dank dafür!
    Leider hab ich momentan verdammt wenig Zeit das auszuprobieren.
    Aktuell sende ich garnicht. Ich hatte es bisher nur manuell per mqtt ausprobiert - dann ist mir die Zeit ausgegangen.

    Gruß,
    Hendrik
    Schau mal hier, dass war unsere Kommunikation im März dazu.
    Welches Version des Plugin hast Du im Einsatz? Die aus dem Master Branch oder die von mir, die oben im Beitrag #32 anhängt ist.

    Einen Kommentar schreiben:


  • henfri
    antwortet
    Huch, das war mir nicht (mehr?) bewusst

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    Zitat von Msinn Beitrag anzeigen
    Dazu habe ich im Moment noch keine Idee. Auch da muss ich mal rein schauen.

    Da bei mir die Zeit im Moment recht knapp ist, kann das aber dauern bis ich dazu komme.
    henfri nutzt eine von mir veränderte Version des Plugins. Ich kümmere mich darum.

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    Zitat von henfri Beitrag anzeigen
    RuntimeError: dictionary changed size during iteration
    Das ist ein Fehler, der auftritt, wenn verschiedene Threads das dict zeitgleich verändern. So ein Fehler tritt generell nur ab und zu auf und muss vermutlich durch Locks abgefangen werden. Da muss ich mal rein schauen.

    Zitat von henfri Beitrag anzeigen
    jinja2.exceptions.UndefinedError: 'dict object' has no attribute 'energy_sensors'
    Dazu habe ich im Moment noch keine Idee. Auch da muss ich mal rein schauen.

    Da bei mir die Zeit im Moment recht knapp ist, kann das aber dauern bis ich dazu komme.

    Einen Kommentar schreiben:

Lädt...
X