//..........Anwesenheitssimulation AWS Version 0.80 //..........Datum: 28.12.2015 //..........Autor: Looxer01 //..........Forum ioBroker //..........http://forum.iobroker.com/posting.php?mode=post&f=21&sid=b3b2a31dae55081fedaf0ad9c8d74acd // //..........Änderungshistorie //..........Version 0.10 Initial 28.12.2015 //..........Version 0.11 29.12.2015 Einstellungen um Astrozeiten erweitert (noch ohne Funktion) //.........,Version 0.12 29.12.2015 EVENT Deaktivierung von AWS hinzugefügt: Schreiben Log und loeschen Schedules //...............................................Aktivierung von AWS hihzugüfügt: Schreiben Log bei Aktivierung //..........Version 0.13 29.12.2015 das Schreiben des externen Logs optional gemacht - unter Einstellungen auswaehlbar //..........Version 0.20 29.12.2015 Astrozeit Funktion hinzugefügt. Astrozeit wird je IDGruppe auf true/false gesetzt und overruled die variablen zeit1von,zeit2von,zeit3von,zeit4von,zeit5von //..........Version 0.30 29.12.2015 Umarbeitung zur Verkürzung des Scripts //..........Version 0.31 30.12.2015 Fehlerbeseitigung in IDGruppen3 und 4 - einige Code Hygiene Massnahmen //..................................Umbenennung der IDGruppen mit führend "ID" / Startverzögerungseinstellungen hinzugefügt //..........Version 0.32 30.12.2015 umgestellt auf setStateDelayed / Startverzögerungsfunktion hinzugefügt. //..........Version 0.33 31.12.2015 Fehler mit EVAL Funktion gefixt / Fehler mit Startverzoegerung und Einschaltzeiten gefixt //..................................Funktion Anzahl von Geraete Teilnehmer zur Geraete ID bestimmung hinzugefügt //..........Version 0.40 01.01.2016 Log-Pfad variablel gemacht // Log-File Format umgearbeitet und Headerline hinzugefügt fuer externes Log. Internes Log ueberarbeitet //..........Version 0.41 02.01.2016 Funktionen von Baetz zum TimeInRange Check hinzugefuegt. Keine Globale Funktion mehr notwendig. -- Kommentarte ueberarbeitet //..........Version 0.42 02.01.2015 Herkunftsnachweis für IsTimeInRange Funktion hinzugefuegt //..................................Fehler zur zufaelligen Geraete Findung behoben. Das letzte Geraet wurde nie ausgewaehlt // Fehler im log "Gearaet wurde nicht eingeschaltet wurde gelogged auch wenn es eingeschaltet wurde" //..........Version 0.43 03.01.2015 Wenn AWS auf inaktiv gesetzt wird, dann werden alle teilnehmenden Geraete ausgeschaltet - Dokumentation der Variablen / variablen deklaration nachgeholt fuer zwei Faelle //..........Version 0.44 04.01.2015 Addieren der Einschaltverzoegerung zur Ausschaltzeit fuer die Ausschaltzeitberechnung // Fixed Fehler doppelte Schaltung fuer STATE geraete //..........Version 0.45 04.01.2015 weiterer Fehler zur Berechnung der Ausschaltzeit korrigiert //..........Version 0.50 04.01.2015 Beseitigung unnötiges Coding // Ueberpruefung ob Geraet existiert hinzugefuegt - LogMeldung falls nicht hinzugefuegt. - kein Javascript restart mehr, wenn geraet nicht existiert //..........Version 0.60 04.01.2015 Ausschalten der Teilnehmer bei Deaktivierung optimiert. Ausschaltung optional gemacht / Astrozeit ueberarbeitet //..................................Astrozeit auch fuer die bis Zeit hinzugefuegt. Damit lassen sich Schaltungen bis zum Sonnenaufgang umsetzen / weitere Codeoptimierungen //..........Version 0.61 05.01.2015 Beim Ausschalten Verzoegerung zwischen Schaltvorgange eingebaut / Codeiptimierung bei den Gruppen Schedules / Fehler bei der GrpZufAnz und StartDelay beseitigt fuer Gruppen 2-5 //..........Version 0.65 06.01.2015 Reaktion bei bereits eigneschalteten Lampen variabel gemacht / Codeoptimierungen / ID fuer AWS-Aktiv ist jetzt variabel //..........Version 0.70 26.01.2015 SetStateDelayed ist jetzt in javascript gefixt ab JS version 1.1.2 - Das Loeschen von Ein/Auschaltplanungen wird jetzt mit dem neuen Befehl clearStateDelayed gemacht //..................................Vorläufig wurde das Merken der letzten Aktion geloescht, da es keine Verwendung im Moment hat //..........Version 0.75 27.01.2015 Fehler beim Loeschen von Ein/Auschaltplanungen behoben - Es wurde nicht geloescht, wenn Verbraucher eingeschaltet bleiben sollen //..........Version 0.80 28.04.2016 Fehler mit der Astrozeit, wenn die BisZeit < ist als die Astrozeit(von) beseitigt //..........Version 0.90 23.12.2017 Umgestellt auch für nicht HM-Geraete nutzbar - danke an BF //// Das Script wird aktiviert, wenn das Flag "Anwesenheitssteuerung gesetzt wird" // HIER Einstellungen vornehmen............................................................................................ // Einstellungen der Aktivzeiten je IDGruppe von bis var zeit1von = "06:00:00"; //Aktivzeit von IDGruppe1 var zeit1bis = "21:30:00"; //Aktivzeit bis IDGruppe1 var zeit2von = "20:15:00"; //Aktivzeit von IDGruppe2 var zeit2bis = "23:30:00"; //Aktivzeit bis IDGruppe2 var zeit3von = "23:30:00"; //Aktivzeit von IDGruppe3 var zeit3bis = "01:00:00"; //Aktivzeit bis IDGruppe3 var zeit4von = "14:00:00"; //Aktivzeit von IDGruppe4 var zeit4bis = "03:00:00"; //Aktivzeit bis IDGruppe4 var zeit5von = "19:00:00"; //Aktivzeit von IDGruppe5 var zeit5bis = "23:00:00"; //Aktivzeit bis IDGruppe5 // Wenn Astrozeit auf true steht, dann wird die vonZeit durch die Astrozeit übersteuert var vonAstro1 = false ; // die zeit1von wird ersetzt durch die Astrozeit - wenn auf night - setting ist optional true = Verwendung der Astrozeit - IDGruppe1 var vonAstro2 = false ; // die zeit1von wird ersetzt durch die Astrozeit - wenn auf night - setting ist optional true = Verwendung der Astrozeit - IDGruppe2 var vonAstro3 = false ; // die zeit1von wird ersetzt durch die Astrozeit - wenn auf night - setting ist optional true = Verwendung der Astrozeit - IDGruppe3 var vonAstro4 = false ; // die zeit1von wird ersetzt durch die Astrozeit - wenn auf night - setting ist optional true = Verwendung der Astrozeit - IDGruppe4 var vonAstro5 = false ; // die zeit1von wird ersetzt durch die Astrozeit - wenn auf night - setting ist optional true = Verwendung der Astrozeit - IDGruppe5 // Wenn bis Astrozeit auf true steht, dann wird die bisZeit durch die Astrozeit übersteuert var bisAstro1 = false ; // die zeit1von wird ersetzt durch die Astrozeit - setting ist optional true = Verwendung der Astrozeit - IDGruppe1 var bisAstro2 = false ; // die zeit1von wird ersetzt durch die Astrozeit - setting ist optional true = Verwendung der Astrozeit - IDGruppe2 var bisAstro3 = false ; // die zeit1von wird ersetzt durch die Astrozeit - setting ist optional true = Verwendung der Astrozeit - IDGruppe3 var bisAstro4 = false ; // die zeit1von wird ersetzt durch die Astrozeit - setting ist optional true = Verwendung der Astrozeit - IDGruppe4 var bisAstro5 = false ; // die zeit1von wird ersetzt durch die Astrozeit - setting ist optional true = Verwendung der Astrozeit - IDGruppe5 // Einstellungen der zufaelligen Einschaltdauer je IDGruppe von bis var ein1von = 1; // Minuten IDGruppe1 von var ein1bis = 2; // Minuten IDGruppe1 bis var ein2von = 10; // Minuten IDGruppe2 von var ein2bis = 30; // Minuten IDGruppe2 bis var ein3von = 5; // Minuten IDGruppe3 von var ein3bis = 20; // Minuten IDGruppe3 bis var ein4von = 20; // Minuten IDGruppe4 von var ein4bis = 45; // Minuten IDGruppe4 bis var ein5von = 10; // Minuten IDGruppe5 von var ein5bis = 30; // Minuten IDGruppe5 bis // Einstellung je Gruppe für die maximale Startverzögerung in Minuten // bei 0 = keine Startverzögerung - bei z.B. 10 = Startverzögerung zwischen 0 und 10 in Minuten // var StartDelay1 = 1; // Maximale Startverzoegerung Gruppe1 var StartDelay2 = 5; // Maximale Startverzoegerung Gruppe2 var StartDelay3 = 5; // Maximale Startverzoegerung Gruppe3 var StartDelay4 = 5; // Maximale Startverzoegerung Gruppe4 var StartDelay5 = 0; // Maximale Startverzoegerung Gruppe5 // Einstellung Check-schedule - Voreinstellung z.B. alle 30 Minuten je IDGruppe - Damit wird je Lauf nach Zufaelligkeit je ein Geraet der IDGruppe eingeschaltet var cron1 = 1; // checks alle x Minuten für IDGruppe1 var cron2 = 2; // checks alle x Minuten für IDGruppe2 var cron3 = 5; // checks alle x Minuten für IDGruppe3 var cron4 = 5; // checks alle x Minuten für IDGruppe4 var cron5 = 0; // checks alle x Minuten für IDGruppe5 // Einstellung teilnehmende Homematic Geräte je IDGruppe maximal 5 - Eingabe der Homematic ID var IDGruppe11 = "knx.0.Beleuchtung.EG.Esszimmer_Spots_Schalten"; // Licht Wohnzimmer Esstisch Deckenlampe var IDGruppe12 = "knx.0.Beleuchtung.EG.Essen_Wandleuchten_Schalten"/*Gäste-WC Spots Schalten*/; // Licht Terrassentuere var IDGruppe13 = "knx.0.Beleuchtung.EG.Flur_Bodenspots_Schalten"/*Spüle Regal unten Schalten*/; // Licht Wohnzimmer Esstisch Stehlampe var IDGruppe14 = "knx.0.Beleuchtung.EG.Flur_Hängelampe_Schalten"/*Kind West Licht Schalten*/; // Licht Kinderbad var IDGruppe15 = "knx.0.Beleuchtung.EG.Flur_Spots_Schalten"/*Essen Wandleuchten Schalten*/; // Licht Hobbyraum var Grp1ZufAnz = 5; // Anzahl der Geräte zur zufälligen Bestimmung des Geraetes var IDGruppe21 = " "/*Essen Wandleuchten Schalten*/; // Licht Wohnzimmer Esstisch Deckenlampe var IDGruppe22 = " "/*Spüle Regal unten Schalten*/; // Licht Terrassentuere var IDGruppe23 = " "/*Flur Wandspot Schalten*/; // Licht Wohnzimmer Esstisch Stehlampe var IDGruppe24 = " "/*Hobbyraum Indirekt Schalten*/; var IDGruppe25 = " "; var Grp2ZufAnz = 4; // Anzahl der Geräte zur zufälligen Bestimmung des Geraetes var IDGruppe31 = " "/*Kind West Licht Schalten*/; // Licht Flur oben Wand; var IDGruppe32 = " "/*Bad Wanne Spot Schalten*/; // Licht Flur oben unten; var IDGruppe33 = " "/*Flur Wandspot Schalten*/; // Licht Kinderbad var IDGruppe34 = " "; var IDGruppe35 = " "; var Grp3ZufAnz = 3; // Anzahl der Geräte zur zufälligen Bestimmung des Geraetes var IDGruppe41 = " "/*Terrasse Blumenbeet Licht Schalten*/; // Licht aussen Steinterrasse var IDGruppe42 = " "/*Terrasse Wandleuchte Schalten*/; // Licht aussen Kugeln var IDGruppe43 = " "/*Kind Ost Balkon Spot Schalten*/; // Licht Schwimmbad Nebenlicht; var IDGruppe44 = " "; var IDGruppe45 = " "; var Grp4ZufAnz = 3; // Anzahl der Geräte zur zufälligen Bestimmung des Geraetes var IDGruppe51 = " "; var IDGruppe52 = " "; var IDGruppe53 = " "; var IDGruppe54 = " "; var IDGruppe55 = " "; var Grp5ZufAnz = 5; // Anzahl der Geräte zur zufälligen Bestimmung des Geraetes var logflag = true; // wenn auf true dann wird das logging in Datei /opt/iobroker/iobroker-data/AWSLog.csv eingeschaltet bei false vice versa var ausflag = false; // Wenn AWS deaktiviert wird, dann werden alle Teilnehmer ausgeschaltet // Ende Einstellungen ....................................................................................................... // Experten-Einstellungen ....................................................................................................... createState('Anwesenheitssteuerung.AWSAktiv',true); var IDAWSaktiv = "javascript.0.Anwesenheitssteuerung.AWSTest"/*Anwesenheitssteuerung.AWSAktiv*/; // in den objekten angelegte variable zur Bestimmung ob AWS aktiv ist - Kann auch ausgetauscht werden durch eine andere var LogPath = "/opt/iobroker/iobroker-data/AWSLog.csv"; // Pfad und Dateiname des externen Logs var IgnoreWhenOn = false; // bei true: Ignoriert den Schaltvorgang, wenn das Geraet bereits eingeschaltet war // neu var EinschaltFlag = 1; // Einschaltbefehl der Teilnehmer fuer Boolean Geräte var AusschaltFlag = 0; // Ausschaltbefehl der Teilnehmer fuer Boolean Geräte var DimmAusschalt = 0; // Ausschaltbefehl fuer Number Geräte (Dimmer) var DimmEinschalt = 7; // Einschaltbefehl fuer Number Geräte (Dimmer) = Einschaltlevel auf den geschaltet wird // Ende Experten-Einstellungen ....................................................................................................... var fs = require('fs'); // enable write fuer externes log var cron1job = "*/"+cron1+" * * * *"; // CRON pattern aufgrund der Vorgabe in den Einstellungen var cron2job = "*/"+cron2+" * * * *"; // CRON pattern aufgrund der Vorgabe in den Einstellungen var cron3job = "*/"+cron3+" * * * *"; // CRON pattern aufgrund der Vorgabe in den Einstellungen var cron4job = "*/"+cron4+" * * * *"; // CRON pattern aufgrund der Vorgabe in den Einstellungen var cron5job = "*/"+cron5+" * * * *"; // CRON pattern aufgrund der Vorgabe in den Einstellungen var x = 0; // Geraetenummer der Gruppe, die zufaellig ausgewaehlt wurde var y = 0; // Einschaltzdauer aufgrund der Zufallszahl in Millisekunden var z = 0; // Einschaltverzögerung aufgrund der Zufallszahl var string = " "; // Logstring var logtext=" " ; // Kommentar im log var objIDGruppe = " "; // uebergabe an Funktion der IDGruppe zum Schalten des Geraetes var SpaceChk = new RegExp(/\s/); // pattern um zu pruefen ob eine IDGruppe blanks enthaelt // Execute IDGruppe1 //------------------------------------------------------------------------------------------------------------------------------------------------------- schedule(cron1job, function() { if (getState(IDAWSaktiv).val === true) { // AWS aktiv ? zeit1von = astrojetzt(zeit1von,zeit1bis,"von",vonAstro1,bisAstro1); // endif - setzen der abweichenden von-Zeit falls Astro aktiv zeit1bis = astrojetzt(zeit1von,zeit1bis,"bis",vonAstro1,bisAstro1); // endif - setzen der abweichenden bis-Zeit falls Astro aktiv // if (vonAstro1 === true) { zeit1von = astrojetzt(zeit1von,"von"); } // endif - setzen der abweichenden von-Zeit falls Astro aktiv // if (bisAstro1 === true) { zeit1bis = astrojetzt(zeit1bis,"bis"); } // endif - setzen der abweichenden bis-Zeit falls Astro aktiv if(isTimeInRange(zeit1von, zeit1bis)) { // ist die "von"-Zeit innerhalb des aktuellen Zeitfensters ? log("astrozeit1von gesetzt von " + zeit1von + " bis " + zeit1bis ,"info"); x = zufall(1,Grp1ZufAnz,x); // Ermittlung zufaelliges Geraet zum enschalten z = zufall(0,StartDelay1*60,y)*1000; // Ermittlung der Einschaltverzögerung aufgrund der Zufallszahl y = zufall(ein1von*60,ein1bis*60,y)*1000; // Ermittlung der Einschaltzdauer aufgrund der Zufallszahl in Millisekunden var IDGruppe = "IDGruppe1" + x; // Ermittlung Gruppenname z.B. IDGruppe11 if (x <= 5 && GeraetExists(IDGruppe)) { AWSSchaltung(IDGruppe,y,z); } // Geraetenummer muss 1 - 5 sein, dass Geraet muss existieren dann schalten } // Ende Zeitcheck } // Endeif für AWS-Aktivflag check }); // end schedule IDGruppe1 // Execute IDGruppe2 //------------------------------------------------------------------------------------------------------------------------------------------------------- schedule(cron2job, function() { if (getState(IDAWSaktiv).val === true) { // AWS aktiv ? zeit2von = astrojetzt(zeit2von,zeit2bis,"von",vonAstro2,bisAstro2); // endif - setzen der abweichenden von-Zeit falls Astro aktiv zeit2bis = astrojetzt(zeit2von,zeit2bis,"bis",vonAstro2,bisAstro2); // endif - setzen der abweichenden bis-Zeit falls Astro aktiv // if (vonAstro2 === true) { zeit2von = astrojetzt(zeit2von,"von"); } // endif - setzen der abweichenden von-Zeit falls Astro aktiv // if (bisAstro2 === true) { zeit2bis = astrojetzt(zeit2bis,"bis"); } // endif - setzen der abweichenden bis-Zeit falls Astro aktiv if(isTimeInRange(zeit2von, zeit2bis)) { // ist die "von"-Zeit innerhalb des aktuellen Zeitfensters ? x = zufall(1,Grp2ZufAnz,x); // Ermittlung zufaelliges Geraet zum enschalten z = zufall(0,StartDelay2*60,y)*1000; // Ermittlung der Einschaltverzögerung aufgrund der Zufallszahl y = zufall(ein2von*60,ein2bis*60,y)*1000; // Ermittlung der Einschaltzdauer aufgrund der Zufallszahl in Millisekunden var IDGruppe = "IDGruppe2" + x; // Ermittlung Gruppenname z.B. IDGruppe21 if (x <= 5 && GeraetExists(IDGruppe)) { AWSSchaltung(IDGruppe,y,z); } // Geraetenummer muss 1 - 5 sein, dass Geraet muss existieren dann schalten } // Ende Zeitcheck } // Endeif für AWS-Aktivflag check }); // end schedule IDGruppe2 // Execute IDGruppe3 //------------------------------------------------------------------------------------------------------------------------------------------------------- schedule(cron3job, function() { if (getState(IDAWSaktiv).val === true) { // AWS aktiv ? zeit3von = astrojetzt(zeit3von,zeit3bis,"von",vonAstro3,bisAstro3); // endif - setzen der abweichenden von-Zeit falls Astro aktiv zeit3bis = astrojetzt(zeit3von,zeit3bis,"bis",vonAstro3,bisAstro3); // endif - setzen der abweichenden bis-Zeit falls Astro aktiv // if (vonAstro3 === true) { zeit3von = astrojetzt(zeit3von,"von"); } // endif - setzen der abweichenden von-Zeit falls Astro aktiv // if (bisAstro3 === true) { zeit3bis = astrojetzt(zeit3bis,"bis"); } // endif - setzen der abweichenden bis-Zeit falls Astro aktiv if(isTimeInRange(zeit3von, zeit3bis)) { // ist die "von"-Zeit innerhalb des aktuellen Zeitfensters ? x = zufall(1,Grp3ZufAnz,x); // Ermittlung zufaelliges Geraet zum enschalten z = zufall(0,StartDelay3*60,y)*1000; // Ermittlung der Einschaltverzögerung aufgrund der Zufallszahl y = zufall(ein3von*60,ein3bis*60,y)*1000; // Ermittlung der Einschaltzdauer aufgrund der Zufallszahl in Millisekunden var IDGruppe = "IDGruppe3" + x; // Ermittlung Gruppenname z.B. IDGruppe31 if (x <= 5 && GeraetExists(IDGruppe)) { AWSSchaltung(IDGruppe,y,z); } // Geraetenummer muss 1 - 5 sein, dass Geraet muss existieren dann schalten } // Ende Zeitcheck } // Endeif für AWS-Aktivflag check }); // end schedule IDGruppe3 // Execute IDGruppe4 //------------------------------------------------------------------------------------------------------------------------------------------------------- schedule(cron4job, function() { if (getState(IDAWSaktiv).val === true) { // AWS aktiv ? zeit4von = astrojetzt(zeit4von,zeit4bis,"von",vonAstro4,bisAstro4); // endif - setzen der abweichenden von-Zeit falls Astro aktiv zeit4bis = astrojetzt(zeit4von,zeit4bis,"bis",vonAstro4,bisAstro4); // endif - setzen der abweichenden bis-Zeit falls Astro aktiv // if (vonAstro4 === true) { zeit4von = astrojetzt(zeit4von,"von"); } // endif - setzen der abweichenden von-Zeit falls Astro aktiv // if (bisAstro4 === true) { zeit1bis = astrojetzt(zeit4bis,"bis"); } // endif - setzen der abweichenden bis-Zeit falls Astro aktiv if(isTimeInRange(zeit4von, zeit4bis)) { // ist die "von"-Zeit innerhalb des aktuellen Zeitfensters ? x = zufall(1,Grp4ZufAnz,x); // Ermittlung zufaelliges Geraet zum enschalten z = zufall(0,StartDelay4*60,y)*1000; // Ermittlung der Einschaltverzögerung aufgrund der Zufallszahl y = zufall(ein4von*60,ein4bis*60,y)*1000; // Ermittlung der Einschaltzdauer aufgrund der Zufallszahl in Millisekunden var IDGruppe = "IDGruppe4" + x; // Ermittlung Gruppenname z.B. IDGruppe41 if (x <= 5 && GeraetExists(IDGruppe)) { AWSSchaltung(IDGruppe,y,z); } // Geraetenummer muss 1 - 5 sein, dass Geraet muss existieren dann schalten } // Ende Zeitcheck } // Endeif für AWS-Aktivflag check }); // end schedule IDGruppe4 // Execute IDGruppe5 //------------------------------------------------------------------------------------------------------------------------------------------------------- schedule(cron5job, function() { if (getState(IDAWSaktiv).val === true) { // AWS aktiv ? zeit5von = astrojetzt(zeit5von,zeit5bis,"von",vonAstro5,bisAstro5); // endif - setzen der abweichenden von-Zeit falls Astro aktiv zeit5bis = astrojetzt(zeit5von,zeit5bis,"bis",vonAstro5,bisAstro5); // endif - setzen der abweichenden bis-Zeit falls Astro aktiv // if (vonAstro5 === true) { zeit5von = astrojetzt(zeit5von,"von"); } // endif - setzen der abweichenden von-Zeit falls Astro aktiv // if (bisAstro5 === true) { zeit5bis = astrojetzt(zeit5bis,"bis"); } // endif - setzen der abweichenden bis-Zeit falls Astro aktiv if(isTimeInRange(zeit5von, zeit5bis)) { // ist die "von"-Zeit innerhalb des aktuellen Zeitfensters ? x = zufall(1,Grp5ZufAnz,x); // Ermittlung zufaelliges Geraet zum enschalten z = zufall(0,StartDelay5*60,y)*1000; // Ermittlung der Einschaltverzögerung aufgrund der Zufallszahl y = zufall(ein5von*60,ein5bis*60,y)*1000; // Ermittlung der Einschaltzdauer aufgrund der Zufallszahl in Millisekunden var IDGruppe = "IDGruppe5" + x; // Ermittlung Gruppenname z.B. IDGruppe51 if (x <= 5 && GeraetExists(IDGruppe)) { AWSSchaltung(IDGruppe,y,z); } // Geraetenummer muss 1 - 5 sein, dass Geraet muss existieren dann schalten } // Ende Zeitcheck } // Endeif für AWS-Aktivflag check }); // end schedule IDGruppe5 // ------------------------Ruecksetzen der Timeouts /Ausschalten der teilnehmenden Geraete, wenn AWS-Aktiv auf false gesetzt wird-------------- on({id: IDAWSaktiv, val: false }, function(obj) // Event: wenn AWS Flag auf nicht aktiv gesetzt wurde { var objGruppeI = " "; // Baut die IDGruppe zusammen Position 1 var objGruppeJ = " "; // Baut die IDGruppe zusammen Position 2 var countobj = 0; //counter fuer Verzoegerungen zwischen den Ausschaltungen for (i = 1; i <= 5; i++) { // Loop fuer die Gruppen-Nr objGruppeI = "IDGruppe" + i; // Loop fuer die Geraete Nr der IDGruppen 1 - 5 for (j = 1; j <= 5; j++) { // Loop Position 2 /1 - 5 ) objGruppeJ = objGruppeI + j ; // Ermittlung Position 2 if (SpaceChk.test(eval(objGruppeJ))) { // Check for blanks } else { // keine blanks if (GeraetExists(objGruppeJ) === true) { // Gibt es das Geraet clearStateDelayed(eval(objGruppeJ)); // Alle Pläne der Gruppe loeschen if (ausflag) { // sollen die Teilnehmer ausgeschaltet werden ? setStateDelayed(eval(objGruppeJ), false, countobj); // ausschalten mit je 300 millisekunden wartezeit } // endif check ob Geraete ausgeschaltet werden sollen countobj = countobj + 300; // alle 300 millisekunden schalten } // endif fuer Geraetecheck und switch off } // end Space Check } // Ende Position 2 Loop } // Ende Position 1 Loop log("EVENT AWS deaktiviert Der schedule zur geplanten Ausschaltung von Geraeten wurde zurueckgesetzt " ,"info"); string = ";;;;;;;AWS wurde deaktiviert - Der schedule zur geplanten Ausschaltung von Geraeten wurde zurueckgesetzt"; // bereite LOG vor writelog(string); // schreibe LOG in Datei }); // ende on id // ------------------------schreibe Log wenn AWS aktiviert wurde-------------------------------------- on({id: IDAWSaktiv, val: true }, function(obj) // Event: wenn AWS Flag auf nicht aktiv gesetzt wurde { log("EVENT AWS wurde aktiviert " ,"info"); string = ";;;;;;;AWS wurde aktiviert"; // bereite LOG vor writelog(string); }); // ende on id // ------------------------ F U N K T I O N E N ------------------------------------------------------- //----------------------------------------------------------------------------------------------------- // Diese Funktion schaltet die IDGruppenmitglieder der gerade zu berabeitenden IDGruppe //----------------------------------------------------------------------------------------------------- // neu function AWSSchaltung(objIDGruppe,y,z) { logtext = " "; var id = eval(objIDGruppe); var obj = getObject(id); if (!obj) return; if (obj.common && obj.common.type === 'boolean') { // ist es ein STATE Geraet ? if (getState(id).val == AusschaltFlag ) { // nur wenn noch nicht eingeschaltet setStateDelayed(id, EinschaltFlag, z); // Licht an in z millisekunden // var timer = setTimeout(function (){ // setState(eval(objIDGruppe),0); }, z+y); //Licht aus in y millisekunden (Einschaltverzoegerung plus Einschaltdauer) console.log('SET: ' + id + ' to false in ' + (z+y) + 'ms'); setStateDelayed(id, false, z+y, false); //Licht aus in z+y millisekunden (Einschaltverzoegerung plus Einschaltdauer) } else { // else - Geraet ist schon eingeschaltet if (IgnoreWhenOn) { //keine Reaktion wenn Geraet bereits eingeschaltet war logtext = "keine Aktion - Geraet war bereits eingeschaltet"; } else { // else - es soll uebersteuert werden mit den neuen werten z = 0; // Einschaltverzoegerung setzen auf Null console.log('SET: ' + id + ' to false in ' + (z+y) + 'ms'); setStateDelayed(id, AusschaltFlag, z+y, true ); //Licht aus in z+y millisekunden (Einschaltverzoegerung plus Einschaltdauer) ohne Einschaltverzoegerung logtext = "Geraet war bereits eingeschaltet -- uebersteuert - ohne Einschaltverzoegerung - alter schedule geloescht- "; } // endeif IgnoreWhenOn } // Ende IF fuer Check ob bereits eingeschaltet } // Ende IF für STATE Geraete if (obj.common && obj.common.type === 'number') { // ist es ein LEVEL Geraet ? if (getState(id).val == DimmAusschalt ) { // nur wenn noch nicht eingeschaltet console.log('SET: ' + id + ' to ' + (obj.common.max || 100) + ' in ' + z + 'ms'); setStateDelayed(id, obj.common.max || DimmEinschalt, z); // Licht an in z millisekunden // var timer = setTimeout(function (){ // setState(eval(objIDGruppe),0); }, z+y); //Licht aus in y millisekunden (Einschaltverzoegerung plus Einschaltdauer) console.log('SET: ' + id + ' to ' + (obj.common.min || 0) + ' in ' + (z+y) + 'ms'); setStateDelayed(id, obj.common.min || DimmAusschalt, z+y, false); //Licht aus in y millisekunden (Einschaltverzoegerung plus Einschaltdauer) } else { // else - Geraet ist schon eingeschaltet if (IgnoreWhenOn) { //keine Reaktion wenn Geraet bereits eingeschaltet war logtext = "keine Aktion - Geraet war bereits eingeschaltet"; } else { // else - es soll uebersteuert werden mit den neuen werten z = 0; // Einschaltverzoegerung setzen auf Null console.log('SET: ' + id + ' to ' + (obj.common.min || DimmAusschalt) + ' sofort'); setStateDelayed(id, obj.common.min || DimmAusschalt, z+y, true); //Licht aus in z+y millisekunden (Einschaltverzoegerung plus Einschaltdauer) ohne Einschaltverzoegerung logtext = "Geraet war bereits eingeschaltet -- uebersteuert - ohne Einschaltverzoegerung - alter schedule geloescht- "; } // endeif IgnoreWhenOn } // Ende IF fuer Check ob bereits eingeschaltet } // Ende IF für LEVEL Geraete var GeraeteName = getObject(id).common.name; // Name des Geraetes in Klartext var now = new Date(); // store current date and time var currSec = now.getTime(); // millisekunden seit 01.01.1970 /current millisecs var berechnEinZeit = millisecToDate( currSec + z); // millisecs in Zeit umrechnen fuer die Einschaltzeit var berechnAusZeit = millisecToDate(currSec + z + y); // millisecs in Zeit umrechnen fuer die Ausschaltzeit // WriteArray(objIDGruppe,timer, currSec + z, currSec + z + y) // Merken des Schaltvorganges string = objIDGruppe+";" + eval(objIDGruppe) +";" + GeraeteName + ";" + z/1000 + ";" +y/1000+";"+berechnEinZeit + ";" + berechnAusZeit + ";" + logtext; // bereite LOG vor log("EVENT " + objIDGruppe + "; " +id + "; " + GeraeteName + "; " + z/1000 + "; " + y/1000 + "; " + berechnEinZeit + "; " + berechnAusZeit + "; " + logtext, "info"); //Log schreiben writelog(string); // schreibe LOG in Datei Logtext = " "; } // Ende Funktion //----------------------------------------------------------------------------------------------------- // Funktion merkt sich den letzten Schaltvorgang zum Loeschen des Schedules und auch zur Optimierung der Schaltvorgaenge //----------------------------------------------------------------------------------------------------- //function WriteArray(objIDGruppe,timer,von,bis) { // log("EVENT " + objIDGruppe + "; " + von + "; " + bis + "; " , "info"); //for (var i = 0; i <=25; ++i) { // if ( Gruppen[i][0].slice(6,8) === objIDGruppe.slice(8,10)) { // Identifikation der Objektgruppe // Gruppen[i][1] = timer; Gruppen[i][2] = von; Gruppen[i][3] = bis; // Schreibe Werte in Array // log("Arrayliste "+ Gruppen[i][0] + " " + " " + Gruppen[i][0].slice(7,2) + objIDGruppe.slice(9,2) ),"info"; // log("Arrayliste "+ Gruppen[i][0] + " " + Gruppen[i][1] + " " + Gruppen[i][2] + " " + Gruppen[i][3] ),"info"; // // } // ende if - Identifikation der Gruppe // } // ende for Schleife //return Gruppen; // } // ende Funktion //----------------------------------------------------------------------------------------------------- // Funktion zur Bestimmung einer ganzzahligen Zufallszahl innerhalb vorgegebener min/max Werte //----------------------------------------------------------------------------------------------------- function zufall(low,high,back) { back = Math.floor(Math.random() * (high - low + 1)) + low; // log("EVENT AWS Zufallszahlen - low = " + low + "high = " + high + " back = " + back ,"info"); return back; } // ende Funktion //----------------------------------------------------------------------------------------------------- // Funktion zur Ueberpruefung ob die angegebenen Geraete exisiteren //----------------------------------------------------------------------------------------------------- function GeraetExists(objGruppe) { back = false; if (SpaceChk.test(eval(objGruppe))) { // objIDGruppe darf kein space enthalten // ist ein Geraet ueberhaupt zugeordnet ? // log("Geraet hat kein assignment - Gruppe " + objGruppe, "info"); return back; } // endif IDGruppe hat kein assignment if (getState(eval(objGruppe))) { // Existiert das Geraet ? back = true; } else { log("Geraet existiert nicht - bitte in den Einstellungen ueberpruefen - Gruppe " + objGruppe, "info"); } // endif check on Geraet exists return back; } // ende Funktion //----------------------------------------------------------------------------------------------------- // Funktion schreibt einen Logeintrag in das Filesystem und auch in das interne Log-System //----------------------------------------------------------------------------------------------------- function writelog(string) { if (logflag === true) { // Zerlege Datum und Zeit in Variable var now = new Date(); // store current date and time var year = now.getFullYear(); var month = addZero(now.getMonth()+1); var day = addZero(now.getDate()); var Thour = addZero(now.getHours()); var Tmin = addZero(now.getMinutes()); var Tsec = addZero(now.getSeconds()); var logdate = day + '.' + month + '.' + year; var logtime = Thour + ':' + Tmin + ':' + Tsec; if (fs.existsSync(LogPath)) { fs.appendFileSync(LogPath, logdate+" ;"+logtime+" ;"+string + "\n"); // Füge Satz in Datei ein } else { log("Logfile nicht gefunden - wird angelegt"), "info"; var headerLine= "Datum;Uhrzeit;Gruppe;GeraeteID;Geraetebezeichnung;Einschaltverzoegerung;LaengeSchaltzeit;ZeitEin berechnet;ZeitAus berechnet;Kommentar" fs.appendFileSync(LogPath, headerLine + "\n"); // Füge Satz in Datei ein fs.appendFileSync(LogPath, logdate+" ;"+logtime+" ;"+string + "\n"); // Füge Satz in Datei ein } // endif Filecheck } ; // Ende check on logflag } // Ende Funktion //------------------------Ermittlung der Zeit wenn Astrozeit eingeschaltet wird // Funktion bestimmt ob die Astrozeit die Gültigkeitsbereich der VonZeit overruled //----------------------------------------------------------------------------------------------------- function astrojetzt(zeitvon, zeitbis, abschnitt,astrovon,astrobis) { var sunriseEnd = getAstroDate("sunriseEnd"); // Ende der Nacht nach Astro var sunsetStart = getAstroDate("sunsetStart"); // Ende des Tages nach Astro var nowvon; // fuer astrozeitrechnung vonzeit var nowbis; // fuer astrozeitrechnung vonzeit var Thour; // Stunde mit führender Null var Tmin; // Minute mit führender Null var lower; // Zeitvergleich var upper; // Zeitvergleih var zeit; // Rueckgabezeit if(astrovon === true ) { // Astrozeit gesetzt nowvon = new Date(sunsetStart); // store sunset date and time vonZeit Thour = addZero(nowvon.getHours()); // extract hour Tmin = addZero(nowvon.getMinutes()); // extract min zeitvon = Thour + ':' + Tmin + ':' + "00"; // Zusammensetzen der Zeit in Format hh:mm:ss } if(astrobis === true ) { // Astrozeit gesetzt nowbis = new Date(sunriseEnd); // store sunset date and time vonZeit Thour = addZero(nowbis.getHours()); // extract hour Tmin = addZero(nowbis.getMinutes()); // extract min zeitbis = Thour + ':' + Tmin + ':' + "00"; // Zusammensetzen der Zeit in Format hh:mm:ss } if (abschnitt === "von") { // wenn vonZeit berechnet wird lower = addTime(zeitvon); // vonZeit muss kleiner sein als bis Zeit upper = addTime(zeitbis); // bisZeit muss groesser sein als vonZeit zeit = zeitvon; if (upper < lower && astrovon === true && astrobis === false) { // Sonderfall wenn die biszeit kleiner als die astrozeit ist zeit = zeitbis; // wenn die Astrozeit groesser wird als die BisZeit, dann ist vonZeit = bisZeit } } if (abschnitt === "bis") { // nur Rückgabewert setzen zeit = zeitbis; } return zeit; // fertig } // Ende Funktion //----------------------------------------------------------------------------------------------------- // Funktion zur Erzeugung von führenden Nullen für das Datum Format //----------------------------------------------------------------------------------------------------- function addZero(i) { if (i < 10) { i = "0" + i; } return i; } // Ende Funktion //----------------------------------------------------------------------------------------------------- // Funktion Millisekunden in Datum/Zeit umrechnen /wird für logging benoetigt //----------------------------------------------------------------------------------------------------- function millisecToDate(millisec) { var time = new Date(millisec); var Thour = addZero(time.getHours()); var Tmin = addZero(time.getMinutes()); var Tsec = addZero(time.getSeconds()); datum = Thour + ':' + Tmin + ':' + Tsec; return datum; } // Ende Funktion //----------------------------------------------------------------------------------------------------- // 3 Funktionen zum Zeitrange check zur Prüfung ob die Schaltungszeiten erreicht sind // Autor ist Beatz - uebernommen aus: // viewtopic.php?f=21&t=1072&p=11167&hilit=isTimeInRange&sid=4dca8ea2c7f9337cdc73a1a9e4824a40#p11167 //----------------------------------------------------------------------------------------------------- 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; } 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; }