comparison service/piNode/devices.py @ 1095:870d1bbae402

more motion sensor statements Ignore-this: 7019e6042e602812057bbffd9dab89b1 darcs-hash:4bc357effae2f3fc976d854be836022f4ad5ff47
author drewp <drewp@bigasterisk.com>
date Wed, 11 May 2016 21:45:35 -0700
parents 90bf3f11fc2b
children e7cbf250188a
comparison
equal deleted inserted replaced
1094:90bf3f11fc2b 1095:870d1bbae402
123 _knownTypes.add(deviceType) 123 _knownTypes.add(deviceType)
124 return deviceType 124 return deviceType
125 125
126 @register 126 @register
127 class MotionSensorInput(DeviceType): 127 class MotionSensorInput(DeviceType):
128 # compare motion sensor lib at http://pythonhosted.org/gpiozero/inputs/ 128 """
129 0 30s 60s 90s 10min
130 | | | | ... |
131 Sensor input ******** ** ******* ****
132 :sees output ........ .. ....... ....
133 :seesRecently .............................................................
134 :seesRecently30 ....................................
135 :motionStart x x x x
136 :motionStart30 x x
137 """
138 # compare motion sensor lib at
139 # https://gpiozero.readthedocs.org/en/v1.2.0/api_input.html#motion-sensor-d-sun-pir
129 # which is a bit fancier 140 # which is a bit fancier
130 deviceType = ROOM['MotionSensor'] 141 deviceType = ROOM['MotionSensor']
131 142
132 def setup(self): 143 def setup(self):
133 self.pi.set_mode(17, pigpio.INPUT) 144 self.pi.set_mode(17, pigpio.INPUT)
134 self.pi.set_pull_up_down(17, pigpio.PUD_DOWN) 145 self.pi.set_pull_up_down(17, pigpio.PUD_DOWN)
135 146
136 def hostStateInit(self): 147 def hostStateInit(self):
137 self.lastRead = None 148 self.lastRead = None
149 self.lastMotionStart30 = 0
150 self.lastMotionStart90 = 0
138 151
139 def poll(self): 152 def poll(self):
140 motion = self.pi.read(17) 153 motion = self.pi.read(17)
154 now = time.time()
141 155
142 oneshot = [] 156 oneshot = []
143 if self.lastRead is not None and motion != self.lastRead: 157 if self.lastRead is not None and motion != self.lastRead:
144 oneshot = [(self.uri, ROOM['sees'], ROOM['motionStart'])] 158 oneshot = [(self.uri, ROOM['sees'], ROOM['motionStart'])]
159 for v, t in [('lastMotionStart30', 30), ('lastMotionStart90', 90)]:
160 if now - getattr(self, v) > t:
161 oneshot.append((self.uri, ROOM['sees'], ROOM['motionStart%s' % t]))
162 setattr(self, v, now)
145 self.lastRead = motion 163 self.lastRead = motion
146 164
147 return {'latest': [ 165 return {'latest': [
148 (self.uri, ROOM['sees'], 166 (self.uri, ROOM['sees'],
149 ROOM['motion'] if motion else ROOM['noMotion']), 167 ROOM['motion'] if motion else ROOM['noMotion']),
150 ] + self.recentMotionStatements(motion), 168 ] + self.recentMotionStatements(now, motion),
151 'oneshot': oneshot} 169 'oneshot': oneshot}
152 170
153 def recentMotionStatements(self, motion): 171 def recentMotionStatements(self, now, motion):
154 if not hasattr(self, 'lastMotionTime'): 172 if not hasattr(self, 'lastMotionTime'):
155 self.lastMotionTime = 0 173 self.lastMotionTime = 0
156 now = time.time()
157 if motion: 174 if motion:
158 self.lastMotionTime = now 175 self.lastMotionTime = now
159 dt = now - self.lastMotionTime 176 dt = now - self.lastMotionTime
160 return [(self.uri, ROOM['seesRecently'], 177 return [(self.uri, ROOM['seesRecently'],
161 ROOM['motion'] if (dt < 60 * 10) else ROOM['noMotion']), 178 ROOM['motion'] if (dt < 60 * 10) else ROOM['noMotion']),