{"action":"opened","number":14587,"pull_request":{"url":"https://api.github.com/repos/home-assistant/home-assistant/pulls/14587","id":189753321,"html_url":"https://github.com/home-assistant/home-assistant/pull/14587","diff_url":"https://github.com/home-assistant/home-assistant/pull/14587.diff","patch_url":"https://github.com/home-assistant/home-assistant/pull/14587.patch","issue_url":"https://api.github.com/repos/home-assistant/home-assistant/issues/14587","number":14587,"state":"open","locked":false,"title":"Samsung TV can't be turn off after idle period.","user":{"login":"ejel","id":253522,"avatar_url":"https://avatars2.githubusercontent.com/u/253522?v=4","gravatar_id":"","url":"https://api.github.com/users/ejel","html_url":"https://github.com/ejel","followers_url":"https://api.github.com/users/ejel/followers","following_url":"https://api.github.com/users/ejel/following{/other_user}","gists_url":"https://api.github.com/users/ejel/gists{/gist_id}","starred_url":"https://api.github.com/users/ejel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ejel/subscriptions","organizations_url":"https://api.github.com/users/ejel/orgs","repos_url":"https://api.github.com/users/ejel/repos","events_url":"https://api.github.com/users/ejel/events{/privacy}","received_events_url":"https://api.github.com/users/ejel/received_events","type":"User","site_admin":false},"body":"When Samsung TV is idle for a period of time after issued a command,\r\nsubsequent 'turn_off' command won't turn off the TV. The issue is seen\r\nin Samsung models with websocket as discussed in #12302.\r\n\r\n== Reproducible Steps\r\n1. Turn on TV (either via HA or directly).\r\n2. Issue some commands e.g. volume ups / downs.\r\n3. Wait for 1 minute.\r\n4. Issue turn_off command via HA. TV won't turn off.\r\n5. Issue subsequent turn off commands won't turn off TV still.\r\n6. However, issue some other commands e.g. volume ups / downs multiple\r\ntimes in a row and then turn_off will turn off the TV.\r\n\r\n== Root Cause\r\n`samsungctl` maintains a connection to the TV endpoint. samsungtv\r\ncomponent keeps samsungctl object as an instance variable (`_remote`)\r\nand will recreate new instance only when needed through `get_remote()`\r\ni.e. when there is an exception raised.\r\n\r\nIt appears that after a brief idle period, the underlying websocket connection opened by\r\nsamsungctl would get closed. This means the following command will raise ConnectionClosedException.\r\nCurrent implementation in send_key() would nullify current `_remote` in this\r\ncase but will also re-instantiate a new one because of the\r\n`self.get_remote().close()` call at the end of the method. This\r\nguarantees the subsequent call will also raise ConnectionClosedException\r\nbecause `_remote` is not null but connection was already closed.\r\n\r\n== The Fix\r\nInstead of keeping a long-live `_remote` instance, a new instance is\r\nreturned every time in `get_remote()`. As `samsungctl.Remote`\r\nis a Context Manager type, we can ensure proper clean up with\r\nthe use of `with` statement. With this change we would not run into\r\nConnectionClosedException due to idle connection.\r\n\r\nThis change is only tested with websocket Samsung TV. But it should not\r\nnegatively impact the legacy method as the same logic applies.\r\n\r\n## Description:\r\n\r\n\r\n**Related issue (if applicable):** fixes #<home-assistant issue number goes here>\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#<home-assistant.github.io PR number goes here>\r\n\r\n## Example entry for `configuration.yaml` (if applicable):\r\n```yaml\r\n\r\n```\r\n\r\n## Checklist:\r\n  - [ ] The code change is tested and works locally.\r\n  - [ ] 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  - [ ] 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  - [ ] New dependencies have been added to the `REQUIREMENTS` variable ([example][ex-requir]).\r\n  - [ ] New dependencies are only imported inside functions that use them ([example][ex-import]).\r\n  - [ ] New dependencies have been added to `requirements_all.txt` by running `script/gen_requirements_all.py`.\r\n  - [ ] New files were added to `.coveragerc`.\r\n\r\nIf the code does not interact with devices:\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-05-22T18:30:04Z","updated_at":"2018-05-22T18:30:04Z","closed_at":null,"merged_at":null,"merge_commit_sha":null,"assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/home-assistant/home-assistant/pulls/14587/commits","review_comments_url":"https://api.github.com/repos/home-assistant/home-assistant/pulls/14587/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/14587/comments","statuses_url":"https://api.github.com/repos/home-assistant/home-assistant/statuses/11c3f314004f227a0f2da1f366f2a4fefa42e3ec","head":{"label":"ejel:samsungtv-turnoff-fix","ref":"samsungtv-turnoff-fix","sha":"11c3f314004f227a0f2da1f366f2a4fefa42e3ec","user":{"login":"ejel","id":253522,"avatar_url":"https://avatars2.githubusercontent.com/u/253522?v=4","gravatar_id":"","url":"https://api.github.com/users/ejel","html_url":"https://github.com/ejel","followers_url":"https://api.github.com/users/ejel/followers","following_url":"https://api.github.com/users/ejel/following{/other_user}","gists_url":"https://api.github.com/users/ejel/gists{/gist_id}","starred_url":"https://api.github.com/users/ejel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ejel/subscriptions","organizations_url":"https://api.github.com/users/ejel/orgs","repos_url":"https://api.github.com/users/ejel/repos","events_url":"https://api.github.com/users/ejel/events{/privacy}","received_events_url":"https://api.github.com/users/ejel/received_events","type":"User","site_admin":false},"repo":{"id":133996367,"name":"home-assistant","full_name":"ejel/home-assistant","owner":{"login":"ejel","id":253522,"avatar_url":"https://avatars2.githubusercontent.com/u/253522?v=4","gravatar_id":"","url":"https://api.github.com/users/ejel","html_url":"https://github.com/ejel","followers_url":"https://api.github.com/users/ejel/followers","following_url":"https://api.github.com/users/ejel/following{/other_user}","gists_url":"https://api.github.com/users/ejel/gists{/gist_id}","starred_url":"https://api.github.com/users/ejel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ejel/subscriptions","organizations_url":"https://api.github.com/users/ejel/orgs","repos_url":"https://api.github.com/users/ejel/repos","events_url":"https://api.github.com/users/ejel/events{/privacy}","received_events_url":"https://api.github.com/users/ejel/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/ejel/home-assistant","description":":house_with_garden: Open-source home automation platform running on Python 3","fork":true,"url":"https://api.github.com/repos/ejel/home-assistant","forks_url":"https://api.github.com/repos/ejel/home-assistant/forks","keys_url":"https://api.github.com/repos/ejel/home-assistant/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ejel/home-assistant/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ejel/home-assistant/teams","hooks_url":"https://api.github.com/repos/ejel/home-assistant/hooks","issue_events_url":"https://api.github.com/repos/ejel/home-assistant/issues/events{/number}","events_url":"https://api.github.com/repos/ejel/home-assistant/events","assignees_url":"https://api.github.com/repos/ejel/home-assistant/assignees{/user}","branches_url":"https://api.github.com/repos/ejel/home-assistant/branches{/branch}","tags_url":"https://api.github.com/repos/ejel/home-assistant/tags","blobs_url":"https://api.github.com/repos/ejel/home-assistant/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ejel/home-assistant/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ejel/home-assistant/git/refs{/sha}","trees_url":"https://api.github.com/repos/ejel/home-assistant/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ejel/home-assistant/statuses/{sha}","languages_url":"https://api.github.com/repos/ejel/home-assistant/languages","stargazers_url":"https://api.github.com/repos/ejel/home-assistant/stargazers","contributors_url":"https://api.github.com/repos/ejel/home-assistant/contributors","subscribers_url":"https://api.github.com/repos/ejel/home-assistant/subscribers","subscription_url":"https://api.github.com/repos/ejel/home-assistant/subscription","commits_url":"https://api.github.com/repos/ejel/home-assistant/commits{/sha}","git_commits_url":"https://api.github.com/repos/ejel/home-assistant/git/commits{/sha}","comments_url":"https://api.github.com/repos/ejel/home-assistant/comments{/number}","issue_comment_url":"https://api.github.com/repos/ejel/home-assistant/issues/comments{/number}","contents_url":"https://api.github.com/repos/ejel/home-assistant/contents/{+path}","compare_url":"https://api.github.com/repos/ejel/home-assistant/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ejel/home-assistant/merges","archive_url":"https://api.github.com/repos/ejel/home-assistant/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ejel/home-assistant/downloads","issues_url":"https://api.github.com/repos/ejel/home-assistant/issues{/number}","pulls_url":"https://api.github.com/repos/ejel/home-assistant/pulls{/number}","milestones_url":"https://api.github.com/repos/ejel/home-assistant/milestones{/number}","notifications_url":"https://api.github.com/repos/ejel/home-assistant/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ejel/home-assistant/labels{/name}","releases_url":"https://api.github.com/repos/ejel/home-assistant/releases{/id}","deployments_url":"https://api.github.com/repos/ejel/home-assistant/deployments","created_at":"2018-05-18T19:33:11Z","updated_at":"2018-05-18T19:33:19Z","pushed_at":"2018-05-22T18:25:28Z","git_url":"git://github.com/ejel/home-assistant.git","ssh_url":"git@github.com:ejel/home-assistant.git","clone_url":"https://github.com/ejel/home-assistant.git","svn_url":"https://github.com/ejel/home-assistant","homepage":"https://home-assistant.io","size":82326,"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":"82770faad71c8d2a34d427fe864686f8b213b3f0","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-05-22T18:04:42Z","pushed_at":"2018-05-22T18:30:05Z","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":82391,"stargazers_count":14379,"watchers_count":14379,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":4273,"mirror_url":null,"archived":false,"open_issues_count":827,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":4273,"open_issues":827,"watchers":14379,"default_branch":"dev"}},"_links":{"self":{"href":"https://api.github.com/repos/home-assistant/home-assistant/pulls/14587"},"html":{"href":"https://github.com/home-assistant/home-assistant/pull/14587"},"issue":{"href":"https://api.github.com/repos/home-assistant/home-assistant/issues/14587"},"comments":{"href":"https://api.github.com/repos/home-assistant/home-assistant/issues/14587/comments"},"review_comments":{"href":"https://api.github.com/repos/home-assistant/home-assistant/pulls/14587/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/14587/commits"},"statuses":{"href":"https://api.github.com/repos/home-assistant/home-assistant/statuses/11c3f314004f227a0f2da1f366f2a4fefa42e3ec"}},"author_association":"NONE","merged":false,"mergeable":null,"rebaseable":null,"mergeable_state":"unknown","merged_by":null,"comments":0,"review_comments":0,"maintainer_can_modify":true,"commits":1,"additions":20,"deletions":41,"changed_files":2}}
{"actor":{"display_login":"ejel"}}