Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. tristan

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    T
    • Profile
    • Following 0
    • Followers 1
    • Topics 9
    • Posts 33
    • Best 3
    • Groups 1

    tristan

    @tristan

    4
    Reputation
    38
    Profile views
    33
    Posts
    1
    Followers
    0
    Following
    Joined Last Online

    tristan Follow
    Starter

    Best posts made by tristan

    • Hardware für 8 und mehr Velux/Somfi Geräte

      Hallo Zusammen,

      ich hatte mal Bock was mit einem NodeMCU zusammen zu bauen und habe es zum Anlass genommen endlich mal meine Velux-Rolläden in meinen ioBroker zu integrieren. Und zwar ohne mich von Velux weiter veräppeln zu lassen mit KLF-200-Firmware-Updates oder irgendwelchen teueren nicht-smarten INTEGRA-Produkten.

      Dazu habe ich 3x Relais-Boards mit drei I/O-Extension-Boards an einen NodeMCU angeschlossen (~40EUR).
      Die 8 INTEGRA Fernbedienungen habe ich gestapelt und an die Relais angeschlossen. Versorgt werden sie über den 3V Ausgang vom NodeMCU. Versorgt wird das Ganze über ein USB Ladegerät.

      Ich nennen das Projekt F**K-YOU-VELUX-Stack.

      Die Einbindung habe ich über Tasmota gemacht, eine großartige Firmware. Erkennt automatisch die I/O-Extensions und stellt jeden Kontakt als MQTT zur Verfügung.

      Macht richtig Spaß dem Klackern der Relais zu lauschen. 😄

      f--k_you_Velux_Stack-2.jpg

      Loetpunkte-Velux-INTEGRA-KLI-2_.png

      screenshot-device.png

      VG Tristan

      const og_bad            = "javascript.0.Velux.og_bad.";
      const og_empore         = "javascript.0.Velux.og_empore.";
      // viele weitere Velux Geräte...
      
      const dr_o = "/vis.0/main/dg_rolladen_open.svg";
      const dr_m = "/vis.0/main/dg_rolladen_middle.svg";
      const dr_c = "/vis.0/main/dg_rolladen_close.svg";
      
      const wr_o = "/vis.0/main/fenster_rolladen_open.svg";
      const wr_m = "/vis.0/main/fenster_rolladen_middle.svg";
      const wr_c = "/vis.0/main/fenster_rolladen_close.svg";
      
      const w_o = "/vis.0/main/dg_window_close.svg"; // ACHTUNG! Invertierung wegen 100% Velux UI-FUCK
      const w_m = "/vis.0/main/dg_window_middle.svg";
      const w_c = "/vis.0/main/dg_window_open.svg"; // ACHTUNG! Invertierung wegen 100% Velux UI-FUCK
      
      
      function createRolladen(name){
          createState("javascript.0.Velux."+name+".position", "", {
              "name": "position",
              "role": "",
              "type": "number",
              "desc": "Position des Rolladen in % (0% ist offen).",
              "unit": "%",
              "min": 0,
              "max": 100,
              "def": 0,
              "read": true,
              "write": true
          });
          console.log("Objekt close für Rolladen "+name+" erstellt.");
      
          createState("javascript.0.Velux."+name+".target_position", "", {
              "name": "target_position",
              "role": "",
              "type": "number",
              "desc": "Wunsch-Position des Rolladen in % (0% ist offen).",
              "unit": "%",
              "min": -1,
              "max": 100,
              "def": 0,
              "read": true,
              "write": true
          });
          console.log("Objekt target_position für Rolladen "+name+" erstellt.");
      
          createState("javascript.0.Velux."+name+".runtime", 0, {
              "name": "runtime",
              "role": "",
              "type": "number",
              "desc": "Gibt in Sekunden an wie lange der Rolladen für einen kompletten Lauf benötigt ",
              "unit": "s",
              "min": 0,
              "max": 1000,
              "def": 15,
              "read": true,
              "write": true
          });
          console.log("Objekt runtime für Rolladen "+name+" erstellt.");
      
          createState("javascript.0.Velux."+name+".icon", "",  {
              "name": "icon",
              "role": "",
              "type": "string",
              "desc": "Speichert den Icon-Namen zur Position.",
              "def": "open",
              "read": true,
              "write": true
          });
          console.log("Objekt icon für Rolladen "+name+" erstellt.");
      
          // Hier muss noch geprüft werden, was sein Problem mit dem Type in Common ist...
          createState("javascript.0.Velux."+name+".deviceType", 0,  {
              "name": "deviceType",
              "role": "",
              "type": "state",
              "desc": "Speichert den Icon-Namen zur Position.",
              "def": 0,
              "read": true,
              "write": true,
              "states": {
                  0: "DachRolladen",
                  1: "FensterRolladen",
                  2: "Fenster"
              }
          });
          console.log("Objekt deviceType für Device "+name+" erstellt.");
      
          createState("javascript.0.Velux."+name+".open", "", {
              "name": "open",
              "role": "",
              "type": "string",
              "desc": "Speichert den Pfad zum Objekt für die Aktion: open.",
              "def": "",
              "read": true,
              "write": true
          });
          console.log("Objekt open für Rolladen "+name+" erstellt.");
      
          createState("javascript.0.Velux."+name+".stop", "", {
              "name": "stop",
              "role": "",
              "type": "string",
              "desc": "Speichert den Pfad zum Objekt für die Aktion: stop.",
              "def": "",
              "read": true,
              "write": true
          });
          console.log("Objekt stop für Rolladen "+name+" erstellt.");
      
          createState("javascript.0.Velux."+name+".close", "", {
              "name": "close",
              "role": "",
              "type": "string",
              "desc": "Speichert den Pfad zum Objekt für die Aktion: close.",
              "def": "",
              "read": true,
              "write": true
          });
          console.log("Objekt close für Rolladen "+name+" erstellt.");
      
          createState("javascript.0.Velux."+name+".reed", "", {
              "name": "reed",
              "role": "",
              "type": "string",
              "desc": "Speichert den Pfad zum Objekt für den reed-Kontakt.",
              "def": "",
              "read": true,
              "write": true
          });
          console.log("Objekt reed für Rolladen "+name+" erstellt.");
      
          createState("javascript.0.Velux."+name+".action", "", {
              "name": "action",
              "role": "",
              "type": "string",
              "desc": "Befehl an den Rolladen.",
              "def": false,
              "read": true,
              "write": true
          });
          console.log("Objekt action für Rolladen "+name+" erstellt.");
      
          createState("javascript.0.Velux."+name+".lastaction", "", {
              "name": "lastaction",
              "role": "",
              "type": "string",
              "desc": "Letzter Befehl an den Rolladen.",
              "def": "",
              "read": true,
              "write": true
          });
          console.log("Objekt lastaction für Rolladen "+name+" erstellt.");
      
          createState("javascript.0.Velux."+name+".lastaction_time", "", {
              "name": "lastaction_time",
              "role": "",
              "type": "string",
              "desc": "Zeitpunkt der letzten Änderung.",
              "def": "",
              "read": true,
              "write": true
          });
          console.log("Objekt lastaction_time für Rolladen "+name+" erstellt.");
      }
      
      //createRolladen("og_bad");
      //createRolladen("og_empore");
      // viele weitere Velux Geräte...
      
      
      
      function moveVelux(idTarget, action, target_position){
          var deviceType = getState(idTarget+"deviceType").val;
      
          // Fensterkontakt
          var idReed = getState(idTarget+"reed").val;
          if(idReed != ""){
              if(getState(idReed).val == true){
                  console.log("Reed Kontakt sagt offen. => Abbruch");
                  return(false);
              }
          }
      
          if(deviceType == 0){ // DachRolladen
              var device_open = dr_o;
              var device_middle = dr_m;
              var device_close = dr_c;
          }
          if(deviceType == 1){ // FensterRolladen
              var device_open = wr_o;
              var device_middle = wr_m;
              var device_close = wr_c;
          }
          if(deviceType == 2){ // Fenster 
              var device_open = w_o;
              var device_middle = w_m;
              var device_close = w_c;
          }
          
      
          var oldPosition = getState(idTarget+"position").val;
          // Percent per Second berechnen
          var pps = 100 / getState(idTarget+"runtime").val;
          var seconds;
      
          var time = formatDate(new Date(), "YYYY-MM-DD hh:mm:ss");
      
          if(target_position == ""){ // Es wurde keine Ziel-Position geliefert wir gehen einfach in den modus open/stop/close
              setState(idTarget+"lastaction", action);
              // console.log(action + " für das Target "+idTarget+action);
              //console.log("Aktuelle Pos.: "+getState(idTarget+"position").val);
      
              if(action == "open"){
                  // Berechne die Laufzeit bis zum Ziel von 0%
                  seconds = oldPosition / pps;
                  //console.log("Das Ding braucht "+seconds+" Sekunden von der aktuellen Pos. bis 0%.");
              }
              if(action == "close"){
                  // Berechne die Laufzeit bis zum Ziel von 100%
                  seconds = (100 - oldPosition) / pps;
                  //console.log("Das Ding braucht "+seconds+" Sekunden von der aktuellen Pos. bis 100%.");
              }
              if(action == "stop"){
                  seconds = 0;
              }
          }else{
              // Es wurde eine Ziel-Position übergeben wir ignorieren alles andere.
              //console.log("Ziel-Position erkannt: "+target_position);
              // Datenpunkt auf -1 setzen damit er neue Werte Bemerkt.
              setState(idTarget+"target_position", -1);
              if(oldPosition >= target_position){
                  // Rolladen muss Richtung 0% fahren
                  seconds = (oldPosition - target_position) / pps;
                  var action = "open";        
              }else{
                  // Rolladen muss Richtung 100% fahren
                  seconds = (target_position - oldPosition) / pps;
                  var action = "close";
              }
          }
      
          if(action == "open"){
              setState(idTarget+"lastaction_time", time);
              console.log("Rolladen "+idTarget+" Klick auf OPEN");
              setState(getState(idTarget+"open").val, true);
          }
          if(action == "close"){
              setState(idTarget+"lastaction_time", time);
              console.log("Rolladen "+idTarget+" Klick auf CLOSE");
              setState(getState(idTarget+"close").val, true);
          }
          if(action == "stop"){
              setState(idTarget+"lastaction_time", time);
              console.log("Rolladen "+idTarget+" Klick auf STOP");
              setState(getState(idTarget+"stop").val, true);
          }
      
          seconds = Math.round(seconds);
          var i = 0;
          var newPosition = oldPosition;
      
          if(action == "open" || action == "close"){
              //console.log("Wir starten von Pos. " + newPosition + " und gehen in den Interval.");
              let interval = setInterval(function(){
                  //console.log("Noch "+i+"/"+seconds+" Sekunden. newPosition: "+newPosition);
                  i++;
                  if(action == "open"){
                      newPosition = newPosition - pps;
                  }
                  if(action == "close"){
                      newPosition = newPosition + pps;
                  }
                  if(i >= seconds || getState(idTarget+"lastaction").val == "stop"){
                      //console.log("####### ENDE #######");
                      //console.log("newPosition für "+idTarget+"position = "+Math.round(newPosition));
                      if(target_position != ""){
                          console.log("Rolladen "+idTarget+" Klick auf STOP");
                          setState(getState(idTarget+"stop").val, true);
                          //console.log("Bewegung wegen erreichter target_position gestoppt.");
                      }
                      clearInterval(interval);
                  }
                  if(newPosition >100 || newPosition < 0){ // Irgendwas ist schief gegangen, daher Intervall stoppen.
                      clearInterval(interval);
                  }
                  setState(idTarget+"position", Math.round(newPosition));
                  if(newPosition <= 10){
                      setState(idTarget+"icon",device_open);
                  }
                  if(newPosition > 10 && newPosition < 90 ){
                      setState(idTarget+"icon",device_middle);
                  }
                  if(newPosition >= 90){
                      setState(idTarget+"icon",device_close);
                  }
              }, 1000);
          }
      }
      
      
      // Beobachte alle Velux Geräte auf Wunsch-Ziel-Position-Änderungen
      on(og_bad+"target_position", function(obj) {  
          if(obj.state.val > obj.oldState.val){
              var target_position = getState(og_bad+"target_position").val;
              wait(500);
              //console.log("Wir gehen in den TargetModus mit: "+target_position);
              moveVelux(og_bad, "", target_position);
          }
      });
      on(og_empore+"target_position", function(obj) {  
          if(obj.state.val > obj.oldState.val){
              var target_position = getState(og_empore+"target_position").val;
              wait(500);
              //console.log("Wir gehen in den TargetModus mit: "+target_position);
              moveVelux(og_empore, "", target_position);
          }
      });
      // viele weitere Velux Geräte...
      
      
      
      // ##################################################### //
      // Beobachte alle Velux Geräte auf Wunsch-Action-Änderungen
      on(og_bad+"action", function(obj) {  
          var action = getState(og_bad+"action").val;
          setState(og_bad+"action", "");
          wait(500);
          if( action == "open" || action == "close" || action == "stop" ){ 
              //console.log("moveVelux mit der action: "+action);
              moveVelux(og_bad, action, "");
          } 
      });
      on(og_empore+"action", function(obj) {  
          var action = getState(og_empore+"action").val;
          setState(og_empore+"action", "");
          wait(500);
          if( action == "open" || action == "close" || action == "stop" ){ 
              //console.log("moveVelux mit der action: "+action);
              moveVelux(og_empore, action, "");
          } 
      });
      // viele weitere Velux Geräte...
      
      
      posted in Praktische Anwendungen (Showcase)
      T
      tristan
    • Viele Velux-Empfänger steuern mit 3x I2C-GPIO am NodeMCU

      Hallo Zusammen,

      auf Basis der Anleitung von @Allodo habe ich mit einem NodeMCU ESP8266 und einem Relais-Board mit Hilfe von Tasmota im nu einen Velux Rollladen steuern können.

      Jetzt möchte ich aber 8 Rollläden steuern und jeder braucht 3 Kanäle (open, close, stop) also brauche ich 24 I/Os.

      Kein Problem mit den GPIO-Erweiterungen PCF8574.

      Aber...

      Ist dann Tasmota noch das Richtige? Ich habe irgendwo gelesen, dass damit nur zwei I2Cs gesteuert werden können.

      Ich habe für den ESP noch nichts selbst geschrieben, bisher nur Tasmota Weboberfläche-Erfahrung. Aber mit den Konsole-Befehlen:

      I2cDriver2 1
      I2Cscan

      komme ich nicht weiter und stehe irgendwie wie der Ochs vorm Berg und würde mich über einen Stoß in die richtige Richtung freuen.

      VG Tristan

      posted in ioBroker Allgemein
      T
      tristan
    • RE: Viele Velux-Empfänger steuern mit 3x I2C-GPIO am NodeMCU

      Zur Vollständigkeit – hier das Ergebnis von dem Projekt: https://forum.iobroker.net/topic/41621/hardware-für-8-und-mehr-velux-somfi-geräte

      posted in ioBroker Allgemein
      T
      tristan

    Latest posts made by tristan

    • RE: Sonos Zustand auslesen und abends wieder einspielen

      Tatsächlich keiner außer mir den Bedarf? 😢

      posted in Skripten / Logik
      T
      tristan
    • RE: Adapter für VELUX KLF-200 Interface

      Ich möchte an dieser Stelle nochmal motivieren den Velux IT Versagern kein weiteres Geld in den Rachen zu werfen für zukunftssichere-NOT Produkte wie KLF-200.

      Die mitgelieferten Fernbedienungen können quasi alles was man braucht. Meine Datenpunkte habe ich hier mal gezeigt https://forum.iobroker.net/topic/41621/hardware-für-8-und-mehr-velux-somfi-geräte

      Die Positionen regel ich über den Paramter in dem ich speichere, wie lang der Rolladen für eine Fahrt braucht. Zusätzlich zur KLF-200 Lösung habe ich gleich noch einen Pfad zum Fensterkontakt eingebaut, der die Dachfenster Rolladen stoppt, falls ein Fenster offen ist.

      Mein Script ergänze ich im oben verlinkten Thread.

      posted in Tester
      T
      tristan
    • Sonos Zustand auslesen und abends wieder einspielen

      huhu,

      ich höre nachts über meine Sonos Hörbücher. Morgens lasse ich mich über das Radio wecken. Abends muss ich wieder aufwendig mein Hörbuch von letzter Nacht suchen und den richtigen Track. 😖

      Ich würde gerne nachts um 3 Uhr alle States abspeichern und abends um 18 Uhr wieder reinladen.
      Funktioniert alles. Nur Sonos interessierts nen Schei* 🤷‍♂️

      Mit set_favorite möchte ich nicht arbeiten, weil ich keine Lust habe jeden zweiten Abend das neue Hörbuch als Favorit eintragen zu müssen.

      Müsste das Vorhaben funktionieren und ich mache nur was falsch? Oder geht das garnicht?

      VG!

      posted in Skripten / Logik
      T
      tristan
    • Eingestellte Weckzeit aus Sonos auslesen

      Hello,

      ich hatte gerade die Idee 5 Minuten vor dem eingestellten Wecker den Rolladen zu öffnen. Ich stelle meinen Wecker in der Sonos APP. Kann es sein, dass es dafür keinen Datenpunkt in sonos.0.root.192_168_10_23 gibt?

      Ich weiß – ich könnte mir auch einen Wecker im VIS bauen. Ich würde aber gerne erstmal "nur" die eingestellte Weckzeit sonos.0.root.192_168_10_23 auslesen.

      Freue mich auf Euren Input.
      Tristan

      posted in Skripten / Logik
      T
      tristan
    • RE: Viele Velux-Empfänger steuern mit 3x I2C-GPIO am NodeMCU

      Zur Vollständigkeit – hier das Ergebnis von dem Projekt: https://forum.iobroker.net/topic/41621/hardware-für-8-und-mehr-velux-somfi-geräte

      posted in ioBroker Allgemein
      T
      tristan
    • RE: anonymous warning – finde das Problem nicht

      Ah! Habs gefunden! Einen vorangegangenen ERROR gab es ja nicht. Das Problem war auch nicht der Datenpunkt javascript.0.Velux.og_bad.stop – dort habe ich auch dauernd gesucht.

      Mein "Problem" war der Datenpunkt des sonoff, der in og_bad.stop abgelegt war. Der war auf Logikwert gestellt und dann sollte ich natürlich auch ein true oder false senden und nicht ein "true" oder "false". 😄

      setState("sonoff.0.DVES_F4D7C4.POWER11", true); // LÄUFT ohne WARN
      
      setState("sonoff.0.DVES_F4D7C4.POWER11", "true"); // LÄUFT mit WARN
      

      Der Wald und die Bäume... 😄

      VG!

      posted in JavaScript
      T
      tristan
    • RE: anonymous warning – finde das Problem nicht

      Also die "ganze" Zeile der Warnung lautet:

      16:03:19.589	info	javascript.0 (8354) script.js.Production.Dachfenster: Rolladen javascript.0.Velux.og_bad. Klick auf STOP
      16:03:19.602	warn	javascript.0 (8354) at moveVelux (script.js.Production.Dachfenster:288:9)
      16:03:19.602	warn	javascript.0 (8354) at Object.<anonymous> (script.js.Production.Dachfenster:390:9)
      

      Im on() habe ich den Aufruf der function

      moveVelux(og_bad, action,"");
      

      Ich übergebe die const der Ziel-ID (og_bad) mit dem String "javascript.0.Velux.og_bad." und die var "action" in der der String "stop" steht. Das dritte Argument ist hier leer.

      In meiner function

      function moveVelux(idTarget, action, target_position){
      //...
      // andere Sachen
      //...
      
          if(action == "stop"){
              setState(idTarget+"lastaction_time", time);
              console.log("Rolladen "+idTarget+" Klick auf STOP");
              setState(getState(idTarget+"stop").val, "true");
          }
      

      Ausformuliert wird daraus getState("javascript.0.Velux.og_bad.stop").val was mir sonoff.0.DVES_F4D7C4.POWER11 liefert, das auf true gesetzt wird – was auch funktioniert. Aber irgendwo scheint ihm ein Format nicht zu passen, oder so.

      Am Ende macht die Zeile folgendes:

      setState("sonoff.0.DVES_F4D7C4.POWER11", true); 
      

      VG!

      posted in JavaScript
      T
      tristan
    • anonymous warning – finde das Problem nicht

      Hello,

      ich bekomme bei meinem Script die Warnung:

      16:03:19.589	info	javascript.0 (8354) script.js.Production.Dachfenster: Rolladen javascript.0.Velux.og_bad. Klick auf STOP
      16:03:19.602	warn	javascript.0 (8354) at moveVelux (script.js.Production.Dachfenster:288:9)
      16:03:19.602	warn	javascript.0 (8354) at Object.<anonymous> (script.js.Production.Dachfenster:390:9)
      

      an der Stelle steht

          if(action == "stop"){
              setState(idTarget+"lastaction_time", time);
              console.log("Rolladen "+idTarget+" Klick auf STOP");
              setState(getState(idTarget+"stop").val, "true");    // Zeile 288
          }
      

      Logisch, hab ich bestimmt einen Fehler beim Anlegen des State gemacht...

          createState("javascript.0.Velux."+name+".stop", "", {
              "name": "stop",
              "role": "",
              "type": "string",
              "desc": "Speichert den Pfad zum Objekt für die Aktion: stop.",
              "def": "",
              "read": true,
              "write": true
          });
      
      // Inhalt: sonoff.0.DVES_F4D7C4.POWER17
      

      Aber der type ist korrekt als string angelegt...

      Folgend auch nochmal mein komplettes JavaScript:

      const og_empore         = "javascript.0.Velux.og_empore.";
      const og_balkon         = "javascript.0.Velux.og_balkon.";
      const dg_duschefenster  = "javascript.0.Velux.dg_duschefenster.";
      const og_bad            = "javascript.0.Velux.og_bad.";
      const dg_treppe         = "javascript.0.Velux.dg_treppe.";
      const dg_bett           = "javascript.0.Velux.dg_bett.";
      const dg_bad            = "javascript.0.Velux.dg_bad.";
      const dg_dusche         = "javascript.0.Velux.dg_dusche.";
      
      const dr_o = "/vis.0/main/dg_rolladen_open.svg";
      const dr_m = "/vis.0/main/dg_rolladen_middle.svg";
      const dr_c = "/vis.0/main/dg_rolladen_close.svg";
      
      const wr_o = "/vis.0/main/fenster_rolladen_open.svg";
      const wr_m = "/vis.0/main/fenster_rolladen_middle.svg";
      const wr_c = "/vis.0/main/fenster_rolladen_close.svg";
      
      const w_o = "/vis.0/main/dg_window_open.svg";
      const w_m = "/vis.0/main/dg_window_middle.svg";
      const w_c = "/vis.0/main/dg_window_close.svg";
      
      
      function createRolladen_DISABLED(name){
          createState("javascript.0.Velux."+name+".position", "", {
              "name": "position",
              "role": "",
              "type": "number",
              "desc": "Position des Rolladen in % (0% ist offen).",
              "unit": "%",
              "min": 0,
              "max": 100,
              "def": 0,
              "read": true,
              "write": true
          });
          console.log("Objekt close für Rolladen "+name+" erstellt.");
      
          createState("javascript.0.Velux."+name+".target_position", "", {
              "name": "target_position",
              "role": "",
              "type": "number",
              "desc": "Wunsch-Position des Rolladen in % (0% ist offen).",
              "unit": "%",
              "min": 0,
              "max": 100,
              "def": 0,
              "read": true,
              "write": true
          });
          console.log("Objekt target_position für Rolladen "+name+" erstellt.");
      
          createState("javascript.0.Velux."+name+".runtime", 0, {
              "name": "runtime",
              "role": "",
              "type": "number",
              "desc": "Gibt in Sekunden an wie lange der Rolladen für einen kompletten Lauf benötigt ",
              "unit": "s",
              "min": 0,
              "max": 1000,
              "def": 15,
              "read": true,
              "write": true
          });
          console.log("Objekt runtime für Rolladen "+name+" erstellt.");
      
          createState("javascript.0.Velux."+name+".icon", "", {
              "name": "icon",
              "role": "",
              "type": "string",
              "desc": "Speichert den Icon-Namen zur Position.",
              "def": "open",
              "read": true,
              "write": true
          });
          console.log("Objekt icon für Rolladen "+name+" erstellt.");
      
          // Hier muss noch geprüft werden.
          createState("javascript.0.Velux."+name+".deviceType", "", {
              "name": "deviceType",
              "role": "",
              "type": "state",
              "desc": "Speichert den Icon-Namen zur Position.",
              "def": "0",
              "read": true,
              "write": true,
              "states": {
                  "0": "DachRolladen",
                  "1": "FensterRolladen",
                  "2": "Fenster"
              }
          });
          console.log("Objekt deviceType für Device "+name+" erstellt.");
      
          createState("javascript.0.Velux."+name+".open", "", {
              "name": "open",
              "role": "",
              "type": "string",
              "desc": "Speichert den Pfad zum Objekt für die Aktion: open.",
              "def": "",
              "read": true,
              "write": true
          });
          console.log("Objekt open für Rolladen "+name+" erstellt.");
      
          createState("javascript.0.Velux."+name+".stop", "", {
              "name": "stop",
              "role": "",
              "type": "string",
              "desc": "Speichert den Pfad zum Objekt für die Aktion: stop.",
              "def": "",
              "read": true,
              "write": true
          });
          console.log("Objekt stop für Rolladen "+name+" erstellt.");
      
          createState("javascript.0.Velux."+name+".close", "", {
              "name": "close",
              "role": "",
              "type": "string",
              "desc": "Speichert den Pfad zum Objekt für die Aktion: close.",
              "def": "",
              "read": true,
              "write": true
          });
          console.log("Objekt close für Rolladen "+name+" erstellt.");
      
          createState("javascript.0.Velux."+name+".action", "", {
              "name": "action",
              "role": "",
              "type": "string",
              "desc": "Befehl an den Rolladen.",
              "def": false,
              "read": true,
              "write": true
          });
          console.log("Objekt action für Rolladen "+name+" erstellt.");
      
          createState("javascript.0.Velux."+name+".lastaction", "", {
              "name": "lastaction",
              "role": "",
              "type": "string",
              "desc": "Letzter Befehl an den Rolladen.",
              "def": "",
              "read": true,
              "write": true
          });
          console.log("Objekt lastaction für Rolladen "+name+" erstellt.");
      
          createState("javascript.0.Velux."+name+".lastaction_time", "", {
              "name": "lastaction_time",
              "role": "",
              "type": "string",
              "desc": "Zeitpunkt der letzten Änderung.",
              "def": "",
              "read": true,
              "write": true
          });
          console.log("Objekt lastaction_time für Rolladen "+name+" erstellt.");
      }
      
      //createRolladen("og_empore");
      //createRolladen("og_balkon");
      //createRolladen("dg_duschefenster");
      //createRolladen("og_bad");
      //createRolladen("dg_treppe");
      //createRolladen("dg_bett");
      //createRolladen("dg_bad");
      //createRolladen("dg_dusche");
      
      
      /*
      og_empore
      open: sonoff.0.DVES_F4D7C4.POWER1
      stop: sonoff.0.DVES_F4D7C4.POWER2
      close: sonoff.0.DVES_F4D7C4.POWER3
      
      og_balkon
      open: sonoff.0.DVES_F4D7C4.POWER4
      stop: sonoff.0.DVES_F4D7C4.POWER5
      close: sonoff.0.DVES_F4D7C4.POWER6
      
      dg_duschefenster
      open: sonoff.0.DVES_F4D7C4.POWER7
      stop: sonoff.0.DVES_F4D7C4.POWER8
      close: sonoff.0.DVES_F4D7C4.POWER9
      
      og_bad
      open: sonoff.0.DVES_F4D7C4.POWER10
      stop: sonoff.0.DVES_F4D7C4.POWER11
      close: sonoff.0.DVES_F4D7C4.POWER12
      
      og_treppe
      open: sonoff.0.DVES_F4D7C4.POWER13
      stop: sonoff.0.DVES_F4D7C4.POWER14
      close: sonoff.0.DVES_F4D7C4.POWER15
      
      dg_bett
      open: sonoff.0.DVES_F4D7C4.POWER16
      stop: sonoff.0.DVES_F4D7C4.POWER17
      close: sonoff.0.DVES_F4D7C4.POWER18
      
      dg_bad
      open: sonoff.0.DVES_F4D7C4.POWER19
      stop: sonoff.0.DVES_F4D7C4.POWER20
      close: sonoff.0.DVES_F4D7C4.POWER21
      
      dg_dusche
      open: sonoff.0.DVES_F4D7C4.POWER22
      stop: sonoff.0.DVES_F4D7C4.POWER23
      close: sonoff.0.DVES_F4D7C4.POWER24
      */
      
      
      function moveVelux(idTarget, action, target_position){
          var deviceType = getState(idTarget+"deviceType").val;
      
          if(deviceType == 0){ // DachRolladen
              var device_open = dr_o;
              var device_middle = dr_m;
              var device_close = dr_c;
          }
          if(deviceType == 1){ // FensterRolladen
              var device_open = wr_o;
              var device_middle = wr_m;
              var device_close = wr_c;
          }
          if(deviceType == 2){ // Fenster
              var device_open = w_o;
              var device_middle = w_m;
              var device_close = w_c;
          }
          
      
          var oldPosition = getState(idTarget+"position").val;
          // Percent per Second berechnen
          var pps = 100 / getState(idTarget+"runtime").val;
          var seconds;
          // display the current time
          var dateTime = new Date();
          var time = dateTime.toLocaleTimeString();
          //console.log(time);
      
          if(target_position == ""){ // Es wurde keine Ziel-Position geliefert wir gehen einfach in den modus open/stop/close
              setState(idTarget+"lastaction", action);
              // console.log(action + " für das Target "+idTarget+action);
              //console.log("Aktuelle Pos.: "+getState(idTarget+"position").val);
      
              if(action == "open"){
                  // Berechne die Laufzeit bis zum Ziel von 0%
                  seconds = oldPosition / pps;
                  console.log("Das Ding braucht "+seconds+" Sekunden von der aktuellen Pos. bis 0%.");
              }
              if(action == "close"){
                  // Berechne die Laufzeit bis zum Ziel von 100%
                  seconds = (100 - oldPosition) / pps;
                  console.log("Das Ding braucht "+seconds+" Sekunden von der aktuellen Pos. bis 100%.");
              }
              if(action == "stop"){
                  seconds = 0;
              }
          }else{
              // Es wurde eine Ziel-Position übergeben wir ignorieren alles andere.
              console.log("Ziel-Position erkannt: "+target_position);
              if(oldPosition >= target_position){
                  // Rolladen muss Richtung 0% fahren
                  seconds = (oldPosition - target_position) / pps;
                  var action = "open";        
              }else{
                  // Rolladen muss Richtung 100% fahren
                  seconds = (target_position - oldPosition) / pps;
                  var action = "close";
              }
          }
      
          if(action == "open"){
              setState(idTarget+"lastaction_time", time);
              console.log("Rolladen "+idTarget+" Klick auf OPEN");
              setState(getState(idTarget+"open").val, "true");
          }
          if(action == "close"){
              setState(idTarget+"lastaction_time", time);
              console.log("Rolladen "+idTarget+" Klick auf CLOSE");
              setState(getState(idTarget+"close").val, true);
          }
          if(action == "stop"){
              setState(idTarget+"lastaction_time", time);
              console.log("Rolladen "+idTarget+" Klick auf STOP");
              setState(getState(idTarget+"stop").val, "true");
          }
      
          seconds = Math.round(seconds);
          var i = 0;
          var newPosition = oldPosition;
      
          if(action == "open" || action == "close"){
              console.log("Wir starten von Pos. " + newPosition + " und gehen in den Interval.");
              let interval = setInterval(function(){
                  console.log("Noch "+i+"/"+seconds+" Sekunden. newPosition: "+newPosition);
                  i++;
                  if(action == "open"){
                      newPosition = newPosition - pps;
                  }
                  if(action == "close"){
                      newPosition = newPosition + pps;
                  }
                  if(i >= seconds || getState(idTarget+"lastaction").val == "stop"){
                      console.log("####### ENDE #######");
                      console.log("newPosition für "+idTarget+"position = "+Math.round(newPosition));
                      if(target_position != ""){
                          console.log("Rolladen "+idTarget+" Klick auf STOP");
                          setState(getState(idTarget+"stop").val, "true");
                          console.log("Bewegung wegen erreichter target_position gestoppt.");
                      }
                      clearInterval(interval);
                  }
                  if(newPosition >100 || newPosition < 0){ // Irgendwas ist schief gegangen, daher Intervall stoppen.
                      clearInterval(interval);
                  }
                  setState(idTarget+"position", Math.round(newPosition));
                  if(newPosition <= 10){
                      setState(idTarget+"icon",device_open);
                  }
                  if(newPosition > 10 && newPosition < 90 ){
                      setState(idTarget+"icon",device_middle);
                  }
                  if(newPosition >= 90){
                      setState(idTarget+"icon",device_close);
                  }
              }, 1000);
          }
      }
      
      
      // Beobachte alle Velux Geräte auf Wunsch-Ziel-Position-Änderungen
      on(og_bad+"target_position", function(obj) {  
          var target_position = getState(og_bad+"target_position").val;
          wait(500);
          console.log("Wir gehen in den TargetModus mit: "+target_position);
          moveVelux(og_bad, "", target_position);
      });
      on(og_empore+"target_position", function(obj) {  
          var target_position = getState(og_empore+"target_position").val;
          wait(500);
          console.log("Wir gehen in den TargetModus mit: "+target_position);
          moveVelux(og_empore, "", target_position);
      });
      on(og_balkon+"target_position", function(obj) {  
          var target_position = getState(og_balkon+"target_position").val;
          wait(500);
          console.log("Wir gehen in den TargetModus mit: "+target_position);
          moveVelux(og_balkon, "", target_position);
      });
      on(dg_treppe+"target_position", function(obj) {  
          var target_position = getState(dg_treppe+"target_position").val;
          wait(500);
          console.log("Wir gehen in den TargetModus mit: "+target_position);
          moveVelux(dg_treppe, "", target_position);
      });
      on(dg_bett+"target_position", function(obj) {  
          var target_position = getState(dg_bett+"target_position").val;
          wait(500);
          console.log("Wir gehen in den TargetModus mit: "+target_position);
          moveVelux(dg_bett, "", target_position);
      });
      on(dg_bad+"target_position", function(obj) {  
          var target_position = getState(dg_bad+"target_position").val;
          wait(500);
          console.log("Wir gehen in den TargetModus mit: "+target_position);
          moveVelux(dg_bad, "", target_position);
      });
      on(dg_dusche+"target_position", function(obj) {  
          var target_position = getState(dg_dusche+"target_position").val;
          wait(500);
          console.log("Wir gehen in den TargetModus mit: "+target_position);
          moveVelux(dg_dusche, "", target_position);
      });
      on(dg_duschefenster+"target_position", function(obj) {  
          var target_position = getState(dg_duschefenster+"target_position").val;
          wait(500);
          console.log("Wir gehen in den TargetModus mit: "+target_position);
          moveVelux(dg_duschefenster, "", target_position);
      });
      
      // Beobachte alle Velux Geräte auf Wunsch-Action-Änderungen
      on(og_bad+"action", function(obj) {  
          var action = getState(og_bad+"action").val;
          setState(og_bad+"action", "");
          wait(500);
          if( action == "open" || action == "close" || action == "stop" ){ 
              console.log("moveVelux mit der action: "+action);
              moveVelux(og_bad, action,"");
          } 
      });
      on(og_empore+"action", function(obj) {  
          var action = getState(og_empore+"action").val;
          setState(og_empore+"action", "");
          wait(500);
          if( action == "open" || action == "close" || action == "stop" ){ 
              console.log("moveVelux mit der action: "+action);
              moveVelux(og_empore, action,"");
          } 
      });
      on(og_balkon+"action", function(obj) {  
          var action = getState(og_balkon+"action").val;
          setState(og_balkon+"action", "");
          wait(500);
          if( action == "open" || action == "close" || action == "stop" ){ 
              console.log("moveVelux mit der action: "+action);
              moveVelux(og_balkon, action,"");
          } 
      });
      on(dg_treppe+"action", function(obj) {  
          var action = getState(dg_treppe+"action").val;
          setState(dg_treppe+"action", "");
          wait(500);
          if( action == "open" || action == "close" || action == "stop" ){ 
              console.log("moveVelux mit der action: "+action);
              moveVelux(dg_treppe, action, "");
          } 
      });
      on(dg_bett+"action", function(obj) {  
          var action = getState(dg_bett+"action").val;
          setState(dg_bett+"action", "");
          wait(500);
          if( action == "open" || action == "close" || action == "stop" ){ 
              console.log("moveVelux mit der action: "+action);
              moveVelux(dg_bett, action,"");
          } 
      });
      on(dg_bad+"action", function(obj) {  
          var action = getState(dg_bad+"action").val;
          setState(dg_bad+"action", "");
          wait(500);
          if( action == "open" || action == "close" || action == "stop" ){ 
              console.log("moveVelux mit der action: "+action);
              moveVelux(dg_bad, action,"");
          } 
      });
      on(dg_dusche+"action", function(obj) {  
          var action = getState(dg_dusche+"action").val;
          setState(dg_dusche+"action","");
          wait(500);
          if( action == "open" || action == "close" || action == "stop" ){ 
              console.log("moveVelux mit der action: "+action);
              moveVelux(dg_dusche, action,"");
          } 
      });
      on(dg_duschefenster+"action", function(obj) {  
          var action = getState(dg_duschefenster+"action").val;
          setState(dg_duschefenster+"action", "");
          wait(500);
          if( action == "open" || action == "close" || action == "stop" ){ 
              console.log("moveVelux mit der action: "+action);
              moveVelux(dg_duschefenster, action,"");
          } 
      });
      

      Würde mich freuen, wenn jemand einen Tipp für mich hat.

      VG!

      posted in JavaScript
      T
      tristan
    • Hardware für 8 und mehr Velux/Somfi Geräte

      Hallo Zusammen,

      ich hatte mal Bock was mit einem NodeMCU zusammen zu bauen und habe es zum Anlass genommen endlich mal meine Velux-Rolläden in meinen ioBroker zu integrieren. Und zwar ohne mich von Velux weiter veräppeln zu lassen mit KLF-200-Firmware-Updates oder irgendwelchen teueren nicht-smarten INTEGRA-Produkten.

      Dazu habe ich 3x Relais-Boards mit drei I/O-Extension-Boards an einen NodeMCU angeschlossen (~40EUR).
      Die 8 INTEGRA Fernbedienungen habe ich gestapelt und an die Relais angeschlossen. Versorgt werden sie über den 3V Ausgang vom NodeMCU. Versorgt wird das Ganze über ein USB Ladegerät.

      Ich nennen das Projekt F**K-YOU-VELUX-Stack.

      Die Einbindung habe ich über Tasmota gemacht, eine großartige Firmware. Erkennt automatisch die I/O-Extensions und stellt jeden Kontakt als MQTT zur Verfügung.

      Macht richtig Spaß dem Klackern der Relais zu lauschen. 😄

      f--k_you_Velux_Stack-2.jpg

      Loetpunkte-Velux-INTEGRA-KLI-2_.png

      screenshot-device.png

      VG Tristan

      const og_bad            = "javascript.0.Velux.og_bad.";
      const og_empore         = "javascript.0.Velux.og_empore.";
      // viele weitere Velux Geräte...
      
      const dr_o = "/vis.0/main/dg_rolladen_open.svg";
      const dr_m = "/vis.0/main/dg_rolladen_middle.svg";
      const dr_c = "/vis.0/main/dg_rolladen_close.svg";
      
      const wr_o = "/vis.0/main/fenster_rolladen_open.svg";
      const wr_m = "/vis.0/main/fenster_rolladen_middle.svg";
      const wr_c = "/vis.0/main/fenster_rolladen_close.svg";
      
      const w_o = "/vis.0/main/dg_window_close.svg"; // ACHTUNG! Invertierung wegen 100% Velux UI-FUCK
      const w_m = "/vis.0/main/dg_window_middle.svg";
      const w_c = "/vis.0/main/dg_window_open.svg"; // ACHTUNG! Invertierung wegen 100% Velux UI-FUCK
      
      
      function createRolladen(name){
          createState("javascript.0.Velux."+name+".position", "", {
              "name": "position",
              "role": "",
              "type": "number",
              "desc": "Position des Rolladen in % (0% ist offen).",
              "unit": "%",
              "min": 0,
              "max": 100,
              "def": 0,
              "read": true,
              "write": true
          });
          console.log("Objekt close für Rolladen "+name+" erstellt.");
      
          createState("javascript.0.Velux."+name+".target_position", "", {
              "name": "target_position",
              "role": "",
              "type": "number",
              "desc": "Wunsch-Position des Rolladen in % (0% ist offen).",
              "unit": "%",
              "min": -1,
              "max": 100,
              "def": 0,
              "read": true,
              "write": true
          });
          console.log("Objekt target_position für Rolladen "+name+" erstellt.");
      
          createState("javascript.0.Velux."+name+".runtime", 0, {
              "name": "runtime",
              "role": "",
              "type": "number",
              "desc": "Gibt in Sekunden an wie lange der Rolladen für einen kompletten Lauf benötigt ",
              "unit": "s",
              "min": 0,
              "max": 1000,
              "def": 15,
              "read": true,
              "write": true
          });
          console.log("Objekt runtime für Rolladen "+name+" erstellt.");
      
          createState("javascript.0.Velux."+name+".icon", "",  {
              "name": "icon",
              "role": "",
              "type": "string",
              "desc": "Speichert den Icon-Namen zur Position.",
              "def": "open",
              "read": true,
              "write": true
          });
          console.log("Objekt icon für Rolladen "+name+" erstellt.");
      
          // Hier muss noch geprüft werden, was sein Problem mit dem Type in Common ist...
          createState("javascript.0.Velux."+name+".deviceType", 0,  {
              "name": "deviceType",
              "role": "",
              "type": "state",
              "desc": "Speichert den Icon-Namen zur Position.",
              "def": 0,
              "read": true,
              "write": true,
              "states": {
                  0: "DachRolladen",
                  1: "FensterRolladen",
                  2: "Fenster"
              }
          });
          console.log("Objekt deviceType für Device "+name+" erstellt.");
      
          createState("javascript.0.Velux."+name+".open", "", {
              "name": "open",
              "role": "",
              "type": "string",
              "desc": "Speichert den Pfad zum Objekt für die Aktion: open.",
              "def": "",
              "read": true,
              "write": true
          });
          console.log("Objekt open für Rolladen "+name+" erstellt.");
      
          createState("javascript.0.Velux."+name+".stop", "", {
              "name": "stop",
              "role": "",
              "type": "string",
              "desc": "Speichert den Pfad zum Objekt für die Aktion: stop.",
              "def": "",
              "read": true,
              "write": true
          });
          console.log("Objekt stop für Rolladen "+name+" erstellt.");
      
          createState("javascript.0.Velux."+name+".close", "", {
              "name": "close",
              "role": "",
              "type": "string",
              "desc": "Speichert den Pfad zum Objekt für die Aktion: close.",
              "def": "",
              "read": true,
              "write": true
          });
          console.log("Objekt close für Rolladen "+name+" erstellt.");
      
          createState("javascript.0.Velux."+name+".reed", "", {
              "name": "reed",
              "role": "",
              "type": "string",
              "desc": "Speichert den Pfad zum Objekt für den reed-Kontakt.",
              "def": "",
              "read": true,
              "write": true
          });
          console.log("Objekt reed für Rolladen "+name+" erstellt.");
      
          createState("javascript.0.Velux."+name+".action", "", {
              "name": "action",
              "role": "",
              "type": "string",
              "desc": "Befehl an den Rolladen.",
              "def": false,
              "read": true,
              "write": true
          });
          console.log("Objekt action für Rolladen "+name+" erstellt.");
      
          createState("javascript.0.Velux."+name+".lastaction", "", {
              "name": "lastaction",
              "role": "",
              "type": "string",
              "desc": "Letzter Befehl an den Rolladen.",
              "def": "",
              "read": true,
              "write": true
          });
          console.log("Objekt lastaction für Rolladen "+name+" erstellt.");
      
          createState("javascript.0.Velux."+name+".lastaction_time", "", {
              "name": "lastaction_time",
              "role": "",
              "type": "string",
              "desc": "Zeitpunkt der letzten Änderung.",
              "def": "",
              "read": true,
              "write": true
          });
          console.log("Objekt lastaction_time für Rolladen "+name+" erstellt.");
      }
      
      //createRolladen("og_bad");
      //createRolladen("og_empore");
      // viele weitere Velux Geräte...
      
      
      
      function moveVelux(idTarget, action, target_position){
          var deviceType = getState(idTarget+"deviceType").val;
      
          // Fensterkontakt
          var idReed = getState(idTarget+"reed").val;
          if(idReed != ""){
              if(getState(idReed).val == true){
                  console.log("Reed Kontakt sagt offen. => Abbruch");
                  return(false);
              }
          }
      
          if(deviceType == 0){ // DachRolladen
              var device_open = dr_o;
              var device_middle = dr_m;
              var device_close = dr_c;
          }
          if(deviceType == 1){ // FensterRolladen
              var device_open = wr_o;
              var device_middle = wr_m;
              var device_close = wr_c;
          }
          if(deviceType == 2){ // Fenster 
              var device_open = w_o;
              var device_middle = w_m;
              var device_close = w_c;
          }
          
      
          var oldPosition = getState(idTarget+"position").val;
          // Percent per Second berechnen
          var pps = 100 / getState(idTarget+"runtime").val;
          var seconds;
      
          var time = formatDate(new Date(), "YYYY-MM-DD hh:mm:ss");
      
          if(target_position == ""){ // Es wurde keine Ziel-Position geliefert wir gehen einfach in den modus open/stop/close
              setState(idTarget+"lastaction", action);
              // console.log(action + " für das Target "+idTarget+action);
              //console.log("Aktuelle Pos.: "+getState(idTarget+"position").val);
      
              if(action == "open"){
                  // Berechne die Laufzeit bis zum Ziel von 0%
                  seconds = oldPosition / pps;
                  //console.log("Das Ding braucht "+seconds+" Sekunden von der aktuellen Pos. bis 0%.");
              }
              if(action == "close"){
                  // Berechne die Laufzeit bis zum Ziel von 100%
                  seconds = (100 - oldPosition) / pps;
                  //console.log("Das Ding braucht "+seconds+" Sekunden von der aktuellen Pos. bis 100%.");
              }
              if(action == "stop"){
                  seconds = 0;
              }
          }else{
              // Es wurde eine Ziel-Position übergeben wir ignorieren alles andere.
              //console.log("Ziel-Position erkannt: "+target_position);
              // Datenpunkt auf -1 setzen damit er neue Werte Bemerkt.
              setState(idTarget+"target_position", -1);
              if(oldPosition >= target_position){
                  // Rolladen muss Richtung 0% fahren
                  seconds = (oldPosition - target_position) / pps;
                  var action = "open";        
              }else{
                  // Rolladen muss Richtung 100% fahren
                  seconds = (target_position - oldPosition) / pps;
                  var action = "close";
              }
          }
      
          if(action == "open"){
              setState(idTarget+"lastaction_time", time);
              console.log("Rolladen "+idTarget+" Klick auf OPEN");
              setState(getState(idTarget+"open").val, true);
          }
          if(action == "close"){
              setState(idTarget+"lastaction_time", time);
              console.log("Rolladen "+idTarget+" Klick auf CLOSE");
              setState(getState(idTarget+"close").val, true);
          }
          if(action == "stop"){
              setState(idTarget+"lastaction_time", time);
              console.log("Rolladen "+idTarget+" Klick auf STOP");
              setState(getState(idTarget+"stop").val, true);
          }
      
          seconds = Math.round(seconds);
          var i = 0;
          var newPosition = oldPosition;
      
          if(action == "open" || action == "close"){
              //console.log("Wir starten von Pos. " + newPosition + " und gehen in den Interval.");
              let interval = setInterval(function(){
                  //console.log("Noch "+i+"/"+seconds+" Sekunden. newPosition: "+newPosition);
                  i++;
                  if(action == "open"){
                      newPosition = newPosition - pps;
                  }
                  if(action == "close"){
                      newPosition = newPosition + pps;
                  }
                  if(i >= seconds || getState(idTarget+"lastaction").val == "stop"){
                      //console.log("####### ENDE #######");
                      //console.log("newPosition für "+idTarget+"position = "+Math.round(newPosition));
                      if(target_position != ""){
                          console.log("Rolladen "+idTarget+" Klick auf STOP");
                          setState(getState(idTarget+"stop").val, true);
                          //console.log("Bewegung wegen erreichter target_position gestoppt.");
                      }
                      clearInterval(interval);
                  }
                  if(newPosition >100 || newPosition < 0){ // Irgendwas ist schief gegangen, daher Intervall stoppen.
                      clearInterval(interval);
                  }
                  setState(idTarget+"position", Math.round(newPosition));
                  if(newPosition <= 10){
                      setState(idTarget+"icon",device_open);
                  }
                  if(newPosition > 10 && newPosition < 90 ){
                      setState(idTarget+"icon",device_middle);
                  }
                  if(newPosition >= 90){
                      setState(idTarget+"icon",device_close);
                  }
              }, 1000);
          }
      }
      
      
      // Beobachte alle Velux Geräte auf Wunsch-Ziel-Position-Änderungen
      on(og_bad+"target_position", function(obj) {  
          if(obj.state.val > obj.oldState.val){
              var target_position = getState(og_bad+"target_position").val;
              wait(500);
              //console.log("Wir gehen in den TargetModus mit: "+target_position);
              moveVelux(og_bad, "", target_position);
          }
      });
      on(og_empore+"target_position", function(obj) {  
          if(obj.state.val > obj.oldState.val){
              var target_position = getState(og_empore+"target_position").val;
              wait(500);
              //console.log("Wir gehen in den TargetModus mit: "+target_position);
              moveVelux(og_empore, "", target_position);
          }
      });
      // viele weitere Velux Geräte...
      
      
      
      // ##################################################### //
      // Beobachte alle Velux Geräte auf Wunsch-Action-Änderungen
      on(og_bad+"action", function(obj) {  
          var action = getState(og_bad+"action").val;
          setState(og_bad+"action", "");
          wait(500);
          if( action == "open" || action == "close" || action == "stop" ){ 
              //console.log("moveVelux mit der action: "+action);
              moveVelux(og_bad, action, "");
          } 
      });
      on(og_empore+"action", function(obj) {  
          var action = getState(og_empore+"action").val;
          setState(og_empore+"action", "");
          wait(500);
          if( action == "open" || action == "close" || action == "stop" ){ 
              //console.log("moveVelux mit der action: "+action);
              moveVelux(og_empore, action, "");
          } 
      });
      // viele weitere Velux Geräte...
      
      
      posted in Praktische Anwendungen (Showcase)
      T
      tristan
    • RE: Dialog mit Alexa auslösen

      @ente34 Das klingt schon etwas kreativer. 😃 Vielen Dank für die Idee.

      posted in Skripten / Logik
      T
      tristan
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo