Seite 1 von 2
Items runden...
Verfasst: 27. Nov 2020 00:14
von harteknut
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...?
Re: Items runden...
Verfasst: 27. Nov 2020 09:17
von PeterA
Wie ist denn das Item in der Sitemap definiert ?
Weil so:
Wird der Wert in der Sitemap nur mit einer Nachkommastelle dargestellt.
Oder so:
Dann sind es zwei Nachkommastellen usw...
Re: Items runden...
Verfasst: 27. Nov 2020 09:19
von udo1toni
Mit UoM habe ich noch nicht so viel gemacht, aber ich vermute mal, dass Du die Formatierung exakt so verwenden kannst, wie das auch in einem Label funktioniert:
Code: Alles auswählen
val T_akt = String::format("%.1f %unit%",(OWMLocalWeatherAndForecastCurrentApparentTemperature.state as Number))
Es kann sein, dass Du auf das as Number auch verzichten kannst, oder dass Du tatsächlich as QuantityType<Number> schreiben musst. Falls es auch ohne das as Number funktioniert, können natürlich auch die umschließenden Klammern wegfallen.
Edit: Die Länge des Ausdrucks ist größtenteils der Itembenennung geschuldet

Re: Items runden...
Verfasst: 27. Nov 2020 10:48
von peter-pan
Eine weitere Möglichkeit ist:
Code: Alles auswählen
Number:Temperature OOWMLocalWeatherAndForecastCurrentApparentTemperature "gefühlte Außentemperatur [%.1f %unit%]" (gWetter) {channel="openweathermap:weather-and-forecast:api:local:current#apparent-temperature"}
Also das Verwenden eines Suffix/Pattern/Formatter in der Item-Label-Definition.
Allerdings muss ich sagen, dass bei mir der Wert standardmässig(ohne Formatter) mit einer Nachkommastelle angezeigt wird, auch wenn ein zweistelliger Dezimalwert im Item-State steht. Das erledigt wohl das Binding bereits selber.
Re: Items runden...
Verfasst: 27. Nov 2020 12:00
von udo1toni
Es ging hier ausdrücklich um die Anzeige auf einem externen Gerät

da hilft das Label in der Sitemap leider nichts.
Re: Items runden...
Verfasst: 27. Nov 2020 12:21
von peter-pan
udo1toni hat geschrieben: ↑27. Nov 2020 12:00
Es ging hier ausdrücklich um die Anzeige auf einem externen Gerät
Oooh, das hab ich doch glatt überlesen. Wer lesen kann ist klar im Vorteil

, Sorry !!!
Re: Items runden...
Verfasst: 27. Nov 2020 14:56
von OliverCJ
Naja, ganz genau genommen steht dort "...der Wert auf einem Display an der Tür angezeigt wird ..."
Genauso gut könnte es sich um ein Tablet handeln, auf dem das Habpanel oder eine sitemap läuft. Und dann würde die Definition innerhalb des Items - also für das Label - oder aber in der sitemap völlig ausreichen...
oder vertue ich mich da???
Re: Items runden...
Verfasst: 27. Nov 2020 15:02
von udo1toni
Ja, da hast Du natürlich Recht. Wir müssen also auf harteknut warten...

Re: Items runden...
Verfasst: 27. Nov 2020 16:02
von harteknut
Hallo zusammen,
Tschuldigung, ich brauch zu lange und bin zu langsam. Vielen Dank für die vielen Antworten, ist ja ne echte Diskussion
Konkret möchte ich die Temperatur auf einem LCN-GT4D anzeigen. Dafür baue ich einen String aus verschiedenen Blöcken zusammen und schicke ihn dann per LCN-Action ans Display. Daher ist Udos Hinweis richtig, die Definition über das Item bringt an der Stelle nix.
Die Formatierung über die %.#f-Zeichen ist außerdem viel schöner als meine umständliche Rechnung. Leider wirft Udos Code immer einen Fehler, und Java sagt, es kann mit dem %.#f-Operator nur Floats konvertieren. Also habe ich probiert:
Code: Alles auswählen
val T_akt = String::format("%.1f",((OWMLocalWeatherAndForecastCurrentApparentTemperature.state as Number).floatValue))
und
Code: Alles auswählen
val T_akt = String::format("%.1f",(OWMLocalWeatherAndForecastCurrentApparentTemperature.state.floatValue))
leider beide ohne Erfolg. Aktuell steht da
Code: Alles auswählen
val T_akt = String::format("%.1f",(OWMLocalWeatherAndForecastCurrentApparentTemperature.state as QuantityType<Number>).floatValue)
und das scheint prima zu funktionieren...
Ach so:
Ja, ich mach auch mal die Items-Bezeichnungen kürzer, das kommt noch aus der automatischen Channel-Bezeichnung in Visual Studio Code...
Re: Items runden...
Verfasst: 27. Nov 2020 16:02
von peter-pan

Wie sagt d'r Schwob: Des isch doch Wurscht egal.
Auf jeden Fall haben wir jetzt einige Möglichkeiten aufgezeigt, die der OP bestimmt für sich nutzen kann.
Grüssle aus dem Schwabenland
Peter