Buienalarm in Domoticz
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).
Benodigdheden
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 |
<?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