Also grundsätzlich ist ein state ein state und kein String. Entsprechend gibt es auch kein Objekt .length. Man kann aber aus jedem state einen String machen (mit .toString) und dann gibt es auch das Objekt .length. Die saubere Variante ist aber, die Werte in Zahlen zu wandeln.
Code: Alles auswählen
rule "kWh und MWh nach MWh"
when
Item kWh changed or // Number Item Eingang
Item MWh changed // Number Item Eingang
then
val Number nKwh = Float::parseFloat(kWh.state.toString.replace(",","."))
val Number nMwh = Integer::parseInt(MWh.state.toString)
val Number nErg = nMWh*1000 + nKWh
Anzeige.postUpdate(nErg) // Number Item Ausgang
end
Nun liegt die Anzahl der kWh als Zahl in einem Item vor.
Das replace wird gebraucht, falls der Zahlenwert tatsächlich ein Komma als Dezimaltrenner enthält.
Ich habe die Rule nicht getestet

aber so sollte es gehen.
Für meine PV-Anlage zimmere ich die verschiedenen Werte als String zusammen (Momantan / Tag / Jahr /Total) wobei ich die Einheiten automatisch anpasse. Die rule hatte ich schon vor UoM im Einsatz, es könnte sein, dass man da jetzt bequemere Wege nutzen kann:
Code: Alles auswählen
rule "PV-Anlage Update"
when
Item PV_Current received update
then
var String strCurr = "Err; "
var String strDay = "Err; "
var String strYear = "Err; "
var String strTotal = "Err; "
logDebug("PV-update", "Start der Rule")
if (PV_Current.state instanceof Number) {
if (PV_Current.state > 1000)
strCurr = String::format("%.2f kW; ", (PV_Current.state as Number) / 1000)
else
strCurr = PV_Current.state.format("%d W; ")
}
logDebug("PV-update", "strCurr = {}",strCurr)
if (PV_DaySum.state instanceof Number) {
if (PV_DaySum.state > 1000)
strDay = String::format("%.2f kWh/d; ", (PV_DaySum.state as Number) / 1000)
else
strDay = PV_DaySum.state.format("%d Wh/d; ")
}
logDebug("PV-update", "strDay = {}",strDay)
if (PV_YearSum.state instanceof Number) {
if (PV_YearSum.state > 1000000)
strYear = String::format("%.2f MWh/y; ", (PV_YearSum.state as Number) / 1000000)
else if (PV_YearSum.state > 1000)
strYear = String::format("%.2f kWh/y; ", (PV_YearSum.state as Number) / 1000)
else
strYear = PV_YearSum.state.format("%d Wh/y; ")
}
logDebug("PV-update", "strYear = {}",strYear)
if (PV_Total.state instanceof Number) {
if (PV_Total.state > 1000000)
strTotal = String::format("%.2f MWh/t", (PV_Total.state as Number) / 1000000)
else if (PV_Total.state > 1000)
strTotal = String::format("%.2f kWh/t", (PV_Total.state as Number) / 1000)
else
strTotal = PV_Total.state.format("%d Wh/t")
}
logDebug("PV-update", "strTotal = {}",strTotal)
MyPV.postUpdate(strCurr + strDay + strYear + strTotal)
end
Ich war zu faul, mit die Funktion als Lambda anzulegen. Die ersten beiden Werte können maximal im kWh-Bereich liegen, entsprechend lohnt es sich dort nicht, die Umrechnung für MWh vorzusehen. Die Itemnamen sollten sprechend sein

und in der Sitemap sieht das Ganze dann so aus:
pv3.png
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet