Regenradar von morgenwirdes.de

Moin zusammen,

da das Raketenschnecke-Regenradar bekanntlich seit ein paar Wochen nicht mehr funktioniert, habe ich nach einer Alternative gesucht. Ich vermute, Raketenschnecke wird uns hier wohl nicht mehr helfen :wink:

Der Wunsch war wieder ein Regenforecast für die nächsten 2 Stunden.

Erkenntnis 1)
Ich blicke weder die neue API von wetteronline.de noch die öffentliche OpenData-Datenbank des DWD. Raffe ich nicht und meine Coding-Skills reichen dafür nicht. Anyone???

Erkenntnis 2)
Ich muss mich dringend mit IPS-Modulen beschäftigen. Auch hier reichen meine Coding-Skills noch nicht aus. Es bleibt also erstmal bei einem simplen Skript. Sorry!

Ergebnis)
Als einfache und schnelle Lösung habe ich für mich www.morgenwirdes.de gefunden.
Scheint die Seite einer Privatperson zu sein, welche die OpenData-Datenbank des DWD anzapft und sinnvoll aufbereitet.

Nachfolgenden Code in ein Skript einfügen und dieses Skript zyklisch z.B. alle 5 Minuten ausführen. Die Variablen werden automatisch angelegt; nach ähnlichem Schema wie damals im Raketenschnecke-Projekt (ich wollte möglichst hohe Kompatibilität).
Euren Standort in der ersten Zeile als Longitude/Latitude angeben, alternativ die zweite Zeile auskommentieren und hier Eure PLZ eingeben! (Lat/Long ist aber präziser!).

<?php

// Regenradar - Skript zum zyklischen Pollen vom morgenwirdes.de-Niederschlagsradar
// Quelle: Deutscher Wetterdienst          IPS-Skript v0.2 von ika

$location = 'lat=52.22&long=7.48';
//$location = 'plz=48432';

$treshold = 0;

$urltext = 'https://morgenwirdes.de/api/v2/rtxt.php?'.$location;
$urljson = 'https://morgenwirdes.de/api/v2/rjson.php?'.$location; 

$buffertext = @implode('', file($urltext));
if (empty($buffertext)) { FC_DL_Error(true); return; };
SetValue(FC_Variables(IPS_GetParent($_IPS['SELF']), "Forecast_Text", 3, "", ""), $buffertext);

$bufferjson = @implode('', file($urljson));
if (empty($bufferjson)) { FC_DL_Error(true); return; };
$json = json_decode($bufferjson,true);
$intensityonstart = $treshold; $rainstart = 0; $rainstartts = 0; $rainendts = 0;

for ($i = 0; $i <= 24; $i++) {
SetValue(FC_Variables(IPS_GetParent($_IPS['SELF']), sprintf("%'.02d", $i)."_FC_Intensity", 2, "", " ".$json[$i]['time']), $json[$i]['dbz']);
if(($intensityonstart<=$treshold) && ($json[$i]['dbz']>$treshold)) { $intensityonstart = $json[$i]['dbz']; $rainstart = $json[$i]['time']; $rainstartts = $json[$i]['timestamp']; };
if($json[$i]['dbz']>0) { $rainendts = $json[$i]['timestamp']; };
};

SetValue(FC_Variables(IPS_GetParent($_IPS['SELF']), "Rain_Intensity_on_Start", 2, "", " ".$rainstart), $intensityonstart);
SetValue(FC_Variables(IPS_GetParent($_IPS['SELF']), "FC_Rain_Start", 1, "~UnixTimestamp", ""), $rainstartts);
SetValue(FC_Variables(IPS_GetParent($_IPS['SELF']), "FC_Rain_End", 1, "~UnixTimestamp", ""), $rainendts);
FC_DL_Error(false);


