smarthomeNG / smarthome

Device integration platform for your smart home
https://www.smarthomeNG.de
GNU General Public License v3.0
122 stars 91 forks source link

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

Closed stoepf closed 1 year ago

stoepf commented 1 year ago

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 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'

wvhn commented 1 year ago

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 1 year ago

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 1 year ago

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 1 year ago

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 1 year ago

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 1 year ago

SmartHomeNG v1.9.4 has been released