Mercurial > code > home > repos > homeauto
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']), |