NEWS
Javaskript Datenpunkt mit Zeit für schedule() umformen
-
@oliverio nicht nur, auch die Klammern sind wichtig eine meiner ersten Begegnungen mit await, deshalb springt mir sowas sofort ins Auge
-
@oliverio Danke für die Erläuterung, ich habe nach deinem ersten Post die Hilfe die im javascript-Adapter verlinkt ist nach split durchsucht und nichts gefunden. Der Teil zum Thema await war mir bislang nicht bekannt.
Um das ganze Thema noch zum Abschluss zu bringen, könnt ihr mir noch sagen wie ich die Konstanten für hour und minute noch ersetzen kann? Ich habe die Konstanten einfach durch zwei interne Variablen ersetzt, was irgendwie nicht klappt.
var h = 0 var m = 0 async function convertTime() { var time = (await getStateAsync('0_userdata.0.gardenaVentilbox.automatik.Startzeit')).val.split(":"); h = time[0]; m = time[1]; //console.log("Stunden: " + h); //console.log("Minuten: " + m); }; schedule({hour: h, minute: m}, function () { log("funktioniert"); });
-
du wirst schedule erneut aufrufen müssen um den zeitrythmus zu ändern.
den alten schedule musst du abmeldendas könnte ungefähr so aussehen (ungetestet,blind geschrieben, da können noch fehler drin sein
let mySchedule=null; on('0_userdata.0.gardenaVentilbox.automatik.Startzeit', function (obj) { let time = convertTime(); if (mySchedule) clearSchedule(mySchedule); mySchedule = schedule({hour: time[0], minute:time[1]}, function () { log("funktioniert"); }); }); async function convertTime() { return (await getStateAsync('0_userdata.0.gardenaVentilbox.automatik.Startzeit')).val.split(":"); };
immer wenn sich die zeit im datenpunkt ändert wird der code nach on aufgerufen
die zeit konvertiert
geprüft ob es schon ein altes schedule gibt, wenn ja abgemeldet
dann neues schedule gestartet und gemerkt
dann bis zur nächsten änderung gewartet -
Der Fall nach dem Neustart muss auch beachtet werden - also
let mySchedule=null; mySchedule = schedule({hour: time[0], minute:time[1]}, function () { log("Start nach Skriptstart"); }); on('0_userdata.0.gardenaVentilbox.automatik.Startzeit', function (obj) {
einmal nach dem
-
damit wir nix doppelt schreiben dann so
bei dem async vor function newSchedule bin ich mir unsicher.let mySchedule = newSchedule(); on('0_userdata.0.gardenaVentilbox.automatik.Startzeit', function (obj) { if (mySchedule) clearSchedule(mySchedule); mySchedule=newSchedule(); }); function newSchedule() { let time = convertTime(); return schedule({hour: time[0], minute:time[1]}, function () { log("funktioniert"); }); } async function convertTime() { return (await getStateAsync('0_userdata.0.gardenaVentilbox.automatik.Startzeit')).val.split(":"); };
-
Ich habe den Code übernommen und eine neue Logzeile eingefügt und das Skript wird ohne Fehlermeldung gespeichert. Die Änderung meiner Zeiteingabe wird erkannt und laut log funktioniert das Skript bis zur Zeile 9, hier erscheint die Fehlermeldung "javascript.0 (1535) script.js.common.gardenaVentilbox.ansteuerungVentilbox: schedule(cron=[object Object]): cannot create schedule"
on('0_userdata.0.gardenaVentilbox.automatik.Startzeit', function (obj) { log("neue Zeiteingabe erkannt"); let time = convertTime(); log("Zeitfunktion abmelden") if (mySchedule) clearSchedule(mySchedule); mySchedule = schedule({hour: time[0], minute: time[1]}, function () { log("neue Zeitfunktion anlegen"); }); });
-
let mySchedule = newSchedule(); on('0_userdata.0.gardenaVentilbox.automatik.Startzeit', function (obj) { if (mySchedule) clearSchedule(mySchedule); mySchedule=newSchedule(); }); function newSchedule() { let time = convertTime(); return schedule({hour: time[0], minute:time[1]}, function () { log("funktioniert"); }); } async function convertTime() { return (await getStateAsync('0_userdata.0.gardenaVentilbox.automatik.Startzeit')).val.split(":"); };
23:07:24.887 error javascript.0 (1535) script.js.common.gardenaVentilbox.ansteuerungVentilbox: ReferenceError: Cannot access 'mySchedule' before initialization
Für mich wird's langsam kompliziert....danke für die Nerven
-
@guybrushthreepwood-0 sagte: Für mich wird's langsam kompliziert
Ich würde es so machen:
const idStartzeit = '0_userdata.0.gardenaVentilbox.automatik.Startzeit'; let mySchedule = null; function startSchedule(time) { time = time.split(':'); mySchedule = schedule({hour: time[0], minute:time[1]}, function () { log("funktioniert"); }); } startSchedule(getState(idStartzeit).val); // Skriptstart on(idStartzeit, function(dp) { if (mySchedule) clearSchedule(mySchedule); startSchedule(dp.state.val); });
-
@paul53 Hat auf anhieb funktioniert...danke !
-
@paul53 Hallo nochmal, ich habe noch eine Frage zum Skript. Ich kann noch nicht nachvollziehen was in Zeile 13 mit dem "dp" gemeint ist. Hier wird einfach der Wert aus idStartzeit übergeben? Anschließend die bestehende schedule gelöscht und eine neue mit dem Aufruf der Funktion startSchedule angelegt.
-
@guybrushthreepwood-0 sagte: mit dem "dp" gemeint ist. Hier wird einfach der Wert aus idStartzeit übergeben?
dp
enthält das komplette Datenpunkt-Objekt von "0_userdata.0.gardenaVentilbox.automatik.Startzeit".dp.state.val
enthält den Wert, also die Startzeit.