chch-power/chch-power.py

120 lines
4.4 KiB
Python
Raw Normal View History

2017-02-04 22:15:11 +01:00
import pifacedigitalio
import pifacecommon.mcp23s17
2017-02-04 22:15:11 +01:00
import time
2017-02-05 00:41:08 +01:00
from subprocess import call
2017-02-18 21:17:52 +01:00
import sys
2017-02-04 22:15:11 +01:00
2017-02-18 21:17:52 +01:00
# dirty workaround to disable reset of output pins
def init_board_no_power_off(self):
ioconfig = (
pifacecommon.mcp23s17.BANK_OFF |
pifacecommon.mcp23s17.INT_MIRROR_OFF |
pifacecommon.mcp23s17.SEQOP_OFF |
pifacecommon.mcp23s17.DISSLW_OFF |
pifacecommon.mcp23s17.HAEN_ON |
pifacecommon.mcp23s17.ODR_OFF |
pifacecommon.mcp23s17.INTPOL_LOW
)
self.iocon.value = ioconfig
if self.iocon.value != ioconfig:
raise pifacedigitalio.NoPiFaceDigitalDetectedError(
"No PiFace Digital board detected (hardware_addr={h}, "
"bus={b}, chip_select={c}).".format(
h=self.hardware_addr, b=self.bus, c=self.chip_select))
else:
self.iodira.value = 0 # GPIOA as outputs
self.iodirb.value = 0xFF # GPIOB as inputs
self.gppub.value = 0xFF # input pullups on
self.enable_interrupts()
setattr(pifacedigitalio.PiFaceDigital, 'init_board', init_board_no_power_off)
2017-02-18 21:17:52 +01:00
button_count = 2
2017-02-04 22:15:11 +01:00
longpress_delay = 0.4
verylongpress_delay = 2
shortpress_count_max_delay = 0.5
inter_press_max_delay = 1
pin_last_rise_date = [0]*button_count
pin_last_shortpress = [0]*button_count
pin_shortpress_count = [0]*button_count
pifacedigital = pifacedigitalio.PiFaceDigital()
2017-02-18 21:17:52 +01:00
def chch_status_output(pfd):
2017-02-18 21:48:50 +01:00
f = open("/tmp/status", 'w')
2017-02-18 21:17:52 +01:00
status = "geschlossen"
for i in range(button_count):
if pfd.output_pins[i].value != 0:
status = "offen"
break
try:
f.truncate(0)
f.write(status)
except OSError:
sys.stderr("Can not write to status file\n")
2017-02-04 22:15:11 +01:00
def switch_pressed(event):
pin_last_rise_date[event.pin_num] = 0
time.sleep(0.02)
2017-02-18 21:17:52 +01:00
if event.chip.input_pins[event.pin_num].value != 0:
2017-02-04 22:15:11 +01:00
pin_last_rise_date[event.pin_num] = time.time()
def switch_unpressed(event):
if pin_last_rise_date[event.pin_num] != 0:
press_time = time.time() - pin_last_rise_date[event.pin_num]
if press_time < longpress_delay:
switch_shortpressed(event)
elif longpress_delay <= press_time and press_time < verylongpress_delay:
switch_longpressed(event)
else:
switch_verylongpressed(event)
pin_last_rise_date[event.pin_num] = 0
# toggle current room's power with a short and a long press
# call a script with two short and a long press
2017-02-04 22:15:11 +01:00
def switch_longpressed(event):
shortpress_delay = pin_last_rise_date[event.pin_num] - pin_last_shortpress[event.pin_num]
if shortpress_delay > inter_press_max_delay:
pin_shortpress_count[event.pin_num] = 0
elif pin_shortpress_count[event.pin_num] == 1:
event.chip.output_pins[event.pin_num].toggle()
elif pin_shortpress_count[event.pin_num] == 2:
if event.pin_num == 0:
call(["/root/chch-power/light.sh"])
2017-02-18 21:17:52 +01:00
chch_status_output(event.chip)
2017-02-04 22:15:11 +01:00
# switch all power off with a very long press
# switch all power on with a short and a very long press
2017-02-04 22:15:11 +01:00
def switch_verylongpressed(event):
shortpress_delay = pin_last_rise_date[event.pin_num] - pin_last_shortpress[event.pin_num]
if shortpress_delay > inter_press_max_delay:
pin_shortpress_count[event.pin_num] = 0
for i in range(button_count):
event.chip.output_pins[i].turn_off()
elif pin_shortpress_count[event.pin_num] == 1:
for i in range(button_count):
event.chip.output_pins[i].turn_on()
2017-02-18 21:17:52 +01:00
chch_status_output(event.chip)
2017-02-04 22:15:11 +01:00
def switch_shortpressed(event):
now = time.time()
if pin_shortpress_count[event.pin_num] == 0:
pin_last_shortpress[event.pin_num] = now
shortpress_delay = now - pin_last_shortpress[event.pin_num]
print(shortpress_delay)
if shortpress_delay > shortpress_count_max_delay:
pin_shortpress_count[event.pin_num] = 1
else:
pin_shortpress_count[event.pin_num] += 1
pin_last_shortpress[event.pin_num] = now
2017-02-18 21:17:52 +01:00
chch_status_output(event.chip)
2017-02-04 22:15:11 +01:00
print(["count:", pin_shortpress_count[event.pin_num]])
if __name__ == "__main__":
listener = pifacedigitalio.InputEventListener(chip=pifacedigital)
for i in range(button_count):
listener.register(i, pifacedigitalio.IODIR_ON, switch_pressed)
listener.register(i, pifacedigitalio.IODIR_OFF, switch_unpressed)
listener.activate()
2017-02-18 21:17:52 +01:00
pfd = pifacedigitalio.PiFaceDigital()
chch_status_output(pfd)