Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. Wahl eines Datenpunktes

    NEWS

    • Wir empfehlen: Node.js 22.x

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker goes Matter ... Matter Adapter in Stable

    Wahl eines Datenpunktes

    This topic has been deleted. Only users with topic management privileges can see it.
    • Aphofis
      Aphofis @paul53 last edited by

      @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);
          });
      
      };
      
      
      paul53 1 Reply Last reply Reply Quote 0
      • paul53
        paul53 @Aphofis last edited by 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
        
        Aphofis 1 Reply Last reply Reply Quote 0
        • Aphofis
          Aphofis @paul53 last edited by 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
          
          
          paul53 1 Reply Last reply Reply Quote 0
          • paul53
            paul53 @Aphofis last edited by 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".

            Aphofis 1 Reply Last reply Reply Quote 0
            • Aphofis
              Aphofis @paul53 last edited by 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);
                  });
              
              };
              
              
              paul53 P 2 Replies Last reply Reply Quote 0
              • paul53
                paul53 @Aphofis last edited by

                @Aphofis sagte:

                ist da immer noch ein Fehler drin!

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

                1 Reply Last reply Reply Quote 0
                • P
                  Pittini Developer @Aphofis last edited by

                  @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?

                  Aphofis 1 Reply Last reply Reply Quote 0
                  • Aphofis
                    Aphofis @Pittini last edited by

                    @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 Reply Last reply Reply Quote 0
                    • P
                      Pittini Developer @Aphofis last edited by

                      @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

                      Aphofis 1 Reply Last reply Reply Quote 0
                      • Aphofis
                        Aphofis @Pittini last edited by Aphofis

                        @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 Reply Last reply Reply Quote 0
                        • Aphofis
                          Aphofis last edited by

                          Bildschirmfoto 2020-01-30 um 19.19.33.png

                          1 Reply Last reply Reply Quote 0
                          • First post
                            Last post

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          712
                          Online

                          32.0k
                          Users

                          80.4k
                          Topics

                          1.3m
                          Posts

                          3
                          35
                          1147
                          Loading More Posts
                          • Oldest to Newest
                          • Newest to Oldest
                          • Most Votes
                          Reply
                          • Reply as topic
                          Log in to reply
                          Community
                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                          The ioBroker Community 2014-2023
                          logo