Ich ermittele immer um Mitternacht den niedrigsten Batteriewert in 99_MyUtils.pm mit folgendem Skript:
sub GetBatteries() {
my $myResult = "100 %";
my $myBattery = GetDeviceReading("FGPB101_ID21","battery"); # Batteriestatus ermitteln
if ($myBattery < $myResult) {$myResult = $myBattery}; # wenn kleinster -> sichern
$myBattery = GetDeviceReading("FGSD002_ID22","battery"); # Batteriestatus ermitteln
if ($myBattery < $myResult) {$myResult = $myBattery}; # wenn kleinster -> sichern
$myBattery = GetDeviceReading("FGSD002_ID23","battery"); # Batteriestatus ermitteln
if ($myBattery < $myResult) {$myResult = $myBattery}; # wenn kleinster -> sichern
$myBattery = GetDeviceReading("FGSD002_ID24","battery"); # Batteriestatus ermitteln
if ($myBattery < $myResult) {$myResult = $myBattery}; # wenn kleinster -> sichern
$myBattery = GetDeviceReading("FGSD002_ID25","battery"); # Batteriestatus ermitteln
if ($myBattery < $myResult) {$myResult = $myBattery}; # wenn kleinster -> sichern
$myBattery = GetDeviceReading("FGSD002_ID26","battery"); # Batteriestatus ermitteln
if ($myBattery < $myResult) {$myResult = $myBattery}; # wenn kleinster -> sichern
$myBattery = GetDeviceReading("Hauppauge_4_in_1_ID30","battery"); # Batteriestatus ermitteln
if ($myBattery < $myResult) {$myResult = $myBattery}; # wenn kleinster -> sichern
SetDeviceUserReading("Batteries","battery",$myResult); # niedrigsten Batteriestatus sichern
}
Seit meinem Update gestern morgen bekomme ich folgende Fehlermeldungen:
2018.05.15 00:00:01 1: PERL WARNING: Argument "100 %" isn't numeric in numeric lt (<) at ./FHEM/99_myUtils.pm line 455.
2018.05.15 00:00:01 3: eval: {GetBatteries()}
2018.05.15 00:00:01 1: PERL WARNING: Argument "50 %" isn't numeric in numeric lt (<) at ./FHEM/99_myUtils.pm line 457.
2018.05.15 00:00:01 3: eval: {GetBatteries()}
2018.05.15 00:00:01 1: PERL WARNING: Argument "50 %" isn't numeric in numeric lt (<) at ./FHEM/99_myUtils.pm line 459.
2018.05.15 00:00:01 3: eval: {GetBatteries()}
2018.05.15 00:00:01 1: PERL WARNING: Argument "100 %" isn't numeric in numeric lt (<) at ./FHEM/99_myUtils.pm line 461.
2018.05.15 00:00:01 3: eval: {GetBatteries()}
2018.05.15 00:00:01 1: PERL WARNING: Argument "40 %" isn't numeric in numeric lt (<) at ./FHEM/99_myUtils.pm line 463.
2018.05.15 00:00:01 3: eval: {GetBatteries()}
2018.05.15 00:00:01 1: PERL WARNING: Argument "50 %" isn't numeric in numeric lt (<) at ./FHEM/99_myUtils.pm line 465.
2018.05.15 00:00:01 3: eval: {GetBatteries()}
2018.05.15 00:00:01 1: PERL WARNING: Argument "100 %" isn't numeric in numeric lt (<) at ./FHEM/99_myUtils.pm line 467.
2018.05.15 00:00:01 3: eval: {GetBatteries()}
Die Ermittlung ist wohl eh nicht die eleganteste Lösung, vielleicht kann mir ja jemand eine Alternative vorschlagen.
naja ... vermutlich wurde die Darstellung des Batteriezustandes aufgrund der sinnlosen Diskussion im Developerbereich kaputtstandardisiert und enthält nun nicht mehr nur Zahlen, sondern auch noch Text (das Prozentzeichen)
- Was steht in GetDeviceReading() und warum verwendest Du nicht die FHEM eigene Standardfunktion ReadingsNum() ? Da würden die % Zeichen als Text direkt wegfallen
- Für die Ermittlung des niedrigsten Wertes aus einer Menge von Einzelwerten gibt es in FHEM die Funktion min() Diese Funktion erwartet als Aufrufparameter die Liste (Array) aller zu prüfenden Werte und liefert Dir den niedrigsten als Ergebnis zurück. Das gleiche gibt es auch für max()
Bei mir war schon immer das % Zeichen enthalten (GetDeviceReading enthält also z.B. "40 %"), aber der Fehler trat nie auf ...
ReadingsNum hab' ich noch nie verwendet, müsste ich mal testen.
Mit min() sollte mein Skript dann in etwa so aussehen (?):
sub GetBatteries() {
my $myResult = min(
ReadingsNum("FGPB101_ID21","battery",100),
ReadingsNum("FGSD002_ID22","battery",100),
ReadingsNum("FGSD002_ID23","battery",100),
ReadingsNum("FGSD002_ID24","battery",100),
ReadingsNum("FGSD002_ID25","battery",100),
ReadingsNum("FGSD002_ID26","battery",100),
ReadingsNum("Hauppauge_4_in_1_ID30","battery",100));
SetDeviceUserReading("Batteries","battery",$myResult." %");
}
edit:
Als Ergebnis bekomme ich dann allerdings "100 %" !?
Gebe ich {ReadingsNum("FGSD002_ID25","battery",100)} direkt in FHEM ein erhalte ich "40"
ID 24 hat noch "100 %", ID 25 "40 %" und ID 26 "50 %"
Gebe ich {min(ReadingsNum("FGSD002_ID24","battery",100),ReadingsNum("FGSD002_ID25","battery",100),ReadingsNum("FGSD002_ID26","battery",100))} ein ist das Ergebnis (falsch) "100", bei {min(ReadingsNum("FGSD002_ID25","battery",100),ReadingsNum("FGSD002_ID26","battery",100))} ist es (richtig) "40" ...
Das "alte" Skript hat zwar eine Warnung (nicht numerisch) ausgegeben, aber das Ergebnis korrekt eingestellt.
So richtig nachvollziehen kann ich Dein Problem nicht.
define d1 dummy
setreading d1 battery 17 %
define d2 dummy
setreading d2 battery 27 %
define d3 dummy
setreading d3 battery 37 %
{ min(ReadingsNum('d1','battery',100), ReadingsNum('d2','battery',100),ReadingsNum('d3','battery',100)) }
liefert korrekt 17
{ min(ReadingsNum('d3','battery',100), ReadingsNum('d2','battery',100),ReadingsNum('d1','battery',100)) }
liefert ebenfalls 17
setz' mal bitte einen Wert auf 100 %, ich glaube das ist das Problem ... aus irgendeinem Grund scheint "100" für min() kleiner zu sein als "40"
stimmt.
{min(12,100,14)}
das liefert bei mir in der befehlseingabe von fhem 100.
ohne 100 funktioniert es.
min 3,9,12
das bsp aus perl.doc funktioniert auch nicht, und ergibt 12.
min 3,9,12,100
scheinbar gewinnt die höchste stellenzahl. hier kommt 100.
Der Vergleich "100 %" < "40 %" liefert in Perl interessanterweise das Ergebnis falsch (was in dem Fall richtig ist ;) ), spuckt allerdings oben genannte Warnung aus
min aus 99_Utils verwendet "lt".
Versucht's mal mit "minNum()" ;)
minNum() funktioniert :)
Super - danke !!
{List::Util::min(3,9,12)}
mit dem "original" funktioniert es auch. eventuell "zukunftsicherer". ;)
ich hätte jetzt nicht damit gerechnet, dass fhem hier eine eigene definition verwendet. zumal die namen gleich sind, aber unterschiedlich funktionieren.
schöner wäre, wenn fhem/min "minstr" heissen würde, da es scheinbar wie List::Util::minstr funktioniert. oder noch besser einen eigenen namen vergeben, wie zb "minStr".
Zitat von: frank am 15 Mai 2018, 12:16:53
ich hätte jetzt nicht damit gerechnet, dass fhem hier eine eigene definition verwendet. zumal die namen gleich sind
Das hat historische Gründe, als es noch darum ging, FHEM auch auf einer Fritzkotz laufen zu lassen, ohne dort zusätzliche Module (List::Util) nachinstallieren zu müssen.
Ok - es war mein Fehler, auf min() zu verweisen statt auf minNum(), ich hatte einfach nicht an das alphanumerische "Verhalten" gedacht :)
Jetzt funktioniert es ja wie gewünscht und ohne Warnung :)