NEWS
[Gelöst] Probleme mit setState auf Raspberry Pi
-
Hallo zusammen,
ich mache gerade meine ersten Schritte mit Skripten in ioBroker und habe folgendes Problem:
Für bestimmte getriggerte Ereignisse möchte ich die Zeitpunkte in globalen Variablen speichern. Zum Testen habe ich dazu folgendes Skript erstellt:
__setState('d', new Date(), true);
console.log ("Datum: "+getState('d').val);__ Zusätzlich in einem globalen Skript:
createState ('d'); Ich habe ioBroker auf einem Raspberry Pi (Modell B Rev. 2) und auf einem Windows-Rechner installiert.
Das Skript arbeitet unter Windows fehlerfrei, das aktuelle Datum wird (spätestens nach dem zweiten Durchlauf des Skriptes) auf der Konsole geloggt angezeigt. Durch die Nebenläufigkeit der Ausführungen im Zweifelsfall die Zeit vom vorherigen Aufruf des Skriptes. Das spielt aber hier auch keine Rolle, denn eigentlich will ich ja nur den Wert in der Variablen speichern und das funktioniert ja.
Auf dem Raspberry Pi allerdings bleibt die Variable d immer leer. Sobald ich den setState-Befehl ändere zu
setState('d', (new Date()).toString(), true)
wird das Datum als String korrekt in die Variable geschrieben. Das ist aber eigentlich nicht Ziel der Sache, da ich das Datum zu einem späteren Zeitpunkt weiterverarbeiten möchte und mir der String da nicht direkt weiterhilft.
Kann jemand mein Problem verstehen und mir eine Lösung verraten? Oder muss ich ganz anders an die Sache herangehen?
Vielen Dank schon mal im Voraus für eure Unterstützung.
Timo
-
"new Date()" ist ein Objekt und das kann nur in States mit dem richtigen Typ gespeichert werden. Von daher ist Dein Ansatz mit new Date()).toString() korrekt.
Beim lesen machst Du einfach
new Date(getState('d').val)
und Du hast wieder das Date-Objekt.
-
Vielen Dank für die schnelle Lösung!
Du schreibst ja richtigerweise "new Date()" ist ein Objekt" und das dies nur in States mit dem richtigen Typ gespeichert werden kann.
Mir stellt sich daher die Frage, wie bekomme ein State mit dem Typ Date? Versuche dies beim Anlegen mit createState und direkter Initialisierung zu schaffen, waren bei mir nicht erfolgreich. Wenn das möglich wäre, müsste man ja nicht die doppelte Typkonvertierung durchführen.
Gibt es noch einen Tipp dazu?
-
Ich denke an der Stelle das es gar nicht geht da Date formal eine "Objektinstanz" ist. ioBroker kann "Daten" speichern.
Also ein eigenes Objekt was nur Daten hält geht mit dem ioBroker-Datentyp "object". Das wird dann von ioBroker automatisch in JSON-konvertiert und so gespeichert und wieder rausgeholt und zurückkonvertiert. Damit ist der "Objektsupport" auf "Datenobjekte" begrenzt.
"Date" als Instanz ist aber nicht serialisierbar bzw in "JSON"-Konvertierbar und kann daher nicht direkt gespeichert werden - wäre auch von einer "Key-Value-Storage-Schicht" wie wir hier haben etwas viel verlangt
-
Ok, das mit der JSON-Konvertierbarkeit von Date hab ich nicht gewusst. Dann ist ja alles klar.
Nochmals besten Dank!