{"action":"created","comment":{"url":"https://api.github.com/repos/home-assistant/home-assistant/pulls/comments/67687814","id":67687814,"diff_hunk":"@@ -0,0 +1,119 @@\n+\"\"\"\n+Currency exchange rate support that comes from fixer.io.\n+\n+For more details about this platform, please refer to the documentation at\n+https://home-assistant.io/components/sensor.fixer/\n+\"\"\"\n+import logging\n+from datetime import timedelta\n+\n+import voluptuous as vol\n+\n+from homeassistant.const import (CONF_PLATFORM, CONF_NAME)\n+from homeassistant.helpers.entity import Entity\n+from homeassistant.util import Throttle\n+import homeassistant.helpers.config_validation as cv\n+\n+REQUIREMENTS = ['fixerio==0.1.1']\n+\n+_LOGGER = logging.getLogger(__name__)\n+\n+DEFAULT_NAME = \"Exchange rate\"\n+ICON = 'mdi:currency'\n+\n+CONF_BASE = 'base'\n+CONF_TARGET = 'target'\n+\n+STATE_ATTR_BASE = 'Base currency'\n+STATE_ATTR_TARGET = 'Target currency'\n+STATE_ATTR_EXCHANGE_RATE = 'Exchange rate'\n+\n+PLATFORM_SCHEMA = vol.Schema({\n+    vol.Required(CONF_PLATFORM): 'fixer',\n+    vol.Optional(CONF_BASE): cv.string,\n+    vol.Optional(CONF_NAME): cv.string,\n+    vol.Required(CONF_TARGET): cv.string,\n+})\n+\n+# Return cached results if last scan was less then this time ago.\n+MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=3600)\n+\n+\n+def setup_platform(hass, config, add_devices, discovery_info=None):\n+    \"\"\"Setup the Fixer.io sensor.\"\"\"\n+    from fixerio import (Fixerio, exceptions)\n+\n+    name = config.get(CONF_NAME, DEFAULT_NAME)\n+    base = config.get(CONF_BASE, 'USD')\n+    target = config.get(CONF_TARGET)\n+\n+    try:\n+        Fixerio(base=base, symbols=[target], secure=True).latest()\n+    except exceptions.FixerioException:\n+        _LOGGER.error('One of the given currencies is not supported')\n+        return False\n+\n+    data = ExchangeData(base, target)\n+    add_devices([ExchangeRateSensor(data, name, target)])\n+\n+\n+# pylint: disable=too-few-public-methods\n+class ExchangeRateSensor(Entity):\n+    \"\"\"Representation of a Exchange sensor.\"\"\"\n+\n+    def __init__(self, data, name, target):\n+        \"\"\"Initialize the sensor.\"\"\"\n+        self.data = data\n+        self._target = target\n+        self._name = name\n+        self._state = None\n+        self.update()\n+\n+    @property\n+    def name(self):\n+        \"\"\"Return the name of the sensor.\"\"\"\n+        return self._name\n+\n+    @property\n+    def state(self):\n+        \"\"\"Return the state of the sensor.\"\"\"\n+        return self._state\n+\n+    @property\n+    def device_state_attributes(self):\n+        \"\"\"Return the state attributes.\"\"\"\n+        if self.data.rate is not None:\n+            return {\n+                STATE_ATTR_BASE: self.data.rate['base'],\n+                STATE_ATTR_TARGET: self._target,\n+                STATE_ATTR_EXCHANGE_RATE: self.data.rate['rates'][self._target]\n+            }\n+\n+    @property\n+    def icon(self):\n+        \"\"\"Return the icon to use in the frontend, if any.\"\"\"\n+        return ICON\n+\n+    def update(self):\n+        \"\"\"Get the latest data and updates the states.\"\"\"\n+        self.data.update()\n+        self._state = round(self.data.rate['rates'][self._target], 3)\n+\n+class ExchangeData(object):","path":"homeassistant/components/sensor/fixer.py","position":102,"original_position":102,"commit_id":"195b1b4da622a582af373541326c55074f4f9ff1","original_commit_id":"195b1b4da622a582af373541326c55074f4f9ff1","user":{"login":"balloobbot","id":16367972,"avatar_url":"https://avatars.githubusercontent.com/u/16367972?v=3","gravatar_id":"","url":"https://api.github.com/users/balloobbot","html_url":"https://github.com/balloobbot","followers_url":"https://api.github.com/users/balloobbot/followers","following_url":"https://api.github.com/users/balloobbot/following{/other_user}","gists_url":"https://api.github.com/users/balloobbot/gists{/gist_id}","starred_url":"https://api.github.com/users/balloobbot/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/balloobbot/subscriptions","organizations_url":"https://api.github.com/users/balloobbot/orgs","repos_url":"https://api.github.com/users/balloobbot/repos","events_url":"https://api.github.com/users/balloobbot/events{/privacy}","received_events_url":"https://api.github.com/users/balloobbot/received_events","type":"User","site_admin":false},"body":"_[farcy v1.1](https://github.com/appfolio/farcy)_\n* 1: E302 expected 2 blank lines, found 1","created_at":"2016-06-20T13:23:15Z","updated_at":"2016-06-20T13:23:15Z","html_url":"https://github.com/home-assistant/home-assistant/pull/2336#discussion_r67687814","pull_request_url":"https://api.github.com/repos/home-assistant/home-assistant/pulls/2336","_links":{"self":{"href":"https://api.github.com/repos/home-assistant/home-assistant/pulls/comments/67687814"},"html":{"href":"https://github.com/home-assistant/home-assistant/pull/2336#discussion_r67687814"},"pull_request":{"href":"https://api.github.com/repos/home-assistant/home-assistant/pulls/2336"}}},"pull_request":{"url":"https://api.github.com/repos/home-assistant/home-assistant/pulls/2336","id":74442076,"html_url":"https://github.com/home-assistant/home-assistant/pull/2336","diff_url":"https://github.com/home-assistant/home-assistant/pull/2336.diff","patch_url":"https://github.com/home-assistant/home-assistant/pull/2336.patch","issue_url":"https://api.github.com/repos/home-assistant/home-assistant/issues/2336","number":2336,"state":"open","locked":false,"title":"Add support for Fixer.io","user":{"login":"fabaff","id":116184,"avatar_url":"https://avatars.githubusercontent.com/u/116184?v=3","gravatar_id":"","url":"https://api.github.com/users/fabaff","html_url":"https://github.com/fabaff","followers_url":"https://api.github.com/users/fabaff/followers","following_url":"https://api.github.com/users/fabaff/following{/other_user}","gists_url":"https://api.github.com/users/fabaff/gists{/gist_id}","starred_url":"https://api.github.com/users/fabaff/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fabaff/subscriptions","organizations_url":"https://api.github.com/users/fabaff/orgs","repos_url":"https://api.github.com/users/fabaff/repos","events_url":"https://api.github.com/users/fabaff/events{/privacy}","received_events_url":"https://api.github.com/users/fabaff/received_events","type":"User","site_admin":false},"body":"**Description:**\r\nThere seems to be a demand for an exchange rate sensor (eg. [Currencylayer](https://community.home-assistant.io/t/exchange-rate-information-using-currencylayer/1895) and #2310). [Fixer.io](http://fixer.io/) doesn't require an API key and allows unlimited requests (for now). \r\n\r\n**Related issue (if applicable):** fixes #\r\n\r\n**Pull request in [home-assistant.io](https://github.com/home-assistant/home-assistant.io) with documentation (if applicable):** home-assistant/home-assistant.io#574\r\n\r\n**Example entry for `configuration.yaml` (if applicable):**\r\n```yaml\r\nsensor:\r\n  - platform: fixer\r\n    name: EUR\r\n    base: EUR\r\n    target: CHF\r\n```\r\n\r\n**Checklist:**\r\n\r\nIf user exposed functionality or configuration variables are added/changed:\r\n  - [x] Documentation added/updated in [home-assistant.io](https://github.com/home-assistant/home-assistant.io)\r\n\r\nIf code communicates with devices:\r\n  - [x] Local tests with `tox` run successfully. **Your PR cannot be merged unless tests pass**\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 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  - [ ] 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[fork]: http://stackoverflow.com/a/7244456\r\n[squash]: https://github.com/ginatrapani/todo.txt-android/wiki/Squash-All-Commits-Related-to-a-Single-Issue-into-a-Single-Commit\r\n[ex-requir]: https://github.com/home-assistant/home-assistant/blob/dev/homeassistant/components/keyboard.py#L16\r\n[ex-import]: https://github.com/home-assistant/home-assistant/blob/dev/homeassistant/components/keyboard.py#L51\r\n\r\n\r\n","created_at":"2016-06-20T13:22:16Z","updated_at":"2016-06-20T13:23:15Z","closed_at":null,"merged_at":null,"merge_commit_sha":"b9471fec510375aea4cf0ac104c6b7f636980489","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/home-assistant/home-assistant/pulls/2336/commits","review_comments_url":"https://api.github.com/repos/home-assistant/home-assistant/pulls/2336/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/2336/comments","statuses_url":"https://api.github.com/repos/home-assistant/home-assistant/statuses/195b1b4da622a582af373541326c55074f4f9ff1","head":{"label":"fabaff:fixer.io","ref":"fixer.io","sha":"195b1b4da622a582af373541326c55074f4f9ff1","user":{"login":"fabaff","id":116184,"avatar_url":"https://avatars.githubusercontent.com/u/116184?v=3","gravatar_id":"","url":"https://api.github.com/users/fabaff","html_url":"https://github.com/fabaff","followers_url":"https://api.github.com/users/fabaff/followers","following_url":"https://api.github.com/users/fabaff/following{/other_user}","gists_url":"https://api.github.com/users/fabaff/gists{/gist_id}","starred_url":"https://api.github.com/users/fabaff/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fabaff/subscriptions","organizations_url":"https://api.github.com/users/fabaff/orgs","repos_url":"https://api.github.com/users/fabaff/repos","events_url":"https://api.github.com/users/fabaff/events{/privacy}","received_events_url":"https://api.github.com/users/fabaff/received_events","type":"User","site_admin":false},"repo":{"id":36302973,"name":"home-assistant","full_name":"fabaff/home-assistant","owner":{"login":"fabaff","id":116184,"avatar_url":"https://avatars.githubusercontent.com/u/116184?v=3","gravatar_id":"","url":"https://api.github.com/users/fabaff","html_url":"https://github.com/fabaff","followers_url":"https://api.github.com/users/fabaff/followers","following_url":"https://api.github.com/users/fabaff/following{/other_user}","gists_url":"https://api.github.com/users/fabaff/gists{/gist_id}","starred_url":"https://api.github.com/users/fabaff/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fabaff/subscriptions","organizations_url":"https://api.github.com/users/fabaff/orgs","repos_url":"https://api.github.com/users/fabaff/repos","events_url":"https://api.github.com/users/fabaff/events{/privacy}","received_events_url":"https://api.github.com/users/fabaff/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/fabaff/home-assistant","description":"Open-source home automation platform running on Python 3","fork":true,"url":"https://api.github.com/repos/fabaff/home-assistant","forks_url":"https://api.github.com/repos/fabaff/home-assistant/forks","keys_url":"https://api.github.com/repos/fabaff/home-assistant/keys{/key_id}","collaborators_url":"https://api.github.com/repos/fabaff/home-assistant/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/fabaff/home-assistant/teams","hooks_url":"https://api.github.com/repos/fabaff/home-assistant/hooks","issue_events_url":"https://api.github.com/repos/fabaff/home-assistant/issues/events{/number}","events_url":"https://api.github.com/repos/fabaff/home-assistant/events","assignees_url":"https://api.github.com/repos/fabaff/home-assistant/assignees{/user}","branches_url":"https://api.github.com/repos/fabaff/home-assistant/branches{/branch}","tags_url":"https://api.github.com/repos/fabaff/home-assistant/tags","blobs_url":"https://api.github.com/repos/fabaff/home-assistant/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/fabaff/home-assistant/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/fabaff/home-assistant/git/refs{/sha}","trees_url":"https://api.github.com/repos/fabaff/home-assistant/git/trees{/sha}","statuses_url":"https://api.github.com/repos/fabaff/home-assistant/statuses/{sha}","languages_url":"https://api.github.com/repos/fabaff/home-assistant/languages","stargazers_url":"https://api.github.com/repos/fabaff/home-assistant/stargazers","contributors_url":"https://api.github.com/repos/fabaff/home-assistant/contributors","subscribers_url":"https://api.github.com/repos/fabaff/home-assistant/subscribers","subscription_url":"https://api.github.com/repos/fabaff/home-assistant/subscription","commits_url":"https://api.github.com/repos/fabaff/home-assistant/commits{/sha}","git_commits_url":"https://api.github.com/repos/fabaff/home-assistant/git/commits{/sha}","comments_url":"https://api.github.com/repos/fabaff/home-assistant/comments{/number}","issue_comment_url":"https://api.github.com/repos/fabaff/home-assistant/issues/comments{/number}","contents_url":"https://api.github.com/repos/fabaff/home-assistant/contents/{+path}","compare_url":"https://api.github.com/repos/fabaff/home-assistant/compare/{base}...{head}","merges_url":"https://api.github.com/repos/fabaff/home-assistant/merges","archive_url":"https://api.github.com/repos/fabaff/home-assistant/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/fabaff/home-assistant/downloads","issues_url":"https://api.github.com/repos/fabaff/home-assistant/issues{/number}","pulls_url":"https://api.github.com/repos/fabaff/home-assistant/pulls{/number}","milestones_url":"https://api.github.com/repos/fabaff/home-assistant/milestones{/number}","notifications_url":"https://api.github.com/repos/fabaff/home-assistant/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/fabaff/home-assistant/labels{/name}","releases_url":"https://api.github.com/repos/fabaff/home-assistant/releases{/id}","deployments_url":"https://api.github.com/repos/fabaff/home-assistant/deployments","created_at":"2015-05-26T14:52:30Z","updated_at":"2016-05-01T08:40:22Z","pushed_at":"2016-06-20T13:08:19Z","git_url":"git://github.com/fabaff/home-assistant.git","ssh_url":"git@github.com:fabaff/home-assistant.git","clone_url":"https://github.com/fabaff/home-assistant.git","svn_url":"https://github.com/fabaff/home-assistant","homepage":"https://home-assistant.io","size":35966,"stargazers_count":1,"watchers_count":1,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":2,"mirror_url":null,"open_issues_count":0,"forks":2,"open_issues":0,"watchers":1,"default_branch":"master"}},"base":{"label":"home-assistant:dev","ref":"dev","sha":"6fa095f4a7c0d005381e9f3f6b621f9919cb779e","user":{"login":"home-assistant","id":13844975,"avatar_url":"https://avatars.githubusercontent.com/u/13844975?v=3","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://avatars.githubusercontent.com/u/13844975?v=3","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":"2016-06-20T07:20:17Z","pushed_at":"2016-06-20T13:22:16Z","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":81618,"stargazers_count":3594,"watchers_count":3594,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":772,"mirror_url":null,"open_issues_count":168,"forks":772,"open_issues":168,"watchers":3594,"default_branch":"dev"}},"_links":{"self":{"href":"https://api.github.com/repos/home-assistant/home-assistant/pulls/2336"},"html":{"href":"https://github.com/home-assistant/home-assistant/pull/2336"},"issue":{"href":"https://api.github.com/repos/home-assistant/home-assistant/issues/2336"},"comments":{"href":"https://api.github.com/repos/home-assistant/home-assistant/issues/2336/comments"},"review_comments":{"href":"https://api.github.com/repos/home-assistant/home-assistant/pulls/2336/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/2336/commits"},"statuses":{"href":"https://api.github.com/repos/home-assistant/home-assistant/statuses/195b1b4da622a582af373541326c55074f4f9ff1"}}}}
{"actor":{"display_login":"balloobbot"}}