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.
-
Das wäre was für die StateMachine :)
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden