Code Monkey home page Code Monkey logo

py_garage_server's Introduction

Build Status

Raspberry Pi Garage Door REST server

Used to control an automatic garage door opener, features include:

  • Activate door open/close/stop
  • Email notification when door remains open for a set period
  • Sensing door state changes

See the Blog Post

See the ToDo list

##Architecture & Design

  • Python3 (unit test framework not compatible with python2)
  • Bottle to manage REST service
  • CherryPy for HTTP server
  • RPIO Raspberry Pi GPIO to control/sense door state
  • Pyhon finite state machine fysom to manage door states and events
  • sqlite database to store state
  • Smart browser interface Garage Control
  • Google OAuth reverse proxy (written in GO) for authentication and authorisation google_auth_proxy
user ----> router [port forward] ----> oauth proxy ----> py_garage_server ----> garage.db
                                                                        \-----> GPIO -----> Relay/Sensors

If not requiring external access or for testing can go directly from user to py_garage_server by disabling auth in config (see below) without the need for google_auth_proxy

##Electronics

To build the electronics - see README and diagrams in the electronics folder

##Browser app

Download garagecontrol-client.zip

Put file in application folder and unzip to www:

unzip garagecontrol-client.zip -d www

Should create following file structure:

www/GarageControl.html
www/ico/[several images]
www/[more .dart and .js files]

Once setup, the browser app can be accessed from URL:

http[s]://<IP or domain>:<port>/gc/

##REST URLs

Available URLs which respond to POST requests

/gc/garagedoor/state => get the current state
/gc/garagedoor/open  => open the door
/gc/garagedoor/close => close the door
/gc/garagedoor/stop  => stop the door
/gc/garagedoor/authlocation => check location is authorised for open command

Calling a command will trigger the door switch or have no effect if the transition is not allowed (e.g. calling stop in opened state)

The open and authlocation commands require 2 parameters: lat and lng.

All responses are by JSON e.g.:

{ 'auth': 'OK', 'state': 'opening' }

##Dependencies

Can be installed with following commands

sudo apt-get install python3 python3-pip
sudo pip-3.2 install bottle RPi.GPIO geopy CherryPy mock

##Configuration

Application settings should be placed in garage_config.json. Make a copy of the template file and edit with required configuration:

cp _garage_config.json garage_config.json

Most settings are editable at runtime e.g. changing authorised list can be made without restarting the server.

For GPIO port numbering see here

  • door_switch_enabled Set to false during testing - disables invoking relay GPIO
  • notify_enabled Set to true to enable email notification
  • state_monitor_enabled Set to true to enable periodic check/notification of door open status
  • port HTTP Port to listen on
  • authorised List of gmail addresses authorised (see google_auth_proxy - address is sent in the X-Forwarded-For header)
  • smtp_server / smtp_port SMTP server / port
  • smtp_sender email of sender, usually your address
  • smtp_recipient email of person/people to notify
  • smtp_pwd_file location of file containing password to email server
  • lat / lng Latitude/Longitude of your garage used during location authorisation. Use this to find out
  • relay_channel GPIO port used to control the relay
  • closed_channel / opened_channel GPIO port used to detect sensor on door closed / opened
  • debounce_timeout_ms De-bounce timeout
  • distance_limit_miles Distance allowed from lat/lnb coords given above allowed to use Open command
  • state_monitor_limit_mins Limit in minutes before sending notification of open state
  • state_monitor_interval_mins Period to check door state
  • logfile Location to write log file

##Running

The service must be run as root to bind to the GPIO ports. The included run.sh can be used to start the server.

./run.sh &
tail -f nohup.out

Alternatively, install and register as a system service. The advantage is if your RPi is rebooted, the service wil automatically be started when the system returns. See the init.d folder for instructions.

py_garage_server's People

Contributors

drweaver avatar

Stargazers

 avatar

Watchers

James Cloos avatar  avatar

Forkers

joncodis

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.