Autor Thema: [erledigt]Runden auf Ganzzahl mit ReadingsNum() funktioniert nicht  (Gelesen 7843 mal)

Offline frober

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 1107
  • Was man nicht kann, kann man lernen...
Hallo zusammen,

ich möchte mit ReadingsNum() auf eine Ganzzahl runden.

Das Reading hat 2 Dezimalstellen z.B. 17.14

mit
ReadingsNum("Sonnenstand","elevation",0,1);bekomme ich 17.1, soweit ok.

mit
ReadingsNum("Sonnenstand","elevation",0,0);wird der Originalwert 17.14 ausgegeben.

Ich war der Meinung. das ich mit "0" keine Dezimalstellen bekomme, also 17  :o

Ist das so gewollt oder habe ich eine Denkfehler, etc., etc....

Grüße und frohe Weihnachten
Bernd

Edit: Betreff angepasst, in der Hoffnung, dass das "Problem" oder die Doku entsprechend angepasst wird.
« Letzte Änderung: 30 Juli 2021, 08:11:31 von frober »
Raspi 3b mit Raspbian Stretch und relativ aktuellem Fhem,  FS20, LGW, PCA301, MySensors mit RS485(CAN-Receiver), etc.,
einiges umgesetzt, vieles in Planung :-)

********************************************
...man wächst mit der Herausforderung...

Offline CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 27914
Antw:Runden mit ReadingsNum()
« Antwort #1 am: 25 Dezember 2020, 13:16:30 »
Hallo Bernd,

Ohne jetzt in den Code gesehen zu haben. Laut Wiki gehst Du von der falschen Annahme aus

https://wiki.fhem.de/wiki/DevelopmentModuleAPI

Suche hier mal nach ReadingsNum.
Der dritte Wert ist nur ein Default der genommen wird wenn das Reading oder das Device welches Du an gibst nicht vorhanden ist. Wüsste nicht das man damit sagen kann wie er runden soll.
Lasse mich da aber gerne belehren.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Mein Dokuwiki:
https://www.cooltux.net

Offline juemuc

  • Hero Member
  • *****
  • Beiträge: 1096
Antw:Runden mit ReadingsNum()
« Antwort #2 am: 25 Dezember 2020, 13:19:52 »
Hallo zusammen,

aus meiner Sicht sollte das schon gehen. Es muss aber da eine 2 stehen, da 2 Stellen gerundet werden sollen.
Alternativ gibt es das Attribut "stripnumber".

Viele Grüße
Jürgen
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
Fritzbox 7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM Fensterkontakte und  Amazon Echo Dot, raspberry3B+ mit RPI-RF-MOD und piVCCU, Raspbian ...

Offline frober

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 1107
  • Was man nicht kann, kann man lernen...
Antw:Runden mit ReadingsNum()
« Antwort #3 am: 25 Dezember 2020, 13:28:38 »
Laut commandref:

Zitat
ReadingsNum(<devicename>,<reading>, <defaultvalue>,<round>)
Gibt die erste Zahl aus dem Readingswert zurück. Falls <round> spezifiziert ist, wird sie auf diese Anzahl von Dezimalstellen gerundet.

Ich habe es gerade mit "2" getestet, dann kommt auch 17.14
Raspi 3b mit Raspbian Stretch und relativ aktuellem Fhem,  FS20, LGW, PCA301, MySensors mit RS485(CAN-Receiver), etc.,
einiges umgesetzt, vieles in Planung :-)

********************************************
...man wächst mit der Herausforderung...

Offline frober

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 1107
  • Was man nicht kann, kann man lernen...
Antw:Runden mit ReadingsNum()
« Antwort #4 am: 25 Dezember 2020, 13:30:21 »
Alternativ gibt es das Attribut "stripnumber".

Ich versuche gerade mein "Glück" in MyUtils   ;)

P.S. Mir geht es ums Verständnis, evtl. liegt hier auch ein Fehler vor. Ich habe es aktuell mit int(0.5 + Wert) gelöst.
« Letzte Änderung: 25 Dezember 2020, 14:00:09 von frober »
Raspi 3b mit Raspbian Stretch und relativ aktuellem Fhem,  FS20, LGW, PCA301, MySensors mit RS485(CAN-Receiver), etc.,
einiges umgesetzt, vieles in Planung :-)

********************************************
...man wächst mit der Herausforderung...

Offline xenos1984

  • Developer
  • Full Member
  • ****
  • Beiträge: 468
Antw:Runden mit ReadingsNum()
« Antwort #5 am: 25 Dezember 2020, 20:39:53 »
Das ist die entsprechende Stelle in der fhem.pl, die das Verhalten verursacht - Zeile 4532:

