Sunrise/Sunset Watch Script

Forum over Homeseer scripts (DUTCH forum)

Moderators: TANE, Ruud

Post Reply
User avatar
mabarto
Starting Member
Starting Member
Posts: 3
Joined: Sun Mar 29, 2009 8:15 pm
Location: Netherlands
Contact:

Sunrise/Sunset Watch Script

Post by mabarto »

Na afgelopen workshop ben ik mij eens wat verder aan het verdiepen in HomeSeer, dit omdat zoals de meeste nu wel weten dit niet mijn favoriete scripttaal is, want ik zat al een tijdje met de volgende probleem ehh bedoel uitdaging.

Ik heb namelijk ook HomeSeer draaien op mijn HomeServer en heb niet zoals de meeste geavanceerde domomtica producten maar gewoon enkele ingebouwde x10 schakelaars icm bewegingsensorren en Plugwise apparatuur, that's all folks.

Omdat ik toch een beetje groen wilt zijn en mijn server niet 24/7 aan wilt hebben staan, tsjah ik heb nog geen x10 alarm of x10 camera's dus dan is dat nog niet nodig had ik een aantal uitdagingen.

Ik maak namelijk geen gebruik van de dag en nacht melding binnen de bewegingsensor omdat ik vind dat deze pas heel erg laat reageren.

Ik heb daarom een virtual device gemaakt genaamd MidNight op housecode A99 waar ik een event aan heb gekoppeld "Set Midnight Off" die er voor zorgt dat de virtual device uit gaat 15 minuten After Sunrise. Daarnaast heb ik een event "Set Midnight On" hoe kan het ook anders aan gaat 15 minuten before Sunset.

Dit werkt dus allemaal prima als je 24/7 je computer hebt aan staan.

Maar ik heb mijn computer zo getriggered dat hij tussen 2 uur 's-nachts en 7 uur 's-ochtends in slaapstand gaat en na 7 uur weer aan gaat. Als hij weer uit slaapmodus komt word uiteraard nooit meer "Set Midnight Off" getriggered omdat de tijd al verstreken is. Nu zou je denken om het in de startup script te verwerken maar HomeSeer word niet opnieuw gestart als de computer uit slaapmodus word gehaald. Daarnaast zou je nog denken aan de powerfailure optie maar dat werkt niet.

Wegens dit specifieke probleem in mijn huidige situatie was ik genoodzaakt om handmatig het event te triggeren, uiteraard heb ik daar geen zin in en heb ik een script gemaakt om dit te triggeren.

1. Maak een virtual device aan met de naam "Midnight" en zet deze op housecode A99
2. Maak een event aan met de naam "Set Midnight Off" met als trigger type Sunrise en Offset 15 Minutes en after
3. Maak een event aan met de naam "Set Midnight On" met als trigger type Sunset en offset 15 Minutes en Before

4. Maak een event aan met de naam 'WatchSunriseSunset'
5. Zet in het tabblad Trigger de Current Trigger Type op Recurring en Trigger Every 1 minutes
6. Bij tabblad Action maak je een nieuw script aan met de naam "WatchSunriseAndSunset.vb"
7. Bij optional Parameters zet je het volgende: ("Main", "Set Midnight Off;Set Midnight On")
Hierbij is "Set Midnight Off" het event dat ervoor zorgt dat de virtual device MidNight uit gaat 15 minuten after sunrise, zie punt 2
Hierbij is "Set Midnight On" het event dat ervoor zorgt dat de virtual device Midnight aan gaat 15 minuten before sunset, zie punt 3
8. Open Script Window en zet onderstaand script hierin, vergeet niet te klikken op Save Script om het script op te slaan en daarna Twee x Update.

Code: Select all


