Ankündigung

Einklappen
Keine Ankündigung bisher.

Viessmann Plugin Neuentwicklung Python Hilfe

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

    #46
    Onkelandy

    Ich habe bzgl. des "Missbrauchs" der UZSU noch eine Frage.
    Aber erstmal zur Anwendung.

    Wie bereits hier beschrieben, möchte ich die Timer IN der Viessmann-Heizung über die UZSU setzen. Ich habe dazu für jede Timer-Anwendung ein entsprechenes UZSU-Item angelegt. Im Plugin lese ich die Timer der Heizung aus und bringe sie in das Format der UZSU. Dann lese ich das bestehende UZSU dict ein und modifiziere die "list" im dict entsprechend der ausgelesenen Timer.
    Das klappt auch.

    Nun möchte ich auch das Setzen der Timer in der Heizung genau so machen. Wenn die UZSU sich ändert, soll mein Plugin die UZSU auslesen und die Schaltzeiten in das Viessmann Format bringen und schreiben.

    Für beide Funktionen habe ich ein Attribut eingeführt, dass "viess_timer" heißt. Der Wert des Atrributes ist die Anwendung. Hier ein Beispiel:
    Code:
            schaltzeiten:
                type: bool
                struct:
                  - uzsu.child
    
                uzsu:
                    name: Schaltzeiten im UZSU dict Format
                    viess_timer: Timer_Warmwasser
    Im Plugin in der Funktion update_item habe ich das so gelöst:
    Code:
        def update_item(self, item, caller=None, source=None, dest=None):
            if self.alive and caller != self.get_shortname():
                self.log_info("Update item: {}, item has been changed outside this plugin".format(item.id()))
                self.log_debug("update_item was called with item '{}' from caller '{}', source '{}' and dest '{}'".format(item, caller, source, dest))
    
                if self.has_iattr(item.conf, 'viess_send'):
                  ........
                
                elif self.has_iattr(item.conf, 'viess_timer'):
                    timer_app = self.get_iattr_value(item.conf, 'viess_timer')
                    uzsu_dict = item()
                    self.log_debug('Got changed UZSU timer: {} on timer application {}.'.format(uzsu_dict, timer_app))
                    self._uzsu_dict_to_viess_timer(timer_app, uzsu_dict)
                
                elif self.has_iattr(item.conf, 'viess_update'):
                    if item():
                        self.log_debug('Reading of all values/items has been requested')
                        self.update_all_read_items()
    Allerdings wird die Funktion bei Änderung des UZSU-Items nicht getriggert. Wird das vom UZSU Plugin irgendwie abgefangen?
    Hast Du vielleicht eine Idee?

    Kommentar


      #47
      Im uzsu-Struct gibt es schon ein Item, das 'uzsu' heißt.

      Benenn' das doch mal um, z.B. in 'timer'write' oder so...

      Kommentar


        #48
        Im Prinzip müsste dein Ansatz passen. Du erweiterst ja quasi das uzsu Item mit deinen 2 Angaben. Somit müsste es auch triggern. Check mal im Admin Tool, wie dein schaltzeiten.uzsu aussieht. Ist da wirklich das dict drin und wird es auch geschaltet? Eventuell musst du struct: uzsu.child NACH deinem manuellen uzsu Item positionieren. Da gabs aktuell ein Problem mit dem Mergen der Itemstruktur.

        Kommentar


          #49
          Onkelandy

          Meine schaltzeiten.uzsu enthält das dict und bei Änderungen in der visu mit dem widget ändert sich dieses auch. Sollte also passen.
          Meine 2 Attribute sind auch im im Admin Interface zu sehen.
          Anmerkung 2020-05-18 203548.png

          Allerdings fehlt bei den Verbundenen Triggern die meines viessmann.plugins.
          Anmerkung 2020-05-18 203548_1.png

          Bei anderen Items steht dort "bound method Viessmann.update_item of plugins.viessmann.Viess" mit dabei.

          Ich habe das struct nun mal rausgenommen und das UZSU-Item händisch angelegt. Macht aber keinen Unterschied. Der verbundene Trigger fehlt im Admin Interface und das update_item im viessmann Plugin wird nicht getriggert.

          Kommentar


            #50
            wie sieht dein parse_item aus?

            Kommentar


              #51
              Onkelandy

              Das war das Stichwort.
              Im parse_item hatte ich "return self.update_item" vergessen.

              Code:
                      # Process the timer config and fill timer dict
                      if self.has_iattr(item.conf, 'viess_timer'):
                          timer_app = self.get_iattr_value(item.conf, 'viess_timer')
                          for commandname in self._commandset:
                              if commandname.startswith(timer_app):
                                  commandconf = self._commandset[commandname]
                                  self.log_debug('Process the timer config, commandname: {}'.format(commandname))
                                  #{'addr': '2100', 'len': 8, 'unit': 'CT', 'set': True}
                                  commandcode = (commandconf['addr']).lower()
                                  if timer_app not in self._application_timer:
                                      self._application_timer[timer_app] = {'item': item, 'commandcodes': []}
                                  if commandcode not in self._application_timer[timer_app]['commandcodes']:
                                      self._application_timer[timer_app]['commandcodes'].append(commandcode)
                                  self._application_timer[timer_app]['commandcodes'].sort()
                          self.log_info('Loaded Application Timer \'{}\''.format(self._application_timer))
                          # self._application_timer: {'Timer_M2': {'item': Item: heizung.heizkreis_m2.schaltzeiten, 'commandcodes': ['3000', '3008', '3010', '3018', '3020', '3028', '3030']}, 'Timer_Warmwasser': {'item': Item: heizung.warmwasser.schaltzeiten, 'commandcodes': ['2100', '2108', '2110', '2118', '2120', '2128', '2130']}}
                          
                          for subdict in self._application_timer:
                              for commandcode in self._application_timer[subdict]['commandcodes']:
                                  if commandcode not in self._timer_cmds:
                                      self._timer_cmds.append(commandcode)
                          self._timer_cmds.sort()
                          self.log_debug('Loaded Timer commands \'{}\''.format(self._timer_cmds))  
                          # self._timer_cmds: ['2100', '2108', '2110', '2118', '2120', '2128', '2130', '3000', '3008', '3010', '3018', '3020', '3028', '3030']
                          return self.update_item
              DANKE

              Kommentar


                #52
                Hallo Morg,

                Ich bräuchte mal Deine Hilfe. Ich habe das Plugin nun die Funktionen "Gruppenkommando" und ViessmannTimer2UZSU und UZSU2ViessmannTimer ergänzt.

                Nun gibt es einen Fehler, den ich nicht weg bekomme.
                Code:
                Traceback (most recent call last):
                  File "/usr/local/smarthome/lib/item.py", line 2368, in __update
                    method(self, caller, source, dest)
                  File "/usr/local/smarthome/plugins/viessmann/__init__.py", line 341, in update_item
                    self._uzsu_dict_to_viess_timer(timer_app, uzsu_dict)
                  File "/usr/local/smarthome/plugins/viessmann/__init__.py", line 1024, in _uzsu_dict_to_viess_timer
                    timer[commandname] = listenkopie
                TypeError: 'str' object does not support item assignment
                2020-05-19  21:03:41 ERROR    plugins.smlx        Reading data from None failed with exception an integer is required (got type NoneType)
                Den aktuellen Pluginstand davon hänge ich hier als Zip mal an.

                Wenn ich den Stand als "Trockenübung" mit Python ausführe, funktioniert es.

                Kannst Du mir helfen?

                Danke
                Angehängte Dateien

                Kommentar


                  #53
                  Der Fehler heißt, dass du kein Element (Zeichen) eines Strings ändern kannst, und an der Stelle hätte ich vermutet, dass timer ein String ist.

                  Ich habe einmal die komische Kopiererei rausgenommen, wenn du eh jedesmal die selbe Liste in timer schreiben willst, dann weise es doch direkt zu. Dann hast du auch kein Problem mit möglichen Änderungen.

                  Zum Anderen habe ich dir eine Log-Zeile eingefügt, die dir ausgibt, welcher Typ und welcher Inhalt commandname und timer sind. Lass das mal "live" laufen und schau mal, was im Log rauskommt. commandname sollte sein, und timer sollte sein...

                  Örks, blöd, die Zeilen sind vertauscht. timer muss natürlich erst zugewiesen werden...
                  Angehängte Dateien

                  Kommentar


                    #54
                    Morg

                    Danke.

                    Der Fehler tritt trotzdem auf, und zwar wenn das Item eine Änderung bekommt.
                    Code:
                    2020-05-20  08:40:22 INFO     plugins.viessmann   viessmann: Update item: heizung.warmwasser.schaltzeiten.uzsu, item has been changed outside this plugin
                    2020-05-20  08:40:22 ERROR    lib.item            Item heizung.warmwasser.schaltzeiten.uzsu: problem running <bound method Viessmann.update_item of <plugins.viessmann.Viessmann object at 0x65477e50>>: 'str' object does not support item assignment
                    Traceback (most recent call last):
                      File "/usr/local/smarthome/lib/item.py", line 2368, in __update
                        method(self, caller, source, dest)
                      File "/usr/local/smarthome/plugins/viessmann/__init__.py", line 341, in update_item
                        self._uzsu_dict_to_viess_timer(timer_app, uzsu_dict)
                      File "/usr/local/smarthome/plugins/viessmann/__init__.py", line 1025, in _uzsu_dict_to_viess_timer
                        timer[commandname] = [{'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}] #listenkopie
                    TypeError: 'str' object does not support item assignment
                    2020-05-20  08:40:22 INFO     plugins.viessmann   viessmann: Update item: heizung.warmwasser.schaltzeiten.uzsu, item has been changed outside this plugin
                    2020-05-20  08:40:22 ERROR    lib.item            Item heizung.warmwasser.schaltzeiten.uzsu: problem running <bound method Viessmann.update_item of <plugins.viessmann.Viessmann object at 0x65477e50>>: 'str' object does not support item assignment
                    Traceback (most recent call last):
                      File "/usr/local/smarthome/lib/item.py", line 2368, in __update
                        method(self, caller, source, dest)
                      File "/usr/local/smarthome/plugins/viessmann/__init__.py", line 341, in update_item
                        self._uzsu_dict_to_viess_timer(timer_app, uzsu_dict)
                      File "/usr/local/smarthome/plugins/viessmann/__init__.py", line 1025, in _uzsu_dict_to_viess_timer
                        timer[commandname] = [{'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}] #listenkopie
                    TypeError: 'str' object does not support item assignment
                    2020-05-20  08:40:22 INFO     plugins.viessmann   viessmann: Update item: heizung.warmwasser.schaltzeiten.uzsu, item has been changed outside this plugin
                    2020-05-20  08:40:22 ERROR    lib.item            Item heizung.warmwasser.schaltzeiten.uzsu: problem running <bound method Viessmann.update_item of <plugins.viessmann.Viessmann object at 0x65477e50>>: 'str' object does not support item assignment
                    Traceback (most recent call last):
                      File "/usr/local/smarthome/lib/item.py", line 2368, in __update
                        method(self, caller, source, dest)
                      File "/usr/local/smarthome/plugins/viessmann/__init__.py", line 341, in update_item
                        self._uzsu_dict_to_viess_timer(timer_app, uzsu_dict)
                      File "/usr/local/smarthome/plugins/viessmann/__init__.py", line 1025, in _uzsu_dict_to_viess_timer
                        timer[commandname] = [{'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}] #listenkopie
                    TypeError: 'str' object does not support item assignment
                    Die von Dir eingebaute Debugausgabe kommt nicht. Der Fehler tritt wahrscheinlich schon früher auf.

                    Ich probier nochmal was.

                    Kommentar


                      #55
                      Zieh mal die Debugzeile vor timer[commandname] = ... und schau bitte nochmal.

                      Kommentar


                        #56
                        Zitat von Morg Beitrag anzeigen
                        Zieh mal die Debugzeile vor timer[commandname] = ... und schau bitte nochmal.
                        Code:
                        2020-05-20  09:30:49 DEBUG    plugins.viessmann   viessmann: Commandname in process: Timer_Warmwasser_Mo.
                        2020-05-20  09:30:49 DEBUG    plugins.viessmann   viessmann: DEBUG commandname is <class 'str'> (Timer_Warmwasser_Mo), timer is <class 'str'> (Timer_Warmwasser)

                        Kommentar


                          #57
                          Zitat von Morg Beitrag anzeigen
                          Zieh mal die Debugzeile vor timer[commandname] = ... und schau bitte nochmal.
                          Hab den Fehler gefunden.

                          Es gabe 2x die Variable timer, einmal als str (erste Zuweisung) und dann als (dict).
                          Nun klappt es.

                          Wenn alles soweit läuft, würde ich Dir das Plugin nochmal senden, vielleicht kannst Du den Code mal prüfen.
                          Danke dir!

                          Kommentar


                            #58
                            Klar, mach das.

                            Kommentar


                              #59
                              Zitat von Morg Beitrag anzeigen
                              Klar, mach das.
                              Here it is:


                              DANKE
                              Angehängte Dateien

                              Kommentar


                                #60
                                Da ich das mit den Timern hier nicht testen kann - das läuft bei dir, und soweit fehlerfrei?

                                Ich habe jetzt den Code und die Kommentare nochmal komplett durchgesehen.

                                Dazu habe ich folgendes geändert:
                                • alle Methoden mit Docstrings versehen und ggf. alte Kommentare entfernt
                                • Log-Meldungen vereinheitlich und "verenglischt"
                                • Code teilweise angepasst/überarbeitet
                                • einige Funktionen umbenannt, so dass die Namen besser zur Funktion passen
                                • in _viess_dict_to_uzsu_dict() das "feste" Vorgabe-UZSU-Dict geändert, so dass Sonnenaufgangs- und -untergangszeiten aus env.location gelesen werden. (Falls das fehlschlagen sollte, fix 6 und 21 Uhr)
                                Weiterhin habe ich an einigen Stellen noch Kommentare in Form von

                                # TODO: xxx

                                eingefügt. Diese sollten berücksichtigt/umgesetzt werden, bevor das Plugin in einen PR auf develop geht; die Sachen gehören mE nicht in ein "fertiges" bzw. öffentliches Plugin in so einem Projekt. Das beinhaltet die Versionsnummer, "interne" Debug-Logmeldungen zur Fehlersuche und einige Kommentare.

                                Bitte probiere zur Sicherheit noch mal aus, dass die ganzen Timer-Funktionen immer noch gehen
                                Angehängte Dateien
                                Zuletzt geändert von Morg; 20.05.2020, 15:50.

                                Kommentar

                                Lädt...
                                X