Notificaties van buienradar op Raspberry Pi
Vandaag gaan we onze Raspberry Pi weer een stukje slimmer maken. Laat je nooit meer verrassen door regen stel notificaties van buienradar op Raspberry Pi in. Met behulp van twee dummy sensoren zie je in één oogopslag hoe groot de kans is dat het gaat regenen en hoeveel neerslag er gaat vallen.
Benodigdheden
Dummy Hardware
Mocht je nog niet eerder Dummy Hardware toegevoegd hebben dan moeten we dat eerst gaan doen. Ga naar Setup -> Hardware en kies bij Type voor Dummy. Je mag zeg een herkenbare naam kiezen:
Zodra de Dummy Hardware toegevoegd is kunnen de virtuele sensoren gaan aanmaken. Klik hiervoor op Create Virtual Sensors (in het donkerblauw).
De eerste sensor die we aanmaken is een percentage-sensor. Als naam heb ik de sensor Regenpercentage gegeven, aangezien deze sensor aan gaat geven hoeveel kans op regen we de komende 30 minuten hebben:
De tweede sensor wordt een een regensensor, deze sensor zal aangeven hoeveel mm regen er gaat vallen:
Script
Nadat de sensoren zijn aangemaakt is het tijd voor het script dat je hier kunt downloaden. Pak het script eerst uit met een extracter als WinRar en op het vervolgens in een editor (bij voorkeur Notepad++). Onderstaande regels moet je naar eigen wens configureren:
1 |
lat=’5?.??’
1 |
</code>: Latitude van je woonplaats in <code> |
lon=’4.??
1 |
'</code>: Longitude van je woonplaats in <code> |
minutesinfuture=30
1 |
</code>: Aantal minuten dat je vooruit wilt kijken <code> |
domoticzurl=”http://192.168.??.??:8080″
1 |
</code>: IP adres en poort van de Domoticz URL <code> |
PDEVIDX=???
1 |
</code>: Het idx van de percentage sensor <code> |
DEVIDX=???
1 |
</code>: Het van de regensensor <code> |
debug=true
1 |
</code>: Debug staat standaard aan. Indien alles goed werkt kun je het uitzetten door true te veranderen in false <code> |
tempfilename = ‘/var/tmp/rain.tmp’
1 |
</code>: Locatie van het tijdelijke bestand. Dit kan iedere beschrijfbare folder zijn. Zorg er wel voor dat het bestand rain.tmp de rechten 666 heeft. |
Nadat je alles naar wens hebt ingesteld sla je het bestand op en kopieer je het naar
/home/pi/domoticz/scripts/
. Uiteraard kan je ook voor een andere folder kiezen, maar daar dien je dan wel rekening mee te houden met het aanmaken van de cron job.
Cron job
Uiteraard willen we het script automatisch laten lopen. Dit doen we door een regel toe te voegen aan de cron tabel. Open de tabel met commando:
1 |
sudo crontab -e |
Voeg onderstaande regels toe en sla de tabel op met CTRL-X:
1 |
*/5 * * * * sudo lua /home/pi/domoticz/scripts/buienradar_rainprediction.lua >> /var/tmp/BRP.log |
Het script wordt nu iedere 5 minuten van ieder uur uitgevoerd. Debug informatie wordt weggeschreven naar het BRP.log bestand.
Notificaties
Uiteraard willen we graag weten wanneer het gaat regen. Dit doen we door het instellen van een notificatie op de smartphone. Ga eerste naar de gewenste sensor (de percentage sensor staat onder Utility, de regensensor onder Weather) en klik op Notifications. De voorwaarden voor een notificatie kun je vervolgens zelfs samenstellen en opslaan door op Add te klikken. In onderstaand voorbeeld heb ik ervoor gekozen dat ik een notificatie wil ontvangen indien er 0,2 mm of meer regen gaat vallen de komende 30 minuten en dat deze notificatie door Google Cloud Messaging gestuurd moet worden:
Leuke toevoeging! Ik krijg het helaas niet aan het werk.
In de BRP.log staat dan dit:
UnauthorizedUnauthorized401 Unauthorized
Wat kan ik hieraan doen? Ik zou het graag werkend willen krijgen ?
Hoi Domenique,
Ik ben er vandaag ook mee bezig geweest en liep tegen het zelfde probleem aan.
Waarschijnlijk heb jij je domoticz ook beveiligd met een gebruikersnaam en wachtwoord..
je zult de volgende regel in het script moeten aanpassen: domoticzurl=”http://192.168.x.x:8080″
Naar: domoticzurl=”http://GEBRUIKERSNAAM:WACHTWOORD@192.168.x.x:8080″
Succes!
@Joost wederom dank voor de mooie handleiding !
@Joost, leuke ideeën, ik ga er zeker een aantal van je overnemen.
Ik heb je buienradar script omgebouwd naar DzVents, de breedte en lengtegraad haal ik nu op uit de Domoticz parameters. Het is één script geworden en met DzVents kan je makkelijker met tijden rekenen en je devices updaten.
Er zit nog wel een onvolkomenheid in, zodra buienradar tijden geeft van de volgende dag, dan ziet het script het als ‘s morgens vroeg, dus in het verleden, ik heb nog geen manier gevonden om heel eenvoudig de datum van morgen te bepalen, zonder een formule te bouwen die rekening houdt met maanden van 30 en 31 dagen en schrikkeljaren. De simpelste oplossing is denk door alleen bij de eerste regel in de toekomst het verschil in tijd te bepalen en daarna en elke keer 5 minuten bij op te tellen. Voor dit moment even geen probleem, alleen rapporteert het script nu altijd even voor middernacht een droge periode.
ik heb hem nu 1 op 1 omgebouwd maar waarschijnlijk ga ik het script wel verder aanpassen, waarom b.v. de “Neerslag komende 30 min” een percentage is, is me niet helemaal duidelijk.
return {
on = {timer = { ‘every 5 minutes’ },
httpResponses = { ‘httpoutbr’ }
},
execute = function(domoticz, item)
debug=false
local regenkans = domoticz.devices(‘Kans op regen’)
local neerslag = domoticz.devices(‘Neerslag (komende 30 min.)’)
if (item.isTimer) then
lengtegraad = domoticz.settings.location.longitude
breedtegraad = domoticz.settings.location.latitude
if debug then
domoticz.log(‘lengtegraad ‘ .. lengtegraad,domoticz.LOG_INFO)
domoticz.log(‘breedtegraad ‘ .. breedtegraad,domoticz.LOG_INFO)
end
domoticz.openURL({
url = ‘https://gadgets.buienradar.nl/data/raintext?lat=’..breedtegraad..’&lon=’..lengtegraad,
callback = ‘httpoutbr’
})
end
if (item.isHTTPResponse) then
— domoticz.log(item.data,domoticz.LOG_INFO)
local minutesinfuture=30
local totalrain=0
local rainlines=0
local lines = {}
for s in item.data:gmatch(“[^\r\n]+”) do — use “[^\r\n]+” (‘+’ is for skipping over empty lines)
table.insert(lines, s)
end
local Time = require(‘Time’)
local now = Time() — current time
if debug then print (now.raw) end
for i,line in ipairs(lines) do
rain=tonumber(string.sub(tostring(line), 0, 3))
brtime=now.rawDate..’ ‘..string.sub(tostring(line), 5, 9)..’:00′
local brt=Time(brtime)
local test=now.compare(brt).compare — 0 = both are equal, 1 = time is in the future, -1 = time is in the past.
— sometimes the first line is just in the past
— arround midnight the times are always in the past, because the script uses now.rawDate togheter with HH:MM from the Buienradar output.
if (test == 1 and brt.compare(now).minutes <= minutesinfuture) then
totalrain=totalrain+rain
rainlines=rainlines+1
end
if debug then print('Rain:'..rain..' brtime:'..brtime..' '..brt.compare(now).minutes..' '..test..' '..totalrain..' '..rainlines) end
end
— Returned value is average rain fall for next time
— 0 is no rain, 255 is very heavy rain
— When needed, mm/h is calculated by 10^((value -109)/32) (example: 77 = 0.1 mm/hour)
if rainlines == 0 then
averagerain=0
else
averagerain=math.ceil(totalrain/rainlines)
end
— Calculate the mm/h
local calcmmh = domoticz.utils.round(10^((averagerain -109)/32),2)
if debug then print(now.raw.." averagerain:"..averagerain.." calcmmh:"..calcmmh) end
neerslag.updatePercentage(calcmmh)
— Update percentage regenkans Domotics Device —————
local result = domoticz.utils.round(averagerain*0.392156862745098,2)
regenkans.updatePercentage(result)
end
end
}