NEWS
States in Redis (States) DB die es in IOBroker nicht gibt.
-
Begrifflichkeiten: State: Zustand Object: Objekt
Ich habe kürzlich auf Redis für die States gewechselt und die vorherige DB migriert. Die ObjektDB habe ich auf JSONLines belassen.Ich habe leider Probleme mit den Selektoren - Selektoren geben bei mir einfach nicht immer alle States zurück - ich konnte bisher nicht rauskriegen an was das liegt.
Bei $("*") fehlen also oft viele States.
Deswegen habe ich als "Workaround" versucht mich direkt auf Redis zu verbinden und die States da zu lesen - klappt prima.
Allerdings treffe ich jetzt auf viele States die es in Redis gibt, aber in IOBroker nicht.
z.B. "io.0_userdata.0.ext.myScenes.0.devices.lights.Gästebad"
Dabei handelt es sich um einen State den es tatsöchlich früher mal gab, der inzwischen aber nicht mehr existiert. Dazu gibt es kein Objekt in IOBroker,(existsObject -> false) und es gibt keinen State in IOBroker (existsState -> false), allerdings existiert der Eintrag in der Redis DB.Wie kann das sein? Ich habe ca 13000 keys in Redis, und es scheint als wären viele davon veraltet.
Das riecht früher oder später nach Problemen. -
Zu dem Redis kann ich dir nicht helfen, aber definiere "es fehlen viele States". Ich finde per selektor 600 mehr als ich habe ^^
-
Also grundsätzlich sind "600 mehr als ich habe" auch irgendwie falsch, oder?
"Es fehlen States":
Ich kann es nicht genau eingrenzen. Es sind zeitweise nicht alle enthalten (Nicht alle die ich z.B. in der Admin/Objects Ansicht habe, und auch nicht alle die ich in Redis habe).
Irgendwann sind dann mal wieder plötzlich alle da. Ich konnte bisher nicht rausfinden was genau dazu führt, und wieso es dann wieder plötzlich korrekt ist. Eventl. ein falsch implementierter Cache, kaputte DB, ein Javascript Adapter Neustart, oder oder oder...Ich schaffe es leider auch nicht das Problem zuverlässig nachzustellen.
Zum Anwendungsfall:
Ich gebe Datenpunkten, die ich gerne als Alias hätte einen Namen wie alias.sensor.temperature.wohnzimmer. Ein Script läuft durch alle States, sucht nach Namen die mit alias. anfangen, und erstellt automatisch einen passenden Alias - und löscht alle anderen.Das geht natürlich mächtig schief, wenn ich keine zuverlässige Methode habe durch alle tatsächlich existierenden States zu loopen.
Dieses Problem gab es übrigens auch vor meinem Wechsel zu Redis. -
@coalado sagte: ein Javascript Adapter Neustart, oder oder oder...
Der Neustart der Javascript-Instanz synchronisiert den Puffer der JS-Instanz mit dem js-controller.
-
Das hängt davon ab, ob $() das selbe sind wie States in der Objektansicht. Ich denke mal die Zählung ist anders.
Ich weiß aber auch nicht genau wie der Javascript-Adapter in diesem Punkt funktioniert. z.B. bekommst bei einer Prüfungszählung mit
existsState()
eine andere Zahl raus als bei einer Prüfung mitawait existsStateAsync()
. Was ich aber vermute ist das der Javascript-Adapter Cache nicht synchron ist, wenn du States vermisst. -
@ticaki sagte: mit existsState()eine andere Zahl raus als bei einer Prüfung mit await existsStateAsync()
existsState() holt in der synchronen Version die Zustände aus dem Puffer der JS-Instanz, existsStateAsync() erhält - wie die asynchrone Version von existsState() - die Zustände vom js-controller.