Skip to content
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. [Vorlage] Anwesenheitssimulation - Script

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.2k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.9k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.1k

[Vorlage] Anwesenheitssimulation - Script

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
271 Beiträge 40 Kommentatoren 64.7k Aufrufe 36 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • L Offline
    L Offline
    looxer01
    schrieb am zuletzt editiert von
    #142

    Hi,

    ich habe jetzt den Fix eingebaut. Der Vorschlag war ganz gut und macht den Code schlanker.

    Das Problem war aber noch da. Ist jetzt gefixt.

    Koenntet ihr testen ?

    Einstellungen beibehalten und alles unter den Einstellungen reinkopieren.

    Die Einstellungen habe ich also aus dem u.g. Code entfernt.

    Bitte um Feedback.

    vG Looxer

    ! ```
    `// Experten-Einstellungen .......................................................................................................
    ! createState('Anwesenheitssteuerung.AWSAktiv',true);
    var IDAWSaktiv = "javascript.0.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
    ! var EinschaltFlag = true; // Einschaltbefehl der Teilnehmer fuer Boolean Geräte
    var AusschaltFlag = false; // Ausschaltbefehl der Teilnehmer fuer Boolean Geräte
    var DimmAusschalt = 0; // Ausschaltbefehl fuer Number Geräte (Dimmer)
    var DimmEinschalt = 100; // 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 ?
    if(isTimeInAstroRange(zeit1von, zeit1bis, vonAstro1, bisAstro1)) { // ist die "von"-Zeit innerhalb des aktuellen Zeitfensters ?
    log("Zeit1von 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 ?
    if(isTimeInAstroRange(zeit2von, zeit2bis, vonAstro2, bisAstro2)) { // 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,ein2bis60,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 ?
    if(isTimeInAstroRange(zeit3von, zeit3bis, vonAstro3, bisAstro3)) { // 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 ?
    if(isTimeInAstroRange(zeit4von, zeit4bis, vonAstro4, bisAstro4)) { // 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,ein4bis60,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 ?
    if(isTimeInAstroRange(zeit5von, zeit5bis, vonAstro5, bisAstro5)) { // 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
    var id;
    var object;
    ! for (var i = 1; i <= 5; i++) { // Loop fuer die Gruppen-Nr
    objGruppeI = "IDGruppe" + i; // Loop fuer die Geraete Nr der IDGruppen 1 - 5
    for (var j = 1; j <= 5; j++) { // Loop Position 2 /1 - 5 )
    objGruppeJ = objGruppeI + j ; // Ermittlung Position 2
    id = eval(objGruppeJ);
    if (SpaceChk.test(id)) { // Check for blanks
    } else { // keine blanks
    object = getObject(id);
    if (GeraetExists(objGruppeJ) === true) { // Gibt es das Geraet
    clearStateDelayed(id); // Alle Pläne der Gruppe loeschen
    if (ausflag) { // sollen die Teilnehmer ausgeschaltet werden ?
    if (object.common && object.common.type === 'boolean') { // ist es ein STATE Geraet ?
    setStateDelayed(id, AusschaltFlag, countobj); // ausschalten mit je 300 millisekunden wartezeit
    }
    if (object.common && object.common.type === 'number') { // ist es ein LEVEL Geraet ?
    setStateDelayed(id, DimmAusschalt, 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, AusschaltFlag, 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+";" + id +";" + 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) {
    var back = false;
    var id = eval(objGruppe);

    if (SpaceChk.test(id)) { // 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(id)) { // 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;
    ! fs.readFile(LogPath, 'utf8', function(err,data){
    if (!err) { // File existiert
    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
    }
    }); // ende Filecheck
    } ; // Ende check on logflag

    } // Ende Funktion

    ! //-----------------------------------------------------------------------------------------------------
    //Funktion ------------------------Ermittlung der Zeit wenn Astrozeit eingeschaltet wird
    // Funktion ersetzt astrojetzt und is time in range
    //-----------------------------------------------------------------------------------------------------
    ! function isTimeInAstroRange (zeitvon, zeitbis, astrovon, astrobis) {
    var now = new Date();
    var sunriseEnd = getAstroDate("sunriseEnd"); // Ende der Nacht nach Astro
    var sunsetStart = getAstroDate("sunsetStart"); // Ende des Tages nach Astro
    var lower = addTime(zeitvon); // switch on time
    var upper = addTime(zeitbis); // switch off time
    var switchOffNextDay = upper < lower; // Abschaltung am nächsten Tag?
    ! if (astrovon === true) { // Astrozeit gesetzt
    lower = sunsetStart;
    }
    ! if (astrobis === true) { // Astrozeit gesetzt
    upper = sunriseEnd;
    }
    ! if (switchOffNextDay) { // Die von Zeit ist groesser als die bis Zeit
    if( (zeitbis.slice(0, 1) ) === "0" ) { // Uewberpruefen ob die BisZeit mit 0 beginng - dann annehmen, dass das Morgen ist
    upper.setDate(upper.getDate() + 1); // 1 Tag (24 Stunden ) addieren da der bis Wert wahrscheinlich am nächsten Tag liegen muss
    log("Routine isTimeInAstroRange - zeitbis started Morgen")
    }
    }
    log("Routine isTimeInAstroRange lower " + lower)
    log("Routine isTimeInAstroRange upper " + upper)
    if (upper < lower ) {
    log("upper ist kleiner als lower - zurück Gruppe nicht im Zeitrange (false)" );
    return false;
    }
    if( now >= lower && now <= upper ) {
    log("Routine isTimeInAstroRange - aktuelle ist ist > als lower und kleiner als upper - Gruppe wird geschaltet (true)" );
    return true;
    }
    log("Routine isTimeInAstroRange - Zeit nicht im Zeitrange - keine Schaltung ")
    return false;
    ! }
    ! //-----------------------------------------------------------------------------------------------------
    // 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());
    var datum = Thour + ':' + Tmin + ':' + Tsec;
    return datum;
    } // Ende Funktion
    ! //-----------------------------------------------------------------------------------------------------
    //Funktion addTime wandelt einen String mit Format 00:00:00 in rechenbare Zeit um
    //-----------------------------------------------------------------------------------------------------
    function addTime(strTime) {
    var d = new Date();
    d = new Date(d.getFullYear(), d.getMonth(), d.getDate())
    var time = strTime.split(':');
    d.setHours(time[0]);
    d.setMinutes(time[1]);
    d.setSeconds(time[2]);
    return d;
    }`
    [/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]

    1 Antwort Letzte Antwort
    0
    • E Offline
      E Offline
      etproject
      schrieb am zuletzt editiert von
      #143

      Hallo looxer,

      habe den geänderten Code gerade eingefügt.

      Muß aber wohl bis morgen warten ,bis ich erste Ergebnisse habe.

      Schöne Grüße

      1 Antwort Letzte Antwort
      0
      • M Offline
        M Offline
        Mihaeru
        schrieb am zuletzt editiert von
        #144

        Hi looxer01,

        die neue Funktion sieht gut aus - bis auf ein bestimmtes Szenario.

        Ich habe wieder mit VsCode simuliert - dabei mit fixen Astro Zeiten - aber eigentlich sollte das einigermaßen realistisch sein.

        Nehmen wir an, wir haben 08:30 und sunriseEnd ist um 09:00 Uhr. Wenn ich jetzt eine Schaltung hätte, die ab z.B. 20:20:00 bis Sonnenaufgang laufen soll, wären die Parameter zum Beispiel so:

        isTimeInAstroRange2("20:20:00", "09:45:00", false, true)
        

        Die jetzige Funktion würde false liefern, da die upperTime (die ja dann die Astro Zeit ist) einen Offset von einem Tag bekommt.

        Wo lag das Problem in meinem ursprünglichen Vorschlag? Vielleicht kann man das anders lösen.

        Oder man müsste eventuell in deiner Funktion noch unterscheiden, ob beim switchOffNextDay die aktuelle Zeit größer als die lower ist und nur dann die upper einen Tag weiter setzen und wenn nicht, die lower einen Tag zurück.

        Viele Grüße

        Mihaeru

        1 Antwort Letzte Antwort
        0
        • L Offline
          L Offline
          looxer01
          schrieb am zuletzt editiert von
          #145

          @Mihaeru:

          die neue Funktion sieht gut aus - bis auf ein bestimmtes Szenario.

          Ich habe wieder mit VsCode simuliert - dabei mit fixen Astro Zeiten - aber eigentlich sollte das einigermaßen realistisch sein.

          Nehmen wir an, wir haben 08:30 und sunriseEnd ist um 09:00 Uhr. Wenn ich jetzt eine Schaltung hätte, die ab z.B. 20:20:00 bis Sonnenaufgang laufen soll, wären die Parameter zum Beispiel so: isTimeInAstroRange2("20:20:00", "09:45:00", false, true) `

          Hi,

          ja, ich glaube das stimmt. Die Lösung wäre aber die gleiche. 09:45 wäre auf den nächsten Tag zu legen.

          baue ich noch ein. Hatte eh noch einen anderen Fehler gefunden.

          Am Besten wäre es, wenn bei Astro immer eine Dauer mit eingegeben würde. Das ist aber bei den Einstellungen eher verwirrend.

          Ich mache diese Änderung noch.

          vG Looxer

          1 Antwort Letzte Antwort
          0
          • L Offline
            L Offline
            looxer01
            schrieb am zuletzt editiert von
            #146

            Habs jetzt mal eingebaut - ist aber ungetestet

            ! //----------------------------------------------------------------------------------------------------- // Funktion isTimeInAstroRange - // Ermittlung ob die aktuelle Zeit in der vorgegebenen Schaltzeit liegt (inkl Astro) //----------------------------------------------------------------------------------------------------- ! function isTimeInAstroRange (zeitvon, zeitbis, astrovon, astrobis) { var now = new Date(); var sunriseEnd = getAstroDate("sunriseEnd"); // Ende der Nacht nach Astro var sunsetStart = getAstroDate("sunsetStart"); // Ende des Tages nach Astro var lower = addTime(zeitvon); // switch on time im berechenbaren Format var upper = addTime(zeitbis); // switch off time im berechenbaren Format ! if (astrovon === true) { // Astrozeit gesetzt lower = sunsetStart; } if (astrobis === true) { // Astrozeit gesetzt upper = sunriseEnd; } if (upper < lower) { // Die von Zeit ist groesser als die bis Zeit if(astrovon) { // im Falle von Astrovon kann es sein, dass die bis Zeit in den nächsten Tag geht if( (zeitbis.slice(0, 1) ) === "0" ) { // Uewberpruefen ob die BisZeit mit 0 beginng - dann annehmen, dass das Morgen ist upper.setDate(upper.getDate() + 1); // 1 Tag (24 Stunden ) addieren da der bis Wert wahrscheinlich am nächsten Tag liegen muss if (debug) { log("Routine isTimeInAstroRange - bei Astrovon die zeitbis started Morgen","info");} } } if(astrobis) { upper.setDate(upper.getDate() + 1); if (debug) { log("Routine isTimeInAstroRange - AstroBis started Morgen","info");} } if (!astrovon && !astrobis) { // wenn keine Astrozeit gesetzt ist und die bis Zeit kleiner ist --> nächster Tag für die BisZeit upper.setDate(upper.getDate() + 1); // 1 Tag (24 Stunden ) addieren da der bis Wert wahrscheinlich am nächsten Tag liegen muss } ! } if (debug) { log("Routine isTimeInAstroRange lower " + lower,"info");} if (debug) { log("Routine isTimeInAstroRange upper " + upper,"info");} if (upper < lower ) { // dies trifft zu wenn die astrozeit die realzeit eingeholt hat z.B. astrovon = 20:00 und bisZeit 19:00 if (debug) { log("upper ist kleiner als lower - zurück Gruppe nicht im Zeitrange false","info");} return false; } if( now >= lower && now <= upper ) { if (debug) { log("Routine isTimeInAstroRange - aktuelle ist ist > als lower und kleiner als upper - Gruppe wird geschaltet (true)","info");} return true; } if (debug) {log("Routine isTimeInAstroRange - Zeit nicht im Zeitrange - keine Schaltung ","info");} return false; ! } !

            1 Antwort Letzte Antwort
            0
            • L Offline
              L Offline
              looxer01
              schrieb am zuletzt editiert von
              #147

              Hi,

              ich habe die Routinen zur Berechnung der Zeiten nun komplett umgestellt.

              Darüberhinaus auch die Eingaben für Astrozeiten in die Von und Bis Zeiten Integriert

              was jetzt möglich ist:

              var zeit1von = "SunRise"; //Aktivzeit von IDGruppe1

              var zeit1bis = "11:50:00"; //Aktivzeit bis IDGruppe1

              var zeit2von = "SunRise"; //Aktivzeit von IDGruppe2 // war vorher nicht möglich

              var zeit2bis = "SunSet"; //Aktivzeit bis IDGruppe2

              var zeit3von = "23:30:00"; //Aktivzeit von IDGruppe3 // läuft ohne Unterbrechung

              var zeit3bis = "23:30:00"; //Aktivzeit bis IDGruppe3

              var zeit4von = "SunSet"; //Aktivzeit von IDGruppe4

              var zeit4bis = "SunRise"; //Aktivzeit bis IDGruppe4

              var zeit5von = "SunSet"; //Aktivzeit von IDGruppe5

              var zeit5bis = "14:00:00"; //Aktivzeit bis IDGruppe5

              Dabei gibt es auch neue Einstellungen, die die Schwellenzeiten beeinflussen.

              Schwellenzeiten sind die Zeiten, die bei einer Einstellung bewirken, dass ggf die von und oder bis zeit auf den nächsten Tag gelegt werden

              Beispiel:

              Jetzt ist Sonntag Morgen 09:00 Uhr (Schwellenzeit ist die spätesten Stunde des Sonnenaufgangs = 08:00 Uhr)

              Wenn es einen Eintrag gibt der so aussieht

              von: SunRise

              bis 15:00

              Bei dieser Konstellation wird der nächste SunRise berechnet und der liegt am Montag

              und die BIS Zeit ebenfalls am Montag

              Damit liegen die Regeln fest.

              Ausserdem führe ich eine interne Tabelle, die die berechneten Von und Bis Zeiten enthält.

              Damit kann auch in den nächsten Tag geplant werden. Bei abgelaufenen Eintrag wird dann eine Neuberechnung vorgenommen.

              Das Konzept vorher hatte an diesen Stellen Lücken. Jetzt sollte zumindest konzeptionell alles laufen.

              Falls dann doch noch ein Fehler auftaucht kann der innerhalb des Konzeptes korrigiert werden.

              EDIT: Version 0.94 ist jetzt online.

              vG Looxer

              1 Antwort Letzte Antwort
              0
              • B Offline
                B Offline
                Beowolf
                schrieb am zuletzt editiert von
                #148

                Hallo zusammen,

                ich habe hier ein paar Sonoff Basics (mit Tasmota) an ein paar Lampen.

                Ist der Eintrag in dem Einstellungsberich so richtig?

                Es tut sich leider nichts.

                var     IDGruppe11 = "sonoff.0.Deckenleuchte Eingang.POWER";  // Licht Wohnzimmer
                

                Grüße

                Manfred

                Die Natur braucht nicht unseren Schutz, sie braucht unsere Abwesenheit.

                1 Antwort Letzte Antwort
                0
                • S Offline
                  S Offline
                  skorpil
                  schrieb am zuletzt editiert von
                  #149

                  looxer01, ich habe das Script heute mal installiert und wollte nur mal sagen: großartig. Danke für die tolle Arbeit!

                  1 Antwort Letzte Antwort
                  0
                  • smartboartS Offline
                    smartboartS Offline
                    smartboart
                    schrieb am zuletzt editiert von
                    #150

                    Auch danke.. Weiß wieviel Arbeit da drin steckt… Probiere die neue Version auch mal aus... Die alte lief fuer meine Erfordernisse schon gut...

                    Gesendet von meinem CLT-L09 mit Tapatalk

                    1 Antwort Letzte Antwort
                    0
                    • smartboartS Offline
                      smartboartS Offline
                      smartboart
                      schrieb am zuletzt editiert von
                      #151

                      Hatte auch mal sonoff drinnen… Glaube das . Power macht Probleme... Hab dann die homematic rein genommen... Kleines hilfsscript könnte helfen mit . STATE am Ende welches die sonoff triggert...vlt geht's aber auch so mittlerweile

                      Gesendet von meinem CLT-L09 mit Tapatalk

                      1 Antwort Letzte Antwort
                      0
                      • L Offline
                        L Offline
                        looxer01
                        schrieb am zuletzt editiert von
                        #152

                        @Beowolf:

                        st der Eintrag in dem Einstellungsberich so richtig?

                        Es tut sich leider nichts. `
                        @smartboart:

                        Glaube das . Power macht Probleme. `

                        Hi,

                        Die Schaltung funktioniert entweder mit true oder false oder 0 und einen Werte zwischen 1 und 100 (Level Geräte)

                        versuche mal in den objekten manuell mit true oder false zu schalten - funktioniert das ?

                        vG looxer

                        1 Antwort Letzte Antwort
                        0
                        • I Offline
                          I Offline
                          ib968142
                          schrieb am zuletzt editiert von
                          #153

                          Die neue Script-Version teste ich demnächst auch bei mir. Eine Frage / Wunsch hätte ich vielleicht noch.

                          Ich nutze aktuell das AstroDate "goldenHourEnd" (habe ich manuell im alten Script überschrieben).

                          Könnte man eventuell noch das Script oder die KeyWord-Liste für die AstroZeit-Angaben erweitern, so dass abhängig vom SunUp/SunDown Keyword-String eine andere getAstroDate(…) Funktion genutzt wird? Vielleicht könnte man auch einfach den eingetragenen Time-String in der getAstroDate-Funktionen verwenden, dann wäre man komplett flexibel.

                          1 Antwort Letzte Antwort
                          0
                          • L Offline
                            L Offline
                            looxer01
                            schrieb am zuletzt editiert von
                            #154

                            @ib968142:

                            Könnte man eventuell noch das Script oder die KeyWord-Liste für die AstroZeit-Angaben erweitern, so dass abhängig vom SunUp/SunDown Keyword-String eine andere getAstroDate(…) Funktion genutzt wird? Vielleicht könnte man auch einfach den eingetragenen Time-String in der getAstroDate-Funktionen verwenden, dann wäre man komplett flexibel. `
                            Hi,

                            gute Idee.

                            Diese Liste kann dann als Doku verwendet werden.

                            ! sunrise": sunrise (top edge of the sun appears on the horizon) "sunriseEnd": sunrise ends (bottom edge of the sun touches the horizon) "goldenHourEnd": morning golden hour (soft light, best time for photography) ends "solarNoon": solar noon (sun is in the highest position) "goldenHour": evening golden hour starts "sunsetStart": sunset starts (bottom edge of the sun touches the horizon) "sunset": sunset (sun disappears below the horizon, evening civil twilight starts) "dusk": dusk (evening nautical twilight starts) "nauticalDusk": nautical dusk (evening astronomical twilight starts) "night": night starts (dark enough for astronomical observations) "nightEnd": night ends (morning astronomical twilight starts) "nauticalDawn": nautical dawn (morning nautical twilight starts) "dawn": dawn (morning nautical twilight ends, morning civil twilight starts) "nadir": nadir (darkest moment of the night, sun is in the lowest position) !
                            Sollte sich schnell umsetzen lassen.

                            Hättest du etwas Zeit um ein paar Kombinationen zu testen ?

                            vG Looxer

                            1 Antwort Letzte Antwort
                            0
                            • B Offline
                              B Offline
                              Beowolf
                              schrieb am zuletzt editiert von
                              #155

                              @looxer01:

                              @Beowolf:

                              st der Eintrag in dem Einstellungsberich so richtig?

                              Es tut sich leider nichts. `
                              @smartboart:

                              Glaube das . Power macht Probleme. `

                              Hi,

                              Die Schaltung funktioniert entweder mit true oder false oder 0 und einen Werte zwischen 1 und 100 (Level Geräte)

                              versuche mal in den objekten manuell mit true oder false zu schalten - funktioniert das ?

                              vG looxer `

                              Jepp, geht.

                              Ich kann entweder true oder false per Tastatur eingeben, oder das "Häckchen" rein oder raus. Es wird jedesmal geschaltet.

                              Grüße

                              Die Natur braucht nicht unseren Schutz, sie braucht unsere Abwesenheit.

                              1 Antwort Letzte Antwort
                              0
                              • L Offline
                                L Offline
                                looxer01
                                schrieb am zuletzt editiert von
                                #156

                                @Beowolf:

                                Ich kann entweder true oder false per Tastatur eingeben, oder das "Häckchen" rein oder raus. Es wird jedesmal geschaltet. `
                                kannst du mal die Datenpunkt definition aus dem Datenpunkt "…POWER"" posten ?.

                                Die findest du rechts auf dem Änderungssymbol und dann der RAW Tab.

                                vG Looxer

                                1 Antwort Letzte Antwort
                                0
                                • I Offline
                                  I Offline
                                  ib968142
                                  schrieb am zuletzt editiert von
                                  #157

                                  @looxer01:

                                  @ib968142:

                                  Könnte man eventuell noch das Script oder die KeyWord-Liste für die AstroZeit-Angaben erweitern, so dass abhängig vom SunUp/SunDown Keyword-String eine andere getAstroDate(…) Funktion genutzt wird? Vielleicht könnte man auch einfach den eingetragenen Time-String in der getAstroDate-Funktionen verwenden, dann wäre man komplett flexibel. `
                                  Hi,

                                  gute Idee.

                                  Diese Liste kann dann als Doku verwendet werden.

                                  ! sunrise": sunrise (top edge of the sun appears on the horizon) "sunriseEnd": sunrise ends (bottom edge of the sun touches the horizon) "goldenHourEnd": morning golden hour (soft light, best time for photography) ends "solarNoon": solar noon (sun is in the highest position) "goldenHour": evening golden hour starts "sunsetStart": sunset starts (bottom edge of the sun touches the horizon) "sunset": sunset (sun disappears below the horizon, evening civil twilight starts) "dusk": dusk (evening nautical twilight starts) "nauticalDusk": nautical dusk (evening astronomical twilight starts) "night": night starts (dark enough for astronomical observations) "nightEnd": night ends (morning astronomical twilight starts) "nauticalDawn": nautical dawn (morning nautical twilight starts) "dawn": dawn (morning nautical twilight ends, morning civil twilight starts) "nadir": nadir (darkest moment of the night, sun is in the lowest position) !
                                  Sollte sich schnell umsetzen lassen.

                                  Hättest du etwas Zeit um ein paar Kombinationen zu testen ? `

                                  Teste ich dann gerne. Wie gesagt die "goldenHourEnd" nutze ich aktuell in einer älteren, manuell angepassten Version deines Scripts.

                                  Danke und Grüße

                                  1 Antwort Letzte Antwort
                                  0
                                  • B Offline
                                    B Offline
                                    Beowolf
                                    schrieb am zuletzt editiert von
                                    #158

                                    @looxer01:

                                    @Beowolf:

                                    Ich kann entweder true oder false per Tastatur eingeben, oder das "Häckchen" rein oder raus. Es wird jedesmal geschaltet. `
                                    kannst du mal die Datenpunkt definition aus dem Datenpunkt "…POWER"" posten ?.

                                    Die findest du rechts auf dem Änderungssymbol und dann der RAW Tab.

                                    vG Looxer `

                                    Meinst du das?

                                    {
                                      "from": "system.adapter.sonoff.0",
                                      "ts": 1548597255406,
                                      "common": {
                                        "name": "Deckenleuchte Eingang POWER",
                                        "type": "boolean",
                                        "role": "switch",
                                        "read": true,
                                        "write": true,
                                        "storeMap": true
                                      },
                                      "native": {},
                                      "acl": {
                                        "object": 1636,
                                        "owner": "system.user.admin",
                                        "ownerGroup": "system.group.administrator",
                                        "state": 1636
                                      },
                                      "_id": "sonoff.0.Deckenleuchte Eingang.POWER",
                                      "type": "state"
                                    }
                                    

                                    Die Natur braucht nicht unseren Schutz, sie braucht unsere Abwesenheit.

                                    1 Antwort Letzte Antwort
                                    0
                                    • E Offline
                                      E Offline
                                      etproject
                                      schrieb am zuletzt editiert von
                                      #159

                                      Hallo,

                                      ich hatte irgendwo mal gelesen das der Objektname kein Leerzeichen enthalten darf.

                                      Schöne Grüße

                                      1 Antwort Letzte Antwort
                                      0
                                      • L Offline
                                        L Offline
                                        looxer01
                                        schrieb am zuletzt editiert von
                                        #160

                                        @etproject:

                                        ch hatte irgendwo mal gelesen das der Objektname kein Leerzeichen enthalten darf. `
                                        Kann das bei Sonoff beeinflusst werden ? Also kannst du den Namen ändern im Adapter z.B. oder an der Quelle (Sonoff)

                                        vG Looxer

                                        1 Antwort Letzte Antwort
                                        0
                                        • B Offline
                                          B Offline
                                          Beowolf
                                          schrieb am zuletzt editiert von
                                          #161

                                          Ich habe jetzt mal einen neuen Sonoff Basic genommen.

                                          In der Tasmota Einstellung nennt sich das Ding nun "Testschalter"

                                          ` > {

                                          "from": "system.adapter.sonoff.0",

                                          "ts": 1548858428468,

                                          "common": {

                                          "name": "Testschalter POWER",

                                          "type": "boolean",

                                          "role": "switch",

                                          "read": true,

                                          "write": true,

                                          "storeMap": true

                                          },

                                          "native": {},

                                          "acl": {

                                          "object": 1636,

                                          "owner": "system.user.admin",

                                          "ownerGroup": "system.group.administrator",

                                          "state": 1636

                                          },

                                          "_id": "sonoff.0.Testschalter.POWER",

                                          "type": "state"

                                          } `

                                          So event. besser?

                                          ` > {

                                          "_id": "sonoff.0.Testschalter.POWER",

                                          "common": {

                                          "type": "boolean",

                                          "role": "switch",

                                          "read": true,

                                          "write": true,

                                          "storeMap": true,

                                          "name": "Testschalter-POWER"

                                          },

                                          "native": {},

                                          "type": "state",

                                          "from": "system.adapter.sonoff.0",

                                          "ts": 1548860090482,

                                          "acl": {

                                          "object": 1636,

                                          "state": 1636

                                          }

                                          } `

                                          Ich habe jetzt unter ioBroker in der Spalte "NAME" aus "Testschalter POWER" dieses mit Bindestrich gemacht "Testschalter-POWER".

                                          Die Natur braucht nicht unseren Schutz, sie braucht unsere Abwesenheit.

                                          1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          761

                                          Online

                                          32.4k

                                          Benutzer

                                          81.4k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe