FHEM Forum

FHEM => Automatisierung => Thema gestartet von: daheim am 05 Juni 2014, 07:10:57

Titel: If mit mehreren Vergleichen, probleme
Beitrag von: daheim am 05 Juni 2014, 07:10:57
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
Titel: Antw:If mit mehreren Vergleichen, probleme
Beitrag von: rudolfkoenig am 05 Juni 2014, 07:32:53
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.
Titel: Antw:If mit mehreren Vergleichen, probleme
Beitrag von: daheim am 05 Juni 2014, 07:56:24
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
Titel: Antw:If mit mehreren Vergleichen, probleme
Beitrag von: Bennemannc am 05 Juni 2014, 08:57:09
Hallo,

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

Gruß Christoph
Titel: Antw:If mit mehreren Vergleichen, probleme
Beitrag von: daheim am 05 Juni 2014, 11:08:05
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
Titel: Antw:If mit mehreren Vergleichen, probleme
Beitrag von: marvin78 am 05 Juni 2014, 11:12:04
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.
Titel: Antw:If mit mehreren Vergleichen, probleme
Beitrag von: Michi240281 am 06 Juni 2014, 13:24:53
Kannst du mal den funktionieren Code posten? DANKE!
Titel: Antw:If mit mehreren Vergleichen, probleme
Beitrag von: daheim am 10 Juli 2014, 07:56:56
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 !!!")}}
Titel: Antw:If mit mehreren Vergleichen, probleme
Beitrag von: Brockmann am 15 Juli 2014, 18:18:23
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.)