Page 1 of 13
Regen monitor script
Posted: Tue Jul 13, 2010 10:04 pm
by Alexander
Onderstaand script heb ik lekker snel in elkaar kunnen zetten. Het uitvoerig testen ervan is ook nog niet gebeurd. Bij mij zal het volgens de buienradar over een half uur gaan regenen en dat werkt nu. Ik moet alleen het moment dat het weer opklaart nog testen of dat werkt.
Goed, het script controleert in de webpagina van weeronline of er regen in het gebied komt. Zo ja, dan zal er een event aangemaakt worden die 1malig uitgevoerd wordt (en daarna dus verwijderd wordt door HS) en een device op on zet. Ook dit moet gelden wanneer het opklaart.
Ik heb het script opgeslagen als regenmonitor.vb en een recurring event iedere 5 minuten die dit script uitvoert.
In het script moet je nog even de geoAreaId aanpassen en het device de juiste code geven. Bij mijn zijn virtuele devices met een housecode "v". Dus overal waar je v7 onder in dit script voorbij ziet komen moet je vervangen door de juiste code. (wel dus even een virtual device aanmaken of beter een status only! Ik heb deze de naam "regen" gegeven.)
De GeoAreaId kun je achterhalen door naar de website te gaan (
http://www.weeronline.nl) en rechtsboven in het veld bij "het weer in" de plaats invullen. Niet enter drukken, wachten op een pulldown menu. Hover over de plaats die je wilt hebben en je ziet in de statusbalk van je browser een id aan het eind staat. Dat id moet je in het script vermelden (zie 3de regel van het script).
Code: Select all
Sub Main(ByVal Params As String)
Dim strData As String
strData = hs.GetURL("www.weeronline.nl","/Go/WeatherForecast/GetRainForecast?geoAreaId=4058004", True, 80)
If (InStr(strData, "geen buien vanaf") > 0) Then
If (hs.DeviceStatus("v7") = 2) Then
If Not hs.eventexists("geen regen vanaf") Then
hs.newtimeevent("geen regen vanaf", Mid(strData, InStr(strData, "vanaf ")+6, 5), FormatDateTime(Now,2), 1, 1, 1, 1, 1, 1, 1, "v7:off", 1, "", "")
hs.enableevent("geen regen vanaf")
End If
End If
Else
If (hs.DeviceStatus("v7") = 3) Then
If Not hs.eventexists("regen vanaf") Then
hs.newtimeevent("regen vanaf", Mid(strData, InStr(strData, "vanaf ")+6, 5), FormatDateTime(Now,2), 1, 1, 1, 1, 1, 1, 1, "v7:on", 1, "", "")
hs.enableevent("regen vanaf")
End If
End If
End If
End Sub
Have fun! Denk bijv aan het laten melden door HS als er regen op komst is, zodat de was nog even snel naar binnen gehaald kan worden of de zonweringen dicht moeten, e.d. Ik ben benieuwd waar jij het voor gaat gebruiken!! Leuk om elkaars idee-en te delen.
Versie 2.51 op pagina 10 is momenteel de laatste versie
Re: Regen monitor script
Posted: Wed Jul 14, 2010 8:43 am
by Herbus
Leuk script, daar kunnen we wat mee! Bedankt voor het delen.
Re: Regen monitor script
Posted: Wed Jul 14, 2010 9:45 am
by AshaiRey
Leuk idee, bedankt.
Nog even een opmerking om het werkende te krijgen.
Als je een status only device aanmaakt dan heeft deze de status unknown en zal daardoor niet gezet worden als het event getriggerd wordt.
Dus van te voren even het device een ON of een OFF status geven. Je kan het script natuurlijk ook aanpassen.
Re: Regen monitor script
Posted: Wed Jul 14, 2010 5:02 pm
by AshaiRey
Mooi is dat kan ik net het script gaan testen is de site overbelast...!
Posted: Wed Jul 14, 2010 6:22 pm
by Herbus
Vreemd, regent het dan bij jou?

Re: Regen monitor script
Posted: Wed Jul 14, 2010 9:26 pm
by AshaiRey
Omdat ik het idee wel leuk vond ben ik wat gaan stoeien met de code. Het viel me op dat het uitschakelen niet helemaal soepeltjes ging. Daarom heb ik het script wat eenvoudiger gemaakt.
Het idee erachter is om een virtual device (status only) van status wordt veranderd. Deze status change triggers een event waarin dan de afhandeling gebuerd die je wilt doen.
In mijn geval wordt er over mijn audio systeem omgeroepen dat het zo gaat regenen.
Code: Select all
Sub Main(ByVal Params As String)
Dim strData As String
Dim DeviceCode As String
DeviceCode = "x20" 'The device code of the device to set
strData = hs.GetURL("www.weeronline.nl","/Go/WeatherForecast/GetRainForecast?geoAreaId=4058706", True, 80)
' Device status is unknown, so set it to OFF
If (hs.DeviceStatus(DeviceCode) = 17) Then hs.ExecX10(DeviceCode,"Off")
If (InStr(strData, ": geen buien vanaf") > 0) Then
If (hs.DeviceStatus(DeviceCode) = 2) Then hs.ExecX10(DeviceCode,"Off")
End If
If (InStr(strData, ": buien vanaf") > 0) Then
If (hs.DeviceStatus(DeviceCode) = 3) Then hs.ExecX10(DeviceCode,"On")
End If
End Sub
Re: Regen monitor script
Posted: Thu Jul 15, 2010 12:11 am
by Snelvuur
Overigens.. ik kwam ook
http://www.weeronline.nl/Go/FlashCharts ... Id=4057877 nog tegen. Ik weet niet of dit handiger is met uitlezen, of meer bulletproof is b.v. maar dat weten jullie vast beter.
Re: Regen monitor script
Posted: Thu Jul 15, 2010 1:20 am
by Alexander
Dat kan ook handig zijn. Intussen heb ik de code aangepast met een aantal extra checks. Dat de website "offline" was, was voor mij wel weer handig

Update volgt vandaag.
Re: Regen monitor script
Posted: Thu Jul 15, 2010 11:24 am
by Alexander
Code: Select all
' RegenMonitor.vb script
' Author: Alexander W
' Version: 1.1
' Last Update: 15-07-2010 11:20
' ChangeLog:
' 1.0: Initial
' 1.1: - Added the ability to stop the script if the website doesn't return a known text, if that is the case the device will get the status unknown.
' - If the website would update the rain prediction to a lower time, the event that is already created will get the earlier condition.
' - If the time of the rain prediction is suddenly earlier that the current time, the device will be set instantly and earlier created event is deleted.
' - Parameters have to be added. Example ("Main","4057886;v7"). First is the geoAreaId and second is the device.
' - First code optimization
' - Code fault in handling if rain is predicted was not defined
Sub Main(ByVal Params As String)
Dim strGeoAreaId As String = hs.StringItem(Params, 1, ";")
Dim strDevice As String = hs.StringItem(Params, 2, ";")
Dim strData As String = hs.GetURL("www.weeronline.nl", "/Go/WeatherForecast/GetRainForecast?geoAreaId=" & strGeoAreaId, True, 80)
If (Not InStr(strData, "Buienverwachting komende 2 uur in") > 0) Then
hs.WriteLog("RegenMonitor", "Website weeronline.nl down")
hs.SetDeviceStatus(strDevice, 17)
hs.SetDeviceLastChange(strDevice, Now)
Else
Dim strDataNew As String = strData.SubString(43, InStr(strData, " De browser ondersteunt geen Flash.") - 71)
strData = strDataNew
Dim dtTime As Date = Mid(strData, InStr(strData, "vanaf ") + 6)
hs.WriteLog("RegenMonitor", strData) ' Even loggen of subset van de tekst op de webpagina klopt.
hs.SetDeviceString(strDevice, strdata, True)
Select Case hs.DeviceStatus(strDevice)
Case 2 ' Device is ON
If (InStr(strData, "geen buien vanaf") > 0) Then
If (DateTime.Compare(dtTime, FormatDateTime(Now, 4)) < 0) Then
hs.Transmit(strDevice, "off")
If hs.EventExists(strDevice & " OFF") Then hs.DeleteEvent(strDevice & " OFF")
ElseIf Not hs.EventExists(strDevice & " OFF") Then
hs.NewTimeEvent(strDevice & " OFF", dtTime, FormatDateTime(Now, 2), 1, 1, 1, 1, 1, 1, 1, strDevice & ":off", 1, "", "")
hs.EnableEvent(strDevice & " OFF")
Else
Dim lngEventRef As Long = hs.GetEventRefByName(strDevice & " OFF")
Dim objCurrentEvent As Object = hs.GetEventByRef(lngEventRef)
If (DateTime.Compare(dtTime, objCurrentEvent.ev_time) < 0) Then
hs.ClearConditions(lngEventRef)
hs.AddCondition(lngEventRef, 0, 8, 0, dtTime)
End If
End If
End If
Case 3, 17
If (Not InStr(strData, "geen buien vanaf") > 0) Then
If (DateTime.Compare(dtTime, FormatDateTime(Now, 4)) < 0) Then
hs.Transmit(strDevice, "on")
If hs.EventExists(strDevice & " ON") Then hs.DeleteEvent(strDevice & " ON")
ElseIf Not hs.EventExists(strDevice & " ON") Then
hs.NewTimeEvent(strDevice & " ON", dtTime, FormatDateTime(Now, 2), 1, 1, 1, 1, 1, 1, 1, strDevice & ":on", 1, "", "")
hs.EnableEvent(strDevice & " ON")
Else
Dim lngEventRef As Long = hs.GetEventRefByName(strDevice & " ON")
Dim objCurrentEvent As Object = hs.GetEventByRef(lngEventRef)
If (DateTime.Compare(dtTime, objCurrentEvent.ev_time) < 0) Then
hs.ClearConditions(lngEventRef)
hs.AddCondition(lngEventRef, 0, 8, 0, dtTime)
End If
End If
End If
End Select
End If
End Sub
Re: Regen monitor script
Posted: Thu Jul 15, 2010 11:29 am
by Alexander
AshaiRey wrote:In mijn geval wordt er over mijn audio systeem omgeroepen dat het zo gaat regenen.
Dat is inderdaad ook een prima oplossing. Alleen kan het zo maar zijn dat het over 2 uur pas gaat regenen.
Re: Regen monitor script
Posted: Thu Jul 15, 2010 11:35 am
by Esteban
Klinkt goed! Ik zal het dit weekend ook eens uitproberen. Kan goed van pas komen met dat weer de laatste dagen.
Re: Regen monitor script
Posted: Thu Jul 15, 2010 12:11 pm
by Alexander
Kunnen jullie ook verifieren of de log die gemaakt wordt, ook klopt met datgene wat ik hier op een "nog vage" manier eruit knip:
strData.SubString(43, InStr(strData, " De browser ondersteunt geen Flash.") - 71)
Bij mij staat in de logging:
Nieuwerkerk aan den IJssel : geen buien vanaf 11:10
Ik ben even benieuwd of deze hele string ook zo bij jullie is. Dus beginletter van de plaats en eindigt met de tijd.
Re: Regen monitor script
Posted: Thu Jul 15, 2010 12:50 pm
by Bastiaan
Alexander, bij mij verschijnt het prima in de log files:
Amsterdam : geen buien vanaf 12:25
Bastiaan
Re: Regen monitor script
Posted: Thu Jul 15, 2010 1:01 pm
by drmacchi
I guys, i'd like to test it. Now i'm google translating from Dutch (not 100% optimal). Is it right that i must change v7 with my device code ? only v7 or other values in the string?
Thanks Alexander for sharing

Re: Regen monitor script
Posted: Thu Jul 15, 2010 1:17 pm
by AshaiRey
Let me see if i can help you
Goto
http://www.weeronline.nl
In the right top corner there is a search box and fill in your location
for example rome
The page will refresh and now have a look at the URL
http://www.weeronline.nl/Europa/Italie/Rome/4297322
4297322 is the city code for Rome
Now get the latest version of this script and save it.
* I just check but i am afraid that the script won't worg for you because there isn't any information returned
PLEASE NOTE THAT THE WORD Main at the top of the script is written as main (all lower case)
Create an event that starts this script
Open up the advance setting panel when selecting the script
Fill in under parameters ("main", "4297322;<device code to set>")
And save
Thats it