90 lines
2.2 KiB
Python
Executable file
90 lines
2.2 KiB
Python
Executable file
#!/usr/bin/env python
|
|
|
|
import ConfigParser
|
|
import os
|
|
import os.path
|
|
import sqlite3
|
|
import time
|
|
|
|
import RPi.GPIO as GPIO
|
|
from Adafruit_IO import *
|
|
|
|
# Handle a simple configuration file:
|
|
config = ConfigParser.RawConfigParser()
|
|
config.read('mousetrap.cfg')
|
|
trap_pin = config.getint('sensors', 'trap_pin')
|
|
pir_pin = config.getint('sensors', 'pir_pin')
|
|
|
|
print "Adafruit MouseLogger v0.1.0"
|
|
print "<:3)~~~"
|
|
|
|
sqlite_log = False
|
|
if os.path.isfile('mice.db'):
|
|
print "Logging to mice.db"
|
|
sqlite_log = True
|
|
sqlite_conn = sqlite3.connect('mice.db', isolation_level=None)
|
|
|
|
# If the config for IO is defined...
|
|
io_key = False
|
|
if config.has_option('io', 'key'):
|
|
print "Logging to Adafruit IO"
|
|
io_key = config.get('io', 'key')
|
|
adafruit_io = Client(io_key)
|
|
|
|
def send_value(field, value):
|
|
print(field, value)
|
|
if io_key:
|
|
adafruit_io.send(field, value)
|
|
if sqlite_log:
|
|
cursor = sqlite_conn.cursor()
|
|
if field == "Mouse Problems":
|
|
event_type = 1
|
|
if field == "Trap Activity":
|
|
event_type = 2
|
|
cursor.execute(
|
|
"INSERT INTO events (timestamp, value, event_type) VALUES (DATETIME(), ?, ?);",
|
|
(value, event_type)
|
|
)
|
|
|
|
GPIO.setmode(GPIO.BCM)
|
|
|
|
# Activate input:
|
|
GPIO.setup(pir_pin, GPIO.IN)
|
|
|
|
# Activate input with PullUp:
|
|
GPIO.setup(trap_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
|
|
|
|
trap_activity = 0
|
|
previous_trap_state = GPIO.input(trap_pin)
|
|
|
|
motion_detected = False
|
|
motion_instances = []
|
|
recent_problem_count = 0
|
|
|
|
while True:
|
|
previous_recent_problem_count = recent_problem_count
|
|
|
|
motion_detected = False
|
|
|
|
if GPIO.input(pir_pin):
|
|
motion_detected = True
|
|
|
|
if motion_detected:
|
|
motion_instances.append(1)
|
|
else:
|
|
motion_instances.append(0)
|
|
|
|
if len(motion_instances) > 6:
|
|
motion_instances.pop(0)
|
|
|
|
trap_state = GPIO.input(trap_pin)
|
|
if trap_state != previous_trap_state:
|
|
trap_activity += 1
|
|
previous_trap_state = trap_state
|
|
send_value('Trap Activity', trap_activity)
|
|
|
|
recent_problem_count = sum(motion_instances)
|
|
if previous_recent_problem_count != recent_problem_count:
|
|
send_value('Mouse Problems', sum(motion_instances))
|
|
|
|
time.sleep(6)
|