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