Simplified MCP3008 sensor backend by letting it extend SensorBackend

This commit is contained in:
Fabio Manganiello 2018-06-12 00:36:43 +02:00
parent c410bd8926
commit 77d954f14e
2 changed files with 26 additions and 48 deletions

View file

@ -1,28 +1,37 @@
import time
from platypush.backend import Backend from platypush.backend import Backend
from platypush.message.event.sensor import SensorDataChangeEvent, \ from platypush.message.event.sensor import SensorDataChangeEvent, \
SensorDataAboveThresholdEvent, SensorDataBelowThresholdEvent SensorDataAboveThresholdEvent, SensorDataBelowThresholdEvent
class SensorBackend(Backend): class SensorBackend(Backend):
def __init__(self, thresholds=None, *args, **kwargs): def __init__(self, thresholds=None, poll_seconds=None, *args, **kwargs):
""" """
Thresholds is either a scalr value or a dictionary. Params:
-- thresholds: Thresholds can be either a scalr value or a dictionary.
If set, SensorDataAboveThresholdEvent and SensorDataBelowThresholdEvent If set, SensorDataAboveThresholdEvent and SensorDataBelowThresholdEvent
events will be triggered whenever the measurement goes above or below events will be triggered whenever the measurement goes above or
that value. below that value.
Set it as a scalar if your get_measurement() code returns a scalar, Set it as a scalar if your get_measurement() code returns a scalar,
as a dictionary if it returns a dictionary of values. as a dictionary if it returns a dictionary of values.
For instance, if your sensor code returns both humidity and temperature For instance, if your sensor code returns both humidity and
in a format like {'humidity':60.0, 'temperature': 25.0}, you'll want to temperature in a format like {'humidity':60.0, 'temperature': 25.0},
set up a threshold on temperature with a syntax like {'temperature':20.0} you'll want to set up a threshold on temperature with a syntax like
{'temperature':20.0}
-- poll_seconds: If set, the thread will wait for the specificed
number of seconds between a read and the next one.
""" """
super().__init__(**kwargs) super().__init__(**kwargs)
self.data = None self.data = None
self.thresholds = thresholds self.thresholds = thresholds
self.poll_seconds = poll_seconds
def get_measurement(self): def get_measurement(self):
raise NotImplementedError('To be implemented in a derived class') raise NotImplementedError('To be implemented in a derived class')
@ -56,6 +65,9 @@ class SensorBackend(Backend):
self.data = new_data self.data = new_data
if self.poll_seconds:
time.sleep(self.poll_seconds)
# vim:sw=4:ts=4:et: # vim:sw=4:ts=4:et:

View file

@ -1,45 +1,11 @@
import time from platypush.backend.sensor import SensorBackend
from platypush.backend import Backend
from platypush.context import get_plugin from platypush.context import get_plugin
from platypush.message.event.sensor import SensorDataChangeEvent
from platypush.plugins.gpio.sensor.mcp3008 import GpioSensorMcp3008Plugin
class SensorMcp3008Backend(Backend): class SensorMcp3008Backend(SensorBackend):
last_measurement = {} def get_measurement(self):
def __init__(self, poll_seconds, *args, **kwargs):
super().__init__(*args, **kwargs)
self.poll_seconds = poll_seconds
self.logger.info('Initialized MCP3008 analog sensors backend')
def send_message(self, msg):
pass
def run(self):
super().run()
plugin = get_plugin('gpio.sensor.mcp3008') plugin = get_plugin('gpio.sensor.mcp3008')
return plugin.get_data().output
while not self.should_stop():
try:
measurement = plugin.get_measurement().output
except:
plugin = get_plugin('gpio.sensor.mcp3008', reload=True)
new_measurement = {}
for key in measurement.keys():
if key not in self.last_measurement \
or measurement[key] != self.last_measurement[key]:
new_measurement[key] = measurement[key]
if new_measurement:
self.bus.post(SensorDataChangeEvent(data=new_measurement))
self.last_measurement = measurement
time.sleep(self.poll_seconds)
# vim:sw=4:ts=4:et: # vim:sw=4:ts=4:et: