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:
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
Aanpassingen script
Zelf laat ik het script iedere 5 minuten draaien via een container-script, maar je kunt het natuurlijk ook als cronjob laten draaien.
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.
Code [Selecteer]
<?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>=0 && $input< 2 )){
return 0 ; }
elseif(($input>=2 && $input< 5 )) {
return 1 ; }
elseif(($input>=5 && $input< 10 )) {
return 2 ; }
elseif(($input>=10 && $input<= 100 )) {
return 3 ; }
else{
return 4 ; }
}
//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($maxP, 1);
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, $alertLevel, urlencode($alertText));
//TEXT-DEVICE//
if ($maxP < 0.1) {
$textdevice = $alertText;
Updatedevice($idx748, 0, urlencode($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($idx748, 0, urlencode($textdevice));
}
echo $textdevice;
?>