Voor veel toepassingen in je smarthome is het handig om te weten of het gaat regenen. Gaat het regenen en is je zonnescherm nog uitgeklapt? Staat je zolderraam nog open? Of moet je de tuinkussens binnenhalen? Met deze informatie in Domoticz kun je een notificatie (berichtje) naar je telefoon sturen om je te waarschuwen!

Het GaatHetRegenen script is gebaseerd op het IsItGonnaRain script uit de wiki van Domoticz. Het is een al wat ouder script, dus ik heb ‘m up to date gemaakt met de nieuwe buienradar URL.

Als eindresultaat kun je een switch dummy in je overzicht krijgen die aan staat als het gaat regenen binnen 10 minuten. Je kunt er ook voor kiezen om een uservariable aan te maken die je in diverse scripts kunt uitlezen. Het is net wat je makkelijker vind.

Gaat het regenen?

Advertenties

Hieronder staat het script. Kopieer en plak deze in een nieuwe ‘Gebeurtenis’ van het type lua en time.

---------------------------------------------------------------------------
-- IsItGonnaRain( int minutesinfuture)
-- returns: int avarage rainfall for the next minutesinfuture
--
-- Function to get rain prediction from Buienradar.nl (dutch)
-- 
-- http://gratisweerdata.buienradar.nl/#Buienradar You may use their free service for non-commercial purposes.
-- 
-- Written in LUA by Hans van der Heijden (h4nsie @ gmail.com)
-- Spring 2015
-- 28-03-2015 v0.3 bug: quotes around url added.
-- 27-03-2015 v0.2 return value is now average for next time
-- 26-03-2015 v0.1 Initial release
-- todo: some error checking on http and file handling (tmp file)
---------------------------------------------------------------------------



function IsItGonnaRain( minutesinfuture )

   -- config --------------------------------------
   lat='52.08'   -- example lat/lon for Utrecht
   lon='4.74' -- use MAX 2 decimals behind comma. (Requirement Buienrader)
   debug=false
   tempfilename = 'volume1/Troep/rain.tmp' -- can be anywhere writeable
   -- config --------------------------------------
         
  -- url='http://gps.buienradar.nl/getrr.php?lat='..lat..'&lon='..lon
   url='https://gpsgadget.buienradar.nl/data/raintext?lat='..lat.. '&lon=' ..lon
   -- url = 'https://br-gpsgadget-new.azurewebsites.net/data/raintext?lat=' ..lat.. '&lon=' ..lon
   if debug then print(url) end
   read = os.execute('curl -s -o '..tempfilename..' "'..url..'"')
   file = io.open(tempfilename, "r")
   totalrain=0
   rainlines=0
   -- now analyse the received lines, format is like 000|15:30 per line.
   while true do
      line = file:read("*line")
      if not line then break end
      if debug then print('Line:'..line) end
      linetime=string.sub(tostring(line), 5, 9)
      if debug then print('Linetime: '..linetime) end
         
         -- Linetime2 holds the full date calculated from the time on a line
         linetime2 = os.time{year=os.date('%Y'), month=os.date('%m'), day=os.date('%d'), hour=string.sub(linetime,1,2), min=string.sub(linetime,4,5), sec=os.date('%S')}
         difference = os.difftime (linetime2,os.time())
   
      -- When a line entry has a time in the future AND is in the given range, then totalize the rainfall
      if ((difference > 0) and (difference<=minutesinfuture*60)) then
         if debug then print('Line in time range found') end
         rain=tonumber(string.sub(tostring(line), 0, 3))
         totalrain = totalrain+rain
         rainlines=rainlines+1
         if debug then print('Rain in timerange: '..rain) end
         if debug then print('Total rain now: '..totalrain) end
      end
   
   end
   file:close()
   
   -- 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)
   averagerain=totalrain/rainlines
   
return(averagerain)
end

--– REGEN ----
commandArray = {}
minuten=10
regen = IsItGonnaRain(minuten)
mmh = 10^((regen -109)/32)
print("****************   Gaat het regenen?      **********************")
print('Regen verwacht: '..regen..' binnen '..minuten..' minuten. (' ..mmh.. 'mm/h)')

if regen > 70 then

  commandArray['Variable:GaatHetRegenen'] = tostring(1)
 
elseif regen == "nan" then
    print("Kon Variable niet updaten. weergegevens niet beschikbaar.")
   
else
  commandArray['Variable:GaatHetRegenen'] = tostring(0)
end

print("****************   end regenen      **********************")




return commandArray

Pas de waarden lat en lon aan aan je eigen locatie. Je kunt ze vinden onder Instellingen -> Instellingen onder het kopje Locatie. Vul de coördinaten in met maximaal twee cijfers achter de punt.

Pas ook de locatie aan waar het tijdelijke bestand opgeslagen kan worden. Bij mij op de eerste HDD van de NAS in de map troep: volume1/Troep

Advertenties

Locatie in domoticz instellen

Maak een uservariable (Gebruikersvariabele) aan onder Instellingen -> Gebruikersvariabele. Noem de variabele GaatHetRegenen.

GaatHetRegenen variabele

