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 foundDie 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 foundDie 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? -
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. -
-
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.
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden