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 last edited by Aphofis

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

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

      Bildschirmfoto 2020-01-25 um 18.58.26.png

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

        @Aphofis sagte:

        Pfad javascript.0.Timer.sequenzial

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

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

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

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

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

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

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

                paul53 2 Replies Last reply Reply Quote 0
                • paul53
                  paul53 @Aphofis last edited by

                  @Aphofis sagte:

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

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

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

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

                        @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).

                        Aphofis 1 Reply Last reply Reply Quote 0
                        • 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
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            393
                                            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