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. Blockly
  5. Wahl eines Datenpunktes

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
    2.0k

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

Wahl eines Datenpunktes

Geplant Angeheftet Gesperrt Verschoben Blockly
35 Beiträge 3 Kommentatoren 1.2k Aufrufe 2 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.
  • AphofisA Offline
    AphofisA Offline
    Aphofis
    schrieb am zuletzt editiert von
    #12

    Meine LOG:
    Bildschirmfoto 2020-01-25 um 17.34.10.png

    paul53P 1 Antwort Letzte Antwort
    0
    • AphofisA Aphofis

      @paul53
      Habe ich geändert! zwar wurde beim ersten mal der richtige Datenpunkt geschaltet aber dann beim zweiten Timer nicht mehr da wurde dann der selbe Datenpunkt gewählt obwohl im timer SwitchTarget der richtige Datenpunkt eingetragen wurde.
      Hatte im timer Sequenzial gewählt und im Timer stand dann auch "javascript.0.Timer.sequenzial" ohne"".
      wenn ich zwischen den Timern den letzten Datenpunkt manuell auf false setze bringt auch keine Änderung.

      paul53P Offline
      paul53P Offline
      paul53
      schrieb am zuletzt editiert von paul53
      #13

      @Aphofis
      Noch mal in das Script geschaut: Ab Zeile 312 steht Unsinn. Ändere [12] --> [13] und passe die Log-Ausgabe an.

          on(id1[x][13], function (dp) { //Bei Änderung Switchtarget
              MyTimer[x][13] = dp.state.val; //Nach Änderung neuen Wert einlesen
      

      EDIT: Enthalten die Datenpunkte ".OnlyIfPresence" und ".OnlyIfNoPresence" Konstanten ? Es gibt dafür keinen Trigger.

      Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
      Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

      1 Antwort Letzte Antwort
      0
      • AphofisA Aphofis

        Meine LOG:
        Bildschirmfoto 2020-01-25 um 17.34.10.png

        paul53P Offline
        paul53P Offline
        paul53
        schrieb am zuletzt editiert von
        #14

        @Aphofis sagte:

        Meine LOG:

        "javascript.0.Timer.sequenzial" ist falsch ?

        Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
        Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

        1 Antwort Letzte Antwort
        0
        • AphofisA Offline
          AphofisA Offline
          Aphofis
          schrieb am zuletzt editiert von Aphofis
          #15

          wenn ich einen Datenpunkt raus kopiere ist bei sequenzial der Pfad javascript.0.Timer.sequenzial

          Bildschirmfoto 2020-01-25 um 18.54.00.png
          Wie ist denn dann der richtige Datenpunkt Pfad ???

          Bildschirmfoto 2020-01-25 um 18.58.26.png

          paul53P 1 Antwort Letzte Antwort
          0
          • AphofisA Aphofis

            wenn ich einen Datenpunkt raus kopiere ist bei sequenzial der Pfad javascript.0.Timer.sequenzial

            Bildschirmfoto 2020-01-25 um 18.54.00.png
            Wie ist denn dann der richtige Datenpunkt Pfad ???

            Bildschirmfoto 2020-01-25 um 18.58.26.png

            paul53P Offline
            paul53P Offline
            paul53
            schrieb am zuletzt editiert von
            #16

            @Aphofis sagte:

            Pfad javascript.0.Timer.sequenzial

            Also sollte das Log doch den richtigen Datenpunkt zeigen, der auch auf true steht ?

            Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
            Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

            AphofisA 1 Antwort Letzte Antwort
            0
            • paul53P paul53

              @Aphofis sagte:

              Pfad javascript.0.Timer.sequenzial

              Also sollte das Log doch den richtigen Datenpunkt zeigen, der auch auf true steht ?

              AphofisA Offline
              AphofisA Offline
              Aphofis
              schrieb am zuletzt editiert von
              #17

              @paul53
              Ich sehe nicht wo der Pfad falsch sein soll!
              wie gesagt, erste Schaltung Timer 1 wird der richtige Datenpunkt geschaltet dann aber Timer 2 soll ein anderer der 6 Datenpunkte geschaltet werden und es wir wieder sequenzial geschaltet anstatt wie eingestellt puls.
              Andere Frage, kann man es per Javascript so programmieren, das wenn ein neuer Datenpunkt der im aktuellen Timer auf true gesetzt wird, das die anderen 5 dann abgeschaltet werden !?
              Insofern die Timer dann bald auch funktionieren

              1 Antwort Letzte Antwort
              0
              • AphofisA Offline
                AphofisA Offline
                Aphofis
                schrieb am zuletzt editiert von
                #18

                Ich wollte 20 Timer erstellen, die dann später die Strömungspumpen steuern und jetzt 40 Timer zu erstellen, damit dann jeweils keine Ahnung paar Sekunden später nach aktivieren eines neuen Datenpunktes dann der alte per timer abgeschaltet wird.

                1 Antwort Letzte Antwort
                0
                • AphofisA Offline
                  AphofisA Offline
                  Aphofis
                  schrieb am zuletzt editiert von
                  #19

                  Hier wird Das Programm aus TimerTargetNames genommen und in SwitchTarget eingetragen
                  Bildschirmfoto 2020-01-25 um 20.13.43.png

                  Hier wird der Timer ein oder aus geschaltet
                  Bildschirmfoto 2020-01-25 um 20.16.04.png

                  Hier werden die Wochentage de/aktiviert
                  Bildschirmfoto 2020-01-25 um 20.17.22.png

                  Hier wird die Uhrzeit geschaltet
                  Bildschirmfoto 2020-01-25 um 20.18.48.png

                  Hier wird die Anwesenheit eingestellt was aber im Javascript ausgeklammert ist per

                  //let Presence = getState("radar2.0._nHere").val; //Pfad zum Anwesenheitsdatenpunkt. Erwartet wird eine Zahl >=0
                  let Presence = true
                  

                  Bildschirmfoto 2020-01-25 um 20.21.08.png

                  1 Antwort Letzte Antwort
                  0
                  • AphofisA Offline
                    AphofisA Offline
                    Aphofis
                    schrieb am zuletzt editiert von
                    #20

                    @paul53
                    also habe alles noch mal gelöscht und komplett neu installiert.
                    jetzt werden alle Datenpunkte richtig geschaltet.
                    Bleibt nur noch das bei aktivieren eines neuen Datenpunktes muss der vorherige auf false gesetzt werden.
                    Wie kann man das in das Javascript am besten einbauen ???

                    paul53P 2 Antworten Letzte Antwort
                    0
                    • AphofisA Aphofis

                      @paul53
                      also habe alles noch mal gelöscht und komplett neu installiert.
                      jetzt werden alle Datenpunkte richtig geschaltet.
                      Bleibt nur noch das bei aktivieren eines neuen Datenpunktes muss der vorherige auf false gesetzt werden.
                      Wie kann man das in das Javascript am besten einbauen ???

                      paul53P Offline
                      paul53P Offline
                      paul53
                      schrieb am zuletzt editiert von
                      #21

                      @Aphofis sagte:

                      bei aktivieren eines neuen Datenpunktes muss der vorherige auf false gesetzt werden.

                      Was hat es mit der "Rolle" (An/Aus) auf sich ?

                      Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                      Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                      1 Antwort Letzte Antwort
                      0
                      • AphofisA Aphofis

                        @paul53
                        also habe alles noch mal gelöscht und komplett neu installiert.
                        jetzt werden alle Datenpunkte richtig geschaltet.
                        Bleibt nur noch das bei aktivieren eines neuen Datenpunktes muss der vorherige auf false gesetzt werden.
                        Wie kann man das in das Javascript am besten einbauen ???

                        paul53P Offline
                        paul53P Offline
                        paul53
                        schrieb am zuletzt editiert von paul53
                        #22

                        @Aphofis sagte:

                        bei aktivieren eines neuen Datenpunktes muss der vorherige auf false gesetzt werden.

                        Damit auch bei Script-Start ermittelt werden kann, welche Aktivität läuft, wird ein zusätzlicher Datenpunkt (idActive) benötigt. Dann könnte man es etwa so lösen:

                        var active = getState(idActive).val; // neuer Datenpunkt, damit bei Scriptstart die aktive ID passt
                        function DoAction(whichone) {
                            if (MyTimer[whichone][0]) { //Wenn Timer aktiv
                                if ((MyTimer[whichone][14] && Presence) || (MyTimer[whichone][15] && !Presence) || (MyTimer[whichone][15] && MyTimer[whichone][14])) { //Wenn "bei Anwesenheit" aktiv
                                    if(active) setState(active, false); // laufende Aktivität aus 
                                    active = MyTimer[whichone][13];
                                    if (MyTimer[whichone][1] == 1) { // Wenn die Rolle Anschalter ist
                                        setState(active, true); //Switchtarget aktivieren
                                        log(active + " Timer " + whichone + " hat angeschaltet");
                                    } else { //Wenns die Rolle Ausschalter ist
                                        setState(active, false);//Switchtarget deaktivieren
                                        log("Timer " + whichone + " hat ausgeschaltet");
                                    }
                                    setState(idActive, active, true); // neue Aktivität im Datenpunkt merken
                                }
                            }
                        }
                        

                        Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                        Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                        AphofisA 1 Antwort Letzte Antwort
                        0
                        • paul53P paul53

                          @Aphofis sagte:

                          bei aktivieren eines neuen Datenpunktes muss der vorherige auf false gesetzt werden.

                          Damit auch bei Script-Start ermittelt werden kann, welche Aktivität läuft, wird ein zusätzlicher Datenpunkt (idActive) benötigt. Dann könnte man es etwa so lösen:

                          var active = getState(idActive).val; // neuer Datenpunkt, damit bei Scriptstart die aktive ID passt
                          function DoAction(whichone) {
                              if (MyTimer[whichone][0]) { //Wenn Timer aktiv
                                  if ((MyTimer[whichone][14] && Presence) || (MyTimer[whichone][15] && !Presence) || (MyTimer[whichone][15] && MyTimer[whichone][14])) { //Wenn "bei Anwesenheit" aktiv
                                      if(active) setState(active, false); // laufende Aktivität aus 
                                      active = MyTimer[whichone][13];
                                      if (MyTimer[whichone][1] == 1) { // Wenn die Rolle Anschalter ist
                                          setState(active, true); //Switchtarget aktivieren
                                          log(active + " Timer " + whichone + " hat angeschaltet");
                                      } else { //Wenns die Rolle Ausschalter ist
                                          setState(active, false);//Switchtarget deaktivieren
                                          log("Timer " + whichone + " hat ausgeschaltet");
                                      }
                                      setState(idActive, active, true); // neue Aktivität im Datenpunkt merken
                                  }
                              }
                          }
                          
                          AphofisA Offline
                          AphofisA Offline
                          Aphofis
                          schrieb am zuletzt editiert von Aphofis
                          #23

                          @paul53
                          äh wo muss denn dann der idActive Datenpunkt hin !? muss in jedem Timer einer erstellt werden?
                          oder nur in den Timer Ordner?
                          und wo kommt der Javascript Code hin???

                          paul53P 1 Antwort Letzte Antwort
                          0
                          • AphofisA Aphofis

                            @paul53
                            äh wo muss denn dann der idActive Datenpunkt hin !? muss in jedem Timer einer erstellt werden?
                            oder nur in den Timer Ordner?
                            und wo kommt der Javascript Code hin???

                            paul53P Offline
                            paul53P Offline
                            paul53
                            schrieb am zuletzt editiert von
                            #24

                            @Aphofis sagte:

                            muss der in jeden Timer einer erstellt werden?

                            Nein, da nur eine der 6 Aktionen aktiv sein kann, genügt ein Datenpunkt, z.B. "javascript.0.Timer.Active" vom Typ "string".

                            @Aphofis sagte in Wahl eines Datenpunktes:

                            wo kommt der Javascript Code hin???

                            Das ist eine Erweiterung/Änderung der vorhandenen Funktion DoAction(whichone).

                            Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                            Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                            AphofisA 1 Antwort Letzte Antwort
                            0
                            • paul53P paul53

                              @Aphofis sagte:

                              muss der in jeden Timer einer erstellt werden?

                              Nein, da nur eine der 6 Aktionen aktiv sein kann, genügt ein Datenpunkt, z.B. "javascript.0.Timer.Active" vom Typ "string".

                              @Aphofis sagte in Wahl eines Datenpunktes:

                              wo kommt der Javascript Code hin???

                              Das ist eine Erweiterung/Änderung der vorhandenen Funktion DoAction(whichone).

                              AphofisA Offline
                              AphofisA Offline
                              Aphofis
                              schrieb am zuletzt editiert von
                              #25

                              @paul53
                              Wenn ich den code mit anfüge gibt es Fehler!
                              Das ist das Original!

                              //Script tested & Ok
                              //Legt Timer an
                              //Wichtige Einstellungen
                              const AnzahlTimer = 20; //Wieviele Timer anlegen? Der erste ist 1, nicht 0!
                              
                              //let setTimeout;
                              const logging = true; //Logmeldungen an/aus
                              const praefix = "javascript.0.Timer."; //Grundpfad
                              //let Presence = getState("radar2.0._nHere").val; //Pfad zum Anwesenheitsdatenpunkt. Erwartet wird eine Zahl >=0
                              let Presence = true
                              var Wochentage = ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"]; //Array für createStateschleife zum anlegen der Wochentage
                              var Astrotrigger = ["dawn", "sunrise", "dusk", "goldenHour", "dusk", "sunset"]; //Array für Astro 
                              //if (logging) { log(Astrotrigger.length.toString()) };
                              createState(praefix + "TimerTargets", "", false, { read: true, write: true, name: "Ziele welche geschaltet werden", type: "string", def: "" }); //Zentrale Source für die Anzeige in vis, Erstellung in der TimerRoot
                              createState(praefix + "TimerTargetNames", "", false, { read: true, write: true, name: "Smartnames für die Ziele", type: "string", def: "" });
                              
                              for (let x = 1; x < AnzahlTimer + 1; x++) {
                                  //Datenpunkte anlegen 
                                  createState(praefix + x + ".Aktiv", false, false, { read: true, write: true, name: "Timer aktiv", type: "boolean", role: "switch", def: false }); //Legt fest ob der Timer aktiv ist
                                  createState(praefix + x + ".Rolle", 2, false, { read: true, write: true, name: "Rolle", type: "number", role: "value", def: 2 }); //Legt fest ob der Timer für An oder Aus zuständig ist
                                  createState(praefix + x + ".TimerTimestamp", "00:00:00", false, { read: true, write: true, name: "Zeitstempel für schaltzeit", type: "string", def: "00:00:00" });
                                  createState(praefix + x + ".TimerAstroTimestamp", "00:00:00", false, { read: true, write: true, name: "Zeitstempel für Astroschaltzeit", type: "string", def: "00:00:00" });
                                  createState(praefix + x + ".TimerAstroShift", 0, false, { read: true, write: true, name: "Zeitverschiebung für Astroschaltzeit", type: "number", def: 0 });
                                  for (let y = 0; y < 7; y++) { //Einträge für jeden Wochentag anlegen
                                      createState(praefix + x + ".Timer" + Wochentage[y], true, false, { read: true, write: true, name: Wochentage[y], type: "boolean", role: "switch", def: true });
                                  };
                                  createState(praefix + x + ".TimerChoice", "Zeit", false, { read: true, write: true, name: "Funktionswahl für Timer/Astro", type: "string", def: "Zeit" }); //Gewählte Funktion, Timer oder Astro
                                  createState(praefix + x + ".SwitchTarget", "", false, { read: true, write: true, name: "Ziel für Schaltvorgang", type: "string", def: "" });
                                  createState(praefix + x + ".OnlyIfPresence", false, false, { read: true, write: true, name: "Nur ausführen falls jemand anwesend", type: "boolean", role: "switch", def: false }); //Legt fest ob der Timer aktiv ist
                                  createState(praefix + x + ".OnlyIfNoPresence", false, false, { read: true, write: true, name: "Nur ausführen falls niemand anwesend", type: "boolean", role: "switch", def: false }); //Legt fest ob der Timer aktiv ist
                              };
                              
                              //****************************
                              
                              //Datenpunkte Id"s zuweisen
                              var id1 = [];
                              for (let x = 1; x < AnzahlTimer + 1; x++) {//Anzahl der Timer
                                  let y = 0;
                                  id1[x] = [];
                                  id1[x][y] = (praefix + x + ".Aktiv"); y = y + 1;
                                  id1[x][y] = (praefix + x + ".Rolle"); y = y + 1;
                                  id1[x][y] = (praefix + x + ".TimerTimestamp"); y = y + 1;
                                  id1[x][y] = (praefix + x + ".TimerAstroTimestamp"); y = y + 1;
                                  id1[x][y] = (praefix + x + ".TimerAstroShift"); y = y + 1;
                                  id1[x][y] = (praefix + x + ".TimerChoice"); y = y + 1;
                                  for (let z = 0; z < Wochentage.length; z++) {//Schleifenvariable für Wochentage
                                      id1[x][y] = (praefix + x + ".Timer" + Wochentage[z]); y = y + 1;
                                  };
                                  id1[x][y] = (praefix + x + ".SwitchTarget"); y = y + 1;
                                  id1[x][y] = (praefix + x + ".OnlyIfPresence"); y = y + 1;
                                  id1[x][y] = (praefix + x + ".OnlyIfNoPresence"); y = y + 1;
                              
                              };
                              
                              // TimerVariablenArray anlegen für schedules
                              var TimerAction = [];
                              for (let x = 1; x < AnzahlTimer + 1; x++) {
                                  TimerAction[x] = null;
                              };
                              
                              //Alle Daten in MyTimer Array einlesen
                              var MyTimer = [];
                              for (let x = 1; x < AnzahlTimer + 1; x++) {
                                  MyTimer[x] = [];
                                  for (let y = 0; y < id1[x].length; y++) {
                                      //log("x=" + x + "  y=" + y);
                                      MyTimer[x][y] = getState(id1[x][y]).val;
                                      //log(MyTimer[x][y]);
                                  };
                              };
                              
                              //******************************************************** */
                              
                              function MakeCronString(whichone) { //String nach Cronsyntax zusammenbauen für Schedule
                              
                                  var DaysSubString = "";
                                  for (let x = 0; x < 7; x++) {
                                      if (MyTimer[whichone][x + 6] == true) { //Beginnend mit dem 6ten Eintrag (TimerSonntag) die 7 Wochentage durchzählen und Werte anhängen
                                          DaysSubString = DaysSubString + x + ",";
                                      };
                                  };
                                  DaysSubString = DaysSubString.substr(0, DaysSubString.length - 1); //Komma am Ende entfernen
                                  if (DaysSubString == "0,1,2,3,4,5,6") { DaysSubString = "*"; }; // Sternchen wenn alle Tage gewählt
                              
                                  var tempString = "";
                                  if (MyTimer[whichone][5] == "Zeit") { //Wenn Zeit gewählt
                                      tempString = SplitTime(MyTimer[whichone][2])[1] + " " + SplitTime(MyTimer[whichone][2])[0] + " * * " + DaysSubString;
                                      log("CronString für Timer " + whichone + " erstellt " + tempString);
                                  }
                                  else if (MyTimer[whichone][5] != "Zeit") { //Wenn Astro gewählt
                                      tempString = SplitTime(MyTimer[whichone][3])[1] + " " + SplitTime(MyTimer[whichone][3])[0] + " * * " + DaysSubString;
                                      log("Cronstring für Timer " + whichone + " Astro erstellt " + tempString);
                                  };
                                  return tempString;
                              };
                              
                              //spezifischen Timer setzen
                              function SetTimer(whichone) {
                                  if (MyTimer[whichone][0] == true) {
                                      log("Timer " + whichone + " wird gesetzt")
                                      TimerAction[whichone] = schedule(MakeCronString(whichone), function () {
                                          DoAction(whichone);
                                          if (MyTimer[whichone][5] != "Zeit") { //Wenn Astro gewählt
                                              RefreshAstro(whichone); //Neue Astrozeit setzen nach Ausführung
                                          }
                                      });
                                  };
                              };
                              
                              function RefreshAstro(whichone) {
                                  if (logging) { log("Refresh Astro") };
                                  SetChoosenAstroTime(whichone, true);
                                  SetTimer(whichone);
                              };
                              
                              //Alle Timer setzen
                              function SetAllTimer() {
                                  if (logging) { log("Setting all Timers") };
                                  for (let x = 1; x < AnzahlTimer + 1; x++) {
                                      SetTimer(x);
                                  }
                              };
                              
                              //spezifischen Timer löschen
                              function KillTimer(whichone) {
                                  clearSchedule(TimerAction[whichone]);
                                  if (logging) { log("Timer " + whichone + " killed") };
                              }
                              
                              //Astro oder Zeit Gateway
                              function AstroOrTime(whichone) {
                                  if (MyTimer[whichone][5] == "Zeit") {
                                      if (logging) { log("Zeit gewählt " + MyTimer[whichone][2]) };
                                  }
                                  else if (MyTimer[whichone][5] != "Zeit") {
                                      SetChoosenAstroTime(whichone);
                                      log("Astro gewählt, Variante " + MyTimer[whichone][5]);
                                  };
                              };
                              
                              function SetChoosenAstroTime(whichone, GoToTomorrow) { //Zeit für gewählte Astrozeit eintragen
                                  let Shift = parseInt(MyTimer[whichone][4]); //Wert für Shift
                                  let AstroChoice = MyTimer[whichone][5].trim(); //Wert für Astroereignis
                              
                                  //Berücksichtigen ob Event schon vorbei ist und dann für morgen setzen
                                  let today = new Date();
                                  let jetzt = new Date();
                                  let tomorrow = today.setDate(today.getDate() + 1);
                                  let tomorrowAstroTime = getAstroDate(AstroChoice, tomorrow);
                                  tomorrowAstroTime.setMinutes(tomorrowAstroTime.getMinutes() + Shift);//zammrechna
                                  log(AstroChoice + " beginnt heute um:" + getAstroDate(AstroChoice).toLocaleTimeString('de-DE', { hour12: false }) + " und beginnt morgen um " + tomorrowAstroTime.toLocaleTimeString('de-DE', { hour12: false }));
                                  //log(getAstroDate(AstroChoice).getTime() + " " + today.getTime() + " " + today.toLocaleTimeString());
                                  //log("Astro=" + getAstroDate(AstroChoice) + " Heute=" + jetzt + " " + "todayzeit=" + today.toLocaleTimeString());
                              
                                  let AstroTime = getAstroDate(AstroChoice); //Astrotime einlesen
                                  AstroTime.setMinutes(AstroTime.getMinutes() + Shift);//zammrechna
                                  AstroTime.toLocaleTimeString('de-DE', { hour12: false });
                                  //if (getAstroDate(AstroChoice).getTime()  < jetzt.getTime()) { //Wenn Astrozeit vor aktueller Zeit dann Astrozeit von morgen verwenden
                                  if (AstroTime.getTime() <= jetzt.getTime() || GoToTomorrow == true) { //Wenn Astrozeit vor aktueller Zeit dann Astrozeit von morgen verwenden
                                      setState(id1[whichone][3], tomorrowAstroTime.toLocaleTimeString('de-DE', { hour12: false }));
                                      MyTimer[whichone][3] = tomorrowAstroTime.toLocaleTimeString('de-DE', { hour12: false });
                                      log("Astrotime von morgen verwendet, Event is heute bereits vorüber = " + tomorrowAstroTime.toLocaleTimeString('de-DE', { hour12: false }));
                                  }
                                  //else if (getAstroDate(AstroChoice).getTime() > jetzt.getTime()) {
                                  else if (AstroTime.getTime() > jetzt.getTime()) {
                                      setState(id1[whichone][3], AstroTime.toLocaleTimeString('de-DE', { hour12: false }));
                                      MyTimer[whichone][3] = AstroTime.toLocaleTimeString('de-DE', { hour12: false });
                                      log("Astrotime von heute verwendet, Event kommt heute noch = " + AstroTime.toLocaleTimeString('de-DE', { hour12: false }) + " Morgen=" + tomorrowAstroTime.toLocaleTimeString('de-DE', { hour12: false }));
                                  }
                                  else {
                                      log("Derf ned sei");
                                  };
                              };
                              
                              function DoAction(whichone) {
                                  if (MyTimer[whichone][0] == true) { //Wenn Timer aktiv
                                      if ((MyTimer[whichone][14] == true && Presence !=0) || (MyTimer[whichone][15] == true && Presence == 0) || (MyTimer[whichone][15] == true && MyTimer[whichone][14] == true)) { //Wenn "bei Anwesenheit" aktiv
                              
                                          if (MyTimer[whichone][1] == 1) { // Wenn die Rolle Anschalter ist
                                              setState(MyTimer[whichone][13], true); //Switchtarget aktivieren
                                              log(MyTimer[whichone][13] + " Timer " + whichone + " hat angeschaltet");
                                          }
                                          else if (MyTimer[whichone][1] == 0) { //Wenns die Rolle Ausschalter ist
                                              setState(MyTimer[whichone][13], false);//Switchtarget deaktivieren
                                              log("Timer " + whichone + " hat ausgeschaltet");
                                          };
                                      };
                                  };
                              };
                              
                              
                              //if (logging) { log(SplitTime("12:05") + h + m) };
                              //Zeit in Stunden und Minuten teilen für Cronstring
                              function SplitTime(Time) {
                                  var timesplit = Time.split(":", 2);
                                  //h = timesplit[0]  / m = timesplit[1];
                                  return timesplit;
                              };
                              
                              function main() {
                                  SetAllTimer();
                              };
                              
                              main();
                              
                              //Trigger für Timer x
                              onStop(function () { //Bei Scriptende alle Timer löschen
                                  for (let x = 1; x < AnzahlTimer + 1; x++) {
                                      KillTimer(x);
                                  };
                              }, 100);
                              
                              for (let x = 1; x < AnzahlTimer + 1; x++) { //Alle Timer durchlaufen und Trigger setzen
                                  on(id1[x][5], function (dp) { //Bei Änderung AstroChoice
                                      MyTimer[x][5] = getState(id1[x][5]).val; //Nach Änderung neuen Wert einlesen
                                      KillTimer(x);
                                      AstroOrTime(x);
                                      SetTimer(x);
                                      if (logging) log("AstroChoice geändert" + " für Timer " + x);
                                  });
                              
                                  on(id1[x][1], function (dp) { //Bei Änderung Rolle
                                      MyTimer[x][1] = getState(id1[x][1]).val; //Nach Änderung neuen Wert einlesen
                                      if (MyTimer[x][1] == 2) {//Wenn TimerRolle=2 =inaktiv
                                          MyTimer[x][0] = false;
                                          setState(id1[x][0], false);
                                      }
                                      else {
                                          MyTimer[x][0] = true;
                                          setState(id1[x][0], true);
                                      };
                                      KillTimer(x);
                                      SetTimer(x);
                                      if (logging) log("Rolle geändert" + " für Timer " + x);
                                  });
                              
                                  on(id1[x][4], function (dp) { //Bei Änderung Shift
                                      MyTimer[x][4] = getState(id1[x][4]).val; //Nach Änderung neuen Wert einlesen
                                      KillTimer(x);
                                      AstroOrTime(x);
                                      SetTimer(x);
                                      if (logging) log("Shift geändert" + " für Timer " + x);
                                  });
                              
                                  on(id1[x][2], function (dp) { //Bei Änderung Zeit (TimerTimestamp)
                                      //setTimeout(function () { //1sek Timeout um prellen zu vermeiden
                                      MyTimer[x][2] = getState(id1[x][2]).val; //Nach Änderung neuen Wert einlesen
                                      KillTimer(x);
                                      SetTimer(x);
                                      if (logging) log("TimerTimestamp Zeit geändert auf " + MyTimer[x][2] + " für Timer " + x);
                                      //}, 1000);
                                  });
                              
                                  on(id1[x][0], function (dp) { //Bei Änderung Timer Aktiv
                                      MyTimer[x][0] = getState(id1[x][0]).val; //Nach Änderung neuen Wert einlesen
                                      if (logging) log("TimerActive geändert auf " + MyTimer[x][0] + " für Timer " + x);
                                      //KillTimer(x);
                                      //SetTimer(x);
                              
                                  });
                              
                                  on(id1[x][6], function (dp) { //Bei Änderung Wochentage
                                      MyTimer[x][6] = getState(id1[x][6]).val; //Nach Änderung neuen Wert einlesen
                                      KillTimer(x);
                                      SetTimer(x);
                              
                                      if (logging) log("TimerTag " + Wochentage[0] + " geändert auf " + MyTimer[x][6] + " für Timer " + x);
                                  });
                                  on(id1[x][7], function (dp) { //Bei Änderung Wochentage
                                      MyTimer[x][7] = getState(id1[x][7]).val; //Nach Änderung neuen Wert einlesen
                                      KillTimer(x);
                                      SetTimer(x);
                              
                                      if (logging) log("TimerTag " + Wochentage[1] + " geändert auf " + MyTimer[x][7] + " für Timer " + x);
                                  });
                                  on(id1[x][8], function (dp) { //Bei Änderung Wochentage
                                      MyTimer[x][8] = getState(id1[x][8]).val; //Nach Änderung neuen Wert einlesen
                                      KillTimer(x);
                                      SetTimer(x);
                              
                                      if (logging) log("TimerTag " + Wochentage[2] + " geändert auf " + MyTimer[1][8] + " für Timer " + x);
                                  });
                                  on(id1[x][9], function (dp) { //Bei Änderung Wochentage
                                      MyTimer[x][9] = getState(id1[x][9]).val; //Nach Änderung neuen Wert einlesen
                                      KillTimer(x);
                                      SetTimer(x);
                              
                                      if (logging) log("TimerTag " + Wochentage[3] + " geändert auf " + MyTimer[x][9] + " für Timer " + x);
                                  });
                                  on(id1[x][10], function (dp) { //Bei Änderung Wochentage
                                      MyTimer[x][10] = getState(id1[x][10]).val; //Nach Änderung neuen Wert einlesen
                                      KillTimer(x);
                                      SetTimer(x);
                              
                                      if (logging) log("TimerTag " + Wochentage[4] + " geändert auf " + MyTimer[x][10] + " für Timer " + x);
                                  });
                                  on(id1[x][11], function (dp) { //Bei Änderung Wochentage
                                      MyTimer[x][11] = getState(id1[x][6]).val; //Nach Änderung neuen Wert einlesen
                                      KillTimer(x);
                                      SetTimer(x);
                              
                                      if (logging) log("TimerTag " + Wochentage[5] + " geändert auf " + MyTimer[x][11] + " für Timer " + x);
                                  });
                                  on(id1[x][12], function (dp) { //Bei Änderung Wochentage
                                      MyTimer[x][12] = getState(id1[x][12]).val; //Nach Änderung neuen Wert einlesen
                                      KillTimer(x);
                                      SetTimer(x);
                              
                                      if (logging) log("TimerTag " + Wochentage[6] + " geändert auf " + MyTimer[x][12] + " für Timer " + x);
                                  });
                                  on(id1[x][12], function (dp) { //Bei Änderung Switchtarget
                                      MyTimer[x][13] = getState(id1[x][13]).val; //Nach Änderung neuen Wert einlesen
                                      if (logging) log("TimerTag " + Wochentage[6] + " geändert auf " + MyTimer[x][12] + " für Timer " + x);
                                  });
                              
                              };
                              
                              
                              paul53P 1 Antwort Letzte Antwort
                              0
                              • AphofisA Aphofis

                                @paul53
                                Wenn ich den code mit anfüge gibt es Fehler!
                                Das ist das Original!

                                //Script tested & Ok
                                //Legt Timer an
                                //Wichtige Einstellungen
                                const AnzahlTimer = 20; //Wieviele Timer anlegen? Der erste ist 1, nicht 0!
                                
                                //let setTimeout;
                                const logging = true; //Logmeldungen an/aus
                                const praefix = "javascript.0.Timer."; //Grundpfad
                                //let Presence = getState("radar2.0._nHere").val; //Pfad zum Anwesenheitsdatenpunkt. Erwartet wird eine Zahl >=0
                                let Presence = true
                                var Wochentage = ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"]; //Array für createStateschleife zum anlegen der Wochentage
                                var Astrotrigger = ["dawn", "sunrise", "dusk", "goldenHour", "dusk", "sunset"]; //Array für Astro 
                                //if (logging) { log(Astrotrigger.length.toString()) };
                                createState(praefix + "TimerTargets", "", false, { read: true, write: true, name: "Ziele welche geschaltet werden", type: "string", def: "" }); //Zentrale Source für die Anzeige in vis, Erstellung in der TimerRoot
                                createState(praefix + "TimerTargetNames", "", false, { read: true, write: true, name: "Smartnames für die Ziele", type: "string", def: "" });
                                
                                for (let x = 1; x < AnzahlTimer + 1; x++) {
                                    //Datenpunkte anlegen 
                                    createState(praefix + x + ".Aktiv", false, false, { read: true, write: true, name: "Timer aktiv", type: "boolean", role: "switch", def: false }); //Legt fest ob der Timer aktiv ist
                                    createState(praefix + x + ".Rolle", 2, false, { read: true, write: true, name: "Rolle", type: "number", role: "value", def: 2 }); //Legt fest ob der Timer für An oder Aus zuständig ist
                                    createState(praefix + x + ".TimerTimestamp", "00:00:00", false, { read: true, write: true, name: "Zeitstempel für schaltzeit", type: "string", def: "00:00:00" });
                                    createState(praefix + x + ".TimerAstroTimestamp", "00:00:00", false, { read: true, write: true, name: "Zeitstempel für Astroschaltzeit", type: "string", def: "00:00:00" });
                                    createState(praefix + x + ".TimerAstroShift", 0, false, { read: true, write: true, name: "Zeitverschiebung für Astroschaltzeit", type: "number", def: 0 });
                                    for (let y = 0; y < 7; y++) { //Einträge für jeden Wochentag anlegen
                                        createState(praefix + x + ".Timer" + Wochentage[y], true, false, { read: true, write: true, name: Wochentage[y], type: "boolean", role: "switch", def: true });
                                    };
                                    createState(praefix + x + ".TimerChoice", "Zeit", false, { read: true, write: true, name: "Funktionswahl für Timer/Astro", type: "string", def: "Zeit" }); //Gewählte Funktion, Timer oder Astro
                                    createState(praefix + x + ".SwitchTarget", "", false, { read: true, write: true, name: "Ziel für Schaltvorgang", type: "string", def: "" });
                                    createState(praefix + x + ".OnlyIfPresence", false, false, { read: true, write: true, name: "Nur ausführen falls jemand anwesend", type: "boolean", role: "switch", def: false }); //Legt fest ob der Timer aktiv ist
                                    createState(praefix + x + ".OnlyIfNoPresence", false, false, { read: true, write: true, name: "Nur ausführen falls niemand anwesend", type: "boolean", role: "switch", def: false }); //Legt fest ob der Timer aktiv ist
                                };
                                
                                //****************************
                                
                                //Datenpunkte Id"s zuweisen
                                var id1 = [];
                                for (let x = 1; x < AnzahlTimer + 1; x++) {//Anzahl der Timer
                                    let y = 0;
                                    id1[x] = [];
                                    id1[x][y] = (praefix + x + ".Aktiv"); y = y + 1;
                                    id1[x][y] = (praefix + x + ".Rolle"); y = y + 1;
                                    id1[x][y] = (praefix + x + ".TimerTimestamp"); y = y + 1;
                                    id1[x][y] = (praefix + x + ".TimerAstroTimestamp"); y = y + 1;
                                    id1[x][y] = (praefix + x + ".TimerAstroShift"); y = y + 1;
                                    id1[x][y] = (praefix + x + ".TimerChoice"); y = y + 1;
                                    for (let z = 0; z < Wochentage.length; z++) {//Schleifenvariable für Wochentage
                                        id1[x][y] = (praefix + x + ".Timer" + Wochentage[z]); y = y + 1;
                                    };
                                    id1[x][y] = (praefix + x + ".SwitchTarget"); y = y + 1;
                                    id1[x][y] = (praefix + x + ".OnlyIfPresence"); y = y + 1;
                                    id1[x][y] = (praefix + x + ".OnlyIfNoPresence"); y = y + 1;
                                
                                };
                                
                                // TimerVariablenArray anlegen für schedules
                                var TimerAction = [];
                                for (let x = 1; x < AnzahlTimer + 1; x++) {
                                    TimerAction[x] = null;
                                };
                                
                                //Alle Daten in MyTimer Array einlesen
                                var MyTimer = [];
                                for (let x = 1; x < AnzahlTimer + 1; x++) {
                                    MyTimer[x] = [];
                                    for (let y = 0; y < id1[x].length; y++) {
                                        //log("x=" + x + "  y=" + y);
                                        MyTimer[x][y] = getState(id1[x][y]).val;
                                        //log(MyTimer[x][y]);
                                    };
                                };
                                
                                //******************************************************** */
                                
                                function MakeCronString(whichone) { //String nach Cronsyntax zusammenbauen für Schedule
                                
                                    var DaysSubString = "";
                                    for (let x = 0; x < 7; x++) {
                                        if (MyTimer[whichone][x + 6] == true) { //Beginnend mit dem 6ten Eintrag (TimerSonntag) die 7 Wochentage durchzählen und Werte anhängen
                                            DaysSubString = DaysSubString + x + ",";
                                        };
                                    };
                                    DaysSubString = DaysSubString.substr(0, DaysSubString.length - 1); //Komma am Ende entfernen
                                    if (DaysSubString == "0,1,2,3,4,5,6") { DaysSubString = "*"; }; // Sternchen wenn alle Tage gewählt
                                
                                    var tempString = "";
                                    if (MyTimer[whichone][5] == "Zeit") { //Wenn Zeit gewählt
                                        tempString = SplitTime(MyTimer[whichone][2])[1] + " " + SplitTime(MyTimer[whichone][2])[0] + " * * " + DaysSubString;
                                        log("CronString für Timer " + whichone + " erstellt " + tempString);
                                    }
                                    else if (MyTimer[whichone][5] != "Zeit") { //Wenn Astro gewählt
                                        tempString = SplitTime(MyTimer[whichone][3])[1] + " " + SplitTime(MyTimer[whichone][3])[0] + " * * " + DaysSubString;
                                        log("Cronstring für Timer " + whichone + " Astro erstellt " + tempString);
                                    };
                                    return tempString;
                                };
                                
                                //spezifischen Timer setzen
                                function SetTimer(whichone) {
                                    if (MyTimer[whichone][0] == true) {
                                        log("Timer " + whichone + " wird gesetzt")
                                        TimerAction[whichone] = schedule(MakeCronString(whichone), function () {
                                            DoAction(whichone);
                                            if (MyTimer[whichone][5] != "Zeit") { //Wenn Astro gewählt
                                                RefreshAstro(whichone); //Neue Astrozeit setzen nach Ausführung
                                            }
                                        });
                                    };
                                };
                                
                                function RefreshAstro(whichone) {
                                    if (logging) { log("Refresh Astro") };
                                    SetChoosenAstroTime(whichone, true);
                                    SetTimer(whichone);
                                };
                                
                                //Alle Timer setzen
                                function SetAllTimer() {
                                    if (logging) { log("Setting all Timers") };
                                    for (let x = 1; x < AnzahlTimer + 1; x++) {
                                        SetTimer(x);
                                    }
                                };
                                
                                //spezifischen Timer löschen
                                function KillTimer(whichone) {
                                    clearSchedule(TimerAction[whichone]);
                                    if (logging) { log("Timer " + whichone + " killed") };
                                }
                                
                                //Astro oder Zeit Gateway
                                function AstroOrTime(whichone) {
                                    if (MyTimer[whichone][5] == "Zeit") {
                                        if (logging) { log("Zeit gewählt " + MyTimer[whichone][2]) };
                                    }
                                    else if (MyTimer[whichone][5] != "Zeit") {
                                        SetChoosenAstroTime(whichone);
                                        log("Astro gewählt, Variante " + MyTimer[whichone][5]);
                                    };
                                };
                                
                                function SetChoosenAstroTime(whichone, GoToTomorrow) { //Zeit für gewählte Astrozeit eintragen
                                    let Shift = parseInt(MyTimer[whichone][4]); //Wert für Shift
                                    let AstroChoice = MyTimer[whichone][5].trim(); //Wert für Astroereignis
                                
                                    //Berücksichtigen ob Event schon vorbei ist und dann für morgen setzen
                                    let today = new Date();
                                    let jetzt = new Date();
                                    let tomorrow = today.setDate(today.getDate() + 1);
                                    let tomorrowAstroTime = getAstroDate(AstroChoice, tomorrow);
                                    tomorrowAstroTime.setMinutes(tomorrowAstroTime.getMinutes() + Shift);//zammrechna
                                    log(AstroChoice + " beginnt heute um:" + getAstroDate(AstroChoice).toLocaleTimeString('de-DE', { hour12: false }) + " und beginnt morgen um " + tomorrowAstroTime.toLocaleTimeString('de-DE', { hour12: false }));
                                    //log(getAstroDate(AstroChoice).getTime() + " " + today.getTime() + " " + today.toLocaleTimeString());
                                    //log("Astro=" + getAstroDate(AstroChoice) + " Heute=" + jetzt + " " + "todayzeit=" + today.toLocaleTimeString());
                                
                                    let AstroTime = getAstroDate(AstroChoice); //Astrotime einlesen
                                    AstroTime.setMinutes(AstroTime.getMinutes() + Shift);//zammrechna
                                    AstroTime.toLocaleTimeString('de-DE', { hour12: false });
                                    //if (getAstroDate(AstroChoice).getTime()  < jetzt.getTime()) { //Wenn Astrozeit vor aktueller Zeit dann Astrozeit von morgen verwenden
                                    if (AstroTime.getTime() <= jetzt.getTime() || GoToTomorrow == true) { //Wenn Astrozeit vor aktueller Zeit dann Astrozeit von morgen verwenden
                                        setState(id1[whichone][3], tomorrowAstroTime.toLocaleTimeString('de-DE', { hour12: false }));
                                        MyTimer[whichone][3] = tomorrowAstroTime.toLocaleTimeString('de-DE', { hour12: false });
                                        log("Astrotime von morgen verwendet, Event is heute bereits vorüber = " + tomorrowAstroTime.toLocaleTimeString('de-DE', { hour12: false }));
                                    }
                                    //else if (getAstroDate(AstroChoice).getTime() > jetzt.getTime()) {
                                    else if (AstroTime.getTime() > jetzt.getTime()) {
                                        setState(id1[whichone][3], AstroTime.toLocaleTimeString('de-DE', { hour12: false }));
                                        MyTimer[whichone][3] = AstroTime.toLocaleTimeString('de-DE', { hour12: false });
                                        log("Astrotime von heute verwendet, Event kommt heute noch = " + AstroTime.toLocaleTimeString('de-DE', { hour12: false }) + " Morgen=" + tomorrowAstroTime.toLocaleTimeString('de-DE', { hour12: false }));
                                    }
                                    else {
                                        log("Derf ned sei");
                                    };
                                };
                                
                                function DoAction(whichone) {
                                    if (MyTimer[whichone][0] == true) { //Wenn Timer aktiv
                                        if ((MyTimer[whichone][14] == true && Presence !=0) || (MyTimer[whichone][15] == true && Presence == 0) || (MyTimer[whichone][15] == true && MyTimer[whichone][14] == true)) { //Wenn "bei Anwesenheit" aktiv
                                
                                            if (MyTimer[whichone][1] == 1) { // Wenn die Rolle Anschalter ist
                                                setState(MyTimer[whichone][13], true); //Switchtarget aktivieren
                                                log(MyTimer[whichone][13] + " Timer " + whichone + " hat angeschaltet");
                                            }
                                            else if (MyTimer[whichone][1] == 0) { //Wenns die Rolle Ausschalter ist
                                                setState(MyTimer[whichone][13], false);//Switchtarget deaktivieren
                                                log("Timer " + whichone + " hat ausgeschaltet");
                                            };
                                        };
                                    };
                                };
                                
                                
                                //if (logging) { log(SplitTime("12:05") + h + m) };
                                //Zeit in Stunden und Minuten teilen für Cronstring
                                function SplitTime(Time) {
                                    var timesplit = Time.split(":", 2);
                                    //h = timesplit[0]  / m = timesplit[1];
                                    return timesplit;
                                };
                                
                                function main() {
                                    SetAllTimer();
                                };
                                
                                main();
                                
                                //Trigger für Timer x
                                onStop(function () { //Bei Scriptende alle Timer löschen
                                    for (let x = 1; x < AnzahlTimer + 1; x++) {
                                        KillTimer(x);
                                    };
                                }, 100);
                                
                                for (let x = 1; x < AnzahlTimer + 1; x++) { //Alle Timer durchlaufen und Trigger setzen
                                    on(id1[x][5], function (dp) { //Bei Änderung AstroChoice
                                        MyTimer[x][5] = getState(id1[x][5]).val; //Nach Änderung neuen Wert einlesen
                                        KillTimer(x);
                                        AstroOrTime(x);
                                        SetTimer(x);
                                        if (logging) log("AstroChoice geändert" + " für Timer " + x);
                                    });
                                
                                    on(id1[x][1], function (dp) { //Bei Änderung Rolle
                                        MyTimer[x][1] = getState(id1[x][1]).val; //Nach Änderung neuen Wert einlesen
                                        if (MyTimer[x][1] == 2) {//Wenn TimerRolle=2 =inaktiv
                                            MyTimer[x][0] = false;
                                            setState(id1[x][0], false);
                                        }
                                        else {
                                            MyTimer[x][0] = true;
                                            setState(id1[x][0], true);
                                        };
                                        KillTimer(x);
                                        SetTimer(x);
                                        if (logging) log("Rolle geändert" + " für Timer " + x);
                                    });
                                
                                    on(id1[x][4], function (dp) { //Bei Änderung Shift
                                        MyTimer[x][4] = getState(id1[x][4]).val; //Nach Änderung neuen Wert einlesen
                                        KillTimer(x);
                                        AstroOrTime(x);
                                        SetTimer(x);
                                        if (logging) log("Shift geändert" + " für Timer " + x);
                                    });
                                
                                    on(id1[x][2], function (dp) { //Bei Änderung Zeit (TimerTimestamp)
                                        //setTimeout(function () { //1sek Timeout um prellen zu vermeiden
                                        MyTimer[x][2] = getState(id1[x][2]).val; //Nach Änderung neuen Wert einlesen
                                        KillTimer(x);
                                        SetTimer(x);
                                        if (logging) log("TimerTimestamp Zeit geändert auf " + MyTimer[x][2] + " für Timer " + x);
                                        //}, 1000);
                                    });
                                
                                    on(id1[x][0], function (dp) { //Bei Änderung Timer Aktiv
                                        MyTimer[x][0] = getState(id1[x][0]).val; //Nach Änderung neuen Wert einlesen
                                        if (logging) log("TimerActive geändert auf " + MyTimer[x][0] + " für Timer " + x);
                                        //KillTimer(x);
                                        //SetTimer(x);
                                
                                    });
                                
                                    on(id1[x][6], function (dp) { //Bei Änderung Wochentage
                                        MyTimer[x][6] = getState(id1[x][6]).val; //Nach Änderung neuen Wert einlesen
                                        KillTimer(x);
                                        SetTimer(x);
                                
                                        if (logging) log("TimerTag " + Wochentage[0] + " geändert auf " + MyTimer[x][6] + " für Timer " + x);
                                    });
                                    on(id1[x][7], function (dp) { //Bei Änderung Wochentage
                                        MyTimer[x][7] = getState(id1[x][7]).val; //Nach Änderung neuen Wert einlesen
                                        KillTimer(x);
                                        SetTimer(x);
                                
                                        if (logging) log("TimerTag " + Wochentage[1] + " geändert auf " + MyTimer[x][7] + " für Timer " + x);
                                    });
                                    on(id1[x][8], function (dp) { //Bei Änderung Wochentage
                                        MyTimer[x][8] = getState(id1[x][8]).val; //Nach Änderung neuen Wert einlesen
                                        KillTimer(x);
                                        SetTimer(x);
                                
                                        if (logging) log("TimerTag " + Wochentage[2] + " geändert auf " + MyTimer[1][8] + " für Timer " + x);
                                    });
                                    on(id1[x][9], function (dp) { //Bei Änderung Wochentage
                                        MyTimer[x][9] = getState(id1[x][9]).val; //Nach Änderung neuen Wert einlesen
                                        KillTimer(x);
                                        SetTimer(x);
                                
                                        if (logging) log("TimerTag " + Wochentage[3] + " geändert auf " + MyTimer[x][9] + " für Timer " + x);
                                    });
                                    on(id1[x][10], function (dp) { //Bei Änderung Wochentage
                                        MyTimer[x][10] = getState(id1[x][10]).val; //Nach Änderung neuen Wert einlesen
                                        KillTimer(x);
                                        SetTimer(x);
                                
                                        if (logging) log("TimerTag " + Wochentage[4] + " geändert auf " + MyTimer[x][10] + " für Timer " + x);
                                    });
                                    on(id1[x][11], function (dp) { //Bei Änderung Wochentage
                                        MyTimer[x][11] = getState(id1[x][6]).val; //Nach Änderung neuen Wert einlesen
                                        KillTimer(x);
                                        SetTimer(x);
                                
                                        if (logging) log("TimerTag " + Wochentage[5] + " geändert auf " + MyTimer[x][11] + " für Timer " + x);
                                    });
                                    on(id1[x][12], function (dp) { //Bei Änderung Wochentage
                                        MyTimer[x][12] = getState(id1[x][12]).val; //Nach Änderung neuen Wert einlesen
                                        KillTimer(x);
                                        SetTimer(x);
                                
                                        if (logging) log("TimerTag " + Wochentage[6] + " geändert auf " + MyTimer[x][12] + " für Timer " + x);
                                    });
                                    on(id1[x][12], function (dp) { //Bei Änderung Switchtarget
                                        MyTimer[x][13] = getState(id1[x][13]).val; //Nach Änderung neuen Wert einlesen
                                        if (logging) log("TimerTag " + Wochentage[6] + " geändert auf " + MyTimer[x][12] + " für Timer " + x);
                                    });
                                
                                };
                                
                                
                                paul53P Offline
                                paul53P Offline
                                paul53
                                schrieb am zuletzt editiert von paul53
                                #26

                                @Aphofis sagte:

                                Das ist das Original!

                                Ersetze Zeilen 175 bis 189 durch die Änderung und deklariere z.B. in Zeile 9 die ID des neuen Datenpunktes und erzeuge ihn.

                                const idActive = praefix + 'Active'; // Zeile 9
                                createState(idActive, praefix + 'stop', {type: 'string'}); // oder was gerade aktiv ist
                                

                                Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                                Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                                AphofisA 1 Antwort Letzte Antwort
                                0
                                • paul53P paul53

                                  @Aphofis sagte:

                                  Das ist das Original!

                                  Ersetze Zeilen 175 bis 189 durch die Änderung und deklariere z.B. in Zeile 9 die ID des neuen Datenpunktes und erzeuge ihn.

                                  const idActive = praefix + 'Active'; // Zeile 9
                                  createState(idActive, praefix + 'stop', {type: 'string'}); // oder was gerade aktiv ist
                                  
                                  AphofisA Offline
                                  AphofisA Offline
                                  Aphofis
                                  schrieb am zuletzt editiert von Aphofis
                                  #27

                                  @paul53
                                  Hab ich ersetzt.
                                  Wie meinst du Zeile 9
                                  ich brauche die Anwesenheit doch nicht !
                                  Habe Zeile 9 auf den Datenpunkt idActive gesetzt wenn ich das richtig verstanden habe nur wird nix geschaltet

                                  let Presence = getState("javascript.0.Timer.idActive").val; //Pfad zum Anwesenheitsdatenpunkt. Erwartet wird eine Zahl >=0
                                  
                                  
                                  paul53P 1 Antwort Letzte Antwort
                                  0
                                  • AphofisA Aphofis

                                    @paul53
                                    Hab ich ersetzt.
                                    Wie meinst du Zeile 9
                                    ich brauche die Anwesenheit doch nicht !
                                    Habe Zeile 9 auf den Datenpunkt idActive gesetzt wenn ich das richtig verstanden habe nur wird nix geschaltet

                                    let Presence = getState("javascript.0.Timer.idActive").val; //Pfad zum Anwesenheitsdatenpunkt. Erwartet wird eine Zahl >=0
                                    
                                    
                                    paul53P Offline
                                    paul53P Offline
                                    paul53
                                    schrieb am zuletzt editiert von paul53
                                    #28

                                    @Aphofis sagte:

                                    wenn ich das richtig verstanden habe

                                    Nein das hast Du falsch verstanden: Einfügen !

                                    //Script tested & Ok
                                    //Legt Timer an
                                    //Wichtige Einstellungen
                                    const AnzahlTimer = 20; //Wieviele Timer anlegen? Der erste ist 1, nicht 0!
                                     
                                    //let setTimeout;
                                    const logging = true; //Logmeldungen an/aus
                                    const praefix = "javascript.0.Timer."; //Grundpfad
                                    const idActive = praefix + 'Active'; 
                                    createState(idActive, praefix + 'stop', {type: 'string'}); // oder was gerade aktiv ist
                                    let Presence = true
                                    

                                    Aktiviere vorher "stop".

                                    Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                                    Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                                    AphofisA 1 Antwort Letzte Antwort
                                    0
                                    • paul53P paul53

                                      @Aphofis sagte:

                                      wenn ich das richtig verstanden habe

                                      Nein das hast Du falsch verstanden: Einfügen !

                                      //Script tested & Ok
                                      //Legt Timer an
                                      //Wichtige Einstellungen
                                      const AnzahlTimer = 20; //Wieviele Timer anlegen? Der erste ist 1, nicht 0!
                                       
                                      //let setTimeout;
                                      const logging = true; //Logmeldungen an/aus
                                      const praefix = "javascript.0.Timer."; //Grundpfad
                                      const idActive = praefix + 'Active'; 
                                      createState(idActive, praefix + 'stop', {type: 'string'}); // oder was gerade aktiv ist
                                      let Presence = true
                                      

                                      Aktiviere vorher "stop".

                                      AphofisA Offline
                                      AphofisA Offline
                                      Aphofis
                                      schrieb am zuletzt editiert von Aphofis
                                      #29

                                      @paul53
                                      Irgendwie ist da immer noch ein Fehler drin!

                                      07:12:03.439	error	javascript.0 (1045) script.js.Technik_Steuerung.Tunze_Timer compile failed:
                                       at script.js.Technik_Steuerung.Tunze_Timer:176
                                      
                                      //Script tested & Ok
                                      //Legt Timer an
                                      //Wichtige Einstellungen
                                      const AnzahlTimer = 20; //Wieviele Timer anlegen? Der erste ist 1, nicht 0!
                                      
                                      //let setTimeout;
                                      const logging = true; //Logmeldungen an/aus
                                      const praefix = "javascript.0.Timer."; //Grundpfad
                                      const idActive = praefix + 'Active'; 
                                      createState(idActive, praefix + 'stop', {type: 'string'}); // oder was gerade aktiv ist
                                      let Presence = true
                                      var Wochentage = ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"]; //Array für createStateschleife zum anlegen der Wochentage
                                      var Astrotrigger = ["dawn", "sunrise", "dusk", "goldenHour", "dusk", "sunset"]; //Array für Astro 
                                      //if (logging) { log(Astrotrigger.length.toString()) };
                                      createState(praefix + "TimerTargets", "", false, { read: true, write: true, name: "Ziele welche geschaltet werden", type: "string", def: "" }); //Zentrale Source für die Anzeige in vis, Erstellung in der TimerRoot
                                      createState(praefix + "TimerTargetNames", "", false, { read: true, write: true, name: "Smartnames für die Ziele", type: "string", def: "" });
                                      
                                      for (let x = 1; x < AnzahlTimer + 1; x++) {
                                          //Datenpunkte anlegen 
                                          createState(praefix + x + ".Aktiv", false, false, { read: true, write: true, name: "Timer aktiv", type: "boolean", role: "switch", def: false }); //Legt fest ob der Timer aktiv ist
                                          createState(praefix + x + ".Rolle", 2, false, { read: true, write: true, name: "Rolle", type: "number", role: "value", def: 2 }); //Legt fest ob der Timer für An oder Aus zuständig ist
                                          createState(praefix + x + ".TimerTimestamp", "00:00:00", false, { read: true, write: true, name: "Zeitstempel für schaltzeit", type: "string", def: "00:00:00" });
                                          createState(praefix + x + ".TimerAstroTimestamp", "00:00:00", false, { read: true, write: true, name: "Zeitstempel für Astroschaltzeit", type: "string", def: "00:00:00" });
                                          createState(praefix + x + ".TimerAstroShift", 0, false, { read: true, write: true, name: "Zeitverschiebung für Astroschaltzeit", type: "number", def: 0 });
                                          for (let y = 0; y < 7; y++) { //Einträge für jeden Wochentag anlegen
                                              createState(praefix + x + ".Timer" + Wochentage[y], true, false, { read: true, write: true, name: Wochentage[y], type: "boolean", role: "switch", def: true });
                                          };
                                          createState(praefix + x + ".TimerChoice", "Zeit", false, { read: true, write: true, name: "Funktionswahl für Timer/Astro", type: "string", def: "Zeit" }); //Gewählte Funktion, Timer oder Astro
                                          createState(praefix + x + ".SwitchTarget", "", false, { read: true, write: true, name: "Ziel für Schaltvorgang", type: "string", def: "" });
                                          createState(praefix + x + ".OnlyIfPresence", false, false, { read: true, write: true, name: "Nur ausführen falls jemand anwesend", type: "boolean", role: "switch", def: false }); //Legt fest ob der Timer aktiv ist
                                          createState(praefix + x + ".OnlyIfNoPresence", false, false, { read: true, write: true, name: "Nur ausführen falls niemand anwesend", type: "boolean", role: "switch", def: false }); //Legt fest ob der Timer aktiv ist
                                      };
                                      
                                      //****************************
                                      
                                      //Datenpunkte Id"s zuweisen
                                      var id1 = [];
                                      for (let x = 1; x < AnzahlTimer + 1; x++) {//Anzahl der Timer
                                          let y = 0;
                                          id1[x] = [];
                                          id1[x][y] = (praefix + x + ".Aktiv"); y = y + 1;
                                          id1[x][y] = (praefix + x + ".Rolle"); y = y + 1;
                                          id1[x][y] = (praefix + x + ".TimerTimestamp"); y = y + 1;
                                          id1[x][y] = (praefix + x + ".TimerAstroTimestamp"); y = y + 1;
                                          id1[x][y] = (praefix + x + ".TimerAstroShift"); y = y + 1;
                                          id1[x][y] = (praefix + x + ".TimerChoice"); y = y + 1;
                                          for (let z = 0; z < Wochentage.length; z++) {//Schleifenvariable für Wochentage
                                              id1[x][y] = (praefix + x + ".Timer" + Wochentage[z]); y = y + 1;
                                          };
                                          id1[x][y] = (praefix + x + ".SwitchTarget"); y = y + 1;
                                          id1[x][y] = (praefix + x + ".OnlyIfPresence"); y = y + 1;
                                          id1[x][y] = (praefix + x + ".OnlyIfNoPresence"); y = y + 1;
                                      
                                      };
                                      
                                      // TimerVariablenArray anlegen für schedules
                                      var TimerAction = [];
                                      for (let x = 1; x < AnzahlTimer + 1; x++) {
                                          TimerAction[x] = null;
                                      };
                                      
                                      //Alle Daten in MyTimer Array einlesen
                                      var MyTimer = [];
                                      for (let x = 1; x < AnzahlTimer + 1; x++) {
                                          MyTimer[x] = [];
                                          for (let y = 0; y < id1[x].length; y++) {
                                              //log("x=" + x + "  y=" + y);
                                              MyTimer[x][y] = getState(id1[x][y]).val;
                                              //log(MyTimer[x][y]);
                                          };
                                      };
                                      
                                      //******************************************************** */
                                      
                                      function MakeCronString(whichone) { //String nach Cronsyntax zusammenbauen für Schedule
                                      
                                          var DaysSubString = "";
                                          for (let x = 0; x < 7; x++) {
                                              if (MyTimer[whichone][x + 6] == true) { //Beginnend mit dem 6ten Eintrag (TimerSonntag) die 7 Wochentage durchzählen und Werte anhängen
                                                  DaysSubString = DaysSubString + x + ",";
                                              };
                                          };
                                          DaysSubString = DaysSubString.substr(0, DaysSubString.length - 1); //Komma am Ende entfernen
                                          if (DaysSubString == "0,1,2,3,4,5,6") { DaysSubString = "*"; }; // Sternchen wenn alle Tage gewählt
                                      
                                          var tempString = "";
                                          if (MyTimer[whichone][5] == "Zeit") { //Wenn Zeit gewählt
                                              tempString = SplitTime(MyTimer[whichone][2])[1] + " " + SplitTime(MyTimer[whichone][2])[0] + " * * " + DaysSubString;
                                              log("CronString für Timer " + whichone + " erstellt " + tempString);
                                          }
                                          else if (MyTimer[whichone][5] != "Zeit") { //Wenn Astro gewählt
                                              tempString = SplitTime(MyTimer[whichone][3])[1] + " " + SplitTime(MyTimer[whichone][3])[0] + " * * " + DaysSubString;
                                              log("Cronstring für Timer " + whichone + " Astro erstellt " + tempString);
                                          };
                                          return tempString;
                                      };
                                      
                                      //spezifischen Timer setzen
                                      function SetTimer(whichone) {
                                          if (MyTimer[whichone][0] == true) {
                                              log("Timer " + whichone + " wird gesetzt")
                                              TimerAction[whichone] = schedule(MakeCronString(whichone), function () {
                                                  DoAction(whichone);
                                                  if (MyTimer[whichone][5] != "Zeit") { //Wenn Astro gewählt
                                                      RefreshAstro(whichone); //Neue Astrozeit setzen nach Ausführung
                                                  }
                                              });
                                          };
                                      };
                                      
                                      function RefreshAstro(whichone) {
                                          if (logging) { log("Refresh Astro") };
                                          SetChoosenAstroTime(whichone, true);
                                          SetTimer(whichone);
                                      };
                                      
                                      //Alle Timer setzen
                                      function SetAllTimer() {
                                          if (logging) { log("Setting all Timers") };
                                          for (let x = 1; x < AnzahlTimer + 1; x++) {
                                              SetTimer(x);
                                          }
                                      };
                                      
                                      //spezifischen Timer löschen
                                      function KillTimer(whichone) {
                                          clearSchedule(TimerAction[whichone]);
                                          if (logging) { log("Timer " + whichone + " killed") };
                                      }
                                      
                                      //Astro oder Zeit Gateway
                                      function AstroOrTime(whichone) {
                                          if (MyTimer[whichone][5] == "Zeit") {
                                              if (logging) { log("Zeit gewählt " + MyTimer[whichone][2]) };
                                          }
                                          else if (MyTimer[whichone][5] != "Zeit") {
                                              SetChoosenAstroTime(whichone);
                                              log("Astro gewählt, Variante " + MyTimer[whichone][5]);
                                          };
                                      };
                                      
                                      function SetChoosenAstroTime(whichone, GoToTomorrow) { //Zeit für gewählte Astrozeit eintragen
                                          let Shift = parseInt(MyTimer[whichone][4]); //Wert für Shift
                                          let AstroChoice = MyTimer[whichone][5].trim(); //Wert für Astroereignis
                                      
                                          //Berücksichtigen ob Event schon vorbei ist und dann für morgen setzen
                                          let today = new Date();
                                          let jetzt = new Date();
                                          let tomorrow = today.setDate(today.getDate() + 1);
                                          let tomorrowAstroTime = getAstroDate(AstroChoice, tomorrow);
                                          tomorrowAstroTime.setMinutes(tomorrowAstroTime.getMinutes() + Shift);//zammrechna
                                          log(AstroChoice + " beginnt heute um:" + getAstroDate(AstroChoice).toLocaleTimeString('de-DE', { hour12: false }) + " und beginnt morgen um " + tomorrowAstroTime.toLocaleTimeString('de-DE', { hour12: false }));
                                          //log(getAstroDate(AstroChoice).getTime() + " " + today.getTime() + " " + today.toLocaleTimeString());
                                          //log("Astro=" + getAstroDate(AstroChoice) + " Heute=" + jetzt + " " + "todayzeit=" + today.toLocaleTimeString());
                                      
                                          let AstroTime = getAstroDate(AstroChoice); //Astrotime einlesen
                                          AstroTime.setMinutes(AstroTime.getMinutes() + Shift);//zammrechna
                                          AstroTime.toLocaleTimeString('de-DE', { hour12: false });
                                          //if (getAstroDate(AstroChoice).getTime()  < jetzt.getTime()) { //Wenn Astrozeit vor aktueller Zeit dann Astrozeit von morgen verwenden
                                          if (AstroTime.getTime() <= jetzt.getTime() || GoToTomorrow == true) { //Wenn Astrozeit vor aktueller Zeit dann Astrozeit von morgen verwenden
                                              setState(id1[whichone][3], tomorrowAstroTime.toLocaleTimeString('de-DE', { hour12: false }));
                                              MyTimer[whichone][3] = tomorrowAstroTime.toLocaleTimeString('de-DE', { hour12: false });
                                              log("Astrotime von morgen verwendet, Event is heute bereits vorüber = " + tomorrowAstroTime.toLocaleTimeString('de-DE', { hour12: false }));
                                          }
                                          //else if (getAstroDate(AstroChoice).getTime() > jetzt.getTime()) {
                                          else if (AstroTime.getTime() > jetzt.getTime()) {
                                              setState(id1[whichone][3], AstroTime.toLocaleTimeString('de-DE', { hour12: false }));
                                              MyTimer[whichone][3] = AstroTime.toLocaleTimeString('de-DE', { hour12: false });
                                              log("Astrotime von heute verwendet, Event kommt heute noch = " + AstroTime.toLocaleTimeString('de-DE', { hour12: false }) + " Morgen=" + tomorrowAstroTime.toLocaleTimeString('de-DE', { hour12: false }));
                                          }
                                          else {
                                              log("Derf ned sei");
                                          };
                                      };
                                      
                                      const idActive = praefix + 'Active'; // Zeile 9
                                      createState(idActive, praefix + 'stop', {type: 'string'}); // oder was gerade aktiv ist
                                      
                                      
                                      //if (logging) { log(SplitTime("12:05") + h + m) };
                                      //Zeit in Stunden und Minuten teilen für Cronstring
                                      function SplitTime(Time) {
                                          var timesplit = Time.split(":", 2);
                                          //h = timesplit[0]  / m = timesplit[1];
                                          return timesplit;
                                      };
                                      
                                      function main() {
                                          SetAllTimer();
                                      };
                                      
                                      main();
                                      
                                      //Trigger für Timer x
                                      onStop(function () { //Bei Scriptende alle Timer löschen
                                          for (let x = 1; x < AnzahlTimer + 1; x++) {
                                              KillTimer(x);
                                          };
                                      }, 100);
                                      
                                      for (let x = 1; x < AnzahlTimer + 1; x++) { //Alle Timer durchlaufen und Trigger setzen
                                          on(id1[x][5], function (dp) { //Bei Änderung AstroChoice
                                              MyTimer[x][5] = getState(id1[x][5]).val; //Nach Änderung neuen Wert einlesen
                                              KillTimer(x);
                                              AstroOrTime(x);
                                              SetTimer(x);
                                              if (logging) log("AstroChoice geändert" + " für Timer " + x);
                                          });
                                      
                                          on(id1[x][1], function (dp) { //Bei Änderung Rolle
                                              MyTimer[x][1] = getState(id1[x][1]).val; //Nach Änderung neuen Wert einlesen
                                              if (MyTimer[x][1] == 2) {//Wenn TimerRolle=2 =inaktiv
                                                  MyTimer[x][0] = false;
                                                  setState(id1[x][0], false);
                                              }
                                              else {
                                                  MyTimer[x][0] = true;
                                                  setState(id1[x][0], true);
                                              };
                                              KillTimer(x);
                                              SetTimer(x);
                                              if (logging) log("Rolle geändert" + " für Timer " + x);
                                          });
                                      
                                          on(id1[x][4], function (dp) { //Bei Änderung Shift
                                              MyTimer[x][4] = getState(id1[x][4]).val; //Nach Änderung neuen Wert einlesen
                                              KillTimer(x);
                                              AstroOrTime(x);
                                              SetTimer(x);
                                              if (logging) log("Shift geändert" + " für Timer " + x);
                                          });
                                      
                                          on(id1[x][2], function (dp) { //Bei Änderung Zeit (TimerTimestamp)
                                              //setTimeout(function () { //1sek Timeout um prellen zu vermeiden
                                              MyTimer[x][2] = getState(id1[x][2]).val; //Nach Änderung neuen Wert einlesen
                                              KillTimer(x);
                                              SetTimer(x);
                                              if (logging) log("TimerTimestamp Zeit geändert auf " + MyTimer[x][2] + " für Timer " + x);
                                              //}, 1000);
                                          });
                                      
                                          on(id1[x][0], function (dp) { //Bei Änderung Timer Aktiv
                                              MyTimer[x][0] = getState(id1[x][0]).val; //Nach Änderung neuen Wert einlesen
                                              if (logging) log("TimerActive geändert auf " + MyTimer[x][0] + " für Timer " + x);
                                              //KillTimer(x);
                                              //SetTimer(x);
                                      
                                          });
                                      
                                          on(id1[x][6], function (dp) { //Bei Änderung Wochentage
                                              MyTimer[x][6] = getState(id1[x][6]).val; //Nach Änderung neuen Wert einlesen
                                              KillTimer(x);
                                              SetTimer(x);
                                      
                                              if (logging) log("TimerTag " + Wochentage[0] + " geändert auf " + MyTimer[x][6] + " für Timer " + x);
                                          });
                                          on(id1[x][7], function (dp) { //Bei Änderung Wochentage
                                              MyTimer[x][7] = getState(id1[x][7]).val; //Nach Änderung neuen Wert einlesen
                                              KillTimer(x);
                                              SetTimer(x);
                                      
                                              if (logging) log("TimerTag " + Wochentage[1] + " geändert auf " + MyTimer[x][7] + " für Timer " + x);
                                          });
                                          on(id1[x][8], function (dp) { //Bei Änderung Wochentage
                                              MyTimer[x][8] = getState(id1[x][8]).val; //Nach Änderung neuen Wert einlesen
                                              KillTimer(x);
                                              SetTimer(x);
                                      
                                              if (logging) log("TimerTag " + Wochentage[2] + " geändert auf " + MyTimer[1][8] + " für Timer " + x);
                                          });
                                          on(id1[x][9], function (dp) { //Bei Änderung Wochentage
                                              MyTimer[x][9] = getState(id1[x][9]).val; //Nach Änderung neuen Wert einlesen
                                              KillTimer(x);
                                              SetTimer(x);
                                      
                                              if (logging) log("TimerTag " + Wochentage[3] + " geändert auf " + MyTimer[x][9] + " für Timer " + x);
                                          });
                                          on(id1[x][10], function (dp) { //Bei Änderung Wochentage
                                              MyTimer[x][10] = getState(id1[x][10]).val; //Nach Änderung neuen Wert einlesen
                                              KillTimer(x);
                                              SetTimer(x);
                                      
                                              if (logging) log("TimerTag " + Wochentage[4] + " geändert auf " + MyTimer[x][10] + " für Timer " + x);
                                          });
                                          on(id1[x][11], function (dp) { //Bei Änderung Wochentage
                                              MyTimer[x][11] = getState(id1[x][6]).val; //Nach Änderung neuen Wert einlesen
                                              KillTimer(x);
                                              SetTimer(x);
                                      
                                              if (logging) log("TimerTag " + Wochentage[5] + " geändert auf " + MyTimer[x][11] + " für Timer " + x);
                                          });
                                          on(id1[x][12], function (dp) { //Bei Änderung Wochentage
                                              MyTimer[x][12] = getState(id1[x][12]).val; //Nach Änderung neuen Wert einlesen
                                              KillTimer(x);
                                              SetTimer(x);
                                      
                                              if (logging) log("TimerTag " + Wochentage[6] + " geändert auf " + MyTimer[x][12] + " für Timer " + x);
                                          });
                                          on(id1[x][12], function (dp) { //Bei Änderung Switchtarget
                                              MyTimer[x][13] = getState(id1[x][13]).val; //Nach Änderung neuen Wert einlesen
                                              if (logging) log("TimerTag " + Wochentage[6] + " geändert auf " + MyTimer[x][12] + " für Timer " + x);
                                          });
                                      
                                      };
                                      
                                      
                                      paul53P P 2 Antworten Letzte Antwort
                                      0
                                      • AphofisA Aphofis

                                        @paul53
                                        Irgendwie ist da immer noch ein Fehler drin!

                                        07:12:03.439	error	javascript.0 (1045) script.js.Technik_Steuerung.Tunze_Timer compile failed:
                                         at script.js.Technik_Steuerung.Tunze_Timer:176
                                        
                                        //Script tested & Ok
                                        //Legt Timer an
                                        //Wichtige Einstellungen
                                        const AnzahlTimer = 20; //Wieviele Timer anlegen? Der erste ist 1, nicht 0!
                                        
                                        //let setTimeout;
                                        const logging = true; //Logmeldungen an/aus
                                        const praefix = "javascript.0.Timer."; //Grundpfad
                                        const idActive = praefix + 'Active'; 
                                        createState(idActive, praefix + 'stop', {type: 'string'}); // oder was gerade aktiv ist
                                        let Presence = true
                                        var Wochentage = ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"]; //Array für createStateschleife zum anlegen der Wochentage
                                        var Astrotrigger = ["dawn", "sunrise", "dusk", "goldenHour", "dusk", "sunset"]; //Array für Astro 
                                        //if (logging) { log(Astrotrigger.length.toString()) };
                                        createState(praefix + "TimerTargets", "", false, { read: true, write: true, name: "Ziele welche geschaltet werden", type: "string", def: "" }); //Zentrale Source für die Anzeige in vis, Erstellung in der TimerRoot
                                        createState(praefix + "TimerTargetNames", "", false, { read: true, write: true, name: "Smartnames für die Ziele", type: "string", def: "" });
                                        
                                        for (let x = 1; x < AnzahlTimer + 1; x++) {
                                            //Datenpunkte anlegen 
                                            createState(praefix + x + ".Aktiv", false, false, { read: true, write: true, name: "Timer aktiv", type: "boolean", role: "switch", def: false }); //Legt fest ob der Timer aktiv ist
                                            createState(praefix + x + ".Rolle", 2, false, { read: true, write: true, name: "Rolle", type: "number", role: "value", def: 2 }); //Legt fest ob der Timer für An oder Aus zuständig ist
                                            createState(praefix + x + ".TimerTimestamp", "00:00:00", false, { read: true, write: true, name: "Zeitstempel für schaltzeit", type: "string", def: "00:00:00" });
                                            createState(praefix + x + ".TimerAstroTimestamp", "00:00:00", false, { read: true, write: true, name: "Zeitstempel für Astroschaltzeit", type: "string", def: "00:00:00" });
                                            createState(praefix + x + ".TimerAstroShift", 0, false, { read: true, write: true, name: "Zeitverschiebung für Astroschaltzeit", type: "number", def: 0 });
                                            for (let y = 0; y < 7; y++) { //Einträge für jeden Wochentag anlegen
                                                createState(praefix + x + ".Timer" + Wochentage[y], true, false, { read: true, write: true, name: Wochentage[y], type: "boolean", role: "switch", def: true });
                                            };
                                            createState(praefix + x + ".TimerChoice", "Zeit", false, { read: true, write: true, name: "Funktionswahl für Timer/Astro", type: "string", def: "Zeit" }); //Gewählte Funktion, Timer oder Astro
                                            createState(praefix + x + ".SwitchTarget", "", false, { read: true, write: true, name: "Ziel für Schaltvorgang", type: "string", def: "" });
                                            createState(praefix + x + ".OnlyIfPresence", false, false, { read: true, write: true, name: "Nur ausführen falls jemand anwesend", type: "boolean", role: "switch", def: false }); //Legt fest ob der Timer aktiv ist
                                            createState(praefix + x + ".OnlyIfNoPresence", false, false, { read: true, write: true, name: "Nur ausführen falls niemand anwesend", type: "boolean", role: "switch", def: false }); //Legt fest ob der Timer aktiv ist
                                        };
                                        
                                        //****************************
                                        
                                        //Datenpunkte Id"s zuweisen
                                        var id1 = [];
                                        for (let x = 1; x < AnzahlTimer + 1; x++) {//Anzahl der Timer
                                            let y = 0;
                                            id1[x] = [];
                                            id1[x][y] = (praefix + x + ".Aktiv"); y = y + 1;
                                            id1[x][y] = (praefix + x + ".Rolle"); y = y + 1;
                                            id1[x][y] = (praefix + x + ".TimerTimestamp"); y = y + 1;
                                            id1[x][y] = (praefix + x + ".TimerAstroTimestamp"); y = y + 1;
                                            id1[x][y] = (praefix + x + ".TimerAstroShift"); y = y + 1;
                                            id1[x][y] = (praefix + x + ".TimerChoice"); y = y + 1;
                                            for (let z = 0; z < Wochentage.length; z++) {//Schleifenvariable für Wochentage
                                                id1[x][y] = (praefix + x + ".Timer" + Wochentage[z]); y = y + 1;
                                            };
                                            id1[x][y] = (praefix + x + ".SwitchTarget"); y = y + 1;
                                            id1[x][y] = (praefix + x + ".OnlyIfPresence"); y = y + 1;
                                            id1[x][y] = (praefix + x + ".OnlyIfNoPresence"); y = y + 1;
                                        
                                        };
                                        
                                        // TimerVariablenArray anlegen für schedules
                                        var TimerAction = [];
                                        for (let x = 1; x < AnzahlTimer + 1; x++) {
                                            TimerAction[x] = null;
                                        };
                                        
                                        //Alle Daten in MyTimer Array einlesen
                                        var MyTimer = [];
                                        for (let x = 1; x < AnzahlTimer + 1; x++) {
                                            MyTimer[x] = [];
                                            for (let y = 0; y < id1[x].length; y++) {
                                                //log("x=" + x + "  y=" + y);
                                                MyTimer[x][y] = getState(id1[x][y]).val;
                                                //log(MyTimer[x][y]);
                                            };
                                        };
                                        
                                        //******************************************************** */
                                        
                                        function MakeCronString(whichone) { //String nach Cronsyntax zusammenbauen für Schedule
                                        
                                            var DaysSubString = "";
                                            for (let x = 0; x < 7; x++) {
                                                if (MyTimer[whichone][x + 6] == true) { //Beginnend mit dem 6ten Eintrag (TimerSonntag) die 7 Wochentage durchzählen und Werte anhängen
                                                    DaysSubString = DaysSubString + x + ",";
                                                };
                                            };
                                            DaysSubString = DaysSubString.substr(0, DaysSubString.length - 1); //Komma am Ende entfernen
                                            if (DaysSubString == "0,1,2,3,4,5,6") { DaysSubString = "*"; }; // Sternchen wenn alle Tage gewählt
                                        
                                            var tempString = "";
                                            if (MyTimer[whichone][5] == "Zeit") { //Wenn Zeit gewählt
                                                tempString = SplitTime(MyTimer[whichone][2])[1] + " " + SplitTime(MyTimer[whichone][2])[0] + " * * " + DaysSubString;
                                                log("CronString für Timer " + whichone + " erstellt " + tempString);
                                            }
                                            else if (MyTimer[whichone][5] != "Zeit") { //Wenn Astro gewählt
                                                tempString = SplitTime(MyTimer[whichone][3])[1] + " " + SplitTime(MyTimer[whichone][3])[0] + " * * " + DaysSubString;
                                                log("Cronstring für Timer " + whichone + " Astro erstellt " + tempString);
                                            };
                                            return tempString;
                                        };
                                        
                                        //spezifischen Timer setzen
                                        function SetTimer(whichone) {
                                            if (MyTimer[whichone][0] == true) {
                                                log("Timer " + whichone + " wird gesetzt")
                                                TimerAction[whichone] = schedule(MakeCronString(whichone), function () {
                                                    DoAction(whichone);
                                                    if (MyTimer[whichone][5] != "Zeit") { //Wenn Astro gewählt
                                                        RefreshAstro(whichone); //Neue Astrozeit setzen nach Ausführung
                                                    }
                                                });
                                            };
                                        };
                                        
                                        function RefreshAstro(whichone) {
                                            if (logging) { log("Refresh Astro") };
                                            SetChoosenAstroTime(whichone, true);
                                            SetTimer(whichone);
                                        };
                                        
                                        //Alle Timer setzen
                                        function SetAllTimer() {
                                            if (logging) { log("Setting all Timers") };
                                            for (let x = 1; x < AnzahlTimer + 1; x++) {
                                                SetTimer(x);
                                            }
                                        };
                                        
                                        //spezifischen Timer löschen
                                        function KillTimer(whichone) {
                                            clearSchedule(TimerAction[whichone]);
                                            if (logging) { log("Timer " + whichone + " killed") };
                                        }
                                        
                                        //Astro oder Zeit Gateway
                                        function AstroOrTime(whichone) {
                                            if (MyTimer[whichone][5] == "Zeit") {
                                                if (logging) { log("Zeit gewählt " + MyTimer[whichone][2]) };
                                            }
                                            else if (MyTimer[whichone][5] != "Zeit") {
                                                SetChoosenAstroTime(whichone);
                                                log("Astro gewählt, Variante " + MyTimer[whichone][5]);
                                            };
                                        };
                                        
                                        function SetChoosenAstroTime(whichone, GoToTomorrow) { //Zeit für gewählte Astrozeit eintragen
                                            let Shift = parseInt(MyTimer[whichone][4]); //Wert für Shift
                                            let AstroChoice = MyTimer[whichone][5].trim(); //Wert für Astroereignis
                                        
                                            //Berücksichtigen ob Event schon vorbei ist und dann für morgen setzen
                                            let today = new Date();
                                            let jetzt = new Date();
                                            let tomorrow = today.setDate(today.getDate() + 1);
                                            let tomorrowAstroTime = getAstroDate(AstroChoice, tomorrow);
                                            tomorrowAstroTime.setMinutes(tomorrowAstroTime.getMinutes() + Shift);//zammrechna
                                            log(AstroChoice + " beginnt heute um:" + getAstroDate(AstroChoice).toLocaleTimeString('de-DE', { hour12: false }) + " und beginnt morgen um " + tomorrowAstroTime.toLocaleTimeString('de-DE', { hour12: false }));
                                            //log(getAstroDate(AstroChoice).getTime() + " " + today.getTime() + " " + today.toLocaleTimeString());
                                            //log("Astro=" + getAstroDate(AstroChoice) + " Heute=" + jetzt + " " + "todayzeit=" + today.toLocaleTimeString());
                                        
                                            let AstroTime = getAstroDate(AstroChoice); //Astrotime einlesen
                                            AstroTime.setMinutes(AstroTime.getMinutes() + Shift);//zammrechna
                                            AstroTime.toLocaleTimeString('de-DE', { hour12: false });
                                            //if (getAstroDate(AstroChoice).getTime()  < jetzt.getTime()) { //Wenn Astrozeit vor aktueller Zeit dann Astrozeit von morgen verwenden
                                            if (AstroTime.getTime() <= jetzt.getTime() || GoToTomorrow == true) { //Wenn Astrozeit vor aktueller Zeit dann Astrozeit von morgen verwenden
                                                setState(id1[whichone][3], tomorrowAstroTime.toLocaleTimeString('de-DE', { hour12: false }));
                                                MyTimer[whichone][3] = tomorrowAstroTime.toLocaleTimeString('de-DE', { hour12: false });
                                                log("Astrotime von morgen verwendet, Event is heute bereits vorüber = " + tomorrowAstroTime.toLocaleTimeString('de-DE', { hour12: false }));
                                            }
                                            //else if (getAstroDate(AstroChoice).getTime() > jetzt.getTime()) {
                                            else if (AstroTime.getTime() > jetzt.getTime()) {
                                                setState(id1[whichone][3], AstroTime.toLocaleTimeString('de-DE', { hour12: false }));
                                                MyTimer[whichone][3] = AstroTime.toLocaleTimeString('de-DE', { hour12: false });
                                                log("Astrotime von heute verwendet, Event kommt heute noch = " + AstroTime.toLocaleTimeString('de-DE', { hour12: false }) + " Morgen=" + tomorrowAstroTime.toLocaleTimeString('de-DE', { hour12: false }));
                                            }
                                            else {
                                                log("Derf ned sei");
                                            };
                                        };
                                        
                                        const idActive = praefix + 'Active'; // Zeile 9
                                        createState(idActive, praefix + 'stop', {type: 'string'}); // oder was gerade aktiv ist
                                        
                                        
                                        //if (logging) { log(SplitTime("12:05") + h + m) };
                                        //Zeit in Stunden und Minuten teilen für Cronstring
                                        function SplitTime(Time) {
                                            var timesplit = Time.split(":", 2);
                                            //h = timesplit[0]  / m = timesplit[1];
                                            return timesplit;
                                        };
                                        
                                        function main() {
                                            SetAllTimer();
                                        };
                                        
                                        main();
                                        
                                        //Trigger für Timer x
                                        onStop(function () { //Bei Scriptende alle Timer löschen
                                            for (let x = 1; x < AnzahlTimer + 1; x++) {
                                                KillTimer(x);
                                            };
                                        }, 100);
                                        
                                        for (let x = 1; x < AnzahlTimer + 1; x++) { //Alle Timer durchlaufen und Trigger setzen
                                            on(id1[x][5], function (dp) { //Bei Änderung AstroChoice
                                                MyTimer[x][5] = getState(id1[x][5]).val; //Nach Änderung neuen Wert einlesen
                                                KillTimer(x);
                                                AstroOrTime(x);
                                                SetTimer(x);
                                                if (logging) log("AstroChoice geändert" + " für Timer " + x);
                                            });
                                        
                                            on(id1[x][1], function (dp) { //Bei Änderung Rolle
                                                MyTimer[x][1] = getState(id1[x][1]).val; //Nach Änderung neuen Wert einlesen
                                                if (MyTimer[x][1] == 2) {//Wenn TimerRolle=2 =inaktiv
                                                    MyTimer[x][0] = false;
                                                    setState(id1[x][0], false);
                                                }
                                                else {
                                                    MyTimer[x][0] = true;
                                                    setState(id1[x][0], true);
                                                };
                                                KillTimer(x);
                                                SetTimer(x);
                                                if (logging) log("Rolle geändert" + " für Timer " + x);
                                            });
                                        
                                            on(id1[x][4], function (dp) { //Bei Änderung Shift
                                                MyTimer[x][4] = getState(id1[x][4]).val; //Nach Änderung neuen Wert einlesen
                                                KillTimer(x);
                                                AstroOrTime(x);
                                                SetTimer(x);
                                                if (logging) log("Shift geändert" + " für Timer " + x);
                                            });
                                        
                                            on(id1[x][2], function (dp) { //Bei Änderung Zeit (TimerTimestamp)
                                                //setTimeout(function () { //1sek Timeout um prellen zu vermeiden
                                                MyTimer[x][2] = getState(id1[x][2]).val; //Nach Änderung neuen Wert einlesen
                                                KillTimer(x);
                                                SetTimer(x);
                                                if (logging) log("TimerTimestamp Zeit geändert auf " + MyTimer[x][2] + " für Timer " + x);
                                                //}, 1000);
                                            });
                                        
                                            on(id1[x][0], function (dp) { //Bei Änderung Timer Aktiv
                                                MyTimer[x][0] = getState(id1[x][0]).val; //Nach Änderung neuen Wert einlesen
                                                if (logging) log("TimerActive geändert auf " + MyTimer[x][0] + " für Timer " + x);
                                                //KillTimer(x);
                                                //SetTimer(x);
                                        
                                            });
                                        
                                            on(id1[x][6], function (dp) { //Bei Änderung Wochentage
                                                MyTimer[x][6] = getState(id1[x][6]).val; //Nach Änderung neuen Wert einlesen
                                                KillTimer(x);
                                                SetTimer(x);
                                        
                                                if (logging) log("TimerTag " + Wochentage[0] + " geändert auf " + MyTimer[x][6] + " für Timer " + x);
                                            });
                                            on(id1[x][7], function (dp) { //Bei Änderung Wochentage
                                                MyTimer[x][7] = getState(id1[x][7]).val; //Nach Änderung neuen Wert einlesen
                                                KillTimer(x);
                                                SetTimer(x);
                                        
                                                if (logging) log("TimerTag " + Wochentage[1] + " geändert auf " + MyTimer[x][7] + " für Timer " + x);
                                            });
                                            on(id1[x][8], function (dp) { //Bei Änderung Wochentage
                                                MyTimer[x][8] = getState(id1[x][8]).val; //Nach Änderung neuen Wert einlesen
                                                KillTimer(x);
                                                SetTimer(x);
                                        
                                                if (logging) log("TimerTag " + Wochentage[2] + " geändert auf " + MyTimer[1][8] + " für Timer " + x);
                                            });
                                            on(id1[x][9], function (dp) { //Bei Änderung Wochentage
                                                MyTimer[x][9] = getState(id1[x][9]).val; //Nach Änderung neuen Wert einlesen
                                                KillTimer(x);
                                                SetTimer(x);
                                        
                                                if (logging) log("TimerTag " + Wochentage[3] + " geändert auf " + MyTimer[x][9] + " für Timer " + x);
                                            });
                                            on(id1[x][10], function (dp) { //Bei Änderung Wochentage
                                                MyTimer[x][10] = getState(id1[x][10]).val; //Nach Änderung neuen Wert einlesen
                                                KillTimer(x);
                                                SetTimer(x);
                                        
                                                if (logging) log("TimerTag " + Wochentage[4] + " geändert auf " + MyTimer[x][10] + " für Timer " + x);
                                            });
                                            on(id1[x][11], function (dp) { //Bei Änderung Wochentage
                                                MyTimer[x][11] = getState(id1[x][6]).val; //Nach Änderung neuen Wert einlesen
                                                KillTimer(x);
                                                SetTimer(x);
                                        
                                                if (logging) log("TimerTag " + Wochentage[5] + " geändert auf " + MyTimer[x][11] + " für Timer " + x);
                                            });
                                            on(id1[x][12], function (dp) { //Bei Änderung Wochentage
                                                MyTimer[x][12] = getState(id1[x][12]).val; //Nach Änderung neuen Wert einlesen
                                                KillTimer(x);
                                                SetTimer(x);
                                        
                                                if (logging) log("TimerTag " + Wochentage[6] + " geändert auf " + MyTimer[x][12] + " für Timer " + x);
                                            });
                                            on(id1[x][12], function (dp) { //Bei Änderung Switchtarget
                                                MyTimer[x][13] = getState(id1[x][13]).val; //Nach Änderung neuen Wert einlesen
                                                if (logging) log("TimerTag " + Wochentage[6] + " geändert auf " + MyTimer[x][12] + " für Timer " + x);
                                            });
                                        
                                        };
                                        
                                        
                                        paul53P Offline
                                        paul53P Offline
                                        paul53
                                        schrieb am zuletzt editiert von
                                        #30

                                        @Aphofis sagte:

                                        ist da immer noch ein Fehler drin!

                                        Ja, doppelt: Zeilen 176, 177 löschen !

                                        Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                                        Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                                        1 Antwort Letzte Antwort
                                        0
                                        • AphofisA Aphofis

                                          @paul53
                                          Irgendwie ist da immer noch ein Fehler drin!

                                          07:12:03.439	error	javascript.0 (1045) script.js.Technik_Steuerung.Tunze_Timer compile failed:
                                           at script.js.Technik_Steuerung.Tunze_Timer:176
                                          
                                          //Script tested & Ok
                                          //Legt Timer an
                                          //Wichtige Einstellungen
                                          const AnzahlTimer = 20; //Wieviele Timer anlegen? Der erste ist 1, nicht 0!
                                          
                                          //let setTimeout;
                                          const logging = true; //Logmeldungen an/aus
                                          const praefix = "javascript.0.Timer."; //Grundpfad
                                          const idActive = praefix + 'Active'; 
                                          createState(idActive, praefix + 'stop', {type: 'string'}); // oder was gerade aktiv ist
                                          let Presence = true
                                          var Wochentage = ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"]; //Array für createStateschleife zum anlegen der Wochentage
                                          var Astrotrigger = ["dawn", "sunrise", "dusk", "goldenHour", "dusk", "sunset"]; //Array für Astro 
                                          //if (logging) { log(Astrotrigger.length.toString()) };
                                          createState(praefix + "TimerTargets", "", false, { read: true, write: true, name: "Ziele welche geschaltet werden", type: "string", def: "" }); //Zentrale Source für die Anzeige in vis, Erstellung in der TimerRoot
                                          createState(praefix + "TimerTargetNames", "", false, { read: true, write: true, name: "Smartnames für die Ziele", type: "string", def: "" });
                                          
                                          for (let x = 1; x < AnzahlTimer + 1; x++) {
                                              //Datenpunkte anlegen 
                                              createState(praefix + x + ".Aktiv", false, false, { read: true, write: true, name: "Timer aktiv", type: "boolean", role: "switch", def: false }); //Legt fest ob der Timer aktiv ist
                                              createState(praefix + x + ".Rolle", 2, false, { read: true, write: true, name: "Rolle", type: "number", role: "value", def: 2 }); //Legt fest ob der Timer für An oder Aus zuständig ist
                                              createState(praefix + x + ".TimerTimestamp", "00:00:00", false, { read: true, write: true, name: "Zeitstempel für schaltzeit", type: "string", def: "00:00:00" });
                                              createState(praefix + x + ".TimerAstroTimestamp", "00:00:00", false, { read: true, write: true, name: "Zeitstempel für Astroschaltzeit", type: "string", def: "00:00:00" });
                                              createState(praefix + x + ".TimerAstroShift", 0, false, { read: true, write: true, name: "Zeitverschiebung für Astroschaltzeit", type: "number", def: 0 });
                                              for (let y = 0; y < 7; y++) { //Einträge für jeden Wochentag anlegen
                                                  createState(praefix + x + ".Timer" + Wochentage[y], true, false, { read: true, write: true, name: Wochentage[y], type: "boolean", role: "switch", def: true });
                                              };
                                              createState(praefix + x + ".TimerChoice", "Zeit", false, { read: true, write: true, name: "Funktionswahl für Timer/Astro", type: "string", def: "Zeit" }); //Gewählte Funktion, Timer oder Astro
                                              createState(praefix + x + ".SwitchTarget", "", false, { read: true, write: true, name: "Ziel für Schaltvorgang", type: "string", def: "" });
                                              createState(praefix + x + ".OnlyIfPresence", false, false, { read: true, write: true, name: "Nur ausführen falls jemand anwesend", type: "boolean", role: "switch", def: false }); //Legt fest ob der Timer aktiv ist
                                              createState(praefix + x + ".OnlyIfNoPresence", false, false, { read: true, write: true, name: "Nur ausführen falls niemand anwesend", type: "boolean", role: "switch", def: false }); //Legt fest ob der Timer aktiv ist
                                          };
                                          
                                          //****************************
                                          
                                          //Datenpunkte Id"s zuweisen
                                          var id1 = [];
                                          for (let x = 1; x < AnzahlTimer + 1; x++) {//Anzahl der Timer
                                              let y = 0;
                                              id1[x] = [];
                                              id1[x][y] = (praefix + x + ".Aktiv"); y = y + 1;
                                              id1[x][y] = (praefix + x + ".Rolle"); y = y + 1;
                                              id1[x][y] = (praefix + x + ".TimerTimestamp"); y = y + 1;
                                              id1[x][y] = (praefix + x + ".TimerAstroTimestamp"); y = y + 1;
                                              id1[x][y] = (praefix + x + ".TimerAstroShift"); y = y + 1;
                                              id1[x][y] = (praefix + x + ".TimerChoice"); y = y + 1;
                                              for (let z = 0; z < Wochentage.length; z++) {//Schleifenvariable für Wochentage
                                                  id1[x][y] = (praefix + x + ".Timer" + Wochentage[z]); y = y + 1;
                                              };
                                              id1[x][y] = (praefix + x + ".SwitchTarget"); y = y + 1;
                                              id1[x][y] = (praefix + x + ".OnlyIfPresence"); y = y + 1;
                                              id1[x][y] = (praefix + x + ".OnlyIfNoPresence"); y = y + 1;
                                          
                                          };
                                          
                                          // TimerVariablenArray anlegen für schedules
                                          var TimerAction = [];
                                          for (let x = 1; x < AnzahlTimer + 1; x++) {
                                              TimerAction[x] = null;
                                          };
                                          
                                          //Alle Daten in MyTimer Array einlesen
                                          var MyTimer = [];
                                          for (let x = 1; x < AnzahlTimer + 1; x++) {
                                              MyTimer[x] = [];
                                              for (let y = 0; y < id1[x].length; y++) {
                                                  //log("x=" + x + "  y=" + y);
                                                  MyTimer[x][y] = getState(id1[x][y]).val;
                                                  //log(MyTimer[x][y]);
                                              };
                                          };
                                          
                                          //******************************************************** */
                                          
                                          function MakeCronString(whichone) { //String nach Cronsyntax zusammenbauen für Schedule
                                          
                                              var DaysSubString = "";
                                              for (let x = 0; x < 7; x++) {
                                                  if (MyTimer[whichone][x + 6] == true) { //Beginnend mit dem 6ten Eintrag (TimerSonntag) die 7 Wochentage durchzählen und Werte anhängen
                                                      DaysSubString = DaysSubString + x + ",";
                                                  };
                                              };
                                              DaysSubString = DaysSubString.substr(0, DaysSubString.length - 1); //Komma am Ende entfernen
                                              if (DaysSubString == "0,1,2,3,4,5,6") { DaysSubString = "*"; }; // Sternchen wenn alle Tage gewählt
                                          
                                              var tempString = "";
                                              if (MyTimer[whichone][5] == "Zeit") { //Wenn Zeit gewählt
                                                  tempString = SplitTime(MyTimer[whichone][2])[1] + " " + SplitTime(MyTimer[whichone][2])[0] + " * * " + DaysSubString;
                                                  log("CronString für Timer " + whichone + " erstellt " + tempString);
                                              }
                                              else if (MyTimer[whichone][5] != "Zeit") { //Wenn Astro gewählt
                                                  tempString = SplitTime(MyTimer[whichone][3])[1] + " " + SplitTime(MyTimer[whichone][3])[0] + " * * " + DaysSubString;
                                                  log("Cronstring für Timer " + whichone + " Astro erstellt " + tempString);
                                              };
                                              return tempString;
                                          };
                                          
                                          //spezifischen Timer setzen
                                          function SetTimer(whichone) {
                                              if (MyTimer[whichone][0] == true) {
                                                  log("Timer " + whichone + " wird gesetzt")
                                                  TimerAction[whichone] = schedule(MakeCronString(whichone), function () {
                                                      DoAction(whichone);
                                                      if (MyTimer[whichone][5] != "Zeit") { //Wenn Astro gewählt
                                                          RefreshAstro(whichone); //Neue Astrozeit setzen nach Ausführung
                                                      }
                                                  });
                                              };
                                          };
                                          
                                          function RefreshAstro(whichone) {
                                              if (logging) { log("Refresh Astro") };
                                              SetChoosenAstroTime(whichone, true);
                                              SetTimer(whichone);
                                          };
                                          
                                          //Alle Timer setzen
                                          function SetAllTimer() {
                                              if (logging) { log("Setting all Timers") };
                                              for (let x = 1; x < AnzahlTimer + 1; x++) {
                                                  SetTimer(x);
                                              }
                                          };
                                          
                                          //spezifischen Timer löschen
                                          function KillTimer(whichone) {
                                              clearSchedule(TimerAction[whichone]);
                                              if (logging) { log("Timer " + whichone + " killed") };
                                          }
                                          
                                          //Astro oder Zeit Gateway
                                          function AstroOrTime(whichone) {
                                              if (MyTimer[whichone][5] == "Zeit") {
                                                  if (logging) { log("Zeit gewählt " + MyTimer[whichone][2]) };
                                              }
                                              else if (MyTimer[whichone][5] != "Zeit") {
                                                  SetChoosenAstroTime(whichone);
                                                  log("Astro gewählt, Variante " + MyTimer[whichone][5]);
                                              };
                                          };
                                          
                                          function SetChoosenAstroTime(whichone, GoToTomorrow) { //Zeit für gewählte Astrozeit eintragen
                                              let Shift = parseInt(MyTimer[whichone][4]); //Wert für Shift
                                              let AstroChoice = MyTimer[whichone][5].trim(); //Wert für Astroereignis
                                          
                                              //Berücksichtigen ob Event schon vorbei ist und dann für morgen setzen
                                              let today = new Date();
                                              let jetzt = new Date();
                                              let tomorrow = today.setDate(today.getDate() + 1);
                                              let tomorrowAstroTime = getAstroDate(AstroChoice, tomorrow);
                                              tomorrowAstroTime.setMinutes(tomorrowAstroTime.getMinutes() + Shift);//zammrechna
                                              log(AstroChoice + " beginnt heute um:" + getAstroDate(AstroChoice).toLocaleTimeString('de-DE', { hour12: false }) + " und beginnt morgen um " + tomorrowAstroTime.toLocaleTimeString('de-DE', { hour12: false }));
                                              //log(getAstroDate(AstroChoice).getTime() + " " + today.getTime() + " " + today.toLocaleTimeString());
                                              //log("Astro=" + getAstroDate(AstroChoice) + " Heute=" + jetzt + " " + "todayzeit=" + today.toLocaleTimeString());
                                          
                                              let AstroTime = getAstroDate(AstroChoice); //Astrotime einlesen
                                              AstroTime.setMinutes(AstroTime.getMinutes() + Shift);//zammrechna
                                              AstroTime.toLocaleTimeString('de-DE', { hour12: false });
                                              //if (getAstroDate(AstroChoice).getTime()  < jetzt.getTime()) { //Wenn Astrozeit vor aktueller Zeit dann Astrozeit von morgen verwenden
                                              if (AstroTime.getTime() <= jetzt.getTime() || GoToTomorrow == true) { //Wenn Astrozeit vor aktueller Zeit dann Astrozeit von morgen verwenden
                                                  setState(id1[whichone][3], tomorrowAstroTime.toLocaleTimeString('de-DE', { hour12: false }));
                                                  MyTimer[whichone][3] = tomorrowAstroTime.toLocaleTimeString('de-DE', { hour12: false });
                                                  log("Astrotime von morgen verwendet, Event is heute bereits vorüber = " + tomorrowAstroTime.toLocaleTimeString('de-DE', { hour12: false }));
                                              }
                                              //else if (getAstroDate(AstroChoice).getTime() > jetzt.getTime()) {
                                              else if (AstroTime.getTime() > jetzt.getTime()) {
                                                  setState(id1[whichone][3], AstroTime.toLocaleTimeString('de-DE', { hour12: false }));
                                                  MyTimer[whichone][3] = AstroTime.toLocaleTimeString('de-DE', { hour12: false });
                                                  log("Astrotime von heute verwendet, Event kommt heute noch = " + AstroTime.toLocaleTimeString('de-DE', { hour12: false }) + " Morgen=" + tomorrowAstroTime.toLocaleTimeString('de-DE', { hour12: false }));
                                              }
                                              else {
                                                  log("Derf ned sei");
                                              };
                                          };
                                          
                                          const idActive = praefix + 'Active'; // Zeile 9
                                          createState(idActive, praefix + 'stop', {type: 'string'}); // oder was gerade aktiv ist
                                          
                                          
                                          //if (logging) { log(SplitTime("12:05") + h + m) };
                                          //Zeit in Stunden und Minuten teilen für Cronstring
                                          function SplitTime(Time) {
                                              var timesplit = Time.split(":", 2);
                                              //h = timesplit[0]  / m = timesplit[1];
                                              return timesplit;
                                          };
                                          
                                          function main() {
                                              SetAllTimer();
                                          };
                                          
                                          main();
                                          
                                          //Trigger für Timer x
                                          onStop(function () { //Bei Scriptende alle Timer löschen
                                              for (let x = 1; x < AnzahlTimer + 1; x++) {
                                                  KillTimer(x);
                                              };
                                          }, 100);
                                          
                                          for (let x = 1; x < AnzahlTimer + 1; x++) { //Alle Timer durchlaufen und Trigger setzen
                                              on(id1[x][5], function (dp) { //Bei Änderung AstroChoice
                                                  MyTimer[x][5] = getState(id1[x][5]).val; //Nach Änderung neuen Wert einlesen
                                                  KillTimer(x);
                                                  AstroOrTime(x);
                                                  SetTimer(x);
                                                  if (logging) log("AstroChoice geändert" + " für Timer " + x);
                                              });
                                          
                                              on(id1[x][1], function (dp) { //Bei Änderung Rolle
                                                  MyTimer[x][1] = getState(id1[x][1]).val; //Nach Änderung neuen Wert einlesen
                                                  if (MyTimer[x][1] == 2) {//Wenn TimerRolle=2 =inaktiv
                                                      MyTimer[x][0] = false;
                                                      setState(id1[x][0], false);
                                                  }
                                                  else {
                                                      MyTimer[x][0] = true;
                                                      setState(id1[x][0], true);
                                                  };
                                                  KillTimer(x);
                                                  SetTimer(x);
                                                  if (logging) log("Rolle geändert" + " für Timer " + x);
                                              });
                                          
                                              on(id1[x][4], function (dp) { //Bei Änderung Shift
                                                  MyTimer[x][4] = getState(id1[x][4]).val; //Nach Änderung neuen Wert einlesen
                                                  KillTimer(x);
                                                  AstroOrTime(x);
                                                  SetTimer(x);
                                                  if (logging) log("Shift geändert" + " für Timer " + x);
                                              });
                                          
                                              on(id1[x][2], function (dp) { //Bei Änderung Zeit (TimerTimestamp)
                                                  //setTimeout(function () { //1sek Timeout um prellen zu vermeiden
                                                  MyTimer[x][2] = getState(id1[x][2]).val; //Nach Änderung neuen Wert einlesen
                                                  KillTimer(x);
                                                  SetTimer(x);
                                                  if (logging) log("TimerTimestamp Zeit geändert auf " + MyTimer[x][2] + " für Timer " + x);
                                                  //}, 1000);
                                              });
                                          
                                              on(id1[x][0], function (dp) { //Bei Änderung Timer Aktiv
                                                  MyTimer[x][0] = getState(id1[x][0]).val; //Nach Änderung neuen Wert einlesen
                                                  if (logging) log("TimerActive geändert auf " + MyTimer[x][0] + " für Timer " + x);
                                                  //KillTimer(x);
                                                  //SetTimer(x);
                                          
                                              });
                                          
                                              on(id1[x][6], function (dp) { //Bei Änderung Wochentage
                                                  MyTimer[x][6] = getState(id1[x][6]).val; //Nach Änderung neuen Wert einlesen
                                                  KillTimer(x);
                                                  SetTimer(x);
                                          
                                                  if (logging) log("TimerTag " + Wochentage[0] + " geändert auf " + MyTimer[x][6] + " für Timer " + x);
                                              });
                                              on(id1[x][7], function (dp) { //Bei Änderung Wochentage
                                                  MyTimer[x][7] = getState(id1[x][7]).val; //Nach Änderung neuen Wert einlesen
                                                  KillTimer(x);
                                                  SetTimer(x);
                                          
                                                  if (logging) log("TimerTag " + Wochentage[1] + " geändert auf " + MyTimer[x][7] + " für Timer " + x);
                                              });
                                              on(id1[x][8], function (dp) { //Bei Änderung Wochentage
                                                  MyTimer[x][8] = getState(id1[x][8]).val; //Nach Änderung neuen Wert einlesen
                                                  KillTimer(x);
                                                  SetTimer(x);
                                          
                                                  if (logging) log("TimerTag " + Wochentage[2] + " geändert auf " + MyTimer[1][8] + " für Timer " + x);
                                              });
                                              on(id1[x][9], function (dp) { //Bei Änderung Wochentage
                                                  MyTimer[x][9] = getState(id1[x][9]).val; //Nach Änderung neuen Wert einlesen
                                                  KillTimer(x);
                                                  SetTimer(x);
                                          
                                                  if (logging) log("TimerTag " + Wochentage[3] + " geändert auf " + MyTimer[x][9] + " für Timer " + x);
                                              });
                                              on(id1[x][10], function (dp) { //Bei Änderung Wochentage
                                                  MyTimer[x][10] = getState(id1[x][10]).val; //Nach Änderung neuen Wert einlesen
                                                  KillTimer(x);
                                                  SetTimer(x);
                                          
                                                  if (logging) log("TimerTag " + Wochentage[4] + " geändert auf " + MyTimer[x][10] + " für Timer " + x);
                                              });
                                              on(id1[x][11], function (dp) { //Bei Änderung Wochentage
                                                  MyTimer[x][11] = getState(id1[x][6]).val; //Nach Änderung neuen Wert einlesen
                                                  KillTimer(x);
                                                  SetTimer(x);
                                          
                                                  if (logging) log("TimerTag " + Wochentage[5] + " geändert auf " + MyTimer[x][11] + " für Timer " + x);
                                              });
                                              on(id1[x][12], function (dp) { //Bei Änderung Wochentage
                                                  MyTimer[x][12] = getState(id1[x][12]).val; //Nach Änderung neuen Wert einlesen
                                                  KillTimer(x);
                                                  SetTimer(x);
                                          
                                                  if (logging) log("TimerTag " + Wochentage[6] + " geändert auf " + MyTimer[x][12] + " für Timer " + x);
                                              });
                                              on(id1[x][12], function (dp) { //Bei Änderung Switchtarget
                                                  MyTimer[x][13] = getState(id1[x][13]).val; //Nach Änderung neuen Wert einlesen
                                                  if (logging) log("TimerTag " + Wochentage[6] + " geändert auf " + MyTimer[x][12] + " für Timer " + x);
                                              });
                                          
                                          };
                                          
                                          
                                          P Offline
                                          P Offline
                                          Pittini
                                          Developer
                                          schrieb am zuletzt editiert von
                                          #31

                                          @Aphofis Wäre es nicht zielführender gewesen gleich mich als Autor anzusprechen? Grundsätzlich ist es nämlich so dass das Script seit längerem einwandfrei hier läuft, sowohl mit Astro, als auch mit Zeit. Die suche nach grundsätzlichen Fehlern hätte sich @paul53 dann nämlich schon mal sparen können. Bin grad rein zufällig auf den Thread hier gestossen. Sag mal an was genau denn jetzt nicht geht?

                                          AphofisA 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

                                          422

                                          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