Maak van Domoticz een weerstation – Deel 1
Helaas is de data-service van Weather Undergound niet meer gratis beschikbaar. Nieuwe gebruikers kunnen nu al geen API-key meer registreren om gratis weer-data naar Domoticz te halen. De afgelopen week hebben wij hard gewerkt aan een nieuw script dat gebruik maakt van data van Buienradar en Darksky. In dit artikel leggen we stap voor stap uit hoe je jouw Raspberry met Domoticz kunt omtoveren naar een weerstation. Iedere 5 minuten krijg je automatisch de actuele waarden uit jouw woonplaats van:
- Buitentemperatuur
- Gevoelstemperatuur
- Grondtemperatuur
- Zicht
- Luchtvochtigheid
- Luchtdruk
- Zonkracht
- Windsnelheid, -stoten, -richting, -temperatuur
- Dauwpunt
- Bewolkingsgraad
- UV-index
- Ozon
- Weersverwachting voor morgen
- Weersverwachting komende 1 tot 5 dagen
- Weersverwachting komende 6 tot 10 dagen
- Zeer uitgebreide korte termijn verwachting
- Weer-waarschuwing
- Regen-waarschuwing
- Lux-waarde
Benodigdheden
Virtuele sensoren aanmaken
De volgende stap is om een virtuele sensor aan te maken. 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).
Maak nu de virtuele sensor aan van het type “Temperature” en geef “Gevoelstemperatuur” als naam van de sensor in:
Maak op dezelfde wijze onderstaande virtuele sensoren aan (kies zelf een herkenbare naam):
Barometer sensor — Luchtdruk
Wind+Temp+Chill sensor — Wind, temperatuur en gevoelstemperatuur
Wind sensor — Alleen wind
Visibility sensor — Zicht
Solar Radiaton sensor — solar
Lux sensor — Lux-waarde gebaseerd op SolarPower.time
Rain sensor — Regengegevens
Temp+Hum sensor — Temperatur en luchtvochtigheid
Text sensor — Weersverwachting (lang)
Text sensor — Weersverwachting (kort)
Custom sensor — Regen in mm/h, komend uur
Custom sensor — Regen in mm/h, komende 2 uren
Text sensor — Regenalarm als text sensor
Alert sensor — Regenalarm als alert sensor
Switch sensor — Regelalarm als switch (handig voor bv. zonnescherm)
Text sensor — Weersverwachting (dag 1 t/m 5)
Text sensor — Weersverwachting (dag 6 t/m 10)
Scripts
De laatste stap is het script. Download hier de vier benodigde scripts. Pak de scripts uit met een extractor als WinRar. Je ziet nu vier dzVents-scripts. Alleen het bestand wusSettings.lua moet je nog even aanpassen naar jouw situatie.
Op regel 14 t/m 31 vul je de idx-nummers van de virtuele sensoren/switches in die je zojuist hebt aangemaakt. Mocht je een bepaalde sensor niet willen gebruiken, dan zet je --
voor de regel. Regel 35 /tm 51 kun je naar eigen wens aanpassen, de overige regel moet je niet wijzigen. Tot slot moet je de vier scripts nog uploaden naar je raspberry:
wusSettings.lua -> /home/pi/domoticz/scripts/dzVents/scripts/modules/
wusFunctions.lua -> /home/pi/domoticz/scripts/dzVents/scripts/modules/
wusErrors.lua -> /home/pi/domoticz/scripts/dzVents/scripts/modules/
updateWeatherSensors.lua -> /home/pi/domoticz/scripts/dzVents/scripts/
Iedere x minuten zullen de aangemaakte sensoren/switches geüpdatet worden.
Maak van Domoticz een weerstation – Deel 2
In Maak van Domoticz een weerstation – Deel 1 hebben we al 18 sensoren/switches werkend gekregen om van Domoticz een weerstation te maken. Helaas ontbreken we nog enkele gegevens om een weerbericht voor de volgende dag te kunnen maken. In dit artikel leggen we uit hoe we de ontbrekende gegevens kunnen toevoegen. Het gaat om:
- Grondtemperatuur
- Verwachting morgen
- Verwachting uitgebreid
- Temperatuur dauwpunt
- Bewolkingsgraad
- UV-waarde
- Ozon-waarde
Benodigdheden
Virtuele sensoren aanmaken
De volgende stap is om een virtuele sensor aan te maken. 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).
Maak nu de virtuele sensor aan van het type “Temperature” en geef “Temperatuur Grond” als naam van de sensor in:
Maak op dezelfde wijze onderstaande virtuele sensoren aan (hou dezelfde namen aan, anders moet je ze ook wijzigen in het script op regel 25 t/m 31):
Verwachting morgen — Text sensor
Verwachting uitgebreid — Text sensor
Temperatuur Dauwpunt — Temperature sensor
Bewolkingsgraad — Percentage sensor
UV — UV sensor
Ozone — Custom sensor met axis “DU”
DarkSky API-key
Tot slot moeten we nog een API-key aanmaken op de website van DarkSky. Deze API-key heb je nodig om via het script informatie van DarkSky naar Domoticz te halen. Volg de instructies op de DarkSky website.
Script
De laatste stap is het script. Ga naar Setup > More Options > Events en kies voor een LUA event (van het type Time). Kopieer onderstaand script naar Domoticz. Vul op regel 14 het IP + poortnummer van Domoticz in. Vul op regel 15 het nummer van een weerstation bij jou in de buurt in. Op regel 16 vul het de API-key van DarkSky in. Debugging kun je op regel 17 aan- of uitzetten. Tot slot kun je op regel 18 de taal voor de weersverwachtingen instellen. Activeer het event en sla het op.
—[[ WEERSTATIONS:
Amsterdam= 36Groningen= 13Oost–Groningen= 31Vlissingen= 44
Arnhem= 2Hoek van Holland= 17Oost–Overijssel = 12Voorschoten= 46
Berkhout= 3Hoogeveen= 18Rotterdam= 33Wadden= 19
Den Helder= 6Leeuwarden= 26Utrecht= 5Weert= 8
Eindhoven= 7Lelystad= 27Terneuzen= 47West–Friesland= 38
Gilze Rijen = 10Maastricht= 29Twente= 41West–Utrecht= 28
Goes= 11Noord–Groningen= 24Uden= 45Woensdrecht= 50
Gorinchem= 16Noordoostpolder= 30Venlo= 1Zwolle= 15
—]]
——————————–
———- SETTINGS ————
——————————–
local domo_ip= “192.168.2.62:8080” — IP adres van Domoticz, inclusief poort
local weerstation= 33— Kies je weerstation naar keuze
local api_key= “126387d6c1a1bd4731a2f366854ab8ed5”— Darksky secret key
local debug= 1— 0 = no debug, 1 = debug
local language= “nl”— ar: Arabic, az: Azerbaijani, be: Belarusian, bg: Bulgarian, bs: Bosnian, ca: Catalan, cs: Czech, da: Danish,
— de: German, el: Greek, en: English, es: Spanish, et: Estonian, fi: Finnish, fr: French, he: Hebrew, hr: Croatian,
— hu: Hungarian, id: Indonesian, is: Icelandic, it: Italian, ja: Japanese, ka: Georgian, ko: Korean, kw: Cornish,
— lv: Latvian, nb: Norwegian Bokmål, nl: Dutch, no: Norwegian Bokmål (alias for nb), pl: Polish, pt: Portuguese,
— ro: Romanian, ru: Russian, sk: Slovak, sl: Slovenian, sr: Serbian, sv: Swedish, tet: Tetum, tr: Turkish,
— uk: Ukrainian, x–pig–latin: Igpay Atinlay, zh: simplified Chinese, zh–tw: traditional Chinese
local dev_TempGround= “Temperatuur Grond”— Temperature sensor
local dev_TextTomorrow= “Verwachting morgen”— Text sensor
local dev_LongText= “Verwachting uitgebreid”— Text sensor
local dev_DewPoint= “Temperatuur Dauwpunt”— Temperature sensor
local dev_CloudCover= “Bewolkingsgraad”— Percentage sensor
local dev_UV= “UV”— UV sensor
local dev_Ozone= “Ozone”— Custom sensor with axis “DU”
commandArray={}
—Functie devices updaten
function UpdateDev(device,nvalue,svalues)
commandArray[#commandArray+1] = {[‘UpdateDevice’] = otherdevices_idx[device]..’|’..tostring(nvalue)..’|’..tostring(svalues)}
end
— Functie afronding
function round(num, dec)
if num == 0 then
return 0
else
local mult = 10^(dec or 0)
return math.floor(num * mult + 0.5) / mult
end
end
————————————————–
—– ######## Buienradar API Data call ######## —–
————————————————–
time = os.date(“*t”)
if((time.min+2)%5)==0then — Script loopt iedere 5 minuten (bv. 11.03, 11.08, 11.13, 11.18, etc.
json = (loadfile “/home/pi/domoticz/scripts/lua/JSON.lua”)()— For Linux
local config=assert(io.popen(‘curl “https://data.buienradar.nl/2.0/feed/json”‘))
local Stringjson = config:read(‘*all’)
config:close()
local jsonData = json:decode(Stringjson)
— Convert the json to a LUA table
if jsonData.actual.stationmeasurements[ weerstation ] ~= nil then— this sometimes happens around midnight
val_TempGround= jsonData.actual.stationmeasurements[ weerstation ].groundtemperature
val_WeatherTomorrow= jsonData.forecast.fivedayforecast[1].weatherdescription
val_SunChanceTomorrow= jsonData.forecast.fivedayforecast[1].sunChance
val_RainChanceTomorrow= jsonData.forecast.fivedayforecast[1].rainChance
val_RainMinimum= jsonData.forecast.fivedayforecast[1].mmRainMin
val_RainMaximum= jsonData.forecast.fivedayforecast[1].mmRainMax
val_WindDirectionTomorrow= jsonData.forecast.fivedayforecast[1].windDirection
val_WindSpeedTomorrow= jsonData.forecast.fivedayforecast[1].wind
val_TempTomorrowMinMin= jsonData.forecast.fivedayforecast[1].mintemperatureMin —minimale minimumtemperatuur
val_TempTomorrowMaxMin= jsonData.forecast.fivedayforecast[1].mintemperatureMax —maximale minimumtemperatuur
val_TempTomorrowMinMax= jsonData.forecast.fivedayforecast[1].maxtemperatureMin —minimale maximumtemperatuur
val_TempTomorrowMaxMax= jsonData.forecast.fivedayforecast[1].maxtemperatureMax —maximale maximumtemperatuur
end
—Min/Max. temperatuur bepalen
if val_TempTomorrowMinMin == val_TempTomorrowMaxMin then TempMinimum = val_TempTomorrowMinMin
else TempMinimum = val_TempTomorrowMinMin..” – “..val_TempTomorrowMaxMin end
if val_TempTomorrowMinMax == val_TempTomorrowMaxMax then TempMaximum = val_TempTomorrowMinMax
else TempMaximum = val_TempTomorrowMinMax..” – “..val_TempTomorrowMaxMax
end
—Regenhoeveeldheid bepalen
if val_RainMinimum == val_RainMaximum then RainIntensity = val_RainMinimum
else RainIntensity = val_RainMinimum..” – “..val_RainMaximum end
— Windrichting tekst bepalen
if val_WindDirectionTomorrow == “z” or val_WindDirectionTomorrow == “Z” then WindDirectionTomorrow = ” het zuiden”
elseif val_WindDirectionTomorrow == “zw” or val_WindDirectionTomorrow == “ZW” then WindDirectionTomorrow = “het zuidwesten”
elseif val_WindDirectionTomorrow == “zo” or val_WindDirectionTomorrow == “ZO” then WindDirectionTomorrow = “het zuidoosten”
elseif val_WindDirectionTomorrow == “w” or val_WindDirectionTomorrow == “W” then WindDirectionTomorrow = “het westen”
elseif val_WindDirectionTomorrow == “nw” or val_WindDirectionTomorrow == “NW” then WindDirectionTomorrow = “het noordwesten”
elseif val_WindDirectionTomorrow == “n” or val_WindDirectionTomorrow == “N” then WindDirectionTomorrow = “het noorden”
elseif val_WindDirectionTomorrow == “no” or val_WindDirectionTomorrow == “NO” then WindDirectionTomorrow = ” het noordoosten”
elseif val_WindDirectionTomorrow == “o” or val_WindDirectionTomorrow == “O” then WindDirectionTomorrow = “het oosten”
else WindDirectionTomorrow = “variabele richtingen” end
—Voorspellingen
forecast=val_WeatherTomorrow.. “\n “ ..“\n”.. “Komende nacht daalt de temperatuur naar “..TempMinimum..” °C. Morgen overdag wordt morgen maximaal “..TempMaximum.. ” °C. Er is morgen “..val_SunChanceTomorrow..” % kans op zon en “..val_RainChanceTomorrow..” % kans op neerslag (“..RainIntensity..” mm). De wind komt uit “..WindDirectionTomorrow..” en zal kracht “..val_WindSpeedTomorrow..” Bft hebben.” ..“\n “ ..“\n “
if otherdevices_svalues[dev_TextTomorrow] ~= forecast then UpdateDev(dev_TextTomorrow,0,forecast) end
— Updating domoticz devices
UpdateDev(dev_TempGround,0,val_TempGround)
if debug==1 then
print (“Temperatuur Grond: “..val_TempGround..” °C”)
end
end
—————————————
— ######## Darksy API call ######## —
—————————————
if((time.min+2)%5)==0then — Script loopt iedere 5 minuten (bv. 11.03, 11.08, 11.13, 11.18, etc.
json = (loadfile “/home/pi/domoticz/scripts/lua/JSON.lua”)()— For Linux
local config=assert(io.popen(‘curl “http://’..domo_ip..‘/json.htm?type=settings”‘))
local Stringjson = config:read(‘*all’)
config:close()
local jsonData = json:decode(Stringjson)
— Convert the json to a LUA table
lat= jsonData.Location.Latitude
lon= jsonData.Location.Longitude
bron ehoco.nl
local coord = lat..“,”..lon
json = (loadfile “/home/pi/domoticz/scripts/lua/JSON.lua”)()— For Linux
local config=assert(io.popen(‘curl “https://api.darksky.net/forecast/’..api_key..‘/’..coord..‘?lang=’..language..‘&units=si&exclude=hourly,flags”‘))
local Stringjson = config:read(‘*all’)
config:close()
local jsonData = json:decode(Stringjson)
— Convert the json to a LUA table
if jsonData ~= nil then— this sometimes happens around midnight
val_UV= jsonData.currently.uvIndex
val_Ozone= jsonData.currently.ozone
val_DewPoint= round(jsonData.currently.dewPoint,1)
val_CloudCover= jsonData.currently.cloudCover*100
end
if debug==1 then
print(“Bewolkingsgraad : “..val_CloudCover.. ” %”)
print(“UV-kracht :”..val_UV)
print(“Ozone : De ozone-waarde is “..val_Ozone)
print(“Dauwpunt : “..val_DewPoint.. ” °C”)
end
— Domoticz devices updaten
UpdateDev(dev_CloudCover,0,val_CloudCover)
UpdateDev(dev_DewPoint,0,val_DewPoint)
UpdateDev(dev_UV,0,val_UV..“;0”)
UpdateDev(dev_Ozone,0,val_Ozone)
if debug==1 then
print (“Dauwpunt: “..val_DewPoint..” °C”)
print (“Bewolkingsgraad: “..val_CloudCover..” %”)
print (“UV-Index: “..val_UV)
print (“Ozone: “..val_Ozone)
end
end
——————————————————-
— ######## Buienradar Verwachting API call ######## —
——————————————————-
if((time.min+2)%30)==0then — Script loopt iedere 30 minuten (bv. 11.28, 11.58, 12.28, 12.58, etc.
json = (loadfile “/home/pi/domoticz/scripts/lua/JSON.lua”)()— For Linux
local config=assert(io.popen(‘curl “https://data.buienradar.nl/1.1/feed/json”‘))
local Stringjson = config:read(‘*all’)
config:close()
local jsonData = json:decode(Stringjson)
— Convert the json to a LUA table
val_LongText = jsonData.buienradarnl.weergegevens.verwachting_vandaag.titel ..“\n “ ..“\n “.. jsonData.buienradarnl.weergegevens.verwachting_vandaag.tekst ..“\n “ ..“\n”
val_LongText = string.gsub(val_LongText, “ ”, ” “)
val_LongText = string.gsub(val_LongText, “’”, “‘”)
val_LongText = string.gsub(val_LongText, “‘”, “‘”)
val_LongText = string.gsub(val_LongText, “ë”, “ë”)
val_LongText = string.gsub(val_LongText, “è”, “è”)
val_LongText = string.gsub(val_LongText, “é”, “é”)
val_LongText = string.gsub(val_LongText, “ê”, “ê”)
val_LongText = string.gsub(val_LongText, “;”, “;”)
if debug==1 then
print (“Uitgebreid: “..val_LongText)
end
if otherdevices_svalues[dev_LongText] ~= val_LongText then UpdateDev(dev_LongText,0,val_LongText) end
end
return commandArray
Maak van Domoticz een weerstation – Deel 3
In Deel 1 en Deel 2 hebben we allerlei weer-informatie naar Domoticz gehaald. Een kleine toevoeging is om een eventueel weer-alarm (code geel/oranje/rood) ook in Domoticz te tonen. We gaan twee alert-sensoren aanmaken (voor vandaag en morgen) die, naast de kleur van de code, ook de reden van het weer-alarm aangeven. Bijvoorbeeld: Sneeuw, ijzel, wind, overvloedige regen, etc.
Benodigdheden
Allereerst gaan we python3 en een extensie op de Raspberry Pi installeren:
1
2
|
sudo apt–get install python3
sudo apt–get install python3–feedparser
|
Script
Download hier het benodigde script en pak het uit met een extractor als WinRar. Maak nu een subfolder “MeteoAlarmEU” aan in de folder /home/pi/domoticz/plugins
1
|
mkdir /home/pi/domoticz/plugins/MeteoAlarmEU
|
Plaats het bestand plugin.py vervolgens in de folder /home/pi/domoticz/plugins/MeteoAlarmEU/
Domoticz dient nu een keer opnieuw gestart te worden:
1
2
|
sudo service domoticz stop
sudo service domoticz start
|
Ga nu in Domoticz naar Setup > Hardware en voeg de nieuwe plugin toe:
De naam kun je naar eigen wens ingeven. Bij RSSFeed kies je het gebied waar je een eventueel weer-alarm van wilt zien. Dit kan één van onderstaande provincies en kust-streken zijn:
Provincies:
Drenthe : http://www.meteoalarm.eu/documents/rss/nl/NL018.rss
Gelderland : http://www.meteoalarm.eu/documents/rss/nl/NL014.rss
Groningen : http://www.meteoalarm.eu/documents/rss/nl/NL007.rss
Flevoland : http://www.meteoalarm.eu/documents/rss/nl/NL008.rss
Friesland : http://www.meteoalarm.eu/documents/rss/nl/NL017.rss
Limburg : http://www.meteoalarm.eu/documents/rss/nl/NL012.rss
Noord-Brabant: http://www.meteoalarm.eu/documents/rss/nl/NL013.rss
Noord-Holland: http://www.meteoalarm.eu/documents/rss/nl/NL011.rss
Overijssel : http://www.meteoalarm.eu/documents/rss/nl/NL016.rss
Utrecht : http://www.meteoalarm.eu/documents/rss/nl/NL015.rss
Zeeland : http://www.meteoalarm.eu/documents/rss/nl/NL010.rss
Zuid-Holland : http://www.meteoalarm.eu/documents/rss/nl/NL009.rss
Kust-streken:
Hoek van Holland: http://www.meteoalarm.eu/documents/rss/nl/NL802.rss
Rottum : http://www.meteoalarm.eu/documents/rss/nl/NL805.rss
Texel : http://www.meteoalarm.eu/documents/rss/nl/NL804.rss
IJmuiden : http://www.meteoalarm.eu/documents/rss/nl/NL803.rss
IJsselmeer : http://www.meteoalarm.eu/documents/rss/nl/NL807.rss
Vlissingen : http://www.meteoalarm.eu/documents/rss/nl/NL801.rss
Waddeneilanden : http://www.meteoalarm.eu/documents/rss/nl/NL019.rss
Waddenzee : http://www.meteoalarm.eu/documents/rss/nl/NL806.rss
Voordat je op “Add” klikt moet je Domoticz nog even toestaan om virtuele sensoren aan te mogen maken (Setup > Settings en vervolgens klik je op “Allow for 5 minutes” bij Hardware/Devices.
In de tab Utility zal je nu 2 alert-sensoren zien, de ene is voor vandaag, de andere is voor morgen. Indien gewenst kun je de namen van de sensoren naar eigen keuze aanpassen.
bron ehoco.nl
Vind je dit een interessant onderwerp waarover je vragen en of opmerkingen hebt, ga dan bij voorkeur naar mijn forum om daar je vragen te stellen en discussies te voeren over dit onderwerp !
Klik hier om je aan te melden of te registreren op het Forum.
2 gedachten over “Domoticz weerstation”
Bedankt voor je reactie. Is inmiddels al een verouderde post.
Darksky is inderdaad niet meer , maar in de nieuwe Domoticz is ook buienradar voortaan aanwezig en deze gebruik ik nu zelf voortaan. Werkt ook prima.
Hoi,
Prachtige opzet en deel 1 inmiddels volledig geimplementeerd. Kom alleen in de problemen met deel 2. De DarkSky APIis niet meer beschikbaar. Da’s jammer voor nu, maar misschien wel een kleine update op de site aanbrengen ?
Wel mooi in elkaar gezet
Rob