Buienalarm / Buienradar in Domoticz

Gestart door Joost, 26 september 2021, 08:58:45

Vorige topic - Volgende topic

Joost

In dit artikel wordt uitgelegd hoe je gegevens van buienradar in Domoticz kunt krijgen. De alert-sensor (links) geeft de zwaarste neerslag in de komende 2 uren aan. Hierbij wordt onderscheid gemaakt tussen:

Levels:

  • Groen: geen neerslag (0 mm)
  • Groen: lichte neerslag (0.1 – 1 mm)
  • Geel: matige neerslag (1 – 3 mm)
  • Oranje: zware neerslag (3 – 10 mm)
  • Rood: zware buien (> 10 mm)

De intensiteit van de neerslag in mm/h

Het tijdstip van de zwaarste neerslag

De text-sensor (rechts) geeft aan op welke tijden het regent (ongeacht de intensiteit).


Aan te maken virtual devices
  • 1x Alert sensor (naam mag je zelf verzinnen)
  • 1x Text sensor (naam mag je zelf verzinnen)

Aanpassingen script
  • Regel 163: IDX-nummer van je Alert-sensor
  • Regel 168 en 170: IDX-nummer van je Text-sensor

Zelf laat ik het script iedere 5 minuten draaien via een container-script, maar je kunt het natuurlijk ook als cronjob laten draaien.

<?php
include("/home/pi/domoticz/scriptsjoost/php/functions.php");
include(
"/home/pi/domoticz/scriptsjoost/php/settings.php");
 
$time date("H:i");
//set the mm of rain you consider it's raining 
$rainthreshold_minutes "0.1" 
$rainthreshold_hours "0.5" 
// according to buienradar there are 5 levels of rain per hour (mm/h)
// 0-2 
// 2-5
// 5-10
// 10-100
// 100+ 
// these are used in the "severity level" 
 
// $lat = "51.43" ; 
// $lon = "6.04" ; 
 
$json file_get_contents("https://gpsgadget.buienradar.nl/data/raintext?lat=".$lat."&lon=".$lon) ;
$json urlencode($json) ; 
$data explode("%0D%0A",$json) ; 
 
$thishour=$nexthour=$ever 0;
$rainbyminutes =  $bool_rainbyminutes '' 
$first_rain "ik heb geen idee" 
$rain_stops "ik heb geen idee" 
$bool_rainnow $bool_rainthis_hour $bool_rainnext_hour =  'false' 
$rain = array(); 
$maxP 0;
$maxDT '';
for(
$i=0;$i<(count($data)-1);$i++){
$tmp urldecode($data[$i]) ;
    
$tmp2 explode("|",$tmp) ;
$neerslg neerslag($tmp2[0]); 
$bool_neerslg "false" 
 
//check max rain///
if ($neerslg $maxP) {
$maxP $neerslg;
$maxDT $i*5;
}
 
// check if it will rain now
if($i==0){
if($neerslg>=$rainthreshold_minutes){
$bool_rainnow 'true' ;
$bool_neerslg 'true' 
$first_rain 'het regent nu.' ; }
}
else{
if($neerslg>=$rainthreshold_minutes){
$bool_neerslg 'true' ;  
if($first_rain == "ik heb geen idee"){
$first_rain $i*5
}
}
}
$rain[] = $neerslg 
 
if($i<12){ //add the items 0 to 11 together to calculate the total rain for this hour
$thishour+= ($neerslg*10)/10 
$ever += ($neerslg*10)/10 ;} 
else{  //same for the rest to calculate next hour
$nexthour+= ($neerslg*10)/10 
$ever += ($neerslg*10)/10 ; }

$rainbyminutes .= '"'.($i*5).'" : "'.$neerslg.'",' ;
$bool_rainbyminutes .= '"'.($i*5).'" : '.$bool_neerslg.',' ;
 
}
 
$rainbyminutes rtrim($rainbyminutes",") ; 
$bool_rainbyminutes rtrim($bool_rainbyminutes",") ; 
 