Als je wilt kun je ook een switch dummy aanmaken met de naam GaatHetRegenen onder Instellingen -> Hardware. Je moet in het script dan

commandArray['Variable:GaatHetRegenen'] = tostring(1)

vervangen voor:

commandArray['GaatHetRegenen'] = "On"

en

commandArray['Variable:GaatHetRegenen'] = tostring(0)

voor

commandArray['GaatHetRegenen'] = "Off"

Notification

Als je gebruik maakt van de GaatHetRegenen dummy switch, kun je heel simpel notificaties laten sturen als het gaat regenen. Klik hiervoor op de notificaties knop onder de switch. Stel hier het bericht in en laat in iedergeval GCM (Google Cloud Messaging) aangevinkt staan als de de notificaties wilt ontvangen via de Domoticz App.

De vraag is of je dat wel wilt. Stel je voor op een druilerige herfstdag: de hele dag door krijg je berichtjes dat het gaat regenen. Niet zo boeiend. Wat wel handig is, als Domoticz die berichtjes stuurt als de buitendeur of zolderraam openstaat of het zonnescherm nog uitgeklapt is terwijl het binnen 10 minuten gaat regenen! Met behulp van een Deur- of Raamcontact van KlikAanKlikUit kun je de status van je raam of deur doorgeven aan domoticz. Hoe je dit allemaal voor elkaar krijgt lees je in een volgend artikel.

Advertenties

Doe mee met de conversatie

13 reacties

  1. Hi!

    Het script is niet helemaal in orde hoor. De opmaak is volledig door de war, waardoor er commando’s achter elkaar staan in plaats van onder elkaar en de if statements volledig mis lopen. Dacht dat ik dat had hersteld, maar nu blijft Domoticz de volgende melding geven:

    Error: EventSystem: in Regen: [string “———————————————…”]:76: attempt to perform arithmetic on global ‘regen’ (a nil value)

    Er gaat dus ergens nog iets niet goed, maar ik kan niet vinden waar.

    Groeten,

    Martijn

    1. Hoi Martijn,

      Leuk je weer terug te zien! Ik heb de post aangepast en de code tussen code tags geplaatst zodat WordPress snapt dat ie die tekst niet anders moet formatteren. Ik hoop dat het zo goed gaat!

      Groet Wouter

  2. Ik zie alleen nog wel iets anders. Moet de UserVariable echt een Integr zijn? In de code maar je er namelijk juist een string van:

    CommandArray[‘Variable:GaatHetRegenen’] = tostring(1)

    Ben benieuwd.

    1. Ja ik zie wat je bedoeld. Het is wel vreemd dat het dan toch werkt 🙂
      Je kunt het wel aanpassen, maakt niet zoveel uit denk ik.

  3. Bedankt voor het script, werkt goed.
    Het “triggert” nu iedere minuut, kan het ook aanpast worden naar om de 5 minuten?

    1. Hoi John,

      Leuk dat je reageert. Domoticz kent helaas niet zo’n instelling. Ieder script van het type time wordt standaard iedere minuut uitgevoerd.

      Je kunt op regel 17 een extra if then else invoegen die checkt wanneer je variabele of dummy is gewijzigd. Als die langer dan 5 minuten niet gewijzigd is, voer ie het script uit, anders niet. Moet je natuurlijk wel een klein beetje met lua overweg kunnen.

      Succes!

      Wouter

  4. Bedankt voor je reactie Wouter, dat wordt gewaardeerd. Nu begrijp ik ook waarom ik in het script geen tijd kon vinden wanneer het actief werd.
    LUA scripting is helaas wast lastig voor ons, dus als je een keer 5 minuutjes over hebt dan houden we ons aanbevolen!

  5. Hoi,
    bedankt hiervoor. Precies wat ik zoek. Ik heb echter het script 1 op 1 overgenomen en krijg de volgende error in de in log:
    Error: EventSystem: in GaatHetRegenen: [string “———————————————…”]:38: attempt to index global ‘file’ (a nil value)

    Doe ik iets verkeerd?

    gr
    Johan

    1. Beste Johan,

      In het script staat een ‘tempfilename’ parameter. Deze verwijst naar een locatie op je NAS of Raspberry Pi. Weet je zeker dat die bestaat? Vervang dat door een locatie die wel bestaat en het werkt waarschijnlijk direct!

      Succes!

      Wouter

  6. Beste Wouter,

    Allereerst bedankt voor je uitleg. Helaas krijg ik Error: EventSystem: in GaatHetRegenen: [string “———————————————…”]:1: unexpected symbol near char(226)

    Wat doe ik fout?

    BVD

    1. Beste Jeroen,

      Je doet niets verkeerd.. Je hebt hetzelfde probleem als een aantal reacties hierboven. De website software heeft de formatting van de code aangepast waardoor tekens anders gekopieerd en geplakt worden dan bedoeld. Ik heb de code nu opnieuw en anders laten weergeven. Wil het nu wel lukken?

      Wouter

Laat een reactie achter

Laat weten wat je van dit artikel vindt!

Deze website gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie-gegevens worden verwerkt.

%d bloggers liken dit: