Wetterwarnung für DWD

Begonnen von Tutti_Bomovski, 10 März 2019, 11:28:38

Vorheriges Thema - Nächstes Thema

Tutti_Bomovski

Hallo Zusammen,
ich habe mein Modul UWZ (wird ja wohl leider nicht mehr aktualisiert) auf DWD_OpenData umgestellt.
Soweit so gut... Die Warnungen und die Vorhersage kommt auch ganz normal.
Jetzt möchte ich aber eine Meldung per Telegram erhalten wenn sich eine Wetterwarnung einstellt.
Aktuell fange ich per DOIF den a_count ab und sende dann eine Nachricht. Klappt auch ganz gut...
Allerdings habe ich zwei Probleme:
1. Wenn es 2 Warnungen gibt, dann bekomme ich nur die Meldung für die 2. Warnung weil ich a_count eq = "2" abfange. Die Nachricht für die 1. Warnung erhalte ich dann gar nicht.
2. Wenn die Warnung 1, 2 oder 3 aktualisiert wird, dann bekomme ich gar keine Nachricht.

Ich bin aktuell etwas ratlos, wie ich dies Nachricht bzw. das DOIF, wenn es das richtige Modul dafür ist, abfangen soll.

Hat hier jemand eine Idee?

Im UWZ hat dies auch gut geklappt mit der Telegram Nachricht.

Danke und Gruß
Tutti

Dia81

Zitat von: Tutti_Bomovski am 10 März 2019, 11:28:38
Hallo Zusammen,
ich habe mein Modul UWZ (wird ja wohl leider nicht mehr aktualisiert) auf DWD_OpenData umgestellt.
Soweit so gut... Die Warnungen und die Vorhersage kommt auch ganz normal.
Jetzt möchte ich aber eine Meldung per Telegram erhalten wenn sich eine Wetterwarnung einstellt.
Aktuell fange ich per DOIF den a_count ab und sende dann eine Nachricht. Klappt auch ganz gut...
Allerdings habe ich zwei Probleme:
1. Wenn es 2 Warnungen gibt, dann bekomme ich nur die Meldung für die 2. Warnung weil ich a_count eq = "2" abfange. Die Nachricht für die 1. Warnung erhalte ich dann gar nicht.
2. Wenn die Warnung 1, 2 oder 3 aktualisiert wird, dann bekomme ich gar keine Nachricht.

Ich bin aktuell etwas ratlos, wie ich dies Nachricht bzw. das DOIF, wenn es das richtige Modul dafür ist, abfangen soll.

Hat hier jemand eine Idee?

Im UWZ hat dies auch gut geklappt mit der Telegram Nachricht.

Danke und Gruß
Tutti

Witzig, genau das Problem habe ich auch. Bisher helfe ich mir nur mit dem Umweg jeden Count abzufragen. Dann bekomme ich immer eine Meldung wenn sich am "Count" was ändert nicht jedoch wenn der "Count" gleich bleibt aber die stärke sich ändert. Habe dazu einfach ein DOIF was bei count 1 die Meldung 1 rausschickt, ein DOIF was bei count 2 die Melsung 1+2 rausschickt, etc...
Würde mich auch freuen wenn hier jmd eine Idee hat. Da dies ein allgemeines "Problem" ist hab ich es auch mal bei Anfängerfragen reingestellt

Tutti_Bomovski

Zitat von: Dia81 am 10 März 2019, 12:00:15
Witzig, genau das Problem habe ich auch. Bisher helfe ich mir nur mit dem Umweg jeden Count abzufragen. Dann bekomme ich immer eine Meldung wenn sich am "Count" was ändert nicht jedoch wenn der "Count" gleich bleibt aber die stärke sich ändert. Habe dazu einfach ein DOIF was bei count 1 die Meldung 1 rausschickt, ein DOIF was bei count 2 die Melsung 1+2 rausschickt, etc...
Würde mich auch freuen wenn hier jmd eine Idee hat. Da dies ein allgemeines "Problem" ist hab ich es auch mal bei Anfängerfragen reingestellt

Den a_count fange ich im DOIF auch ab. Wenn es beispielsweise 2 Warnungen gibt bekomme ich aber nur Warnung 2. Wenn sich an den Warnungen was ändert, dann erhalte ich keine Mitteilung.

Vielleicht können wir ja hier mal unsere Daten abgleichen? Gerne auch per PN. Schickst du mir mal deinen Code für das DOIF?
Vielleicht finden wir ja dann einen Weg die Lösung zu finden?

Dia81

Zitat von: Tutti_Bomovski am 10 März 2019, 12:03:31
Den a_count fange ich im DOIF auch ab. Wenn es beispielsweise 2 Warnungen gibt bekomme ich aber nur Warnung 2. Wenn sich an den Warnungen was ändert, dann erhalte ich keine Mitteilung.

Vielleicht können wir ja hier mal unsere Daten abgleichen? Gerne auch per PN. Schickst du mir mal deinen Code für das DOIF?
Vielleicht finden wir ja dann einen Weg die Lösung zu finden?

