{"action":"created","comment":{"url":"https://api.github.com/repos/home-assistant/home-assistant/pulls/comments/171644914","pull_request_review_id":100535459,"id":171644914,"diff_hunk":"@@ -0,0 +1,118 @@\n+\"\"\"Class to hold all thermostat accessories.\"\"\"\n+import logging\n+from threading import Timer\n+\n+from homeassistant.components.climate import (ATTR_CURRENT_TEMPERATURE, ATTR_TEMPERATURE, ATTR_OPERATION_MODE,\n+                                              STATE_HEAT, STATE_COOL)\n+from homeassistant.helpers.event import async_track_state_change\n+\n+from . import TYPES\n+from .accessories import HomeAccessory\n+from .const import (SERV_THERMOSTAT, CHAR_CURRENT_HEATING_COOLING, CHAR_TARGET_HEATING_COOLING,\n+                    CHAR_CURRENT_TEMPERATURE, CHAR_TARGET_TEMPERATURE, CHAR_TEMP_DISPLAY_UNITS)\n+\n+_LOGGER = logging.getLogger(__name__)\n+\n+UNIT_HASS_TO_HOMEKIT = {'°C': 0, '°F': 1}\n+UNIT_HOMEKIT_TO_HASS = {c: s for s, c in UNIT_HASS_TO_HOMEKIT.items()}\n+HC_HASS_TO_HOMEKIT = {'off': 0, STATE_HEAT: 1, STATE_COOL: 2}\n+HC_HOMEKIT_TO_HASS = {c: s for s, c in HC_HASS_TO_HOMEKIT.items()}\n+\n+\n+@TYPES.register('Thermostat')\n+class Thermostat(HomeAccessory):\n+    \"\"\"Generate a Thermostat accessory for an alarm control panel.\"\"\"\n+\n+    def __init__(self, hass, entity_id, display_name):\n+        \"\"\"Initialize a Thermostat accessory object.\"\"\"\n+        super().__init__(display_name, entity_id, 'THERMOSTAT')\n+\n+        self._hass = hass\n+        self._entity_id = entity_id\n+        self._call_timer = None\n+\n+        self.current_heat_cool = None\n+        self.homekit_target_heat_cool = None\n+        self.current_temperature = None\n+        self.homekit_target_temperature = None\n+        self.target_temperature = None\n+        self.display_units = None\n+\n+        self.service_thermostat = self.get_service(SERV_THERMOSTAT)\n+        self.char_current_heat_cool = self.service_thermostat.get_characteristic(CHAR_CURRENT_HEATING_COOLING)\n+        self.char_target_heat_cool = self.service_thermostat.get_characteristic(CHAR_TARGET_HEATING_COOLING)\n+        self.char_target_heat_cool.setter_callback = self.set_heat_cool\n+\n+        self.char_current_temp = self.service_thermostat.get_characteristic(CHAR_CURRENT_TEMPERATURE)\n+        self.char_target_temp = self.service_thermostat.get_characteristic(CHAR_TARGET_TEMPERATURE)\n+        self.char_target_temp.setter_callback = self.set_temperature_debounced\n+\n+        self.char_display_units = self.service_thermostat.get_characteristic(CHAR_TEMP_DISPLAY_UNITS)\n+\n+    def run(self):\n+        \"\"\"Method called be object after driver is started.\"\"\"\n+        state = self._hass.states.get(self._entity_id)\n+        self.update_thermostat(new_state=state)\n+\n+        async_track_state_change(self._hass, self._entity_id, self.update_thermostat)\n+\n+    def set_heat_cool(self, value):\n+        \"\"\"Move operation mode to value if call came from homekit.\"\"\"\n+        if value != self.current_heat_cool and value in HC_HOMEKIT_TO_HASS:\n+            _LOGGER.debug(\"%s: Set heat-cool to %d\", self._entity_id, value)\n+            self.homekit_target_heat_cool = value\n+            hass_value = HC_HOMEKIT_TO_HASS[value]\n+\n+            self._hass.services.call('climate', 'set_operation_mode',\n+                                     {'entity_id': self._entity_id, 'operation_mode': hass_value})\n+\n+    def set_temperature_debounced(self, value):\n+        _LOGGER.debug(\"%s: Call to set temperature to %.2f\", self._entity_id, value)\n+\n+        def perform_call():\n+            self.set_target_temperature(value)\n+        # Cancel timer if one was running\n+        if self._call_timer is not None:\n+            try:\n+                self._call_timer.cancel()\n+            except AttributeError:\n+                pass\n+        self._call_timer = Timer(1, perform_call)\n+        self._call_timer.start()\n+\n+    def set_target_temperature(self, value):\n+        \"\"\"Set target temperature to value if call came from homekit.\"\"\"\n+        if value != self.target_temperature:\n+            _LOGGER.debug(\"%s: Set target temperature to %.2f\", self._entity_id, value)\n+            self.homekit_target_temperature = value\n+            self._hass.services.call('climate', 'set_temperature',\n+                                     {'entity_id': self._entity_id, 'temperature': self.homekit_target_temperature})","path":"homeassistant/components/homekit/thermostats.py","position":89,"original_position":89,"commit_id":"2187e1437a6a5138bed160474cb2cdc629ab1185","original_commit_id":"2187e1437a6a5138bed160474cb2cdc629ab1185","user":{"login":"houndci-bot","id":6697940,"avatar_url":"https://avatars0.githubusercontent.com/u/6697940?v=4","gravatar_id":"","url":"https://api.github.com/users/houndci-bot","html_url":"https://github.com/houndci-bot","followers_url":"https://api.github.com/users/houndci-bot/followers","following_url":"https://api.github.com/users/houndci-bot/following{/other_user}","gists_url":"https://api.github.com/users/houndci-bot/gists{/gist_id}","starred_url":"https://api.github.com/users/houndci-bot/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/houndci-bot/subscriptions","organizations_url":"https://api.github.com/users/houndci-bot/orgs","repos_url":"https://api.github.com/users/houndci-bot/repos","events_url":"https://api.github.com/users/houndci-bot/events{/privacy}","received_events_url":"https://api.github.com/users/houndci-bot/received_events","type":"User","site_admin":false},"body":"line too long (116 > 79 characters)","created_at":"2018-03-01T18:11:14Z","updated_at":"2018-03-01T18:11:16Z","html_url":"https://github.com/home-assistant/home-assistant/pull/12819#discussion_r171644914","pull_request_url":"https://api.github.com/repos/home-assistant/home-assistant/pulls/12819","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/home-assistant/home-assistant/pulls/comments/171644914"},"html":{"href":"https://github.com/home-assistant/home-assistant/pull/12819#discussion_r171644914"},"pull_request":{"href":"https://api.github.com/repos/home-assistant/home-assistant/pulls/12819"}}},"pull_request":{"url":"https://api.github.com/repos/home-assistant/home-assistant/pulls/12819","id":172312582,"html_url":"https://github.com/home-assistant/home-assistant/pull/12819","diff_url":"https://github.com/home-assistant/home-assistant/pull/12819.diff","patch_url":"https://github.com/home-assistant/home-assistant/pull/12819.patch","issue_url":"https://api.github.com/repos/home-assistant/home-assistant/issues/12819","number":12819,"state":"open","locked":false,"title":"Add support for alarm system, switch and thermostat to homekit","user":{"login":"maxclaey","id":17512341,"avatar_url":"https://avatars1.githubusercontent.com/u/17512341?v=4","gravatar_id":"","url":"https://api.github.com/users/maxclaey","html_url":"https://github.com/maxclaey","followers_url":"https://api.github.com/users/maxclaey/followers","following_url":"https://api.github.com/users/maxclaey/following{/other_user}","gists_url":"https://api.github.com/users/maxclaey/gists{/gist_id}","starred_url":"https://api.github.com/users/maxclaey/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/maxclaey/subscriptions","organizations_url":"https://api.github.com/users/maxclaey/orgs","repos_url":"https://api.github.com/users/maxclaey/repos","events_url":"https://api.github.com/users/maxclaey/events{/privacy}","received_events_url":"https://api.github.com/users/maxclaey/received_events","type":"User","site_admin":false},"body":"## Description:\r\n\r\nAdd support for alarm system, thermostat and switch (and remote represented by a switch) to homekit.\r\n\r\n## Checklist:\r\n  - [x] The code change is tested and works locally.\r\n\r\nIf the code does not interact with devices:\r\n  - [ ] Local tests with `tox` run successfully. **Your PR cannot be merged unless tests pass**\r\n  - [ ] 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-03-01T18:11:05Z","updated_at":"2018-03-01T18:11:16Z","closed_at":null,"merged_at":null,"merge_commit_sha":"86afbc342024e74f63587f492442baffbe1c8902","assignee":null,"assignees":[],"requested_reviewers":[{"login":"cdce8p","id":30130371,"avatar_url":"https://avatars2.githubusercontent.com/u/30130371?v=4","gravatar_id":"","url":"https://api.github.com/users/cdce8p","html_url":"https://github.com/cdce8p","followers_url":"https://api.github.com/users/cdce8p/followers","following_url":"https://api.github.com/users/cdce8p/following{/other_user}","gists_url":"https://api.github.com/users/cdce8p/gists{/gist_id}","starred_url":"https://api.github.com/users/cdce8p/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cdce8p/subscriptions","organizations_url":"https://api.github.com/users/cdce8p/orgs","repos_url":"https://api.github.com/users/cdce8p/repos","events_url":"https://api.github.com/users/cdce8p/events{/privacy}","received_events_url":"https://api.github.com/users/cdce8p/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":527871105,"url":"https://api.github.com/repos/home-assistant/home-assistant/labels/cla-signed","name":"cla-signed","color":"008000","default":false},{"id":840363345,"url":"https://api.github.com/repos/home-assistant/home-assistant/labels/component:%20homekit","name":"component: homekit","color":"ededed","default":false},{"id":526146744,"url":"https://api.github.com/repos/home-assistant/home-assistant/labels/new-platform","name":"new-platform","color":"ededed","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/home-assistant/home-assistant/pulls/12819/commits","review_comments_url":"https://api.github.com/repos/home-assistant/home-assistant/pulls/12819/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/12819/comments","statuses_url":"https://api.github.com/repos/home-assistant/home-assistant/statuses/2187e1437a6a5138bed160474cb2cdc629ab1185","head":{"label":"maxclaey:extend_homekit","ref":"extend_homekit","sha":"2187e1437a6a5138bed160474cb2cdc629ab1185","user":{"login":"maxclaey","id":17512341,"avatar_url":"https://avatars1.githubusercontent.com/u/17512341?v=4","gravatar_id":"","url":"https://api.github.com/users/maxclaey","html_url":"https://github.com/maxclaey","followers_url":"https://api.github.com/users/maxclaey/followers","following_url":"https://api.github.com/users/maxclaey/following{/other_user}","gists_url":"https://api.github.com/users/maxclaey/gists{/gist_id}","starred_url":"https://api.github.com/users/maxclaey/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/maxclaey/subscriptions","organizations_url":"https://api.github.com/users/maxclaey/orgs","repos_url":"https://api.github.com/users/maxclaey/repos","events_url":"https://api.github.com/users/maxclaey/events{/privacy}","received_events_url":"https://api.github.com/users/maxclaey/received_events","type":"User","site_admin":false},"repo":{"id":122356662,"name":"home-assistant","full_name":"maxclaey/home-assistant","owner":{"login":"maxclaey","id":17512341,"avatar_url":"https://avatars1.githubusercontent.com/u/17512341?v=4","gravatar_id":"","url":"https://api.github.com/users/maxclaey","html_url":"https://github.com/maxclaey","followers_url":"https://api.github.com/users/maxclaey/followers","following_url":"https://api.github.com/users/maxclaey/following{/other_user}","gists_url":"https://api.github.com/users/maxclaey/gists{/gist_id}","starred_url":"https://api.github.com/users/maxclaey/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/maxclaey/subscriptions","organizations_url":"https://api.github.com/users/maxclaey/orgs","repos_url":"https://api.github.com/users/maxclaey/repos","events_url":"https://api.github.com/users/maxclaey/events{/privacy}","received_events_url":"https://api.github.com/users/maxclaey/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/maxclaey/home-assistant","description":":house_with_garden: Open-source home automation platform running on Python 3","fork":true,"url":"https://api.github.com/repos/maxclaey/home-assistant","forks_url":"https://api.github.com/repos/maxclaey/home-assistant/forks","keys_url":"https://api.github.com/repos/maxclaey/home-assistant/keys{/key_id}","collaborators_url":"https://api.github.com/repos/maxclaey/home-assistant/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/maxclaey/home-assistant/teams","hooks_url":"https://api.github.com/repos/maxclaey/home-assistant/hooks","issue_events_url":"https://api.github.com/repos/maxclaey/home-assistant/issues/events{/number}","events_url":"https://api.github.com/repos/maxclaey/home-assistant/events","assignees_url":"https://api.github.com/repos/maxclaey/home-assistant/assignees{/user}","branches_url":"https://api.github.com/repos/maxclaey/home-assistant/branches{/branch}","tags_url":"https://api.github.com/repos/maxclaey/home-assistant/tags","blobs_url":"https://api.github.com/repos/maxclaey/home-assistant/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/maxclaey/home-assistant/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/maxclaey/home-assistant/git/refs{/sha}","trees_url":"https://api.github.com/repos/maxclaey/home-assistant/git/trees{/sha}","statuses_url":"https://api.github.com/repos/maxclaey/home-assistant/statuses/{sha}","languages_url":"https://api.github.com/repos/maxclaey/home-assistant/languages","stargazers_url":"https://api.github.com/repos/maxclaey/home-assistant/stargazers","contributors_url":"https://api.github.com/repos/maxclaey/home-assistant/contributors","subscribers_url":"https://api.github.com/repos/maxclaey/home-assistant/subscribers","subscription_url":"https://api.github.com/repos/maxclaey/home-assistant/subscription","commits_url":"https://api.github.com/repos/maxclaey/home-assistant/commits{/sha}","git_commits_url":"https://api.github.com/repos/maxclaey/home-assistant/git/commits{/sha}","comments_url":"https://api.github.com/repos/maxclaey/home-assistant/comments{/number}","issue_comment_url":"https://api.github.com/repos/maxclaey/home-assistant/issues/comments{/number}","contents_url":"https://api.github.com/repos/maxclaey/home-assistant/contents/{+path}","compare_url":"https://api.github.com/repos/maxclaey/home-assistant/compare/{base}...{head}","merges_url":"https://api.github.com/repos/maxclaey/home-assistant/merges","archive_url":"https://api.github.com/repos/maxclaey/home-assistant/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/maxclaey/home-assistant/downloads","issues_url":"https://api.github.com/repos/maxclaey/home-assistant/issues{/number}","pulls_url":"https://api.github.com/repos/maxclaey/home-assistant/pulls{/number}","milestones_url":"https://api.github.com/repos/maxclaey/home-assistant/milestones{/number}","notifications_url":"https://api.github.com/repos/maxclaey/home-assistant/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/maxclaey/home-assistant/labels{/name}","releases_url":"https://api.github.com/repos/maxclaey/home-assistant/releases{/id}","deployments_url":"https://api.github.com/repos/maxclaey/home-assistant/deployments","created_at":"2018-02-21T15:49:18Z","updated_at":"2018-02-21T15:49:28Z","pushed_at":"2018-03-01T18:08:12Z","git_url":"git://github.com/maxclaey/home-assistant.git","ssh_url":"git@github.com:maxclaey/home-assistant.git","clone_url":"https://github.com/maxclaey/home-assistant.git","svn_url":"https://github.com/maxclaey/home-assistant","homepage":"https://home-assistant.io","size":79187,"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},"forks":0,"open_issues":0,"watchers":0,"default_branch":"dev"}},"base":{"label":"home-assistant:dev","ref":"dev","sha":"ff83efe376fb6d42fe8b4fad763044cfb55d5e8c","user":{"login":"home-assistant","id":13844975,"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,"name":"home-assistant","full_name":"home-assistant/home-assistant","owner":{"login":"home-assistant","id":13844975,"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},"private":false,"html_url":"https://github.com/home-assistant/home-assistant","description":":house_with_garden: Open-source home automation platform running on Python 3","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-03-01T16:25:31Z","pushed_at":"2018-03-01T18:11:06Z","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://home-assistant.io","size":79202,"stargazers_count":12884,"watchers_count":12884,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":3711,"mirror_url":null,"archived":false,"open_issues_count":854,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":3711,"open_issues":854,"watchers":12884,"default_branch":"dev"}},"_links":{"self":{"href":"https://api.github.com/repos/home-assistant/home-assistant/pulls/12819"},"html":{"href":"https://github.com/home-assistant/home-assistant/pull/12819"},"issue":{"href":"https://api.github.com/repos/home-assistant/home-assistant/issues/12819"},"comments":{"href":"https://api.github.com/repos/home-assistant/home-assistant/issues/12819/comments"},"review_comments":{"href":"https://api.github.com/repos/home-assistant/home-assistant/pulls/12819/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/12819/commits"},"statuses":{"href":"https://api.github.com/repos/home-assistant/home-assistant/statuses/2187e1437a6a5138bed160474cb2cdc629ab1185"}},"author_association":"NONE"}}
{"actor":{"display_login":"houndci-bot"}}