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

  • Default (No Skin)
  • No Skin
Collapse
Logo
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Blockly
  5. Wahl eines Datenpunktes

NEWS

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

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

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

Wahl eines Datenpunktes

Scheduled Pinned Locked Moved Blockly
35 Posts 3 Posters 1.2k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • paul53P paul53

    @Aphofis sagte:

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

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

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

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

    paul53P 1 Reply Last reply
    0
    • AphofisA Aphofis

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

      paul53P Offline
      paul53P Offline
      paul53
      wrote on last edited by
      #24

      @Aphofis sagte:

      muss der in jeden Timer einer erstellt werden?

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

      @Aphofis sagte in Wahl eines Datenpunktes:

      wo kommt der Javascript Code hin???

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

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

      AphofisA 1 Reply Last reply
      0
      • paul53P paul53

        @Aphofis sagte:

        muss der in jeden Timer einer erstellt werden?

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

        @Aphofis sagte in Wahl eines Datenpunktes:

        wo kommt der Javascript Code hin???

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

        AphofisA Offline
        AphofisA Offline
        Aphofis
        wrote on last edited by
        #25

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

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

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

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

          @Aphofis sagte:

          Das ist das Original!

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

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

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

          AphofisA 1 Reply Last reply
          0
          • paul53P paul53

            @Aphofis sagte:

            Das ist das Original!

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

            const idActive = praefix + 'Active'; // Zeile 9
            createState(idActive, praefix + 'stop', {type: 'string'}); // oder was gerade aktiv ist
            
            AphofisA Offline
            AphofisA Offline
            Aphofis
            wrote on last edited by Aphofis
            #27

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

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

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

              let Presence = getState("javascript.0.Timer.idActive").val; //Pfad zum Anwesenheitsdatenpunkt. Erwartet wird eine Zahl >=0
              
              
              paul53P Offline
              paul53P Offline
              paul53
              wrote on last edited by paul53
              #28

              @Aphofis sagte:

              wenn ich das richtig verstanden habe

              Nein das hast Du falsch verstanden: Einfügen !

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

              Aktiviere vorher "stop".

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

              AphofisA 1 Reply Last reply
              0
              • paul53P paul53

                @Aphofis sagte:

                wenn ich das richtig verstanden habe

                Nein das hast Du falsch verstanden: Einfügen !

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

                Aktiviere vorher "stop".

                AphofisA Offline
                AphofisA Offline
                Aphofis
                wrote on last edited by Aphofis
                #29

                @paul53
                Irgendwie ist da immer noch ein Fehler drin!

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

                  @paul53
                  Irgendwie ist da immer noch ein Fehler drin!

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

                  @Aphofis sagte:

                  ist da immer noch ein Fehler drin!

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

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

                  1 Reply Last reply
                  0
                  • AphofisA Aphofis

                    @paul53
                    Irgendwie ist da immer noch ein Fehler drin!

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

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

                    AphofisA 1 Reply Last reply
                    0
                    • P Pittini

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

                      AphofisA Offline
                      AphofisA Offline
                      Aphofis
                      wrote on last edited by
                      #32

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

                      P 1 Reply Last reply
                      0
                      • AphofisA Aphofis

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

                        P Offline
                        P Offline
                        Pittini
                        Developer
                        wrote on last edited by
                        #33

                        @Aphofis sagte in Wahl eines Datenpunktes:

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

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

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

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

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

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

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

                        Jo, isse immer noch nicht

                        AphofisA 1 Reply Last reply
                        0
                        • P Pittini

                          @Aphofis sagte in Wahl eines Datenpunktes:

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

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

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

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

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

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

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

                          Jo, isse immer noch nicht

                          AphofisA Offline
                          AphofisA Offline
                          Aphofis
                          wrote on last edited by Aphofis
                          #34

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

                          1 Reply Last reply
                          0
                          • AphofisA Offline
                            AphofisA Offline
                            Aphofis
                            wrote on last edited by
                            #35

                            Bildschirmfoto 2020-01-30 um 19.19.33.png

                            1 Reply Last reply
                            0
                            Reply
                            • Reply as topic
                            Log in to reply
                            • Oldest to Newest
                            • Newest to Oldest
                            • Most Votes


                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            711

                            Online

                            32.4k

                            Users

                            81.4k

                            Topics

                            1.3m

                            Posts
                            Community
                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                            ioBroker Community 2014-2025
                            logo
                            • Login

                            • Don't have an account? Register

                            • Login or register to search.
                            • First post
                              Last post
                            0
                            • Recent
                            • Tags
                            • Unread 0
                            • Categories
                            • Unreplied
                            • Popular
                            • GitHub
                            • Docu
                            • Hilfe