NEWS
Fehlendes Anfaengerwissen
-
Hi.
Bin relativ neu mit ioBroker. Konnte bisher MQTT mit ioBroker kombinieren und ueber vis anzeigen.
Nun moechte ich noch ein wenig Logik in meine Applikation reinbringen. Meine Idee: einen ganz einfachen Timer. Startzeit, Zwischenzeiten etc. sollen dann in einer Tabelle ueber die Visualisierung angezeigt werden. Habe dazu nun den Javascript Adpater installiert. Scheitere nun allerdings schon an den Grundfunktionen. Habe ein paar Variablen (Boolean Datenpunkte) unter "0_userdata.0.JS_Timer" eingetragen. Kann ueber vis die Variable steuern.
Wenn ich nun aber eine Textvariable veraendern moechte (ausgeloest mit dem on-Event change any), funktioniert alles kein einziges mal. Es scheint, als ob das Programm nur ein einziges Mal ausgefuehrt wird. Hatte auch mal einen Zeitplan "jede Sekunde" probiert. Auch hier kein anderes Verhalten.
on( {id: '0_userdata.0.JS_Timer.xTimerStart.STATE', change: 'any'}, function (obj) { setState('0_userdata.0.JS_Timer.sMyTestText', "Status wird sich aendern") if (getState("0_userdata.0.JS_Timer.xTimerStart.STATE").val==true) { setState('0_userdata.0.JS_Timer.sMyTestText', "StatusAn") } else { setState('0_userdata.0.JS_Timer.sMyTestText', "StatusAus") } );
Bin mir sicher, dass ich grundsaetzlich etwas verkehrt mache. Konnte bisher nichts zu irgendwelchen Grundlagen finden.
Objekt/Variable javascript.0.scriptEnabled.JS_Timer = true
Was mache ich falsch?
Danke fuer die Hilfe,
Michl
-
Such Mal bei YouTube nach iobroker / Blockly.
Auch wenn Du das in JS machen willst geben die Blockly Videos einen guten Überblick wie das alles funktioniert.
Speziell die "Trigger" sind da wichtig. Ohne Trigger läuft ein Script nur 1 Mal beim Einschalten ab.
-
@michl sagte in Fehlendes Anfaengerwissen:
(getState("0_userdata.0.JS_Timer.xTimerStart.STATE").val
Versuch mal, statt
getState("0_userdata.0.JS_Timer.xTimerStart.STATE").val
auf das übergebene Objekt mitobj.state.val
zuzugreifen.
DasgetState
ist an der Ecke unnötig und benötigt mehr Ressourcen.Mit
change:'any'
reagiert der Trigger auf jede Aktualisierung. Also auch dann, wenn sich der Wert gar nicht ändert.
Ich würde stattdessenchange:'ne'
verwenden, um nur auf Änderungen zu reagieren. -
@michl sagte in Fehlendes Anfaengerwissen:
Konnte bisher nichts zu irgendwelchen Grundlagen finden.
Was ich dir zum Thema JS in ioBroker empfehlen kann ist diese Seite https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md
empfehlen. -
@asgothian @Codierknecht @Albert-K
Vielen Dank fuer eure Tipps und Ratschlaege. Der Einstieg ueber Blockly (mit ein paar YouTube Videos) hatten zum Einstieg geholfen. Hier war das Umschalten auf JavaScript der naechste Schritt das kleine Beispielprogramm zu loesen. Hier konnte ich ein paar weitere Argumente fuer den "on"-Baustein finden.Es war nicht noetig einen Timer (z.B. jede Sekunde) aufzurufen. Das war ja auch eine meiner Fragen.
Hier das funktionierende Programm:
on({id: [].concat(['0_userdata.0.JS_Timer.xTimerStart']), change: "ne"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; var Status = getState("0_userdata.0.JS_Timer.xTimerStart").val; if (Status) setState("0_userdata.0.JS_Timer.sMyTestText", 'StatusON'); else setState("0_userdata.0.JS_Timer.sMyTestText", 'StatusOFF'); });
Dankeschoen!
Michl -
@michl
Das nochmalige Lesen des Status in Zeile 5 kannst Du Dir sparen. Mitvalue
ist der Wert ja bereits bekannt.