$val = round($val,$round) if($round);
Wenn man 0 Dezimalstellen angibt, interpretiert das if den Wert als false und es wird nicht gerundet. Die Zeile müsste wohl so lauten

$val = round($val,$round) if(defined $round);

Offline frober

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 1107
  • Was man nicht kann, kann man lernen...
Antw:Runden mit ReadingsNum()
« Antwort #6 am: 25 Dezember 2020, 21:02:09 »
Das ist die entsprechende Stelle in der fhem.pl, die das Verhalten verursacht - Zeile 4532:

$val = round($val,$round) if($round);
Wenn man 0 Dezimalstellen angibt, interpretiert das if den Wert als false und es wird nicht gerundet. Die Zeile müsste wohl so lauten

$val = round($val,$round) if(defined $round);

Danke, dann lag ich doch nicht verkehrt. :)
Dann müssen wir nur noch Rudi darauf aufmerksam machen.

Die https://wiki.fhem.de/wiki/DevelopmentModuleAPI müsste auch angepasst werden, da ist das runden gar nicht erwähnt.
Raspi 3b mit Raspbian Stretch und relativ aktuellem Fhem,  FS20, LGW, PCA301, MySensors mit RS485(CAN-Receiver), etc.,
einiges umgesetzt, vieles in Planung :-)

********************************************
...man wächst mit der Herausforderung...

Offline frober

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 1107
  • Was man nicht kann, kann man lernen...
Antw:Runden auf Ganzzahl mit ReadingsNum() funktioniert nicht
« Antwort #7 am: 28 Dezember 2020, 18:08:45 »
Ich habe einmal den Betreff angepasst, in der Hoffnung, dass der verantwortliche Entwickler (Rudi ?) sich dem annimmt.

Eigentlich ist es kein Anfängerthema, da es jedoch Themenunabhängig ist habe ich keinen besseren Bereich gefunden.
Im Developerbereich darf ich nicht...

Ich hoffe, dass ich niemanden auf die "Füße trete". ::)


Edit: Gerade im Maintainer.txt nachgeschaut und verschoben. In der Annahme das es richtig ist, was xenos1984 in #6 geschrieben hat.
« Letzte Änderung: 28 Dezember 2020, 18:15:06 von frober »
Raspi 3b mit Raspbian Stretch und relativ aktuellem Fhem,  FS20, LGW, PCA301, MySensors mit RS485(CAN-Receiver), etc.,
einiges umgesetzt, vieles in Planung :-)

********************************************
...man wächst mit der Herausforderung...

Offline frober

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 1107
  • Was man nicht kann, kann man lernen...
Antw:Runden auf Ganzzahl mit ReadingsNum() funktioniert nicht
« Antwort #8 am: 28 Juli 2021, 19:06:53 »
@Rudi könntest du dir das mal anschauen?

Ist schon etwas älter, da Beta-User die Funktion im angepinnten Beitrag erwähnt, hole ich das nochmal hervor.

Ein evtl. Lösungsvorschlag hat xenos1984 schon in #6.

Danke Bernd
Raspi 3b mit Raspbian Stretch und relativ aktuellem Fhem,  FS20, LGW, PCA301, MySensors mit RS485(CAN-Receiver), etc.,
einiges umgesetzt, vieles in Planung :-)

********************************************
...man wächst mit der Herausforderung...

Offline betateilchen

  • Developer
  • Hero Member
  • ****
  • Beiträge: 18023
  • Stoppt den Unicode-Irrsinn!
Antw:Runden auf Ganzzahl mit ReadingsNum() funktioniert nicht
« Antwort #9 am: 28 Juli 2021, 19:53:56 »
Alternativ kann man das Runden aber auch selbst machen:

round(ReadingsNum("Sonnenstand","elevation",0),0);
« Letzte Änderung: 28 Juli 2021, 19:55:27 von betateilchen »
-----------------------
Unaufgeforderte Anfragen per email werden von mir nicht beantwortet. Dafür ist das Forum da.
-----------------------
Lesen gefährdet die Unwissenheit!

Offline frober

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 1107
  • Was man nicht kann, kann man lernen...
Antw:Runden auf Ganzzahl mit ReadingsNum() funktioniert nicht
« Antwort #10 am: 28 Juli 2021, 20:28:58 »
Alternativ kann man das Runden aber auch selbst machen:

round(ReadingsNum("Sonnenstand","elevation",0),0);

Oder wie ich, siehe #5  ;)
Raspi 3b mit Raspbian Stretch und relativ aktuellem Fhem,  FS20, LGW, PCA301, MySensors mit RS485(CAN-Receiver), etc.,
einiges umgesetzt, vieles in Planung :-)

