NEWS
Funksteckdose per Bewegungsmelder schalten
-
Hallo,
habe mir einen Bewegungsmelder (HM-Sec-MDIR-2) und eine Funksteckdose (HM-ES-PMSw1-PI-DN-R1) gekauft.
Ziel ist es, den Bewegungsmelder ins Bad zu stellen und damit über die Funksteckdose die Zirkulationspumpe zu schalten.
Dazu habe ich mir folgendes Script "zusammen geklaut".
// isTimeInRange function currentDate() { var d = new Date(); return new Date(d.getFullYear(), d.getMonth(), d.getDate()); } function addTime(strTime) { var time = strTime.split(':'); var d = currentDate(); d.setHours(time[0]); d.setMinutes(time[1]); d.setSeconds(time[2]); return d; } function isTimeInRange(strLower, strUpper) { var now = new Date(); var lower = addTime(strLower); var upper = addTime(strUpper); var inRange = false; if (upper > lower) { // opens and closes in same day inRange = (now >= lower && now <= upper) ? true : false; } else { // closes in the following day inRange = (now >= upper && now <= lower) ? false : true; } return inRange; } // isTimeInRange ENDE createState('Warmwasser.Trigger', false, { name: 'Warmwasser bei Bewegung', type: 'boolean' }); var idBewegung = "hm-rpc.0.MEQ0700004.1.MOTION", // Auslösender Bewegungsmelder idTrigger = 'Warmwasser.Trigger'; setState("hm-rpc.0.NEQ0707005.1.STATE"/*Schalter-1.STATE*/,true); //Funksteckdose einschalten on({id: idBewegung, val: true}, function (obj) { if ( isTimeInRange('04:30:00', '08:00:00')) setState(idTrigger, true); // Trigger auslösen }); // Zurücksetzen vom Trigger schedule("1 8 * * *", function () { setState(idTrigger, false); });
Jetzt meinen Fragen als absoluter Anfänger in JavaScript.
Wird das Programm nur einmal in der angegebenen Zeit ausgeführt?
Schaltet der BW die Steckdose?
Um es einmal zu testen, wo muss ich die Zeit ändern? Zum Beispiel zwischen 08:00 und 20:00? Das rot markierte?
on({id: idBewegung, val: true}, function (obj) {
if ( isTimeInRange('04:30:00', '08:00:00')) setState(idTrigger, true); // Trigger auslösen
});
// Zurücksetzen vom Trigger
schedule("1 8 * * *", function () {
setState(idTrigger, false);
Gruss Superdad
-
Hallo superdad,
dein Skript schaltet die Variable bei der ersten Bewegung zwischen 4:30 Uhr und 8:00 Uhr. Um 08:01 setzt es die Variable wieder zurück.
isTimeInRange('04:30:00', '08:00:00') ````liefert __true__, wenn die aktuelle Uhrzeit zwischen halb fünf und acht Uhr ist.
schedule("1 8 * * *", function () {
setState(idTrigger, false);
});Für die Zeit zwischen 19:00 und 20:00 Uhr sollte es so aussehen: >! ```` >! // isTimeInRange function currentDate() { var d = new Date(); return new Date(d.getFullYear(), d.getMonth(), d.getDate()); } function addTime(strTime) { var time = strTime.split(':'); var d = currentDate(); d.setHours(time[0]); d.setMinutes(time[1]); d.setSeconds(time[2]); return d; } function isTimeInRange(strLower, strUpper) { var now = new Date(); var lower = addTime(strLower); var upper = addTime(strUpper); var inRange = false; if (upper > lower) { // opens and closes in same day inRange = (now >= lower && now <= upper) ? true : false; } else { // closes in the following day inRange = (now >= upper && now <= lower) ? false : true; } return inRange; } // isTimeInRange ENDE >! createState('Warmwasser.Trigger', false, { name: 'Warmwasser bei Bewegung', type: 'boolean' }); >! var idBewegung = "hm-rpc.0.MEQ0700004.1.MOTION", // Auslösender Bewegungsmelder idTrigger = 'Warmwasser.Trigger'; setState("hm-rpc.0.NEQ0707005.1.STATE"/*Schalter-1.STATE*/,true); //Funksteckdose einschalten on({id: idBewegung, val: true}, function (obj) { if ( isTimeInRange('19:00:00', '20:00:00')) setState(idTrigger, true); // Trigger auslösen }); >! // Zurücksetzen vom Trigger schedule("1 20 * * *", function () { setState(idTrigger, false); }); >! ```` Gruß Pix
-
Danke dir für die schnelle Antwort.
Habe ich ja mal was hin bekommen. Mit Hilfe des Forums.
Jetzt frage ich mich aber, ob das Script nur einmal ausgeführt wird zwischen 04:30 und 08:00 Uhr?
Ist das so richtig geschrieben?
Und wenn ich das Script dann noch einmal zwischen 19:00 und 20:00 Uhr ausführen möchte, dann einfach?
on({id: idBewegung, val: true}, function (obj) { if ( isTimeInRange('05:00:00', '06:00:00') || isTimeInRange('19:00:00', '20:00:00')) setState(idTrigger, true); // Trigger auslösen });
Gruß
-
Da mir aufgefallen ist, dass die Zirkulationspumpe jetzt von 4.30 - 8.00 Uhr durch läuft (zumindest nach meinem Verständnis als Anfänger), habe ich noch eine Ablaufzeit eingegeben.
Hoffe, dass es so richtig ist.
Vielleicht kann ja ein Profi mal drüber schauen?
// isTimeInRange function currentDate() { var d = new Date(); return new Date(d.getFullYear(), d.getMonth(), d.getDate()); } function addTime(strTime) { var time = strTime.split(':'); var d = currentDate(); d.setHours(time[0]); d.setMinutes(time[1]); d.setSeconds(time[2]); return d; } function isTimeInRange(strLower, strUpper) { var now = new Date(); var lower = addTime(strLower); var upper = addTime(strUpper); var inRange = false; if (upper > lower) { // opens and closes in same day inRange = (now >= lower && now <= upper) ? true : false; } else { // closes in the following day inRange = (now >= upper && now <= lower) ? false : true; } return inRange; } // isTimeInRange ENDE createState('Warmwasser.Trigger', false, { name: 'Warmwasser bei Bewegung', type: 'boolean' }); var idBewegung = "hm-rpc.0.MEQ0700004.1.MOTION", // Auslösender Bewegungsmelder idTrigger = 'Warmwasser.Trigger'; setState("hm-rpc.0.NEQ0707005.1.STATE"/*Schalter-1.STATE*/,true); //Funksteckdose einschalten setStateDelayed("hm-rpc.0.NEQ0707005.1.STATE", false, 10 * 60000); //Funksteckdose nach 10min. ausschalten on({id: idBewegung, val: true}, function (obj) { if ( isTimeInRange('04:30:00', '08:00:00')) setState(idTrigger, true); // Trigger auslösen }); // Zurücksetzen vom Trigger schedule("1 8 * * *", function () { setState(idTrigger, false); });
Gruss
-
So hat es heute früh funktioniert.
// isTimeInRange function currentDate() { var d = new Date(); return new Date(d.getFullYear(), d.getMonth(), d.getDate()); } function addTime(strTime) { var time = strTime.split(':'); var d = currentDate(); d.setHours(time[0]); d.setMinutes(time[1]); d.setSeconds(time[2]); return d; } function isTimeInRange(strLower, strUpper) { var now = new Date(); var lower = addTime(strLower); var upper = addTime(strUpper); var inRange = false; if (upper > lower) { // opens and closes in same day inRange = (now >= lower && now <= upper) ? true : false; } else { // closes in the following day inRange = (now >= upper && now <= lower) ? false : true; } return inRange; } // isTimeInRange ENDE createState('Warmwasser.Trigger', false, { name: 'Warmwasser bei Bewegung', type: 'boolean' }); var idBewegung = "hm-rpc.0.MEQ0700004.1.MOTION", // Auslösender Bewegungsmelder idTrigger = 'Warmwasser.Trigger'; setState("hm-rpc.0.NEQ0707005.1.STATE",true); //Funksteckdose einschalten setStateDelayed("hm-rpc.0.NEQ0707005.1.STATE", false, 10 * 60000); //Funksteckdose nach 10min. ausschalten on({id: idBewegung, val: true}, function (obj) { if ( isTimeInRange('04:30:00', '08:00:00')) setState(idTrigger, true); // Trigger auslösen }); // Zurücksetzen vom Trigger schedule("1 8 * * *", function () { setState(idTrigger, false); });
Kann man das eventuell kürzer fassen?
Gruss