smarthomeNG/smarthome

Bug: Eval Checker in admin interface can not handle result of sh.item.series

stoepf opened this issue · 7 comments

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-Plugin print(sh.env.system.load.series('raw', '1h') ) oder Schreiben des Ergebnisses ins Log-File self.logger.warning(sh.env.system.load.series('raw', '1h') sind möglich.

wvhn commented

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'

wvhn commented

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'}}}}
wvhn commented

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.

msinn commented

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.

wvhn commented

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?

msinn commented

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.

msinn commented

SmartHomeNG v1.9.4 has been released