********************************************
...man wächst mit der Herausforderung...

Offline betateilchen

  • Developer
  • Hero Member
  • ****
  • Beiträge: 18023
  • Stoppt den Unicode-Irrsinn!
Antw:Runden auf Ganzzahl mit ReadingsNum() funktioniert nicht
« Antwort #11 am: 28 Juli 2021, 21:05:17 »
Oder wie ich, siehe #5

ja schon... aber warum? Wenn FHEM Dir doch in 99_Utils.pm schon die Funktion round() bereitstellt, warum willst Du dann das Rad in Deiner myUtils neu erfinden, anstatt die schon vorhandene Funktion zu nutzen?

-----------------------
Unaufgeforderte Anfragen per email werden von mir nicht beantwortet. Dafür ist das Forum da.
-----------------------
Lesen gefährdet die Unwissenheit!

Offline frober

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 1107
  • Was man nicht kann, kann man lernen...
Antw:Runden auf Ganzzahl mit ReadingsNum() funktioniert nicht
« Antwort #12 am: 28 Juli 2021, 22:01:55 »
ja schon... aber warum? Wenn FHEM Dir doch in 99_Utils.pm schon die Funktion round() bereitstellt, warum willst Du dann das Rad in Deiner myUtils neu erfinden, anstatt die schon vorhandene Funktion zu nutzen?

Ich kann es dir leider nicht mehr beantworten...evtl. kannte ich die Möglichkeit vom Arduino. Mittlerweile habe ich ja auch dazu gelernt. ;) :)

Aber das schweift vom eigentlichen Thema ab.
Das Runden mit ReadingsNum wird in der Commandref erwähnt und bevor nochmal jemand darüber stolpert habe ich hier Rudi gebetet sich das anzuschauen.

Raspi 3b mit Raspbian Stretch und relativ aktuellem Fhem,  FS20, LGW, PCA301, MySensors mit RS485(CAN-Receiver), etc.,
einiges umgesetzt, vieles in Planung :-)

********************************************
...man wächst mit der Herausforderung...

Offline Beta-User

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 18342
Antw:Runden auf Ganzzahl mit ReadingsNum() funktioniert nicht
« Antwort #13 am: 29 Juli 2021, 07:52:04 »
Das Runden mit ReadingsNum wird in der Commandref erwähnt und bevor nochmal jemand darüber stolpert habe ich hier Rudi gebetet sich das anzuschauen.
M.E. ist der Hinweis  völlig berechtigt, dass die Funktionsweise der Funktion nicht der Dokumentation entspricht (bzw. deren üblichem Verständnis). Ich hätte jedenfalls nicht vermutet, dass "0 Dezimalstellen" keine gültige Vorgabe sein sollte. Aber vielleicht komme ich auch zu sehr von Math::round her ::) ...

Ansonsten kann man lange und breit darüber diskutieren, ob es die Funktionalität an sich braucht, ob ggf. !looks_like_number weitere Userfehler abfangen könnte, ... usw. usf..

[OT] Dass das Runden an sich mit ReadingsVal() möglich ist, ist mir im Zusammenhang mit attrTemplate für MQTT_GENERIC_BRIDGE aufgefallen. Das ist aber (schon immer) gepackaged, was zur Folge hat, dass man in Attributen vom User verwendete Funktionen (die hier leider mit eval aufgerufen werden müssen, u.A. weil zu viele Variablen an AnalyzePerlCommand übergeben werden müssen) ggf. entweder importiert oder eben bewußt in den main-Kontext verweisen muss. Spätestens da ist das mit dem Workaround "unschön", und es wäre wünschenswert, wenn ReadingsNum() das vollumfänglich mit erledigen könnte...
[/OT]
Server: HP-T620@Debian 11, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Offline betateilchen

  • Developer
  • Hero Member
  • ****
  • Beiträge: 18023
  • Stoppt den Unicode-Irrsinn!
Antw:Runden auf Ganzzahl mit ReadingsNum() funktioniert nicht
« Antwort #14 am: 29 Juli 2021, 10:46:23 »
[OT] Dass das Runden an sich mit ReadingsVal() möglich ist, ...[/OT]

ReadingsVal() rundet nicht.

Noch ein Hinweis - falls Rudi das irgendwann liest:

in OldReadingsNum() steckt der gleiche Fehler bezüglich des Rundens auf 0 Nachkommastellen.
« Letzte Änderung: 29 Juli 2021, 10:49:45 von betateilchen »
-----------------------
Unaufgeforderte Anfragen per email werden von mir nicht beantwortet. Dafür ist das Forum da.
-----------------------
Lesen gefährdet die Unwissenheit!

 

decade-submarginal