NEWS
"Rechnen" in Widgets
-
@Xanto
wenn ich es richtig verstehe hast du den wert 200 sekunden und du möchtest 3 minuten 20 sekunden anzeigen. dann
200/60 = 3.33333, davon die ganzzahl ist 3
Math.floor(3.333333) = 3
dann wilst du aus dem rest die 20 sekunden berechnen
dann musst du den rest wieder mit 60 (sekunden) multiplizieren
3.33333-3=0.33333
0.33333*60 = 20Alternativ kann man auch den modulo-operator nehmen
200 % 60 = 20und das als komplette Formel
var sec = 200;
Math.floor(sec/60) + ' Minuten ' + sec % 60 + ' Sekunden';Wenn du den Chrome installiert hast, dann kann man das in der dev-console sehr gut direkt ausprobieren und rumspielen
https://developers.google.com/web/tools/chrome-devtools/console -
@OliverIO
Das ist ein sehr guter Ansatz mit dem modulo-operator. Mit dem hatte ich vorher noch nicht gearbeitet und da es den im HTML Widget auch gibt habe ich den da mal probiert.Leider funktionierte das nicht so wie gewünscht
<table> <tr> <td>{sonoff.0.OG_Flur_Li_A9A4CD.PulseTime1;-(100);/(60);-(0.5);round(0)} min</td> <td>{sonoff.0.OG_Flur_Li_A9A4CD.PulseTime1;%(60)} sek</td> </tr> </table>
brachte mir als Ausgabe bei Pulsetime 250
2 min 250 (Active 250) sek
Wenn ich alles berücksichtige müsste es ja
{sonoff.0.OG_Flur_Li_A9A4CD.PulseTime1;-(100);%(60)} sek
heißen, was bei den Sekunden allerdings ein 150 bringt. Jemand eine Idee wie das funktionieren könnte?
-
@Xanto hm da könnte natürlich noch das problem sein, das die logik des bindings das falsch versteht und nicht als operator verwendet. da müsste man mal rein debuggen
-
@Xanto sagte in "Rechnen" in Widgets:
{sonoff.0.OG_Flur_Li_A9A4CD.PulseTime1;%(60)}
ändere mal in
{v:sonoff.0.OG_Flur_Li_A9A4CD.PulseTime1; v%(60)}
dann geht es
-
@SBorg Das hatte ich zwischenzeitlich auch schon probiert, da gibts als Ergebnis nur ein "NaN"
Ich versuche mal ob ich die Formel mit math.floor (floor im HTML Widget) hin bekomme. Ich vermute auch stark das modulo entweder in dem Widget anders zu verstehen ist oder einfach nicht funktioniert.
Aber das sehe ich nach dem Test.
Edit: Test beendet... egal wie, die Berechnung wie oben bei den Minuten beschrieben funktioniert. Mit Value Zuweisung geht nicht.
Die Probleme liegen bei dem Datenpunkt. Jedesmal wenn der Datenpunkt verändert wird, dann verarbeitet das Tasmota Sonoff Endgerät die Daten und schreibt wie in dem letzten Post schon beschrieben z.B. 250 ( Active 250 ) in den Datenpunkt. Deshalb hatte ich gestern auch die Ausgabe2 min 250 (Active 250) sek
Ich habe das ganze mal mit einem manuell erstellten Nummer-Datenpunkt probiert. Das funktionierte wie gewünscht.
Jetzt muss ich mal überlegen wie ich diese neuen Erkenntnisse verwenden kann. -
@Xanto auch kein Problem
{v:sonoff.0.OG_Flur_Li_A9A4CD.PulseTime1; parseFloat(v)%(60)}
oder parseInt für Ganzzahl.
-
@SBorg cool das funktioniert wie gewünscht....
der Code sieht jetzt also innerhalb des Widget wie folgt aus und kann ohne Javascript direkt vom HTML Widget aus benutzt werden
<table> <tr> <td>{sonoff.0.OG_Flur_Li_A9A4CD.PulseTime1;-(100);/(60);-(0.5);round(0)} min</td> <td>{v:sonoff.0.OG_Flur_Li_A9A4CD.PulseTime1; (parseFloat(v)-(100))%(60)} sek</td> </tr> </table>
Danke an die Helfer
-
@Xanto Ob es so unbedingt einfacher ist, geht aber und kommt mit der Hälfte der Berechnungen aus:
{v:javascript.0.VIS.Wunschliste.Nummer_0.Sender; parseInt((parseFloat(v)-100)/(60))} min {v:javascript.0.VIS.Wunschliste.Nummer_0.Sender; (parseFloat(v)-100)%(60)} sek
-
@SBorg sehr schön, kann man negative werte auch ausschließen und stattdessen nur 0 ausgeben... alle werte unter 100 würde ich dann 0 setzen wollen.
Probiere noch ein wenig rum, wenn du es natürlich gleich parat hast wäre es nett... -
@Xanto zB. so:
{v:javascript.0.VIS.Wunschliste.Nummer_0.Sender; parseInt(v) > 100 ? parseInt((parseFloat(v)-100)/(60)) : 0} Min
-
@SBorg said in "Rechnen" in Widgets:
parseInt(v) > 100 ? parseInt((parseFloat(v)-100)/(60)) : 0
cool, wenn ich das sehe verstehe ich das auch immer, allerdings um das selber hinzubekommen muss ich wohl noch üben... danke dafür
-
@Xanto sagte in "Rechnen" in Widgets:
muss ich wohl noch üben...
Ist noch kein Meister vom Himmel gefallen
...aber Übung macht den Meister -
Ich hab ein Problem: Meine Variablen mit denen ich gerne rechen würden enthalten Doppelpunkte im Namen (mqtt mit mac adresse des jeweiligen ursprungsgeräts...) gibt's da nen workaround? hab probiert mit einfachen und doppelten anführungszeichen, oder auch mit \ escapen hat leider alles nix genutzt bisher...
-
@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',' ')}