NEWS
ClearTimeout auf Var Object möglich?
-
Mal wieder ein Punkt, an dem ich hänge
Kann man ein clearTimeout auf ein var Objekt (oder meinetwegen auch array) durchführen?
var hueTimer = {}; function hueQueuesAnlegen (){ var x; for (x in hueGruppen) { // x ist der erste Wert [0] im Array, hier der String des Gruppennamens hueTimer[x] = null; } } ... hueTimer[gruppenname] = setTimeout(function() { .... clearTimeout(hueTimer[gruppenname]);
Das clearTimeout() hat keinerlei Auswirkungen.
Die Frage ist, geht das überhaupt, was ich vorhabe?
Der ganze Code:
! ```
`// Funktionen für den Philips hue Adapter
//
// - definiert eigene Gruppen us Lampen und Gruppen der Bridge, unabhängig von den Gruppen der Bridge
// - definiert diverse Presets, die für Gruppen gesetzt werden können
//
//
// Funktionen:
//------------
// function hueGruppe (gruppe,preset,verzögerung,bri)
// - gruppe: Gruppenname
// - preset: Presetname
// - verzögerung: (keine Pflicht, schaltet das Preset nach der Verzögerungszeit in ms ein -> nach der Zeit des letzetn aktiven Presets in der Queue)
// - bri: (keine pflicht, überschreibt eine bri (Helligkeit) eines Presets, wenn ein Wert im Preset vorhanden ist
//
//
//
// geplant:
//---------
// - viele Standard Presets
// - ggf. vordefinierte Effekte (Abfolgen von Presets oder Farbveläufen)
// - ...
//
// umgesetzt:
//-----------
// - für einzelne Lampen, identisch wie für Gruppen -> Gruppe mit einer einzelnen Lampe anlegen
// - Queue für die zeitliche verzögerung (automatisch je Gruppe)
// - Abfangen von Tippfehlern (Gruppennamen, Preset)
// - die schon abgelaufene Zeit wird bei neuer Verzögerung berücksichtigt
//
! // Konfiguration:
//------------------------------------------------------------------------------
var hueMinDelay = 300; // min. males Delay zwischen zwei Farbwechsel
! // hue IDs (Channel) - Namen können frei vergeben werden
// hue Lampen
var idHueGästebadVorne = "hue.0.Philips_hue.20.1_Gästebad_Vorne"; /Philips_hue.20.1_Gästebad_Vorne/
var idHueGästebadHinten = "hue.0.Philips_hue.20.2_Gästebad_Hinten"; /Philips_hue.20.2_Gästebad_Hinten/
var idHueWohnzimmerKugel = "hue.0.Philips_hue.10.4_Wohn_Kugel"; /Philips_hue.10.4_Wohn_Kugel/
var idHueArbeitszimmerSchreibtisch = "hue.0.Philips_hue.50.1_Arbeit_Schreibtisch"; /Philips_hue.50.1_Arbeit_Schreibtisch/
// hue Gruppen der Bridge
var idhueGruppeWohnzimmer = "hue.0.Philips_hue.Wohnzimmer_Küche"/Philips_hue.Wohnzimmer_Küche/;
! var hueGruppen = {};
// hue Gruppen im Script (Zuordnung von 1-x Lampen/Gruppen der Bridge, auch gemischt)
// wo hue Gruppen in der Bridge vorhanden sind, ist es sinnvoll diese zu nutzen (Performance der Bridge) und hier einzutragen
hueGruppen["arbeitszimmer"] = [idHueArbeitszimmerSchreibtisch];
hueGruppen["wohnzimmer"] = [idHueWohnzimmerKugel];
hueGruppen["gästebad"] = [idHueGästebadVorne, idHueGästebadHinten];
! hueGruppen["wohnzimmerGruppe"] = [idhueGruppeWohnzimmer];
! var hueParameter = ["on","hue","sat","bri","ct","xy","alert","effect","r","g","b","colormode"];
! var huePresets = {
"standard": {"hue":14922,"sat":144,"bri":254,"effect":"none","alert":"none"}, // Standardfarbe der hue bei Power on
"blue": {"hue":47125,"sat":254,"bri":254}, // blau
"red": {"r":255,"g":0,"b":0,"bri":254}, // rot
"on": {
"on": true
},
"off": {
"on": false
},
"effectColorloop": {
"effect": "colorloop"
},
"effectOff": {
"effect": "none"
},
"alertOn": {
"alert": "select"
},
"alertOff": {
"alert": "none"
},
"test2": {
"hue": 24000,
"sat": 254,
"bri": 254,
"effect": "none",
"alert": "none"
},
"test": {
"hue": 5000,
"sat": 254,
"bri": 254,
"effect": "none",
"alert": "none"
}
};
! // Variablen für die Funktionen
! var hueWarten = []; // Wartezeit je hue-Script-Gruppe
var hueGruppeAktiv = []; // Preset aktiv (true/false) je hue-Script-Gruppe
var hueGruppeLasttimestamp = []; // letzter Zeitstelmep je hue Gruppe
var hueGruppeAnzahlQueue = [];
var hueTimer = {};
! // Funktionen
! function hueQueuesAnlegen (){ // Wartefeld Variablen für jede Gruppe erstellen
var x;
for (x in hueGruppen) { // x ist der erste Wert [0] im Array, hier der String des Gruppennamens
= 0; // für jeden Gruppennamen ein Wartefeld anlegen
= false; // für jeden Gruppennamen ein Aktivflag anlegen
= 0;
= 0;
= null;
}
}
! function validBri (bri) {
if (bri >= 0 && bri <= 254) {
log("valid bri wurde übergeben","info");
return true;
}
if (bri > 254) {
log("bri zu hoch. Werte von 0 bis 254 sind erlaubt","error");
}else {
log("kein bri oder kein validen bri Wert wurde übergeben","info");
}
return false;
}
! function hueWarteMinDelay (gruppenname) { // für die Mindestverzögerungszeit ein Flag setzen, dass ein Preset aktiv ist
hueGruppeAktiv[gruppenname] = true;
setTimeout (function() {
hueGruppeAktiv[gruppenname] = false;
},
hueMinDelay);
}
! function hueGruppeStop (gruppenname) {
clearTimeout(hueTimer[gruppenname]);
}
! function hueGruppe (gruppenname,preset,verzögerung,bri) {
//TODO: Abbruchfunktion für bestehende Queue
if (!hueGruppeAnzahlQueue[gruppenname]) {
hueGruppeLasttimestamp[gruppenname] = new Date().getTime();
}
log(" # Sperrzeitaktiv: " + hueGruppeAktiv[gruppenname] + " ## Anzahl Queue" + hueGruppeAnzahlQueue[gruppenname],"warn");
if (hueGruppeAktiv[gruppenname]) {
if (!verzögerung || verzögerung < hueMinDelay) verzögerung = hueMinDelay; // Preset aktiv, bei zu geringer Verzögerungszeit die Midestverzögerung addieren
} else {
if (!verzögerung) verzögerung = 0; // kein Preset aktiv, das nächste Preset soll direkt starten
}
var wartenAktiv = verzögerung; // aktuelle Wartezeit der gerade aufgerufen Funktion
hueWarteMinDelay(gruppenname); // Flag für die Midestverzögerungszeit, dass ein Preset aktiv ist
if (hueGruppeAnzahlQueue[gruppenname] > 0) { // wenn ein Preset aktiv ist, die bisherige Laufzeit bei der neuen Verzögerung berücksichtogen und abziehen
verzögerung = verzögerung - ((new Date().getTime()) - hueGruppeLasttimestamp[gruppenname]);
}
verzögerung += hueWarten[gruppenname]; // die Verzögerung um die derzeit aktuelle Warteschlage addieren
hueWarten[gruppenname] += wartenAktiv; // die, für weitere Aktionen in der Gruppe, zu addierende Wartezeit und die aktuelle Wartezeit erhöhen
hueGruppeAnzahlQueue[gruppenname]++; // Zähler Anzahl aktive Presets um 1 erhöhen
log("Gruppe: " + gruppenname + " # Verzögerung: " +verzögerung + " # wartenAktiv: " + wartenAktiv + " # warten: " + hueWarten[gruppenname] + " # aktiv: " + hueGruppeAktiv[gruppenname],"warn");
log("schalte Gruppe: " + gruppenname + ", Preset: " + preset + " in: " +verzögerung + " ms aktiv","warn");
if (hueGruppen[gruppenname]) {
hueTimer[gruppenname] = setTimeout(function() { // Preset verzögert aktivieren, wenn eingestellt
for (i = 0; i < hueGruppen[gruppenname].length; i++) { // jede Lampe aus der Gruppe
for (j = 0; j < hueParameter.length; j++) { // teste alle möglichen hue Parameter
if (huePresets[preset]) {
if (huePresets[preset].hasOwnProperty(hueParameter[j])){ // nur die im Preset enthaltenen Variablen verarbeiten
if (hueParameter[j] != "bri") { // bri rausnehmen, da ggf. eigener Wert mitgegeben wurde
setState(hueGruppen[gruppenname][i] + "." + hueParameter[j], huePresets[preset][hueParameter[j]] );
log(hueParameter[j] + ": " + huePresets[preset][hueParameter[j]],"info");
} else { // es handelt sich um bri
if (!validBri(bri)) { // prüfen, ob ein gültiger bri Wert vom Anwender übergeben wurde
setState(hueGruppen[gruppenname][i] + "." + hueParameter[j], huePresets[preset][hueParameter[j]] );
log(hueParameter[j] + ": " + huePresets[preset][hueParameter[j]],"info");
} else {
setState(hueGruppen[gruppenname][i] + ".bri", bri); // wenn ein Helligkeitswert übergeben wurde, diesen verwenden
log(hueParameter[j] + ": " + bri,"info");
}
}
}} else { log("Preset: # " + preset + " # nicht definiert","error"); //hueWarten[gruppenname] -= wartenAktiv; // Lichteinstellungen nicht ausgeführt, Zeit nicht dazuaddiert (ohne diese Zeile wird die Zeit dazuaddiert, ohne das Licht zu ändern) return null; } } } hueWarten[gruppenname] -= wartenAktiv; // beim nächsten Eintrag zu addierende Wartezeit hueGruppeAnzahlQueue[gruppenname]--; // aktive Presets um eins reduzieren (0 es ist kein Preset in der Gruppe mehr aktiv) }, verzögerung); } else { log("Gruppenname: # " + gruppenname + " # nicht definiert","error"); //hueWarten[gruppenname] -= wartenAktiv; // Lichteinstellungen nicht ausgeführt, Zeit nicht dazuaddiert }
}
! // Scriptstart
//--------------------------------------------------------------------------------------------------------------------------
// Hinweis:
//
// Die Effekte ändern sich nach dem Timeout. Überlegung: dies auf eine Queue zu ändern (First in First Out, Zeiten addieren)
// d.h. die Funktionen unten werden in der Reihenfolge (1),(4),(2),(3),(5) abgearbeitet.
! hueQueuesAnlegen (); // legt die Queues an, in Abhängigkeit der vorhanden Gruppen im Script
! log("hueWarten[arbeitszimmer]: " + hueWarten["arbeitszimmer"]);
! /*
hueGruppe("wohnzimmerGruppe","standard");
hueGruppe("wohnzimmerGruppe","blue",5000);
hueGruppe("wohnzimmerGruppe","off",30000);
/
! hueGruppe("arbeitszimmer","standard");
hueGruppe("arbeitszimmer","red",2000);
hueGruppe("arbeitszimmer","off",5000);
//hueGruppe("arbeitszimmer","blue",2000);
! hueGruppeStop("arbeitszimmer");
! setTimeout(function() {
hueGruppe("arbeitszimmer","blue",2000);
hueGruppe("arbeitszimmer","off",2000);
},4000);
! /
hueGruppe("arbeitszimmer","blue");
hueGruppe("arbeitszimmer","red");
hueGruppe("arbeitszimmer","blue"),500;
hueGruppe("arbeitszimmer","standard",500);
hueGruppe("arbeitszimmer","blue",500);
hueGruppe("arbeitszimmer","standard",1000);
hueGruppe("arbeitszimmer","off",2000);
/
! /
hueGruppe("arbeitszimmer","standard",0,100);
hueGruppe("arbeitszimmer","blue",1000);
hueGruppe("arbeitszimmer","standard",1000,100);
hueGruppe("arbeitszimmer","blue");
hueGruppe("wohnzimmer","standard");
hueGruppe("wohnzimmer","blue",1000);
hueGruppe("wohnzimmer","off",1000);
hueGruppe("arbeitszimmer","standard");
hueGruppe("arbeitszimmer","blue");
hueGruppe("arbeitszimmer","standard");
hueGruppe("arbeitszimmer","blue",1000);
hueGruppe("arbeitszimmer","off",1000);
*/`
1002_server_last1.png
1002_server_last2.png [/i][/i][/i] -
Das was du geschrieben hast, sollte gehen.
Nun würde ich noch vor setTimeout prüfen ob timer schon läuft und im Timer auch hueTimer[gruppenname] auf "null" setzten.
if (hueTimer[gruppenname]) clearTimeout(hueTimer[gruppenname]); hueTimer[gruppenname] = setTimeout(function() { hueTimer[gruppenname] = null; ...
-
Das was du geschrieben hast, sollte gehen. `
Oje… oder besser... MIST :shock:
Ne, das Löschen hatte so nicht funktioniert. Der Timer schon.
Das was Du unten geschrieben hast, sagt mir, dass ich da noch etwas umbauen muss.
Das würde von Konzept her bedeuten, dass jeder Timer nur einmal aktiv sein kann? :?:
Bei mir gibt es für jede Gruppe einen eigenen Timer, exemplarisch hueTimer[gruppenname], der aber auch gleichzeitig x-mal gestartet wird.
Und das hat wunderbar funktioniert:
timer ["A"]: 1000 ms, 1200ms, 5000ms, 7200ms
timer **: 800ms, 1200 ms, 3200ms
usw.
D.h. jeder Timer hat quasi eine Queue von Funktionen, die nach den Zeiten nacheinander ausgeführt werden.
Wie gesagt, klappt prima.
Deiner Erklärung kann ich entnehmen, dass das nicht das Konzept eines Timers ist (mehrfach, gleichzeitig benutzen).
Wenn dem so ist, muss ich nicht nur Deine Änderungen einbauen, sondern noch so einiges mehr.
Für jede Stufe einen eigenen Timer:
timer ["A"][0]: 1000 ms
timer ["A"][1]: 1200ms
timer ["A"][2]: 5000ms
timer ["A"][3]: 7200ms
Und alle löschen, wenn die Timer für einen Raum gestoppt werden sollen.
Gefiel mir vorher besser
[EDIT]
Alternativ zu mehreren Timern je Raum, könnte ich auch "echte" Queues bauen und immer erst den Timer aufrufen, wenn der vorherige Timer durch ist. Dann hätte ich mir das Berechnen der addierten Timer sparen können.
Nun würde ich noch vor setTimeout prüfen ob timer schon läuft und im Timer auch hueTimer[gruppenname] auf "null" setzten.
if (hueTimer[gruppenname]) clearTimeout(hueTimer[gruppenname]); hueTimer[gruppenname] = setTimeout(function() { hueTimer[gruppenname] = null; ... ```` ` **
-
Gab es heute Morgen Probleme mit dem Forum?
Meine im Auto gesehen zu haben, dass hier geantwortet wurde, wollte nachsehen und dann gab es nur einen Servererror.
Entweder hat mich Tapatalk gelingt oder eine eventuelle Antwort ist nun im Nirwana verschwunden
305_heizungsscript_090_08.txt -
Script ist umgebaut und funktioniert nun wie gewünscht.
Die Erkenntnisse:
-
ein setTimeout() kann mehrmals hintereinander gestartet werden. Alle Abläufe werden abgearbeitet
-
ein clearTimeout() löscht nur den letzten Ablauf. Alle anderen mehrmals gestarteten Aufrufe werden noch abgearbeitet.
Wenn man setTimeout() komplett stoppen will, darf man es nicht mehrmals aufrufen, sondern muss die Einträge aus einer Queue nacheinander abarbeiten.
3467_aktueller_status.png
3467_fehler_status.png -