Regen monitor script

Forum over Homeseer scripts (DUTCH forum)

Moderators: TANE, Ruud

Locked
Alexander
Global Moderator
Global Moderator
Posts: 1532
Joined: Sat Mar 10, 2007 11:19 pm
Location: Netherlands

Regen monitor script

Post 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
Alexander
Herbus
Member
Member
Posts: 363
Joined: Mon Mar 27, 2006 12:28 pm
Location: Netherlands

Re: Regen monitor script

Post by Herbus »

Leuk script, daar kunnen we wat mee! Bedankt voor het delen.
Herbus (Jos)
AshaiRey
Senior Member
Senior Member
Posts: 1310
Joined: Mon Feb 02, 2009 5:27 pm
Location: Netherlands
Contact:

Re: Regen monitor script

Post 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.
Bram
AshaiRey
Senior Member
Senior Member
Posts: 1310
Joined: Mon Feb 02, 2009 5:27 pm
Location: Netherlands
Contact:

Re: Regen monitor script

Post by AshaiRey »

Mooi is dat kan ik net het script gaan testen is de site overbelast...!
Bram
Herbus
Member
Member
Posts: 363
Joined: Mon Mar 27, 2006 12:28 pm
Location: Netherlands

Post by Herbus »

Vreemd, regent het dan bij jou? :-)
AshaiRey
Senior Member
Senior Member
Posts: 1310
Joined: Mon Feb 02, 2009 5:27 pm
Location: Netherlands
Contact:

Re: Regen monitor script

Post 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
Bram
User avatar
Snelvuur
Forum Moderator
Forum Moderator
Posts: 3156
Joined: Fri Apr 06, 2007 11:01 pm
Location: Netherlands
Contact:

Re: Regen monitor script

Post 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.
// Erik (binkey.nl)
Alexander
Global Moderator
Global Moderator
Posts: 1532
Joined: Sat Mar 10, 2007 11:19 pm
Location: Netherlands

Re: Regen monitor script

Post 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.
Alexander
Alexander
Global Moderator
Global Moderator
Posts: 1532
Joined: Sat Mar 10, 2007 11:19 pm
Location: Netherlands

Re: Regen monitor script

Post 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
Alexander
Alexander
Global Moderator
Global Moderator
Posts: 1532
Joined: Sat Mar 10, 2007 11:19 pm
Location: Netherlands

Re: Regen monitor script

Post 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.
Alexander
Esteban
Forum Moderator
Forum Moderator
Posts: 677
Joined: Sun Jan 13, 2008 6:39 pm
Location: Netherlands

Re: Regen monitor script

Post by Esteban »

Klinkt goed! Ik zal het dit weekend ook eens uitproberen. Kan goed van pas komen met dat weer de laatste dagen.
Alexander
Global Moderator
Global Moderator
Posts: 1532
Joined: Sat Mar 10, 2007 11:19 pm
Location: Netherlands

Re: Regen monitor script

Post 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.
Alexander
Bastiaan
Senior Member
Senior Member
Posts: 1257
Joined: Sat May 24, 2008 11:36 am
Location: Netherlands
Contact:

Re: Regen monitor script

Post by Bastiaan »

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

Bastiaan
drmacchi
Advanced Member
Advanced Member
Posts: 827
Joined: Wed Aug 08, 2007 5:48 pm
Location: Italy

Re: Regen monitor script

Post 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 :)
AshaiRey
Senior Member
Senior Member
Posts: 1310
Joined: Mon Feb 02, 2009 5:27 pm
Location: Netherlands
Contact:

Re: Regen monitor script

Post 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
Bram
Locked

Return to “Homeseer Scripts Forum”