Sub Main(parm as object)

  ' declare sunrise and sunset properties
  Dim sunriseOffset, sunsetOffset, sunriseDate, sunsetDate, sunriseTime, sunsetTime, now As DateTime
  Dim sunriseRef, sunsetRef As Long
  Dim sunriseEvent, sunsetEvent As Scheduler.Classes.EventClass
  Dim sunriseEventName, sunsetEventName As String

  ' get first param with the name of the sunrise event
  sunriseEventName = hs.stringitem(parm, 1, ";")

  ' get second param with the name of the sunset event
  sunsetEventName = hs.stringitem(parm, 2, ";")

  ' get sunrise and sunset time
  sunriseTime = hs.sunrise
  sunsetTime = hs.sunset

  ' set sunrise and sunset date for comparing purposes because the month, year and day will not be set
  sunriseDate = new Date(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, sunriseTime.Hour, sunriseTime.Minute, 0)
  sunsetDate = new Date(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, sunsetTime.Hour, sunsetTime.Minute, 0)

  ' get event by name for sunrise and sunset
  sunriseRef = hs.GetEventRefByName(sunriseEventName)
  sunsetRef = hs.GetEventRefByName(sunsetEventName)

  ' get event for sunrise and sunset
  sunriseEvent = hs.GetEventByRef(sunriseRef)
  sunsetEvent = hs.GetEventByRef(sunsetRef)

  ' get offset for sunrise and sunset
  sunriseOffset = sunriseEvent.ev_offset
  sunsetOffset = sunsetEvent.ev_offset

  ' If true, ev_offset is subtracted from sunrise to get the trigger time. If false, ev_offset is added to sunrise to get the trigger time.
  If (sunriseEvent.ev_offset_before) Then
    sunriseDate = sunriseDate.AddMinutes(-sunriseOffset.Minute)
  Else
    sunriseDate = sunriseDate.AddMinutes(sunriseOffset.Minute)
  End If

  ' If true, ev_offset is subtracted from sunset to get the trigger time. If false, ev_offset is added to sunset to get the trigger time.
  If (sunsetEvent.ev_offset_before) Then
    sunsetDate = sunsetDate.AddMinutes(-sunsetOffset.Minute)
  Else
    sunsetDate = sunsetDate.AddMinutes(sunsetOffset.Minute)
  End If

  ' The today date
  now = DateTime.Now

  ' The now date is later or equal then the sunrise date AND the now date is earlier or equal then the sunset date
  If (DateTime.Compare(now, sunriseDate) >= 0 AND DateTime.Compare(now, sunsetDate) <= 0) Then
    hs.TriggerEvent(sunriseEventName)
    hs.writelog("info", "WatchSunriseAndSunset: Triggering event for daylight")
  Else
    hs.TriggerEvent(sunsetEventName)
    hs.writelog("info", "WatchSunriseAndSunset: Triggering event for midnight")
  End If

End Sub
9. Uiteraard moet je nu alleen even een conditie toevoegen bij ieder event die controleerd of de device Midnight aan of uit staat. In mijn specifieke geval heb ik deze
gekoppeld aan mijn bewegingssensorren zodat de lamp alleen aan gaat als de Midnight op On staat.

That's all folks!

Ik denk ik deel dit specifieke script met jullie maar waarschijnlijk heeft iedereen zijn server 24/7 aan staan waardoor dit probleem niet voorkomt of dat jullie een nog
ingenieus systeem hebben zoals een sensor buiten die nacht en dag detecteerd. Maar ik als simpele domotica starter ben hier even mee geholpen en ben van plan om dit
op late termijn zeker anders te doen maar nu werkt het.

Ondanks dat hoop ik toch dat iemand er misschien wat aan heeft.
Website: http://www.markbarto.nl, Twitter: http://twitter.com/markbarto,
User avatar
TANE
Forum Moderator
Forum Moderator
Posts: 4806
Joined: Fri Apr 06, 2007 9:46 pm
Location: Netherlands
Contact:

Re: Sunrise/Sunset Watch Script

Post by TANE »

Mark,
I/O devices en slaapstand gaat niet altijd goed.
Veel devices zullen verbinding verliezen en starten niet meer op.

Wat ook een mogelijke opties is om Homeseer af te sluiten voordat je server naar slaapstand gaat.
Bij opstart kan je dan aangeven dat een event alsnog uitgevoerd moet worden als deze gemist is.
Enver Tanriverdi | http://blog.tane.nl
User avatar
mabarto
Starting Member
Starting Member
Posts: 3
Joined: Sun Mar 29, 2009 8:15 pm
Location: Netherlands
Contact:

Re: Sunrise/Sunset Watch Script

Post by mabarto »

Tane,

Bedankt voor je tip. Ik heb naar die addin LightsOut gekeken die ik binnen HomeServer gebruik en binnen deze addin was een instelling om een service te stoppen als hij in standby gaat en te starten als hij weer wakker word. Hier heb ik HomeSeerService aan toegevoegd. Ik was niet in veronderstelling dat deze optie erin zit maar je antwoord gaf mij een reden om even verder te kijken.

Nu moet je stap 4 t/m 8 overslaan en een bestand aanmaken in de scripts directory van HomeSeer met de naam "WatchSunriseAndSunset.vb" en daarna het script bij stap 8 plaatsen en opslaan.

Nu wijzig je het script startup.txt en voeg je de twee laatste regeles aan het script toe.

Code: Select all

' this is the startup script
' it is run once when HomeSeer starts up
' 
' this is a good place to default status on some devices
'
sub main()
	hs.WriteLog "Startup","Scripting is OK"

	' if speaker client is not running, start it
	if not hs.IsApplicationRunning("Speaker") then
		hs.Launch hs.GetAppPath & "\Speaker.exe","","",0
	end if

	' speak
	'hs.speak "Welcome to Home-Seer",TRUE

	' add calls startup scripts and function calls here
                hs.WriteLog "Startup","Starting Watching Sunrise and Sunset"
	hs.RunEx "WatchSunriseAndSunset.vb","Main","Set Midnight Off;Set Midnight On"
	
end sub
Nu word het script eenmalig uitgevoerd bij het starten van HomeSeer ipv dat er om de minuut gekeken word.
Website: http://www.markbarto.nl, Twitter: http://twitter.com/markbarto,
Post Reply

Return to “Homeseer Scripts Forum”