if(
$thishour>=$rainthreshold_hours){
$bool_rainthis_hour 'true' 
}
if(
$nexthour>=$rainthreshold_hours){
$bool_rainnext_hour 'true' 
}
//find when it will be dry, first find first occurence of rain
$regen_time '' 
if(
$ever>0){
for($i=0;$i<count($rain);$i++){
$regen $rain[$i]; 
// if found stop
if($regen>0.0){
$regen_time $i ;
break;  }
}
//now find the first occurence after the above one
for($i=$regen_time;$i<count($rain);$i++){
$regen_stop $rain[$i]; 
if($regen_stop==0.0){
$rain_stops $i*5;
break; }
else{
$rain_stops "het duurt minimaal ".($i*5)." minuten, maar dit kan veranderen." ;}
}
}
 
echo 
'"rainnow" : '.$bool_rainnow.','.PHP_EOL
echo 
'"rainthis_hour" : '.$bool_rainthis_hour.','.PHP_EOL
echo 
'"rainnext_hour" : '.$bool_rainnext_hour.','.PHP_EOL
echo 
'"this_hour" : "'.$thishour.'", '.PHP_EOL
echo 
'"next_hour" : "'.$nexthour.'", '.PHP_EOL
echo 
'"severitylevel" : { '.PHP_EOL
echo 
'"this_hour" : "'.calc_rainlevel($thishour).'", '.PHP_EOL
echo 
'"next_hour" : "'.calc_rainlevel($nexthour).'" '.PHP_EOL
echo 
'"whenstart" : "'.$first_rain.'", '.PHP_EOL
echo 
'"whenstop" : "'.$rain_stops.'" '.PHP_EOL
 
function 
neerslag($input){
$tmp = (($input-109)/32)  ; 
$tmp pow(10$tmp)  ; 
$tmp round($tmp,1) ;
 
if($tmp == "0" ){
   return "0.0" ; }
else{
return $tmp
}
}
 
function 
calc_rainlevel($input){
if(($input>=&& $input)){
return ; }
elseif(($input>=&& $input)) {
return ; }
elseif(($input>=&& $input10 )) {
return ; }
elseif(($input>=10 && $input<= 100 )) {
return ; }
else{
return ; }
}
 
//ALERT//
//zware buien > 10
//zware neerslag 3-10 mm
//matige neerslag 1-3 mm
//lichte neerslag 0.1-1 mm
//geen neerslag 0 mm

$maxP round($maxP1);
if (
$maxP 0.1) {
$alertLevel 1;
$alertText 'Geen neerslag komende 2 uur'; }
elseif (
$maxP <= 1) {
$alertLevel 1;
$alertText 'Lichte neerslag ('.$maxP.' mm/h @ '.date('h:i'strtotime($time) + ($maxDT 60)).')';}
elseif (
$maxP <= 3) {
$alertLevel 2;
$alertText 'Matige neerslag ('.$maxP.' mm/h @ '.date('h:i'strtotime($time) + ($maxDT 60)).')';}
elseif (
$maxP <= 10) {
$alertLevel 3;
$alertText 'Zware neerslag ('.$maxP.' mm/h @ '.date('h:i'strtotime($time) + ($maxDT 60)).')';}
elseif (
$maxP 10) {
$alertLevel 4;
$alertText 'Zware buien ('.$maxP.' mm/h @ '.date('h:i'strtotime($time) + ($maxDT 60)).')';
}
UpdateDevice($idx747$alertLevelurlencode($alertText));
 
//TEXT-DEVICE//
if ($maxP 0.1) {
$textdevice $alertText;
Updatedevice($idx7480urlencode($textdevice));}
else { 
$textdevice 'Neerslag begint rond '.date('h:i'strtotime($time) + ($first_rain 60)).' en duurt ongeveer tot '.date('h:i'strtotime($time) + ($rain_stops 60));
Updatedevice($idx7480urlencode($textdevice));
}
echo 
$textdevice;
 
?>