Unwetterzentrale Revolutions

Aktuellester Stand vom 01.06.2016:
Verfügbar als PHP-Modul: https://github.com/paresy/SymconMisc

Nach dem Klassiker im Jahre 2006 -> IP-Symcon-Unwetterzentrale
Der Reloaded Variante im Jahre 2008 -> Wetterwarnung

Gibt es jetzt die 2010 Version, die sich vollständig automatisch in IP-Symcon integriert :slight_smile:

Das Skript läd das aktuelle Radarbild in IP-Symcon rein und berechnet die farbigen Pixel (Regenwolke) gewichtet zu einem imaginären Regenwert. Da dieser keine statistische Größe darstellt, müsst ihr selber entscheiden, ab welchem Wert ihr euch benachrichtigen lasst, dass es Regnen wird.

Für weitere Funktionen bitte NEUE Skripte anlegen und auf die Regenmengenänderung triggern. Bitte keinen Code einfach in das Skript panschen :smiley:

Hinweis:
Damit ihr nicht alle 15 Minuten mit einer „Es wird gleich Schütten“ SMS genervt werdet, nutzt den „Bei Grenzüberschreitung“ Trigger in IP-Symcon und deaktiviert den Haken bei „Nachfolgende Ereignisse ausführen“. Dadurch wird die Meldung bei einer Überschreitung verschickt. Eine neue Meldung aber erst, wenn der Regenwert wieder unterhalb der Schwelle lag.


<?
/*
 dwddg = Deutschland
 
 dbad = Baden-Württemberg
 dbay = Bayern
 dber = Brandenburg/Berlin
 dhes = Hessen
 dmec = Mecklenburg-Vorpommern
 dnie = Niedersachsen/Bremen
 dnrw = NRW
 drlp = Rheinland-Pfalz/Saarland
 dsac = Sachsen
 dsan = Sachsen-Anhalt
 dsch = Schleswig-Holstein/Hamburg
 dtue = Thüringen
*/

$area = "dsch";

/*
 Die Koordinaten könnt ihr am einfachsten herausfinden, indem ihr das Bild in Paint öffnet und mit dem Cursor auf euren Punkt geht. Dann könnt ihr in der Statuszeile von Paint die X/Y Koordinaten ablesen.
*/
$homeX = 324;
$homeY = 179;

/*
 Der Radius gibt an, wie viele Pixel um euren Ort zur Berechnung des Regenwertes genutzt werden sollen
*/
$homeRadius = 10;

//Ab hier nichts mehr ändern
$object = IPS_GetObject($IPS_SELF);
$parentID = $object['ParentID'];

//Installer
if ($IPS_SENDER == "Execute") {
   IPS_SetHidden($IPS_SELF, true);
   IPS_SetName($IPS_SELF, "Auslese-Skript");
   $parentObject = IPS_GetObject($parentID);
   if ($parentObject['ObjectType'] !== 1)
   {
       $instanceID = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");
       IPS_SetParent($instanceID, $parentID);
       $parentID = $instanceID;
       IPS_SetParent($IPS_SELF, $parentID);
       IPS_SetName($instanceID, "Unwetterzentrale");
   }
   IPS_SetScriptTimer($IPS_SELF, 3600);
}

//Auf 15 Minuten Takt Synchronisieren
$offset = (integer)date("s") + ((integer)date("i") % 15) * 60;
if($offset != 0) {
   IPS_SetScriptTimer($IPS_SELF,900 - $offset);
} else {
   IPS_SetScriptTimer($IPS_SELF,900);
}

//Zeit berechnen
$minute=floor(date("i") / 15) * 15;
$dateline=mktime(date("H"), $minute, 0, date("m"), date("d"), date("y"));

//Radarbild Downloaden
$opts = array(
  'http'=>array(
    'method'=>"GET",
    'max_redirects'=>1
  )
);
$context = stream_context_create($opts);

$localImage = IPS_GetKernelDir()."\\radar.gif";

$remoteImage = "http://www.wetteronline.de/daten/radar/$area/".gmdate("Y", $dateline)."/".gmdate("m", $dateline)."/".gmdate("d", $dateline)."/".gmdate("Hi", $dateline).".gif";
$data = @file_get_contents($remoteImage, false, $context);
if($data === false) {
    //Altes Bild laden
   $dateline -= 15*60;
    $remoteImage = "http://www.wetteronline.de/daten/radar/$area/".gmdate("Y", $dateline)."/".gmdate("m", $dateline)."/".gmdate("d", $dateline)."/".gmdate("Hi", $dateline).".gif";
    $data = @file_get_contents($remoteImage, false, $context);
    if($data === false) {
        return;
    }
}

if((strpos($http_response_header[0], "200") === false)) {
 return;
}

file_put_contents($localImage, $data);

//Radarbild auswerten
$im = ImageCreateFromGIF ($localImage);

//Stärken 
$regen[6] = imagecolorresolve  ($im, 250,2,250); 
$regen[5] = imagecolorresolve  ($im, 156,50,156); 
$regen[4] = imagecolorresolve  ($im,  28,126,220); 
$regen[3] = imagecolorresolve  ($im,  44,170,252); 
$regen[2] = imagecolorresolve  ($im,  84,210,252); 
$regen[1] = imagecolorresolve  ($im, 172,254,252);  

//Pixel durchgehen
$regenmenge = 0;
for($x=$homeX-$homeRadius; $x<=$homeX+$homeRadius; $x++) {
   for($y=$homeY-$homeRadius; $y<=$homeY+$homeRadius; $y++) {
      $found = array_search(imagecolorat($im, $x, $y), $regen);
      if(!($found === FALSE)) {
         $regenmenge+=$found;
      }
   }
}

// Bereich zeichnen
$schwarz = ImageColorAllocate ($im, 0, 0, 0);
$rot = ImageColorAllocate ($im, 255, 0, 0);
imagerectangle($im, $homeX-$homeRadius, $homeY-$homeRadius, $homeX+$homeRadius, $homeY+$homeRadius, $rot);
imagesetpixel($im, $homeX, $homeY, $rot);
imagegif($im, $localImage);

imagedestroy($im);

$mid = CreateImageByName($parentID, "Radarbild", "radar.gif");
IPS_SendMediaEvent($mid);

$vid = CreateVariableByName($parentID, "Regenwert", 1);
SetValue($vid, $regenmenge);

 function CreateVariableByName($id, $name, $type, $profile = "") {
  global $IPS_SELF;
  $vid = @IPS_GetVariableIDByName($name, $id);
  if($vid === false) {
   $vid = IPS_CreateVariable($type);
   IPS_SetParent($vid, $id);
   IPS_SetName($vid, $name);
   IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
   if($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
  }
  return $vid;
 }
 
 function CreateImageByName($id, $name, $filename) {
  global $IPS_SELF;
  $mid = @IPS_GetMediaIDByName($name, $id);
  if($mid === false) {
   $mid = IPS_CreateMedia(1);
   IPS_SetParent($mid, $id);
   IPS_SetName($mid, $name);
   IPS_SetInfo($mid, "this media was created by script #$IPS_SELF");
   IPS_SetMediaFile($mid, $filename, true);
  }
  return $mid;
 }

?>

paresy

kannst du uns einen „test“ wert liefern, dann kann man das system wenigstens „fertig“ installieren. Sonst müssen wir warten bis es regnet… :slight_smile:
pi mal daumen reicht, ich hab grad um die 500 und bei mir regnets nicht!

Ja geil, wollte mein Script grad Posten. Hatte ich vor zwei Tagen auch fertig gemacht (ziemlich genau SO) :smiley:

Pöh, dann mach ich eben am IPS-Webinterface weiter :stuck_out_tongue:

danke für das tolle Script.

noch was entdeckt:

drlp = Rheinland-Pfalz/Saarland

Ob es richtig funktioniert wird sich bei Unwetter zeigen.
Das Radar.gif wird aber etwas unüblich im obersten IP-Symcon Ordner abgelegt.

Du kannst es ja mal testen, indem Du den Homeradius größer machst.
Aber Vorsicht: Die Grösse muss immer im Rahmen des Bildes bleiben, sonst hängt sich der Script auf.

bei welchem Wert lasst ihr euch denn warnen?

Hi,

ich habe bei mir 1200 als Stufe für ein e-mail an meine Firmenadresse definiert.

Jedoch werte ich die verschiedenen Pixelwerte noch detaillierter aus und schreibe diese Ergebnisse, je nach Höhe, mit „Es wird trocken bleiben“ - < 50, „Es wird leicht regnen“ 51-500, Es wird stark regnen" 501-1199, „Unwetterwarnung“ >1200 in eine String Variable.

Die Abfrage mache ich über eine if Abfrage.

Gruss
B71

@Paresy

Klasse Script! Läuft super!

Besten Dank

Martin

sollte man bei verdoppeln des homeradius die entsprechend auszuwertende regenmenge vervierfachen ? damit die proportionen wieder stimmen ? das quadrat wird ja dann viermal so gross

das wäre die logische Konsequenz würde ich sagen.
Ich habe aktuell die 10 als Radius stehen und dann die obigen Werte definiert. Für meine Zwecke, wie z.B. Auch die preventive Steuerung der Markise ist das echt stabil laufend.

Entscheidend kann auch sein, wie schnell der Regen kommt.
Die Info kommt ja nur alle 15 Minuten!!!

Alles unnötig, da Schreibfehler drin war… :slight_smile:

Hallo Leute,

tolles Skript! Vielen Dank dafür!

Ich habe da aber noch mal eine Frage:
Ich habe den Wert „$homeRadius = 5;“ eingestellt.
Welche Punktanzahl würde sich dann maximal ergeben?
Meine Idee: So kann ich die prozentuale Regenwahrscheinlichkeit berechnen…

Joachim

@Joachim,

Du scheinst es nicht verstanden zu haben.
Die Regenwahrscheinlichkeit ist immer 100% - das ist da doch der Sinn des Ganzen.
Es handelt sich hier um ein reales Regenecho.
Ich habe mal des mit dem FS20 Regensensor verglichen: es funktioniert!
(außer wenn die Wolke sich vorher abregnet)

MST

Hallo steiner,

ich denke schon das ich es richtig verstanden habe. Es sind jedoch zwei Unsicherheitsfaktoren zu beachten:

  1. Zeitliche Verschiebung (Radarbild nur alle 15 Minuten)
  2. Räumlich ungenaue Zuordnung

Von daher wäre es m.E. doch sinnvoll, eine Regenwahrscheinlichkeit zu berechnen.

Joachim

Unsicherheitsfaktoren != Regenwahrscheinlichkeit

MST

Wenn jemand Lust hat, könnte er das Skript so umschreiben, dass er die letzten X Bilder auswertet und die Regenwolkenverschiebung in „HOME“-Richtung berücksichtigt, um eine bessere Abschätzung der Regenwahrscheinlichkeit zu erreichen und die Dauer bis zum Regen errechnen zu lassen.

Vielleicht ist ja ein Meteorologe unter uns der passende Algorithmen hat!? :smiley:

paresy

Lust hätte ich schon, alleine … mir fehlt die Fähigkeit so was zu bauen.:mad:

Bei IPS V1 hatte ich mal ein bewegtes Gif-Bild mit den Wolken eines Tages erzeugt. Das war aber immer erst nachträglich.

Ich habe die Koordinaten einfach ein Stück nach Westen verlegt und die Vorhersage und habe damit die besten Erfahrungen gemacht.

Gruß