NEWS
"Rechnen" in Widgets
-
@tigiba sagte in "Rechnen" in Widgets:
gibt's da nen workaround
Nicht dass ich wüsste.
Vielleicht die Werte in andere Datenpunkte schreiben/synchronisieren.
Oder mit Aliasen? -
@Homoran said in "Rechnen" in Widgets:
Oder mit Aliasen?
Wie funktioniert das mit Aliasen, wo definier ich die?
update: okey, hab das hier gefunden, werd ich mal lesen:
https://forum.iobroker.net/topic/25772/fragen-antworten-rund-um-die-neue-alias-funktionupdate2: ah, jetzt hab ich endlich gefunden wie man aliase anlegt:
https://forum.iobroker.net/topic/25772/fragen-antworten-rund-um-die-neue-alias-funktion/161jetzt wo das erledigt ist & ich die variablen so anzapfen kann, bräucht ich noch die info ob / falls wie ich e^var rechnen kann - würd gern aus temperatur und relative luftfeuchte die absolute berrechnen
-->(6.112 × e^[(17.67 × T)/(T+243.5)] × rh × 2.1674 ) / (273.15+T)
update3: okey, also ich habs geschafft ne rechnung zu basteln die nicht 0, NaN oder undefined ergibt:
{h:alias.0.EG.table.humidity; t:alias.0.EG.table.temperature; (6.112*Math.pow(Math.E,((17.67*parseFloat(t))/(parseFloat(t)+243.5))*parseFloat(h)*0.021674))/(273.15+parseFloat(t))}
aber stimmen tut das ergebnis trotzdem nicht ich muss wohl noch mehr recherchieren...update4: ahh, heute hab ich's endlich geschafft auf den richtigen Wert für die Absolute Luftfeuchte zu kommen:
{h:alias.0.EG.table.humidity; t:alias.0.EG.table.temperature; (6.112*Math.pow(Math.E,((17.67*parseFloat(t))/(parseFloat(t)+243.5)))*parseFloat(h)*18.02)/((273.15+parseFloat(t))*100*0.08314)} g/m³
Und Taupunkt hab ich auch hinbekommen:
{h:alias.0.EG.table.humidity; t:alias.0.EG.table.temperature; ((243.5*(Math.log(parseFloat(h)/100)+((17.67*parseFloat(t))/(243.5+parseFloat(t)))))/(17.67-Math.log(parseFloat(h)/100)-((17.67*parseFloat(t))/(243.5+parseFloat(t))))).toFixed(2)} °C
-
Kann ich bei solchen Rechnungen in VIS Widgets eigentlich irgendwie Teilergebnisse abspeichern und wieder verwenden?
Also z.B. brauch ich den Term "parseFloat(t)" recht häufig, wäre toll wenn ich das durch einen (kurzen) Variablennamen ersetzen könnte und die Funktion nur einmal auseführt werden müsste.
-
@tigiba Ich denke mal, dafür sind die Bindings nicht unbedingt gedacht
Aber nein, Teilergebnisse gibt es nicht, zumindest wüsste ich nicht wie.
Du könntest aber auch wenn es nur um die Berechnung und Darstellung derer geht, direkt JS im HTML-Code nutzen (worauf ich wg. "g (water)/m³" mal tippe). Das ist aber leider wg. des VIS-Editors etwas tricky. Nutzt du bspw. dann "document. write" um dein Ergebnis auszugeben, läuft der Editor nicht mehr, da er nur noch das "document.write" der HTML-Seite ausführt...Ich würde da lieber auf ein externes JS/Blockly zurückgreifen und das Ergebis in einem neuen Datenpunkt speichern.
-
@SBorg Danke für die Antwort!
Ja darüber hab ich auch schon nachgedacht. Hatte hald gehofft, dass ich das alles direkt in der Anzeige ohne zusätzliche Datenpunkte machen könnte, wobei ich wegen der notwendigen Aliasse ohne Doppelpunkt im Namen jetzt eh schon zusätzliche gebraucht hab
UPDATE: Jetzt hab ich noch ne andre Frage:
Ich kann mir im VIS im HTML Widgets den Wert eines Datenpunkt's so holen:
{alias.0.EG.table.temperature}
Und ich kann mir im Javascript den Zeitpunkt der letzten Änderung eines Datenpunkts so holen:
getState('alias.0.EG.table.temperature').ts
--> Kann ich diesen Zeitpunkt der letzten Änderung auch im VIS in einem HTML-Widget irgendwie auslesen? -
@tigiba sagte in "Rechnen" in Widgets:
Kann ich diesen Zeitpunkt der letzten Änderung auch im VIS in einem HTML-Widget irgendwie auslesen?
Sogar ziemlich einfach:
{ts:alias.0.EG.table.temperature.ts; ts;}
-
@SBorg
Vielen Dank!
Um das ganze besser formatiert zu haben bin ich zu folgendem Term gekommen:
{t:alias.0.EG.table.temperature.ts; new Date(t-((new Date()).getTimezoneOffset()*60000)).toISOString().slice(0,-1).replace('T',' ')}
-
@tigiba
etwas einfacher ist noch die im binding eingebaute date-funktion.
https://github.com/ioBroker/ioBroker.vis{alias.0.EG.table.temperature.ts;date(TT.MM.SS hh:mm)}
-
@OliverIO
Perfekt, vielen Dank!
Das selbe Format wie der komplizierte Term oben habe ich mit dieser Anpassung erreicht:{alias.0.EG.table.temperature.ts;date(YYYY-MM-DD hh:mm:ss.sss)}
-
Hallo Zusammen,
ein sehr ergiebiger Thread. Ich hätte auch mal eine Frage - vielleicht hat ja einer von Euch die Lösung.
Ich rechne in einer Tabelle Temperaturprognosen hoch:<td align="right"><b>{v1:0_userdata.0.WLANTHERMO.Kanal0_5_Minuten;v2:0_userdata.0.WLANTHERMO.Kanal0;parseFloat(v1)*6+parseFloat(v2)} °C</b></td>
führt zu folgendem Ergebnis:
Eigentlich sollte da: 181,4 rauskommen. Tut es aber nicht. Wenn ich versuche zu runden mit:
<td align="right"><b>{v1:0_userdata.0.WLANTHERMO.Kanal0_5_Minuten;v2:0_userdata.0.WLANTHERMO.Kanal0;parseFloat(v1)*6+parseFloat(v2);round(1)} °C</b></td>
wird der Wert immer 0.
Jemand ne Idee wie ich das lösen könnte. Ich hab jetzt schon aufgegeben und mache ein parseInt() - dann hat die Temperatur halt keine Nachkommastellen mehr....
LG Martin -
Ich habe mir das gerade mal angeschaut.
Der Ausdruck wird intern analysiert und dann entschieden, ob es rein javascript ist oder ob die internen Funktionen verwendet werden.
In diesem Fall wird entschieden das es javascript ist, daher wird der Befehl round nicht gefunden.Als Workaround kannst du aber das hier verwenden
<td align="right"><b>{v1:0_userdata.0.WLANTHERMO.Kanal0_5_Minuten;v2:0_userdata.0.WLANTHERMO.Kanal0;(parseFloat(v1)*6+parseFloat(v2)).toFixed(1)} °C</b></td>
-
@oliverio Grandios - vielen Dank!!!
Du hast ja sogar schon einen issue auf Github aufgemacht -
hast mir noch ne Idee. Ich möchte die "in 5 Minuten" durch tatsächliche Zeiten ersetzten (letzte Änderung + 5 Minuten).
Das funktioniert auch solange ich keine 5 Minuten (300.000 ms) dazuzähle. Scheint ein ähnliches Problem zu sein.
<b>{0_userdata.0.WLANTHERMO.Kanal0_5_Minuten.ts;date(hh:mm:ss)}</b> <br> <b>{v1:0_userdata.0.WLANTHERMO.Kanal0_5_Minuten.ts;(parseInt(v1) + parseInt(300000));date(hh:mm:ss)}</b>
Ergebnis:
Ich hab es auch schon mit toTimeString() versucht - geht auch nicht.
{v1:0_userdata.0.WLANTHERMO.Kanal0_5_Minuten.ts;v1.toTimeString()}
-
@martin-schlender
das habe ich befürchtet, das da auch andere vis-funktionen betroffen sind.
leider ist @apollon77 der Meinung das das so korrekt ist und hat den Issue geschlossen -
@oliverio ja - das hab ich gesehen. Gibt es hierfür auch einen Workaround über javascript?
-
so müsste es gehen. Beim ersten geht die normale Syntax.
sobald man aber den datenpunkt einer variable (v1) zuweist, wird es intern javascript und dann kennt er die eigenen Funktionen nicht mehr.
Der 2.Fall ruft einfach die gleiche Funktion auf, die round aufruft. Im Gegensatz zum eingebauten, benötigt man hier die Anführungsstriche um das format muster.<b>{0_userdata.0.WLANTHERMO.Kanal0_5_Minuten.ts;date(hh:mm:ss)}</b> <br> <b>{v1:0_userdata.0.WLANTHERMO.Kanal0_5_Minuten.ts;vis.formatDate(parseInt(v1) + parseInt(300000),"hh:mm:ss")}</b>
-
issue ist wieder offen
-
@oliverio Und hat ihn wieder auf gemacht nachdem er eines besseren belehrt wurde
-
@apollon77 cool. Aber das sind ja auch komplexe Fälle.
-
Gibt es mittlerweile eine funktionierenden String den ich bei Objekt-ID einfügen kann?
Wenn ich
code_text {value1:worx.0.123.rawMqtt.raw.blade_work_time;value2:worx.0.123.rawMqtt.raw.blade_work_time_reset;value1-value2}
einfüge, dann zeigt er mir immer keinen Wert an. Was mache ich falsch?