Hallo,
um meine Temperatursensoren optimal an meinem MagicMirror anzeigen lassen zu können, sollen diese die Temperatur sowie Luftfeuchte immer mit einer Dezimalstelle anzeigen.
Ich habe die neuen und alten Xiaomi-Sensoren im Einsatz (rund und quadratisch), welche per Phoscon/deconz an FHEM senden. Dort kommen die Daten dann mit jeweils zwei Dezimalstellen als separate Geräte an, also bspw. Zimmer_temp 24.32°C oder Zimmer_hum 50.54%. Bei einem zufällig glatten Wert werden jedoch keine Dezimalstellen angezeigt, also bspw. 24°C.
Diese Werte lasse ich nun mit einem at-Gerät auf dummys schreiben:
define Temp_at at +*00:05:00 { use Math::Round qw/nearest/;
fhem ("setreading Arbeitszimmer_dummy temperature " .nearest('0.1', ReadingsVal("Arbeitszimmer_temp","temperature",0)). " ; setreading Arbeitszimmer_dummy humidity " .nearest('0.1', ReadingsVal("Arbeitszimmer_hum","humidity",0)). " ;
setreading Bad_oben_dummy temperature " .nearest('0.1', ReadingsVal("Bad_oben_temp","temperature",0)). " ; setreading Bad_oben_dummy humidity " .nearest('0.1', ReadingsVal("Bad_oben_hum","humidity",0)). " ;
setreading Bad_unten_dummy temperature " .nearest('0.1', ReadingsVal("Bad_unten_temp","temperature",0)). " ; setreading Bad_unten_dummy humidity " .nearest('0.1', ReadingsVal("Bad_unten_hum","humidity",0)). " ;
setreading Dachboden_dummy temperature " .nearest('0.1', ReadingsVal("Dachboden_temp","temperature",0)). " ; setreading Dachboden_dummy humidity " .nearest('0.1', ReadingsVal("Dachboden_hum","humidity",0)). " ;
setreading Flur_dummy temperature " .nearest('0.1', ReadingsVal("Flur_temp","temperature",0)). " ; setreading Flur_dummy humidity " .nearest('0.1', ReadingsVal("Flur_hum","humidity",0)). " ;
setreading Gaestezimmer_dummy temperature " .nearest('0.1', ReadingsVal("Gaestezimmer_temp","temperature",0)). " ; setreading Gaestezimmer_dummy humidity " .nearest('0.1', ReadingsVal("Gaestezimmer_hum","humidity",0)). " ;
setreading Heizungskeller_dummy temperature " .nearest('0.1', ReadingsVal("Heizungskeller_temp","temperature",0)). " ; setreading Heizungskeller_dummy humidity " .nearest('0.1', ReadingsVal("Heizungskeller_hum","humidity",0)). " ;
setreading Kueche_dummy temperature " .nearest('0.1', ReadingsVal("Kueche_temp","temperature",0)). " ; setreading Kueche_dummy humidity " .nearest('0.1', ReadingsVal("Kueche_hum","humidity",0)). " ;
setreading Schlafzimmer_dummy temperature " .nearest('0.1', ReadingsVal("Schlafzimmer_temp","temperature",0)). " ; setreading Schlafzimmer_dummy humidity " .nearest('0.1', ReadingsVal("Schlafzimmer_hum","humidity",0)). " ;
setreading Spielzimmer_dummy temperature " .nearest('0.1', ReadingsVal("Spielzimmer_temp","temperature",0)). " ; setreading Spielzimmer_dummy humidity " .nearest('0.1', ReadingsVal("Spielzimmer_hum","humidity",0)). " ;
setreading Wohnzimmer_dummy temperature " .nearest('0.1', ReadingsVal("Wohnzimmer_temp","temperature",0)). " ; setreading Wohnzimmer_dummy humidity " .nearest('0.1', ReadingsVal("Wohnzimmer_hum","humidity",0)). "")}
Ich weiß, dass es wahrscheinlich sehr umständlich geschrieben ist, aber wenigstens funktioniert es.
Ich nutze setreading, weil ich temperature und humidity als einzelne readings brauche.
Das Problem ist nun, dass bei einem Ausgangswert von z.B. 24.01°C der Ausgabewert 24 beträgt, da abgerundet wird. Das Gleiche passiert natürlich auch, wenn der Ausgangswert glatt 24°C beträgt.
Nun hätte ich aber gerne in diesem Fall 24.0 als Ergebnis, damit die Abstände am Spiegel einheitlich sind und sich nichts verschieben kann.
Was muss ich nun also ändern, damit ich dieses Ziel erreiche.
LG
ferby09
Hi,
ich würde sprintf nehmen. https://perldoc.perl.org/5.30.0//functions/sprintf.html
Beispiel für die FHEM Kommandozeile:
{sprintf "%.1f", 24.01}
Gruß Otto
Vielen Dank für die Antwort!
Ich dachte bisher, dass sprintf nur kürzt und nicht rundet, aber da hätte ich es einfach mal ausprobieren müssen.
Bei einer Temperatur von 23.01°C im Gästezimmer bringt das folgende at das gewünschte Ergebnis von 23.0:
define Temp_at at +*00:05:00 { fhem ("setreading Gaestezimmer_dummy temperature " .sprintf("%.1f",ReadingsVal("Gaestezimmer_temp","temperature",0)). " ; setreading Gaestezimmer_dummy humidity " .sprintf("%.1f",ReadingsVal("Gaestezimmer_hum","humidity",0)). "")}
Danke nochmal!
Der gute Otto123 hat mir noch zusätzlich per PN Tipps zur Vereinfachung meiner Programmierung im at-Gerät geschickt, doch leider funktioniert hier etwas nicht wie es sollte.
Otto123:
ZitatDas Ganze geht noch viel einfacher:
setreading Gaestezimmer_dummy temperature [Gaestezimmer_temp:temperature:r1]
Warum steht hier https://commandref.fhem.de/#set
Und Du brauchst den Perl Level nicht, also {fhem("bla")} kannst Du weglassen.
Dies habe ich probiert, doch bringt bei mir der Befehl
setreading Arbeitszimmer_dummy temperature [Arbeitszimmer_temp:temperature:r1]
bei einer Ausgangtemperatur von bspw. 21.34°C ein Ergebnis von glatt 21.
Eigentlich sollte der Zusatz
:r1
auf eine Dezimalstelle runden, tut es aber komischerweise nicht.
Nun funktioniert es.
Habe FHEM geupdatet und neugestartet und jetzt wird eine Dezimalstelle angezeigt.
Mein FHEM sollte laut DOIF einmal die Woche geupdatet werden, aber es hat wohl etwas gefehlt... oder der Neustart war's - wer weiß.
Dann schließe ich mal wieder. Nochmals vielen Dank an Otto123 für die tolle Hilfe!