Ultrazvukový anemometr Netatmo Wind Gauge aneb absolutně tichá elegance

Ultrazvukový anemometr Netatmo Wind Gauge aneb absolutně tichá elegance

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í.

netatmo Weather Station API

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.

Scéna „netatmo API“

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“.

Scéna „netatmo vítr“

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).

Virtuální zařízení „netatmo vítr“

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.

Autor 15.05.2018 dna Jiří Chábera Návody a tipy, Fibaro, Fibaro HC2, Osvětlení a stínění, Stínění, Recenze 6 3047

Podobné články

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

6 Komentáre

  • Stanislav Vrhel

    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

    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

      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 :)
  • Petr

    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

      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

    Petr Šimral 16.05.2018 Odpovedať

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

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

Vyhledávání v blogu

Najnovšie názory

Naposledy prohlížené

Žádné produkty

Menu

Porovnat 0