Dzięki Informacji o zbliżającej się burzy nasz dom może się przygotowac do cięzkich warunków. Np zamknąc rolety, odłączyć zasilanie od urządzeń nie zabezpieczonych ups-em a nawet odłączyć cały dom od zasilania tak by być tylko na zasialniu wewnętrznym.
Na początek należy stworzyć w domoticzu urządzenie typu dummy device z typem Custom Sensor o nazwie "Burza Odległość".
Następnie nalezy się zarejestrować na burza.dzis.net i poprosić ich mailem o wygenerowanie kodu dostępu do api.
Posiadając kod api wpisujemy go w poniższy skrypt razem z danymi lokalizacji i id naszego custom sensora z domoticz (akurat ten skrypt napisany mam w vbscript i działa on na windows )
Dim odleglosc,ilosc,kierunek,okres,locx,locy,promien,apikey,zwalka Set oShell = WScript.CreateObject("Wscript.Shell") path= Left(WScript.ScriptFullName,Len(WScript.ScriptFullName)-Len(WScript.ScriptName)) Set fso = CreateObject("Scripting.FileSystemObject") Set xmlDoc = CreateObject("Microsoft.XMLDOM") Set xmlRes = CreateObject("Microsoft.XMLDOM") Set objWinHttp = CreateObject("WinHttp.WinHttpRequest.5.1") zwalka = 0 locx="xx.xx" 'wpisz dane lokalizazyjne ze strony burza.dzis.net locy="xx.xx" promien="100" ' promien w kilometrach apikey="kod_api" idodleglosc = "327" ' wpisz id urzadzenia w domoticzu które dodałeś jako dummy device (Custom) sURLBurza="http://burze.dzis.net/soap.php" sUrlBase = "http://domoticz.home.local:8080/json.htm?type=command¶m=udevice&" Burza() If zwalka = 0 then sUrl = sUrlBase + "idx="& idodleglosc &"&nvalue=0&svalue="& odleglosc result=HTTPPost("") If err.number <> 0 then Log "Set Value Error Device:" & idodleglosc & "value:" & odleglosc Else Wscript.echo "Set Distance " & odleglosc End If wscript.echo result end if Function Burza() on error resume next soapgr = "<soapenv:Envelope xmlns:xsi="&chr(34)&"http://www.w3.org/2001/XMLSchema-instance"&chr(34)&" xmlns:xsd="&chr(34)&"http://www.w3.org/2001/XMLSchema"&chr(34)&" xmlns:soapenv="&chr(34)&"http://schemas.xmlsoap.org/soap/envelope/"&chr(34)&" xmlns:soap="&chr(34)&"http://burze.dzis.net/soap.php"&chr(34)&">" soapgr = soapgr & " <soapenv:Header/>" soapgr = soapgr & " <soapenv:Body>" soapgr = soapgr & " <soap:szukaj_burzy soapenv:encodingStyle="&chr(34)&"http://schemas.xmlsoap.org/soap/encoding/"&chr(34)&">" soapgr = soapgr & " <y xsi:type="&chr(34)&"xsd:float"&chr(34)&">"&locx&"</y>" soapgr = soapgr & " <x xsi:type="&chr(34)&"xsd:float"&chr(34)&">"&locy&"</x>" soapgr = soapgr & " <promien xsi:type="&chr(34)&"xsd:int"&chr(34)&">"&promien&"</promien>" soapgr = soapgr & " <klucz xsi:type="&chr(34)&"xsd:string"&chr(34)&">"&apikey&"</klucz>" soapgr = soapgr & " </soap:szukaj_burzy>" soapgr = soapgr & " </soapenv:Body>" soapgr = soapgr & "</soapenv:Envelope>" 'wscript.echo soapgr t = timer result=(GetDataFromURL(sURLBurza, "POST", soapgr)) If err.number <> 0 then Log hex(err.number) &" " & err.description End If t2 = timer - t wscript.echo "Request time:" & t2 'wscript.echo result xmlRes.async = false xmlRes.loadXML(result) If err.number <> 0 then Log "Parse Error" zwalka = 1 End If If xmlRes.parseError.errorCode <> 0 Then Log "parseError ChesterListOpen Rason :" & xmlRes.parseError.reason & "Error Line: " & xmlRes.parseError.line & vbcrlf & result & vbcrlf zwalka = 1 End If set nodes = xmlRes.selectNodes("//*") for i = 0 to nodes.length -1 If nodes(i).nodeName = "liczba" then Wscript.echo "liczba:" & nodes(i).text ilosc = nodes(i).text End If If nodes(i).nodeName = "odleglosc" then Wscript.echo "odleglosc:" & nodes(i).text odleglosc = nodes(i).text End If If nodes(i).nodeName = "kierunek" then Wscript.echo "kierunek:" & nodes(i).text kierunek = nodes(i).text End If If nodes(i).nodeName = "okres" then Wscript.echo "okres:" & nodes(i).text okres = nodes(i).text End If next End Function Function HTTPPost(sRequest) set oHTTP = CreateObject("Microsoft.XMLHTTP") oHTTP.open "GET", sUrl,false oHTTP.send sRequest HTTPPost = oHTTP.responseText End Function Function GetDataFromURL(strURL, strMethod, strPostData) Dim lngTimeout Dim strUserAgentString Dim intSslErrorIgnoreFlags Dim blnEnableRedirects Dim blnEnableHttpsToHttpRedirects Dim strHostOverride Dim strLogin Dim strPassword Dim strResponseText lngTimeout = 59000 strUserAgentString = "http_requester/0.1" intSslErrorIgnoreFlags = 13056 ' 13056: ignore all err, 0: accept no err blnEnableRedirects = True blnEnableHttpsToHttpRedirects = True strHostOverride = "" strLogin = "" strPassword = "" objWinHttp.SetTimeouts lngTimeout, lngTimeout, lngTimeout, lngTimeout objWinHttp.Open strMethod, strURL If strMethod = "POST" Then objWinHttp.setRequestHeader "Content-Type","text/xml; charset=utf-8" End If If strHostOverride <> "" Then objWinHttp.SetRequestHeader "Host", strHostOverride End If objWinHttp.Option(0) = strUserAgentString objWinHttp.Option(4) = intSslErrorIgnoreFlags objWinHttp.Option(6) = blnEnableRedirects objWinHttp.Option(12) = blnEnableHttpsToHttpRedirects If (strLogin <> "") And (strPassword <> "") Then objWinHttp.SetCredentials strLogin, strPassword, 0 End If On Error Resume Next objWinHttp.Send(strPostData) If Err.Number = 0 Then If objWinHttp.Status = "200" Then GetDataFromURL = objWinHttp.ResponseText Else GetDataFromURL = "HTTP " & objWinHttp.Status & " " & _ objWinHttp.StatusText End If Else GetDataFromURL = "Error " & Err.Number & " " & Err.Source & " " & _ Err.Description End If On Error GoTo 0 End Function Function Log(sLogText) On Error Resume Next WScript.Echo sLogText & ": " & err.number & " : " & err.description sError = sError + sLogText + VbCrLf Err.Clear Set ts= fso.OpenTextFile(path& "burza.log", 8,True, False) ts.Write(Now() &"; "& sLogText & " : " & err.number & " : " & err.description & vbcrlf) ts.close End Function
Skrypt ustawiamy na uruchamianie w windows co 5 minut w task schedulerze. Następnie w domoticzu dodajemy zmienną typu user o nazwie burza i w skrypcie lua uruchamianym co minutę taki kod.
-- BURZA set variable if (tonumber(otherdevices_svalues['Burza Odległość']) > 0 and tonumber(otherdevices_svalues['Burza Odległość']) < 8 ) then print('Burza blisko:' .. otherdevices_svalues['Burza Odległość']) --commandArray['Burza']= 'On' if (tonumber(uservariables['burza']) == 0) then commandArray['Variable:burza'] = tostring(1) notify = notify.." Zbliża się burza. Dystans "..otherdevices_svalues['Burza Odległość'].." km." end else if (tonumber(uservariables['burza']) == 1) then print('Burza koniec:' .. otherdevices_svalues['Burza Odległość']) commandArray['Variable:burza'] = tostring(0) end end
Przy ustawionych powiadomieniach skrypt ten będzie wysyłał informację o zbiżającej sie burzy na nasz telefon komorkowy. Tutaj też ustawiamy w jakiej odległosci od lokalizacji dom ma przechodzić w tryb burza.
Następnie poniżej dodajemy akcje które chcemy by skrypt wykonał w sytuacji burzy. Tutaj przykład zamknięcia 2 rolet.
if (tonumber(uservariables['burza']) == 1) then parterroleta = tonumber(otherdevices_svalues['Parter Roleta']) parterroletasypialnia = tonumber(otherdevices_svalues['Parter Roleta Sypialnia']) if (parterroleta > 10) then commandArray['Parter Roleta'] = 'Off' end if (parterroletasypialnia > 10) then commandArray['Parter Roleta Sypialnia'] = 'Off' end end
Skrypt wyśle zamknięcie rolet tylko jeśli były otwarte.
A tak wygląda wykres z wartości burza odległość odkąd to u mnie działa. Odległość od burzy ma wartość 0 do czasu pojawienia się burzy w zasiegu ustawionego promienia. Potem wartośc skacze do 100 i spada powoli do wartości 0,47 po czym po przejsciu burzy podnosi się znów do 100 i spada do zera. Stąd w skrypcie jest sprawdzanie
if (tonumber(otherdevices_svalues['Burza Odległość']) > 0
Skrypt vbs pobiera też inne informacje np kierunek, ilośc uderzeń piorunów, czas os ostaniego uderzenia. Na swoje potrzeby nie dodawałem ich w domoticzu acz moze komuś się przyda.
Jest tez dostępny plugin do domoticz z burze.dzis.net dający nieco wiecej informacji
https://github.com/lrybak/domoticz-storm-report