{"action":"created","comment":{"url":"https://api.github.com/repos/home-assistant/home-assistant/pulls/comments/219682359","pull_request_review_id":157922555,"id":219682359,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxOTY4MjM1OQ==","diff_hunk":"@@ -0,0 +1,463 @@\n+\"\"\"Support for Honeywell evohome (EMEA/EU-based systems only).\n+\n+Support for a temperature control system (TCS, controller) with 0+ heating\n+zones (e.g. TRVs, relays) and, optionally, a DHW controller.\n+\n+For more details about this platform, please refer to the documentation at\n+https://home-assistant.io/components/evohome/\n+\"\"\"\n+\n+from datetime import datetime, timedelta\n+import logging\n+from requests.exceptions import HTTPError\n+\n+from homeassistant.components.climate import (\n+    ClimateDevice,\n+    SUPPORT_OPERATION_MODE,\n+    SUPPORT_AWAY_MODE,\n+)\n+\n+from homeassistant.components.evohome import (\n+    CONF_LOCATION_IDX,\n+    DATA_EVOHOME,\n+    DISPATCHER_EVOHOME,\n+    MAX_TEMP,\n+    MIN_TEMP,\n+    SCAN_INTERVAL_MAX\n+)\n+\n+from homeassistant.const import (\n+    CONF_SCAN_INTERVAL,\n+    PRECISION_TENTHS,\n+    TEMP_CELSIUS,\n+    HTTP_TOO_MANY_REQUESTS,\n+)\n+\n+from homeassistant.core import callback\n+\n+_LOGGER = logging.getLogger(__name__)\n+\n+# Usually, only the controller does client api I/O during update()s to pull\n+# current state - the exception is when zones pull their own schedules during\n+# their own update()s. It is safe for them to do so concurrently.\n+PARALLEL_UPDATES = 0\n+\n+# these are for the controller's opmode/state and the zone's state\n+EVO_RESET = 'AutoWithReset'\n+EVO_AUTO = 'Auto'\n+EVO_AUTOECO = 'AutoWithEco'\n+EVO_AWAY = 'Away'\n+EVO_DAYOFF = 'DayOff'\n+EVO_CUSTOM = 'Custom'\n+EVO_HEATOFF = 'HeatingOff'\n+\n+TCS_MODES = [\n+    EVO_RESET,\n+    EVO_AUTO,\n+    EVO_AUTOECO,\n+    EVO_AWAY,\n+    EVO_DAYOFF,\n+    EVO_CUSTOM,\n+    EVO_HEATOFF\n+]\n+\n+# bit masks for dispatcher packets\n+EVO_PARENT = 0x01\n+EVO_CHILD = 0x02\n+\n+# these are used to help prevent E501 (line too long) violations\n+GWS = 'gateways'\n+TCS = 'temperatureControlSystems'\n+\n+\n+def setup_platform(hass, config, add_entities, discovery_info=None):\n+    \"\"\"Create a Honeywell (EMEA/EU) evohome CH/DHW system.\n+\n+    An evohome system consists of: a controller, with 0-12 heating zones (e.g.\n+    TRVs, relays) and, optionally, a DHW controller (a HW boiler).\n+\n+    Here, we add the controller, and the zones (if there are any).\n+    \"\"\"\n+    client = hass.data[DATA_EVOHOME]['client']\n+    loc_idx = hass.data[DATA_EVOHOME]['params'][CONF_LOCATION_IDX]\n+\n+# Collect the (master) controller - evohomeclient has no defined way of\n+# accessing non-default location other than using the protected member\n+    tcs_obj_ref = client.locations[loc_idx]._gateways[0]._control_systems[0]    # noqa E501; pylint: disable=protected-access\n+\n+    _LOGGER.debug(\n+        \"setup_platform(): Found Controller [idx=%s]: id: %s [%s], type: %s\",\n+        loc_idx,\n+        tcs_obj_ref.systemId,\n+        tcs_obj_ref.location.name,\n+        tcs_obj_ref.modelType\n+    )\n+    master = EvoController(hass, client, tcs_obj_ref)\n+    add_entities([master], update_before_add=False)\n+\n+    return True\n+\n+\n+class EvoController(ClimateDevice):\n+    \"\"\"Base for a Honeywell evohome hub/Controller device.\n+\n+    The Controller (aka TCS, temperature control system) is the parent of all\n+    the child (CH/DHW) devices.\n+    \"\"\"\n+\n+    def __init__(self, hass, client, obj_ref):\n+        \"\"\"Initialize the evohome entity.\n+\n+        Most read-only properties are set here.  So are pseudo read-only,\n+        for example name (which _could_ change between update()s).\n+        \"\"\"\n+        # Set the usual object references\n+        self.hass = hass\n+        self.client = client\n+        domain_data = hass.data[DATA_EVOHOME]\n+\n+        self._obj = obj_ref\n+        self._type = EVO_PARENT\n+\n+        # Set the entity's own object reference & identifier\n+        self._id = obj_ref.systemId\n+\n+        # Set the entity's configuration shortcut (considered static)\n+        self._config = domain_data['config'][GWS][0][TCS][0]\n+        self._params = domain_data['params']\n+\n+        # Set the entity's name (treated as static vales)\n+        self._name = domain_data['config']['locationInfo']['name']\n+\n+        # Set the entity's supported features\n+        self._supported_features = SUPPORT_OPERATION_MODE | SUPPORT_AWAY_MODE\n+\n+        # Set the entity's operation list - hard-coded for a particular order,\n+        # instead of using self._config['allowedSystemModes']\n+        self._op_list = TCS_MODES\n+\n+        # Create timers, etc. - they're maintained in update(), or schedule()\n+        self._status = {}\n+        self._timers = domain_data['timers']\n+\n+        self._timers['statusUpdated'] = datetime.min\n+        domain_data['schedules'] = {}\n+\n+        # Set the entity's (initial) behaviour\n+        self._available = False  # will be True after first update()\n+\n+        # Create a listener for (internal) update packets...\n+        hass.helpers.dispatcher.dispatcher_connect(\n+            DISPATCHER_EVOHOME,\n+            self._connect\n+        )  # for: def async_dispatcher_connect(signal, target)\n+\n+        if _LOGGER.isEnabledFor(logging.DEBUG):\n+            tmp_dict = dict(self._config)\n+            if 'zones' in tmp_dict:\n+                tmp_dict['zones'] = '...'\n+            if 'dhw' in tmp_dict:\n+                tmp_dict['dhw'] = '...'\n+\n+            _LOGGER.debug(\n+                \"__init__(%s), self._config = %s\",\n+                self._id + \" [\" + self._name + \"]\",\n+                tmp_dict\n+            )\n+            _LOGGER.debug(\n+                \"__init__(%s), self._timers = %s\",\n+                self._id + \" [\" + self._name + \"]\",\n+                self._timers\n+            )\n+            _LOGGER.debug(\n+                \"__init__(%s), self._params = %s\",\n+                self._id + \" [\" + self._name + \"]\",\n+                self._params\n+            )\n+\n+    def _handle_requests_exceptions(self, err_hint, err):\n+        # evohomeclient v1 api (<=0.2.7) does not handle requests exceptions,\n+        # but we can catch them and extract the r.response, incl.:\n+        # {\n+        #   'code':    'TooManyRequests',\n+        #   'message': 'Request count limitation exceeded, ...'\n+        # }\n+        if err_hint == \"TooManyRequests\":  # not actually from requests library\n+            api_rate_limit_exceeded = True\n+            api_ver = \"v1\"\n+\n+        # evohomeclient v2 api (>=0.2.7) exposes requests exceptions, incl.:\n+        # - HTTP_BAD_REQUEST, is usually Bad user credentials\n+        # - HTTP_TOO_MANY_REQUESTS, is api usuage limit exceeded\n+        # - HTTP_SERVICE_UNAVAILABLE, is often Vendor's fault\n+        elif err_hint == \"HTTPError\" and \\\n+                str(HTTP_TOO_MANY_REQUESTS) in str(err):\n+            api_rate_limit_exceeded = True\n+            api_ver = \"v2\"\n+\n+        # we can't handle any other exceptions here\n+        else:\n+            api_rate_limit_exceeded = False\n+\n+        # do we need to back off?\n+        if api_rate_limit_exceeded is True:\n+            # so increase the scan_interval\n+            old_scan_interval = self._params[CONF_SCAN_INTERVAL]\n+            new_scan_interval = min(old_scan_interval * 2, SCAN_INTERVAL_MAX)\n+            self._params[CONF_SCAN_INTERVAL] = new_scan_interval\n+\n+            _LOGGER.warning(\n+                \"API rate limit has been exceeded (for %s api), \"\n+                \"increasing '%s' from %s to %s seconds, and \"\n+                \"suspending polling for (at least) %s seconds.\",\n+                api_ver,\n+                CONF_SCAN_INTERVAL,\n+                old_scan_interval,\n+                new_scan_interval,\n+                new_scan_interval * 3\n+            )\n+\n+            # and also wait for a short while - 3 scan_intervals\n+            self._timers['statusUpdated'] = datetime.now() + \\\n+                timedelta(seconds=new_scan_interval * 3)\n+\n+        else:\n+            raise err\n+\n+    @callback\n+    def _connect(self, packet):\n+        \"\"\"Process a dispatcher connect.\"\"\"\n+        if packet['to'] & self._type and packet['signal'] == 'update':\n+            self.async_schedule_update_ha_state(force_refresh=True)\n+\n+    @property\n+    def name(self):\n+        \"\"\"Return the name to use in the frontend UI.\"\"\"\n+        return self._name\n+\n+    @property\n+    def available(self):\n+        \"\"\"Return True is the device is available.\n+\n+        All evohome entities are initially unavailable. Once HA has started,\n+        state data is then retrieved by the Controller, and then the children\n+        will get a state (e.g. operating_mode, current_temperature).\n+\n+        However, evohome entities can become unavailable for other reasons.\n+        \"\"\"\n+        return self._available\n+\n+    @property\n+    def supported_features(self):\n+        \"\"\"Get the list of supported features of the Controller.\"\"\"\n+        return self._supported_features\n+\n+    @property\n+    def operation_list(self):\n+        \"\"\"Return the list of available operations.\n+\n+        Note that, for evohome, the operating mode is determined by - but not\n+        equivalent to - the last operation (from the operation list).\n+        \"\"\"\n+        return self._op_list\n+\n+    @property\n+    def current_operation(self):\n+        \"\"\"Return the operation mode of the evohome entity.\"\"\"\n+        return self._status['systemModeStatus']['mode']\n+\n+    @property\n+    def target_temperature(self):\n+        \"\"\"Return the average target temperature of the Heating/DHW zones.\"\"\"\n+        temps = [zone['setpointStatus']['targetHeatTemperature']\n+                 for zone in self._status['zones']]\n+\n+        avg_temp = sum(temps) / len(temps) if temps else None\n+        return round(avg_temp, 1)","path":"homeassistant/components/climate/evohome.py","position":265,"original_position":276,"commit_id":"3931a3deb58f67c0cb03280395e142606e5b5b12","original_commit_id":"c10922f8c2cea881e8023df0f3c9ab04584214bb","user":{"login":"zxdavb","id":6784264,"node_id":"MDQ6VXNlcjY3ODQyNjQ=","avatar_url":"https://avatars3.githubusercontent.com/u/6784264?v=4","gravatar_id":"","url":"https://api.github.com/users/zxdavb","html_url":"https://github.com/zxdavb","followers_url":"https://api.github.com/users/zxdavb/followers","following_url":"https://api.github.com/users/zxdavb/following{/other_user}","gists_url":"https://api.github.com/users/zxdavb/gists{/gist_id}","starred_url":"https://api.github.com/users/zxdavb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zxdavb/subscriptions","organizations_url":"https://api.github.com/users/zxdavb/orgs","repos_url":"https://api.github.com/users/zxdavb/repos","events_url":"https://api.github.com/users/zxdavb/events{/privacy}","received_events_url":"https://api.github.com/users/zxdavb/received_events","type":"User","site_admin":false},"body":"Fixed","created_at":"2018-09-22T21:12:55Z","updated_at":"2018-09-22T21:12:55Z","html_url":"https://github.com/home-assistant/home-assistant/pull/16427#discussion_r219682359","pull_request_url":"https://api.github.com/repos/home-assistant/home-assistant/pulls/16427","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/home-assistant/home-assistant/pulls/comments/219682359"},"html":{"href":"https://github.com/home-assistant/home-assistant/pull/16427#discussion_r219682359"},"pull_request":{"href":"https://api.github.com/repos/home-assistant/home-assistant/pulls/16427"}},"in_reply_to_id":219663959},"pull_request":{"url":"https://api.github.com/repos/home-assistant/home-assistant/pulls/16427","id":213130863,"node_id":"MDExOlB1bGxSZXF1ZXN0MjEzMTMwODYz","html_url":"https://github.com/home-assistant/home-assistant/pull/16427","diff_url":"https://github.com/home-assistant/home-assistant/pull/16427.diff","patch_url":"https://github.com/home-assistant/home-assistant/pull/16427.patch","issue_url":"https://api.github.com/repos/home-assistant/home-assistant/issues/16427","number":16427,"state":"open","locked":false,"title":"Add (EU-based) Honeywell evohome CH/DHW controller","user":{"login":"zxdavb","id":6784264,"node_id":"MDQ6VXNlcjY3ODQyNjQ=","avatar_url":"https://avatars3.githubusercontent.com/u/6784264?v=4","gravatar_id":"","url":"https://api.github.com/users/zxdavb","html_url":"https://github.com/zxdavb","followers_url":"https://api.github.com/users/zxdavb/followers","following_url":"https://api.github.com/users/zxdavb/following{/other_user}","gists_url":"https://api.github.com/users/zxdavb/gists{/gist_id}","starred_url":"https://api.github.com/users/zxdavb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zxdavb/subscriptions","organizations_url":"https://api.github.com/users/zxdavb/orgs","repos_url":"https://api.github.com/users/zxdavb/repos","events_url":"https://api.github.com/users/zxdavb/events{/privacy}","received_events_url":"https://api.github.com/users/zxdavb/received_events","type":"User","site_admin":false},"body":"## Honeywell evohome CH/DHW Controllers (EU/EMEA only)\r\n\r\nThis is a hub component (for it's slave heating zones, with/without a DHW controller, a.k.a. boiler), and a climate entity.  Thus implemented as a evohome component.\r\n\r\nNo support for heating zones, DHW controller as yet - this will be added in future PRs.\r\n\r\n## Description:\r\nSupport for a EU/EMEA-based Honeywell evohome controllers accessible via [mytotalconnectcomfort.com](mytotalconnectcomfort.com)  Such systems consists of a 'location' with a temperature control system (TCS, controller) with 0-12 heating zones (e.g. TRVs, UFH relays) and, optionally, a DHW controller.\r\n\r\nTo be clear, this component uses the **evohomeclient** client library, and _does not_ (can not) support US-based systems (`honeywell.py` uses two distinct client libraries, **evohomeclient**, and **somecomfort**).\r\n\r\n**Related issue (if applicable):**\r\nAddresses many of the limitations of the existing `honeywell.py` component:\r\n- exposes the controller, and provides access to its operating modes (e.g. proper Away mode support)\r\n- permits access to locations other than location 0 (or, more simply, you have multiple controllers - you can choose only one, though)\r\n- TBA: exposes the DHW controller, and exposes its operating modes, etc.\r\n- TBA: allows access to higher-precision `current_temperatures` via the v1 client library (0.1 displayed, 0.01 logged)\r\n- significant improvements to efficiency (e.g. batching `add_entities()`, and initial update of state delayed until after `EVENT_HOMEASSISTANT_START`)\r\n- many fewer api calls / `scan_interval` - it seems you can safely use a `scan_interval` of 60 seconds\r\n- TBA: access to schedules & setpoints (read-only for now)\r\n\r\nThis component uses v2 of the **evohomeclient** client library (`honeywell.py` uses v1 only), with many new features/bug fixes:\r\n- uses newer api, exposing more information\r\n- resolve LOGGER bug (via a workaround in the component)\r\n- much better exception handling\r\n\r\n**Pull request in [home-assistant.github.io](https://github.com/home-assistant/home-assistant.github.io) with documentation (if applicable):** home-assistant/home-assistant.github.io#6252\r\n\r\n## Example entry for `configuration.yaml` (if applicable):\r\n```yaml\r\nevohome:\r\n  username: !secret evohome_username\r\n  password: !secret evohome_password\r\n\r\n# scan_interval: 300     # seconds, you can probably get away with 60\r\n# location_idx: 0        # if you have more than 1 location, use this\r\n```\r\n\r\n## Checklist:\r\n  - [x] The code change is tested and works locally.\r\n  - [x] Local tests pass with `tox`. **Your PR cannot be merged unless tests pass**\r\n\r\nIf user exposed functionality or configuration variables are added/changed:\r\n  - [x] Documentation added/updated in [home-assistant.github.io](https://github.com/home-assistant/home-assistant.github.io)\r\n\r\nIf the code communicates with devices, web services, or third-party tools:\r\n  - [x] New dependencies have been added to the `REQUIREMENTS` variable ([example][ex-requir]).\r\n  - [x] New dependencies are only imported inside functions that use them ([example][ex-import]).\r\n  - [x] New or updated dependencies have been added to `requirements_all.txt` by running `script/gen_requirements_all.py`.\r\n  - [x] New files were added to `.coveragerc`.\r\n\r\nIf the code does not interact with devices:\r\n  - [ N/A ] Tests have been added to verify that the new code works.\r\n\r\n[ex-requir]: https://github.com/home-assistant/home-assistant/blob/dev/homeassistant/components/keyboard.py#L14\r\n[ex-import]: https://github.com/home-assistant/home-assistant/blob/dev/homeassistant/components/keyboard.py#L54\r\n","created_at":"2018-09-04T23:31:53Z","updated_at":"2018-09-22T21:12:55Z","closed_at":null,"merged_at":null,"merge_commit_sha":"19233b018e134a8eff0e189daa0f813fe1a31322","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":527871105,"node_id":"MDU6TGFiZWw1Mjc4NzExMDU=","url":"https://api.github.com/repos/home-assistant/home-assistant/labels/cla-signed","name":"cla-signed","color":"008000","default":false},{"id":1045942143,"node_id":"MDU6TGFiZWwxMDQ1OTQyMTQz","url":"https://api.github.com/repos/home-assistant/home-assistant/labels/component:%20evohome","name":"component: evohome","color":"ededed","default":false},{"id":451931292,"node_id":"MDU6TGFiZWw0NTE5MzEyOTI=","url":"https://api.github.com/repos/home-assistant/home-assistant/labels/core","name":"core","color":"c5def5","default":false},{"id":955422305,"node_id":"MDU6TGFiZWw5NTU0MjIzMDU=","url":"https://api.github.com/repos/home-assistant/home-assistant/labels/in%20progress","name":"in progress","color":"ededed","default":false},{"id":526146744,"node_id":"MDU6TGFiZWw1MjYxNDY3NDQ=","url":"https://api.github.com/repos/home-assistant/home-assistant/labels/new-platform","name":"new-platform","color":"ededed","default":false},{"id":1045942142,"node_id":"MDU6TGFiZWwxMDQ1OTQyMTQy","url":"https://api.github.com/repos/home-assistant/home-assistant/labels/platform:%20climate.evohome","name":"platform: climate.evohome","color":"ededed","default":false},{"id":553322176,"node_id":"MDU6TGFiZWw1NTMzMjIxNzY=","url":"https://api.github.com/repos/home-assistant/home-assistant/labels/platform:%20climate.honeywell","name":"platform: climate.honeywell","color":"ededed","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/home-assistant/home-assistant/pulls/16427/commits","review_comments_url":"https://api.github.com/repos/home-assistant/home-assistant/pulls/16427/comments","review_comment_url":"https://api.github.com/repos/home-assistant/home-assistant/pulls/comments{/number}","comments_url":"https://api.github.com/repos/home-assistant/home-assistant/issues/16427/comments","statuses_url":"https://api.github.com/repos/home-assistant/home-assistant/statuses/3931a3deb58f67c0cb03280395e142606e5b5b12","head":{"label":"zxdavb:evohome-component","ref":"evohome-component","sha":"3931a3deb58f67c0cb03280395e142606e5b5b12","user":{"login":"zxdavb","id":6784264,"node_id":"MDQ6VXNlcjY3ODQyNjQ=","avatar_url":"https://avatars3.githubusercontent.com/u/6784264?v=4","gravatar_id":"","url":"https://api.github.com/users/zxdavb","html_url":"https://github.com/zxdavb","followers_url":"https://api.github.com/users/zxdavb/followers","following_url":"https://api.github.com/users/zxdavb/following{/other_user}","gists_url":"https://api.github.com/users/zxdavb/gists{/gist_id}","starred_url":"https://api.github.com/users/zxdavb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zxdavb/subscriptions","organizations_url":"https://api.github.com/users/zxdavb/orgs","repos_url":"https://api.github.com/users/zxdavb/repos","events_url":"https://api.github.com/users/zxdavb/events{/privacy}","received_events_url":"https://api.github.com/users/zxdavb/received_events","type":"User","site_admin":false},"repo":{"id":139843044,"node_id":"MDEwOlJlcG9zaXRvcnkxMzk4NDMwNDQ=","name":"home-assistant","full_name":"zxdavb/home-assistant","private":false,"owner":{"login":"zxdavb","id":6784264,"node_id":"MDQ6VXNlcjY3ODQyNjQ=","avatar_url":"https://avatars3.githubusercontent.com/u/6784264?v=4","gravatar_id":"","url":"https://api.github.com/users/zxdavb","html_url":"https://github.com/zxdavb","followers_url":"https://api.github.com/users/zxdavb/followers","following_url":"https://api.github.com/users/zxdavb/following{/other_user}","gists_url":"https://api.github.com/users/zxdavb/gists{/gist_id}","starred_url":"https://api.github.com/users/zxdavb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zxdavb/subscriptions","organizations_url":"https://api.github.com/users/zxdavb/orgs","repos_url":"https://api.github.com/users/zxdavb/repos","events_url":"https://api.github.com/users/zxdavb/events{/privacy}","received_events_url":"https://api.github.com/users/zxdavb/received_events","type":"User","site_admin":false},"html_url":"https://github.com/zxdavb/home-assistant","description":":house_with_garden: Open-source home automation platform running on Python 3","fork":true,"url":"https://api.github.com/repos/zxdavb/home-assistant","forks_url":"https://api.github.com/repos/zxdavb/home-assistant/forks","keys_url":"https://api.github.com/repos/zxdavb/home-assistant/keys{/key_id}","collaborators_url":"https://api.github.com/repos/zxdavb/home-assistant/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/zxdavb/home-assistant/teams","hooks_url":"https://api.github.com/repos/zxdavb/home-assistant/hooks","issue_events_url":"https://api.github.com/repos/zxdavb/home-assistant/issues/events{/number}","events_url":"https://api.github.com/repos/zxdavb/home-assistant/events","assignees_url":"https://api.github.com/repos/zxdavb/home-assistant/assignees{/user}","branches_url":"https://api.github.com/repos/zxdavb/home-assistant/branches{/branch}","tags_url":"https://api.github.com/repos/zxdavb/home-assistant/tags","blobs_url":"https://api.github.com/repos/zxdavb/home-assistant/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/zxdavb/home-assistant/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/zxdavb/home-assistant/git/refs{/sha}","trees_url":"https://api.github.com/repos/zxdavb/home-assistant/git/trees{/sha}","statuses_url":"https://api.github.com/repos/zxdavb/home-assistant/statuses/{sha}","languages_url":"https://api.github.com/repos/zxdavb/home-assistant/languages","stargazers_url":"https://api.github.com/repos/zxdavb/home-assistant/stargazers","contributors_url":"https://api.github.com/repos/zxdavb/home-assistant/contributors","subscribers_url":"https://api.github.com/repos/zxdavb/home-assistant/subscribers","subscription_url":"https://api.github.com/repos/zxdavb/home-assistant/subscription","commits_url":"https://api.github.com/repos/zxdavb/home-assistant/commits{/sha}","git_commits_url":"https://api.github.com/repos/zxdavb/home-assistant/git/commits{/sha}","comments_url":"https://api.github.com/repos/zxdavb/home-assistant/comments{/number}","issue_comment_url":"https://api.github.com/repos/zxdavb/home-assistant/issues/comments{/number}","contents_url":"https://api.github.com/repos/zxdavb/home-assistant/contents/{+path}","compare_url":"https://api.github.com/repos/zxdavb/home-assistant/compare/{base}...{head}","merges_url":"https://api.github.com/repos/zxdavb/home-assistant/merges","archive_url":"https://api.github.com/repos/zxdavb/home-assistant/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/zxdavb/home-assistant/downloads","issues_url":"https://api.github.com/repos/zxdavb/home-assistant/issues{/number}","pulls_url":"https://api.github.com/repos/zxdavb/home-assistant/pulls{/number}","milestones_url":"https://api.github.com/repos/zxdavb/home-assistant/milestones{/number}","notifications_url":"https://api.github.com/repos/zxdavb/home-assistant/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/zxdavb/home-assistant/labels{/name}","releases_url":"https://api.github.com/repos/zxdavb/home-assistant/releases{/id}","deployments_url":"https://api.github.com/repos/zxdavb/home-assistant/deployments","created_at":"2018-07-05T11:59:29Z","updated_at":"2018-09-05T07:19:10Z","pushed_at":"2018-09-22T08:50:49Z","git_url":"git://github.com/zxdavb/home-assistant.git","ssh_url":"git@github.com:zxdavb/home-assistant.git","clone_url":"https://github.com/zxdavb/home-assistant.git","svn_url":"https://github.com/zxdavb/home-assistant","homepage":"https://home-assistant.io","size":89159,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"dev"}},"base":{"label":"home-assistant:dev","ref":"dev","sha":"3e59ffb33a1542bf94199160f17de53fdec05abf","user":{"login":"home-assistant","id":13844975,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEzODQ0OTc1","avatar_url":"https://avatars3.githubusercontent.com/u/13844975?v=4","gravatar_id":"","url":"https://api.github.com/users/home-assistant","html_url":"https://github.com/home-assistant","followers_url":"https://api.github.com/users/home-assistant/followers","following_url":"https://api.github.com/users/home-assistant/following{/other_user}","gists_url":"https://api.github.com/users/home-assistant/gists{/gist_id}","starred_url":"https://api.github.com/users/home-assistant/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/home-assistant/subscriptions","organizations_url":"https://api.github.com/users/home-assistant/orgs","repos_url":"https://api.github.com/users/home-assistant/repos","events_url":"https://api.github.com/users/home-assistant/events{/privacy}","received_events_url":"https://api.github.com/users/home-assistant/received_events","type":"Organization","site_admin":false},"repo":{"id":12888993,"node_id":"MDEwOlJlcG9zaXRvcnkxMjg4ODk5Mw==","name":"home-assistant","full_name":"home-assistant/home-assistant","private":false,"owner":{"login":"home-assistant","id":13844975,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEzODQ0OTc1","avatar_url":"https://avatars3.githubusercontent.com/u/13844975?v=4","gravatar_id":"","url":"https://api.github.com/users/home-assistant","html_url":"https://github.com/home-assistant","followers_url":"https://api.github.com/users/home-assistant/followers","following_url":"https://api.github.com/users/home-assistant/following{/other_user}","gists_url":"https://api.github.com/users/home-assistant/gists{/gist_id}","starred_url":"https://api.github.com/users/home-assistant/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/home-assistant/subscriptions","organizations_url":"https://api.github.com/users/home-assistant/orgs","repos_url":"https://api.github.com/users/home-assistant/repos","events_url":"https://api.github.com/users/home-assistant/events{/privacy}","received_events_url":"https://api.github.com/users/home-assistant/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/home-assistant/home-assistant","description":":house_with_garden: Open source home automation that puts local control and privacy first","fork":false,"url":"https://api.github.com/repos/home-assistant/home-assistant","forks_url":"https://api.github.com/repos/home-assistant/home-assistant/forks","keys_url":"https://api.github.com/repos/home-assistant/home-assistant/keys{/key_id}","collaborators_url":"https://api.github.com/repos/home-assistant/home-assistant/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/home-assistant/home-assistant/teams","hooks_url":"https://api.github.com/repos/home-assistant/home-assistant/hooks","issue_events_url":"https://api.github.com/repos/home-assistant/home-assistant/issues/events{/number}","events_url":"https://api.github.com/repos/home-assistant/home-assistant/events","assignees_url":"https://api.github.com/repos/home-assistant/home-assistant/assignees{/user}","branches_url":"https://api.github.com/repos/home-assistant/home-assistant/branches{/branch}","tags_url":"https://api.github.com/repos/home-assistant/home-assistant/tags","blobs_url":"https://api.github.com/repos/home-assistant/home-assistant/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/home-assistant/home-assistant/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/home-assistant/home-assistant/git/refs{/sha}","trees_url":"https://api.github.com/repos/home-assistant/home-assistant/git/trees{/sha}","statuses_url":"https://api.github.com/repos/home-assistant/home-assistant/statuses/{sha}","languages_url":"https://api.github.com/repos/home-assistant/home-assistant/languages","stargazers_url":"https://api.github.com/repos/home-assistant/home-assistant/stargazers","contributors_url":"https://api.github.com/repos/home-assistant/home-assistant/contributors","subscribers_url":"https://api.github.com/repos/home-assistant/home-assistant/subscribers","subscription_url":"https://api.github.com/repos/home-assistant/home-assistant/subscription","commits_url":"https://api.github.com/repos/home-assistant/home-assistant/commits{/sha}","git_commits_url":"https://api.github.com/repos/home-assistant/home-assistant/git/commits{/sha}","comments_url":"https://api.github.com/repos/home-assistant/home-assistant/comments{/number}","issue_comment_url":"https://api.github.com/repos/home-assistant/home-assistant/issues/comments{/number}","contents_url":"https://api.github.com/repos/home-assistant/home-assistant/contents/{+path}","compare_url":"https://api.github.com/repos/home-assistant/home-assistant/compare/{base}...{head}","merges_url":"https://api.github.com/repos/home-assistant/home-assistant/merges","archive_url":"https://api.github.com/repos/home-assistant/home-assistant/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/home-assistant/home-assistant/downloads","issues_url":"https://api.github.com/repos/home-assistant/home-assistant/issues{/number}","pulls_url":"https://api.github.com/repos/home-assistant/home-assistant/pulls{/number}","milestones_url":"https://api.github.com/repos/home-assistant/home-assistant/milestones{/number}","notifications_url":"https://api.github.com/repos/home-assistant/home-assistant/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/home-assistant/home-assistant/labels{/name}","releases_url":"https://api.github.com/repos/home-assistant/home-assistant/releases{/id}","deployments_url":"https://api.github.com/repos/home-assistant/home-assistant/deployments","created_at":"2013-09-17T07:29:48Z","updated_at":"2018-09-22T20:54:14Z","pushed_at":"2018-09-22T16:25:20Z","git_url":"git://github.com/home-assistant/home-assistant.git","ssh_url":"git@github.com:home-assistant/home-assistant.git","clone_url":"https://github.com/home-assistant/home-assistant.git","svn_url":"https://github.com/home-assistant/home-assistant","homepage":"https://www.home-assistant.io","size":89668,"stargazers_count":16888,"watchers_count":16888,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":4966,"mirror_url":null,"archived":false,"open_issues_count":876,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":4966,"open_issues":876,"watchers":16888,"default_branch":"dev"}},"_links":{"self":{"href":"https://api.github.com/repos/home-assistant/home-assistant/pulls/16427"},"html":{"href":"https://github.com/home-assistant/home-assistant/pull/16427"},"issue":{"href":"https://api.github.com/repos/home-assistant/home-assistant/issues/16427"},"comments":{"href":"https://api.github.com/repos/home-assistant/home-assistant/issues/16427/comments"},"review_comments":{"href":"https://api.github.com/repos/home-assistant/home-assistant/pulls/16427/comments"},"review_comment":{"href":"https://api.github.com/repos/home-assistant/home-assistant/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/home-assistant/home-assistant/pulls/16427/commits"},"statuses":{"href":"https://api.github.com/repos/home-assistant/home-assistant/statuses/3931a3deb58f67c0cb03280395e142606e5b5b12"}},"author_association":"NONE"}}
{"actor":{"display_login":"zxdavb"}}