Categorieën
Domotica Domoticz Scripts

Gaat Het Regenen status in domoticz

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 en omgezet naar de dzvents codetaal.

Beknopt stappenplan regenvoorspelling van buienrader in domoticz

Benodigde tijd: 20 minuten.

In deze blogpost zorgen we ervoor dat je kunt zien of het gaat regenen vanuit domoticz. Hiervoor gebruiken we de Buienradar API. We downloaden de voorspelling en vullen virtuele sensoren met de opgehaalde data. In het kort doorlopen we de volgende stappen. Lees hieronder verder voor de volledige instructies.

  1. Bepaal je locatie

    Bepaal de coördinaten van de locatie waarvan je de voorspelling wilt ophalen

  2. Maak dummy sensoren

    Maak de benodigde dummy devices aan. We maken een virtuele regensensor en een schakelaar.

  3. Maak het script aan

    Plak het script in een nieuwe domoticz gebeurtenis en pas het aan.

Bepaal de locatie voor voorspellingen.

In de domoticz instellingen kun je de coördinaten vinden van je locatie. Ga naar instellingen en scroll naar het kopje locatie. Vul je adres in en klik op GetLatLong. De lat/long verschijnen nu van je locatie. Neem de coördinaten over met twee cijfers achter de komma.

Locatie in domoticz instellen

Dummy regensensor

Nu gaan we de dummy devices aanmaken. Eén met de naam GaatHetRegenen en één met de naam Regen. Onder Instellingen -> Hardware kun je, als je die nog niet hebt, een dummy hardware aanmaken. Vanuit de dummy hardware kun je dummy switches en andere virtuele apparaten aanmaken door op Maak virtuele sensoren te klikken. Maak er een van het type schakelaar en regen.

Maak virtuele sensoren.

Gaat het regenen script

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

Kies in dit menu voor het dzvents type.

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

return {
	on = {
		timer = {
		'every 5 minutes'
		},
	},
	execute = function(domoticz)
    
    -- config ---------------------------------------------------------
    lat='xx.xx'   -- example lat/lon for Utrecht
    lon='x.xx' -- use MAX 2 decimals behind comma. (Requirement Buienrader)
    tempfilename = 'volume1/Troep/rain.tmp' -- can be anywhere writeable
    url='https://gpsgadget.buienradar.nl/data/raintext?lat='..lat.. '&lon=' ..lon
    -- config ---------------------------------------------------------
    
    read = os.execute('curl -s -o '..tempfilename..' "'..url..'"')
    file = io.open(tempfilename, "r")
    totalrain=0
    rainlines=0
    
    while true do 
      line = file:read("*line")
      if not line then break end
      linetime=string.sub(tostring(line), 5, 9)
       -- 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<=10*60)) then -- 10 minuten
         rain=tonumber(string.sub(tostring(line), 0, 3))
         totalrain = totalrain+rain
         rainlines=rainlines+1
      end
    end
    file:close()
    averagerain=totalrain/rainlines
    
    local mmh = 10^((averagerain -109)/32)
    
    domoticz.log('****************  Buienradar   ***************', domoticz.LOG_INFO)
    domoticz.log('Regen verwacht: '..averagerain..' binnen 10 minuten. (' ..mmh.. 'mm/h)', domoticz.LOG_INFO)
    if averagerain > 70 and averagerain < 150 then
        
        domoticz.log('Het gaat regenen', domoticz.LOG_INFO)
        domoticz.devices('GaatHetRegenen').switchOn().checkFirst()
        domoticz.devices('Buienradar').updateRain(mmh,mmh)
    elseif averagerain > 150 then
        
        domoticz.log('Het gaat hard regenen', domoticz.LOG_INFO)
        domoticz.devices('GaatHetRegenen').switchOn().checkFirst()
        domoticz.devices('Buienradar').updateRain(mmh,mmh)
    
    elseif averagerain == "nan" then
    
        domoticz.log('Weergevens niet beschkbaar', domoticz.LOG_INFO)
        domoticz.devices('GaatHetRegenen').switchOff().checkFirst()
    else
      
        domoticz.log('Het gaat niet regen', domoticz.LOG_INFO)
        domoticz.devices('GaatHetRegenen').switchOff().checkFirst()
        domoticz.devices('Buienradar').updateRain(0,0)
  
    end
    
