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


              #51
              Hallo Ihr guten Geister,

              ich habe heute, nach Upgrade auf die 1.9.1, versucht meine Gosund-Schalter zu integrieren(SP112). Das läuft auch soweit alles, das ich sie im Admin-Interface bei Tasmota sehe und alle Daten ankommen. Auch die Items sind mit Daten gefüllt.
              Mein Problem ist jetzt noch das Ein und Aus schalten. Über das Item im Admin-Backend tut sich da nix. Auch der Status ist beim initialen Aufruf false statt true, wenn der Schalter bereits an ist.
              Anbei meine Item-Config. Was fehlt da ggf. noch? Ist "relay" falsch?

              Danke und Grüße
              Gunnar


              Gosund4:
              type: bool
              tasmota_topic: gosund4
              tasmota_attr: online

              # Das Problemkind

              Schalter:
              type: bool
              tasmota_topic: ..:.
              tasmota_attr: relay
              enforce_updates: true
              ## mqtt_topic_out ??

              Leistung:
              tasmota_topic: ..:.
              tasmota_attr: power
              type: num

              Spannung:
              tasmota_topic: ..:.
              type: num
              tasmota_attr: voltage

              Strom:
              tasmota_topic: ..:.
              type: num
              tasmota_attr: current

              Energy_total:
              type: num
              tasmota_topic: ..:.
              tasmota_attr: power_total

              Energy_yesterday:
              type: num
              tasmota_topic: ..:.
              tasmota_attr: power_yesterday

              power_today:
              type: num
              tasmota_topic: ..:.
              tasmota_attr: power_today

              Kommentar


                #52
                Zitat von gklein Beitrag anzeigen
                Anbei meine Item-Config. Was fehlt da ggf. noch? Ist "relay" falsch?
                Das ist alles richtig.

                Um Plugin des Releases 1.9.1 war noch ein Bug. Dieser ist korrigiert und im develop verfügbar.

                Die wesentliche Änderung ist in Zeile 251:
                aus:
                Code:
                tasmota_zb_attr = self.get_iattr_value(item.conf, 'tasmota_zb_attr').lower()
                muss werden:
                Code:
                tasmota_zb_attr = self.get_iattr_value(item.conf, 'tasmota_zb_attr')
                if tasmota_zb_attr: 
                    tasmota_zb_attr = tasmota_zb_attr.lower()

                Kommentar


                  #53
                  perfekt, Schalten geht

                  Der initiale Status scheint aber noch nicht sauber zu sein. Das schau ich mir morgen aber nochmal in Ruhe. Evtl. war da mein Setup auf die Schnelle nicht sauber oder ich muss etwas länger warten bis ein Update über den MQTT gelaufen ist.

                  Danke nochmal und schönen Abend
                  Gunnar

                  Kommentar


                    #54
                    Hallo,

                    beim Start von SH-NG habe ich diesen Fehler (1.9.1):
                    Code:
                    smarthome-ng_1 | SHNG-WRAPPER: Start SmarthomeNG with "--foreground" as user "uid=1000(smarthome) gid=100(users) groups=100(users)".
                    smarthome-ng_1 | -------------------- Init SmartHomeNG v1.9.1-master (manual) --------------------
                    smarthome-ng_1 | Exception in thread modules.mqtt.paho_client:
                    smarthome-ng_1 | Traceback (most recent call last):
                    smarthome-ng_1 | File "/usr/local/lib/python3.8/threading.py", line 932, in _bootstrap_inner
                    smarthome-ng_1 | self.run()
                    smarthome-ng_1 | File "/usr/local/lib/python3.8/threading.py", line 870, in run
                    smarthome-ng_1 | self._target(*self._args, **self._kwargs)
                    smarthome-ng_1 | File "/usr/local/lib/python3.8/site-packages/paho/mqtt/client.py", line 3591, in _thread_main
                    smarthome-ng_1 | self.loop_forever(retry_first_connection=True)
                    smarthome-ng_1 | File "/usr/local/lib/python3.8/site-packages/paho/mqtt/client.py", line 1756, in loop_forever
                    smarthome-ng_1 | rc = self._loop(timeout)
                    smarthome-ng_1 | File "/usr/local/lib/python3.8/site-packages/paho/mqtt/client.py", line 1164, in _loop
                    smarthome-ng_1 | rc = self.loop_read()
                    smarthome-ng_1 | File "/usr/local/lib/python3.8/site-packages/paho/mqtt/client.py", line 1556, in loop_read
                    smarthome-ng_1 | rc = self._packet_read()
                    smarthome-ng_1 | File "/usr/local/lib/python3.8/site-packages/paho/mqtt/client.py", line 2439, in _packet_read
                    smarthome-ng_1 | rc = self._packet_handle()
                    smarthome-ng_1 | File "/usr/local/lib/python3.8/site-packages/paho/mqtt/client.py", line 3033, in _packet_handle
                    smarthome-ng_1 | return self._handle_publish()
                    smarthome-ng_1 | File "/usr/local/lib/python3.8/site-packages/paho/mqtt/client.py", line 3327, in _handle_publish
                    smarthome-ng_1 | self._handle_on_message(message)
                    smarthome-ng_1 | File "/usr/local/lib/python3.8/site-packages/paho/mqtt/client.py", line 3570, in _handle_on_message
                    smarthome-ng_1 | on_message(self, self._userdata, message)
                    smarthome-ng_1 | File "/usr/local/smarthome/modules/mqtt/__init__.py", line 559, in _on_mqtt_message
                    smarthome-ng_1 | subscription_found = self._callback_to_plugin(subscription, topic_dict[subscription], message.topic, message.payload, message.qos, message.retain)
                    smarthome-ng_1 | File "/usr/local/smarthome/modules/mqtt/__init__.py", line 512, in _callback_to_plugin
                    smarthome-ng_1 | plugin(topic, payload, qos, retain)
                    smarthome-ng_1 | File "/usr/local/smarthome/plugins/tasmota/__init__.py", line 569, in on_mqtt_announce
                    smarthome-ng_1 | self._handle_wifi(tasmota_topic, payload)
                    smarthome-ng_1 | File "/usr/local/smarthome/plugins/tasmota/__init__.py", line 1074, in _handle_wifi
                    smarthome-ng_1 | wifi_signal = int(payload['Wifi'].get('Signal'))
                    smarthome-ng_1 | TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'
                    smarthome-ng_1 | /usr/local/smarthome/lib/smarthome.py:876: CryptographyDeprecationWarning: int_from_bytes is deprecated, use int.from_bytes instead
                    smarthome-ng_1 | obj = getattr(module, sym)
                    Ist der Fehler bekannt?

                    Gruß,
                    Hendrik

                    Kommentar


                      #55
                      Zitat von henfri Beitrag anzeigen
                      Ist der Fehler bekannt?
                      Nein, bislang nicht.

                      Ersetzte mal die Methode _handle_wifi durch:
                      Code:
                          def _handle_wifi(self, device, payload):
                              """
                              Extracts Wifi information out of payload and updates plugin dict
                      
                              :param device:          Device, the Wifi information shall be handled
                              :param payload:         MQTT message payload
                              :return:
                              """
                              wifi_signal = payload['Wifi'].get('Signal')
                      
                              if wifi_signal:
                                  if isinstance(wifi_signal, str) and wifi_signal.isdigit():
                                      wifi_signal = int(wifi_signal)
                                  self.logger.info(f"Received Message decoded as Wifi message.")
                                  self.tasmota_devices[device]['wifi_signal'] = wifi_signal
                      Wenn das klappt, stelle ich einen PR.

                      Kommentar


                        #56
                        Zitat von gklein Beitrag anzeigen
                        Der initiale Status scheint aber noch nicht sauber zu sein.
                        Da hast Du Recht. Bugfix habe ich erarbeitet.

                        Zum Testen kannst Du folgendes mal in den Code in die Methode 'on_mqtt_announce' an entsprechender Stelle (im Plugin im develop branch ab Zeile 589) einpflanzen und den alten Teil überschreiben.

                        Code:
                                    elif info_topic == 'STATUS':
                                        self.logger.info(f"Received Message decoded as STATUS message.")
                        
                                        # get friendly name
                                        friendly_name = payload['Status'].get('FriendlyName', None)
                                        if friendly_name:
                                            if friendly_name[0] == '[' and friendly_name[-1] == ']':
                                                friendly_name = friendly_name[1:-1]
                                            self.tasmota_devices[tasmota_topic]['friendly_name'] = friendly_name
                        
                                        # get Module
                                        module = payload['Status'].get('Module', None)
                                        if module:
                                            self.tasmota_devices[tasmota_topic]['module'] = module
                        
                                        # get Power
                                        power = payload['Status'].get('Power', None)
                                        if power:
                                            self._handle_power(tasmota_topic, info_topic, payload)
                        Rückmeldung erwünscht.

                        Kommentar


                          #57
                          Hi,

                          danke für Deine Mühe. Kurzes Feedback:

                          - Statuswechsel bei Schalten im laufenden Betrieb funktioniert 👍

                          - Status nach SmarthomeNG-Restart wird nicht durch Init abgefragt
                          - Stecker raus und wieder rein - Online-Status wird erkannt, aber der Schalterstatus wird nicht neu abgefragt (laut Update-Zeit)

                          Brauchst Du irgendwelche Logs oder Screenshots?

                          Viele Grüße
                          Gunnar

                          Kommentar


                            #58
                            Zitat von gklein Beitrag anzeigen
                            Brauchst Du irgendwelche Logs oder Screenshots?
                            Welche Geräte nutzt Du?

                            Hast Du Lust und Zeit mit mir zu debuggen bzw. neue Versionen zu testen?
                            Könntest Du bspw. aus eine PluginVersion aus meinem Repo laden und testen?

                            Beste Grüße
                            Michael

                            Kommentar


                              #59
                              Zitat von Sisamiwe Beitrag anzeigen
                              Wenn das klappt, stelle ich einen PR.
                              Klappt!

                              Gruß,
                              Hendrik

                              Kommentar


                                #60
                                Zitat von henfri Beitrag anzeigen
                                Klappt!
                                Prima. Es sind noch mehr Änderungen in der Mache. PR folgt zeitnah,

                                Kommentar

                                Lädt...
                                X