[gelöst] Perl Fehler seit Update am 14.05.

Begonnen von dt2510, 15 Mai 2018, 08:40:27

Vorheriges Thema - Nächstes Thema

dt2510

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.

betateilchen

#1
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()
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

dt2510

#2
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.

betateilchen

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

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

dt2510

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"

frank

stimmt.
{min(12,100,14)}
das liefert bei mir in der befehlseingabe von fhem 100.
ohne 100 funktioniert es.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

frank

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.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

dt2510

Der Vergleich  "100 %" < "40 %" liefert in Perl interessanterweise das Ergebnis falsch (was in dem Fall richtig ist ;) ), spuckt allerdings oben genannte Warnung aus

Beta-User

min aus 99_Utils verwendet "lt".

Versucht's mal mit "minNum()" ;)
Server: HP-elitedesk@Debian 12, 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

dt2510

minNum() funktioniert :) 

Super - danke !!

frank

{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".
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

betateilchen

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 :)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

dt2510

Jetzt funktioniert es ja wie gewünscht und ohne Warnung  :)