Hauptmenü

Runden mit fhem oder perl

Begonnen von Holgi0815, 20 Dezember 2013, 12:05:45

Vorheriges Thema - Nächstes Thema

Holgi0815

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 wäre dann wohl mein Startpunkt.

Danke für jeden tipp
Holger

Joachim

$Temp   = sprintf("%.1f",$Temp);

ist aber nicht kaufmännisch gerundet, sondern nur Nackommastellen abgeschnitten
FHEM aktuellste Version auf FB 7570 und 7390 mit Zebradem Toolbox Freetz
FHEM auf Raspberry
1-Wire mit LinkUSBi und Rs-Pi ds2482-800  1-Wire-9 Board; Max mit Cube, HMLAN
div. 1-Wire Sensoren; MAX-Thermostaten; Homematic-Komponenten, Zehnder KWL über RS-232

Markus Bloch



     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
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

Markus Bloch

und für eine Nachkommastelle:


$value = Math::Round::nearest('0.1','3.2456')    # 3.2
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

Holgi0815

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

DerJens

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

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); }

herrmannj

my $Temp = int(0.5 + (( $Temp1 + $Temp2 + $Temp3 + $Temp4 ) / 4));

harvey1988

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?

oniT

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
BBB - debian weezy - FHEM 5.7
HMLAN - HM-LC-Bl1-FM, HM-ES-PMSw1-PI, HM-LC-Sw1-FM, HM-TC-IT-WM-W-EU, HM-WDS40-TH-I, HM-Sen-Wa-Od, HM-Sec-RHS
Dimplex Wärmepumpe / Dimplex ZL 300 - Modbus TCP
SDM630M - Modbus TCP
SolarLog 200 / SMA SonnyBoy 1.5/2.5 - Modbus TCP

Hans Franz

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
Raspi
CUL, Nano-CUL
FHT8V, FHT80B, S300TH
WM1000WZ, ELRO
LW12, LD382,DS18B20

harvey1988

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

Hans Franz

ZitatIrgendwo in deiner Syntax muss sich ein Fehler eingeschlichen haben
Yep, die geschweifte Klammer am Ende. Brauch 'ne neue Brille.

Gruß
Hans
Raspi
CUL, Nano-CUL
FHT8V, FHT80B, S300TH
WM1000WZ, ELRO
LW12, LD382,DS18B20

oniT

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
BBB - debian weezy - FHEM 5.7
HMLAN - HM-LC-Bl1-FM, HM-ES-PMSw1-PI, HM-LC-Sw1-FM, HM-TC-IT-WM-W-EU, HM-WDS40-TH-I, HM-Sen-Wa-Od, HM-Sec-RHS
Dimplex Wärmepumpe / Dimplex ZL 300 - Modbus TCP
SDM630M - Modbus TCP
SolarLog 200 / SMA SonnyBoy 1.5/2.5 - Modbus TCP

harvey1988

Vielen Dank,

nun rennts perfekt.

Hab mich jetzt schon 14 Tage damit geärgert.....

Vielen vielen Dank nochmal  :)

Grüße