Perl-Code - was stimmt nicht?

Begonnen von bugster_de, 17 September 2013, 21:54:49

Vorheriges Thema - Nächstes Thema

bugster_de

Hallo Leute,

ich habe eine Perlroutine, die abhängig von der aktuellen Aussentemperatur sowie der maximal Temperatur für den Tag die Rolläden in Sonnenschutzstellung bringt. Immer um 8.30h morgens schaut sich FHEM die Werte an und macht dann die Rolläden entweder ganz auf (kein Sonnenschutz) oder macht sie in Sonnenschutzstellung. Das läuft alles seit Monaten ohne Probleme durch.
Heute morgen allerdings meinte FHEM, dass wir Sonnenschutz brauchen. Nun wundert mich was da passiert, ich kapiers nicht so ganz.

relevanter Code sieht wie folgt aus:

   my $maxtemp = ReadingsVal( "Tageshoechsttemperatur", "state", 20 );
    my $curtemp = ReadingsVal( "Aussentemperatur", "temperature", 20 );
    if( ( $maxtemp ge "24" ) || ( $curtemp ge "16" ) ) {
   my $mailtext = "Sonnenschutz aktiviert \n" .
"Aktuelle Temperatur: " . $curtemp . "\n" .
"Hoechsttemperatur: " . $maxtemp . " Celsius\n\n" .
"Ende der Message";
   FB_mail( 'mein@meiladresse.de', "Sonnenschutz", $mailtext );


so, und um 8:30h kommt dann folgende Mail:
Sonnenschutz aktiviert
Aktuelle Temperatur: 7.3
Hoechsttemperatur: 13 Celsius

Ende der Message



Wie kann das denn sein?
$maxtemp ist "13" und $curtemp ist "7.3". Wie kommt der dazu, dass eine der beiden Bedingungen der if Abfrage wahr ist?

Wie gesagt, läuft seit Monaten ohne Probleme :-) Ein Mysterium der Computertechnik hat zugeschlagen :-)

MisterEltako

Ich hätte spontan gedacht es müsste:

if( ( $maxtemp >= 24 ) || ( $curtemp >= 16 ) ) {.....

lauten, da hier doch Zahlenwerte verglichen werden. Moglicherweise stört "er" sich sonst an der Nachkommastelle (7.3).

MfG, MisterEltako
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

bugster_de

Hi,

Danke für das Feedback. So was hatte ich auch schon überlegt, aber die Funktion ReadingsVal gibt ja einen String und keinen Scalar zurück. Sprich wenn ich den String mit >= überprüfe geht das schief. Deshalb die Überprüfung mit ge oder sehe ich das falsch?
 
Laut Perl Handbuch und einige empirischen Versuchen muß man, glaube ich, bei der Nutzung einer Variable als String oder Scalar höllisch aufpassen. Die automatische Konvertierung von Scalar nach String (in dem ich den Scalar z.B. einfach in einem print verwende) funktioniert immer. Danach ist die Variable aber für den kompletten Rest der sub ein String !
Umgekehrt geht das wohl zuverlässig nur mittels scalar($mystring). Hier sollte man aber sicher sein, dass der String auch eine Zahl enthält, sonst gibt es auch schiefe Schuhe.

Heute morgen waren die Werte $maxtemp "15" und $curtemp "9.7" und es hat funktioniert. Ich blicks nicht.

Manchmal ist IT doch nicht so deterministisch wie man denkt :-)



Harald

Hm, ich hab ja (noch) nicht viel Ahnung von Perl, stelle folgende Überlegung an:

Du vergleichst mit "ge" Strings. Dabei wird doch ermittelt, an welcher Position zuerst die beiden ersten Zeichen des Strings in der ASCII-Reihe stehen. Dabei ist 12 (ASCCI 0x31 0x32) kleiner als 7.3 (ASCCI 0x37 0x2e 0x33). Oder bin ich da auf dem Holzweg?

Viele Grüße

Harald
Router:AVM7590 1&1 FW:FRITZ!OS 07.56 Anbindung:1&1 50/10 Mb/s, WLAN-Repeater 300E
ELV MAX!Cube, 7xThermostat, ECO, RasPi 4B mit bullseye auf Festplatte,
CUL V 1.67, JeeLink v3_10.1c, nanoCUL, 1xS300TH, 4xHMS100T, 4xELRO, 1xTFA, 2xMAX_FK
ELV MAX!1.4.5, FHEM 5.7 auf RasPi, Kostal PIKO plus

bugster_de

verflixt, Du hast Recht !

ein Suche im Web ergab in den Untiefen einer Perl Dokumentation folgenden Satz:

ZitatRemember that when we talk about string values being greater than each other, we're referring to their ascii values. So the capital letters are technically less than the lowercase letters, and the higher the letter is in the alphabet, the higher the ascii value. Make sure you check your ascii values if you're trying to make logical decisions based on strings.

in so ziemlich allen anderen Perl Handbücher ist das nicht erklärt !
Oh Mann, da habe ich am Wochenende aber ganz schön viel Code, den ich abändern darf :-(

good News: IT ist doch deterministisch :-)