FHEM Forum

FHEM => Automatisierung => Perl für FHEM-User => Thema gestartet von: frober am 25 Dezember 2020, 13:07:29

Titel: [erledigt]Runden auf Ganzzahl mit ReadingsNum() funktioniert nicht
Beitrag von: frober am 25 Dezember 2020, 13:07:29
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.
Titel: Antw:Runden mit ReadingsNum()
Beitrag von: CoolTux 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.
Titel: Antw:Runden mit ReadingsNum()
Beitrag von: juemuc 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
Titel: Antw:Runden mit ReadingsNum()
Beitrag von: frober 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
Titel: Antw:Runden mit ReadingsNum()
Beitrag von: frober 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.
Titel: Antw:Runden mit ReadingsNum()
Beitrag von: xenos1984 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);
Titel: Antw:Runden mit ReadingsNum()
Beitrag von: frober 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 (https://wiki.fhem.de/wiki/DevelopmentModuleAPI) müsste auch angepasst werden, da ist das runden gar nicht erwähnt.
Titel: Antw:Runden auf Ganzzahl mit ReadingsNum() funktioniert nicht
Beitrag von: frober 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.
Titel: Antw:Runden auf Ganzzahl mit ReadingsNum() funktioniert nicht
Beitrag von: frober 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
Titel: Antw:Runden auf Ganzzahl mit ReadingsNum() funktioniert nicht
Beitrag von: betateilchen am 28 Juli 2021, 19:53:56
Alternativ kann man das Runden aber auch selbst machen:

round(ReadingsNum("Sonnenstand","elevation",0),0);
Titel: Antw:Runden auf Ganzzahl mit ReadingsNum() funktioniert nicht
Beitrag von: frober 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  ;)
Titel: Antw:Runden auf Ganzzahl mit ReadingsNum() funktioniert nicht
Beitrag von: betateilchen 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?

Titel: Antw:Runden auf Ganzzahl mit ReadingsNum() funktioniert nicht
Beitrag von: frober 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.

Titel: Antw:Runden auf Ganzzahl mit ReadingsNum() funktioniert nicht
Beitrag von: Beta-User 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]
Titel: Antw:Runden auf Ganzzahl mit ReadingsNum() funktioniert nicht
Beitrag von: betateilchen 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.
Titel: Antw:Runden mit ReadingsNum()
Beitrag von: Christoph Morrison am 29 Juli 2021, 11:10:23
Die https://wiki.fhem.de/wiki/DevelopmentModuleAPI (https://wiki.fhem.de/wiki/DevelopmentModuleAPI) müsste auch angepasst werden, da ist das runden gar nicht erwähnt.

Ich hab mich mal erbarmt.
Titel: Antw:Runden mit ReadingsNum()
Beitrag von: betateilchen am 29 Juli 2021, 11:24:38
Ich hab mich mal erbarmt.

Prima. Wo Du gerade dabei bist: In der Syntaxbeschreibung steht "$value = ReadingsNum(...)"
Unter Rückgabewert steht dann plötzlich "$number" - vielleicht könnte man das noch so vereinheitlichen, dass an beiden Stellen das gleiche steht?
Titel: Antw:Runden mit ReadingsNum()
Beitrag von: Christoph Morrison am 29 Juli 2021, 11:37:46
Prima. Wo Du gerade dabei bist: In der Syntaxbeschreibung steht "$value = ReadingsNum(...)"
Unter Rückgabewert steht dann plötzlich "$number" - vielleicht könnte man das noch so vereinheitlichen, dass an beiden Stellen das gleiche steht?

Done.
Titel: Antw:Runden auf Ganzzahl mit ReadingsNum() funktioniert nicht
Beitrag von: frober am 29 Juli 2021, 12:18:32
Wow, jetzt habe ich aber eine Lawine ausgelöst... 8)

Danke euch, dass ihr euch darum kümmert. :)
Das bestätigt, dass es sich lohnt, sich für etwas einzusetzten.

Titel: Antw:Runden mit ReadingsNum()
Beitrag von: frober am 29 Juli 2021, 15:05:10
Ich hab mich mal erbarmt.