Hab ich die per PN geschickt :) Wenn wir ein Schritt weiter sind im anderen Thread können wir ja die hier für "alle" festhalten

Tutti_Bomovski

Zitat von: Dia81 am 10 März 2019, 12:17:51
Hab ich die per PN geschickt :) Wenn wir ein Schritt weiter sind im anderen Thread können wir ja die hier für "alle" festhalten

Danke, so machen wir das!!!

jensb

Die Wetterwarnungen des DWD beruhen auf dem CAP Protokoll. Das bietet alle Informationen, die man braucht, um differenzierte Meldungen zu generieren, z.B. nur bei Änderungen erneut zu melden, usw.

Diese Informationen werden jedoch aktuell verworfen, wenn das DWD_OpenData-Modul die Dekodierung hinter sich hat und die Readings generiert, weil sie (bisher) nicht benötigt werden.

Was ich damit sagen will: Wenn man eine optimale Lösung sucht, sollte man im DWD_OpenData-Modul mit der Nachrichtengenerierung ansetzen. Ob eine Erweiterung des Moduls den Aufwand lohnt, kann ich (noch) nicht beurteilen. Es wäre aber z.B. einfach möglich, auch für die die DWD-Alert-ID ein Reading zu generieren, damit man Warnungen eindeutig unterscheiden kann.

Das Reading a_count zu beobachten, ist aktuell die einfachste Lösung, die man von außerhalb des Moduls zur Verfügung hat.

Grüße,
Jens
FHEM 6.1 - RPi 4 Raspbian 12 + PiTFT - OPi Zero Armbian 5.35
EnOcean - (W)LAN/Firmata: BMP180, TSL2561, SHT21, Heatronic 3, OBIS - WLAN/ESP8266: Gardena 1251, Zirkulationspumpe - RTL433: Oregon - Bluetooth - MQTT
Contributions: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/jensb

Dia81

Zitat von: jensb am 10 März 2019, 14:32:53
Die Wetterwarnungen des DWD beruhen auf dem CAP Protokoll. Das bietet alle Informationen, die man braucht, um differenzierte Meldungen zu generieren, z.B. nur bei Änderungen erneut zu melden, usw.

Diese Informationen werden jedoch aktuell verworfen, wenn das DWD_OpenData-Modul die Dekodierung hinter sich hat und die Readings generiert, weil sie (bisher) nicht benötigt werden.

Was ich damit sagen will: Wenn man eine optimale Lösung sucht, sollte man im DWD_OpenData-Modul mit der Nachrichtengenerierung ansetzen. Ob eine Erweiterung des Moduls den Aufwand lohnt, kann ich (noch) nicht beurteilen. Es wäre aber z.B. einfach möglich, auch für die die DWD-Alert-ID ein Reading zu generieren, damit man Warnungen eindeutig unterscheiden kann.

Das Reading a_count zu beobachten, ist aktuell die einfachste Lösung, die man von außerhalb des Moduls zur Verfügung hat.

Grüße,
Jens
Hallo Jens,

verstehe ich vom Gundsatz her. Aber glaube das "Problem" ist ja gar nicht unbedingt auf das Wettermodul gemünzt. Denke das Hauptproblem ist einfach nur ein "geändertes" Reading auszulesen, wie es ja auch bei jedem anderen Device geschieht. Sprich wenn Reading1 auf 1 und eine Änderung in Reading2 welcher Art auch immer stattfindet, dann sende die nachricht. Würde das nicht irgendwie mit event-on-change-reading gehen? Aber genau das krieg ich nicht hingesbastelt mit. Vielleicht verstehe ich aber auch nur was falsch :(

jensb

Alle a_* Readings außer a_count, a_state, a_time werden bei der Aktualierung alle 15 Minuten gelöscht und neu angelegt - sie ändern sich also nie. Hintergrund ist die für die Readings erforderliche Indizierung der Wettermeldungen ab 0. Bei jedem Update vom DWD können sich aber Anzahl und Reihenfolge ändern. Deshalb habe ich die DWD-Alert-ID erwähnt - die würde sich nicht ändern (man könnte sie durch suchen wiederfinden). Außerdem kommt es noch darauf an, was am DWD_OpenData-Modul für readingFn-Attribute eingestellt wurden. Im Zweifel mit dem FHEM-Ereignismonitor überprüfen.

Grüße,
Jens
FHEM 6.1 - RPi 4 Raspbian 12 + PiTFT - OPi Zero Armbian 5.35
EnOcean - (W)LAN/Firmata: BMP180, TSL2561, SHT21, Heatronic 3, OBIS - WLAN/ESP8266: Gardena 1251, Zirkulationspumpe - RTL433: Oregon - Bluetooth - MQTT
Contributions: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/jensb

Tutti_Bomovski

hmmm, irgendwie klappt es nicht so richtig.

Wie bereits erwähnt, habe ich mehrere DOIFs.

([DWD:a_count] eq "1") (set TeleBot send @#"Empfänger"

\n<b>{(ReadingsVal("DWD","a_0_eventDesc",0))}</b>\n
\n{(ReadingsVal("DWD","a_0_description",0))}\n
\n{(ReadingsVal("DWD","a_0_instruction",0))}\n
\nvon: {(ReadingsVal("DWD","a_0_onset",0))}
\nbis: {(ReadingsVal("DWD","a_0_expires",0))})


Wenn sich nun a_count ändert, also aus 0, 1, 2, 3 oder 4 ist, dann gibt es jeweils ein DOIF dafür damit ich Meldungen 0-4 gebündelt erhalte.

Jetzt bekomme ich aber kein Update meiner Wetterwarnung.
DWD_OpenData aktualisiert ja selbständig alle 15 Minuten die Daten.
Wie stelle ich denn mein DOIF ein, dass bei einer Änderung der entsprechenden Readings dann auch eine neue Telegram Nachricht erfolgt?

Im DOIF habe ich schon DO_Always und event-on-update-reading auf a_count eingestellt.
Im DWD Modul steht event-on-update-reading auf state,fc_state,a_state,a_count.

Danke für eure Hilfe.

Tutti_Bomovski

so und jetzt bekomme ich aus irgendeinem Grund alle 15 Minuten das Update aus FHEM.
Obwohl sich nichts an den Readings geändert hat.

Ich hoffe, dass es eine Erklärung und Lösung für mein Problem gibt. ;)

