Skip to content
  • Home
  • 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

Community Forum

  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.3k

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

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

[Vorlage] Anwesenheitssimulation - Script

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
271 Beiträge 40 Kommentatoren 64.8k 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.
  • A Offline
    A Offline
    ak1
    schrieb am zuletzt editiert von
    #126

    Hallo Looxer,

    ich komme jetzt wieder schrittweise dazu, mich mit dem Thema zu beschäftigen.

    Bevor ich die Simulation "live" schalte, möchte ich erst ein wenig testen. Dazu habe ich mir ein paar Datenpunkte (state/switch) angelegt, die ich schalte.

    Meine Frage: Wie stelle ich die Schaltzeiten übersichtlich dar, um den Zeitverlauf zu kontrollieren. Sowohl in Excel mit dem AWSLog.csv tue ich mich schwer etwas Übersichtliches zu erzeugen, als auch mit dem History- und dem flot-Adapter.

    Es muss doch einen einfachen Weg geben die true/false Stati auf einer Zeitachse darstellen zu können.

    VG

    Stefan

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

      Hi,

      @ak1:

      Wie stelle ich die Schaltzeiten übersichtlich dar, um den Zeitverlauf zu kontrollieren. Sowohl in Excel mit dem AWSLog.csv tue ich mich schwer etwas Übersichtliches zu erzeugen, als auch mit dem History- und dem flot-Adapter.

      Es muss doch einen einfachen Weg geben die true/false Stati auf einer Zeitachse darstellen zu können. `
      in der Tat habe ich dafür das Excel angedacht. Aber über Flot geht es natürlich auch. Allerdings ist ja i.d.R. nur true und false verfügbar. Die Kurven sehen also etwas eigenartig aus.

      Was ist denn das Problem mit dem Excel ?

      vG Looxer

      1 Antwort Letzte Antwort
      0
      • A Offline
        A Offline
        ak1
        schrieb am zuletzt editiert von
        #128

        @looxer01:

        Hi,

        in der Tat habe ich dafür das Excel angedacht. Aber über Flot geht es natürlich auch. Allerdings ist ja i.d.R. nur true und false verfügbar. Die Kurven sehen also etwas eigenartig aus.

        Was ist denn das Problem mit dem Excel ?

        vG Looxer `

        Vielleicht hast Du einen Screenshot der Visualisierung in Excel für mich und kannst mir sagen, welchen Diagramm-Typ Du gewählt hast und welche Spalten Du dazu benutzt.

        Ich muss ja irgendwie einen Zeitstrahl darstellen, bei dem ich die berechneten Ein- und Ausschaltzeiten für die unterschiedlichen Geräte darstelle. Momentan bin ich noch komplett planlos, wie ich das am geschicktesten anstelle.

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

          @ak1:

          ielleicht hast Du einen Screenshot der Visualisierung in Excel für mich und kannst mir sagen, welchen Diagramm-Typ Du gewählt hast und welche Spalten Du dazu benutzt.

          Ich muss ja irgendwie einen Zeitstrahl darstellen, bei dem ich die berechneten Ein- und Ausschaltzeiten für die unterschiedlichen Geräte darstelle. Momentan bin ich noch komplett planlos, wie ich das am geschicktesten anstelle. `

          also wie gesagt, du kannst es per Flot visualisieren. Flot hat ja irgendwann die Funktion bekommen auch boolean darzustellen.

          Ich excel habe ich mir immer nur das log angesehen, es aber nicht als Grafik.

          Schau ich mir an. Bin zur Zeit aber unterwegs.

          vG Looxer

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

            Hi,

            es gibt ein Problem mit dem externen log (schreiben in externe Datei) und der neuen JS Version 4.0.1.

            Ich habe eine neue Version hochgeladen 0.92, die das Problem behebt.

            vG Looxer

            1 Antwort Letzte Antwort
            0
            • N Offline
              N Offline
              nheuk
              schrieb am zuletzt editiert von
              #131

              Hallo,

              ich nutze Deine beiden hervorragende Scripte zum Anwesenheit setzten und zum Starten der Anwesenheitssimulation.

              Allerdings habe ich immer wieder einen Fehler.

              Jedesmal wenn jemand das Haus verlässt und die Variable "IDAWSAktiv" auf false gesetzt wird kommt diese Meldung. Zu dem Zeitpunkt ist immer noch jemand im Haus.

              javascript.0	2018-12-27 14:40:01.840	error	at Object. <anonymous>(script.js.javascript.anwesenheitssteuerung:324:36)
              javascript.0	2018-12-27 14:40:01.840	error	Error in callback: TypeError: Cannot read property 'common' of null
              javascript.0	2018-12-27 14:40:01.839	warn	at Object. <anonymous>(script.js.javascript.anwesenheitssteuerung:321:25)
              javascript.0	2018-12-27 14:40:01.839	warn	at GeraetExists (script.js.javascript.anwesenheitssteuerung:462:6)
              javascript.0	2018-12-27 14:40:01.836	warn	getState "" not found (3)
              javascript.0	2018-12-27 14:40:01.835	warn	Object "" does not exist</anonymous></anonymous>
              

              Habe die Abfrage bei mit jetzt wie folgt geändert, da ja nur geschaltet werden muss wenn sich der "StatusAllUser" ändert. Die Variable "OldStatusAllUser" hast Du mir dafür ja schon geliefert. Der Fehler ist dadurch natürlich nicht weg nur er wird erst gar nicht ausgelöst.

              // Anwesenheitssimulation ein-oder ausschalten
              // prüfe status AWSCheck aktiv
              if (AWSCheckAktiv === true)
                  {
                      // prüfe StatusAllUser sich verändert hat, nur dann muss geschaltet werden
                      if (StatusAllUser != OldStatusAllUser)
                          {
                              //jemand da
                              if (StatusAllUser === true)                                             
                                  {
                                      //dann IDAWSAktiv ausschalten
                                      setState(IDAWSAktiv,false);
                                  }
                              else
                                  {
                                      //sonst verzögert IDAWSAktiv einschalten
                                      setStateDelayed(IDAWSAktiv,true,AWSZeit*1000);
                                      log("EVENT Anwesenheit ist auf false gesetzt  - AWSFlag wird aktiviert in " + AWSZeit + " Sekunden","info");
                                  }
                          }
                  }
              
              

              Gruß

              Manuel

              1 Antwort Letzte Antwort
              0
              • N Offline
                N Offline
                nheuk
                schrieb am zuletzt editiert von
                #132

                in den definierten Gruppen muss was stehen auch wenn nur Leerzeichen… das war der Fehler :oops:

                var     IDGruppe35 = " "; 
                
                1 Antwort Letzte Antwort
                0
                • E Offline
                  E Offline
                  etproject
                  schrieb am zuletzt editiert von
                  #133

                  Hallo an alle,

                  ich habe die Anwesenheitsimulatition mit Sonoff und Zigbee Module erfolgreich getestet.

                  Bisher habe ich immer feste Zeiten in dem Script eingetragen.

                  Schalte ich jedoch die Astrozeit1 ( von ) ein, dann schaltet dieses Schaltmodul teilweise schon ab 14:00 .

                  Da ich mich mit Java überhaupt nicht auskenne brauche ich Eure Hilfe!

                  Hier meine Einstellungen

                  // Einstellungen der Aktivzeiten je IDGruppe von bis

                  var zeit1von = "16:07:00"; //Aktivzeit von IDGruppe1

                  var zeit1bis = "00:30:00"; //Aktivzeit bis IDGruppe1

                  var zeit2von = "08:15:00"; //Aktivzeit von IDGruppe2

                  var zeit2bis = "23:30:00"; //Aktivzeit bis IDGruppe2

                  var zeit3von = "08:30:00"; //Aktivzeit von IDGruppe3

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

                  var zeit4von = "08:00:00"; //Aktivzeit von IDGruppe4

                  var zeit4bis = "23:15:00"; //Aktivzeit bis IDGruppe4

                  var zeit5von = "08: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 = true ; // 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 = 2; // Minuten IDGruppe1 von

                  var ein1bis = 10; // 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 = 30; // 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 = 3; // checks alle x Minuten f�r IDGruppe5

                  // Einstellung teilnehmende Homematic Ger�te je IDGruppe maximal 5 - Eingabe der Homematic ID

                  var IDGruppe11 = "zigbee.0.01124b001bb01141.state"; // ElternBad Licht_1

                  var IDGruppe12 = "mqtt.0.cmnd.sonoffCH4_2.POWER4"; // reserve

                  var IDGruppe13 = " "; // Licht Wohnzimmer Esstisch Stehlampe

                  var IDGruppe14 = " "; // Licht Kinderbad

                  var IDGruppe15 = " "; // Licht Hobbyraum

                  var Grp1ZufAnz = 3; // Anzahl der Ger�te zur zuf�lligen Bestimmung des Geraetes

                  var IDGruppe21 = "mqtt.0.cmnd.sonoffCH4_2.POWER3"; // Terrasse Dose rechts

                  var IDGruppe22 = " "; // Licht Terrassentuere

                  var IDGruppe23 = " "; // Licht Wohnzimmer Esstisch Stehlampe

                  var IDGruppe24 = " ";

                  var IDGruppe25 = " ";

                  var Grp2ZufAnz = 3; // Anzahl der Ger�te zur zuf�lligen Bestimmung des Geraetes

                  var IDGruppe31 = "mqtt.0.cmnd.sonoffCH4_2.POWER2"; // Terrasee Dose links

                  var IDGruppe32 = " "; // Licht Flur oben unten;

                  var IDGruppe33 = " "; // Licht Kinderbad

                  var IDGruppe34 = " ";

                  var IDGruppe35 = " ";

                  var Grp3ZufAnz = 5; // Anzahl der Ger�te zur zuf�lligen Bestimmung des Geraetes

                  var IDGruppe41 = "mqtt.0.cmnd.sonoffCH4_2.POWER1"; // Garten linke Seite Pool

                  var IDGruppe42 = " "; // Licht aussen Kugeln

                  var IDGruppe43 = " "; // Licht Schwimmbad Nebenlicht;

                  var IDGruppe44 = " ";

                  var IDGruppe45 = " ";

                  var Grp4ZufAnz = 3; // Anzahl der Ger�te zur zuf�lligen Bestimmung des Geraetes

                  var IDGruppe51 = "mqtt.0.cmnd.sonoffCH4_1.POWER4"; // Garten mitte Mauer

                  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 = true; // Wenn AWS deaktiviert wird, dann werden alle Teilnehmer ausgeschaltet

                  // Ende Einstellungen …......................................................

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

                    @etproject:

                    chalte ich jedoch die Astrozeit1 ( von ) ein, dann schaltet dieses Schaltmodul teilweise schon ab 14:00 . `
                    Hi,

                    schau ich mir an. Dauert nur ein paar Tage, da ich z.Zt. kein Systemzugriff habe.

                    ….oder jemand anderes macht Vorschläge - immer willkommenn :D

                    EDIT

                    aber bevor ich mir das Coding ansehen.

                    Hast du deinen Längen- und Breitengrad in ioBroker eingetragen ?

                    Wenn nicht - bitte eintragen und nochmal testen.

                    Die Felder befinden sich in ioBroker Admin - oben links das ICON für die Werkzeuge.

                    vG Looxer

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

                      Hallo Looxer,

                      Danke für deine schnelle Antwort.

                      Beide Einstellungen sind vorhanden. Andere Scripte( mit Blockly und AstroZeit) funktionieren .

                      Schöne Grüße

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

                        @etproject:

                        Schalte ich jedoch die Astrozeit1 ( von ) ein, dann schaltet dieses Schaltmodul teilweise schon ab 14:00 .

                        Da ich mich mit Java überhaupt nicht auskenne brauche ich Eure Hilfe!

                        var zeit1von = "16:07:00"; //Aktivzeit von IDGruppe1
                        var zeit1bis = "00:30:00"; //Aktivzeit bis IDGruppe1
                        
                        var zeit2von = "08:15:00"; //Aktivzeit von IDGruppe2
                        var zeit2bis = "23:30:00"; //Aktivzeit bis IDGruppe2
                        ```` `  
                        

                        Hm, das ist seltsam. Da die Astro-Zeiten bei dir ja wohl grundsätzlich in Ordnung sind ist das Einzige, was mir spontan einfällt, dass eventuell die Berechnung des Zeitabschnitts einen Fehler hat. Wenn du zeit1bis auf z.B. "23:59:59" stellst oder für die zweite Gruppe die Astrozeit nimmst, tritt das Problem dann immer noch auf?

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

                          Hallo,

                          ich hatte ähnliche Probleme mit der Astro-Zeit. Bei Nutzung dieser Funktion im Script wurden meine Lampen auch bereits tagsüber eingeschaltet. Die iobroker Astro-Funktionen selbst liefern aber die korrekten Werte (mit kleinem Helper-Script mal alle Astro-Zeiten ausgeben lassen).

                          Ich hab es nicht mehr komplett in Erinnerung, aber bei mir lag es glaube ich an der "isTimeInRange" Methode oder der vorgelagerten Bestimmung von "strLower" / "strUpper".

                          Mein aktueller Workaround sieht wie folgt aus:

                          • Ich habe den "else-Zweig" in der isTimeInRange Methode auskommentiert

                          • damit wurde es auf jeden Fall besser…

                          Hier meine Version der isTimeInRange Funktion:

                          function isTimeInRange(strLower, strUpper) {
                              ...
                              if (upper > lower) {
                                  ...
                              }
                          //    else {
                                  // closes in the following day
                          //        inRange = (now >= upper && now <= lower) ? false : true;
                          //    }
                              return inRange;
                          }
                          

                          Final gelöst habe ich damit das Problem aber nicht, aber eventuell hilft der Hinweis. Durch das auskommentieren wurde es bei mir auf jeden Fall besser mit den Schaltzeiten.

                          Viele Grüße

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

                            Hi,

                            ok, dann scheint das ja im coding zu liegen.

                            Ist sicher mal mit irgendeiner Javascript aenderung passiert.

                            Ich schaue es mir am WE an und poste dann ggf eine neue Version,

                            vG Looxer

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

                              Hi,

                              ich habe einen Fehler gefunden, wenn die Bis-Zeit in den nächsten Tage geht.

                              Dann wird die von Zeit auf bis Zeit gesetzt. Ich bin aber nicht sicher, ob das euer Problem löst.

                              Die Astrozeit wird -wie schon vorher gesagt- korrekt berechnet aber dann verändert.

                              könntet ihr bitte die folgende Zeile in Routine Astrojetzt auskommentieren

                              //        zeit = zeitbis;                                                       // wenn die Astrozeit groesser wird als die BisZeit, dann ist vonZeit = bisZeit
                              
                              

                              Feedback wäre klasse.

                              vG Looxer

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

                                Hi looxer01, du hast Recht. Das Problem liegt in der Funktion. Jetzt ist mir auch eingefallen, dass ich das auch schon mal hatte und die Funktion angepasst aber es nie eingesetzt habe :oops:

                                Das war meine angedachte Lösung:

                                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 (upper < lower && switchOffNextDay) {
                                            return (now >= upper && now <= lower) ? false : true;
                                    }
                                
                                    return (now >= lower && now <= upper) ? true : false;
                                }
                                
                                

                                Basiert auf deiner astroJetzt Funktion, vergleicht aber direkt die Zeiten. Der Plan war, die Funktion dann statt isTimeInRange zu verwenden. Die Aufrufe von astroJetzt könnten dann komplett wegfallen. Wenn ich mich jetzt nicht täusche, müsste es dann so aussehen:

                                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("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
                                
                                

                                Wie gesagt, ich habe es leider nicht richtig in ioBroker getestet, sondern nur damals in VsCode mit statischen Astro-Zeiten. Hoffe, es klappt trotzdem.

                                Grüße

                                Mihaeru

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

                                  @Mihaeru:

                                  Wie gesagt, ich habe es leider nicht richtig in ioBroker getestet, sondern nur damals in VsCode mit statischen Astro-Zeiten. Hoffe, es klappt trotzdem.

                                  Grüße `

                                  vielen Dank. Ich schaue mir das am WE an.

                                  Der fix den ich gepostet habe sollte erstmal kurzfristig helfen.

                                  vG Looxer

                                  1 Antwort Letzte Antwort
                                  0
                                  • 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
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          605

                                          Online

                                          32.4k

                                          Benutzer

                                          81.4k

                                          Themen

                                          1.3m

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

                                          • Du hast noch kein Konto? Registrieren

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