Hi,
I have a RPi Model B with a PiRack and 2 PiFaces I'm using for a home security/monitoring system. I've written the whole thing in Python, and it seems to be working pretty well so far with one problem. I'm using a number of the input lines on one PiFace for door sensors, and I have it configured it to generate an interrupt when the door opens. I was receiving occasional spurious interrupts from a couple of far away sensors (all hardwired), so I added a check in my interrupt handler to look at the input line and verify that the door really was open. Here the snippet of code that handles it:
#Function for handling door open/close events
def door_event(event):
#print('In door event: pin - ' + str(event.pin_num))
pf0 = pf.PiFaceDigital(hardware_addr=0)
if event.direction == const.DOOR_OPENED:
#Check the pin to see if the door is really open (spurious interrupt check)
if pf0.input_pins[event.pin_num].value != const.DOOR_IS_OPEN:
#False alarm
log_entry('Got spurious open interrupt for ' + const.door_names[event.pin_num])
return
log_entry(const.door_names[event.pin_num] + ' opened')
config.door_state[event.pin_num] = const.DOOR_OPEN
#Notify central
send_to_central('HOUSE_EVENT DOOR ' + const.door_names[event.pin_num] + ' OPENED')
It seemed to take care of the problem for several weeks, but all of a sudden the app would crash with a 'too many files open' traceback on the 'pf0=pf.PiFaceDigital(hardware_addr=0)' line, which I assume means that 'pf0' is being opened every time I get the interrupt but never closed. I'm far from a Python expert (this home monitoring system is my first Python effort, but I've been programming in many other languages for decades), so I'd appreciate any recommendations anyone could provide on how to handle this. My assumption is that I can do one of 3 things:
- Make 'pf0' global and open it once at startup time, then reference it in the interrupt handler as necessary
- Close pf0 when I'm done with it (not sure how to do this)
- Reference pf0 through the 'event' data structure provided to the interrupt (but I can't find any documentation on exactly what it contains)
Any thoughts?
Thanks.
John




