Skip to content

raviles/rpi_automator

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Raspberry Pi Automator

An extendable, event-driven automation tool for Raspberry Pi GPIO components.

The automator provides a built-in cron facility (via apscheduler) and a chainable component model.

Installation
pip install rpi_automator
Running
rpi_automator --config /<path to your config.json>

Will block until SIGTERM is received.

Usage

The automator can be run in two different ways:

1) Using code

cam = PICamera(name='backyard_cam', width=640, height=480, cron="*/15 5-17 * * *")
s3 = S3Uploader(bucket_name='my-house-images', base_url='http://d1w07f3h9z0.cloudfront.net')

cam.then(s3)

button = ButtonDetector(name='red_button', pin=4)
light_relay = RelaySwitch(name='backyard_light', pin=8)

light_relay.then(cam)
button.then(light_relay)

BaseModule.start()

The above code will do the following:

Take a photo and upload to an S3 bucket every 15 minutes from 5am to 5pm each day.

If the red button is pushed, turn on the light and then take a photo.

A DataStore implementation can be optionally set to send each module result to a backend storage. New data stores can be created by sub-classing DataStore.

BaseModule.datastore = DynamoDBDataStore(table='house_data')

See rpi_automator_web for DynamoDB setup and data visualizer.

2) Using a configuration file

{
  "datastore" : "DynamoDBDataStore",

  "modules" : [
    {
      "type" : "modules/PICamera",
      "name" : "piCam1",
      "cron" : "*/15 * * * *",
      "enabled" : true
    },
    {
      "type" : "modules/S3Uploader",
      "bucket_name" : "my-cam-images",
      "name" : "s3",
      "subscribed_to" : ["piCam1"],
      "enabled" : true
    },
    {
      "type" : "modules/TempHumiditySensor",
      "name" : "temp1",
      "use_fahrenheit" : true,
      "cron" : "*/1 * * * *",
      "enabled" : true
    },
    {
      "type" : "modules/RelaySwitch",
      "name" : "light",
      "cron" : "0 7 * * *",
      "duration": 43200,
      "pin" : 18,
      "value" : 1,
      "enabled" : true
    },
    {
      "type" : "ButtonDetector",
      "name" : "wateringButton1",
      "enabled" : true,
      "pin" : 28
    },
    {
      "type" : "RelaySwitch",
      "name" : "waterPump1",
      "duration": 10,
      "pin" : 20,
      "value" : true,
      "value_toggle" : false,
      "subscribed_to" : ["wateringButton1"],
      "enabled" : true
    }
  ]
}

The configuration file above will automate the following actions:

Every 15 minutes, take a photo using the attached camera module and upload to S3.

Every minute, read from a DHT22 temperature & humidity sensor.

At 7am each day, enable the attached relay power switch (via pin 18) to turn on a light for 12 hours.

Run the attached water pump (waterPump1) for 10 seconds when the watering button (wateringButton1) is pressed.

In each case, result data will be sent to DynamoDB

Run via:

rpi_automator --config /<path to your config.json>

Available Modules

Multiple instances of each module can be configured for different purposes e.g. several instances of RelaySwitch for different lights, each operating on their own GPIO pin.

Custom Modules

Create new modules by sub-classing modules.BaseModule. The directory containing the source code should be added to $PYTHONPATH (or sys.path).

Custom datastores can also be created by subclassing datastores.DataStore.

Running Tests

cd rpi_automator
export PYTHONPATH=.
python -m unittest tests.EventControllerTests.EventControllerTests