[gelöst]woher weiß ich ob mir ein Modul einen string oder eine zahl liefert?

Begonnen von holle75, 04 Juni 2018, 21:37:47

Vorheriges Thema - Nächstes Thema

holle75

([?00:00-23:59|[BeregnungTage]] and [?BeregnungNach] eq "Elevation" and [?Wetterstation:statRain_yearHour24] < 3 and [?Wetterstation:statRain_yearHour48] < 7 and [?Wetterstation:israining] eq "0"and ([?WetterProplanta:fc0_rain] < 4 and [?WetterProplanta:chOfRainDay] < 50) and ["BeregnungDOIF_NachSonneElevation:cmd_1"] and ($month >= [BeregnungStartmonat] and $month <= [BeregnungEndmonat]))
DOELSEIF ([?00:00-23:59|[BeregnungTage]] and [?BeregnungNach] eq "Zeit" and [?Wetterstation:statRain_yearHour24] < 3 and [?Wetterstation:statRain_yearHour48] < 7 and [?Wetterstation:israining] eq "0" and ([?WetterProplanta:fc0_rain] < 4 and [?WetterProplanta:chOfRainDay] < 50) and [[BeregnungNach:Uhrzeit]] and ($month >= [BeregnungStartmonat] and $month <= [BeregnungEndmonat]))
DOELSE

sorry, in code-tags kann man die farbe nicht ändern.
Also, der rote Teil ist neu und seitdem (wenn das DOIF ausgeführt wird, nicht beim initialisieren) bekomme ich folgende Fehlermeldung im log:

2018.06.04 07:11:40 1: PERL WARNING: Argument "" isn't numeric in numeric lt (<) at (eval 193770) line 1.
2018.06.04 07:11:40 3: eval: BeregnungDOIF_NachSonne: warning in condition c01


israining, fc0_rain und chOfRainDay kommt von Proplanta und liegt als Zahl vor, denke ich zumindest. Kann eine Zahl auch ein String sein den man dann mit "lt" und Anführungszeichen vergleichen muß? Glaube, ich habe da gerade ein bißchen Chrüsimüsi mit meinen Operatoren ???

Danke euch!

Otto123

Hi,

Dein Problem ist nicht ob der Inhalt String oder numerisch ist, das Problem ist das der Inhalt leer -> "" ist!!!!

Was steht denn im Reading chOfRainDay ?

Bei mir gibt es dieses Reading nicht.  :o

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

holle75

Moinsen Otto, mmh, verdammt, es heißt "fc0_chOfRainDay" ... wollte schon auftrumpfen und was a la "ätsch, mein Proplanta hat das" schreiben :D

ok, Fehler gefunden. VIELEN Dank. Trotzdem würde mich jetzt dann doch auch noch das Ding mit String und Numerisch in Perl interessieren.

mumpitzstuff

Normalerweise konvertiert Perl Strings zu Zahlen und Zahlen zu Strings wenn es benötigt wird. Das bedeutet, man könnte schreiben:

"1" > 0
"1" > "0"
1 > 0
1 > "0"
1 eq "1"
usw.


Bedingung ist immer, das sich der String in eine Zahl umwandeln lässt.

"eins" > 1

wird deshalb zu einem Fehler führen.

http://pronix.linuxdelta.de/Perl_cgi/Perl/perl_kurs_kapitel5.shtml

holle75

Top Mumpitzstuff, danke ... wenn doch alles so einfach wäre.

Bedeutet, der Lesbarkeit halber sollte man ><= usw bei Zahlen ohne Anführungszeichen
und lt, gt, eq usw bei Strings mit Anführungszeichen nutzen?

Ich dachte das "" (leer) im Fehler bezieht sich auf eine fehlerhafte, nicht lesbare Formatierung und deshalb leer.

amenomade

Zitat von: mumpitzstuff am 04 Juni 2018, 22:49:50
"eins" > 1
wird deshalb zu einem Fehler führen.

Eigentlich ist es kein Fehler, sondern nur ein Warning... und dies ist immer falsch: Perl versteht Strings, die keine Zahl sind, als 0.
"eins" > 1 ist gleich 0 > 1 mit Warning und ist dann falsch
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

mumpitzstuff

Okay wie man es nimmt. Für mich sind auch Warnungen Fehler.  ;D

Aber um auf die Frage zurück zu kommen, man sollte Strings immer in Hochkomma packen und Zahlen halt nicht, vor allem wegen der Lesbarkeit. Strings dann mit eq und ne und Zahlen mit == und != vergleichen. Perl verzeiht an der Stelle aber wirklich viel, nur eben nicht alles.
DOIF ersetzt wahrscheinlich ein nicht vorhandenes Reading mit "", so das es dann zu deiner Warnung kommt.

Damian

Man kann bei DOIF auch Default-Werte angeben für den Fall, dass ein Reading nicht existiert: https://fhem.de/commandref_DE.html#DOIF_notexist

Für Strings kann man nach Zahlen filtern: https://fhem.de/commandref_DE.html#DOIF_Filtern_nach_Zahlen
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Per

Zitat von: mumpitzstuff am 04 Juni 2018, 22:49:50
Normalerweise konvertiert Perl Strings zu Zahlen und Zahlen zu Strings wenn es benötigt wird. Das bedeutet, man könnte schreiben:

"1" > 0
"1" > "0"
1 > 0
1 > "0"
1 eq "1"
usw.

Und ist
"00.2" == 0.2?

mumpitzstuff

float auf Gleichheit zu prüfen sollte man möglichst vermeiden, da "0.02" unter Umständen auch zu 0.01999999999 konvertiert wird und dann nicht mehr gleich ist. Was bei "00.2" passiert bei der Konvertierung (falls es konvertiert wird), kann ich nicht genau sagen. Ich würde vermuten das 0.2 raus kommt.