Seite 3 von 6

Re: Spielzeug :)

Verfasst: 25. Jun 2023 20:38
von spirit
Hallo :)

Wie habt ihr es denn gelöst die Werte ohne entsprechende Nachkommastellen bzw. mit vorgegebenen Nachkommastellen darzustellen?

Die übliche Konfiguration im Item funktioniert leider nicht.

Daher kommt es zum scrollen (was wiederum den WAF nicht erfüllt) :D

Hier zum Beispiel die Erzeugung der PV Anlage. 62,44kWh sollen angezeigt werden. Tatsächlich ist der Wert aber viel länger.

Danke!
IMG_4082.jpeg

Re: Spielzeug :)

Verfasst: 25. Jun 2023 21:58
von udo1toni
Der Wert mag in openHAB viel länger angezeigt werden, dabei vergisst Du aber vermutlich, dass openHAB Float als Zahlenformat verwendet.
Float kann Werte von ≈-3.4*10^38 bis +3,4*10^38 darstellen, und zwar mit 32 Bit. Es sollte klar sein, dass dieser Wertebereich nur (äußerst) verlustbehaftet abgedeckt werden kann. Float codiert den Wert in Form einer 23 Bit großen Mantisse und einem 8 Bit großen Exponenten (+ 1 Bit Vorzeichen).
Wenn der Wert dann als Dezimalzahl dargestellt werden soll, wird dieser Rundungsfehler gnadenlos übernommen. Das betrifft sogar Ganzzahlen...

Und noch ein weiterer Punkt sollte klar sein: Messwerte müssen... gemessen werden. Energiemessung kann hochpräzise erfolgen - dann kosten die Messgeräte schnell sechsstellig aufwärts plus Labor plus häufige Kalibrierung. Oder man lebt mit etwa 5 % Messfehler (oder mehr...). Bei einer Leistung von 100 Watt wären das also etwa +/- 5 Watt, da sollte spätestens die zweite Nachkommastelle keine Rolle mehr spielen. :)

Re: Spielzeug :)

Verfasst: 26. Jun 2023 07:50
von spirit
Rundungstoleranzen würde ich natürlich in Kauf nehmen. Bei den PV Anlagen schwankt der Wert ja so oder so innerhalb von Sekunden gern mal ziemlich :)

Ich habe auch schon versucht die Werte (z.B. 3120W) durch 1000 rechnen zu lassen, doch leider kommt dabei dann 3,120000kW raus.

Re: Spielzeug :)

Verfasst: 26. Jun 2023 18:22
von udo1toni
Es geht ja nicht darum, den Wert zu teilen, stattdessen willst Du die Anzahl angezeigter (Nachkomma-)stellen begrenzen.

Re: Spielzeug :)

Verfasst: 26. Jun 2023 19:08
von spirit
Ja genau, nur wie am besten :D

Re: Spielzeug :)

Verfasst: 26. Jun 2023 19:54
von udo1toni
Normal wirst Du das nur für das Display machen, in diesem Fall (Ausgabe über AwTrix light) musst Du lediglich sowas machen:

Code: Alles auswählen

String.format("%1.1f",(Item.state as Number).floatValue)
%1 ist der erste übergebene Wert
.1 ist eine Nachkommastelle
f bedeuetet, es handelt sich um einen Float Wert.

Entsprechend muss auch ein Float Wert angeliefert werden :)

Re: Spielzeug :)

Verfasst: 28. Jun 2023 15:42
von spirit
Genau fürs Display reicht das vollkommen.

Wenn ich das nun in deine Rule einbauen will, komme ich aber leider nicht klar.

So sieht eine der Rules aus. Wie bekomme ich deine Lösung nun mit " + strPower +" zusammen? :)

Vielen Dank schon mal.

Code: Alles auswählen

rule "Awtrix Light Stromertrag PV"
when
    Item Stromerzeugung_PV_Gesamt_Heute_kWh changed // Wert geändert
then
    if(tSend3 !== null)                               // Timervariable gesetzt?
        return;                                      // dann Abbruch

    val strPower = newState.toString                 // hole den Wert als String

    // json Objekt bauen
    val json='{"pos" : 5,"text" : "' + strPower + 'kWh","icon" : 48314,"duration" : 12,"rainbow": false,"color" : "#FFFFFF"}'

    Awtrix_Stromertrag.sendCommand(json)                     // json senden

    tSend3 = createTimer(now.plusSeconds(20), [|      // Zeitsperre aktivieren
        tSend3 = null                                 // Timervariable löschen
    ])
end

Re: Spielzeug :)

Verfasst: 28. Jun 2023 16:01
von udo1toni
Was ist Stromerzeugung_PV_Gesamt_Heute_kWh für ein Item (exakt... String? Number? Number:Power? Number:Energy?)

Re: Spielzeug :)

Verfasst: 28. Jun 2023 16:02
von spirit
Smartmeter Items:

Code: Alles auswählen

Number             Stromerzeugung_PV_Gesamt_Heute_kWh   "Erzeugung PV-Anlagen Heute [%.2f kWh]"             <energy>

Re: Spielzeug :)

Verfasst: 28. Jun 2023 16:07
von udo1toni
Dann so:

Code: Alles auswählen

rule "Awtrix Light Stromertrag PV"
when
    Item Stromerzeugung_PV_Gesamt_Heute_kWh changed // Wert geändert
then
    if(tSend3 !== null)                               // Timervariable gesetzt?
        return;                                      // dann Abbruch

    val strPower = String.format("%.1f",newState as Number)                 // hole den Wert als String

    // json Objekt bauen
    val json='{"pos" : 5,"text" : "' + strPower + 'kWh","icon" : 48314,"duration" : 12,"rainbow": false,"color" : "#FFFFFF"}'

    Awtrix_Stromertrag.sendCommand(json)                     // json senden

    tSend3 = createTimer(now.plusSeconds(20), [|      // Zeitsperre aktivieren
        tSend3 = null                                 // Timervariable löschen
    ])
end