Navigation

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

    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

    C
    • Profile
    • Following 0
    • Followers 0
    • Topics 0
    • Posts 1
    • Best 1
    • Groups 0

    Conceit

    @Conceit

    1
    Reputation
    9
    Profile views
    1
    Posts
    0
    Followers
    0
    Following
    Joined Last Online

    Conceit Follow

    Best posts made by Conceit

    • RE: special binding „local_*“

      Hallo.. Das ist mein erster Post hier im Forum, und ich hoffe ich kann mit diesem kleinen Workaround zur local_* Initialisierung ein wenig was beitragen. Da die URL-Parameterübergabe in der Android-App bei mir nicht funktioniert hat, habe ich mir eine etwas andere Lösung gebaut.

      Dazu habe ich ein Skript im Vis Editor hinzugefügt. Das Skript überlädt die interne Funktion "vis.updateStates" (aus vis.js) mit deren Originalcode, welcher aber so abgeändert wurde, dass ein neuer Hook (vis.initLocalVar(id)) aufgerufen wird. In diesem kann man dann die lokalen Variablen initialisieren.

      Vorteile dieser Lösung:

      • funktioniert schon jetzt als "normales" JS im Skript-Fensters des Editors - einfach den gesamten Code unten hineinkopieren und vis.initLocalVar entsprechend anpassen.
        • entspricht der Codebasis von heute (03.02.22), es gibt eine kleine Chance, mit zukünftigen Versionen inkompatibel zu werden
      • Es wurde nur eine Zeile an der Originalfunktion geändert. Diese kann/darf/soll bei Wunsch von @Scrounger direkt so ins Git übernommenwerden, dann kann man sich mit der nächsten Version den riesigen Codeblock mit "vis.updateStates" sparen und zukünftige Inkompatibilitäten werden vermieden. (Sorry, ich war etwas faul und habe nicht gecloned und einen Pull-Request für den 1-Zeiler gemacht. Ich hoffe das ist akzeptabel.)
      • voll abwärtskompatibel. Gibt es keine initialisierungsfunktion, wird weiterhin nach url-Parametern gesucht
      • ermöglicht in Zukunft z.B. die Implementierung einer GUI-Box-Datenübergabe innerhalb einer vorgegebenen vis.initLocalVar - Funktion
        • in diesem Fall weiterhin abwärtskompatibel: eigene Überladungen im Skriptfenster würden weiterhin funktionieren
      vis.initLocalVar = function(id) {
         /* Beispiel: Initialisierung von local_nav mit 0 */
          if(id == "local_nav")
              return 0;
          else
              return this.getUrlParameter(id);
      };
      
      vis.updateStates =
          (function (data) {
              if (data) {
                  for (var id in data) {
                      if (!data.hasOwnProperty(id)) continue;
                      var obj = data[id];
      
                      if (id.indexOf('local_') === 0) {
                          // if its a local variable, we have to initiate this
                          obj = {
         /* --->  hier die geänderte Codezeile */
                              val: (this.initLocalVar ? this.initLocalVar(id) : this.getUrlParameter(id)),          // check for initLocalVar hook, otherwise use url parameter to set intital value of local variable
         /* <---  hier die geänderte Codezeile */
                              ts: Date.now(),
                              lc: Date.now(),
                              ack: false,
                              from: "system.adapter.vis.0",
                              user: `system.user.${vis.user}` || "system.user.admin",
                              q: 0
                          }
                      }
      
                      if (!obj) continue;
      
                      try {
                          if (this.editMode) {
                              this.states[id + '.val'] = obj.val;
                              this.states[id + '.ts'] = obj.ts;
                              this.states[id + '.ack'] = obj.ack;
                              this.states[id + '.lc'] = obj.lc;
                              if (obj.q !== undefined && obj.q !== null) {
                                  this.states[id + '.q'] = obj.q;
                              }
                          } else {
                              var oo = {};
                              oo[id + '.val'] = obj.val;
                              oo[id + '.ts'] = obj.ts;
                              oo[id + '.ack'] = obj.ack;
                              oo[id + '.lc'] = obj.lc;
                              if (obj.q !== undefined && obj.q !== null) {
                                  oo[id + '.q'] = obj.q;
                              }
                              this.states.attr(oo);
                          }
                      } catch (e) {
                          this.conn.logError('Error: can\'t create states object for ' + id + '(' + e + ')');
                      }
      
                      if (!this.editMode && this.bindings[id]) {
                          for (var i = 0; i < this.bindings[id].length; i++) {
                              var widget = this.views[this.bindings[id][i].view].widgets[this.bindings[id][i].widget];
                              var value = this.formatBinding(this.bindings[id][i].format, this.bindings[id][i].view, this.bindings[id][i].widget, widget);
      
                              widget[this.bindings[id][i].type][this.bindings[id][i].attr] = value;
      
                              this.subscribeOidAtRuntime(value);
                              this.visibilityOidBinding(this.bindings[id][i], value);
                          }
                      }
                  }
              }
          });
      

      Viele Grüße,
      Markus

      posted in Visualisierung
      C
      Conceit

    Latest posts made by Conceit

    • RE: special binding „local_*“

      Hallo.. Das ist mein erster Post hier im Forum, und ich hoffe ich kann mit diesem kleinen Workaround zur local_* Initialisierung ein wenig was beitragen. Da die URL-Parameterübergabe in der Android-App bei mir nicht funktioniert hat, habe ich mir eine etwas andere Lösung gebaut.

      Dazu habe ich ein Skript im Vis Editor hinzugefügt. Das Skript überlädt die interne Funktion "vis.updateStates" (aus vis.js) mit deren Originalcode, welcher aber so abgeändert wurde, dass ein neuer Hook (vis.initLocalVar(id)) aufgerufen wird. In diesem kann man dann die lokalen Variablen initialisieren.

      Vorteile dieser Lösung:

      • funktioniert schon jetzt als "normales" JS im Skript-Fensters des Editors - einfach den gesamten Code unten hineinkopieren und vis.initLocalVar entsprechend anpassen.
        • entspricht der Codebasis von heute (03.02.22), es gibt eine kleine Chance, mit zukünftigen Versionen inkompatibel zu werden
      • Es wurde nur eine Zeile an der Originalfunktion geändert. Diese kann/darf/soll bei Wunsch von @Scrounger direkt so ins Git übernommenwerden, dann kann man sich mit der nächsten Version den riesigen Codeblock mit "vis.updateStates" sparen und zukünftige Inkompatibilitäten werden vermieden. (Sorry, ich war etwas faul und habe nicht gecloned und einen Pull-Request für den 1-Zeiler gemacht. Ich hoffe das ist akzeptabel.)
      • voll abwärtskompatibel. Gibt es keine initialisierungsfunktion, wird weiterhin nach url-Parametern gesucht
      • ermöglicht in Zukunft z.B. die Implementierung einer GUI-Box-Datenübergabe innerhalb einer vorgegebenen vis.initLocalVar - Funktion
        • in diesem Fall weiterhin abwärtskompatibel: eigene Überladungen im Skriptfenster würden weiterhin funktionieren
      vis.initLocalVar = function(id) {
         /* Beispiel: Initialisierung von local_nav mit 0 */
          if(id == "local_nav")
              return 0;
          else
              return this.getUrlParameter(id);
      };
      
      vis.updateStates =
          (function (data) {
              if (data) {
                  for (var id in data) {
                      if (!data.hasOwnProperty(id)) continue;
                      var obj = data[id];
      
                      if (id.indexOf('local_') === 0) {
                          // if its a local variable, we have to initiate this
                          obj = {
         /* --->  hier die geänderte Codezeile */
                              val: (this.initLocalVar ? this.initLocalVar(id) : this.getUrlParameter(id)),          // check for initLocalVar hook, otherwise use url parameter to set intital value of local variable
         /* <---  hier die geänderte Codezeile */
                              ts: Date.now(),
                              lc: Date.now(),
                              ack: false,
                              from: "system.adapter.vis.0",
                              user: `system.user.${vis.user}` || "system.user.admin",
                              q: 0
                          }
                      }
      
                      if (!obj) continue;
      
                      try {
                          if (this.editMode) {
                              this.states[id + '.val'] = obj.val;
                              this.states[id + '.ts'] = obj.ts;
                              this.states[id + '.ack'] = obj.ack;
                              this.states[id + '.lc'] = obj.lc;
                              if (obj.q !== undefined && obj.q !== null) {
                                  this.states[id + '.q'] = obj.q;
                              }
                          } else {
                              var oo = {};
                              oo[id + '.val'] = obj.val;
                              oo[id + '.ts'] = obj.ts;
                              oo[id + '.ack'] = obj.ack;
                              oo[id + '.lc'] = obj.lc;
                              if (obj.q !== undefined && obj.q !== null) {
                                  oo[id + '.q'] = obj.q;
                              }
                              this.states.attr(oo);
                          }
                      } catch (e) {
                          this.conn.logError('Error: can\'t create states object for ' + id + '(' + e + ')');
                      }
      
                      if (!this.editMode && this.bindings[id]) {
                          for (var i = 0; i < this.bindings[id].length; i++) {
                              var widget = this.views[this.bindings[id][i].view].widgets[this.bindings[id][i].widget];
                              var value = this.formatBinding(this.bindings[id][i].format, this.bindings[id][i].view, this.bindings[id][i].widget, widget);
      
                              widget[this.bindings[id][i].type][this.bindings[id][i].attr] = value;
      
                              this.subscribeOidAtRuntime(value);
                              this.visibilityOidBinding(this.bindings[id][i], value);
                          }
                      }
                  }
              }
          });
      

      Viele Grüße,
      Markus

      posted in Visualisierung
      C
      Conceit
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo