NEWS
Objekt-ID aus Objektnamen ermitteln ?
-
Wie kann ich außerhalb von "on / subscribe" aus dem Objektnamen die id ermitteln ?
Voraussetzung: Der Name ist genau einmal vorhanden.
-
Wie kann ich außerhalb von "on / subscribe" aus dem Objektnamen die id ermitteln ?
Voraussetzung: Der Name ist genau einmal vorhanden. `
### getIdByName getIdByName(name, alwaysArray) returns id of the object with given name. If there are more than one object with this name the result will be an array. If _alwaysArray_ flag is set, the result will be always an array if some ID found.
Aber nur in der 0.5.4
-
Danke für die Ergänzung
Würde ich gern testen, aber zur Zeit scheint es Probleme mit dem Zugriff auf GitHub zu geben.
-
Ist mit noch eingefallen, dass auch das funktionieren sollte:
$('channel[name=MyName]').each(function (id) { log(id + ' - ' + getObject(id).common.name); }); $('state[name=MyName]').each(function (id) { log(id + ' - ' + getObject(id).common.name); });
-
Beide Varianten hatte ich schon versucht.
Bei der 1. Variante passiert nichts.
Die 2. Variante liefert:
javascript-0 2015-08-18 14:55:54 error script.js.Wohnen_Heizregler: TypeError: Cannot read property 'common' of undefined
-
Welchen Namen suchst du? Kannst du das Objekt, welches du suchst, zeigen?
3473_home.txt
3473_home2.txt -
Ich benötige die ID für die Initialisierung von Ist- und Sollwert bei Script-Start, da es sehr lange dauern kann, bis sich der Sollwert ändert.
// 2-Punkt-Regler Raumheizung // Raumkurzname am Anfang des Datenpunktnamen var raum = "Wohnen"; // halbe Hysterese in K var hh = 0.1; function hys(x, w) { var dpname = raum + ".Heizen"; if (x <= w - hh) { setState(dpname, true);} else if (x >= w + hh) { setState(dpname, false);} log("2-Punkt: " + x + ", " + w); } var xname = raum + ".Temperatur"; on({name: xname}, function(dp) { this.x = dp.newState.val; hys(this.x, this.w); }); var wname = raum + ".Sollwert"; on({name: wname}, function(dp) { this.w = dp.newState.val; hys(this.x, this.w); }); // Script start var xid = "hm-rpc.1.CUX9002002.1.TEMPERATURE"; //getIdByName(xname); this.x = getState(xid).val; log("x: " + this.x); var wid = "hm-rpc.1.CUX9002002.2.SETPOINT"; //getIdByName(wname); this.w = getState(wid).val; log("w: " + this.w);
Das sind die beiden Objekte:
-
Die Aktualisierung über ioBroker funktioniert noch immer nicht. Deshalb habe ich zum Testen mir die Datei "javascript.js" aus dem GitHub kopiert und ausgetauscht.
Die Funktion "getIdByName(name)" funktioniert einwandfrei
:
` > javascript-0 2015-08-18 17:14:37 info script.js.Wohnen_Heizregler: registered 2 subscriptions and 0 schedulesjavascript-0 2015-08-18 17:14:37 info script.js.Wohnen_Heizregler: 2-Punkt: 25.8, 22.5
javascript-0 2015-08-18 17:14:37 info script.js.Wohnen_Heizregler: w: hm-rpc.1.CUX9002002.2.SETPOINT
javascript-0 2015-08-18 17:14:37 info script.js.Wohnen_Heizregler: x: hm-rpc.1.CUX9002002.1.TEMPERATURE
javascript-0 2015-08-18 17:14:37 info Start javascript script.js.Wohnen_Heizregler `
mit diesem Scriptende:// Script start var xid = getIdByName(xname); //"hm-rpc.1.CUX9002002.1.TEMPERATURE"; this.x = getState(xid).val; log("x: " + xid); var wid = getIdByName(wname); //"hm-rpc.1.CUX9002002.2.SETPOINT"; this.w = getState(wid).val; log("w: " + wid); hys(this.x, this.w);
-
Hat man erst einmal die Objekt-ID des Datenpunktes, kann man das Script vereinfachen:
// 2-Punkt-Regler Raumheizung // Raumkurzname am Anfang des Datenpunktnamen var raum = "Wohnen"; // halbe Hysterese in K var hh = 0.1; var xid = getIdByName(raum + ".Temperatur"); var wid = getIdByName(raum + ".Sollwert"); var yid = getIdByName(raum + ".Heizen"); function hys() { var x = getState(xid).val; var w = getState(wid).val; if (x <= w - hh) { setState(yid, "Ein");} else if (x >= w + hh) { setState(yid, "Aus");} } on(xid, function() { hys(); }); on(wid, function() { hys(); }); // Script start hys();
Könnte "getState()" auch mit dem Namen arbeiten, würde die ID nur selten benötigt werden.
-
Hat man erst einmal die Objekt-ID des Datenpunktes, kann man das Script vereinfachen:
// 2-Punkt-Regler Raumheizung // Raumkurzname am Anfang des Datenpunktnamen var raum = "Wohnen"; // halbe Hysterese in K var hh = 0.1; var xid = getIdByName(raum + ".Temperatur"); var wid = getIdByName(raum + ".Sollwert"); function hys() { var yname = raum + ".Heizen"; var x = getState(xid).val; var w = getState(wid).val; if (x <= w - hh) { setState(yname, true);} else if (x >= w + hh) { setState(yname, false);} } on(xid, function() { hys(); }); on(wid, function() { hys(); }); // Script start hys();
Könnte "getState()" auch mit dem Namen arbeiten, würde die ID nur selten benötigt werden. `
Nach dem ich getIdByName implementiert habe wird es einfach getState über Name zu implementieren.Was mache ich aber, falls man zwei States mit dem gleichen Namen habe?
1148_wallpaper.jpg -
Was mache ich aber, falls man zwei States mit dem gleichen Namen habe? `
Den ersten gefundenen State nehmen, so wie HM Script.Noch besser: Einen Prüflauf implementieren, der auf mehrfache Vergabe von Namen testet.