From 50b492c64a75e1523de058f7fd5d829b1b51f5c7 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 29 Apr 2014 00:30:31 -0700 Subject: [PATCH] Remote instances are now 100% operational --- README.md | 303 ++++++----- docs/architecture-remote.png | Bin 0 -> 79012 bytes docs/architecture.png | Bin 33778 -> 32018 bytes home-assistant.conf.default | 2 +- homeassistant/__init__.py | 89 ++-- homeassistant/bootstrap.py | 9 +- .../{httpinterface => http}/__init__.py | 184 +++++-- .../www_static/favicon.ico | Bin .../www_static/style.css | 0 homeassistant/remote.py | 484 +++++++++++------- homeassistant/test.py | 224 ++++---- start.py | 4 +- 12 files changed, 770 insertions(+), 529 deletions(-) create mode 100644 docs/architecture-remote.png rename homeassistant/components/{httpinterface => http}/__init__.py (80%) rename homeassistant/components/{httpinterface => http}/www_static/favicon.ico (100%) rename homeassistant/components/{httpinterface => http}/www_static/style.css (100%) diff --git a/README.md b/README.md index 5ae5de1cf84..f52bc381f22 100644 --- a/README.md +++ b/README.md @@ -40,138 +40,11 @@ Installation instructions Done. Start it now by running `python start.py` -Web interface and API ---------------------- -Home Assistent runs a webserver accessible on port 8123. - - * At http://localhost:8123/ it will provide a debug interface showing the current state of the system and an overview of registered services. - * At http://localhost:8123/api/ it provides a password protected API. - -A screenshot of the debug interface: -![screenshot-debug-interface](https://raw.github.com/balloob/home-assistant/master/docs/screenshot-debug-interface.png) - -All API calls have to be accompanied by an 'api_password' parameter (as specified in `home-assistant.conf`) and will -return JSON encoded objects. If successful calls will return status code 200 or 201. - -Other status codes that can occur are: - - 400 (Bad Request) - - 401 (Unauthorized) - - 404 (Not Found) - - 405 (Method not allowed) - -The api supports the following actions: - -**/api/states - GET**
-Returns a list of entity ids for which a state is available - -```json -{ - "entity_ids": [ - "Paulus_Nexus_4", - "weather.sun", - "all_devices" - ] -} -``` - -**/api/events - GET**
-Returns a dict with as keys the events and as value the number of listeners. - -```json -{ - "event_listeners": { - "state_changed": 5, - "time_changed": 2 - } -} -``` - -**/api/services - GET**
-Returns a dict with as keys the domain and as value a list of published services. - -```json -{ - "services": { - "browser": [ - "browse_url" - ], - "keyboard": [ - "volume_up", - "volume_down" - ] - } -} -``` - -**/api/states/<entity_id>** - GET
-Returns the current state from an entity - -```json -{ - "attributes": { - "next_rising": "07:04:15 29-10-2013", - "next_setting": "18:00:31 29-10-2013" - }, - "entity_id": "weather.sun", - "last_changed": "23:24:33 28-10-2013", - "state": "below_horizon" -} -``` - -**/api/states/<entity_id>** - POST
-Updates the current state of an entity. Returns status code 201 if successful with location header of updated resource and the new state in the body.
-parameter: new_state - string
-optional parameter: attributes - JSON encoded object - -```json -{ - "attributes": { - "next_rising": "07:04:15 29-10-2013", - "next_setting": "18:00:31 29-10-2013" - }, - "entity_id": "weather.sun", - "last_changed": "23:24:33 28-10-2013", - "state": "below_horizon" -} -``` - -**/api/events/<event_type>** - POST
-Fires an event with event_type
-optional parameter: event_data - JSON encoded object - -```json -{ - "message": "Event download_file fired." -} -``` - -**/api/services/<domain>/<service>** - POST
-Calls a service within a specific domain.
-optional parameter: service_data - JSON encoded object - -```json -{ - "message": "Service keyboard/volume_up called." -} -``` - -Android remote control ----------------------- - -An app has been built using [Tasker for Android](https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm) that: - - * Provides buttons to control the lights and the chromecast - * Reports the charging state and battery level of the phone - -The [APK](https://raw.github.com/balloob/home-assistant/master/android-tasker/Home_Assistant.apk) and [Tasker project XML](https://raw.github.com/balloob/home-assistant/master/android-tasker/Home_Assistant.prj.xml) can be found in [/android-tasker/](https://github.com/balloob/home-assistant/tree/master/android-tasker) - -![screenshot-android-tasker.jpg](https://raw.github.com/balloob/home-assistant/master/docs/screenshot-android-tasker.png) - Architecture ------------ -The core of Home Assistant exists of two parts; a Bus for calling services and firing events and a State Machine that keeps track of the state of things. +The core of Home Assistant exists of three parts; an EventBus for firing events, a StateMachine that keeps track of the state of things and a ServiceRegistry to manage services. -![screenshot-android-tasker.jpg](https://raw.github.com/balloob/home-assistant/master/docs/architecture.png) +![home assistant architecture](https://raw.github.com/balloob/home-assistant/master/docs/architecture.png) For example to control the lights there are two components. One is the device_tracker that polls the wireless router for connected devices and updates the state of the tracked devices in the State Machine to be either 'Home' or 'Not Home'. @@ -238,3 +111,175 @@ Registers service `downloader/download_file` that will download files. File to d **browser** Registers service `browser/browse_url` that opens `url` as specified in event_data in the system default browser. + +### Multiple connected instances + +Home Assistant supports running multiple synchronzied instances using a master-slave model. Slaves forward all local events fired and states set to the master instance which will then replicate it to each slave. + +Because each slave maintains it's own ServiceRegistry it is possible to have multiple slaves respond to one service call. + +![home assistant master-slave architecture](https://raw.github.com/balloob/home-assistant/master/docs/architecture-remote.png) + +Web interface and API +--------------------- +Home Assistent runs a webserver accessible on port 8123. + + * At http://localhost:8123/ it will provide a debug interface showing the current state of the system and an overview of registered services. + * At http://localhost:8123/api/ it provides a password protected API. + +A screenshot of the debug interface: +![screenshot-debug-interface](https://raw.github.com/balloob/home-assistant/master/docs/screenshot-debug-interface.png) + +In the package `homeassistant.remote` a Python API on top of the HTTP API can be found. + +All API calls have to be accompanied by an 'api_password' parameter (as specified in `home-assistant.conf`) and will +return JSON encoded objects. If successful calls will return status code 200 or 201. + +Other status codes that can occur are: + - 400 (Bad Request) + - 401 (Unauthorized) + - 404 (Not Found) + - 405 (Method not allowed) + +The api supports the following actions: + +**/api/events - GET**
+Returns a dict with as keys the events and as value the number of listeners. + +```json +{ + "event_listeners": { + "state_changed": 5, + "time_changed": 2 + } +} +``` + +**/api/services - GET**
+Returns a dict with as keys the domain and as value a list of published services. + +```json +{ + "services": { + "browser": [ + "browse_url" + ], + "keyboard": [ + "volume_up", + "volume_down" + ] + } +} +``` + +**/api/states - GET**
+Returns a dict with as keys the entity_ids and as value the state. + +```json +{ + "sun.sun": { + "attributes": { + "next_rising": "07:04:15 29-10-2013", + "next_setting": "18:00:31 29-10-2013" + }, + "entity_id": "sun.sun", + "last_changed": "23:24:33 28-10-2013", + "state": "below_horizon" + }, + "process.Dropbox": { + "attributes": {}, + "entity_id": "process.Dropbox", + "last_changed": "23:24:33 28-10-2013", + "state": "on" + } +} +``` + +**/api/states/<entity_id>** - GET
+Returns the current state from an entity + +```json +{ + "attributes": { + "next_rising": "07:04:15 29-10-2013", + "next_setting": "18:00:31 29-10-2013" + }, + "entity_id": "sun.sun", + "last_changed": "23:24:33 28-10-2013", + "state": "below_horizon" +} +``` + +**/api/states/<entity_id>** - POST
+Updates the current state of an entity. Returns status code 201 if successful with location header of updated resource and the new state in the body.
+parameter: new_state - string
+optional parameter: attributes - JSON encoded object + +```json +{ + "attributes": { + "next_rising": "07:04:15 29-10-2013", + "next_setting": "18:00:31 29-10-2013" + }, + "entity_id": "weather.sun", + "last_changed": "23:24:33 28-10-2013", + "state": "below_horizon" +} +``` + +**/api/events/<event_type>** - POST
+Fires an event with event_type
+optional parameter: event_data - JSON encoded object + +```json +{ + "message": "Event download_file fired." +} +``` + +**/api/services/<domain>/<service>** - POST
+Calls a service within a specific domain.
+optional parameter: service_data - JSON encoded object + +```json +{ + "message": "Service keyboard/volume_up called." +} +``` + +**/api/event_forwarding** - POST
+Setup event forwarding to another Home Assistant instance.
+parameter: host - string
+parameter: api_password - string
+optional parameter: port - int
+ +```json +{ + "message": "Event forwarding setup." +} +``` + +**/api/event_forwarding** - DELETE
+Cancel event forwarding to another Home Assistant instance.
+parameter: host - string
+optional parameter: port - int
+ +If your client does not support DELETE HTTP requests you can add an optional attribute _METHOD and set its value to DELETE. + +```json +{ + "message": "Event forwarding cancelled." +} +``` + +Android remote control +---------------------- + +An app has been built using [Tasker for Android](https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm) that: + + * Provides buttons to control the lights and the chromecast + * Reports the charging state and battery level of the phone + +The [APK](https://raw.github.com/balloob/home-assistant/master/android-tasker/Home_Assistant.apk) and [Tasker project XML](https://raw.github.com/balloob/home-assistant/master/android-tasker/Home_Assistant.prj.xml) can be found in [/android-tasker/](https://github.com/balloob/home-assistant/tree/master/android-tasker) + +![screenshot-android-tasker.jpg](https://raw.github.com/balloob/home-assistant/master/docs/screenshot-android-tasker.png) diff --git a/docs/architecture-remote.png b/docs/architecture-remote.png new file mode 100644 index 0000000000000000000000000000000000000000..3109c92184675a0542757e43a006fe019ae50b50 GIT binary patch literal 79012 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

yZ%e)VaZOiJY#o(|OFqUP=H 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 F{U3=1Da-%> literal 33778 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".format( - self.event_type, util.repr_helper(self.data)) + return "".format( + self.event_type, self.origin.value[0], + util.repr_helper(self.data)) else: - return "".format(self.event_type) + return "".format(self.event_type, + self.origin.value[0]) class EventBus(object): @@ -291,7 +305,7 @@ class EventBus(object): self._listeners = {} self._logger = logging.getLogger(__name__) self._lock = threading.Lock() - self._pool = pool or _create_worker_pool() + self._pool = pool or create_worker_pool() @property def listeners(self): @@ -302,7 +316,7 @@ class EventBus(object): return {key: len(self._listeners[key]) for key in self._listeners} - def fire(self, event_type, event_data=None): + def fire(self, event_type, event_data=None, origin=EventOrigin.local): """ Fire an event. """ with self._lock: # Copy the list of the current listeners because some listeners @@ -311,7 +325,7 @@ class EventBus(object): get = self._listeners.get listeners = get(MATCH_ALL, []) + get(event_type, []) - event = Event(event_type, event_data) + event = Event(event_type, event_data, origin) self._logger.info("Bus:Handling {}".format(event)) @@ -390,7 +404,9 @@ class State(object): """ Static method to create a state from a dict. Ensures: state == State.from_json_dict(state.to_json_dict()) """ - if 'entity_id' not in json_dict and 'state' not in json_dict: + if not (json_dict and + 'entity_id' in json_dict and + 'state' in json_dict): return None last_changed = json_dict.get('last_changed') @@ -429,6 +445,11 @@ class StateMachine(object): """ List of entity ids that are being tracked. """ return list(self._states.keys()) + def all(self): + """ Returns a dict mapping all entity_ids to their state. """ + return {entity_id: state.copy() for entity_id, state + in self._states.items()} + def get(self, entity_id): """ Returns the state of the specified entity. """ state = self._states.get(entity_id) @@ -456,24 +477,22 @@ class StateMachine(object): attributes = attributes or {} with self._lock: - if entity_id in self._states: - old_state = self._states[entity_id] + old_state = self._states.get(entity_id) - if old_state.state != new_state or \ - old_state.attributes != attributes: + # If state did not exist or is different, set it + if not old_state or \ + old_state.state != new_state or \ + old_state.attributes != attributes: - state = self._states[entity_id] = \ - State(entity_id, new_state, attributes) + state = self._states[entity_id] = \ + State(entity_id, new_state, attributes) - self._bus.fire(EVENT_STATE_CHANGED, - {'entity_id': entity_id, - 'old_state': old_state, - 'new_state': state}) + event_data = {'entity_id': entity_id, 'new_state': state} - else: - # If state did not exist yet - self._states[entity_id] = State(entity_id, new_state, - attributes) + if old_state: + event_data['old_state'] = old_state + + self._bus.fire(EVENT_STATE_CHANGED, event_data) # pylint: disable=too-few-public-methods @@ -501,7 +520,7 @@ class ServiceRegistry(object): def __init__(self, bus, pool=None): self._services = {} self._lock = threading.Lock() - self._pool = pool or _create_worker_pool() + self._pool = pool or create_worker_pool() bus.listen(EVENT_CALL_SERVICE, self._event_to_service_call) @property diff --git a/homeassistant/bootstrap.py b/homeassistant/bootstrap.py index 7f63d725964..5d089aa31c6 100644 --- a/homeassistant/bootstrap.py +++ b/homeassistant/bootstrap.py @@ -194,13 +194,12 @@ def from_config_file(config_path, enable_logging=True): add_status("Keyboard", load_module('keyboard').setup(hass)) # Init HTTP interface - if has_opt("httpinterface", "api_password"): - httpinterface = load_module('httpinterface') + if has_opt("http", "api_password"): + http = load_module('http') - httpinterface.HTTPInterface( - hass, get_opt("httpinterface", "api_password")) + http.setup(hass, get_opt("http", "api_password")) - add_status("HTTPInterface", True) + add_status("HTTP", True) # Init groups if has_section("group"): diff --git a/homeassistant/components/httpinterface/__init__.py b/homeassistant/components/http/__init__.py similarity index 80% rename from homeassistant/components/httpinterface/__init__.py rename to homeassistant/components/http/__init__.py index be20e5be228..2cd5a67f3f4 100644 --- a/homeassistant/components/httpinterface/__init__.py +++ b/homeassistant/components/http/__init__.py @@ -73,13 +73,13 @@ import logging import re import os from http.server import BaseHTTPRequestHandler, HTTPServer +from socketserver import ThreadingMixIn from urllib.parse import urlparse, parse_qs import homeassistant as ha +import homeassistant.remote as rem import homeassistant.util as util -SERVER_PORT = 8123 - HTTP_OK = 200 HTTP_CREATED = 201 HTTP_MOVED_PERMANENTLY = 301 @@ -92,46 +92,49 @@ HTTP_UNPROCESSABLE_ENTITY = 422 URL_ROOT = "/" URL_CHANGE_STATE = "/change_state" URL_FIRE_EVENT = "/fire_event" - -URL_API_STATES = "/api/states" -URL_API_STATES_ENTITY = "/api/states/{}" -URL_API_EVENTS = "/api/events" -URL_API_EVENTS_EVENT = "/api/events/{}" -URL_API_SERVICES = "/api/services" -URL_API_SERVICES_SERVICE = "/api/services/{}/{}" +URL_CALL_SERVICE = "/call_service" URL_STATIC = "/static/{}" -class HTTPInterface(threading.Thread): - """ Provides an HTTP interface for Home Assistant. """ +def setup(hass, api_password, server_port=None, server_host=None): + """ Sets up the HTTP API and debug interface. """ + server_port = server_port or rem.SERVER_PORT - # pylint: disable=too-many-arguments - def __init__(self, hass, api_password, server_port=None, server_host=None): - threading.Thread.__init__(self) + # If no server host is given, accept all incoming requests + server_host = server_host or '0.0.0.0' - self.daemon = True + server = HomeAssistantHTTPServer((server_host, server_port), + RequestHandler, hass, api_password) - server_port = server_port or SERVER_PORT + hass.listen_once_event( + ha.EVENT_HOMEASSISTANT_START, + lambda event: + threading.Thread(target=server.start, daemon=True).start()) - # If no server host is given, accept all incoming requests - server_host = server_host or '0.0.0.0' - self.server = HTTPServer((server_host, server_port), RequestHandler) +class HomeAssistantHTTPServer(ThreadingMixIn, HTTPServer): + """ Handle HTTP requests in a threaded fashion. """ - self.server.flash_message = None - self.server.logger = logging.getLogger(__name__) - self.server.hass = hass - self.server.api_password = api_password + def __init__(self, server_address, RequestHandlerClass, + hass, api_password): + super().__init__(server_address, RequestHandlerClass) - hass.listen_once_event(ha.EVENT_HOMEASSISTANT_START, - lambda event: self.start()) + self.hass = hass + self.api_password = api_password + self.logger = logging.getLogger(__name__) - def run(self): - """ Start the HTTP interface. """ - self.server.logger.info("Starting") + # To store flash messages between sessions + self.flash_message = None - self.server.serve_forever() + # We will lazy init this one if needed + self.event_forwarder = None + + def start(self): + """ Starts the server. """ + self.logger.info("Starting") + + self.serve_forever() # pylint: disable=too-many-public-methods @@ -139,13 +142,15 @@ class RequestHandler(BaseHTTPRequestHandler): """ Handles incoming HTTP requests """ PATHS = [ # debug interface - ('GET', '/', '_handle_get_root'), - ('POST', re.compile(r'/change_state'), '_handle_change_state'), - ('POST', re.compile(r'/fire_event'), '_handle_fire_event'), - ('POST', re.compile(r'/call_service'), '_handle_call_service'), + ('GET', URL_ROOT, '_handle_get_root'), + # These get compiled as RE because these methods are reused + # by other urls that use url parameters + ('POST', re.compile(URL_CHANGE_STATE), '_handle_change_state'), + ('POST', re.compile(URL_FIRE_EVENT), '_handle_fire_event'), + ('POST', re.compile(URL_CALL_SERVICE), '_handle_call_service'), # /states - ('GET', '/api/states', '_handle_get_api_states'), + ('GET', rem.URL_API_STATES, '_handle_get_api_states'), ('GET', re.compile(r'/api/states/(?P[a-zA-Z\._0-9]+)'), '_handle_get_api_states_entity'), @@ -154,19 +159,24 @@ class RequestHandler(BaseHTTPRequestHandler): '_handle_change_state'), # /events - ('GET', '/api/events', '_handle_get_api_events'), + ('GET', rem.URL_API_EVENTS, '_handle_get_api_events'), ('POST', re.compile(r'/api/events/(?P[a-zA-Z\._0-9]+)'), '_handle_fire_event'), # /services - ('GET', '/api/services', '_handle_get_api_services'), + ('GET', rem.URL_API_SERVICES, '_handle_get_api_services'), ('POST', re.compile((r'/api/services/' r'(?P[a-zA-Z\._0-9]+)/' r'(?P[a-zA-Z\._0-9]+)')), '_handle_call_service'), + # /event_forwarding + ('POST', rem.URL_API_EVENT_FORWARD, '_handle_post_api_event_forward'), + ('DELETE', rem.URL_API_EVENT_FORWARD, + '_handle_delete_api_event_forward'), + # Statis files ('GET', re.compile(r'/static/(?P[a-zA-Z\._\-0-9/]+)'), '_handle_get_static') @@ -193,6 +203,9 @@ class RequestHandler(BaseHTTPRequestHandler): except KeyError: api_password = '' + if '_METHOD' in data: + method = data['_METHOD'][0] + if url.path.startswith('/api/'): self.use_json = True @@ -327,11 +340,9 @@ class RequestHandler(BaseHTTPRequestHandler): "AttributesLast Changed" "").format(self.server.api_password)) - for entity_id in \ - sorted(self.server.hass.states.entity_ids, - key=lambda key: key.lower()): - - state = self.server.hass.states.get(entity_id) + for entity_id, state in \ + sorted(self.server.hass.states.all().items(), + key=lambda item: item[0].lower()): attributes = "
".join( ["{}: {}".format(attr, state.attributes[attr]) @@ -512,7 +523,7 @@ class RequestHandler(BaseHTTPRequestHandler): self._write_json(state.as_dict(), status_code=HTTP_CREATED, location= - URL_API_STATES_ENTITY.format(entity_id)) + rem.URL_API_STATES_ENTITY.format(entity_id)) else: self._message( "State of {} changed to {}".format(entity_id, new_state)) @@ -534,21 +545,33 @@ class RequestHandler(BaseHTTPRequestHandler): This handles the following paths: /fire_event /api/events/ + + Events from /api are threated as remote events. """ try: try: event_type = path_match.group('event_type') + event_origin = ha.EventOrigin.remote except IndexError: # If group event_type does not exist in path_match event_type = data['event_type'][0] + event_origin = ha.EventOrigin.local - try: + if 'event_data' in data: event_data = json.loads(data['event_data'][0]) - except KeyError: - # Happens if key 'event_data' does not exist + else: event_data = None - self.server.hass.bus.fire(event_type, event_data) + # Special case handling for event STATE_CHANGED + # We will try to convert state dicts back to State objects + if event_type == ha.EVENT_STATE_CHANGED and event_data: + for key in ('old_state', 'new_state'): + state = ha.State.from_dict(event_data.get(key)) + + if state: + event_data[key] = state + + self.server.hass.bus.fire(event_type, event_data, event_origin) self._message("Event {} fired.".format(event_type)) @@ -598,9 +621,8 @@ class RequestHandler(BaseHTTPRequestHandler): # pylint: disable=unused-argument def _handle_get_api_states(self, path_match, data): - """ Returns the entitie ids which state are being tracked. """ - self._write_json( - {'entity_ids': list(self.server.hass.states.entity_ids)}) + """ Returns a dict containing all entity ids and their state. """ + self._write_json(self.server.hass.states.all()) # pylint: disable=unused-argument def _handle_get_api_states_entity(self, path_match, data): @@ -609,10 +631,9 @@ class RequestHandler(BaseHTTPRequestHandler): state = self.server.hass.states.get(entity_id) - try: - self._write_json(state.as_dict()) - except AttributeError: - # If state for entity_id does not exist + if state: + self._write_json(state) + else: self._message("State does not exist.", HTTP_UNPROCESSABLE_ENTITY) def _handle_get_api_events(self, path_match, data): @@ -623,6 +644,60 @@ class RequestHandler(BaseHTTPRequestHandler): """ Handles getting overview of services. """ self._write_json({'services': self.server.hass.services.services}) + def _handle_post_api_event_forward(self, path_match, data): + """ Handles adding an event forwarding target. """ + + try: + host = data['host'][0] + api_password = data['api_password'][0] + + port = int(data['port'][0]) if 'port' in data else None + + if self.server.event_forwarder is None: + self.server.event_forwarder = \ + rem.EventForwarder(self.server.hass) + + api = rem.API(host, api_password, port) + + self.server.event_forwarder.connect(api) + + self._message("Event forwarding setup.") + + except KeyError: + # Occurs if domain or service does not exist in data + self._message("No host or api_password received.", + HTTP_BAD_REQUEST) + + except ValueError: + # Occurs during error parsing port + self._message( + "Invalid value received for port", HTTP_UNPROCESSABLE_ENTITY) + + def _handle_delete_api_event_forward(self, path_match, data): + """ Handles deleting an event forwarding target. """ + + try: + host = data['host'][0] + + port = int(data['port'][0]) if 'port' in data else None + + if self.server.event_forwarder is not None: + api = rem.API(host, None, port) + + self.server.event_forwarder.disconnect(api) + + self._message("Event forwarding cancelled.") + + except KeyError: + # Occurs if domain or service does not exist in data + self._message("No host or api_password received.", + HTTP_BAD_REQUEST) + + except ValueError: + # Occurs during error parsing port + self._message( + "Invalid value received for port", HTTP_UNPROCESSABLE_ENTITY) + def _handle_get_static(self, path_match, data): """ Returns a static file. """ req_file = util.sanitize_filename(path_match.group('file')) @@ -680,4 +755,5 @@ class RequestHandler(BaseHTTPRequestHandler): if data: self.wfile.write( - json.dumps(data, indent=4, sort_keys=True).encode("UTF-8")) + json.dumps(data, indent=4, sort_keys=True, + cls=rem.JSONEncoder).encode("UTF-8")) diff --git a/homeassistant/components/httpinterface/www_static/favicon.ico b/homeassistant/components/http/www_static/favicon.ico similarity index 100% rename from homeassistant/components/httpinterface/www_static/favicon.ico rename to homeassistant/components/http/www_static/favicon.ico diff --git a/homeassistant/components/httpinterface/www_static/style.css b/homeassistant/components/http/www_static/style.css similarity index 100% rename from homeassistant/components/httpinterface/www_static/style.css rename to homeassistant/components/http/www_static/style.css diff --git a/homeassistant/remote.py b/homeassistant/remote.py index 26641b113c9..b5f24620508 100644 --- a/homeassistant/remote.py +++ b/homeassistant/remote.py @@ -17,24 +17,37 @@ import urllib.parse import requests import homeassistant as ha -import homeassistant.components.httpinterface as hah + +SERVER_PORT = 8123 + +URL_API_STATES = "/api/states" +URL_API_STATES_ENTITY = "/api/states/{}" +URL_API_EVENTS = "/api/events" +URL_API_EVENTS_EVENT = "/api/events/{}" +URL_API_SERVICES = "/api/services" +URL_API_SERVICES_SERVICE = "/api/services/{}/{}" +URL_API_EVENT_FORWARD = "/api/event_forwarding" METHOD_GET = "get" METHOD_POST = "post" -def _setup_call_api(host, port, api_password): - """ Helper method to setup a call api method. """ - port = port or hah.SERVER_PORT +class API(object): + """ Object to pass around Home Assistant API location and credentials. """ + # pylint: disable=too-few-public-methods - base_url = "http://{}:{}".format(host, port) + def __init__(self, host, api_password, port=None): + self.host = host + self.port = port or SERVER_PORT + self.api_password = api_password + self.base_url = "http://{}:{}".format(host, self.port) - def _call_api(method, path, data=None): + def __call__(self, method, path, data=None): """ Makes a call to the Home Assistant api. """ data = data or {} - data['api_password'] = api_password + data['api_password'] = self.api_password - url = urllib.parse.urljoin(base_url, path) + url = urllib.parse.urljoin(self.base_url, path) try: if method == METHOD_GET: @@ -46,7 +59,134 @@ def _setup_call_api(host, port, api_password): logging.getLogger(__name__).exception("Error connecting to server") raise ha.HomeAssistantError("Error connecting to server") - return _call_api + +class HomeAssistant(ha.HomeAssistant): + """ Home Assistant that forwards work. """ + # pylint: disable=super-init-not-called + + def __init__(self, local_api, remote_api): + self.local_api = local_api + self.remote_api = remote_api + + self._pool = pool = ha.create_worker_pool() + + self.bus = EventBus(remote_api, pool) + self.services = ha.ServiceRegistry(self.bus, pool) + self.states = StateMachine(self.bus, self.remote_api) + + def start(self): + ha.Timer(self) + + # Setup that events from remote_api get forwarded to local_api + connect_remote_events(self.remote_api, self.local_api) + + self.bus.fire(ha.EVENT_HOMEASSISTANT_START, + origin=ha.EventOrigin.remote) + + +class EventBus(ha.EventBus): + """ EventBus implementation that forwards fire_event to remote API. """ + + def __init__(self, api, pool=None): + super().__init__(pool) + self._api = api + + def fire(self, event_type, event_data=None, origin=ha.EventOrigin.local): + """ Forward local events to remote target, + handles remote event as usual. """ + # All local events that are not TIME_CHANGED are forwarded to API + if origin == ha.EventOrigin.local and \ + event_type != ha.EVENT_TIME_CHANGED: + + fire_event(self._api, event_type, event_data) + + else: + super().fire(event_type, event_data, origin) + + +class EventForwarder(object): + """ Listens for events and forwards to specified APIs. """ + + def __init__(self, hass, restrict_origin=None): + self.hass = hass + self.restrict_origin = restrict_origin + self.logger = logging.getLogger(__name__) + + # We use a tuple (host, port) as key to ensure + # that we do not forward to the same host twice + self._targets = {} + + self._lock = threading.Lock() + + def connect(self, api): + """ + Attach to a HA instance and forward events. + + Will overwrite old target if one exists with same host/port. + """ + with self._lock: + if len(self._targets) == 0: + # First target we get, setup listener for events + self.hass.bus.listen(ha.MATCH_ALL, self._event_listener) + + key = (api.host, api.port) + + self._targets[key] = api + + def disconnect(self, api): + """ Removes target from being forwarded to. """ + with self._lock: + key = (api.host, api.port) + + did_remove = self._targets.pop(key, None) is None + + if len(self._targets) == 0: + # Remove event listener if no forwarding targets present + self.hass.bus.remove_listener(ha.MATCH_ALL, + self._event_listener) + + return did_remove + + def _event_listener(self, event): + """ Listen and forwards all events. """ + with self._lock: + # We don't forward time events or, if enabled, non-local events + if event.event_type == ha.EVENT_TIME_CHANGED or \ + (self.restrict_origin and event.origin != self.restrict_origin): + return + + for api in self._targets.values(): + fire_event(api, event.event_type, event.data, self.logger) + + +class StateMachine(ha.StateMachine): + """ + Fires set events to an API. + Uses state_change events to track states. + """ + + def __init__(self, bus, api): + super().__init__(None) + + self.logger = logging.getLogger(__name__) + + self._api = api + + self.mirror() + + bus.listen(ha.EVENT_STATE_CHANGED, self._state_changed_listener) + + def set(self, entity_id, new_state, attributes=None): + """ Calls set_state on remote API . """ + set_state(self._api, entity_id, new_state, attributes) + + def mirror(self): + """ Discards current data and mirrors the remote state machine. """ + self._states = get_states(self._api, self.logger) + + def _state_changed_listener(self, event): + """ Listens for state changed events and applies them. """ + self._states[event.data['entity_id']] = event.data['new_state'] class JSONEncoder(json.JSONEncoder): @@ -61,212 +201,168 @@ class JSONEncoder(json.JSONEncoder): return json.JSONEncoder.default(self, obj) -class EventBus(object): - """ Allows to interface with a Home Assistant EventBus via the API. """ +def connect_remote_events(from_api, to_api): + """ Sets up from_api to forward all events to to_api. """ - def __init__(self, host, api_password, port=None): - self.logger = logging.getLogger(__name__) + data = {'host': to_api.host, 'api_password': to_api.api_password} - self._call_api = _setup_call_api(host, port, api_password) + if to_api.port is not None: + data['port'] = to_api.port - @property - def listeners(self): - """ List of events that is being listened for. """ - try: - req = self._call_api(METHOD_GET, hah.URL_API_EVENTS) + try: + from_api(METHOD_POST, URL_API_EVENT_FORWARD, data) - if req.status_code == 200: - data = req.json() - - return data['event_listeners'] - - else: - raise ha.HomeAssistantError( - "Got unexpected result (3): {}.".format(req.text)) - - except ValueError: # If req.json() can't parse the json - self.logger.exception("Bus:Got unexpected result") - raise ha.HomeAssistantError( - "Got unexpected result: {}".format(req.text)) - - except KeyError: # If not all expected keys are in the returned JSON - self.logger.exception("Bus:Got unexpected result (2)") - raise ha.HomeAssistantError( - "Got unexpected result (2): {}".format(req.text)) - - def fire(self, event_type, event_data=None): - """ Fire an event. """ - - if event_data: - data = {'event_data': json.dumps(event_data, cls=JSONEncoder)} - else: - data = None - - req = self._call_api(METHOD_POST, - hah.URL_API_EVENTS_EVENT.format(event_type), - data) - - if req.status_code != 200: - error = "Error firing event: {} - {}".format( - req.status_code, req.text) - - self.logger.error("Bus:{}".format(error)) - raise ha.HomeAssistantError(error) + except ha.HomeAssistantError: + pass -class StateMachine(object): - """ Allows to interface with a Home Assistant StateMachine via the API. """ +def disconnect_remote_events(from_api, to_api): + """ Disconnects forwarding events from from_api to to_api. """ + data = {'host': to_api.host, '_METHOD': 'DELETE'} - def __init__(self, host, api_password, port=None): - self._call_api = _setup_call_api(host, port, api_password) + if to_api.port is not None: + data['port'] = to_api.port - self.lock = threading.Lock() - self.logger = logging.getLogger(__name__) + try: + from_api(METHOD_POST, URL_API_EVENT_FORWARD, data) - @property - def entity_ids(self): - """ List of entity ids which states are being tracked. """ - - try: - req = self._call_api(METHOD_GET, hah.URL_API_STATES) - - return req.json()['entity_ids'] - - except requests.exceptions.ConnectionError: - self.logger.exception("StateMachine:Error connecting to server") - return [] - - except ValueError: # If req.json() can't parse the json - self.logger.exception("StateMachine:Got unexpected result") - return [] - - except KeyError: # If 'entity_ids' key not in parsed json - self.logger.exception("StateMachine:Got unexpected result (2)") - return [] - - def set(self, entity_id, new_state, attributes=None): - """ Set the state of a entity, add entity if it does not exist. - - Attributes is an optional dict to specify attributes of this state. """ - - attributes = attributes or {} - - self.lock.acquire() - - data = {'new_state': new_state, - 'attributes': json.dumps(attributes)} - - try: - req = self._call_api(METHOD_POST, - hah.URL_API_STATES_ENTITY.format(entity_id), - data) - - if req.status_code != 201: - error = "Error changing state: {} - {}".format( - req.status_code, req.text) - - self.logger.error("StateMachine:{}".format(error)) - raise ha.HomeAssistantError(error) - - except requests.exceptions.ConnectionError: - self.logger.exception("StateMachine:Error connecting to server") - raise ha.HomeAssistantError("Error connecting to server") - - finally: - self.lock.release() - - def get(self, entity_id): - """ Returns the state of the specified entity. """ - - try: - req = self._call_api(METHOD_GET, - hah.URL_API_STATES_ENTITY.format(entity_id)) - - if req.status_code == 200: - data = req.json() - - return ha.State.from_dict(data) - - elif req.status_code == 422: - # Entity does not exist - return None - - else: - raise ha.HomeAssistantError( - "Got unexpected result (3): {}.".format(req.text)) - - except requests.exceptions.ConnectionError: - self.logger.exception("StateMachine:Error connecting to server") - raise ha.HomeAssistantError("Error connecting to server") - - except ValueError: # If req.json() can't parse the json - self.logger.exception("StateMachine:Got unexpected result") - raise ha.HomeAssistantError( - "Got unexpected result: {}".format(req.text)) - - except KeyError: # If not all expected keys are in the returned JSON - self.logger.exception("StateMachine:Got unexpected result (2)") - raise ha.HomeAssistantError( - "Got unexpected result (2): {}".format(req.text)) - - def is_state(self, entity_id, state): - """ Returns True if entity exists and is specified state. """ - try: - return self.get(entity_id).state == state - except AttributeError: - # get returned None - return False + except ha.HomeAssistantError: + pass -class ServiceRegistry(object): - """ Allows to interface with a Home Assistant ServiceRegistry - via the API. """ +def get_event_listeners(api, logger=None): + """ List of events that is being listened for. """ + try: + req = api(METHOD_GET, URL_API_EVENTS) - def __init__(self, host, api_password, port=None): - self.logger = logging.getLogger(__name__) + return req.json()['event_listeners'] if req.status_code == 200 else {} - self._call_api = _setup_call_api(host, port, api_password) + except (ha.HomeAssistantError, ValueError, KeyError): + # ValueError if req.json() can't parse the json + # KeyError if 'event_listeners' not found in parsed json + if logger: + logger.exception("Bus:Got unexpected result") - @property - def services(self): - """ List the available services. """ - try: - req = self._call_api(METHOD_GET, hah.URL_API_SERVICES) + return {} - if req.status_code == 200: - data = req.json() - return data['services'] +def fire_event(api, event_type, event_data=None, logger=None): + """ Fire an event at remote API. """ - else: - raise ha.HomeAssistantError( - "Got unexpected result (3): {}.".format(req.text)) + if event_data: + data = {'event_data': json.dumps(event_data, cls=JSONEncoder)} + else: + data = None - except ValueError: # If req.json() can't parse the json - self.logger.exception("ServiceRegistry:Got unexpected result") - raise ha.HomeAssistantError( - "Got unexpected result: {}".format(req.text)) + try: + req = api(METHOD_POST, URL_API_EVENTS_EVENT.format(event_type), data) - except KeyError: # If not all expected keys are in the returned JSON - self.logger.exception("ServiceRegistry:Got unexpected result (2)") - raise ha.HomeAssistantError( - "Got unexpected result (2): {}".format(req.text)) + if req.status_code != 200 and logger: + logger.error( + "Error firing event: {} - {}".format( + req.status_code, req.text)) - def call_service(self, domain, service, service_data=None): - """ Calls a service. """ + except ha.HomeAssistantError: + pass - if service_data: - data = {'service_data': json.dumps(service_data)} - else: - data = None - req = self._call_api(METHOD_POST, - hah.URL_API_SERVICES_SERVICE.format( - domain, service), - data) +def get_state(api, entity_id, logger=None): + """ Queries given API for state of entity_id. """ - if req.status_code != 200: - error = "Error calling service: {} - {}".format( - req.status_code, req.text) + try: + req = api(METHOD_GET, + URL_API_STATES_ENTITY.format(entity_id)) - self.logger.error("ServiceRegistry:{}".format(error)) + # req.status_code == 422 if entity does not exist + + return ha.State.from_dict(req.json()) \ + if req.status_code == 200 else None + + except (ha.HomeAssistantError, ValueError): + # ValueError if req.json() can't parse the json + if logger: + logger.exception("Error getting state") + + return None + + +def get_states(api, logger=None): + """ Queries given API for all states. """ + + try: + req = api(METHOD_GET, + URL_API_STATES) + + json_result = req.json() + states = {} + + for entity_id, state_dict in json_result.items(): + state = ha.State.from_dict(state_dict) + + if state: + states[entity_id] = state + + return states + + except (ha.HomeAssistantError, ValueError, AttributeError): + # ValueError if req.json() can't parse the json + # AttributeError if parsed JSON was not a dict + if logger: + logger.exception("Error getting state") + + return {} + + +def set_state(api, entity_id, new_state, attributes=None, logger=None): + """ Tells API to update state for entity_id. """ + + attributes = attributes or {} + + data = {'new_state': new_state, + 'attributes': json.dumps(attributes)} + + try: + req = api(METHOD_POST, + URL_API_STATES_ENTITY.format(entity_id), + data) + + if req.status_code != 201 and logger: + logger.error( + "Error changing state: {} - {}".format( + req.status_code, req.text)) + + except ha.HomeAssistantError: + if logger: + logger.exception("Error setting state to server") + + +def is_state(api, entity_id, state, logger=None): + """ Queries API to see if entity_id is specified state. """ + cur_state = get_state(api, entity_id, logger) + + return cur_state and cur_state.state == state + + +def get_services(api, logger=None): + """ Returns a dict with per domain the available services at API. """ + try: + req = api(METHOD_GET, URL_API_SERVICES) + + return req.json()['services'] if req.status_code == 200 else {} + + except (ha.HomeAssistantError, ValueError, KeyError): + # ValueError if req.json() can't parse the json + # KeyError if not all expected keys are in the returned JSON + if logger: + logger.exception("ServiceRegistry:Got unexpected result") + + return {} + + +def call_service(api, domain, service, service_data=None, logger=None): + """ Calls a service at the remote API. """ + event_data = service_data or {} + event_data[ha.ATTR_DOMAIN] = domain + event_data[ha.ATTR_SERVICE] = service + + fire_event(api, ha.EVENT_CALL_SERVICE, event_data, logger) diff --git a/homeassistant/test.py b/homeassistant/test.py index c193e2df7b2..b61b17f32d2 100644 --- a/homeassistant/test.py +++ b/homeassistant/test.py @@ -13,11 +13,11 @@ import requests import homeassistant as ha import homeassistant.remote as remote -import homeassistant.components.httpinterface as hah +import homeassistant.components.http as http API_PASSWORD = "test1234" -HTTP_BASE_URL = "http://127.0.0.1:{}".format(hah.SERVER_PORT) +HTTP_BASE_URL = "http://127.0.0.1:{}".format(remote.SERVER_PORT) def _url(path=""): @@ -28,6 +28,7 @@ def _url(path=""): class HAHelper(object): # pylint: disable=too-few-public-methods """ Helper class to keep track of current running HA instance. """ hass = None + slave = None def ensure_homeassistant_started(): @@ -39,9 +40,9 @@ def ensure_homeassistant_started(): hass.bus.listen('test_event', len) hass.states.set('test', 'a_state') - hah.HTTPInterface(hass, API_PASSWORD) + http.setup(hass, API_PASSWORD) - hass.bus.fire(ha.EVENT_HOMEASSISTANT_START) + hass.start() # Give objects time to startup time.sleep(1) @@ -51,6 +52,26 @@ def ensure_homeassistant_started(): return HAHelper.hass +def ensure_slave_started(): + """ Ensure a home assistant slave is started. """ + + if not HAHelper.slave: + local_api = remote.API("127.0.0.1", API_PASSWORD, 8124) + remote_api = remote.API("127.0.0.1", API_PASSWORD) + slave = remote.HomeAssistant(local_api, remote_api) + + http.setup(slave, API_PASSWORD, 8124) + + slave.start() + + # Give objects time to startup + time.sleep(1) + + HAHelper.slave = slave + + return HAHelper.slave + + # pylint: disable=too-many-public-methods class TestHTTPInterface(unittest.TestCase): """ Test the HTTP debug interface and API. """ @@ -75,12 +96,12 @@ class TestHTTPInterface(unittest.TestCase): """ Test if we get access denied if we omit or provide a wrong api password. """ req = requests.get( - _url(hah.URL_API_STATES_ENTITY.format("test"))) + _url(remote.URL_API_STATES_ENTITY.format("test"))) self.assertEqual(req.status_code, 401) req = requests.get( - _url(hah.URL_API_STATES_ENTITY.format("test")), + _url(remote.URL_API_STATES_ENTITY.format("test")), params={"api_password": "not the password"}) self.assertEqual(req.status_code, 401) @@ -89,7 +110,7 @@ class TestHTTPInterface(unittest.TestCase): """ Test if we can change a state from the debug interface. """ self.hass.states.set("test.test", "not_to_be_set") - requests.post(_url(hah.URL_CHANGE_STATE), + requests.post(_url(http.URL_CHANGE_STATE), data={"entity_id": "test.test", "new_state": "debug_state_change2", "api_password": API_PASSWORD}) @@ -110,7 +131,7 @@ class TestHTTPInterface(unittest.TestCase): self.hass.listen_once_event("test_event_with_data", listener) requests.post( - _url(hah.URL_FIRE_EVENT), + _url(http.URL_FIRE_EVENT), data={"event_type": "test_event_with_data", "event_data": '{"test": 1}', "api_password": API_PASSWORD}) @@ -122,18 +143,20 @@ class TestHTTPInterface(unittest.TestCase): def test_api_list_state_entities(self): """ Test if the debug interface allows us to list state entities. """ - req = requests.get(_url(hah.URL_API_STATES), + req = requests.get(_url(remote.URL_API_STATES), data={"api_password": API_PASSWORD}) - data = req.json() + remote_data = req.json() - self.assertEqual(list(self.hass.states.entity_ids), - data['entity_ids']) + local_data = {entity_id: state.as_dict() for entity_id, state + in self.hass.states.all().items()} + + self.assertEqual(local_data, remote_data) def test_api_get(self): """ Test if the debug interface allows us to get a state. """ req = requests.get( - _url(hah.URL_API_STATES_ENTITY.format("test")), + _url(remote.URL_API_STATES_ENTITY.format("test")), data={"api_password": API_PASSWORD}) data = ha.State.from_dict(req.json()) @@ -147,7 +170,7 @@ class TestHTTPInterface(unittest.TestCase): def test_api_get_non_existing_state(self): """ Test if the debug interface allows us to get a state. """ req = requests.get( - _url(hah.URL_API_STATES_ENTITY.format("does_not_exist")), + _url(remote.URL_API_STATES_ENTITY.format("does_not_exist")), params={"api_password": API_PASSWORD}) self.assertEqual(req.status_code, 422) @@ -157,7 +180,7 @@ class TestHTTPInterface(unittest.TestCase): self.hass.states.set("test.test", "not_to_be_set") - requests.post(_url(hah.URL_API_STATES_ENTITY.format("test.test")), + requests.post(_url(remote.URL_API_STATES_ENTITY.format("test.test")), data={"new_state": "debug_state_change2", "api_password": API_PASSWORD}) @@ -172,7 +195,7 @@ class TestHTTPInterface(unittest.TestCase): new_state = "debug_state_change" req = requests.post( - _url(hah.URL_API_STATES_ENTITY.format( + _url(remote.URL_API_STATES_ENTITY.format( "test_entity_that_does_not_exist")), data={"new_state": new_state, "api_password": API_PASSWORD}) @@ -195,7 +218,7 @@ class TestHTTPInterface(unittest.TestCase): self.hass.listen_once_event("test.event_no_data", listener) requests.post( - _url(hah.URL_API_EVENTS_EVENT.format("test.event_no_data")), + _url(remote.URL_API_EVENTS_EVENT.format("test.event_no_data")), data={"api_password": API_PASSWORD}) # Allow the event to take place @@ -217,7 +240,7 @@ class TestHTTPInterface(unittest.TestCase): self.hass.listen_once_event("test_event_with_data", listener) requests.post( - _url(hah.URL_API_EVENTS_EVENT.format("test_event_with_data")), + _url(remote.URL_API_EVENTS_EVENT.format("test_event_with_data")), data={"event_data": '{"test": 1}', "api_password": API_PASSWORD}) @@ -238,7 +261,7 @@ class TestHTTPInterface(unittest.TestCase): self.hass.listen_once_event("test_event_with_bad_data", listener) req = requests.post( - _url(hah.URL_API_EVENTS_EVENT.format("test_event")), + _url(remote.URL_API_EVENTS_EVENT.format("test_event")), data={"event_data": 'not json', "api_password": API_PASSWORD}) @@ -250,7 +273,7 @@ class TestHTTPInterface(unittest.TestCase): def test_api_get_event_listeners(self): """ Test if we can get the list of events being listened for. """ - req = requests.get(_url(hah.URL_API_EVENTS), + req = requests.get(_url(remote.URL_API_EVENTS), params={"api_password": API_PASSWORD}) data = req.json() @@ -259,7 +282,7 @@ class TestHTTPInterface(unittest.TestCase): def test_api_get_services(self): """ Test if we can get a dict describing current services. """ - req = requests.get(_url(hah.URL_API_SERVICES), + req = requests.get(_url(remote.URL_API_SERVICES), params={"api_password": API_PASSWORD}) data = req.json() @@ -277,7 +300,7 @@ class TestHTTPInterface(unittest.TestCase): self.hass.services.register("test_domain", "test_service", listener) requests.post( - _url(hah.URL_API_SERVICES_SERVICE.format( + _url(remote.URL_API_SERVICES_SERVICE.format( "test_domain", "test_service")), data={"api_password": API_PASSWORD}) @@ -299,7 +322,7 @@ class TestHTTPInterface(unittest.TestCase): self.hass.services.register("test_domain", "test_service", listener) requests.post( - _url(hah.URL_API_SERVICES_SERVICE.format( + _url(remote.URL_API_SERVICES_SERVICE.format( "test_domain", "test_service")), data={"service_data": '{"test": 1}', "api_password": API_PASSWORD}) @@ -310,7 +333,7 @@ class TestHTTPInterface(unittest.TestCase): self.assertEqual(len(test_value), 1) -class TestRemote(unittest.TestCase): +class TestRemoteMethods(unittest.TestCase): """ Test the homeassistant.remote module. """ @classmethod @@ -318,134 +341,115 @@ class TestRemote(unittest.TestCase): """ things to be run when tests are started. """ cls.hass = ensure_homeassistant_started() - cls.remote_sm = remote.StateMachine("127.0.0.1", API_PASSWORD) - cls.remote_eb = remote.EventBus("127.0.0.1", API_PASSWORD) - cls.remote_sr = remote.ServiceRegistry("127.0.0.1", API_PASSWORD) - cls.sm_with_remote_eb = ha.StateMachine(cls.remote_eb) - cls.sm_with_remote_eb.set("test", "a_state") + cls.api = remote.API("127.0.0.1", API_PASSWORD) - # pylint: disable=invalid-name - def test_remote_sm_list_state_entities(self): - """ Test if the debug interface allows us to list state entity ids. """ + def test_get_event_listeners(self): + """ Test Python API get_event_listeners. """ - self.assertEqual(list(self.hass.states.entity_ids), - self.remote_sm.entity_ids) + self.assertEqual( + remote.get_event_listeners(self.api), self.hass.bus.listeners) - def test_remote_sm_get(self): - """ Test if debug interface allows us to get state of an entity. """ - remote_state = self.remote_sm.get("test") - - state = self.hass.states.get("test") - - self.assertEqual(remote_state.state, state.state) - self.assertEqual(remote_state.last_changed, state.last_changed) - self.assertEqual(remote_state.attributes, state.attributes) - - def test_remote_sm_get_non_existing_state(self): - """ Test remote state machine to get state of non existing entity. """ - self.assertEqual(self.remote_sm.get("test_does_not_exist"), None) - - def test_remote_sm_state_change(self): - """ Test if we can change the state of an existing entity. """ - - self.remote_sm.set("test", "set_remotely", {"test": 1}) - - state = self.hass.states.get("test") - - self.assertEqual(state.state, "set_remotely") - self.assertEqual(state.attributes['test'], 1) - - def test_remote_eb_listening_for_same(self): - """ Test if remote EB correctly reports listener overview. """ - self.assertEqual(self.hass.bus.listeners, - self.remote_eb.listeners) - - # pylint: disable=invalid-name - def test_remote_eb_fire_event_with_no_data(self): - """ Test if the remote bus allows us to fire an event. """ + def test_fire_event(self): + """ Test Python API fire_event. """ test_value = [] def listener(event): # pylint: disable=unused-argument """ Helper method that will verify our event got called. """ test_value.append(1) - self.hass.listen_once_event("test_event_no_data", listener) + self.hass.listen_once_event("test.event_no_data", listener) - self.remote_eb.fire("test_event_no_data") + remote.fire_event(self.api, "test.event_no_data") # Allow the event to take place time.sleep(1) self.assertEqual(len(test_value), 1) - # pylint: disable=invalid-name - def test_remote_eb_fire_event_with_data(self): - """ Test if the remote bus allows us to fire an event. """ - test_value = [] + def test_get_state(self): + """ Test Python API get_state. """ - def listener(event): # pylint: disable=unused-argument - """ Helper method that will verify our event got called. """ - if event.data["test"] == 1: - test_value.append(1) + self.assertEqual( + remote.get_state(self.api, 'test'), self.hass.states.get('test')) - self.hass.listen_once_event("test_event_with_data", listener) + def test_get_states(self): + """ Test Python API get_state_entity_ids. """ - self.remote_eb.fire("test_event_with_data", {"test": 1}) + self.assertEqual( + remote.get_states(self.api), self.hass.states.all()) - # Allow the event to take place - time.sleep(1) + def test_set_state(self): + """ Test Python API set_state. """ + remote.set_state(self.api, 'test', 'set_test') - self.assertEqual(len(test_value), 1) + self.assertEqual(self.hass.states.get('test').state, 'set_test') - # pylint: disable=invalid-name - def test_remote_sr_call_service_with_no_data(self): - """ Test if the remote bus allows us to fire a service. """ + def test_is_state(self): + """ Test Python API is_state. """ + + self.assertEqual( + remote.is_state(self.api, 'test', + self.hass.states.get('test').state), + True) + + def test_get_services(self): + """ Test Python API get_services. """ + + self.assertEqual( + remote.get_services(self.api), self.hass.services.services) + + def test_call_service(self): + """ Test Python API call_service. """ test_value = [] def listener(service_call): # pylint: disable=unused-argument - """ Helper method that will verify our service got called. """ + """ Helper method that will verify that our service got called. """ test_value.append(1) self.hass.services.register("test_domain", "test_service", listener) - self.remote_sr.call_service("test_domain", "test_service") - - # Allow the service call to take place - time.sleep(1) - - self.assertEqual(len(test_value), 1) - - # pylint: disable=invalid-name - def test_remote_sr_call_service_with_data(self): - """ Test if the remote bus allows us to fire an event. """ - test_value = [] - - def listener(service_call): # pylint: disable=unused-argument - """ Helper method that will verify our service got called. """ - if service_call.data["test"] == 1: - test_value.append(1) - - self.hass.services.register("test_domain", "test_service", listener) - - self.remote_sr.call_service("test_domain", "test_service", {"test": 1}) + remote.call_service(self.api, "test_domain", "test_service") # Allow the event to take place time.sleep(1) self.assertEqual(len(test_value), 1) - def test_local_sm_with_remote_eb(self): - """ Test if we get the event if we change a state on a - StateMachine connected to a remote bus. """ + +class TestRemoteClasses(unittest.TestCase): + """ Test the homeassistant.remote module. """ + + @classmethod + def setUpClass(cls): # pylint: disable=invalid-name + """ things to be run when tests are started. """ + cls.hass = ensure_homeassistant_started() + cls.slave = ensure_slave_started() + + def test_statemachine_init(self): + """ Tests if remote.StateMachine copies all states on init. """ + self.assertEqual(self.hass.states.all(), self.slave.states.all()) + + def test_statemachine_set(self): + """ Tests if setting the state on a slave is recorded. """ + self.slave.states.set("test", "remote.statemachine test") + + # Allow interaction between 2 instances + time.sleep(1) + + self.assertEqual(self.slave.states.get("test").state, + "remote.statemachine test") + + def test_eventbus_fire(self): + """ Test if events fired from the eventbus get fired. """ test_value = [] def listener(event): # pylint: disable=unused-argument """ Helper method that will verify our event got called. """ test_value.append(1) - self.hass.listen_once_event(ha.EVENT_STATE_CHANGED, listener) + self.slave.listen_once_event("test.event_no_data", listener) - self.sm_with_remote_eb.set("test", "local sm with remote eb") + self.slave.bus.fire("test.event_no_data") # Allow the event to take place time.sleep(1) diff --git a/start.py b/start.py index eeb29a27a12..527110856df 100644 --- a/start.py +++ b/start.py @@ -3,4 +3,6 @@ import homeassistant import homeassistant.bootstrap -homeassistant.bootstrap.from_config_file("home-assistant.conf").start() +hass = homeassistant.bootstrap.from_config_file("home-assistant.conf") +hass.start() +hass.block_till_stopped()