From 3f1fd2a25137fb97bfffa7d64cabc2fdd4cfccad Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Thu, 9 May 2019 16:43:41 +0200 Subject: [PATCH 001/123] Update trigger.markdown --- source/_docs/automation/trigger.markdown | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/source/_docs/automation/trigger.markdown b/source/_docs/automation/trigger.markdown index b892651b895..bd42db25035 100644 --- a/source/_docs/automation/trigger.markdown +++ b/source/_docs/automation/trigger.markdown @@ -130,9 +130,10 @@ automation: ### {% linkable_title Sun trigger %} -Triggers when the sun is setting or rising. An optional time offset can be given to have it trigger a set time before or after the sun event (i.e. 45 minutes before sunset, when dusk is setting in). +#### Sunset / Sunrise trigger +Triggers when the sun is setting or rising, i.e. when the sun elevation reaches 0°. -Sunrise as a trigger may need special attention as explained in time triggers below. This is due to the date changing at midnight and sunrise is at an earlier time on the following day. +An optional time offset can be given to have it trigger a set time before or after the sun event (e.g. 45 minutes before sunset). Since the duration of twilight is different throughout the year, it is recommended to use sun elevation triggers instead of `sunset` or `sunrise` with a time offset to trigger automations at the start of dusk or dawn. ```yaml automation: @@ -140,11 +141,12 @@ automation: platform: sun # Possible values: sunset, sunrise event: sunset - # Optional time offset. This example is 45 minutes. + # Optional time offset. This example will trigger 45 minutes before sunrise. offset: '-00:45:00' ``` -Sometimes you may want more granular control over an automation based on the elevation of the sun. This can be used to layer automations to occur as the sun lowers on the horizon or even after it is below the horizon. This is also useful when the "sunset" event is not dark enough outside and you would like the automation to run later at a precise solar angle instead of the time offset such as turning on exterior lighting. For most things, a general number like -4 degrees is suitable and is used in this example: +#### Sun elevation trigger +Sometimes you may want more granular control over an automation than simply sunset or sunrise and specify an exact elevation of the sun. This can be used to layer automations to occur as the sun lowers on the horizon or even after it is below the horizon. This is also useful when the "sunset" event is not dark enough outside and you would like the automation to run later at a precise solar angle instead of the time offset such as turning on exterior lighting. For most things intended to trigger during dusk or dawn, a number between 0° and -6° is suitable; -4° is used in this example: {% raw %} ```yaml @@ -162,11 +164,15 @@ automation: ``` {% endraw %} -If you want to get more precise, start with the US Naval Observatory [tool](http://aa.usno.navy.mil/data/docs/AltAz.php) that will help you estimate what the solar angle will be at any specific time. Then from this, you can select from the defined twilight numbers. Although the actual amount of light depends on weather, topography and land cover, they are defined as: +If you want to get more precise, start with the US Naval Observatory [tool](http://aa.usno.navy.mil/data/docs/AltAz.php) which will help you estimate what the solar elevation will be at any specific time. Then from this, you can select from the defined twilight numbers. -- Civil twilight: Solar angle > -6° -- Nautical twilight: Solar angle > -12° -- Astronomical twilight: Solar angle > -18° +Although the actual amount of light depends on weather, topography and land cover, they are defined as: + +- Civil twilight: 0° > Solar angle > -6° + + This is what is meant by twilight for the average person: Under clear weather conditions, civil twilight approximates the limit at which solar illumination suffices for the human eye to clearly distinguish terrestrial objects. Enough illumination renders artificial sources unnecessary for most outdoor activities. +- Nautical twilight: 6° > Solar angle > -12° +- Astronomical twilight: 12° > Solar angle > -18° A very thorough explanation of this is available in the Wikipedia article about the [Twilight](https://en.wikipedia.org/wiki/Twilight). From ab4e93af8b0322a142412642302c1da137600e47 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Thu, 9 May 2019 17:17:22 +0200 Subject: [PATCH 002/123] Update conditions.markdown --- source/_docs/scripts/conditions.markdown | 44 +++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/source/_docs/scripts/conditions.markdown b/source/_docs/scripts/conditions.markdown index ed261f6c874..c34a5b9ba62 100644 --- a/source/_docs/scripts/conditions.markdown +++ b/source/_docs/scripts/conditions.markdown @@ -119,11 +119,53 @@ condition: ``` ### {% linkable_title Sun condition %} +#### Sun state condition +The sun state can be used to test if the sun has set or risen. -The sun condition can test if the sun has already set or risen when a trigger occurs. The `before` and `after` keys can only be set to `sunset` or `sunrise`. They have a corresponding optional offset value (`before_offset`, `after_offset`) that can be added, similar to the [sun trigger][sun_trigger]. +```yaml +condition: + condition: state # 'day' condition: from sunrise until sunset + entity_id: sun.sun + state: 'above_horizon' +``` +```yaml +condition: + condition: state # from sunset until sunrise + entity_id: sun.sun + state: 'below_horizon' +``` + +#### Sun elevation condition +The sun elevation can be used to test if the sun has set or risen, it is dusk, it is night etc. when a trigger occurs. +For an in depth explanation of sun elevation see [sun trigger][sun_trigger]. + +```yaml +condition: + condition: and # 'twilight' condition: dusk and dawn, in typical locations + conditions: + - condition: template + value_template: '{{ states.sun.sun.attributes.elevation < 0 }}' + - condition: template + value_template: '{{ states.sun.sun.attributes.elevation > -6 }}' +``` + +```yaml +condition: + condition: template # 'night' condition: from dusk to dawn, in typical locations + value_template: '{{ states.sun.sun.attributes.elevation < -6 }}' +``` + +#### Sunset/sunrise condition +The sun condition can also test if the sun has already set or risen when a trigger occurs. The `before` and `after` keys can only be set to `sunset` or `sunrise`. They have a corresponding optional offset value (`before_offset`, `after_offset`) that can be added, similar to the [sun trigger][sun_trigger]. [sun_trigger]: /docs/automation/trigger/#sun-trigger +

+The sunset/sunrise conditions do not work in locations inside the polar circles, and also not in locations with highly skewed local time zone. + +It is advised to use conditions evaluating the solar elevation instead of the before/after sunset/sunrise conditions. +

+ ```yaml condition: condition: sun From 3c2026d68362600219dff15cf1b15c09c082aba4 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Thu, 9 May 2019 19:03:32 +0200 Subject: [PATCH 003/123] Update conditions.markdown --- source/_docs/scripts/conditions.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/_docs/scripts/conditions.markdown b/source/_docs/scripts/conditions.markdown index c34a5b9ba62..db552067b5d 100644 --- a/source/_docs/scripts/conditions.markdown +++ b/source/_docs/scripts/conditions.markdown @@ -145,15 +145,15 @@ condition: condition: and # 'twilight' condition: dusk and dawn, in typical locations conditions: - condition: template - value_template: '{{ states.sun.sun.attributes.elevation < 0 }}' + value_template: {% raw %}'{{ states.sun.sun.attributes.elevation < 0 }}'{% endraw %} - condition: template - value_template: '{{ states.sun.sun.attributes.elevation > -6 }}' + value_template: {% raw %}'{{ states.sun.sun.attributes.elevation > -6 }}'{% endraw %} ``` ```yaml condition: condition: template # 'night' condition: from dusk to dawn, in typical locations - value_template: '{{ states.sun.sun.attributes.elevation < -6 }}' + value_template: {% raw %}'{{ states.sun.sun.attributes.elevation < -6 }}'{% endraw %} ``` #### Sunset/sunrise condition From 4ae0644122c4bca89670e4daace4d0c6c2d6ba5f Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Fri, 10 May 2019 15:10:13 +0200 Subject: [PATCH 004/123] Update trigger.markdown --- source/_docs/automation/trigger.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_docs/automation/trigger.markdown b/source/_docs/automation/trigger.markdown index bd42db25035..7fa85f880d7 100644 --- a/source/_docs/automation/trigger.markdown +++ b/source/_docs/automation/trigger.markdown @@ -130,7 +130,7 @@ automation: ### {% linkable_title Sun trigger %} -#### Sunset / Sunrise trigger +#### {% linkable_title Sunset / Sunrise trigger %} Triggers when the sun is setting or rising, i.e. when the sun elevation reaches 0°. An optional time offset can be given to have it trigger a set time before or after the sun event (e.g. 45 minutes before sunset). Since the duration of twilight is different throughout the year, it is recommended to use sun elevation triggers instead of `sunset` or `sunrise` with a time offset to trigger automations at the start of dusk or dawn. @@ -145,7 +145,7 @@ automation: offset: '-00:45:00' ``` -#### Sun elevation trigger +#### {% linkable_title Sun elevation trigger %} Sometimes you may want more granular control over an automation than simply sunset or sunrise and specify an exact elevation of the sun. This can be used to layer automations to occur as the sun lowers on the horizon or even after it is below the horizon. This is also useful when the "sunset" event is not dark enough outside and you would like the automation to run later at a precise solar angle instead of the time offset such as turning on exterior lighting. For most things intended to trigger during dusk or dawn, a number between 0° and -6° is suitable; -4° is used in this example: {% raw %} From 147513b7c7c947ddb543af01dc4821fedcb48129 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Fri, 10 May 2019 15:13:02 +0200 Subject: [PATCH 005/123] Update conditions.markdown --- source/_docs/scripts/conditions.markdown | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/source/_docs/scripts/conditions.markdown b/source/_docs/scripts/conditions.markdown index db552067b5d..5f9848af2de 100644 --- a/source/_docs/scripts/conditions.markdown +++ b/source/_docs/scripts/conditions.markdown @@ -119,7 +119,7 @@ condition: ``` ### {% linkable_title Sun condition %} -#### Sun state condition +#### {% linkable_title Sun state condition %} The sun state can be used to test if the sun has set or risen. ```yaml @@ -136,9 +136,10 @@ condition: state: 'below_horizon' ``` -#### Sun elevation condition +#### {% linkable_title Sun elevation condition %} The sun elevation can be used to test if the sun has set or risen, it is dusk, it is night etc. when a trigger occurs. -For an in depth explanation of sun elevation see [sun trigger][sun_trigger]. +For an in depth explanation of sun elevation see [sun elevation trigger][sun_elevation_trigger]. +[sun_elevation_trigger]: /docs/automation/trigger/#sun-elevation-trigger ```yaml condition: @@ -156,7 +157,7 @@ condition: value_template: {% raw %}'{{ states.sun.sun.attributes.elevation < -6 }}'{% endraw %} ``` -#### Sunset/sunrise condition +#### {% linkable_title Sunset/sunrise condition %} The sun condition can also test if the sun has already set or risen when a trigger occurs. The `before` and `after` keys can only be set to `sunset` or `sunrise`. They have a corresponding optional offset value (`before_offset`, `after_offset`) that can be added, similar to the [sun trigger][sun_trigger]. [sun_trigger]: /docs/automation/trigger/#sun-trigger From 60a7ead71a5a05807601dd15e00b93b2ba132224 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Fri, 10 May 2019 17:21:23 +0200 Subject: [PATCH 006/123] Fix links. --- source/_docs/scripts/conditions.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_docs/scripts/conditions.markdown b/source/_docs/scripts/conditions.markdown index 5f9848af2de..f44b97ebebf 100644 --- a/source/_docs/scripts/conditions.markdown +++ b/source/_docs/scripts/conditions.markdown @@ -139,6 +139,7 @@ condition: #### {% linkable_title Sun elevation condition %} The sun elevation can be used to test if the sun has set or risen, it is dusk, it is night etc. when a trigger occurs. For an in depth explanation of sun elevation see [sun elevation trigger][sun_elevation_trigger]. + [sun_elevation_trigger]: /docs/automation/trigger/#sun-elevation-trigger ```yaml @@ -159,6 +160,7 @@ condition: #### {% linkable_title Sunset/sunrise condition %} The sun condition can also test if the sun has already set or risen when a trigger occurs. The `before` and `after` keys can only be set to `sunset` or `sunrise`. They have a corresponding optional offset value (`before_offset`, `after_offset`) that can be added, similar to the [sun trigger][sun_trigger]. + [sun_trigger]: /docs/automation/trigger/#sun-trigger

From 29f5b7f94775345512aefd511658a079e0fc8aa7 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Fri, 10 May 2019 17:36:49 +0200 Subject: [PATCH 007/123] Update trigger.markdown --- source/_docs/automation/trigger.markdown | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/source/_docs/automation/trigger.markdown b/source/_docs/automation/trigger.markdown index 7fa85f880d7..b75ee3db9c5 100644 --- a/source/_docs/automation/trigger.markdown +++ b/source/_docs/automation/trigger.markdown @@ -133,7 +133,13 @@ automation: #### {% linkable_title Sunset / Sunrise trigger %} Triggers when the sun is setting or rising, i.e. when the sun elevation reaches 0°. -An optional time offset can be given to have it trigger a set time before or after the sun event (e.g. 45 minutes before sunset). Since the duration of twilight is different throughout the year, it is recommended to use sun elevation triggers instead of `sunset` or `sunrise` with a time offset to trigger automations at the start of dusk or dawn. +An optional time offset can be given to have it trigger a set time before or after the sun event (e.g. 45 minutes before sunset). + +

+Since the duration of twilight is different throughout the year, it is recommended to use [sun elevation triggers][sun_elevation_trigger] instead of `sunset` or `sunrise` with a time offset to trigger automations during dusk or dawn. +

+ +[sun_elevation_trigger]: /docs/automation/trigger/#sun-elevation-trigger ```yaml automation: From fc34628a3b1386263615b1cc830240ff790f2911 Mon Sep 17 00:00:00 2001 From: tube0013 Date: Mon, 20 May 2019 11:05:52 -0400 Subject: [PATCH 008/123] Add Host ModemManager fix --- source/_components/zha.markdown | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/_components/zha.markdown b/source/_components/zha.markdown index 79df7194824..2b2d6019ebe 100644 --- a/source/_components/zha.markdown +++ b/source/_components/zha.markdown @@ -102,3 +102,8 @@ enable_quirks: To add new devices to the network, call the `permit` service on the `zha` domain. Do this by clicking the Service icon in Developer tools and typing `zha.permit` in the **Service** dropdown box. Next, follow the device instructions for adding, scanning or factory reset. In case you want to add Philips Hue bulbs that have previously been added to another bridge, have a look at: [https://github.com/vanviegen/hue-thief/](https://github.com/vanviegen/hue-thief/) + + +## {% linkable_title ZHA Start up issue with Home-Assistant Docker/Hass.io installs on linux hosts %} + +On Linux hosts ZHA can fail to start during HA startup or restarts because the HUSBZB-1 device is being claimed by the host's modemmanager service. To fix this disable the modemmanger on the host system. From 59bc6f1777af8326bdb6577ad6fb9f46b6af26e0 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Mon, 20 May 2019 17:29:34 +0200 Subject: [PATCH 009/123] :pencil2: Tweak --- source/_components/zha.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/zha.markdown b/source/_components/zha.markdown index 2b2d6019ebe..2ef214ad062 100644 --- a/source/_components/zha.markdown +++ b/source/_components/zha.markdown @@ -106,4 +106,4 @@ In case you want to add Philips Hue bulbs that have previously been added to ano ## {% linkable_title ZHA Start up issue with Home-Assistant Docker/Hass.io installs on linux hosts %} -On Linux hosts ZHA can fail to start during HA startup or restarts because the HUSBZB-1 device is being claimed by the host's modemmanager service. To fix this disable the modemmanger on the host system. +On Linux hosts ZHA can fail to start during HA startup or restarts because the HUSBZB-1 device is being claimed by the host's modemmanager service. To fix this disable the modemmanger on the host system. From 161194978442f9f00fc67b5f6e3ed87cf6536433 Mon Sep 17 00:00:00 2001 From: tube0013 Date: Tue, 21 May 2019 09:19:44 -0400 Subject: [PATCH 010/123] Add @newlund suggested changes --- source/_components/zha.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/zha.markdown b/source/_components/zha.markdown index 2ef214ad062..7835c397cee 100644 --- a/source/_components/zha.markdown +++ b/source/_components/zha.markdown @@ -106,4 +106,4 @@ In case you want to add Philips Hue bulbs that have previously been added to ano ## {% linkable_title ZHA Start up issue with Home-Assistant Docker/Hass.io installs on linux hosts %} -On Linux hosts ZHA can fail to start during HA startup or restarts because the HUSBZB-1 device is being claimed by the host's modemmanager service. To fix this disable the modemmanger on the host system. +On Linux hosts ZHA can fail to start during HA startup or restarts because the zigbee USB device is being claimed by the host's modemmanager service. To fix this disable the modemmanger on the host system. From cbf66444fa0acde7781f6c7954b661548ae081aa Mon Sep 17 00:00:00 2001 From: tube0013 Date: Thu, 23 May 2019 13:02:47 -0400 Subject: [PATCH 011/123] Add command to remove modemmanger from host --- source/_components/zha.markdown | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/_components/zha.markdown b/source/_components/zha.markdown index 7835c397cee..9f7a3e08441 100644 --- a/source/_components/zha.markdown +++ b/source/_components/zha.markdown @@ -107,3 +107,8 @@ In case you want to add Philips Hue bulbs that have previously been added to ano ## {% linkable_title ZHA Start up issue with Home-Assistant Docker/Hass.io installs on linux hosts %} On Linux hosts ZHA can fail to start during HA startup or restarts because the zigbee USB device is being claimed by the host's modemmanager service. To fix this disable the modemmanger on the host system. + +To remove modemmanager from an Debian/Ubuntu host run this command: +``` +sudo apt-get purge modemmanager +``` From e0ca456f9ad0bc1f0757c029891653218497ce97 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 29 May 2019 14:29:34 -0700 Subject: [PATCH 012/123] Add stub release notes 94 --- _config.yml | 6 +++--- source/_posts/2019-06-05-release-94.markdown | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 source/_posts/2019-06-05-release-94.markdown diff --git a/_config.yml b/_config.yml index d5aa5c751ed..7cfd2697f1a 100644 --- a/_config.yml +++ b/_config.yml @@ -138,9 +138,9 @@ social: # Home Assistant release details current_major_version: 0 -current_minor_version: 93 -current_patch_version: 2 -date_released: 2019-05-22 +current_minor_version: 94 +current_patch_version: 0 +date_released: 2019-06-05 # Either # or the anchor link to latest release notes in the blog post. # Must be prefixed with a # and have double quotes around it. diff --git a/source/_posts/2019-06-05-release-94.markdown b/source/_posts/2019-06-05-release-94.markdown new file mode 100644 index 00000000000..01afef59b73 --- /dev/null +++ b/source/_posts/2019-06-05-release-94.markdown @@ -0,0 +1,20 @@ +--- +layout: post +title: "0.94: TBD - update date" +description: "TO DO." +date: 2019-05-29 04:11:03 +date_formatted: "June 5, 2019" +author: Paulus Schoutsen +author_twitter: balloob +comments: true +categories: Release-Notes +og_image: /images/blog/2019-06-release-94/components.png +--- + + + +New: + - Possible to store core config in storage. Configuration.yaml will override storage. + - Onboarding updated to set core config + - Python 3.5.3 deprecated, support will be dropped in the first release after August 1. + - More cool stuff? From aec551668fe6ec52c136d0d8562e6c490e45cb91 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Thu, 30 May 2019 00:09:16 +0200 Subject: [PATCH 013/123] :pencil2: Tweak --- source/_docs/automation/trigger.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_docs/automation/trigger.markdown b/source/_docs/automation/trigger.markdown index b75ee3db9c5..0fc3d9991d6 100644 --- a/source/_docs/automation/trigger.markdown +++ b/source/_docs/automation/trigger.markdown @@ -131,6 +131,7 @@ automation: ### {% linkable_title Sun trigger %} #### {% linkable_title Sunset / Sunrise trigger %} + Triggers when the sun is setting or rising, i.e. when the sun elevation reaches 0°. An optional time offset can be given to have it trigger a set time before or after the sun event (e.g. 45 minutes before sunset). @@ -152,6 +153,7 @@ automation: ``` #### {% linkable_title Sun elevation trigger %} + Sometimes you may want more granular control over an automation than simply sunset or sunrise and specify an exact elevation of the sun. This can be used to layer automations to occur as the sun lowers on the horizon or even after it is below the horizon. This is also useful when the "sunset" event is not dark enough outside and you would like the automation to run later at a precise solar angle instead of the time offset such as turning on exterior lighting. For most things intended to trigger during dusk or dawn, a number between 0° and -6° is suitable; -4° is used in this example: {% raw %} From a3b76fb3ed47f29217b46942bb8ef74ebe71611d Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Thu, 30 May 2019 00:10:30 +0200 Subject: [PATCH 014/123] :pencil2: Tweak --- source/_docs/scripts/conditions.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/_docs/scripts/conditions.markdown b/source/_docs/scripts/conditions.markdown index f44b97ebebf..26968f97601 100644 --- a/source/_docs/scripts/conditions.markdown +++ b/source/_docs/scripts/conditions.markdown @@ -119,7 +119,9 @@ condition: ``` ### {% linkable_title Sun condition %} + #### {% linkable_title Sun state condition %} + The sun state can be used to test if the sun has set or risen. ```yaml @@ -137,6 +139,7 @@ condition: ``` #### {% linkable_title Sun elevation condition %} + The sun elevation can be used to test if the sun has set or risen, it is dusk, it is night etc. when a trigger occurs. For an in depth explanation of sun elevation see [sun elevation trigger][sun_elevation_trigger]. @@ -159,6 +162,7 @@ condition: ``` #### {% linkable_title Sunset/sunrise condition %} + The sun condition can also test if the sun has already set or risen when a trigger occurs. The `before` and `after` keys can only be set to `sunset` or `sunrise`. They have a corresponding optional offset value (`before_offset`, `after_offset`) that can be added, similar to the [sun trigger][sun_trigger]. [sun_trigger]: /docs/automation/trigger/#sun-trigger From c66f2ee4b5c9eb2da23c74cfb8114332be2fef73 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 29 May 2019 15:15:35 -0700 Subject: [PATCH 015/123] Add some more notes --- source/_posts/2019-06-05-release-94.markdown | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/source/_posts/2019-06-05-release-94.markdown b/source/_posts/2019-06-05-release-94.markdown index 01afef59b73..001bcee87d1 100644 --- a/source/_posts/2019-06-05-release-94.markdown +++ b/source/_posts/2019-06-05-release-94.markdown @@ -14,7 +14,9 @@ og_image: /images/blog/2019-06-release-94/components.png New: - - Possible to store core config in storage. Configuration.yaml will override storage. - - Onboarding updated to set core config + - Possible to store core config in storage. If set in configuration.yaml, it will override storage. Note that configuration.yaml will no longer contain any automatic detected values when writing initial configuration. This feature is available via the UI during onboarding. + - Step added to onboarding to allow configuring name, location, timezone and unit system. - Python 3.5.3 deprecated, support will be dropped in the first release after August 1. + - Add UI to manage Google Entities exposed via Home Assistant Cloud. To use, remove filters from configuration.yaml. Also allows disabling 2 factor authentication on a per device basis. + - Discovery has been redone. Integrations can now specify how they are discoverable via Zeroconf or SSDP in their manifest, this will be picked up by the zeroconf and ssdp integrations. - More cool stuff? From 07fa2b4128fe2fb1ab2c920af357e6e8253e9f77 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Thu, 30 May 2019 00:16:44 +0200 Subject: [PATCH 016/123] :pencil2: Tweak --- source/_components/zha.markdown | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/source/_components/zha.markdown b/source/_components/zha.markdown index 9f7a3e08441..2355771d4bc 100644 --- a/source/_components/zha.markdown +++ b/source/_components/zha.markdown @@ -103,12 +103,14 @@ To add new devices to the network, call the `permit` service on the `zha` domain In case you want to add Philips Hue bulbs that have previously been added to another bridge, have a look at: [https://github.com/vanviegen/hue-thief/](https://github.com/vanviegen/hue-thief/) +## {% linkable_title Troubleshooting %} -## {% linkable_title ZHA Start up issue with Home-Assistant Docker/Hass.io installs on linux hosts %} +### {% linkable_title ZHA Start up issue with Home-Assistant Docker/Hass.io installs on linux hosts %} On Linux hosts ZHA can fail to start during HA startup or restarts because the zigbee USB device is being claimed by the host's modemmanager service. To fix this disable the modemmanger on the host system. To remove modemmanager from an Debian/Ubuntu host run this command: -``` + +```bash sudo apt-get purge modemmanager ``` From 5383bce4d6e2a785a48057355bd409aba7477c5e Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 29 May 2019 19:52:54 -0700 Subject: [PATCH 017/123] Update release notes --- source/_posts/2019-06-05-release-94.markdown | 460 +++++++++++++++++++ 1 file changed, 460 insertions(+) diff --git a/source/_posts/2019-06-05-release-94.markdown b/source/_posts/2019-06-05-release-94.markdown index 001bcee87d1..697bfb67c0b 100644 --- a/source/_posts/2019-06-05-release-94.markdown +++ b/source/_posts/2019-06-05-release-94.markdown @@ -20,3 +20,463 @@ New: - Add UI to manage Google Entities exposed via Home Assistant Cloud. To use, remove filters from configuration.yaml. Also allows disabling 2 factor authentication on a per device basis. - Discovery has been redone. Integrations can now specify how they are discoverable via Zeroconf or SSDP in their manifest, this will be picked up by the zeroconf and ssdp integrations. - More cool stuff? + +## {% linkable_title New Integrations %} + +- Adding Watson TTS (IBM Cloud) ([@rutkai] - [#23299]) ([watson_tts docs]) (new-integration) (new-platform) +- MCP23017 ([@jardiamj] - [#23127]) ([mcp23017 docs]) (new-integration) (new-platform) +- Solax Inverter Sensor Component ([@squishykid] - [#22579]) ([solax docs]) (new-integration) (new-platform) +- Add Remote RPi Component ([@jgriff2] - [#23518]) ([remote_rpi_gpio docs]) (new-integration) (new-platform) +- Azure Event Hub history component ([@eavanvalkenburg] - [#23878]) ([azure_event_hub docs]) (new-integration) +- Add SSDP integration ([@balloob] - [#24090]) ([default_config docs]) ([discovery docs]) ([hue docs]) ([ssdp docs]) ([zeroconf docs]) (new-integration) + +## {% linkable_title New Platforms %} + +- Add LCN climate platform ([@alengwenus] - [#22542]) ([lcn docs]) (new-platform) +- Add incomfort climate and bump client ([@zxdavb] - [#23830]) ([incomfort docs]) (new-platform) +- Add new SmartHab light and cover platform ([@outadoc] - [#21225]) ([smarthab docs]) (new-platform) +- Add geniushub sensor and binary_sensor ([@zxdavb] - [#23811]) ([geniushub docs]) (new-platform) +- Adding Watson TTS (IBM Cloud) ([@rutkai] - [#23299]) ([watson_tts docs]) (new-integration) (new-platform) +- MCP23017 ([@jardiamj] - [#23127]) ([mcp23017 docs]) (new-integration) (new-platform) +- Solax Inverter Sensor Component ([@squishykid] - [#22579]) ([solax docs]) (new-integration) (new-platform) +- Add Remote RPi Component ([@jgriff2] - [#23518]) ([remote_rpi_gpio docs]) (new-integration) (new-platform) +- Add Repetier-Server Component ([@MTrab] - [#21658]) ([repetier docs]) (new-platform) + +## {% linkable_title If you need help... %} + +...don't hesitate to use our very active [forums](https://community.home-assistant.io/) or join us for a little [chat](https://discord.gg/c5DvZ4e). The release notes have comments enabled but it's preferred if you use the former communication channels. Thanks. + +## {% linkable_title Reporting Issues %} + +Experiencing issues introduced by this release? Please report them in our [issue tracker](https://github.com/home-assistant/home-assistant/issues). Make sure to fill in all fields of the issue template. + + + +## {% linkable_title Breaking Changes %} + +- Quiet the chatty sun.sun ([@Swamp-Ig] - [#23832]) ([sun docs]) (breaking change) +- Doorbird Refactor ([@oblogic7] - [#23892]) ([doorbird docs]) (breaking change) +- ESPHome component to use zeroconf discovery ([@Kane610] - [#24043]) ([esphome docs]) (breaking change) +- Always update all Plex client types ([@jjlawren] - [#24038]) ([plex docs]) (breaking change) +- Fix entity id naming when not using first install ([@tkjacobsen] - [#23606]) ([verisure docs]) (breaking change) +- Update the name of Zestimate sensors ([@dreed47] - [#23770]) ([zestimate docs]) (breaking change) +- Remove custom entity_id naming ([@jjlawren] - [#24072]) ([plex docs]) (breaking change) +- Trådfri component to use new zeroconf discovery ([@Kane610] - [#24041]) ([discovery docs]) ([tradfri docs]) (breaking change) +- Move Homekit controller component to user zeroconf discovery ([@Kane610] - [#24042]) ([discovery docs]) ([homekit_controller docs]) (breaking change) +- Deprecate Python 3.5.3 ([@balloob] - [#24177]) (breaking change) + +## {% linkable_title All changes %} + +- Add Presence Detector Indoor to Homematic IP ([@SukramJ] - [#23755]) ([homematicip_cloud docs]) +- Split up yaml loaders into multiple files ([@ties] - [#23774]) +- Add config entry for IQVIA ([@bachya] - [#23765]) ([iqvia docs]) +- Add stepped volume to demo ([@elupus] - [#23759]) ([demo docs]) +- Add battery binary sensor to homematic ([@sander76] - [#23067]) ([homematic docs]) +- fix two times creating JWT headers. ([@pszafer] - [#23777]) ([html5 docs]) +- Bumped keenetic NDMS2 client version ([@foxel] - [#23786]) ([keenetic_ndms2 docs]) +- Add support for an external step in config flow ([@balloob] - [#23782]) +- Centralize geniushub updates ([@zxdavb] - [#23764]) ([geniushub docs]) +- Move tests to right folder ([@balloob] - [#23790]) +- Add LCN climate platform ([@alengwenus] - [#22542]) ([lcn docs]) (new-platform) +- Bump venstarcolortouch to v0.7 ([@stbenjam] - [#23806]) ([venstar docs]) +- Upgrade youtube_dl to 2019.05.11 ([@fabaff] - [#23808]) ([media_extractor docs]) +- Bump pyotgw to 0.4b4, fix Opentherm Gateway name in manifest.json ([@mvn23] - [#23810]) ([opentherm_gw docs]) +- Fix patching right import ([@balloob] - [#23816]) +- Add incomfort climate and bump client ([@zxdavb] - [#23830]) ([incomfort docs]) (new-platform) +- Make broadlink switch restore its state ([@akloeckner] - [#23829]) ([broadlink docs]) +- Catch import error when processing config ([@balloob] - [#23833]) +- Remove badges from README [skipci] ([@balloob] - [#23815]) +- HomeKit Controller: Adopt config entries for pairing with homekit accessories ([@Jc2k] - [#23825]) ([discovery docs]) ([homekit_controller docs]) +- Automatically generate config flow list ([@balloob] - [#23802]) +- Add new SmartHab light and cover platform ([@outadoc] - [#21225]) ([smarthab docs]) (new-platform) +- Daikin adaptions for AirBase units ([@fredrike] - [#23734]) ([daikin docs]) +- Fix for battery device: new_device referenced before assignment. ([@sander76] - [#23793]) ([homematic docs]) +- Better handle large amounts of data being sent over WS ([@balloob] - [#23842]) ([camera docs]) ([lovelace docs]) ([media_player docs]) ([websocket_api docs]) +- Zeroconf - replace library ([@Kane610] - [#23835]) ([zeroconf docs]) +- WS: Improve service calling errors ([@balloob] - [#23840]) ([script docs]) ([websocket_api docs]) +- Allow deletion of automations and scripts ([@balloob] - [#23845]) ([config docs]) +- Use Cloudhooks for OwnTracks ([@balloob] - [#23847]) ([owntracks docs]) +- Fix aiohttp response serialize ([@balloob] - [#23858]) ([cloud docs]) +- Add geniushub sensor and binary_sensor ([@zxdavb] - [#23811]) ([geniushub docs]) (new-platform) +- Quiet the chatty sun.sun ([@Swamp-Ig] - [#23832]) ([sun docs]) (breaking change) +- Take code owner for sun.sun ([@Swamp-Ig] - [#23877]) ([sun docs]) +- Fix homekit test assert no messages ([@scop] - [#23856]) +- Restructure device tracker ([@balloob] - [#23862]) ([device_tracker docs]) +- Update Pynetgear to v0.6.1 ([@starkillerOG] - [#23886]) ([netgear docs]) +- Fix ecobee 3 homekit pairing ([@Jc2k] - [#23882]) ([homekit_controller docs]) +- Enable Homematic IP cloud climate device with HeatingThermostat only ([@SukramJ] - [#23776]) ([homematicip_cloud docs]) +- Load HA core config from storage ([@emontnemery] - [#23872]) +- Netatmo, handle offline device ([@Danielhiversen] - [#23907]) ([netatmo docs]) +- [WIP] Simplify zeroconf ([@robbiet480] - [#23890]) ([zeroconf docs]) +- Version bump insteonplm to 0.15.4 ([@nugget] - [#23918]) +- Fix bug when IQVIA API fails to return data ([@bachya] - [#23916]) ([iqvia docs]) +- Fix icons for homekit_controller sensors ([@Jc2k] - [#23921]) ([homekit_controller docs]) +- Fix additional IQVIA data bug ([@bachya] - [#23931]) ([iqvia docs]) +- Have homekit_controller use device registry ([@Jc2k] - [#23874]) ([homekit_controller docs]) +- Fix for non existing Daikin zones ([@fredrike] - [#23792]) ([daikin docs]) +- Fix fan rates for Daikin ([@fredrike] - [#23860]) ([daikin docs]) +- Added support for sensor other than temperature and humidity ([@Bouni] - [#23863]) ([spaceapi docs]) +- Add unit of measurement to Tautulli sensor ([@SiliconAvatar] - [#23873]) ([tautulli docs]) +- Update requests to 2.22.0 ([@BKPepe] - [#23958]) +- show battery level also when vacuum has no map support ([@adrianschroeter] - [#23947]) ([neato docs]) +- Upate xiaomi voltage parser, fix #23898 ([@Danielhiversen] - [#23962]) ([xiaomi_aqara docs]) +- Doorbird Refactor ([@oblogic7] - [#23892]) ([doorbird docs]) (breaking change) +- Update russound_rio dependency to version 0.1.7 ([@wickerwaka] - [#23973]) ([russound_rio docs]) +- Adding Watson TTS (IBM Cloud) ([@rutkai] - [#23299]) ([watson_tts docs]) (new-integration) (new-platform) +- Entity Cleanup on Z-Wave node removal ([@cgarwood] - [#23633]) ([zwave docs]) +- Use the timezone defined in Home Assistant when making the API call ([@ludeeus] - [#23284]) ([vasttrafik docs]) +- Updated non-blocking timout to 10 seconds for fixing timeout issues. ([@TomerFi] - [#23930]) ([switcher_kis docs]) +- Delete devices / entities when we remove a config entry. ([@Swamp-Ig] - [#23983]) +- Better handle file not found when loading YAML ([@balloob] - [#23908]) ([apns docs]) ([http docs]) +- daikin version bump ([@fredrike] - [#23991]) ([daikin docs]) +- Bump loopenergy library version - catches runtime exception. ([@pavoni] - [#23989]) ([loopenergy docs]) +- Update owner frontend integrations [skip ci] ([@balloob] - [#24001]) ([frontend docs]) ([lovelace docs]) ([panel_custom docs]) ([panel_iframe docs]) +- Axis IO-port support ([@Kane610] - [#23312]) ([axis docs]) +- Fire event when core config is updated ([@emontnemery] - [#23922]) +- Update CODEOWNERS ([@emontnemery] - [#24015]) +- Add websocket API for updating core config ([@emontnemery] - [#24009]) ([config docs]) +- Add geniushub sensors for issues ([@zxdavb] - [#23976]) ([geniushub docs]) +- Fix iterating over NoneType exception ([@iamtpage] - [#23648]) ([darksky docs]) +- bump geniushub-client to 0.4.9 ([@zxdavb] - [#24022]) ([geniushub docs]) +- Zeroconf discovery for config entries ([@Kane610] - [#23919]) ([axis docs]) ([zeroconf docs]) +- Improve yeelight imports ([@zewelor] - [#24020]) ([yeelight docs]) +- Downgrade Hue warning ([@balloob] - [#24033]) ([hue docs]) +- Ambiclimate test, mock ([@Danielhiversen] - [#24034]) +- Upgrade Mastodon.py to 1.4.2 ([@fabaff] - [#24004]) ([mastodon docs]) +- Require core config detection to be triggerd manually ([@balloob] - [#24019]) ([config docs]) ([onboarding docs]) +- Don't pass in loop ([@balloob] - [#23984]) +- Update ambiclimate library ([@Danielhiversen] - [#24049]) ([ambiclimate docs]) +- ESPHome component to use zeroconf discovery ([@Kane610] - [#24043]) ([esphome docs]) (breaking change) +- Add support for available property for broadlink ([@Danielhiversen] - [#23981]) ([broadlink docs]) +- Always update all Plex client types ([@jjlawren] - [#24038]) ([plex docs]) (breaking change) +- Convert stream source to method ([@balloob] - [#23905]) +- Fix entity id naming when not using first install ([@tkjacobsen] - [#23606]) ([verisure docs]) (breaking change) +- Daikin airbase beta fixes ([@fredrike] - [#24050]) ([daikin docs]) +- Better logging of method used for ADB connection ([@JeffLIrion] - [#24037]) ([androidtv docs]) +- Fix zeroconf sorting ([@balloob] - [#24068]) +- Rfxtrx, add data types ([@Danielhiversen] - [#24066]) ([rfxtrx docs]) +- Update the name of Zestimate sensors ([@dreed47] - [#23770]) ([zestimate docs]) (breaking change) +- Added possibility to define the data type of Homematic ([@p0l0] - [#24078]) ([homematic docs]) +- Add 'adb_response' attribute to Android TV / Fire TV ([@JeffLIrion] - [#23960]) ([androidtv docs]) +- Adjust logging ([@elupus] - [#24082]) +- Fix Hue bridge timeout ([@terual] - [#24084]) ([hue docs]) +- MCP23017 ([@jardiamj] - [#23127]) ([mcp23017 docs]) (new-integration) (new-platform) +- Remove device tracker unnecessary separate except clause ([@elupus] - [#24081]) ([device_tracker docs]) +- Refactoring of LCN component ([@alengwenus] - [#23824]) ([lcn docs]) +- Update code owner for Xiaomi TV ([@simse] - [#24102]) ([xiaomi_tv docs]) +- Issue #23514 - fix invalid hue response ([@techfreek] - [#23909]) ([emulated_hue docs]) +- Config entry device tracker ([@balloob] - [#24040]) ([device_tracker docs]) ([geofency docs]) ([gpslogger docs]) ([icloud docs]) ([locative docs]) ([owntracks docs]) ([zone docs]) +- Solax Inverter Sensor Component ([@squishykid] - [#22579]) ([solax docs]) (new-integration) (new-platform) +- Set assumed_state property to True. ([@jardiamj] - [#24118]) ([mcp23017 docs]) +- Remove custom entity_id naming ([@jjlawren] - [#24072]) ([plex docs]) (breaking change) +- Move imports to top ([@andrewsayre] - [#24108]) ([heos docs]) +- Use name in ESPHome discovery title ([@OttoWinter] - [#24100]) +- Add Remote RPi Component ([@jgriff2] - [#23518]) ([remote_rpi_gpio docs]) (new-integration) (new-platform) +- Azure Event Hub history component ([@eavanvalkenburg] - [#23878]) ([azure_event_hub docs]) (new-integration) +- geniushub: fix sensor battery level, and bump client ([@zxdavb] - [#24123]) ([geniushub docs]) +- Use importlib metadata to check installed packages ([@balloob] - [#24114]) +- Avoid useless Sonos state updates ([@amelchio] - [#24135]) ([sonos docs]) +- Add SSDP integration ([@balloob] - [#24090]) ([default_config docs]) ([discovery docs]) ([hue docs]) ([ssdp docs]) ([zeroconf docs]) (new-integration) +- Lovelace: Fire event on save ([@bramkragten] - [#24104]) ([lovelace docs]) +- Use central polling to update entities ([@jjlawren] - [#24059]) ([plex docs]) +- Library refactorization of deCONZ ([@Kane610] - [#23725]) ([deconz docs]) +- Retrieve wire and wireless devices with the SRM device tracker ([@aerialls] - [#24117]) ([synology_srm docs]) +- bump dependency envoy_reader to 0.4 ([@jesserizzo] - [#24145]) ([enphase_envoy docs]) +- Debug log when polling ZHA light. ([@Adminiuga] - [#24167]) ([zha docs]) +- Upgrade huawei-lte-api to 1.2.0 ([@chmielowiec] - [#24165]) ([huawei_lte docs]) +- Use device name for device_tracker entry ([@robbiet480] - [#24155]) ([mobile_app docs]) +- Use global imports for ESPHome ([@OttoWinter] - [#24158]) ([esphome docs]) +- Add Repetier-Server Component ([@MTrab] - [#21658]) ([repetier docs]) (new-platform) +- Cloud: Websocket API to manage Google assistant entity config ([@balloob] - [#24153]) ([cloud docs]) ([google_assistant docs]) +- Fix calling notify.notify with mobile_app targets in play. Fixes #24064 ([@robbiet480] - [#24156]) ([mobile_app docs]) +- Remove unused Sonos turn on/off methods ([@amelchio] - [#24174]) ([sonos docs]) +- Reinstate passing loop to DSMR ([@balloob] - [#24127]) ([dsmr docs]) +- Trådfri component to use new zeroconf discovery ([@Kane610] - [#24041]) ([discovery docs]) ([tradfri docs]) (breaking change) +- Move Homekit controller component to user zeroconf discovery ([@Kane610] - [#24042]) ([discovery docs]) ([homekit_controller docs]) (breaking change) +- Revert Zeroconf back to previously used library ([@Kane610] - [#24139]) ([zeroconf docs]) +- Deprecate Python 3.5.3 ([@balloob] - [#24177]) (breaking change) +- Keep integrations in discovery ([@Kane610] - [#24179]) ([discovery docs]) +- Avoid slow updates with unavailable Sonos devices ([@amelchio] - [#24180]) ([sonos docs]) +- Support Hass.io wheels / docker env ([@pvizeli] - [#24175]) +- Remove discovery from initial config ([@balloob] - [#24183]) +- Fix duplicated discovered homekit devices ([@Jc2k] - [#24178]) ([homekit_controller docs]) +- Add service calls for LCN component ([@alengwenus] - [#24105]) ([lcn docs]) + +[#21225]: https://github.com/home-assistant/home-assistant/pull/21225 +[#21658]: https://github.com/home-assistant/home-assistant/pull/21658 +[#22542]: https://github.com/home-assistant/home-assistant/pull/22542 +[#22579]: https://github.com/home-assistant/home-assistant/pull/22579 +[#23067]: https://github.com/home-assistant/home-assistant/pull/23067 +[#23127]: https://github.com/home-assistant/home-assistant/pull/23127 +[#23284]: https://github.com/home-assistant/home-assistant/pull/23284 +[#23299]: https://github.com/home-assistant/home-assistant/pull/23299 +[#23312]: https://github.com/home-assistant/home-assistant/pull/23312 +[#23518]: https://github.com/home-assistant/home-assistant/pull/23518 +[#23606]: https://github.com/home-assistant/home-assistant/pull/23606 +[#23633]: https://github.com/home-assistant/home-assistant/pull/23633 +[#23648]: https://github.com/home-assistant/home-assistant/pull/23648 +[#23725]: https://github.com/home-assistant/home-assistant/pull/23725 +[#23734]: https://github.com/home-assistant/home-assistant/pull/23734 +[#23755]: https://github.com/home-assistant/home-assistant/pull/23755 +[#23759]: https://github.com/home-assistant/home-assistant/pull/23759 +[#23764]: https://github.com/home-assistant/home-assistant/pull/23764 +[#23765]: https://github.com/home-assistant/home-assistant/pull/23765 +[#23770]: https://github.com/home-assistant/home-assistant/pull/23770 +[#23774]: https://github.com/home-assistant/home-assistant/pull/23774 +[#23776]: https://github.com/home-assistant/home-assistant/pull/23776 +[#23777]: https://github.com/home-assistant/home-assistant/pull/23777 +[#23782]: https://github.com/home-assistant/home-assistant/pull/23782 +[#23786]: https://github.com/home-assistant/home-assistant/pull/23786 +[#23790]: https://github.com/home-assistant/home-assistant/pull/23790 +[#23792]: https://github.com/home-assistant/home-assistant/pull/23792 +[#23793]: https://github.com/home-assistant/home-assistant/pull/23793 +[#23802]: https://github.com/home-assistant/home-assistant/pull/23802 +[#23806]: https://github.com/home-assistant/home-assistant/pull/23806 +[#23808]: https://github.com/home-assistant/home-assistant/pull/23808 +[#23810]: https://github.com/home-assistant/home-assistant/pull/23810 +[#23811]: https://github.com/home-assistant/home-assistant/pull/23811 +[#23815]: https://github.com/home-assistant/home-assistant/pull/23815 +[#23816]: https://github.com/home-assistant/home-assistant/pull/23816 +[#23824]: https://github.com/home-assistant/home-assistant/pull/23824 +[#23825]: https://github.com/home-assistant/home-assistant/pull/23825 +[#23829]: https://github.com/home-assistant/home-assistant/pull/23829 +[#23830]: https://github.com/home-assistant/home-assistant/pull/23830 +[#23832]: https://github.com/home-assistant/home-assistant/pull/23832 +[#23833]: https://github.com/home-assistant/home-assistant/pull/23833 +[#23835]: https://github.com/home-assistant/home-assistant/pull/23835 +[#23840]: https://github.com/home-assistant/home-assistant/pull/23840 +[#23842]: https://github.com/home-assistant/home-assistant/pull/23842 +[#23845]: https://github.com/home-assistant/home-assistant/pull/23845 +[#23847]: https://github.com/home-assistant/home-assistant/pull/23847 +[#23856]: https://github.com/home-assistant/home-assistant/pull/23856 +[#23858]: https://github.com/home-assistant/home-assistant/pull/23858 +[#23860]: https://github.com/home-assistant/home-assistant/pull/23860 +[#23862]: https://github.com/home-assistant/home-assistant/pull/23862 +[#23863]: https://github.com/home-assistant/home-assistant/pull/23863 +[#23872]: https://github.com/home-assistant/home-assistant/pull/23872 +[#23873]: https://github.com/home-assistant/home-assistant/pull/23873 +[#23874]: https://github.com/home-assistant/home-assistant/pull/23874 +[#23877]: https://github.com/home-assistant/home-assistant/pull/23877 +[#23878]: https://github.com/home-assistant/home-assistant/pull/23878 +[#23882]: https://github.com/home-assistant/home-assistant/pull/23882 +[#23886]: https://github.com/home-assistant/home-assistant/pull/23886 +[#23890]: https://github.com/home-assistant/home-assistant/pull/23890 +[#23892]: https://github.com/home-assistant/home-assistant/pull/23892 +[#23905]: https://github.com/home-assistant/home-assistant/pull/23905 +[#23907]: https://github.com/home-assistant/home-assistant/pull/23907 +[#23908]: https://github.com/home-assistant/home-assistant/pull/23908 +[#23909]: https://github.com/home-assistant/home-assistant/pull/23909 +[#23916]: https://github.com/home-assistant/home-assistant/pull/23916 +[#23918]: https://github.com/home-assistant/home-assistant/pull/23918 +[#23919]: https://github.com/home-assistant/home-assistant/pull/23919 +[#23921]: https://github.com/home-assistant/home-assistant/pull/23921 +[#23922]: https://github.com/home-assistant/home-assistant/pull/23922 +[#23930]: https://github.com/home-assistant/home-assistant/pull/23930 +[#23931]: https://github.com/home-assistant/home-assistant/pull/23931 +[#23947]: https://github.com/home-assistant/home-assistant/pull/23947 +[#23958]: https://github.com/home-assistant/home-assistant/pull/23958 +[#23960]: https://github.com/home-assistant/home-assistant/pull/23960 +[#23962]: https://github.com/home-assistant/home-assistant/pull/23962 +[#23973]: https://github.com/home-assistant/home-assistant/pull/23973 +[#23976]: https://github.com/home-assistant/home-assistant/pull/23976 +[#23981]: https://github.com/home-assistant/home-assistant/pull/23981 +[#23983]: https://github.com/home-assistant/home-assistant/pull/23983 +[#23984]: https://github.com/home-assistant/home-assistant/pull/23984 +[#23989]: https://github.com/home-assistant/home-assistant/pull/23989 +[#23991]: https://github.com/home-assistant/home-assistant/pull/23991 +[#24001]: https://github.com/home-assistant/home-assistant/pull/24001 +[#24004]: https://github.com/home-assistant/home-assistant/pull/24004 +[#24009]: https://github.com/home-assistant/home-assistant/pull/24009 +[#24015]: https://github.com/home-assistant/home-assistant/pull/24015 +[#24019]: https://github.com/home-assistant/home-assistant/pull/24019 +[#24020]: https://github.com/home-assistant/home-assistant/pull/24020 +[#24022]: https://github.com/home-assistant/home-assistant/pull/24022 +[#24033]: https://github.com/home-assistant/home-assistant/pull/24033 +[#24034]: https://github.com/home-assistant/home-assistant/pull/24034 +[#24037]: https://github.com/home-assistant/home-assistant/pull/24037 +[#24038]: https://github.com/home-assistant/home-assistant/pull/24038 +[#24040]: https://github.com/home-assistant/home-assistant/pull/24040 +[#24041]: https://github.com/home-assistant/home-assistant/pull/24041 +[#24042]: https://github.com/home-assistant/home-assistant/pull/24042 +[#24043]: https://github.com/home-assistant/home-assistant/pull/24043 +[#24049]: https://github.com/home-assistant/home-assistant/pull/24049 +[#24050]: https://github.com/home-assistant/home-assistant/pull/24050 +[#24059]: https://github.com/home-assistant/home-assistant/pull/24059 +[#24066]: https://github.com/home-assistant/home-assistant/pull/24066 +[#24068]: https://github.com/home-assistant/home-assistant/pull/24068 +[#24072]: https://github.com/home-assistant/home-assistant/pull/24072 +[#24078]: https://github.com/home-assistant/home-assistant/pull/24078 +[#24081]: https://github.com/home-assistant/home-assistant/pull/24081 +[#24082]: https://github.com/home-assistant/home-assistant/pull/24082 +[#24084]: https://github.com/home-assistant/home-assistant/pull/24084 +[#24090]: https://github.com/home-assistant/home-assistant/pull/24090 +[#24100]: https://github.com/home-assistant/home-assistant/pull/24100 +[#24102]: https://github.com/home-assistant/home-assistant/pull/24102 +[#24104]: https://github.com/home-assistant/home-assistant/pull/24104 +[#24105]: https://github.com/home-assistant/home-assistant/pull/24105 +[#24108]: https://github.com/home-assistant/home-assistant/pull/24108 +[#24114]: https://github.com/home-assistant/home-assistant/pull/24114 +[#24117]: https://github.com/home-assistant/home-assistant/pull/24117 +[#24118]: https://github.com/home-assistant/home-assistant/pull/24118 +[#24123]: https://github.com/home-assistant/home-assistant/pull/24123 +[#24127]: https://github.com/home-assistant/home-assistant/pull/24127 +[#24135]: https://github.com/home-assistant/home-assistant/pull/24135 +[#24139]: https://github.com/home-assistant/home-assistant/pull/24139 +[#24145]: https://github.com/home-assistant/home-assistant/pull/24145 +[#24153]: https://github.com/home-assistant/home-assistant/pull/24153 +[#24155]: https://github.com/home-assistant/home-assistant/pull/24155 +[#24156]: https://github.com/home-assistant/home-assistant/pull/24156 +[#24158]: https://github.com/home-assistant/home-assistant/pull/24158 +[#24165]: https://github.com/home-assistant/home-assistant/pull/24165 +[#24167]: https://github.com/home-assistant/home-assistant/pull/24167 +[#24174]: https://github.com/home-assistant/home-assistant/pull/24174 +[#24175]: https://github.com/home-assistant/home-assistant/pull/24175 +[#24177]: https://github.com/home-assistant/home-assistant/pull/24177 +[#24178]: https://github.com/home-assistant/home-assistant/pull/24178 +[#24179]: https://github.com/home-assistant/home-assistant/pull/24179 +[#24180]: https://github.com/home-assistant/home-assistant/pull/24180 +[#24183]: https://github.com/home-assistant/home-assistant/pull/24183 +[@Adminiuga]: https://github.com/Adminiuga +[@BKPepe]: https://github.com/BKPepe +[@Bouni]: https://github.com/Bouni +[@Danielhiversen]: https://github.com/Danielhiversen +[@Jc2k]: https://github.com/Jc2k +[@JeffLIrion]: https://github.com/JeffLIrion +[@Kane610]: https://github.com/Kane610 +[@MTrab]: https://github.com/MTrab +[@OttoWinter]: https://github.com/OttoWinter +[@SiliconAvatar]: https://github.com/SiliconAvatar +[@SukramJ]: https://github.com/SukramJ +[@Swamp-Ig]: https://github.com/Swamp-Ig +[@TomerFi]: https://github.com/TomerFi +[@adrianschroeter]: https://github.com/adrianschroeter +[@aerialls]: https://github.com/aerialls +[@akloeckner]: https://github.com/akloeckner +[@alengwenus]: https://github.com/alengwenus +[@amelchio]: https://github.com/amelchio +[@andrewsayre]: https://github.com/andrewsayre +[@bachya]: https://github.com/bachya +[@balloob]: https://github.com/balloob +[@bramkragten]: https://github.com/bramkragten +[@cgarwood]: https://github.com/cgarwood +[@chmielowiec]: https://github.com/chmielowiec +[@dreed47]: https://github.com/dreed47 +[@eavanvalkenburg]: https://github.com/eavanvalkenburg +[@elupus]: https://github.com/elupus +[@emontnemery]: https://github.com/emontnemery +[@fabaff]: https://github.com/fabaff +[@foxel]: https://github.com/foxel +[@fredrike]: https://github.com/fredrike +[@iamtpage]: https://github.com/iamtpage +[@jardiamj]: https://github.com/jardiamj +[@jesserizzo]: https://github.com/jesserizzo +[@jgriff2]: https://github.com/jgriff2 +[@jjlawren]: https://github.com/jjlawren +[@ludeeus]: https://github.com/ludeeus +[@mvn23]: https://github.com/mvn23 +[@nugget]: https://github.com/nugget +[@oblogic7]: https://github.com/oblogic7 +[@outadoc]: https://github.com/outadoc +[@p0l0]: https://github.com/p0l0 +[@pavoni]: https://github.com/pavoni +[@pszafer]: https://github.com/pszafer +[@pvizeli]: https://github.com/pvizeli +[@robbiet480]: https://github.com/robbiet480 +[@rutkai]: https://github.com/rutkai +[@sander76]: https://github.com/sander76 +[@scop]: https://github.com/scop +[@simse]: https://github.com/simse +[@squishykid]: https://github.com/squishykid +[@starkillerOG]: https://github.com/starkillerOG +[@stbenjam]: https://github.com/stbenjam +[@techfreek]: https://github.com/techfreek +[@terual]: https://github.com/terual +[@ties]: https://github.com/ties +[@tkjacobsen]: https://github.com/tkjacobsen +[@wickerwaka]: https://github.com/wickerwaka +[@zewelor]: https://github.com/zewelor +[@zxdavb]: https://github.com/zxdavb +[ambiclimate docs]: /components/ambiclimate/ +[androidtv docs]: /components/androidtv/ +[apns docs]: /components/apns/ +[axis docs]: /components/axis/ +[azure_event_hub docs]: /components/azure_event_hub/ +[broadlink docs]: /components/broadlink/ +[camera docs]: /components/camera/ +[cloud docs]: /components/cloud/ +[config docs]: /components/config/ +[daikin docs]: /components/daikin/ +[darksky docs]: /components/darksky/ +[deconz docs]: /components/deconz/ +[default_config docs]: /components/default_config/ +[demo docs]: /components/demo/ +[device_tracker docs]: /components/device_tracker/ +[discovery docs]: /components/discovery/ +[doorbird docs]: /components/doorbird/ +[dsmr docs]: /components/dsmr/ +[emulated_hue docs]: /components/emulated_hue/ +[enphase_envoy docs]: /components/enphase_envoy/ +[esphome docs]: /components/esphome/ +[frontend docs]: /components/frontend/ +[geniushub docs]: /components/geniushub/ +[geofency docs]: /components/geofency/ +[google_assistant docs]: /components/google_assistant/ +[gpslogger docs]: /components/gpslogger/ +[heos docs]: /components/heos/ +[homekit_controller docs]: /components/homekit_controller/ +[homematic docs]: /components/homematic/ +[homematicip_cloud docs]: /components/homematicip_cloud/ +[html5 docs]: /components/html5/ +[http docs]: /components/http/ +[huawei_lte docs]: /components/huawei_lte/ +[hue docs]: /components/hue/ +[icloud docs]: /components/icloud/ +[incomfort docs]: /components/incomfort/ +[iqvia docs]: /components/iqvia/ +[keenetic_ndms2 docs]: /components/keenetic_ndms2/ +[lcn docs]: /components/lcn/ +[locative docs]: /components/locative/ +[loopenergy docs]: /components/loopenergy/ +[lovelace docs]: /components/lovelace/ +[mastodon docs]: /components/mastodon/ +[mcp23017 docs]: /components/mcp23017/ +[media_extractor docs]: /components/media_extractor/ +[media_player docs]: /components/media_player/ +[mobile_app docs]: /components/mobile_app/ +[neato docs]: /components/neato/ +[netatmo docs]: /components/netatmo/ +[netgear docs]: /components/netgear/ +[onboarding docs]: /components/onboarding/ +[opentherm_gw docs]: /components/opentherm_gw/ +[owntracks docs]: /components/owntracks/ +[panel_custom docs]: /components/panel_custom/ +[panel_iframe docs]: /components/panel_iframe/ +[plex docs]: /components/plex/ +[remote_rpi_gpio docs]: /components/remote_rpi_gpio/ +[repetier docs]: /components/repetier/ +[rfxtrx docs]: /components/rfxtrx/ +[russound_rio docs]: /components/russound_rio/ +[script docs]: /components/script/ +[smarthab docs]: /components/smarthab/ +[solax docs]: /components/solax/ +[sonos docs]: /components/sonos/ +[spaceapi docs]: /components/spaceapi/ +[ssdp docs]: /components/ssdp/ +[sun docs]: /components/sun/ +[switcher_kis docs]: /components/switcher_kis/ +[synology_srm docs]: /components/synology_srm/ +[tautulli docs]: /components/tautulli/ +[tradfri docs]: /components/tradfri/ +[vasttrafik docs]: /components/vasttrafik/ +[venstar docs]: /components/venstar/ +[verisure docs]: /components/verisure/ +[watson_tts docs]: /components/watson_tts/ +[websocket_api docs]: /components/websocket_api/ +[xiaomi_aqara docs]: /components/xiaomi_aqara/ +[xiaomi_tv docs]: /components/xiaomi_tv/ +[yeelight docs]: /components/yeelight/ +[zeroconf docs]: /components/zeroconf/ +[zestimate docs]: /components/zestimate/ +[zha docs]: /components/zha/ +[zone docs]: /components/zone/ +[zwave docs]: /components/zwave/ From 4516a0940ea26745dec61b422a030bda94907627 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 29 May 2019 20:06:10 -0700 Subject: [PATCH 018/123] Add some more notes --- source/_posts/2019-06-05-release-94.markdown | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/source/_posts/2019-06-05-release-94.markdown b/source/_posts/2019-06-05-release-94.markdown index 697bfb67c0b..4a4c50917ae 100644 --- a/source/_posts/2019-06-05-release-94.markdown +++ b/source/_posts/2019-06-05-release-94.markdown @@ -14,12 +14,13 @@ og_image: /images/blog/2019-06-release-94/components.png New: - - Possible to store core config in storage. If set in configuration.yaml, it will override storage. Note that configuration.yaml will no longer contain any automatic detected values when writing initial configuration. This feature is available via the UI during onboarding. + - Possible to store core config in storage. If set in configuration.yaml, it will override storage (this is what anyone coming from 0.93 has). Note that configuration.yaml will no longer contain any automatic detected values when writing initial configuration. This feature is available via the UI during onboarding. + - Allow deletion of scripts/automations via the UI editor. + - This is the first release where a user can use a subset of Home Assistant without using configuration.yaml. - Step added to onboarding to allow configuring name, location, timezone and unit system. - Python 3.5.3 deprecated, support will be dropped in the first release after August 1. - Add UI to manage Google Entities exposed via Home Assistant Cloud. To use, remove filters from configuration.yaml. Also allows disabling 2 factor authentication on a per device basis. - - Discovery has been redone. Integrations can now specify how they are discoverable via Zeroconf or SSDP in their manifest, this will be picked up by the zeroconf and ssdp integrations. - - More cool stuff? + - Discovery has been redone. Integrations can now specify how they are discoverable via Zeroconf or SSDP in their manifest, this will be picked up by the zeroconf and ssdp integrations. The new discovery is non-obtrusive: nothing is added to your configuration without approval by the user. You can find integrations pending approval in the discovered section of the integrations page in the config. ## {% linkable_title New Integrations %} From c93d94dd1d58b64a76a52ca0e0e7d9457898deda Mon Sep 17 00:00:00 2001 From: Otto Winter Date: Fri, 31 May 2019 00:36:54 +0200 Subject: [PATCH 019/123] Remove esphome breaking change (#9537) --- source/_posts/2019-06-05-release-94.markdown | 1 - 1 file changed, 1 deletion(-) diff --git a/source/_posts/2019-06-05-release-94.markdown b/source/_posts/2019-06-05-release-94.markdown index 4a4c50917ae..40167c84061 100644 --- a/source/_posts/2019-06-05-release-94.markdown +++ b/source/_posts/2019-06-05-release-94.markdown @@ -57,7 +57,6 @@ Experiencing issues introduced by this release? Please report them in our [issue - Quiet the chatty sun.sun ([@Swamp-Ig] - [#23832]) ([sun docs]) (breaking change) - Doorbird Refactor ([@oblogic7] - [#23892]) ([doorbird docs]) (breaking change) -- ESPHome component to use zeroconf discovery ([@Kane610] - [#24043]) ([esphome docs]) (breaking change) - Always update all Plex client types ([@jjlawren] - [#24038]) ([plex docs]) (breaking change) - Fix entity id naming when not using first install ([@tkjacobsen] - [#23606]) ([verisure docs]) (breaking change) - Update the name of Zestimate sensors ([@dreed47] - [#23770]) ([zestimate docs]) (breaking change) From 1744091219521a8c7d1b11c85f77931fbe66606e Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 31 May 2019 13:56:02 -0700 Subject: [PATCH 020/123] Update notes --- source/_posts/2019-06-05-release-94.markdown | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/source/_posts/2019-06-05-release-94.markdown b/source/_posts/2019-06-05-release-94.markdown index 40167c84061..a5d8b8fda62 100644 --- a/source/_posts/2019-06-05-release-94.markdown +++ b/source/_posts/2019-06-05-release-94.markdown @@ -14,13 +14,14 @@ og_image: /images/blog/2019-06-release-94/components.png New: - - Possible to store core config in storage. If set in configuration.yaml, it will override storage (this is what anyone coming from 0.93 has). Note that configuration.yaml will no longer contain any automatic detected values when writing initial configuration. This feature is available via the UI during onboarding. + - Possible to store core config in storage. If set in configuration.yaml, it will override storage (this is what anyone coming from 0.93 has). Note that configuration.yaml will no longer contain any automatic detected values when writing initial configuration. This feature is available via the UI during onboarding. Big thanks to [@emontnemery] for this contribution. - Allow deletion of scripts/automations via the UI editor. - This is the first release where a user can use a subset of Home Assistant without using configuration.yaml. - Step added to onboarding to allow configuring name, location, timezone and unit system. - Python 3.5.3 deprecated, support will be dropped in the first release after August 1. - Add UI to manage Google Entities exposed via Home Assistant Cloud. To use, remove filters from configuration.yaml. Also allows disabling 2 factor authentication on a per device basis. - - Discovery has been redone. Integrations can now specify how they are discoverable via Zeroconf or SSDP in their manifest, this will be picked up by the zeroconf and ssdp integrations. The new discovery is non-obtrusive: nothing is added to your configuration without approval by the user. You can find integrations pending approval in the discovered section of the integrations page in the config. + - Discovery has been redone. Integrations can now specify how they are discoverable via Zeroconf, SSDP or HomeKit in their manifest, this will be picked up by the zeroconf and ssdp integrations. The new discovery is non-obtrusive: nothing is added to your configuration without approval by the user. You can find integrations pending approval in the discovered section of the integrations page in the config. Only a handful of integrations have been migrated to the new approach in this release. Thanks to [@Kane610], [@Jc2k] + ## {% linkable_title New Integrations %} From d174c6c55e1ac2d1bbaffa992bcef45af76e9eba Mon Sep 17 00:00:00 2001 From: Kyle Niewiada Date: Fri, 31 May 2019 17:54:42 -0400 Subject: [PATCH 021/123] Add device model and bold shutdown directions Added a device model for the Hank Z-Wave button: https://products.z-wavealliance.org/products/1918 I just bought one and used the same directions to get it working. I also wanted to bold the directions telling the user to shutdown because I missed that paragraph and lost quite a bit of time trying to figure out why it wouldn't persist. --- source/_docs/z-wave/device-specific.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_docs/z-wave/device-specific.markdown b/source/_docs/z-wave/device-specific.markdown index aacb9b3da27..da14dc69af9 100644 --- a/source/_docs/z-wave/device-specific.markdown +++ b/source/_docs/z-wave/device-specific.markdown @@ -167,7 +167,7 @@ Some models of the Zooz Toggle switches ship with an instruction manual with inc ## {% linkable_title Central Scene configuration %} -To provide Central Scene support you need to shut Home Assistant down and modify your `zwcfg_*.xml` file according to the following guides. +To provide Central Scene support you need to **shut Home Assistant down** and modify your `zwcfg_*.xml` file according to the following guides. ### {% linkable_title Inovelli Scene Capable On/Off and Dimmer Wall Switches %} @@ -386,7 +386,7 @@ Button four release|4|1 Use the same configuration as for the Aeotec Wallmote. -### {% linkable_title HANK One-key Scene Controller HKZN-SCN01 %} +### {% linkable_title HANK One-key Scene Controller HKZN-SCN01/HKZW-SCN01 %} For the HANK One-key Scene Controller, you may need to update the `COMMAND_CLASS_CENTRAL_SCENE` for each node in your `zwcfg` file with the following: From 0f89c201dcdae21984c4dd09b9abfa6a02da2eb4 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 31 May 2019 15:17:10 -0700 Subject: [PATCH 022/123] More notes --- source/_posts/2019-06-05-release-94.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_posts/2019-06-05-release-94.markdown b/source/_posts/2019-06-05-release-94.markdown index a5d8b8fda62..b773f6691e0 100644 --- a/source/_posts/2019-06-05-release-94.markdown +++ b/source/_posts/2019-06-05-release-94.markdown @@ -20,8 +20,8 @@ New: - Step added to onboarding to allow configuring name, location, timezone and unit system. - Python 3.5.3 deprecated, support will be dropped in the first release after August 1. - Add UI to manage Google Entities exposed via Home Assistant Cloud. To use, remove filters from configuration.yaml. Also allows disabling 2 factor authentication on a per device basis. - - Discovery has been redone. Integrations can now specify how they are discoverable via Zeroconf, SSDP or HomeKit in their manifest, this will be picked up by the zeroconf and ssdp integrations. The new discovery is non-obtrusive: nothing is added to your configuration without approval by the user. You can find integrations pending approval in the discovered section of the integrations page in the config. Only a handful of integrations have been migrated to the new approach in this release. Thanks to [@Kane610], [@Jc2k] - + - Discovery has been redone. Integrations can now specify how they are discoverable via Zeroconf, SSDP or HomeKit in their manifest, this will be picked up by the zeroconf and ssdp integrations, which are part of the default config. The new discovery is non-obtrusive: nothing is added to your configuration without approval by the user. You can find integrations pending approval in the discovered section of the integrations page in the config. Only a handful of integrations have been migrated to the new approach in this release. Thanks to [@Kane610], [@Jc2k]. If you are not using the `default_config` integration, add `ssdp:` and `zeroconf:` to your configuration.yaml. + - We are bringing the device tracker integration into the age of modern integrations. The first step has been to migrating the platforms that use config entries like OwnTracks and GPSLogger. This means that for these integrations, you will now be able to use things like entity registry to change entity ID and name. ## {% linkable_title New Integrations %} From b90fcfe5385790e4a690a61185696cb30ab9cf2a Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Sat, 1 Jun 2019 00:41:16 +0200 Subject: [PATCH 023/123] :pencil2: Tweak --- source/_docs/z-wave/device-specific.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_docs/z-wave/device-specific.markdown b/source/_docs/z-wave/device-specific.markdown index da14dc69af9..94f6edb9c40 100644 --- a/source/_docs/z-wave/device-specific.markdown +++ b/source/_docs/z-wave/device-specific.markdown @@ -167,7 +167,7 @@ Some models of the Zooz Toggle switches ship with an instruction manual with inc ## {% linkable_title Central Scene configuration %} -To provide Central Scene support you need to **shut Home Assistant down** and modify your `zwcfg_*.xml` file according to the following guides. +To provide Central Scene support you need to **shutdown Home Assistant** and modify your `zwcfg_*.xml` file according to the following guides. ### {% linkable_title Inovelli Scene Capable On/Off and Dimmer Wall Switches %} From db243d7fb6f871e019c9539784c6a04d2f48b136 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 31 May 2019 15:50:05 -0700 Subject: [PATCH 024/123] Update geofency, GPSLogger and owntracks docs --- source/_components/geofency.markdown | 8 +++---- source/_components/gpslogger.markdown | 4 +--- source/_components/locative.md | 4 +--- source/_components/owntracks.markdown | 30 +++------------------------ 4 files changed, 8 insertions(+), 38 deletions(-) diff --git a/source/_components/geofency.markdown b/source/_components/geofency.markdown index 86d38f99d84..70abf05f026 100644 --- a/source/_components/geofency.markdown +++ b/source/_components/geofency.markdown @@ -16,15 +16,13 @@ redirect_from: - /components/device_tracker.geofency/ --- -This component sets up integration with [Geofency](http://www.geofency.com/). Geofency is a [paid app](https://itunes.apple.com/app/id615538630) for iOS that lets users to configure a request that will be sent when a geofence or iBeacon region is entered or exited. This can be configured with Home Assistant to update your location. - -Enabling this component will automatically enable the Geofency Device Tracker. +This component sets up integration with [Geofency](http://www.geofency.com/). Geofency is a paid app for iOS that lets users to configure a request that will be sent when a geofence or iBeacon region is entered or exited. This can be configured with Home Assistant to update your location. ## {% linkable_title Configuration %} To configure Geofency, you must set it up via the integrations panel in the configuration screen. You must then configure the iOS app (via the Webhook feature) to send a POST request to your Home Assistant server at the webhook URL provided by the integration during setup. Use the default POST format. Make sure to enable the 'Update Geo-Position' functionality for mobile beacons. -Geofency will automatically generate the device tracker name used for geofences, and you will find it in `known_devices.yaml` after the first request. For beacons, the device name will be `beacon_`, e.g., `device_tracker.beacon_car`. +Geofency will automatically generate the device tracker name used for geofences, and you will find it in the integrations section after the first request. For beacons, the device name will be `beacon_`, e.g., `device_tracker.beacon_car`. When using mobile beacons (optional) an entry in `configuration.yaml` is still needed as this can't be added via the integrations panel. @@ -49,4 +47,4 @@ geofency: When you enter a geofence or stationary beacon, your location name in Home Assistant will be set to the name of the geofence or beacon location in Geofency. When you exit a geofence or stationary beacon, your location name in Home Assistant will be set to `not home`. For mobile beacons, the location name will be `not_home` whenever the beacon is entered or exited outside of a [zone](/components/zone/), otherwise, it will be set to the name of the zone. -To make Geofency work better with the [proximity](/components/proximity/) component, you should enable the 'Send Current Location' feature in the Webhook configuration screen. This ensures that the _current_ GPS coordinates are included in exit events instead of the coordinates of the (center of) the zone that was exited. \ No newline at end of file +To make Geofency work better with the [proximity](/components/proximity/) component, you should enable the 'Send Current Location' feature in the Webhook configuration screen. This ensures that the _current_ GPS coordinates are included in exit events instead of the coordinates of the (center of) the zone that was exited. diff --git a/source/_components/gpslogger.markdown b/source/_components/gpslogger.markdown index 8f4e5549ac0..eb4e00ceb77 100644 --- a/source/_components/gpslogger.markdown +++ b/source/_components/gpslogger.markdown @@ -16,9 +16,7 @@ redirect_from: - /components/device_tracker.gpslogger/ --- -This component sets up integration with [GPSLogger](http://code.mendhak.com/gpslogger/). GPSLogger is an open source app for [Android](https://play.google.com/store/apps/details?id=com.mendhak.gpslogger) that allows users to set up a `POST` request to update GPS coordinates. This can be configured with Home Assistant to update your location. - -Enabling this component will automatically enable the GPSLogger Device Tracker. +This component sets up integration with [GPSLogger](https://gpslogger.app/). GPSLogger is an open source app for Android that allows users to update your location in Home Assistant. ## {% linkable_title Configuration %} diff --git a/source/_components/locative.md b/source/_components/locative.md index 7aeecdfa8a3..b704054ff02 100644 --- a/source/_components/locative.md +++ b/source/_components/locative.md @@ -17,7 +17,7 @@ redirect_from: ---

-Locative is no longer under active development. Read more here +Locative is no longer under active development.

This platform allows you to detect presence using [Locative](https://my.locative.io/). Locative is an open source app for [iOS](https://github.com/LocativeHQ/ios-app) and [Android](https://github.com/LocativeHQ/Locative-Android) that allows users to set up a `GET` or `POST` request when a geofence is entered or exited. This can be configured with Home Assistant to update your location. @@ -34,5 +34,3 @@ To configure Locative, you must set it up via the integrations panel in the conf

When you enter a geofence, your location name in Home Assistant will be set to the name of the geofence in Locative. When you exit a geofence, your location name in Home Assistant will be set to "not home". - -To use Locative in combination with another device tracker, such as [Nmap](/components/device_tracker.nmap_tracker/) or [Netgear](/components/device_tracker.netgear/), fill in the `mac` field to the Locative entry in `known_devices.yaml` with the MAC address of the device you want to track. The state of the device will be determined by the source that reported last. diff --git a/source/_components/owntracks.markdown b/source/_components/owntracks.markdown index 7dc33ac5b0e..fafb7ab9573 100644 --- a/source/_components/owntracks.markdown +++ b/source/_components/owntracks.markdown @@ -24,17 +24,9 @@ By default the integration will listen for incoming messages from OwnTracks via -### {% linkable_title Configuring the component %} +## {% linkable_title Configuration %} -1. Open the Home Assistant frontend -1. Open Settings -> integrations -1. If you see an Owntracks component under 'Configured', delete it. - - Click on it. - - Click on the trashcan icon in the upper right corner. -1. Now, look for Owntracks in 'Setup new integration' and click on CONFIGURE. -1. The login credentials and configuration for owntracks will be presented to you. - in a popup window. You will need these in the configuration for the app as mentioned below. -1. Save these credentials somewhere, as there is no way to get it back at a later point in time if it is lost, besides repeating step 1-5 +To configure OwnTracks, you must set it up via the integrations panel in the configuration screen. This will give you the webhook URL to use during mobile device configuration (below). ### {% linkable_title Configuring the app - Android %} @@ -43,7 +35,7 @@ By default the integration will listen for incoming messages from OwnTracks via In the OwnTracks app, open sidebar and click on preferences, then on connection. Change the following settings: - Mode: Private HTTP - - Host: `` + - Host: `` - Identification: - Username: `` - Password: Can be left blank. @@ -167,19 +159,3 @@ By default, any Owntracks user connected to Home Assistant can export their wayp 1. The configuration variable `waypoints` can be set to `false` which will disable importing waypoints for all users. 2. The configuration variable `waypoint_whitelist` can contain a list of users who are allowed to import waypoints. - -## {% linkable_title Using Owntracks with other device trackers %} - -Owntracks can also be used with other device trackers, such as [Nmap](/components/device_tracker.nmap_tracker/) or [Netgear](/components/device_tracker.netgear/). To do this, fill in the `mac` field to the Owntracks entry in `known_devices.yaml` with the MAC address of the device you want to track. This way the state of the device will be determined by the source that reported last. The naming convention for known device list is `_` and could be set in app configuration. More details about this config can found in [device tracker](/components/device_tracker/). - -An example showing the inclusion of the `mac` field for multiple component tracking. The `mac` field will need to be added to the `owntracks` device and will enable tracking by all components that track via the `mac` address. - -```yaml -USERNAME_DEVICE_ID: - name: Friendly Name - mac: EA:AA:55:E7:C6:94 - picture: https://www.home-assistant.io/images/favicon-192x192.png - gravatar: test@example.com - track: true - hide_if_away: false -``` From 2d752bcab07e612064fe44918d7db6b57c368746 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Sat, 1 Jun 2019 01:46:57 +0200 Subject: [PATCH 025/123] :hammer: Restructure platform pages (#9541) --- .../_components/alarm_control_panel.markdown | 9 +-- source/_components/binary_sensor.markdown | 34 +--------- source/_components/camera.markdown | 67 ++++++++++--------- source/_components/climate.markdown | 21 +----- source/_components/cover.markdown | 24 +------ source/_components/device_tracker.markdown | 34 ++-------- source/_components/fan.markdown | 14 +--- source/_components/light.markdown | 10 ++- source/_components/lock.markdown | 2 + source/_components/media_player.markdown | 4 +- source/_components/notify.markdown | 16 +---- source/_components/sensor.markdown | 19 +----- source/_components/switch.markdown | 2 + 13 files changed, 72 insertions(+), 184 deletions(-) diff --git a/source/_components/alarm_control_panel.markdown b/source/_components/alarm_control_panel.markdown index 8ae3f922130..12df0d474a5 100644 --- a/source/_components/alarm_control_panel.markdown +++ b/source/_components/alarm_control_panel.markdown @@ -7,12 +7,9 @@ sidebar: true comments: false sharing: true footer: true +ha_category: + - Alarm ha_release: 0.7.3 --- -Home Assistant can give you an interface with is similar to a classic alarm system. There are several panels supported: - -- [Alarm.com](/components/alarm_control_panel.alarmdotcom/) -- [Manual](/components/alarm_control_panel.manual/) -- [MQTT](/components/alarm_control_panel.mqtt/) -- [Verisure](/components/verisure/) +Home Assistant can give you an interface with is similar to a classic alarm system. diff --git a/source/_components/binary_sensor.markdown b/source/_components/binary_sensor.markdown index 41193b16c9a..f8e61cbd429 100644 --- a/source/_components/binary_sensor.markdown +++ b/source/_components/binary_sensor.markdown @@ -7,43 +7,13 @@ sidebar: true comments: false sharing: true footer: true +ha_category: + - Binary Sensor ha_release: 0.9 --- Binary sensors gather information about the state of devices which have a "digital" return value (either 1 or 0). These can be switches, contacts, pins, etc. These sensors only have two states: **0/off/low/closed/false** and **1/on/high/open/true**. Knowing that there are only two states allows Home Assistant to represent these sensors in a better way in the frontend according to their functionality. -### {% linkable_title Device Class %} - -The way these sensors are displayed in the frontend can be modified in the [customize section](/getting-started/customizing-devices/). The following device classes are supported for binary sensors: - -- **None**: Generic on/off. This is the default and doesn't need to be set. -- **battery**: `On` means low, `Off` means normal -- **cold**: `On` means cold, `Off` means normal -- **connectivity**: `On` means connected, `Off` means disconnected -- **door**: `On` means open, `Off` means closed -- **garage_door**: `On` means open, `Off` means closed -- **gas**: `On` means gas detected, `Off` means no gas (clear) -- **heat**: `On` means hot, `Off` means normal -- **light**: `On` means light detected, `Off` means no light -- **lock**: `On` means open (unlocked), `Off` means closed (locked) -- **moisture**: `On` means moisture detected (wet), `Off` means no moisture (dry) -- **motion**: `On` means motion detected, `Off` means no motion (clear) -- **moving**: `On` means moving, `Off` means not moving (stopped) -- **occupancy**: `On` means occupied, `Off` means not occupied (clear) -- **opening**: `On` means open, `Off` means closed -- **plug**: `On` means device is plugged in, `Off` means device is unplugged -- **power**: `On` means power detected, `Off` means no power -- **presence**: `On` means home, `Off` means away -- **problem**: `On` means problem detected, `Off` means no problem (OK) -- **safety**: `On` means unsafe, `Off` means safe -- **smoke**: `On` means smoke detected, `Off` means no smoke (clear) -- **sound**: `On` means sound detected, `Off` means no sound (clear) -- **vibration**: `On` means vibration detected, `Off` means no vibration (clear) -- **window**: `On` means open, `Off` means closed - -For analog sensors please check the [component overview](/components/#sensor). -

-Example of various device classes icons in `On` and `Off` state.

diff --git a/source/_components/camera.markdown b/source/_components/camera.markdown index bde3c074194..706ce094b9b 100644 --- a/source/_components/camera.markdown +++ b/source/_components/camera.markdown @@ -7,10 +7,24 @@ sidebar: true comments: false sharing: true footer: true +ha_category: + - Camera ha_release: 0.7 --- -The camera component allows you to use IP cameras with Home Assistant. With a little additional work you could use [USB cameras](/blog/2016/06/23/usb-webcams-and-home-assistant/) as well. +The camera component allows you to use IP cameras with Home Assistant. + +### {% linkable_title Streaming Video %} + +If your camera supports it, and the [`stream`](/components/stream) component is setup, you will be able to stream your cameras in the frontend and on supported media players. + +This option will keep the stream alive, and preload the feed on Home Assistant startup. This will result in reduced latency when opening the stream in the frontend, as well as when using the `play_stream` service or Google Assistant integration. It does, however, utilize more resources on your machine, so it is recommended to check CPU usage if you plan to use this feature. + +

+ Screenshot showing Preload Stream option in Home Assistant front end. + Example showing the Preload Stream option in the camera dialog. +

+ ### {% linkable_title Services %} @@ -18,6 +32,26 @@ Once loaded, the `camera` platform will expose services that can be called to pe Available services: `turn_on`, `turn_off`, `enable_motion_detection`, `disable_motion_detection`, `snapshot`, and `play_stream`. +#### {% linkable_title Service `play_stream` %} + +Play a live stream from a camera to selected media player(s). Requires [`stream`](/components/stream) component to be set up. + +| Service data attribute | Optional | Description | +| ---------------------- | -------- | ----------- | +| `entity_id` | no | Name of entity to fetch stream from, e.g., `camera.living_room_camera`. | +| `media_player` | no | Name of media player to play stream on, e.g., `media_player.living_room_tv`. | +| `format` | yes | Stream format supported by `stream` component and selected `media_player`. Default: `hls` | + +For example, the following action in an automation would send an `hls` live stream to your chromecast. + +```yaml +action: + service: camera.play_stream + data: + entity_id: camera.yourcamera + media_player: media_player.chromecast +``` + #### {% linkable_title Service `turn_on` %} Turn on camera. Not all camera models support this service, please consult individual camera page. @@ -100,26 +134,6 @@ action: ``` {% endraw %} -#### {% linkable_title Service `play_stream` %} - -Play a live stream from a camera to selected media player(s). Requires [`stream`](/components/stream) component to be set up. - -| Service data attribute | Optional | Description | -| ---------------------- | -------- | ----------- | -| `entity_id` | no | Name of entity to fetch stream from, e.g., `camera.living_room_camera`. | -| `media_player` | no | Name of media player to play stream on, e.g., `media_player.living_room_tv`. | -| `format` | yes | Stream format supported by `stream` component and selected `media_player`. Default: `hls` | - -For example, the following action in an automation would send an `hls` live stream to your chromecast. - -```yaml -action: - service: camera.play_stream - data: - entity_id: camera.yourcamera - media_player: media_player.chromecast -``` - ### {% linkable_title Test if it works %} A simple way to test if you have set up your `camera` platform correctly, is to use service developer tool icon **Services** from the **Developer Tools**. Choose your service from the dropdown menu **Service**, enter something like the sample below into the **Service Data** field, and hit **CALL SERVICE**. @@ -128,13 +142,4 @@ A simple way to test if you have set up your `camera` platform correctly, is to { "entity_id": "camera.living_room_camera" } -``` - -### {% linkable_title Preload Stream %} - -If your camera supports it, and the [`stream`](/components/stream) component is setup, You will notice a "Preload Stream" option in the top right of the dialog when clicking to view the camera stream. This option will keep the stream alive, and preload the feed on Home Assistant startup. This will result in reduced latency when opening the stream in the frontend, as well as when using the `play_stream` service or Google Assistant integration. It does, however, utilize more resources on your machine, so it is recommended to check CPU usage if you plan to use this feature. - -

- Screenshot showing Preload Stream option in Home Assistant front end. - Example showing the Preload Stream option in the camera dialog. -

\ No newline at end of file +``` \ No newline at end of file diff --git a/source/_components/climate.markdown b/source/_components/climate.markdown index 86b2d5e7ce9..40796752f8a 100644 --- a/source/_components/climate.markdown +++ b/source/_components/climate.markdown @@ -7,19 +7,12 @@ sidebar: true comments: false sharing: true footer: true +ha_category: + - Climate ha_release: 0.19 --- - The `climate` component is built for the controlling and monitoring of HVAC (heating, ventilating, and air conditioning) and thermostat devices. - -To enable this component, pick one of the platforms, and add it to your `configuration.yaml`: - -```yaml -# Example configuration.yaml entry -climate: - platform: demo -``` ## {% linkable_title Services %} @@ -238,13 +231,3 @@ Turn climate device off | Service data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that point at `entity_id`'s of climate devices to control. Targets all when omitted. - -#### {% linkable_title Customization %} - -The step for the setpoint can be adjusted (default to 0,5 increments) by adding the following line into configuration - -```yaml -customize: - - entity_id - target_temp_step: 1 -``` diff --git a/source/_components/cover.markdown b/source/_components/cover.markdown index 34674ff60dc..b0842663293 100644 --- a/source/_components/cover.markdown +++ b/source/_components/cover.markdown @@ -7,33 +7,13 @@ sidebar: true comments: false sharing: true footer: true +ha_category: + - Cover ha_release: 0.27 --- Home Assistant can give you an interface to control covers such as rollershutters, blinds, and garage doors. -The display style of each entity can be modified in the [customize section](/getting-started/customizing-devices/). Besides the basic ones like `friendly_name` or `hidden`, the following attributes are supported for covers: - -| Attribute | Default | Description | -| --------- | ------- | ----------- | -| `device_class` | | see below -| `assumed_state` | `false` | If set to `true`, cover buttons will always be enabled - -### {% linkable_title Device Class %} - -The way these sensors are displayed in the frontend can be modified in the [customize section](/docs/configuration/customizing-devices/). The following device classes are supported for covers: - -- **None**: Generic cover. This is the default and doesn't need to be set. -- **awning**: Control of an awning, such as an exterior retractable window, door, or patio cover. -- **blind**: Control of blinds, which are linked slats that expand or collapse to cover an opening or may be tilted to partially covering an opening, such as window blinds. -- **curtain**: Control of curtains or drapes, which is often fabric hung above a window or door that can be drawn open. -- **damper**: Control of a mechanical damper that reduces airflow, sound, or light. -- **door**: Control of a door or gate that provides access to an area. -- **garage**: Control of a garage door that provides access to a garage. -- **shade**: Control of shades, which are a continuous plane of material or connected cells that expanded or collapsed over an opening, such as window shades. -- **shutter**: Control of shutters, which are linked slats that swing out/in to covering an opening or may be tilted to partially cover an opening, such as indoor or exterior window shutters. -- **window**: Control of a physical window that opens and closes or may tilt. - ## {% linkable_title Services %} ### {% linkable_title Cover control services %} diff --git a/source/_components/device_tracker.markdown b/source/_components/device_tracker.markdown index d4f699982b4..c2b958a1db2 100644 --- a/source/_components/device_tracker.markdown +++ b/source/_components/device_tracker.markdown @@ -7,14 +7,12 @@ sidebar: true comments: false sharing: true footer: true +ha_category: + - Presence Detection ha_release: 0.7 --- -Home Assistant can get information from your wireless router or third party services like iCloud or OwnTracks to track which devices are connected and considered "in home". Please check the sidebar for a list of brands of supported wireless routers and services. - -There are also trackers available which use different technologies like [MQTT](/components/mqtt/) or [Nmap](/components/nmap_tracker/) to scan the network for devices. - -An [event](/getting-started/automation-trigger/#event-trigger) (`device_tracker_new_device`) will be fired when a device is discovered for the first time. +The device tracker allows you to track devices in Home Assistant. This can happen by querying your wireless router or by having applications push location info. ## {% linkable_title Configuring a `device_tracker` platform %} @@ -24,8 +22,8 @@ To get started add the following lines to your `configuration.yaml` (example for # Example configuration.yaml entry for Netgear device device_tracker: - platform: netgear - host: 192.168.1.1 - username: admin + host: IP_ADDRESS + username: YOUR_USERNAME password: YOUR_PASSWORD new_device_defaults: track_new_devices: true @@ -54,8 +52,8 @@ The extended example from above would look like the following sample: # Example configuration.yaml entry for Netgear device device_tracker: - platform: netgear - host: 192.168.1.1 - username: admin + host: IP_ADDRESS + username: YOUR_USERNAME interval_seconds: 10 consider_home: 180 new_device_defaults: @@ -94,24 +92,6 @@ devicename: | `hide_if_away` | false | If `yes`/`on`/`true` then the device will be hidden if it is not at home. | | `consider_home` | [uses platform setting] | Seconds to wait till marking someone as not home after not being seen. Allows you to override the global `consider_home` setting from the platform configuration on a per device level. | -## {% linkable_title Using GPS device trackers with local network device trackers %} - -GPS based device trackers (like [OwnTracks](/components/owntracks/), [GPSLogger](/components/gpslogger) and others) can also be used with local network device trackers, such as [Nmap](/components/nmap_tracker/) or [Netgear](/components/netgear/). To do this, fill in the `mac` field to the entry in `known_devices.yaml` with the MAC address of the device you want to track. This way the state of the device will be determined by *the source that reported last*. The naming convention for known device list is `_` and could be set in the app configuration. - -An example showing the inclusion of the `mac` field for multiple platform tracking. The `mac` field was added to the GPS based device tracker entry and will enable tracking by all platforms that track via the `mac` address. - -```yaml -USERNAME_DEVICE_ID: - name: Friendly Name - mac: EA:AA:55:E7:C6:94 - picture: https://www.home-assistant.io/images/favicon-192x192.png - gravatar: test@example.com - track: true - hide_if_away: false -``` - -If you want to track whether either your GPS based tracker or your local network tracker, identify you as being at home, use [a group](/components/group/) instead. - ## {% linkable_title Device states %} The state of your tracked device will be `'home'` if it is in the [home zone](/components/zone#home-zone), detected by your network or Bluetooth based presence detection. If you're using a presence detection method that includes coordinates then when it's in a zone the state will be the name of the zone (case sensitive). When a device isn't at home and isn't in any zone, the state will be `'not_home'`. diff --git a/source/_components/fan.markdown b/source/_components/fan.markdown index 4b306d1ef68..fcb577171d7 100644 --- a/source/_components/fan.markdown +++ b/source/_components/fan.markdown @@ -7,17 +7,9 @@ sidebar: true comments: false sharing: true footer: true +ha_category: + - Fan ha_release: 0.27 --- - -The `fan` component is built for the controlling of fan devices. It can be called the little brother of the [climate](/components/climate/) component. - -To enable this component, pick one of the platforms, and add it to your `configuration.yaml`: - -```yaml -# Example configuration.yaml entry -climate: - platform: fan -``` - +The `fan` component is built for the controlling of fan devices. diff --git a/source/_components/light.markdown b/source/_components/light.markdown index 45c0bd022b9..a1fd6ec5f51 100644 --- a/source/_components/light.markdown +++ b/source/_components/light.markdown @@ -7,14 +7,12 @@ sidebar: true comments: false sharing: true footer: true +ha_category: + - Light ha_release: pre 0.7 --- -This component allows you to track and control various light bulbs. Read the platform documentation for your particular light hardware to learn how to enable it. - -

-The light component supports multiple entries in configuration.yaml by appending a sequential number to the section: light 2:, light 3: etc. -

+This component allows you to track and control various light bulbs. Read the integration documentation for your particular light hardware to learn how to enable it. ### {% linkable_title Default turn-on values %} @@ -26,7 +24,7 @@ The `.default` suffix should be added to the entity identifier of each light to Turns one light on or multiple lights on using [groups]({{site_root}}/components/group/). -Most lights do not support all attributes. You can check the platform documentation of your particular light for hints, but in general, you will have to try things out and see what works. +Most lights do not support all attributes. You can check the integration documentation of your particular light for hints, but in general, you will have to try things out and see what works. | Service data attribute | Optional | Description | | ---------------------- | -------- | ----------- | diff --git a/source/_components/lock.markdown b/source/_components/lock.markdown index f57fa53b0bb..17066c9fddd 100644 --- a/source/_components/lock.markdown +++ b/source/_components/lock.markdown @@ -7,6 +7,8 @@ sidebar: true comments: false sharing: true footer: true +ha_category: + - Lock ha_release: 0.9 --- diff --git a/source/_components/media_player.markdown b/source/_components/media_player.markdown index 5bfb1c3fd08..f00ec9b13b7 100644 --- a/source/_components/media_player.markdown +++ b/source/_components/media_player.markdown @@ -7,10 +7,12 @@ sidebar: true comments: false sharing: true footer: true +ha_category: + - Media Player ha_release: 0.7 --- -Interacts with media players on your network. Please check the right sidebar for a full list of supported devices. +Interacts with media players on your network. ## {% linkable_title Services %} diff --git a/source/_components/notify.markdown b/source/_components/notify.markdown index bab55206cc5..444c59c441e 100644 --- a/source/_components/notify.markdown +++ b/source/_components/notify.markdown @@ -7,6 +7,8 @@ sidebar: true comments: false sharing: true footer: true +ha_category: + - Notifications ha_release: 0.7 --- @@ -14,19 +16,7 @@ The `notify` component makes it possible to send notifications to a wide variety If you want to send notifications to the Home Assistant Web Interface you may use the [Persistent Notification Component](/components/persistent_notification/). -## {% linkable_title Configuration %} - -```yaml -# Example configuration.yaml entry -notify: - - platform: pushbullet - name: NOTIFY_NAME - api_key: YOUR_API_KEY -``` - -The **name** parameter is optional but needed if you want to use multiple platforms. The platform will be exposed as service `notify.`. The name will default to `notify` if not supplied. - -### {% linkable_title Service %} +## {% linkable_title Service %} Once loaded, the `notify` platform will expose a service that can be called to send notifications. diff --git a/source/_components/sensor.markdown b/source/_components/sensor.markdown index 3e021d1d06a..5d7613f0834 100644 --- a/source/_components/sensor.markdown +++ b/source/_components/sensor.markdown @@ -7,28 +7,15 @@ sidebar: true comments: false sharing: true footer: true +ha_category: + - Sensor ha_release: 0.7 --- Sensors are gathering information about states and conditions. -Home Assistant currently supports a wide range of sensors. They are able to display information which are provides by Home Assistant directly, are gathered from web services, and, of course, physical devices. Please check the sidebar for a full list of supported sensor platforms. - -## {% linkable_title Device Class %} - -The way these sensors are displayed in the frontend can be modified in the [customize section](/docs/configuration/customizing-devices/). The following device classes are supported for sensors: - -- **None**: Generic sensor. This is the default and doesn't need to be set. -- **battery**: Percentage of battery that is left. -- **humidity**: Percentage of humidity in the air. -- **illuminance**: The current light level in lx or lm. -- **signal_strength**: Signal strength in dB or dBm. -- **temperature**: Temperature in °C or °F. -- **power**: Power in W or kW. -- **pressure**: Pressure in hPa or mbar. -- **timestamp**: Datetime object or timestamp string. +Home Assistant currently supports a wide range of sensors. They are able to display information which are provides by Home Assistant directly, are gathered from web services, and, of course, physical devices.

-Example of various device class icons for sensors.

diff --git a/source/_components/switch.markdown b/source/_components/switch.markdown index 097a394df9b..f8996d801ed 100644 --- a/source/_components/switch.markdown +++ b/source/_components/switch.markdown @@ -7,6 +7,8 @@ sidebar: true comments: false sharing: true footer: true +ha_category: + - Switch ha_release: 0.7 --- From 7fca29f878fb6b38381283bca3b4e0c53aeac81b Mon Sep 17 00:00:00 2001 From: Colin Frei Date: Sat, 1 Jun 2019 10:01:55 +0200 Subject: [PATCH 026/123] Clarify that the free tier is limited (#9542) * Clarify that the free tier is limited * :pencil2: Tweak --- source/_components/pushbullet.markdown | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/source/_components/pushbullet.markdown b/source/_components/pushbullet.markdown index ecab9b1caca..98f67c88305 100644 --- a/source/_components/pushbullet.markdown +++ b/source/_components/pushbullet.markdown @@ -23,6 +23,10 @@ There is currently support for the following device types within Home Assistant: - [Sensor](#sensor) - [Notifications](#notifications) +

+The free tier is [limited](https://docs.pushbullet.com/#push-limit) to 500 pushes per month. +

+ ### {% linkable_title Sensor %} The `pushbullet` sensor platform reads messages from [Pushbullet](https://www.pushbullet.com/), a free service to send information between your phones, browsers, and friends. This sensor platform provides sensors that show the properties of the latest received Pushbullet notification mirror. @@ -83,7 +87,7 @@ All properties will be displayed as attributes. The properties array are just fo ## {% linkable_title Notifications %} -The `pushbullet` notification platform sends messages to [Pushbullet](https://www.pushbullet.com/), a free service to send information between your phones, browsers, and friends. +The `pushbullet` notification platform sends messages to [Pushbullet](https://www.pushbullet.com/), a free service to send information between your phones, browsers, and friends. The free tier is [limited](https://docs.pushbullet.com/#push-limit) to 500 pushes per month. To enable Pushbullet notifications in your installation, add the following to your `configuration.yaml` file: @@ -191,4 +195,4 @@ action:

Don't forget to [whitelist external directories](/docs/configuration/basic/), so Home Assistant has access to them. -

\ No newline at end of file +

From b0e07fab9812e52725e6c0da30e5ec2fc572530d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A5rten=20Seiplax?= Date: Sat, 1 Jun 2019 21:04:29 +0300 Subject: [PATCH 027/123] Fix 404 link for react example (#9546) The link for the react example returns a 404 Seems it has been moved to https://github.com/home-assistant/custom-panel-starter-kit-react Updated the link description for better accessibility (when used with text-to-speech software used by visually impaired users). --- source/_cookbook/custom_panel_using_react.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_cookbook/custom_panel_using_react.markdown b/source/_cookbook/custom_panel_using_react.markdown index e526487b0c5..f63db13c591 100644 --- a/source/_cookbook/custom_panel_using_react.markdown +++ b/source/_cookbook/custom_panel_using_react.markdown @@ -18,7 +18,7 @@ This is a [React](https://facebook.github.io/react/) implementation of [TodoMVC] - It uses the user configuration for the component in the `configuration.yaml` file for rendering. - It allows toggling the sidebar. -Download the source [here](https://github.com/home-assistant/example-custom-config/blob/master/panels/react.html). Copy the file to `/panels/` (you might have to create the directory if it doesn't exist). +[Download the source for React Starter Kit here](https://github.com/home-assistant/custom-panel-starter-kit-react). Copy the file to `/panels/` (you might have to create the directory if it doesn't exist). Create an entry for the panel in your `configuration.yaml` file to enable it. From 11497d8d82141dbf19e25dae77f32453168f9b53 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Sat, 1 Jun 2019 21:37:40 +0200 Subject: [PATCH 028/123] :hammer: Add logo and quality scale (#9543) --- source/_components/alarm_control_panel.markdown | 2 ++ source/_components/binary_sensor.markdown | 2 ++ source/_components/camera.markdown | 2 ++ source/_components/climate.markdown | 2 ++ source/_components/cover.markdown | 2 ++ source/_components/device_tracker.markdown | 2 ++ source/_components/fan.markdown | 2 ++ source/_components/light.markdown | 2 ++ source/_components/lock.markdown | 2 ++ source/_components/media_player.markdown | 2 ++ source/_components/notify.markdown | 2 ++ source/_components/sensor.markdown | 2 ++ source/_components/switch.markdown | 2 ++ 13 files changed, 26 insertions(+) diff --git a/source/_components/alarm_control_panel.markdown b/source/_components/alarm_control_panel.markdown index 12df0d474a5..3c39b71b480 100644 --- a/source/_components/alarm_control_panel.markdown +++ b/source/_components/alarm_control_panel.markdown @@ -7,8 +7,10 @@ sidebar: true comments: false sharing: true footer: true +logo: home-assistant.png ha_category: - Alarm +ha_qa_scale: internal ha_release: 0.7.3 --- diff --git a/source/_components/binary_sensor.markdown b/source/_components/binary_sensor.markdown index f8e61cbd429..6206478e09c 100644 --- a/source/_components/binary_sensor.markdown +++ b/source/_components/binary_sensor.markdown @@ -7,8 +7,10 @@ sidebar: true comments: false sharing: true footer: true +logo: home-assistant.png ha_category: - Binary Sensor +ha_qa_scale: internal ha_release: 0.9 --- diff --git a/source/_components/camera.markdown b/source/_components/camera.markdown index 706ce094b9b..a8a4b967042 100644 --- a/source/_components/camera.markdown +++ b/source/_components/camera.markdown @@ -7,8 +7,10 @@ sidebar: true comments: false sharing: true footer: true +logo: home-assistant.png ha_category: - Camera +ha_qa_scale: internal ha_release: 0.7 --- diff --git a/source/_components/climate.markdown b/source/_components/climate.markdown index 40796752f8a..131d13309b4 100644 --- a/source/_components/climate.markdown +++ b/source/_components/climate.markdown @@ -7,8 +7,10 @@ sidebar: true comments: false sharing: true footer: true +logo: home-assistant.png ha_category: - Climate +ha_qa_scale: internal ha_release: 0.19 --- diff --git a/source/_components/cover.markdown b/source/_components/cover.markdown index b0842663293..81b753f4314 100644 --- a/source/_components/cover.markdown +++ b/source/_components/cover.markdown @@ -7,8 +7,10 @@ sidebar: true comments: false sharing: true footer: true +logo: home-assistant.png ha_category: - Cover +ha_qa_scale: internal ha_release: 0.27 --- diff --git a/source/_components/device_tracker.markdown b/source/_components/device_tracker.markdown index c2b958a1db2..c6b6292ef28 100644 --- a/source/_components/device_tracker.markdown +++ b/source/_components/device_tracker.markdown @@ -7,8 +7,10 @@ sidebar: true comments: false sharing: true footer: true +logo: home-assistant.png ha_category: - Presence Detection +ha_qa_scale: internal ha_release: 0.7 --- diff --git a/source/_components/fan.markdown b/source/_components/fan.markdown index fcb577171d7..37631338b93 100644 --- a/source/_components/fan.markdown +++ b/source/_components/fan.markdown @@ -7,8 +7,10 @@ sidebar: true comments: false sharing: true footer: true +logo: home-assistant.png ha_category: - Fan +ha_qa_scale: internal ha_release: 0.27 --- diff --git a/source/_components/light.markdown b/source/_components/light.markdown index a1fd6ec5f51..cc0563c73c6 100644 --- a/source/_components/light.markdown +++ b/source/_components/light.markdown @@ -7,8 +7,10 @@ sidebar: true comments: false sharing: true footer: true +logo: home-assistant.png ha_category: - Light +ha_qa_scale: internal ha_release: pre 0.7 --- diff --git a/source/_components/lock.markdown b/source/_components/lock.markdown index 17066c9fddd..065cf915907 100644 --- a/source/_components/lock.markdown +++ b/source/_components/lock.markdown @@ -7,8 +7,10 @@ sidebar: true comments: false sharing: true footer: true +logo: home-assistant.png ha_category: - Lock +ha_qa_scale: internal ha_release: 0.9 --- diff --git a/source/_components/media_player.markdown b/source/_components/media_player.markdown index f00ec9b13b7..7a0bbe6d858 100644 --- a/source/_components/media_player.markdown +++ b/source/_components/media_player.markdown @@ -7,8 +7,10 @@ sidebar: true comments: false sharing: true footer: true +logo: home-assistant.png ha_category: - Media Player +ha_qa_scale: internal ha_release: 0.7 --- diff --git a/source/_components/notify.markdown b/source/_components/notify.markdown index 444c59c441e..87df0e81f63 100644 --- a/source/_components/notify.markdown +++ b/source/_components/notify.markdown @@ -7,8 +7,10 @@ sidebar: true comments: false sharing: true footer: true +logo: home-assistant.png ha_category: - Notifications +ha_qa_scale: internal ha_release: 0.7 --- diff --git a/source/_components/sensor.markdown b/source/_components/sensor.markdown index 5d7613f0834..d28f8a51528 100644 --- a/source/_components/sensor.markdown +++ b/source/_components/sensor.markdown @@ -7,8 +7,10 @@ sidebar: true comments: false sharing: true footer: true +logo: home-assistant.png ha_category: - Sensor +ha_qa_scale: internal ha_release: 0.7 --- diff --git a/source/_components/switch.markdown b/source/_components/switch.markdown index f8996d801ed..acf851afdf6 100644 --- a/source/_components/switch.markdown +++ b/source/_components/switch.markdown @@ -7,8 +7,10 @@ sidebar: true comments: false sharing: true footer: true +logo: home-assistant.png ha_category: - Switch +ha_qa_scale: internal ha_release: 0.7 --- From b346a03336258021fabf96b501b904ecb8ec15fc Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Sun, 2 Jun 2019 22:36:08 +0200 Subject: [PATCH 029/123] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Fix=20broken=20lin?= =?UTF-8?q?k=20in=20configurator=20component=20(#9553)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/_components/configurator.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_components/configurator.markdown b/source/_components/configurator.markdown index bb862023a4c..1778daa4ee7 100644 --- a/source/_components/configurator.markdown +++ b/source/_components/configurator.markdown @@ -24,6 +24,6 @@ The configurator component allows components to request information from the use - Input fields can be defined with a description, and optional type - It will trigger a callback when the button is pressed -The Hue component in [the demo](/demo) and Plex are implemented using the configurator. See [the source of the demo component](https://github.com/home-assistant/home-assistant/blob/master/homeassistant/components/demo.py#L132) for a simple example. +The Hue component in [the demo](/demo) and Plex are implemented using the configurator. See [the source of the demo component](https://github.com/home-assistant/home-assistant/tree/dev/homeassistant/components/demo) for a simple example. -See [the source](https://github.com/home-assistant/home-assistant/blob/master/homeassistant/components/configurator.py#L39) for more details on how to use the configurator component. +See [the source](https://github.com/home-assistant/home-assistant/tree/dev/homeassistant/components/configurator) for more details on how to use the configurator component. From 7aad455bbf60d0d976bfcb71a38454b6d9d175c9 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Mon, 3 Jun 2019 20:16:01 +0200 Subject: [PATCH 030/123] =?UTF-8?q?=F0=9F=94=A8=20Change=20the=20device=20?= =?UTF-8?q?class=20description=20(#9544)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * :hammer: Change URLs to device classes on dev page * :hammer: The other url's * :pencil2: Improve the description * :hammer: Revert the suggested urls --- source/_components/ads.markdown | 4 ++-- source/_components/binary_sensor.knx.markdown | 2 +- source/_components/binary_sensor.mqtt.markdown | 2 +- source/_components/binary_sensor.rest.markdown | 4 +--- source/_components/binary_sensor.rflink.markdown | 2 +- source/_components/binary_sensor.rfxtrx.markdown | 2 +- source/_components/binary_sensor.template.markdown | 2 +- source/_components/command_line.markdown | 3 ++- source/_components/cover.mqtt.markdown | 2 +- source/_components/cover.template.markdown | 2 +- source/_components/enocean.markdown | 4 ++-- source/_components/raspihats.markdown | 2 +- source/_components/rest.markdown | 4 +--- source/_components/trend.markdown | 4 +--- source/_components/w800rf32.markdown | 2 +- 15 files changed, 18 insertions(+), 23 deletions(-) diff --git a/source/_components/ads.markdown b/source/_components/ads.markdown index 2c285b2ebbc..96adb3de43d 100644 --- a/source/_components/ads.markdown +++ b/source/_components/ads.markdown @@ -102,7 +102,7 @@ name: required: false type: string device_class: - description: The [type/class](/components/binary_sensor/) of the sensor to set the icon in the frontend. + description: Sets the [class of the device](/components/binary_sensor/), changing the device state and icon that is displayed on the frontend. required: false type: string {% endconfiguration %} @@ -250,6 +250,6 @@ name: type: string device_class: required: false - description: Sets the class of the device, changing the device state and icon that is displayed on the UI (awning, blind, curtain, damper, door, garage, shade, shutter, window) + description: Sets the [class of the device](/components/cover/), changing the device state and icon that is displayed on the frontend. type: device_class {% endconfiguration %} diff --git a/source/_components/binary_sensor.knx.markdown b/source/_components/binary_sensor.knx.markdown index f144ff47952..c0351d17788 100644 --- a/source/_components/binary_sensor.knx.markdown +++ b/source/_components/binary_sensor.knx.markdown @@ -37,7 +37,7 @@ name: required: false type: string device_class: - description: HASS device class e.g., "motion". + description: Sets the [class of the device](/components/binary_sensor/), changing the device state and icon that is displayed on the frontend. required: false type: string significant_bit: diff --git a/source/_components/binary_sensor.mqtt.markdown b/source/_components/binary_sensor.mqtt.markdown index 7cccd22aa10..3aec89fc491 100644 --- a/source/_components/binary_sensor.mqtt.markdown +++ b/source/_components/binary_sensor.mqtt.markdown @@ -87,7 +87,7 @@ unique_id: required: false type: string device_class: - description: The [type/class](/components/binary_sensor/) of the sensor to set the icon in the frontend. + description: Sets the [class of the device](/components/binary_sensor/), changing the device state and icon that is displayed on the frontend. required: false type: string value_template: diff --git a/source/_components/binary_sensor.rest.markdown b/source/_components/binary_sensor.rest.markdown index 46ece211e90..b35c6ba008a 100644 --- a/source/_components/binary_sensor.rest.markdown +++ b/source/_components/binary_sensor.rest.markdown @@ -73,9 +73,7 @@ name: type: string default: REST Binary Sensor device_class: - description: > - The [type/class](/components/binary_sensor/) of - the sensor to set the icon in the frontend. + description: Sets the [class of the device](/components/binary_sensor/), changing the device state and icon that is displayed on the frontend. required: false type: string value_template: diff --git a/source/_components/binary_sensor.rflink.markdown b/source/_components/binary_sensor.rflink.markdown index bfc0979f0a8..11426bff5e6 100644 --- a/source/_components/binary_sensor.rflink.markdown +++ b/source/_components/binary_sensor.rflink.markdown @@ -55,7 +55,7 @@ devices: required: false type: list device_class: - description: The [type or class of the sensor](/components/binary_sensor/#device-class) to set the icon in the frontend. + description: Sets the [class of the device](/components/binary_sensor/), changing the device state and icon that is displayed on the frontend. required: false type: string off_delay: diff --git a/source/_components/binary_sensor.rfxtrx.markdown b/source/_components/binary_sensor.rfxtrx.markdown index 571af036e8d..1049752bb7c 100644 --- a/source/_components/binary_sensor.rfxtrx.markdown +++ b/source/_components/binary_sensor.rfxtrx.markdown @@ -63,7 +63,7 @@ devices: required: false type: string device_class: - description: "The [type or class of the sensor](/components/binary_sensor/) to set the icon in the frontend." + description: Sets the [class of the device](/components/binary_sensor/), changing the device state and icon that is displayed on the frontend. required: false type: device_class fire_event: diff --git a/source/_components/binary_sensor.template.markdown b/source/_components/binary_sensor.template.markdown index 71cb01894b7..521757fbb1e 100644 --- a/source/_components/binary_sensor.template.markdown +++ b/source/_components/binary_sensor.template.markdown @@ -56,7 +56,7 @@ sensors: required: false type: string, list device_class: - description: The type/class of the sensor to set the icon in the frontend. + description: Sets the [class of the device](/components/binary_sensor/), changing the device state and icon that is displayed on the frontend. required: false type: device_class default: None diff --git a/source/_components/command_line.markdown b/source/_components/command_line.markdown index 3fe4193a592..76fd3b8e9c4 100644 --- a/source/_components/command_line.markdown +++ b/source/_components/command_line.markdown @@ -31,6 +31,7 @@ binary_sensor:

It's highly recommended to enclose the command in single quotes `'` as it ensures all characters can be used in the command and reduces the risk of unintentional escaping. To include a single quote in a command enclosed in single quotes, double it: `''`.

+ {% configuration %} command: description: The action to take to get the value. @@ -42,7 +43,7 @@ name: type: string default: "*name* from the device" device_class: - description: The [type/class](/components/binary_sensor/) of the sensor to set the icon in the frontend. + description: Sets the [class of the device](/components/binary_sensor/), changing the device state and icon that is displayed on the frontend. required: false type: string payload_on: diff --git a/source/_components/cover.mqtt.markdown b/source/_components/cover.mqtt.markdown index acf37e99e42..45454e6eae9 100644 --- a/source/_components/cover.mqtt.markdown +++ b/source/_components/cover.mqtt.markdown @@ -175,7 +175,7 @@ tilt_invert_state: type: boolean default: false device_class: - description: The [type/class](/components/cover/#device-class) of the cover to set the icon in the frontend. + description: Sets the [class of the device](/components/cover/), changing the device state and icon that is displayed on the frontend. required: false type: string json_attributes_topic: diff --git a/source/_components/cover.template.markdown b/source/_components/cover.template.markdown index e4813769784..5f1188e5493 100644 --- a/source/_components/cover.template.markdown +++ b/source/_components/cover.template.markdown @@ -69,7 +69,7 @@ cover: required: false type: template device_class: - description: The [type/class](/components/cover/#device-class) of the cover to set the icon in the frontend. + description: Sets the [class of the device](/components/cover/), changing the device state and icon that is displayed on the frontend. required: false type: string open_cover: diff --git a/source/_components/enocean.markdown b/source/_components/enocean.markdown index 5cbce8bce6b..ada39a33b6e 100644 --- a/source/_components/enocean.markdown +++ b/source/_components/enocean.markdown @@ -102,7 +102,7 @@ name: type: string default: EnOcean binary sensor device_class: - description: The [type/class](/components/binary_sensor/) of the sensor to set the icon in the frontend. + description: Sets the [class of the device](/components/binary_sensor/), changing the device state and icon that is displayed on the frontend. required: false type: device_class {% endconfiguration %} @@ -193,7 +193,7 @@ name: type: string default: EnOcean sensor device_class: - description: The [type/class](/components/binary_sensor/) of the sensor to set the icon in the frontend. + description: Sets the [class of the device](/components/binary_sensor/), changing the device state and icon that is displayed on the frontend. required: false type: device_class default: powersensor diff --git a/source/_components/raspihats.markdown b/source/_components/raspihats.markdown index fc266f4975c..bf229a3eb14 100644 --- a/source/_components/raspihats.markdown +++ b/source/_components/raspihats.markdown @@ -78,7 +78,7 @@ i2c_hats: default: false type: boolean device_class: - description: See device classes in [binary_sensor component](/components/binary_sensor/). + description: Sets the [class of the device](/components/binary_sensor/), changing the device state and icon that is displayed on the frontend. required: false default: "None" type: string diff --git a/source/_components/rest.markdown b/source/_components/rest.markdown index 835a7b98218..5536b035395 100644 --- a/source/_components/rest.markdown +++ b/source/_components/rest.markdown @@ -55,9 +55,7 @@ name: type: string default: REST Sensor device_class: - description: > - The [type/class](/components/sensor/) of - the sensor to set the icon in the frontend. + description: Sets the [class of the device](/components/sensor/), changing the device state and icon that is displayed on the frontend. required: false type: string value_template: diff --git a/source/_components/trend.markdown b/source/_components/trend.markdown index 78c22c87c7b..1d9637e8319 100644 --- a/source/_components/trend.markdown +++ b/source/_components/trend.markdown @@ -54,9 +54,7 @@ sensors: required: false type: string device_class: - description: > - The [type/class](/components/binary_sensor/#device-class) of - the sensor to set the icon in the frontend. + description: Sets the [class of the device](/components/binary_sensor/), changing the device state and icon that is displayed on the frontend. required: false type: string friendly_name: diff --git a/source/_components/w800rf32.markdown b/source/_components/w800rf32.markdown index f2b7cece328..0012c015039 100644 --- a/source/_components/w800rf32.markdown +++ b/source/_components/w800rf32.markdown @@ -68,7 +68,7 @@ devices: required: false type: string device_class: - description: "The [type or class of the sensor](/components/binary_sensor/) to set the icon in the frontend." + description: Sets the [class of the device](/components/binary_sensor/), changing the device state and icon that is displayed on the frontend. required: false type: device_class off_delay: From e599084f8efb3c75e1b0444b05359b5dac9b6de5 Mon Sep 17 00:00:00 2001 From: klaasnicolaas Date: Mon, 3 Jun 2019 20:19:46 +0200 Subject: [PATCH 031/123] :rewind: Put the device classes back --- source/_components/binary_sensor.markdown | 34 ++++++++++++++++++++++- source/_components/cover.markdown | 15 ++++++++++ source/_components/sensor.markdown | 15 ++++++++++ 3 files changed, 63 insertions(+), 1 deletion(-) diff --git a/source/_components/binary_sensor.markdown b/source/_components/binary_sensor.markdown index 6206478e09c..2d83527eed8 100644 --- a/source/_components/binary_sensor.markdown +++ b/source/_components/binary_sensor.markdown @@ -14,8 +14,40 @@ ha_qa_scale: internal ha_release: 0.9 --- -Binary sensors gather information about the state of devices which have a "digital" return value (either 1 or 0). These can be switches, contacts, pins, etc. These sensors only have two states: **0/off/low/closed/false** and **1/on/high/open/true**. Knowing that there are only two states allows Home Assistant to represent these sensors in a better way in the frontend according to their functionality. +Binary sensors gather information about the state of devices which have a "digital" return value (either 1 or 0). These can be switches, contacts, pins, etc. These sensors only have two states: **0/off/low/closed/false** and **1/on/high/open/true**. Knowing that there are only two states allows Home Assistant to represent these sensors in a better way in the frontend according to their functionality. + +### {% linkable_title Device Class %} + +The way these sensors are displayed in the frontend can be modified in the [customize section](/getting-started/customizing-devices/). The following device classes are supported for binary sensors: + +- **None**: Generic on/off. This is the default and doesn't need to be set. +- **battery**: `On` means low, `Off` means normal +- **cold**: `On` means cold, `Off` means normal +- **connectivity**: `On` means connected, `Off` means disconnected +- **door**: `On` means open, `Off` means closed +- **garage_door**: `On` means open, `Off` means closed +- **gas**: `On` means gas detected, `Off` means no gas (clear) +- **heat**: `On` means hot, `Off` means normal +- **light**: `On` means light detected, `Off` means no light +- **lock**: `On` means open (unlocked), `Off` means closed (locked) +- **moisture**: `On` means moisture detected (wet), `Off` means no moisture (dry) +- **motion**: `On` means motion detected, `Off` means no motion (clear) +- **moving**: `On` means moving, `Off` means not moving (stopped) +- **occupancy**: `On` means occupied, `Off` means not occupied (clear) +- **opening**: `On` means open, `Off` means closed +- **plug**: `On` means device is plugged in, `Off` means device is unplugged +- **power**: `On` means power detected, `Off` means no power +- **presence**: `On` means home, `Off` means away +- **problem**: `On` means problem detected, `Off` means no problem (OK) +- **safety**: `On` means unsafe, `Off` means safe +- **smoke**: `On` means smoke detected, `Off` means no smoke (clear) +- **sound**: `On` means sound detected, `Off` means no sound (clear) +- **vibration**: `On` means vibration detected, `Off` means no vibration (clear) +- **window**: `On` means open, `Off` means closed + +For analog sensors please check the [component overview](/components/#sensor).

+Example of various device classes icons in `On` and `Off` state.

diff --git a/source/_components/cover.markdown b/source/_components/cover.markdown index 81b753f4314..90172534114 100644 --- a/source/_components/cover.markdown +++ b/source/_components/cover.markdown @@ -16,6 +16,21 @@ ha_release: 0.27 Home Assistant can give you an interface to control covers such as rollershutters, blinds, and garage doors. +## {% linkable_title Device Class %} + +The way these sensors are displayed in the frontend can be modified in the [customize section](/docs/configuration/customizing-devices/). The following device classes are supported for covers: + +- **None**: Generic cover. This is the default and doesn't need to be set. +- **awning**: Control of an awning, such as an exterior retractable window, door, or patio cover. +- **blind**: Control of blinds, which are linked slats that expand or collapse to cover an opening or may be tilted to partially covering an opening, such as window blinds. +- **curtain**: Control of curtains or drapes, which is often fabric hung above a window or door that can be drawn open. +- **damper**: Control of a mechanical damper that reduces airflow, sound, or light. +- **door**: Control of a door or gate that provides access to an area. +- **garage**: Control of a garage door that provides access to a garage. +- **shade**: Control of shades, which are a continuous plane of material or connected cells that expanded or collapsed over an opening, such as window shades. +- **shutter**: Control of shutters, which are linked slats that swing out/in to covering an opening or may be tilted to partially cover an opening, such as indoor or exterior window shutters. +- **window**: Control of a physical window that opens and closes or may tilt. + ## {% linkable_title Services %} ### {% linkable_title Cover control services %} diff --git a/source/_components/sensor.markdown b/source/_components/sensor.markdown index d28f8a51528..e7b677297c3 100644 --- a/source/_components/sensor.markdown +++ b/source/_components/sensor.markdown @@ -18,6 +18,21 @@ Sensors are gathering information about states and conditions. Home Assistant currently supports a wide range of sensors. They are able to display information which are provides by Home Assistant directly, are gathered from web services, and, of course, physical devices. +## {% linkable_title Device Class %} + +The way these sensors are displayed in the frontend can be modified in the [customize section](/docs/configuration/customizing-devices/). The following device classes are supported for sensors: + +- **None**: Generic sensor. This is the default and doesn't need to be set. +- **battery**: Percentage of battery that is left. +- **humidity**: Percentage of humidity in the air. +- **illuminance**: The current light level in lx or lm. +- **signal_strength**: Signal strength in dB or dBm. +- **temperature**: Temperature in °C or °F. +- **power**: Power in W or kW. +- **pressure**: Pressure in hPa or mbar. +- **timestamp**: Datetime object or timestamp string. +

+Example of various device class icons for sensors.

From b4cae19d564393f5a22ee173727fdf31b62453c7 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 3 Jun 2019 14:03:20 -0700 Subject: [PATCH 032/123] Update blog post 94 --- source/_posts/2019-06-05-release-94.markdown | 50 ++++++++++++++---- .../blog/2019-06-release-94/google-ui.png | Bin 0 -> 81847 bytes 2 files changed, 41 insertions(+), 9 deletions(-) create mode 100644 source/images/blog/2019-06-release-94/google-ui.png diff --git a/source/_posts/2019-06-05-release-94.markdown b/source/_posts/2019-06-05-release-94.markdown index b773f6691e0..8d67dd662e7 100644 --- a/source/_posts/2019-06-05-release-94.markdown +++ b/source/_posts/2019-06-05-release-94.markdown @@ -13,15 +13,47 @@ og_image: /images/blog/2019-06-release-94/components.png -New: - - Possible to store core config in storage. If set in configuration.yaml, it will override storage (this is what anyone coming from 0.93 has). Note that configuration.yaml will no longer contain any automatic detected values when writing initial configuration. This feature is available via the UI during onboarding. Big thanks to [@emontnemery] for this contribution. - - Allow deletion of scripts/automations via the UI editor. - - This is the first release where a user can use a subset of Home Assistant without using configuration.yaml. - - Step added to onboarding to allow configuring name, location, timezone and unit system. - - Python 3.5.3 deprecated, support will be dropped in the first release after August 1. - - Add UI to manage Google Entities exposed via Home Assistant Cloud. To use, remove filters from configuration.yaml. Also allows disabling 2 factor authentication on a per device basis. - - Discovery has been redone. Integrations can now specify how they are discoverable via Zeroconf, SSDP or HomeKit in their manifest, this will be picked up by the zeroconf and ssdp integrations, which are part of the default config. The new discovery is non-obtrusive: nothing is added to your configuration without approval by the user. You can find integrations pending approval in the discovered section of the integrations page in the config. Only a handful of integrations have been migrated to the new approach in this release. Thanks to [@Kane610], [@Jc2k]. If you are not using the `default_config` integration, add `ssdp:` and `zeroconf:` to your configuration.yaml. - - We are bringing the device tracker integration into the age of modern integrations. The first step has been to migrating the platforms that use config entries like OwnTracks and GPSLogger. This means that for these integrations, you will now be able to use things like entity registry to change entity ID and name. +It is time for the 0.94 release and there is some seriously good stuff in this release. We're working hard on polishing everything and getting ready for the big Home Assistant 1.0 release. And we're getting closer. So close actually, that this is the first release that can be installed and configured without touching any `configuration.yaml`! Onboard, configure integrations, manage automations and scripts all from the UI. + + + +This milestone has been achieved thanks to the hard work by [@emontnemery] who contributed the ability to store the core config in storage: name, location, unit system, time zone. We still allow users to store their core configuration in `configuration.yaml`, which will take precedent when defined. This means that it is a non-breaking change. Core config is now set during onboarding and can be edited in the general page of the config panel. + +Another cool new feature is the total revamp of how you manage which entities are exposed to Google Assistant via Home Assistant Cloud. From the cloud UI you can now click "Manage Entities" and you are brought to the Google Assistant entity manager. From here you can enable which entities are exposed and, if you deem appropriate, choose to disable the two factor authentication on your garage door (the asking for a pin). + +

+Screenshot of the new user interface to manage which entities are exposed to Google Assistant. +Screenshot of the new user interface to manage which entities are exposed to Google Assistant. +

+ +## {% linkable_title Discovery %} + +Discovery has been mordernized thanks to [@Kane610] and with the input from [@Jc2k]. Each integration is now able to specify how they can be discovered in their manifest, and the new `zeroconf` and `ssdp` integrations will do the rest. The new discovery is non-obtrusive: no devices are set up without approval by the user. Instead, you will need to approve each discovered integration. You can find them in the discovered section of the integrations page in the config. Only a handful of integrations have been migrated to the new approach in this release. + +The new discovery is now part of the default config. If you are not using the default config, add `ssdp:` and `zeroconf:` to your configuration.yaml. + +## {% linkable_title Deprecating Python 3.5 support %} + +This release has deprecated support for the almost 4 year old version 3.5 of Python. The first release after August 1 will drop support. This is part of our newly adopted [Python support approach](https://github.com/home-assistant/architecture/blob/master/adr/0002-minimum-supported-python-version.md). + +This will only impact you if you are running a custom installation of Home Assistant. This will not impact anyone using Hass.io or Docker. + +## {% linkable_title Modernizing the device tracker %} + +This release also introduces a long overdue overhaul of how the device tracker works. We are introducing this overhaul piece by piece, focusing first on device tracker platforms that push their updates to Home Assistant: mobile app, OwnTracks, GeoFency, GPSLogger and Locative. + +These integrations will no longer use `known_devices.yaml` but instead use entities, like all other integrations in Home Assistant. You can change the name and entity ID via the UI. It is no longer posible to merge the devices with other device tracker entities. This was flaky at best. You should now use the new person integration for this. + +## {% linkable_title Improved hass.io builds %} + +We have been working hard on improving Hass.io builds. A build can now be online in as little as 10 minutes after a new release has been tagged. This is thanks to a new wheel-based infrastructure build by [@pvizeli] with input from [@frenck]. With Python wheels, we will build all the requirements of integrations ahead of time, and only download them to your hass.io installation when you update your Home Assistant version. + +This approach did make us change how packages are installed when running Home Assistant inside a Docker container. It will now install the packages into the Python environment instead of storing them in the `deps` folder inside your config folder. + +**Note:** If you are using Hass.io or a dockerized version of Home Assistant, this release will one time clear the `deps` folder in your config folder. + +[@frenck]: https://github.com/frenck ## {% linkable_title New Integrations %} diff --git a/source/images/blog/2019-06-release-94/google-ui.png b/source/images/blog/2019-06-release-94/google-ui.png new file mode 100644 index 0000000000000000000000000000000000000000..2e2913a34e6249ca0a124aa6c41dc52c45f55741 GIT binary patch literal 81847 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 z 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 Date: Mon, 3 Jun 2019 14:10:36 -0700 Subject: [PATCH 033/123] Add components picture --- .../blog/2019-06-release-94/components.png | Bin 0 -> 23680 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 source/images/blog/2019-06-release-94/components.png diff --git a/source/images/blog/2019-06-release-94/components.png b/source/images/blog/2019-06-release-94/components.png new file mode 100644 index 0000000000000000000000000000000000000000..4ff898436832f62983b8e4b4e63f7c33320d42c5 GIT binary patch literal 23680 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 Date: Mon, 3 Jun 2019 14:12:35 -0700 Subject: [PATCH 034/123] Update ogimage --- source/_posts/2019-06-05-release-94.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/_posts/2019-06-05-release-94.markdown b/source/_posts/2019-06-05-release-94.markdown index 8d67dd662e7..3d856e7f735 100644 --- a/source/_posts/2019-06-05-release-94.markdown +++ b/source/_posts/2019-06-05-release-94.markdown @@ -8,7 +8,7 @@ author: Paulus Schoutsen author_twitter: balloob comments: true categories: Release-Notes -og_image: /images/blog/2019-06-release-94/components.png +og_image: /images/blog/2019-06-release-94/google-ui.png --- @@ -27,6 +27,8 @@ Another cool new feature is the total revamp of how you manage which entities ar Screenshot of the new user interface to manage which entities are exposed to Google Assistant.

+ + ## {% linkable_title Discovery %} Discovery has been mordernized thanks to [@Kane610] and with the input from [@Jc2k]. Each integration is now able to specify how they can be discovered in their manifest, and the new `zeroconf` and `ssdp` integrations will do the rest. The new discovery is non-obtrusive: no devices are set up without approval by the user. Instead, you will need to approve each discovered integration. You can find them in the discovered section of the integrations page in the config. Only a handful of integrations have been migrated to the new approach in this release. @@ -84,8 +86,6 @@ This approach did make us change how packages are installed when running Home As Experiencing issues introduced by this release? Please report them in our [issue tracker](https://github.com/home-assistant/home-assistant/issues). Make sure to fill in all fields of the issue template. - - ## {% linkable_title Breaking Changes %} - Quiet the chatty sun.sun ([@Swamp-Ig] - [#23832]) ([sun docs]) (breaking change) From 215915fcee25fa5dd1bbbf9ffffe6c576002e00d Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 3 Jun 2019 14:27:59 -0700 Subject: [PATCH 035/123] Update text --- source/_posts/2019-06-05-release-94.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_posts/2019-06-05-release-94.markdown b/source/_posts/2019-06-05-release-94.markdown index 3d856e7f735..a1edfde162a 100644 --- a/source/_posts/2019-06-05-release-94.markdown +++ b/source/_posts/2019-06-05-release-94.markdown @@ -49,9 +49,9 @@ These integrations will no longer use `known_devices.yaml` but instead use entit ## {% linkable_title Improved hass.io builds %} -We have been working hard on improving Hass.io builds. A build can now be online in as little as 10 minutes after a new release has been tagged. This is thanks to a new wheel-based infrastructure build by [@pvizeli] with input from [@frenck]. With Python wheels, we will build all the requirements of integrations ahead of time, and only download them to your hass.io installation when you update your Home Assistant version. +We have been working hard on improving Hass.io builds. A build can now be online in as little as 30 minutes after a new release has been tagged. This is thanks to a new wheel-based infrastructure build by [@pvizeli] with input from [@frenck]. With Python wheels, we will build all the requirements of integrations ahead of time, and only download them to your hass.io installation when you update your Home Assistant version. -This approach did make us change how packages are installed when running Home Assistant inside a Docker container. It will now install the packages into the Python environment instead of storing them in the `deps` folder inside your config folder. +We changed how packages are installed when running Home Assistant inside a Docker container. It will now install the packages into the Python environment inside the container, instead of storing them in the `deps` folder inside your config folder which lived outside the container. **Note:** If you are using Hass.io or a dockerized version of Home Assistant, this release will one time clear the `deps` folder in your config folder. From 88d34093ef78c5f60233f088cf8e279213bfa091 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 3 Jun 2019 14:44:38 -0700 Subject: [PATCH 036/123] Update text --- source/_posts/2019-06-05-release-94.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_posts/2019-06-05-release-94.markdown b/source/_posts/2019-06-05-release-94.markdown index a1edfde162a..8150020428a 100644 --- a/source/_posts/2019-06-05-release-94.markdown +++ b/source/_posts/2019-06-05-release-94.markdown @@ -13,7 +13,7 @@ og_image: /images/blog/2019-06-release-94/google-ui.png -It is time for the 0.94 release and there is some seriously good stuff in this release. We're working hard on polishing everything and getting ready for the big Home Assistant 1.0 release. And we're getting closer. So close actually, that this is the first release that can be installed and configured without touching any `configuration.yaml`! Onboard, configure integrations, manage automations and scripts all from the UI. +It is time for the 0.94 release and there is some seriously good stuff in this release. We're working hard on polishing everything and getting ready for the big Home Assistant 1.0 release. And we're getting closer. So close actually, that this is the first release that can be installed and configured without touching a text editor! Onboard, configure integrations, manage automations and scripts all from the UI. From 8239b58bb863d546d69abaa948c54c4a385bb027 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 3 Jun 2019 14:57:12 -0700 Subject: [PATCH 037/123] Add SSDP docs --- source/_components/ssdp.markdown | 26 ++++++++++++++++++++++++++ source/_components/zeroconf.markdown | 7 ++++--- 2 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 source/_components/ssdp.markdown diff --git a/source/_components/ssdp.markdown b/source/_components/ssdp.markdown new file mode 100644 index 00000000000..6d4f18519df --- /dev/null +++ b/source/_components/ssdp.markdown @@ -0,0 +1,26 @@ +--- +layout: page +title: "SSDP" +description: "Discover integrations on the network using the SSDP protocol." +date: 2019-06-02 18:50 +sidebar: true +comments: false +sharing: true +footer: true +ha_category: + - Network +ha_release: 0.94 +--- + +The `ssdp` integration will scan the network for supported devices and services. Discovered integrations will show up in the discovered section on the integrations page in the config panel. + +Integrations can opt-in to be found by adding [an SSDP section](https://developers.home-assistant.io/docs/en/next/creating_integration_manifest.html#ssdp) to their manifest.json. + +## {% linkable_title Configuration %} + +To integrate this into Home Assistant, add the following section to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +ssdp: +``` diff --git a/source/_components/zeroconf.markdown b/source/_components/zeroconf.markdown index b44c5f60f7d..d8773c1f76f 100644 --- a/source/_components/zeroconf.markdown +++ b/source/_components/zeroconf.markdown @@ -7,13 +7,14 @@ sidebar: true comments: false sharing: true footer: true -logo: avahi.png ha_category: - Network ha_release: 0.18 --- -The `zeroconf` component exposes your Home Assistant to the local network using [Zeroconf](https://en.wikipedia.org/wiki/Zero-configuration_networking). Zeroconf is also sometimes known as Bonjour, Rendezvous, and Avahi. +The `zeroconf` integration will scan the network for supported devices and services. Discovered integrations will show up in the discovered section on the integrations page in the config panel. It will also make Home Assistant discoverable for other services in the network. Zeroconf is also sometimes known as Bonjour, Rendezvous, and Avahi. + +Integrations can opt-in to be found by adding either [a Zeroconf section](https://developers.home-assistant.io/docs/en/next/creating_integration_manifest.html#zeroconf) or [a HomeKit section](https://developers.home-assistant.io/docs/en/next/creating_integration_manifest.html#homekit) to their manifest.json. ## {% linkable_title Configuration %} @@ -24,7 +25,7 @@ To integrate this into Home Assistant, add the following section to your `config zeroconf: ``` -The registration will include meta-data about the Home Assistant instance, including a base URL that can be used to access Home Assistant, the currently running Home Assistant version, and whether an API password is needed to access the instance. The examples below show two ways to retrieve the details for testing. +The registration will include meta-data about the Home Assistant instance, including a base URL that can be used to access Home Assistant and the currently running Home Assistant version. The examples below show two ways to retrieve the details for testing. ```bash $ avahi-browse -alr From 505b50226db39658643f444b038ff9d68bfe24d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Rutkai?= Date: Sat, 1 Jun 2019 10:03:42 +0200 Subject: [PATCH 038/123] Adding Watson TTS (IBM Cloud) (#9279) * Adding Watson TTS (IBM Cloud) * Review fixes * :pencil2: Tweak * :pencil2: Tweak After this we can merge it --- source/_components/watson_tts.markdown | 108 ++++++++++++++++++ .../images/screenshots/watson_tts_screen.png | Bin 0 -> 64275 bytes source/images/supported_brands/watson_tts.png | Bin 0 -> 8580 bytes 3 files changed, 108 insertions(+) create mode 100644 source/_components/watson_tts.markdown create mode 100644 source/images/screenshots/watson_tts_screen.png create mode 100644 source/images/supported_brands/watson_tts.png diff --git a/source/_components/watson_tts.markdown b/source/_components/watson_tts.markdown new file mode 100644 index 00000000000..8418d70a9dd --- /dev/null +++ b/source/_components/watson_tts.markdown @@ -0,0 +1,108 @@ +--- +layout: page +title: "Watson TTS" +description: "Instructions on how to setup IBM Watson TTS with Home Assistant." +date: 2019-04-22 12:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: watson_tts.png +ha_category: + - Text-to-speech +ha_release: 0.94 +--- + +The `watson_tts` text-to-speech platform that works with [IBM Watson Cloud](https://www.ibm.com/watson/services/text-to-speech/) to create the spoken output. +Polly is a paid service via IBM Cloud but there is a decent [free tier](https://www.ibm.com/cloud/watson-text-to-speech/pricing) which offers 10000 free characters every month. + +## {% linkable_title Setup %} + +For supported formats and voices please go to [IBM Cloud About section](https://cloud.ibm.com/docs/services/text-to-speech?topic=text-to-speech-about#about). + +To get started please read the [Getting started tutorial](https://cloud.ibm.com/docs/services/text-to-speech?topic=text-to-speech-gettingStarted#gettingStarted). + +## {% linkable_title Configuration %} + +To configure Watson TTS, add the following lines to your `configuration.yaml`: + +```yaml +# Example configuration.yaml entry +tts: + - platform: watson_tts + watson_apikey: YOUR_GENERATED_APIKEY +``` + +You can get these tokens after you generated the credentials on the IBM Cloud console: + +

+ +

+ +{% configuration %} +watson_url: + description: "The endpoint to which the service will connect." + required: false + type: string + default: https://stream.watsonplatform.net/text-to-speech/api +watson_apikey: + description: "Your secret apikey generated on the IBM Cloud admin console." + required: true + type: string +voice: + description: Voice name to be used. + required: false + type: string + default: en-US_AllisonVoice +output_format: + description: "Override the default output format. Supported formats: `audio/flac`, `audio/mp3`, `audio/mpeg`, `audio/ogg`, `audio/ogg;codecs=opus`, `audio/ogg;codecs=vorbis`, `audio/wav`" + required: false + type: string + default: audio/mp3 +{% endconfiguration %} + +## {% linkable_title Usage %} + +Say to all `media_player` device entities: + +```yaml +- service: tts.watson_tts_say + data_template: + message: 'Hello from Watson' +``` + +or + +```yaml +- service: tts.watson_tts_say + data_template: + message: > + + Hello from Watson + +``` + +Say to the `media_player.living_room` device entity: + +```yaml +- service: tts.watson_tts_say + data_template: + entity_id: media_player.living_room + message: > + + Hello from Watson + +``` + +Say with break: + +```yaml +- service: tts.watson_tts_say + data_template: + message: > + + Hello from + + Watson + +``` diff --git a/source/images/screenshots/watson_tts_screen.png b/source/images/screenshots/watson_tts_screen.png new file mode 100644 index 0000000000000000000000000000000000000000..9f551f633af66316ddebce64d77adcc6807c715c GIT binary patch literal 64275 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

T-UQy1x*#}t&owv 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 Sar_a0P5!xx4EULGz<&Xsah(AG literal 0 HcmV?d00001 diff --git a/source/images/supported_brands/watson_tts.png b/source/images/supported_brands/watson_tts.png new file mode 100644 index 0000000000000000000000000000000000000000..91a882537be6ec4d24d59e50914f2f061ca53659 GIT binary patch literal 8580 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 Date: Thu, 30 May 2019 10:37:08 +0200 Subject: [PATCH 039/123] Add Repetier-Server component documentation (#9362) * Updated to newest developer version of Repetier platform * :pencil2: Tweak After this we will merge it * Added Repetier Logo file --- source/_components/repetier.markdown | 111 ++++++++++++++++++++ source/images/supported_brands/repetier.png | Bin 0 -> 27990 bytes 2 files changed, 111 insertions(+) create mode 100644 source/_components/repetier.markdown create mode 100755 source/images/supported_brands/repetier.png diff --git a/source/_components/repetier.markdown b/source/_components/repetier.markdown new file mode 100644 index 00000000000..15654ed411a --- /dev/null +++ b/source/_components/repetier.markdown @@ -0,0 +1,111 @@ +--- +layout: page +title: Repetier-Server Component +description: "Instructions how to add Repetier-Server sensors to Home Assistant." +date: 2019-05-01 +sidebar: true +comments: false +sharing: true +footer: true +logo: repetier.png +ha_category: + - Hub + - Sensor +featured: false +ha_release: 0.94 +ha_iot_class: Local Polling +--- + +[Repetier-Server](https://www.repetier-server.com/) is a 3D printer/CNC server, able to control multiple devices on the same server. +This component handles the main integration to the server. + +There is currently support for the following device types within Home Assistant: + +- Sensor + +## {% linkable_title Configuration %} + +```yaml +repetier: + - host: REPETIER_HOST + api_key: YOUR_API_KEY +``` + +{% configuration %} +repetier: + type: list + required: true + keys: + host: + description: The host IP or hostname of your Repetier-Server. + required: true + type: string + api_key: + description: API-key for the user used to connect to Repetier-Server + required: true + type: string + port: + description: The port used to connect to the host + required: false + type: integer + default: 3344 + sensors: + description: Configuration for the sensors. + required: false + type: map + keys: + monitored_conditions: + description: The sensors to activate. + type: list + default: all + keys: + "current_state": + description: Text of current state. + "extruder_temperature": + description: Temperatures of all available extruders. These will be displayed as `printer_name_extruder_N`. + "bed_temperature": + description: Temperatures of all available heated beds. These will be displayed as `printer_name_bed_N`. + "chamber_temperature": + description: Temperatures of all available heated chambers. These will be displayed as `printer_name_chamber_N`. + "current_job": + description: Returns percentage done of current job in state, and current job information as attributes. + "job_start": + description: Start timestamp of job start. + "job_end": + description: Estimated job end timestamp. +{% endconfiguration %} + +Example with multiple Repetier Servers: + +```yaml +repetier: + - host: REPETIER_HOST + api_key: YOUR_API_KEY + sensors: + monitored_conditions: + - 'current_state' + - 'current_job' + - host: REPETIER_HOST + api_key: YOUR_API_KEY + port: 3344 +``` + +If the Repetier-Server host is equipped with a web camera it is possible to add this as well. + +```yaml +camera: + - platform: mjpeg + name: Repetier + still_image_url: http://YOUR_REPETIER_HOST_IP:8080/?action=snapshot + mjpeg_url: http://YOUR_REPETIER_HOST_IP:8080/?action=stream +``` + +### {% linkable_title Retrieve API-key %} + +To generate the needed API-key do the following: + +* Go to your Repetier Server web-console +* Push the settings icon (the gear icon) +* Select User Profiles. +* Create a new user, deselect all options and click Create User. +* Edit the newly created user and take note of the API-key for this user, that's the one to use in the Home Assistant Settings diff --git a/source/images/supported_brands/repetier.png b/source/images/supported_brands/repetier.png new file mode 100755 index 0000000000000000000000000000000000000000..7cbba43ad45cdc70bc56f6c84f95c0013b2b45a2 GIT binary patch literal 27990 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 literal 0 HcmV?d00001 From d3ce0835f6453a8baf07d816c9038e568438ea37 Mon Sep 17 00:00:00 2001 From: Eduard van Valkenburg Date: Sat, 1 Jun 2019 10:05:17 +0200 Subject: [PATCH 040/123] Created the Azure EH docs (#9462) * Created the Azure EH docs * Update release version Co-Authored-By: Klaas Schoute * :pencil2: Tweak After this we can merge it --- source/_components/azure_event_hub.markdown | 103 ++++++++++++++++++ .../supported_brands/azure_event_hub.svg | 22 ++++ 2 files changed, 125 insertions(+) create mode 100644 source/_components/azure_event_hub.markdown create mode 100644 source/images/supported_brands/azure_event_hub.svg diff --git a/source/_components/azure_event_hub.markdown b/source/_components/azure_event_hub.markdown new file mode 100644 index 00000000000..63c0219676e --- /dev/null +++ b/source/_components/azure_event_hub.markdown @@ -0,0 +1,103 @@ +--- +layout: page +title: "Azure Event Hub" +description: "Setup for Azure Event Hub integration" +date: 2019-05-15 08:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: azure_event_hub.svg +ha_category: + - History +ha_release: 0.94 +--- + +The `Azure Event Hub` component allows you to hook into the Home Assistant event bus and send events to [Azure Event Hub](https://azure.microsoft.com/en-us/services/event-hubs/) or to a [Azure IoT Hub](https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-devguide-messages-read-builtin). + +## {% linkable_title First time setup %} + +This assumes you already have a Azure account. Otherwise create a Free account [here](https://azure.microsoft.com/en-us/free/). + +You need to create a Event Hub namespace and a Event Hub in that namespace, you can follow [this guide](https://docs.microsoft.com/en-us/azure/event-hubs/event-hubs-create). Alternatively you can directly deploy an ARM template with the namespace and the Event Hub [from here](https://github.com/Azure/azure-quickstart-templates/tree/master/201-event-hubs-create-event-hub-and-consumer-group/). + +You must then create a Shared Access Policy for the Event Hub with 'Send' claims or use the RootManageAccessKey from your namespace (this key has additional claims, including managing the event hub and listening, which are not needed for this purpose), for more details on the security of Event Hubs [go here](https://docs.microsoft.com/en-us/azure/event-hubs/event-hubs-authentication-and-security-model-overview). + +Once you have the name of your namespace, instance, Shared Access Policy and the key for that policy, you can setup the component itself. + +## {% linkable_title Configuration %} + +Add the following lines to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +azure_event_hub: + event_hub_namespace: NAMESPACE_NAME + event_hub_instance_name: EVENT_HUB_INSTANCE_NAME + event_hub_sas_policy: SAS_POLICY_NAME + event_hub_sas_key: SAS_KEY + filter: + include_domains: + - homeassistant + - light + - media_player +``` + +{% configuration %} +event_hub_namespace: + description: The name of your Event Hub namespace. + required: true + type: string +event_hub_instance_name: + description: The name of your Event Hub instance. + required: true + type: string +event_hub_sas_policy: + description: The name of your Shared Access Policy. + required: true + type: string +event_hub_sas_key: + description: The key for the Shared Access Policy. + required: true + type: string +filter: + description: Filter domains and entities for Event Hub. + required: false + type: map + default: Includes all entities from all domains + keys: + include_domains: + description: List of domains to include (e.g., `light`). + required: false + type: list + exclude_domains: + description: List of domains to exclude (e.g., `light`). + required: false + type: list + include_entities: + description: List of entities to include (e.g., `light.attic`). + required: false + type: list + exclude_entities: + description: List of entities to include (e.g., `light.attic`). + required: false + type: list +{% endconfiguration %} + +

+ Not filtering domains or entities will send every event to Azure Event Hub, thus taking up a lot of space. +

+ +

+Event Hubs have a retention time of at most 7 days, if you do not capture or use the events they are deleted automatically from the Event Hub, the default retention is 1 day. +

+ +### {% linkable_title Using the data in Azure %} + +There are a number of ways to stream the data that comes into the Event Hub into storages in Azure, the easiest way is to use the built-in Capture function and this allows you to capture the data in Azure Blob Storage or Azure Data Lake store, [details here](https://docs.microsoft.com/en-us/azure/event-hubs/event-hubs-capture-overview). + +Other storages in Azure (and outside) are possible with a [Azure Stream Analytics job](https://docs.microsoft.com/en-us/azure/stream-analytics/stream-analytics-define-inputs#stream-data-from-event-hubs), for instance for [Cosmos DB](https://docs.microsoft.com/en-us/azure/stream-analytics/stream-analytics-documentdb-output), [Azure SQL DB](https://docs.microsoft.com/en-us/azure/stream-analytics/stream-analytics-sql-output-perf), [Azure Table Storage](https://docs.microsoft.com/en-us/azure/stream-analytics/stream-analytics-define-outputs#table-storage), custom writing to [Azure Blob Storage](https://docs.microsoft.com/en-us/azure/stream-analytics/stream-analytics-custom-path-patterns-blob-storage-output) and [Topic and Queues](https://docs.microsoft.com/en-us/azure/stream-analytics/stream-analytics-quick-create-portal#configure-job-output). + +On the analytical side, Event Hub can be directly fed into [Azure Databricks Spark](https://docs.microsoft.com/en-us/azure/azure-databricks/databricks-stream-from-eventhubs?toc=https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fazure%2Fevent-hubs%2FTOC.json&bc=https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fazure%2Fbread%2Ftoc.json), [Azure Time Series Insights](https://docs.microsoft.com/en-us/azure/time-series-insights/time-series-insights-how-to-add-an-event-source-eventhub) and [Microsoft Power BI](https://docs.microsoft.com/en-us/azure/event-hubs/event-hubs-tutorial-visualize-anomalies). + +The final way to use the data in Azure is to connect a Azure Function to the Event Hub using the [Event Hub trigger binding](https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-event-hubs). diff --git a/source/images/supported_brands/azure_event_hub.svg b/source/images/supported_brands/azure_event_hub.svg new file mode 100644 index 00000000000..6e57c82f82c --- /dev/null +++ b/source/images/supported_brands/azure_event_hub.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + From 9b875a46f925f328e840d64a20db947cffa2d7e8 Mon Sep 17 00:00:00 2001 From: Jason Lawrence Date: Wed, 22 May 2019 09:55:17 -0500 Subject: [PATCH 041/123] Remove 'include_non_clients' config option --- source/_components/plex.markdown | 6 ------ 1 file changed, 6 deletions(-) diff --git a/source/_components/plex.markdown b/source/_components/plex.markdown index 96897830e66..7f79d25cbc0 100644 --- a/source/_components/plex.markdown +++ b/source/_components/plex.markdown @@ -94,7 +94,6 @@ You can customize the Plex component by adding any of the variables below to you media_player: - platform: plex entity_namespace: 'plex' - include_non_clients: true scan_interval: 5 show_all_controls: false use_custom_entity_ids: true @@ -108,11 +107,6 @@ entity_namespace: description: "Prefix for entity ID's. Useful when using overlapping components (ex. Apple TV and Plex components when you have Apple TV's you use as Plex clients). Go from _media_player.playroom2_ to _media_player.plex_playroom_" required: false type: string -include_non_clients: - description: "Display non-recontrollable clients (ex. remote clients, PlexConnect Apple TV's)." - required: false - default: false - type: boolean scan_interval: description: "Amount in seconds in between polling for device’s current activity." required: false From a20d39128be8239088aeb2fccf91754575ca558c Mon Sep 17 00:00:00 2001 From: Jason Lawrence Date: Thu, 23 May 2019 10:31:06 -0500 Subject: [PATCH 042/123] Remove scan interval config option --- source/_components/plex.markdown | 6 ------ 1 file changed, 6 deletions(-) diff --git a/source/_components/plex.markdown b/source/_components/plex.markdown index 7f79d25cbc0..7bc6ea5aa19 100644 --- a/source/_components/plex.markdown +++ b/source/_components/plex.markdown @@ -94,7 +94,6 @@ You can customize the Plex component by adding any of the variables below to you media_player: - platform: plex entity_namespace: 'plex' - scan_interval: 5 show_all_controls: false use_custom_entity_ids: true use_episode_art: true @@ -107,11 +106,6 @@ entity_namespace: description: "Prefix for entity ID's. Useful when using overlapping components (ex. Apple TV and Plex components when you have Apple TV's you use as Plex clients). Go from _media_player.playroom2_ to _media_player.plex_playroom_" required: false type: string -scan_interval: - description: "Amount in seconds in between polling for device’s current activity." - required: false - default: 10 - type: int show_all_controls: description: "Forces all controls to display. Ignores dynamic controls (ex. show volume controls for client A but not for client B) based on detected client capabilities. This option allows you to override this detection if you suspect it to be incorrect." required: false From 5edbb9c3f62e9d96682dd2b9034e13a20941cad3 Mon Sep 17 00:00:00 2001 From: Jason Lawrence Date: Thu, 23 May 2019 22:32:30 -0500 Subject: [PATCH 043/123] Remove naming config options --- source/_components/plex.markdown | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/source/_components/plex.markdown b/source/_components/plex.markdown index 7bc6ea5aa19..be6245d2861 100644 --- a/source/_components/plex.markdown +++ b/source/_components/plex.markdown @@ -93,29 +93,18 @@ You can customize the Plex component by adding any of the variables below to you # Example configuration.yaml entry media_player: - platform: plex - entity_namespace: 'plex' show_all_controls: false - use_custom_entity_ids: true use_episode_art: true remove_unavailable_clients: true client_remove_interval: 600 ``` {% configuration %} -entity_namespace: - description: "Prefix for entity ID's. Useful when using overlapping components (ex. Apple TV and Plex components when you have Apple TV's you use as Plex clients). Go from _media_player.playroom2_ to _media_player.plex_playroom_" - required: false - type: string show_all_controls: description: "Forces all controls to display. Ignores dynamic controls (ex. show volume controls for client A but not for client B) based on detected client capabilities. This option allows you to override this detection if you suspect it to be incorrect." required: false default: false type: boolean -use_custom_entity_ids: - description: "Name Entity ID's by client ID's instead of friendly names. HA assigns entity ID's on a first come first serve basis. When you have identically named devices connecting (ex. media_player.plex_web_safari, media_player.plex_web_safari2), you can't reliably distinguish and or predict which device is which. This option avoids this issue by using unique client ID's (ex. media_player.dy4hdna2drhn)." - required: false - default: false - type: boolean use_episode_art: description: Display TV episode art instead of TV show art. required: false From d65334e03875b914d1fffe73a615d4335a63b38d Mon Sep 17 00:00:00 2001 From: Jason Lawrence Date: Thu, 23 May 2019 23:06:03 -0500 Subject: [PATCH 044/123] Oops, removed standard option From f975cec1a29f7cf6a781ccf40d42905d35231212 Mon Sep 17 00:00:00 2001 From: Jason Lawrence Date: Fri, 24 May 2019 16:37:39 -0500 Subject: [PATCH 045/123] Remove entity_namespace, too From 50923e75a0986874cb3db7737c7a144078966907 Mon Sep 17 00:00:00 2001 From: Andre Lengwenus Date: Sat, 1 Jun 2019 10:00:53 +0200 Subject: [PATCH 046/123] Add documentation for LCN service calls (#9516) * Add docs for LCN service calls * :pencil2: Tweak After this we can merge it --- source/_components/lcn.markdown | 261 ++++++++++++++++++++++++++++++++ 1 file changed, 261 insertions(+) diff --git a/source/_components/lcn.markdown b/source/_components/lcn.markdown index b66e453dc84..1f0dee0600e 100644 --- a/source/_components/lcn.markdown +++ b/source/_components/lcn.markdown @@ -38,6 +38,12 @@ There is currently support for the following device types within Home Assistant: - [Sensor](#sensor) - [Switch](#switch) +

+ Please note: Besides the implemented platforms the `lcn` component offers a variety of [service calls](#services). + These service calls cover functionalities of the LCN system which cannot be represented by the platform implementations. + They are ideal to be used in automation scripts or for the `template` platforms. +

+ ## {% linkable_title Configuration %} To use your LCN system in your installation, add the following lines to your `configuration.yaml` file. @@ -343,6 +349,8 @@ The [MOTOR_PORT](#ports) values specify which hardware relay configuration will | THRESHOLD | `thrs1`, `thrs2`, `thrs3`, `thrs4`, `thrs5`, `thrs2_1`, `thrs2_2`, `thrs2_3`, `thrs2_4`, `thrs3_1`, `thrs3_2`, `thrs3_3`, `thrs3_4`, `thrs4_1`, `thrs4_2`, `thrs4_3`, `thrs4_4` | | S0_INPUT | `s0input1`, `s0input2`, `s0input3`, `s0input4` | | VAR_UNIT | `native`, `°C`, `°K`, `°F`, `lux_t`, `lux_i`, `m/s`, `%`, `ppm`, `volt`, `ampere`, `degree` | +| TIME_UNIT | `seconds`, `minutes`, `hours`, `days` | +| RELVARREF | `current`, `prog` | ### {% linkable_title States %}: @@ -414,3 +422,256 @@ The `lcn` switch platform allows the control of the following [LCN](http://www.l - Output ports - Relays + +## {% linkable_title Services %} + +In order to directly interact with the LCN system, and invoke commands which are not covered by the implemented platforms, the following service calls can be used. +Refer to the (Services Calls)[/docs/scripts/service-calls] page for examples on how to use them. + +### {% linkable_title Service `output_abs` %} + +Set absolute brightness of output port in percent. + +| Service data attribute | Optional | Description | Values | +| ---------------------- | -------- | ----------- | ------ | +| `address` | No | [LCN address](#lcn-addresses) | +| `output` | No | Output port of module | [OUTPUT_PORT](#ports) | +| `brightness` | Yes | Absolute brightness in percent | 0..100 | +| `transition` | Yes | Transition (ramp) time in seconds | 0..486 | + +Example: + +``` +{"address": "myhome.0.7", "output": "output1", "brightness": 100, "transition": 0} +``` + +### {% linkable_title Service `output_rel` %} + +Set relative brightness of output port in percent. + +| Service data attribute | Optional | Description | Values | +| ---------------------- | -------- | ----------- | ------ | +| `address` | No | [LCN address](#lcn-addresses) | +| `output` | No | Output port of module | [OUTPUT_PORT](#ports) | +| `brightness` | Yes | Relative brightness in percent | -100..100 | +| `transition` | Yes | Transition (ramp) time in seconds | 0..486 | + +Example: + +``` +{"address": "myhome.0.7", "output": "output1", "brightness": 30} +``` + +### {% linkable_title Service `output_toggle` %} + +Toggle output port. + +| Service data attribute | Optional | Description | Values | +| ---------------------- | -------- | ----------- | ------ | +| `address` | No | [LCN address](#lcn-addresses) | +| `output` | No | Output port of module | [OUTPUT_PORT](#ports) | +| `transition` | Yes | Transition (ramp) time in seconds | 0..486 | + +Example: + +``` +{"address": "myhome.0.7", "output": "output1", "transition": 0} +``` + +### {% linkable_title Service `relays` %} + +Set the relays status. The relays states are defined as a string with eight characters. +Each character represents the state change of a relay (1=on, 0=off, t=toggle, -=nochange). + +Example states: `t---001-` + +| Service data attribute | Optional | Description | Values | +| ---------------------- | -------- | ----------- | ------ | +| `address` | No | [LCN address](#lcn-addresses) | +| `state` | No | Relay states as string | + +Example: + +``` +{"address": "myhome.0.7", "state": "t---001-"} +``` + +### {% linkable_title Service `led` %} + +Set the led status. + +| Service data attribute | Optional | Description | Values | +| ---------------------- | -------- | ----------- | ------ | +| `address` | No | [LCN address](#lcn-addresses) | +| `state` | No | Led state as string | [LED_STATE](#states) | + +Example: + +``` +{"address": "myhome.0.7", "led": "led6", "state": "blink"} +``` + +### {% linkable_title Service `var_abs` %} + +Set the absolute value of a variable or setpoint. +If `value` is not defined, it is assumed to be 0. +If `unit_of_measurement` is not defined, it is assumed to be `native`. + +| Service data attribute | Optional | Description | Values | +| ---------------------- | -------- | ----------- | ------ | +| `address` | No | [LCN address](#lcn-addresses) | +| `variable` | No | Variable name | [VARIABLE](#variables-and-units), [SETPOINT](#variables-and-units) | +| `value` | Yes | Variable value | _any positive number_ | +| `unit_of_measurement` | Yes | Variable unit | [VAR_UNIT](#variables-and-units) | + +Example: + +``` +{"address": "myhome.0.7", "variable": "var1", "value": 75, "unit_of_measurement": "%"} +``` + +

+ Ensure that the LCN module is configured properly to provide acces to the defined variable. + Otherwise the module might show unexpected behaviors or return error messages. +

+ +### {% linkable_title Service `var_rel` %} + +Set the relative value of a variable or setpoint. +If `value` is not defined, it is assumed to be 0. +If `unit_of_measurement` is not defined, it is assumed to be `native`. + +| Service data attribute | Optional | Description | Values | +| ---------------------- | -------- | ----------- | ------ | +| `address` | No | [LCN address](#lcn-addresses) | +| `variable` | No | Variable name | [VARIABLE](#variables-and-units), [SETPOINT](#variables-and-units), [THRESHOLD](#variables-and-units) | +| `value` | Yes | Variable value | _any positive or negative number_ | +| `unit_of_measurement` | Yes | Variable unit | [VAR_UNIT](#variables-and-units) | + +Example: + +``` +{"address": "myhome.0.7", "variable": "var1", "value": 10, "unit_of_measurement": "%"} +``` + +

+ Ensure that the LCN module is configured properly to provide acces to the defined variable. + Otherwise the module might show unexpected behavior or return error messages. +

+ +### {% linkable_title Service `var_reset` %} + +Reset value of variable or setpoint. + +| Service data attribute | Optional | Description | Values | +| ---------------------- | -------- | ----------- | ------ | +| `address` | No | [LCN address](#lcn-addresses) | +| `variable` | No | Variable name | [VARIABLE](#variables-and-units), [SETPOINT](#variables-and-units) | + +Example: + +``` +{"address": "myhome.0.7", "variable": "var1"} +``` + +

+ Ensure that the LCN module is configured properly to provide acces to the defined variable. + Otherwise the module might show unexpected behavior or return error messages. +

+ +### {% linkable_title Service `lock_regulator` %} + +Locks a regulator setpoint. +If `state` is not defined, it is assumed to be `False`. + +| Service data attribute | Optional | Description | Values | +| ---------------------- | -------- | ----------- | ------ | +| `address` | No | [LCN address](#lcn-addresses) | +| `setpoint` | No | Setpoint name | [SETPOINT](#variables-and-units) | +| `state` | Yes | Lock state | true, false | + +Example: + +``` +{"address": "myhome.0.7", "setpoint": "r1varsetpoint", "state": true} +``` + +### {% linkable_title Service `send_keys` %} + +Send keys (which executes bound commands). +The keys attribute is a string with one or more key identifiers. Example: `a1a5d8` +If `state` is not defined, it is assumed to be `hit`. +The command allow the sending of keys immediately or deferred. For a deferred sendig the attributes `time` and `time_unit` have to be specified. For deferred sending the only key state allowed is `hit`. +If `time_unit` is not defined, it is assumed to be `seconds`. + +| Service data attribute | Optional | Description | Values | +| ---------------------- | -------- | ----------- | ------ | +| `address` | No | [LCN address](#lcn-addresses) | +| `keys` | No | Keys string | +| `state` | Yes | Keys state | [SENDKEYCOMMANDS](#states) | +| `time` | Yes | Deferred time | 0.. | +| `time_unit` | Yes | Time unit | [TIME_UNIT](#variables-and-units) + +Examples: + +``` +{"address": "myhome.0.7", "keys": "a1a5d8", "state": "hit"} +{"address": "myhome.0.7", "keys": "a1a5d8", "time": 5, "time_unit": "s"} +``` + +### {% linkable_title Service `lock_keys` %} + +Locks keys. +If table is not defined, it is assumend to be table `a`. +The key lock states are defined as a string with eight characters. Each character represents the state change of a key lock (1=on, 0=off, t=toggle, -=nochange). +The command allows the locking of keys for a specified time period. For a time period the attributes `time` and `time_unit` have to be specified. For a time period only tabley `a` is allowed. +If `time_unit` is not defined, it is assumed to be `seconds`. + +| Service data attribute | Optional | Description | Values | +| ---------------------- | -------- | ----------- | ------ | +| `address` | No | [LCN address](#lcn-addresses) | +| `table` | Yes | Table with keys to lock | +| `state` | No | Key lock states as string | [SENDKEYCOMMANDS](#states) | +| `time` | Yes | Time period to lock | 0.. | +| `time_unit` | Yes | Time unit | [TIME_UNIT](#variables-and-units) + +Examples: + +``` +{"address": "myhome.0.7", "table": "a", "state": "1---t0--"} +{"address": "myhome.0.7", "state": "1---t0--", "time": 10, "time_unit": "s"} +``` + +### {% linkable_title Service `dyn_text` %} + +Send dynamic text to LCN-GTxD displays. +The displays support four rows for text messages. +Each row can be set independently and can store up to 60 characters (encoded in UTF-8). + + +| Service data attribute | Optional | Description | Values | +| ---------------------- | -------- | ----------- | ------ | +| `address` | No | [LCN address](#lcn-addresses) | +| `row` | No | Text row 1..4 | +| `text` | No | Text to send for the specified row | + +Example: + +``` +{"address": "myhome.0.7", "row": 1, "text": "text in row 1"} +``` + +### {% linkable_title Service `pck` %} + +Send arbitrary PCK command. Only the command part of the PCK command has to be specified in the `pck` string. + +| Service data attribute | Optional | Description | Values | +| ---------------------- | -------- | ----------- | ------ | +| `address` | No | [LCN address](#lcn-addresses) | +| `pck` | No | PCK command | + +Example: + +``` +{"address": "myhome.0.7", "pck": "PIN4"} +``` From 980547b852c5b1431210b783cd5b4a7b2f4e131d Mon Sep 17 00:00:00 2001 From: Jeff Irion Date: Fri, 31 May 2019 14:28:04 -0700 Subject: [PATCH 047/123] Mention 'adb_response' attribute (#9529) * Mention 'adb_response' attribute * Add missing ' * Remove template braces * :pencil2: Tweak After this I will merge it --- source/_components/androidtv.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_components/androidtv.markdown b/source/_components/androidtv.markdown index e19d45d96a5..5a86571d339 100644 --- a/source/_components/androidtv.markdown +++ b/source/_components/androidtv.markdown @@ -208,7 +208,7 @@ stop_netflix: ### {% linkable_title `androidtv.adb_command` %} -The service `androidtv.adb_command` allows you to send either keys or ADB shell commands to your Android TV / Fire TV device. +The service `androidtv.adb_command` allows you to send either keys or ADB shell commands to your Android TV / Fire TV device. If there is any output, it will be stored in the `'adb_response'` attribute (i.e., `state_attr('media_player.android_tv_living_room', 'adb_response')` in a template) and logged at the INFO level. | Service data attribute | Optional | Description | | ---------------------- | -------- | ----------- | @@ -240,4 +240,4 @@ Available key commands include: The full list of key commands can be found [here](https://github.com/JeffLIrion/python-androidtv/blob/e1c07176efc9216cdcff8245c920224c0234ea56/androidtv/constants.py#L115-L155). -You can also use the command `GET_PROPERTIES` to retrieve the properties used by Home Assistant to update the device's state. These will be logged at the INFO level and can be used to help improve state detection in the backend [androidtv](https://github.com/JeffLIrion/python-androidtv) package. +You can also use the command `GET_PROPERTIES` to retrieve the properties used by Home Assistant to update the device's state. These will be stored in the media player's `'adb_response'` attribute and logged at the INFO level, this information can be used to help improve state detection in the backend [androidtv](https://github.com/JeffLIrion/python-androidtv) package. From 0b521756b6e5c04f4fc90d4fba93d24e49c30fe1 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 3 Jun 2019 16:00:55 -0700 Subject: [PATCH 048/123] Add note --- source/_posts/2019-06-05-release-94.markdown | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/_posts/2019-06-05-release-94.markdown b/source/_posts/2019-06-05-release-94.markdown index 8150020428a..6ad7311ae13 100644 --- a/source/_posts/2019-06-05-release-94.markdown +++ b/source/_posts/2019-06-05-release-94.markdown @@ -53,7 +53,9 @@ We have been working hard on improving Hass.io builds. A build can now be online We changed how packages are installed when running Home Assistant inside a Docker container. It will now install the packages into the Python environment inside the container, instead of storing them in the `deps` folder inside your config folder which lived outside the container. -**Note:** If you are using Hass.io or a dockerized version of Home Assistant, this release will one time clear the `deps` folder in your config folder. +**Note:** Because of the new way packages are installed, Home Assistant will take longer to start the first time it is launched after an upgrade. Don't worry and let it finish! We are working on making this process faster in the future. + +**Note 2:** If you are using Hass.io or a dockerized version of Home Assistant, this release will one time clear the `deps` folder in your config folder. [@frenck]: https://github.com/frenck From caceedea608476673b3d7c3cbd14d99f9cb943f0 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 3 Jun 2019 16:11:56 -0700 Subject: [PATCH 049/123] Update text --- source/_posts/2019-06-05-release-94.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_posts/2019-06-05-release-94.markdown b/source/_posts/2019-06-05-release-94.markdown index 6ad7311ae13..3a11b8f1d64 100644 --- a/source/_posts/2019-06-05-release-94.markdown +++ b/source/_posts/2019-06-05-release-94.markdown @@ -37,9 +37,9 @@ The new discovery is now part of the default config. If you are not using the de ## {% linkable_title Deprecating Python 3.5 support %} -This release has deprecated support for the almost 4 year old version 3.5 of Python. The first release after August 1 will drop support. This is part of our newly adopted [Python support approach](https://github.com/home-assistant/architecture/blob/master/adr/0002-minimum-supported-python-version.md). +This release has deprecated support for the almost 4 year old version 3.5 of Python. The first Home Assistant release after August 1 will drop support. This is part of our newly adopted [Python support approach](https://github.com/home-assistant/architecture/blob/master/adr/0002-minimum-supported-python-version.md). -This will only impact you if you are running a custom installation of Home Assistant. This will not impact anyone using Hass.io or Docker. +This will only impact you if you are running a custom installation of Home Assistant. This will not impact anyone using Hass.io or Docker. If you are using hassbian, you can upgrade Python by following [these instructions](https://github.com/home-assistant/hassbian-scripts/blob/dev/docs/suites/python.md). ## {% linkable_title Modernizing the device tracker %} From 2edbd4c8b20cf0ce411f3f544c64026cfa6102b1 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 3 Jun 2019 16:18:55 -0700 Subject: [PATCH 050/123] Update components picture --- .../blog/2019-06-release-94/components.png | Bin 23680 -> 63918 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/source/images/blog/2019-06-release-94/components.png b/source/images/blog/2019-06-release-94/components.png index 4ff898436832f62983b8e4b4e63f7c33320d42c5..70a278d782af367d9aed548ec1330ecd844c81a1 100644 GIT binary patch literal 63918 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�!lu5A4G3NgrXoKAiabp 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 Date: Mon, 3 Jun 2019 16:23:16 -0700 Subject: [PATCH 051/123] Update notes --- source/_posts/2019-06-05-release-94.markdown | 130 ++++++++++++++++--- 1 file changed, 111 insertions(+), 19 deletions(-) diff --git a/source/_posts/2019-06-05-release-94.markdown b/source/_posts/2019-06-05-release-94.markdown index 3a11b8f1d64..83036bd80c6 100644 --- a/source/_posts/2019-06-05-release-94.markdown +++ b/source/_posts/2019-06-05-release-94.markdown @@ -61,12 +61,13 @@ We changed how packages are installed when running Home Assistant inside a Docke ## {% linkable_title New Integrations %} -- Adding Watson TTS (IBM Cloud) ([@rutkai] - [#23299]) ([watson_tts docs]) (new-integration) (new-platform) -- MCP23017 ([@jardiamj] - [#23127]) ([mcp23017 docs]) (new-integration) (new-platform) -- Solax Inverter Sensor Component ([@squishykid] - [#22579]) ([solax docs]) (new-integration) (new-platform) -- Add Remote RPi Component ([@jgriff2] - [#23518]) ([remote_rpi_gpio docs]) (new-integration) (new-platform) +- Adding Watson TTS (IBM Cloud) ([@rutkai] - [#23299]) ([watson_tts docs]) (new-integration) +- MCP23017 ([@jardiamj] - [#23127]) ([mcp23017 docs]) (new-integration) +- Solax Inverter Sensor Component ([@squishykid] - [#22579]) ([solax docs]) (new-integration) +- Add Remote RPi Component ([@jgriff2] - [#23518]) ([remote_rpi_gpio docs]) (new-integration) - Azure Event Hub history component ([@eavanvalkenburg] - [#23878]) ([azure_event_hub docs]) (new-integration) - Add SSDP integration ([@balloob] - [#24090]) ([default_config docs]) ([discovery docs]) ([hue docs]) ([ssdp docs]) ([zeroconf docs]) (new-integration) +- Add Repetier-Server Component ([@MTrab] - [#21658]) ([repetier docs]) (new-integration) ## {% linkable_title New Platforms %} @@ -74,11 +75,7 @@ We changed how packages are installed when running Home Assistant inside a Docke - Add incomfort climate and bump client ([@zxdavb] - [#23830]) ([incomfort docs]) (new-platform) - Add new SmartHab light and cover platform ([@outadoc] - [#21225]) ([smarthab docs]) (new-platform) - Add geniushub sensor and binary_sensor ([@zxdavb] - [#23811]) ([geniushub docs]) (new-platform) -- Adding Watson TTS (IBM Cloud) ([@rutkai] - [#23299]) ([watson_tts docs]) (new-integration) (new-platform) -- MCP23017 ([@jardiamj] - [#23127]) ([mcp23017 docs]) (new-integration) (new-platform) -- Solax Inverter Sensor Component ([@squishykid] - [#22579]) ([solax docs]) (new-integration) (new-platform) -- Add Remote RPi Component ([@jgriff2] - [#23518]) ([remote_rpi_gpio docs]) (new-integration) (new-platform) -- Add Repetier-Server Component ([@MTrab] - [#21658]) ([repetier docs]) (new-platform) +- Mobile app to use device tracker config entry ([@balloob] - [#24238]) ([mobile_app docs]) (beta fix) (new-platform) ## {% linkable_title If you need help... %} @@ -96,9 +93,39 @@ Experiencing issues introduced by this release? Please report them in our [issue - Fix entity id naming when not using first install ([@tkjacobsen] - [#23606]) ([verisure docs]) (breaking change) - Update the name of Zestimate sensors ([@dreed47] - [#23770]) ([zestimate docs]) (breaking change) - Remove custom entity_id naming ([@jjlawren] - [#24072]) ([plex docs]) (breaking change) -- Trådfri component to use new zeroconf discovery ([@Kane610] - [#24041]) ([discovery docs]) ([tradfri docs]) (breaking change) -- Move Homekit controller component to user zeroconf discovery ([@Kane610] - [#24042]) ([discovery docs]) ([homekit_controller docs]) (breaking change) - Deprecate Python 3.5.3 ([@balloob] - [#24177]) (breaking change) +- Dynamic panels ([@balloob] - [#24184]) (breaking change) (beta fix) +- add a deprecation warning for tplink device_tracker ([@rytilahti] - [#24236]) ([tplink docs]) (breaking change) (beta fix) + +## {% linkable_title Beta Fixes %} + +- Dynamic panels ([@balloob] - [#24184]) (breaking change) (beta fix) +- Fix ESPHome discovered when already exists ([@OttoWinter] - [#24187]) ([esphome docs]) (beta fix) +- homekit_controller no longer logs with transient network errors causing crypto failures as it will auto recover ([@Jc2k] - [#24193]) ([homekit_controller docs]) (beta fix) +- Update hass-nabucasa ([@balloob] - [#24197]) ([cloud docs]) (beta fix) +- Bump oauthlib version ([@therve] - [#24111]) ([fitbit docs]) (beta fix) +- Allow discovery flows to be discovered via zeroconf/ssdp ([@balloob] - [#24199]) (beta fix) +- Instantiate lock inside event loop ([@balloob] - [#24203]) (beta fix) +- Improve error handling ([@balloob] - [#24204]) ([ssdp docs]) (beta fix) +- Axis - Handle Vapix error messages ([@Kane610] - [#24215]) ([axis docs]) (beta fix) +- Don't follow redirect on ingress itself ([@pvizeli] - [#24218]) ([hassio docs]) (beta fix) +- Use resource for index routing. ([@balloob] - [#24223]) ([frontend docs]) (beta fix) +- Add manifest support for homekit discovery ([@balloob] - [#24225]) ([lifx docs]) ([zeroconf docs]) (beta fix) +- Log HomeKit model ([@balloob] - [#24229]) ([homekit_controller docs]) (beta fix) +- Don't allow more than one config flow per discovered Axis device ([@Kane610] - [#24230]) ([axis docs]) (beta fix) +- Add GPSLogger device_info and unique_id ([@balloob] - [#24231]) ([gpslogger docs]) (beta fix) +- GeoFency unique ID and device info ([@balloob] - [#24232]) ([geofency docs]) (beta fix) +- add a deprecation warning for tplink device_tracker ([@rytilahti] - [#24236]) ([tplink docs]) (breaking change) (beta fix) +- Mobile app to use device tracker config entry ([@balloob] - [#24238]) ([mobile_app docs]) (beta fix) (new-platform) +- Do not use the cache dir for PIP installs ([@balloob] - [#24233]) (beta fix) +- Add restore state to OwnTracks device tracker ([@balloob] - [#24256]) ([owntracks docs]) (beta fix) +- Mobile app device tracker to restore state ([@balloob] - [#24266]) ([mobile_app docs]) (beta fix) +- Add restore state to Geofency ([@balloob] - [#24268]) ([geofency docs]) (beta fix) +- deCONZ migrate to SSDP discovery ([@Kane610] - [#24252]) ([deconz docs]) ([hue docs]) ([ssdp docs]) (beta fix) +- Add temperature sensor support to google smarthome thermostat device ([@piitaya] - [#24264]) ([google_assistant docs]) (beta fix) +- Bump aioesphomeapi to 2.1.0 ([@OttoWinter] - [#24278]) ([esphome docs]) (beta fix) +- Fix cors on the index view ([@balloob] - [#24283]) ([http docs]) (beta fix) +- Remove deps folder in config when on Docker ([@balloob] - [#24284]) (beta fix) ## {% linkable_title All changes %} @@ -157,7 +184,7 @@ Experiencing issues introduced by this release? Please report them in our [issue - Upate xiaomi voltage parser, fix #23898 ([@Danielhiversen] - [#23962]) ([xiaomi_aqara docs]) - Doorbird Refactor ([@oblogic7] - [#23892]) ([doorbird docs]) (breaking change) - Update russound_rio dependency to version 0.1.7 ([@wickerwaka] - [#23973]) ([russound_rio docs]) -- Adding Watson TTS (IBM Cloud) ([@rutkai] - [#23299]) ([watson_tts docs]) (new-integration) (new-platform) +- Adding Watson TTS (IBM Cloud) ([@rutkai] - [#23299]) ([watson_tts docs]) (new-integration) - Entity Cleanup on Z-Wave node removal ([@cgarwood] - [#23633]) ([zwave docs]) - Use the timezone defined in Home Assistant when making the API call ([@ludeeus] - [#23284]) ([vasttrafik docs]) - Updated non-blocking timout to 10 seconds for fixing timeout issues. ([@TomerFi] - [#23930]) ([switcher_kis docs]) @@ -181,7 +208,7 @@ Experiencing issues introduced by this release? Please report them in our [issue - Require core config detection to be triggerd manually ([@balloob] - [#24019]) ([config docs]) ([onboarding docs]) - Don't pass in loop ([@balloob] - [#23984]) - Update ambiclimate library ([@Danielhiversen] - [#24049]) ([ambiclimate docs]) -- ESPHome component to use zeroconf discovery ([@Kane610] - [#24043]) ([esphome docs]) (breaking change) +- ESPHome component to use zeroconf discovery ([@Kane610] - [#24043]) ([esphome docs]) - Add support for available property for broadlink ([@Danielhiversen] - [#23981]) ([broadlink docs]) - Always update all Plex client types ([@jjlawren] - [#24038]) ([plex docs]) (breaking change) - Convert stream source to method ([@balloob] - [#23905]) @@ -195,18 +222,18 @@ Experiencing issues introduced by this release? Please report them in our [issue - Add 'adb_response' attribute to Android TV / Fire TV ([@JeffLIrion] - [#23960]) ([androidtv docs]) - Adjust logging ([@elupus] - [#24082]) - Fix Hue bridge timeout ([@terual] - [#24084]) ([hue docs]) -- MCP23017 ([@jardiamj] - [#23127]) ([mcp23017 docs]) (new-integration) (new-platform) +- MCP23017 ([@jardiamj] - [#23127]) ([mcp23017 docs]) (new-integration) - Remove device tracker unnecessary separate except clause ([@elupus] - [#24081]) ([device_tracker docs]) - Refactoring of LCN component ([@alengwenus] - [#23824]) ([lcn docs]) - Update code owner for Xiaomi TV ([@simse] - [#24102]) ([xiaomi_tv docs]) - Issue #23514 - fix invalid hue response ([@techfreek] - [#23909]) ([emulated_hue docs]) - Config entry device tracker ([@balloob] - [#24040]) ([device_tracker docs]) ([geofency docs]) ([gpslogger docs]) ([icloud docs]) ([locative docs]) ([owntracks docs]) ([zone docs]) -- Solax Inverter Sensor Component ([@squishykid] - [#22579]) ([solax docs]) (new-integration) (new-platform) +- Solax Inverter Sensor Component ([@squishykid] - [#22579]) ([solax docs]) (new-integration) - Set assumed_state property to True. ([@jardiamj] - [#24118]) ([mcp23017 docs]) - Remove custom entity_id naming ([@jjlawren] - [#24072]) ([plex docs]) (breaking change) - Move imports to top ([@andrewsayre] - [#24108]) ([heos docs]) - Use name in ESPHome discovery title ([@OttoWinter] - [#24100]) -- Add Remote RPi Component ([@jgriff2] - [#23518]) ([remote_rpi_gpio docs]) (new-integration) (new-platform) +- Add Remote RPi Component ([@jgriff2] - [#23518]) ([remote_rpi_gpio docs]) (new-integration) - Azure Event Hub history component ([@eavanvalkenburg] - [#23878]) ([azure_event_hub docs]) (new-integration) - geniushub: fix sensor battery level, and bump client ([@zxdavb] - [#24123]) ([geniushub docs]) - Use importlib metadata to check installed packages ([@balloob] - [#24114]) @@ -221,13 +248,13 @@ Experiencing issues introduced by this release? Please report them in our [issue - Upgrade huawei-lte-api to 1.2.0 ([@chmielowiec] - [#24165]) ([huawei_lte docs]) - Use device name for device_tracker entry ([@robbiet480] - [#24155]) ([mobile_app docs]) - Use global imports for ESPHome ([@OttoWinter] - [#24158]) ([esphome docs]) -- Add Repetier-Server Component ([@MTrab] - [#21658]) ([repetier docs]) (new-platform) +- Add Repetier-Server Component ([@MTrab] - [#21658]) ([repetier docs]) (new-integration) - Cloud: Websocket API to manage Google assistant entity config ([@balloob] - [#24153]) ([cloud docs]) ([google_assistant docs]) - Fix calling notify.notify with mobile_app targets in play. Fixes #24064 ([@robbiet480] - [#24156]) ([mobile_app docs]) - Remove unused Sonos turn on/off methods ([@amelchio] - [#24174]) ([sonos docs]) - Reinstate passing loop to DSMR ([@balloob] - [#24127]) ([dsmr docs]) -- Trådfri component to use new zeroconf discovery ([@Kane610] - [#24041]) ([discovery docs]) ([tradfri docs]) (breaking change) -- Move Homekit controller component to user zeroconf discovery ([@Kane610] - [#24042]) ([discovery docs]) ([homekit_controller docs]) (breaking change) +- Trådfri component to use new zeroconf discovery ([@Kane610] - [#24041]) ([discovery docs]) ([tradfri docs]) +- Move Homekit controller component to user zeroconf discovery ([@Kane610] - [#24042]) ([discovery docs]) ([homekit_controller docs]) - Revert Zeroconf back to previously used library ([@Kane610] - [#24139]) ([zeroconf docs]) - Deprecate Python 3.5.3 ([@balloob] - [#24177]) (breaking change) - Keep integrations in discovery ([@Kane610] - [#24179]) ([discovery docs]) @@ -236,6 +263,35 @@ Experiencing issues introduced by this release? Please report them in our [issue - Remove discovery from initial config ([@balloob] - [#24183]) - Fix duplicated discovered homekit devices ([@Jc2k] - [#24178]) ([homekit_controller docs]) - Add service calls for LCN component ([@alengwenus] - [#24105]) ([lcn docs]) +- Update azure-pipelines.yml for check version ([@pvizeli] - [#24194]) +- Dynamic panels ([@balloob] - [#24184]) (breaking change) (beta fix) +- Fix ESPHome discovered when already exists ([@OttoWinter] - [#24187]) ([esphome docs]) (beta fix) +- homekit_controller no longer logs with transient network errors causing crypto failures as it will auto recover ([@Jc2k] - [#24193]) ([homekit_controller docs]) (beta fix) +- Update hass-nabucasa ([@balloob] - [#24197]) ([cloud docs]) (beta fix) +- Fix ESPHome config flow with invalid config entry ([@OttoWinter] - [#24213]) ([esphome docs]) +- Bump oauthlib version ([@therve] - [#24111]) ([fitbit docs]) (beta fix) +- Allow discovery flows to be discovered via zeroconf/ssdp ([@balloob] - [#24199]) (beta fix) +- Instantiate lock inside event loop ([@balloob] - [#24203]) (beta fix) +- Improve error handling ([@balloob] - [#24204]) ([ssdp docs]) (beta fix) +- Axis - Handle Vapix error messages ([@Kane610] - [#24215]) ([axis docs]) (beta fix) +- Don't follow redirect on ingress itself ([@pvizeli] - [#24218]) ([hassio docs]) (beta fix) +- Use resource for index routing. ([@balloob] - [#24223]) ([frontend docs]) (beta fix) +- Add manifest support for homekit discovery ([@balloob] - [#24225]) ([lifx docs]) ([zeroconf docs]) (beta fix) +- Log HomeKit model ([@balloob] - [#24229]) ([homekit_controller docs]) (beta fix) +- Don't allow more than one config flow per discovered Axis device ([@Kane610] - [#24230]) ([axis docs]) (beta fix) +- Add GPSLogger device_info and unique_id ([@balloob] - [#24231]) ([gpslogger docs]) (beta fix) +- GeoFency unique ID and device info ([@balloob] - [#24232]) ([geofency docs]) (beta fix) +- add a deprecation warning for tplink device_tracker ([@rytilahti] - [#24236]) ([tplink docs]) (breaking change) (beta fix) +- Mobile app to use device tracker config entry ([@balloob] - [#24238]) ([mobile_app docs]) (beta fix) (new-platform) +- Do not use the cache dir for PIP installs ([@balloob] - [#24233]) (beta fix) +- Add restore state to OwnTracks device tracker ([@balloob] - [#24256]) ([owntracks docs]) (beta fix) +- Mobile app device tracker to restore state ([@balloob] - [#24266]) ([mobile_app docs]) (beta fix) +- Add restore state to Geofency ([@balloob] - [#24268]) ([geofency docs]) (beta fix) +- deCONZ migrate to SSDP discovery ([@Kane610] - [#24252]) ([deconz docs]) ([hue docs]) ([ssdp docs]) (beta fix) +- Add temperature sensor support to google smarthome thermostat device ([@piitaya] - [#24264]) ([google_assistant docs]) (beta fix) +- Bump aioesphomeapi to 2.1.0 ([@OttoWinter] - [#24278]) ([esphome docs]) (beta fix) +- Fix cors on the index view ([@balloob] - [#24283]) ([http docs]) (beta fix) +- Remove deps folder in config when on Docker ([@balloob] - [#24284]) (beta fix) [#21225]: https://github.com/home-assistant/home-assistant/pull/21225 [#21658]: https://github.com/home-assistant/home-assistant/pull/21658 @@ -350,6 +406,7 @@ Experiencing issues introduced by this release? Please report them in our [issue [#24104]: https://github.com/home-assistant/home-assistant/pull/24104 [#24105]: https://github.com/home-assistant/home-assistant/pull/24105 [#24108]: https://github.com/home-assistant/home-assistant/pull/24108 +[#24111]: https://github.com/home-assistant/home-assistant/pull/24111 [#24114]: https://github.com/home-assistant/home-assistant/pull/24114 [#24117]: https://github.com/home-assistant/home-assistant/pull/24117 [#24118]: https://github.com/home-assistant/home-assistant/pull/24118 @@ -371,6 +428,34 @@ Experiencing issues introduced by this release? Please report them in our [issue [#24179]: https://github.com/home-assistant/home-assistant/pull/24179 [#24180]: https://github.com/home-assistant/home-assistant/pull/24180 [#24183]: https://github.com/home-assistant/home-assistant/pull/24183 +[#24184]: https://github.com/home-assistant/home-assistant/pull/24184 +[#24187]: https://github.com/home-assistant/home-assistant/pull/24187 +[#24193]: https://github.com/home-assistant/home-assistant/pull/24193 +[#24194]: https://github.com/home-assistant/home-assistant/pull/24194 +[#24197]: https://github.com/home-assistant/home-assistant/pull/24197 +[#24199]: https://github.com/home-assistant/home-assistant/pull/24199 +[#24203]: https://github.com/home-assistant/home-assistant/pull/24203 +[#24204]: https://github.com/home-assistant/home-assistant/pull/24204 +[#24213]: https://github.com/home-assistant/home-assistant/pull/24213 +[#24215]: https://github.com/home-assistant/home-assistant/pull/24215 +[#24218]: https://github.com/home-assistant/home-assistant/pull/24218 +[#24223]: https://github.com/home-assistant/home-assistant/pull/24223 +[#24225]: https://github.com/home-assistant/home-assistant/pull/24225 +[#24229]: https://github.com/home-assistant/home-assistant/pull/24229 +[#24230]: https://github.com/home-assistant/home-assistant/pull/24230 +[#24231]: https://github.com/home-assistant/home-assistant/pull/24231 +[#24232]: https://github.com/home-assistant/home-assistant/pull/24232 +[#24233]: https://github.com/home-assistant/home-assistant/pull/24233 +[#24236]: https://github.com/home-assistant/home-assistant/pull/24236 +[#24238]: https://github.com/home-assistant/home-assistant/pull/24238 +[#24252]: https://github.com/home-assistant/home-assistant/pull/24252 +[#24256]: https://github.com/home-assistant/home-assistant/pull/24256 +[#24264]: https://github.com/home-assistant/home-assistant/pull/24264 +[#24266]: https://github.com/home-assistant/home-assistant/pull/24266 +[#24268]: https://github.com/home-assistant/home-assistant/pull/24268 +[#24278]: https://github.com/home-assistant/home-assistant/pull/24278 +[#24283]: https://github.com/home-assistant/home-assistant/pull/24283 +[#24284]: https://github.com/home-assistant/home-assistant/pull/24284 [@Adminiuga]: https://github.com/Adminiuga [@BKPepe]: https://github.com/BKPepe [@Bouni]: https://github.com/Bouni @@ -414,10 +499,12 @@ Experiencing issues introduced by this release? Please report them in our [issue [@outadoc]: https://github.com/outadoc [@p0l0]: https://github.com/p0l0 [@pavoni]: https://github.com/pavoni +[@piitaya]: https://github.com/piitaya [@pszafer]: https://github.com/pszafer [@pvizeli]: https://github.com/pvizeli [@robbiet480]: https://github.com/robbiet480 [@rutkai]: https://github.com/rutkai +[@rytilahti]: https://github.com/rytilahti [@sander76]: https://github.com/sander76 [@scop]: https://github.com/scop [@simse]: https://github.com/simse @@ -426,6 +513,7 @@ Experiencing issues introduced by this release? Please report them in our [issue [@stbenjam]: https://github.com/stbenjam [@techfreek]: https://github.com/techfreek [@terual]: https://github.com/terual +[@therve]: https://github.com/therve [@ties]: https://github.com/ties [@tkjacobsen]: https://github.com/tkjacobsen [@wickerwaka]: https://github.com/wickerwaka @@ -452,11 +540,13 @@ Experiencing issues introduced by this release? Please report them in our [issue [emulated_hue docs]: /components/emulated_hue/ [enphase_envoy docs]: /components/enphase_envoy/ [esphome docs]: /components/esphome/ +[fitbit docs]: /components/fitbit/ [frontend docs]: /components/frontend/ [geniushub docs]: /components/geniushub/ [geofency docs]: /components/geofency/ [google_assistant docs]: /components/google_assistant/ [gpslogger docs]: /components/gpslogger/ +[hassio docs]: /components/hassio/ [heos docs]: /components/heos/ [homekit_controller docs]: /components/homekit_controller/ [homematic docs]: /components/homematic/ @@ -470,6 +560,7 @@ Experiencing issues introduced by this release? Please report them in our [issue [iqvia docs]: /components/iqvia/ [keenetic_ndms2 docs]: /components/keenetic_ndms2/ [lcn docs]: /components/lcn/ +[lifx docs]: /components/lifx/ [locative docs]: /components/locative/ [loopenergy docs]: /components/loopenergy/ [lovelace docs]: /components/lovelace/ @@ -501,6 +592,7 @@ Experiencing issues introduced by this release? Please report them in our [issue [switcher_kis docs]: /components/switcher_kis/ [synology_srm docs]: /components/synology_srm/ [tautulli docs]: /components/tautulli/ +[tplink docs]: /components/tplink/ [tradfri docs]: /components/tradfri/ [vasttrafik docs]: /components/vasttrafik/ [venstar docs]: /components/venstar/ From bd1fcf5e1ba99ebcfc482a274116290a31336da6 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 4 Jun 2019 08:45:36 -0700 Subject: [PATCH 052/123] Add video --- source/_posts/2019-06-05-release-94.markdown | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/source/_posts/2019-06-05-release-94.markdown b/source/_posts/2019-06-05-release-94.markdown index 83036bd80c6..6082acabf5d 100644 --- a/source/_posts/2019-06-05-release-94.markdown +++ b/source/_posts/2019-06-05-release-94.markdown @@ -15,8 +15,9 @@ og_image: /images/blog/2019-06-release-94/google-ui.png It is time for the 0.94 release and there is some seriously good stuff in this release. We're working hard on polishing everything and getting ready for the big Home Assistant 1.0 release. And we're getting closer. So close actually, that this is the first release that can be installed and configured without touching a text editor! Onboard, configure integrations, manage automations and scripts all from the UI. - +
+ +
This milestone has been achieved thanks to the hard work by [@emontnemery] who contributed the ability to store the core config in storage: name, location, unit system, time zone. We still allow users to store their core configuration in `configuration.yaml`, which will take precedent when defined. This means that it is a non-breaking change. Core config is now set during onboarding and can be edited in the general page of the config panel. From c1d94387f21ac31bccba8f82026ed83ddb2ab6d4 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 4 Jun 2019 10:07:32 -0700 Subject: [PATCH 053/123] Add what we discover --- source/_posts/2019-06-05-release-94.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_posts/2019-06-05-release-94.markdown b/source/_posts/2019-06-05-release-94.markdown index 6082acabf5d..50194723497 100644 --- a/source/_posts/2019-06-05-release-94.markdown +++ b/source/_posts/2019-06-05-release-94.markdown @@ -32,7 +32,7 @@ Screenshot of the new user interface to manage which entities are exposed to Goo ## {% linkable_title Discovery %} -Discovery has been mordernized thanks to [@Kane610] and with the input from [@Jc2k]. Each integration is now able to specify how they can be discovered in their manifest, and the new `zeroconf` and `ssdp` integrations will do the rest. The new discovery is non-obtrusive: no devices are set up without approval by the user. Instead, you will need to approve each discovered integration. You can find them in the discovered section of the integrations page in the config. Only a handful of integrations have been migrated to the new approach in this release. +Discovery has been mordernized thanks to [@Kane610] and with the input from [@Jc2k]. Each integration is now able to specify how they can be discovered in their manifest, and the new `zeroconf` and `ssdp` integrations will do the rest. The new discovery is non-obtrusive: no devices are set up without approval by the user. Instead, you will need to approve each discovered integration. You can find them in the discovered section of the integrations page in the config. Only a handful of integrations have been migrated to the new approach in this release: Hue, LIFX, Deconz, Trådfri, Axis, ESPHome, HomeKit Controller. The new discovery is now part of the default config. If you are not using the default config, add `ssdp:` and `zeroconf:` to your configuration.yaml. From 1a6eaac77fa051acfccb1ae052de9987e71731d6 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 4 Jun 2019 10:11:52 -0700 Subject: [PATCH 054/123] Update text --- source/_posts/2019-06-05-release-94.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_posts/2019-06-05-release-94.markdown b/source/_posts/2019-06-05-release-94.markdown index 50194723497..ead6ddcb228 100644 --- a/source/_posts/2019-06-05-release-94.markdown +++ b/source/_posts/2019-06-05-release-94.markdown @@ -50,11 +50,11 @@ These integrations will no longer use `known_devices.yaml` but instead use entit ## {% linkable_title Improved hass.io builds %} -We have been working hard on improving Hass.io builds. A build can now be online in as little as 30 minutes after a new release has been tagged. This is thanks to a new wheel-based infrastructure build by [@pvizeli] with input from [@frenck]. With Python wheels, we will build all the requirements of integrations ahead of time, and only download them to your hass.io installation when you update your Home Assistant version. +We have been working hard on improving Hass.io builds. It's our goal to make the update process faster and more predictable. A build can now be online in as little as 30 minutes after a new release has been tagged. This is thanks to a new wheel-based infrastructure build by [@pvizeli] with input from [@frenck]. With Python wheels, we will build all the requirements of integrations ahead of time, and only download them to your hass.io installation when you update your Home Assistant version. This means that Home Assistant will use less space as we only download the things that are needed. We changed how packages are installed when running Home Assistant inside a Docker container. It will now install the packages into the Python environment inside the container, instead of storing them in the `deps` folder inside your config folder which lived outside the container. -**Note:** Because of the new way packages are installed, Home Assistant will take longer to start the first time it is launched after an upgrade. Don't worry and let it finish! We are working on making this process faster in the future. +**Note:** Because of the new way packages are installed, Home Assistant on Hass.io will take longer to start the first time it is launched after an upgrade. Don't worry and let it finish! We are working on making this process faster in the future. **Note 2:** If you are using Hass.io or a dockerized version of Home Assistant, this release will one time clear the `deps` folder in your config folder. From 4c112c6652cea9e2a8e935692bfc5c56d9dd9d97 Mon Sep 17 00:00:00 2001 From: Barrysv <35910877+Barrysv@users.noreply.github.com> Date: Wed, 5 Jun 2019 03:31:20 +0800 Subject: [PATCH 055/123] Fix ipv6 issue with Nginx not redirecting to ipv4 instance of Hass (#9550) In the Nginx config rather than specifying localhost:8123 use 127.0.0.1:8123 so this will ensure incoming IPv6 requests get redirected to Hass on IPv4. "localhost:8123" means Nginx will try to connect to Hass using the same protocol that came in - and Hass doesn't do dual stack at present --- source/_docs/ecosystem/nginx.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_docs/ecosystem/nginx.markdown b/source/_docs/ecosystem/nginx.markdown index 4f4fcfa4a24..f627b9584db 100644 --- a/source/_docs/ecosystem/nginx.markdown +++ b/source/_docs/ecosystem/nginx.markdown @@ -145,7 +145,7 @@ server { proxy_buffering off; location / { - proxy_pass http://localhost:8123; + proxy_pass http://127.0.0.1:8123; proxy_set_header Host $host; proxy_redirect http:// https://; proxy_http_version 1.1; From 456add7392dded53fb5d73cea0d8b51d847cc7e9 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Tue, 4 Jun 2019 23:27:12 +0200 Subject: [PATCH 056/123] Correct misspelled install (#9565) (#9566) --- source/hassio/installation.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/hassio/installation.markdown b/source/hassio/installation.markdown index 2ff644bea37..112653f51bd 100644 --- a/source/hassio/installation.markdown +++ b/source/hassio/installation.markdown @@ -144,7 +144,7 @@ $ sudo -i # curl -fsSL get.docker.com | sh ``` -And to intall Hass.io the one below. That one is used also for other distributions. +And to install Hass.io the one below. That one is used also for other distributions. ```bash # curl -sL "https://raw.githubusercontent.com/home-assistant/hassio-installer/master/hassio_install.sh" | bash -s From 722f580ea85aefd448bd826cc176603dae1e856a Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 4 Jun 2019 14:36:53 -0700 Subject: [PATCH 057/123] Update release notes + discovery docs --- source/_components/ssdp.markdown | 7 ++++++ source/_components/zeroconf.markdown | 26 ++++++-------------- source/_posts/2019-06-05-release-94.markdown | 22 +++++++++++++++-- 3 files changed, 34 insertions(+), 21 deletions(-) diff --git a/source/_components/ssdp.markdown b/source/_components/ssdp.markdown index 6d4f18519df..1a0fc4fb9b3 100644 --- a/source/_components/ssdp.markdown +++ b/source/_components/ssdp.markdown @@ -24,3 +24,10 @@ To integrate this into Home Assistant, add the following section to your `config # Example configuration.yaml entry ssdp: ``` + +## {% linkable_title Discovered Integrations %} + +The following integrations are automatically discovered by the SSDP integration: + + - Deconz + - Philips Hue diff --git a/source/_components/zeroconf.markdown b/source/_components/zeroconf.markdown index d8773c1f76f..96576ca901b 100644 --- a/source/_components/zeroconf.markdown +++ b/source/_components/zeroconf.markdown @@ -25,24 +25,12 @@ To integrate this into Home Assistant, add the following section to your `config zeroconf: ``` -The registration will include meta-data about the Home Assistant instance, including a base URL that can be used to access Home Assistant and the currently running Home Assistant version. The examples below show two ways to retrieve the details for testing. +## {% linkable_title Discovered Integrations %} -```bash -$ avahi-browse -alr -+ eth0 IPv4 Home _home-assistant._tcp local -= eth0 IPv4 Home _home-assistant._tcp local - hostname = [Home._home-assistant._tcp.local] - address = [192.168.0.70] - port = [8123] - txt = ["base_url=http://192.168.0.70:8123" "requires_api_password=true" "version=0.41.0"] -``` +The following integrations are automatically discovered by the SSDP integration: -```bash -$ avahi-discover -Browsing domain 'local' on -1.-1 ... -Browsing for services of type '_home-assistant._tcp' in domain 'local' on 4.0 ... -Found service 'Home' of type '_home-assistant._tcp' in domain 'local' on 4.0. -Service data for service 'Home' of type '_home-assistant._tcp' in domain 'local' on 4.0: - Host Home._home-assistant._tcp.local (192.168.0.70), port 8123, TXT data: -['requires_api_password=true', 'base_url=http://192.168.0.70:8123', 'version=0.41.0'] -``` + - Axis + - ESPHome + - HomeKit Controller + - LIFX + - Trådfri diff --git a/source/_posts/2019-06-05-release-94.markdown b/source/_posts/2019-06-05-release-94.markdown index ead6ddcb228..6b2d0b113c2 100644 --- a/source/_posts/2019-06-05-release-94.markdown +++ b/source/_posts/2019-06-05-release-94.markdown @@ -50,9 +50,9 @@ These integrations will no longer use `known_devices.yaml` but instead use entit ## {% linkable_title Improved hass.io builds %} -We have been working hard on improving Hass.io builds. It's our goal to make the update process faster and more predictable. A build can now be online in as little as 30 minutes after a new release has been tagged. This is thanks to a new wheel-based infrastructure build by [@pvizeli] with input from [@frenck]. With Python wheels, we will build all the requirements of integrations ahead of time, and only download them to your hass.io installation when you update your Home Assistant version. This means that Home Assistant will use less space as we only download the things that are needed. +We have been working hard on improving Hass.io builds. It's our goal to make the update process faster and more predictable. A build can now be online in as little as 30 minutes after a new release has been tagged. This is thanks to a new wheel-based infrastructure build by [@pvizeli] with input from [@frenck]. With Python wheels, we will build all the requirements of integrations ahead of time, and so a new version of Home Assistant is now just putting pieces together. -We changed how packages are installed when running Home Assistant inside a Docker container. It will now install the packages into the Python environment inside the container, instead of storing them in the `deps` folder inside your config folder which lived outside the container. +Because of this, we changed how packages are installed when running Home Assistant inside a Docker container. It will now install the packages into the Python environment inside the container, instead of storing them in the `config/deps` folder, which lived outside the container. **Note:** Because of the new way packages are installed, Home Assistant on Hass.io will take longer to start the first time it is launched after an upgrade. Don't worry and let it finish! We are working on making this process faster in the future. @@ -127,6 +127,12 @@ Experiencing issues introduced by this release? Please report them in our [issue - Bump aioesphomeapi to 2.1.0 ([@OttoWinter] - [#24278]) ([esphome docs]) (beta fix) - Fix cors on the index view ([@balloob] - [#24283]) ([http docs]) (beta fix) - Remove deps folder in config when on Docker ([@balloob] - [#24284]) (beta fix) +- Guard against bad states in Mobile App/OwnTracks ([@balloob] - [#24292]) ([mobile_app docs]) ([owntracks docs]) (beta fix) +- Create progress file for pip installs ([@pvizeli] - [#24297]) (beta fix) +- Run SSDP discovery in parallel ([@balloob] - [#24299]) ([ssdp docs]) (beta fix) +- Upgrade Zeroconf to 0.23 ([@balloob] - [#24300]) ([zeroconf docs]) (beta fix) +- address is deprecated in favor of addresses ([@Kane610] - [#24302]) ([zeroconf docs]) (beta fix) +- Fix OwnTracks race condition ([@balloob] - [#24303]) ([owntracks docs]) (beta fix) ## {% linkable_title All changes %} @@ -293,6 +299,12 @@ Experiencing issues introduced by this release? Please report them in our [issue - Bump aioesphomeapi to 2.1.0 ([@OttoWinter] - [#24278]) ([esphome docs]) (beta fix) - Fix cors on the index view ([@balloob] - [#24283]) ([http docs]) (beta fix) - Remove deps folder in config when on Docker ([@balloob] - [#24284]) (beta fix) +- Guard against bad states in Mobile App/OwnTracks ([@balloob] - [#24292]) ([mobile_app docs]) ([owntracks docs]) (beta fix) +- Create progress file for pip installs ([@pvizeli] - [#24297]) (beta fix) +- Run SSDP discovery in parallel ([@balloob] - [#24299]) ([ssdp docs]) (beta fix) +- Upgrade Zeroconf to 0.23 ([@balloob] - [#24300]) ([zeroconf docs]) (beta fix) +- address is deprecated in favor of addresses ([@Kane610] - [#24302]) ([zeroconf docs]) (beta fix) +- Fix OwnTracks race condition ([@balloob] - [#24303]) ([owntracks docs]) (beta fix) [#21225]: https://github.com/home-assistant/home-assistant/pull/21225 [#21658]: https://github.com/home-assistant/home-assistant/pull/21658 @@ -457,6 +469,12 @@ Experiencing issues introduced by this release? Please report them in our [issue [#24278]: https://github.com/home-assistant/home-assistant/pull/24278 [#24283]: https://github.com/home-assistant/home-assistant/pull/24283 [#24284]: https://github.com/home-assistant/home-assistant/pull/24284 +[#24292]: https://github.com/home-assistant/home-assistant/pull/24292 +[#24297]: https://github.com/home-assistant/home-assistant/pull/24297 +[#24299]: https://github.com/home-assistant/home-assistant/pull/24299 +[#24300]: https://github.com/home-assistant/home-assistant/pull/24300 +[#24302]: https://github.com/home-assistant/home-assistant/pull/24302 +[#24303]: https://github.com/home-assistant/home-assistant/pull/24303 [@Adminiuga]: https://github.com/Adminiuga [@BKPepe]: https://github.com/BKPepe [@Bouni]: https://github.com/Bouni From c1c1141f95fde4d7aef65f628a2c1e764f189689 Mon Sep 17 00:00:00 2001 From: cogneato Date: Wed, 5 Jun 2019 01:25:52 -0600 Subject: [PATCH 058/123] breaking change descriptions added breaking change descriptions --- source/_posts/2019-06-05-release-94.markdown | 40 +++++++++++++++----- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/source/_posts/2019-06-05-release-94.markdown b/source/_posts/2019-06-05-release-94.markdown index 6b2d0b113c2..994eba2889a 100644 --- a/source/_posts/2019-06-05-release-94.markdown +++ b/source/_posts/2019-06-05-release-94.markdown @@ -88,15 +88,37 @@ Experiencing issues introduced by this release? Please report them in our [issue ## {% linkable_title Breaking Changes %} -- Quiet the chatty sun.sun ([@Swamp-Ig] - [#23832]) ([sun docs]) (breaking change) -- Doorbird Refactor ([@oblogic7] - [#23892]) ([doorbird docs]) (breaking change) -- Always update all Plex client types ([@jjlawren] - [#24038]) ([plex docs]) (breaking change) -- Fix entity id naming when not using first install ([@tkjacobsen] - [#23606]) ([verisure docs]) (breaking change) -- Update the name of Zestimate sensors ([@dreed47] - [#23770]) ([zestimate docs]) (breaking change) -- Remove custom entity_id naming ([@jjlawren] - [#24072]) ([plex docs]) (breaking change) -- Deprecate Python 3.5.3 ([@balloob] - [#24177]) (breaking change) -- Dynamic panels ([@balloob] - [#24184]) (breaking change) (beta fix) -- add a deprecation warning for tplink device_tracker ([@rytilahti] - [#24236]) ([tplink docs]) (breaking change) (beta fix) +- __Sun__ - Inspired by a [reddit](https://www.reddit.com/r/homeassistant/comments/bm62hl/sunsun_chatty_sensor_psa/) report, the sun.sun sensor has been tuned so that it doesn't update nearly as frequently. Previously the sun.sun sensor was updating every 30 seconds, day and night. Now it updates dependent on the solar elevation. This could possibly be a breaking change for some users as it updates less frequently. ([@Swamp-Ig] - [#23832]) ([sun docs]) +- __Doorbird__ -_Refactored_- This change cleans up the code for the component quite a bit. Schedule manipulation has been removed and HTTP views have been consolidated. The configuration changes should result in an overall easier experience for setting up a Doorbird in HA and allow for new Doorbird events to be utilized without having to update the component as often. No changes for switches or camera integrations of this component. ([@oblogic7] - [#23892]) ([doorbird docs]) + + Example configuration: + ``` + doorbird: + devices: + - host: 10.10.10.10 + token: 12345678abcd + name: Side Entry + username: abcd1234 + password: abcd4321 + events: + - button_1 + - unit_1_button + - movement + - relay_1 + - lock_relay + ``` + + - __Plex__ + * Configuration option `include_non_clients` has been removed. The component was unnecessarily complicated with separate update methods for Plex devices and Plex sessions. This change always updates all known Plex clients regardless of type. The previous design also had issues where the Plex sessions are never polled if there are no Plex clients connected at startup and only 'session' client types connect after that point. This leads to a failure to discover new devices. This is a breaking change if the config option `include_non_clients` is being used since it has been removed. ([@jjlawren] - [#24038]) ([plex docs]) + + * Configuration options use_custom_entity_ids and entity_namespace have been removed. This change will prepend the display name (and therefore the default entity_id) of each newly created entity with 'Plex' for easy identification. Users may customize each display name and entity_id as desired via the Entity Registry. Entities created before this PR will not be affected as the unique_id remains the same. ([@jjlawren] - [#24072]) ([plex docs]) + +- __Verisure__ - Base entity_id of alarm_control_panel on alias of installation set by giid rather than first installation. This is a breaking change as it will change entity_id of alarm_control_panel in cases where a user is configuring an installation using giid that is not the first installation. ([@tkjacobsen] - [#23606]) ([verisure docs]) +- __Zestimate__ - Changed name property to return Zestimate and the property address. This will make it easier to distinguish multiple Zestimate sensor entities in the UI and is a breaking change as it will change entity_id of Zestimate sensors. If you have automations relying on your Zestimate sensor(s) you may need to revisit them to fix the ID's to the new ones. Also, you may need to update your Zestimate sensor(s) in your Lovelace UI. ([@dreed47] - [#23770]) ([zestimate docs]) + +- __Python__ - _Deprecation_ - Python 3.5.3 support will be removed in the first release after August 1, 2019. This release will print a warning if a soon to be unsupported Python version is used. A notification will be present if Home Assistant is run under 3.6.0. ([@balloob] - [#24177]) +- __Async__ - _Developers only_ - `hass.components.frontend.async_register_built_in_panel` is no longer an async function. This allows removing panels form the frontend on the fly, and fires and event when panels are added/removed so the frontend knows when to reload. ([@balloob] - [#24184]) +- __TP-Link__ - _Distress Signal_ - Add a deprecation warning for tplink device_tracker ([@rytilahti] - [#24236]) ([tplink docs]) ## {% linkable_title Beta Fixes %} From a208eb48c5bbec1ab42ceda7e6661790baf97007 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 5 Jun 2019 20:52:30 +0200 Subject: [PATCH 059/123] =?UTF-8?q?=F0=9F=9A=91=20Added=20release=20blog?= =?UTF-8?q?=20post=20title=20&=20description=20(#9569)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/_posts/2019-06-05-release-94.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_posts/2019-06-05-release-94.markdown b/source/_posts/2019-06-05-release-94.markdown index 994eba2889a..82f6bac8cb3 100644 --- a/source/_posts/2019-06-05-release-94.markdown +++ b/source/_posts/2019-06-05-release-94.markdown @@ -1,7 +1,7 @@ --- layout: post -title: "0.94: TBD - update date" -description: "TO DO." +title: "0.94: SmartHab, Watson TTS, Azure Event Hub" +description: "Onboarding: This is the first release that can be installed and configured without touching a text editor!" date: 2019-05-29 04:11:03 date_formatted: "June 5, 2019" author: Paulus Schoutsen From 2650c64d8b26d80d0d9b906654ab849a6710d1f7 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 5 Jun 2019 12:26:17 -0700 Subject: [PATCH 060/123] Update date --- source/_posts/2019-06-05-release-94.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/_posts/2019-06-05-release-94.markdown b/source/_posts/2019-06-05-release-94.markdown index 82f6bac8cb3..b6afeddd865 100644 --- a/source/_posts/2019-06-05-release-94.markdown +++ b/source/_posts/2019-06-05-release-94.markdown @@ -2,7 +2,7 @@ layout: post title: "0.94: SmartHab, Watson TTS, Azure Event Hub" description: "Onboarding: This is the first release that can be installed and configured without touching a text editor!" -date: 2019-05-29 04:11:03 +date: 2019-06-04 04:11:03 date_formatted: "June 5, 2019" author: Paulus Schoutsen author_twitter: balloob @@ -107,10 +107,10 @@ Experiencing issues introduced by this release? Please report them in our [issue - relay_1 - lock_relay ``` - + - __Plex__ * Configuration option `include_non_clients` has been removed. The component was unnecessarily complicated with separate update methods for Plex devices and Plex sessions. This change always updates all known Plex clients regardless of type. The previous design also had issues where the Plex sessions are never polled if there are no Plex clients connected at startup and only 'session' client types connect after that point. This leads to a failure to discover new devices. This is a breaking change if the config option `include_non_clients` is being used since it has been removed. ([@jjlawren] - [#24038]) ([plex docs]) - + * Configuration options use_custom_entity_ids and entity_namespace have been removed. This change will prepend the display name (and therefore the default entity_id) of each newly created entity with 'Plex' for easy identification. Users may customize each display name and entity_id as desired via the Entity Registry. Entities created before this PR will not be affected as the unique_id remains the same. ([@jjlawren] - [#24072]) ([plex docs]) - __Verisure__ - Base entity_id of alarm_control_panel on alias of installation set by giid rather than first installation. This is a breaking change as it will change entity_id of alarm_control_panel in cases where a user is configuring an installation using giid that is not the first installation. ([@tkjacobsen] - [#23606]) ([verisure docs]) From 94f136469f37016f5fe10c65636ea8d692829454 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 5 Jun 2019 12:29:09 -0700 Subject: [PATCH 061/123] Update june 5 --- source/_posts/2019-06-05-release-94.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_posts/2019-06-05-release-94.markdown b/source/_posts/2019-06-05-release-94.markdown index b6afeddd865..e9f7dbdb9e8 100644 --- a/source/_posts/2019-06-05-release-94.markdown +++ b/source/_posts/2019-06-05-release-94.markdown @@ -2,7 +2,7 @@ layout: post title: "0.94: SmartHab, Watson TTS, Azure Event Hub" description: "Onboarding: This is the first release that can be installed and configured without touching a text editor!" -date: 2019-06-04 04:11:03 +date: 2019-06-05 04:11:03 date_formatted: "June 5, 2019" author: Paulus Schoutsen author_twitter: balloob From d39783c360871323c4a75b1240a706b04b8f4a38 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 5 Jun 2019 16:11:14 -0700 Subject: [PATCH 062/123] Add redirect for old blog url --- source/_posts/2019-06-05-release-94.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_posts/2019-06-05-release-94.markdown b/source/_posts/2019-06-05-release-94.markdown index e9f7dbdb9e8..21228e36304 100644 --- a/source/_posts/2019-06-05-release-94.markdown +++ b/source/_posts/2019-06-05-release-94.markdown @@ -9,6 +9,7 @@ author_twitter: balloob comments: true categories: Release-Notes og_image: /images/blog/2019-06-release-94/google-ui.png +redirect_from: /blog/2019/05/29/release-94/ --- From ae4b174aeb7fb37f0d2c16b5c3487b5c1b191aad Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Thu, 6 Jun 2019 17:58:31 +0200 Subject: [PATCH 063/123] Remote rpi gpio: address -> host (#9575) --- source/_components/remote_rpi_gpio.markdown | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/source/_components/remote_rpi_gpio.markdown b/source/_components/remote_rpi_gpio.markdown index 50f75828065..a4ee49f14b8 100644 --- a/source/_components/remote_rpi_gpio.markdown +++ b/source/_components/remote_rpi_gpio.markdown @@ -28,20 +28,20 @@ To use your Remote Raspberry Pi's GPIO in your installation, add the following t # Example configuration.yaml entry binary_sensor: - platform: remote_rpi_gpio - address:
+ host:
ports: 11: PIR Office 12: PIR Bedroom switch: - platform: remote_rpi_gpio - address:
+ host:
ports: 4: Garage Relay ``` {% configuration %} -address: +host: description: IP Address of remote Raspberry Pi required: true type: string @@ -81,14 +81,14 @@ To use your Remote Raspberry Pi's GPIO in your installation, add the following t # Example configuration.yaml entry switch: - platform: remote_rpi_gpio - address: 192.168.0.123 + host: 192.168.0.123 ports: 11: Fan Office 12: Light Desk ``` {% configuration %} -address: +host: description: IP Address of remote Raspberry Pi required: true type: string @@ -121,7 +121,7 @@ For example, if you have a relay connected to pin 11 its GPIO # is 17. # Example configuration.yaml entry switch: - platform: remote_rpi_gpio - address: 192.168.0.123 + host: 192.168.0.123 ports: 17: Speaker Relay ``` From 51260d8568d44f508670b8a59878c4d58553349a Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Thu, 6 Jun 2019 18:01:27 +0200 Subject: [PATCH 064/123] Minor changes (remove dupl. content, periods, etc.) --- source/_components/remote_rpi_gpio.markdown | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/source/_components/remote_rpi_gpio.markdown b/source/_components/remote_rpi_gpio.markdown index a4ee49f14b8..8ae40a89946 100644 --- a/source/_components/remote_rpi_gpio.markdown +++ b/source/_components/remote_rpi_gpio.markdown @@ -16,7 +16,7 @@ ha_release: 0.94 ha_iot_class: Local Push --- -The `rpi_gpio` component is the base for all related GPIO platforms in Home Assistant. There is no setup needed for the component itself, for the platforms please check their corresponding pages. +The `rpi_gpio` component is the base for all related GPIO platforms in Home Assistant. There is no setup needed for the component itself, for the platforms please check their corresponding sections. ## {% linkable_title Binary Sensor %} @@ -28,21 +28,15 @@ To use your Remote Raspberry Pi's GPIO in your installation, add the following t # Example configuration.yaml entry binary_sensor: - platform: remote_rpi_gpio - host:
+ host: IP_ADDRESS_OF_REMOTE_PI ports: 11: PIR Office 12: PIR Bedroom - -switch: - - platform: remote_rpi_gpio - host:
- ports: - 4: Garage Relay ``` {% configuration %} host: - description: IP Address of remote Raspberry Pi + description: IP Address of remote Raspberry Pi. required: true type: string ports: @@ -81,7 +75,7 @@ To use your Remote Raspberry Pi's GPIO in your installation, add the following t # Example configuration.yaml entry switch: - platform: remote_rpi_gpio - host: 192.168.0.123 + host: IP_ADDRESS_OF_REMOTE_PI ports: 11: Fan Office 12: Light Desk @@ -89,7 +83,7 @@ switch: {% configuration %} host: - description: IP Address of remote Raspberry Pi + description: IP Address of remote Raspberry Pi. required: true type: string ports: @@ -114,7 +108,7 @@ For more details about the GPIO layout, visit the Wikipedia [article](https://en Note that a pin managed by HASS is expected to be exclusive to HASS.

-A common question is what does Port refer to, this number is the actual GPIO #, not the pin #. +A common question is what does port refer to, this number is the actual GPIO #, not the pin #. For example, if you have a relay connected to pin 11 its GPIO # is 17. ```yaml From b79a7c2181f1fbc57a4dba6e5fb2a6fd7fb531f0 Mon Sep 17 00:00:00 2001 From: Adriaan Peeters Date: Thu, 6 Jun 2019 18:02:15 +0200 Subject: [PATCH 065/123] Correct copy/paste error (#9574) --- source/_components/zeroconf.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/zeroconf.markdown b/source/_components/zeroconf.markdown index 96576ca901b..151eb4d19f4 100644 --- a/source/_components/zeroconf.markdown +++ b/source/_components/zeroconf.markdown @@ -27,7 +27,7 @@ zeroconf: ## {% linkable_title Discovered Integrations %} -The following integrations are automatically discovered by the SSDP integration: +The following integrations are automatically discovered by the Zeroconf integration: - Axis - ESPHome From 69023ebd5eacceb1fef1184f1aeef4ee25fa32a9 Mon Sep 17 00:00:00 2001 From: DubhAd Date: Fri, 7 Jun 2019 09:04:18 +0100 Subject: [PATCH 066/123] Bumping Python (#9579) Since we'll shortly be dropping 3.5, time to tell people to use at least 3.6 --- source/_docs/installation/raspberry-pi.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_docs/installation/raspberry-pi.markdown b/source/_docs/installation/raspberry-pi.markdown index a8a9c858923..b5b3780372c 100644 --- a/source/_docs/installation/raspberry-pi.markdown +++ b/source/_docs/installation/raspberry-pi.markdown @@ -12,7 +12,7 @@ redirect_from: /getting-started/installation-raspberry-pi/ This installation of Home Assistant requires the Raspberry Pi to run [Raspbian Lite](https://www.raspberrypi.org/downloads/raspbian/). The installation will be installed in a [Virtual Environment](/docs/installation/virtualenv) with minimal overhead. Instructions assume this is a new installation of Raspbian Lite. -You must have Python 3.5.3 or later installed (including the package `python3-dev`) which is the case for Raspbian Stretch. +You must have Python 3.6 or later installed (including the package `python3-dev`) which is *not* the case for Raspbian Stretch.

Although these installation steps specifically mention a Raspberry Pi, you can go ahead and proceed on any Linux install as well. This guide is also referred to as the "Advanced Guide" for a virtual environment install. From 58e9e086dfb1f5ed6af9efb6e823efcb3c3e1136 Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Fri, 7 Jun 2019 21:16:54 +0200 Subject: [PATCH 067/123] Add temperature sensor support to google smarthome (#9557) * Remove 'include_non_clients' config option * Remove scan interval config option * Remove naming config options * Oops, removed standard option * Remove entity_namespace, too * Add Repetier-Server component documentation (#9362) * Updated to newest developer version of Repetier platform * :pencil2: Tweak After this we will merge it * Added Repetier Logo file * Mention 'adb_response' attribute (#9529) * Mention 'adb_response' attribute * Add missing ' * Remove template braces * :pencil2: Tweak After this I will merge it * Add documentation for LCN service calls (#9516) * Add docs for LCN service calls * :pencil2: Tweak After this we can merge it * Adding Watson TTS (IBM Cloud) (#9279) * Adding Watson TTS (IBM Cloud) * Review fixes * :pencil2: Tweak * :pencil2: Tweak After this we can merge it * Created the Azure EH docs (#9462) * Created the Azure EH docs * Update release version Co-Authored-By: Klaas Schoute * :pencil2: Tweak After this we can merge it * Adds AdGuard Home integration (#9538) * Adds AdGuard Home integration * Update source/_components/adguard.markdown Co-Authored-By: Klaas Schoute * Update source/_components/adguard.markdown Co-Authored-By: Klaas Schoute * Add temperature sensor support to google smarthome --- source/_components/adguard.markdown | 117 +++++++++++++++++++ source/_components/google_assistant.markdown | 1 + source/images/supported_brands/adguard.png | Bin 0 -> 2818 bytes 3 files changed, 118 insertions(+) create mode 100644 source/_components/adguard.markdown create mode 100644 source/images/supported_brands/adguard.png diff --git a/source/_components/adguard.markdown b/source/_components/adguard.markdown new file mode 100644 index 00000000000..298351a35de --- /dev/null +++ b/source/_components/adguard.markdown @@ -0,0 +1,117 @@ +--- +layout: page +title: "AdGuard Home" +description: "Instructions on how to integrate AdGuard Home with Home Assistant." +date: 2019-05-31 00:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: adguard.png +ha_category: + - Network + - Sensor + - Switch +ha_release: 0.95 +ha_iot_class: Local Polling +--- + +AdGuard Home is a network-wide ad-and-tracker blocking DNS server with parental +control (adult content blocking) capabilities. The `adguard` integration allows +you to control and monitor your AdGuard Home instance in Home Assistant. + +## {% linkable_title Configuration via the frontend %} + +Menu: **Configuration** -> **Integrations**. + +Click on the `+` sign to add an integration and click on **AdGuard Home**. +Follow the configuration flow, after finishing, the AdGuard Home +integration will be available. + +## {% linkable_title Sensors %} + +This integration provides sensors for the following information from AdGuard Home: + +- Number of DNS queries. +- Number of blocked DNS queries. +- Ratio (%) of blocked DNS queries. +- Number of requests blocked by safe browsing. +- Number of safe searches enforced. +- Number of requests blocked by parental control. +- Total number of active filter rules loaded. +- Average response time of AdGuard's DNS server in milliseconds. + +## {% linkable_title Switches %} + +The integration will create a number of switches: + +- AdGuard Protection (master switch). +- Filtering. +- Safe Browsing. +- Parental Control. +- Safe Search. +- Query Log. + +These switches allow you to automate things easily. For example, one could +write an automation to turn off Safe Search after the kids' bedtime. + +The "AdGuard Protection" switch, is a master switch. It will turn off and +bypass all AdGuard feature, regardless if they are switched on or not. + +

+Turning off Query Log will result in all sensors not receiving updates anymore. +AdGuard relies on Query Log to provide stats. +

+ +## {% linkable_title Services %} + +These services allow one to manage filter subscriptions in AdGuard Home. +Using these services in automations could be helpful to block certain +sites/domains at certain times. + +For example, you could create a custom filter list blocking social media sites, +during the day and release them during the evening, using a simple automation. + +### {% linkable_title Service `add_url` %} + +Add a new filter subscription to AdGuard Home. + +| Service data attribute | Optional | Description | +| ---------------------- | -------- | ------------------------------------------------------------ | +| `name` | No | The name of the filter subscription. | +| `url` | No | The filter URL to subscribe to, containing the filter rules. | + +### {% linkable_title Service `remove_url` %} + +Removes a filter subscription from AdGuard Home. + +| Service data attribute | Optional | Description | +| ---------------------- | -------- | -------------------------------------- | +| `url` | No | The filter subscription URL to remove. | + +### {% linkable_title Service `enable_url` %} + +Enables a filter subscription in AdGuard Home. + +| Service data attribute | Optional | Description | +| ---------------------- | -------- | -------------------------------------- | +| `url` | No | The filter subscription URL to enable. | + +### {% linkable_title Service `disable_url` %} + +Disables a filter subscription in AdGuard Home. + +| Service data attribute | Optional | Description | +| ---------------------- | -------- | --------------------------------------- | +| `url` | No | The filter subscription URL to disable. | + +### {% linkable_title Service `refresh` %} + +Refresh all filter subscriptions in AdGuard Home. + +| Service data attribute | Optional | Description | +| ---------------------- | -------- | ------------------------------------------------- | +| `force` | Yes | Force update (bypasses AdGuard Home throttling). | + +By default, `force` is set to `false`. Forcing an update bypasses AdGuard Home's +throttling logic, so use with care. diff --git a/source/_components/google_assistant.markdown b/source/_components/google_assistant.markdown index 5f1c75b766f..498a9910ae3 100644 --- a/source/_components/google_assistant.markdown +++ b/source/_components/google_assistant.markdown @@ -193,6 +193,7 @@ Currently, the following domains are available to be used with Google Assistant, - media_player (on/off/set volume (via set brightness)/source (via set input source)) - climate (temperature setting, operation_mode) - vacuum (dock/start/stop/pause) +- sensor (temperature setting, only for temperature sensor)

The domain groups contains groups containing all items, by example group.all_automations. When telling Google Assistant to shut down everything, this will lead in this example to disabling all automations diff --git a/source/images/supported_brands/adguard.png b/source/images/supported_brands/adguard.png new file mode 100644 index 0000000000000000000000000000000000000000..6bfd89b7b663f1903f337a38fe1cc67cc05ff50d GIT binary patch literal 2818 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 Date: Fri, 7 Jun 2019 23:46:00 -0700 Subject: [PATCH 068/123] Release 94.1 --- _config.yml | 4 +- source/_posts/2019-06-05-release-94.markdown | 39 ++++++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/_config.yml b/_config.yml index 7cfd2697f1a..a85c157f2c3 100644 --- a/_config.yml +++ b/_config.yml @@ -139,8 +139,8 @@ social: # Home Assistant release details current_major_version: 0 current_minor_version: 94 -current_patch_version: 0 -date_released: 2019-06-05 +current_patch_version: 1 +date_released: 2019-06-07 # Either # or the anchor link to latest release notes in the blog post. # Must be prefixed with a # and have double quotes around it. diff --git a/source/_posts/2019-06-05-release-94.markdown b/source/_posts/2019-06-05-release-94.markdown index 21228e36304..a021ea084cc 100644 --- a/source/_posts/2019-06-05-release-94.markdown +++ b/source/_posts/2019-06-05-release-94.markdown @@ -79,6 +79,45 @@ Because of this, we changed how packages are installed when running Home Assista - Add geniushub sensor and binary_sensor ([@zxdavb] - [#23811]) ([geniushub docs]) (new-platform) - Mobile app to use device tracker config entry ([@balloob] - [#24238]) ([mobile_app docs]) (beta fix) (new-platform) +## {% linkable_title Release 0.94.1 - June 7 %} + +- Add a discovery config flow to Wemo ([@balloob] - [#24208]) ([discovery docs]) ([wemo docs]) +- Initiate websession inside event loop ([@balloob] - [#24331]) ([tado docs]) +- Bump dependency ([@Kane610] - [#24376]) ([axis docs]) +- Updated pubnubsub-handler to 1.0.7 to fix crash on slow startup ([@w1ll1am23] - [#24388]) ([wink docs]) +- Fix automation failing to restore state ([@balloob] - [#24390]) ([automation docs]) +- Add more HomeKit models for discovery ([@balloob] - [#24391]) ([homekit_controller docs]) ([hue docs]) ([tradfri docs]) ([wemo docs]) +- Check cloud trusted proxies ([@balloob] - [#24395]) ([cloud docs]) ([http docs]) +- Fix for sun issues ([@Swamp-Ig] - [#24309]) ([sun docs]) +- deCONZ - properly identify configured bridge ([@Kane610] - [#24378]) ([deconz docs]) + +[#24208]: https://github.com/home-assistant/home-assistant/pull/24208 +[#24309]: https://github.com/home-assistant/home-assistant/pull/24309 +[#24331]: https://github.com/home-assistant/home-assistant/pull/24331 +[#24376]: https://github.com/home-assistant/home-assistant/pull/24376 +[#24378]: https://github.com/home-assistant/home-assistant/pull/24378 +[#24388]: https://github.com/home-assistant/home-assistant/pull/24388 +[#24390]: https://github.com/home-assistant/home-assistant/pull/24390 +[#24391]: https://github.com/home-assistant/home-assistant/pull/24391 +[#24395]: https://github.com/home-assistant/home-assistant/pull/24395 +[@Kane610]: https://github.com/Kane610 +[@Swamp-Ig]: https://github.com/Swamp-Ig +[@balloob]: https://github.com/balloob +[@w1ll1am23]: https://github.com/w1ll1am23 +[automation docs]: /components/automation/ +[axis docs]: /components/axis/ +[cloud docs]: /components/cloud/ +[deconz docs]: /components/deconz/ +[discovery docs]: /components/discovery/ +[homekit_controller docs]: /components/homekit_controller/ +[http docs]: /components/http/ +[hue docs]: /components/hue/ +[sun docs]: /components/sun/ +[tado docs]: /components/tado/ +[tradfri docs]: /components/tradfri/ +[wemo docs]: /components/wemo/ +[wink docs]: /components/wink/ + ## {% linkable_title If you need help... %} ...don't hesitate to use our very active [forums](https://community.home-assistant.io/) or join us for a little [chat](https://discord.gg/c5DvZ4e). The release notes have comments enabled but it's preferred if you use the former communication channels. Thanks. From f1a4cb1f0ddf51ca3536ee38f8e2b98d5bcfd0c5 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sat, 8 Jun 2019 00:26:36 -0700 Subject: [PATCH 069/123] Typo --- source/_posts/2019-06-05-release-94.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_posts/2019-06-05-release-94.markdown b/source/_posts/2019-06-05-release-94.markdown index a021ea084cc..752132a13b1 100644 --- a/source/_posts/2019-06-05-release-94.markdown +++ b/source/_posts/2019-06-05-release-94.markdown @@ -33,7 +33,7 @@ Screenshot of the new user interface to manage which entities are exposed to Goo ## {% linkable_title Discovery %} -Discovery has been mordernized thanks to [@Kane610] and with the input from [@Jc2k]. Each integration is now able to specify how they can be discovered in their manifest, and the new `zeroconf` and `ssdp` integrations will do the rest. The new discovery is non-obtrusive: no devices are set up without approval by the user. Instead, you will need to approve each discovered integration. You can find them in the discovered section of the integrations page in the config. Only a handful of integrations have been migrated to the new approach in this release: Hue, LIFX, Deconz, Trådfri, Axis, ESPHome, HomeKit Controller. +Discovery has been modernized thanks to [@Kane610] and with the input from [@Jc2k]. Each integration is now able to specify how they can be discovered in their manifest, and the new `zeroconf` and `ssdp` integrations will do the rest. The new discovery is non-obtrusive: no devices are set up without approval by the user. Instead, you will need to approve each discovered integration. You can find them in the discovered section of the integrations page in the config. Only a handful of integrations have been migrated to the new approach in this release: Hue, LIFX, Deconz, Trådfri, Axis, ESPHome, HomeKit Controller. The new discovery is now part of the default config. If you are not using the default config, add `ssdp:` and `zeroconf:` to your configuration.yaml. From 574542a549992df698e5d69cade48c30c1525d10 Mon Sep 17 00:00:00 2001 From: Michael Lunzer Date: Sat, 8 Jun 2019 02:40:36 -0700 Subject: [PATCH 070/123] Update apcupsd.markdown (#9564) * Update apcupsd.markdown Three Changes: 1. I added a link to the unofficial hass.io plugin which is required to use this component with hass.io. (maybe we can add it to the community repository?) 2. I copied the values as-is (in all caps) and it caused a configuration error. This is just a quick edit to clarify the instructions and state that the listed resources should be lower case. 3. I also added a full example configuration that users can just copy & paste. * Minor changes * Fix title --- source/_components/apcupsd.markdown | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/source/_components/apcupsd.markdown b/source/_components/apcupsd.markdown index b341b1b8168..24ba1f4e0fb 100644 --- a/source/_components/apcupsd.markdown +++ b/source/_components/apcupsd.markdown @@ -26,6 +26,12 @@ There is currently support for the following device types within Home Assistant: - [Binary Sensor](#binary-sensor) - [Sensor](#sensor) +## {% linkable_title Hass.io Installation %} + +Install this [unofficial add-on](https://github.com/korylprince/hassio-apcupsd/) to use this integration with Hass.io. Keep in mind that we can't give you support for this add-on. + +After installation, follow the instructions on the Github page to configure the plugin. Then continue to follow the integration configurations below. + ## {% linkable_title Configuration %} To enable this sensor, add the following lines to your `configuration.yaml`: @@ -127,13 +133,33 @@ OUTPUTV : 218.4 Volts [...] ``` -Use the (case insensitive) values from the left hand column: +Use the values from the left hand column (lower case required). + +Full Example Configuration: ```yaml sensor: - platform: apcupsd resources: + - apc + - date + - hostname + - version + - upsname + - cable + - driver + - upsmode + - starttime + - model + - status - linev - loadpct + - bcharge - timeleft + - mbattchg + - mintimel + - maxtime + - maxlinev + - minlinev + - outputv ``` From de2a2e28a69c5896bb0719a48cf3230d1fe573c1 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sat, 8 Jun 2019 19:15:54 +0200 Subject: [PATCH 071/123] Automations: Corrects documentation to match codebase --- source/_components/automation.markdown | 3 ++- source/_docs/automation.markdown | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/source/_components/automation.markdown b/source/_components/automation.markdown index 19adad1599b..04f3da4413b 100644 --- a/source/_components/automation.markdown +++ b/source/_components/automation.markdown @@ -26,6 +26,7 @@ Starting with 0.28 your automation rules can be controlled with the frontend. This allows one to reload the automation without restarting Home Assistant itself. If you don't want to see the automation rule in your frontend use `hide_entity: true` to hide it. + You can also use `initial_state: 'false'` so that the automation is not automatically turned on after a Home Assistant reboot. @@ -33,7 +34,7 @@ is not automatically turned on after a Home Assistant reboot. automation: - alias: Door alarm hide_entity: true - initial_state: 'true' + initial_state: true trigger: - platform: state ... diff --git a/source/_docs/automation.markdown b/source/_docs/automation.markdown index 2c21c495286..02a25294699 100644 --- a/source/_docs/automation.markdown +++ b/source/_docs/automation.markdown @@ -49,14 +49,14 @@ Actions are all about calling services. To explore the available services open t ### {% linkable_title Automation initial state %} -When you create a new automation, it will be disabled (and therefore won't trigger) unless you explicitly add `initial_state: true` to it or turn it on manually via UI/another automation/developer tools. +When you create a new automation, it will be enabled unless you explicitly add `initial_state: false` to it or turn it off manually via UI/another automation/developer tools. In case automations need to be always enabled or disabled upon Home Assistant start, then you can set the `initial_state` in your automations. Otherwise, the previous state will be restored. -In case automations need to be enabled or disabled upon Home Assistant restart, then you have to set the `initial_state` in your automations. Otherwise, the previous state will be restored. Please note that if for some reason Home Assistant cannot restore the previous state, e.g., because of an interrupted or failed startup, it will result in the automation being disabled on the next Home Assistant startup. +Please note that if for some reason Home Assistant cannot restore the previous state, it will result in the automation being enabled. ```text automation: - alias: Automation Name - initial_state: true + initial_state: false trigger: ... ``` From 7d2c216837f4c58cf2d143897c45fce343bee6ad Mon Sep 17 00:00:00 2001 From: DubhAd Date: Sat, 8 Jun 2019 19:46:28 +0100 Subject: [PATCH 072/123] Moving outdated information Don't really need the primary information here being about the old UI, but I can understand that we probably don't want it fully removed yet. --- source/_components/group.markdown | 115 ++++++++++++++++++------------ 1 file changed, 71 insertions(+), 44 deletions(-) diff --git a/source/_components/group.markdown b/source/_components/group.markdown index 095b9522dae..59127c2f204 100644 --- a/source/_components/group.markdown +++ b/source/_components/group.markdown @@ -14,10 +14,80 @@ ha_qa_scale: internal ha_release: pre 0.7 --- -Groups allow the user to combine multiple entities into one. A group can be promoted to a **view** by setting `view: true` under the group definition. This will make the group available as a new tab in the frontend. +Groups allow the user to combine multiple entities into one. Check the **Set State** page from the **Developer Tools** and browse the **Current entities:** listing for all available entities. +```yaml +# Example configuration.yaml entry +group: + kitchen: + name: Kitchen + entities: + - switch.kitchen_pin_3 + climate: + name: Climate + entities: + - sensor.bedroom_temp + - sensor.porch_temp + awesome_people: + name: Awesome People + entities: + - device_tracker.dad_smith + - device_tracker.mom_smith +``` + +{% configuration %} +name: + description: Name of the group. + required: false + type: string +entities: + description: Array or comma delimited string, list of entities to group. + required: true + type: list +all: + description: Set this to `true` if the group state should only turn *on* if **all** grouped entities are *on*. + required: false + type: boolean +icon: + description: The icon that shows in the front end. **The rest of this only applies to the deprecated UI `/states`**. If the group is a view, this icon will show at the top in the frontend instead of the name. If the group is a view and both name and icon have been specified, the icon will appear at the top of the frontend and the name will be displayed as the mouse-over text. + required: false + type: string +view: + description: "**Only applies to the deprecated UI `/states`**. If yes then the entry will be shown as a view (tab) at the top. Groups that are set to `view: true` cannot be used as entities in other views. *Does not apply to Lovelace.*" + required: false + type: boolean +control: + description: **Only applies to the deprecated UI `/states`**. Set value to `hidden`. If hidden then the group switch will be hidden. *Does not apply to Lovelace.* + required: false + type: string +{% endconfiguration %} + +## {% linkable_title Default groups %} + +Some components automatically create special groups containing component entities. These groups are named like `group.all_...`, for example: + +- `group.all_switches` +- `group.all_lights` +- `group.all_devices` +- `group.all_scripts` +- `group.all_automations` + +You can see list of these groups in **State** page of the **Developer Tools**. + +## {% linkable_title Group behavior %} + +By default when any member of a group is `on` then the group will also be `on`. Similarly with a device tracker, when any member of the group is `home` then the group is `home`. If you set the `all` option to `true` though, this behavior is inverted and all members of the group have to be `on` for the group to turn on as well. + +--- + +## {% linkable_title Old user interface %} + +This section only applies if you've not moved off the deprecated `/states` user interface. + +A group can be promoted to a **view** by setting `view: true` under the group definition. This will make the group available as a new tab in the frontend. + By default, every group appears in the HOME tab. If you create a group `default_view` it will REPLACE the contents of the HOME tab so you can customize the HOME tab as you wish. ```yaml @@ -57,33 +127,6 @@ group: - device_tracker.mom_smith ``` -{% configuration %} -name: - description: Name of the group. - required: false - type: string -view: - description: "If yes then the entry will be shown as a view (tab) at the top. Groups that are set to `view: true` cannot be used as entities in other views." - required: false - type: boolean -icon: - description: If the group is a view, this icon will show at the top in the frontend instead of the name. If the group is a view and both name and icon have been specified, the icon will appear at the top of the frontend and the name will be displayed as the mouse-over text. If it's not a view, then the icon shows when this group is used in another group. - required: false - type: string -control: - description: Set value to `hidden`. If hidden then the group switch will be hidden. - required: false - type: string -entities: - description: Array or comma delimited string, list of entities to group. - required: true - type: list -all: - description: Set this to `true` if the group state should only turn *on* if **all** grouped entities are *on*. - required: false - type: boolean -{% endconfiguration %} -

Example of groups shown as views in the frontend. @@ -110,18 +153,6 @@ Notice in the example below that in order to refer to the group "Living Room", y - group.bedroom ``` -## {% linkable_title Default groups %} - -Some components automatically create special groups containing component entities. These groups are named like `group.all_...`, for example: - -- `group.all_switches` -- `group.all_lights` -- `group.all_devices` -- `group.all_scripts` -- `group.all_automations` - -You can see list of these groups in **State** page of the **Developer Tools**. - Default groups appear in the HOME tab, if not overridden by user views and groups. Default groups are hidden by default, so you must [customize](/docs/configuration/customizing-devices/) them to be visible in your custom groups and views. ```yaml @@ -140,10 +171,6 @@ group: - group.all_scripts ``` -## {% linkable_title Group behavior %} - -By default when any member of a group is `on` then the group will also be `on`. Similarly with a device tracker, when any member of the group is `home` then the group is `home`. If you set the `all` option to `true` though, this behavior is inverted and all members of the group have to be `on` for the group to turn on as well. - ## {% linkable_title Customize group order %} You can also order your groups using [customize](/docs/configuration/customizing-devices/) with `order: ` if they don't show up in the order you want them in. From 0310b23c256c3046f22a208ccb37e51cfd343ada Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sat, 8 Jun 2019 22:48:40 +0200 Subject: [PATCH 073/123] :pencil2: Language tweak --- source/_docs/automation.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_docs/automation.markdown b/source/_docs/automation.markdown index 02a25294699..b8a1ee47167 100644 --- a/source/_docs/automation.markdown +++ b/source/_docs/automation.markdown @@ -49,7 +49,7 @@ Actions are all about calling services. To explore the available services open t ### {% linkable_title Automation initial state %} -When you create a new automation, it will be enabled unless you explicitly add `initial_state: false` to it or turn it off manually via UI/another automation/developer tools. In case automations need to be always enabled or disabled upon Home Assistant start, then you can set the `initial_state` in your automations. Otherwise, the previous state will be restored. +When you create a new automation, it will be enabled unless you explicitly add `initial_state: false` to it or turn it off manually via UI/another automation/developer tools. In case automations need to be always enabled or disabled when Home Assistant starts, then you can set the `initial_state` in your automations. Otherwise, the previous state will be restored. Please note that if for some reason Home Assistant cannot restore the previous state, it will result in the automation being enabled. From 8f8c5792f80cbdcc9066006d2c67867a51c15e11 Mon Sep 17 00:00:00 2001 From: Jon <26205899+VdkaShaker@users.noreply.github.com> Date: Sun, 9 Jun 2019 03:52:11 -0700 Subject: [PATCH 074/123] Update nmap_tracker.markdown (#9588) A ~little better clarity that Hass.io is a Linux system subject to this requirement. --- source/_components/nmap_tracker.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/nmap_tracker.markdown b/source/_components/nmap_tracker.markdown index 1003cc26778..fe414f96646 100644 --- a/source/_components/nmap_tracker.markdown +++ b/source/_components/nmap_tracker.markdown @@ -92,7 +92,7 @@ An example of how the Nmap scanner can be customized: ### {% linkable_title Linux capabilities %} -On Linux systems you can extend the functionality of Nmap, without having to run it as root, by using *Linux capabilities*. Be sure to specify the full path to wherever you installed Nmap: +On Linux systems (such as Hass.io) you can extend the functionality of Nmap, without having to run it as root, by using *Linux capabilities*. Be sure to specify the full path to wherever you installed Nmap: ```bash $ sudo setcap cap_net_raw,cap_net_admin,cap_net_bind_service+eip /usr/bin/nmap From 91f4f09833bb8d044d275d53de673a465d14df57 Mon Sep 17 00:00:00 2001 From: Robert Date: Sun, 9 Jun 2019 19:22:49 +0200 Subject: [PATCH 075/123] Fix mixed single quotes in automation example (#9597) --- source/_components/meteoalarm.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/meteoalarm.markdown b/source/_components/meteoalarm.markdown index 0dfd60cd43f..5bb38e0a088 100644 --- a/source/_components/meteoalarm.markdown +++ b/source/_components/meteoalarm.markdown @@ -99,7 +99,7 @@ automation: action: - service: notify.notify data_template: - title: '{{state_attr('binary_sensor.meteoalarm', 'headline')}}' + title: "{{state_attr('binary_sensor.meteoalarm', 'headline')}}" message: "{{state_attr('binary_sensor.meteoalarm', 'description')}} is effective on {{state_attr('binary_sensor.meteoalarm', 'effective')}}" ``` {% endraw %} From a8cae90364c84910cfb7de37de2d9dd56a0c834d Mon Sep 17 00:00:00 2001 From: stephanmiehe <49914758+stephanmiehe@users.noreply.github.com> Date: Mon, 10 Jun 2019 11:12:18 +0100 Subject: [PATCH 076/123] Update rainbird.markdown (#9596) Clarify durations --- source/_components/rainbird.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_components/rainbird.markdown b/source/_components/rainbird.markdown index 5da5d99c906..82211c4c199 100644 --- a/source/_components/rainbird.markdown +++ b/source/_components/rainbird.markdown @@ -106,11 +106,11 @@ friendly_name: required: false type: string trigger_time: - description: The default duration to sprinkle the zone. + description: The default duration to sprinkle the zone in minutes. required: true type: integer scan_interval: - description: How fast to refresh the switch. + description: How fast to refresh the switch in minutes. required: false type: integer {% endconfiguration %} From bcd0c2104d9bc1afcda809d000348e04874175ff Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 10 Jun 2019 13:43:06 +0100 Subject: [PATCH 077/123] Update guidance on using HA with Docker on synology (#9599) As per issue https://github.com/home-assistant/home-assistant.io/issues/9592#issuecomment-500212790 --- source/_docs/installation/docker.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_docs/installation/docker.markdown b/source/_docs/installation/docker.markdown index f9c7affff37..c602a7aea37 100644 --- a/source/_docs/installation/docker.markdown +++ b/source/_docs/installation/docker.markdown @@ -71,7 +71,7 @@ The steps would be: * Choose a container-name you want (e.g., "homeassistant") * Click on "Advanced Settings" * Set "Enable auto-restart" if you like -* Within "Volume" click on "Add Folder" and choose either an existing folder or add a new folder. The "mount path" has to be "/config", so that Home Assistant will use it for the configs and logs. +* Within "Volume" click on "Add Folder" and choose either an existing folder or add a new folder. The "mount path" has to be "/config", so that Home Assistant will use it for the configs and logs. It is therefore recommended that the folder you choose should be named "config" or "homeassistant/config" to avoid confusion when referencing it within service calls. * Within "Network" select "Use same network as Docker Host" * To ensure that Home Assistant displays the correct timezone go to the "Environment" tab and click the plus sign then add `variable` = `TZ` & `value` = `Europe/London` choosing [your correct timezone](http://en.wikipedia.org/wiki/List_of_tz_database_time_zones) * Confirm the "Advanced Settings" From 3c4b54425635cc0d7fc0484a6062aa8120619c63 Mon Sep 17 00:00:00 2001 From: Hmmbob <33529490+hmmbob@users.noreply.github.com> Date: Mon, 10 Jun 2019 19:30:39 +0200 Subject: [PATCH 078/123] Update watson_tts.markdown (#9582) --- source/_components/watson_tts.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/watson_tts.markdown b/source/_components/watson_tts.markdown index 8418d70a9dd..dc058f963dc 100644 --- a/source/_components/watson_tts.markdown +++ b/source/_components/watson_tts.markdown @@ -14,7 +14,7 @@ ha_release: 0.94 --- The `watson_tts` text-to-speech platform that works with [IBM Watson Cloud](https://www.ibm.com/watson/services/text-to-speech/) to create the spoken output. -Polly is a paid service via IBM Cloud but there is a decent [free tier](https://www.ibm.com/cloud/watson-text-to-speech/pricing) which offers 10000 free characters every month. +Watson is a paid service via IBM Cloud but there is a decent [free tier](https://www.ibm.com/cloud/watson-text-to-speech/pricing) which offers 10000 free characters every month. ## {% linkable_title Setup %} From 2bb42cea7af2fafe54e848eeb49cd28bfbbd6763 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 11 Jun 2019 08:55:25 -0700 Subject: [PATCH 079/123] 94.2 --- _config.yml | 4 +-- source/_posts/2019-06-05-release-94.markdown | 27 ++++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/_config.yml b/_config.yml index a85c157f2c3..4d99827ff68 100644 --- a/_config.yml +++ b/_config.yml @@ -139,8 +139,8 @@ social: # Home Assistant release details current_major_version: 0 current_minor_version: 94 -current_patch_version: 1 -date_released: 2019-06-07 +current_patch_version: 2 +date_released: 2019-06-11 # Either # or the anchor link to latest release notes in the blog post. # Must be prefixed with a # and have double quotes around it. diff --git a/source/_posts/2019-06-05-release-94.markdown b/source/_posts/2019-06-05-release-94.markdown index 752132a13b1..dcbad555485 100644 --- a/source/_posts/2019-06-05-release-94.markdown +++ b/source/_posts/2019-06-05-release-94.markdown @@ -118,6 +118,33 @@ Because of this, we changed how packages are installed when running Home Assista [wemo docs]: /components/wemo/ [wink docs]: /components/wink/ +## {% linkable_title Release 0.94.2 - June 11 %} + +- Load the SSDP component only when it's needed ([@aerialls] - [#24420]) ([deconz docs]) ([hue docs]) +- Axis discovery MAC filter ([@Kane610] - [#24442]) ([axis docs]) +- Remember gpslogger entities across restarts (fixes #24432) ([@andkit] - [#24444]) ([gpslogger docs]) +- Update Hass.io when core config is updated ([@balloob] - [#24461]) ([hassio docs]) +- Sun listener to adapt to core config updates ([@balloob] - [#24464]) +- Update home zone when core config updated ([@balloob] - [#24237]) ([config docs]) ([zone docs]) + +[#24237]: https://github.com/home-assistant/home-assistant/pull/24237 +[#24420]: https://github.com/home-assistant/home-assistant/pull/24420 +[#24442]: https://github.com/home-assistant/home-assistant/pull/24442 +[#24444]: https://github.com/home-assistant/home-assistant/pull/24444 +[#24461]: https://github.com/home-assistant/home-assistant/pull/24461 +[#24464]: https://github.com/home-assistant/home-assistant/pull/24464 +[@Kane610]: https://github.com/Kane610 +[@aerialls]: https://github.com/aerialls +[@andkit]: https://github.com/andkit +[@balloob]: https://github.com/balloob +[axis docs]: /components/axis/ +[config docs]: /components/config/ +[deconz docs]: /components/deconz/ +[gpslogger docs]: /components/gpslogger/ +[hassio docs]: /components/hassio/ +[hue docs]: /components/hue/ +[zone docs]: /components/zone/ + ## {% linkable_title If you need help... %} ...don't hesitate to use our very active [forums](https://community.home-assistant.io/) or join us for a little [chat](https://discord.gg/c5DvZ4e). The release notes have comments enabled but it's preferred if you use the former communication channels. Thanks. From 67fe606833362838b05b9cd4507324edde1e349a Mon Sep 17 00:00:00 2001 From: Dubh Ad Date: Tue, 11 Jun 2019 20:36:46 +0100 Subject: [PATCH 080/123] Update source/_components/group.markdown Co-Authored-By: Klaas Schoute --- source/_components/group.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/group.markdown b/source/_components/group.markdown index 59127c2f204..830f5de89d5 100644 --- a/source/_components/group.markdown +++ b/source/_components/group.markdown @@ -59,7 +59,7 @@ view: required: false type: boolean control: - description: **Only applies to the deprecated UI `/states`**. Set value to `hidden`. If hidden then the group switch will be hidden. *Does not apply to Lovelace.* + description: "**Only applies to the deprecated UI `/states`**. Set value to `hidden`. If hidden then the group switch will be hidden. *Does not apply to Lovelace.*" required: false type: string {% endconfiguration %} From afe757dfe435cffc86287dbb01eed92f8729b025 Mon Sep 17 00:00:00 2001 From: Robbie Trencheny Date: Wed, 12 Jun 2019 01:14:22 -0700 Subject: [PATCH 081/123] Create apple-developer-domain-association.txt --- .../apple-developer-domain-association.txt | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 source/.well-known/apple-developer-domain-association.txt diff --git a/source/.well-known/apple-developer-domain-association.txt b/source/.well-known/apple-developer-domain-association.txt new file mode 100644 index 00000000000..e7cfdc66f21 --- /dev/null +++ b/source/.well-known/apple-developer-domain-association.txt @@ -0,0 +1,76 @@ +MIIQ3QYJKoZIhvcNAQcCoIIQzjCCEMoCAQExCzAJBgUrDgMCGgUAMHMGCSqGSIb3DQEHAaBmBGR7 +InRlYW1JZCI6IlVUUUZDQlBRUkYiLCJkb21haW4iOiJob21lLWFzc2lzdGFudC5pbyIsImRhdGVD +cmVhdGVkIjoiMjAxOS0wNi0xMiwwODoxMToxOCIsInZlcnNpb24iOjF9oIINsTCCA_MwggLboAMC +AQICARcwDQYJKoZIhvcNAQEFBQAwYjELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkFwcGxlIEluYy4x +JjAkBgNVBAsTHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRYwFAYDVQQDEw1BcHBsZSBS +b290IENBMB4XDTA3MDQxMjE3NDMyOFoXDTIyMDQxMjE3NDMyOFoweTELMAkGA1UEBhMCVVMxEzAR +BgNVBAoTCkFwcGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MS0wKwYDVQQDEyRBcHBsZSBpUGhvbmUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCjHr7wR8C0nhBbRqS4IbhPhiFwKEVgXBzDyApkY4j7_Gnu +-FT86Vu3Bk4EL8NrM69ETOpLgAm0h_ZbtP1k3bNy4BOz_RfZvOeo7cKMYcIq-ezOpV7WaetkC40I +j7igUEYJ3Bnk5bCUbbv3mZjE6JtBTtTxZeMbUnrc6APZbh3aEFWGpClYSQzqR9cVNDP2wKBESnC- +LLUqMDeMLhXr0eRslzhVVrE1K1jqRKMmhe7IZkrkz4nwPWOtKd6tulqz3KWjmqcJToAWNWWkhQ1j +ez5jitp9SkbsozkYNLnGKGUYvBNgnH9XrBTJie2htodoUraETrjIg-z5nhmrs8ELhsefAgMBAAGj +gZwwgZkwDgYDVR0PAQH_BAQDAgGGMA8GA1UdEwEB_wQFMAMBAf8wHQYDVR0OBBYEFOc0Ki4i3jlg +a7SUzneDYS8xoHw1MB8GA1UdIwQYMBaAFCvQaUeUdgn-9GuNLkCm90dNfwheMDYGA1UdHwQvMC0w +K6ApoCeGJWh0dHA6Ly93d3cuYXBwbGUuY29tL2FwcGxlY2Evcm9vdC5jcmwwDQYJKoZIhvcNAQEF +BQADggEBAB3R1XvddE7XF_yCLQyZm15CcvJp3NVrXg0Ma0s-exQl3rOU6KD6D4CJ8hc9AAKikZG- +dFfcr5qfoQp9ML4AKswhWev9SaxudRnomnoD0Yb25_awDktJ-qO3QbrX0eNWoX2Dq5eu-FFKJsGF +QhMmjQNUZhBeYIQFEjEra1TAoMhBvFQe51StEwDSSse7wYqvgQiO8EYKvyemvtzPOTqAcBkjMqNr +Zl2eTahHSbJ7RbVRM6d0ZwlOtmxvSPcsuTMFRGtFvnRLb7KGkbQ-JSglnrPCUYb8T-WvO6q7RCwB +SeJ0szT6RO8UwhHyLRkaUYnTCEpBbFhW3ps64QVX5WLP0g8wggP4MIIC4KADAgECAgg9ciDjz4zy +JTANBgkqhkiG9w0BAQUFADB5MQswCQYDVQQGEwJVUzETMBEGA1UEChMKQXBwbGUgSW5jLjEmMCQG +A1UECxMdQXBwbGUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLTArBgNVBAMTJEFwcGxlIGlQaG9u +ZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNDA3MTEwMTM1MjVaFw0yMjA0MTIxNzQzMjha +MFkxCzAJBgNVBAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMTUwMwYDVQQDDCxBcHBsZSBpUGhv +bmUgT1MgUHJvdmlzaW9uaW5nIFByb2ZpbGUgU2lnbmluZzCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAOfZmsMXo8npB9XHmaS0dSFMEQNoHzAsB5x3iDFIyEQEjYHNesb40_ZHHG1O7rrm +FIVxxO95s0t12miFpnNVosaHUXvXHIG1AWrjjJHueir8z5Ve-XGgKH75q9Thzg5PlfPK7beVCjL_ +JZk29pidJItkV7b1_b5FIfmuRHa36rA7aZ9tf37XEZuy6kOi5f0mR87MxAfi53XG2_x-FrWkk8Z8 +rz293cAvgHh2Ok582GRPKiVRh0F2Dm7gk6Qhqj5dyl-niwtApS-zs2pKx8ZTtR9cLIqI7uSQL5_d +Uj4WQcY4HmgkjzEt22lxz6DzQhooEUp0nKbWeElYDcS8HFvxPXsCAwEAAaOBozCBoDAdBgNVHQ4E +FgQUpF5rO_x6R3KRcAnBJL0vO8l7oL4wDAYDVR0TAQH_BAIwADAfBgNVHSMEGDAWgBTnNCouIt45 +YGu0lM53g2EvMaB8NTAwBgNVHR8EKTAnMCWgI6Ahhh9odHRwOi8vY3JsLmFwcGxlLmNvbS9pcGhv +bmUuY3JsMAsGA1UdDwQEAwIHgDARBgsqhkiG92NkBgICAQQCBQAwDQYJKoZIhvcNAQEFBQADggEB +AIq2Vk5B0rHzIUOdC9nH_7SYWJntQacw8e_b2oBtIbazXNy-h_E5IbzEodom0u2m8e3AEZUZrEe4 +Kg5pmNTm5s5r6iLBK6cBbkFMLB3jI4yGJ6OMF5zMG-7YZDMPRA6LO0hiE2JU03FNki2BOv-my45c +Q3FsiDMiPCA_HXi5_xoqIehzac-boaHhPekMF7ypc9fpUrrCth-hIoU-uFwaspp7n8zLUDr-lsf8 +SEf0JKKtPkz7SttnnANxFSc_g1L7svQZFqk-qewU7F7CCqfzTdEwqtStuDKhUC9NVchCJ6wcznJk +8CzgCeRMuQsgNTec1QuRxDEd0CviXIK9fdD-CJkwggW6MIIEoqADAgECAgEBMA0GCSqGSIb3DQEB +BQUAMIGGMQswCQYDVQQGEwJVUzEdMBsGA1UEChMUQXBwbGUgQ29tcHV0ZXIsIEluYy4xLTArBgNV +BAsTJEFwcGxlIENvbXB1dGVyIENlcnRpZmljYXRlIEF1dGhvcml0eTEpMCcGA1UEAxMgQXBwbGUg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDUwMjEwMDAxODE0WhcNMjUwMjEwMDAxODE0 +WjCBhjELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFEFwcGxlIENvbXB1dGVyLCBJbmMuMS0wKwYDVQQL +EyRBcHBsZSBDb21wdXRlciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxKTAnBgNVBAMTIEFwcGxlIFJv +b3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA +5JGpCR-R2x5HUOsF7V55hC3rNqJXTFXsixmJ3vlLbPUHqyIwAugYPvhQCdN_QaiY-dHKZpwkaxHQ +o7vkGyrDH5WeegykR4tb1BY3M8vED03OFGnRyRly9V0O1X9fm_IlA7pVj01dDfFkNSMVSxVZHbOU +9_acns9QusFYUGePCLQg98usLCBvcLY_ATCMt0PPD5098ytJKBrI_s61uQ7ZXhzWyz21Oq30Dw4A +kguxIRYudNU8DdtiFqujcZJHU1XBry9Bs_j743DN5qNMRX4fTGtQlkGJxHRiCxCDQYczioGxMFjs +WgQyjGizjx3eZXP_Z15lvEnYdp8zFGWhd5TJLQIDAQABo4ICLzCCAiswDgYDVR0PAQH_BAQDAgEG +MA8GA1UdEwEB_wQFMAMBAf8wHQYDVR0OBBYEFCvQaUeUdgn-9GuNLkCm90dNfwheMB8GA1UdIwQY +MBaAFCvQaUeUdgn-9GuNLkCm90dNfwheMIIBKQYDVR0gBIIBIDCCARwwggEYBgkqhkiG92NkBQEw +ggEJMEEGCCsGAQUFBwIBFjVodHRwczovL3d3dy5hcHBsZS5jb20vY2VydGlmaWNhdGVhdXRob3Jp +dHkvdGVybXMuaHRtbDCBwwYIKwYBBQUHAgIwgbYagbNSZWxpYW5jZSBvbiB0aGlzIGNlcnRpZmlj +YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs +ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRlIHBvbGlj +eSBhbmQgY2VydGlmaWNhdGlvbiBwcmFjdGljZSBzdGF0ZW1lbnRzLjBEBgNVHR8EPTA7MDmgN6A1 +hjNodHRwczovL3d3dy5hcHBsZS5jb20vY2VydGlmaWNhdGVhdXRob3JpdHkvcm9vdC5jcmwwVQYI +KwYBBQUHAQEESTBHMEUGCCsGAQUFBzAChjlodHRwczovL3d3dy5hcHBsZS5jb20vY2VydGlmaWNh +dGVhdXRob3JpdHkvY2FzaWduZXJzLmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAJ3aLShYL312BLkE +0z7Ot2ZjTo8v1P5LrXK9oznGUk0FmFL1iVEBJHm-GjL35USLS0QHOYLWWsq0IF7ZrhVdHYwdMr84 +MWJIXcfhkLH4JED4X1ibUV1XncHl_zzMciFuxOnpoXfXLBcmwz_rmugLA7rps0py6zMJW63mYjFq +6K8v1a8eV3aPfzctLgJc3WPJ8nG4JkDfFY11RD95veYdmeFDLD6tb765pP4ONRlRY7HD3rWSPlF4 +AXOKpCPKpIjxHlwfQRYtfpUKqumJQZgbGt3LIL9HXgwmxVU1TcYwi5lnFMcJH7pHx9oBCYckQpW9 +E2AZCu_qfw5uzcFEQzpK1eMxggKMMIICiAIBATCBhTB5MQswCQYDVQQGEwJVUzETMBEGA1UEChMK +QXBwbGUgSW5jLjEmMCQGA1UECxMdQXBwbGUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLTArBgNV +BAMTJEFwcGxlIGlQaG9uZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQIIPXIg48-M8iUwCQYFKw4D +AhoFAKCB3DAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0xOTA2MTIw +ODExMThaMCMGCSqGSIb3DQEJBDEWBBTcNAQ84q3p1JpA4YADPkvxYG9QnjApBgkqhkiG9w0BCTQx +HDAaMAkGBSsOAwIaBQChDQYJKoZIhvcNAQEBBQAwUgYJKoZIhvcNAQkPMUUwQzAKBggqhkiG9w0D +BzAOBggqhkiG9w0DAgICAIAwDQYIKoZIhvcNAwICAUAwBwYFKw4DAgcwDQYIKoZIhvcNAwICASgw +DQYJKoZIhvcNAQEBBQAEggEAPdMEunJrRbCBu0BHComwqNhFZwpBumcnD1IOq_9FfwN1XK2WJFxt +Oad41ZZdFe4ku1ARAven-h_EdKaaaTeBddaUj6hl3fj6IVxMYKg0owRRR2HIjNjseLBSxFYl8j6u +Mo1qXfzwEeAiUPxAme5q_EXLye3by0CxdSbx3WTXHzi47r8t8a7fb-SqQtgLYiehQO8ROO1OgTrO +rqnOFRAsbwZy_m_Dmx5nqqzN1vLYKbo6sc4YWt8E_YmEqv-nXQDn8y7bI_24vOTz5FWZCOUDVsJc +fOUtmLOmsw78uqdqbO3LjqQlIIcqecYPyBH5zxaA5iC_aLNYPxnxyljawyMzJQ From af8d2de6b45b464a1b4b622c0400b357391be0c3 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 12 Jun 2019 22:50:28 -0700 Subject: [PATCH 082/123] Bump version to 0.94.3 --- _config.yml | 4 ++-- source/_posts/2019-06-05-release-94.markdown | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/_config.yml b/_config.yml index 4d99827ff68..d6bb61393f3 100644 --- a/_config.yml +++ b/_config.yml @@ -139,8 +139,8 @@ social: # Home Assistant release details current_major_version: 0 current_minor_version: 94 -current_patch_version: 2 -date_released: 2019-06-11 +current_patch_version: 3 +date_released: 2019-06-13 # Either # or the anchor link to latest release notes in the blog post. # Must be prefixed with a # and have double quotes around it. diff --git a/source/_posts/2019-06-05-release-94.markdown b/source/_posts/2019-06-05-release-94.markdown index dcbad555485..65cc9d00912 100644 --- a/source/_posts/2019-06-05-release-94.markdown +++ b/source/_posts/2019-06-05-release-94.markdown @@ -145,6 +145,22 @@ Because of this, we changed how packages are installed when running Home Assista [hue docs]: /components/hue/ [zone docs]: /components/zone/ +## {% linkable_title Release 0.94.3 - June 12 %} + +- Fix errors when renewing remote UI certs ([@balloob] - [#24481]) ([cloud docs]) +- Watson TTS: Fix missing comma preventing other voices ([@aidbish] - [#24487]) ([watson_tts docs]) +- Fix owntracks source_type for location messages with default trigger ([@pnbruckner] - [#24503]) ([owntracks docs]) + +[#24481]: https://github.com/home-assistant/home-assistant/pull/24481 +[#24487]: https://github.com/home-assistant/home-assistant/pull/24487 +[#24503]: https://github.com/home-assistant/home-assistant/pull/24503 +[@aidbish]: https://github.com/aidbish +[@balloob]: https://github.com/balloob +[@pnbruckner]: https://github.com/pnbruckner +[cloud docs]: /components/cloud/ +[owntracks docs]: /components/owntracks/ +[watson_tts docs]: /components/watson_tts/ + ## {% linkable_title If you need help... %} ...don't hesitate to use our very active [forums](https://community.home-assistant.io/) or join us for a little [chat](https://discord.gg/c5DvZ4e). The release notes have comments enabled but it's preferred if you use the former communication channels. Thanks. From 98f235316b5d3162da9ef1255752b66aceab14a9 Mon Sep 17 00:00:00 2001 From: Dubh Ad Date: Thu, 13 Jun 2019 08:21:18 +0100 Subject: [PATCH 083/123] Version bump for Python (#9618) Given the impending drop for Python 3.5, updating the guide to say 3.6 --- source/_docs/installation.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_docs/installation.markdown b/source/_docs/installation.markdown index 3663edab5ec..a083d588242 100644 --- a/source/_docs/installation.markdown +++ b/source/_docs/installation.markdown @@ -59,8 +59,8 @@ If you use these install methods, we assume that you know how to manage and admi **Method**|**You have**|**Recommended for** :-----|:-----|:----- -[venv
(as another user)](/docs/installation/raspberry-pi/)|Any Linux, Python 3.5.3 or later|Those familiar with their operating system -[venv
(as your user)](/docs/installation/virtualenv/)|Any Python 3.5.3 or later|Developers +[venv
(as another user)](/docs/installation/raspberry-pi/)|Any Linux, Python 3.6 or later|Those familiar with their operating system +[venv
(as your user)](/docs/installation/virtualenv/)|Any Python 3.6 or later|Developers ## {% linkable_title Community provided guides %} From 764c0d96dfae000f269271835b38cb3d5b8ced63 Mon Sep 17 00:00:00 2001 From: Dubh Ad Date: Thu, 13 Jun 2019 08:28:34 +0100 Subject: [PATCH 084/123] Added note about `known_devices.yaml` (#9620) Given that this is being phased out, adding a warning about it here to reduce confusion. --- source/_components/device_tracker.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/_components/device_tracker.markdown b/source/_components/device_tracker.markdown index c6b6292ef28..dc671bfc810 100644 --- a/source/_components/device_tracker.markdown +++ b/source/_components/device_tracker.markdown @@ -66,6 +66,10 @@ Multiple device trackers can be used in parallel, such as [Owntracks](/component ## {% linkable_title `known_devices.yaml` %} +

+As of 0.94 `known_devices.yaml` is being phased out, and no longer used by all trackers. Depending on the component you use this section may no longer apply. This includes the mobile app, OwnTracks, GeoFency, GPSLogger, and Locative. +

+ Once `device_tracker` is enabled, a file will be created in your config dir named `known_devices.yaml`. Edit this file to adjust which devices to be tracked. Here's an example configuration for a single device: From 9768e8962f919cb32c3f52dd69176c7db4880357 Mon Sep 17 00:00:00 2001 From: Dubh Ad Date: Thu, 13 Jun 2019 08:30:35 +0100 Subject: [PATCH 085/123] Drop reference to `known_devices.yaml` (#9621) * Drop reference to `known_devices.yaml` It no longer uses it, we shouldn't be talking about it here * :pencil2: Typo --- source/_components/gpslogger.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/gpslogger.markdown b/source/_components/gpslogger.markdown index eb4e00ceb77..3174e7b7892 100644 --- a/source/_components/gpslogger.markdown +++ b/source/_components/gpslogger.markdown @@ -75,4 +75,4 @@ If your battery drains too fast then you can tune the performance of GPSLogger u Performance

-A request can be forced from the app to test if everything is working fine. A successful request will update the `known_devices.yaml` file with the device's serial number. +A request can be forced from the app to test if everything is working fine. From 684358a14c375167f907f7e1974995fe47f0ad98 Mon Sep 17 00:00:00 2001 From: Dubh Ad Date: Thu, 13 Jun 2019 09:06:48 +0100 Subject: [PATCH 086/123] Version bumb (#9619) Bumping the version of Python to 3.6 minimum, and suggesting 3.7 --- source/_docs/installation/virtualenv.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/_docs/installation/virtualenv.markdown b/source/_docs/installation/virtualenv.markdown index 3b4c5914c42..d8459e9de32 100644 --- a/source/_docs/installation/virtualenv.markdown +++ b/source/_docs/installation/virtualenv.markdown @@ -10,9 +10,9 @@ footer: true redirect_from: /getting-started/installation-virtualenv/ --- -If you already have Python 3.5.3 or later installed, you can easily give Home Assistant a spin. +If you already have Python 3.6 or later installed (we suggest 3.7 or later), you can easily give Home Assistant a spin. -It's recommended when installing Python packages that you use a [virtual environment](https://docs.python.org/3.5/library/venv.html#module-venv). This will make sure that your Python installation and Home Assistant installation won't impact one another. The following steps will work on most UNIX like systems. +It's recommended when installing Python packages that you use a [virtual environment](https://docs.python.org/3.6/library/venv.html#module-venv). This will make sure that your Python installation and Home Assistant installation won't impact one another. The following steps will work on most UNIX like systems. _(If you're on a Debian based system, you will need to install Python virtual environment support using `apt-get install python3-pip python3-venv`. You may also need to install development libraries using `apt-get install build-essential libssl-dev libffi-dev python3-dev`.)_ @@ -109,7 +109,7 @@ Looking for more advanced guides? Check our [Raspbian guide](/docs/installation/ ### {% linkable_title After upgrading Python %} -If you've upgraded Python (for example, you were running 3.5.2 and now you've installed 3.5.4) then you'll need to build a new virtual environment. Simply rename your existing virtual environment directory: +If you've upgraded Python (for example, you were running 3.7.1 and now you've installed 3.7.3) then you'll need to build a new virtual environment. Simply rename your existing virtual environment directory: ```bash $ mv homeassistant homeassistant.old From 80a6813bc3042d30d69cd03992efa432e92d195f Mon Sep 17 00:00:00 2001 From: Dubh Ad Date: Thu, 13 Jun 2019 09:07:12 +0100 Subject: [PATCH 087/123] No more `known_devices.yaml` (#9622) Updating the reference for where to look --- source/_components/locative.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/locative.md b/source/_components/locative.md index b704054ff02..03f9efa289a 100644 --- a/source/_components/locative.md +++ b/source/_components/locative.md @@ -27,7 +27,7 @@ Install on your smartphone: - [Android](https://play.google.com/store/apps/details?id=io.locative.app) - [iOS](https://itunes.apple.com/us/app/geofancy/id725198453) -To configure Locative, you must set it up via the integrations panel in the configuration screen. You must set up the app to send a POST request to your Home Assistant server at the webhook URL provided by the integration during setup. When you enter or exit a geofence, Locative will send the appropriate request to that URL, updating Home Assistant. You are not able to specify a device name in Locative. Instead, you will need to look in your known_devices.yaml file for a new device that Locative will have created on it's first `GET`. If you had been or are using Owntracks as well, you will need to update the device name used in the Owntracks setup with the name that Locative generated. +To configure Locative, you must set it up via the integrations panel in the configuration screen. You must set up the app to send a POST request to your Home Assistant server at the webhook URL provided by the integration during setup. When you enter or exit a geofence, Locative will send the appropriate request to that URL, updating Home Assistant. You are not able to specify a device name in Locative. Instead, you will need to look in your `dev-state` menu for a new device that Locative will have created on it's first `GET`. If you had been or are using Owntracks as well, you will need to update the device name used in the Owntracks setup with the name that Locative generated.

From 8266f4ea5c13d316b136dfa00fffaa69c66dba7a Mon Sep 17 00:00:00 2001 From: Emilv2 Date: Fri, 14 Jun 2019 16:00:52 +0800 Subject: [PATCH 088/123] Clarify how the integration sensor works (home-assistant/home-assistant#24398) (#9593) --- source/_components/integration.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/integration.markdown b/source/_components/integration.markdown index 990e7b1467e..892421583fa 100644 --- a/source/_components/integration.markdown +++ b/source/_components/integration.markdown @@ -18,7 +18,7 @@ redirect_from: - /components/sensor.integration/ --- -The `integration` platform provides the [Riemann sum](https://en.wikipedia.org/wiki/Riemann_sum) of the values provided by a source sensor. The Riemann sum is an approximation of an **integral** by a finite sum. In this implementation, the default is the Trapezoidal method, but Left and Right methods can optionally be used. +The `integration` platform provides the [Riemann sum](https://en.wikipedia.org/wiki/Riemann_sum) of the values provided by a source sensor. The Riemann sum is an approximation of an **integral** by a finite sum. The integration sensors is updated upon changes of the the **source**. Fast sampling source sensors provide better results. In this implementation, the default is the Trapezoidal method, but Left and Right methods can optionally be used. ## {% linkable_title Configuration %} From 679659fcf5ff3892fbff713c968b472d82ff02ce Mon Sep 17 00:00:00 2001 From: Penny Wood Date: Fri, 14 Jun 2019 16:04:32 +0800 Subject: [PATCH 089/123] Note about ptvsd memory use. (#9624) * Note about memory use. * :pencil2: Tweak --- source/_components/ptvsd.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/_components/ptvsd.markdown b/source/_components/ptvsd.markdown index d47a02605a4..ba7c77531ff 100644 --- a/source/_components/ptvsd.markdown +++ b/source/_components/ptvsd.markdown @@ -52,6 +52,10 @@ If the home assistant server is behind your firewall with only the http(s) port Another way of securing the port is to set `host` to localhost and have a secured SSH TCP tunnel with a client certificate for access from the outside internet. +### {% linkable_title Memory Use %} + +There have been reports of continually increasing memory use while the debugger is running, although this doesn't seem to appear on all systems. Only configure the debugger on a persistent server when it's actually required. + ### {% linkable_title Waiting at startup %} If you want to debug something in the boot-up sequence, configure the component to wait for a connection first: From d5133d07f6ad0aeef66dd8457bc7046249ffb638 Mon Sep 17 00:00:00 2001 From: Dubh Ad Date: Fri, 14 Jun 2019 09:05:10 +0100 Subject: [PATCH 090/123] Adding a big warning (#9614) * Adding a big warning Multiple people have independently identified `modemmanager` as the source of Z-Wave and Zigbee related issues, and confirmed that disabling it resolves those problems. Adding a great big warning here. * Added some instructions --- source/hassio/installation.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/hassio/installation.markdown b/source/hassio/installation.markdown index 112653f51bd..8c90ce1f509 100644 --- a/source/hassio/installation.markdown +++ b/source/hassio/installation.markdown @@ -115,6 +115,10 @@ The packages you need to have available on your system that will run Hass.io may - socat - software-properties-common +

+ The `modemmanager` package will interfere with any Z-Wave or Zigbee stick and should be removed or disabled. Failure to do so will result in random failures of those components. For example you can disable with `sudo systemctl disable ModemManager` and remove with `sudo apt-get purge modemmanager` +

+ ### {% linkable_title Arch Linux %} - apparmor From 35bc4f827314a7ede1b82f0e73b15d1a60f5c355 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Fri, 14 Jun 2019 10:05:43 +0200 Subject: [PATCH 091/123] Remove incorrect statement about more-info dialog (#9629) --- source/_lovelace/light.markdown | 1 - 1 file changed, 1 deletion(-) diff --git a/source/_lovelace/light.markdown b/source/_lovelace/light.markdown index a4d2fdbc786..a50186a67dd 100644 --- a/source/_lovelace/light.markdown +++ b/source/_lovelace/light.markdown @@ -11,7 +11,6 @@ footer: true --- The Light card allows you to change the brightness of the light. -Note: Long-press on the bulb to bring up the `more-info` dialog.

Screenshot of the Light card From c2cc345f310b636209df77cdf22e72dbecb7952c Mon Sep 17 00:00:00 2001 From: dnguyen800 <25126347+dnguyen800@users.noreply.github.com> Date: Fri, 14 Jun 2019 01:06:15 -0700 Subject: [PATCH 092/123] Added note on remotely powering on Marantz receivers (#9628) Added note that the 'Auto-Standby' feature must be enabled in Marantz receiver settings for Home Assistant to remotely power on the receiver. --- source/_components/denonavr.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_components/denonavr.markdown b/source/_components/denonavr.markdown index b910bfa5066..ad60ff2f242 100644 --- a/source/_components/denonavr.markdown +++ b/source/_components/denonavr.markdown @@ -99,6 +99,7 @@ A few notes: - An additional option for the control of Denon AVR receivers with a built-in web server is using the HTTP interface with `denonavr` platform. - The `denonavr` platform supports some additional functionalities like album covers, custom input source names and auto discovery. - Marantz receivers seem to a have quite a similar interface. Thus if you own one, give it a try. +- To remotely power on Marantz receivers with Home Assistant, the Auto-Standby feature must be enabled in the receiver's settings. - Sound mode: The command to set a specific sound mode is different from the value of the current sound mode reported by the receiver (sound_mode_raw). There is a key-value structure (sound_mode_dict) that matches the raw sound mode to one of the possible commands to set a sound mode (for instance {'MUSIC':['PLII MUSIC']}. If you get a "Not able to match sound mode" warning, please open an issue on the [denonavr library](https://github.com/scarface-4711/denonavr), stating which raw sound mode could not be matched so it can be added to the matching dictionary. You can find the current raw sound mode under "Development Tools/States" in the front panel. [Denon]: /components/media_player.denon/ From 2a9dfb67dcd9832faa709cc317755c2cc0a30661 Mon Sep 17 00:00:00 2001 From: jyrki69 <43283263+jyrki69@users.noreply.github.com> Date: Fri, 14 Jun 2019 10:06:58 +0200 Subject: [PATCH 093/123] Update event prefixes (#9627) * Update event prefixes Changed the event name prefixes and the explanation how they will be seen in Home Assistant. * Update doorbird.markdown --- source/_components/doorbird.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_components/doorbird.markdown b/source/_components/doorbird.markdown index adf5f0fd84b..05805997bb7 100644 --- a/source/_components/doorbird.markdown +++ b/source/_components/doorbird.markdown @@ -112,7 +112,7 @@ Events can be defined for each configured DoorBird device independently. These e See [Schedules](#schedules) section below for details on how to configure schedules. -Event names will be prefixed by `doorbird_`. For example, the example event `somebody_pressed_the_button` will be seen in Home Assistant as `doorbird_somebody_pressed_the_button`. This is to prevent conflicts with other events. +Event names will be prefixed by `doorbird_devicename`. For example, the example event `somebody_pressed_the_button` for the device 'Driveway Gate' will be seen in Home Assistant as `doorbird_driveway_gate_somebody_pressed_the_button`. This is to prevent conflicts with other events. See [Automation Example](#automation_example) section below for details on how to use the event names in an automation. @@ -167,7 +167,7 @@ Remember to complete the schedule assignment steps above for each event type tha - alias: Doorbird Ring trigger: platform: event - event_type: doorbird_somebody_pressed_the_button + event_type: doorbird_driveway_gate_somebody_pressed_the_button action: service: light.turn_on entity_id: light.side_entry_porch From 23a0d9faa42055ec96d3a60aa0afa9cad362e016 Mon Sep 17 00:00:00 2001 From: Shulyaka Date: Fri, 14 Jun 2019 11:08:44 +0300 Subject: [PATCH 094/123] Update modbus.markdown (#9609) --- source/_components/modbus.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/_components/modbus.markdown b/source/_components/modbus.markdown index 77ddbcee795..c62832b0e0f 100644 --- a/source/_components/modbus.markdown +++ b/source/_components/modbus.markdown @@ -128,12 +128,12 @@ modbus: - type: tcp host: IP_ADDRESS_1 port: 2020 - hub: hub1 + name: hub1 - type: tcp host: IP_ADDRESS_2 port: 501 - hub: hub2 + name: hub2 ``` ### {% linkable_title Services %} @@ -147,7 +147,7 @@ modbus: | Attribute | Description | | --------- | ----------- | -| hub | Hub name (defaults to 'default' when omitted) | +| name | Hub name (defaults to 'default' when omitted) | | unit | Slave address (set to 255 you talk to Modbus via TCP) | | address | Address of the Register (e.g., 138) | | value | A single value or an array of 16-bit values. Single value will call modbus function code 6. Array will call modbus function code 16. Array might need reverse ordering. E.g., to set 0x0004 you might need to set `[4,0]` | From cb420bd7cba747536da5dbf6ad0b2762f832d4ba Mon Sep 17 00:00:00 2001 From: Ben Spoon Date: Sat, 15 Jun 2019 01:35:27 -0700 Subject: [PATCH 095/123] Fix typo in autostart directions (#9634) "scrip" -> "script" --- source/_docs/autostart/init.d.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_docs/autostart/init.d.markdown b/source/_docs/autostart/init.d.markdown index db3ff12fee1..9363ed07be6 100644 --- a/source/_docs/autostart/init.d.markdown +++ b/source/_docs/autostart/init.d.markdown @@ -14,7 +14,7 @@ Home Assistant can run as a daemon within init.d with the script below. ### {% linkable_title 1. Copy script %} -Copy either the daemon script or the Python environment scrip at the end of this page to `/etc/init.d/hass-daemon` depending on your installation. +Copy either the daemon script or the Python environment script at the end of this page to `/etc/init.d/hass-daemon` depending on your installation. After that, set the script to be executable: From 4904c47346d5e071da19cdf5f6a3561ec871e108 Mon Sep 17 00:00:00 2001 From: Roland Beck <7224371+Data-Monkey@users.noreply.github.com> Date: Sun, 16 Jun 2019 20:02:23 +1000 Subject: [PATCH 096/123] adding Simple Service Discovery Protocol (#9639) adding the full name to the acronym. SSDP - Simple Service Discovery Protocol --- source/_components/ssdp.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_components/ssdp.markdown b/source/_components/ssdp.markdown index 1a0fc4fb9b3..2a126bf4cca 100644 --- a/source/_components/ssdp.markdown +++ b/source/_components/ssdp.markdown @@ -1,6 +1,6 @@ --- layout: page -title: "SSDP" +title: "SSDP - Simple Service Discovery Protocol" description: "Discover integrations on the network using the SSDP protocol." date: 2019-06-02 18:50 sidebar: true @@ -12,7 +12,7 @@ ha_category: ha_release: 0.94 --- -The `ssdp` integration will scan the network for supported devices and services. Discovered integrations will show up in the discovered section on the integrations page in the config panel. +The `ssdp` "Simple Service Discovery Protocol" integration will scan the network for supported devices and services. Discovered integrations will show up in the discovered section on the integrations page in the config panel. Integrations can opt-in to be found by adding [an SSDP section](https://developers.home-assistant.io/docs/en/next/creating_integration_manifest.html#ssdp) to their manifest.json. From c10f95ca226ec5b429274b8d613a81efac7580a3 Mon Sep 17 00:00:00 2001 From: steckenpferd <39061622+steckenpferd@users.noreply.github.com> Date: Sun, 16 Jun 2019 12:36:42 +0200 Subject: [PATCH 097/123] Update homematicip_cloud.markdown (#9604) HmIP-BBL is delted from docu because not supported yet and needs to be added first --- source/_components/homematicip_cloud.markdown | 1 - 1 file changed, 1 deletion(-) diff --git a/source/_components/homematicip_cloud.markdown b/source/_components/homematicip_cloud.markdown index 4b5cafadb27..7f9f6c7c37b 100644 --- a/source/_components/homematicip_cloud.markdown +++ b/source/_components/homematicip_cloud.markdown @@ -116,7 +116,6 @@ authtoken: * Temperature and humidity Sensor with display (*HmIP-STHD*) * homematicip_cloud.cover - * Blind actuator for brand switches (*HmIP-BBL*) * Shutter actuator brand-mount (*HmIP-BROLL*) * Shutter actuator flush-mount (*HmIP-FROLL*) From 24dd703d778ed17647d95c8cfd069992282c735b Mon Sep 17 00:00:00 2001 From: Dubh Ad Date: Sun, 16 Jun 2019 13:55:51 +0100 Subject: [PATCH 098/123] Adding the warnings here (#9638) * Adding the warnings here * :pencil2: Tweak --- source/_docs/z-wave/installation.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/_docs/z-wave/installation.markdown b/source/_docs/z-wave/installation.markdown index 10b11875174..90ae61b3b13 100644 --- a/source/_docs/z-wave/installation.markdown +++ b/source/_docs/z-wave/installation.markdown @@ -123,6 +123,8 @@ You can also check what hardware has been found using the [hassio command](/hass $ hassio hardware info ``` +The `modemmanager` package will interfere with any Z-Wave (or Zigbee) stick and should be removed or disabled. Failure to do so will result in random failures of those components. For example you can disable with `sudo systemctl disable ModemManager` and remove with `sudo apt-get purge modemmanager` + ### {% linkable_title Docker %} You do not need to install any software to use Z-Wave. @@ -139,6 +141,8 @@ If the path of `/dev/ttyACM0` doesn't work then you can find the path of the sti $ ls -1tr /dev/tty*|tail -n 1 ``` +The `modemmanager` package will interfere with any Z-Wave (or Zigbee) stick and should be removed or disabled. Failure to do so will result in random failures of those components. For example you can disable with `sudo systemctl disable ModemManager` and remove with `sudo apt-get purge modemmanager` + ### {% linkable_title Hassbian %} You do not need to install any software to use Z-Wave. From 1686917201c990851f813795d3f073a570fdec49 Mon Sep 17 00:00:00 2001 From: noodlemctwoodle <15075388+noodlemctwoodle@users.noreply.github.com> Date: Sun, 16 Jun 2019 14:08:36 +0100 Subject: [PATCH 099/123] Updated Netdata documentation (#9606) * Updated Netdata documentation * Added missing `sensor:` tag * Added further examples and rephrased wording * Fixed `JSON` display issue * Fixed issues raised by fabaff reverted `system_load` to `load` modified full example removed comments from example * :pencil2: Tweak * :pencil2: Tweak * :pencil2: Tweak --- source/_components/netdata.markdown | 53 ++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 5 deletions(-) diff --git a/source/_components/netdata.markdown b/source/_components/netdata.markdown index a1e9444d8a5..6246eb756f2 100644 --- a/source/_components/netdata.markdown +++ b/source/_components/netdata.markdown @@ -43,21 +43,45 @@ $ curl -X GET "http://[Netdata_Instance]:19999/api/v1/data?chart=[data_group]&po - `dimension_names`: Names shown in the frontend. - `dimension_ids`: Names to use for `element`. +Alternatively you can browse to the built in Netdata API in your browser `http://[Netdata_Instance]:19999/api/v1/allmetrics?format=json` and search for the `data_group` identified in the Netdata frontend. In the example JSON below the data group is "system.load". + +```json + "system.load": { + "name":"system.load", + "context":"system.load", + "units":"load", + "last_updated": 1558446920, + "dimensions": { + "load1": { + "name": "load1", + "value": 0.1250000 + }, + "load5": { + "name": "load5", + "value": 0.1290000 + }, + "load15": { + "name": "load15", + "value": 0.1430000 + } + } + }, +``` + +Once the `data_group` "system.load" and the `element` "load15" have been identified from the JSON it can be configured in your configuration.yaml like the example below. + ## {% linkable_title Configuration %} -To add this platform to your installation, add the following to your `configuration.yaml` file: +Add the following to your `configuration.yaml`. ```yaml # Example configuration.yaml entry sensor: - platform: netdata - resources: + resources: load: data_group: system.load element: load15 - cpu: - data_group: system.cpu - element: system ``` {% configuration %} @@ -105,3 +129,22 @@ resources: type: boolean default: false {% endconfiguration %} + +### {% linkable_title Full Example %} + +```yaml +# Example configuration.yaml entry +sensor: + - platform: netdata + host: '192.168.1.2' + port: '19999' + name: SomeHostName + resources: + system_load: + data_group: system.load + element: load15 + core0_freq: + data_group: 'cpu.cpufreq' + element: 'cpu0' + icon: mdi:chip +``` From 8237545cd32172c9f0a6a5f99f3e6cc4d56d61d9 Mon Sep 17 00:00:00 2001 From: Rick Fletcher Date: Mon, 17 Jun 2019 11:18:15 -0400 Subject: [PATCH 100/123] Fix a typo (#9643) "in efficient" -> "inefficient" --- source/_docs/z-wave/installation.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_docs/z-wave/installation.markdown b/source/_docs/z-wave/installation.markdown index 90ae61b3b13..90e1bc7ede6 100644 --- a/source/_docs/z-wave/installation.markdown +++ b/source/_docs/z-wave/installation.markdown @@ -48,7 +48,7 @@ debug: type: boolean default: false autoheal: - description: Allows enabling auto Z-Wave heal at midnight. Warning, this is in efficient and [should not be used](https://github.com/home-assistant/architecture/issues/81#issuecomment-478444085). + description: Allows enabling auto Z-Wave heal at midnight. Warning, this is inefficient and [should not be used](https://github.com/home-assistant/architecture/issues/81#issuecomment-478444085). required: false type: boolean default: false From 852fc52adc5d95d1c5450a71b3b2759646c8084f Mon Sep 17 00:00:00 2001 From: Tomi Blinnikka Date: Mon, 17 Jun 2019 18:39:01 -0500 Subject: [PATCH 101/123] Fix `set_cover_tilt_position` position attribute (#9646) It looks like the correct attribute name is `tilt_position` not `position` for the `cover.set_cover_tilt_position`. Fixed doc and example. --- source/_components/cover.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_components/cover.markdown b/source/_components/cover.markdown index 90172534114..5eb2bab2e70 100644 --- a/source/_components/cover.markdown +++ b/source/_components/cover.markdown @@ -71,7 +71,7 @@ Set cover tilt position of one or multiple covers. | Service data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that point at `entity_id`'s of covers. Else targets all. -| `position` | no | Integer between 0 and 100. +| `tilt_position` | no | Integer between 0 and 100. #### {% linkable_title Automation example %} @@ -84,5 +84,5 @@ automation: - service: cover.set_cover_tilt_position data: entity_id: cover.demo - position: 50 + tilt_position: 50 ``` From cf5faeb2fccaa288c5cac2820bf614d1a89cffce Mon Sep 17 00:00:00 2001 From: Dubh Ad Date: Tue, 18 Jun 2019 00:43:03 +0100 Subject: [PATCH 102/123] Adding a big warning (#9645) Because people are following this, and installing a massively outdated version of HA, on hardware only fit for testing --- ...home-assistant-on-raspberry-pi-zero-in-30-minutes.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/_posts/2017-05-01-home-assistant-on-raspberry-pi-zero-in-30-minutes.markdown b/source/_posts/2017-05-01-home-assistant-on-raspberry-pi-zero-in-30-minutes.markdown index 81fd5620f0a..e6573538ed6 100644 --- a/source/_posts/2017-05-01-home-assistant-on-raspberry-pi-zero-in-30-minutes.markdown +++ b/source/_posts/2017-05-01-home-assistant-on-raspberry-pi-zero-in-30-minutes.markdown @@ -15,6 +15,10 @@ og_image: /images/blog/2017-05-hassbian-pi-zero/home_assistant_plus_rpi_600x315.

+

+ ***This article is very outdated*** guide. If you follow it you will be installing a very outdated version of Hassbian, on a hardware platform only suitable for testing. ***We strongly recommend you do not follow this article***. +

+ Saw the [announcement](/blog/2017/04/30/hassbian-1.21-its-about-time/) yesterday for HASSbian 1.21 and got super excited? Today we'll flash the latest HASSbian to a [Raspberry Pi Zero W](https://www.raspberrypi.org/products/pi-zero/). From b336f2aa65994316c869ec8f8f77a5c361ee7d91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6ren?= Date: Tue, 18 Jun 2019 02:03:11 +0200 Subject: [PATCH 103/123] Newer Mi Home App doesn (#9580) --- source/_components/vacuum.xiaomi_miio.markdown | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/source/_components/vacuum.xiaomi_miio.markdown b/source/_components/vacuum.xiaomi_miio.markdown index 1d956cfcdd4..750b8d12e1b 100644 --- a/source/_components/vacuum.xiaomi_miio.markdown +++ b/source/_components/vacuum.xiaomi_miio.markdown @@ -250,7 +250,7 @@ The information output is: To fetch the token follow these instructions depending on your mobile phone platform. -1. Configure the robot with the Mi-Home app. +1. Configure the robot with [Mi Home version 5.0.30](https://www.apkmirror.com/apk/xiaomi-inc/mihome/mihome-5-0-30-release/). 2. Download and extract the [MiToolKit.zip](https://github.com/ultrara1n/MiToolkit/releases). 3. Enable developer mode and USB debugging on the Android phone and plug it into the computer. 4. Change the MiToolKit language to English if you need to. @@ -278,7 +278,7 @@ source /srv/homeassistant/bin/activate To fetch the token follow these instructions depending on your mobile phone platform. -1. Configure the robot with the Mi-Home app. +1. Configure the robot with [Mi Home version 5.0.30](https://www.apkmirror.com/apk/xiaomi-inc/mihome/mihome-5-0-30-release/). 2. Enable developer mode, USB debugging and plug the Android phone into the computer. 3. Get ADB by running `apt-get install android-tools-adb` or `apt-get install adb`. 4. `adb devices` should list your device. Consult the ADB manual if necessary. @@ -313,7 +313,7 @@ source /srv/homeassistant/bin/activate To fetch the token follow these instructions depending on your mobile phone platform. -1. Configure the robot with the Mi-Home app. +1. Configure the robot with [Mi Home version 5.0.30](https://www.apkmirror.com/apk/xiaomi-inc/mihome/mihome-5-0-30-release/). 2. Enable developer mode, USB debugging and root permission only for ADB on the Android phone and plug it into the computer. 3. Get ADB (e.g, using `apt-get install android-tools-adb`). 4. The command `adb devices` should list your device. @@ -326,7 +326,7 @@ To fetch the token follow these instructions depending on your mobile phone plat ### {% linkable_title iOS %} -1. Configure the robot with the Mi-Home app. +1. Configure the robot with the Mi Home app. 2. Using iTunes, create an unencrypted backup of your iPhone. 3. Install [iBackup Viewer](https://www.imactools.com/iphonebackupviewer/), open it, and open your backup. 4. Open the "Raw Data" module. @@ -351,7 +351,7 @@ To fetch the token follow these instructions depending on your mobile phone plat 1. Configure the robot with the Mi-Home app. 2. Install [BlueStacks](https://www.bluestacks.com). -3. Set up the Mi-Home app in BlueStacks and login to synchronize devices. +3. Set up [Mi Home version 5.0.30](https://www.apkmirror.com/apk/xiaomi-inc/mihome/mihome-5-0-30-release/) in BlueStacks and login to synchronize devices. 4. Use [BlueStacks Tweaker](https://forum.xda-developers.com/general/general/bluestacks-tweaker-2-tool-modifing-t3622681) to access the filesystem and retrieve the token. ### {% linkable_title Selecting token manually (Windows and Android) %} @@ -361,10 +361,10 @@ The following instruction explained an alternative method, in case the MiToolKit Software Required: - Android ADB is contained in [Android SDK](https://developer.android.com/studio/releases/platform-tools) -- [Mi-Home version 5.0.30](https://www.apkmirror.com/apk/xiaomi-inc/mihome/mihome-5-0-30-release/) +- [Mi Home version 5.0.30](https://www.apkmirror.com/apk/xiaomi-inc/mihome/mihome-5-0-30-release/) - [Android Backup Extractor](https://sourceforge.net/projects/adbextractor/) - [SQLite Browser](https://sqlitebrowser.org/) -1. Install an old Version of MiHome (e.g. Mi-Home version 5.0.30) on your Android-Device +1. Install an old Version of MiHome (e.g. Mi Home version 5.0.30) on your Android-Device 2. Open MiHome, log-in and add your devices 3. Enable USB-Debugging on your Android 4. Create a backup from your MiHome App, by using adb From 52ef839611408d0a069e5286de50faf667191ea7 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 17 Jun 2019 20:08:25 -0700 Subject: [PATCH 104/123] Use more realistic trusted proxy --- source/_components/http.markdown | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/_components/http.markdown b/source/_components/http.markdown index de1a455dde8..3235e4667eb 100644 --- a/source/_components/http.markdown +++ b/source/_components/http.markdown @@ -119,8 +119,7 @@ http: - https://www.home-assistant.io use_x_forwarded_for: true trusted_proxies: - - 127.0.0.1 - - ::1 + - 10.0.0.200 ip_ban_enabled: true login_attempts_threshold: 5 ``` From 43bd679f0c0985b6b1e828678f33c835db9e3737 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 17 Jun 2019 20:26:43 -0700 Subject: [PATCH 105/123] Mention see service --- source/_posts/2019-06-05-release-94.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_posts/2019-06-05-release-94.markdown b/source/_posts/2019-06-05-release-94.markdown index 65cc9d00912..f8c89eaf35e 100644 --- a/source/_posts/2019-06-05-release-94.markdown +++ b/source/_posts/2019-06-05-release-94.markdown @@ -47,7 +47,7 @@ This will only impact you if you are running a custom installation of Home Assis This release also introduces a long overdue overhaul of how the device tracker works. We are introducing this overhaul piece by piece, focusing first on device tracker platforms that push their updates to Home Assistant: mobile app, OwnTracks, GeoFency, GPSLogger and Locative. -These integrations will no longer use `known_devices.yaml` but instead use entities, like all other integrations in Home Assistant. You can change the name and entity ID via the UI. It is no longer posible to merge the devices with other device tracker entities. This was flaky at best. You should now use the new person integration for this. +These integrations will no longer use `known_devices.yaml` but instead use entities, like all other integrations in Home Assistant. You can change the name and entity ID via the UI. It is no longer posible to merge the devices with other device tracker entities, this includes using the `see` service. This was flaky at best. You should now use the new person integration for this. ## {% linkable_title Improved hass.io builds %} From 6a186ee61d27dca4384a15672db3af0f97fa944c Mon Sep 17 00:00:00 2001 From: David Beitey Date: Tue, 18 Jun 2019 12:31:00 +0000 Subject: [PATCH 106/123] Note that changing automations reformats templates (#9275) --- source/_docs/automation/editor.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_docs/automation/editor.markdown b/source/_docs/automation/editor.markdown index 31bced2ddb0..6cec17b8b74 100644 --- a/source/_docs/automation/editor.markdown +++ b/source/_docs/automation/editor.markdown @@ -103,6 +103,6 @@ For example, the below automation will be triggered when the sun goes from below ```

-Any comments in the YAML file will be lost when you update an automation via the editor. +Any comments in the YAML file will be lost and templates will be reformatted when you update an automation via the editor.

From c31a4dc1b93613a3eb8c7647246b52c5102504a8 Mon Sep 17 00:00:00 2001 From: akasma74 Date: Tue, 18 Jun 2019 21:04:07 +0100 Subject: [PATCH 107/123] Clarification regarding last_xxx being in UTC (#9102) * Clarification regarding last_xxx being in UTC It worth to mention that last_xxx times are in UTC and should be converted to local time when exposed to user/exported in any human-readable form * :pencil2: Rewording --- source/_docs/configuration/state_object.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_docs/configuration/state_object.markdown b/source/_docs/configuration/state_object.markdown index fdb99ea0756..b4104383d92 100644 --- a/source/_docs/configuration/state_object.markdown +++ b/source/_docs/configuration/state_object.markdown @@ -23,8 +23,8 @@ Field | Description `state.domain` | Domain of the entity. Example: `light`. `state.object_id` | Object ID of entity. Example: `kitchen`. `state.name` | Name of the entity. Based on `friendly_name` attribute with fall back to object ID. Example: `Kitchen Ceiling`. -`state.last_updated` | Time the state was written to the state machine. Note that writing the exact same state including attributes will not result in this field being updated. Example: `2017-10-28 08:13:36.715874+00:00`. -`state.last_changed` | Time the state changed. This is not updated when there are only updated attributes. Example: `2017-10-28 08:13:36.715874+00:00`. +`state.last_updated` | Time the state was written to the state machine in UTC time. Note that writing the exact same state including attributes will not result in this field being updated. Example: `2017-10-28 08:13:36.715874+00:00`. +`state.last_changed` | Time the state changed in the state machine in UTC time. This is not updated when there are only updated attributes. Example: `2017-10-28 08:13:36.715874+00:00`. `state.attributes` | A dictionary with extra attributes related to the current state. The attributes of an entity are optional. There are a few attributes that are used by Home Assistant for representing the entity in a specific way. Each component will also have its own attributes to represent extra state data about the entity. For example, the light component has attributes for the current brightness and color of the light. When an attribute is not available, Home Assistant will not write it to the state. From 473090ee734f71362f5e265549da219cb8199ba9 Mon Sep 17 00:00:00 2001 From: tomlut <10679300+tomlut@users.noreply.github.com> Date: Wed, 19 Jun 2019 06:20:03 +1000 Subject: [PATCH 108/123] Remove invalid example (#9234) The example of a template for the name variable is not supported by the component. Templates are valid for the title and message only as evidenced by the component schema. --- source/_components/alert.markdown | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/source/_components/alert.markdown b/source/_components/alert.markdown index 30c42c90a5e..e1d74c78cc0 100644 --- a/source/_components/alert.markdown +++ b/source/_components/alert.markdown @@ -237,29 +237,6 @@ alert: The resulting message could be `Plant Officeplant needs help (moisture low)`. -The next example uses a template for the alert name. - -{% raw %} -```yaml -alert: - garage_door: - name: Garage has been open for {{ relative_time(states.binary_sensor.garage.last_changed) }} - done_message: Garage is closed - entity_id: binary_sensor.garage - state: 'on' - repeat: - - 30 - - 60 - - 120 - can_acknowledge: true - skip_first: true - notifiers: - - ryans_phone -``` -{% endraw %} - -The resulting title of the alert could be `Garage has been open for 30 min`. - ### {% linkable_title Additional parameters for notifiers %} Some notifiers support more parameters (e.g., to set text color or action From ab13c05f7a2ef2290d7c62eb10b07c142fc4d7fa Mon Sep 17 00:00:00 2001 From: Ron Schaeffer Date: Tue, 18 Jun 2019 21:57:37 +0100 Subject: [PATCH 109/123] Newer MDI icons not immediately available (#9416) * Newer MDI icons not immediately available Add a note that newer MDI icons may not be available in the current Home Assistant release. Confusion as to why certain icons don't show up is common in the Community. * :pencil2: Tweak * :pencil2: Additional space removal --- source/_docs/configuration/customizing-devices.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_docs/configuration/customizing-devices.markdown b/source/_docs/configuration/customizing-devices.markdown index 22215e1dda4..6d88f07afcb 100644 --- a/source/_docs/configuration/customizing-devices.markdown +++ b/source/_docs/configuration/customizing-devices.markdown @@ -58,7 +58,7 @@ entity_picture: required: false type: string icon: - description: Any icon from [MaterialDesignIcons.com](http://MaterialDesignIcons.com) ([Cheatsheet](https://cdn.materialdesignicons.com/3.5.95/)). Prefix name with `mdi:`, ie `mdi:home`. + description: "Any icon from [MaterialDesignIcons.com](http://MaterialDesignIcons.com) ([Cheatsheet](https://cdn.materialdesignicons.com/3.5.95/)). Prefix name with `mdi:`, ie `mdi:home`. Note: Newer icons may not yet be available in the current Home Assistant release. You can check when an icon was added to MaterialDesignIcons.com at [MDI History](https://materialdesignicons.com/history)." required: false type: string assumed_state: From c02aef683bdfe7f4acc867c6e7b594940ec33c9a Mon Sep 17 00:00:00 2001 From: Rick Rubino Date: Tue, 18 Jun 2019 14:11:06 -0700 Subject: [PATCH 110/123] edited hold modes for clarity (#9485) --- source/_components/ecobee.markdown | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/_components/ecobee.markdown b/source/_components/ecobee.markdown index 50111254a4e..fc20a8e1730 100644 --- a/source/_components/ecobee.markdown +++ b/source/_components/ecobee.markdown @@ -320,7 +320,7 @@ are not implemented for this thermostat. ### {% linkable_title Service `set_away_mode` %} -Turns the away mode on or off for the thermostat. +Turns Away Mode on or off, ignoring the next scheduled activity. This setting will override the thermostat Hold Duration setting, even if you set the hold duration to "Until the next scheduled activity" within thermostat preferences. | Service data attribute | Optional | Description | | ---------------------- | -------- | ----------- | @@ -330,12 +330,12 @@ Turns the away mode on or off for the thermostat. ### {% linkable_title Service `set_hold_mode` %} Puts the thermostat into the given hold mode. For 'home', 'away', 'sleep', -and any other hold based on a reference climate, the -target temperature is taken from the reference climate. +and any other hold based on a comfort setting, the +target temperature is set to whatever is programmed in the comfort setting. For 'temp', the current temperature is taken as the target temperature. When None is provided as parameter, the hold_mode is turned off. -It is not possible to set a vacation hold; such hold has to be -defined on the thermostat directly. However, a vacation hold can be +If the thermostat Hold Duration is set to "Until the next scheduled activity" within thermostat preferences, then the next scheduled activity will change this hold mode. +Note that it is not possible to set a vacation hold; this must be defined on the thermostat directly. However, a vacation hold can be canceled. | Service data attribute | Optional | Description | From adb4d0c9bab1b15a67d803ec24561602e8985cb6 Mon Sep 17 00:00:00 2001 From: Matt N Date: Tue, 18 Jun 2019 14:14:43 -0700 Subject: [PATCH 111/123] Remove documentation on removed `excluded_entities` key (#9442) Removed in https://github.com/home-assistant/home-assistant-polymer/pull/2754 --- source/lovelace/yaml-mode.markdown | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/source/lovelace/yaml-mode.markdown b/source/lovelace/yaml-mode.markdown index 7d8e5c6c357..245a00dea21 100644 --- a/source/lovelace/yaml-mode.markdown +++ b/source/lovelace/yaml-mode.markdown @@ -46,9 +46,7 @@ resources: # Optional background for all views. Check https://developer.mozilla.org/en-US/docs/Web/CSS/background for more examples. background: center / cover no-repeat url("/background.png") fixed -# Exclude entities from "Unused entities" view -excluded_entities: - - weblink.router + views: # View tab title. - title: Example From a8767d55ea2b61f584670f3e2854c1a50d97a276 Mon Sep 17 00:00:00 2001 From: tiagofreire-pt <41837236+tiagofreire-pt@users.noreply.github.com> Date: Tue, 18 Jun 2019 22:20:14 +0100 Subject: [PATCH 112/123] Deleting config/emulated_hue_ids.json to reset (#9491) * Deleting config/emulated_hue_ids.json to reset * :pencil2: Tweaks --- source/_components/emulated_hue.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/emulated_hue.markdown b/source/_components/emulated_hue.markdown index 2eea6c16acd..46baf20fee9 100644 --- a/source/_components/emulated_hue.markdown +++ b/source/_components/emulated_hue.markdown @@ -32,7 +32,7 @@ It is recommended to assign a static IP address to the computer running Home Ass

-Both Google Home and Alexa use the device they were initially set up with for communication with emulated_hue. In other words: if you remove/replace this device you will also break emulated_hue. +Both Google Home and Alexa use the device they were initially set up with for communication with `emulated_hue`. In other words: if you remove/replace this device you will also break `emulated_hue`. To recover your `emulated_hue` functionality, backup your `config/emulated_hue_ids.json` file, delete the original one and reboot your Home Assistant instance.

### {% linkable_title Configuration %} From f73c073a8097e8cde4b37f049aa0ef3614750983 Mon Sep 17 00:00:00 2001 From: Jeff Irion Date: Tue, 18 Jun 2019 14:39:54 -0700 Subject: [PATCH 113/123] Fix logger examples (great migration) (#9567) * Fix logger examples (great migration) * Proposed change Probably doesn't make a lot of sense to drill down into sub-packages of a component. * Change examples * Set log level for MQTT integration and SmartThings light component --- source/_components/logger.markdown | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/source/_components/logger.markdown b/source/_components/logger.markdown index bfeb048e5a1..9d186deb679 100644 --- a/source/_components/logger.markdown +++ b/source/_components/logger.markdown @@ -33,8 +33,7 @@ components: logger: default: info logs: - homeassistant.components.device_tracker: critical - homeassistant.components.camera: critical + homeassistant.components.yamaha: critical custom_components.my_integration: critical ``` @@ -46,11 +45,20 @@ components: logger: default: critical logs: - homeassistant.components: info - homeassistant.components.rfxtrx: debug - homeassistant.components.device_tracker: critical - homeassistant.components.camera: critical + # log level for HA core + homeassistant.core: fatal + + # log level for MQTT integration + homeassistant.components.mqtt: warning + + # log level for SmartThings lights + homeassistant.components.smartthings.light: info + + # log level for a custom component custom_components.my_integration: debug + + # log level for the `aiohttp` Python package + aiohttp: error ``` {% configuration %} @@ -107,9 +115,11 @@ An example call might look like this: ```yaml service: logger.set_level data: - homeassistant.components: warning - homeassistant.components.media_player.yamaha: debug + homeassistant.core: fatal + homeassistant.components.mqtt: warning + homeassistant.components.smartthings.light: info custom_components.my_integration: debug + aiohttp: error ``` The log information are stored in the From be3c1cbc68ea795825433c419c69faea1a27a469 Mon Sep 17 00:00:00 2001 From: kloggy <38220016+kloggy@users.noreply.github.com> Date: Tue, 18 Jun 2019 22:47:43 +0100 Subject: [PATCH 114/123] Document the default for with_group option (#9598) * Document the default for with_group option * :pencil2: Tweak --- source/_components/sonos.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_components/sonos.markdown b/source/_components/sonos.markdown index d7b259d8123..096ac6d69a0 100644 --- a/source/_components/sonos.markdown +++ b/source/_components/sonos.markdown @@ -35,7 +35,7 @@ The queue is not snapshotted and must be left untouched until the restore. Using | Service data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | The speakers to snapshot. -| `with_group` | yes | Should we also snapshot the group layout and the state of other speakers in the group. +| `with_group` | yes | Should we also snapshot the group layout and the state of other speakers in the group, defaults to true. ### {% linkable_title Service `sonos.restore` %} @@ -53,7 +53,7 @@ A cloud queue cannot be restarted. This includes queues started from within Spot | Service data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of `entity_id`s that should have their snapshot restored. -| `with_group` | yes | Should we also restore the group layout and the state of other speakers in the group. +| `with_group` | yes | Should we also restore the group layout and the state of other speakers in the group, defaults to true. ### {% linkable_title Service `sonos.join` %} From 2b7e68d31bcab6bf44a13395ae13b98044263be5 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 19 Jun 2019 00:27:58 +0200 Subject: [PATCH 115/123] Get stale bot of the PRs that have parents (#9650) --- .github/stale.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/stale.yml b/.github/stale.yml index e5b0f5e954c..304bb82e08f 100644 --- a/.github/stale.yml +++ b/.github/stale.yml @@ -3,9 +3,8 @@ daysUntilStale: 60 # Number of days of inactivity before a stale issue is closed daysUntilClose: 7 # Issues with these labels will never be considered stale -#exemptLabels: -# - pinned -# - security +exemptLabels: + - has-parent # Label to use when marking an issue as stale staleLabel: Stale # Comment to post when marking an issue as stale. Set to `false` to disable From 4a9e3258f53d4526190aca187f522f94dbb499fb Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 19 Jun 2019 01:08:40 +0200 Subject: [PATCH 116/123] =?UTF-8?q?=F0=9F=94=A8=20Integrations=20are=20the?= =?UTF-8?q?=20new=20components=20(#9651)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Franck Nijhof --- source/_includes/asides/component_navigation.html | 2 +- source/_includes/custom/navigation.html | 2 +- source/components/index.html | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/source/_includes/asides/component_navigation.html b/source/_includes/asides/component_navigation.html index dddc682c23d..c6806297017 100644 --- a/source/_includes/asides/component_navigation.html +++ b/source/_includes/asides/component_navigation.html @@ -43,7 +43,7 @@ {%- if page.ha_config_flow -%}
- This component is configurable via UI + This integration is configurable via UI
{%- endif -%} diff --git a/source/_includes/custom/navigation.html b/source/_includes/custom/navigation.html index 6af93d4b49e..62da4e0523c 100644 --- a/source/_includes/custom/navigation.html +++ b/source/_includes/custom/navigation.html @@ -10,7 +10,7 @@ {% endcomment %}
  • Getting started
  • -
  • Components
  • +
  • Integrations
  • Docs
  • Examples
  • Blog
  • diff --git a/source/components/index.html b/source/components/index.html index 6278af8d5f4..d817a2c2adb 100644 --- a/source/components/index.html +++ b/source/components/index.html @@ -1,6 +1,6 @@ --- layout: page -title: "Components" +title: "Integrations" description: "List of the built-in components of Home Assistant." date: 2014-12-21 13:35 sidebar: false @@ -30,7 +30,7 @@ regenerate: false {%- assign categories = components | map: 'ha_category' | join: ',' | join: ',' | split: ',' | uniq | sort -%}

    -Support for these components is provided by the Home Assistant community. +Support for these integrations is provided by the Home Assistant community.

    @@ -61,7 +61,7 @@ Support for these components is provided by the Home Assistant community.
    From 28a2cba70903612bba1051badc428f8906dce41c Mon Sep 17 00:00:00 2001 From: Robert Date: Wed, 19 Jun 2019 08:12:09 +0200 Subject: [PATCH 117/123] [Utility Meter] Add template sensors to DSMR example (#9602) * Add template sensors to DSMR example Add a daily and monthly template sensor to DSMR example that sum peak and off peak usage * Try new syntax * Surround jinja in yaml with raw --- source/_components/utility_meter.markdown | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/source/_components/utility_meter.markdown b/source/_components/utility_meter.markdown index a186c0ad8e1..509c03984dc 100644 --- a/source/_components/utility_meter.markdown +++ b/source/_components/utility_meter.markdown @@ -184,3 +184,23 @@ utility_meter: source: sensor.gas_consumption cycle: monthly ``` + +Additionally, you can add template sensors to compute daily and monthly total usage. + +{% raw %} +```yaml +sensor: + - platform: template + sensors: + daily_power: + friendly_name: Daily Power + icon: mdi:counter + unit_of_measurement: kWh + value_template: {{ states('sensor.daily_power_offpeak')|float + states('sensor.daily_power_peak')|float }} + monthly_power: + friendly_name: Monthly Power + icon: mdi:counter + unit_of_measurement: kWh + value_template: {{ states('sensor.monthly_power_offpeak')|float + states('sensor.monthly_power_peak')|float }} +``` +{% endraw %} From d0e59b0d3a0318905a8af24fe5148e275b124b41 Mon Sep 17 00:00:00 2001 From: MeIchthys Date: Wed, 19 Jun 2019 02:15:50 -0400 Subject: [PATCH 118/123] minior gramatical fix (#9652) change "delivery" to "deliver" --- source/_components/mastodon.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/mastodon.markdown b/source/_components/mastodon.markdown index 49ae65074f7..dafa44fbbaa 100644 --- a/source/_components/mastodon.markdown +++ b/source/_components/mastodon.markdown @@ -15,7 +15,7 @@ redirect_from: - /components/notify.mastodon/ --- -The `mastodon` platform uses [Mastodon](https://joinmastodon.org/) to delivery notifications from Home Assistant. +The `mastodon` platform uses [Mastodon](https://joinmastodon.org/) to deliver notifications from Home Assistant. ### {% linkable_title Setup %} From 1e46c4fcbe78a92fc07822460dca60ea013131a8 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 19 Jun 2019 15:12:14 +0200 Subject: [PATCH 119/123] Component(s) -> Integration(s) (#9656) Signed-off-by: Franck Nijhof --- source/_addons/snips.markdown | 2 +- .../custom_panel_using_react.markdown | 2 +- .../notify_if__new_ha_release.markdown | 2 +- .../python_component_automation.markdown | 4 ++-- .../python_component_mqtt_basic.markdown | 4 ++-- .../python_component_simple_alarm.markdown | 4 ++-- source/_cookbook/track_battery_level.markdown | 2 +- source/_docs/authentication.markdown | 2 +- source/_docs/automation/editor.markdown | 2 +- source/_docs/automation/trigger.markdown | 2 +- .../_docs/automation/troubleshooting.markdown | 2 +- source/_docs/backend/updater.markdown | 4 ++-- source/_docs/configuration.markdown | 2 +- source/_docs/configuration/events.markdown | 8 ++++---- source/_docs/configuration/packages.markdown | 10 +++++----- .../configuration/platform_options.markdown | 6 +++--- source/_docs/configuration/securing.markdown | 4 ++-- .../splitting_configuration.markdown | 12 ++++++------ .../_docs/configuration/state_object.markdown | 2 +- source/_docs/configuration/templating.markdown | 4 ++-- .../configuration/troubleshooting.markdown | 18 +++++++++--------- source/_docs/configuration/yaml.markdown | 4 ++-- source/_docs/ecosystem/appdaemon/api.markdown | 10 +++++----- .../ecosystem/appdaemon/operation.markdown | 2 +- .../certificates/lets_encrypt.markdown | 4 ++-- source/_docs/ecosystem/ios.markdown | 14 +++++++------- .../_docs/ecosystem/ios/notifications.markdown | 4 ++-- source/_docs/installation.markdown | 6 +++--- source/_docs/installation/docker.markdown | 2 +- .../hassbian/integrations.markdown | 6 +++--- source/_docs/mqtt/broker.markdown | 2 +- source/_docs/mqtt/discovery.markdown | 4 ++-- source/_docs/mqtt/logging.markdown | 2 +- source/_docs/mqtt/service.markdown | 2 +- source/_docs/scripts.markdown | 4 ++-- source/_docs/scripts/editor.markdown | 2 +- source/_docs/scripts/service-calls.markdown | 6 +++--- source/_docs/security.markdown | 2 +- source/_docs/tools/dev-tools.markdown | 6 +++--- source/_docs/z-wave/devices.markdown | 2 +- source/_docs/z-wave/installation.markdown | 6 +++--- source/_docs/z-wave/services.markdown | 2 +- source/_faq/component.markdown | 6 +++--- .../_faq/problems-with-dependencies.markdown | 2 +- source/components/index.html | 2 +- source/cookbook/index.markdown | 2 +- .../architecture_components.markdown | 2 +- source/developers/component_discovery.markdown | 2 +- source/developers/component_loading.markdown | 2 +- source/developers/creating_components.markdown | 2 +- .../custom_component_localization.markdown | 2 +- source/hassio/run_local.markdown | 2 +- source/help/reporting_issues.markdown | 4 ++-- source/lovelace/yaml-mode.markdown | 2 +- source/privacy/index.markdown | 2 +- 55 files changed, 111 insertions(+), 111 deletions(-) diff --git a/source/_addons/snips.markdown b/source/_addons/snips.markdown index d8d1255bfe1..90ae974b03c 100644 --- a/source/_addons/snips.markdown +++ b/source/_addons/snips.markdown @@ -17,7 +17,7 @@ The Snips add-on depends on the Mosquitto add on to bridge to Home Assistant, so Home Assistant comes with certain Intents builtin to handle common tasks. A complete list of Intents can be found in this wiki [Hass Snips Bundle](https://github.com/tschmidty69/hass-snips-bundle-intents/wiki). -The Snips add-on by default comes with an assistant that allows you to turn on lights or switches, open covers, or add and list items to a shopping list if that component is enabled. +The Snips add-on by default comes with an assistant that allows you to turn on lights or switches, open covers, or add and list items to a shopping list if that integration is enabled. If using a USB microphone and speakers plugged into the Raspberry Pi output, Snips will work without any change to the configuration. Trying saying things like: diff --git a/source/_cookbook/custom_panel_using_react.markdown b/source/_cookbook/custom_panel_using_react.markdown index f63db13c591..7a1d132618a 100644 --- a/source/_cookbook/custom_panel_using_react.markdown +++ b/source/_cookbook/custom_panel_using_react.markdown @@ -15,7 +15,7 @@ This is a [React](https://facebook.github.io/react/) implementation of [TodoMVC] - It uses React to render the data. - It hooks into Home Assistant JS which means updates pushed from the server are instantly rendered. - It accesses properties made available from Polymer. -- It uses the user configuration for the component in the `configuration.yaml` file for rendering. +- It uses the user configuration for the integration in the `configuration.yaml` file for rendering. - It allows toggling the sidebar. [Download the source for React Starter Kit here](https://github.com/home-assistant/custom-panel-starter-kit-react). Copy the file to `/panels/` (you might have to create the directory if it doesn't exist). diff --git a/source/_cookbook/notify_if__new_ha_release.markdown b/source/_cookbook/notify_if__new_ha_release.markdown index bb32d0e32e4..e502d7b5a8c 100644 --- a/source/_cookbook/notify_if__new_ha_release.markdown +++ b/source/_cookbook/notify_if__new_ha_release.markdown @@ -48,7 +48,7 @@ automation: service: notify.pushbullet data_template: title: 'New Home Assistant Release' - target: 'YOUR_TARGET_HERE' #See Pushbullet component for usage + target: 'YOUR_TARGET_HERE' #See Pushbullet integration for usage message: "Home Assistant {% raw %} {{ states.updater.updater.state }} {% endraw %} is now available." ``` diff --git a/source/_cookbook/python_component_automation.markdown b/source/_cookbook/python_component_automation.markdown index f04b37ed002..e511c8b118d 100644 --- a/source/_cookbook/python_component_automation.markdown +++ b/source/_cookbook/python_component_automation.markdown @@ -10,7 +10,7 @@ footer: true ha_category: Automation in Python Examples --- -Example component to target an `entity_id` to: +Example integration to target an `entity_id` to: - turn it on at 7AM in the morning - turn it on if anyone comes home and it is off @@ -57,7 +57,7 @@ from homeassistant.helpers.event import (async_track_state_change, # The domain of your component. Should be equal to the name of your component. DOMAIN = "example" -# List of component names (string) your component depends upon. +# List of integration names (string) your integration depends upon. # We depend on group because group will be loaded after all the components that # initialize devices have been setup. DEPENDENCIES = ['group', 'device_tracker', 'light'] diff --git a/source/_cookbook/python_component_mqtt_basic.markdown b/source/_cookbook/python_component_mqtt_basic.markdown index 8012f01ab2e..c7e09c8ee25 100644 --- a/source/_cookbook/python_component_mqtt_basic.markdown +++ b/source/_cookbook/python_component_mqtt_basic.markdown @@ -24,7 +24,7 @@ import homeassistant.loader as loader # The domain of your component. Should be equal to the name of your component. DOMAIN = 'hello_mqtt' -# List of component names (string) your component depends upon. +# List of integration names (string) your integration depends upon. DEPENDENCIES = ['mqtt'] @@ -63,7 +63,7 @@ def setup(hass, config): return True ``` -Load the component by adding the following to your `configuration.yaml`. When your component is loaded, a new entity should popup and there should be a new service available to call. +Load the integration by adding the following to your `configuration.yaml`. When your integration is loaded, a new entity should popup and there should be a new service available to call. ```yaml # configuration.yaml entry diff --git a/source/_cookbook/python_component_simple_alarm.markdown b/source/_cookbook/python_component_simple_alarm.markdown index e212f5d5255..80ae163161b 100644 --- a/source/_cookbook/python_component_simple_alarm.markdown +++ b/source/_cookbook/python_component_simple_alarm.markdown @@ -10,9 +10,9 @@ footer: true ha_category: Automation in Python Examples --- -This example component will detect intruders. It does so by checking if lights are being turned on while there is no one at home. When this happens it will turn the lights red, flash them for 30 seconds and send a message via [the notify component](/components/notify/). It will also flash a specific light when a known person comes home. +This example integration will detect intruders. It does so by checking if lights are being turned on while there is no one at home. When this happens it will turn the lights red, flash them for 30 seconds and send a message via [the notify component](/components/notify/). It will also flash a specific light when a known person comes home. -This component depends on the components [device_tracker](/components/device_tracker/) and [light](/components/light/) being setup. +This integration depends on the integrations [device_tracker](/components/device_tracker/) and [light](/components/light/) being setup. To set it up, add the following lines to your `configuration.yaml` file: diff --git a/source/_cookbook/track_battery_level.markdown b/source/_cookbook/track_battery_level.markdown index 902e2e4aaa2..f0203b3f252 100644 --- a/source/_cookbook/track_battery_level.markdown +++ b/source/_cookbook/track_battery_level.markdown @@ -12,7 +12,7 @@ ha_category: Automation Examples ### {% linkable_title iOS Devices %} -If you have a device running iOS (iPhone, iPad, etc), The [iCloud](/components/device_tracker.icloud/) component is gathering various details about your device including the battery level. To display it in the Frontend use a [template sensor](/components/sensor.template/). You can also use the `battery` [sensor device class](/components/sensor/#device-class) to dynamically change the icon with the battery level. +If you have a device running iOS (iPhone, iPad, etc), The [iCloud](/components/device_tracker.icloud/) integration is gathering various details about your device including the battery level. To display it in the Frontend use a [template sensor](/components/sensor.template/). You can also use the `battery` [sensor device class](/components/sensor/#device-class) to dynamically change the icon with the battery level. {% raw %} ```yaml diff --git a/source/_docs/authentication.markdown b/source/_docs/authentication.markdown index c466826a196..084846798c5 100644 --- a/source/_docs/authentication.markdown +++ b/source/_docs/authentication.markdown @@ -73,7 +73,7 @@ If you see this, you need to add an [`api_password`](/components/http/#api_passw ### {% linkable_title Bearer token informational messages %} -If you see the following, then this is a message for component developers, to tell them they need to update how they authenticate to Home Assistant. As an end user you don't need to do anything: +If you see the following, then this is a message for integration developers, to tell them they need to update how they authenticate to Home Assistant. As an end user you don't need to do anything: ```txt INFO (MainThread) [homeassistant.components.http.auth] You need to use a bearer token to access /blah/blah from 192.0.2.4 diff --git a/source/_docs/automation/editor.markdown b/source/_docs/automation/editor.markdown index 6cec17b8b74..736efb0a3c1 100644 --- a/source/_docs/automation/editor.markdown +++ b/source/_docs/automation/editor.markdown @@ -52,7 +52,7 @@ config: The automation editor reads and writes to the file `automations.yaml` in the root of your [configuration](/docs/configuration/) folder. Currently, both the name of this file and its location are fixed. -Make sure that you have set up the automation component to read from it: +Make sure that you have set up the automation integration to read from it: ```yaml # Configuration.yaml example diff --git a/source/_docs/automation/trigger.markdown b/source/_docs/automation/trigger.markdown index 0fc3d9991d6..4e0daa16754 100644 --- a/source/_docs/automation/trigger.markdown +++ b/source/_docs/automation/trigger.markdown @@ -16,7 +16,7 @@ Triggers are what starts the processing of an automation rule. It is possible to Triggers when an event is being processed. Events are the raw building blocks of Home Assistant. You can match events on just the event name or also require specific event data to be present. -Events can be fired by components or via the API. There is no limitation to the types. A list of built-in events can be found [here](/docs/configuration/events/). +Events can be fired by integrations or via the API. There is no limitation to the types. A list of built-in events can be found [here](/docs/configuration/events/). ```yaml automation: diff --git a/source/_docs/automation/troubleshooting.markdown b/source/_docs/automation/troubleshooting.markdown index 86cf9c9e479..e6780407d05 100644 --- a/source/_docs/automation/troubleshooting.markdown +++ b/source/_docs/automation/troubleshooting.markdown @@ -19,7 +19,7 @@ INFO [homeassistant.components.automation] Initialized rule Rainy Day INFO [homeassistant.components.automation] Initialized rule Rain is over ``` -The Logbook component will show a line entry when an automation is triggered. You can look at the previous entry to determine which trigger in the rule triggered the event. +The Logbook integration will show a line entry when an automation is triggered. You can look at the previous entry to determine which trigger in the rule triggered the event. ![Logbook example](/images/components/automation/logbook.png) diff --git a/source/_docs/backend/updater.markdown b/source/_docs/backend/updater.markdown index 8551fff955e..e7a5ea9ad7d 100644 --- a/source/_docs/backend/updater.markdown +++ b/source/_docs/backend/updater.markdown @@ -1,7 +1,7 @@ --- layout: page title: "Updater" -description: "Details what the updater component is reporting about your Home Assistant instance." +description: "Details what the updater integration is reporting about your Home Assistant instance." date: 2016-10-22 08:00 sidebar: true comments: false @@ -12,7 +12,7 @@ redirect_from: /details/updater/ Starting with 0.31 the [updater component](/components/updater/) sends an optional report about Home Assistant instance. -If you want to opt-in to include component information, add `include_used_components` to your config. This will allow the Home Assistant developers to focus development efforts on the most popular components. +If you want to opt-in to include integration information, add `include_used_components` to your config. This will allow the Home Assistant developers to focus development efforts on the most popular components. ```yaml updater: diff --git a/source/_docs/configuration.markdown b/source/_docs/configuration.markdown index 2955704fbcf..ff8f705d276 100644 --- a/source/_docs/configuration.markdown +++ b/source/_docs/configuration.markdown @@ -25,7 +25,7 @@ The location of the folder differs between operating systems: If you want to use a different folder for configuration, use the config command line parameter: `hass --config path/to/config`. -Inside your configuration folder is the file `configuration.yaml`. This is the main file that contains components to be loaded with their configurations. Throughout the documentation you will find snippets that you can add to your configuration file to enable functionality. +Inside your configuration folder is the file `configuration.yaml`. This is the main file that contains integrations to be loaded with their configurations. Throughout the documentation you will find snippets that you can add to your configuration file to enable functionality. If you run into trouble while configuring Home Assistant, have a look at the [configuration troubleshooting page](/getting-started/troubleshooting-configuration/) and at the [configuration.yaml examples](/cookbook/#example-configurationyaml). diff --git a/source/_docs/configuration/events.markdown b/source/_docs/configuration/events.markdown index 187e757e0f1..714842fa24a 100644 --- a/source/_docs/configuration/events.markdown +++ b/source/_docs/configuration/events.markdown @@ -10,12 +10,12 @@ footer: true redirect_from: /topics/events/ --- -The core of Home Assistant is the event bus. The event bus allows any component to fire or listen for events. It is the core of everything. For example, any state change will be announced on the event bus as a `state_changed` event containing the previous and the new state of an entity. +The core of Home Assistant is the event bus. The event bus allows any integration to fire or listen for events. It is the core of everything. For example, any state change will be announced on the event bus as a `state_changed` event containing the previous and the new state of an entity. Home Assistant contains a few built-in events that are used to coordinate between various components. ### {% linkable_title Event `homeassistant_start` %} -Event `homeassistant_start` is fired when all components from the configuration have been initialized. This is the event that will start the timer firing off `time_changed` events. +Event `homeassistant_start` is fired when all integrations from the configuration have been initialized. This is the event that will start the timer firing off `time_changed` events.

    Starting 0.42, it is no longer possible to listen for event `homeassistant_start`. Use the 'homeassistant' [platform](/docs/automation/trigger) instead. @@ -84,8 +84,8 @@ Field | Description ### {% linkable_title Event `component_loaded` %} -Event `component_loaded` is fired when a new component has been loaded and initialized. +Event `component_loaded` is fired when a new integration has been loaded and initialized. Field | Description ----- | ----------- -`component` | Domain of the component that has just been initialized. Example: `light`. +`component` | Domain of the integration that has just been initialized. Example: `light`. diff --git a/source/_docs/configuration/packages.markdown b/source/_docs/configuration/packages.markdown index 91285f8c301..f8cdb5dc628 100644 --- a/source/_docs/configuration/packages.markdown +++ b/source/_docs/configuration/packages.markdown @@ -10,7 +10,7 @@ footer: true redirect_from: /topics/packages/ --- -Packages in Home Assistant provide a way to bundle different component's configuration together. We already learned about the two configuration styles (specifying platforms entries together or individually) on the [adding devices](/docs/configuration/devices/) page. Both of these configuration methods require you to create the component key in the main `configuration.yaml` file. With packages we have a way to include different components, or different configuration parts using any of the `!include` directives introduced in [splitting the configuration](/docs/configuration/splitting_configuration). +Packages in Home Assistant provide a way to bundle different component's configuration together. We already learned about the two configuration styles (specifying platforms entries together or individually) on the [adding devices](/docs/configuration/devices/) page. Both of these configuration methods require you to create the integration key in the main `configuration.yaml` file. With packages we have a way to include different components, or different configuration parts using any of the `!include` directives introduced in [splitting the configuration](/docs/configuration/splitting_configuration).

    Note that if you use packages for your configuration, the configuration reloading buttons in the configuration panel will not reload your packages. @@ -26,7 +26,7 @@ homeassistant: ...package configuration here... ``` -The package configuration can include: `switch`, `light`, `automation`, `groups`, or most other Home Assistant components including hardware platforms. +The package configuration can include: `switch`, `light`, `automation`, `groups`, or most other Home Assistant integrations including hardware platforms. It can be specified inline or in a separate YAML file using `!include`. @@ -67,7 +67,7 @@ light: There are some rules for packages that will be merged: -1. Platform based components (`light`, `switch`, etc) can always be merged. +1. Platform based integrations (`light`, `switch`, etc) can always be merged. 2. Components where entities are identified by a key that will represent the entity_id (`{key: config}`) need to have unique 'keys' between packages and the main configuration file. For example if we have the following in the main config. You are not allowed to re-use "my_input" again for `input_boolean` in a package: @@ -76,10 +76,10 @@ There are some rules for packages that will be merged: input_boolean: my_input: ``` -3. Any component that is not a platform [2], or dictionaries with Entity ID keys [3] can only be merged if its keys, except those for lists, are solely defined once. +3. Any integration that is not a platform [2], or dictionaries with Entity ID keys [3] can only be merged if its keys, except those for lists, are solely defined once.

    -Components inside packages can only specify platform entries using configuration style 1, where all the platforms are grouped under the component name. +Components inside packages can only specify platform entries using configuration style 1, where all the platforms are grouped under the integration name.

    ### {% linkable_title Create a packages folder %} diff --git a/source/_docs/configuration/platform_options.markdown b/source/_docs/configuration/platform_options.markdown index 86ad9d7a7cd..b0240f5507e 100644 --- a/source/_docs/configuration/platform_options.markdown +++ b/source/_docs/configuration/platform_options.markdown @@ -1,7 +1,7 @@ --- layout: page -title: "Entity component platform options" -description: "Shows how to customize polling interval for any component via configuration.yaml." +title: "Entity integration platform options" +description: "Shows how to customize polling interval for any integration via configuration.yaml." date: 2016-02-12 23:17 -0800 sidebar: true comments: false @@ -12,7 +12,7 @@ redirect_from: /topics/platform_options/

    These options are being phased out and are only available for single platform integrations.

    -Some components or platforms (those that are based on the [entity](https://github.com/home-assistant/home-assistant/blob/dev/homeassistant/helpers/entity.py) class) allows various extra options to be set. +Some integrations or platforms (those that are based on the [entity](https://github.com/home-assistant/home-assistant/blob/dev/homeassistant/helpers/entity.py) class) allows various extra options to be set. ### {% linkable_title Entity namespace %} diff --git a/source/_docs/configuration/securing.markdown b/source/_docs/configuration/securing.markdown index 8a7ce30eb1f..4c2078e029f 100644 --- a/source/_docs/configuration/securing.markdown +++ b/source/_docs/configuration/securing.markdown @@ -19,7 +19,7 @@ Here's the summary of what you *must* do to secure your Home Assistant system: - Configure [secrets](/docs/configuration/secrets/) (but do remember to back them up) - Regularly keep the system up to date -If you only want to use components supported by [Home Assistant cloud](/cloud/) then you don't need to enable remote access. This is obviously the most secure option, but does mean that you're relying on a cloud service for that functionality. +If you only want to use integrations supported by [Home Assistant cloud](/cloud/) then you don't need to enable remote access. This is obviously the most secure option, but does mean that you're relying on a cloud service for that functionality. - For remote access to the UI, use a [VPN](http://www.pivpn.io/), [Tor](/docs/ecosystem/tor/) or an [SSH tunnel](/blog/2017/11/02/secure-shell-tunnel/) - For remote access for components, use a [TLS/SSL](/docs/ecosystem/certificates/lets_encrypt/) certificate @@ -45,7 +45,7 @@ If you only want remote access for access to the web UI then we advise that you - [Tor](/docs/ecosystem/tor/), which also avoids the need for port forwarding - An [SSH tunnel](/blog/2017/11/02/secure-shell-tunnel/) to connect to your frontend -### {% linkable_title Remote access for components %} +### {% linkable_title Remote access for integrations %} For remote access for a component, for example, a device tracker, you have to enable access to the API by: diff --git a/source/_docs/configuration/splitting_configuration.markdown b/source/_docs/configuration/splitting_configuration.markdown index a789dec549c..40e33efb01e 100644 --- a/source/_docs/configuration/splitting_configuration.markdown +++ b/source/_docs/configuration/splitting_configuration.markdown @@ -38,7 +38,7 @@ Note that each line after `homeassistant:` is indented two (2) spaces. Since the `!include filename.yaml` is the statement that tells Home Assistant to insert the contents of `filename.yaml` at that point. This is how we are going to break a monolithic and hard to read file (when it gets big) into more manageable chunks. -Now before we start splitting out the different components, let's look at the other components (in our example) that will stay in the base file: +Now before we start splitting out the different components, let's look at the other integrations (in our example) that will stay in the base file: ```yaml history: @@ -62,9 +62,9 @@ zwave: mqtt: broker: 127.0.0.1 ``` -As with the core snippet, indentation makes a difference. The component headers (`mqtt:`) should be fully left aligned (aka no indent), and the parameters (`broker:`) should be indented two (2) spaces. +As with the core snippet, indentation makes a difference. The integration headers (`mqtt:`) should be fully left aligned (aka no indent), and the parameters (`broker:`) should be indented two (2) spaces. -While some of these components can technically be moved to a separate file they are so small or "one off's" where splitting them off is superfluous. Also, you'll notice the # symbol (hash/pound). This represents a "comment" as far as the commands are interpreted. Put another way, any line prefixed with a `#` will be ignored. This makes breaking up files for human readability really convenient, not to mention turning off features while leaving the entry intact. +While some of these integrations can technically be moved to a separate file they are so small or "one off's" where splitting them off is superfluous. Also, you'll notice the # symbol (hash/pound). This represents a "comment" as far as the commands are interpreted. Put another way, any line prefixed with a `#` will be ignored. This makes breaking up files for human readability really convenient, not to mention turning off features while leaving the entry intact. Now, lets assume that a blank file has been created in the Home Assistant configuration directory for each of the following: @@ -77,7 +77,7 @@ device_tracker.yaml customize.yaml ``` -`automation.yaml` will hold all the automation component details. `zones.yaml` will hold the zone component details and so forth. These files can be called anything but giving them names that match their function will make things easier to keep track of. +`automation.yaml` will hold all the automation integration details. `zones.yaml` will hold the zone integration details and so forth. These files can be called anything but giving them names that match their function will make things easier to keep track of. Inside the base configuration file add the following entries: @@ -89,9 +89,9 @@ switch: !include switch.yaml device_tracker: !include device_tracker.yaml ``` -Note that there can only be one `!include:` for each component so chaining them isn't going to work. If that sounds like Greek, don't worry about it. +Note that there can only be one `!include:` for each integration so chaining them isn't going to work. If that sounds like Greek, don't worry about it. -Alright, so we've got the single components and the include statements in the base file, what goes in those extra files? +Alright, so we've got the single integrations and the include statements in the base file, what goes in those extra files? Let's look at the `device_tracker.yaml` file from our example: diff --git a/source/_docs/configuration/state_object.markdown b/source/_docs/configuration/state_object.markdown index b4104383d92..61fdcf126c4 100644 --- a/source/_docs/configuration/state_object.markdown +++ b/source/_docs/configuration/state_object.markdown @@ -27,7 +27,7 @@ Field | Description `state.last_changed` | Time the state changed in the state machine in UTC time. This is not updated when there are only updated attributes. Example: `2017-10-28 08:13:36.715874+00:00`. `state.attributes` | A dictionary with extra attributes related to the current state. -The attributes of an entity are optional. There are a few attributes that are used by Home Assistant for representing the entity in a specific way. Each component will also have its own attributes to represent extra state data about the entity. For example, the light component has attributes for the current brightness and color of the light. When an attribute is not available, Home Assistant will not write it to the state. +The attributes of an entity are optional. There are a few attributes that are used by Home Assistant for representing the entity in a specific way. Each integration will also have its own attributes to represent extra state data about the entity. For example, the light integration has attributes for the current brightness and color of the light. When an attribute is not available, Home Assistant will not write it to the state. When using templates, attributes will be available by their name. For example `state.attributes.assumed_state`. diff --git a/source/_docs/configuration/templating.markdown b/source/_docs/configuration/templating.markdown index 4771a94aa88..c7922331d79 100644 --- a/source/_docs/configuration/templating.markdown +++ b/source/_docs/configuration/templating.markdown @@ -232,9 +232,9 @@ Some of these functions can also be used in a [filter](http://jinja.pocoo.org/do ## {% linkable_title Processing incoming data %} -The other part of templating is processing incoming data. It allows you to modify incoming data and extract only the data you care about. This will only work for platforms and components that mention support for this in their documentation. +The other part of templating is processing incoming data. It allows you to modify incoming data and extract only the data you care about. This will only work for platforms and integrations that mention support for this in their documentation. -It depends per component or platform, but it is common to be able to define a template using the `value_template` configuration key. When a new value arrives, your template will be rendered while having access to the following values on top of the usual Home Assistant extensions: +It depends per integration or platform, but it is common to be able to define a template using the `value_template` configuration key. When a new value arrives, your template will be rendered while having access to the following values on top of the usual Home Assistant extensions: | Variable | Description | |--------------|------------------------------------| diff --git a/source/_docs/configuration/troubleshooting.markdown b/source/_docs/configuration/troubleshooting.markdown index 03efee288be..e461420f8d7 100644 --- a/source/_docs/configuration/troubleshooting.markdown +++ b/source/_docs/configuration/troubleshooting.markdown @@ -10,15 +10,15 @@ footer: true redirect_from: /getting-started/troubleshooting-configuration/ --- -It can happen that you run into trouble while configuring Home Assistant. Perhaps a component is not showing up or is acting strangely. This page will discuss a few of the most common problems. +It can happen that you run into trouble while configuring Home Assistant. Perhaps a integration is not showing up or is acting strangely. This page will discuss a few of the most common problems. Before we dive into common issues, make sure you know where your configuration directory is. Home Assistant will print out the configuration directory it is using when starting up. -Whenever a component or configuration option results in a warning, it will be stored in `home-assistant.log` in the configuration directory. This file is reset on start of Home Assistant. +Whenever a integration or configuration option results in a warning, it will be stored in `home-assistant.log` in the configuration directory. This file is reset on start of Home Assistant. -### {% linkable_title My component does not show up %} +### {% linkable_title My integration does not show up %} -When a component does not show up, many different things can be the case. Before you try any of these steps, make sure to look at the `home-assistant.log` file and see if there are any errors related to your component you are trying to set up. +When a integration does not show up, many different things can be the case. Before you try any of these steps, make sure to look at the `home-assistant.log` file and see if there are any errors related to your integration you are trying to set up. If you have incorrect entries in your configuration files you can use the [`check_config`](/docs/tools/check_config/) script to assist in identifying them: `hass --script check_config`. If you need to provide the path for your configuration you can do this using the `-c` argument like this: `hass --script check_config -c /path/to/your/config/dir`. @@ -40,21 +40,21 @@ sensor: ... ``` -Another common problem is that a required configuration setting is missing. If this is the case, the component will report this to `home-assistant.log`. You can have a look at [the various component pages](/components/) for instructions on how to setup the components. +Another common problem is that a required configuration setting is missing. If this is the case, the integration will report this to `home-assistant.log`. You can have a look at [the various integration pages](/components/) for instructions on how to setup the components. -See the [logger](/components/logger/) component for instructions on how to define the level of logging you require for specific modules. +See the [logger](/components/logger/) integration for instructions on how to define the level of logging you require for specific modules. If you find any errors or want to expand the documentation, please [let us know](https://github.com/home-assistant/home-assistant.io/issues). #### {% linkable_title Problems with dependencies %} -Almost all components have external dependencies to communicate with your devices and services. Sometimes Home Assistant is unable to install the necessary dependencies. If this is the case, it should show up in `home-assistant.log`. +Almost all integrations have external dependencies to communicate with your devices and services. Sometimes Home Assistant is unable to install the necessary dependencies. If this is the case, it should show up in `home-assistant.log`. The first step is trying to restart Home Assistant and see if the problem persists. If it does, look at the log to see what the error is. If you can't figure it out, please [report it](https://github.com/home-assistant/home-assistant/issues) so we can investigate what is going on. -#### {% linkable_title Problems with components %} +#### {% linkable_title Problems with integrations %} -It can happen that some components either do not work right away or stop working after Home Assistant has been running for a while. If this happens to you, please [report it](https://github.com/home-assistant/home-assistant/issues) so that we can have a look. +It can happen that some integrations either do not work right away or stop working after Home Assistant has been running for a while. If this happens to you, please [report it](https://github.com/home-assistant/home-assistant/issues) so that we can have a look. #### {% linkable_title Multiple files %} diff --git a/source/_docs/configuration/yaml.markdown b/source/_docs/configuration/yaml.markdown index c73d6522142..e31e617f8b5 100644 --- a/source/_docs/configuration/yaml.markdown +++ b/source/_docs/configuration/yaml.markdown @@ -12,7 +12,7 @@ redirect_from: /getting-started/yaml/ Home Assistant uses the [YAML](http://yaml.org/) syntax for configuration. YAML might take a while to get used to but is really powerful in allowing you to express complex configurations. -For each component that you want to use in Home Assistant, you add code in your `configuration.yaml` file to specify its settings. +For each integration that you want to use in Home Assistant, you add code in your `configuration.yaml` file to specify its settings. The following example entry specifies that you want to use the [notify component](/components/notify) with the [pushbullet platform](/components/notify.pushbullet). @@ -40,7 +40,7 @@ Please pay attention on not storing private data (passwords, API keys, etc.) dir Text following a `#` are comments and are ignored by the system. -The next example shows an [input_select](/components/input_select) component that uses a block collection for the options values. +The next example shows an [input_select](/components/input_select) integration that uses a block collection for the options values. The other properties (like name) are specified using mappings. Note that the second line just has `threat:` with no value on the same line. Here threat is the name of the input_select and the values for it are everything nested below it. ```yaml diff --git a/source/_docs/ecosystem/appdaemon/api.markdown b/source/_docs/ecosystem/appdaemon/api.markdown index 6346fd933d4..5f031b7f464 100755 --- a/source/_docs/ecosystem/appdaemon/api.markdown +++ b/source/_docs/ecosystem/appdaemon/api.markdown @@ -282,7 +282,7 @@ In most cases, the attribute `state` has the most important value in it, e.g., f get_state(entity = None, attribute = None) ``` -`get_state()` is used to query the state of any component within Home Assistant. State updates are continuously tracked so this call runs locally and does not require AppDaemon to call back to Home Assistant and as such is very efficient. +`get_state()` is used to query the state of any integration within Home Assistant. State updates are continuously tracked so this call runs locally and does not require AppDaemon to call back to Home Assistant and as such is very efficient. #### {% linkable_title Returns %} @@ -788,7 +788,7 @@ Function to be invoked when the requested state change occurs. It must conform t ##### {% linkable_title time %} -A Python `time` object that specifies when the callback will occur, the hour component of the time object is ignored. If the time specified is in the past, the callback will occur the next hour at the specified time. If time is not supplied, the callback will start an hour from the time that `run_hourly()` was executed. +A Python `time` object that specifies when the callback will occur, the hour integration of the time object is ignored. If the time specified is in the past, the callback will occur the next hour at the specified time. If time is not supplied, the callback will start an hour from the time that `run_hourly()` was executed. ##### {% linkable_title \*\*kwargs %} @@ -1348,7 +1348,7 @@ self.notify("", "Switching mode to Evening") ### {% linkable_title About Events %} -Events are a fundamental part of how Home Assistant works under the covers. HA has an event bus that all components can read and write to, enabling components to inform other components when important events take place. We have already seen how state changes can be propagated to AppDaemon - a state change however is merely an example of an event within Home Assistant. There are several other event types, among them are: +Events are a fundamental part of how Home Assistant works under the covers. HA has an event bus that all integrations can read and write to, enabling integrations to inform other integrations when important events take place. We have already seen how state changes can be propagated to AppDaemon - a state change however is merely an example of an event within Home Assistant. There are several other event types, among them are: - `homeassistant_start` - `homeassistant_stop` @@ -1490,7 +1490,7 @@ service, kwargs = self.info_listen_event(handle) ### {% linkable_title fire_event() %} -Fire an event on the Home Assistant bus, for other components to hear. +Fire an event on the Home Assistant bus, for other integrations to hear. #### {% linkable_title Synopsis %} @@ -1536,7 +1536,7 @@ A dictionary containing any additional information associated with the event. ### {% linkable_title Use of Events for Signaling between Home Assistant and AppDaemon %} -Home Assistant allows for the creation of custom events and existing components can send and receive them. This provides a useful mechanism for signaling back and forth between Home Assistant and AppDaemon. For instance, if you would like to create a UI Element to fire off some code in Home Assistant, all that is necessary is to create a script to fire a custom event, then subscribe to that event in AppDaemon. The script would look something like this: +Home Assistant allows for the creation of custom events and existing integrations can send and receive them. This provides a useful mechanism for signaling back and forth between Home Assistant and AppDaemon. For instance, if you would like to create a UI Element to fire off some code in Home Assistant, all that is necessary is to create a script to fire a custom event, then subscribe to that event in AppDaemon. The script would look something like this: ```yaml alias: Day diff --git a/source/_docs/ecosystem/appdaemon/operation.markdown b/source/_docs/ecosystem/appdaemon/operation.markdown index 536f474aee0..4ef343f3533 100644 --- a/source/_docs/ecosystem/appdaemon/operation.markdown +++ b/source/_docs/ecosystem/appdaemon/operation.markdown @@ -10,4 +10,4 @@ footer: true redirect_from: /ecosystem/appdaemon/tutorial/ --- -Since `AppDaemon` under the covers uses the exact same APIs as the frontend UI, you typically see it react at about the same time to a given event. Calling back to Home Assistant is also pretty fast especially if they are running on the same machine. In action, observed latency above the built in automation component is usually sub-second. +Since `AppDaemon` under the covers uses the exact same APIs as the frontend UI, you typically see it react at about the same time to a given event. Calling back to Home Assistant is also pretty fast especially if they are running on the same machine. In action, observed latency above the built in automation integration is usually sub-second. diff --git a/source/_docs/ecosystem/certificates/lets_encrypt.markdown b/source/_docs/ecosystem/certificates/lets_encrypt.markdown index 024044abddc..72506055769 100644 --- a/source/_docs/ecosystem/certificates/lets_encrypt.markdown +++ b/source/_docs/ecosystem/certificates/lets_encrypt.markdown @@ -341,7 +341,7 @@ http: base_url: examplehome.duckdns.org ``` -You may wish to set up other options for the [http](/components/http/) component at this point, these extra options are beyond the scope of this guide. +You may wish to set up other options for the [http](/components/http/) integration at this point, these extra options are beyond the scope of this guide. Save the changes to configuration.yaml. Restart Home Assistant. @@ -429,7 +429,7 @@ sensor: Save the configuration.yaml. Restart Home Assistant. -On your default_view you should now see a sensor badge containing your number of days until expiry. If you've been following this guide from the start and have not taken any breaks in between, this should be 89 or 90. The sensor will update every 3 hours. You can place this reading on a card using groups, or hide it using customize. These topics are outside of the scope of this guide, but information can be found on their respective components pages: [Group](/components/group/) and [Customize](/docs/configuration/customizing-devices/) +On your default_view you should now see a sensor badge containing your number of days until expiry. If you've been following this guide from the start and have not taken any breaks in between, this should be 89 or 90. The sensor will update every 3 hours. You can place this reading on a card using groups, or hide it using customize. These topics are outside of the scope of this guide, but information can be found on their respective integrations pages: [Group](/components/group/) and [Customize](/docs/configuration/customizing-devices/) Got your sensor up and running and where you want it? Top drawer! Nearly there, now move on to the final steps to ensure that you're never without a secure connection in the future. diff --git a/source/_docs/ecosystem/ios.markdown b/source/_docs/ecosystem/ios.markdown index 57c9ad0c579..f5f614ed8ba 100644 --- a/source/_docs/ecosystem/ios.markdown +++ b/source/_docs/ecosystem/ios.markdown @@ -27,9 +27,9 @@ The app is available on the iOS App Store in every country that Apple supports. * Home Assistant 0.42.4 or higher for push notification support. * SSL is strongly recommended. Self-signed SSL certificates will not work due to Apple's limitations. -The `ios` component is the companion component for the Home Assistant iOS app. While not required, adding the `ios` component to your setup will greatly enhance the iOS app with new notification, location and sensor functions not possible with a standalone app. +The `ios` integration is the companion integration for the Home Assistant iOS app. While not required, adding the `ios` integration to your setup will greatly enhance the iOS app with new notification, location and sensor functions not possible with a standalone app. -Loading the `ios` component will also load the [`device_tracker`](/components/device_tracker), [`zeroconf`](/components/zeroconf) and [`notify`](/components/notify) platforms. +Loading the `ios` integration will also load the [`device_tracker`](/components/device_tracker), [`zeroconf`](/components/zeroconf) and [`notify`](/components/notify) platforms. The Home Assistant for iOS app supports the new authentication system introduced in Home Assistant 0.77. @@ -37,18 +37,18 @@ The Home Assistant for iOS app supports the new authentication system introduced ### {% linkable_title Automated Setup %} -The `ios` component will automatically be loaded under the following circumstances: +The `ios` integration will automatically be loaded under the following circumstances: -1. The [`discovery`](/components/discovery) component is enabled. +1. The [`discovery`](/components/discovery) integration is enabled. 2. You have just installed the app and are at the getting started screen. -Automated discovery and component loading only happens at first install of the app. You may need to wait a few minutes for the iOS component to load as the `discovery` component only scans the network every 5 minutes. +Automated discovery and integration loading only happens at first install of the app. You may need to wait a few minutes for the iOS integration to load as the `discovery` integration only scans the network every 5 minutes. -After the first automated setup you need to add `ios:` to your configuration so that the component loads by default even after restarting Home Assistant. +After the first automated setup you need to add `ios:` to your configuration so that the integration loads by default even after restarting Home Assistant. ### {% linkable_title Manual Setup %} -You may also manually load the `ios` component by adding the following to your configuration: +You may also manually load the `ios` integration by adding the following to your configuration: ```yaml # Example configuration.yaml entry diff --git a/source/_docs/ecosystem/ios/notifications.markdown b/source/_docs/ecosystem/ios/notifications.markdown index c1eee576e3a..9d382585761 100644 --- a/source/_docs/ecosystem/ios/notifications.markdown +++ b/source/_docs/ecosystem/ios/notifications.markdown @@ -12,8 +12,8 @@ redirect_from: /ecosystem/ios/notifications/ The `ios` notify platform enables sending push notifications to the Home Assistant iOS app. -The 'ios' component will automatically load the notify service. -The service component can be called using `service: notify.ios_`. +The 'ios' integration will automatically load the notify service. +The service integration can be called using `service: notify.ios_`. Your device ID can be found in the `ios.conf` file in your configuration folder. The file is compressed JSON. You can view it easier by copying the file contents and pasting them into [JSONLint](http://jsonlint.com). In this example, the device ID is `robbiet480_7plus`, so the notify service to use is `notify.ios_robbiet480_7plus`: diff --git a/source/_docs/installation.markdown b/source/_docs/installation.markdown index a083d588242..0a8d6dcc2c4 100644 --- a/source/_docs/installation.markdown +++ b/source/_docs/installation.markdown @@ -45,7 +45,7 @@ NUC i7/i9 | Pure power, you should not have *any* performance issues ## {% linkable_title Recommended %} -These install options are fully supported by Home Assistant's documentation. For example, if a component requires that you install something to make it work on one of these methods then the component page will document the steps required. +These install options are fully supported by Home Assistant's documentation. For example, if a integration requires that you install something to make it work on one of these methods then the integration page will document the steps required. **Method**|**You have**|**Recommended for** :-----|:-----|:----- @@ -55,7 +55,7 @@ These install options are fully supported by Home Assistant's documentation. For ## {% linkable_title Alternative installs %} -If you use these install methods, we assume that you know how to manage and administer the operating system you're using. Due to the range of platforms on which these install methods can be used, component documentation may only tell you what you have to install, not how to install it. +If you use these install methods, we assume that you know how to manage and administer the operating system you're using. Due to the range of platforms on which these install methods can be used, integration documentation may only tell you what you have to install, not how to install it. **Method**|**You have**|**Recommended for** :-----|:-----|:----- @@ -64,7 +64,7 @@ If you use these install methods, we assume that you know how to manage and admi ## {% linkable_title Community provided guides %} -These guides are provided as-is. Some of these install methods are more limited than the methods above. Some components may not work due to limitations of the platform or because required Python packages aren't available for that platform. +These guides are provided as-is. Some of these install methods are more limited than the methods above. Some integrations may not work due to limitations of the platform or because required Python packages aren't available for that platform.
    diff --git a/source/_docs/installation/docker.markdown b/source/_docs/installation/docker.markdown index c602a7aea37..59c7d7f435c 100644 --- a/source/_docs/installation/docker.markdown +++ b/source/_docs/installation/docker.markdown @@ -220,7 +220,7 @@ $ docker-compose restart ### {% linkable_title Exposing Devices %} -In order to use Z-Wave, Zigbee or other components that require access to devices, you need to map the appropriate device into the container. Ensure the user that is running the container has the correct privileges to access the `/dev/tty*` file, then add the device mapping to your docker command: +In order to use Z-Wave, Zigbee or other integrations that require access to devices, you need to map the appropriate device into the container. Ensure the user that is running the container has the correct privileges to access the `/dev/tty*` file, then add the device mapping to your docker command: ```bash $ docker run --init -d --name="home-assistant" -v /PATH_TO_YOUR_CONFIG:/config \ diff --git a/source/_docs/installation/hassbian/integrations.markdown b/source/_docs/installation/hassbian/integrations.markdown index d6f7a3fd0c1..9e16275662d 100644 --- a/source/_docs/installation/hassbian/integrations.markdown +++ b/source/_docs/installation/hassbian/integrations.markdown @@ -10,7 +10,7 @@ footer: true redirect_from: /docs/hassbian/integrations/ --- -Some components that are specific for the Raspberry Pi can require some further configuration outside of Home Assistant. All commands below are assumed to be executed with the `pi` account. For full documentation of these components refer to the [components](/components) page. +Some integrations that are specific for the Raspberry Pi can require some further configuration outside of Home Assistant. All commands below are assumed to be executed with the `pi` account. For full documentation of these integrations refer to the [components](/components) page. ### {% linkable_title Bluetooth Tracker %} @@ -23,8 +23,8 @@ Software needed for the tracker is pre-installed so just follow the [Bluetooth T Each of the following devices are connected to the GPIO pins on the Raspberry Pi. For more details about the GPIO layout, visit the [documentation](https://www.raspberrypi.org/documentation/usage/gpio/) from the Raspberry Pi foundation. -Permission have been given to the `homeassistant` user to use the GPIO pins and all of the following components should require no underlying changes to work. -Just follow the component pages for each on how to add them to your Home Assistant installation. +Permission have been given to the `homeassistant` user to use the GPIO pins and all of the following integrations should require no underlying changes to work. +Just follow the integration pages for each on how to add them to your Home Assistant installation. - [DHT Sensor](/components/sensor.dht/) - [Raspberry Pi Cover](/components/cover.rpi_gpio/) diff --git a/source/_docs/mqtt/broker.markdown b/source/_docs/mqtt/broker.markdown index 1160ed99887..349b041e4e2 100644 --- a/source/_docs/mqtt/broker.markdown +++ b/source/_docs/mqtt/broker.markdown @@ -10,7 +10,7 @@ footer: true logo: mqtt.png --- -The MQTT component needs you to run an MQTT broker for Home Assistant to connect to. There are four options, each with various degrees of ease of setup and privacy. +The MQTT integration needs you to run an MQTT broker for Home Assistant to connect to. There are four options, each with various degrees of ease of setup and privacy. ### {% linkable_title Run your own %} diff --git a/source/_docs/mqtt/discovery.markdown b/source/_docs/mqtt/discovery.markdown index 04dfa8af4fd..f2c2cac6ebd 100644 --- a/source/_docs/mqtt/discovery.markdown +++ b/source/_docs/mqtt/discovery.markdown @@ -64,7 +64,7 @@ The discovery topic need to follow a specific format: The payload must be a JSON dictionary and will be checked like an entry in your `configuration.yaml` file if a new device is added. This means that missing variables will be filled with the platform's default values. All configuration variables which are *required* must be present in the initial payload send to `/config`. -If the component is `alarm_control_panel`, `binary_sensor`, or `sensor` and the mandatory `state_topic` is not present in the payload, `state_topic` will be automatically set to //[/]/state. The automatic setting of `state_topic` id depracated and may be removed in a future version of Home Assistant. +If the integration is `alarm_control_panel`, `binary_sensor`, or `sensor` and the mandatory `state_topic` is not present in the payload, `state_topic` will be automatically set to //[/]/state. The automatic setting of `state_topic` id depracated and may be removed in a future version of Home Assistant. An empty payload will cause a previously discovered device to be deleted. @@ -280,7 +280,7 @@ Setting up a switch using topic prefix and abbreviated configuration variable na - State topic: `homeassistant/switch/irrigation/state` - Payload: `{"~": "homeassistant/switch/irrigation", "name": "garden", "cmd_t": "~/set", "stat_t": "~/state"}` -Setting up a climate component (heat only) with abbreviated configuration variable names to reduce payload length. +Setting up a climate integration (heat only) with abbreviated configuration variable names to reduce payload length. - Configuration topic: `homeassistant/climate/livingroom/config` - Configuration payload: diff --git a/source/_docs/mqtt/logging.markdown b/source/_docs/mqtt/logging.markdown index 64c627a84f2..b282e6df557 100644 --- a/source/_docs/mqtt/logging.markdown +++ b/source/_docs/mqtt/logging.markdown @@ -10,7 +10,7 @@ footer: true logo: mqtt.png --- -The [logger](/components/logger/) component allows the logging of received MQTT messages. +The [logger](/components/logger/) integration allows the logging of received MQTT messages. ```yaml # Example configuration.yaml entry diff --git a/source/_docs/mqtt/service.markdown b/source/_docs/mqtt/service.markdown index 223d554d3f9..894de9e2219 100644 --- a/source/_docs/mqtt/service.markdown +++ b/source/_docs/mqtt/service.markdown @@ -10,7 +10,7 @@ footer: true logo: mqtt.png --- -The MQTT component will register the service `mqtt.publish` which allows publishing messages to MQTT topics. There are two ways of specifying your payload. You can either use `payload` to hard-code a payload or use `payload_template` to specify a [template](/topics/templating/) that will be rendered to generate the payload. +The MQTT integration will register the service `mqtt.publish` which allows publishing messages to MQTT topics. There are two ways of specifying your payload. You can either use `payload` to hard-code a payload or use `payload_template` to specify a [template](/topics/templating/) that will be rendered to generate the payload. ### {% linkable_title Service `mqtt.publish` %} diff --git a/source/_docs/scripts.markdown b/source/_docs/scripts.markdown index e77ed5d4c17..72bc4b0cd72 100644 --- a/source/_docs/scripts.markdown +++ b/source/_docs/scripts.markdown @@ -15,7 +15,7 @@ Scripts are a sequence of actions that Home Assistant will execute. Scripts are The script syntax basic structure is a list of key/value maps that contain actions. If a script contains only 1 action, the wrapping list can be omitted. ```yaml -# Example script component containing script syntax +# Example script integration containing script syntax script: example_script: sequence: @@ -144,7 +144,7 @@ You can also get the script to abort after the timeout by using `continue_on_tim ### {% linkable_title Fire an Event %} -This action allows you to fire an event. Events can be used for many things. It could trigger an automation or indicate to another component that something is happening. For instance, in the below example it is used to create an entry in the logbook. +This action allows you to fire an event. Events can be used for many things. It could trigger an automation or indicate to another integration that something is happening. For instance, in the below example it is used to create an entry in the logbook. ```yaml - event: LOGBOOK_ENTRY diff --git a/source/_docs/scripts/editor.markdown b/source/_docs/scripts/editor.markdown index 9ccc8252d42..7a78f133856 100644 --- a/source/_docs/scripts/editor.markdown +++ b/source/_docs/scripts/editor.markdown @@ -18,7 +18,7 @@ In Home Assistant 0.52 we introduced the first version of our script editor. If ## {% linkable_title Updating your configuration to use the editor %} -The script editor reads and writes to the file `scripts.yaml` in your [configuration](/docs/configuration/) folder. Make sure that you have set up the script component to read from it: +The script editor reads and writes to the file `scripts.yaml` in your [configuration](/docs/configuration/) folder. Make sure that you have set up the script integration to read from it: ```yaml # Configuration.yaml example diff --git a/source/_docs/scripts/service-calls.markdown b/source/_docs/scripts/service-calls.markdown index 616ef6ffd3e..05d222d9b64 100644 --- a/source/_docs/scripts/service-calls.markdown +++ b/source/_docs/scripts/service-calls.markdown @@ -10,11 +10,11 @@ footer: true redirect_from: /getting-started/scripts-service-calls/ --- -Various components allow calling services when a certain event occurs. The most common one is calling a service when an automation trigger happens. But a service can also be called from a script or via the Amazon Echo. +Various integrations allow calling services when a certain event occurs. The most common one is calling a service when an automation trigger happens. But a service can also be called from a script or via the Amazon Echo. -The configuration options to call a config are the same between all components and are described on this page. +The configuration options to call a config are the same between all integrations and are described on this page. -Examples on this page will be given as part of an automation component configuration but different approaches can be used for other components too. +Examples on this page will be given as part of an automation integration configuration but different approaches can be used for other integrations too.

    Use the service developer tool in the frontend to discover available services. diff --git a/source/_docs/security.markdown b/source/_docs/security.markdown index 9f3c199703a..db321bb51fb 100644 --- a/source/_docs/security.markdown +++ b/source/_docs/security.markdown @@ -21,7 +21,7 @@ Further [details about the fingerprint/server banner](/docs/security/webserver/) ## {% linkable_title Porosity %} -The default port of Home Assistant is 8123. This is the port where the [`frontend`](/components/frontend/) and the [`API`](/components/api/) is served. Both are depending on the [`http`](/components/http/) component which contains the capability to adjust the settings like `server_host` or `server_port`. +The default port of Home Assistant is 8123. This is the port where the [`frontend`](/components/frontend/) and the [`API`](/components/api/) is served. Both are depending on the [`http`](/components/http/) integration which contains the capability to adjust the settings like `server_host` or `server_port`. See the [open ports](/docs/security/porosity/) of a Hass.io instance with various add-ons. diff --git a/source/_docs/tools/dev-tools.markdown b/source/_docs/tools/dev-tools.markdown index a8fd1310717..a5220b4a64a 100644 --- a/source/_docs/tools/dev-tools.markdown +++ b/source/_docs/tools/dev-tools.markdown @@ -18,7 +18,7 @@ Screenshot of Home Assistant's Developer Tools. | Section | Icon | Description | | ------- |------| ----- | -| Services | service developer tool icon | Calls services from components | +| Services | service developer tool icon | Calls services from integrations | | States | service developer tool icon | Sets the representation of an entity | | Events | service developer tool icon | Fires events | | Templates | service developer tool icon | Renders templates | @@ -31,7 +31,7 @@ The Developer Tools is meant for **all** (not just for the developers) to quickl This section is used to call Services that are available in the ServiceRegistry. -The list of services in the “Service” drop down are automatically populated based on the components that are found in the configuration, automation and script files. If a desired service does not exist, it means either the component is not configured properly or not defined in the configuration, automation or script files. +The list of services in the “Service” drop down are automatically populated based on the integrations that are found in the configuration, automation and script files. If a desired service does not exist, it means either the integration is not configured properly or not defined in the configuration, automation or script files. When a Service is selected, and if that service requires an `entity_id` to be passed, the “Entity” drop down will automatically be populated with corresponding entities. @@ -94,7 +94,7 @@ For more information about jinja2, visit [jinja2 documentation](http://jinja.poc {% linkable_title mqtt %} -This section is only visible if the MQTT component is configured. To configure MQTT, add `mqtt:` to the `configuration.yaml` file. For more information, refer to the [mqtt](/components/mqtt/) component. +This section is only visible if the MQTT integration is configured. To configure MQTT, add `mqtt:` to the `configuration.yaml` file. For more information, refer to the [mqtt](/components/mqtt/) component. Even though MQTT in general provides deeper functionality, the developer tools section of MQTT is limited to publishing messages to a given topic. It supports templates for the payload. To publish a message, simply specify the topic name and the payload and click “PUBLISH” button. diff --git a/source/_docs/z-wave/devices.markdown b/source/_docs/z-wave/devices.markdown index e20afed3536..1c77a12e6f5 100644 --- a/source/_docs/z-wave/devices.markdown +++ b/source/_docs/z-wave/devices.markdown @@ -22,7 +22,7 @@ Many sensors and actors can directly control other devices through a capability The *node* is the presence of the device on the Z-Wave mesh. Once you've added a device to Home Assistant, the node is represented by an `entity_id` that starts with `zwave`. -The *entity* is an individual component of the node. It may be a sensor that you read from, or a control that you operate. For any node, there will be at least one entity (for the node itself) and if it exposes any controls or sensors there will be at least one entity per control or sensor. The [entities](/docs/z-wave/entities) that are created depend on the Command Class the device supports. +The *entity* is an individual integration of the node. It may be a sensor that you read from, or a control that you operate. For any node, there will be at least one entity (for the node itself) and if it exposes any controls or sensors there will be at least one entity per control or sensor. The [entities](/docs/z-wave/entities) that are created depend on the Command Class the device supports. ## {% linkable_title Z-Wave, Plus, Security 2 %} diff --git a/source/_docs/z-wave/installation.markdown b/source/_docs/z-wave/installation.markdown index 90e1bc7ede6..575e5fadac3 100644 --- a/source/_docs/z-wave/installation.markdown +++ b/source/_docs/z-wave/installation.markdown @@ -68,12 +68,12 @@ device_config / device_config_domain / device_config_glob: type: integer default: 0 refresh_value: - description: Enable refreshing of the node value. Only the light component uses this. + description: Enable refreshing of the node value. Only the light integration uses this. required: false type: boolean default: false delay: - description: Specify the delay for refreshing of node value. Only the light component uses this. + description: Specify the delay for refreshing of node value. Only the light integration uses this. required: false type: integer default: 5 @@ -107,7 +107,7 @@ Ensure you keep a backup of this key. If you have to rebuild your system and don On platforms other than Hass.io and Docker, the compilation and installation of python-openzwave happens when you first enable the Z-Wave component, and can take half an hour or more on a Raspberry Pi. When you upgrade Home Assistant and python-openzwave is also upgraded, this will also result in a delay while the new version is compiled and installed. -The first run after adding a device is when the `zwave` component will take time to initialize the entities, some entities may appear with incomplete names. Running a network heal may speed up this process. +The first run after adding a device is when the `zwave` integration will take time to initialize the entities, some entities may appear with incomplete names. Running a network heal may speed up this process. ## {% linkable_title Platform specific instructions %} diff --git a/source/_docs/z-wave/services.markdown b/source/_docs/z-wave/services.markdown index 3c2e5f4664c..017c7844006 100644 --- a/source/_docs/z-wave/services.markdown +++ b/source/_docs/z-wave/services.markdown @@ -9,7 +9,7 @@ sharing: true footer: true --- -The `zwave` component exposes multiple services to help maintain the network. All of these are available through the Z-Wave control panel. +The `zwave` integration exposes multiple services to help maintain the network. All of these are available through the Z-Wave control panel. | Service | Description | | ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | diff --git a/source/_faq/component.markdown b/source/_faq/component.markdown index 9d4aaadff0b..1c8194ec1df 100644 --- a/source/_faq/component.markdown +++ b/source/_faq/component.markdown @@ -1,7 +1,7 @@ --- layout: page -title: "My component does not show up" -description: "My component does not show up" +title: "My integration does not show up" +description: "My integration does not show up" date: 2017-06-18 09:00 comments: false sharing: true @@ -9,6 +9,6 @@ footer: true ha_category: Configuration --- -When a component does not show up, many different things can be the case. Before you try any of these steps, make sure to look at the `home-assistant.log` file and see if there are any errors related to your component you are trying to set up. +When a integration does not show up, many different things can be the case. Before you try any of these steps, make sure to look at the `home-assistant.log` file and see if there are any errors related to your integration you are trying to set up. If you have incorrect entries in your configuration files you can use the `check_config` script to assist in identifying them: `hass --script check_config`. diff --git a/source/_faq/problems-with-dependencies.markdown b/source/_faq/problems-with-dependencies.markdown index a2535ee7943..4af26ecc082 100644 --- a/source/_faq/problems-with-dependencies.markdown +++ b/source/_faq/problems-with-dependencies.markdown @@ -9,6 +9,6 @@ footer: true ha_category: Usage --- -Almost all components have external dependencies to communicate with your devices and services. Sometimes Home Assistant is unable to install the necessary dependencies. If this is the case, it should show up in `home-assistant.log`. +Almost all integrations have external dependencies to communicate with your devices and services. Sometimes Home Assistant is unable to install the necessary dependencies. If this is the case, it should show up in `home-assistant.log`. The first step is trying to restart Home Assistant and see if the problem persists. If it does, look at the log to see what the error is. If you can't figure it out, please [report it](https://github.com/home-assistant/home-assistant/issues) so we can investigate what is going on. diff --git a/source/components/index.html b/source/components/index.html index d817a2c2adb..6183e25b41a 100644 --- a/source/components/index.html +++ b/source/components/index.html @@ -1,7 +1,7 @@ --- layout: page title: "Integrations" -description: "List of the built-in components of Home Assistant." +description: "List of the built-in integrations of Home Assistant." date: 2014-12-21 13:35 sidebar: false comments: false diff --git a/source/cookbook/index.markdown b/source/cookbook/index.markdown index 3bdc79511bf..40a6aba4e05 100644 --- a/source/cookbook/index.markdown +++ b/source/cookbook/index.markdown @@ -11,7 +11,7 @@ regenerate: true hide_github_edit: true --- -This is a community curated list of different ways to use Home Assistant. Most of these examples are using the [automation] component and other built-in [automation related][sec-automation] and [organization] components available. +This is a community curated list of different ways to use Home Assistant. Most of these examples are using the [automation] integration and other built-in [automation related][sec-automation] and [organization] integrations available. For [`python_script:` examples](/components/python_script/) visit the [Scripts section](https://community.home-assistant.io/c/projects/scripts) in our forum. diff --git a/source/developers/architecture_components.markdown b/source/developers/architecture_components.markdown index fcd66a99ec2..b92ea5019b8 100644 --- a/source/developers/architecture_components.markdown +++ b/source/developers/architecture_components.markdown @@ -1,7 +1,7 @@ --- layout: page title: "Components Architecture" -description: "Overview of components within the Home Assistant architecture." +description: "Overview of integrations within the Home Assistant architecture." date: 2016-04-16 14:24 -07:00 sidebar: true comments: false diff --git a/source/developers/component_discovery.markdown b/source/developers/component_discovery.markdown index 69fb672d5f5..39ab95f80a4 100644 --- a/source/developers/component_discovery.markdown +++ b/source/developers/component_discovery.markdown @@ -1,7 +1,7 @@ --- layout: page title: "Component Discovery" -description: "How to make component discovery work." +description: "How to make integration discovery work." date: 2017-11-23 07:27 +02:00 sidebar: true comments: false diff --git a/source/developers/component_loading.markdown b/source/developers/component_loading.markdown index f5c6e04e9f0..04acd1294de 100644 --- a/source/developers/component_loading.markdown +++ b/source/developers/component_loading.markdown @@ -1,7 +1,7 @@ --- layout: page title: "Loading your components" -description: "Instructions on how to get your component loaded by Home Assistant." +description: "Instructions on how to get your integration loaded by Home Assistant." date: 2016-04-16 13:32 sidebar: true comments: false diff --git a/source/developers/creating_components.markdown b/source/developers/creating_components.markdown index 678014da4f5..ea6d5678cb7 100644 --- a/source/developers/creating_components.markdown +++ b/source/developers/creating_components.markdown @@ -1,7 +1,7 @@ --- layout: page title: "Creating components" -description: "Guidelines to get you create your first component for Home Assistant." +description: "Guidelines to get you create your first integration for Home Assistant." date: 2014-12-21 13:32 sidebar: true comments: false diff --git a/source/developers/internationalization/custom_component_localization.markdown b/source/developers/internationalization/custom_component_localization.markdown index d0c6ecdc2f9..e74d018c53b 100644 --- a/source/developers/internationalization/custom_component_localization.markdown +++ b/source/developers/internationalization/custom_component_localization.markdown @@ -1,7 +1,7 @@ --- layout: page title: "Custom Component Localization" -description: "Translating custom components in Home Assistant" +description: "Translating custom integrations in Home Assistant" date: 2018-03-01 18:00 sidebar: true comments: false diff --git a/source/hassio/run_local.markdown b/source/hassio/run_local.markdown index 8085f77f1f3..ff94891a927 100644 --- a/source/hassio/run_local.markdown +++ b/source/hassio/run_local.markdown @@ -13,7 +13,7 @@ Hass.io is a managed environment, which means you can't install applications tha There are three options if you need to run a script which reads data from a sensor or sends commands to other devices on Hass.io. -The first option is to write a custom component for Home Assistant. This implies that you can communicate with your device using Python. For more information about developing a custom component, take a look at [custom-component development][custom-component]. +The first option is to write a custom integration for Home Assistant. This implies that you can communicate with your device using Python. For more information about developing a custom component, take a look at [custom-component development][custom-component]. The second option is to use STDIN inside an add-on and use the service `hassio.addon_stdin` to send data. For more information, have a look at [internal add-on communication][communication]. Here you will also find how you can easily access the Home Assistant Rest API. diff --git a/source/help/reporting_issues.markdown b/source/help/reporting_issues.markdown index 5193c739e3c..25a3b321f3b 100644 --- a/source/help/reporting_issues.markdown +++ b/source/help/reporting_issues.markdown @@ -27,7 +27,7 @@ Please provide the release which contains the issue. ### {% linkable_title Last working Home Assistant release (if known) %} -If possible, provide the latest release of which you know that the component or platform was working. Home Assistant is evolving very fast and issues may already be addressed or be introduced by a recent change. +If possible, provide the latest release of which you know that the integration or platform was working. Home Assistant is evolving very fast and issues may already be addressed or be introduced by a recent change. ### {% linkable_title Operating environment (Hass.io/Docker/Windows/etc.) %} @@ -44,7 +44,7 @@ Please add the link to the documention of the component/platform in question. E. Provide a summary of your issue and tell us what's wrong. -There are components and platform which require additional steps (installing third-party tools, compilers, etc.) to get your setup working. Please describe the steps you took and the ones to reproduce the issue if needed. +There are integrations and platform which require additional steps (installing third-party tools, compilers, etc.) to get your setup working. Please describe the steps you took and the ones to reproduce the issue if needed. ### {% linkable_title Problem-relevant `configuration.yaml` entries %} diff --git a/source/lovelace/yaml-mode.markdown b/source/lovelace/yaml-mode.markdown index 245a00dea21..ab9ffaf495a 100644 --- a/source/lovelace/yaml-mode.markdown +++ b/source/lovelace/yaml-mode.markdown @@ -9,7 +9,7 @@ sharing: true footer: true --- -It is possible to write your Lovelace config in YAML instead of via the UI. To do so, you will need to configure the Lovelace component to be in yaml mode by adding the following to your `configuration.yaml`: +It is possible to write your Lovelace config in YAML instead of via the UI. To do so, you will need to configure the Lovelace integration to be in yaml mode by adding the following to your `configuration.yaml`: ```yaml lovelace: diff --git a/source/privacy/index.markdown b/source/privacy/index.markdown index 706b1e67c8e..213d0fe0011 100644 --- a/source/privacy/index.markdown +++ b/source/privacy/index.markdown @@ -29,7 +29,7 @@ Certain visitors to Home Assistant’s websites choose to interact with Home Ass ## {% linkable_title Aggregated Statistics %} -Home Assistant may collect statistics about the behavior of visitors to its websites. For instance, Home Assistant may monitor the most popular component documentation. Home Assistant may display this information publicly or provide it to others. However, Home Assistant does not disclose personally-identifying information other than as described below. +Home Assistant may collect statistics about the behavior of visitors to its websites. For instance, Home Assistant may monitor the most popular integration documentation. Home Assistant may display this information publicly or provide it to others. However, Home Assistant does not disclose personally-identifying information other than as described below. ## {% linkable_title Information We Collect from Other Sources %} From 146796a4f7375f6502270666736afe3dc03a3ea0 Mon Sep 17 00:00:00 2001 From: Underknowledge Date: Wed, 19 Jun 2019 17:09:37 +0200 Subject: [PATCH 120/123] Update multi-factor-auth.markdown (#9530) * Update multi-factor-auth.markdown Took me a while to get the config after it wasn't clear that I only have to define the entity_id without the domain. * Update source/_docs/authentication/multi-factor-auth.markdown Co-Authored-By: Jorim Tielemans * Update source/_docs/authentication/multi-factor-auth.markdown Co-Authored-By: Jorim Tielemans --- source/_docs/authentication/multi-factor-auth.markdown | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/source/_docs/authentication/multi-factor-auth.markdown b/source/_docs/authentication/multi-factor-auth.markdown index 16ecd5b8e87..92a518d7a11 100644 --- a/source/_docs/authentication/multi-factor-auth.markdown +++ b/source/_docs/authentication/multi-factor-auth.markdown @@ -75,15 +75,17 @@ Add Notify MFA to your `configuration.yaml` file like this: homeassistant: auth_mfa_modules: - type: notify + include: + - notify_entity ``` {% configuration %} exclude: - description: The list of notifying services you want to exclude. + description: The list of notifying service entities you want to exclude. required: false type: list include: - description: The list of notifying services you want to include. + description: The list of notifying service entities you want to include. required: false type: list message: From 945d4882992561a22101424048ba2c2540fdc41d Mon Sep 17 00:00:00 2001 From: IIIdefconIII Date: Wed, 19 Jun 2019 17:11:27 +0200 Subject: [PATCH 121/123] Update hyperion.markdown (#9641) * Update hyperion.markdown * :pencil2: Tweak --- source/_components/hyperion.markdown | 40 ++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/source/_components/hyperion.markdown b/source/_components/hyperion.markdown index 3d9397635b6..d8c76da7526 100644 --- a/source/_components/hyperion.markdown +++ b/source/_components/hyperion.markdown @@ -44,7 +44,7 @@ light: required: false type: string priority: - description: The priority of the Hyperion instance. + description: The priority of the Hyperion instance make sure this is higher then the system prio in hyperion itself. required: false type: int default: 128 @@ -65,7 +65,7 @@ light: default: "['HDMI', 'Cinema brighten lights', 'Cinema dim lights', 'Knight rider', 'Blue mood blobs', 'Cold mood blobs', 'Full color mood blobs', 'Green mood blobs', 'Red mood blobs', 'Warm mood blobs', 'Police Lights Single', 'Police Lights Solid', 'Rainbow mood', 'Rainbow swirl fast', 'Rainbow swirl', 'Random', 'Running dots', 'System Shutdown', 'Snake', 'Sparks Color', 'Sparks', 'Strobe blue', 'Strobe Raspbmc', 'Strobe white', 'Color traces', 'UDP multicast listener', 'UDP listener', 'X-Mas']" {% endconfiguration %} -## {% linkable_title Example %} +## {% linkable_title Examples %} To start Hyperion with an effect, use the following automation: @@ -83,3 +83,39 @@ automation: entity_id: light.hyperion effect: "Full color mood blobs" ``` + +To have the lights playing a effect when pausing, idle or turn off a media player like plex you can use this example: + +``` +- alias: Set hyperion effect after playback + trigger: + - platform: state + entity_id: media_player.plex_iiidefcontoweriii + to: 'off' + - platform: state + entity_id: media_player.plex_iiidefcontoweriii + to: 'paused' + - platform: state + entity_id: media_player.plex_iiidefcontoweriii + to: 'idle' + action: + - service: light.turn_on + data: + entity_id: light.hyperion + effect: "Full color mood blobs" +``` + +To capture the screen when playing something of a media_player you can use this example: + +``` +- alias: Set hyperion when playback starts + trigger: + - platform: state + entity_id: media_player.plex_iiidefcontoweriii + to: 'playing' + action: + - service: light.turn_on + data: + entity_id: light.hyperion + effect: HDMI +``` From 2155b23fb8c66162405fb354fab2344a6a1eb050 Mon Sep 17 00:00:00 2001 From: IIIdefconIII Date: Wed, 19 Jun 2019 18:34:55 +0200 Subject: [PATCH 122/123] Update hyperion.markdown (#9659) sorry, removed my plex media_player entity id to plex to not getting involved by questions xD --- source/_components/hyperion.markdown | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/_components/hyperion.markdown b/source/_components/hyperion.markdown index d8c76da7526..a5142049d84 100644 --- a/source/_components/hyperion.markdown +++ b/source/_components/hyperion.markdown @@ -90,13 +90,13 @@ To have the lights playing a effect when pausing, idle or turn off a media playe - alias: Set hyperion effect after playback trigger: - platform: state - entity_id: media_player.plex_iiidefcontoweriii + entity_id: media_player.plex to: 'off' - platform: state - entity_id: media_player.plex_iiidefcontoweriii + entity_id: media_player.plex.plex to: 'paused' - platform: state - entity_id: media_player.plex_iiidefcontoweriii + entity_id: media_player.plex.plex to: 'idle' action: - service: light.turn_on @@ -111,7 +111,7 @@ To capture the screen when playing something of a media_player you can use this - alias: Set hyperion when playback starts trigger: - platform: state - entity_id: media_player.plex_iiidefcontoweriii + entity_id: media_player.plex to: 'playing' action: - service: light.turn_on From f665f6717e683b395ec95d10190ac0f3186d1ada Mon Sep 17 00:00:00 2001 From: P0L0 <1452110+p0l0@users.noreply.github.com> Date: Wed, 19 Jun 2019 18:41:54 +0200 Subject: [PATCH 123/123] Added possibility to define the data type for set_device_value (#9513) --- source/_components/homematic.markdown | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/source/_components/homematic.markdown b/source/_components/homematic.markdown index 98d16c3ac84..d8bb9127752 100644 --- a/source/_components/homematic.markdown +++ b/source/_components/homematic.markdown @@ -354,6 +354,20 @@ action: value: 23.0 ``` +Manually set the active profile on thermostat: + +```yaml +... +action: + service: homematic.set_device_value + data: + address: LEQ1234567 + channel: 1 + param: ACTIVE_PROFILE + value: 1 + value_type: int +``` + Set the week program of a wall thermostat: ```yaml