Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • 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

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

  1. ioBroker Community Home
  2. Deutsch
  3. Visualisierung
  4. [Vorlage] Variable Zeitsteuerung mit VIS Editor

NEWS

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

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

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

[Vorlage] Variable Zeitsteuerung mit VIS Editor

Geplant Angeheftet Gesperrt Verschoben Visualisierung
vistemplate
919 Beiträge 47 Kommentatoren 279.2k Aufrufe 75 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • GlasfaserG Glasfaser

    @GiuseppeS
    Erstmal ...… tolle Arbeit zu deinem Projekt :+1:

    Ich habe es mehr aufgegliedert ,
    Ich habe die Vorlagen von " Brati "Link Text

    genutzt und auf meine zwecke umgebaut für 8 Rollladen.

    11.jpg
    22.jpg

    Das Problem an deiner Vorlage ist , das einige hier eine Terrassentür haben wie ich und die nicht unbeabsichtigt runterfahren sollte .:white_frowning_face:
    Vielleicht kannst Du noch einen Datenpunkt einbauen .( Verschlussüberwachung )

    … eventuell schon mal an Urlaub , Feiertag nachgedacht ...

    Ich finde deine Arbeit die Du in deinem Skript gesteckt hast super , wollte ein teil von der Astro/Zeit -Funktion davon nutzen , aber scheitere gerade daran .

    Ich wollte die Punkte:

    -Auswahl Astro / Zeit inkl. Offset ,Random nutzen , da ich beim mir nur feste Astro angaben im Script habe , je für rauf und runter , das ist leider nicht so komfortabel , bzw. flexibel wie bei dir .

    333.JPG 444.JPG

    Benötige für meine Zwecke nur 5 Datenpunkte die ich brauche (pro Rollladen Rauf / Runter ):

    • Timer.Devices.Editor.Cron ( für die Cron Funktion in meinem Script )
    • Timer.Devices.Editor.DropDownAstroTexte ( Für die VIS Darstellung )
    • Timer.Devices.Editor.DropDownAstroWerte ( Für die VIS Darstellung )
    • ………. für Offset ( Für die VIS Darstellung )
    • ………..für Zufall ( Für die VIS Darstellung )

    Kannst Du mir vielleicht das Skript darauf kürzen , wäre sehr toll.

    G Offline
    G Offline
    GiuseppeS
    schrieb am zuletzt editiert von GiuseppeS
    #36

    @Glasfaser
    Mit Brati's Vorlage war ich ursprünglich auch gestartet und hatte mich damit bzgl. des Arbeitens mit JSONs "fortgebildet". Schlussendlich blieb nur noch die Funktion für das TableJSON.

    Die Datenpunkte zu extrahieren ist nicht so simpel. Die relevanten Funktionen lauten jedenfalls:

    // Input:  Minute + Stunde + Zufallsbereich (1 bis 59 Min) + Vorzeichen von Zufall
    // Return: Json Object mit Struktur von timeJSON, siehe unten
    function randomTime(min,std,rand,opt) {
        // Erstellung des JSON mit Vorbelegung der Keys
        var timeJSON = {"Zeit": "23:59", "Cron": "59 23 * * *", "Std": "23", "Min": "59"};
        if (rand > 0){
            if (rand > 59) {rand = 59;}
            if (opt === "pm"){var delta_min = Math.floor(Math.random() * (rand - (-1 * rand) + 1) + (-1 * rand));}
            if (opt === "p"){var delta_min = Math.floor(Math.random() * (rand + 1));}
            if (opt === "m"){var delta_min = Math.floor(Math.random() * (rand + 1) - rand);}
        	min += delta_min;
        	if (min >= 60){std++;min -= 60;}
        	else if (min < 0){std--;min += 60;}
        	if (std >= 24){std -= 24;}
        	else if (std < 0){std += 24;}
        }
    	timeJSON.Zeit = (std <= 9 ? "0" : "") + std + ":" + (min <= 9 ? "0" : "") + min;
    	timeJSON.Std = std;
    	timeJSON.Min = min;
    	timeJSON.Cron = min + " " + std + " *" + " * "; // Wochentage für Cron bewusst nicht vorhanden, wird später angehängt
        return timeJSON;
    }
    

    Dann noch die Offset Funktion... Diese hatte ich nachträglich integriert, daher aus Faulheit als Input das JSON von der Random-Funktion oben:

    // Input timeJSON aus function randomTime + Offset + Vorzeichen von Offset
    // Output timeJSON mit verrechnetem Offset
    function offsetTime(randJSON,offset,opt) {
        var min = randJSON.Min, std = randJSON.Std, delta_min = 0;
        var timeJSON = {"Zeit": "23:59", "Cron": "59 23 * * *", "Std": "23", "Min": "59"};
        if (offset > 0){
            if (offset > 59) {offset = 59;}
            if (opt === "p"){ delta_min = offset }
            if (opt === "m"){ delta_min = -1 * offset}
        	min += delta_min;
        	if (min >= 60){std++;min -= 60;}
        	else if (min < 0){std--;min += 60;}
        	if (std >= 24){std -= 24;}
        	else if (std < 0){std += 24;}
        }
    	timeJSON.Zeit = (std <= 9 ? "0" : "") + std + ":" + (min <= 9 ? "0" : "") + min;
    	timeJSON.Std = std;
    	timeJSON.Min = min;
    	timeJSON.Cron = min + " " + std + " *" + " * "; // Wochentage für Cron bewusst nicht vorhanden, wird später angehängt
        return timeJSON;
    }
    

    Astrofunktion: Es werden alle Astro-Zeiten in ein JSON geschrieben, damit die anderen Funktionen darauf zugreifen können:

    // Setzt die 3 Felder für Astro-DropDown Werte, Texte und das Json für spätere Berechnungen.
    function setAstro() {
        var strWerte = "manuell";
        var strTexte = "manuell";
        var AstroJSON = {};
        var tmpAstro;
        var astro_times = ["sunrise", "sunriseEnd", "goldenHourEnd", "solarNoon", "goldenHour", "sunsetStart", "sunset", "dusk", "nauticalDusk", "nadir", "nauticalDawn", "dawn"]
        var defaultJSON = {"Zeit" : "10:00", "Std" : 10, "Min" : 0};
        
        astro_times.forEach(function(entry) {
            tmpAstro = entry;
            var zeit = formatDate(getDateObject(getAstroDate(tmpAstro, undefined, 0)), "hh:mm");
            var zeitSplit = zeit.split(':');
            AstroJSON[tmpAstro] = jsonCopy(defaultJSON);
    		AstroJSON[tmpAstro].Zeit = zeit;
    		AstroJSON[tmpAstro].Std = parseInt(zeitSplit[0]);
    		AstroJSON[tmpAstro].Min = parseInt(zeitSplit[1]);
            strTexte += ";" + tmpAstro + ", " + zeit;
            strWerte += ";" + tmpAstro;
        });
    
    	setState("javascript.0.Timer.Devices.Editor.DropDownAstroTexte", strTexte);
    	setState("javascript.0.Timer.Devices.Editor.DropDownAstroWerte", strWerte);
    	setState("javascript.0.Timer.AstroJSON", JSON.stringify(AstroJSON));
    }
    // setAstro wird alle 5 Minuten getriggert 
    schedule('5 15 * * *', setAstro);
    

    Die JSON-Rückgabe Objekte der Offset und/oder Random Funktion (beide identisch aufgebaut) beinhalten den Key "Cron".

    "Fertiges Cron String" = ReturnedJSON.Cron + CronTage; (mit CronTage z.B. "1-5")

    Ich denke mal, dass das fertige Cron-String genau das ist was Du benötigst und in weitere Scripte einbauen kannst.

    Zu den weiteren Punkten; Terrassentür usw.:
    Hier hast Du absolut Recht. Das Problem hatte ich anders gelöst. Ich steuere sowohl mit den Shutter-Controls direkt im VIS oder mit dieser Timer-Steuerung nie direkt meine Rollläden an.
    Zu jedem Rollladen habe ich ein virtuelles State wie z.B. "Balkon-Links-ShouldBe". Diese States steuern dann über ein Mini-Blockly-Skript die jeweiligen realen Aktoren. Um genau das Thema Balkon-Türe usw. zu umgehen. Hier z.B. ein Blockly für meine indirekte Steuerung:
    bd05e550-e852-4461-b4a4-1eac78f5589c-image.png

    Weitere Optimierung, die noch in diese Timer-Steuerung einfließt:
    Wählbare zusätzliche Bedingungen (maximal 2 oder 3?), direkt über VIS wählbar.
    Alle möglichen Trigger (Wie z.B. das allseits beliebte "AtHome") kommen in eine Aufzählung.
    Im PopUp gibt es dann zunächst eine zusätzliche Zeile "Anzahl Bedingungen = 0". Je nach Auswahl der Anzahl, verlängert sich das PopUp und zeigt weitere Zeilen für die Bedingungen an.

    GlasfaserG 2 Antworten Letzte Antwort
    0
    • G GiuseppeS

      @Glasfaser
      Mit Brati's Vorlage war ich ursprünglich auch gestartet und hatte mich damit bzgl. des Arbeitens mit JSONs "fortgebildet". Schlussendlich blieb nur noch die Funktion für das TableJSON.

      Die Datenpunkte zu extrahieren ist nicht so simpel. Die relevanten Funktionen lauten jedenfalls:

      // Input:  Minute + Stunde + Zufallsbereich (1 bis 59 Min) + Vorzeichen von Zufall
      // Return: Json Object mit Struktur von timeJSON, siehe unten
      function randomTime(min,std,rand,opt) {
          // Erstellung des JSON mit Vorbelegung der Keys
          var timeJSON = {"Zeit": "23:59", "Cron": "59 23 * * *", "Std": "23", "Min": "59"};
          if (rand > 0){
              if (rand > 59) {rand = 59;}
              if (opt === "pm"){var delta_min = Math.floor(Math.random() * (rand - (-1 * rand) + 1) + (-1 * rand));}
              if (opt === "p"){var delta_min = Math.floor(Math.random() * (rand + 1));}
              if (opt === "m"){var delta_min = Math.floor(Math.random() * (rand + 1) - rand);}
          	min += delta_min;
          	if (min >= 60){std++;min -= 60;}
          	else if (min < 0){std--;min += 60;}
          	if (std >= 24){std -= 24;}
          	else if (std < 0){std += 24;}
          }
      	timeJSON.Zeit = (std <= 9 ? "0" : "") + std + ":" + (min <= 9 ? "0" : "") + min;
      	timeJSON.Std = std;
      	timeJSON.Min = min;
      	timeJSON.Cron = min + " " + std + " *" + " * "; // Wochentage für Cron bewusst nicht vorhanden, wird später angehängt
          return timeJSON;
      }
      

      Dann noch die Offset Funktion... Diese hatte ich nachträglich integriert, daher aus Faulheit als Input das JSON von der Random-Funktion oben:

      // Input timeJSON aus function randomTime + Offset + Vorzeichen von Offset
      // Output timeJSON mit verrechnetem Offset
      function offsetTime(randJSON,offset,opt) {
          var min = randJSON.Min, std = randJSON.Std, delta_min = 0;
          var timeJSON = {"Zeit": "23:59", "Cron": "59 23 * * *", "Std": "23", "Min": "59"};
          if (offset > 0){
              if (offset > 59) {offset = 59;}
              if (opt === "p"){ delta_min = offset }
              if (opt === "m"){ delta_min = -1 * offset}
          	min += delta_min;
          	if (min >= 60){std++;min -= 60;}
          	else if (min < 0){std--;min += 60;}
          	if (std >= 24){std -= 24;}
          	else if (std < 0){std += 24;}
          }
      	timeJSON.Zeit = (std <= 9 ? "0" : "") + std + ":" + (min <= 9 ? "0" : "") + min;
      	timeJSON.Std = std;
      	timeJSON.Min = min;
      	timeJSON.Cron = min + " " + std + " *" + " * "; // Wochentage für Cron bewusst nicht vorhanden, wird später angehängt
          return timeJSON;
      }
      

      Astrofunktion: Es werden alle Astro-Zeiten in ein JSON geschrieben, damit die anderen Funktionen darauf zugreifen können:

      // Setzt die 3 Felder für Astro-DropDown Werte, Texte und das Json für spätere Berechnungen.
      function setAstro() {
          var strWerte = "manuell";
          var strTexte = "manuell";
          var AstroJSON = {};
          var tmpAstro;
          var astro_times = ["sunrise", "sunriseEnd", "goldenHourEnd", "solarNoon", "goldenHour", "sunsetStart", "sunset", "dusk", "nauticalDusk", "nadir", "nauticalDawn", "dawn"]
          var defaultJSON = {"Zeit" : "10:00", "Std" : 10, "Min" : 0};
          
          astro_times.forEach(function(entry) {
              tmpAstro = entry;
              var zeit = formatDate(getDateObject(getAstroDate(tmpAstro, undefined, 0)), "hh:mm");
              var zeitSplit = zeit.split(':');
              AstroJSON[tmpAstro] = jsonCopy(defaultJSON);
      		AstroJSON[tmpAstro].Zeit = zeit;
      		AstroJSON[tmpAstro].Std = parseInt(zeitSplit[0]);
      		AstroJSON[tmpAstro].Min = parseInt(zeitSplit[1]);
              strTexte += ";" + tmpAstro + ", " + zeit;
              strWerte += ";" + tmpAstro;
          });
      
      	setState("javascript.0.Timer.Devices.Editor.DropDownAstroTexte", strTexte);
      	setState("javascript.0.Timer.Devices.Editor.DropDownAstroWerte", strWerte);
      	setState("javascript.0.Timer.AstroJSON", JSON.stringify(AstroJSON));
      }
      // setAstro wird alle 5 Minuten getriggert 
      schedule('5 15 * * *', setAstro);
      

      Die JSON-Rückgabe Objekte der Offset und/oder Random Funktion (beide identisch aufgebaut) beinhalten den Key "Cron".

      "Fertiges Cron String" = ReturnedJSON.Cron + CronTage; (mit CronTage z.B. "1-5")

      Ich denke mal, dass das fertige Cron-String genau das ist was Du benötigst und in weitere Scripte einbauen kannst.

      Zu den weiteren Punkten; Terrassentür usw.:
      Hier hast Du absolut Recht. Das Problem hatte ich anders gelöst. Ich steuere sowohl mit den Shutter-Controls direkt im VIS oder mit dieser Timer-Steuerung nie direkt meine Rollläden an.
      Zu jedem Rollladen habe ich ein virtuelles State wie z.B. "Balkon-Links-ShouldBe". Diese States steuern dann über ein Mini-Blockly-Skript die jeweiligen realen Aktoren. Um genau das Thema Balkon-Türe usw. zu umgehen. Hier z.B. ein Blockly für meine indirekte Steuerung:
      bd05e550-e852-4461-b4a4-1eac78f5589c-image.png

      Weitere Optimierung, die noch in diese Timer-Steuerung einfließt:
      Wählbare zusätzliche Bedingungen (maximal 2 oder 3?), direkt über VIS wählbar.
      Alle möglichen Trigger (Wie z.B. das allseits beliebte "AtHome") kommen in eine Aufzählung.
      Im PopUp gibt es dann zunächst eine zusätzliche Zeile "Anzahl Bedingungen = 0". Je nach Auswahl der Anzahl, verlängert sich das PopUp und zeigt weitere Zeilen für die Bedingungen an.

      GlasfaserG Offline
      GlasfaserG Offline
      Glasfaser
      schrieb am zuletzt editiert von
      #37

      @GiuseppeS
      Danke erstmal , schaue ich mir in Ruhe an .

      Schon mal wie oben erwähnt , über einen Datenpunkt für die Verschlussüberwachung nachgedacht .

      Synology 918+ 16GB - ioBroker in Docker v9 , VISO auf Trekstor Primebook C13 13,3" , Hikvision Domkameras mit Surveillance Station .. CCU RaspberryMatic in Synology VM .. Zigbee CC2538+CC2592 .. Sonoff .. KNX .. Modbus ..

      G 1 Antwort Letzte Antwort
      0
      • GlasfaserG Glasfaser

        @GiuseppeS
        Danke erstmal , schaue ich mir in Ruhe an .

        Schon mal wie oben erwähnt , über einen Datenpunkt für die Verschlussüberwachung nachgedacht .

        G Offline
        G Offline
        GiuseppeS
        schrieb am zuletzt editiert von GiuseppeS
        #38

        @Glasfaser
        Was genau meins Du mit Verschlussüberwachung :confused: ?
        Dass man sich nicht aussperrt?

        EDIT:
        Falls die Verschlussüberwachung das ist, wie ich es verstehe:
        Mit den frei konfigurierbaren Bedingungen könnte ein Datenpunkt "Aussperrschutz" o.ä. verwendet werden. In die Timer für Rollladen-runter könnte dieser Datenpunkt angezogen werden.
        Ich nutze immer lieber generische Lösungen, die je nach Wunsch/Bedarf halbwegs zügig angepasst werden kann.
        Werde in meine Steuerung auch Lampen für eine Anwesenheitssimulation einlesen . Als Bedingung nehme ich dann wohl "wenn AtHome = False".

        GlasfaserG 1 Antwort Letzte Antwort
        0
        • G GiuseppeS

          @Jubbes
          Das PNG ist im ersten Skript direkt unter den Dateien; als PNG dargestellt. Kannst Rechtsklick -> Speichern unter. Die zwei Darstellungen entstehen durch CSS Klassen.

          J Offline
          J Offline
          Jubbes
          schrieb am zuletzt editiert von
          #39

          @GiuseppeS
          Kriege es nicht hin….

          G 1 Antwort Letzte Antwort
          0
          • J Jubbes

            @GiuseppeS
            Kriege es nicht hin….

            G Offline
            G Offline
            GiuseppeS
            schrieb am zuletzt editiert von
            #40

            @Jubbes
            Das Runterladen oder das Einbinden?

            Einbinden bedeutet, das png als "button.png" direkt in das Verzeichnis vis.0 zu schieben.

            J 1 Antwort Letzte Antwort
            0
            • G GiuseppeS

              @Jubbes
              Das Runterladen oder das Einbinden?

              Einbinden bedeutet, das png als "button.png" direkt in das Verzeichnis vis.0 zu schieben.

              J Offline
              J Offline
              Jubbes
              schrieb am zuletzt editiert von
              #41

              @GiuseppeS
              Das runterladen, weiß nicht wo ich anpacken soll

              GlasfaserG 1 Antwort Letzte Antwort
              0
              • J Jubbes

                @GiuseppeS
                Das runterladen, weiß nicht wo ich anpacken soll

                GlasfaserG Offline
                GlasfaserG Offline
                Glasfaser
                schrieb am zuletzt editiert von
                #42

                @Jubbes

                button.png

                Unbenannt 3.jpg

                Synology 918+ 16GB - ioBroker in Docker v9 , VISO auf Trekstor Primebook C13 13,3" , Hikvision Domkameras mit Surveillance Station .. CCU RaspberryMatic in Synology VM .. Zigbee CC2538+CC2592 .. Sonoff .. KNX .. Modbus ..

                1 Antwort Letzte Antwort
                1
                • G GiuseppeS

                  @Glasfaser
                  Mit Brati's Vorlage war ich ursprünglich auch gestartet und hatte mich damit bzgl. des Arbeitens mit JSONs "fortgebildet". Schlussendlich blieb nur noch die Funktion für das TableJSON.

                  Die Datenpunkte zu extrahieren ist nicht so simpel. Die relevanten Funktionen lauten jedenfalls:

                  // Input:  Minute + Stunde + Zufallsbereich (1 bis 59 Min) + Vorzeichen von Zufall
                  // Return: Json Object mit Struktur von timeJSON, siehe unten
                  function randomTime(min,std,rand,opt) {
                      // Erstellung des JSON mit Vorbelegung der Keys
                      var timeJSON = {"Zeit": "23:59", "Cron": "59 23 * * *", "Std": "23", "Min": "59"};
                      if (rand > 0){
                          if (rand > 59) {rand = 59;}
                          if (opt === "pm"){var delta_min = Math.floor(Math.random() * (rand - (-1 * rand) + 1) + (-1 * rand));}
                          if (opt === "p"){var delta_min = Math.floor(Math.random() * (rand + 1));}
                          if (opt === "m"){var delta_min = Math.floor(Math.random() * (rand + 1) - rand);}
                      	min += delta_min;
                      	if (min >= 60){std++;min -= 60;}
                      	else if (min < 0){std--;min += 60;}
                      	if (std >= 24){std -= 24;}
                      	else if (std < 0){std += 24;}
                      }
                  	timeJSON.Zeit = (std <= 9 ? "0" : "") + std + ":" + (min <= 9 ? "0" : "") + min;
                  	timeJSON.Std = std;
                  	timeJSON.Min = min;
                  	timeJSON.Cron = min + " " + std + " *" + " * "; // Wochentage für Cron bewusst nicht vorhanden, wird später angehängt
                      return timeJSON;
                  }
                  

                  Dann noch die Offset Funktion... Diese hatte ich nachträglich integriert, daher aus Faulheit als Input das JSON von der Random-Funktion oben:

                  // Input timeJSON aus function randomTime + Offset + Vorzeichen von Offset
                  // Output timeJSON mit verrechnetem Offset
                  function offsetTime(randJSON,offset,opt) {
                      var min = randJSON.Min, std = randJSON.Std, delta_min = 0;
                      var timeJSON = {"Zeit": "23:59", "Cron": "59 23 * * *", "Std": "23", "Min": "59"};
                      if (offset > 0){
                          if (offset > 59) {offset = 59;}
                          if (opt === "p"){ delta_min = offset }
                          if (opt === "m"){ delta_min = -1 * offset}
                      	min += delta_min;
                      	if (min >= 60){std++;min -= 60;}
                      	else if (min < 0){std--;min += 60;}
                      	if (std >= 24){std -= 24;}
                      	else if (std < 0){std += 24;}
                      }
                  	timeJSON.Zeit = (std <= 9 ? "0" : "") + std + ":" + (min <= 9 ? "0" : "") + min;
                  	timeJSON.Std = std;
                  	timeJSON.Min = min;
                  	timeJSON.Cron = min + " " + std + " *" + " * "; // Wochentage für Cron bewusst nicht vorhanden, wird später angehängt
                      return timeJSON;
                  }
                  

                  Astrofunktion: Es werden alle Astro-Zeiten in ein JSON geschrieben, damit die anderen Funktionen darauf zugreifen können:

                  // Setzt die 3 Felder für Astro-DropDown Werte, Texte und das Json für spätere Berechnungen.
                  function setAstro() {
                      var strWerte = "manuell";
                      var strTexte = "manuell";
                      var AstroJSON = {};
                      var tmpAstro;
                      var astro_times = ["sunrise", "sunriseEnd", "goldenHourEnd", "solarNoon", "goldenHour", "sunsetStart", "sunset", "dusk", "nauticalDusk", "nadir", "nauticalDawn", "dawn"]
                      var defaultJSON = {"Zeit" : "10:00", "Std" : 10, "Min" : 0};
                      
                      astro_times.forEach(function(entry) {
                          tmpAstro = entry;
                          var zeit = formatDate(getDateObject(getAstroDate(tmpAstro, undefined, 0)), "hh:mm");
                          var zeitSplit = zeit.split(':');
                          AstroJSON[tmpAstro] = jsonCopy(defaultJSON);
                  		AstroJSON[tmpAstro].Zeit = zeit;
                  		AstroJSON[tmpAstro].Std = parseInt(zeitSplit[0]);
                  		AstroJSON[tmpAstro].Min = parseInt(zeitSplit[1]);
                          strTexte += ";" + tmpAstro + ", " + zeit;
                          strWerte += ";" + tmpAstro;
                      });
                  
                  	setState("javascript.0.Timer.Devices.Editor.DropDownAstroTexte", strTexte);
                  	setState("javascript.0.Timer.Devices.Editor.DropDownAstroWerte", strWerte);
                  	setState("javascript.0.Timer.AstroJSON", JSON.stringify(AstroJSON));
                  }
                  // setAstro wird alle 5 Minuten getriggert 
                  schedule('5 15 * * *', setAstro);
                  

                  Die JSON-Rückgabe Objekte der Offset und/oder Random Funktion (beide identisch aufgebaut) beinhalten den Key "Cron".

                  "Fertiges Cron String" = ReturnedJSON.Cron + CronTage; (mit CronTage z.B. "1-5")

                  Ich denke mal, dass das fertige Cron-String genau das ist was Du benötigst und in weitere Scripte einbauen kannst.

                  Zu den weiteren Punkten; Terrassentür usw.:
                  Hier hast Du absolut Recht. Das Problem hatte ich anders gelöst. Ich steuere sowohl mit den Shutter-Controls direkt im VIS oder mit dieser Timer-Steuerung nie direkt meine Rollläden an.
                  Zu jedem Rollladen habe ich ein virtuelles State wie z.B. "Balkon-Links-ShouldBe". Diese States steuern dann über ein Mini-Blockly-Skript die jeweiligen realen Aktoren. Um genau das Thema Balkon-Türe usw. zu umgehen. Hier z.B. ein Blockly für meine indirekte Steuerung:
                  bd05e550-e852-4461-b4a4-1eac78f5589c-image.png

                  Weitere Optimierung, die noch in diese Timer-Steuerung einfließt:
                  Wählbare zusätzliche Bedingungen (maximal 2 oder 3?), direkt über VIS wählbar.
                  Alle möglichen Trigger (Wie z.B. das allseits beliebte "AtHome") kommen in eine Aufzählung.
                  Im PopUp gibt es dann zunächst eine zusätzliche Zeile "Anzahl Bedingungen = 0". Je nach Auswahl der Anzahl, verlängert sich das PopUp und zeigt weitere Zeilen für die Bedingungen an.

                  GlasfaserG Offline
                  GlasfaserG Offline
                  Glasfaser
                  schrieb am zuletzt editiert von Glasfaser
                  #43

                  Weitere Optimierung, die noch in diese Timer-Steuerung einfließt:
                  Wählbare zusätzliche Bedingungen (maximal 2 oder 3?), direkt über VIS wählbar.
                  Alle möglichen Trigger (Wie z.B. das allseits beliebte "AtHome") kommen in eine Aufzählung.
                  Im PopUp gibt es dann zunächst eine zusätzliche Zeile "Anzahl Bedingungen = 0". Je nach Auswahl der Anzahl, verlängert sich das PopUp und zeigt weitere Zeilen für die Bedingungen an.

                  Das Wäre Optimal , das in deinem Popup / Liste mit einzubauen .

                  Falls die Verschlussüberwachung das ist, wie ich es verstehe:
                  Mit den frei konfigurierbaren Bedingungen könnte ein Datenpunkt "Aussperrschutz" o.ä. verwendet werden. In die Timer für Rollladen-runter könnte dieser Datenpunkt angezogen werden.

                  So meine ich es.

                  Synology 918+ 16GB - ioBroker in Docker v9 , VISO auf Trekstor Primebook C13 13,3" , Hikvision Domkameras mit Surveillance Station .. CCU RaspberryMatic in Synology VM .. Zigbee CC2538+CC2592 .. Sonoff .. KNX .. Modbus ..

                  1 Antwort Letzte Antwort
                  0
                  • G GiuseppeS

                    Hallo Leute,

                    habe mir eine Zeitsteuerung für die Bedienung auf meinem Smartphone programmiert, die ich gerne mit euch teile.

                    Alle notwendigen Infos sind auf Github zu finden:

                    https://github.com/gsicilia82/Timer_iobroker

                    Fragen / Probleme / Wünsche können gerne als Issue auf Github oder hier im Thread gestellt werden.

                    In diesem Thread werde ich auch über zukünftige Updates informieren. Bei Interesse, einfach diesen Thread auf "beobachten" setzen.


                    Beispiel Screenshots:

                    Hauptansicht für die Timer

                    f1242ab0-61b4-45b3-acb0-72c531e46e25-image.png

                    PopUp-View für die Bearbeitung

                    7be029ea-d8c3-4949-8e5a-66e31515665c-image.png

                    J Offline
                    J Offline
                    Jubbes
                    schrieb am zuletzt editiert von
                    #44

                    @GiuseppeS

                    Hallo, du schreibst:

                    Unter "javascript.0/Timer" werden alle notwendigen Objekte erstellt. Die meisten sind für das Editieren notwendig. Die wichtigsten Objekte sind:
                    TimerJSON: Enthält alle Timer mit den notwendigen Details. Hier könnte auch die Reihenfolge der Geräte für die Darstellung manipuliert werden

                    Habe in der TimerJSON die Device Nr so angepasst, wie ich die Reihenfolge in der Tabelle gerne hätte und abgespeichert. Habe das Script neu gestartet und javascript auch. An der Reihenfolge änderz sich aber nichts. Habe ich was vergessen?

                    Gruß,
                    Jubbes

                    G 1 Antwort Letzte Antwort
                    0
                    • J Jubbes

                      @GiuseppeS

                      Hallo, du schreibst:

                      Unter "javascript.0/Timer" werden alle notwendigen Objekte erstellt. Die meisten sind für das Editieren notwendig. Die wichtigsten Objekte sind:
                      TimerJSON: Enthält alle Timer mit den notwendigen Details. Hier könnte auch die Reihenfolge der Geräte für die Darstellung manipuliert werden

                      Habe in der TimerJSON die Device Nr so angepasst, wie ich die Reihenfolge in der Tabelle gerne hätte und abgespeichert. Habe das Script neu gestartet und javascript auch. An der Reihenfolge änderz sich aber nichts. Habe ich was vergessen?

                      Gruß,
                      Jubbes

                      G Offline
                      G Offline
                      GiuseppeS
                      schrieb am zuletzt editiert von GiuseppeS
                      #45

                      @Jubbes
                      Die Device Nummer wird nur für die automatische Generierung der Timer genutzt.

                      Um die Reihenfolge zu ändern musst du die Reihenfolge der Geräte als Gruppe ändern.

                      Nimm den TimerJSON und pack ihn hier als Text rein:
                      http://jsonviewer.stack.hu/

                      Wenn du nun oben links auf "viewer" klickst, siehst du die Gruppen der Geräte, die ich meine. Einfach die kompletten Gruppen verschieben. Dies ist aber nur in Textform auf der Seite möglich, allerdings kannst Du nach dem Edit auch validieren.

                      Es ist mühselig ein großes JSON in Text-Form zu editieren. Klammern und Kommata sind sehr wichtig und werden oft übersehen.

                      Mögliche weitere Lösung für die Reihenfolge:
                      TimerJSON löschen; Aufzählung in der Reihenfolge neu erstellen, wie die Geräte auch angezeigt werden sollen. Bei mir stimmt die Reihenfolge innerhalb der Aufzählung und in meiner Tabelle überein. Ist vielleicht der einfachste Weg.
                      Nachteil: Deine bereits gepflegten Timer sind verloren.

                      Aber ich nehme es als Idee mit, die Reihenfolge dynamisch anhand der Device-ID zu gestalten.

                      J 1 Antwort Letzte Antwort
                      0
                      • G GiuseppeS

                        @Jubbes
                        Die Device Nummer wird nur für die automatische Generierung der Timer genutzt.

                        Um die Reihenfolge zu ändern musst du die Reihenfolge der Geräte als Gruppe ändern.

                        Nimm den TimerJSON und pack ihn hier als Text rein:
                        http://jsonviewer.stack.hu/

                        Wenn du nun oben links auf "viewer" klickst, siehst du die Gruppen der Geräte, die ich meine. Einfach die kompletten Gruppen verschieben. Dies ist aber nur in Textform auf der Seite möglich, allerdings kannst Du nach dem Edit auch validieren.

                        Es ist mühselig ein großes JSON in Text-Form zu editieren. Klammern und Kommata sind sehr wichtig und werden oft übersehen.

                        Mögliche weitere Lösung für die Reihenfolge:
                        TimerJSON löschen; Aufzählung in der Reihenfolge neu erstellen, wie die Geräte auch angezeigt werden sollen. Bei mir stimmt die Reihenfolge innerhalb der Aufzählung und in meiner Tabelle überein. Ist vielleicht der einfachste Weg.
                        Nachteil: Deine bereits gepflegten Timer sind verloren.

                        Aber ich nehme es als Idee mit, die Reihenfolge dynamisch anhand der Device-ID zu gestalten.

                        J Offline
                        J Offline
                        Jubbes
                        schrieb am zuletzt editiert von
                        #46

                        @GiuseppeS
                        Habe gelöscht und Timer neu eingetragen. War am einfachsten.

                        1 Antwort Letzte Antwort
                        0
                        • G GiuseppeS

                          @Glasfaser
                          Was genau meins Du mit Verschlussüberwachung :confused: ?
                          Dass man sich nicht aussperrt?

                          EDIT:
                          Falls die Verschlussüberwachung das ist, wie ich es verstehe:
                          Mit den frei konfigurierbaren Bedingungen könnte ein Datenpunkt "Aussperrschutz" o.ä. verwendet werden. In die Timer für Rollladen-runter könnte dieser Datenpunkt angezogen werden.
                          Ich nutze immer lieber generische Lösungen, die je nach Wunsch/Bedarf halbwegs zügig angepasst werden kann.
                          Werde in meine Steuerung auch Lampen für eine Anwesenheitssimulation einlesen . Als Bedingung nehme ich dann wohl "wenn AtHome = False".

                          GlasfaserG Offline
                          GlasfaserG Offline
                          Glasfaser
                          schrieb am zuletzt editiert von Glasfaser
                          #47

                          @GiuseppeS
                          Ich habe ein wenig mit deiner Vorlage für mich gearbeitet / gespielt . ( Ist halt Geschmacksache … mal was neues ...)

                          • Rollladen bedienbar Auf / 50% / Ab // inkl. aktuellem Rollladenzustand ,Hintergrund in Blau.
                          • Öffnungszustand in %
                          • Deine Tabelle eingebaut inkl. den Einstell-Buttons

                          Habe mir einzelne "enum" pro Fenster erstellt und aus deiner Vorlage erstmal 4 einzelne Skript´s pro Rollladen ( 4 Rollladen ) für meine VIS angelegt .
                          Diese sind dann einzeln über den jeweiligen Popup einstellbar.( 4 x View Popup)

                          Unbenannt 2.jpg

                          Unbenannt 4.jpg

                          Wo ich leider immer noch nicht weiterkomme mit deinem Skript , ist das ich leider eine Terrassentür habe inkl. Schloss und die Datenpunktabfrage als Bedingung einbauen möchte.

                          Ich benötige also zwei Abfragen / Bedingungen:

                          • Wenn Terrassentür auf , dann nicht Rollladen ab ( Aussperrschutz bei Anwesenheit )

                          • Wenn Terrassentür nicht abgeschlossen ist wenn Rollladen runter ( Verschlussüberwachung ) dann nicht auf .

                          Stehe leider auf dem Schlauch wo ich das einbauen soll .

                          Oder hast Du in der Zeit schon etwas dazu erstellt!?

                          Synology 918+ 16GB - ioBroker in Docker v9 , VISO auf Trekstor Primebook C13 13,3" , Hikvision Domkameras mit Surveillance Station .. CCU RaspberryMatic in Synology VM .. Zigbee CC2538+CC2592 .. Sonoff .. KNX .. Modbus ..

                          1 Antwort Letzte Antwort
                          0
                          • G Offline
                            G Offline
                            GiuseppeS
                            schrieb am zuletzt editiert von
                            #48

                            @Glasfaser
                            Das schaut richtig gut aus. Hast du alle deine Rollläden einzeln dargestellt?
                            Ich hatte schon überlegt, den Haupt-Pfad mit "Javascript.0/Timer/Devices/..." in eine Variable auszulagern, damit Kopien einfacher erstellt werden können. Aber hatte mich dagegen entschieden, da ich selten ein Nutzen davon gehabt hätte. Mache ich evtl auch noch rein.
                            Habe nächste Woche Urlaub und kann eher mal eine Stunde investieren. Komme dieses Wochenende nicht dazu, ab Montag werde ich Zeit haben.

                            Das Thema Sortierung für @Jubbes ist kein Ding mehr. Und bei den Bedingungen bin ich eigentlich nur über die Technik unschlüssig. Will nicht all zu viele states neu erstellen, aber werde wohl nicht drum herum kommen.

                            GlasfaserG 1 Antwort Letzte Antwort
                            0
                            • G GiuseppeS

                              @Glasfaser
                              Das schaut richtig gut aus. Hast du alle deine Rollläden einzeln dargestellt?
                              Ich hatte schon überlegt, den Haupt-Pfad mit "Javascript.0/Timer/Devices/..." in eine Variable auszulagern, damit Kopien einfacher erstellt werden können. Aber hatte mich dagegen entschieden, da ich selten ein Nutzen davon gehabt hätte. Mache ich evtl auch noch rein.
                              Habe nächste Woche Urlaub und kann eher mal eine Stunde investieren. Komme dieses Wochenende nicht dazu, ab Montag werde ich Zeit haben.

                              Das Thema Sortierung für @Jubbes ist kein Ding mehr. Und bei den Bedingungen bin ich eigentlich nur über die Technik unschlüssig. Will nicht all zu viele states neu erstellen, aber werde wohl nicht drum herum kommen.

                              GlasfaserG Offline
                              GlasfaserG Offline
                              Glasfaser
                              schrieb am zuletzt editiert von
                              #49

                              @GiuseppeS
                              Ja , alle 8 Rollladen sind einzeln dargestellt .

                              Unbenannt5.jpg

                              1561401886142-11.jpg

                              1561401897466-22.jpg

                              Wollte mit deiner Vorlage es ein wenig kompakter machen.

                              Synology 918+ 16GB - ioBroker in Docker v9 , VISO auf Trekstor Primebook C13 13,3" , Hikvision Domkameras mit Surveillance Station .. CCU RaspberryMatic in Synology VM .. Zigbee CC2538+CC2592 .. Sonoff .. KNX .. Modbus ..

                              1 Antwort Letzte Antwort
                              0
                              • G Offline
                                G Offline
                                GiuseppeS
                                schrieb am zuletzt editiert von GiuseppeS
                                #50

                                Die letzte Version enthält nun frei konfigurierbare Bedingungen. Die States für die Bedingungen müssen über eine weitere Aufzählung einfließen.

                                Ich werde nun dieses Skript auch für meine Anwesenheitssimulation nutzen.

                                @Glasfaser
                                Denke, dass dein Anwendungsfall nun auch abgedeckt werden kann.
                                Habe übrigens einen Schalter eingebaut, der die HTML-Ausgabe auf mehrere States splittet. Somit sollte eine mehrfache Kopie des Skripts unnötig sein.

                                Eine nachträgliche Sortierung der Geräte innerhalb einer Tabelle ist für mich ohne größeren Aufwand nicht möglich. Ich hatte eine einfache Lösung im Hinterkopf aber da hätte die nachträgliche Ergänzung der Aufzählung mit weiteren Geräten nicht mehr funktioniert.
                                Die Geräte werden alphabetisch sortiert. Wenn daher die State-Namen innerhalb der Aufzählung z.B. mit Zahlen beginnen würden, wäre eine Sortierung somit möglich.

                                GlasfaserG 1 Antwort Letzte Antwort
                                0
                                • G GiuseppeS

                                  Die letzte Version enthält nun frei konfigurierbare Bedingungen. Die States für die Bedingungen müssen über eine weitere Aufzählung einfließen.

                                  Ich werde nun dieses Skript auch für meine Anwesenheitssimulation nutzen.

                                  @Glasfaser
                                  Denke, dass dein Anwendungsfall nun auch abgedeckt werden kann.
                                  Habe übrigens einen Schalter eingebaut, der die HTML-Ausgabe auf mehrere States splittet. Somit sollte eine mehrfache Kopie des Skripts unnötig sein.

                                  Eine nachträgliche Sortierung der Geräte innerhalb einer Tabelle ist für mich ohne größeren Aufwand nicht möglich. Ich hatte eine einfache Lösung im Hinterkopf aber da hätte die nachträgliche Ergänzung der Aufzählung mit weiteren Geräten nicht mehr funktioniert.
                                  Die Geräte werden alphabetisch sortiert. Wenn daher die State-Namen innerhalb der Aufzählung z.B. mit Zahlen beginnen würden, wäre eine Sortierung somit möglich.

                                  GlasfaserG Offline
                                  GlasfaserG Offline
                                  Glasfaser
                                  schrieb am zuletzt editiert von
                                  #51

                                  @GiuseppeS
                                  Das klingt ja schon mal sehr gut .:+1:

                                  Aber in der Zeit habe ich für die Verschlussüberwachung eine andere Lösung für mich erstmal erstellt.
                                  Habe wie Du schon erwähnt hast mir dazu ein Blocky Skript mit den Bedingungen erstellt und im "enum "einen Datenpunkt nur für die Terrasse erstellt die angesteuert wir, also nicht direkt der Aktor .

                                  Habe ein bisschen noch mit der Optik gearbeitet für die einzelnen Rollladen :

                                  Terrassentürrollladen ist nicht bedienbar , da die Terrassentür nicht zu und verschlossen ist .

                                  1.jpg

                                  Hier ist die Terrassentür zu / verschlossen und auch bedienbar :

                                  2.jpg

                                  Bin mal gespannt , wenn dein neues Skript eingestellt wird . ( Noch nicht da .. wegen Bug :smiling_imp: )

                                  Synology 918+ 16GB - ioBroker in Docker v9 , VISO auf Trekstor Primebook C13 13,3" , Hikvision Domkameras mit Surveillance Station .. CCU RaspberryMatic in Synology VM .. Zigbee CC2538+CC2592 .. Sonoff .. KNX .. Modbus ..

                                  1 Antwort Letzte Antwort
                                  0
                                  • G Offline
                                    G Offline
                                    GiuseppeS
                                    schrieb am zuletzt editiert von
                                    #52

                                    So, Skript ist nun auch wieder online. Blöd wenn globale Variablen genutzt werden, diese dann aber über verschiedene Funktionen gleichzeitig verändert werden können :face_with_rolling_eyes:

                                    GlasfaserG 2 Antworten Letzte Antwort
                                    0
                                    • G GiuseppeS

                                      So, Skript ist nun auch wieder online. Blöd wenn globale Variablen genutzt werden, diese dann aber über verschiedene Funktionen gleichzeitig verändert werden können :face_with_rolling_eyes:

                                      GlasfaserG Offline
                                      GlasfaserG Offline
                                      Glasfaser
                                      schrieb am zuletzt editiert von
                                      #53

                                      Kurz und knapp , Sehr gut gemacht , Top.:+1:

                                      Skript läuft … und sieht gut aus …….

                                      Synology 918+ 16GB - ioBroker in Docker v9 , VISO auf Trekstor Primebook C13 13,3" , Hikvision Domkameras mit Surveillance Station .. CCU RaspberryMatic in Synology VM .. Zigbee CC2538+CC2592 .. Sonoff .. KNX .. Modbus ..

                                      1 Antwort Letzte Antwort
                                      0
                                      • G GiuseppeS

                                        So, Skript ist nun auch wieder online. Blöd wenn globale Variablen genutzt werden, diese dann aber über verschiedene Funktionen gleichzeitig verändert werden können :face_with_rolling_eyes:

                                        GlasfaserG Offline
                                        GlasfaserG Offline
                                        Glasfaser
                                        schrieb am zuletzt editiert von
                                        #54

                                        @GiuseppeS
                                        Klappt sehr gut , habe alle 8 Rollladen auf dein neues Skript umgeändert , funktioniert super :+1:
                                        Die Zeiten wurden heute auch super geändert ( Random ).

                                        Ich wurde gestern auch nicht ausgesperrt (Terrassenrollladen) :flushed:

                                        Unbenannt 2.jpg

                                        Synology 918+ 16GB - ioBroker in Docker v9 , VISO auf Trekstor Primebook C13 13,3" , Hikvision Domkameras mit Surveillance Station .. CCU RaspberryMatic in Synology VM .. Zigbee CC2538+CC2592 .. Sonoff .. KNX .. Modbus ..

                                        G 2 Antworten Letzte Antwort
                                        0
                                        • GlasfaserG Glasfaser

                                          @GiuseppeS
                                          Klappt sehr gut , habe alle 8 Rollladen auf dein neues Skript umgeändert , funktioniert super :+1:
                                          Die Zeiten wurden heute auch super geändert ( Random ).

                                          Ich wurde gestern auch nicht ausgesperrt (Terrassenrollladen) :flushed:

                                          Unbenannt 2.jpg

                                          G Offline
                                          G Offline
                                          GiuseppeS
                                          schrieb am zuletzt editiert von
                                          #55

                                          @Glasfaser
                                          Freut mich, dass alles gut funktioniert :+1:

                                          1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          357

                                          Online

                                          32.4k

                                          Benutzer

                                          81.4k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe