Pas onderstaande toe, wel met een aantal notes:
- De script en devices bevatten niet meer "regen" maar "neerslag". Dit betekent dat de images map NeerslagMonitor moet zijn. Het script heet NeerslagMonitor.vb en de devices heten ook Neerslag ipv Regen.
- Script maakt gebruik van gps.buienradar.nl niet meer van weeronline.nl en gebruikt de GPS coordinaten in je HS config. Je kunt deze overrulen door de eerste parameter de coordinaten mee te geven gescheiden door een komma. De decimale seperator is de punt, zoals google maps dat ook doet.
Voorbeeld "optional parameters" = ("Main","52.160876,6.983185;V1;no;yes")
Parameters zijn gescheiden door puntkomma en zijn:
- 1= GPS coordinaten Long + Lat (kun je dus leeglaten als je deze wilt gebruiken die in de HS config staat... Laat wel de puntkomma staan!!)
- 2= Device naam dat gebruikt moet worden (indien niet bestaat, zal deze aangemaakt worden)
- 3= Op "yes" of "no" zetten indien je wel of niet wilt dat er een tekst wordt gebruikt in de status van de device(s)
- 4= Op "yes" of "no" zetten indien je wel of niet wilt dat er meerdere devices worden aangemaakt beginnend bij het device opgegeven bij parameter 2. Ieder device zal een interval zijn van 5 minuten.
Code: Select all
' NeerslagMonitor.vb script
' Auteur: Alexander
' Versie: 1.0
' Laatst gewijzigd: 04-01-2012 12:00
' Change Log:
' 1.0: Start
' - Functionaliteit: Overgestapt van weeronline naar buienradar data gebaseerd op GPS coordinaten
Sub Main(ByVal Params As String)
' Vervang deze waarden als je andere omschrijvingen wilt hebben, zodra de device(s) wordt/worden aangemaakt.
Dim strDeviceLocation As String = "Virtual - Monitoring" ' Sla deze waarde op in de variabele strDeviceLocation
Dim strDeviceType As String = "Verwachte Neerslag Monitoring" ' Sla deze waarde op in de variabele strDeviceType
Dim strGPS As String = hs.StringItem(Params, 1, ";") ' Haal de waarde van de eerste parameter op en sla deze op
Dim strDevice As String = hs.StringItem(Params, 2, ";") ' Haal de waarde van de tweede parameter op en sla deze op
Dim strHouseCode As String = GetChar(strDevice,1) ' Pak de eerste karakter van de variabele strDevice en sla deze op
dim strDeviceCode As String = strDevice.subString(1) ' Pak de tekst op vanaf de tweede positie van de variabele strDevice en sla deze op
Dim blRainInText As Boolean = hs.StringItem(Params, 3, ";") = "yes" ' Haal de waarde van de derde parameter op en als deze "yes" als waarde heeft, dan is de variabele blRainInText WAAR anders ONWAAR
Dim blMultiDevice As Boolean = hs.StringItem(Params, 4, ";") = "yes" ' Haal de waarde van de vierde parameter op en als deze "yes" als waarde heeft, dan is de variabele blMultiDevice WAAR anders ONWAAR
Dim i As Integer
Dim strGPSLong As String
Dim strGPSLat As String
If not ((Val(strDeviceCode)>=1) And (Val(strDeviceCode)<=128)) Then
hs.WriteLog("NeerslagMonitor", "Ongeldige DeviceCode! Uitvoeren script gestopt...")
Exit Sub
End If
If not (strHouseCode <> "") Then
hs.WriteLog("NeerslagMonitor", "Ongeldige HouseCode! Uitvoeren script gestopt...")
Exit Sub
End If
If not (strGPS <> "") Then
strGPSLong = hs.GetINISetting("Settings","longitude","0")
strGPSLat = hs.GetINISetting("Settings","latitude","0")
Else
If (ubound(split(strGPS, ",")) > 1) Then
hs.WriteLog("NeerslagMonitor", "Gebruik punten in de GPS coordinaten! Uitvoeren script gestopt...")
Exit Sub
ElseIf (ubound(split(strGPS, ",")) = 0) Then
hs.WriteLog("NeerslagMonitor", "Gebruik een komma tussen de GPS coordinaten! Uitvoeren script gestopt...")
Exit Sub
End If
strGPSLong = hs.StringItem(strGPS, 1, ",")
strGPSLat = hs.StringItem(strGPS, 2, ",")
End If
Dim strData As String = hs.GetURL("gps.buienradar.nl", "/getrr.php?lat=" & strGPSLat & "&lon=" & strGPSLong, false, 80) ' Haal de tekst van de webpagina op en deze in de variabele strData opslaan
If (Not InStr(strData, "|") > 0) Then
hs.SetDeviceString(strDevice, "Website gps.buienradar.nl down", True)
hs.SetDeviceStatus(strDevice, 17)
Exit Sub
End If
If blMultiDevice Then
For i = 0 To 24
If hs.DeviceExistsRef(strHouseCode & Val(strDeviceCode)+i) = -1 Then
Dim dv As Object
dv = hs.GetDeviceByRef(hs.NewDeviceRef("Neerslag" & "-" & i+1))
dv.hc = strHouseCode
dv.dc = Val(strDeviceCode)+i
dv.misc = "&h10"
dv.location = strDeviceLocation
dv.dev_type_string = strDeviceType
End If
Next
Else
If hs.DeviceExistsRef(strHouseCode & strDeviceCode) = -1 Then
Dim dv As Object
dv = hs.GetDeviceByRef(hs.NewDeviceRef("Neerslag"))
dv.hc = strHouseCode
dv.dc = strDeviceCode
dv.misc = "&h10"
dv.location = strDeviceLocation
dv.dev_type_string = strDeviceType
End If
End If
Dim strArr() As String
Dim strTime(25) As String
Dim strDate(25) As String
Dim strValue(25) As String
Dim blTomorrow As Boolean
strArr = strdata.split(chr(13))
For i = 0 To strArr.Length -2
strValue(i) = hs.StringItem(strArr(i), 1, "|")
strTime(i) = hs.StringItem(strArr(i), 2, "|")
If (strTime(i)="00:00") and (i>0) Then
blTomorrow = 1
End If
If blTomorrow Then
strDate(i) = FormatDateTime(DateTime.Now, 2).toString()
Else
strDate(i) = FormatDateTime(DateTime.Now.AddDays(1), 2).toString()
End If
Next
For i = 0 To strArr.Length -2
Dim strEvent As String = strDate(i) & "_" & strTime(i)
If hs.EventExists(strEvent) Then hs.DeleteEvent(strEvent)
Dim lngValueCommand As Long = Math.Round(Math.Pow(10, (strValue(i) - 109) / 32)*100, 0)
Dim strValueCommand As String
If blMultiDevice Then
strValueCommand = "&hs.SetDeviceValue(" & strHouseCode & Val(strDeviceCode) + i & ", " & lngValueCommand.toString() & ")"
Else
strValueCommand = "&hs.SetDeviceValue(" & strDevice & ", " & lngValueCommand.toString() & ")"
End If
If (DateTime.Compare(strTime(i), FormatDateTime(Now, 4)) <= 0) Then
If InStr(strValue(i), "000") > 0 Then
If blMultiDevice Then
If Not hs.DeviceStatus(strHouseCode & Val(strDeviceCode) + i) = 3 Then
hs.Transmit(strHouseCode & Val(strDeviceCode) + i, "off")
hs.SetDeviceValue(strHouseCode & Val(strDeviceCode) + i, 0)
End If
hs.SetDeviceString(strHouseCode & Val(strDeviceCode) + i, WeerType(lngValueCommand, blRainInText) & " om " & strTime(i), True)
Else
If Not hs.DeviceStatus(strDevice) = 3 Then
hs.Transmit(strDevice, "off")
hs.SetDeviceValue(strDevice, 0)
End If
hs.SetDeviceString(strDevice, WeerType(lngValueCommand, blRainInText), True)
End If
Else
If blMultiDevice Then
If Not hs.DeviceStatus(strHouseCode & Val(strDeviceCode) + i) = 2 Then hs.Transmit(strHouseCode & Val(strDeviceCode) + i, "on")
hs.SetDeviceValue(strHouseCode & Val(strDeviceCode) + i, lngValueCommand.toString())
hs.SetDeviceString(strHouseCode & Val(strDeviceCode) + i, WeerType(lngValueCommand, blRainInText) & " om " & strTime(i), True)
Else
If Not hs.DeviceStatus(strDevice) = 2 Then hs.Transmit(strDevice, "on")
hs.SetDeviceValue(strDevice, lngValueCommand.toString())
hs.SetDeviceString(strDevice, WeerType(lngValueCommand, blRainInText), True)
End If
End If
ElseIf Not blMultiDevice Then
If (InStr(strValue(i), "000") > 0) and (i>0) Then
If Not (InStr(strValue(i - 1), "000") > 0) Then
hs.NewTimeEvent(strEvent, strTime(i), "", 1, 1, 1, 1, 1, 1, 1, strDevice & ":off", 1, "", "")
hs.AddAction(hs.GetEventRefByName(strEvent), 5, strValueCommand)
hs.AddAction(hs.GetEventRefByName(strEvent), 5, Chr(34) & "&hs.SetDeviceString(" & strDevice & ", " & Chr(34) & WeerType(lngValueCommand, blRainInText) & Chr(34) & "), True")
hs.EnableEvent(strEvent)
End If
ElseIf (InStr(strValue(i), "000") > 0) and (i=0) Then
hs.NewTimeEvent(strEvent, strTime(i), "", 1, 1, 1, 1, 1, 1, 1, strDevice & ":off", 1, "", "")
hs.AddAction(hs.GetEventRefByName(strEvent), 5, strValueCommand)
hs.AddAction(hs.GetEventRefByName(strEvent), 5, Chr(34) & "&hs.SetDeviceString(" & strDevice & ", " & Chr(34) & WeerType(lngValueCommand, blRainInText) & Chr(34) & "), True")
hs.EnableEvent(strEvent)
Else
hs.NewTimeEvent(strEvent, strTime(i), "", 1, 1, 1, 1, 1, 1, 1, strDevice & ":on", 1, "", "")
hs.AddAction(hs.GetEventRefByName(strEvent), 5, strValueCommand)
hs.AddAction(hs.GetEventRefByName(strEvent), 5, Chr(34) & "&hs.SetDeviceString(" & strDevice & ", " & Chr(34) & WeerType(lngValueCommand, blRainInText) & Chr(34) & ", True)")
hs.EnableEvent(strEvent)
End If
Else
If InStr(strValue(i), "000") > 0 Then
If Not hs.DeviceStatus(strHouseCode & Val(strDeviceCode) + i) = 3 Then
hs.Transmit(strHouseCode & Val(strDeviceCode) + i, "off")
hs.SetDeviceValue(strHouseCode & Val(strDeviceCode) + i, 0)
End If
hs.SetDeviceString(strHouseCode & Val(strDeviceCode) + i, WeerType(lngValueCommand, blRainInText) & " om " & strTime(i), True)
Else
If Not hs.DeviceStatus(strHouseCode & Val(strDeviceCode) + i) = 2 Then hs.Transmit(strHouseCode & Val(strDeviceCode) + i, "on")
hs.SetDeviceValue(strHouseCode & Val(strDeviceCode) + i, lngValueCommand.toString())
hs.SetDeviceString(strHouseCode & Val(strDeviceCode) + i, WeerType(lngValueCommand, blRainInText) & " om " & strTime(i), True)
End If
End If
Next
End Sub
Function WeerType(Value As Integer, blRainInText As Boolean) As String
If blRainInText Then
Select Case Value
Case 0 To 1
Return "<img align='absmiddle' src='images/NeerslagMonitor/no_rain.png'> Geen neerslag"
Case 2 To 100
Return "<img align='absmiddle' src='images/NeerslagMonitor/light_rain.png'> Lichte neerslag"
Case 101 To 500
Return "<img align='absmiddle' src='images/NeerslagMonitor/medium_rain.png'> Matige neerslag"
Case 501 To 2500
Return "<img align='absmiddle' src='images/NeerslagMonitor/heavy_rain.png'> Zware neerslag"
Case Is > 2500
Return "<img align='absmiddle' src='images/NeerslagMonitor/heavy_rain.png'> Wolkbreuk"
End Select
Else
Dim strTmp As String
Select Case Value
Case 0 To 1
strTmp = "<img align='absmiddle' src='images/NeerslagMonitor/no_rain.png'>"
Case 2 To 100
strTmp = "<img align='absmiddle' src='images/NeerslagMonitor/light_rain.png'>"
Case 101 To 500
strTmp = "<img align='absmiddle' src='images/NeerslagMonitor/medium_rain.png'>"
Case 501 To 2500
strTmp = "<img align='absmiddle' src='images/NeerslagMonitor/heavy_rain.png'>"
Case Is > 2500
strTmp = "<img src='images/NeerslagMonitor/heavy_rain.png'>"
End Select
Return strTmp & " " & Math.Round(Value/100, 2).toString() & " mm/uur"
End If
End Function
Even nog een note: Ik heb de script niet op neerslag kunnen testen. Ik heb diverse gps coordinaten gebruikt maar de gps pagina blijft de waarden 000 bevatten. Ik hoop dus dat het gaat werken, maar ga er wel van uit anders werkt dit ook niet bij bijv Robert zijn systeem.