NEWS
JavaScript Syntax Verstaendnisproblem
-
Hallo,
const idSensor = 'mqtt.0.tele.Gascounter.SENSOR'; const idZaehler = '0_userdata.0.Gaszaehler.Gaszaehlerstand'; const idVerbrauch = '0_userdata.0.Gaszaehler.Gasverbrauch'; var idZustandszahl = '0_userdata.0.Gaszaehler.Umrechnung.Zustandszahl'; var idBrennwert = '0_userdata.0.Gaszaehler.Umrechnung.Brennwert'; var idAnpassfaktor = '0_userdata.0.Gaszaehler.Umrechnung.Anpassfaktor'; var idBACK = '0_userdata.0.Gaszaehler.Umrechnung.BACK'; var idKostenpTag = "0_userdata.0.Gaszaehler.Verbrauch.GaskostenDaily"; on({id: idSensor, change: "ne"}, async function (obj) { let zaehler = parseInt(getAttr(obj.state.val, "COUNTER.C1")) / 100 * 0.999820; var roundedm3 = Math.round((zaehler + Number.EPSILON) * 100) / 100; var roundedkwh = Math.round((zaehler + Number.EPSILON) * 100 * 0.95 * 11.1) / 100; setState(idZaehler, roundedm3, true); setState(idVerbrauch, roundedkwh, true); var costperday = parseFloat("0_userdata.0.Gaszaehler.Verbrauch.Daily") * 13.70 / 100; setState(idKostenpTag, costperday, true); });Zeile 16 costperday.... funktioniert nicht, ich verstehe nicht wie man zum Teufel eine Uservariable auslesen bzw. beschreiben kann, die Doku hilft mir hier nicht weiter... wie geht das?
genauso wie oben die variablendeklaration.. wieso kann er nicht einfach das ausgewaehlte 'Zahl' aus der Objektdefinition auslesen? wieso wird immer string angenommen?..das 13.7 ist auch noch eine userdata variable die dazukommen soll..
-
Hallo,
const idSensor = 'mqtt.0.tele.Gascounter.SENSOR'; const idZaehler = '0_userdata.0.Gaszaehler.Gaszaehlerstand'; const idVerbrauch = '0_userdata.0.Gaszaehler.Gasverbrauch'; var idZustandszahl = '0_userdata.0.Gaszaehler.Umrechnung.Zustandszahl'; var idBrennwert = '0_userdata.0.Gaszaehler.Umrechnung.Brennwert'; var idAnpassfaktor = '0_userdata.0.Gaszaehler.Umrechnung.Anpassfaktor'; var idBACK = '0_userdata.0.Gaszaehler.Umrechnung.BACK'; var idKostenpTag = "0_userdata.0.Gaszaehler.Verbrauch.GaskostenDaily"; on({id: idSensor, change: "ne"}, async function (obj) { let zaehler = parseInt(getAttr(obj.state.val, "COUNTER.C1")) / 100 * 0.999820; var roundedm3 = Math.round((zaehler + Number.EPSILON) * 100) / 100; var roundedkwh = Math.round((zaehler + Number.EPSILON) * 100 * 0.95 * 11.1) / 100; setState(idZaehler, roundedm3, true); setState(idVerbrauch, roundedkwh, true); var costperday = parseFloat("0_userdata.0.Gaszaehler.Verbrauch.Daily") * 13.70 / 100; setState(idKostenpTag, costperday, true); });Zeile 16 costperday.... funktioniert nicht, ich verstehe nicht wie man zum Teufel eine Uservariable auslesen bzw. beschreiben kann, die Doku hilft mir hier nicht weiter... wie geht das?
genauso wie oben die variablendeklaration.. wieso kann er nicht einfach das ausgewaehlte 'Zahl' aus der Objektdefinition auslesen? wieso wird immer string angenommen?..das 13.7 ist auch noch eine userdata variable die dazukommen soll..
@neueklasse versuche es mal mit:
var costperday = parseFloat(getState("0_userdata.0.Gaszaehler.Verbrauch.Daily").val) * 13.70 / 100;Dokumentation der getState()-Funktion: https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#getstate
-
Hallo,
const idSensor = 'mqtt.0.tele.Gascounter.SENSOR'; const idZaehler = '0_userdata.0.Gaszaehler.Gaszaehlerstand'; const idVerbrauch = '0_userdata.0.Gaszaehler.Gasverbrauch'; var idZustandszahl = '0_userdata.0.Gaszaehler.Umrechnung.Zustandszahl'; var idBrennwert = '0_userdata.0.Gaszaehler.Umrechnung.Brennwert'; var idAnpassfaktor = '0_userdata.0.Gaszaehler.Umrechnung.Anpassfaktor'; var idBACK = '0_userdata.0.Gaszaehler.Umrechnung.BACK'; var idKostenpTag = "0_userdata.0.Gaszaehler.Verbrauch.GaskostenDaily"; on({id: idSensor, change: "ne"}, async function (obj) { let zaehler = parseInt(getAttr(obj.state.val, "COUNTER.C1")) / 100 * 0.999820; var roundedm3 = Math.round((zaehler + Number.EPSILON) * 100) / 100; var roundedkwh = Math.round((zaehler + Number.EPSILON) * 100 * 0.95 * 11.1) / 100; setState(idZaehler, roundedm3, true); setState(idVerbrauch, roundedkwh, true); var costperday = parseFloat("0_userdata.0.Gaszaehler.Verbrauch.Daily") * 13.70 / 100; setState(idKostenpTag, costperday, true); });Zeile 16 costperday.... funktioniert nicht, ich verstehe nicht wie man zum Teufel eine Uservariable auslesen bzw. beschreiben kann, die Doku hilft mir hier nicht weiter... wie geht das?
genauso wie oben die variablendeklaration.. wieso kann er nicht einfach das ausgewaehlte 'Zahl' aus der Objektdefinition auslesen? wieso wird immer string angenommen?..das 13.7 ist auch noch eine userdata variable die dazukommen soll..
@neueklasse Ich habe gerade am Anfang mir oft das Detail des Skriptes in Blockly zusammengeklickt - und dann auf die JavaScript-Ansicht umgeschaltet oben rechts.
So lernte ich schneller die Befehle und mit welchem man was macht. Der Blockly-Code ist dann manchmal "überladen" aber das vereinfachen ist dann ja eine gute Übung -
@neueklasse versuche es mal mit:
var costperday = parseFloat(getState("0_userdata.0.Gaszaehler.Verbrauch.Daily").val) * 13.70 / 100;Dokumentation der getState()-Funktion: https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#getstate
@rrov1 Super, Danke das ist es!
-
@neueklasse Ich habe gerade am Anfang mir oft das Detail des Skriptes in Blockly zusammengeklickt - und dann auf die JavaScript-Ansicht umgeschaltet oben rechts.
So lernte ich schneller die Befehle und mit welchem man was macht. Der Blockly-Code ist dann manchmal "überladen" aber das vereinfachen ist dann ja eine gute Übung@bananajoe Danke fuer den Hinweis, das versuche ich!
-
@neueklasse versuche es mal mit:
var costperday = parseFloat(getState("0_userdata.0.Gaszaehler.Verbrauch.Daily").val) * 13.70 / 100;Dokumentation der getState()-Funktion: https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#getstate
ich bringe die If funktion leider nicht zum laufen... wenn das if auskommentiert ist wird alles richtig resetted...
der Wert beträgt aber "Room cleaning"....var idRobotState = 'mihome-vacuum.0.info.state'; on({id: idRobotState, change: "ne"}, async function (obj) { if (idRobotState === "Room cleaning") { setState('mihome-vacuum.0.rooms.315001052296.roomClean', false); setState('mihome-vacuum.0.rooms.315001052297.roomClean', false); setState('mihome-vacuum.0.rooms.315001052299.roomClean', false); setState('mihome-vacuum.0.rooms.315001052301.roomClean', false); setState('mihome-vacuum.0.rooms.315001052302.roomClean', false); setState('mihome-vacuum.0.rooms.315001052303.roomClean', false); setState('mihome-vacuum.0.rooms.315001052305.roomClean', false); } }); -
ich bringe die If funktion leider nicht zum laufen... wenn das if auskommentiert ist wird alles richtig resetted...
der Wert beträgt aber "Room cleaning"....var idRobotState = 'mihome-vacuum.0.info.state'; on({id: idRobotState, change: "ne"}, async function (obj) { if (idRobotState === "Room cleaning") { setState('mihome-vacuum.0.rooms.315001052296.roomClean', false); setState('mihome-vacuum.0.rooms.315001052297.roomClean', false); setState('mihome-vacuum.0.rooms.315001052299.roomClean', false); setState('mihome-vacuum.0.rooms.315001052301.roomClean', false); setState('mihome-vacuum.0.rooms.315001052302.roomClean', false); setState('mihome-vacuum.0.rooms.315001052303.roomClean', false); setState('mihome-vacuum.0.rooms.315001052305.roomClean', false); } });if(obj.state.val === 'Room cleaning') { -
ich bringe die If funktion leider nicht zum laufen... wenn das if auskommentiert ist wird alles richtig resetted...
der Wert beträgt aber "Room cleaning"....var idRobotState = 'mihome-vacuum.0.info.state'; on({id: idRobotState, change: "ne"}, async function (obj) { if (idRobotState === "Room cleaning") { setState('mihome-vacuum.0.rooms.315001052296.roomClean', false); setState('mihome-vacuum.0.rooms.315001052297.roomClean', false); setState('mihome-vacuum.0.rooms.315001052299.roomClean', false); setState('mihome-vacuum.0.rooms.315001052301.roomClean', false); setState('mihome-vacuum.0.rooms.315001052302.roomClean', false); setState('mihome-vacuum.0.rooms.315001052303.roomClean', false); setState('mihome-vacuum.0.rooms.315001052305.roomClean', false); } });@neueklasse aus dem Kopf: nur 2x
=, dann passt er die Typen anif (obj.state.val == "Room cleaning")onreagiert auf die Datenpunktänderungen und übergibt dieses Objektzustand an die angegebene Funktion - mit dem Variablennamenobjweil das in der Klammer so angegeben wird.Mit dem Objekt erhälts du auch, aber nicht nur den Wert. Sondern z.B. alle Eigenschaften oder den Zeitstempel der Änderung.
obj.state.valenthält den Wert zu dem Zeitpunkt woonausgelöst wurde.Zum Vergleichsoperator
===: Ich nehme eigentlich immer den==
Siehe auch https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness?retiredLocale=de -
ich bringe die If funktion leider nicht zum laufen... wenn das if auskommentiert ist wird alles richtig resetted...
der Wert beträgt aber "Room cleaning"....var idRobotState = 'mihome-vacuum.0.info.state'; on({id: idRobotState, change: "ne"}, async function (obj) { if (idRobotState === "Room cleaning") { setState('mihome-vacuum.0.rooms.315001052296.roomClean', false); setState('mihome-vacuum.0.rooms.315001052297.roomClean', false); setState('mihome-vacuum.0.rooms.315001052299.roomClean', false); setState('mihome-vacuum.0.rooms.315001052301.roomClean', false); setState('mihome-vacuum.0.rooms.315001052302.roomClean', false); setState('mihome-vacuum.0.rooms.315001052303.roomClean', false); setState('mihome-vacuum.0.rooms.315001052305.roomClean', false); } });@neueklasse
Um das von @paul53 etwas zu erläutern:
Im Zeile 1 besetzt Du eine Variable mit der Objekt-ID des DP.
In Zeile 3 triggerst Du auf Änderung dieses DP.
Der Inhalt des betroffenen Objektes wird als Parameterobjan die anonyme Methode übergeben. Das ist aber dann das komplette Objekt!
Mitobj.state.valkommst Du an den eigentlichen Wert. -
@neueklasse aus dem Kopf: nur 2x
=, dann passt er die Typen anif (obj.state.val == "Room cleaning")onreagiert auf die Datenpunktänderungen und übergibt dieses Objektzustand an die angegebene Funktion - mit dem Variablennamenobjweil das in der Klammer so angegeben wird.Mit dem Objekt erhälts du auch, aber nicht nur den Wert. Sondern z.B. alle Eigenschaften oder den Zeitstempel der Änderung.
obj.state.valenthält den Wert zu dem Zeitpunkt woonausgelöst wurde.Zum Vergleichsoperator
===: Ich nehme eigentlich immer den==
Siehe auch https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness?retiredLocale=de@bananajoe sagte in JavaScript Syntax Verstaendnisproblem:
Zum Vergleichsoperator === : Ich nehme eigentlich immer den ==
Um es etwas verständlicher auszudrücken:
==prüft auf Wertgleichheit.===prüft zusätzlich noch auf Typgleichheit.Beispiel:
Ein Vergleich zwischen einem Float 1 und einem Integer 1 liefert bei==eintruezurück. Bei===einfalse. -
if(obj.state.val === 'Room cleaning') {kann es sein das die if abfrage mit der obj.state.val anders sein muss aufgrund des abgefragten objekts? siehe screenshots,
er setzt die 6 States so nicht auf false.

var idRobotState = 'mihome-vacuum.0.info.state'; on({id: idRobotState, change: "ne"}, async function (obj) { if(obj.state.val == 'Room cleaning') { setState('mihome-vacuum.0.rooms.315001052296.roomClean', false); setState('mihome-vacuum.0.rooms.315001052297.roomClean', false); setState('mihome-vacuum.0.rooms.315001052299.roomClean', false); setState('mihome-vacuum.0.rooms.315001052301.roomClean', false); setState('mihome-vacuum.0.rooms.315001052302.roomClean', false); setState('mihome-vacuum.0.rooms.315001052303.roomClean', false); setState('mihome-vacuum.0.rooms.315001052305.roomClean', false); } }); -
kann es sein das die if abfrage mit der obj.state.val anders sein muss aufgrund des abgefragten objekts? siehe screenshots,
er setzt die 6 States so nicht auf false.

var idRobotState = 'mihome-vacuum.0.info.state'; on({id: idRobotState, change: "ne"}, async function (obj) { if(obj.state.val == 'Room cleaning') { setState('mihome-vacuum.0.rooms.315001052296.roomClean', false); setState('mihome-vacuum.0.rooms.315001052297.roomClean', false); setState('mihome-vacuum.0.rooms.315001052299.roomClean', false); setState('mihome-vacuum.0.rooms.315001052301.roomClean', false); setState('mihome-vacuum.0.rooms.315001052302.roomClean', false); setState('mihome-vacuum.0.rooms.315001052303.roomClean', false); setState('mihome-vacuum.0.rooms.315001052305.roomClean', false); } });@neueklasse
Du prüfst auf strings.
Die Werte sind aber number.
Korrekt wäre hier:if(obj.state.val == 18) {Das wird lediglich zur besseren Lesbarkeit in Klartext übersetzt.
-
@bananajoe sagte in JavaScript Syntax Verstaendnisproblem:
Zum Vergleichsoperator === : Ich nehme eigentlich immer den ==
Um es etwas verständlicher auszudrücken:
==prüft auf Wertgleichheit.===prüft zusätzlich noch auf Typgleichheit.Beispiel:
Ein Vergleich zwischen einem Float 1 und einem Integer 1 liefert bei==eintruezurück. Bei===einfalse.@codierknecht sagte: Ein Vergleich zwischen einem Float 1 und einem Integer 1
Javascript kennt keine Integer.
-
@neueklasse
Du prüfst auf strings.
Die Werte sind aber number.
Korrekt wäre hier:if(obj.state.val == 18) {Das wird lediglich zur besseren Lesbarkeit in Klartext übersetzt.
@codierknecht habe es gerade versucht, erst wenn die Funktion "on change" ausgeklammert ist funktionert es..
oder gibt es eine bessere Methode? z.B einen alle 60sec loop? -
@codierknecht habe es gerade versucht, erst wenn die Funktion "on change" ausgeklammert ist funktionert es..
oder gibt es eine bessere Methode? z.B einen alle 60sec loop?@neueklasse das ganze reagiert natürlich nur wenn sich etwas ändert. Vorher passiert nichts. Also der Wert des Datenpunktes muss sich verändern (du hast
changeangegeben). Der Wert muss erst z.B. 17 werden um dann wieder 18 zu werdenSchreib mal folgendes in die Zeile vor dem
ifconsole.warn("obj.state.val: " + obj.state.val);Das gibt er dir dann eine Warnmeldung mit dem aktuellen Wert im Log aus, siehst du unten dann in Orange (oder im Log)
-
@codierknecht sagte: Ein Vergleich zwischen einem Float 1 und einem Integer 1
Javascript kennt keine Integer.
@paul53 sagte in JavaScript Syntax Verstaendnisproblem:
Javascript kennt keine Integer.
Eines meiner Probleme mit untypisierten Sprachen :grin:
Ich könnte auch schreiben "doofe Sprache" ... aber dann gibt's wieder Haue. :innocent: -
@neueklasse das ganze reagiert natürlich nur wenn sich etwas ändert. Vorher passiert nichts. Also der Wert des Datenpunktes muss sich verändern (du hast
changeangegeben). Der Wert muss erst z.B. 17 werden um dann wieder 18 zu werdenSchreib mal folgendes in die Zeile vor dem
ifconsole.warn("obj.state.val: " + obj.state.val);Das gibt er dir dann eine Warnmeldung mit dem aktuellen Wert im Log aus, siehst du unten dann in Orange (oder im Log)
@bananajoe ok, alles klar, gerade getestet, jetzt funktioniert alles wie es soll!
gibt es die möglichkeit 2 States abzufragen?
on({id: idRobotState || idResetButton, change: "ne"}, async function (obj) { if(obj.state.val == 18) || (obj.state.val == 1) { -
@paul53 sagte in JavaScript Syntax Verstaendnisproblem:
Javascript kennt keine Integer.
Eines meiner Probleme mit untypisierten Sprachen :grin:
Ich könnte auch schreiben "doofe Sprache" ... aber dann gibt's wieder Haue. :innocent:@codierknecht sagte in JavaScript Syntax Verstaendnisproblem:
@paul53 sagte in JavaScript Syntax Verstaendnisproblem:
Javascript kennt keine Integer.
Eines meiner Probleme mit untypisierten Sprachen :grin:
Ich könnte auch schreiben "doofe Sprache" ... aber dann gibt's wieder Haue. :innocent:gib TypeScript eine Chance?
-
@bananajoe ok, alles klar, gerade getestet, jetzt funktioniert alles wie es soll!
gibt es die möglichkeit 2 States abzufragen?
on({id: idRobotState || idResetButton, change: "ne"}, async function (obj) { if(obj.state.val == 18) || (obj.state.val == 1) {@neueklasse sagte: gibt es die möglichkeit 2 States abzufragen?
Ja, dann aber nicht mit obj.state.val.
on({id: [idRobotState, idResetButton], change: "ne"}, async function (obj) { if(getState(idRobotState).val == 18 || getState(idResetButton).val == 1) {oder
on({id: [idRobotState, idResetButton], change: "ne"}, async function (obj) { if(obj.id == idRobotState && obj.state.val == 18 || obj.id == idResetButton && obj.state.val == 1) { -
@neueklasse sagte: gibt es die möglichkeit 2 States abzufragen?
Ja, dann aber nicht mit obj.state.val.
on({id: [idRobotState, idResetButton], change: "ne"}, async function (obj) { if(getState(idRobotState).val == 18 || getState(idResetButton).val == 1) {oder
on({id: [idRobotState, idResetButton], change: "ne"}, async function (obj) { if(obj.id == idRobotState && obj.state.val == 18 || obj.id == idResetButton && obj.state.val == 1) {dann wird hierbei (beim ersten) das (obj) nichtmehr benoetigt? zumindestens wird es laut script nicht mehr abgefragt
(grau)