2015-03-15

The Magic starts at 3:30AM... because at 3:30AM every day, a cron task runs on the chicken coop computer to determine when the coop door should open and close later that day. For most of my weather needs I had been using the http://wunderground.com API, but for some reason, they don't offer access to twilight data through the API and I didn't want to write a webpage scraper to harvest the data from their website.

Fortunately for me, hamweather.com has a wonderful API accessible weather service with great documentation, all at a very reasonable price (free, if making less than 750 API calls per day).

For this piece of the project, I decided to use civil twilight as the opening and closing times. Then it was just a matter of reading the hamweather API documentation for sun and moon data and then hacking together some code. Since the majority of the code is written in Python, I opted to use python for this script.

Enter the Python

#!/usr/bin/env python2
import urllib
import json
import os.path
import subprocess
import time

client_id "MY_CLIENT_ID"
client_secret "MY_CLIENT_SECRET"
url="http://api.aerisapi.com/sunmoon/MY_CLOSEST_TOWN?client_id=%s&client_secret=%s" % (client_idclient_secret)

print url

script_dir os.path.dirnameos.path.realpath(__file__) )
data_file os.path.join(script_dir'sunmoon.json')
open_script os.path.join(script_dir,"open_door.sh")
close_script os.path.join(script_dir,"close_door.sh")

try:
  #read the data from the url and write it to a file
  response urllib.urlopen(url)
  data response.read()
  open(data_file"w")
  f.write(data)
  f.close()
except:
  #something failed, open the old data file
  open(data_file,'r')
  data f.read()

#load the json into an object
json_object json.loads(data)

#get the twilight from the json object
twilight json_object['response'][0]['sun']['twilight']

#get the twilight start and end
civilbegin twilight['civilBegin']
civilend twilight['civilEnd']

#format the start and end times in Hour:Minute format
twilight_start time.strftime("%H:%M"time.localtime(civilbegin))
twilight_end time.strftime("%H:%M",time.localtime(civilend))

#create commands based on the times
open_cmd =  "at -f "+open_script +' '+twilight_start
close_cmd =  "at -f "+close_script +' 'twilight_end

#run the commands as a subprocess
subprocess.call(open_cmdshell=True)
subprocess.call(close_cmdshell=True)

During the event loop of my door controller, a file is checked to see if the door should open or close, and the door behaves accordingly. This twilight fetching script will determine when to open and close the door, and submits a command to at, which then handles the timing for running the open or close script.

The chickens will be going into their new home next weekend, and the close time will probably need to be adjusted, but that just means I need to hang out in the hammock at sunset/twilight and see if all the chickens go in the coop before the door closes.

Now quit reading, and go make something that can only be tested by relaxing in a hammock at sunset. :)

Comments
2015-06-28 Tim Diskataneous:
Nice work. I'm looking for my first project and it's cool to see what you made. I bet the chickens wonder who opens and closes the door every day!
Name:
not required
Email:
not required (will not be displayed)
Website:
not required (will link your name to your site)
Comment:
required
Please do not post HTML code or bbcode unless you want it to show up as code in your post. (or if you are a blog spammer, in which case, you probably aren't reading this anyway).
Prove you are human by solving a math problem! I'm sorry, but due to an increase of blog spam, I've had to implement a CAPTCHA.
Problem:
4 minus 1
Answer:
required
  • Tags:
  • Python
subscribe
 
2016
2015
2014
2013
2012
2011
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008