NEWS
[gelöst] clearTimeout für Lichtsteuerung funktioniert nicht.
-
Beim ersten draufschauen würde ich sagen, der Aufruf an clearTimeout ist innerhalb des if Blockes
if(getState(GeraeteID).val === false){
und wird daher für die Verlängerung nicht ausgeführt, da da das Licht ja schon an ist. Weiter würde ich kein array sondern ein object für das Speichern der timer nehmen, also````
var timer = {};Grüße Thomas `
Du bist mein Held! :lol:, jetzt wo du es sagst hast du natürlich 100%ig recht.
Warum würdest du denn ein object verwenden? Da ich nur amateurprogrammierer bin, lass ich mich da immer gerne belehren.
Edit
So ich habe es nun geändert und es funktioniert an und für sich, aber das Licht wird nach Bewegungserkennung auch ausgeschalten wenn es von Hand eingeschalten war. Dazu habe ich ein neues Array erstellt, in welchem die Geräteid eingeragen wird wenn das Licht durch den Bewegungsmelder eingeschalten wurde.
Im Anschluss Frage ich eben dieses Array nach dem vorhanden sein der GeräteID ab, aber beim ersten Durchlauf wird der Eintrag nicht gefunden, erst nach dem Reload funktioniert es. Das Problem hatte ich schonmal, aber die Lösung fällt mir nicht mehr ein.
Hier mal das geänderte Script:
var timer = []; var GeraeteListe = []; function LichtAutomatik(GeraeteID,Zeit) { if(getState(GeraeteID).val === false) { setState(GeraeteID,true); GeraeteListe.push(GeraeteID); } log(GeraeteListe.indexOf(GeraeteID)); if(GeraeteListe.indexOf(GeraeteID)) { log('gerät ist eingetragen'); if(timer.GeraeteID) clearTimeout(timer.GeraeteID); timer.GeraeteID = setTimeout(function () { setState(GeraeteID,false); log('----------------------- Vor dem Löschen -----------------------'); log('Index:'+GeraeteListe.indexOf(GeraeteID)); GeraeteListe.splice(GeraeteListe.indexOf(GeraeteID),1); log('----------------------- Nach dem Löschen -----------------------'); log('Aus geschalten'); }, 10000);//Zeit * 60000); } else{ log('gerät ist nicht eingetragen'); } }
-
Habe es gelöst bekommen, indem ich einen Teil der Funktion in eine zweite ausgelagert habe.
var timer = []; var GeraeteListe = []; function LichtCountdown(GeraeteID,Zeit){ timer.GeraeteID = setTimeout(function () { setState(GeraeteID,false); GeraeteListe.splice(GeraeteListe.indexOf(GeraeteID),1); }, Zeit * 60000); } function LichtAutomatik(GeraeteID,Zeit) { if(getState(GeraeteID).val === false) { setState(GeraeteID,true); GeraeteListe.push(GeraeteID); LichtCountdown(GeraeteID,Zeit); } if(GeraeteListe.indexOf(GeraeteID)) { LichtCountdown(GeraeteID,Zeit); } }
Vielleicht kann es ja jemand brauchen
-
Danke für den Code,
ein altes Thema, aber genau das was ich bei meinem spärlichen JS Kenntnissen gebrauchen kann. Ich werde es übernehmen und etwas einenglischen
Ist nach praktischem Gebrauch noch etwas verändert/verbessert worden? Ich wünsche mir da so eine Sammlung solch nützlicher Scripte, gibt es da etwas? -
@jojos
Ja wurde noch erweitert, kann ich einstellen wenn du es brauchst -
@peoples gerne,auch wenn es schon tut was es soll.
-
// ******************************************************************************************************* // // Automatiklicht-Script // Autor: Peoples // // // Funktionen: // // V1.0.0 01.04.23 Initialversion der Version 2 // // // Wichtig: // - Enum-Function für Bewegungsmelder muss existieren (Bewegungsmelder) // - Enum-Function für die Lichtquellen muss existieren (Beleuchtung) // // ******************************************************************************************************* // ----------------------------------------------------------------------------- // allgemeine Variablen // ----------------------------------------------------------------------------- var timer = []; //Array für die verschiedenen Timer var automaticLightsArray = []; //Array zum auswerten ob das Licht automatisch oder manuel eingeschalten wurde var lightingLimitDefault = 55; //Beleuchtungswert in Lux ab wann das Licht eingeschalten wird var loglevel = 0; // Loglevel 0 = kein Logging / 1 -3 Logging wird genauer var Systemlog = true; // Systemmeldungen anlegen ja/nein var instanz = '0_userdata.0'; instanz = instanz +'.'; var pfad0 = 'Lighting'; pfad0 = pfad0 +'.'; var pfad1 = 'AutoLightTimers'; pfad1 = pfad0 + pfad1 +'.'; var pfad2 = 'config'; pfad2 = pfad0 + pfad2 +'.'; var autolightList = [ // Automatic-Licht Geräteliste /*Name*/ /*Auslösender Melder*/ /*Verwendeter Licht Sensor*/ /*Zu schaltendes Licht*/ /* An State */ /*Aus State */ /*An Zeit*/ /* Mind. Helligk. */ {'name':'TreppenhausDG', 'mdetID':'hm-rpc.2.XXXX.1.MOTION', 'luxdetID':'hm-rpc.2.XXXX.1.ILLUMINATION', 'lightID':'hm-rpc.0.XXXX.1.STATE', 'wishValueON':true, 'wishValueOFF':false, 'time':5, 'lightingLimit':10}, {'name':'TreppenhausEG', 'mdetID':'hm-rpc.0.XXXX.3.MOTION', 'luxdetID':'hm-rpc.0.XXXX.3.BRIGHTNESS', 'lightID':'hm-rpc.0.XXXX.1.STATE', 'wishValueON':true, 'wishValueOFF':false, 'time':5, 'lightingLimit':lightingLimitDefault}, {'name':'TreppenhausKG', 'mdetID':'hm-rpc.0.XXXX.3.MOTION', 'luxdetID':'hm-rpc.0.XXXX.3.BRIGHTNESS', 'lightID':'hm-rpc.0.XXXX.1.STATE', 'wishValueON':true, 'wishValueOFF':false, 'time':5, 'lightingLimit':32}, {'name':'FlurELW', 'mdetID':'hm-rpc.0.XXXX.3.MOTION', 'luxdetID':'hm-rpc.0.XXXX.3.BRIGHTNESS', 'lightID':'hm-rpc.0.XXXX.1.STATE', 'wishValueON':true, 'wishValueOFF':false, 'time':5, 'lightingLimit':10}, {'name':'KellerGang1', 'mdetID':'hm-rpc.0.XXXX.3.MOTION', 'luxdetID':'hm-rpc.0.XXXX.3.BRIGHTNESS', 'lightID':'hm-rpc.0.XXXX.1.STATE', 'wishValueON':true, 'wishValueOFF':false, 'time':5, 'lightingLimit':12}, {'name':'KellerGang2', 'mdetID':'hm-rpc.0.XXXX.3.MOTION', 'luxdetID':'hm-rpc.0.XXXX.3.BRIGHTNESS', 'lightID':'hm-rpc.0.XXXX.1.STATE', 'wishValueON':true, 'wishValueOFF':false, 'time':5, 'lightingLimit':15}, {'name':'TerrassenTreppe', 'mdetID':'hm-rpc.0.XXXX.1.MOTION', 'luxdetID':'hm-rpc.0.XXXX.1.LUX', 'lightID':instanz + pfad0 + 'terraceStairsLightGroup', 'wishValueON':true, 'wishValueOFF':false, 'time':5, 'lightingLimit':lightingLimitDefault}, {'name':'Bewegungsm-Gartentor', 'mdetID':'hm-rpc.0.XXXX.1.MOTION', 'luxdetID':'hm-rpc.0.XXXX.1.LUX', 'lightID':'shelly.0.SHSW-XXXX.Relay1.Switch', 'wishValueON':true, 'wishValueOFF':false, 'time':3, 'lightingLimit':lightingLimitDefault}, {'name':'Haustuere1', 'mdetID':'hm-rpc.0.XXXX.1.MOTION', 'luxdetID':'hm-rpc.0.XXXX.1.LUX', 'lightID':'sonoff.0.Licht-Haustuere.POWER', 'wishValueON':true, 'wishValueOFF':false, 'time':5, 'lightingLimit':lightingLimitDefault}, {'name':'Haustuere2', 'mdetID':'hm-rpc.0.XXXX.1.STATE', 'luxdetID':'hm-rpc.0.XXXX.1.LUX', 'lightID':'sonoff.0.Licht-Haustuere.POWER', 'wishValueON':true, 'wishValueOFF':false, 'time':5, 'lightingLimit':lightingLimitDefault}, {'name':'AussenkuecheTuere', 'mdetID':'hm-rpc.2.XXXX.1.STATE', 'luxdetID':'hm-rpc.0.XXXX.1.LUX', 'lightID':'shelly.0.SHSW-XXXX.Relay0.Switch', 'wishValueON':true, 'wishValueOFF':false, 'time':3, 'lightingLimit':lightingLimitDefault}, {'name':'GaesteWCEG', 'mdetID':'hm-rpc.2.XXXX.1.PRESENCE_DETECTION_STATE', 'luxdetID':'hm-rpc.2.XXXX.1.ILLUMINATION', 'lightID':'shelly.0.SHSW-XXXXRelay0.Switch', 'wishValueON':true, 'wishValueOFF':false, 'time':5, 'lightingLimit':2}, {'name':'Kueche', 'mdetID':'hm-rpc.2.XXXX.1.MOTION', 'luxdetID':'hm-rpc.2.XXXX.1.ILLUMINATION', 'lightID':instanz + pfad0 + 'Kitchenette', 'wishValueON':true, 'wishValueOFF':false, 'time':2, 'lightingLimit':5}, {'name':'Gartentor', 'mdetID':'hm-rpc.2.XXXX.1.STATE', 'luxdetID':'hm-rpc.0.XXXX.1.LUX', 'lightID':'shelly.0.SHSW-XXXX.Relay1.Switch', 'wishValueON':true, 'wishValueOFF':false, 'time':5, 'lightingLimit':lightingLimitDefault} ]; // ----------------------------------------------------------------------------- // Objekte // ---------.-------------------------------------------------------------------. // Objekt: Lichtautomatik für Automatische Abläufe var KitchenetteOffValue = 0; createState(instanz + pfad0 + 'terraceStairsLightPermOn', {def:false, type:'boolean', name:'Treppenlicht dauerhaft ein',}); createState(instanz + pfad0 + 'terraceStairsLightGroup', {def:false, type:'boolean', name:'Treppenlicht Gruppe',}) createState(instanz + pfad0 + 'Kitchenette', {def:false, type:'boolean', name:'Lichtlevel Kuechenzeile',}) // ############################################################################# // # # // # Funktion Geräte Stati erstellen # // # # // ############################################################################# async function createDeviceStates(){ try { for(var i = 0; i < autolightList.length; i++) { await createStateAsync(instanz + pfad1 + 'timer_' + autolightList[i].name , {name: 'Timer_'+ autolightList[i].name, type:'number', def:'0', read:true, write:true}); await createStateAsync(instanz + pfad2 + 'blockMD_' + autolightList[i].name , {name: 'Bewegungserkennung deaktiviert', type:'state', def:false, read:true, write:true}); } } catch (error) { log(`Unexpected error - ${error}`, 'error'); } } // ############################################################################# // # # // # Funktion zum automatischen Einschalten des Lichts # // # # // ############################################################################# function searchAutoLightList(mdID){ if(getState('alias.0.System_Konfiguration.Beleuchtungsautomatik.ACTUAL'/*Actual*/).val === true){ for(var i = 0; i < Object.keys(autolightList).length; i++) { if(autolightList[i].mdetID == mdID) { if(loglevel > 1) log('Geräteindex wurde an Stelle:' + i + ' gefunden'); if(getState(instanz + pfad2 + 'blockMD_' + autolightList[i].name).val === false) { setAutoLightTimer(i); } else { if(loglevel > 1) log('Bei dem Beleuchtungsgerät:' + autolightList[i].name + ' wurde die Bewegungserkennung deaktiviert'); } } else { if(loglevel > 1)('Gerät wurde nicht gefunden!') } } } else { if(loglevel > 1)('Beleuchtungsautomatik ausgeschalten!') } } // ############################################################################# // # # // # Funktion zum Prüfen und automatischen Auschalten des Lichts # // # # // ############################################################################# function setAutoLightTimer(i){ if(getState(autolightList[i].luxdetID).val < autolightList[i].lightingLimit) { setState(autolightList[i].lightID, autolightList[i].wishValueON); if(getState(instanz + pfad1 + 'timer_' + autolightList[i].name).val != autolightList[i].time * 60){ if(getState(autolightList[i].lightID).val != autolightList[i].wishValueON){ setState(instanz + pfad1 + 'timer_' + autolightList[i].name, autolightList[i].time * 60); } else { clearInterval(timer[autolightList[i].name]); setState(instanz + pfad1 + 'timer_' + autolightList[i].name, autolightList[i].time * 60); } timer[autolightList[i].name] = setInterval(function () { if(getState(instanz + pfad1 + 'timer_' + autolightList[i].name).val > 0){ setState(instanz + pfad1 + 'timer_' + autolightList[i].name, getState(instanz + pfad1 + 'timer_' + autolightList[i].name).val - 1); } else { setState(autolightList[i].lightID, autolightList[i].wishValueOFF); clearInterval(timer[autolightList[i].name]); } }, 1000); } } } // ############################################################################# // # # // # Funktion zum zurücksetzen des Timers bei manuelem ausschalten des Lichts # // # # // ############################################################################# function setTimerToZero(liID){ for(var i = 0; i < Object.keys(autolightList).length; i++) { if(autolightList[i].lightID === liID) { if(getState(instanz + pfad1 + 'timer_' + autolightList[i].name).val > 0){ clearInterval(timer[autolightList[i].name]); setState(instanz + pfad1 + 'timer_' + autolightList[i].name, 0); if(loglevel > 1) log('Timer von:'+liID+' wurde wegen manuellem Ausschalten auf 0 gesetzt'); } } } } // ############################################################################# // # # // # Script start # // # # // ############################################################################# async function scriptStart(){ try{ createDeviceStates(); for(var i = 0; i < Object.keys(autolightList).length; i++) { await setStateAsync(autolightList[i].lightID, autolightList[i].wishValueOFF); await setStateAsync(instanz + pfad1 + 'timer_' + autolightList[i].name,0); } log ('------------------------------------------- Script Bewegungsmelder neu gestartet -------------------------------------------'); } catch (error) { log(`Unexpected error - ${error}`, 'error'); } } scriptStart(); // Beobachten der enum.functions "Bewegungsmelder" $('state(functions=Bewegungsmelder)').on(function(dp) { if(dp.state.val === true) { if(loglevel > 1 )log('Auslösender Sensor: ' + dp.id + ': ' + dp.state.val); searchAutoLightList(dp.id); } }); // Beobachten der enum.functions "Beleuchtung" $('state(functions=Beleuchtung)').on(function(dp) { if(dp.state.val === false) { setTimerToZero(dp.id); } });
Bitteschön
-
@peoples Danke, das über Tabellen zu lösen finde ich auch gut. Ich habe aber nur zwei Lampen die mit dieser Automatik gesteuert werden, andere über KNX und da hat der BWM viele Einstellmöglichkeiten.
Sinnvoll wäre noch eine Sperre um die Automatik zu deaktivieren. Die KNX Melder haben auch eine Einstellung für Kurzzeit und längerer Anwesenheit. Bei Durchgangsräumen braucht man zB nur 30 s Licht wenn man da in 10 s durchgelaufen ist. Nur als Anregung für die eierlegende Wollmilchsau -
@jojos
wenn du das Licht per Hand einschaltest reagiert der Timeout nicht und du kannst ja auch für jedes Licht die Zeit einzeln vorgeben. Oder wie meinst du das? -
@peoples bevor ich das Licht von Hand einschalten kann hat der BWM schon reagiert, funktioniert das dann auch?
Das andere Feature ist eine variable Zeit die davon abhängt ob einmal in 10..x s auslöse oder mehrmals. Eben wenn man nur durch den Raum durchläuft oder kurz rein-raus.
-
@jojos
Wenn du drin rum läufst wird stetig neu getriggert und es bleibt an