Jetzt muss ich nochmal nachfragen, du hast als Bsp. das Runden auf Ganzzahl mitangegeben.
Wurde ReadingsNum() auch angepasst/korrigiert?
Titel: Antw:Runden mit ReadingsNum()
Beitrag von: Beta-User am 29 Juli 2021, 15:55:47
Jetzt muss ich nochmal nachfragen, du hast als Bsp. das Runden auf Ganzzahl mitangegeben.
Wurde ReadingsNum() auch angepasst/korrigiert?
Bisher noch nicht: https://svn.fhem.de/trac/log/trunk/fhem/fhem.pl
(Es scheint aber immerhin Einigkeit bei den hier Beteiligten zu geben, dass das ohne Ganzzahl-Rundung ein "unerwartetes Verhalten" ist, und es gut wäre, fhem.pl würde entsprechend angepaßt).

Vielleicht sollte man Rudi einen patch zukommen lassen...? (Incl. OldReadingsNum() und Klarstellung in den commandref-Abschnitten, dass das "nur" hinter dem Komma geht (Math::round kann auch vor dem Komma)). @frober: das wäre eine gute "Einsteiger-Übung" in "how to write a patch" ;) .

(Bitte dann nochmal einen Thread in "Sonstiges" eröffnen und dort anhängen. Das Thema war an sich da gut aufgehoben gewesen; es dürfte Rudi vermutlich nur durchgerutscht sein, und über (erneutes) "verschieben" bekommt Rudi keine Info).
Titel: Antw:Runden mit ReadingsNum()
Beitrag von: frober am 29 Juli 2021, 17:22:51
Bisher noch nicht: https://svn.fhem.de/trac/log/trunk/fhem/fhem.pl
(Es scheint aber immerhin Einigkeit bei den hier Beteiligten zu geben, dass das ohne Ganzzahl-Rundung ein "unerwartetes Verhalten" ist, und es gut wäre, fhem.pl würde entsprechend angepaßt).

Vielleicht sollte man Rudi einen patch zukommen lassen...? (Incl. OldReadingsNum() und Klarstellung in den commandref-Abschnitten, dass das "nur" hinter dem Komma geht (Math::round kann auch vor dem Komma)). @frober: das wäre eine gute "Einsteiger-Übung" in "how to write a patch" ;) .

(Bitte dann nochmal einen Thread in "Sonstiges" eröffnen und dort anhängen. Das Thema war an sich da gut aufgehoben gewesen; es dürfte Rudi vermutlich nur durchgerutscht sein, und über (erneutes) "verschieben" bekommt Rudi keine Info).

Das ist jetzt eine Herausforderung, wo ich nicht weiß, ob ich das in Kürze hinbekomme.

Ich weiß noch nicht einmal, ob der Lösungsansatz von xenos1984 funktioniert. Ok, das kann ich testen...aber falls nicht, gibt es die fhemeigene Funktion round() überhaupt her?

Den Thread erneut öffnen und auf diesen verweisen, das kann ich schon.. ;) ;D
Titel: Antw:Runden auf Ganzzahl mit ReadingsNum() funktioniert nicht
Beitrag von: Beta-User am 29 Juli 2021, 17:45:09
Das ist ja jetzt nicht ultra-dringend...

Und mal ein {round(99.1,0)}in die Kommandozeile zu werfen (=> eigene Funktionen aus myUtils testen...), ist jetzt auch nicht sooo schwierig oder langwierig ;) .

@Christoph Morrison: Bei den Beispielen stellt sich die Frage, ob "Text" als default-Antwort glücklich ist. die ultimative Lösung für das Problem habe ich auch nicht, aber evtl. wäre eine wilde Mischung aus "42", 0, undef (? ausnahmsweise!) und "1000000" plakativ genug, um künftige Leser für das dahinterliegende Problem zu sensibilisieren?

@betateilchen: Danke für den Hinweis auf den "Val"-Lapsus.
Titel: Antw:Runden auf Ganzzahl mit ReadingsNum() funktioniert nicht
Beitrag von: frober am 29 Juli 2021, 17:51:12
Das ist ja jetzt nicht ultra-dringend...

Und mal ein {round(99.1,0)}in die Kommandozeile zu werfen (=> eigene Funktionen aus myUtils testen...), ist jetzt auch nicht sooo schwierig oder langwierig ;) .

Ich meinte eigentlich das Erstellen des Patches, habe die Lösung aber, glaube ich, schon gefunden....