print("****************   end Buienradar      **********************")
	end
}

De regensensor wordt zichtbaar onder de tab weer in domoticz. Wanner je op de grafiekenknop klikt komen na het voor langere tijd bijhouden van gegevens de grafieken naar boven.

Notificatie

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 ieder geval GCM (Google Cloud Messaging) aangevinkt staan als je 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.

Wat vond je van dit artikel?

Geef hieronder je stem via de sterren. Laat weten wat je vindt van het artikel en stel je vragen in de reacties!

Wat vond je van deze blogpost?

Klik op een ster om een beoordeling te geven!

Gemiddelde score 0 / 5. Aantal stemmen: 0

Er heeft nog niemand gestemd. Wees de eerste, het kost niets en geen registratie!

Jammer dat de post niet behulpzaam was.

Laten we deze post verbeteren!

Wat zou er beter kunnen?

28 reacties op “Gaat Het Regenen status in domoticz”

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

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

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.

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.

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

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!

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

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

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

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

Hoi Wouter, allereerst hartelijk bedankt voor je script! Weet jij hoe het kan dat op de kaart op Buienradar.nl de komende uren geen regen voorspeld is, terwijl de waardes die het script van Buienradar.nl haalt tussen de 77 en 112 zitten voor de komende twee uren? De long en lat waardes zijn juist ingevuld, dat heb ik al gedriedubbelcheckt… Lijkt er op dat de Buienradar site een beetje van slag is.

Hoi Erwin,

Bedankt en graag gedaan! Misschien is het wel oude data die het script opnieuw gebruikt. Wat als je de url in je browser uitvoert? Krijg je dan dezelfde data? En anders, 77 is minimale neerslag, misschien mist of damp? Zie onderstaand van de Buienradar API:

 De waarde 0 geeft geen neerslag aan (droog), de waarde 255 geeft zware neerslag aan. Gebruik de volgende formule voor het omrekenen naar de neerslagintensiteit in de eenheid millimeter per uur (mm/u):

Neerslagintensiteit = 10^((waarde-109)/32)

Ter controle: een waarde van 77 is gelijk aan een neerslagintensiteit van 0,1 mm/u. 

Groet Wouter

Hallo Wouter
Inmiddels een aantal jaren verder, kwam ik jouw artikel tegen in mijn zoektocht naar een regen voorspeller.
Ik heb de installatie uitgevoerd en de aanpassing gemaakt voor de tmp files en de dummy switch.
Het programma geeft ook tekst als in: print(‘Regen verwacht: ‘..regen..’ binnen ‘..minuten..’ minuten. (‘ ..mmh.. ‘mm/h)’)
Mijn vraag is hoe krijg ik die zichtbaar in mijn dashboard?
Gr. Piet

Hoi Piet,

Het artikel heb ik op een aantal plaatsen aangepast. Het moet nu duidelijk zijn.

Je moet dus de virtuele switch maken en die als favoriet instellen. Dan komt ie op het dashboard te staan.

Als je de mmh waarde in je dashboard terug wilt zien maak je een Rain dummy sensor aan. Het script moet je dan ook wat aanpassen. Dat zal ik morgen even toevoegen aan het artikel.

Groet Wouter

Hallo Wouter,
Bedankt voor je reactie en aanpassing script.
Wanneer ik het script aanpas voor gebruik van een dummy switch met notificatie (in mijn geval Pushover) dan krijg ik wanner de switch op aan staat om de minuut een berichtje van Pushover op mijn telefoon. Is dit softwarematig in te stellen zodat er maar een bericht uitgaat?
Gr. Piet

Hoi Piet,

Het artikel heb ik nu opnieuw aangepast naar de versie die ik momenteel ook in gebruik heb. Dit script heeft een aantal voordelen. Zo wordt het maar iedere 10 minuten uitgevoerd (er komt vanuit buienradar ook maar om de 10 minuten een update), het is gemaakt in de dzvents taal en het heeft ondersteuning voor een regen sensor zodat je de mmh mooi in grafiekjes kunt zien of er andere dingen mee kunt doen.

