If mit mehreren Vergleichen, probleme

Begonnen von daheim, 05 Juni 2014, 07:10:57

Vorheriges Thema - Nächstes Thema

daheim

Hallo Leute,

ich habe erfolgreich das Yahoo Wettermodul eingebaut. Ich möchte gerne das FHEM mir eine Mail schickt, wenn Gewitter angesagt ist.

Dafür habe ich folgenden Code erstellt:
define unwetter at +*00:00:30 { if (Value("condition") == "Tornado" or "Sturm" or "schwerer Sturm" or  "Orkan" or "schwere Gewitter" or  "Gewitter" or "Gewitterregen" or "einzelne Gewitter" or "vereinzelt Gewitter") { my $Gewitter = ReadingsVal("Witten_Wetter","condition",99) ;; my $Temp = ReadingsVal("Witten_Wetter","temp_c",99) ;; DebianMail('xxx@gmail.com','Unwetterwarnung',"Aktuelle Vorhersage ".$Gewitter. ". Bitte mit Unwetter rechnen!!! Die aktuelle Temperatur beträgt ".$Temp. "°C !!!")}}

nur leider bekomme ich immer eine Mail, egal ob in Condition heiter oder sonnig drin steht.

Wo ist mein fehler?

VG

Daniel

rudolfkoenig

Ernsthaft gefragt: Gibt es eine Programmiersprache, wo das funktioniert? Umgangssprachlich verwendet man solche Konstrukte, waere nur natuerlich, wenn man das in einer Programmiersprache nachbaut. Ich kennen nur keine.

Loesung: statt "a=b or c or d" muss man "a=b or a=c or a=d" schreiben.

daheim

#2
Hallo Herr König,

ich habe den Code jetzt so verändert:

define unwetter at +*00:00:30 { if (Value("condition") == "Tornado" or Value("condition") ==  "Sturm" or Value("condition") ==  "schwerer Sturm" or Value("condition") ==   "Orkan" or Value("condition") ==  "schwere Gewitter" or Value("condition") ==   "Gewitter" or Value("condition") ==  "Gewitterregen" or Value("condition") ==  "einzelne Gewitter" or Value("condition") ==  "vereinzelt Gewitter") { my $Gewitter = ReadingsVal("Witten_Wetter","condition",99) ;; my $Temp = ReadingsVal("Witten_Wetter","temp_c",99) ;; DebianMail('xxx@gmail.com','Unwetterwarnung',"Aktuelle Vorhersage ".$Gewitter. ". Bitte mit Unwetter rechnen!!! Die aktuelle Temperatur beträgt ".$Temp. "°C !!!")}}

Trotzdem bekomme ich eine e-Mail

Bennemannc

Hallo,

Zahlen werden mit == verglichen. Texte normalerweise mit eq (equal also gleich) oder ne (not equal). Vielleicht ist das ein (Dein) Problem.

Gruß Christoph
Cubietruck, Fhem 5.8
CC-RT-DN|LC-SW2-FM|RC-12|RC-19|LC-SW4-BA-PCB|LCp-SW1-BA-PCB|ES-PMSw1-Pl|LC-Bl1PBU-FM|PBI-4-FM|CC-VD|CC-TC|SEC-SC(2)|RC-KEY3-B|LC-Sw1PBU-FM|PB-2-FM|WDS100-C6-O|WDC7000|LC-Bl1-FM
Module: Dewpoint,FB_Callmonitor,HCS,Panstamp,at,notify,THRESHOLD,average,DOIF

daheim

Hallo Christoph,

ich habe jetzt das == durch eq ersetzt. Das hat leider auch keinen Erfolg gebracht.

Ich habe den Fehler gefunden.

Das Value("condition") musste gegen ReadingsVal("Witten_Wetter","condition",99) getauscht werden

marvin78

Die Ursache ist:

Value erwartet als Argument ein Device (condition ist ein Reading des Devices Witten_Wetter). Der Wert wäre dann der state des Devices und nicht das Reading condition.

Mit ReadingsVal greifst du auf einzelne andere Readings des Devices zu.

Michi240281

Kannst du mal den funktionieren Code posten? DANKE!
FHEM 5.6 auf RPi2 / HM LAN Adapter / diverse HM-Devices
FHEM-Remote-App
QNAP 419P / Onkyo TX-SR 608
DM500HD / GM Spark One
Sony 52HX905

daheim

Hier der Funktionierende Code


define unwetter at +*{2}00:00:30 { if (ReadingsVal("Witten_Wetter","condition",99) eq "Tornado" or ReadingsVal("Witten_Wetter","condition",99) eq  "Sturm" or ReadingsVal("Witten_Wetter","condition",99) eq  "schwerer Sturm" or ReadingsVal("Witten_Wetter","condition",99) eq   "Orkan" or ReadingsVal("Witten_Wetter","condition",99) eq  "schwere Gewitter" or ReadingsVal("Witten_Wetter","condition",99) eq   "Gewitter" or ReadingsVal("Witten_Wetter","condition",99) eq  "Gewitterregen" or ReadingsVal("Witten_Wetter","condition",99) eq  "einzelne Gewitter" or ReadingsVal("Witten_Wetter","condition",99) eq  "vereinzelt Gewitter") { my $Gewitter = ReadingsVal("Witten_Wetter","condition",99) ;; my $Temp = ReadingsVal("Witten_Wetter","temp_c",99) ;; DebianMail('xxx@gmail.com','Unwetterwarnung',"Aktuelle Vorhersage ".$Gewitter. ". Bitte mit Unwetter rechnen!!! Die aktuelle Temperatur beträgt ".$Temp. "°C !!!")}}

Brockmann

Zitat von: daheim am 10 Juli 2014, 07:56:56
Hier der Funktionierende Code

Ich habe es jetzt nicht getest, aber sollte es nicht so etwas kompakter gehen:
define unwetter at +*{2}00:00:30 { if (ReadingsVal("Witten_Wetter","condition",99) =~ "Tornado|Sturm|schwerer Sturm|Orkan|schwere Gewitter|Gewitter|Gewitterregen|einzelne Gewitter|vereinzelt Gewitter") { my $Gewitter = ReadingsVal("Witten_Wetter","condition",99) ;; my $Temp = ReadingsVal("Witten_Wetter","temp_c",99) ;; DebianMail('xxx@gmail.com','Unwetterwarnung',"Aktuelle Vorhersage ".$Gewitter. ". Bitte mit Unwetter rechnen!!! Die aktuelle Temperatur beträgt ".$Temp. "°C !!!")}}


Und vielleicht sogar noch etwas kompakter, wenn folgende Vereinfachungen akzeptabel sind:
define unwetter at +*{2}00:00:30 { if (ReadingsVal("Witten_Wetter","condition",99) =~ m/Tornado|Sturm|Orkan|Gewitter/) { my $Gewitter = ReadingsVal("Witten_Wetter","condition",99) ;; my $Temp = ReadingsVal("Witten_Wetter","temp_c",99) ;; DebianMail('xxx@gmail.com','Unwetterwarnung',"Aktuelle Vorhersage ".$Gewitter. ". Bitte mit Unwetter rechnen!!! Die aktuelle Temperatur beträgt ".$Temp. "°C !!!")}}

(m/ sucht im Vergleichsstring nach den nachfolgenden Werte, so dass mit einmal "Gewitter" der Vergleich für alle conditions wahr sein sollte, in den das Wort "Gewitter" oder eben auch "Gewitterregen" vorkommt.)