#!/usr/bin/python

####### Drinking Dog v 1.0 ######
#### by Acmecorporation #########
#### At line 25 set time to empty water bowl, actually 20 seconds
#### Line 59 to 61 to set temperature range 
#### if you are using another GrovePi relay instead of generic relay,
#### comment line 21,67,73 and uncomment line 23,31,68,74

import os
import time
from grovepi import *
import datetime
import RPi.GPIO as GPIO
from time import sleep
import sys
# The script as below using BCM GPIO 00..nn numbers
GPIO.setmode(GPIO.BCM)

# Set relay pins as output
GPIO.setup(22, GPIO.OUT) # comment in case of grovepi relay i/o generic relay

#Relay_pins = 3 if you want use other grovepi relay
Relay_pinc = 6
scarico = 20 # seconds needed to empty water bowl
ultrasonic_ranger = 4
dht_sensor_port = 8
button = 2
led = 5

#pinMode(Relay_pins,"OUTPUT") if you want use other grovepi relay
pinMode(Relay_pinc,"OUTPUT")
pinMode(button,"INPUT")
pinMode(led,"OUTPUT")
def restart_program():
	python = sys.executable
	os.execl(python, python, * sys.argv)
systop = 0

while True:
	# if button has been pressed
	if systop == 1:
		break 

	# maximum excursion between empting/filling the bowl-selected 4 hours
	delta = 2

	
	

	# get temperature value
	[ temp,hum ] = dht(dht_sensor_port,0)
	temperatura = int(temp)
	print temperatura

	# set max hours between bowl empting/filling ( 2 to 4 hours )
	
	
	if temperatura > 18 and temperatura < 25:
		delta = 1
	if temperatura >= 25:
		delta = 0
	print delta
	time.sleep(1)

	# Relay on GPIO 22 svuotamento ciotola
	GPIO.output(22, GPIO.LOW)
	#digitalWrite(Relay_pins,1)
	print "scarico iniziato"
	time.sleep(scarico)

	# Relay on GPIO 22 fine svuotamento
	GPIO.output(22, GPIO.HIGH)
	#digitalWrite(Relay_pins,0)
	print "scarico finito"
	time.sleep(5) 

	now = datetime.datetime.now().hour
	print now
	ora = datetime.datetime.now().hour
	print ora

	# water bowl filling
	while ora >= now and ora <= now + delta: 
		try:
		    digitalWrite(led,1)
		    pinMode(Relay_pinc,"OUTPUT")
		    ora = datetime.datetime.now().hour
		    if ora == 00:
			digitalWrite(Relay_pinc,0)
			digitalWrite(led,0)
			restart_program()
		    distant = ultrasonicRead(ultrasonic_ranger)
		    print distant,'cm' , ora , now, now + delta
		    if distant > 45:
		    	distant = 0
		    if distant > 28: # set maximum water level (cm)
		 	digitalWrite(Relay_pinc,1)
			print "filling"
			time.sleep(1)
		    else:
			digitalWrite(Relay_pinc,0)
			time.sleep(1)
			print "stop filling"
		    button_status= digitalRead(button)
		    if button_status > 1:
			button_status = 0
		    if button_status:
			digitalWrite(Relay_pinc,0)
			systop = 1
			break
		except KeyboardInterrupt:
		    digitalWrite(led,0)
		    break
		except TypeError:
        	    print "Error"
    		except IOError:
        	    print "Error"
	digitalWrite(Relay_pinc,0)
	digitalWrite(led,0)
	time.sleep(1)
	print "fine"
	os.system("shutdown -h now")
