FHEM Forum

FHEM => Sonstiges => Thema gestartet von: dt2510 am 15 Mai 2018, 08:40:27

Titel: [gelöst] Perl Fehler seit Update am 14.05.
Beitrag von: dt2510 am 15 Mai 2018, 08:40:27
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.
Titel: Antw:Perl Fehler seit Update am 14.05.
Beitrag von: betateilchen am 15 Mai 2018, 09:15:57
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)

Titel: Antw:Perl Fehler seit Update am 14.05.
Beitrag von: dt2510 am 15 Mai 2018, 09:35:04
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.
Titel: Antw:Perl Fehler seit Update am 14.05.
Beitrag von: betateilchen am 15 Mai 2018, 10:20:01
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

Titel: Antw:Perl Fehler seit Update am 14.05.
Beitrag von: dt2510 am 15 Mai 2018, 10:34:06
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"
Titel: Antw:Perl Fehler seit Update am 14.05.
Beitrag von: frank am 15 Mai 2018, 10:43:32
stimmt.
{min(12,100,14)}
das liefert bei mir in der befehlseingabe von fhem 100.
ohne 100 funktioniert es.
Titel: Antw:Perl Fehler seit Update am 14.05.
Beitrag von: frank am 15 Mai 2018, 11:03:37
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.
Titel: Antw:Perl Fehler seit Update am 14.05.
Beitrag von: dt2510 am 15 Mai 2018, 11:07:40
Der Vergleich  "100 %" < "40 %" liefert in Perl interessanterweise das Ergebnis falsch (was in dem Fall richtig ist ;) ), spuckt allerdings oben genannte Warnung aus
Titel: Antw:Perl Fehler seit Update am 14.05.
Beitrag von: Beta-User am 15 Mai 2018, 11:07:56
min aus 99_Utils verwendet "lt".

Versucht's mal mit "minNum()" ;)
Titel: Antw:Perl Fehler seit Update am 14.05.
Beitrag von: dt2510 am 15 Mai 2018, 11:10:11
minNum() funktioniert :) 

Super - danke !!
Titel: Antw:[gelöst] Perl Fehler seit Update am 14.05.
Beitrag von: frank am 15 Mai 2018, 12:16:53
{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".
Titel: Antw:[gelöst] Perl Fehler seit Update am 14.05.
Beitrag von: betateilchen am 15 Mai 2018, 12:58:20
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 :)
Titel: Antw:[gelöst] Perl Fehler seit Update am 14.05.
Beitrag von: dt2510 am 15 Mai 2018, 15:16:09
Jetzt funktioniert es ja wie gewünscht und ohne Warnung  :)