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

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Blockly
  5. Wahl eines Datenpunktes

NEWS

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

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

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

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
    #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
                              • P Pittini

                                @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 Offline
                                AphofisA Offline
                                Aphofis
                                schrieb am zuletzt editiert von
                                #32

                                @Pittini
                                Ich hatte dich angeschrieben! Nur kam leider keine Antwort.
                                Vermutlich ist meine Mail im Spam gelandet.
                                Also die Datenpunkte werden sauber geschaltet nur werden sie dann nicht wieder abgeschaltet.
                                Hinter den Datenpunkten sitzt dann nachher jeweils eine Steuerung die einen Daten String auslöst und per USB an ein Gerät sendet.
                                Dazu, hatte @paul53 mir geholfen, damit der vorherige Datenpunkt auf false gesetzt wird wenn ein neuer Datenpunkt aktiv wird.
                                Es war keine Absicht dich zu übergehen nur scheint meine Mail nicht angekommen zu sein.

                                P 1 Antwort Letzte Antwort
                                0
                                • AphofisA Aphofis

                                  @Pittini
                                  Ich hatte dich angeschrieben! Nur kam leider keine Antwort.
                                  Vermutlich ist meine Mail im Spam gelandet.
                                  Also die Datenpunkte werden sauber geschaltet nur werden sie dann nicht wieder abgeschaltet.
                                  Hinter den Datenpunkten sitzt dann nachher jeweils eine Steuerung die einen Daten String auslöst und per USB an ein Gerät sendet.
                                  Dazu, hatte @paul53 mir geholfen, damit der vorherige Datenpunkt auf false gesetzt wird wenn ein neuer Datenpunkt aktiv wird.
                                  Es war keine Absicht dich zu übergehen nur scheint meine Mail nicht angekommen zu sein.

                                  P Offline
                                  P Offline
                                  Pittini
                                  Developer
                                  schrieb am zuletzt editiert von
                                  #33

                                  @Aphofis sagte in Wahl eines Datenpunktes:

                                  Ich hatte dich angeschrieben! Nur kam leider keine Antwort.
                                  Vermutlich ist meine Mail im Spam gelandet.

                                  Wo hast Du mir denn geschrieben, grad geguggt, nix im Spam gefunden.

                                  Also die Datenpunkte werden sauber geschaltet nur werden sie dann nicht wieder abgeschaltet.

                                  Steht ja auch in der Anleitung, Ein kompletter Ein und Aus Zyklus sind zwei Timer

                                  Hinter den Datenpunkten sitzt dann nachher jeweils eine Steuerung die einen Daten String auslöst und per USB an ein Gerät sendet.
                                  Dazu, hatte @paul53 mir geholfen, damit der vorherige Datenpunkt auf false gesetzt wird wenn ein neuer Datenpunkt aktiv wird.

                                  Kann man machen aber dann isses halt Kacke. Weil damit geht halt das generische des Scripts verloren und es taugt für nix anderes mehr. Ich würde da eher ein extra Script nehmen, welches dafür sorgt, dass wenn ein DP auf True geht die anderen abgeschalten werden, sind ja nur paar Trigger.

                                  Es war keine Absicht dich zu übergehen nur scheint meine Mail nicht angekommen zu sein.

                                  Jo, isse immer noch nicht

                                  AphofisA 1 Antwort Letzte Antwort
                                  0
                                  • P Pittini

                                    @Aphofis sagte in Wahl eines Datenpunktes:

                                    Ich hatte dich angeschrieben! Nur kam leider keine Antwort.
                                    Vermutlich ist meine Mail im Spam gelandet.

                                    Wo hast Du mir denn geschrieben, grad geguggt, nix im Spam gefunden.

                                    Also die Datenpunkte werden sauber geschaltet nur werden sie dann nicht wieder abgeschaltet.

                                    Steht ja auch in der Anleitung, Ein kompletter Ein und Aus Zyklus sind zwei Timer

                                    Hinter den Datenpunkten sitzt dann nachher jeweils eine Steuerung die einen Daten String auslöst und per USB an ein Gerät sendet.
                                    Dazu, hatte @paul53 mir geholfen, damit der vorherige Datenpunkt auf false gesetzt wird wenn ein neuer Datenpunkt aktiv wird.

                                    Kann man machen aber dann isses halt Kacke. Weil damit geht halt das generische des Scripts verloren und es taugt für nix anderes mehr. Ich würde da eher ein extra Script nehmen, welches dafür sorgt, dass wenn ein DP auf True geht die anderen abgeschalten werden, sind ja nur paar Trigger.

                                    Es war keine Absicht dich zu übergehen nur scheint meine Mail nicht angekommen zu sein.

                                    Jo, isse immer noch nicht

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

                                    @Pittini
                                    Einmal per Mail und in deinem Google Drive rechtes Menü
                                    Aber gute Frage wie so ein Blockly erstellen.
                                    Kann man nicht vielleicht in das Javascript eine Erweiterung einbauen das der gerade aktive Timer der wert in den Datenpunkt idActive geschrieben wird z.B. (javascript.0.Timer.stop)
                                    dann kann ich darüber die anderen Datenpunkte auf false setzen per Blockly !?😊

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

                                      Bildschirmfoto 2020-01-30 um 19.19.33.png

                                      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

                                      390

                                      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
                                      • Aktuell
                                      • Tags
                                      • Ungelesen 0
                                      • Kategorien
                                      • Unreplied
                                      • Beliebt
                                      • GitHub
                                      • Docu
                                      • Hilfe