Moin moin,
wie der Betreff schon sagt: wie runde ich denn?
ich schreibe mit "setreading" aus einem notify in einen dummy (eine Durchschnittsberechnung). Dabei kommen 0-4 Nachkommastellen raus, mir würde aber eine völlig reichen.
...
my $Temp = ( $Temp1 + $Temp2 + $Temp3 + $Temp4 ) / 4;
...
fhem "setreading dy_Innen_Durchschnitt temperature $Temp";
schaffe ich das mit "Bordmitteln" direkt im notify, oder ist das eine eigene Funktion wert?
http://perl-howto.de/2008/11/zahlen-runden-mit-mathround.html (http://perl-howto.de/2008/11/zahlen-runden-mit-mathround.html) wäre dann wohl mein Startpunkt.
Danke für jeden tipp
Holger
$Temp = sprintf("%.1f",$Temp);
ist aber nicht kaufmännisch gerundet, sondern nur Nackommastellen abgeschnitten
Aufrunden
$ceil = POSIX::ceil(3.5); # 4
Abrunden
$floor = POSIX::floor(3.5); # 3
Runden
$round = Math::Round::round(3.5); # 4
Viele Grüße
Markus
und für eine Nachkommastelle:
$value = Math::Round::nearest('0.1','3.2456') # 3.2
Man, seid Ihr schnell!!
Danke, das klappt!
so sieht der nf jetzt aus
{
use Math::Round qw/round/;
...
my $Temp = ( $Temp1 + $Temp2 + $Temp3 + $Temp4 ) / 4;
$Temp = Math::Round::nearest('0.1',$Temp);
ohne das use gabs logischerweise noch dies:
"nf_Set_Innen_Durchschnitt return value: Undefined subroutine &Math::Round::round called at (eval 1675) line 14."
Danke Holger
Ich danke für die Anleitung und füge noch eine kleine Ergänzung hinzu:
Falls Math::Round nicht gefunden wird, fehlt die Perl-Bibliothek.
sudo apt-get install libmath-round-perl
Aussagekräftige Beispiele, wie mit Perl gerundet wird, habe ich hier gefunden: http://perl-howto.de/2008/11/zahlen-runden-mit-mathround.html (http://perl-howto.de/2008/11/zahlen-runden-mit-mathround.html)
Das funktioniert dann auch in einem Userreading:
Tagesverbrauch { use Math::Round qw/nearest/; ReadingsVal("Gas","Tagesverbrauch",0) + nearest('0.01', ReadingsVal("Gas","kWh",0)*0.0458); }
my $Temp = int(0.5 + (( $Temp1 + $Temp2 + $Temp3 + $Temp4 ) / 4));
Hallo und Entschuldigung das ich dieses Thema nochmal aufwärmen muss.
Aber ich habe folgendes Problem und komme einfach nicht weiter:
Hier mein User Reading:
attr HM_4040A6_T1 userReadings Bodenfeuchte_Balkon { int ( ReadingsVal("HM_4040A6_T1","temperature",0) - 24 ) / 0.327 }
Damit soll die Temperatur in einen Bodenfeuchtewert umgerechnet werden.
Bauanleitung findet man hier:
http://www.stall.biz/project/robuster-bodenfeuchtesensor-fur-den-ausseneinsatz
Jetzt ergibt das halt dann leider:
(55-24)/0,327=94,80122324159021
Es würde mir reichen, wenn einfach hier auf 95 gerundet wird.
Kann mir hier bitte jemand weiterhelfen?
Hallo,
wenn es nicht so genau sein muss mit Auf- und Abrunden und Dir in Deinem Beispiel auch 94 reicht, dann würde ich nur noch eine Klammer mehr setzen.
attr HM_4040A6_T1 userReadings Bodenfeuchte_Balkon { int (( ReadingsVal("HM_4040A6_T1","temperature",0) - 24 ) / 0.327)}
Gruß
Tino
Wenn es doch darauf ankommt:
attr HM_4040A6_T1 userReadings Bodenfeuchte_Balkon { round(( ReadingsVal("HM_4040A6_T1","temperature",0) - 24 ) / 0.327,0)
Gruß
Hans
Hallo Hans,
vielen Dank.
Irgendwo in deiner Syntax muss sich ein Fehler eingeschlichen haben, denn sobald ich mein UserReading so umbaue, wird der Wert nicht mehr berechnet.
Auch vielen Dank an dich @Toni, aber eine richtige Rundung wäre schon cool :-)
Viele Grüße
ZitatIrgendwo in deiner Syntax muss sich ein Fehler eingeschlichen haben
Yep, die geschweifte Klammer am Ende. Brauch 'ne neue Brille.
Gruß
Hans
Zitat von: harvey1988 am 15 Juli 2016, 18:23:34
Auch vielen Dank an dich @Toni, aber eine richtige Rundung wäre schon cool :-)
Yep, dann ist die Lösung von Hans die richtige :)
Gruß,
Tino
Vielen Dank,
nun rennts perfekt.
Hab mich jetzt schon 14 Tage damit geärgert.....
Vielen vielen Dank nochmal :)
Grüße