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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%0A~|;d>AFcESL6fdW_YO;;ts!i|iD5l^bzv%}6tg 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 Ba5(?~ literal 0 HcmV?d00001