Das  Testsystem wird gerade geupdatet ;)
Titel: Antw:Runden mit ReadingsNum()
Beitrag von: Christoph Morrison am 29 Juli 2021, 18:25:40
Vielleicht sollte man Rudi einen patch zukommen lassen...? (Incl. OldReadingsNum() und Klarstellung in den commandref-Abschnitten, dass das "nur" hinter dem Komma geht (Math::round kann auch vor dem Komma)). @frober: das wäre eine gute "Einsteiger-Übung" in "how to write a patch" ;) .

Ich wollte heute abend einen Patch machen, aber wenn frober will, bitte gerne ;-)

Zitat
@Christoph Morrison: Bei den Beispielen stellt sich die Frage, ob "Text" als default-Antwort glücklich ist. die ultimative Lösung für das Problem habe ich auch nicht, aber evtl. wäre eine wilde Mischung aus "42", 0, undef (? ausnahmsweise!) und "1000000" plakativ genug, um künftige Leser für das dahinterliegende Problem zu sensibilisieren?

Mit Text ist wenigstens klar, dass es nicht zwangsweise eine Nummer ist, die zurück kommt. Deshalb hatte ich auch $number durch $value ausgetauscht.

(nota bene: Über das fake round müssten wir eigentlich auch noch mal diskutieren, so ist es nur ein roter Hering, weil round nicht rundet - hoffentlich rundet dann format nicht auch noch ...)
Titel: Antw:Runden mit ReadingsNum()
Beitrag von: frober am 29 Juli 2021, 18:28:38
Ich wollte heute abend einen Patch machen, aber wenn frober will, bitte gerne ;-)

Mit Text ist wenigstens klar, dass es nicht zwangsweise eine Nummer ist, die zurück kommt. Deshalb hatte ich auch $number durch $value ausgetauscht.

(nota bene: Über das fake round müssten wir eigentlich auch noch mal diskutieren, so ist es nur ein roter Hering, weil round nicht rundet - hoffentlich rundet dann format nicht auch noch ...)

schon erledigt :)

https://forum.fhem.de/index.php/topic,122275.0.html (https://forum.fhem.de/index.php/topic,122275.0.html)
Titel: Antw:Runden mit ReadingsNum()
Beitrag von: frober am 29 Juli 2021, 18:32:53
(nota bene: Über das fake round müssten wir eigentlich auch noch mal diskutieren, so ist es nur ein roter Hering, weil round nicht rundet - hoffentlich rundet dann format nicht auch noch ...)

Dann war es doch richtig, dass ich es mit int(0.5 + Wert) gelöst habe.

@betateilchen ich wusste, dass es einen Grund hatte....
Titel: Antw:[erledigt]Runden auf Ganzzahl mit ReadingsNum() funktioniert nicht
Beitrag von: frober am 30 Juli 2021, 08:18:09
Rudi hat den Patch eingecheckt. :)

Danke nochmal an alle für die Unterstützung.

@Beta-User danke für den Stups mit dem Patch, irgendwie hat gestern alles gepasst und ich hatte einen Lauf... :D
Titel: Antw:[erledigt]Runden auf Ganzzahl mit ReadingsNum() funktioniert nicht
Beitrag von: Beta-User am 30 Juli 2021, 08:51:26
Thx!

Manöverkritik: Evtl. hätte man in der commandref noch klarstellen können, dass das nur bis zu Ganzzahlen bzw. hinter dem Komma klappt:
"Echtes runden" (mit Math::round, z.B.) müsste nach meinem Verständnis auch vor dem Komma greifen.
Ob der "Trick" mit sprintf nun "gut" ist, sei mal dahingestellt, das findet sich jedenfalls häufiger als Empfehlung für Rundungen.

@Christoph Morrison:
Dass man da auch einen Text zurückgeben kann, ist schon klar, und den "Königsweg" in der Darstellung kenne ich auch nicht. MAn. ist es nur auch nicht optimal, nur Text darzustellen, denn vermutlich kommt dann irgendwann wieder einer mit dem Hinweis, dass das ggf. Warnings verursacht, weil er einen nichtnummerischen Vergleich vornimmt...

