From 5374ff7f71eeb457504116c433bfefd6878c50d1 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 25 Oct 2013 12:54:25 +0100 Subject: [PATCH] Updated documentation --- README.md | 82 ++++++++++++++++++++++++++++++++++++++++-- docs/architecture.png | Bin 0 -> 28601 bytes 2 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 docs/architecture.png diff --git a/README.md b/README.md index a87544e3689..9243c29f4f9 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,6 @@ It currently works with any wireless router with [Tomato firmware](http://www.po Installation instructions ------------------------- - * Install python modules [PyEphem](http://rhodesmill.org/pyephem/), [Requests](http://python-requests.org) and [PHue](https://github.com/studioimaginaire/phue): `pip install pyephem requests phue` * Clone the repository and pull in the submodules `git clone --recursive https://github.com/balloob/home-assistant.git` * Copy home-assistant.conf.default to home-assistant.conf and adjust the config values to match your setup. @@ -37,10 +36,35 @@ To interface with the API requests should include the parameter api_password whi The following API commands are currently supported: + /api/state/categories - POST + parameter: api_password - string + Will list all the categories for which a state is currently tracked. Returns a json object like this: + + ```json + {"status": "OK", + "message":"State categories", + "categories": ["all_devices", "Paulus_Nexus_4"]} + ``` + + /api/state/get - POST + parameter: api_password - string + parameter: category - string + Will get the current state of a category. Returns a json object like this: + + ```json + {"status": "OK", + "message": "State of all_devices", + "category": "all_devices", + "state": "device_home", + "last_changed": "19:10:39 25-10-2013", + "attributes": {}} + ``` + /api/state/change - POST parameter: api_password - string parameter: category - string parameter: new_state - string + parameter: attributes - object encoded as JSON string (optional) Changes category 'category' to 'new_state' It is possible to sent multiple values for category and new_state. If the number of values for category and new_state do not match only @@ -66,10 +90,11 @@ The [APK](https://raw.github.com/balloob/home-assistant/master/android-tasker/Ho ![screenshot-android-tasker.jpg](https://raw.github.com/balloob/home-assistant/master/docs/screenshot-android-tasker.png) Architecture ---------------------------- - +------------ Home Assistent has been built from the ground up with extensibility and modularity in mind. It is easy to swap in a different device tracker that polls another wireless router for example. +![screenshot-android-tasker.jpg](https://raw.github.com/balloob/home-assistant/master/docs/architecture.png) + The beating heart of Home Assistant is an event bus. Different modules are able to fire and listen for specific events. On top of this is a state machine that allows modules to track the state of different things. For example each device that is being tracked will have a state of either 'Home' or 'Not Home'. This allows us to implement simple business rules to easily customize or extend functionality: @@ -87,3 +112,54 @@ This allows us to implement simple business rules to easily customize or extend Turn on the lights These rules are currently implemented in the file [actors.py](https://github.com/balloob/home-assistant/blob/master/homeassistant/actors.py). + +### Supported observers + +**track_sun** +Tracks the state of the sun and when the next sun rising and setting will occur. +Depends on: latitude and longitude +Action: maintains state of `weather.sun` including attributes `next_rising` and `next_setting` + +**TomatoDeviceScanner** +A device scanner that scans a Tomato-based router and retrieves currently connected devices. To be used by `DeviceTracker`. +Depends on: host, username, password and http_id to login to Tomato Router. + +**DeviceTracker** +Keeps track of which devices are currently home. +Depends on: a device scanner +Action: sets the state per device and maintains a combined state called `all_devices`. Keeps track of known devices in the file `known_devices.csv`. + +### Supported actors + +**HueLightControl** +A light control for controlling the Philips Hue lights. + +**LightTrigger** +Turns lights on or off using supplied light control based on state of the sun and devices that are home. +Depends on: light control, track_sun, DeviceTracker +Action: + * Turns lights off when all devices leave home. + * Turns lights on when a device is home while sun is setting. + * Turns lights on when a device gets home after sun set. + +Listens for events `turn_light_on` and `turn_light_off`: +Turn a or all lights on or off + +Optional event_data: + - `light_id` - only act on specific light. Else targets all. + - `transition_seconds` - seconds to take to swithc to new state. + +**file_downloader** +Listen for `download_file` events to start downloading from the `url` specified in event_data. + +**webbrowser** +Listen for `browse_url` events and opens a browser with the `url` specified in event_data. + +**chromecast** +Listen for `chromecast.play_youtube_video` events and starts playing the specified video on the YouTube app on the ChromeCast. Specify video using `video` in event_data. + +Also listens for `start_fireplace` and `start_epic_sax` events to play a pre-defined movie. + +**media_buttons** +Listens for the events `keyboard.volume_up`, `keyboard.volume_down` and `keyboard.media_play_pause` to simulate the pressing of the appropriate media button. +Depends on: PyUserInput \ No newline at end of file diff --git a/docs/architecture.png b/docs/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..fb285b7b91e3737de9ed46aa7815e7226386b4d4 GIT binary patch literal 28601 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