NEWS
SOLVED Script vergleicht Werte falsch
-
Ich habe ein Blocky Skript erstellt in dem zwei Temperaturen (DewPoint von zwei verschiedenen Netatmo - Sensoren) verglichen werden. Wenn die Temperatur am Sensor A größer als die Temperatur am Sensor B ist, soll in einen Datenpunkt 1 geschrieben werden. Wenn die Temperatur von A kleiner gleich B ist soll 0 in den Datenpunkt geschrieben werden.
Die Temperaturen werden parallel in einem Flot Chart aufgezeichnet. Im Flot Chart ist der Wertebereich (x Achse) von 10 bis 16 Grad Celsius eingestellt.
Die Temperaturwerte beider Sensoren werden unter Objekte und in der History korrekt angezeigt.
Bei Änderung des Werts des Datenpunkts erfolgt über ein anderes Skript die Meldung via Telegramm.
Das Skript (Vergleich der Temperaturen und setzten des Datenpunkts mit 1 oder 0) funktioniert solange korrekt, wie sich die Temperaturwerte im Wertebereich des Flotcharts (10-16 C) befinden. Sobald ein Wert den Bereich des Flotcharts nach unten verläßt, also kleiner als 10 Grad Celsius beträgt, meint das Skript, dass dieser Wert größer als der andere ist, obwohl der Wert ja kleiner als 10 und der andere Wert noch im Chartbereich (10 - 16) und damit eigentlich größer ist.
Der Schnittpunkt -der Linie der Temperatur, die dann kleiner als 10 Grad ist- mit der Y Achse (Zeit) stimmt genau mit dem Zeitpunkt der dann falschen Telegrammmeldung überein. Der Fehler ist so exakt reproduzierbar.Es ist also so, dass das Blocky Skript die Werte aus dem Flotchart vergleicht und nicht die Werte des eigentlichen Objekts.
Liegt hier ein allgemeiner Fehler vor oder habe ich irgendetwas falsch gemacht?
on({id: 'netatmo.0.Station.Bad.Temperature.DewPoint', change: "any"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if (getState("netatmo.0.Station.Bad.Temperature.DewPoint").val > getState("netatmo.0.Unnamed.Temperature.DewPoint").val) { setStateDelayed('admin.0.Datenpunkte.Badtüre', 1, false, parseInt(0, 10), false); } else { setStateDelayed('admin.0.Datenpunkte.Badtüre', 0, false, parseInt(0, 10), false); } });
-
@Olivbus
so vielleicht ? (nicht probiert)setState("Object ID", parseFloat(getState("ID auswählen").val));
-
Dann werden die Felder keine Zahlen sondern einen String enthalten und dort ist 9 größer als 17 da dort nur das erste Zeichen verglichen wird bzw so lange wie es eindeutig ist.
Bei 17 und 19 klappt es also weil 1 und 1 identisch ist also prüft er 7 und 9.
Am Besten also den string in eine Zahl umwandeln
-

Hört sich logisch an, aber der Wert der Temperatur ist als Zahl angelegt -
Ergänze mal in Deinen Script eine log mit typeof sollte etwa so aussehen:
log(typeof getState("weatherunderground.0.forecast.0d.tempMax").val);
```` `Da kommt dann im Log ein string wenn ich recht habe. Falls dort number stehen sehen wir weiter. Sehr unwahrscheinlich...
-
@cash sagte in Script vergleicht Werte falsch:
log(typeof getState("weatherunderground.0.forecast.0d.tempMax").val);
```` `richtig, es kommt string raus. Wie kann ich das ändern? Unter Objekt steht, wie ich oben gezeigt habe Zahl.
-
-
@Olivbus
so vielleicht ? (nicht probiert)setState("Object ID", parseFloat(getState("ID auswählen").val));
-
-
Ihr seid wirklich Klasse. So funktioniert es.
Vielen, vielen Dank Euch allen. -
Wenn ein Thema gelöst wurde bitte den Beitrag der die Lösung beinhaltet als gelöst Markieren. -> 3 Punkte Menü rechts unten am Beitrag -> Mark this post as the correct answer
-
@Negalein sagte in (gelöst)Script vergleicht Werte falsch:
Wenn ein Thema gelöst wurde bitte den Beitrag der die Lösung beinhaltet als gelöst Markieren. -> 3 Punkte Menü rechts unten am Beitrag -> Mark this post as the correct answer
Das Blau ist bei mir schwer lesbar.........
-
@Negalein Bei mir steht unter dem 3 Punktemenü unter dem Beitrag nur Lesezeichen (Herzchen) und Beitrag melden.
-
@Olivbus sagte in Script vergleicht Werte falsch:
@Negalein Bei mir steht unter dem 3 Punktemenü unter dem Beitrag nur Lesezeichen (Herzchen) und Beitrag melden.
Ja, weil die passende Antwort bereits als Lösung markiert wurde.
Siehst du an dem grünen Rahmen des Beitrags.