Ultrazvukový anemometer Netatmo Wind Gauge alebo absolútne tichá elegancia

Ultrazvukový anemometer Netatmo Wind Gauge alebo absolútne tichá elegancia

Nie je žiadnou novinkou, že toľko obľúbenú a rozšírenú meteostanicu Netatmo Personal Weather Station je možné rozšíriť o senzor rýchlosti a smeru vetra Netatmo Wind Gauge. Hovoríte si k čomu? Prečo by sme mali merať rýchlosť vetra dnes, keď všetky potrebné informácie nájdeme na internete?

Tí, ktorí majú vo svojom byte alebo dome inštalované predokenné látkové rolety alebo markízy alebo tí, ktorí majú na záhrade krytý bazén, slnečník alebo len voľne postavený plastový záhradný nábytok, všetci tí iste poznajú situáciu, keď silný vietor vykoná svoje. Potrhané rolety, rozhádzané stoličky, zanesený bazén. Ak však máte informáciu, ako moc fúka práve na vašej záhrade alebo ako silný vietor sa opiera práve do vašich okien, môžete s tým niečo včas urobiť. Niekedy len vy a niekedy váš inteligentný dom.

Základná mobilná aplikácie dodávaná s meteostanicou Netatmo vám celkom spoľahlivo oznámi, že vietor dosiahol kritické rýchlosti, ale čo ďalej? Upratať stoličky a zložiť slnečník, to je jasné, ale čo rolety, markízy alebo bazén? Ak máte to šťastie, že máte všetky rolety a markízy alebo kryt bazéna vybavené motorom ovládaným napríklad žalúziovým modulom Fibaro Roller Shutter 2, potom máte len jediný problém: "Ako odovzdať informáciu o sile vetra z meteostanice Netatmo riadiacej jednotke Fibaro HC2 tak, aby sa domáca automatizácia postarala o všetko sama ". Fibarom dodávaný plug-in modul, ktorý umožňuje integráciu meteostanice Netatmo totiž so senzorom vetra (ale ani dažďa) zatiaľ pracovať nevie.

Netatmo Weather Station API

Výrobca meteostanice Netatmo našťastie počíta s tým, že vaše namerané dáta možno budete chcieť spracovávať aj iným spôsobom, než len prostredníctvom dodávanej aplikácie a sprístupňuje laickej i odbornej verejnosti tzv. Rozhrania API. Nemusíte byť profesionálny programátori, aby ste boli schopní s pomocou tohto Netatmo API integrovať váš senzor vetra do prostredia riadiacej jednotky Fibaro HC2. Ukážeme si, ako na to.

