NEWS
Dynamisch erstellte Variablen.
Dynamisch erstellte Variablen.
-
@codierknecht
ja dann ist alles beieinander und im debuggingfall lässt sich das leicht ausgeben -
@OliverIO: Warum wird die function ausfuehren_nach-timeout nie ausgeführt? wo liegt der Haken?
& vielen Dank für das (eigentlich) gemachte Bettchen, dass ich als Vorlage verwendet habe.Es ist noch zuviel drin. timer_dp hat z.B. noch keinen Zweck.
var timer_dauer_in_sek, timer_name, timer_dauer_in_millisek, timer_minuten, timer_sekunden, timer_trigger_array, timer1_name; async function multitimer_function(timer_name, timer_dauer_in_millisek) { console.log('...js-start'); var multitimer = { "hobbyraum_timer": { "timer_dp":"0_userdata.0.KG.Hobbyraum.Timer1", "timer": null }, "abstellraum_timer": { "timer_dp":"0_userdata.0.KG.Abstellraum.Timer1", "timer": null }, "hauswirtschaftsraum_timer": { "timer_dp":"0_userdata.0.KG.Hauswirtschaftsraum.Timer1", "timer": null }, "technikraum_timer": { "timer_dp":"0_userdata.0.KG.Technikraum.Timer1", "timer": null }, "kg-flur_timer": { "timer_dp":"0_userdata.0.KG.KG-Flur.Timer1", "timer": null }, "kg-treppe_timer": { "timer_dp":"0_userdata.0.TR.KG-Treppe.Timer1", "timer": null }, } function tueroeffnung_ohne_bewegung(timer_name) { var timer_parameters = multitimer['hobbyraum_timer']; // stoppt den "timer": (function () { if (timer_parameters['timer']) { clearTimeout(timer_parameters['timer']); timer_parameters['timer'] = null; } })(); // "timer" wird gesetzt: timer_parameters['timer'] = setTimeout(async function () { await ausfuehren_nach_timeout(timer_name); console.log('.........................'); }, parseInt(timer_dauer_in_millisek)); } console.log('...js-ende'); } async function ausfuehren_nach_timeout(timer_name) { console.log((String(timer_name) + ' ist abgelaufen')); } timer_dauer_in_sek = 0.3; timer_dauer_in_millisek = parseFloat(timer_dauer_in_sek) * 1000; timer_trigger_array = ['hobbyraum_timer', 'abstellraum_timer', 'hauswirtschaftsraum_timer', 'technikraum_timer', 'kg-flur_timer', 'kg-treppe_timer']; for (var timer_name_index in timer_trigger_array) { timer_name = timer_trigger_array[timer_name_index]; console.log(timer_name); timer_name = timer_name; await multitimer_function(timer_name, timer_dauer_in_sek); await wait(1000); } -
@OliverIO: Warum wird die function ausfuehren_nach-timeout nie ausgeführt? wo liegt der Haken?
& vielen Dank für das (eigentlich) gemachte Bettchen, dass ich als Vorlage verwendet habe.Es ist noch zuviel drin. timer_dp hat z.B. noch keinen Zweck.
var timer_dauer_in_sek, timer_name, timer_dauer_in_millisek, timer_minuten, timer_sekunden, timer_trigger_array, timer1_name; async function multitimer_function(timer_name, timer_dauer_in_millisek) { console.log('...js-start'); var multitimer = { "hobbyraum_timer": { "timer_dp":"0_userdata.0.KG.Hobbyraum.Timer1", "timer": null }, "abstellraum_timer": { "timer_dp":"0_userdata.0.KG.Abstellraum.Timer1", "timer": null }, "hauswirtschaftsraum_timer": { "timer_dp":"0_userdata.0.KG.Hauswirtschaftsraum.Timer1", "timer": null }, "technikraum_timer": { "timer_dp":"0_userdata.0.KG.Technikraum.Timer1", "timer": null }, "kg-flur_timer": { "timer_dp":"0_userdata.0.KG.KG-Flur.Timer1", "timer": null }, "kg-treppe_timer": { "timer_dp":"0_userdata.0.TR.KG-Treppe.Timer1", "timer": null }, } function tueroeffnung_ohne_bewegung(timer_name) { var timer_parameters = multitimer['hobbyraum_timer']; // stoppt den "timer": (function () { if (timer_parameters['timer']) { clearTimeout(timer_parameters['timer']); timer_parameters['timer'] = null; } })(); // "timer" wird gesetzt: timer_parameters['timer'] = setTimeout(async function () { await ausfuehren_nach_timeout(timer_name); console.log('.........................'); }, parseInt(timer_dauer_in_millisek)); } console.log('...js-ende'); } async function ausfuehren_nach_timeout(timer_name) { console.log((String(timer_name) + ' ist abgelaufen')); } timer_dauer_in_sek = 0.3; timer_dauer_in_millisek = parseFloat(timer_dauer_in_sek) * 1000; timer_trigger_array = ['hobbyraum_timer', 'abstellraum_timer', 'hauswirtschaftsraum_timer', 'technikraum_timer', 'kg-flur_timer', 'kg-treppe_timer']; for (var timer_name_index in timer_trigger_array) { timer_name = timer_trigger_array[timer_name_index]; console.log(timer_name); timer_name = timer_name; await multitimer_function(timer_name, timer_dauer_in_sek); await wait(1000); }@ptr
Im Detail muss ich das morgen mal ausprobieren.
Generell sehe ich in deinem Code aber 2 Problembereiche zu dem du dir die Konzepte mal nochmal durchlesen solltest- scope
https://developer.mozilla.org/en-US/docs/Glossary/Scope?retiredLocale=de
Du definierst manche variablen innerhalb von Funktionen (bspw multitimer) obwohl ich den Eindruck habe das sie außerhalb einer Funktion definiert werden sollte.
Im verlinkten Artikel liest du, das variablen immer nur sichtbar innerhalb eines scopes sind und von außerhalb nicht adressierst ist.
Dann gibt es noch den asynchronen Funktionsausfall, der ebenfalls eine andere Art von scope erzeugt, wie man eigentlich so erwartet.
Wird ein scope verlassen, bspw weil die Funktion abgearbeitet ist, dann wird der scope zerstört und die Daten sind verloren. Beim erneuten Aufruf der Funktion wird ein neuer scope erzeugt. Die früheren darin verfügbaren Daten sind weg.
Auch deine mehrfach ineinander verschachtelten Funktionen sind schon möglich. Als Anfänger würde ich das aber nicht machen, da sonst der Überblick über die scopes schwierig ist und uU den Kopf zur Explosion bringt.
Mit einem guten debugger sieht man das (bspw vs Code). Aber die scriptoberfläche von Iobroker ist da nicht sought geeignet.- Verwendung von promises, await und async
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise?retiredLocale=de
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
Await kann nur bei Funktionen verwendet werden, die auch ein promise zurückgeben. Settimeout gibt aber nur das Timer Handle zurück. Daher funktioniert await da nicht.
Wenn du eine strikte Reihenfolge bestimmter Schritte als Ergebnis von asynchroner Abarbeitung einhalten willst musst du dich erst recht noch mehr mit promises beschäftigen, da das der Mechanismus der Wahl dafür ist.
- scope