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.0k

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

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

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.
  • AphofisA Offline
    AphofisA Offline
    Aphofis
    wrote on last edited by Aphofis
    #1

    Mahlzeit, ich komme logisch irgendwie nicht weiter.
    Ich habe 6 Datenpunkte, wovon einer Zeitgesteuert aktiviert werden soll.
    Dazu gehören 20 Datenpunkte, in denen das Programm laufen soll,
    was zu einer bestimmten Uhrzeit anlaufen soll. Dazu gehören 20 Datenpunkte mit einer Startzeit.
    Beendet wird das nicht da das folge Programm das übernehmen soll.
    Wie bekomme ich es in Blockly hin, das der richtige der 6 Datenpunkte dann aktiviert wird.
    Also muss praktisch aus dem Datenpunkt der in dem Datenpunkt aktuell aktiv ist der Wert gelesen werden und der richtige der 6 Datenpunkte auf true gesetzt werden, um das richtige Programm zu starten.

    Das ist eines der 20 Uhrzeit Programme:
    Bildschirmfoto 2020-01-24 um 10.03.09.png
    alle 20 Programm Steuerungen befindet sich in einem Blockly was soweit auch funktioniert.
    Zur eingestellten Zeit, wird auch in Programm_Aktuell das Programm eingestellt was gerade läuft. Nun muss aus Programm aktuell der Wert genommen werden und der richtige der 6 Datenpunkte geschaltet werden.

    Das sind die 20 Uhrzeiten und die 20 Programme die laufen sollen:
    Bildschirmfoto 2020-01-24 um 03.27.22.png

    Das sein die 6 Programme wovon eines aktiviert werden soll:
    Bildschirmfoto 2020-01-24 um 03.28.41.png

    Hintergrund: mit den 6 Datenpunkten wird jeweils ein Blockly gesteuert, womit ein Datenstring per USB an einen Controller gesendet werden soll.
    Die Uhrzeiten und welches Programm in den 20 Programm Datenpunkten laufen soll möchte ich später per Vis einstellen können.

    Das ist die Aktuelle View, mit der Die Programme eingestellt werden können:
    Bildschirmfoto 2020-01-24 um 05.38.29.png

    Ich hatte es so versucht, doch will es so leider nicht die Datenpunkte schalten und auch die nicht aktiven dann abschalten.
    Es muss doch eine globale Lösung geben für alle 20 Programme:
    Bildschirmfoto 2020-01-24 um 09.56.34.png
    @paul53 vielleicht magst du ja mal drüber schauen !? Ich komme nicht weiter!!!

    paul53P 1 Reply Last reply
    0
    • AphofisA Aphofis

      Mahlzeit, ich komme logisch irgendwie nicht weiter.
      Ich habe 6 Datenpunkte, wovon einer Zeitgesteuert aktiviert werden soll.
      Dazu gehören 20 Datenpunkte, in denen das Programm laufen soll,
      was zu einer bestimmten Uhrzeit anlaufen soll. Dazu gehören 20 Datenpunkte mit einer Startzeit.
      Beendet wird das nicht da das folge Programm das übernehmen soll.
      Wie bekomme ich es in Blockly hin, das der richtige der 6 Datenpunkte dann aktiviert wird.
      Also muss praktisch aus dem Datenpunkt der in dem Datenpunkt aktuell aktiv ist der Wert gelesen werden und der richtige der 6 Datenpunkte auf true gesetzt werden, um das richtige Programm zu starten.

      Das ist eines der 20 Uhrzeit Programme:
      Bildschirmfoto 2020-01-24 um 10.03.09.png
      alle 20 Programm Steuerungen befindet sich in einem Blockly was soweit auch funktioniert.
      Zur eingestellten Zeit, wird auch in Programm_Aktuell das Programm eingestellt was gerade läuft. Nun muss aus Programm aktuell der Wert genommen werden und der richtige der 6 Datenpunkte geschaltet werden.

      Das sind die 20 Uhrzeiten und die 20 Programme die laufen sollen:
      Bildschirmfoto 2020-01-24 um 03.27.22.png

      Das sein die 6 Programme wovon eines aktiviert werden soll:
      Bildschirmfoto 2020-01-24 um 03.28.41.png

      Hintergrund: mit den 6 Datenpunkten wird jeweils ein Blockly gesteuert, womit ein Datenstring per USB an einen Controller gesendet werden soll.
      Die Uhrzeiten und welches Programm in den 20 Programm Datenpunkten laufen soll möchte ich später per Vis einstellen können.

      Das ist die Aktuelle View, mit der Die Programme eingestellt werden können:
      Bildschirmfoto 2020-01-24 um 05.38.29.png

      Ich hatte es so versucht, doch will es so leider nicht die Datenpunkte schalten und auch die nicht aktiven dann abschalten.
      Es muss doch eine globale Lösung geben für alle 20 Programme:
      Bildschirmfoto 2020-01-24 um 09.56.34.png
      @paul53 vielleicht magst du ja mal drüber schauen !? Ich komme nicht weiter!!!

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

      @Aphofis
      Programm_Aktuell muss ein Trigger sein, damit auf dessen Änderung reagiert wird.
      Weshalb wertest Du 6 Werte (0...5) aus ? Im ersten Screenshot tauchen nur die Werte 0...3 auf.

      Blockly_Tunze.JPG

      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
      1
      • paul53P paul53

        @Aphofis
        Programm_Aktuell muss ein Trigger sein, damit auf dessen Änderung reagiert wird.
        Weshalb wertest Du 6 Werte (0...5) aus ? Im ersten Screenshot tauchen nur die Werte 0...3 auf.

        Blockly_Tunze.JPG

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

        @paul53
        Ich habe in dem Blockly 20 Zeitsteuerungen!
        Kann es jetzt aber anders machen per javascript und VIS direkt die 6 Datenpunkte Zeitgesteuert steuern.
        Nur will das Javascript iwie die Datenpunkte nicht sauber schalten.
        Kann es sein, das dass Javascript mit Großbuchstaben und den Unterstrichen Probleme hat !? kann man das im Javascript irgendwie anpassen !?
        Ich würde auch gerne, das das Script die Datenpunkte in:

        Aqua_Control.0.Tunze_Steuerung.
        

        erstellt. Anstatt in

        javascript.0.Timer.
        

        Das Dazugehörige VIS Widget kann ich dann auch die richtigen Datenpunkte anpassen.
        In TimerTargetNames

        intervall;sequenzial;puls;wave;stop;feed 
        

        eingetragen
        und in TimerTarget

        Aqua_Control.0.Tunze_Steuerung.intervall;Aqua_Control.0.Tunze_Steuerung.sequenzial;Aqua_Control.0.Tunze_Steuerung.puls;Aqua_Control.0.Tunze_Steuerung.wave;Aqua_Control.0.Tunze_Steuerung.stop;Aqua_Control.0.Tunze_Steuerung.feed
        

        Der Quellcode ist:

        //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 >=
        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][13] == true && Presence == 0) || (MyTimer[whichone][13] == 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);
            });
        
        };
        
        
        

        Mit freundlicher weitergabe von carlo
        Irgendwie wird immer nur puls auf true gesetzt aber nix weiter

        paul53P 1 Reply Last reply
        0
        • AphofisA Aphofis

          @paul53
          Ich habe in dem Blockly 20 Zeitsteuerungen!
          Kann es jetzt aber anders machen per javascript und VIS direkt die 6 Datenpunkte Zeitgesteuert steuern.
          Nur will das Javascript iwie die Datenpunkte nicht sauber schalten.
          Kann es sein, das dass Javascript mit Großbuchstaben und den Unterstrichen Probleme hat !? kann man das im Javascript irgendwie anpassen !?
          Ich würde auch gerne, das das Script die Datenpunkte in:

          Aqua_Control.0.Tunze_Steuerung.
          

          erstellt. Anstatt in

          javascript.0.Timer.
          

          Das Dazugehörige VIS Widget kann ich dann auch die richtigen Datenpunkte anpassen.
          In TimerTargetNames

          intervall;sequenzial;puls;wave;stop;feed 
          

          eingetragen
          und in TimerTarget

          Aqua_Control.0.Tunze_Steuerung.intervall;Aqua_Control.0.Tunze_Steuerung.sequenzial;Aqua_Control.0.Tunze_Steuerung.puls;Aqua_Control.0.Tunze_Steuerung.wave;Aqua_Control.0.Tunze_Steuerung.stop;Aqua_Control.0.Tunze_Steuerung.feed
          

          Der Quellcode ist:

          //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 >=
          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][13] == true && Presence == 0) || (MyTimer[whichone][13] == 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);
              });
          
          };
          
          
          

          Mit freundlicher weitergabe von carlo
          Irgendwie wird immer nur puls auf true gesetzt aber nix weiter

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

          @Aphofis sagte:

          Kann es sein, das dass Javascript mit Großbuchstaben und den Unterstrichen Probleme hat !?

          Großbuchstaben und Unterstriche machen keine Probleme.

          @Aphofis sagte in Wahl eines Datenpunktes:

          Script die Datenpunkte in: Aqua_Control.0.Tunze_Steuerung. erstellt.

          Mit der Funktion von @Mic kann man Datenpunkte auch unter einem eigenen Ordner erstellen, wenn man Zeile 21 anpasst

              const WHERE = '0_userdata.0';   // You could change the starting path accordingly. Not recommended to change, though.
          

          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
          1
          • AphofisA Offline
            AphofisA Offline
            Aphofis
            wrote on last edited by
            #5

            @paul53
            Das hat schon mal geklappt mit dem eigenen Ordner.
            Die gewählten Datenpunkte im VIS werden korrekt in den einzelnen Timern gesetzt, doch werden die falschen Datenpunkte der switch Datenpunkte geschaltet.
            Obgleich TimerTargetNames und TimerTargets sogar in der selben Reihenfolge sind.
            Alle widgets hab ich einzelne durchforstet und die sind richtig eingestellt.
            Woran, kann der Fehler liegen, das nicht die richtigen Datenpunkte geschaltet werden.

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

              Das ist das dazugehörige Timer Widget

              [{"tpl":"tplValueBoolCheckbox","data":{"oid":"javascript.0.Timer.1.OnlyIfNoPresence","g_fixed":true,"g_visibility":false,"g_css_font_text":true,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"html_append":"wenn abwesend","class":""},"style":{"left":"786px","top":"519px","width":"157px","height":"20px","font-size":"small"},"widgetSet":"basic"},{"tpl":"tplValueBoolCheckbox","data":{"oid":"javascript.0.Timer.1.OnlyIfPresence","g_fixed":true,"g_visibility":false,"g_css_font_text":true,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"html_append":"wenn anwesend","class":"mdui-Title"},"style":{"left":"630px","top":"519px","width":"157px","height":"20px","font-size":"small"},"widgetSet":"basic"},{"tpl":"tplValueBool","data":{"oid":"javascript.0.Timer.1.Aktiv","g_fixed":true,"g_visibility":false,"g_css_font_text":true,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"html_false":"Timer 1","html_true":"Timer 1","class":"mdui-flatbutton mdui-center ","html_append":"","visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide"},"style":{"left":"630px","top":"454px","height":"25px","width":"80px","text-align":"","z-index":"5","cursor":"default"},"widgetSet":"basic"},{"tpl":"tplValueBoolCtrl","data":{"oid":"javascript.0.Timer.1.TimerSonntag","g_fixed":true,"g_visibility":false,"g_css_font_text":true,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"html_false":"<diff class=\"mdui-red\" >So:","html_true":"<diff class=\"mdui-green\" >So:","class":"mdui-raisedbutton"},"style":{"left":"630px","top":"541px","width":"40px","height":"20px","text-align":"center"},"widgetSet":"basic"},{"tpl":"tplValueBoolCtrl","data":{"oid":"javascript.0.Timer.1.TimerMontag","g_fixed":true,"g_visibility":false,"g_css_font_text":true,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"html_false":"<diff class=\"mdui-red\" >Mo:","html_true":"<diff class=\"mdui-green\" >Mo:","class":"mdui-raisedbutton"},"style":{"left":"672px","top":"541px","width":"40px","height":"20px","text-align":"center"},"widgetSet":"basic"},{"tpl":"tplValueBoolCtrl","data":{"oid":"javascript.0.Timer.1.TimerDienstag","g_fixed":true,"g_visibility":false,"g_css_font_text":true,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"html_false":"<diff class=\"mdui-red\" >Di:","html_true":"<diff class=\"mdui-green\" >Di:","class":"mdui-raisedbutton"},"style":{"left":"715px","top":"541px","width":"40px","height":"20px","text-align":"center"},"widgetSet":"basic"},{"tpl":"tplValueBoolCtrl","data":{"oid":"javascript.0.Timer.1.TimerMittwoch","g_fixed":true,"g_visibility":false,"g_css_font_text":true,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"html_false":"<diff class=\"mdui-red\" >Mi:","html_true":"<diff class=\"mdui-green\" >Mi:","class":"mdui-raisedbutton"},"style":{"left":"757px","top":"541px","width":"40px","height":"20px","text-align":"center"},"widgetSet":"basic"},{"tpl":"tplValueBoolCtrl","data":{"oid":"javascript.0.Timer.1.TimerDonnerstag","g_fixed":true,"g_visibility":false,"g_css_font_text":true,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"html_false":"<diff class=\"mdui-red\" >Do:","html_true":"<diff class=\"mdui-green\" >Do:","class":"mdui-raisedbutton"},"style":{"left":"799px","top":"541px","width":"40px","height":"20px","text-align":"center"},"widgetSet":"basic"},{"tpl":"tplValueBoolCtrl","data":{"oid":"javascript.0.Timer.1.TimerFreitag","g_fixed":true,"g_visibility":false,"g_css_font_text":true,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"html_false":"<diff class=\"mdui-red\" >Fr:","html_true":"<diff class=\"mdui-green\" >Fr:","class":"mdui-raisedbutton"},"style":{"left":"842px","top":"541px","width":"40px","height":"20px","text-align":"center"},"widgetSet":"basic"},{"tpl":"tplValueBoolCtrl","data":{"oid":"javascript.0.Timer.1.TimerSamstag","g_fixed":true,"g_visibility":false,"g_css_font_text":true,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"html_false":"<diff class=\"mdui-red\" >Sa:","html_true":"<diff class=\"mdui-green\" >Sa:","class":"mdui-raisedbutton"},"style":{"left":"884px","top":"541px","width":"40px","height":"20px","text-align":"center"},"widgetSet":"basic"},{"tpl":"tplValueBool","data":{"oid":"","g_fixed":true,"g_visibility":true,"g_css_font_text":true,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":"true","visibility-groups-action":"hide","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"html_false":"","html_true":"","class":"mdui-flatbutton mdui-center mdui-green-pulse","html_append":"","visibility-oid":"javascript.0.Timer.1.Aktiv"},"style":{"left":"630px","top":"454px","height":"25px","width":"80px","text-align":"","z-index":"0","cursor":"default"},"widgetSet":"basic"},{"tpl":"tplJquiSelectList","data":{"oid":"javascript.0.Timer.1.SwitchTarget","g_fixed":true,"g_visibility":false,"g_css_font_text":true,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","values":"{javascript.0.Timer.TimerTargets}","texts":"{javascript.0.Timer.TimerTargetNames}","height":"150","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"class":"mdui-select","no_style":true},"style":{"left":"724px","top":"452px","width":"200px","z-index":10,"height":"25px","font-size":"small"},"widgetSet":"jqui"},{"tpl":"tplValueStringRaw","data":{"oid":"javascript.0.Timer.1.TimerAstroTimestamp","g_fixed":true,"g_visibility":true,"g_css_font_text":true,"g_css_background":true,"g_css_shadow_padding":false,"g_css_border":true,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"!=","visibility-val":"Zeit","visibility-groups-action":"hide","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"visibility-oid":"javascript.0.Timer.1.TimerChoice","views":null,"class":"mdui-value"},"style":{"left":"849px","top":"494px","width":"90px","height":"22px","z-index":3,"background-color":"","color":"","text-align":"","font-weight":"","font-size":"","border-color":"","border-width":"","border-style":""},"widgetSet":"basic"},{"tpl":"tplJquiSelectList","data":{"oid":"javascript.0.Timer.1.Rolle","g_fixed":true,"g_visibility":false,"g_css_font_text":true,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","values":"0;1;2","texts":"Ausschalten;Einschalten;Nix macha","height":"120","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"no_style":true,"views":null,"class":"mdui-select"},"style":{"left":"630px","top":"487px","width":"100px","height":"28px","z-index":8,"font-size":"small"},"widgetSet":"jqui"},{"tpl":"tplJquiInput","data":{"oid":"javascript.0.Timer.1.TimerAstroShift","g_fixed":true,"g_visibility":true,"g_css_font_text":true,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"label":"+/-","digits":"0","size":"1","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"visibility-cond":"!=","visibility-val":"Zeit","visibility-groups-action":"hide","visibility-oid":"javascript.0.Timer.1.TimerChoice","views":null,"class":"mdui-input"},"style":{"left":"847px","top":"573px","width":"93px","height":"20px","font-size":"","z-index":9,"font-weight":"bold","color":"black"},"widgetSet":"jqui"},{"tpl":"tplJquiSelectList","data":{"oid":"javascript.0.Timer.1.TimerChoice","g_fixed":true,"g_visibility":false,"g_css_font_text":true,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","values":"Zeit;dawn;sunrise;goldenHour;dusk;sunset","texts":"Zeit;Morgendämmerung;Sonnenaufgang;Goldene Stunde;Abenddämmerung;  Sonnenuntergang;","height":"200","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"no_style":true,"views":null,"class":"mdui-select"},"style":{"left":"630px","top":"567px","width":"198px","height":"25px","font-size":"small","font-weight":"bold","z-index":9},"widgetSet":"jqui"},{"tpl":"tplJquiInputDatetime","data":{"oid":"javascript.0.Timer.1.TimerTimestamp","g_fixed":true,"g_visibility":true,"g_css_font_text":true,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":"Zeit","visibility-groups-action":"hide","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"size":"5","timeOnly":true,"hideSeconds":true,"visibility-oid":"javascript.0.Timer.1.TimerChoice","views":null,"class":"mdui-input"},"style":{"left":"849px","top":"491px","width":"90px","height":"25px","font-weight":"","z-index":9,"font-size":"","text-align":"right"},"widgetSet":"jqui"}]
              
              1 Reply Last reply
              0
              • AphofisA Aphofis

                @paul53
                Das hat schon mal geklappt mit dem eigenen Ordner.
                Die gewählten Datenpunkte im VIS werden korrekt in den einzelnen Timern gesetzt, doch werden die falschen Datenpunkte der switch Datenpunkte geschaltet.
                Obgleich TimerTargetNames und TimerTargets sogar in der selben Reihenfolge sind.
                Alle widgets hab ich einzelne durchforstet und die sind richtig eingestellt.
                Woran, kann der Fehler liegen, das nicht die richtigen Datenpunkte geschaltet werden.

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

                @Aphofis sagte:

                Woran, kann der Fehler liegen, das nicht die richtigen Datenpunkte geschaltet werden.

                Mit Vis/Widgets kenne ich mich nicht aus.

                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 Offline
                  AphofisA Offline
                  Aphofis
                  wrote on last edited by
                  #8

                  Ich denke mal es liegt irgendwo im JavaScript und nicht am Widget! Da in den timer datenpunkten die richtigen Programme eingetragen werden aber nicht an die Switch datenpunkte übergeben wird. Iwo muss ein Fehler sein

                  paul53P 1 Reply Last reply
                  0
                  • AphofisA Aphofis

                    Ich denke mal es liegt irgendwo im JavaScript und nicht am Widget! Da in den timer datenpunkten die richtigen Programme eingetragen werden aber nicht an die Switch datenpunkte übergeben wird. Iwo muss ein Fehler sein

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

                    @Aphofis sagte in Wahl eines Datenpunktes:

                    Ich denke mal es liegt irgendwo im JavaScript

                    Ändere mal in Zeile 178 [13] --> [15]

                            if ((MyTimer[whichone][14] && Presence) || (MyTimer[whichone][15] && !Presence) || (MyTimer[whichone][15] && MyTimer[whichone][14])) { //Wenn "bei Anwesenheit" aktiv
                    

                    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
                    1
                    • paul53P paul53

                      @Aphofis sagte in Wahl eines Datenpunktes:

                      Ich denke mal es liegt irgendwo im JavaScript

                      Ändere mal in Zeile 178 [13] --> [15]

                              if ((MyTimer[whichone][14] && Presence) || (MyTimer[whichone][15] && !Presence) || (MyTimer[whichone][15] && MyTimer[whichone][14])) { //Wenn "bei Anwesenheit" aktiv
                      
                      AphofisA Offline
                      AphofisA Offline
                      Aphofis
                      wrote on last edited by
                      #10

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

                      paul53P 2 Replies Last reply
                      0
                      • AphofisA Aphofis

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

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

                        @Aphofis sagte:

                        obwohl im timer SwitchTarget der richtige Datenpunkt eingetragen wurde.

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

                        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 Offline
                          AphofisA Offline
                          Aphofis
                          wrote on last edited by
                          #12

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

                          paul53P 1 Reply Last reply
                          0
                          • AphofisA Aphofis

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

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

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

                            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

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

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

                              @Aphofis sagte:

                              Meine LOG:

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

                              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 Offline
                                AphofisA Offline
                                Aphofis
                                wrote on last edited by Aphofis
                                #15

                                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

                                paul53P 1 Reply Last reply
                                0
                                • AphofisA 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

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

                                  @Aphofis sagte:

                                  Pfad javascript.0.Timer.sequenzial

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

                                  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:

                                    Pfad javascript.0.Timer.sequenzial

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

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

                                    @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
                                    0
                                    • AphofisA Offline
                                      AphofisA Offline
                                      Aphofis
                                      wrote on last edited by
                                      #18

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

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

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

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

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

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

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

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

                                        Bildschirmfoto 2020-01-25 um 20.21.08.png

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

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

                                          paul53P 2 Replies 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

                                          599

                                          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