#! /usr/bin/python import os import stat import time import pifacedigitalio import requests import signal import sys import grp from ConfigParser import SafeConfigParser #Read config parser = SafeConfigParser() parser.read('/etc/foodoord.conf') doorapi = parser.get('doorstatus', 'status_url') consumerkey = parser.get('doorstatus', 'key') consumersecret = parser.get('doorstatus', 'secret') #Definitions for output LED_RED=6 LED_GREEN=7 RELAYS_LOCK=0 RELAYS_UNLOCK=1 #Definitions for input DOOR_BELL=0 REED_RELAYS=1 #not implementet yet #Definitions for LEDcolor RED=1 GREEN=2 ORANGE=3 if __name__ == "__main__": def doorbell(event): if (STATUS): pifacedigital.relays[RELAYS_UNLOCK].toggle() time.sleep(1.5) pifacedigital.relays[RELAYS_UNLOCK].toggle() def close_button(event): global STATUS STATUS = False write_state("closed") update_api(True) set_led(RED) listener = pifacedigitalio.InputEventListener() listener.register(0, pifacedigitalio.IODIR_RISING_EDGE, doorbell, settle_time=10) listener.register(1, pifacedigitalio.IODIR_RISING_EDGE, close_button, settle_time=5) listener.activate() def signal_handler(signal, frame): listener.deactivate() os.remove("/var/run/foodoord.pipe") write_state("closed") update_api(True) set_led(RED) sys.exit(0) def set_led(color): if (color==RED): pifacedigital.leds[LED_RED].turn_on() pifacedigital.leds[LED_GREEN].turn_off() elif (color==GREEN): pifacedigital.leds[LED_GREEN].turn_on() pifacedigital.leds[LED_RED].turn_off() elif (color==ORANGE): pifacedigital.leds[LED_RED].turn_on() pifacedigital.leds[LED_GREEN].turn_on() pifacedigital = pifacedigitalio.PiFaceDigital() signal.signal(signal.SIGTERM, signal_handler) signal.signal(signal.SIGINT, signal_handler) def write_state(state): try: handle = open("/tmp/door_state", "w") handle.write(state) handle.close() except: pass def update_api(locked): #if locked: # # try: # os.system("/usr/bin/mosquitto_pub -h mqtt.chaospott.de -t foobar/aerie/licht -m 'zentral-aus'") # except: # pass try: os.system("/usr/bin/curl -XPOST --header 'Content-Type: application/json' --data '{ \"consumer_key\": \"" + consumerkey + "\", \"consumer_secret\": \"" + consumersecret + "\", \"aerie\": " + str(locked).lower() + " }' '" + doorapi + "' ") except: pass #Startsettings STATUS = False pifacedigital.leds[LED_RED].turn_on() #Setting up FiFo to get sshd-output try: os.mkfifo("/var/run/foodoord.pipe") os.chown("/var/run/foodoord.pipe", -1, grp.getgrnam('foodoor')[2]) os.chmod("/var/run/foodoord.pipe", stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IWGRP) except OSError: pass with open("/var/run/foodoord.pipe", "r") as ssh_input: while 1: #Read sshd-output from pipe Pipe = ssh_input.readline()[:-1] if (Pipe == "close" and STATUS): pifacedigital.relays[RELAYS_LOCK].toggle() time.sleep(1) pifacedigital.relays[RELAYS_LOCK].toggle() STATUS = False write_state("closed") update_api(True) try: r = requests.get(url+'&door=aerie&locked=1', timeout=2) #print (r.status_code) r = requests.get(old_api+'&status=closed', timeout=2) #print (r.status_code) except: pass set_led(RED) elif (Pipe == "open"): pifacedigital.relays[RELAYS_UNLOCK].toggle() time.sleep(1.5) pifacedigital.relays[RELAYS_UNLOCK].toggle() if (STATUS==False): try: r = requests.get(url+"&door=aerie&locked=0", timeout=2) #print (r.status_code) r = requests.get(old_api+'&status=open', timeout=2) #print (r.status_code) except: pass update_api(False) write_state("open") STATUS = True set_led(GREEN) time.sleep(0.1)