Není žádnou novinkou, že tolik oblíbenou a rozšířenou meteostanici netatmo Personal Weather Station je možné rozšířit o senzor rychlosti a směru větru Netatmo Wind Gauge. Říkáte si k čemu? Proč bychom měli měřit rychlost větru dnes, když všechny potřebné informace najdeme na internetu?
Ti, kteří mají ve svém bytě nebo domě instalované předokenní látkové rolety nebo markýzy nebo ti, kteří mají na zahradě krytý bazén, slunečník nebo jen volně postavený plastový zahradní nábytek, všichni ti jistě znají situaci, kdy silný vítr vykoná své. Potrhané rolety, rozházené židle, zanesený bazén. Pokud však máte informaci, jak moc fouká právě na vaší zahradě nebo jak silný vítr se opírá právě do vašich oken, můžete s tím něco včas udělat. Někdy pouze vy a někdy vaše domácí automatizace a inteligentní domácnost.
Základní mobilní aplikace dodávaná s meteostanicí Netatmo vám celkem spolehlivě sdělí, že vítr dosáhl kritické rychlosti, ale co dál? Uklidit židle a složit slunečník, to je jasné, ale co rolety, markýzy nebo bazén? Pokud máte to štěstí, že máte všechny rolety a markýzy nebo kryt bazénu vybaveny motorem ovládaným například žaluziovým modulem Fibaro Roller Shutter 2, pak máte jen jediný problém: „Jak předat informaci o síle větru z meteostanice netatmo řídící jednotce Fibaro HC2 tak, aby se domácí automatizace postarala o všechno sama“. Fibarem dodávaný plug-in modul, který umožňuje integraci meteostanice netatmo totiž se senzorem větru (ale ani deště) zatím pracovat neumí.
Výrobce meteostanice netatmo naštěstí počítá s tím, že vaše naměřená data možná budete chtít zpracovávat i jiným způsobem, než pouze prostřednictvím dodávané aplikace a zpřístupňuje laické i odborné veřejnosti tzv. rozhraní API. Nemusíte být profesionální programátoři, abyste byli schopni s pomocí tohoto Netatmo API integrovat váš senzor větru do prostředí řídící jednotky Fibaro HC2. Ukážeme si, jak na to.
Na internetu je možné najít několik příkladů řešení integrace netatmo senzorů do Fibaro HC2 (například na https://goo.gl/paBxhF), ale žádný z nich se mi nejevil jako ideální. Autoři se vždy snažili vyřešit vše v jedné programové scéně, a to není příliš prozíravé. Mnohem výhodnější a elegantnější je řešit problém „modulárně“, tj. jedna samostatná scéna pro čtení naměřených dat (netatmo API), jedna scéna pro interpretaci získaných dat a jejich následné využití v domácí automatizaci (netatmo vítr) a jedno samostatné virtuální zařízení (netatmo vítr), které se zobrazuje ve webovém rozhraní nebo v mobilní aplikaci Fibaro.
Data naměřená vaší meteostanicí netatmo jsou každých 5 minut posílána na server netatmo, ze kterého jsou pak prostřednictvím Lua scény „netatmo API“ zase zpětně čtena (tedy přesněji jen ta data, která nás zajímají). Bohužel výrobce poskytuje prostřednictvím rozhraní API data pouze 1x za 10 minut, takže každé druhé měření je pro použití ve Fibaro HC2 ztraceno. Důvody jsou zřejmě obchodní, ale i s tím se dá žít.
Lua scéna „netatmo API“ pro čtení naměřených dat větrného senzoru může vypadat například takto:
--[[ %% properties %% events %% globals --]] -- inicializace globální proměnné local windData = {} if (fibaro:getGlobalValue("WindData") == "") then fibaro:setGlobal("WindData", json.encode(windData)) end -- autentizační údaje netatmo local client_id = "……………………………" local client_secret = "…………………………………………" local username = ".......@.........." local password = "………………..." -- definice funkce oAuth local request_body, token function oAuth() request_body = "grant_type=password&client_id=" .. client_id .. "&client_secret=" .. client_secret .. "&username=" .. username .. "&password=" .. password .. "&scope=read_station" getResponseData("https://api.netatmo.net/oauth2/token", request_body, function(data) token = data.access_token getDevices() -- volání funkce getDevices end ) -- volání funkce getResponseData s parametry end -- definice funkce getResponseData local http function getResponseData(url, body, func) http = net.HTTPClient() http:request(url, { options = { method = "POST", headers = {["Content-Type"] = "application/x-www-form-urlencoded;charset=UTF-8"}, data = body }, success = function(response) func(json.decode(response.data)) end }) end -- definice funkce getDevices local wind_id, int_id function getDevices() getResponseData("https://api.netatmo.net/api/devicelist","access_token="..token, function(data) for _, v in pairs(data.body.modules) do if (v.data_type[1] == "Wind") then -- vyhledání senzoru větru wind_id = v._id fibaro:debug("senzor větru MAC: " .. wind_id) getmeasureWind() -- volání funkce getmeasureWind end int_id = data.body.devices[1]._id end end ) -- volání funkce getResponseData s parametry end -- definice funkce getmeasureWind local request_body_wind function getmeasureWind() request_body_wind = "access_token="..token.."&device_id="..int_id.."&module_id="..wind_id.."&scale=max&type=WindStrength,WindAngle,GustStrength,GustAngle&date_end=last" getResponseData("https://api.netatmo.net/api/getmeasure", request_body_wind, function(getData) fibaro:setGlobal("WindData", json.encode(getData.body[1])) -- konverze pole do globální textové proměnné WindData fibaro:debug(json.encode(getData.body[1])) fibaro:debug("END ..............................................................") end ) -- volání funkce getResponseData s parametry end -- volání funkce oAuth oAuth()
Na začátku kódu se iniciuje prvotní hodnota globální proměnné, kterou si musíte nejprve založit v odpovídající sekci rozhraní Fibaro HC2. Pak následují vaše identifikační údaje pro přístup k API, které získáte založením účtu na stránce https://dev.netatmo.com/en-US/dev (create your APP). Další kód není pro většinu laiků zajímavý, prostě to berte tak, jak to je. Jedna funkce volá druhou a je to vzájemně pěkně zamotané. Vypadá to asi takto:
Za pozornost stojí pouze funkce „getmeasureWind“, v jejímž rámci se exportují vybraná data senzoru větru do vaší globální proměnné „WindData“. Struktura exportovaných dat v podobě pole vypadá následovně:
Pole obsahuje pouze 4 naměřené hodnoty, které vyhodnotíme v dalším textu, a čas posledního měření v poněkud „nečitelném“ formátu. To je výsledek jednoho spuštění scény „netatmo API“. Opakovaného, resp. pravidelného spuštění této scény (každých 10 minut) lze dosáhnout jinou, samostatnou scénou, která může mít na starosti všechny časově závislé události domácí automatizace (probereme někdy příště). Jde o mnohem stabilnější řešení, než kdybyste bez úprav použili Lua kód ze stránky https://goo.gl/paBxhF. Tento kód spouští opakovaně „sám sebe“ v intervalu 5 minut a během jednoho až dvou dnů dojde k pádu celé scény s výpisem chybového hlášení, že „něco někde přeteklo“.
Cílem této scény je přečíst vaší globální proměnnou „WindData“, dekódovat ji a přiřadit přečtené údaje tam, kam patří, a na základě získaných informací vykonat nějaké další automatizační povely. Takových scén může být i více a v každá z nich se může věnovat jinému problému. To je kouzlo sdílení tzv. globálních proměnných. V mém případě tato scéna pouze vytáhne roletu tak, aby ji vítr nepoškodil a předá hlasovému výstupu SONOS informaci, že to bylo provedeno. Moje elektronická přítelkyně mi pak příjemným ženským hlasem česky sdělí, co se stalo:
--[[ %% properties %% events %% globals WindData --]] -- událost local trigger = fibaro:getSourceTrigger() fibaro:debug("trigger = " .. json.encode(trigger)) local windData = json.decode(fibaro:getGlobalValue("WindData")) fibaro:debug("windData = " .. json.encode(windData)) -- interpretace dat local windStrength = windData.value[1][1] local windAngle = windData.value[1][2] local gustStrength = windData.value[1][3] local gustAngle = windData.value[1][4] local timeMeasurement = os.date("%H:%M", (json.encode(windData.beg_time))) fibaro:debug("windStrength = " .. windStrength .. " km/h, " .. "windAngle = " .. windAngle .. " °, " .. "gustStrength = " .. gustStrength .. " km/h, " .. "gustAngle = " .. gustAngle .. " °") fibaro:debug("timeMeasurement = " .. timeMeasurement) -- roleta v pokojíčku if (gustStrength > 40) then fibaro:call(526, "open") fibaro:debug("roleta vytažena") end -- odeslání TTS local saySonos if (gustStrength > 40) then saySonos = "nárazový vítr dosahuje rychlost " .. gustStrength .. " km/hod, zatahuji roletu" if (saySonos ~= fibaro:getGlobalValue("SaySonos")) then fibaro:setGlobal("VolSonos", 30) -- hlasitost TTS fibaro:setGlobal("TimeSonos", "auto") -- trvání TTS fibaro:setGlobal("SaySonos", saySonos) -- zpráva TTS fibaro:debug(saySonos) fibaro:startScene(190) -- Sonos 32 end end -- konec scény fibaro:debug("END ..............................................................")
Hned v hlavičce Lua kódu je patrná změna. Je zde uvedena globální proměnná WindData. Díky tomu se tato Lua scéna spustí pouze tehdy, dojde-li k jakékoli změně hodnoty této proměnné. Z logiky věci a z podmínek netatmo API to nebude častěji, než každých 10 minut. Kód uvedený jako „událost“ kromě jiného vypisuje hodnotu této globální proměnné. Následující sekce přiřazuje vybraným částem pole z globální proměnné tu správnou lokální proměnnou, z jejíž názvu je patrné, o co jde. Pak následuje již jednoduchá podmínka typu: „když moc fouká“ pak „vytáhni roletu“. Poslední část kódu pak posílá podklady pro hlasovou syntézu mojí elektronické přítelkyně (ale na toto téma, jak jsem slíbil před časem, až jindy).
Kouzlo sdílení globálních proměnných jinými samostatnými scénami se dá velmi dobře využívat i v případě virtuálních zařízení. Virtuální zařízení pro netatmo senzor větru lze založit naprosto jednoduše v odpovídající sekci rozhraní FIBARO Home Center (jak bylo popsáno jinde již mnohokrát). V mém případě jsem definoval pouze 5 objektů typu „Label“ (štítek) a tyto jsem si pojmenoval. Není potřeba přidávat ani žádné tlačítko ani měnit žádné jiné nastavení virtuálního zařízení. Jediné, co je třeba pro správnou funkci virtuálního zařízení udělat, je zkopírovat do sekce „Main Loop“ následující Lua kód:
local windData = json.decode(fibaro:getGlobalValue("WindData")) -- konverze globální textové proměnné na tabulku local windStrength = windData.value[1][1] local windAngle = windData.value[1][2] local gustStrength = windData.value[1][3] local gustAngle = windData.value[1][4] local timeMeasurement = os.date("%H:%M", (json.encode(windData.beg_time))) fibaro:call(fibaro:getSelfId(), "setProperty", "ui.Label1.value", " " .. windStrength .. " km/h") fibaro:call(fibaro:getSelfId(), "setProperty", "ui.Label2.value", " " .. windAngle .. " °") fibaro:call(fibaro:getSelfId(), "setProperty", "ui.Label3.value", " " .. gustStrength .. " km/h") fibaro:call(fibaro:getSelfId(), "setProperty", "ui.Label4.value", " " .. gustAngle .. " °") fibaro:call(fibaro:getSelfId(), "setProperty", "ui.Label5.value", " " .. timeMeasurement) fibaro:log(windStrength .. " km/h, " .. gustStrength .. " km/h (" .. timeMeasurement .. ")") fibaro:debug("timeMeasurement = " .. timeMeasurement)
V první části se opět interpretuje obsah globální proměnné WindData a získané údaje se přiřazují příslušným lokálním proměnným. Další část kódu zařizuje přepis naměřených hodnot k příslušným „labelům“ (štítkům) a poslední pak vepisuje do stavového řádku virtuálního zařízení vybrané naměřené hodnoty, v mém případě průměrnou rychlost větru a maximální rychlost nárazového větru během posledních 10 minut a čas posledního měření. Lua kód uložený v sekci „Mail Loop“ se spouští automaticky každou sekundu a stará se o to, aby byly všechny údaje ve virtuálním zařízení vždy aktuální. Stojí za to poznamenat, že Fibaro HC2 zde má malinkou chybku, protože vybrané hodnoty se pod obrázkem senzoru větru zobrazí pouze tehdy, je-li scéna spuštěna programově a nikoli pomocí tlačítka „Play“ na ikoně příslušné scény. Tento bug bude ale jako vždy pravděpodobně odstraněn v některé z nejbližších aktualizací.
Nakonec nezapomeňte změnit nic neříkající modrou krychli v ikoně virtuálního zařízení za pěkný obrázek senzoru větru, dostupný například níže:
Výsledek může vypadat třeba takto:
Pro úplnost uvádím, že důležitější pro ochranu rolet, markýz, bazénů a jiných automatizovaných zařízení je důležitější hodnota rychlosti nárazového větru, nikoli jen průměrná rychlost větru nebo jeho směr.
Moje heslo: „Skutečná domácí automatizace nepotřebuje žádný ovladač“
Jiří Chábera
P.S. Děkuji autorům příspěvků ze stránky http://www.siio.com, ze kterých jsem vycházel a také své dceři a jejímu příteli za pomoc při analýze Lua kódu a za schematický diagram.
Reportáž: Jak jsem začal předělávat můj dům na Smarthome ? Díl 2.
Reportáž: Jak jsem začal předělávat můj dům na Smarthome ? Díl 2.
Reportáž: Jak jsem začal předělávat můj dům na Smarthome ?
Část 1: Začátky s inteligentním domem a první zkušenosti
Netatmo Smart Home Weather Station
10 Komentáre
Jiří Dobšovič 26.02.2020 Odpovedať
Dobrý den,slíbil jste v budoucnu článek o Sonos TTS - jak to máte vyřešené pro český jazyk? Našel jsem řešení pouze pro cizí jazyky...
Děkuji.
Jiří Chábera 07.04.2020 Odpovedať
Hlasový výstup TTS v češtině využívající multiroom SONOS a webovou službu ResponsiveVoice (https://responsivevoice.com/) je pomyslnou „vlajkovou lodí“ mé domácí automatizace řízené Fibaro HC2, tedy přesněji řečeno donedávna byl. Je to asi měsíc, co se provozovatel služby ResponsiveVoice rozhodl změnit podmínky využití této služby a verzi, která nevyužívala API zastavil. Nejsem profesionální programátor a úprava dotčené části kódu není pro mě jednoduchá. Navíc se ResponsiveVoice vyjádřili, že při použití API v cenovém programu „Free“ bude omezen denní počet přístupů a poplatek cca 1000 Kč měsíčně za neomezenou verzi služby, který vyžaduje, nejsem ochoten platit. Takže v této chvíli si stýskám po své elektronické, krásně česky hovořící kamarádce :-(To jsou bohužel rizika využívání řešení založených na využívání webových služeb třetích stran.
Stanislav Vrhel 19.03.2019 Odpovedať
chybu: Chyba handshake: ověření certifikátu se nezdařilo lze odstranit v httpclient: request () použitím checkCertificate = false ,Martin Longauer 11.03.2019 Odpovedať
Dobry den,Podla navodu to nefunguje(navod uz asi nebude aktualny).
Vypisuje chybu:
[DEBUG] 15:53:00: 2019-03-11 15:53:00.568372 [ error] Handshake error: certificate verify failed
SmarterHOME Team 11.03.2019 Odpovedať
Dobrý deň,ďakujeme za podnet.
Menila sa metóda authentifikácie HTTPS na serveroch Netatmo.
Článok plánujeme aktualizovať o alternatívne riešenie.
Sledujte náš blog :)
Durki 12.12.2020 Odpovedať
Dobrý den,jak to vypadá s aktualizaci LUA skriptu pro netatmo API? Trvá chybová hláška [ error] Handshake error: certificate verify failed. Děkuji
SmarterHOME Team 18.01.2021 Odpovedať
Dobrý deň,aktuálny návod - https://forum.fibaro.com/files/file/93-netatmo-weather-station-vd-scene-standalone/page/2/
Ďakujeme za pochopenie.
Pekný deň.
Petr 04.12.2018 Odpovedať
No a jak merit vitr pro HCL? Mam Netatmo snimac vetru ale k nemilemu prekvapeni na nej plugin pripraven neni. Daji se alespon nejak zpracovat data z Weather pluginu? To, ze Fibaro HCL neumi meric vetru je tezky faul.SmarterHOME 04.12.2018 Odpovedať
Dobrý deň,bohužiaľ plugin pre Netatmo nepodporuje práve Wind Gauge (senzor vetra). Treba len čakať, či v niektorej z aktualizácií nepridajú podporu alebo využiť vstavaný plugin pre počasie aktualizované z internetu na základe lokality.
Pekný deň.
Petr Šimral 16.05.2018 Odpovedať
Jen více takových reportáží. Děkuji.Petr Šimral