Navigation

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

    NEWS

    • Wir empfehlen: Node.js 22.x

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker goes Matter ... Matter Adapter in Stable

    Wahl eines Datenpunktes

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

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

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

        @Aphofis sagte:

        obwohl im timer SwitchTarget der richtige Datenpunkt eingetragen wurde.

        Zeigt das Log "... hat angeschaltet" auch die falsche ID an ?

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

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

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

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

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

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

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

              @Aphofis sagte:

              Meine LOG:

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

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

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

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

                Bildschirmfoto 2020-01-25 um 18.58.26.png

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

                  @Aphofis sagte:

                  Pfad javascript.0.Timer.sequenzial

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

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

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

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

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

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

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

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

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

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

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

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

                        Bildschirmfoto 2020-01-25 um 20.21.08.png

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

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

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

                            @Aphofis sagte:

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

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

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

                              @Aphofis sagte:

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

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

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

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

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

                                  @Aphofis sagte:

                                  muss der in jeden Timer einer erstellt werden?

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

                                  @Aphofis sagte in Wahl eines Datenpunktes:

                                  wo kommt der Javascript Code hin???

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

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

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

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

                                      @Aphofis sagte:

                                      Das ist das Original!

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

                                      const idActive = praefix + 'Active'; // Zeile 9
                                      createState(idActive, praefix + 'stop', {type: 'string'}); // oder was gerade aktiv ist
                                      
                                      Aphofis 1 Reply Last reply Reply Quote 0
                                      • Aphofis
                                        Aphofis @paul53 last edited by Aphofis

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

                                        let Presence = getState("javascript.0.Timer.idActive").val; //Pfad zum Anwesenheitsdatenpunkt. Erwartet wird eine Zahl >=0
                                        
                                        
                                        paul53 1 Reply Last reply Reply Quote 0
                                        • paul53
                                          paul53 @Aphofis last edited by paul53

                                          @Aphofis sagte:

                                          wenn ich das richtig verstanden habe

                                          Nein das hast Du falsch verstanden: Einfügen !

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

                                          Aktiviere vorher "stop".

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

                                            @paul53
                                            Irgendwie ist da immer noch ein Fehler drin!

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            590
                                            Online

                                            32.0k
                                            Users

                                            80.4k
                                            Topics

                                            1.3m
                                            Posts

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