Skip to content

Commit

Permalink
Connecting main script to sensor pollers (JeetShetty#89)
Browse files Browse the repository at this point in the history
  • Loading branch information
mtlynch committed Mar 23, 2017
1 parent 7ed13a4 commit 9eb9756
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 37 deletions.
85 changes: 48 additions & 37 deletions greenpithumb/greenpithumb.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,57 +5,59 @@

import Adafruit_DHT
import Adafruit_MCP3008
import picamera
import RPi.GPIO as GPIO

import camera_manager
import clock
import db_store
import dht11
import humidity_sensor
import light_sensor
import moisture_sensor
import pi_io
import poller
import record_processor
import temperature_sensor
import wiring_config_parser

logger = logging.getLogger(__name__)


# TODO(mtlynch): Rewrite this code so it's hooked up to the pollers.
class SensorHarness(object):
"""Simple container for GreenPiThumbs sensors."""

def __init__(self, wiring_config, image_path):
local_clock = clock.LocalClock()
# The MCP3008 spec and Adafruit library use different naming for the
# Raspberry Pi GPIO pins, so we translate as follows:
# * CLK -> CLK
# * CS/SHDN -> CS
# * DOUT -> MISO
# * DIN -> MOSI
self._adc = Adafruit_MCP3008.MCP3008(
clk=wiring_config.gpio_pins.mcp3008_clk,
cs=wiring_config.gpio_pins.mcp3008_cs_shdn,
miso=wiring_config.gpio_pins.mcp3008_dout,
mosi=wiring_config.gpio_pins.mcp3008_din)
self._light_sensor = light_sensor.LightSensor(
self._adc, wiring_config.adc_channels.light_sensor)
self._moisture_sensor = moisture_sensor.MoistureSensor(
self._adc,
pi_io.IO(GPIO), wiring_config.adc_channels.soil_moisture_sensor,
wiring_config.gpio_pins.soil_moisture_1,
wiring_config.gpio_pins.soil_moisture_2, local_clock)
self._dht11 = dht11.CachingDHT11(
lambda: Adafruit_DHT.read_retry(Adafruit_DHT.DHT11, wiring_config.gpio_pins.dht11),
local_clock)
self._temperature_sensor = temperature_sensor.TemperatureSensor(
self._dht11)
self._humidity_sensor = humidity_sensor.HumiditySensor(self._dht11)
self._camera_manager = camera_manager.CameraManager(image_path,
local_clock,
picamera.PiCamera())
def make_sensor_pollers(poll_interval, wiring_config, record_queue):
logger.info('creating sensor pollers (poll interval=%d")', poll_interval)
local_clock = clock.LocalClock()
# The MCP3008 spec and Adafruit library use different naming for the
# Raspberry Pi GPIO pins, so we translate as follows:
# * CLK -> CLK
# * CS/SHDN -> CS
# * DOUT -> MISO
# * DIN -> MOSI
adc = Adafruit_MCP3008.MCP3008(
clk=wiring_config.gpio_pins.mcp3008_clk,
cs=wiring_config.gpio_pins.mcp3008_cs_shdn,
miso=wiring_config.gpio_pins.mcp3008_dout,
mosi=wiring_config.gpio_pins.mcp3008_din)
local_dht11 = dht11.CachingDHT11(
lambda: Adafruit_DHT.read_retry(Adafruit_DHT.DHT11, wiring_config.gpio_pins.dht11),
local_clock)

poller_factory = poller.SensorPollerFactory(local_clock, poll_interval,
record_queue)

return [
poller_factory.create_temperature_poller(
temperature_sensor.TemperatureSensor(local_dht11)),
poller_factory.create_humidity_poller(
humidity_sensor.HumiditySensor(local_dht11)),
poller_factory.create_moisture_poller(
moisture_sensor.MoistureSensor(
adc,
pi_io.IO(GPIO), wiring_config.adc_channels.soil_moisture_sensor,
wiring_config.gpio_pins.soil_moisture_1,
wiring_config.gpio_pins.soil_moisture_2, local_clock)),
poller_factory.create_ambient_light_poller(
light_sensor.LightSensor(adc,
wiring_config.adc_channels.light_sensor)),
]


def read_wiring_config(config_filename):
Expand Down Expand Up @@ -92,12 +94,21 @@ def configure_logging(verbose):
def main(args):
configure_logging(args.verbose)
logger.info('starting greenpithumb')
wiring_config = read_wiring_config(args.config_file)
record_queue = Queue.Queue()
pollers = make_sensor_pollers(args.poll_interval, wiring_config,
record_queue)
with contextlib.closing(db_store.open_or_create_db(
args.db_file)) as db_connection:
record_processor = create_record_processor(db_connection, record_queue)
while True:
record_processor.process_next_record()
try:
for current_poller in pollers:
current_poller.start_polling_async()
while True:
record_processor.process_next_record()
finally:
for current_poller in pollers:
current_poller.close()


if __name__ == '__main__':
Expand Down
25 changes: 25 additions & 0 deletions greenpithumb/poller.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,31 @@
logger = logging.getLogger(__name__)


class SensorPollerFactory(object):
"""Factory to simplify the semantics of creating pollers."""

def __init__(self, local_clock, poll_interval, record_queue):
self._local_clock = local_clock
self._poll_interval = poll_interval
self._record_queue = record_queue

def create_temperature_poller(self, temperature_sensor):
return TemperaturePoller(self._local_clock, self._poll_interval,
temperature_sensor, self._record_queue)

def create_humidity_poller(self, humidity_sensor):
return HumidityPoller(self._local_clock, self._poll_interval,
humidity_sensor, self._record_queue)

def create_moisture_poller(self, moisture_sensor):
return MoisturePoller(self._local_clock, self._poll_interval,
moisture_sensor, self._record_queue)

def create_ambient_light_poller(self, light_sensor):
return AmbientLightPoller(self._local_clock, self._poll_interval,
light_sensor, self._record_queue)


class SensorPollerBase(object):
"""Base class for sensor polling."""

Expand Down

0 comments on commit 9eb9756

Please sign in to comment.