Na internete je možné nájsť niekoľko príkladov riešenia integrácie Netatmo senzorov do Fibaro HC2 (napríklad na https://goo.gl/paBxhF), ale žiadny z nich sa mi nejavil ako ideálny. Autori sa vždy snažili vyriešiť všetko v jednej programovej scéne, a to nie je príliš prezieravé. Oveľa výhodnejšie a elegantnejší je riešiť problém "modulárne", tj. Jedna samostatná scéna pre čítanie nameraných dát (Netatmo API), jedna scéna pre interpretáciu získaných dát a ich následné využitie v domácej automatizácii (Netatmo vietor) a jedno samostatné virtuálne zariadenie (Netatmo vietor), ktoré sa zobrazuje vo webovom rozhraní alebo v mobilnej aplikácii Fibaro.

Dáta namerané z vašej meteostanice Netatmo sú každých 5 minút posielaná na server Netatmo, z ktorého sú potom prostredníctvom Lua scény "netatmo API" zase spätne čítané (teda presnejšie len tie dáta, ktorá nás zaujímajú). Bohužiaľ výrobca poskytuje prostredníctvom rozhrania API dáta iba 1x za 10 minút, takže každé druhé meranie je pre použitie vo Fibaro Home Center 2 stratené. Dôvody sú zrejme technické alebo aj obchodné, ale aj s tým sa dá žiť.

Scéna "Netatmo API"

Lua scéna "Netatmo API" pre čítanie nameraných dát veterného senzora môže vyzerať naprí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čiatku kódu sa iniciuje prvotná hodnota globálnej premennej, ktorú si musíte najprv založiť v zodpovedajúcej sekcii rozhraní Fibaro HC2. Potom nasledujú vaše identifikačné údaje pre prístup k API, ktoré získate založením účtu na stránke https://dev.netatmo.com/en-US/dev (create your APP). Ďalší kód nie je pre väčšinu laikov zaujímavý, proste to berte tak, ako to je. Jedna funkcia volá druhú a je to vzájomne pekne zamotané. Vyzerá to asi takto:

Za pozornosť stojí iba funkcie "getmeasureWind", v rámci ktorej sa exportujú vybrané dáta senzora vetra do vašej globálne premenné "WindData". Štruktúra exportovaných dát v podobe pole vyzerá nasledovne:

Pole obsahuje len 4 namerané hodnoty, ktoré vyhodnotíme v ďalšom texte, a čas posledného merania v trochu "nečitateľnom" formáte. To je výsledok jedného spustenie scény "netatmo API". Opakovaného, resp. pravidelného spustenie tejto scény (každých 10 minút) možno dosiahnuť inou, samostatnou scénou, ktorá môže mať na starosti všetky časovo závislé udalosti domácej automatizácie (preberieme niekedy nabudúce). Ide o oveľa stabilnejšie riešenie, než keby ste bez úprav použili Lua kód zo stránky https://goo.gl/paBxhF. Tento kód spúšťa opakovane "sám seba" v intervale 5 minút a počas jedného až dvoch dní dôjde k pádu celej scény s výpisom chybového hlásenia, že "niečo niekde pretieklo".

Scéna "Netatmo vietor"

Cieľom tejto scény je prečítať dáta z vašej globálnej premennej "WindData", dekódovať ju a priradiť prečítané údaje tam, kam patrí, a na základe získaných informácií vykonať nejaké ďalšie automatizačnej povely. Takých scén môže byť aj viac a v každej z nich sa môžete venovať inému problému. To je kúzlo zdieľania tzv. Globálnych premenných. V mojom prípade táto scéna iba vytiahne roletu tak, aby ju vietor nepoškodil a odovzdá hlasovému výstupu Sonos informáciu, že to bolo vykonané. Moja elektronická priateľka mi potom príjemným ženským hlasom česky oznámi, čo sa 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 ..............................................................")

Hneď v hlavičke Lua kódu je zrejmá zmena. Je tu uvedená globálna premenná WindData. Vďaka tomu sa táto Lua scéna spustí iba vtedy, ak dôjde k akejkoľvek zmene hodnoty tejto premennej. Z logiky veci a z podmienok netatmo API to nebude častejšie, než každých 10 minút. Kód uvedený ako "udalosť" okrem iného vypisuje hodnotu tejto globálnej premennej. Nasledujúce sekcie priraďuje vybraným častiam pole z globálnej premennej tú správnu lokálnu premennú, z ktorej názvu je zrejmé, o čo ide. Potom nasleduje už jednoduchá podmienka typu: "keď moc fúka" potom "vytiahni roletu". Posledná časť kódu potom posiela podklady pre hlasovú syntézu mojej "elektronickej priateľky" SONOS (ale na túto tému, ako som sľúbil pred časom, až inokedy).

Virtuálne zariadenie „Netatmo vietor“

Kúzlo zdieľanie globálnych premenných inými samostatnými scénami sa dá veľmi dobre využívať aj v prípade virtuálnych zariadení. Virtuálne zariadenie pre netatmo senzor vetra možno založiť úplne jednoducho v zodpovedajúcej sekcii rozhraní HC2 (ako bolo popísané inde už mnohokrát). V mojom prípade som definoval iba 5 objektov typu "Label" (štítok) a tieto som si pomenoval. Nie je potrebné pridávať ani žiadne tlačidlo ani meniť žiadne iné nastavenia virtuálneho zariadenia. Jediné, čo treba pre správnu funkciu virtuálneho zariadenia urobiť, je skopírovať do sekcie "Main Loop" nasledujúci 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 prvej časti sa opäť interpretuje obsah globálnej premennej WindData a získané údaje sa rozdeľujú lokálnym premenným. Ďalšia časť kódu zariaďuje prepis nameraných hodnôt k príslušným "labelom" (štítkom) a posledná potom vpisuje do stavového riadku virtuálneho zariadenia vybrané namerané hodnoty, v mojom prípade priemernú rýchlosť vetra a maximálna rýchlosť nárazového vetra počas posledných 10 minút a čas posledného merania. LUA kód uložený v sekcii "Mail Loop" sa spúšťa automaticky každú sekundu a stará sa o to, aby boli všetky údaje vo virtuálnom zariadení vždy aktuálne. Stojí za to poznamenať, že Fibaro HC2 tu má malinkú chybičku, pretože vybrané hodnoty sa pod obrázkom senzora vetra zobrazí iba vtedy, ak je scéna spustená programovo a nie pomocou tlačidla "Play" na ikone príslušnej scény. Tento bug bude ale ako vždy pravdepodobne odstránený v niektorej z najbližších aktualizácií.

Nakoniec nezabudnite zmeniť nič nehovoriace modrú kocku v ikone virtuálneho zariadení za pekný obrázok senzora vetra, dostupný napríklad nižšie tu:

 

Výsledok môže vyzerať napríklad aj takto:

 

Pre úplnosť uvádzam, že dôležitejšie pre ochranu roliet, markíz, bazénov a iných automatizovaných zariadení je hodnota rýchlosti nárazového vetra, nie len priemerná rýchlosť vetra alebo jeho smer.

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.

Autor 15.05.2018 dna Návody a Tipy, Fibaro, Fibaro HC2, Osvetlenie a tienenie, Tienenie, Recenzie 1 771

Podobné články

Reportáž: Ako som začal prerábať môj dom na Smarthome?

Časť 1: Začiatky s inteligentným domom a prvé skúsenosti

1 Komentár

  • Petr Šimral

    Petr Šimral 16.05.2018 Odpovedať

    Jen více takových reportáží. Děkuji.
    Petr Šimral

Zanechajte nám Váš názorZanechajte odpoveď

Vyhľadávanie v blogu

Najnovšie názory

Naposledy navštívené

Žiadne produkty

Menu

Porovnať 0