NEWS
JavaScript Syntax Verstaendnisproblem
-
@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 -
@rrov1 Super, Danke das ist es!
-
@bananajoe Danke fuer den Hinweis, das versuche ich!
-
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') {
-
@neueklasse aus dem Kopf: nur 2x
=
, dann passt er die Typen anif (obj.state.val == "Room cleaning")
on
reagiert auf die Datenpunktänderungen und übergibt dieses Objektzustand an die angegebene Funktion - mit dem Variablennamenobj
weil 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.val
enthält den Wert zu dem Zeitpunkt woon
ausgelö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 -
@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 Parameterobj
an die anonyme Methode übergeben. Das ist aber dann das komplette Objekt!
Mitobj.state.val
kommst Du an den eigentlichen Wert. -
@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==
eintrue
zurück. Bei===
einfalse
. -
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.
-
@codierknecht sagte: Ein Vergleich zwischen einem Float 1 und einem Integer 1
Javascript kennt keine Integer.
-
@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
change
angegeben). Der Wert muss erst z.B. 17 werden um dann wieder 18 zu werdenSchreib mal folgendes in die Zeile vor dem
if
console.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)
-
@paul53 sagte in JavaScript Syntax Verstaendnisproblem:
Javascript kennt keine Integer.
Eines meiner Probleme mit untypisierten Sprachen
Ich könnte auch schreiben "doofe Sprache" ... aber dann gibt's wieder Haue. -
@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) {
-
@codierknecht sagte in JavaScript Syntax Verstaendnisproblem:
@paul53 sagte in JavaScript Syntax Verstaendnisproblem:
Javascript kennt keine Integer.
Eines meiner Probleme mit untypisierten Sprachen
Ich könnte auch schreiben "doofe Sprache" ... aber dann gibt's wieder Haue.gib TypeScript eine Chance?
-
@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) -
@neueklasse sagte: dann wird hierbei das (obj) nichtmehr benoetigt?
Wenn man getState() verwendet, wird obj nicht benötigt.
Im nachträglichen 2. Beispiel wird obj benötigt. Das 2. Beispiel ist übrigens effizienter - auch wenn es nicht so aussieht. -
@paul53 das heisst man koennte das "on change" vereinfachen? das einfache weglassen von async function (obj) endet bei mir im Fehler. (beim ersten Beispiel)