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
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.
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
Hallo,
Zahlen werden mit == verglichen. Texte normalerweise mit eq (equal also gleich) oder ne (not equal). Vielleicht ist das ein (Dein) Problem.
Gruß Christoph
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
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.
Kannst du mal den funktionieren Code posten? DANKE!
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 !!!")}}
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.)