/
pybrate.py
executable file
·67 lines (60 loc) · 2.51 KB
/
pybrate.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#!/usr/bin/python
from datetime import datetime
class VibrateSensor(object):
"""Vibration Sensor"""
def __init__(self):
from sense_hat import SenseHat
self.movement_threshold = 0.05
self.sensor = SenseHat()
self.current_reading = self.sensor.get_accelerometer_raw()
self.last_reading = self.current_reading
def read_sensor(self):
"""Set last_reading to prevous sensor reading, and read again"""
self.last_reading = self.current_reading
self.current_reading = self.sensor.get_accelerometer_raw()
def motion_detected(self):
"""Returns True if there has been movement since the last read"""
self.read_sensor()
x_movement = abs(self.last_reading['x'] - self.current_reading['x'])
y_movement = abs(self.last_reading['y'] - self.current_reading['y'])
z_movement = abs(self.last_reading['z'] - self.current_reading['z'])
if (x_movement > self.movement_threshold) \
or (y_movement > self.movement_threshold) \
or (z_movement > self.movement_threshold):
return True
else:
return False
class Dryer(VibrateSensor):
"""Object for tracking the status of a dryer"""
def __init__(self):
super(Dryer, self).__init__()
self.running = False
self.refresh = False
self.changed = False
self.movement_started = datetime.now()
self.movement_ended = datetime.now()
def update(self):
"""Attempts to detect motion by running up to 5 polling events.
A single motion event out of 5 will count as motion.
Returns True when the status changed, or False if it remains the same"""
self.changed = False
for _ in range(5):
if self.motion_detected():
if not self.running:
running_time = datetime.now() - self.movement_started
if running_time.seconds > 60:
self.running = True
self.changed = True
else:
self.movement_ended = datetime.now()
return True
# We returned no motion 5 times in a row
if self.running:
stopped_time = datetime.now() - self.movement_ended
if stopped_time.seconds > 60:
self.movement_ended = datetime.now()
self.running = False
self.changed = True
else:
self.movement_started = datetime.now()
return True