function FC_Variables($id, $name, $type, $profile = "", $fctime)
{
    # type: 0=boolean, 1 = integer, 2 = float, 3 = string;
    global $IPS_SELF;
    $vid = @IPS_GetObjectIDByIdent($name, $id);
    if($vid === false)
    {
        $vid = IPS_CreateVariable($type);
        IPS_SetParent($vid, $id);
        IPS_SetIdent($vid, $name);
        IPS_SetName($vid, $name);
        if($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
    }
    IPS_SetName($vid, $name.$fctime);
    return $vid;
};

function FC_DL_Error($increase = true)
{
    $id = IPS_GetParent($_IPS['SELF']);
    $name = "DL_Error";
    $vid = @IPS_GetObjectIDByIdent($name, $id);
    if($vid === false)
    {
        $vid = IPS_CreateVariable(1);
        IPS_SetParent($vid, $id);
        IPS_SetIdent($vid, $name);
        IPS_SetName($vid, $name);
    };
    if($increase) 
    { 
        SetValue($vid, GetValue($vid)+1); 
        echo "Fehler beim Download!"; } 
        else { SetValue($vid, 0); 
    };
    if(GetValue($vid)>=3) 
    { 
        SetValue(FC_Variables(IPS_GetParent($_IPS['SELF']), "Rain_Intensity_on_Start", 2, "", " ERROR"), -99); 
        SetValue(FC_Variables(IPS_GetParent($_IPS['SELF']), "FC_Rain_Start", 1, "~UnixTimestamp", " ERROR"), 0);
        SetValue(FC_Variables(IPS_GetParent($_IPS['SELF']), "FC_Rain_End", 1, "~UnixTimestamp", " ERROR"), 0);
        IPS_LogMessage($_IPS['SELF'], "+++++ Fehler beim Download des Regenradar/Forecast! +++++");
    };
    return $vid;
};

Das „Radarbild“ gibt es unter Regenradar Rheine | morgenwirdes.de bzw. https://morgenwirdes.de/api/v2/rr.php
Das nutze ich derzeit aber nicht; ich benötige nur reine Textwerte als „Regendetektor“.

Die Regenwerte folgen wohl einer anderen Skala als bei RaketenschneckeRRFC/Wetteronline. Kein Regen wird wohl nicht einfach als Null gemeldet, sondern als „Trockenheitswert“ zwischen -32,5 und 0 ?! Ich werde das beobachten.

Gruß,
ika

Danke, bist klasse !

Guck mal hier …

Regenvorhersage in JSON

Update: 2.2 ist wohl zu niedirg, jetzt nutze ich 12.2, solltet ihr einen besseren Wert kenn, kontaktiert mich.


Somit sollte es …

if($intensityonstart<=12.2)

heissen, sonst passen der Text wann es regent zu den „Daten“

Hallo, ich bin der Mensch hinter morgenwirdes.de. Der von euch angesprochene „Trockenheitswert“ beschreibt die gemessene Radarreflektivität. Mehr zu diesem Wert findet ihr in diesem Dokument des DWD hier . Solltet ihr noch Fragen zu den Daten oder zur Verwendung dieser haben kann ich euch diese gerne beantworten.

1 „Gefällt mir“

Wenn Interesse besteht kann ich auch einen eigenen API endpoint schreiben, der genau auf euren Anwendungszweck angepasst ist. Ich könnte euch auch dabei helfen, direkt die Werte aus DWD Opendata zu nutzen, doch ich würde euch bitten dies aus Solidarität nicht zu tun, da dies die Server des DWD mit rund 1GB Daten pro Tag und Nutzer belasten würde(und das braucht auch bei euch einiges an Rechenleistung).

1 „Gefällt mir“

Hi Jonas,

schön, dass du dich hier (an)gemeldet hast. Darf ich fragen wie du so schnell auf diesen Thread aufmerksam geworden bist?

Ich würde gerne bei der Anbindung an deine API bleiben; ich hatte nämlich auch schon grob den Eindruck, dass ich bei DWD OpenData deutlich größere und undifferenzierte Datenpakete abrufen und prozessieren müsste.
Umgekehrt hoffe ich natürlich, dass die Symcon-Community nun zukünftig nicht zuviel Traffic bei dir generiert… aber ich denke, mit sowas hast du gerechnet als du deine API dokumentiert hast.

Ein Regenradar/Forecast in der Hausautomation muss vor allem eins sein: zuverlässig funktionell. Ich werde morgen oder übermorgen nochmal eine Fehlerbehandlung zufügen, etwa für die Fälle wo der Server nicht erreichbar ist.

Und zuletzt noch ein GROSSES DANKE für die Bereitstellung von morgenwirdes.de !!!
Scheint mir, im Gegensatz zu anderen werbefinanzierten Angeboten, ja vollständig unkommerziell zu sein?!

Viele Grüße
ika

EDITH: angekündigte einfache Fehlerbehandlung wurde in v0.2 im Erstpost nachgetragen! Funktion analog zum RaketenschneckeRRFC mit einer Zählervariablen für Download-Fehler.

Also bei mir kann das Skript die Adresse nicht auflösen :pensive:

Fehlermeldung:

Warning:  file(): php_network_getaddresses: getaddrinfo failed: Der angegebene Host ist unbekannt.  in C:\ProgramData\Symcon\scripts\22567.ips.php on line 13

Warning:  file(https://morgenwirdes.de/api/v2/rtxt.php?lat=5.22&amp;long=8.52): failed to open stream: php_network_getaddresses: getaddrinfo failed: Der angegebene Host ist unbekannt.  in C:\ProgramData\Symcon\scripts\22567.ips.php on line 13

Warning:  implode(): Invalid arguments passed in C:\ProgramData\Symcon\scripts\22567.ips.php on line 13

Warning:  file(): php_network_getaddresses: getaddrinfo failed: Der angegebene Host ist unbekannt.  in C:\ProgramData\Symcon\scripts\22567.ips.php on line 16

Warning:  file(https://morgenwirdes.de/api/v2/rjson.php?lat=5.22&amp;long=8.52): failed to open stream: php_network_getaddresses: getaddrinfo failed: Der angegebene Host ist unbekannt.  in C:\ProgramData\Symcon\scripts\22567.ips.php on line 16

Warning:  implode(): Invalid arguments passed in C:\ProgramData\Symcon\scripts\22567.ips.php on line 16

Notice:  Trying to access array offset on value of type null in C:\ProgramData\Symcon\scripts\22567.ips.php on line 21

Notice:  Trying to access array offset on value of type null in C:\ProgramData\Symcon\scripts\22567.ips.php on line 21

Notice:  Trying to access array offset on value of type null in C:\ProgramData\Symcon\scripts\22567.ips.php on line 21

Notice:  Trying to access array offset on value of type null in C:\ProgramData\Symcon\scripts\22567.ips.php on line 21
Abort Processing during exceed of maximal ErrorCount: Trying to access array offset on value of type null
   Error in Script C:\ProgramData\Symcon\scripts\22567.ips.php on Line 22

Mein Skript dazu:

<?php

// Regenradar - Skript zum zyklischen Pollen vom morgenwirdes.de-Niederschlagsradar
// Quelle: Deutscher Wetterdienst          IPS-Skript v0.1 von ika


$location = 'lat=5.22&long=8.52';
//$location = 'plz=48432';

$urltext = 'https://morgenwirdes.de/api/v2/rtxt.php?'.$location;
$urljson = 'https://morgenwirdes.de/api/v2/rjson.php?'.$location; 

$buffertext = implode('', file($urltext));
SetValue(FC_Variables(IPS_GetParent($_IPS['SELF']), "Forecast_Text", 3, "", ""), $buffertext);

$bufferjson = implode('', file($urljson));
$json = json_decode($bufferjson,true);
$intensityonstart = 0; $rainstart = 0; $rainstartts = 0; $rainendts = 0;

for ($i = 0; $i <= 24; $i++) {
SetValue(FC_Variables(IPS_GetParent($_IPS['SELF']), sprintf("%'.02d", $i)."_FC_Intensity", 2, "", " ".$json[$i]['time']), $json[$i]['dbz']);
if($intensityonstart<=0) { $intensityonstart = $json[$i]['dbz']; $rainstart = $json[$i]['time']; $rainstartts = $json[$i]['timestamp']; };
if($json[$i]['dbz']>0) { $rainendts = $json[$i]['timestamp']; };
};

SetValue(FC_Variables(IPS_GetParent($_IPS['SELF']), "Rain_Intensity_on_Start", 2, "", " ".$rainstart), $intensityonstart);

SetValue(FC_Variables(IPS_GetParent($_IPS['SELF']), "FC_Rain_Start", 1, "~UnixTimestamp", ""), $rainstartts);

SetValue(FC_Variables(IPS_GetParent($_IPS['SELF']), "FC_Rain_End", 1, "~UnixTimestamp", ""), $rainendts);


function FC_Variables($id, $name, $type, $profile = "", $fctime)
{
    # type: 0=boolean, 1 = integer, 2 = float, 3 = string;
    global $IPS_SELF;
    $vid = @IPS_GetObjectIDByIdent($name, $id);
    if($vid === false)
    {
        $vid = IPS_CreateVariable($type);
        IPS_SetParent($vid, $id);
        IPS_SetIdent($vid, $name);
        IPS_SetName($vid, $name);
        if($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
    }
    IPS_SetName($vid, $name.$fctime);
    return $vid;
};

Wenn ich die $urltext direkt im Browser eingebe funktioniert es. :thinking:

Gruß
  Horst

Alles wieder Gut, lag an meinem Server, nach Update und Neustart geht alles.

Mein API sollte einiges an Traffic aushalten, da sollte es keine Problem geben. Und da ich sie auch selber mit einigen Geräten nutze, sollte ich Ausfälle auch schnell bemerken. Sollte sie trotzdem einmal nicht funktionieren, schreibt mir einfach hier oder per Email und ich kümmer mich darum.

Ja, morgenwirdes.de ist unkommerziell. Ich habe die Webseite gebaut, weil mich andere Webseiten durch die viele Werbung genervt haben. Und da ich es verschwenderisch gefunden hätte, diese Arbeit nur für mich zu machen, ist die Webseite für jeden zugänglich. Und die API habe ich gebaut, da die Open Data Angebote des DWD zwar super sind, aber nicht unbedingt einfach direkt zu implementieren sind. Und auf Geräten mit weniger Rechenleistung wie z.B. einem ESP32 wäre das Regenradar sonst nicht nutzbar.

Viele Grüße
Jonas

Hallo zusammen,

coole Seite und tolle Datenquelle. Besonders gefällt mir die grafische Darstellung der Regenmenge als „Zahlenstrahl“:

Könnte man diese Grafiken auch per IPS abrufen?

Danke euch beiden!
Vielen Dank und lieben Gruß
Adam

Hey MaLu,

Somit sollte es …
if($intensityonstart<=12.2)
heissen, sonst passen der Text wann es regent zu den „Daten“

den Wert nur an der von dir genannten Position anzupassen, hätte nicht gereicht. Ich habe daher nun in der neuen Version oben eine Threshold-Variable eingefügt. Hier kannst du nun einfach deinen gewünschten Schwellenwert von z.B. 12.2 eintragen.
Ich lasse das bei mir mit Absicht erstmal auf 0… laut Doku des DWD ergibt „Sprühregen“ Werte zwischen 3 und 20… ich will das mal erst beobachten; ich wünsche bei mir eine sehr sensible Detektion.

Der „Text“ wird dennoch nicht zu den Start/End-Daten passen; auch das war von mir so gewünscht! Im Gegensatz zu Jonas’ Warntext wird meine RainEnd-Uhrzeit immer den spätestmöglichen Zeitpunkt ausgeben. Mich interessiert es nicht, ob es zwischendurch vielleicht mal für 5 Minuten trocken sein wird, sondern möglichst wann das Regenwetter ein Ende hat :wink:

Ich hatte mit Jonas schon kurz über die Möglichkeit eines Radarfilms als animiertes GIF gesprochen (so wie damals bei Raketenschnecke). Auch diese Balkengrafik wäre sicher prinzipiell als JPG denkbar. Ich denke aber nicht, dass das ganz kurzfristig geht.
Aber warum willst du das unbedingt als Grafik? Binde doch einfach diesen Teil der morgenwirdes.de-Webseite als Externe Seite bzw. HTMLBox/iFrame in dein Webfront ein.

Ich habe jetzt die erste Version des Regenradar GIFs entworfen. Diese hat noch nicht alle Funktionen und ist nur zu Testzwecken gedacht. https://morgenwirdes.de/api/v3/gif1.php

Es wäre möglich, diese Grafik als PNG/JPG/SVG bereitzustellen. Würde dir das in deiner Anwendung helfen? Ich habe auch überlegt, diese Grafik optional in das Regenradar GIF einzubauen.

Geil, großartig! Und toll, dass das so schnell ging!

Eine Kleinigkeit, und bitte lach’ mich nicht aus: gerade wenn so wie heute viele „Regenwolken“ über die Deutschlandkarte ziehen, fällt es mir auf den „schnellen Blick“ schwer, meinen Standort schnell zu finden. Ich fände ein Fadenkreuz, wie es bei RaketenschneckeRRFC war, sehr hilfreich. Positionierung des Fadenkreuzes wieder einfach über Query-Parameter Long/Lat bzw PLZ ?!

Edit: ich stelle gerade fest, dass das serverseitig (also bei dir) wohl eher schwierig wird. Das hieße ja, dass die GIF immer dynamisch aus Einzelbildern bei dir zusammengebaut werden muss… das ist wohl Quatsch :wink:

Moin jonas, danke für diese gute schnörkellose Seite und den Aufwand den du dort reingesteckt hast. Wird dann wohl das RS-Regenradar bei mir ersetzen. Wie immer wenn es was Gutes gibt , kommen auch gleich die unverschämten Wünsche auf: z.B. wäre es möglich wie in der „Regenvorschau“-App in der Regenradarkarte einen Vektor mit Richtung und Zeit bis Regeneintritt zum Standort einzubauen?
Gruß Gerd

Daran arbeite ich aktuell schon. Das GIF wird aktuell eh jedes mal neu bei mir gerendert, da ist es kein Problem, das noch hinzuzufügen.

Gute Idee! Ich werde versuchen, das in der zweiten Version einzubauen.

Hallo,

das wäre sehr cool. Ist mir wesentlich lieber, als mit „externen Seiten bzw. HTMLBox/iFrame“ zu arbeiten. Falls möglich, bitte die Zahlenstahlen einzeln (heute, morgen, übermorgen…)

TOP und vielen Dank!

LG
Adam

Die zweite Version des Regenradars ist fertig.

https://morgenwirdes.de/api/v3/gif3.php?lat=49&long=12&delay=50&dark=0&type=1

Die Übergabeparameter machen Folgendes:

lat und long sind eure Koordinaten.

delay ist die Verzögerung zwischen Bildern (um es langsamer zu machen, müsst ihr diesen Wert erhöhen)

dark aktiviert den Nachtmodus (Mögliche Werte: 0, 1)

typ schaltet zwischen zwei verschiedenen Radarfarben (Mögliche Werte: 0, 1)

Danke vielmals.
Hat der Kollege vielleicht auch was für uns ganz im Süden? :slight_smile: Die Daten sind ja da, es fehlt nur noch die Karte. Die DWD Daten gelten auch für die Schweiz.