NEWS
[gelöst] Rechnen mit Datenpunkt --> NaN
-
ich brauche mal einen Tipp.
bei diesem Teil meines Programmes habe ich etwas Schwierigkeiten meinen Knoten im Kopf zu lösen. Hier soll eine Höhe aus einem DP geholt und ein Volumen errechnet werden. Wo ich das Programm erstellt hatte (ein gutes Jahr her) funktionierte das. Heut wollte ich etwas ändern bekomme für das Volumen nur noch NaN angezeigt. Kann leider nicht sagen seit wann das nicht mehr geht.
Zum Vergleich hatte ich die "Füllhöhe h2" direkt im Script definiert. Damit wird das Volumen korrekt berechnet.
Der DP von h1 selbst ist auch auf "Number" gestellt. Hmmm, nun weis ich nicht mehr weiter...var r1 = 0.93; var L1 = 0.55; function rechnen () { let h1 = getState('mqtt.0.ESP-Zisterne.Füllstand.Füllhöhe').val / 100; //--> im DP ist zum Testen auf 1.8 eingetragen let h2 = 180 / 100;; //Formel let Vh1 = (r1 * (r1 * 2 * Math.acos(1 - h1 / r1)) / 2 - (2 * Math.sqrt(2 * r1 * h1 - Math.pow(h1, 2))) * (r1 - h1) / 2) * L1; let Vh2 = (r1 * (r1 * 2 * Math.acos(1 - h2 / r1)) / 2 - (2 * Math.sqrt(2 * r1 * h2 - Math.pow(h2, 2))) * (r1 - h2) / 2) * L1; log('typeof h1: ' + typeof h1); log('typeof h2: ' + typeof h2); log('Vh1: ' + Vh1); log('Vh2: ' + Vh2); } schedule('*/1 * * * *', rechnen); rechnen();
Ergebnis:
javascript.1 2020-05-03 13:20:19.046 info (1452) script.js.Verbrauch.Zisterne_Test: Vh2: 1.4798840966802418 javascript.1 2020-05-03 13:20:19.045 info (1452) script.js.Verbrauch.Zisterne_Test: Vh1: NaN javascript.1 2020-05-03 13:20:19.044 info (1452) script.js.Verbrauch.Zisterne_Test: typeof h2: number javascript.1 2020-05-03 13:20:19.043 info (1452) script.js.Verbrauch.Zisterne_Test: typeof h1: number javascript.1 2020-05-03 13:20:18.994 info (1452) Start javascript script.js.Verbrauch.Zisterne_Test
Mir war so als hätte ich dazu schon einmal was im Forum gelesen. Wenn, dann finde ich den Beitrag nicht mehr.
-
@Lenny-CB sagte
let h1 = getState('mqtt.0.ESP-Zisterne.Füllstand.Füllhöhe').val / 100; //--> im DP ist zum Testen auf 1.8 eingetragen
let h1 = parseFloat(getState('mqtt.0.ESP-Zisterne.Füllstand.Füllhöhe').val) / 100;
-
@paul53 das hatte ich auch schon probiert, leider ohne Erfolg.
Mir ist jetzt beim Testen aufgefallen, dass es am mqtt-DP liegen muss. Baue ich den DP unter javascript.1.xxxxx nach, klappt es wunderbar.var r1 = 0.93; var L1 = 0.55; function rechnen () { let h1 = parseFloat(getState('mqtt.0.ESP-Zisterne.Füllstand.Füllhöhe').val) / 100; let h2 = getState('javascript.0.Variablen.Füllstand.Füllhöhe').val / 100; //Formel let Vh1 = (r1 * (r1 * 2 * Math.acos(1 - h1 / r1)) / 2 - (2 * Math.sqrt(2 * r1 * h1 - Math.pow(h1, 2))) * (r1 - h1) / 2) * L1; let Vh2 = (r1 * (r1 * 2 * Math.acos(1 - h2 / r1)) / 2 - (2 * Math.sqrt(2 * r1 * h2 - Math.pow(h2, 2))) * (r1 - h2) / 2) * L1; log('typeof h1: ' + typeof h1); log('typeof h2: ' + typeof h2); log('Vh1: ' + Vh1); log('Vh2: ' + Vh2); } schedule('*/1 * * * *', rechnen); rechnen();
20:09:00.002 info javascript.1 (1452) script.js.Verbrauch.Zisterne_Test: typeof h1: number 20:09:00.003 info javascript.1 (1452) script.js.Verbrauch.Zisterne_Test: typeof h2: number 20:09:00.003 info javascript.1 (1452) script.js.Verbrauch.Zisterne_Test: Vh1: NaN 20:09:00.003 info javascript.1 (1452) script.js.Verbrauch.Zisterne_Test: Vh2: 1.4798840966802418
hier noch die RAW der DP:
mqtt:{ "from": "system.adapter.mqtt.0", "user": "system.user.admin", "ts": 1578062686565, "common": { "name": "ESP-Zisterne/Füllstand/Füllhöhe", "type": "number", "def": 0, "write": true, "read": true }, "native": {}, "acl": { "object": 1636, "owner": "system.user.admin", "ownerGroup": "system.group.administrator", "state": 1636 }, "_id": "mqtt.0.ESP-Zisterne.Füllstand.Füllhöhe", "type": "state" }
und noch der JS:
{ "from": "system.adapter.admin.0", "user": "system.user.admin", "ts": 1588528781710, "common": { "name": "Variablen/Füllstand/Füllhöhe", "type": "number", "unit": "cm", "def": 0, "read": true, "write": true }, "native": {}, "acl": { "object": 1636, "owner": "system.user.admin", "ownerGroup": "system.group.administrator", "state": 1636 }, "_id": "javascript.0.Variablen.Füllstand.Füllhöhe", "type": "state" }
weis grad nicht weiter...
-
@Lenny-CB
Was liefert ?log(getState('mqtt.0.ESP-Zisterne.Füllstand.Füllhöhe').val); log(parseFloat(getState('mqtt.0.ESP-Zisterne.Füllstand.Füllhöhe').val));
-
@paul53 sagte in Rechnen mit Datenpunkt --> NaN:
log(getState('mqtt.0.ESP-Zisterne.Füllstand.Füllhöhe').val); log(parseFloat(getState('mqtt.0.ESP-Zisterne.Füllstand.Füllhöhe').val));
beides dasselbe. Genau was in DP steht.
22:05:07.866 info javascript.1 (1452) script.js.Verbrauch.Zisterne_Test: 189.98 22:05:07.866 info javascript.1 (1452) script.js.Verbrauch.Zisterne_Test: 189.98
-
@Lenny-CB sagte:
beides dasselbe. Genau was in DP steht.
Dann bin ich mit meinem Latein am Ende.
Edit: Doch nicht.
1 - 1.8998/0.93 ist kleiner als -1 und kann mit Math.acos() nicht berechnet werden (Ergebnis: NaN). -
Edit: Doch nicht.
1 - 1.8998/0.93 ist kleiner als -1 und kann mit Math.acos() nicht berechnet werden (Ergebnis: NaN).genau der entscheidende Punkt! Ich hatte mir Math.acos() und den Bereich von -1 bis 1 auch schon angesehen, da ich aber in den "manuellen DP" immer 180cm eingetragen hatte, passte die Rechnung. Zwischenzeitlich regnete es aber und die Zisterne füllte sich bin in den Dome rein.
Daher ging es mit dem javascript-DP und mit dem mqtt-DP nicht.Was ist nun passiert:
die Messung ergab 189cm Füllhöhe die von mqtt-DP abgebildet wurden. Der Durchmesser meines berechneten Zylinders (ohne Dome) beträgt 93cm.
93cm * 2 = 186cm. Wenn ich nun ein Volumen berechen will, welches mehr als den doppelten Radius als Füllhöhe hat, wird es immer mit NaN enden.@paul53 nochmal vielen Dank, das war wieder der richtig Tipp!