Closed stoepf closed 1 year ago
Ursache ist wahrscheinlich, dass im JSON das datetime-Objekt nicht ausgewertet ist.:
{'cmd': 'series', 'series': [(1672386364233, 24.3), (1672386665008, 24.3), (1672386965805, 24.4), (1672387266567, 24.5), (1672387567398, 24.0), (1672387567398, 24.0), (1672387714496, 24.0)], 'sid': 'env.system.memory.percent|raw|1h|now|100', 'params': {'update': True, 'item': 'env.system.memory.percent', 'func': 'raw', 'start': 1672387714496, 'end': 'now', 'step': 36000, 'sid': 'env.system.memory.percent|raw|1h|now|100'}, 'update': datetime.datetime(2022, 12, 30, 9, 9, 10, 501995, tzinfo=tzfile('/usr/share/zoneinfo/Europe/Berlin'))}
.
Hier müsste entweder das datetime-Objekt in Anführungszeichen stehen
'update': 'datetime.datetime(2022, 12, 30, 9, 9, 10, 501995, tzinfo=tzfile("/usr/share/zoneinfo/Europe/Berlin")'
oder (sinnvoller) als Ergebnis:
'update' : '2022-12-30T09:09:10Z+01:00'
Beim Kommando "series_cancel" ist dies in den Log-Infos des Websocket-Moduls auch zu beobachten:
2023-01-17 14:06:54 INFO modules.websocket cancel_series: reply={'cmd': 'series', 'series': [(1673874414093, 63057920.0), ... komplette Datenreihe ... (1673960505797, 63287296.0)], 'series_ext': [(1673960806658, 63287296.0), (1673960814098, 63287296.0)], 'sid': 'env.core.memory|avg|1d|now|100', 'params': {'update': True, 'item': 'env.core.memory', 'func': 'avg', 'start': 1673960814098, 'end': 'now', 'step': 864000, 'sid': 'env.core.memory|avg|1d|now|100'}, 'update': datetime.datetime(2023, 1, 17, 14, 21, 18, 203993, tzinfo=tzfile('/usr/share/zoneinfo/Europe/Berlin'))}
2023-01-17 14:06:54 INFO modules.websocket cancel_series: self.sv_update_series={'192.168.2.112:52100': {'env.core.memory|avg|1d|now|100': {'update': datetime.datetime(2023, 1, 17, 14, 21, 3, 800367, tzinfo=tzfile('/usr/share/zoneinfo/Europe/Berlin')), 'params': {'update': True, 'item': 'env.core.memory', 'func': 'avg', 'start': 1673960799779, 'end': 'now', 'step': 864000, 'sid': 'env.core.memory|avg|1d|now|100'}}}}
Von Andre kam folgender Lösungsvorschlag:
Im DB-Plugin in Zeile 885
'update': self.shtime.now() + datetime.timedelta(seconds=int(logs['step'] / 1000))
in
'update': str(self.shtime.now() + datetime.timedelta(seconds=int(logs['step'] / 1000)))
ändern.
Dies hier zur weiteren Diskussion.
Das ist kein Bug. Der Eval Syntax Checker bildet exakt nach, was im eval passiert und eval würde auf genau den selben Fehler laufen.
Das Executor Plugin stellt eine andere Umgebung zur Verfügung und kann daher auch mit obigem Problem umgehen (eval jedoch nicht).
Für viele (aber nicht alle) ähnlich gelagerte Probleme (Syntax Checker meldet Error) kann man das Problem lösen, indem man den Ausdruck im eval Checker noch in einen String wandelt.
Das stimmt natürlich im Hinblick auf den eval Syntax Checker. Aber ist es nicht trotzdem sinnvoller, im DB-Plugin die Update-Zeit im Klartext zu schreiben, so dass diese auch weiterverarbeitet werden kann?
Mit der Wandlung würde das zwar im eval funktionieren, aber funktioniert es auch in den weiteren Use cases, die Zeit-Rechnugn machen (z.b. Bereitstellung für die smartVISU) oder wäre es dafür ein breaking change?
Ich bin mit dem database Plugin zuwenig „verheiratet“, um sicher zu beurteilen, ob das an anderen Stellen breaken würde.
SmartHomeNG v1.9.4 has been released
Versucht man eine Serie von Daten aus der Datenbank auszulesen z.B. mit
sh.env.system.load.series('raw', '1h')
kommt es zu einer unspzeifischen Fehlermeldung "error". Im Log wird folgende Meldung ausgegeben:modules.admin.api_services REST_dispatch_execute: evalcheck: Object of type datetime is not JSON serializable
Workarounds über Executer-Pluginprint(sh.env.system.load.series('raw', '1h') )
oder Schreiben des Ergebnisses ins Log-Fileself.logger.warning(sh.env.system.load.series('raw', '1h')
sind möglich.