Odległość od burzy

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&param=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 

burza

 

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