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.
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 175 176 177 178 |
--[[ WEERSTATIONS: Amsterdam = 36 Groningen = 13 Oost-Groningen = 31 Vlissingen = 44 Arnhem = 2 Hoek van Holland = 17 Oost-Overijssel = 12 Voorschoten = 46 Berkhout = 3 Hoogeveen = 18 Rotterdam = 33 Wadden = 19 Den Helder = 6 Leeuwarden = 26 Utrecht = 5 Weert = 8 Eindhoven = 7 Lelystad = 27 Terneuzen = 47 West-Friesland = 38 Gilze Rijen = 10 Maastricht = 29 Twente = 41 West-Utrecht = 28 Goes = 11 Noord-Groningen = 24 Uden = 45 Woensdrecht = 50 Gorinchem = 16 Noordoostpolder = 30 Venlo = 1 Zwolle = 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)==0 then -- 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)==0 then -- 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 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)==0 then -- 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 |