Über "round" können wir gerne diskutieren (dto. für "min"&Co), aber das ist hier vermutlich nicht der richtige Ort...
Titel: Antw:[erledigt]Runden auf Ganzzahl mit ReadingsNum() funktioniert nicht
Beitrag von: frober am 30 Juli 2021, 09:41:29
Manöverkritik: Evtl. hätte man in der commandref noch klarstellen können, dass das nur bis zu Ganzzahlen bzw. hinter dem Komma klappt:
"Echtes runden" (mit Math::round, z.B.) müsste nach meinem Verständnis auch vor dem Komma greifen.
Ob der "Trick" mit sprintf nun "gut" ist, sei mal dahingestellt, das findet sich jedenfalls häufiger als Empfehlung für Rundungen.

In meinem Eifer ist mir das durchgegangen. ::)

MMn wäre es wichtiger zu erwähnen, dass hier nicht grundet wird.
Sollte ein User die Funktion für "wichtige" Berechnungen verwenden, bekommt er teilweise falsche Ergebnisse.
Wenn ihr jedoch eine besssere Lösung für round() findet...
Titel: Antw:[erledigt]Runden auf Ganzzahl mit ReadingsNum() funktioniert nicht
Beitrag von: Christoph Morrison am 30 Juli 2021, 13:16:41
Manöverkritik: Evtl. hätte man in der commandref noch klarstellen können, dass das nur bis zu Ganzzahlen bzw. hinter dem Komma klappt:
"Echtes runden" (mit Math::round, z.B.) müsste nach meinem Verständnis auch vor dem Komma greifen.
Ob der "Trick" mit sprintf nun "gut" ist, sei mal dahingestellt, das findet sich jedenfalls häufiger als Empfehlung für Rundungen.

Ich hatte einen Satz dazu auf die Wiki-Seite geschrieben und nun noch Beispiele eingefügt. Die meisten gucken für sowas eh nicht in die CRef, sondern ins Wiki.

Zitat
Dass man da auch einen Text zurückgeben kann, ist schon klar, und den "Königsweg" in der Darstellung kenne ich auch nicht. MAn. ist es nur auch nicht optimal, nur Text darzustellen, denn vermutlich kommt dann irgendwann wieder einer mit dem Hinweis, dass das ggf. Warnings verursacht, weil er einen nichtnummerischen Vergleich vornimmt...

Hab mal noch zwei Fallstricke angemerkt, einer davon ist das.
Titel: Antw:[erledigt]Runden auf Ganzzahl mit ReadingsNum() funktioniert nicht
Beitrag von: frober am 30 Juli 2021, 15:32:46
Ich hatte einen Satz dazu auf die Wiki-Seite geschrieben und nun noch Beispiele eingefügt. Die meisten gucken für sowas eh nicht in die CRef, sondern ins Wiki.

Hab mal noch zwei Fallstricke angemerkt, einer davon ist das.

Ich habe nochmal übers Wiki gelesen, müsste das Bsp.
Zitat
ReadingsNum(q(foo), q(bar), q(Kein Wert), 1);
# = 123.5
nicht # = 123.4 lauten?

Oder habe ich etwas missverstanden?
 
Titel: Antw:[erledigt]Runden auf Ganzzahl mit ReadingsNum() funktioniert nicht
Beitrag von: Christoph Morrison am 30 Juli 2021, 17:21:37
Ich habe nochmal übers Wiki gelesen, müsste das Bsp.nicht # = 123.4 lauten?
Oder habe ich etwas missverstanden?

Nein wieso? sprintf rundet ja schon, formatiert aber eben auch, insbesondere wenn die Rundungslänge länger ist als die Anzahl der Nachkommastellen. Das macht den gewählten Mechanismus, neben dem Problem mit der format string injection und dem gemischten Rückgabewert, auch problematisch.
Titel: Antw:[erledigt]Runden auf Ganzzahl mit ReadingsNum() funktioniert nicht
Beitrag von: frober am 30 Juli 2021, 18:06:50
Nein wieso? sprintf rundet ja schon, formatiert aber eben auch, insbesondere wenn die Rundungslänge länger ist als die Anzahl der Nachkommastellen. Das macht den gewählten Mechanismus, neben dem Problem mit der format string injection und dem gemischten Rückgabewert, auch problematisch.

OK, danke für die Erläuterung.
Ich dachte, die nicht gewünschten Stellen werden einfach abgeschnitten.
Dann passt es soweit.