NEWS
[gelöst]ObjectBinding-2 Werte subtrahieren&runden
-
Hallo,
ich habe zwei Temperaturen, die ich direkt in Vis voneinander subtrahieren möchte. Das funktioniert auch mit einem HTML-Widget mit folgendem EIntrag
{t1:modbus.0.inputRegisters.0_T_WZ_AI;t2:hm-rpc.0.xxxxxxxxxx.1.TEMPERATURE;t1-t2}
Jetzt möchte ich das ganze auf 1 Nachkommastelle runden, da mir als Ergebnis manchmal 1.6000000000 o.ä. angezeigt wird. Das funktioniert aber so
{t1:modbus.0.inputRegisters.0_T_WZ_AI;t2:hm-rpc.0.xxxxxxxxxx.1.TEMPERATURE;t1-t2;round(1)}
nicht. Dann bekomme ich 0 angezeigt.
Bei meiner Windgeschwindigkeit funktioniert es mittels{openweathermap.0.forecast.current.windSpeed;*(3.6);round(1)}km/h
Wo ist mein Denkfehler
Gruß
Dolomiti -
@Dolomiti
wenn ich es richtig verstehe, dann gibt "round" immer nur ein ganzzahliges (also ohne Nachkommastellen) Ergebnis aus.Du könntest versuchen den errechneten Wert vor der Rundung mit 10 zu multiplizieren und nach der Rundung durch 10 zu dividieren um auf eine Nachkommastelle zu kommen.
-
@BBTown
In der Doku steht:round(N) - round the value with N places after point, e.g. 34.678;round(1) => 34.7
Bei der Windgeschwindigkeit geht das ja auch.
-
@Dolomiti ich habe nicht in der Doku nachgeschaut, sondern per google nach "round" in Verbindung mit JavaScript gesucht .... wenn es sich in ioBroker spezifisch/atypisch verhält, dann passt meine Antwort natürlich nicht
hast Du meinen Vorschlag denn mal ausprobiert?
Allgemein gäbe es unter JavaScript sonst noch "num.toFixed()"
Ich weiss aber nicht ob dies auch in ioBroker Anwendung findet?! -
versuch mal:
{t1:modbus.0.inputRegisters.0_T_WZ_AI;t2:hm-rpc.0.xxxxxxxxxx.1.TEMPERATURE;(t1-t2).toFixed(1)}
Sollte funktionieren. (Habs bei mir mit zwei Werten getestet da gehts)
-
-
@Dolomiti
Wenn ich es richtig verstanden habe, dann ist das Ergebnis von toFixed ein String; falls Du im Anschluss weiter mit solchen Werten rechnen wollen würdest -
@BBTown
Hab ich auch grad gelesen. Alternativ geht evtl. toPrecision. Allerdings muss man hier die Vorkommastellen mit einbeziehen. Für mich is toFixed i.O., da ich die Differenz nur im Vis anzeigen möchte.Danke für die Unterstützung
Edit: Hab grad noch mal nachgelesen und festegestellt, dass Round auf einen Integer rundet. W3schools. Falls also das Round aus der Vis-Doku und das oben beschriebene Round gleich funktionieren, stimmt die Vis-Doku nicht ganz und das kann nicht funktionieren.
-
Ich benutzte die Bindings in einem Html-Widget in Vis-2 und habe darin genau dasselbe Problem.
Leider funktioniert round im Binding anscheinend nur bei einfachen Ausdrücken,
obwohl die Doku https://github.com/ioBroker/ioBroker.vis#bindings-of-objects round als Möglichkeit nennt.Hier funktioniert es, sogar mit Auswertung eines JSON im Binding:
{mqtt.0.Shelly-Pro-3EM.events.rpc; json(params.em:0.total_act_power); round(0)} Watt
Diese beiden Versionen funktionieren NICHT, es kommt 0 heraus.
(die Zahl 166464.8 ist bei mir nur eine Korrektur, damit die Werte mit meinem Stromzähler übereinstimmen):{wert: alias.0.ShellyPro3Em_Emdata_total_sum; (166464.8 + parseInt(wert)/1000); round(2)} {wert: alias.0.ShellyPro3Em_Emdata_total_sum; parseInt(166464.8 + wert/1000); round(2)}
Erste Lösung: toFixed sieht zunächst mal ganz gut aus:
{wert: alias.0.ShellyPro3Em_Emdata_total_sum; (166464.8 + parseInt(wert)/1000).toFixed(2)}
ABER: toFixed ist unzuverlässig. Mal wird kaufmännisch gerundet, mal wird aber auch nur nach unten gerundet
Mit toFixed funktioniert das also mal und mal nicht …Lösung, die bisher bei mir zuverlässig funktioniert:
{wert: alias.0.ShellyPro3Em_Emdata_total_sum; Math.round((166464.8 + wert/1000)*100)/100}
Ich habe übrigens lange gesucht, bis ich herausgefunden habe, dass Binding im vis-2 im html-Widget funktioniert.
Damit habe ich viele Formatierungsprobleme in vis-2 durch Tabellen gelöst.Für alle die das auch noch nicht wissen, hier eine Beispiel-Tabelle:
<table style="width:100%"> <tr> <td style="color:#000000;width:60%; color: white"><b>Shelly Pro 3EM</b></td> <td align="left"> </td> </tr> <tr> <td style="color:#000000">Gesamtleistung aktuell</td> <td color="#ff0000">{mqtt.0.Shelly-Pro-3EM.events.rpc;json(params.em:0.total_act_power);round(0)} Watt</td> </tr> <tr> <td style="color:#000000">Zählerstand  <font color="grey">{0_userdata.0.Zaehlerstand_bei_Sonnenaufgang}</font></td> <td color="#ff0000">{wert: alias.0.ShellyPro3Em_Emdata_total_sum; (166464.8 + parseInt(wert)/1000).toFixed(2)}</td> </tr> </table>