Hallo zusammen,
ich habe ne kurze Frage zum Thema "Datenformate". Ist eigentlich ein Standardthema, aber in openHAB entweder sehr kompliziert oder mir einfach nicht richtig beizubringen. Ich habe ein Standard-Termperatur-Item, folgendermaßen in der Items-Datei konfiguriert:
Code: Alles auswählen
Number:Temperature OOWMLocalWeatherAndForecastCurrentApparentTemperature "gefühlte Außentemperatur" (gWetter) {channel="openweathermap:weather[...]"}
Damit läuft alles prima, bis auf die unschöne Geschichte, dass der Wert (also der Value, der wg. dem ":Temperature" vom Typ "QuanitityType" ist) manchmal zwei Nachkommastellen hat, und da lacht meine Familie weil der Wert auf einem Display an der Tür angezeigt wird und fragt, ob ich den nicht mal auf eine Nachkommastelle runden könnte (also nur in der Anzeige, nicht den Wert selbst, der darf in dem Item gerne so bleiben).
Na klar, mach ich mal eben, hab ich gedacht, dann ist ein halber Tag draus geworden, jetzt sind alle Temperaturen auf eine Nachkommastelle gerundet.
Und das sieht dann so aus:
Code: Alles auswählen
val T_akt = ((Math::round(10*(OWMLocalWeatherAndForecastCurrentApparentTemperature.state as QuantityType<Number>).floatValue).floatValue)/10).toString
Und raus kommt der String-Baustein, ohne Einheit und eben schön gerundet. Aber ich frage mich schon, ob man das nicht auch ein bisschen eleganter formulieren könnte, meine Zeile sieht schon irgendwie nach trial-and-error aus...
Gibts da was...?
von udo1toni » 27. Nov 2020 16:58
Seltsam, dass der Formatter an dieser Stelle keine Units unterstützt, in Labels geht es ja auch (und dort wird meines Wissens der gleiche Formatter verwendet. Aber vielleicht wird die Funktion vorher überladen, wer weiß...)
Damit Du dennoch die Einheit bekommst, kannst Du natürlich die Einheit "manuell" mit in den String schreiben:
Code: Alles auswählen
val T_akt = String::format("%.1f °C",(OWMLocalWeatherAndForecastCurrentApparentTemperature.state as QuantityType<Number>).floatValue)
Es gibt natürlich immer noch ein potenzielles Problem, nämlich, wenn das Item keinen gültigen Wert enthält. Deshalb ist es anzuraten, über eine lokale Konstante zu gehen:
Code: Alles auswählen
var Number nTemp = -274
if(OWMLocalWeatherAndForecastCurrentApparentTemperature.state instanceof Number)
nTemp = OWMLocalWeatherAndForecastCurrentApparentTemperature.state as QuantityType<Number>).floatValue
var String T_akt = ""
if(nTemp > -274)
T_akt = String::format("%.1f °C",nTemp)
else
T_akt = "- °C"
Beim Umweg über die Variable nTemp sollte es definitiv auch ohne QuantityType gehen (also nur mit as Number).
Der Punkt ist aber natürlich ein anderer. Liefert der Sensor (bzw. hier openWeatherMap) mal keinen Wert, so bricht die Rule nicht mit einer nullPointerException ab, sondern malt einen hübschen Strich statt des Wertes.

Gehe zur vollständigen Antwort