Bijkomend voordeel van de dzvents taal is de checkFirst functie. Die gaat eerst na of de switch al aan of uit staat voordat ie ‘m eventueel schakelt. Dit zorgt er dus voor dat niet iedere keer dat het script uitgevoerd wordt de switch geüpdatet wordt (naar dezelfde waarde). Hij veranderd dus alleen als de status ook anders is.

Check in je instellingen ook even wat je meldingen interval is. Hiermee kun je bepalen hoe vaak je meldingen ontvangt.

Groet Wouter

Hallo Wouter,
Dank voor je reactie. Ik heb het script als gebeurtenis geinstalleerd of moest het als lua bestand onder scripts en dan aanroepen om de 10 minuten met een cron job?
En het programma komt met een command array fout: Error: EventSystem: Lua script GaatHetRegenen did not return a commandArray
Kan het zijn dat het deel wat de sensor en de schakelaar aan moet sturen mist?
Gr. Piet

Hallo Wouter,
Alles draait voor zover ik kan zien in de logfiles en de 5 minuten update van de regensensor. Nu nog wachten op daadwerkelijk regenen zodat ik ook kan zien dat er teksten verschijnen met aantal mm enz en dat de switch het doet.
Vooralsnog bedankt voor je reacties en aanpassingen van het script.
Gr. Piet

Hallo Wouter,
Ik toch je hulp nog even nodig. Ik heb nu een aantal dagen gewacht, ondertussen heeft het al een aantal malen geregend hier maar ik zie in de logfiles geen meldingen van regen en ook de regenswitch doet niets. Ik zie alleen in de logfiles dat er om de vijf minuten een melding staat dat het niet gaat regenen en dat nan mm regen vallen.
Gr. Piet

Hoi Piet,

Als je nan (not available now) hebt kun je eens kijken of de url in je browser wel werkt. Check ook of je schrijfrechten hebt naar de locatie waar je het temp bestand naar toe schrijft. Staan er files in die map?

Groet Wouter

Hallo Wouter,
De url werkt, ik krijg in de brower twee kolommen met hoeveelheid regen en tijd. Toevallig nu geen regen 🙁
En idd. het temp file had root rechten. ik heb nu een temp map aangemaakt met pi rechten.
2020-10-18 18:20:00.794 Status: dzVents: Info: —— Start internal script: HetGaatRegenen:, trigger: “every 5 minutes”
2020-10-18 18:20:01.010 Status: dzVents: Info: **************** Buienradar ***************
2020-10-18 18:20:01.010 Status: dzVents: Info: Regen verwacht: nan binnen 10 minuten. (nanmm/h)
2020-10-18 18:20:01.010 Status: dzVents: Info: Het gaat niet regen
2020-10-18 18:20:01.031 Status: dzVents: **************** end Buienradar **********************
2020-10-18 18:20:01.031 Status: dzVents: Info: —— Finished HetGaatRegenen
2020-10-18 18:20:01.032 Status: EventSystem: Script event triggered: /home/pi/domoticz/dzVents/runtime/dzVents.lua
2020-10-18 18:25:00.632 Status: dzVents: Info: —— Start internal script: HetGaatRegenen:, trigger: “every 5 minutes”
2020-10-18 18:25:00.858 Status: dzVents: Info: **************** Buienradar ***************
2020-10-18 18:25:00.858 Status: dzVents: Info: Regen verwacht: nan binnen 10 minuten. (nanmm/h)
2020-10-18 18:25:00.858 Status: dzVents: Info: Het gaat niet regen
2020-10-18 18:25:00.882 Status: dzVents: **************** end Buienradar **********************

Hallo Wouter, zou je misschien nog een reactie kunnen geven op mijn laatste reactie?
Gr. Piet

Hoi Piet,

Ik weet niet precies wat er misgaat. Kun je eens proberen om het gedeelte wat het bestand download eruit te halen door middel van de regels een comment te laten zijn. Dus – – voor de regel toevoegen.

Het bestandje wat er nu staat kun je even vullen met wat fictieve data om te testen en kijken wat er gebeurd. Je kunt ook nog wat extra log meldingen toevoegen om te checken wat er gebeurd.

Succes

Groet Wouter

Laat weten wat je van dit artikel vindt!

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