move sensor event logging features out of sensor module
This commit is contained in:
parent
96d31adff7
commit
f936233244
21
sensors.py
21
sensors.py
|
@ -5,8 +5,10 @@ from threading import Timer
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
# this should never be higher than INFO or motion will never be logged
|
# this importantly controls which sensor events get logged. DEBUG logs
|
||||||
logger.setLevel(logging.DEBUG)
|
# everything, INFO logs only events that occur when state machine in
|
||||||
|
# "sensitive states" (armed, armedCountdown, triggered)
|
||||||
|
logger.setLevel(logging.INFO)
|
||||||
|
|
||||||
# delay GPIO init to avoid false positive during powerup
|
# delay GPIO init to avoid false positive during powerup
|
||||||
INIT_DELAY = 60
|
INIT_DELAY = 60
|
||||||
|
@ -32,15 +34,14 @@ def startMotionSensor(pin, location, action):
|
||||||
|
|
||||||
def trip(channel):
|
def trip(channel):
|
||||||
if lowPassFilter(pin, 1):
|
if lowPassFilter(pin, 1):
|
||||||
logger.info('detected motion: ' + location)
|
action(location, logger)
|
||||||
action()
|
|
||||||
|
|
||||||
logger.debug('waiting %s for %s to power on', INIT_DELAY, name)
|
logger.debug('waiting %s for %s to power on', INIT_DELAY, name)
|
||||||
t = Timer(INIT_DELAY, partial(_initGPIO, name, pin, GPIO.RISING, trip))
|
t = Timer(INIT_DELAY, partial(_initGPIO, name, pin, GPIO.RISING, trip))
|
||||||
t.daemon = True
|
t.daemon = True
|
||||||
t.start()
|
t.start()
|
||||||
|
|
||||||
def startDoorSensor(pin, action, sound=None):
|
def startDoorSensor(pin, action):
|
||||||
def trip(channel):
|
def trip(channel):
|
||||||
nonlocal closed
|
nonlocal closed
|
||||||
val = GPIO.input(pin)
|
val = GPIO.input(pin)
|
||||||
|
@ -48,15 +49,7 @@ def startDoorSensor(pin, action, sound=None):
|
||||||
if val != closed:
|
if val != closed:
|
||||||
if lowPassFilter(pin, val):
|
if lowPassFilter(pin, val):
|
||||||
closed = val
|
closed = val
|
||||||
if closed:
|
action(closed, logger)
|
||||||
logger.info('door closed')
|
|
||||||
if sound:
|
|
||||||
sound.play()
|
|
||||||
else:
|
|
||||||
logger.info('door opened')
|
|
||||||
if sound:
|
|
||||||
sound.play()
|
|
||||||
action()
|
|
||||||
|
|
||||||
_initGPIO('DoorSensor', pin, GPIO.BOTH, trip)
|
_initGPIO('DoorSensor', pin, GPIO.BOTH, trip)
|
||||||
closed = GPIO.input(pin)
|
closed = GPIO.input(pin)
|
||||||
|
|
|
@ -264,28 +264,41 @@ class StateMachine:
|
||||||
# start all managed threads (we retain ref to these to stop them later)
|
# start all managed threads (we retain ref to these to stop them later)
|
||||||
self._startManaged()
|
self._startManaged()
|
||||||
|
|
||||||
def action():
|
sensitiveStates = (self.states.armed, self.states.armedCountdown, self.states.triggered)
|
||||||
|
|
||||||
|
def sensorAction(location, logger):
|
||||||
|
level = logging.INFO if self.currentState in sensitiveStates else logging.DEBUG
|
||||||
|
logger.log(level, 'detected motion: ' + location)
|
||||||
if self.currentState == self.states.armed:
|
if self.currentState == self.states.armed:
|
||||||
self.selectState(_SIGNALS.TRIGGER)
|
self.selectState(_SIGNALS.TRIGGER)
|
||||||
|
|
||||||
sensitiveStates = (self.states.armed, self.states.armedCountdown, self.states.triggered)
|
def videoAction(location, logger, pin):
|
||||||
|
sensorAction(location, logger)
|
||||||
def actionVideo(pin):
|
|
||||||
if self.currentState in sensitiveStates:
|
if self.currentState in sensitiveStates:
|
||||||
self.selectState(_SIGNALS.TRIGGER)
|
|
||||||
self.fileDump.addInitiator(pin)
|
self.fileDump.addInitiator(pin)
|
||||||
while GPIO.input(pin) and self.currentState in sensitiveStates:
|
while GPIO.input(pin) and self.currentState in sensitiveStates:
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
self.fileDump.removeInitiator(pin)
|
self.fileDump.removeInitiator(pin)
|
||||||
|
|
||||||
# start non-managed threads (we forget about these because they can exit with no cleanup)
|
def doorAction(closed, logger):
|
||||||
startMotionSensor(5, 'Nate\'s room', action)
|
self.soundLib.soundEffects['door'].play()
|
||||||
startMotionSensor(19, 'front door', action)
|
|
||||||
startMotionSensor(26, 'Laura\'s room', action)
|
|
||||||
startMotionSensor(6, 'deck window', partial(actionVideo, 6))
|
|
||||||
startMotionSensor(13, 'kitchen bar', partial(actionVideo, 13))
|
|
||||||
|
|
||||||
startDoorSensor(22, action, self.soundLib.soundEffects['door'])
|
level = logging.INFO if self.currentState in sensitiveStates else logging.DEBUG
|
||||||
|
entry = 'door closed' if closed else 'door opened'
|
||||||
|
logger.log(level, entry)
|
||||||
|
|
||||||
|
if not closed and self.currentState == self.states.armed:
|
||||||
|
self.selectState(_SIGNALS.TRIGGER)
|
||||||
|
|
||||||
|
# start non-managed threads (we forget about these because they can exit with no cleanup)
|
||||||
|
startMotionSensor(5, 'Nate\'s room', sensorAction)
|
||||||
|
startMotionSensor(19, 'front door', sensorAction)
|
||||||
|
startMotionSensor(26, 'Laura\'s room', sensorAction)
|
||||||
|
|
||||||
|
startMotionSensor(6, 'deck window', partial(videoAction, pin=6))
|
||||||
|
startMotionSensor(13, 'kitchen bar', partial(videoAction, pin=13))
|
||||||
|
|
||||||
|
startDoorSensor(22, doorAction)
|
||||||
|
|
||||||
startWebInterface(self)
|
startWebInterface(self)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue