Ankündigung

Einklappen
Keine Ankündigung bisher.

Viessmann Plugin Neuentwicklung Python Hilfe

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

  • Sisamiwe
    antwortet
    Zitat von Morg Beitrag anzeigen
    Ich vermute, wenn du Python3 direkt startest und
    Code:

    from datetime import datetime datetime.fromisoformat("2020-05-23")
    eingibst, kommt kein Fehler?
    Doch. Wenn ich auf meinen "produktiv RPI" in der Console Python3 starte, kommt der gleiche Fehler wie im Plugin.

    Code:
     [smarthome@SmartHomeNG ~]$ python3
    Python 3.5.3 (default, Sep 27 2018, 17:25:39)
    [GCC 6.3.0 20170516] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> from datetime import datetime
    >>> datetime.fromisoformat("2020-05-23")
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: type object 'datetime.datetime' has no attribute 'fromisoformat'
    >>>
    Edit:
    Ich habe mit mal die zur Verfügung stehenden Attribute anzeigen lassen:
    Code:
    >>> print(dir(datetime))
    ['__add__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',                                                                   '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__radd__', '__reduce__', '__reduce_ex_                                                                  _', '__repr__', '__rsub__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', 'astimezone', 'c                                                                  ombine', 'ctime', 'date', 'day', 'dst', 'fromordinal', 'fromtimestamp', 'hour', 'isocalendar', 'isoformat', 'isowee                                                                  kday', 'max', 'microsecond', 'min', 'minute', 'month', 'now', 'replace', 'resolution', 'second', 'strftime', 'strpt                                                                  ime', 'time', 'timestamp', 'timetuple', 'timetz', 'today', 'toordinal', 'tzinfo', 'tzname', 'utcfromtimestamp', 'ut                                                                  cnow', 'utcoffset', 'utctimetuple', 'weekday', 'year']
    fromisoformat ist nicht dabei.

    Edit2:

    Ich glaube, das Attribut "fromisoformat" ist erst mit Python 3.7 eingeführt worden.
    Mein ProduktivRPI läuft noch mit 3.5.3.

    Edit 3:
    Die Lösung: Ich habe die "fromisoformat" durch ein anderes Attribut erstetzt.

    Code:
    import dateutil.parser
    datestring = dateutil.parser.isoparse(value).strftime("%Y%m%d%w%H%M%S")
    Zuletzt geändert von Sisamiwe; 24.05.2020, 07:42.

    Einen Kommentar schreiben:


  • Morg
    antwortet
    Mich wundert das datetime.datetime kein fromisoformat haben soll. Welche Python-Version hast du denn installiert?

    Aus einem mir derzeit unklaren Grund passt da was nicht... ich hab das bei mir direkt im Python-Interpreter probiert, da ging es.

    Ich vermute, wenn du Python3 direkt startest und

    Code:
    from datetime import datetime
    datetime.fromisoformat("2020-05-23")
    eingibst, kommt kein Fehler?

    Du könntest noch vor der von dir genannten Zeile einfügen

    Code:
    self.logger.debug("value is '{}' and has type {}".format(value, type(value)))
    Ehrlicherweise erwarte ich da aber keine Überraschung, sondern "2020-05-23T16:06:02" und <class 'str'>...

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    Zitat von Morg Beitrag anzeigen
    Der Rest von _send_write_command() geht - korrekterweise - davon aus, dass du einen String übergibst. Ich würde mal versuchen, in TI die max und min rauszunehmen.
    habe ich gemacht. Nun funktioniert es bzw. es kommt nun zum gleichen Fehler, wie beim Setzen des Ferientages.

    Zitat von Morg Beitrag anzeigen
    kann ich so nicht sagen. Vielleicht könntest du dein Logging anpassen, gem. https://www.smarthomeng.de/user/konf...practices.html, Abschnitt Erweitertes Logging für die Plugin Entwicklung
    Hab ich gemacht. Das Log:
    Code:
    2020-05-23  16:06:36 DEBUG    plugins.viessmann update_item      update_item was called with item 'Systemzeit' from caller 'admin', source 'None' and dest 'None'
    2020-05-23  16:06:36 DEBUG    plugins.viessmann update_item      Got item value to be written: 2020-05-23T16:06:02 on command name Systemtime.
    2020-05-23  16:06:36 DEBUG    plugins.viessmann _send_write_command Got a new write job: Command Systemtime with value 2020-05-23T16:06:02
    2020-05-23  16:06:36 DEBUG    plugins.viessmann _send_write_command Command config: {'max_value': None, 'addr': '088E', 'len': 8, 'unit': 'TI', 'min_value': None, 'set': True}
    2020-05-23  16:06:36 DEBUG    plugins.viessmann _send_write_command Unit defined to TI with config{'unit_de': 'SystemTime', 'type': 'datetime', 'read_value_transform': 'non', 'signed': False}.
    2020-05-23  16:06:36 ERROR    plugins.viessmann _send_write_command Incorrect data format, YYYY-MM-DD expected; Error: type object 'datetime.datetime' has no attribute 'fromisoformat'
    2020-05-23  16:06:36 DEBUG    plugins.viessmann update_item      Write for Systemtime with value 2020-05-23T16:06:02 failed, reverting value, canceling followup actions
    Es scheint an Zeile 585 zu liegen "datestring = datetime.fromisoformat(value).strftime("%Y%m%d%w%H %M%S")"

    Einen Kommentar schreiben:


  • Morg
    antwortet
    Tja... da hakt es etwas in der Programmlogik.

    Du bekommst vom shng einen String im ISO-Datumsformat (im Log:"2020-05-23T13:12:55".

    In deinen Units ist für die Unit "TI" aber definiert, dass der Minimalwert 0 und der Maximalwert 1193045 ist.

    In Zeile 580 steht

    Code:
     if (min_allowed_value is None or min_allowed_value <= value) and (max_allowed_value is None or max_allowed_value >= value):
    und da min_allowed_value und max_allowed_value für TI definiert sind, wirft er dort nen Fehler.

    Die einfachere Lösung wäre, im TI-Format die min- und max-Werte zu löschen (None); der aufwändigere Weg, den Wert vorher (update_item?) in int bzw. timestamp zu konvertieren, dann den min/max-Check wie gehabt laufen zu lassen, und in _send_write_command() dann wieder einen (echten) datetime draus zu machen, der dann in Unit TI konvertiert wird.

    Der Rest von _send_write_command() geht - korrekterweise - davon aus, dass du einen String übergibst. Ich würde mal versuchen, in TI die max und min rauszunehmen.

    Zum zweiten Fehler:
    kann ich so nicht sagen. Vielleicht könntest du dein Logging anpassen, gem. https://www.smarthomeng.de/user/konf...practices.html, Abschnitt Erweitertes Logging für die Plugin Entwicklung

    Dann steht im Log, welche Funktion den Fehler erzeugt hat, das macht es ggf. noch einfacher.

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    Morg

    Super, dass Du dir da noch mal angeschaut und verbessert hast.

    Die neuen Funktionen mit dem Timer und der UZSU funktionieren, auch fehlerfrei. Probiere das aber weiter aus.
    EDIT: Habe noch einen Fehler gefunden. In Zeile 1145 muss es heißen:
    Code:
    for event, time in entry.items():
    ; dann klappt es.

    Folgendes ist mit nun an andere Stelle aufgefallen:
    Beim Schreiben von Datetime Objekten wie Systemtime oder Ferienprogramm meldet das Plugin einen Fehler.
    Korrigiert man die Systemtime im Backend, wirft das Plugin den Fehler:

    Code:
    2020-05-23  13:12:04 INFO     plugins.viessmann   viessmann: Update item: heizung.kessel.systemtime, item has been changed outside this plugin
    2020-05-23  13:12:04 DEBUG    plugins.viessmann   viessmann: update_item was called with item 'Systemzeit' from caller 'admin', source 'None' and dest 'None'
    2020-05-23  13:12:04 DEBUG    plugins.viessmann   viessmann: Got item value to be written: 2020-05-23T13:12:55 on command name Systemtime.
    2020-05-23  13:12:04 DEBUG    plugins.viessmann   viessmann: Got a new write job: Command Systemtime with value 2020-05-23T13:12:55
    2020-05-23  13:12:04 DEBUG    plugins.viessmann   viessmann: Command config: {'unit': 'TI', 'min_value': 0, 'set': True, 'max_value': 1193045, 'addr': '088E', 'len': 8}
    2020-05-23  13:12:04 DEBUG    plugins.viessmann   viessmann: Unit defined to TI with config{'read_value_transform': 'non', 'type': 'datetime', 'signed': False, 'unit_de': 'SystemTime'}.
    2020-05-23  13:12:04 DEBUG    plugins.viessmann   viessmann: create_write_command failed with error: unorderable types: int() <= str().
    2020-05-23  13:12:04 DEBUG    plugins.viessmann   viessmann: Write for Systemtime with value 2020-05-23T13:12:55 failed, reverting value, canceling followup actions
    Beim Setzen des Ferientage gibt es auch einen Fehler:
    Code:
    2020-05-23  13:23:02 ERROR    plugins.viessmann   viessmann: Incorrect data format, YYYY-MM-DD expected; Error: type object 'datetime.datetime' has no attribute 'fromisoformat'
    2020-05-23  13:23:02 DEBUG    plugins.viessmann   viessmann: Write for Ferien_Rückreisetag_M2 with value 2020-05-24 failed, reverting value, canceling followup actions

    Wenn ich den Codeteil alleine teste, funktioniert die Umwandlung.
    Ich bin mir sicher, dass die beiden Funktionen schon mal funktioniert haben und am Code nichts geändert wurde.
    Hast Du eine Idee?
    Zuletzt geändert von Sisamiwe; 23.05.2020, 12:44.

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    Zitat von Morg Beitrag anzeigen
    Klar, mach das.
    Here it is:


    DANKE
    Angehängte Dateien

    Einen Kommentar schreiben:


  • Morg
    antwortet
    Klar, mach das.

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


  • Morg
    antwortet
    Zieh mal die Debugzeile vor timer[commandname] = ... und schau bitte nochmal.

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:

Lädt...
X