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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 Qcj%RiU00{{Xc%G=l}n3 z`G0+Ny0BDa*wK&7Y`lI~oV?e#im|fsO0@+kxt(0prormgA*HCS>vmEp;Xp%T$EAdB z$0nA{V+wmuIJCGK2`F}R?0w;?c=m$Fgs@E~l)5?gc1&;;i%gm5`Xs*CZ-4OicdOUe zgoggFFL=4`d*S_B{r7jj*FT?E{H{Le^?^ChZoGR~{XV>HzhcV9_w4NdSFdURdgVXg z_uqeazmMJb|4H*K%WM0;&V3(xtL^8VkGH2Sejri*>-2rS|9>i$7oCattF~(6yIt*1 zH7(x96!5vsTYOpUHuJ?Q|NiuSZQbPx7Vo_u&97Mawra(-dCoOccD387-e(75nAe?B)z_O6K?a8sMv8QT$7_dd)Q7%_VX#iiGd_e@TolyLMHylb>1e zl5mr7lF;ove=q+GKdo>_t^UKe)DIs+BgMLQ&Hwvn`gHl1udBD7Rk!=O@^pFK@Ag%S zUkW^Al|KBopS5=7fA9RduTxEh|1GVPt-D<$vV-NuuI*m;*Z!%_&s+HHk3!l;zDHA< zHZNy+UJ-CUuPebTIqp95zr7uQ;?+gJ949g3>pcdTFMy6#K*t~~cZ?cF*P*MfB{=DPzgt-n>hPB^-I&h2gY{zTq0TQZ&HdHnx> z{ay9y+YWBqcISwUi>OYs#{M5)-)kKbT4elXypmYi{8gY=d1)~{Dnzt?GG%Gc^wtb67Aa?kS88BYrw?(0YUO{ltmYR7AP)v z@6lb!C-o}$;oDvpSKGL@{;=o46OOc}e(WlJn{6BY>%#LOxevyBe;!H-JJ<7i#ypo- z5nVNR(j#fX*af|Ztt70PI!)d{o~$Q9HkLT8~K#@51svXv+mdV zkcqzz%byRumRKRn#OL&`JHBqS+nJdOzQS`hxI8j%yK-1T@&2?K{L3Tl45z&N-l}k{ zXa~m+#p*ft{hx`yJbcr(sW?{XbeS8kczWLbMIp<>ttM3bn&&1Nc}&GqbIbbwayz~s zYf$;Qx<5q0HpjW(+%gFpr)$iO+3(lQ*q9tSeevICTHjVQzQ|Uw@J)%{rMlX@L^Hc2 zcDCRgOV35m-rid0og1YhU1~EyCH8X4+;ZEO1@CsYS3BQ2f6-E>(|P^W^dMPY`DYQ` zQ)`-MTWNcqGo6?+qjuvt-wKu9bh{fli*jo=PFN>0$IeSu%szrc@rZ$pT$i0RpSyry z%RK$>;rG|BIlTYF&LjT=-78{#6qzMIblI(NXTq-)Hy0=h&q)li)me}!7SWNxb*@iA zexuvbNe$7PiiEA2C!IMQSMvAwihYNZnv&h5`tQv=S`yYPvC-l3qH9yH->+Qh_h;U; z1AET@y*DvsiGFW^{c3yN0@Kygj!CZkn%SeewtuUscx2kwWvpk-cCFi(e7p2D|GHYw z{>hVHwfvhW_*eQkQ;%`hiBlghzS6sx89$-AXzPibJ3qLyHriabnm+e~^|X|-mWY@6 zkF>MgCowE+pQwKzpg_({(ZalB{!FXf$G*P1f(qKMd2tv-s3-nBQc&78!AtkXvba@? z3u1GkuQWc6o;%aOep!;^*GERa1&iKp{Oo$f_LYet*K6%RPLfOS1&hqyl9lWEcj5ip zNfEkB_X<_q(!3t}MfstmeCNAl7a`$Yorls+t_sk0**7m|hf_$)vY$@VzNo#+b}E>~ ze|iho`MEc^@05C!-Dx}_u6k>m%E^G*oEv);p^Rbr*nBv5tlRHhSGn9mz| zZGna`^R`X51?PzE?Msm3**IHYv#2>LA!ycv7H@|)HG&`e-s--R{r}zhi^!byQy<8@ zo$&41lI?9Z?$#@Goe$mUTF3hArTU~L%u!hn`{lT$POW%gA}=VtuU=u9Swi=XXwoOsT# zR^7sPi&KVDmaSSF=+Md~n`eY5W^i7TUMlw@IFOBdA?wS871cJIWSMH_?S8Ak`}*f1Y@Sm?Ormd}x@7rJ>q(wL`}e@T_Gw?^qAvC; zo&Mkc`>21&1)oX<*-1ZSl`c+N9Nne#!%Inn;}O@t2|_HKjuV`2bUr)Tl6vt-obAER zhj|@QGQvv2U!(8&vzWFr`iOnG((|AtV(aVf2dbdO5HD-mLQLYeDcEqn6k}r+?5tV$ zdeWJwB4k9(&l8CT7FQ0(+$T3NB`&?e)9GPU)}6&JO^Di2t-M# zuIcA(j_&j8@Xg`(Udem<@bXLB4=*=rGWhb<`GS)E@_xH^eRZKD&Ijr?|9Bf7<{#nl zdM-bU){!@*&+maIA|}jUs&I0`7EXU2Oa9N7Ch)1~%kN4*U}U?#iSH5LwCt3`jH_Ik zl|R01>GR$D|NZJ44H-JG3U7b>yw~txlj z*Kf^Uqpy5b(!Z*A&K9vN-X7sWJT2;6Z7Zg?Fq%F|+nAWUBST^G0Vf5OLV3CE8cO}8 z`Ua<91`FW}8y!g_s5XwN$DN79xH^&8{vrylc+OO5Rt+dzb%R}y2XyJxeWxo(-S{deg#+qp^>%a@wve`|VIyoUAv zeC}T|_qRRYW9n(n+@XSeoFn3w1y-{mW+^ws5z_g|@+HL@q?*ts0Ow0mOv+o-9ZC;f1k z^|a8_dWw71-qVww*ydhkl8jQSU9zpyLwcE%n4huRLC=Gpk8VskvM}-COyN0d%be_A zn~E;_wy|d6-@ZZ>&jWrM7U!3gO|v|mba8#{?Y{|sJ2uaVb1j(1{(g<)%CoQUs9!aH zn7ir*FE7hyt!e3VGkA}x-MCg~^(3G*JL)#a%gA3}7S6k-e<0SgO*~4_{@aB0uboZa zvjhb0*Z6#??$oT;Nf)**esC*%%Bz{_(^Mr_-J6oKaYEm zo80tSW7FLUTz8IVaaeG(q(^2g@BB97!5)vy#XEUho)^o-JXgLqsYS(kuUO8eg>z3Y ztUj?WN>7P@i9WmEi`J(rI*ZDD->wN?6Kp8IBKGZvYjb|gyPBQ(Xrh=0m!BBdIX|&E z=|R@4Yo;=$>$=L%yZrsIad^CS)91ufAKTVN7WBRPx%Wcdt-gzW59S0rpUzD1vApzJ z(0aZQtGeRaL`I#(elzr5Id2h+V4ZI%c*F0|``21=J^KpY8q2$Dudb5ou8K20CuFtc zx$k{t3k@KE9mWE%LVVZ#%_PRZeOyKn5w6Q|3S|ax|g2sYq;!X7<6pb z4SoH!%daYk%n>OPnX~uabGcQ52b4CYFR{wtIPD)|a??!AL?r6(wJW>C*#ugfiepzb zHyNDT{QlML3sr7&9h2Q(=c+olaoWEApS&n9`1YjI|19JJ^wpdjc(V8J(&!;^N%?46?GU@}eYWK5f0$?TXV>%3R`Zj4&uIqs1yt=KX_E-miex$QHazFK-DdWL`#hvHo&EBOs2u`?g8y?yz>r>ML|1;5gq xK-cMA5|db^XBIePHCR~-NG<(|%=!PB|FpGEp0P-FHvADa-%> literal 33778 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
Cgkz8{(3wDa_{SsR^V+#lRKd*W~8lp2ly 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 M>FVdQ&MBb@0FZxo@c;k- diff --git a/home-assistant.conf.default b/home-assistant.conf.default index d0ae2c4738c..5227d34ef99 100644 --- a/home-assistant.conf.default +++ b/home-assistant.conf.default @@ -2,7 +2,7 @@ latitude=32.87336 longitude=-117.22743 -[httpinterface] +[http] api_password=mypass [light.hue] diff --git a/homeassistant/__init__.py b/homeassistant/__init__.py index 75204036e17..b7962442501 100644 --- a/homeassistant/__init__.py +++ b/homeassistant/__init__.py @@ -9,6 +9,7 @@ of entities and react to changes. import time import logging import threading +import enum import datetime as dt import functools as ft @@ -40,24 +41,21 @@ class HomeAssistant(object): """ Core class to route all communication to right components. """ def __init__(self): - self._pool = pool = _create_worker_pool() + self._pool = pool = create_worker_pool() self.bus = EventBus(pool) - self.states = StateMachine(self.bus) self.services = ServiceRegistry(self.bus, pool) + self.states = StateMachine(self.bus) - def start(self, non_blocking=False): - """ Start home assistant. - Set non_blocking to True if you don't want this method to block - as long as Home Assistant is running. """ - + def start(self): + """ Start home assistant. """ Timer(self) self.bus.fire(EVENT_HOMEASSISTANT_START) - if non_blocking: - return - + def block_till_stopped(self): + """ Will register service homeassistant/stop and + will block until called. """ request_shutdown = threading.Event() self.services.register(DOMAIN, SERVICE_HOMEASSISTANT_STOP, @@ -96,6 +94,7 @@ class HomeAssistant(object): def state_listener(event): """ The listener that listens for specific state changes. """ if entity_id == event.data['entity_id'] and \ + 'old_state' in event.data and \ _matcher(event.data['old_state'].state, from_state) and \ _matcher(event.data['new_state'].state, to_state): @@ -235,7 +234,7 @@ class JobPriority(util.OrderedEnum): return JobPriority.EVENT_DEFAULT -def _create_worker_pool(thread_count=POOL_NUM_THREAD): +def create_worker_pool(thread_count=POOL_NUM_THREAD): """ Creates a worker pool to be used. """ logger = logging.getLogger(__name__) @@ -264,22 +263,37 @@ def _create_worker_pool(thread_count=POOL_NUM_THREAD): return util.ThreadPool(thread_count, job_handler, busy_callback) +class EventOrigin(enum.Enum): + """ Distinguish between origin of event. """ + # pylint: disable=no-init + + local = "LOCAL" + remote = "REMOTE" + + def __str__(self): + return self.value + + # pylint: disable=too-few-public-methods class Event(object): """ Represents an event within the Bus. """ - __slots__ = ['event_type', 'data'] + __slots__ = ['event_type', 'data', 'origin'] - def __init__(self, event_type, data=None): + def __init__(self, event_type, data=None, origin=EventOrigin.local): self.event_type = event_type self.data = data or {} + self.origin = origin def __repr__(self): + # pylint: disable=maybe-no-member if self.data: - return "".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()