NEWS
Wie warn-Meldungen bei nicht gesetztem Selector vermeiden
-
Hallo,
ich benutze zum zählen der eingeschalteten Lichter das hier schon mal veröffentlichte "LichterAn"-Script.
Leider habe ich bei jedem Script-Aufruf Warnungen der Art:
javascript.0 2016-09-24 20:46:09.870 warn javascript.0 State "hm-rpc.2.CUX4000008.6.LEVEL" not found javascript.0 2016-09-24 20:46:09.870 warn javascript.0 State "hm-rpc.2.CUX4000008.3.LEVEL" not found javascript.0 2016-09-24 20:46:09.869 warn javascript.0 State "hm-rpc.2.CUX4000008.1.LEVEL" not found
Die ID's und auch die entsprechenden States, also z.B. ".LEVEL", sind vorhanden, können aber irgendwie nicht gefunden werden.
Wie kann ich die Warn-Meldungen vermeiden?
-
Hallo,
ich benutze zum zählen der eingeschalteten Lichter das hier schon mal veröffentlichte "LichterAn"-Script.
Leider habe ich bei jedem Script-Aufruf Warnungen der Art:
javascript.0 2016-09-24 20:46:09.870 warn javascript.0 State "hm-rpc.2.CUX4000008.6.LEVEL" not found javascript.0 2016-09-24 20:46:09.870 warn javascript.0 State "hm-rpc.2.CUX4000008.3.LEVEL" not found javascript.0 2016-09-24 20:46:09.869 warn javascript.0 State "hm-rpc.2.CUX4000008.1.LEVEL" not found
Die ID's und auch die entsprechenden States, also z.B. ".LEVEL", sind vorhanden, können aber irgendwie nicht gefunden werden.
Wie kann ich die Warn-Meldungen vermeiden? `
Kann es sein, dass für diese States noch nie ein Wert geliefert wurde? -
Ja, kann sein.
Die Actoren werden derzeit nicht benutzt.
Aber irgend wie müsste man das doch auch abfangen können.
-
Die ID's und auch die entsprechenden States, also z.B. ".LEVEL", sind vorhanden, `
Du meinst, dass die Datenpunktobjekte vorhanden sind. Die States (im Sinne von ioBroker: Zustände) sind noch nicht vorhanden, wenn diese Warnung kommt.
@AndyUM61:Wie kann ich die Warn-Meldungen vermeiden? `
Im Reiter "Zustände" einen Wert (0) eintragen. -
Im Reiter "Zustände" einen Wert (0) eintragen. `
Ähm, na ja, da soll ich also alle meine Actoren nach Nullen durchsuchen??
Das kann ja nicht wirklich die Lösung sein!?
Ich muss das doch Scrip-Technisch irgend wie abfangen können;)?
-
Ich muss das doch Scrip-Technisch irgend wie abfangen können;)? `
Ja, indem das Script so ergänzt wird, dass wenn getState(id) nicht existiert, mit setState(id, 0) der State erzeugt wird. Beispiel:if(!getState(id)) setState(id, 0); else { var x = getState(id).val; }
Dann kommt die Warnung nur noch einmal.
-
if(!getState(id)) setState(id, 0); else { var x = getState(id).val; } ```` `
Dann könnte ich ja auch gleich die Schleife mit
if (!getState(id)) return;
beenden.
Aber leider funktioniert ja genau das - aus welchem Grund auch immer - eben NICHT.
-
Dann könnte ich ja auch gleich die Schleife mit
if (!getState(id)) return;
beenden. `
Eben nicht, da die Abfrage if(!getState(id)) die Warnung erzeugt, solange der State nicht gesetzt ist.Bei meinem Vorschlag passiert dies nur noch genau einmal, weil bei Nichtexistenz der State erzeugt wird.
-
Die warn-Meldung kommt trotzdem bei jedem Scriptaufruf.
Hier mal das komplette Script, vielleicht ist ja da trotzdem noch ein anderer Fehler.
createState('zählenLichter.anzahlLichter', 0); // wenn benötigt: Anzahl der vorhandenen Lichter createState('zählenLichter.anzahlLichterAn', 0); // Anzahl der Lichter, die an sind als Variable unter Javascript.0 anlegen var cacheSelectorState = $('channel[state.id=*.STATE](functions=Licht)'); var cacheSelectorDimmer = $('channel[state.id=*.LEVEL](functions=Licht)'); function countLamps(obj) { if (!obj) return; // Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Licht auf 0 var anzahlLichterAn = 0; var anzahlLichter = 0; //log('New state of ' + obj.id + ': ' + obj.newState.val); // Info im Log, welcher Zustand sich geändert hat cacheSelectorState.each(function (id, i) { // Schleife für jedes gefundenen Element *.STATE im Gewerk Licht if(!getState(id)) {setState(id, 0);} else { var status = getState(id).val; // Zustand *.STATE abfragen (jedes Element) } if (status === true) {++anzahlLichterAn} // wenn Zustand = true, dann wird die ANzahl der Lichter hochgezählt // log("Licht Nr. " + i + ": " + id + ": " + status); // gibt alle Elemente *.STATE im Gewerk Licht mit dem aktuelle Status im Log aus if (status != "undefined") {++anzahlLichter;} // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status }); cacheSelectorDimmer.each(function (id, i) { // Schleife für jedes gefundenen Element *.LEVEL im Gewerk Licht if(!getState(id)) {setState(id, 0);} else { var status = getState(id).val; // Zustand *.LEVEL abfragen (jedes Element) } if (parseFloat(status) > 0) {++anzahlLichterAn} // wenn Zustand = true, dann wird die ANzahl der Lichter hochgezählt // log("Licht Nr. " + i + ": " + id + ": " + status); // gibt alle Elemente *.STATE im Gewerk Licht mit dem aktuelle Status im Log aus if (status != "undefined") {++anzahlLichter;} // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status }); // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben //log("Anzahl Lichter: " + anzahlLichter + " # davon an: " + anzahlLichterAn); // die ermittelten Werte werden als javascript.0\. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS) setState("zählenLichter.anzahlLichter", anzahlLichter); // Schreibt die aktuelle Anzahl der vorhandene Elemente im Gewerk Licht setState("zählenLichter.anzahlLichterAn", anzahlLichterAn); // Schreibt die aktuelle Anzahl der eingeschalteten Lichter } cacheSelectorState.on(function(obj) { // bei Zustandänderung *. STATE im Gewerk Licht countLamps(obj); }); cacheSelectorDimmer.on(function(obj) { // bei Zustandänderung *. LEVEL im Gewerk Licht countLamps(obj); });
-
Man sollte boolsche Werte nicht mit 0 sondern mit false initialisieren:
cacheSelectorState.each(function (id, i) { // Schleife für jedes gefundenen Element *.STATE im Gewerk Licht if(!getState(id)) setState(id, false); else { var status = getState(id).val; // Zustand *.STATE abfragen (jedes Element) if (status === true) ++anzahlLichterAn; // wenn Zustand = true, dann wird die ANzahl der Lichter hochgezählt // log("Licht Nr. " + i + ": " + id + ": " + status); // gibt alle Elemente *.STATE im Gewerk Licht mit dem aktuelle Status im Log aus ++anzahlLichter; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status } });
-
Das sollte die Lösung dafür sein oder?
http://forum.iobroker.net/viewtopic.php … 37#p130837
nur der vollständigkeithalber.