NEWS
[gelöst] 3 BWMs ein Timer
-
Ich habe 3 BWMs auf drei Etagen Eg, OG, DG
Alle zusammen sollen eine Licht quelle Schalten ( Indirektes Licht im Treppenhaus )
/** * Einschalten der Indirekten Beleuchtung im Treppenhaus * Regeln: * - Brenndauer 15min * - Melder werden überstimmt durch Hauptlicht in der jeweiligen Etage * **/ var interval = 15; var motionDetector_DG = "hm-rpc.1.NEQ0509829.6.SENSOR"/*BWM_FLUR_DG:6.SENSOR*/, motionDetector_OG = "hm-rpc.1.NEQ0509829.3.SENSOR"/*BWM_Indirektes_Licht_Flur_OG:3.SENSOR*/, motionDetector_EG = "hm-rpc.1.NEQ0509829.1.SENSOR"/*BWM_Hauptlicht_Flur_EG:1.SENSOR*/; var light_DG = "hm-rpc.1.MEQ0279026.13.STATE"/*Flur_DG_Licht:13.STATE*/, light_OG = "hm-rpc.1.NEQ0891202.19.STATE"/*Flur_OG_Licht:19.STATE*/, light_EG = "hm-rpc.1.NEQ0891532.15.STATE"/*Flur_EG_Licht:15.STATE*/; var indirectLight = "hm-rpc.1.NEQ0891532.16.STATE"/*EG_OG_DG_Indirekts_Licht:16.STATE*/; var counter = 900; // Counter in Sekunden angeben var timer = false; // liefert Minuten in ms zurück function getMS(){ var ms = interval * 60 * 1000; return ms; } function sleep (time) { // Wenn schon ein Timer existiert diesen löschen! if(timer !== false){ timer = false; } // bei jedem Aufruf einen neuen erstellen. Zeit resetten timer = new Promise((resolve) => setTimeout(resolve, time)); return timer; } function triggerIndirectLight(){ if(!getState(indirectLight).val){ setState(indirectLight, true); log('Licht an'); } sleep(getMS()).then(() => { setState(indirectLight, false); log('Licht aus'); }); } // DG on({id: motionDetector_DG}, function (obj) { if (!obj.state.val) { // NUr wenn das Hauptlicht aus ist, darf das Licht eingeschaltet werden. if(!getState(light_DG).val){ log('BWM Flur DG reagiert!'); triggerIndirectLight(); } } }); // OG on({id: motionDetector_OG}, function (obj) { if (!obj.state.val) { // NUr wenn das Hauptlicht aus ist, darf das Licht eingeschaltet werden. if(!getState(light_OG).val){ log('BWM Flur OG reagiert!'); triggerIndirectLight(); } } }); // EG on({id: motionDetector_EG}, function (obj) { if (!obj.state.val) { // NUr wenn das Hauptlicht aus ist, darf das Licht eingeschaltet werden. if(!getState(light_EG).val){ log('BWM Flur EG reagiert!'); triggerIndirectLight(); } } });
Mein Problem ist, dass die einzelnen Melder sich nicht den selben Timer zu teilen scheinen.
Im Grunde möchte ich nur, dass jede Bewegung der 3 Melder den Timer zurücksetzt.
An welcher stelle habe ich Pech beim denken? :oops:
-
Könnte sein, dass deine Promise-Logik nicht ganz stimmt. Was du probieren kannst (halb JS, halb Pseudocode):
var timer = null; bei Trigger: lichtAn(); // Timer löschen, damit Licht an bleibt if (timer) clearTimeout(timer); // Timer neu setzen ab jetzt timer = setTimeout(dauerLichtAn, function() { timer = null; // Timer abgelaufen, jetzt löschen lichtAus(); // und Licht ausschalten });
-
Danke für die Hilfe.
Ich habe es jetzt hinbekommen.
/** * Einschalten der Indirekten Beleuchtung im Treppenhaus * Regeln: * - Brenndauer 5min * - Melder werden überstimmt durch Hauptlicht in der jeweiligen Etage * **/ var interval = 5; var motionDetector_DG = "hm-rpc.1.NEQ0509829.6.SENSOR"/*BWM_FLUR_DG:6.SENSOR*/, motionDetector_OG = "hm-rpc.1.NEQ0509829.3.SENSOR"/*BWM_Indirektes_Licht_Flur_OG:3.SENSOR*/, motionDetector_EG = "hm-rpc.1.NEQ0509829.1.SENSOR"/*BWM_Hauptlicht_Flur_EG:1.SENSOR*/; var light_DG = "hm-rpc.1.MEQ0279026.13.STATE"/*Flur_DG_Licht:13.STATE*/, light_OG = "hm-rpc.1.NEQ0891202.19.STATE"/*Flur_OG_Licht:19.STATE*/, light_EG = "hm-rpc.1.NEQ0891532.15.STATE"/*Flur_EG_Licht:15.STATE*/; var indirectLight = "hm-rpc.1.NEQ0891532.16.STATE"/*EG_OG_DG_Indirekts_Licht:16.STATE*/; var timer = null; // liefert minuten in ms zurück function getMS(){ var ms = interval * 60 * 1000; return ms; } function triggerIndirectLight(){ if(!getState(indirectLight).val){ setState(indirectLight, true); log('Indirektes Licht an'); } // Timer löschen, damit Licht an bleibt if (timer){ clearTimeout(timer); log('Reset Timer'); } // Timer neu setzen ab jetzt timer = setTimeout(function() { timer = null; // Timer abgelaufen, jetzt löschen setState(indirectLight, false); log('Indirektes Licht aus'); }, getMS()); } // DG on({id: motionDetector_DG}, function (obj) { if (!obj.state.val) { // NUr wenn das Hauptlicht aus ist, darf das Licht eingeschaltet werden. if(!getState(light_DG).val){ log('BWM Flur DG reagiert!'); triggerIndirectLight(); } } }); // OG on({id: motionDetector_OG}, function (obj) { if (!obj.state.val) { // NUr wenn das Hauptlicht aus ist, darf das Licht eingeschaltet werden. if(!getState(light_OG).val){ log('BWM Flur OG reagiert!'); triggerIndirectLight(); } } }); // EG on({id: motionDetector_EG}, function (obj) { if (!obj.state.val) { // NUr wenn das Hauptlicht aus ist, darf das Licht eingeschaltet werden. if(!getState(light_EG).val){ log('BWM Flur EG reagiert!'); triggerIndirectLight(); } } });
Etwas gemein war, das setTimeout() die Parameter genau umgekehrt erwartet.
-
Etwas gemein war, das setTimeout() die Parameter genau umgekehrt erwartet. `
Ooops, ich verwechsel das immer. Zum Glück gibt's Auto-Vervollständigung in Entwicklungsumgebungen -
Das wäre was für die StateMachine