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

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Blockly
  5. Blockly um Rollo zu blockieren?

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    3.6k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.2k

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.5k

Blockly um Rollo zu blockieren?

Geplant Angeheftet Gesperrt Verschoben Blockly
blockly
37 Beiträge 6 Kommentatoren 3.7k Aufrufe 5 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.
  • -Alex- 0- Offline
    -Alex- 0- Offline
    -Alex- 0
    schrieb am zuletzt editiert von -Alex- 0
    #4

    @biker1602
    wenn Du mit "True" steuerst, dann bedeutet das Knopfdruck.
    Also "True" ist ein gedrückter Knopf und "False" ist nicht gedrückt.

    1 Antwort Letzte Antwort
    0
    • B Offline
      B Offline
      biker1602
      schrieb am zuletzt editiert von biker1602
      #5

      Hallo
      Ich habe mich mit der Anleitung mal ein bisschen versucht es hinzubekommen aber es will irgendwie nicht gelingen.
      Ich habe erstmal alles vom Schreibtisch aus versucht den Türsensor noch nicht am Fenster verbaut und die eigentliche Schaltung mit einem Shelly als Lampe um zu sehen ob es funktioniert.
      Es soll also wenn das Fenster geschlossen ist und ich Alexa den Befehl gebe die Lampe zu schalten das Licht angehen. Wenn das Fenster offen ist und ich Alexa den Befehl gebe soll es nicht angehen. Es funktioniert so das es ganz kurz an und sofort wieder ausgeht.
      iobroker.JPG
      Das funktioniert auch aber nur einmal den wenn ich dann im geschlossenen Zustand den Befehl zum Licht schalten gebe, geht das Licht auch gleich wieder aus.
      Da ist bei mir irgendwie ein Denkfehler drin.
      Was mache ich falsch?
      Es soll auch nicht so sein das es wie in dem Beispiel von Unbekannt das es wie bei ihm nach erfolgreicher Prüfung automatisch zu geht bzw. wie in meinem Beispiel das Licht angeht.

      1 Antwort Letzte Antwort
      0
      • X Offline
        X Offline
        xbow42
        schrieb am zuletzt editiert von xbow42
        #6

        wenn ich dein Vorhaben verstanden habe, würde ich es anders angehen.
        der Fensterkontakt zeigt die nur den Zustand von der Tür; darf selbst keine Aktion auslösen.
        eigener DP [Rollo xy schließen] erstellen. Dieser ist der DP für deine AlexaAnsage, auf den triggerst du für bedingten Aktionen.

        • DP als Gerät im iot-Adapter anlegen mit Smartname "Rollo xy schließen"
        • Alexa suche Geräte -> "ich habe 'Rollo xy schließen' gefunden, du kannst..."
        • in der AlexaApp eine Routine "Rollo xy schließen"(kann auch anders heißen) anlegen mit der Aktion Gerät "Rollo xy schließen" auf "Eingeschaltet"

        ggf deine AlexaAstroRoutine noch ändern auf den neuen DP
        evtl hast du das ja schon und ich schreib hier nicht neues für Dich. jetzt zu Script:

        [[Rollo xy schließen] = wahr] //Trigger auf DP
         hier prüfts du auf den Fensterkontakt = zu
           fahre rollo runter
        sonst
           stop Intervall3min
          [Intervall3min]{
            wieder prüfen falls (jetzt) Fenster zu 
                 dann rollo runter
                 //ggf. debug-info"rollo wurde runtergefahren"
                 stop Intervall3min
           }
        ]
        

        Um das Intervall3min zu stoppen und dann eine Warnmeldung über Alexa/.... zu geben sollte vielleicht auch eine Timeout eingebaut werden z.B

        • eine Zählervariable zum runterzählen(wenn 0 stop Intervall3min)
        • oder aktuelle Zeit ist > als 23:00:00
        • oder stop bei AstoSonnenaufgang
        • ...
        B 1 Antwort Letzte Antwort
        0
        • X xbow42

          wenn ich dein Vorhaben verstanden habe, würde ich es anders angehen.
          der Fensterkontakt zeigt die nur den Zustand von der Tür; darf selbst keine Aktion auslösen.
          eigener DP [Rollo xy schließen] erstellen. Dieser ist der DP für deine AlexaAnsage, auf den triggerst du für bedingten Aktionen.

          • DP als Gerät im iot-Adapter anlegen mit Smartname "Rollo xy schließen"
          • Alexa suche Geräte -> "ich habe 'Rollo xy schließen' gefunden, du kannst..."
          • in der AlexaApp eine Routine "Rollo xy schließen"(kann auch anders heißen) anlegen mit der Aktion Gerät "Rollo xy schließen" auf "Eingeschaltet"

          ggf deine AlexaAstroRoutine noch ändern auf den neuen DP
          evtl hast du das ja schon und ich schreib hier nicht neues für Dich. jetzt zu Script:

          [[Rollo xy schließen] = wahr] //Trigger auf DP
           hier prüfts du auf den Fensterkontakt = zu
             fahre rollo runter
          sonst
             stop Intervall3min
            [Intervall3min]{
              wieder prüfen falls (jetzt) Fenster zu 
                   dann rollo runter
                   //ggf. debug-info"rollo wurde runtergefahren"
                   stop Intervall3min
             }
          ]
          

          Um das Intervall3min zu stoppen und dann eine Warnmeldung über Alexa/.... zu geben sollte vielleicht auch eine Timeout eingebaut werden z.B

          • eine Zählervariable zum runterzählen(wenn 0 stop Intervall3min)
          • oder aktuelle Zeit ist > als 23:00:00
          • oder stop bei AstoSonnenaufgang
          • ...
          B Offline
          B Offline
          biker1602
          schrieb am zuletzt editiert von
          #7

          @xbow42 mir ist es eigentlich egal, ob der Fensterkontakt eine Aktion ausführen kann.
          Der Fensterkontakt soll am besten den Befehl bei geöffnetem Zustand an das Rollo geben, dass es nicht runter gefahren werden kann.
          Es wäre sicherlich schön, wenn man eine Ansage bei Alexa einbauen könnte "Rollo lässt sich nicht schließen da Fenster geöffnet ist"
          Sobald der Fensterkontakt schließt, soll Alexa aber auch erst nach Ansage den Befehl Rollo runter wieder ausführen können.

          X 1 Antwort Letzte Antwort
          0
          • B biker1602

            @xbow42 mir ist es eigentlich egal, ob der Fensterkontakt eine Aktion ausführen kann.
            Der Fensterkontakt soll am besten den Befehl bei geöffnetem Zustand an das Rollo geben, dass es nicht runter gefahren werden kann.
            Es wäre sicherlich schön, wenn man eine Ansage bei Alexa einbauen könnte "Rollo lässt sich nicht schließen da Fenster geöffnet ist"
            Sobald der Fensterkontakt schließt, soll Alexa aber auch erst nach Ansage den Befehl Rollo runter wieder ausführen können.

            X Offline
            X Offline
            xbow42
            schrieb am zuletzt editiert von
            #8

            @biker1602 sagte in Blockly um Rollo zu blockieren?:

            @xbow42 mir ist es eigentlich egal, ob der Fensterkontakt eine Aktion ausführen kann.
            Der Fensterkontakt soll am besten den Befehl bei geöffnetem Zustand an das Rollo geben, dass es nicht runter gefahren werden kann.

            Die logik kann nich nicht nachvollziehen. Das Rollo soll sich die Information dann merken, oder was soll es mit der Information anfangen? Finde ich Quatsch, da die Information das Rollo zu jeder Zeit am DB Fensterkontakt.isopen (o.ä.) abrufen kann.

            Es wäre sicherlich schön, wenn man eine Ansage bei Alexa einbauen könnte "Rollo lässt sich nicht schließen da Fenster geöffnet ist"
            Das kannst du doch nach dem "sonst" im meinem Beispiel einbauen.

            Steuere "alexa.x.echo.*.speak" =" "Rollo lässt sich nicht schließen da Fenster geöffnet ist"
            //oder eine mail/telegramm-Message
            Steuere DB Kollisionwarnung=true
            

            Sobald der Fensterkontakt schließt, soll Alexa aber auch erst nach Ansage den Befehl Rollo runter wieder ausführen können.

            DP Kollisionwarnung kannst du für die Anzeige in der Visualisierung benutzen oder auch als Sperre für "..erst nach Ansage.."

            1 Antwort Letzte Antwort
            0
            • R Offline
              R Offline
              R1Snake
              schrieb am zuletzt editiert von
              #9

              Gibt einen Adapter der dir die ganze Scriptarbeit abnimmt.

              Schau dir mal Shuttercontroll an.

              Da kannst du bei einer Rollade einen Aktor hinzufügen und wenn der Wert des Aktors einen bestimmten Wert hat, dann passiert XYZ.

              B 2 Antworten Letzte Antwort
              0
              • B Offline
                B Offline
                biker1602
                schrieb am zuletzt editiert von
                #10

                Es kann sein das ich mich da verkehrt ausdrücke.
                Ich bin mit dieser Blockly Geschichte noch nicht so vertraut.
                Ich versuche es nochmal anders.
                Ich habe eine Routine bei Alexa die zum Sonnen auf bzw. Untergang das Rollo automatisch rauf bzw. runterfährt.
                Sollte aber die Tür aufstehen und der Zeitpunkt Sonnenuntergang erreicht sein soll das Rollo blockiert werden damit es nicht beschädigt wird.
                Wenn die Tür dann irgendwann wieder zu gemacht wird, soll sich das Rollo ganz normal wieder schließen lassen.
                Dafür bräuchte ich so ein Blockly.
                Wie gesagt ich stecke bei der Blockly Geschichte ganz am Anfang.

                1 Antwort Letzte Antwort
                0
                • R R1Snake

                  Gibt einen Adapter der dir die ganze Scriptarbeit abnimmt.

                  Schau dir mal Shuttercontroll an.

                  Da kannst du bei einer Rollade einen Aktor hinzufügen und wenn der Wert des Aktors einen bestimmten Wert hat, dann passiert XYZ.

                  B Offline
                  B Offline
                  biker1602
                  schrieb am zuletzt editiert von
                  #11

                  @R1Snake said in Blockly um Rollo zu blockieren?:

                  Gibt einen Adapter der dir die ganze Scriptarbeit abnimmt.

                  Schau dir mal Shuttercontroll an.

                  Da kannst du bei einer Rollade einen Aktor hinzufügen und wenn der Wert des Aktors einen bestimmten Wert hat, dann passiert XYZ.

                  Danke werde ich gleich mal installieren

                  1 Antwort Letzte Antwort
                  0
                  • R R1Snake

                    Gibt einen Adapter der dir die ganze Scriptarbeit abnimmt.

                    Schau dir mal Shuttercontroll an.

                    Da kannst du bei einer Rollade einen Aktor hinzufügen und wenn der Wert des Aktors einen bestimmten Wert hat, dann passiert XYZ.

                    B Offline
                    B Offline
                    biker1602
                    schrieb am zuletzt editiert von
                    #12

                    @R1Snake Ich habe ihn installiert aber ich habe bei mir das Problem, das ich die über Funk laufen habe. Die Befehle für Hoch runter und stopp habe ich mit Broadlink angelernt und ich habe so zu jedem Rollo die Drei Datenpunkte aber keine eigentlich ID zum Gerät.
                    Broadlink Datenpunkte.JPG

                    1 Antwort Letzte Antwort
                    0
                    • R Offline
                      R Offline
                      R1Snake
                      schrieb am zuletzt editiert von
                      #13

                      Der Adapter arbeitet eigentlich mit "position". Hast du diese Eigenschaft?

                      B 1 Antwort Letzte Antwort
                      0
                      • R R1Snake

                        Der Adapter arbeitet eigentlich mit "position". Hast du diese Eigenschaft?

                        B Offline
                        B Offline
                        biker1602
                        schrieb am zuletzt editiert von
                        #14

                        @R1Snake Nein nur so wie auf dem Bild. Ich habe dann nur noch Szenen erstellt um mit Alexa steuern zu können.

                        1 Antwort Letzte Antwort
                        0
                        • X Offline
                          X Offline
                          xbow42
                          schrieb am zuletzt editiert von
                          #15

                          mit Aktoren die keinen Status zurückgeben ist das sehr schwierig.
                          da müsstest du selbst eine DB für Level(0-100) anlegen. und über die Laufzeit die Höhe berechnen. Das gestaltet sich auch sehr schwierig da unterschiedlich viel Zeit für Hoch/Runterfahren. tatsächliche Höhe ist dann auch noch vom Wellendurchmesser/anzahl Lamellen/Schlitzhöhe abhängig.

                          B 1 Antwort Letzte Antwort
                          0
                          • X xbow42

                            mit Aktoren die keinen Status zurückgeben ist das sehr schwierig.
                            da müsstest du selbst eine DB für Level(0-100) anlegen. und über die Laufzeit die Höhe berechnen. Das gestaltet sich auch sehr schwierig da unterschiedlich viel Zeit für Hoch/Runterfahren. tatsächliche Höhe ist dann auch noch vom Wellendurchmesser/anzahl Lamellen/Schlitzhöhe abhängig.

                            B Offline
                            B Offline
                            biker1602
                            schrieb am zuletzt editiert von
                            #16

                            @xbow42 Es ist ein ganz normales Rollo wo ich nachträglich ein Motor http://siro-antrieb.de/ eingebaut habe.
                            Es ist kein außen liegender Rollladen.
                            Deswegen wollte ich das ja mit dem Script machen, dass er sich nicht runterfahren lässt, wenn das Fenster auf ist.

                            1 Antwort Letzte Antwort
                            0
                            • R Offline
                              R Offline
                              R1Snake
                              schrieb am zuletzt editiert von
                              #17

                              Was du machen könntest wäre eine Dummy Variable.

                              Wenn 100 eingegeben wird, dann wird die Rollade hochgefahren, wenn 0 eingegeben wird dann wird die Rollade runter gefahren.

                              Dann kannst du die Variable in den Adapter hinterlegen und so ausprobieren.

                              Wichtig wäre dann nur Werte von 0 oder 100 zu verwenden.

                              Aktuell wäre ein Blockly besser.

                              Hoffe du kannst programmieren dann kannst du folgenden Code anpassen:

                              var device, direction;
                              var position = 0;
                              var groups = {
                                  'Balkon': 'javascript.0.home.Wohnzimmer.Rolläden.Gruppe.Balkon.position',
                                  'Balkontuer': 'shelly.0.SHSW-25#10F917#1.Shutter.Position'
                              };
                              
                              on({id: 'alexa2.0.History.summary', change: "ne"}, function (obj) {
                                var value = obj.state.val;
                                var oldValue = obj.oldState.val;
                              
                                if(value.indexOf('rollladen') + 1)
                                  device = groups.Balkon;
                                else if (value.indexOf('balkon tür') + 1)  
                                  device = groups.Balkontuer;
                                
                                if (value.indexOf('runter') + 1)
                                  direction = 0;
                                else if (value.indexOf('hoch') + 1)
                                  direction = 100;
                                else if (value.indexOf('rauf') + 1)
                                  direction = 100;
                                
                                  
                                if (device) {
                                  if (direction)
                                      setPosition(device,position);
                                }  
                              });
                              
                              function setPosition(obj, position) {
                                  setState(obj, position);
                              }
                              

                              Der Code fragt den Kommand der Alexa geräte ab und prüft diese auf Inhalt.

                              Hier könntest du es so machen das wenn die rollade angesprochen wird kannst du mit SetState die Rollade "Sperren" wenn die Tür offen ist

                              Hoffe das Hilft

                              1 Antwort Letzte Antwort
                              0
                              • X Offline
                                X Offline
                                xbow42
                                schrieb am zuletzt editiert von
                                #18

                                Das Problem ist dass du mit deinen in Alexa konfigurierten Routinen z.Z nicht in die Steuerung eingreifen kannst.
                                Daher bleibt IMO nur die Möglichkeit die Steuerung der Routinen im ioBroker zu machen. Entweder mit dem Shuttercontrol und eigenem Datenpunkt(en) Level(auch wenn der dann nur 0und100 oder 0und1 kann) und dem Sperren alias Kollision.state. Wenn ich mich recht erinnere hat der Adapter auch schon DP zum sperren ("autoDown" könnte dein Kandidat sein). Diesen kannst du auch von deinem eigenen Script setzen durch Fensterkontakt-Statusänderung.

                                1 Antwort Letzte Antwort
                                0
                                • B Offline
                                  B Offline
                                  biker1602
                                  schrieb am zuletzt editiert von
                                  #19

                                  Das ist mir jetzt alles zu hoch. Ich dachte, es geht einfacher umzusetzen. Mir fällt es mit Blockly schon schwer etwas umzusetzen da ich in der Materie noch in den Kinderschuhen stecke. Für mich sollte es nur eine Sicherheit sein das, wenn ich im Sommer Abends draußen sitze, die Balkontür auf ist und das Rollo automatisch heruntergeht das es nicht auf die offene Tür läuft .

                                  1 Antwort Letzte Antwort
                                  0
                                  • R Offline
                                    R Offline
                                    R1Snake
                                    schrieb am zuletzt editiert von
                                    #20

                                    Ich habe eine neue Idee für dich.

                                    Lösche in Alexa die routine die das ausführt.

                                    Dann erstellst du dir ein Virtual device welches du auf An/Aus setzen kannst. Dieser ist verknüpft mit den Schaltern für dein Rollo. Das einzige was dann dazu kommt ist wenn dein VD gesetzt wird, prüft dieser vorher ob die tür offen ist. Wenn ja wird nichts gesetzt, wenn nicht dann wird der Button für deine Rollade gedrückt.

                                    Für Alexa erstellst du dir ein IOT Device und nennst es wie deine Routine.

                                    Denke so kannst du alles umsetzen und hast deinen Schutz

                                    B 1 Antwort Letzte Antwort
                                    0
                                    • R R1Snake

                                      Ich habe eine neue Idee für dich.

                                      Lösche in Alexa die routine die das ausführt.

                                      Dann erstellst du dir ein Virtual device welches du auf An/Aus setzen kannst. Dieser ist verknüpft mit den Schaltern für dein Rollo. Das einzige was dann dazu kommt ist wenn dein VD gesetzt wird, prüft dieser vorher ob die tür offen ist. Wenn ja wird nichts gesetzt, wenn nicht dann wird der Button für deine Rollade gedrückt.

                                      Für Alexa erstellst du dir ein IOT Device und nennst es wie deine Routine.

                                      Denke so kannst du alles umsetzen und hast deinen Schutz

                                      B Offline
                                      B Offline
                                      biker1602
                                      schrieb am zuletzt editiert von
                                      #21

                                      @R1Snake meinst du mit dem LinkedDevices Adapter

                                      1 Antwort Letzte Antwort
                                      0
                                      • R Offline
                                        R Offline
                                        R1Snake
                                        schrieb am zuletzt editiert von
                                        #22

                                        So in der Art, hab ihn jedoch noch nie benutzt.

                                        Sekunde ich such dir mal ein Script raus

                                        1 Antwort Letzte Antwort
                                        0
                                        • R Offline
                                          R Offline
                                          R1Snake
                                          schrieb am zuletzt editiert von
                                          #23

                                          So hab es mal quick and dirty umgeschrieben.

                                          dieses script legst du bei common an:

                                          virtualGosundSwitch('MQTT', 'Abstellraum','Gosund6', 'mqtt.0.SmartHome.Gosund.Gosund6');
                                          
                                          function virtualGosundSwitch(room, name, devname, deviceId) {
                                              var config = {
                                                  namespace: room,
                                                  name: name,
                                                  copy: {common: {name: devname, role: 'variable'}, native: {type: 'switch'}},
                                                  states: {
                                                      'state': {
                                                          common: {type: 'boolean', def: '', read: false, write: true},
                                                          write: {
                                                              [deviceId + '.cmnd.POWER']: { // Pfad von deinem Button
                                                                  convert: function(val) {
                                                                      if (val == true)
                                          								if (getState()) //hier den Pfad von deinem Türsensor 
                                          									return false;
                                                                          return true;
                                                                      else
                                                                          return false;                              
                                                                  }
                                                              }
                                                          }
                                                      }           
                                                  }
                                              }
                                              return new VirtualDevice(config);
                                          }
                                          

                                          und das bei main:

                                          function VirtualDevice(config) {
                                              //sanity check
                                              if (typeof config !== 'object' || typeof config.namespace !== 'string' || typeof config.name !== 'string' || typeof config.states !== 'object') {
                                                  log('sanity check failed, no device created', 'warn');
                                                  return;
                                              }
                                          
                                              this.config = config;
                                              this.namespace = 'home.' + config.namespace + '.' + config.name;
                                              this.name = config.name;
                                          
                                              //create virtual device
                                              this.createDevice(function () {
                                                  this.createStates(function () {
                                                      log('created virtual device ' + this.namespace)
                                                  }.bind(this));
                                              }.bind(this));
                                          }
                                          
                                          VirtualDevice.prototype.createDevice = function (callback) {
                                              log('creating object for device ' + this.namespace, 'debug');
                                              //create device object
                                              var obj;
                                              if (typeof this.config.copy == 'string') {
                                                  obj = getObject(this.config.copy);
                                              } else if (typeof this.config.copy == 'object') {
                                                  obj = this.config.copy;
                                              } else {
                                                  obj = {common: {}, native: {}};
                                              }
                                              delete obj.common.custom;
                                              if (typeof this.config.common === 'object') {
                                                  obj.common = Object.assign(obj.common, this.config.common);
                                              }
                                              if (typeof this.config.native === 'object') {
                                                  obj.native = Object.assign(obj.native, this.config.native);
                                              }
                                              extendObject('javascript.' + instance + '.' + this.namespace, {
                                                  type: "device",
                                                  common: obj.common,
                                                  native: obj.native
                                              }, function (err) {
                                                  if (err) {
                                                      log('could not create virtual device: ' + this.namespace, 'warn');
                                                      return;
                                                  }
                                                  log('created object for device ' + this.namespace, 'debug');
                                                  if (typeof this.config.onCreate === 'function') {
                                                      this.config.onCreate(this, callback);
                                                  } else {
                                                      callback();
                                                  }
                                              }.bind(this));
                                          };
                                          
                                          VirtualDevice.prototype.createStates = function (callback) {
                                              "use strict";
                                              log('creating states for device ' + this.namespace, 'debug');
                                              var stateIds = Object.keys(this.config.states);
                                              log('creating states ' + JSON.stringify(stateIds), 'debug');
                                              var countCreated = 0;
                                              for (var i = 0; i < stateIds.length; i++) {
                                                  let stateId = stateIds[i];
                                                  this.normalizeState(stateId);
                                                  var id = this.namespace + '.' + stateId;
                                                  log('creating state ' + id, 'debug');
                                                  var obj = this.config.states[stateId].copy ? getObject(this.config.states[stateId].copy) : {
                                                      common: {},
                                                      native: {}
                                                  };
                                                  delete obj.common.custom;
                                                  if (typeof this.config.states[stateId].common === 'object') {
                                                      obj.common = Object.assign(obj.common, this.config.states[stateId].common);
                                                  }
                                                  if (typeof this.config.states[stateId].native === 'object') {
                                                      obj.native = Object.assign(obj.native, this.config.states[stateId].native);
                                                  }
                                                  createState(id, obj.common, obj.native, function (err) {
                                                      if (err) {
                                                          log('skipping creation of state ' + id, 'debug');
                                                      } else {
                                                          log('created state ' + id, 'debug');
                                                      }
                                                      this.connectState(stateId);
                                                      countCreated++;
                                                      if (countCreated >= stateIds.length) {
                                                          log('created ' + countCreated + ' states for device ' + this.namespace, 'debug');
                                                          callback();
                                                      }
                                                  }.bind(this));
                                              }
                                          };
                                          
                                          VirtualDevice.prototype.normalizeState = function (state) {
                                              log('normalizing state ' + state, 'debug');
                                              if (typeof this.config.states[state].read !== 'object') {
                                                  this.config.states[state].read = {};
                                              }
                                              if (typeof this.config.states[state].write !== 'object') {
                                                  this.config.states[state].write = {};
                                              }
                                          
                                              var readIds = Object.keys(this.config.states[state].read);
                                              for (var i = 0; i < readIds.length; i++) {
                                                  var readId = this.config.states[state].read[readIds[i]];
                                                  if (typeof readId.before !== 'function') {
                                                      this.config.states[state].read[readIds[i]].before = function (device, value, callback) {
                                                          callback();
                                                      };
                                                  }
                                                  if (typeof readId.after !== 'function') {
                                                      this.config.states[state].read[readIds[i]].after = function (device, value) {
                                                      };
                                                  }
                                              }
                                              var writeIds = Object.keys(this.config.states[state].write);
                                              for (i = 0; i < writeIds.length; i++) {
                                                  var writeId = this.config.states[state].write[writeIds[i]];
                                                  if (typeof writeId.before !== 'function') {
                                                      this.config.states[state].write[writeIds[i]].before = function (device, value, callback) {
                                                          callback();
                                                      };
                                                  }
                                                  if (typeof writeId.after !== 'function') {
                                                      this.config.states[state].write[writeIds[i]].after = function (device, value) {
                                                      };
                                                  }
                                              }
                                              log('normalized state ' + state, 'debug');
                                          };
                                          
                                          VirtualDevice.prototype.connectState = function (state) {
                                              var id = this.namespace + '.' + state;
                                              log('connecting state ' + id, 'debug');
                                              
                                              //subscribe to read ids
                                              var readIds = Object.keys(this.config.states[state].read);
                                              for (var i = 0; i < readIds.length; i++) {
                                                  if (getState(readIds[i]).notExist === true) { //check if state exists
                                                      log('cannot connect to not existing state: ' + readIds[i], 'warn');
                                                      continue;
                                                  }
                                                  var readObj = this.config.states[state].read[readIds[i]];
                                                  var readTrigger = readObj.trigger || {change: 'any'};
                                                  readTrigger.ack = true;
                                                  readTrigger.id = readIds[i];
                                                  this.subRead(readTrigger, readObj, state);
                                                  log('connected ' + readIds[i] + ' to ' + id, 'debug');
                                              }
                                          
                                              //subscribe to this state and write to write ids
                                              var writeIds = Object.keys(this.config.states[state].write);
                                              if (writeIds.length > 0) {
                                                  var writeTrigger = {id: 'javascript.' + instance + '.' + this.namespace + '.' + state, change: 'any', ack: false};
                                                  on(writeTrigger, function (obj) {
                                                      "use strict";
                                                      log('detected change of ' + state, 'debug');
                                                      for (var i = 0; i < writeIds.length; i++) {
                                                          let writeObj = this.config.states[state].write[writeIds[i]];
                                                          let val = this.convertValue(obj.state.val, writeObj.convert);
                                                          let writeId = writeIds[i];
                                                          log('executing function before for ' + writeId, 'debug');
                                                          writeObj.before(this, val, function (newVal, newDelay) {
                                                              if (newVal !== undefined && newVal !== null) val = newVal;
                                                              var delay = writeObj.delay;
                                                              if (newDelay !== undefined && newDelay !== null) delay = newDelay;
                                                              log(newVal + 'writing value ' + val + ' to ' + writeId + ' with delay ' + delay, 'debug');
                                                              setStateDelayed(writeId, val, false, delay || 0, true, function () {
                                                                  log('executing function after for ' + writeId, 'debug');
                                                                  writeObj.after(this, val);
                                                              }.bind(this));
                                                          }.bind(this));
                                                      }
                                                  }.bind(this));
                                                  log('connected ' + state + ' to ' + JSON.stringify(writeIds), 'debug');
                                              }
                                          }
                                          
                                          VirtualDevice.prototype.subRead = function (trigger, readObj, state) {
                                              var func = function (obj) {
                                                  var val = this.convertValue(obj.state.val, readObj.convert);
                                          
                                                  //@todo aggregations
                                          
                                                  log('executing function before for ' + trigger.id, 'debug');
                                                  readObj.before(this, val, function (newVal, newDelay) {
                                                      if (newVal !== undefined && newVal !== null) val = newVal;
                                                      if (newDelay !== undefined && newDelay !== null) readObj.delay = newDelay;
                                                      log('reading value ' + val + ' to ' + this.namespace + '.' + state, 'debug');
                                                      setStateDelayed(this.namespace + '.' + state, val, true, readObj.delay || 0, true, function () {
                                                          log('executing function after for ' + trigger.id, 'debug');
                                                          readObj.after(this, val);
                                                      }.bind(this));
                                                  }.bind(this));
                                              }.bind(this);
                                              // initial read on script start
                                              func({state: getState(trigger.id)});
                                              // create read trigger
                                              on(trigger, func);
                                          }
                                          
                                          VirtualDevice.prototype.convertValue = function (val, func) {
                                              if (typeof func !== 'function') {
                                                  return val;
                                              }
                                              return func(val);
                                          }
                                          
                                          B 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

                                          681

                                          Online

                                          32.7k

                                          Benutzer

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