Temperaturwerte runden (OH3)

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
iceman
Beiträge: 22
Registriert: 31. Dez 2017 12:16
Answers: 1

Temperaturwerte runden (OH3)

Beitrag von iceman »

Hallo,

ich bastel mir gerade eine Regel wodurch ich mir sämtliche Zimmer und Außentemperatur von Alexa ansagen lasse. Das funktioniert auch soweit hervorragend bis auf das ich die zweite Kommastelle nicht weg bekomme.
Wenn ich unter Pattern über die UI %.1f °C eingebe zeigt er mir dort auch nur eine Kommastelle an, nur wie mache ich das in der Rule, habe da einiges ausprobiert aber nichts hat gefruchtet.
Meine Rule sieht in etwa so aus:

Code: Alles auswählen

var wz_temp = items.HomematicHeizthermostatWandWohnzimmer_ActualTemperature; 
var sz_temp = items.HomematicHeizthermostatWandSchlafzimmer_ActualTemperature;
var bad_temp = items.HomematicHeizthermostatBadezimmer_ActualTemperature;
var kueche_temp = items.HomematicHeizthermostatWandKueche_ActualTemperature;
var sr_temp = items.HomematicHeizthermostatWandServerraum_ActualTemperature;
var aussen_temp = items.HomematicAussenthermometer_Temperature;


events.sendCommand('EchoServerraum_Sprich', ("Folgende Temperaturen habe ich gemessen. Wohnzimmertemperatur " + wz_temp + " .Schlafzimmertemperatur " + sz_temp + " .Badezimmertemperatur " +  bad_temp + 
" .Küchentemperatur " + kueche_temp + " .Serverraumtemperatur " + sr_temp + " .Und der Außenbereich hat " + aussen_temp ));
von iceman » 13. Apr 2021 11:52
Nach einem ausgiebigen ausschlafen hab ich nun endlich ein Lösung gefunden und möchte die nicht vorenthalten.

Code: Alles auswählen

var dummy = Math.round(items.HomematicHeizthermostatServerraum_ActualTemperature*10)/10;
events.sendCommand('EchoServerraum_Sprich', dummy + "Grad" );
Bin mir nicht sicher ob es die optimale Lösung ist aber sie funktioniert, auch bei Nachkommastellen >5
Gehe zur vollständigen Antwort

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

Re: Temperaturwerte runden (OH3)

Beitrag von udo1toni »

Du kannst mittels String::format("%.1f °C",Wert) die gleiche Formatierung anwenden, die auch im Label funktioniert.

Wobei ich nicht sicher weiß, ob dieser Code genau so auch mit JavaScript funktioniert, das Prinzip müsste aber ebenfalls funktionieren.

Vielleicht überdenkst Du Deine Rule noch mal. Eine bessere Möglichkeit wäre, durch eine Liste der Items zu iterieren und so mit drei Zeilen Code alle abzudecken. In der Rules DSL sähe das so aus:
Items:

Code: Alles auswählen

Group gTemp
Number Temperatur_1_Wohnzimmer   "Wohnzimmer"   (gTemp)
Number Temperatur_2_Schlafzimmer "Schlafzimmer" (gTemp)
Number Temperatur_3_Badezimmer   "Badezimmer"   (gTemp)
Number Temperatur_4_Kueche       "Küche"        (gTemp)
Number Temperatur_5_Serverraum   "Serverraum"   (gTemp)
Number Temperatur_6_Aussen       "Außen"        (gTemp)
Codeschnipsel:

Code: Alles auswählen

var String strMessage = "Folgende Temperaturen habe ich gemessen. "
gTemp.members.sortBy[name].forEach[i,j|
    if(j = gTemp.members.size) 
        strMessage = strMessage + "Und "
    strMessage = strMessage + i.label + String::format(" %.1f ",i.state) + "Grad Celsius. "
]
EchoServerraum_Sprich.sendCommand(strMessage)
Zunächst wird die Variable initialisiert (mit dem Anfang des Textes), anschließend wird die Gruppe für jedes Item durchlaufen, sortiert nach dem Itemnamen (wobei durch den Index dafür gesorgt ist, dass die Items in einer definierten Reihenfolge - nicht alphabetisch - gelistet werden.). Für jedes Item wird der Variablen das Label des aktuellen Items hinzugefügt, anschließend der Wert und die Einheit. Damit vor der letzen Temperatur das Wort "Und" gesprochen wird, wird noch der Index ausgewertet.

Wie erwähnt ist dieser Codeschnipsel für die Rules DSL, in JavaScript sollte das aber in anderer Form ebenfalls funktionieren.
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

iceman
Beiträge: 22
Registriert: 31. Dez 2017 12:16
Answers: 1

Re: Temperaturwerte runden (OH3)

Beitrag von iceman »

Gute Idee das ganze ein wenig zu vereinfachen, nur leider haut es nicht hin.

var test = items.HomematicHeizthermostatWandServerraum_ActualTemperature;
events.sendCommand('EchoServerraum_Sprich', "Temperatur ist" + test );

die Frage ist ja wie bekomme ich das %.1f da rein.

Ich konnte soweit alle meine Rules von DSL nach Java übersetzen, nur an dieser Unschönheit verzweifle ich gerade und sehe den Wald vor Bäumen nicht mehr. Den DSL-Rules möchte ich eigentlich aus dem Weg gehen, habe mehrfach gehört das es da Probleme geben kann und zukunftssicher sind sie wohl auch nicht.

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

Re: Temperaturwerte runden (OH3)

Beitrag von udo1toni »

Zumindest in nächster Zeit wird die Rules DSL in vollem Umfang weiter unterstützt. Wenn Du mit Java Script glücklich bist, solltest Du nicht nur wegen einer kleinen Unpässlichkeit wechseln. :) Du musst ja nur herausfinden, wie Du Deine Temperaturitems effizient verwenden kannst. Stringformatierung gibt es auch in Java Script, Du musst halt nachschauen, wie Du das korrekt formulierst.
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

iceman
Beiträge: 22
Registriert: 31. Dez 2017 12:16
Answers: 1

Re: Temperaturwerte runden (OH3)

Beitrag von iceman »

Nach einem ausgiebigen ausschlafen hab ich nun endlich ein Lösung gefunden und möchte die nicht vorenthalten.

Code: Alles auswählen

var dummy = Math.round(items.HomematicHeizthermostatServerraum_ActualTemperature*10)/10;
events.sendCommand('EchoServerraum_Sprich', dummy + "Grad" );
Bin mir nicht sicher ob es die optimale Lösung ist aber sie funktioniert, auch bei Nachkommastellen >5

Antworten