<?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;
?>
Hoi Joost, leuk script en idee!
Ik loop alleen wel tegen het volgende aan bij inzetten van het script:
1. Ontbrekende includes
/home/pi/domoticz/scriptsjoost/php/settings.php + functions.php heb ik natuurlijk niet op m’n Pi staan. Heb je de code van deze generieke bouwstenen ergens? Dan werkt de update van Domoticz devices ook
2. Locatiegegevens van je eigen locatie moet je nog toevoegen voor ophalen juiste data;
Zie dat je je eigen locatie hebt commented: // $lat = “51.43” ;
Eigen locatie kan dus via bijv. google maps.
3. De idx-en voor updates kan dan beter ook bovenin als variabele worden gezet;
bijv:
$idx_alert = 123 ;
$idx_text = 124 ;
en dan later in het script op regels 163/168/170 die je aangaf naar deze variabelen verwijzen
Hoi Martin, voorbeeld van settings.php en functions.php vind je hier: https://domoticaboard.nl/index.php?PHPSESSID=3bb9e04c984748ce92b6b97c142463dc&board=4.0