sinus61

Mit event-on-update gibt es ja auch alle 15 Minuten ein Event, da solltest du event-on-change nehmen. Wenn es aber relativ viele Meldungen am Tag gibt, wie z.b. hier im Moment mit den Sturmwarnungen ist das aber alles nicht mehr so zuverlässig nur nach a_count zu gehen.

sinus61

Mal so als Beispiel:

event-on-change-reading a_count

Ein notify

DWD_Wetter.a_count:.[0-9] {
if($EVTPART1 >= 1) {
DWD_Alert("DWD_Wetter");
}
}


und in der 99_myUtils.pm


sub DWD_Alert($)
{
my ($name) = @_;
my $count = ReadingsVal( $name, "a_count", 0 );
my $onset = ""; my $expires = ""; my $description = ""; my $eventDesc = ""; my $txt = "";
for (my $i=0;$i<$count;$i++){
$onset = ReadingsVal( $name, "a_".$i."_onset", 0 );
$expires = ReadingsVal( $name, "a_".$i."_expires", 0 );
$description = ReadingsVal( $name, "a_".$i."_description", 0 );
$eventDesc = ReadingsVal( $name, "a_".$i."_eventDesc", 0 );
$txt .= "⚠️ <b>$eventDesc</b>\n$onset\n$expires\n$description\n";
}
fhem ("set Telegrambot message $txt");
}

Tutti_Bomovski

Zitat von: sinus61 am 16 März 2019, 18:00:19
Mal so als Beispiel:

event-on-change-reading a_count

Ein notify

DWD_Wetter.a_count:.[0-9] {
if($EVTPART1 >= 1) {
DWD_Alert("DWD_Wetter");
}
}


und in der 99_myUtils.pm


sub DWD_Alert($)
{
my ($name) = @_;
my $count = ReadingsVal( $name, "a_count", 0 );
my $onset = ""; my $expires = ""; my $description = ""; my $eventDesc = ""; my $txt = "";
for (my $i=0;$i<$count;$i++){
$onset = ReadingsVal( $name, "a_".$i."_onset", 0 );
$expires = ReadingsVal( $name, "a_".$i."_expires", 0 );
$description = ReadingsVal( $name, "a_".$i."_description", 0 );
$eventDesc = ReadingsVal( $name, "a_".$i."_eventDesc", 0 );
$txt .= "[emoji3544] <b>$eventDesc</b>\n$onset\n$expires\n$description\n";
}
fhem ("set Telegrambot message $txt");
}

Hallo Sinus61,
Danke für den Code...
Damit habe ich noch gar nicht gearbeitet.
Kannst du etwas näher erklären was passiert?
Kommen dann auch alle Meldungen wenn es mehr als 1 gibt?

Danke und Gruß
Tutti...

Gesendet von meinem SM-T810 mit Tapatalk


Tutti_Bomovski

@Sinus61
Ich habe deine Codes bei mir mal eingebaut und "musste" feststellen, dass sich leider nichts tut.

sinus61

#14
Im notify müsstest du DWD_Wetter gegen den Namen deines DWD Devices tauschen. Ausserdem in der  99_myUtils.pm den Namen deines Telegram Bots.

Immer wenn sich a_count ändert wird dann die Routine in der 99_myUtils.pm aufgerufen und alle Warnungen als eine Meldung gesendet.

Zum probieren kannst du in der FHEM Befehlszeile mal {DWD_Alert("DWD_Wetter")} eingeben, ggfs. den Namen deines Devices anpassen.