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