Regen monitor script

Forum over Homeseer scripts (DUTCH forum)

Moderators: TANE, Ruud

Regen monitor script

Postby Alexander » Tue Jul 13, 2010 9:04 pm

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
Alexander
Alexander
Global Moderator
Global Moderator
 
Posts: 1532
Joined: March 2007
Location: Netherlands

Re: Regen monitor script

Postby Herbus » Wed Jul 14, 2010 7:43 am

Leuk script, daar kunnen we wat mee! Bedankt voor het delen.
Herbus (Jos)
Herbus
Member
Member
 
Posts: 362
Joined: March 2006
Location: Netherlands

Re: Regen monitor script

Postby AshaiRey » Wed Jul 14, 2010 8:45 am

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.
Bram
AshaiRey
Senior Member
Senior Member
 
Posts: 1308
Joined: February 2009
Location: Netherlands

Re: Regen monitor script

Postby AshaiRey » Wed Jul 14, 2010 4:02 pm

Mooi is dat kan ik net het script gaan testen is de site overbelast...!
Bram
AshaiRey
Senior Member
Senior Member
 
Posts: 1308
Joined: February 2009
Location: Netherlands

Postby Herbus » Wed Jul 14, 2010 5:22 pm

Vreemd, regent het dan bij jou? :-)
Herbus
Member
Member
 
Posts: 362
Joined: March 2006
Location: Netherlands

Re: Regen monitor script

Postby AshaiRey » Wed Jul 14, 2010 8:26 pm

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
Bram
AshaiRey
Senior Member
Senior Member
 
Posts: 1308
Joined: February 2009
Location: Netherlands

Re: Regen monitor script

Postby Snelvuur » Wed Jul 14, 2010 11:11 pm

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.
// Erik (binkey.nl)
User avatar
Snelvuur
Forum Moderator
Forum Moderator
 
Posts: 3156
Joined: April 2007
Location: Netherlands

Re: Regen monitor script

Postby Alexander » Thu Jul 15, 2010 12:20 am

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.
Alexander
Alexander
Global Moderator
Global Moderator
 
Posts: 1532
Joined: March 2007
Location: Netherlands

Re: Regen monitor script

Postby Alexander » Thu Jul 15, 2010 10:24 am

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
Alexander
Alexander
Global Moderator
Global Moderator
 
Posts: 1532
Joined: March 2007
Location: Netherlands

Re: Regen monitor script

Postby Alexander » Thu Jul 15, 2010 10:29 am

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.
Alexander
Alexander
Global Moderator
Global Moderator
 
Posts: 1532
Joined: March 2007
Location: Netherlands

Re: Regen monitor script

Postby Esteban » Thu Jul 15, 2010 10:35 am

Klinkt goed! Ik zal het dit weekend ook eens uitproberen. Kan goed van pas komen met dat weer de laatste dagen.
Esteban
Forum Moderator
Forum Moderator
 
Posts: 677
Joined: January 2008
Location: Netherlands

Re: Regen monitor script

Postby Alexander » Thu Jul 15, 2010 11:11 am

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.
Alexander
Alexander
Global Moderator
Global Moderator
 
Posts: 1532
Joined: March 2007
Location: Netherlands

Re: Regen monitor script

Postby Bastiaan » Thu Jul 15, 2010 11:50 am

Alexander, bij mij verschijnt het prima in de log files:
Amsterdam : geen buien vanaf 12:25

Bastiaan
Bastiaan
Senior Member
Senior Member
 
Posts: 1255
Joined: May 2008
Location: Netherlands

Re: Regen monitor script

Postby drmacchi » Thu Jul 15, 2010 12:01 pm

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 :)
drmacchi
Advanced Member
Advanced Member
 
Posts: 827
Joined: August 2007
Location: Italy

Re: Regen monitor script

Postby AshaiRey » Thu Jul 15, 2010 12:17 pm

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
Bram
AshaiRey
Senior Member
Senior Member
 
Posts: 1308
Joined: February 2009
Location: Netherlands

Next

Return to Homeseer Scripts Forum

Who is online

Users browsing this forum: No registered users and 1 guest

cron