NEWS
Datenpunkt erstellen und im Anschluss sofort nutzen
-
@bananajoe nutze await/async. Ich such dir mal was raus wie ich das mache.
hier mal ein Fragment wie ich es in fast allen meinen Skripts mittlerweile nutze
-
@dslraser hatte ich schon probiert, funktioniert nicht
-
@fastfoot sieht gut aus, teste ich und melde mich dann wieder
-
@bananajoe sagte in Datenpunkt erstellen und im Anschluss sofort nutzen:
@dslraser hatte ich schon probiert, funktioniert nicht
Ich habe es auch probiert und es hat funktioniert.
Besser ist aber sicher die Variante von @fastfoot -
@bananajoe sagte in Datenpunkt erstellen und im Anschluss sofort nutzen:
@dslraser hatte ich schon probiert, funktioniert nicht
14.4.2021, 22:30:53.699 [info ]: javascript.0 (11217) Stop script script.js.99_Test.DP 14.4.2021, 22:30:53.714 [info ]: javascript.0 (11217) Start javascript script.js.99_Test.DP 14.4.2021, 22:30:53.719 [info ]: javascript.0 (11217) script.js.99_Test.DP: registered 0 subscriptions and 0 schedules 14.4.2021, 22:30:53.719 [info ]: javascript.0 (11217) script.js.99_Test.DP: State existiert nicht ! 14.4.2021, 22:30:54.720 [info ]: javascript.0 (11217) script.js.99_Test.DP: Init Wert: eins 14.4.2021, 22:30:56.726 [info ]: javascript.0 (11217) script.js.99_Test.DP: neuer Wert: zwei
EDIT: Test Blockly nochmal erweitert...
-
@dslraser sagte in Datenpunkt erstellen und im Anschluss sofort nutzen:
@bananajoe sagte in Datenpunkt erstellen und im Anschluss sofort nutzen:
@dslraser hatte ich schon probiert, funktioniert nicht
Ich habe es auch probiert und es hat funktioniert.
Besser ist aber sicher die Variante von @fastfootdie xxxStateAsync() Funktionen sind relativ neu im JS-Controller. Sie ermöglichen in Verbindung mit
await
auf das Ende der Ausführung zu warten, gleichzeitig blockiert dieses Warten aber nicht das gesamte restliche System, d.h. jegliche Events werden trotzdem abgearbeitet. Natürlich müsste man das nicht so aufblähen wie im Beispiel, es ist speziell als 'Vorspann' für Skripte gedacht, so dass sichergestellt ist dass benötigte Datenpunkte verfügbar sind. Zu beachten ist dassawait
nur in einer Funktion aufgerufen werden darf die mitasync
definiert wurde. Meines Wissens nach bietet Blockly (noch?) kein createStateAsync(), man müsste das dann dort mit einer JS-Function machen. Ein Timeout birgt immer die Gefahr dass er zu kurz ist, wählt man ihn zu groß dann ärgert man sichMit await/async spart man sich dieses Ärgernis...
Hier noch ne Minimalversion:
let idKey = "0_userdata.0.test.MyDP"; let dp = {"name":"Daten","type":"string","role":"","read":true,"write":true,"desc":"von Skript erstellt","def":""}; async function test(){ await createStateAsync(idKey, dp); setState(idKey, 'Mein Wert'); }
-
@fastfoot
vielen Dank für Deine Beispiele.
Bisher habe ich das Script benutzthttps://github.com/Mic-M/iobroker-createUserStates
bzw.
https://github.com/Mic-M/iobroker-createUserStates/blob/master/createUserStates.js
-
@dslraser sagte in Datenpunkt erstellen und im Anschluss sofort nutzen:
Bisher habe ich das Script benutzt
https://github.com/Mic-M/iobroker-createUserStatesIch kenne das Skript kaum, denke aber der Hauptfokus lag seinerzeit auf der Erstellung in 0_userdata.0, was nicht vom JS Adapter unterstützt wurde. Das Skript arbeitet auch noch mit Timeout. Schön zu sehen wie sehr sich iobroker weiterentwickelt hat, wenn man es vergleicht mit den paar Zeilen meines ersten Beispiels. Wäre sehr interessant zu erfahren was der Autor dazu zu sagen hat, evtl. hat es auch heute noch seine Berechtigung, das kann ich nicht beurteilen. Für meine Anwendungen reicht aber das was ich gepostet habe vollkommen aus
-
@bananajoe Hallo, ich gehe da einen pragmatischen Weg: nach dem Erstellen der States frage ich ab, ob der letzte State bereits existiert und starte das Skript neu, bis er erstellt wurde:
createState("javascript.0.Testumgebung.Test1", "Eins", { type: 'string', read: true, write: true }); createState("javascript.0.Testumgebung.Test2", "Zwei", { type: 'string', read: true, write: true }); // Restart, wenn letzter State noch nicht geschrieben if(!existsState("javascript.0.Testumgebung.Test2")) runScript();
Da das Neustarten nur beim ersten Anlegen der Datenpunkte passiert, stört es nicht weiter.
-
@grrfield sagte in Datenpunkt erstellen und im Anschluss sofort nutzen:
if(!existsState("javascript.0.Testumgebung.Test2")) runScript();
Da das Neustarten nur beim ersten Anlegen der Datenpunkte passiert, stört es nicht weiter.
Cool, Skripte können sich selbst neu starten. Wieder was gelernt.