Items runden...

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

harteknut
Beiträge: 235
Registriert: 3. Dez 2019 08:21
Answers: 9

Items runden...

Beitrag 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...?
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

Benutzeravatar
PeterA
Beiträge: 1106
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Items runden...

Beitrag von PeterA »

Wie ist denn das Item in der Sitemap definiert ?

Weil so:

Code: Alles auswählen

label="Temperatur [%.1f °C]"
Wird der Wert in der Sitemap nur mit einer Nachkommastelle dargestellt.

Oder so:

Code: Alles auswählen

label="Temperatur [%.2f °C]"
Dann sind es zwei Nachkommastellen usw...
- OpenHab 2.4
#PWRUP

Benutzeravatar
udo1toni
Beiträge: 15265
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: Items runden...

Beitrag 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 ;)
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Benutzeravatar
peter-pan
Beiträge: 2769
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: Items runden...

Beitrag 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.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

Benutzeravatar
udo1toni
Beiträge: 15265
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: Items runden...

Beitrag von udo1toni »

Es ging hier ausdrücklich um die Anzeige auf einem externen Gerät :) da hilft das Label in der Sitemap leider nichts.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Benutzeravatar
peter-pan
Beiträge: 2769
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: Items runden...

Beitrag 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 :oops: , Sorry !!!
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

Benutzeravatar
OliverCJ
Beiträge: 405
Registriert: 29. Aug 2017 12:41
Answers: 3
Wohnort: Bergisch Gladbach

Re: Items runden...

Beitrag 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???

_______________________________________________
Homematic IP Komponenten an CCU 3 (wächst stetig)
Innogy Smarthome System (verabschiedet sich langsam)
Philips Hue Beleuchtung
Fritz!Box
VU+ Solo SAT-Receiver
2 Squeezeboxen
Denon Heos System

Benutzeravatar
udo1toni
Beiträge: 15265
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: Items runden...

Beitrag von udo1toni »

Ja, da hast Du natürlich Recht. Wir müssen also auf harteknut warten... :)
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

harteknut
Beiträge: 235
Registriert: 3. Dez 2019 08:21
Answers: 9

Re: Items runden...

Beitrag 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...

Benutzeravatar
peter-pan
Beiträge: 2769
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: Items runden...

Beitrag von peter-pan »

:lol: :lol: :lol: 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
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

Antworten