Skip to content

Instantly share code, notes, and snippets.

@ari
Created November 10, 2014 05:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ari/667850d6c5e010cdf761 to your computer and use it in GitHub Desktop.
Save ari/667850d6c5e010cdf761 to your computer and use it in GitHub Desktop.
watering system
#!/usr/bin/python
import json
import urllib
import time, sys, getopt, subprocess
from decimal import *
from simpleusbrelay import simpleusbrelay
def main(argv):
# set all decimal math to 4 sig fig
getcontext().prec = 4
try:
opts, args = getopt.getopt(argv,"o",["off"])
except getopt.GetoptError:
print "water.py [-o]"
sys.exit(2)
for opt, arg in opts:
if opt == "-o":
print "Turning everything off."
off('all')
sys.exit()
# Base duration in minutes
duration = Decimal(12)
bom_url = "http://www.bom.gov.au/fwo/IDN60901/IDN60901.94768.json"
# Fetch the rainfall measurement
weather_json = json.loads ( urllib.urlopen(bom_url).read() )
# rain since 9am
rainfall = Decimal(weather_json["observations"]["data"][0]["rain_trace"])
temperature = 0 + Decimal(weather_json["observations"]["data"][0]["air_temp"])
print "%smm of rain fell since 9am." % rainfall
print "It is %s degrees Celsius now." % temperature
# Reduce watering duration by 2 minutes for every mm of rain
duration = duration - ( rainfall * 2 )
# And reduce it if it is cold
if temperature < 20:
duration = duration - ( 20 - temperature)/2
if duration < 1:
print "Watering will not run today."
sys.exit
else:
print "Watering will run for %s minutes." % duration
on(1)
on(2)
cmd = 'echo "/usr/bin/python2.7 /var/www/localhost/htdocs/watering/function/off.py" | at now + ' + str(int(duration)) + ' minutes'
proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
# Turn off one of the relays
def off(relay):
relaycontroller = simpleusbrelay(Vendor = 0x16c0, Product = 0x05df)
relaycontroller.array_off(relay)
# Turn on one of the relays
def on(relay):
relaycontroller = simpleusbrelay(Vendor = 0x16c0, Product = 0x05df)
relaycontroller.array_on(relay)
if __name__ == "__main__":
main(sys.argv[1:])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment