From 4482a15a6d6323c76b293c8b2195c41a9b34f1c7 Mon Sep 17 00:00:00 2001 From: jgriff2 Date: Thu, 21 Feb 2019 01:12:03 -0800 Subject: [PATCH 01/85] Create remote_rpi_gpio.markdown Documentation for new platform remote_rpi_gpio --- remote_rpi_gpio.markdown | 127 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 remote_rpi_gpio.markdown diff --git a/remote_rpi_gpio.markdown b/remote_rpi_gpio.markdown new file mode 100644 index 00000000000..1a33e1fdabd --- /dev/null +++ b/remote_rpi_gpio.markdown @@ -0,0 +1,127 @@ +--- +layout: page +title: "Remote Raspberry Pi GPIO" +description: "Instructions on how to integrate the GPIO capability of a Remote Raspberry Pi into Home Assistant." +date: 2019-02-20 19:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: raspberry-pi.png +ha_category: + - DIY + - Binary Sensor + - Switch +ha_release: +ha_iot_class: "Local Push" +redirect_from: + - /components/binary_sensor.remote_rpi_gpio/ + - /components/switch.remote_rpi_gpio/ +--- + +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. + +## {% linkable_title Binary Sensor %} + +The `remote_rpi_gpio` binary sensor platform allows you to read sensor values of the GPIOs of a [Remote Raspberry Pi](https://www.raspberrypi.org/). + +## {% linkable_title Configuration %} + +To use your Remote Raspberry Pi's GPIO in your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +binary_sensor: + - platform: remote_rpi_gpio + ports: + 11: PIR Office + 12: PIR Bedroom +``` + +{% configuration %} +address: + description: IP Address of remote Raspberry Pi + required: true + type: string +ports: + description: List of used ports. + required: true + type: map + keys: + "port: name": + description: The port numbers (BCM mode pin numbers) and corresponding names. + required: true + type: string +invert_logic: + description: If `true`, inverts the output logic + required: false + type: boolean + default: "`false` (ACTIVE HIGH)" +pull_mode: + description: > + Type of internal pull resistor to use. + Options are `UP` - pull-up resistor and `DOWN` - pull-down resistor. + Pull-Up defaults to active LOW and Pull-down defaults to active HIGH. This can be adjusted with invert_logic + required: false + type: string + default: "`UP`" +{% endconfiguration %} + +For more details about the GPIO layout, visit the Wikipedia [article](https://en.wikipedia.org/wiki/Raspberry_Pi#GPIO_connector) about the Raspberry Pi. + +## {% linkable_title Switch %} + +The `remote_rpi_gpio` switch platform allows you to control the GPIOs of a [Remote Raspberry Pi](https://www.raspberrypi.org/). + +## {% linkable_title Configuration %} + +To use your Remote Raspberry Pi's GPIO in your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +switch: + - platform: remote_rpi_gpio + address: 192.168.0.123 + ports: + 11: Fan Office + 12: Light Desk +``` + +{% configuration %} +address: + description: IP Address of remote Raspberry Pi + required: true + type: string +ports: + description: Array of used ports. + required: true + type: list + keys: + port: + description: Port numbers and corresponding names (GPIO #). + required: true + type: [integer, string] +invert_logic: + description: If true, inverts the output logic to ACTIVE LOW. + required: false + default: false + type: boolean +{% endconfiguration %} + +For more details about the GPIO layout, visit the Wikipedia [article](https://en.wikipedia.org/wiki/Raspberry_Pi#GPIO_connector) about the Raspberry Pi. + +

+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 #. +For example, if you have a relay connected to pin 11 its GPIO # is 17. + +```yaml +# Example configuration.yaml entry +switch: + - platform: remote_rpi_gpio + address: 192.168.0.123 + ports: + 17: Speaker Relay +``` From 45f595764e571e4bfc5a9491d60525e3a5527cf7 Mon Sep 17 00:00:00 2001 From: Lewys Martin Date: Sun, 31 Mar 2019 15:21:53 +1100 Subject: [PATCH 02/85] Create sensor.solax --- source/_components/sensor.solax | 71 +++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 source/_components/sensor.solax diff --git a/source/_components/sensor.solax b/source/_components/sensor.solax new file mode 100644 index 00000000000..1bccb720cf0 --- /dev/null +++ b/source/_components/sensor.solax @@ -0,0 +1,71 @@ +# ha-solax +--- +layout: page +title: "Solax Sensor" +description: "Instructions on how to integrate Solax sensor within Home Assistant." +date: 2019-03-31 14:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: solax-logo.png +ha_category: Sensor +ha_release: 0.91 +ha_iot_class: Local Polling +--- + +The `solax` platform uses the [ha-solax](https://github.com/squishykid/ha-solax) API to allow you to get details from your Solax solar power setup and integrate these in your Home Assistant installation. + +## {% linkable_title Configuration %} + +To use the Solax sensors in your installation, add the following to your configuration.yaml file: + +{% raw %} +```yaml +# Example configuration.yaml entry +sensor: + - platform: solax + ip_address: IP_ADDRESS +``` +{% endraw %} +{% configuration %} +### CONFIGURATION VARIABLES +ip_address: + description: The IP address of your Solax system. + required: true + type: string +{% endconfiguration %} + + +### {% linkable_title Full configuration sample %} + +{% raw %} +A full configuration entry would look like the sample below. + + +```yaml +# Example configuration.yaml entry +sensor: + - platform: solax + ip_address: 192.168.0.3 +``` +{% endraw %} + +If you would like to convert the values from multiple panels or view the total power the house is using, you can use the [template platform](/components/sensor.template/). + +{% raw %} +```yaml +# Example configuration.yaml entry for template platform +sensors: +- platform: template + sensors: + total_pv_power: + friendly_name: "Total PV Power" + unit_of_measurement: 'W' + value_template: "{{ (states('sensor.pv1_power') | float) + (states('sensor.pv2_power') | float) }}" + load_power: + friendly_name: "Load Power" + unit_of_measurement: 'W' + value_template: "{{ (states('sensor.power_now') | float) - (states('sensor.exported_power') | float) }}" +``` +{% endraw %} From 7c1ba702c3c4c41b546d9ffacc960edfba58c308 Mon Sep 17 00:00:00 2001 From: Lewys Martin Date: Sun, 31 Mar 2019 15:36:32 +1100 Subject: [PATCH 03/85] Update sensor.solax remove all caps line - not needed with {% configuration %} markdown --- source/_components/sensor.solax | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/sensor.solax b/source/_components/sensor.solax index 1bccb720cf0..9547c7e04c7 100644 --- a/source/_components/sensor.solax +++ b/source/_components/sensor.solax @@ -29,7 +29,7 @@ sensor: ``` {% endraw %} {% configuration %} -### CONFIGURATION VARIABLES + ip_address: description: The IP address of your Solax system. required: true From 6fd9cca290061c359f9b7fe986dad9b801bad65e Mon Sep 17 00:00:00 2001 From: Lewys Martin Date: Sun, 31 Mar 2019 15:47:04 +1100 Subject: [PATCH 04/85] Update and rename sensor.solax to sensor.solax.markdown --- source/_components/{sensor.solax => sensor.solax.markdown} | 1 - 1 file changed, 1 deletion(-) rename source/_components/{sensor.solax => sensor.solax.markdown} (99%) diff --git a/source/_components/sensor.solax b/source/_components/sensor.solax.markdown similarity index 99% rename from source/_components/sensor.solax rename to source/_components/sensor.solax.markdown index 9547c7e04c7..80a19306400 100644 --- a/source/_components/sensor.solax +++ b/source/_components/sensor.solax.markdown @@ -1,4 +1,3 @@ -# ha-solax --- layout: page title: "Solax Sensor" From 238db9f3310e17d926a8c08122e0671b51976727 Mon Sep 17 00:00:00 2001 From: Lewys Martin Date: Sun, 31 Mar 2019 16:00:29 +1100 Subject: [PATCH 05/85] Add files via upload --- source/images/supported_brands/solax-logo.png | Bin 0 -> 23738 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 source/images/supported_brands/solax-logo.png diff --git a/source/images/supported_brands/solax-logo.png b/source/images/supported_brands/solax-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a9dce20ba7b23afdfad3b522d4c190bee47dff6a GIT binary patch literal 23738 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 Date: Sun, 31 Mar 2019 16:32:44 +1100 Subject: [PATCH 06/85] Fix wording --- source/_components/sensor.solax.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_components/sensor.solax.markdown b/source/_components/sensor.solax.markdown index 80a19306400..44f8fbd51e6 100644 --- a/source/_components/sensor.solax.markdown +++ b/source/_components/sensor.solax.markdown @@ -2,7 +2,7 @@ layout: page title: "Solax Sensor" description: "Instructions on how to integrate Solax sensor within Home Assistant." -date: 2019-03-31 14:00 +date: 2019-03-31 04:20 sidebar: true comments: false sharing: true @@ -13,7 +13,7 @@ ha_release: 0.91 ha_iot_class: Local Polling --- -The `solax` platform uses the [ha-solax](https://github.com/squishykid/ha-solax) API to allow you to get details from your Solax solar power setup and integrate these in your Home Assistant installation. +The `solax` component connects home-assistant to Solax solar power inverters. Solax inverters may be connected to a home Wi-Fi network and expose a REST api. This component retrieves information such as photo voltaic power productionm, battery levels and power, and how much power is being fed back into the grid. ## {% linkable_title Configuration %} From f48b60396a2289e13f424f9b5e1fe5797e84f7dd Mon Sep 17 00:00:00 2001 From: Lewys Martin Date: Sun, 31 Mar 2019 16:38:48 +1100 Subject: [PATCH 07/85] typo --- source/_components/sensor.solax.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/sensor.solax.markdown b/source/_components/sensor.solax.markdown index 44f8fbd51e6..546d9e13a2e 100644 --- a/source/_components/sensor.solax.markdown +++ b/source/_components/sensor.solax.markdown @@ -13,7 +13,7 @@ ha_release: 0.91 ha_iot_class: Local Polling --- -The `solax` component connects home-assistant to Solax solar power inverters. Solax inverters may be connected to a home Wi-Fi network and expose a REST api. This component retrieves information such as photo voltaic power productionm, battery levels and power, and how much power is being fed back into the grid. +The `solax` component connects home-assistant to Solax solar power inverters. Solax inverters may be connected to a home Wi-Fi network and expose a REST api. This component retrieves information such as photo voltaic power production, battery levels and power, and how much power is being fed back into the grid. ## {% linkable_title Configuration %} From 0d2a3730ca2080c6d05ec86fe46d46b7d9214253 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 31 Mar 2019 18:53:19 +1100 Subject: [PATCH 08/85] Update source/_components/sensor.solax.markdown Co-Authored-By: CountParadox --- source/_components/sensor.solax.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/sensor.solax.markdown b/source/_components/sensor.solax.markdown index 546d9e13a2e..1d41cf5746d 100644 --- a/source/_components/sensor.solax.markdown +++ b/source/_components/sensor.solax.markdown @@ -13,7 +13,7 @@ ha_release: 0.91 ha_iot_class: Local Polling --- -The `solax` component connects home-assistant to Solax solar power inverters. Solax inverters may be connected to a home Wi-Fi network and expose a REST api. This component retrieves information such as photo voltaic power production, battery levels and power, and how much power is being fed back into the grid. +The `solax` component connects home-assistant to Solax solar power inverters. Solax inverters may be connected to a home Wi-Fi network and expose a REST API. This component retrieves information such as photovoltaic power production, battery levels and power, and how much power is being fed back into the grid. ## {% linkable_title Configuration %} From 507770053bb7f62bf71607c0ef92548160e41251 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 31 Mar 2019 18:53:29 +1100 Subject: [PATCH 09/85] Update source/_components/sensor.solax.markdown Co-Authored-By: CountParadox --- source/_components/sensor.solax.markdown | 1 - 1 file changed, 1 deletion(-) diff --git a/source/_components/sensor.solax.markdown b/source/_components/sensor.solax.markdown index 1d41cf5746d..b21f1c015c6 100644 --- a/source/_components/sensor.solax.markdown +++ b/source/_components/sensor.solax.markdown @@ -19,7 +19,6 @@ The `solax` component connects home-assistant to Solax solar power inverters. So To use the Solax sensors in your installation, add the following to your configuration.yaml file: -{% raw %} ```yaml # Example configuration.yaml entry sensor: From 8843b2c415aef828595ec427e15b715563df5cdd Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 31 Mar 2019 18:53:39 +1100 Subject: [PATCH 10/85] Update source/_components/sensor.solax.markdown Co-Authored-By: CountParadox --- source/_components/sensor.solax.markdown | 1 - 1 file changed, 1 deletion(-) diff --git a/source/_components/sensor.solax.markdown b/source/_components/sensor.solax.markdown index b21f1c015c6..815647708c8 100644 --- a/source/_components/sensor.solax.markdown +++ b/source/_components/sensor.solax.markdown @@ -25,7 +25,6 @@ sensor: - platform: solax ip_address: IP_ADDRESS ``` -{% endraw %} {% configuration %} ip_address: From 485c49580028278c66c46902bd73b357975ecee8 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 31 Mar 2019 18:54:05 +1100 Subject: [PATCH 11/85] Update source/_components/sensor.solax.markdown Co-Authored-By: CountParadox --- source/_components/sensor.solax.markdown | 1 - 1 file changed, 1 deletion(-) diff --git a/source/_components/sensor.solax.markdown b/source/_components/sensor.solax.markdown index 815647708c8..9a64cfc803a 100644 --- a/source/_components/sensor.solax.markdown +++ b/source/_components/sensor.solax.markdown @@ -46,7 +46,6 @@ sensor: - platform: solax ip_address: 192.168.0.3 ``` -{% endraw %} If you would like to convert the values from multiple panels or view the total power the house is using, you can use the [template platform](/components/sensor.template/). From ff4b641ff94bb16708a3f30bbb6962b0f00b22f6 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 31 Mar 2019 18:54:10 +1100 Subject: [PATCH 12/85] Update source/_components/sensor.solax.markdown Co-Authored-By: CountParadox --- source/_components/sensor.solax.markdown | 1 - 1 file changed, 1 deletion(-) diff --git a/source/_components/sensor.solax.markdown b/source/_components/sensor.solax.markdown index 9a64cfc803a..1ef2d17e5d0 100644 --- a/source/_components/sensor.solax.markdown +++ b/source/_components/sensor.solax.markdown @@ -36,7 +36,6 @@ ip_address: ### {% linkable_title Full configuration sample %} -{% raw %} A full configuration entry would look like the sample below. From d2d20e55bcf54d3e2cbbf3dd7f6ad6b39794a062 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 31 Mar 2019 18:54:17 +1100 Subject: [PATCH 13/85] Update source/_components/sensor.solax.markdown Co-Authored-By: CountParadox --- source/_components/sensor.solax.markdown | 1 - 1 file changed, 1 deletion(-) diff --git a/source/_components/sensor.solax.markdown b/source/_components/sensor.solax.markdown index 1ef2d17e5d0..9c3e8d61bd4 100644 --- a/source/_components/sensor.solax.markdown +++ b/source/_components/sensor.solax.markdown @@ -26,7 +26,6 @@ sensor: ip_address: IP_ADDRESS ``` {% configuration %} - ip_address: description: The IP address of your Solax system. required: true From a3b094d49945decfc5fe8b25befc58b98bd13abf Mon Sep 17 00:00:00 2001 From: Lewys Martin Date: Sun, 31 Mar 2019 18:55:16 +1100 Subject: [PATCH 14/85] Rename sensor.solax.markdown to solax.markdown --- source/_components/{sensor.solax.markdown => solax.markdown} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename source/_components/{sensor.solax.markdown => solax.markdown} (100%) diff --git a/source/_components/sensor.solax.markdown b/source/_components/solax.markdown similarity index 100% rename from source/_components/sensor.solax.markdown rename to source/_components/solax.markdown From 33e0d136da5629aff90ba17b4846c84b944d393f Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 31 Mar 2019 10:11:07 +0200 Subject: [PATCH 15/85] :pencil2: Tweak --- source/_components/solax.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/solax.markdown b/source/_components/solax.markdown index 9c3e8d61bd4..18c0d21321f 100644 --- a/source/_components/solax.markdown +++ b/source/_components/solax.markdown @@ -25,6 +25,7 @@ sensor: - platform: solax ip_address: IP_ADDRESS ``` + {% configuration %} ip_address: description: The IP address of your Solax system. @@ -37,7 +38,6 @@ ip_address: A full configuration entry would look like the sample below. - ```yaml # Example configuration.yaml entry sensor: From bc0b298775b1c17cd92e596816ef3a23f324dcaa Mon Sep 17 00:00:00 2001 From: "Jardi A.M. Jordan" <1088732+jardiamj@users.noreply.github.com> Date: Mon, 15 Apr 2019 13:53:42 -0700 Subject: [PATCH 16/85] Added documentation for MCP23017 component: binary sensor and switch platforms. --- source/_components/mcp23017.markdown | 128 +++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 source/_components/mcp23017.markdown diff --git a/source/_components/mcp23017.markdown b/source/_components/mcp23017.markdown new file mode 100644 index 00000000000..af488631203 --- /dev/null +++ b/source/_components/mcp23017.markdown @@ -0,0 +1,128 @@ +--- +layout: page +title: "MCP23017 I2C GPIO expander" +description: "Instructions on how to integrate the MCP23017 GPIO pin expander with I2C interface into Home Assistant." +date: 2019-04-14 07:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: raspberry-pi.png +ha_category: + - DIY + - Binary Sensor + - Switch +ha_release: 0.92 +ha_iot_class: Local Polling +redirect_from: + - /components/binary_sensor.mcp23017/ + - /components/switch.mcp23017/ +--- + +The `mcp23017` component is the base for all related mcp23017 platforms in Home Assistant. There is no setup needed for the component itself, for the platforms please check their corresponding pages. + +## {% linkable_title Binary Sensor %} + +The `mcp23017` binary sensor platform allows you to read sensor values from the I/O pins of your [MCP23017 I2C I/O expander](https://www.adafruit.com/product/732). + +The pin numbers are from 0 to 15 where: 0-7 correspond to port A (A1-A8) and 8-15 to port B (B1-B8). + +## {% linkable_title Configuration %} + +To use the I/O pins of an mcp23017 connected to and I2C bus of your Raspberry Pi as binary sensors, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +binary_sensor: + - platform: mcp23017 + i2c_address: 0x20 + pins: + 0: PIR Office + 1: PIR Bedroom +``` + +{% configuration %} +i2c_address: + description: i2c address of MCP23017 chip. + required: false + type: integer + default: "`0x20`" +pins: + description: List of used pins. + required: true + type: map + keys: + "pin: name": + description: The pin numbers (from 0 to 15) and corresponding names. + required: true + type: [integer, string] +scan_interval: + description: Interval to scan for sensor state changes in seconds. + required: false + type: integer + default: 15 +invert_logic: + description: If `true`, inverts the output logic to ACTIVE LOW. + required: false + type: boolean + default: "`false` (ACTIVE HIGH)" +pull_mode: + description: > + Type of internal pull resistor to use. + Options are `UP` - pull-up resistor and `DOWN` - pull-down resistor. + required: false + type: string + default: "`UP`" +{% endconfiguration %} + +NOTE: MCP23017 only has internal pull-up resistors, if you want to use pull-down you will have to wire your own pull-down resistors. + +For more details about the MCP23017 I2C I/O port expander you can find its datasheet here: [MCP23017](https://www.microchip.com/wwwproducts/en/MCP23017). + +## {% linkable_title Switch %} + +The `mcp23017` switch platform allows you to write to the I/O pins of your [MCP23017 I2C I/O expander](https://www.adafruit.com/product/732). + +The pin numbers are from 0 to 15 where: 0-7 correspond to port A (A1-A8) and 8-15 to port B (B1-B8). + +## {% linkable_title Configuration %} + +To use the I/O pins of an mcp23017 connected to and I2C bus of your Raspberry Pi as switches, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +switch: + - platform: mcp23017 + i2c_address: 0x20 + ports: + 11: Fan Office + 12: Light Desk +``` + +{% configuration %} +i2c_address: + description: i2c address of MCP23017 chip. + required: false + type: integer + default: "`0x20`" +ports: + description: Array of used pins. + required: true + type: list + keys: + port: + description: The pin numbers (from 0 to 15) and corresponding names. + required: true + type: [integer, string] +invert_logic: + description: If true, inverts the output logic to ACTIVE LOW. + required: false + default: false + type: boolean +{% endconfiguration %} + +For more details about the MCP23017 I2C I/O port expander you can find its datasheet here: [MCP23017](https://www.microchip.com/wwwproducts/en/MCP23017). + +

+Note that a pin managed by HASS is expected to be exclusive to HASS. +

From 66ae490ec220cfbd3b0fea74d36db3127948d03b Mon Sep 17 00:00:00 2001 From: "Jardi A.M. Jordan" <1088732+jardiamj@users.noreply.github.com> Date: Mon, 15 Apr 2019 15:50:01 -0700 Subject: [PATCH 17/85] Removed redirect_from: label. --- source/_components/mcp23017.markdown | 3 --- 1 file changed, 3 deletions(-) diff --git a/source/_components/mcp23017.markdown b/source/_components/mcp23017.markdown index af488631203..8cc30cfefbe 100644 --- a/source/_components/mcp23017.markdown +++ b/source/_components/mcp23017.markdown @@ -14,9 +14,6 @@ ha_category: - Switch ha_release: 0.92 ha_iot_class: Local Polling -redirect_from: - - /components/binary_sensor.mcp23017/ - - /components/switch.mcp23017/ --- The `mcp23017` component is the base for all related mcp23017 platforms in Home Assistant. There is no setup needed for the component itself, for the platforms please check their corresponding pages. From 17bd0f86bc79487ab35e5b3323771310646bc03e Mon Sep 17 00:00:00 2001 From: jgriff2 Date: Sun, 28 Apr 2019 13:10:51 -0700 Subject: [PATCH 18/85] Create remote_rpi_gpio.markdown --- source/_components/remote_rpi_gpio.markdown | 127 ++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 source/_components/remote_rpi_gpio.markdown diff --git a/source/_components/remote_rpi_gpio.markdown b/source/_components/remote_rpi_gpio.markdown new file mode 100644 index 00000000000..1a33e1fdabd --- /dev/null +++ b/source/_components/remote_rpi_gpio.markdown @@ -0,0 +1,127 @@ +--- +layout: page +title: "Remote Raspberry Pi GPIO" +description: "Instructions on how to integrate the GPIO capability of a Remote Raspberry Pi into Home Assistant." +date: 2019-02-20 19:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: raspberry-pi.png +ha_category: + - DIY + - Binary Sensor + - Switch +ha_release: +ha_iot_class: "Local Push" +redirect_from: + - /components/binary_sensor.remote_rpi_gpio/ + - /components/switch.remote_rpi_gpio/ +--- + +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. + +## {% linkable_title Binary Sensor %} + +The `remote_rpi_gpio` binary sensor platform allows you to read sensor values of the GPIOs of a [Remote Raspberry Pi](https://www.raspberrypi.org/). + +## {% linkable_title Configuration %} + +To use your Remote Raspberry Pi's GPIO in your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +binary_sensor: + - platform: remote_rpi_gpio + ports: + 11: PIR Office + 12: PIR Bedroom +``` + +{% configuration %} +address: + description: IP Address of remote Raspberry Pi + required: true + type: string +ports: + description: List of used ports. + required: true + type: map + keys: + "port: name": + description: The port numbers (BCM mode pin numbers) and corresponding names. + required: true + type: string +invert_logic: + description: If `true`, inverts the output logic + required: false + type: boolean + default: "`false` (ACTIVE HIGH)" +pull_mode: + description: > + Type of internal pull resistor to use. + Options are `UP` - pull-up resistor and `DOWN` - pull-down resistor. + Pull-Up defaults to active LOW and Pull-down defaults to active HIGH. This can be adjusted with invert_logic + required: false + type: string + default: "`UP`" +{% endconfiguration %} + +For more details about the GPIO layout, visit the Wikipedia [article](https://en.wikipedia.org/wiki/Raspberry_Pi#GPIO_connector) about the Raspberry Pi. + +## {% linkable_title Switch %} + +The `remote_rpi_gpio` switch platform allows you to control the GPIOs of a [Remote Raspberry Pi](https://www.raspberrypi.org/). + +## {% linkable_title Configuration %} + +To use your Remote Raspberry Pi's GPIO in your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +switch: + - platform: remote_rpi_gpio + address: 192.168.0.123 + ports: + 11: Fan Office + 12: Light Desk +``` + +{% configuration %} +address: + description: IP Address of remote Raspberry Pi + required: true + type: string +ports: + description: Array of used ports. + required: true + type: list + keys: + port: + description: Port numbers and corresponding names (GPIO #). + required: true + type: [integer, string] +invert_logic: + description: If true, inverts the output logic to ACTIVE LOW. + required: false + default: false + type: boolean +{% endconfiguration %} + +For more details about the GPIO layout, visit the Wikipedia [article](https://en.wikipedia.org/wiki/Raspberry_Pi#GPIO_connector) about the Raspberry Pi. + +

+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 #. +For example, if you have a relay connected to pin 11 its GPIO # is 17. + +```yaml +# Example configuration.yaml entry +switch: + - platform: remote_rpi_gpio + address: 192.168.0.123 + ports: + 17: Speaker Relay +``` From b5ffa4681ccddeeeec38df05234533d810e2d071 Mon Sep 17 00:00:00 2001 From: jgriff2 Date: Sun, 28 Apr 2019 13:11:05 -0700 Subject: [PATCH 19/85] Delete remote_rpi_gpio.markdown --- remote_rpi_gpio.markdown | 127 --------------------------------------- 1 file changed, 127 deletions(-) delete mode 100644 remote_rpi_gpio.markdown diff --git a/remote_rpi_gpio.markdown b/remote_rpi_gpio.markdown deleted file mode 100644 index 1a33e1fdabd..00000000000 --- a/remote_rpi_gpio.markdown +++ /dev/null @@ -1,127 +0,0 @@ ---- -layout: page -title: "Remote Raspberry Pi GPIO" -description: "Instructions on how to integrate the GPIO capability of a Remote Raspberry Pi into Home Assistant." -date: 2019-02-20 19:00 -sidebar: true -comments: false -sharing: true -footer: true -logo: raspberry-pi.png -ha_category: - - DIY - - Binary Sensor - - Switch -ha_release: -ha_iot_class: "Local Push" -redirect_from: - - /components/binary_sensor.remote_rpi_gpio/ - - /components/switch.remote_rpi_gpio/ ---- - -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. - -## {% linkable_title Binary Sensor %} - -The `remote_rpi_gpio` binary sensor platform allows you to read sensor values of the GPIOs of a [Remote Raspberry Pi](https://www.raspberrypi.org/). - -## {% linkable_title Configuration %} - -To use your Remote Raspberry Pi's GPIO in your installation, add the following to your `configuration.yaml` file: - -```yaml -# Example configuration.yaml entry -binary_sensor: - - platform: remote_rpi_gpio - ports: - 11: PIR Office - 12: PIR Bedroom -``` - -{% configuration %} -address: - description: IP Address of remote Raspberry Pi - required: true - type: string -ports: - description: List of used ports. - required: true - type: map - keys: - "port: name": - description: The port numbers (BCM mode pin numbers) and corresponding names. - required: true - type: string -invert_logic: - description: If `true`, inverts the output logic - required: false - type: boolean - default: "`false` (ACTIVE HIGH)" -pull_mode: - description: > - Type of internal pull resistor to use. - Options are `UP` - pull-up resistor and `DOWN` - pull-down resistor. - Pull-Up defaults to active LOW and Pull-down defaults to active HIGH. This can be adjusted with invert_logic - required: false - type: string - default: "`UP`" -{% endconfiguration %} - -For more details about the GPIO layout, visit the Wikipedia [article](https://en.wikipedia.org/wiki/Raspberry_Pi#GPIO_connector) about the Raspberry Pi. - -## {% linkable_title Switch %} - -The `remote_rpi_gpio` switch platform allows you to control the GPIOs of a [Remote Raspberry Pi](https://www.raspberrypi.org/). - -## {% linkable_title Configuration %} - -To use your Remote Raspberry Pi's GPIO in your installation, add the following to your `configuration.yaml` file: - -```yaml -# Example configuration.yaml entry -switch: - - platform: remote_rpi_gpio - address: 192.168.0.123 - ports: - 11: Fan Office - 12: Light Desk -``` - -{% configuration %} -address: - description: IP Address of remote Raspberry Pi - required: true - type: string -ports: - description: Array of used ports. - required: true - type: list - keys: - port: - description: Port numbers and corresponding names (GPIO #). - required: true - type: [integer, string] -invert_logic: - description: If true, inverts the output logic to ACTIVE LOW. - required: false - default: false - type: boolean -{% endconfiguration %} - -For more details about the GPIO layout, visit the Wikipedia [article](https://en.wikipedia.org/wiki/Raspberry_Pi#GPIO_connector) about the Raspberry Pi. - -

-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 #. -For example, if you have a relay connected to pin 11 its GPIO # is 17. - -```yaml -# Example configuration.yaml entry -switch: - - platform: remote_rpi_gpio - address: 192.168.0.123 - ports: - 17: Speaker Relay -``` From 25c026681830e5768ff36c686ec6695ea518f498 Mon Sep 17 00:00:00 2001 From: jgriff2 Date: Sun, 28 Apr 2019 13:15:27 -0700 Subject: [PATCH 20/85] Update remote_rpi_gpio.markdown --- source/_components/remote_rpi_gpio.markdown | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/source/_components/remote_rpi_gpio.markdown b/source/_components/remote_rpi_gpio.markdown index 1a33e1fdabd..e5fe106fe08 100644 --- a/source/_components/remote_rpi_gpio.markdown +++ b/source/_components/remote_rpi_gpio.markdown @@ -38,6 +38,18 @@ binary_sensor: 12: PIR Bedroom ``` +or + +```yaml +# Example configuration.yaml entry +remote_rpi_gpio: + host: 10.0.1.9 + binary_sensors: + 6: Pin6 + switches: + 4: Pin4 +``` + {% configuration %} address: description: IP Address of remote Raspberry Pi From 6c0aaf8a4e4d753f2109c98e2ea971b07c3f9f02 Mon Sep 17 00:00:00 2001 From: Jardi Martinez <1088732+jardiamj@users.noreply.github.com> Date: Tue, 7 May 2019 16:00:08 -0700 Subject: [PATCH 21/85] Update mcp23017.markdown --- source/_components/mcp23017.markdown | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/source/_components/mcp23017.markdown b/source/_components/mcp23017.markdown index 8cc30cfefbe..b5b9ca0338e 100644 --- a/source/_components/mcp23017.markdown +++ b/source/_components/mcp23017.markdown @@ -91,7 +91,7 @@ To use the I/O pins of an mcp23017 connected to and I2C bus of your Raspberry Pi switch: - platform: mcp23017 i2c_address: 0x20 - ports: + pins: 11: Fan Office 12: Light Desk ``` @@ -119,7 +119,3 @@ invert_logic: {% endconfiguration %} For more details about the MCP23017 I2C I/O port expander you can find its datasheet here: [MCP23017](https://www.microchip.com/wwwproducts/en/MCP23017). - -

-Note that a pin managed by HASS is expected to be exclusive to HASS. -

From ab968ca4fecf4528ce1cacc3551e174a27a21ef5 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Thu, 9 May 2019 09:14:21 +0200 Subject: [PATCH 22/85] :tada: Add Fibaro climate platform (#9417) --- source/_components/fibaro.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_components/fibaro.markdown b/source/_components/fibaro.markdown index eb38097daca..ea1384335d5 100644 --- a/source/_components/fibaro.markdown +++ b/source/_components/fibaro.markdown @@ -11,6 +11,7 @@ logo: fibaro.png ha_category: - Hub - Binary Sensor + - Climate - Cover - Light - Sensor @@ -33,6 +34,7 @@ There is currently support for the following device types within Home Assistant: - Binary Sensor - Cover +- Climate - Light - Sensor - Scene From 98a93e56babc4b5f1c4e418809d7a30ff593945e Mon Sep 17 00:00:00 2001 From: Markus Jankowski Date: Thu, 9 May 2019 10:14:27 +0200 Subject: [PATCH 23/85] Update missing Homematic IP Components (#9413) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Updated missing Homematic IP Components * Add Presence Sensor – indoor * :pencil2: Tweak * Fix spelling --- source/_components/homematicip_cloud.markdown | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/source/_components/homematicip_cloud.markdown b/source/_components/homematicip_cloud.markdown index 42615eb65b6..4b5cafadb27 100644 --- a/source/_components/homematicip_cloud.markdown +++ b/source/_components/homematicip_cloud.markdown @@ -96,7 +96,15 @@ authtoken: * Smoke sensor and alarm (*HmIP-SWSD*) * Motion Detector with Brightness Sensor - indoor (*HmIP-SMI*) * Motion Detector with Brightness Sensor - outdoor (*HmIP-SMO*) + * Presence Sensor – indoor (*HmIP-SPI*) * Water Sensor (*HmIP-SWD*) + * Remote Control - 8 buttons (*HmIP-RC8*) (battery only) + * Wall-mount Remote Control - 2-button (*HmIP-WRC2*) (battery only) + * Wall-mount Remote Control - 6-button (*HmIP-WRC6*) (battery only) + * Key Ring Remote Control - 4 buttons (*HmIP-KRC4*) (battery only) + * Key Ring Remote Control - alarm (*HmIP-KRCA*) (battery only) + * Alarm Siren (*HmIP-ASIR, -B1*) (battery only) + * Remote Control for brand switches – 2-button (*HmIP-BRC2*) (battery only) * homematicip_cloud.climate * Climate group (*HmIP-HeatingGroup*) @@ -116,7 +124,7 @@ authtoken: * Switch actuator and meter for brand switches (*HmIP-BSM*) * Dimming actuator for brand switches (*HmIP-BDT*) * Dimming actuator flush-mount (*HmIP-FDT*) - * Switch Actuator and Meter – flush-mount (*HmIP-FSM*) + * Pluggable Dimmer – trailing edge (*HmIP-PDT*) * Switch Actuator for brand switches – with signal lamp (*HmIP-BSL*) * homematicip_cloud.sensor @@ -128,12 +136,13 @@ authtoken: * Temperature and Humidity sensor - outdoor (*HmIP-STHO, -A*) * Motion Detector with Brightness Sensor - indoor (*HmIP-SMI*) * Motion Detector with Brightness Sensor - outdoor (*HmIP-SMO*) + * Presence Sensor – indoor (*HmIP-SPI*) * Light Sensor - outdoor (*HmIP-SLO*) * homematicip_cloud.switch * Pluggable Switch (*HmIP-PS*) * Pluggable Switch and Meter (*HmIP-PSM*) - should also work with (*HmIP-PSM-CH, -IT, -UK, -PE*) - * Switch Actuator for brand switches – with signal lamp (*HmIP-BSL*) + * Switch Actuator and Meter – flush-mount (*HmIP-FSM, -FSM16*) * Open Collector Module Receiver - 8x (*HmIP-MOD-OC8*) * Multi IO Box - 2x (*HmIP-MIOB*) @@ -141,4 +150,14 @@ authtoken: * Weather Sensor – basic (*HmIP-SWO-B*) * Weather Sensor – plus (*HmIP-SWO-PL*) * Weather Sensor – pro (*HmIP-SWO-PR*) + +Additional info: +Push button devices are only available with a battery sensor. This is due to a limitation of the vendor API (eq3). +It's not possible to detect a key press event on these devices at the moment. + + * Remote Control - 8 buttons (*HmIP-RC8*) + * Wall-mount Remote Control - 2-button (*HmIP-WRC2*) + * Wall-mount Remote Control - 6-button (*HmIP-WRC6*) + * Key Ring Remote Control - 4 buttons (*HmIP-KRC4*) + * Key Ring Remote Control - alarm (*HmIP-KRCA*) From 2901029d10508d9c2d0cb73d52c6c5d35f4c3dc8 Mon Sep 17 00:00:00 2001 From: jgriff2 Date: Thu, 9 May 2019 22:20:38 -0700 Subject: [PATCH 24/85] Update source/_components/remote_rpi_gpio.markdown Co-Authored-By: Klaas Schoute --- source/_components/remote_rpi_gpio.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/remote_rpi_gpio.markdown b/source/_components/remote_rpi_gpio.markdown index e5fe106fe08..e007f2e2eff 100644 --- a/source/_components/remote_rpi_gpio.markdown +++ b/source/_components/remote_rpi_gpio.markdown @@ -13,7 +13,7 @@ ha_category: - Binary Sensor - Switch ha_release: -ha_iot_class: "Local Push" +ha_iot_class: Local Push redirect_from: - /components/binary_sensor.remote_rpi_gpio/ - /components/switch.remote_rpi_gpio/ From 0f37cbda36f30b71f5b33d04cc84d34bab503436 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Fri, 10 May 2019 11:19:57 +0200 Subject: [PATCH 25/85] :pencil2: Remove redirect_from --- source/_components/remote_rpi_gpio.markdown | 3 --- 1 file changed, 3 deletions(-) diff --git a/source/_components/remote_rpi_gpio.markdown b/source/_components/remote_rpi_gpio.markdown index e007f2e2eff..9cc1eef6b6b 100644 --- a/source/_components/remote_rpi_gpio.markdown +++ b/source/_components/remote_rpi_gpio.markdown @@ -14,9 +14,6 @@ ha_category: - Switch ha_release: ha_iot_class: Local Push -redirect_from: - - /components/binary_sensor.remote_rpi_gpio/ - - /components/switch.remote_rpi_gpio/ --- 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. From bf4831a1edbb396bad22aae765f4115120cf4693 Mon Sep 17 00:00:00 2001 From: Martin Hjelmare Date: Sat, 11 May 2019 12:11:22 +0200 Subject: [PATCH 26/85] Update mysensors validation text (#9335) --- source/_components/mysensors.markdown | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/source/_components/mysensors.markdown b/source/_components/mysensors.markdown index bd5861b72aa..e8e1c1a0ae7 100644 --- a/source/_components/mysensors.markdown +++ b/source/_components/mysensors.markdown @@ -246,7 +246,13 @@ In MySensors version 2.2 the serial API changed from using `I_HEARTBEAT_RESPONSE Messages sent to or from Home Assistant from or to a MySensors device will be validated according to the MySensors [serial API](https://www.mysensors.org/download/serial_api_20). If a message doesn't pass validation, it will be dropped and not be passed forward either to or from Home Assistant. Make sure you follow the serial API for your version of MySensors when writing your Arduino sketch. -If you experience dropped messages or that a device is not added to Home Assistant, please turn on debug logging for the `mysensors` component and the `mysensors` package. +The log should warn you of messages that failed validation or if a child value is missing that is required for a certain child type. Home Assistant will log failed validations of child values at warning level if e.g. one required value type for a platform has been received, but other required value types are missing. + +Message validation was introduced in version 0.52 of Home Assistant. + +### {% linkable_title Debug logging %} + +If you experience dropped messages or that a device is not added to Home Assistant, please turn on debug logging for the `mysensors` component and the `mysensors` package. This will help you see what is going on. Make sure you use these logging settings to collect a log sample if you report an issue about the `mysensors` integration in our github issue tracker. ```yaml logger: default: info @@ -254,9 +260,6 @@ logger: homeassistant.components.mysensors: debug mysensors: debug ``` -The log should inform you of messages that failed validation or if a child value is missing that is required for a certain child type. Note that the log will log all possible combinations of platforms for a child type that failed validation. It is normal to see some platforms fail validation if the child type supports multiple platforms and your sketch doesn't send all corresponding value types. e.g., the `S_BARO` child type supports both `V_PRESSURE` and `V_FORECAST` value types. If you only send a `V_PRESSURE` value, an `S_BARO` entity with `V_PRESSURE` value will be set up for the sensor platform. However, the log will inform of a sensor platform that failed validation due to missing `V_FORECAST` value type for the `S_BARO` child. Home Assistant will log failed validations of child values at warning level if one required value type for a platform has been received, but other required value types are missing. Most failed validations are logged at debug level. - -Message validation was introduced in version 0.52 of Home Assistant. Visit the [library API][MySensors library api] of MySensors for more information. From edc75ac2b93265474c548900a318d31bf963a480 Mon Sep 17 00:00:00 2001 From: Timmo Date: Tue, 14 May 2019 10:58:01 +0100 Subject: [PATCH 27/85] Add entity button icon_height docs (#9449) * :sparkles: Add entity button icon_height docs Further to https://github.com/home-assistant/home-assistant-polymer/pull/2800#issuecomment-492079894 * :hammer: Expand --- source/_lovelace/entity-button.markdown | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/_lovelace/entity-button.markdown b/source/_lovelace/entity-button.markdown index 1cd473e21ab..fc5649cb712 100644 --- a/source/_lovelace/entity-button.markdown +++ b/source/_lovelace/entity-button.markdown @@ -51,6 +51,11 @@ show_icon: description: Show icon. type: boolean default: "true" +icon_height: + required: false + description: Set the height for the icon. This is in pixels which is handled by the config ui. (Advanced users can use other CSS values if they like) + type: string + default: auto tap_action: required: false description: Action to take on tap From f2cb7f4e997a00840f2763a593dff40b718a4e39 Mon Sep 17 00:00:00 2001 From: unixko <44964969+unixko@users.noreply.github.com> Date: Tue, 14 May 2019 17:48:51 +0700 Subject: [PATCH 28/85] add abbreviation for current_temperature_template (#9400) --- source/_docs/mqtt/discovery.markdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/_docs/mqtt/discovery.markdown b/source/_docs/mqtt/discovery.markdown index 3b42c2cf5a3..04dfa8af4fd 100644 --- a/source/_docs/mqtt/discovery.markdown +++ b/source/_docs/mqtt/discovery.markdown @@ -99,6 +99,7 @@ Supported abbreviations: 'cln_tpl': 'cleaning_template', 'cmd_t': 'command_topic', 'curr_temp_t': 'current_temperature_topic', + 'curr_temp_tpl': 'current_temperature_template', 'dev': 'device', 'dev_cla': 'device_class', 'dock_t': 'docked_topic', @@ -297,7 +298,7 @@ Setting up a climate component (heat only) with abbreviated configuration variab "temp_stat_t":"homeassistant/climate/livingroom/state", "temp_stat_tpl":"{{value_json.target_temp}}", "curr_temp_t":"homeassistant/climate/livingroom/state", - "current_temperature_template":"{{value_json.current_temp}}", + "curr_temp_tpl":"{{value_json.current_temp}}", "min_temp":"15", "max_temp":"25", "temp_step":"0.5", From db549b7d445e8980d0925f813fb591bdf54d2da3 Mon Sep 17 00:00:00 2001 From: Andre Lengwenus Date: Tue, 14 May 2019 21:10:30 +0200 Subject: [PATCH 29/85] Add docs for LCN climate platform (#9073) * Add docs for LCN climate platform * Shortened hyperlinks * Fixed ha_category --- source/_components/lcn.markdown | 93 ++++++++++++++++++++++++++++----- 1 file changed, 79 insertions(+), 14 deletions(-) diff --git a/source/_components/lcn.markdown b/source/_components/lcn.markdown index 2df7da4356a..b66e453dc84 100644 --- a/source/_components/lcn.markdown +++ b/source/_components/lcn.markdown @@ -11,6 +11,7 @@ logo: lcn.png ha_category: - Hub - Binary Sensor + - Climate - Cover - Light - Sensor @@ -31,6 +32,7 @@ With this setup sending and receiving commands to and from LCN modules is possib There is currently support for the following device types within Home Assistant: - [Binary Sensor](#binary-sensor) +- [Climate](#climate) - [Cover](#cover) - [Light](#light) - [Sensor](#sensor) @@ -56,6 +58,16 @@ lcn: address: myhome.s0.m7 source: binsensor1 + climates: + - name: Temperature bedroom + address: myhome.s0.m7 + source: var1 + setpoint: r1varsetpoint + min_temp: 17. + max_temp: 30. + lockable: true + unit_of_measurement: °C + covers: - name: Living room cover address: myhome.s0.m7 @@ -72,7 +84,7 @@ lcn: - name: Temperature address: myhome.s0.m7 source: var3 - unit_of_measuremnt: °C + unit_of_measurement: °C switches: - name: Sprinkler switch @@ -128,14 +140,56 @@ binary_sensors: required: true type: string address: - description: "[Address](/components/lcn#lcn-addresses) of the module/group." + description: "[Address](#lcn-addresses) of the module/group." required: true type: string source: - description: "Sensor source ([BINSENSOR](/components/lcn#ports), [SETPOINT](/components/lcn#variables-and-units), [KEYS](/components/lcn#keys))." + description: "Sensor source ([BINSENSOR](#ports), [SETPOINT](#variables-and-units), [KEYS](#keys))." required: true type: string +climates: + description: List of your climate devices. + required: false + type: map + keys: + name: + description: "Name of the climate controller." + required: true + type: string + address: + description: "[Address](#lcn-addresses) of the module/group." + required: true + type: string + source: + description: "Current temperature source ([VARIABLE](#variables-and-units))." + required: true + type: string + setpoint: + description: "Setpoint for target temperature ([VARIABLE](#variables-and-units), [SETPOINT](#variables-and-units))." + required: true + type: string + unit_of_measurement: + description: "Measurement unit ([VAR_UNIT](#variables-and-units))." + required: false + type: string + default: 'celsius' + min_temp: + description: "Minimum target temperature." + required: false + type: float + default: 7. + max_temp: + description: "Maximum target temperature." + required: false + type: float + default: 35. + lockable: + description: "Climate control can be locked." + required: false + type: bool + default: false + covers: description: List of your covers. required: false @@ -146,11 +200,11 @@ covers: required: true type: string address: - description: "[Address](/components/lcn#lcn-addresses) of the module/group." + description: "[Address](#lcn-addresses) of the module/group." required: true type: string motor: - description: "Motor port ([MOTOR_PORT](/components/lcn#ports))." + description: "Motor port ([MOTOR_PORT](#ports))." required: true type: string @@ -164,11 +218,11 @@ lights: required: true type: string address: - description: "[Address](/components/lcn#lcn-addresses) of the module/group." + description: "[Address](#lcn-addresses) of the module/group." required: true type: string output: - description: "Light source ([OUTPUT_PORT](/components/lcn#ports), [RELAY_PORT](/components/lcn#ports))." + description: "Light source ([OUTPUT_PORT](#ports), [RELAY_PORT](#ports))." required: true type: string dimmable: @@ -192,15 +246,15 @@ sensors: required: true type: string address: - description: "[Address](/components/lcn#lcn-addresses) of the module/group." + description: "[Address](#lcn-addresses) of the module/group." required: true type: string source: - description: "Sensor source ([VARIABLE](/components/lcn#variables-and-units), [SETPOINT](/components/lcn#variables-and-units), [THRESHOLD](/components/lcn#variables-and-units), [S0_INPUT](/components/lcn#variables-and-units), [LED_PORT](/components/lcn#ports), [LOGICOP_PORT](/components/lcn#ports))." + description: "Sensor source ([VARIABLE](#variables-and-units), [SETPOINT](#variables-and-units), [THRESHOLD](#variables-and-units), [S0_INPUT](#variables-and-units), [LED_PORT](#ports), [LOGICOP_PORT](#ports))." required: true type: string unit_of_measurement: - description: "Measurement unit ([VAR_UNIT](/components/lcn#variables-and-units))." + description: "Measurement unit ([VAR_UNIT](#variables-and-units))." required: false type: string default: 'native' @@ -215,11 +269,11 @@ switches: required: true type: string address: - description: "[Address](/components/lcn#lcn-addresses) of the module/group." + description: "[Address](#lcn-addresses) of the module/group." required: true type: string output: - description: "Switch source ([OUTPUT_PORT](/components/lcn#ports), [RELAY_PORT](/components/lcn#ports))." + description: "Switch source ([OUTPUT_PORT](#ports), [RELAY_PORT](#ports))." required: true type: string {% endconfiguration %} @@ -232,7 +286,7 @@ Modules can be arranged in _segments_. Segments can be addressed by their numeri LCN Modules within the _same_ segment can be grouped by their group id (5..254) or 3 (= target all groups.) -The LCN component allow the connection to more than one hardware coupler. In this case it has to be specified which hardware coupler should be used for addressing the specified module. +The LCN component allows the connection to more than one hardware coupler. In this case it has to be specified which hardware coupler should be used for addressing the specified module. Whenever the address of a module or a group has to be specified, it can be addressed using one of the following syntaxes: @@ -271,7 +325,7 @@ The platforms and service calls use several predefined constants as parameters. | LOGICOP_PORT | `logicop1`, `logicop2`, `logicop3`, `logicop4` | | BINSENSOR_PORT | `binsensor1`, `binsensor2`, `binsensor3`, `binsensor4`, `binsensor5`, `binsensor6`, `binsensor7`, `binsensor8` | -The [MOTOR_PORT](/components/lcn#ports) values specify which hardware relay configuration will be used: +The [MOTOR_PORT](#ports) values specify which hardware relay configuration will be used: | Motor | Relay on/off | Relay up/down | | :------: | :----------: | :-----------: | @@ -314,6 +368,17 @@ The `lcn` binary sensor platform allows the monitoring of the following [LCN](ht The binary sensor can be used in automation scripts or in conjunction with `template` platforms. +### {% linkable_title Climate %} + +The `lcn` climate platform allows the control of the [LCN](http://www.lcn.eu) climate regulators. +This platform depends on the correct configuration of the module's regulators which has to be done in the LCN-PRO programming software. +You need to specify at least the variable for the current temperature and a setpoint variable for the target temperature. +If the control is set lockable, the regulator can be turned on/off. + +

+If you intend to leave the regulation to home assistant, you should consider using the [Generic Thermostat](climate.generic_thermostat) in conjuction with [LCN Sensor](#sensor) and [LCN Switch](#switch). +

+ ### {% linkable_title Cover %} The `lcn` cover platform allows the control of [LCN](http://www.lcn.eu) relays which have been configured as motor controllers. From 8b21e6fd5c1e83125ac806ba76bb07d330b7f820 Mon Sep 17 00:00:00 2001 From: Baptiste Candellier Date: Tue, 14 May 2019 23:07:37 +0200 Subject: [PATCH 30/85] Add SmartHab documentation page (#8647) * Add SmartHab documentation page * Use proper placeholders for email and password in SmartHab page Co-Authored-By: outadoc * Improve phrasing in SmartHab doc * Apply suggestions from code review Co-Authored-By: outadoc * Remove redirect_from in smarthab.markdown * Move smarthab ha_release to 0.94 * Remove url configuration from smarthab doc * :pencil2: Tweak After this I will merge it --- source/_components/smarthab.markdown | 50 ++++++++++++++++++++ source/images/supported_brands/smarthab.png | Bin 0 -> 2034 bytes 2 files changed, 50 insertions(+) create mode 100644 source/_components/smarthab.markdown create mode 100644 source/images/supported_brands/smarthab.png diff --git a/source/_components/smarthab.markdown b/source/_components/smarthab.markdown new file mode 100644 index 00000000000..6eac4877e80 --- /dev/null +++ b/source/_components/smarthab.markdown @@ -0,0 +1,50 @@ +--- +layout: page +title: "SmartHab" +description: "Instructions on how to integrate SmartHab devices into Home Assistant" +date: 2019-02-13 08:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: smarthab.png +ha_release: 0.94 +ha_category: + - Hub + - Cover + - Light +ha_iot_class: Cloud Polling +--- + +If your home is fitted with [SmartHab](http://www.smarthab.fr/en/home/)'s +devices and you have access to their app-based services, you will be able +to control your lights and shutters with the SmartHab component for Home +Assistant. + +Once you have added a `smarthab` entry to your configuration, your supported +devices will automatically be discovered and made available on your dashboard. + +

+ To prevent being automatically logged out of your SmartHab mobile app, you + might want to create a secondary user in the app's settings and grant it + access to your home. You can then configure the component using this account's + credentials. This is also more secure, as this user should be less priviledged. +

+ +```yaml +# Example configuration.yaml entry +smarthab: + email: EMAIL_ADDRESS + password: PASSWORD +``` + +{% configuration %} +email: + description: The email address of your SmartHab account. + required: true + type: string +password: + description: The SmartHab account's password. + required: true + type: string +{% endconfiguration %} diff --git a/source/images/supported_brands/smarthab.png b/source/images/supported_brands/smarthab.png new file mode 100644 index 0000000000000000000000000000000000000000..47db7fbd81072ada3aef9d77c04824474edf7d4d GIT binary patch literal 2034 zcmb_ddpMNa8XpPe3`5K`*>b0bk%U|_LgSXmt?85dx80&*Z{wJZjLV5(BvNdoW^DHn zjiSiiOi8x8kxOnVlS>9uqK)(Uj6{F^4^@VcC5M&otY|1+K#R5X{rxMf|F)tys7shC=c87bRYE~;i`@r<^x1Tc)R zc{_h&x|~K@NI37wPCQ1xrh4+3M*~ueafWy_Rr2^#Q14QY9>a$feMe2Yy`A5!ZW<$g z_aTAZug9Ce2tJtAPW5=LWwD zs)5RucF^74B2}I=FJxWPdN1y4=f-s*OahnEA7YoVu0*LVNn1F5LSOqQhOgLm9Nft9p4iZcsTc z!N^;Pti#g}^3y*pXan`5r-SsL?=}M1Y$NC8`MbM0`-n?62OH+Rs0xP1EB zr11E6W_NZ|`1cwq<~7yr6b|_9h%ifUkj=Dzh;@3Am=1lPXj&9rzIF3HHv0Qaif==KO9K+iNF1hKh6}R)T%pQxn zMSRnZ|Hc&CEUE`)h4!^bzY(!^bUl$BTuAaNo0O}lt+6^QDyiEg}Zxx7yBGJgG0+(LS_4&gACT)B}YYU~UuL z+yI`{fS7NS>CEu?^ePm<%K7C@I2EB}nSaWORD5J)4ZYRN(MM@f4B+A=Q=<)tqzg%z zgOmWa{_#Pl*_e~GV%|jjXocLWXZYZwGIavejDll>CBuJYgW7<^s^^#XZDB{HY*94s zw|A3}KRJHjPKY`;)qz;b40Vq8&<)3^C{W)(>Gho&xvLv#s3hgn)HV{FnWhzX&F2dT2}*L33K#%X5aom?ZkSmW<9boc08`F4Rn6onFwjKG)mZ3zpR|z z5q4H7-QHiz#>{A5E38!}1X2q`YI35yS!{at z4Z5<3sKrd4Z(WEcidGw}4KIM7D{ZX|K+An*gSnMXja5I!fTwbYqJx!DwBa(Xo#MXV zVvotvPLgMO67`cd6x&KG1!>QKg?VDc{Ws$q{daqwQ4(V}c^EI7hl1;A)`+rx(T;da z!{`!XQZmQoXoz}*a=v#)(}W=}=Y*B4f*IGWBVs|tC28K+AETB#60@{1Vkxbq;-~ z9mI6;=PGSi8qJF`@+!Avv@(y~_>fG&^ikw#0lOOfnmf`_X%-AQ-|qvtfQAx4}B@9aWkmD;K&{pZu;Cr}nTZCw^Nimvlp z@e|-LSxD!5Goz8z{iKadZ(fMtKJm3VVj^>{&n{XlBMHP%ULAbLfSoE2^jOtgT#V`z z!vw+6<%eV||1Qyc?XG7Uq{CPOTU`&&3I7@x8=BPr;XKn)#+2kzqA5D|?H&y=+(Y<6 zDz;iYcC!x6bFf~UnLhPA@Bx9-nh8E97f$Vt6$|e**f_s!kCxZED8K)%J^K95jdcGj W4dhkh4W1!H4zsgz#8+ARCj1*rX1pf= literal 0 HcmV?d00001 From fe1d48696d49a1d182e667a34463b9877bf7e844 Mon Sep 17 00:00:00 2001 From: Anders Melchiorsen Date: Wed, 15 May 2019 03:10:19 +0200 Subject: [PATCH 31/85] Move Sonos services to sonos domain (#9380) --- source/_components/sonos.markdown | 22 +++++++++++----------- source/_cookbook/sonos_say.markdown | 6 +++--- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/source/_components/sonos.markdown b/source/_components/sonos.markdown index 6d72a800ca5..d7b259d8123 100644 --- a/source/_components/sonos.markdown +++ b/source/_components/sonos.markdown @@ -24,7 +24,7 @@ If you don't have the discovery component enabled, you can configure the Sonos c Sonos makes various services available to allow configuring groups. They are currently registered under the media player component. -### {% linkable_title Service `media_player.sonos_snapshot` %} +### {% linkable_title Service `sonos.snapshot` %} Take a snapshot of what is currently playing on one or more speakers. This service, and the following one, are useful if you want to play a doorbell or notification sound and resume playback afterwards. If no `entity_id` is provided, all speakers are snapshotted. @@ -38,12 +38,12 @@ The queue is not snapshotted and must be left untouched until the restore. Using | `with_group` | yes | Should we also snapshot the group layout and the state of other speakers in the group. -### {% linkable_title Service `media_player.sonos_restore` %} +### {% linkable_title Service `sonos.restore` %} Restore a previously taken snapshot of one or more speakers. If no `entity_id` is provided, all speakers are restored.

-The playing queue is not snapshotted. Using `media_player.sonos_restore` on a speaker that has replaced its queue will restore the playing position, but in the new queue! +The playing queue is not snapshotted. Using `sonos.restore` on a speaker that has replaced its queue will restore the playing position, but in the new queue!

@@ -55,24 +55,24 @@ A cloud queue cannot be restarted. This includes queues started from within Spot | `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. -### {% linkable_title Service `media_player.sonos_join` %} +### {% linkable_title Service `sonos.join` %} Group players together under a single coordinator. This will make a new group or join to an existing group. | Service data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `master` | no | A single `entity_id` that will become/stay the coordinator speaker. -| `entity_id` | no | String or list of `entity_id`s to join to the master. +| `entity_id` | yes | String or list of `entity_id`s to join to the master. -### {% linkable_title Service `media_player.sonos_unjoin` %} +### {% linkable_title Service `sonos.unjoin` %} Remove one or more speakers from their group of speakers. If no `entity_id` is provided, all speakers are unjoined. | Service data attribute | Optional | Description | | ---------------------- | -------- | ----------- | -| `entity_id` | no | String or list of `entity_id`s to separate from their coordinator speaker. +| `entity_id` | yes | String or list of `entity_id`s to separate from their coordinator speaker. -### {% linkable_title Service `media_player.sonos_set_sleep_timer` %} +### {% linkable_title Service `sonos.set_sleep_timer` %} Sets a timer that will turn off a speaker by tapering the volume down to 0 after a certain amount of time. Protip: If you set the sleep_time value to 0, then the speaker will immediately start tapering the volume down. @@ -81,7 +81,7 @@ Sets a timer that will turn off a speaker by tapering the volume down to 0 after | `entity_id` | no | String or list of `entity_id`s that will have their timers set. | `sleep_time` | no | Integer number of seconds that the speaker should wait until it starts tapering. Cannot exceed 86399 (one day). -### {% linkable_title Service `media_player.sonos_clear_sleep_timer` %} +### {% linkable_title Service `sonos.clear_sleep_timer` %} Clear the sleep timer on a speaker, if one is set. @@ -89,7 +89,7 @@ Clear the sleep timer on a speaker, if one is set. | ---------------------- | -------- | ----------- | | `entity_id` | no | String or list of `entity_id`s that will have their timers cleared. Must be a coordinator speaker. -### {% linkable_title Service `media_player.sonos_update_alarm` %} +### {% linkable_title Service `sonos.update_alarm` %} Update an existing Sonos alarm. @@ -102,7 +102,7 @@ Update an existing Sonos alarm. | `enabled` | yes | Boolean for whether or not to enable this alarm. | `include_linked_zones` | yes | Boolean that defines if the alarm also plays on grouped players. -### {% linkable_title Service `media_player.sonos_set_option` %} +### {% linkable_title Service `sonos.set_option` %} Set Sonos speaker options. diff --git a/source/_cookbook/sonos_say.markdown b/source/_cookbook/sonos_say.markdown index fd4b04b402f..65c58fb6c4a 100644 --- a/source/_cookbook/sonos_say.markdown +++ b/source/_cookbook/sonos_say.markdown @@ -19,10 +19,10 @@ script: sonos_say: alias: "Sonos TTS script" sequence: - - service: media_player.sonos_snapshot + - service: sonos.snapshot data_template: entity_id: {% raw %}"{{ sonos_entity }}"{% endraw %} - - service: media_player.sonos_unjoin + - service: sonos.unjoin data_template: entity_id: {% raw %}"{{ sonos_entity }}"{% endraw %} - service: media_player.volume_set @@ -34,7 +34,7 @@ script: entity_id: {% raw %}"{{ sonos_entity }}"{% endraw %} message: {% raw %}"{{ message }}"{% endraw %} - delay: {% raw %}"{{ delay }}"{% endraw %} - - service: media_player.sonos_restore + - service: sonos.restore data_template: entity_id: {% raw %}"{{ sonos_entity }}"{% endraw %} ``` From 11518c703097f8ee76fe50edae8efb386b036780 Mon Sep 17 00:00:00 2001 From: Penny Wood Date: Wed, 15 May 2019 19:05:56 +0800 Subject: [PATCH 32/85] Rising attribute. (#9460) --- source/_components/sun.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_components/sun.markdown b/source/_components/sun.markdown index 1ed1d0c9a98..cae4f6d77d7 100644 --- a/source/_components/sun.markdown +++ b/source/_components/sun.markdown @@ -73,3 +73,4 @@ which event (sunset or sunrise) and the offset. | `next_midnight` | Date and time of the next solar midnight (in UTC). | `elevation` | Solar elevation. This is the angle between the sun and the horizon. Negative values mean the sun is below the horizon. | `azimuth` | Solar azimuth. The angle is shown clockwise from north. +| `rising` | True if the Sun is currently rising, after solar midnight and before solar noon. From fbc55ccf82158bdc12bf76b06a41b37d94c907bd Mon Sep 17 00:00:00 2001 From: Fredrik Erlandsson Date: Thu, 16 May 2019 22:52:23 +0200 Subject: [PATCH 33/85] Updated SET_AWAY_MODE and TURN_ON/OFF on Daikin Climate (#9370) --- source/_components/daikin.markdown | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/source/_components/daikin.markdown b/source/_components/daikin.markdown index c01d5d8dff3..55079e1a5cf 100644 --- a/source/_components/daikin.markdown +++ b/source/_components/daikin.markdown @@ -61,10 +61,12 @@ hosts: The `daikin` climate platform integrates Daikin air conditioning systems into Home Assistant, enabling control of setting the following parameters: -- **mode** (cool, heat, dry, fan only or auto) -- **target temperature** -- **fan speed** -- **swing mode** +- [**mode**](https://www.home-assistant.io/components/climate#service-climateset_operation_mode) (cool, heat, dry, fan only or auto) +- [**target temperature**](https://www.home-assistant.io/components/climate#service-climateset_temperature) +- [**fan mode**](https://www.home-assistant.io/components/climate#service-climateset_fan_mode) (speed) +- [**swing mode**](https://www.home-assistant.io/components/climate#service-climateset_swing_mode) +- [**turn on/off**](https://www.home-assistant.io/components/climate#service-climateturn_on) +- [**away mode**](https://www.home-assistant.io/components/climate#service-climateset_away_mode) Current inside temperature is displayed. @@ -89,4 +91,4 @@ Daikin AirBase units exposes zones (typically rooms) that can be switched on/off

Zones with the name `-` will be ignored, just as the AirBase application is working. -

\ No newline at end of file +

From 103b0f7015cf1cc40c539fc4bf8569233b032020 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Sun, 19 May 2019 00:17:45 +0200 Subject: [PATCH 34/85] Remove warning (#9474) --- source/_components/alert.markdown | 5 ----- 1 file changed, 5 deletions(-) diff --git a/source/_components/alert.markdown b/source/_components/alert.markdown index c7c5f63976b..30c42c90a5e 100644 --- a/source/_components/alert.markdown +++ b/source/_components/alert.markdown @@ -23,11 +23,6 @@ water leak sensors, or any condition that may need your attention. Alerts will add an entity to the front end only when they are firing. This entity allows you to silence an alert until it is resolved. -

-When using the `alert` component, it is important that the time zone used for Home Assistant and the underlying operating system match. -Failing to do so may result in multiple alerts being sent at the same time (such as when Home Assistant is set to the `America/Detroit` time zone but the operating system uses `UTC`). -

- ### {% linkable_title Basic Example %} The `alert` component makes use of any of the `notifications` components. To From 8128db038603d57c4be113629e62fa5aa19da6e4 Mon Sep 17 00:00:00 2001 From: Robert Svensson Date: Sun, 19 May 2019 22:45:31 +0200 Subject: [PATCH 35/85] Add documentation for newly added types of Axis component https://github.com/home-assistant/home-assistant/pull/23312 --- source/_components/axis.markdown | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/source/_components/axis.markdown b/source/_components/axis.markdown index 824fc2ada6a..0f68a2a300a 100644 --- a/source/_components/axis.markdown +++ b/source/_components/axis.markdown @@ -11,12 +11,14 @@ logo: axis.png ha_category: - Camera - Binary Sensor + - Switch ha_config_flow: true ha_release: 0.45 ha_iot_class: Local Push redirect_from: - /components/binary_sensor.axis/ - /components/camera.axis/ + - /components/switch.axis/ --- [Axis Communications](https://www.axis.com/) devices are surveillance cameras, speakers, access control and other security-related network connected hardware. Event API works with firmware 5.50 and newer. @@ -43,3 +45,11 @@ The following sensor types are supported: - Passive IR motion detection - Sound detection - Day/night mode +- Inputs and Supervised Inputs + +## {% linkable_title Switch %} + +The following controllable port types are supported: + +- Output +- Relay From bc8af817675bfb676553b6367d1a4c4c560a1045 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Sun, 19 May 2019 22:58:10 +0200 Subject: [PATCH 36/85] :pencil2: Tweak Redirect_from is only for existing pages --- source/_components/axis.markdown | 1 - 1 file changed, 1 deletion(-) diff --git a/source/_components/axis.markdown b/source/_components/axis.markdown index 0f68a2a300a..b1f99ee480c 100644 --- a/source/_components/axis.markdown +++ b/source/_components/axis.markdown @@ -18,7 +18,6 @@ ha_iot_class: Local Push redirect_from: - /components/binary_sensor.axis/ - /components/camera.axis/ - - /components/switch.axis/ --- [Axis Communications](https://www.axis.com/) devices are surveillance cameras, speakers, access control and other security-related network connected hardware. Event API works with firmware 5.50 and newer. From 439ed20950ec746df06069e3a90bd91e7896e99a Mon Sep 17 00:00:00 2001 From: Matt Snyder Date: Sun, 19 May 2019 16:07:00 -0500 Subject: [PATCH 37/85] Doorbird refactor documentation update (#9483) * Doorbird refactor documentation update * Update token description * Whitespace changes * Update config key --- source/_components/doorbird.markdown | 84 ++++++++++++++++++---------- 1 file changed, 54 insertions(+), 30 deletions(-) diff --git a/source/_components/doorbird.markdown b/source/_components/doorbird.markdown index fe1e15b1413..adf5f0fd84b 100644 --- a/source/_components/doorbird.markdown +++ b/source/_components/doorbird.markdown @@ -37,18 +37,15 @@ To connect your device, add the following to your `configuration.yaml` file: ```yaml # Example configuration.yaml entry doorbird: - token: YOUR_DOORBIRD_TOKEN devices: - host: DOORBIRD_IP_OR_HOSTNAME username: YOUR_USERNAME password: YOUR_PASSWORD + token: YOUR_DOORBIRD_TOKEN ``` {% configuration %} -token: - description: Token to be used to authenticate Doorbird calls to Home Assistant. This can be obtained from your "Digital Passport" document provided with your Doorbird. - required: true - type: string + devices: description: List of Doorbird devices. required: true @@ -66,6 +63,10 @@ devices: description: The password for the user specified. required: true type: string + token: + description: Token to be used to authenticate Doorbird calls to Home Assistant. This is a user defined value and should be unique across all Doorbird devices. + required: true + type: string name: description: Custom name for this device. required: false @@ -74,56 +75,62 @@ devices: description: If your DoorBird cannot connect to the machine running Home Assistant because you are using dynamic DNS or some other HTTP configuration (such as HTTPS), specify the LAN IP of the machine here to force a LAN connection. required: false type: string - monitored_conditions: - description: Monitor motion and/or doorbell events for this device. + events: + description: Custom event names to be registered on the device. User defined values. Special characters should be avoided. required: false - type: string - keys: - doorbell: - description: Monitor doorbell events. - motion: - description: Monitor motion events (Motion monitoring must be enabled on the doorstation via DoorBird app). - relay: - description: Monitor relay events. This event is fired even if a relay is not physically connected to the door station. Can be used to lock/unlock any smart lock present in Home Assistant via the Doorbird app. - + type: list + {% endconfiguration %} ## {% linkable_title Full example %} ```yaml doorbird: - token: YOUR_DOORBIRD_TOKEN devices: - host: DOORBIRD_IP_OR_HOSTNAME username: YOUR_USERNAME password: YOUR_PASSWORD + token: CUSTOM_TOKEN_1 hass_url_override: HASS_URL name: Front Door - host: DOORBIRD_IP_OR_HOSTNAME username: YOUR_USERNAME password: YOUR_PASSWORD + token: CUSTOM_TOKEN_2 name: Driveway Gate - monitored_conditions: - - doorbell - - motion - - relay + events: + - doorbell_1 + - somebody_pressed_the_button + - relay_unlocked + - unit_2_bell + - rfid_card_scanned ``` ## {% linkable_title Events %} -Home Assistant will fire an event any time a `monitored_condition` happens on a doorstation. Event names are created using the format `doorbird_{station}_{event}` (Examples: `doorbird_side_entry_button`, `doorbird_side_entry_motion`). You can verify the assigned event names in the Available Events list on the Events developer view. +Events can be defined for each configured DoorBird device independently. These events will be registered on the device and can be attached to a schedule via the DoorBird app. + +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. + +See [Automation Example](#automation_example) section below for details on how to use the event names in an automation.

-Home Assistant will register the monitored conditions with the device as schedule entries that correspond to favorites on startup. If you remove monitored conditions from your configuration, Home Assistant will attempt to remove these items from the device. However, in some cases, such as if the IP address of the machine running Home Assistant changes or if the device is renamed in your configuration, this will not work correctly and some data will be left in device storage. -

-This should not cause any problems, but if you would like to remove it, open a new browser window and navigate to `{Home Assistant URL}/api/doorbird/clear/{DoorBird name}`. Replace `{Home Assistant URL}` with the full path to your running instance, such as `http://localhost:8123`. Replace `{DoorBird name}` with the name specified in your configuration for the device you would like to clear, or how it appears in the Home Assistant UI if you have not specified one, such as `DoorBird 1`. Then use the mobile app to reschedule push notifications. -

-Please note that clearing device registrations will prevent the device from sending pushes to Home Assistant until you restart your instance with the component enabled. It could also affect other third-party applications you may use with your DoorBird device. It will not break the official mobile app in any way, so mobile push notifications will still work. +Events will not be received in Home Assistant until a schedule is defined via the DoorBird app.

+#### {% linkable_title Clearing Registered Events %} +Events can be cleared from DoorBird devices by visiting a special URL. + +Simply open a new browser window and navigate to `{Home Assistant URL}/api/doorbird/clear?token={DEVICE_TOKEN}`. Replace `{Home Assistant URL}` with the full path to your running instance, such as `http://localhost:8123`. Replace `{DEVICE_TOKEN}` with the token specified in your configuration for the device you would like to clear. +

+Please note that clearing device events will require configuration steps above to be taken again. It could also affect other third-party applications you may use with your DoorBird device. It will not break the official mobile app in any way, so mobile push notifications will still work. + + #### {% linkable_title Event Data %} -Each event includes live image and video URLs for the Doorbird device that triggered the event. These URLs can be found on the event data and can be useful in automation actions. For example, you could use `html5_viewer_url` on a notification to be linked directly to the live view of the device that triggered the automation. +Each event will include live image and video URLs for the Doorbird device that triggered the event. These URLs can be found on the event data and can be useful in automation actions. For example, you could use `html5_viewer_url` on a notification to be linked directly to the live view of the device that triggered the automation. The following keys are available on `event_data`: @@ -134,16 +141,33 @@ The following keys are available on `event_data`: - `html5_viewer_url`

-The URLs on the event will be based on the configuration used to connect to your Doorbird device. Ability to connect from outside your network will depend on your configuration. +The URLs on the event will be based on the configuration used to connect to your Doorbird device. Ability to connect from outside your network will depend on your configuration.

+#### {% linkable_title Schedules %} + +Once events have been registered on the DoorBird device, they must be attached to a schedule using the official DoorBird app on Android or iOS. Currently there are schedules available for doorbell, motion, relay, and RFID events (on supported devices). + +For iOS, the schedules can be found by navigating to the following areas of the app: + +- Doorbell | Settings > Administration > Specific Device > Schedule for Doorbell +- Motion | Settings > Administration > Specific Device > 3D Motion Sensor (Settings) > Schedule for Actions +- Relay | Settings > Administration > Specific Device > Relays > Schedule +- RFID | Settings > Administration > Specific Device > RFID Transponder > Settings > Select Transponder > Schedule + +Once you are on the desired schedule, click the dropdown button in the upper left to switch to the HTTP Calls view. Now if you click on the heading just above the schedule, you can select the event you would like to be called for the particular schedule that is being viewed. + +On the desired event, you should be able to specify blocks of time for when you would like the event to be sent to Home Assistant. If you want the event to always send, the square in the upper right can be used to populate the entire schedule. Events will be fired to Home Assistant for blocks of time that are blue. + +Remember to complete the schedule assignment steps above for each event type that you registered. + ### {% linkable_title Automation Example %} ```yaml - alias: Doorbird Ring trigger: platform: event - event_type: doorbird_side_entry_button + event_type: doorbird_somebody_pressed_the_button action: service: light.turn_on entity_id: light.side_entry_porch From 7509aaff11ce7e819c4e1ed490fbe39fe93eb181 Mon Sep 17 00:00:00 2001 From: bouni Date: Tue, 14 May 2019 09:49:12 +0200 Subject: [PATCH 38/85] extended spaceapi component documentation --- source/_components/spaceapi.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_components/spaceapi.markdown b/source/_components/spaceapi.markdown index 8f83f10ab3c..29de8f0f27c 100644 --- a/source/_components/spaceapi.markdown +++ b/source/_components/spaceapi.markdown @@ -114,6 +114,8 @@ sensors: type: entity_id {% endconfiguration %} +The list of sensors can be any sensor, not just temperature or humidity. + ## {% linkable_title Examples %} In this section you find some real-life examples of how to use this component. From 2de75f5f7994382ead7f39fb4aaac9778f82b2c6 Mon Sep 17 00:00:00 2001 From: bouni Date: Mon, 20 May 2019 12:09:11 +0200 Subject: [PATCH 39/85] added description how to set the location attribute of a sensor --- source/_components/spaceapi.markdown | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/source/_components/spaceapi.markdown b/source/_components/spaceapi.markdown index 29de8f0f27c..beb7cd8d5e1 100644 --- a/source/_components/spaceapi.markdown +++ b/source/_components/spaceapi.markdown @@ -116,6 +116,18 @@ sensors: The list of sensors can be any sensor, not just temperature or humidity. +## Sensor specific location + +The [SpaceAPI specification](https://spaceapi.io/pages/docs.html) requires every sensor to provide a location. +In order to set a sensor specific location do the following steps: + +1. Go to Configuration -> Customization +2. Select the sensor entity +3. Pick "Other" from the attribute override pulldown +4. Set the attribute name to location and the attribute value to your desired location + +If no location is set, the location defined in the HA config is used. + ## {% linkable_title Examples %} In this section you find some real-life examples of how to use this component. From ca62a8700f92b0fc2c01efccc7e68ad32812a3fe Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Wed, 22 May 2019 21:45:13 +0200 Subject: [PATCH 40/85] Update monitored_conditions (#9385) * Update monitored_conditions * Fix lint * Add missing colons --- source/_components/iqvia.markdown | 54 +++++++++++++++---------------- 1 file changed, 26 insertions(+), 28 deletions(-) diff --git a/source/_components/iqvia.markdown b/source/_components/iqvia.markdown index cb04396076a..12969ba0c89 100644 --- a/source/_components/iqvia.markdown +++ b/source/_components/iqvia.markdown @@ -17,7 +17,7 @@ redirect_from: - /components/pollen/ --- -The `iqvia` sensor platform collects and displays allergy, asthma, and disease +The `iqvia` sensor platform collects and displays allergy, asthma and disease information (based on a U.S. ZIP code) from [IQVIA](https://www.iqvia.com/). Data measured includes: @@ -39,25 +39,39 @@ iqvia: - allergy_average_forecasted - allergy_index_today - allergy_index_tomorrow - - allergy_index_yesterday - asthma_average_forecasted - asthma_index_today - asthma_index_tomorrow - - asthma_index_yesterday - disease_average_forecasted - disease_index_today - - disease_index_yesterday ``` {% configuration %} - zip_code: - description: the U.S. ZIP code to gather data for (as a quoted string) - required: true - type: string - monitored_conditions: - description: the metric types to monitor; valid values are specified below - required: true - type: list +zip_code: + description: The U.S. ZIP code to gather data for (as a quoted string). + required: true + type: string +monitored_conditions: + description: The metric types to monitor. + required: true + type: list + keys: + allergy_average_forecasted: + description: "The average forecasted allergy index over the next 5 days." + allergy_index_today: + description: "The allergy index for today." + allergy_index_tomorrow: + description: "The allergy index for tomorrow." + asthma_average_forecasted: + description: "The average forecasted asthma index over the next 5 days." + asthma_index_today: + description: "The asthma index for today." + asthma_index_tomorrow: + description: "The asthma index for tomorrow." + disease_average_forecasted: + description: "The average forecasted cold/flu index over the next 5 days." + disease_index_today: + description: "The cold/flu index for today." {% endconfiguration %}

@@ -65,22 +79,6 @@ It is important to ensure the ZIP code is quoted if it starts with a 0. Unquoted ZIP codes that start with 0 will cause errors.

-## {% linkable_title Available Metrics %} - -The following metrics can be monitored: - -* Allergy Index: Forecasted Average (`allergy_average_forecasted`): the average forecasted allergy index over the next 5 days -* Allergy Index: Today (`allergy_index_today`): the allergy index for today -* Allergy Index: Tomorrow (`allergy_index_tomorrow`): the allergy index for tomorrow -* Allergy Index: Yesterday (`allergy_index_yesterday`): the allergy index for yesterday -* Asthma Index: Forecasted Average (`asthma_average_forecasted`): the average forecasted asthma index over the next 5 days -* Asthma Index: Today (`asthma_index_today`): the asthma index for today -* Asthma Index: Tomorrow (`asthma_index_tomorrow`): the asthma index for tomorrow -* Asthma Index: Yesterday (`asthma_index_yesterday`): the asthma index for yesterday -* Cold & Flu: Forecasted Average (`disease_average_forecasted`): the average forecasted cold/flu index over the next 5 days -* Cold & Flu Index: Today (`disease_index_today`): the cold/flu index for today -* Cold & Flu Index: Yesterday (`disease_index_yesterday`): the cold/flu index for yesterday - ## {% linkable_title Understanding the Indices %} Any index-related sensor will have a value between 0.0 and 12.0. The values From 3130ec0653474996cc5c6e547f15fd4e740b3fe4 Mon Sep 17 00:00:00 2001 From: David Bonnes Date: Fri, 24 May 2019 22:52:05 +0100 Subject: [PATCH 41/85] Add geniushub sensors for issues (#9492) * Initial commit * :pencil2: Tweak * Initial commit --- source/_components/geniushub.markdown | 41 ++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/source/_components/geniushub.markdown b/source/_components/geniushub.markdown index 00789f70031..23aa01aa395 100644 --- a/source/_components/geniushub.markdown +++ b/source/_components/geniushub.markdown @@ -11,17 +11,47 @@ logo: geniushub.png ha_category: - Climate - Water heater + - Sensor + - Binary sensor ha_release: 0.92 ha_iot_class: Local Polling --- -The `geniushub` integration links Home Assistant with your Genius Hub (the hub does not have to be in the same network as HA). +The `geniushub` integration links Home Assistant with your Genius Hub for controlling its Zones and Devices. Currently, there is no support for Zone schedules. -Currently only **Radiator** and **Hot Water Temperature** zones are supported. Within HA, each **Radiator** zone will appear as a `Climate` device, and each **Hot Water Temperature** zone will appear as a `WaterHeater` device. +It uses the [geniushub-client](https://pypi.org/project/geniushub-client/) library. -The device's `operating_mode` can be set to one of `off`, `timer`, `on` (i.e. **Override** mode) or `eco`. The `eco` mode is a proxy for the **Footprint** mode and so is only available to **Radiator** zones that have room sensors. +### {% linkable_title Zones %} -Other properties are available via the device's state attributes, which includes a JSON data structure called `status`. For example, in the case of **Radiator** zones/`Climate` devices: +Each Zone controlled by your Genius hub will be exposed as either a: + + - `Climate` entity, for **Radiator** Zones, and + - `Water Heater`, for **Hot Water Temperature** Zones + +Other Zone types, such as **On / Off** Zones, are not currently supported. + +Each such entity will report back its mode, state, setpoint and current temperature; other properties are available via its attributes (see below). + +In addition, the entity's mode and setpoint can be changed. The entity's `operating_mode` can be set to one of `off`, `timer`, `on` (i.e. **Override** mode) or `eco`. The `eco` mode is a proxy for the **Footprint** mode and so is only available to **Radiator** Zones that have room sensors. + +### {% linkable_title Devices %} + +If the Hub is directly polled using the v3 API (see below), then each Device controlled by your Genius hub will be exposed as either a: + + - `Sensor` entity with a % battery, for any Device with a battery (e.g. a Genius Valve), or + - `Binary Sensor` entity with on/off state for any Device that is a switch (e.g. a Smart Plug) + +Each such entity will report back its primary state; in addition, `assigned_zone` and `last_comms` (last communications time) are available via the entity's attributes. + +### {% linkable_title Issues %} + +There are three `Sensor` entities that will indicate the number of **Errors**, **Warnings** and **Information** issues. + +Each such entity has a state attribute that will contain a list of any such issues. For example, `error_list`. + +### {% linkable_title State Attributes %} + +Other properties are available via each entity's state attributes. For example, in the case of **Radiator** Zones/`Climate` devices: ```json { @@ -35,7 +65,6 @@ Other properties are available via the device's state attributes, which includes } } } - ``` This data can be accessed in automations, etc. via a value template. For example: @@ -54,8 +83,6 @@ value_template: "{{ state_attr('climate.main_room', 'status').occupied }}" ``` {% endraw %} -Currently, there is no support for modifying schedules and neither do they appear in the state attributes. - ## {% linkable_title Configuration %} To add your Genius Hub into your Home Assistant installation, add one of the following to your `configuration.yaml` file. From ea232283b3c14a4c70924a4df64eb38edb7d0972 Mon Sep 17 00:00:00 2001 From: Jardi Martinez <1088732+jardiamj@users.noreply.github.com> Date: Sat, 25 May 2019 17:34:41 -0700 Subject: [PATCH 42/85] Update source/_components/mcp23017.markdown Co-Authored-By: Anders Melchiorsen --- source/_components/mcp23017.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/mcp23017.markdown b/source/_components/mcp23017.markdown index b5b9ca0338e..6eb6cf88fcc 100644 --- a/source/_components/mcp23017.markdown +++ b/source/_components/mcp23017.markdown @@ -16,7 +16,7 @@ ha_release: 0.92 ha_iot_class: Local Polling --- -The `mcp23017` component is the base for all related mcp23017 platforms in Home Assistant. There is no setup needed for the component itself, for the platforms please check their corresponding pages. +The `mcp23017` component is the base for all related mcp23017 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 %} From 29f831a0fd51a16ee7e24e0c719de3e7d1073998 Mon Sep 17 00:00:00 2001 From: Jardi Martinez <1088732+jardiamj@users.noreply.github.com> Date: Sat, 25 May 2019 17:34:50 -0700 Subject: [PATCH 43/85] Update source/_components/mcp23017.markdown Co-Authored-By: Anders Melchiorsen --- source/_components/mcp23017.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/mcp23017.markdown b/source/_components/mcp23017.markdown index 6eb6cf88fcc..bad3108f9b1 100644 --- a/source/_components/mcp23017.markdown +++ b/source/_components/mcp23017.markdown @@ -26,7 +26,7 @@ The pin numbers are from 0 to 15 where: 0-7 correspond to port A (A1-A8) and 8-1 ## {% linkable_title Configuration %} -To use the I/O pins of an mcp23017 connected to and I2C bus of your Raspberry Pi as binary sensors, add the following to your `configuration.yaml` file: +To use the I/O pins of an mcp23017 connected to an I2C bus of your Raspberry Pi as binary sensors, add the following to your `configuration.yaml` file: ```yaml # Example configuration.yaml entry From 1094afdcde75b16278526a6bf6b17ccf1025ad60 Mon Sep 17 00:00:00 2001 From: Jardi Martinez <1088732+jardiamj@users.noreply.github.com> Date: Sat, 25 May 2019 17:35:03 -0700 Subject: [PATCH 44/85] Update source/_components/mcp23017.markdown Co-Authored-By: Anders Melchiorsen --- source/_components/mcp23017.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/mcp23017.markdown b/source/_components/mcp23017.markdown index bad3108f9b1..b3584bf9a63 100644 --- a/source/_components/mcp23017.markdown +++ b/source/_components/mcp23017.markdown @@ -84,7 +84,7 @@ The pin numbers are from 0 to 15 where: 0-7 correspond to port A (A1-A8) and 8-1 ## {% linkable_title Configuration %} -To use the I/O pins of an mcp23017 connected to and I2C bus of your Raspberry Pi as switches, add the following to your `configuration.yaml` file: +To use the I/O pins of an mcp23017 connected to an I2C bus of your Raspberry Pi as switches, add the following to your `configuration.yaml` file: ```yaml # Example configuration.yaml entry From b074788c96b08e0ad8e36d8c0eec01de6e49a5b1 Mon Sep 17 00:00:00 2001 From: "Jardi A. Martinez Jordan" <1088732+jardiamj@users.noreply.github.com> Date: Sat, 25 May 2019 18:18:59 -0700 Subject: [PATCH 45/85] Updated documentation for mcp23017 component. --- source/_components/mcp23017.markdown | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/source/_components/mcp23017.markdown b/source/_components/mcp23017.markdown index b3584bf9a63..f7c71b9119b 100644 --- a/source/_components/mcp23017.markdown +++ b/source/_components/mcp23017.markdown @@ -18,13 +18,15 @@ ha_iot_class: Local Polling The `mcp23017` component is the base for all related mcp23017 platforms in Home Assistant. There is no setup needed for the component itself, for the platforms please check their corresponding sections. +For more details about the MCP23017 I2C I/O port expander you can find its datasheet here: [MCP23017](https://www.microchip.com/wwwproducts/en/MCP23017). + ## {% linkable_title Binary Sensor %} The `mcp23017` binary sensor platform allows you to read sensor values from the I/O pins of your [MCP23017 I2C I/O expander](https://www.adafruit.com/product/732). The pin numbers are from 0 to 15 where: 0-7 correspond to port A (A1-A8) and 8-15 to port B (B1-B8). -## {% linkable_title Configuration %} +### {% linkable_title Configuration %} To use the I/O pins of an mcp23017 connected to an I2C bus of your Raspberry Pi as binary sensors, add the following to your `configuration.yaml` file: @@ -74,15 +76,13 @@ pull_mode: NOTE: MCP23017 only has internal pull-up resistors, if you want to use pull-down you will have to wire your own pull-down resistors. -For more details about the MCP23017 I2C I/O port expander you can find its datasheet here: [MCP23017](https://www.microchip.com/wwwproducts/en/MCP23017). - ## {% linkable_title Switch %} The `mcp23017` switch platform allows you to write to the I/O pins of your [MCP23017 I2C I/O expander](https://www.adafruit.com/product/732). The pin numbers are from 0 to 15 where: 0-7 correspond to port A (A1-A8) and 8-15 to port B (B1-B8). -## {% linkable_title Configuration %} +### {% linkable_title Configuration %} To use the I/O pins of an mcp23017 connected to an I2C bus of your Raspberry Pi as switches, add the following to your `configuration.yaml` file: @@ -117,5 +117,3 @@ invert_logic: default: false type: boolean {% endconfiguration %} - -For more details about the MCP23017 I2C I/O port expander you can find its datasheet here: [MCP23017](https://www.microchip.com/wwwproducts/en/MCP23017). From 28aa919d0b67d303c0ba40ad2154a8116c0c8255 Mon Sep 17 00:00:00 2001 From: jgriff2 Date: Sun, 26 May 2019 14:54:40 -0700 Subject: [PATCH 46/85] Update remote_rpi_gpio.markdown --- source/_components/remote_rpi_gpio.markdown | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/source/_components/remote_rpi_gpio.markdown b/source/_components/remote_rpi_gpio.markdown index 9cc1eef6b6b..ab7112f0eb8 100644 --- a/source/_components/remote_rpi_gpio.markdown +++ b/source/_components/remote_rpi_gpio.markdown @@ -30,21 +30,16 @@ 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:
ports: 11: PIR Office 12: PIR Bedroom -``` - -or - -```yaml -# Example configuration.yaml entry -remote_rpi_gpio: - host: 10.0.1.9 - binary_sensors: - 6: Pin6 - switches: - 4: Pin4 + +switch: + - platform: remote_rpi_gpio + address:
+ ports: + 4: Garage Relay ``` {% configuration %} From be34da7215bf5e1a1646b5c95a9686ad36abb260 Mon Sep 17 00:00:00 2001 From: Kevin Fronczak Date: Mon, 27 May 2019 06:22:58 -0400 Subject: [PATCH 47/85] Update Blink docs with new options (#9508) * Update example configs with new options * Minor changes --- source/_components/blink.markdown | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/source/_components/blink.markdown b/source/_components/blink.markdown index 0232e4de8d4..483831ff3c7 100644 --- a/source/_components/blink.markdown +++ b/source/_components/blink.markdown @@ -73,6 +73,16 @@ sensors: required: false type: list default: all (`battery`, `temperature`, `wifi_strength`) +offset: + description: How far back in time (minutes) to look for motion. Motion is determined if a new video has been recorded between now and the last time you refreshed plus this offset. + required: false + type: integer + default: 1 +mode: + description: Set to 'legacy' to enable use of old API endpoint subdomains (APIs can differ based on region, so use this if you are having issues with the integration). + required: false + type: string + default: not set {% endconfiguration %} Once Home Assistant starts, the `blink` component will create the following platforms: From e0ca456f9ad0bc1f0757c029891653218497ce97 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 29 May 2019 14:29:34 -0700 Subject: [PATCH 48/85] 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 72a5b68b43d3a5abbb132cfb0fdc85a2f1a5ac06 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Wed, 29 May 2019 23:39:18 +0200 Subject: [PATCH 49/85] :pencil2: Tweak After this we will merge it --- source/_components/solax.markdown | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/source/_components/solax.markdown b/source/_components/solax.markdown index 18c0d21321f..180fee62291 100644 --- a/source/_components/solax.markdown +++ b/source/_components/solax.markdown @@ -8,8 +8,10 @@ comments: false sharing: true footer: true logo: solax-logo.png -ha_category: Sensor -ha_release: 0.91 +ha_category: + - Energy + - Sensor +ha_release: 0.94 ha_iot_class: Local Polling --- @@ -33,17 +35,7 @@ ip_address: type: string {% endconfiguration %} - -### {% linkable_title Full configuration sample %} - -A full configuration entry would look like the sample below. - -```yaml -# Example configuration.yaml entry -sensor: - - platform: solax - ip_address: 192.168.0.3 -``` +### {% linkable_title Optional template sensor %} If you would like to convert the values from multiple panels or view the total power the house is using, you can use the [template platform](/components/sensor.template/). From 5492da48660e9e6bfa00195256fef9c6ba39e1d9 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Wed, 29 May 2019 23:41:30 +0200 Subject: [PATCH 50/85] :pencil2: Tweak After this we will merge it --- source/_components/remote_rpi_gpio.markdown | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/source/_components/remote_rpi_gpio.markdown b/source/_components/remote_rpi_gpio.markdown index ab7112f0eb8..50f75828065 100644 --- a/source/_components/remote_rpi_gpio.markdown +++ b/source/_components/remote_rpi_gpio.markdown @@ -12,7 +12,7 @@ ha_category: - DIY - Binary Sensor - Switch -ha_release: +ha_release: 0.94 ha_iot_class: Local Push --- @@ -22,8 +22,6 @@ The `rpi_gpio` component is the base for all related GPIO platforms in Home Assi The `remote_rpi_gpio` binary sensor platform allows you to read sensor values of the GPIOs of a [Remote Raspberry Pi](https://www.raspberrypi.org/). -## {% linkable_title Configuration %} - To use your Remote Raspberry Pi's GPIO in your installation, add the following to your `configuration.yaml` file: ```yaml @@ -77,8 +75,6 @@ For more details about the GPIO layout, visit the Wikipedia [article](https://en The `remote_rpi_gpio` switch platform allows you to control the GPIOs of a [Remote Raspberry Pi](https://www.raspberrypi.org/). -## {% linkable_title Configuration %} - To use your Remote Raspberry Pi's GPIO in your installation, add the following to your `configuration.yaml` file: ```yaml From e7e18cc24b96752c041f492503e6da7914feea80 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Wed, 29 May 2019 23:43:35 +0200 Subject: [PATCH 51/85] :pencil2: Tweak After this we will merge it --- source/_components/mcp23017.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/mcp23017.markdown b/source/_components/mcp23017.markdown index f7c71b9119b..2ac764d35ec 100644 --- a/source/_components/mcp23017.markdown +++ b/source/_components/mcp23017.markdown @@ -12,7 +12,7 @@ ha_category: - DIY - Binary Sensor - Switch -ha_release: 0.92 +ha_release: 0.94 ha_iot_class: Local Polling --- From 11e131ccfb83c9675041dfe701ecf4ab2b480ebf Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Wed, 29 May 2019 23:45:19 +0200 Subject: [PATCH 52/85] :pencil2: Tweak After this we will merge it --- source/_components/spaceapi.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/spaceapi.markdown b/source/_components/spaceapi.markdown index beb7cd8d5e1..34d9add3420 100644 --- a/source/_components/spaceapi.markdown +++ b/source/_components/spaceapi.markdown @@ -116,7 +116,7 @@ sensors: The list of sensors can be any sensor, not just temperature or humidity. -## Sensor specific location +## {% linkable_title Sensor specific location %} The [SpaceAPI specification](https://spaceapi.io/pages/docs.html) requires every sensor to provide a location. In order to set a sensor specific location do the following steps: From fae2293b1552927bb15ff7621e3f3cdba46f882a Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Wed, 29 May 2019 23:53:13 +0200 Subject: [PATCH 53/85] :pencil2: Put something in a html note --- source/_components/mcp23017.markdown | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/_components/mcp23017.markdown b/source/_components/mcp23017.markdown index 2ac764d35ec..4629de4e426 100644 --- a/source/_components/mcp23017.markdown +++ b/source/_components/mcp23017.markdown @@ -74,7 +74,9 @@ pull_mode: default: "`UP`" {% endconfiguration %} -NOTE: MCP23017 only has internal pull-up resistors, if you want to use pull-down you will have to wire your own pull-down resistors. +

+ MCP23017 only has internal pull-up resistors, if you want to use pull-down you will have to wire your own pull-down resistors. +

## {% linkable_title Switch %} From c66f2ee4b5c9eb2da23c74cfb8114332be2fef73 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 29 May 2019 15:15:35 -0700 Subject: [PATCH 54/85] 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 5383bce4d6e2a785a48057355bd409aba7477c5e Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 29 May 2019 19:52:54 -0700 Subject: [PATCH 55/85] 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 56/85] 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 57/85] 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 58/85] 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 0f89c201dcdae21984c4dd09b9abfa6a02da2eb4 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 31 May 2019 15:17:10 -0700 Subject: [PATCH 59/85] 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 db243d7fb6f871e019c9539784c6a04d2f48b136 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 31 May 2019 15:50:05 -0700 Subject: [PATCH 60/85] 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 b4cae19d564393f5a22ee173727fdf31b62453c7 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 3 Jun 2019 14:03:20 -0700 Subject: [PATCH 61/85] 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 62/85] 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 63/85] 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 64/85] 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 65/85] 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 66/85] 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 67/85] 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 zcmb_iWl&r}mmQp7AwdHK4GfyWAwYt=2ZsO&5`w!9mJlpB1b24`u7kU~ySp=32KMFK zfBS1|Yo}`FRrPzX`}XbI_ndorf>o5Hak0p-Kp+sVtc=7*;M(`^i-`{WmTH%!0T)z9 zF%dzMh7F6nnjc!-%J+n+EBq%z{ z^}TC}gVFHUbWM2D_Dz3BCo$(GMP?>@E$6;fTH3v-Xvywv^X11!kL{*zLYMByu_tAx z#y3F@J3`JV(_rkseeirtgY=bkuDD-9dq;wFE8^zxP&U>~$b$K$JrQr_o#zC3id4ug z0|T{z*KjaV6G14*q6}@mB9YJj)6@UCi9!{#M)LJIbVXWqMRsyuogw+is0687#rpde zeBSZyVP=CrkHZy8ioaJFmHBk*<}wtR9<3i(;}69PHyYy~0aw+rak%Qa1);qsI_5HB znCEedMQYh(y{~Kc6;WoYDScUKxyM|Zl!q=~>xc9`O(3?(I81CZi@FKVax%+eIX$A~ zVJ_Nw{T=3&y0iTHFwZW-_5Nle`}bdC{3f%;xTN9xSmY=A(aha;z`j z;E2eI10T2U^<1A*HxXM#7n19>G_|!T?${sP7&q{<)39e!(4Z(k}Iwn%RX*c^)0>iO7>Z zmpdz;S><5`daP2}Kv9DOye=?#I4zz8M2cU4OVK+8cBpM}rZqd%GnqB|-}-}z4~vQL z=Vli^s{6%{zjs!d_?as1nEnG9AS|4tr_c2U`MuY2xJ6b)@$n(agf+R0d8KqsWobPO zNb6NgbhJVQQh`_)c-Jl`)52r9wh(49zc1`+F4`R2s_I7^ z@ZjA9=vL~mQ2&-G?`lw^i!VEO4aV0oPmg@H)X;**H`Y(-BtUI2LgQ!nOXu3U-pn(F zela^iX*H|Jc07YQj8b}hWM&hSkq}EvS{vuBTAQ=c+3OAGq2<_aq)Zk3nV)Bp|Dvwb zLJU+C3Le_rqU^@lDFO1=l~<)qhqKGdreEkdg|7{q|8k@Az8uG|+mlf{ z{K6lw`^z?OwNwZpujzd7jHjrewnU+T4J(5kS)VQj{WdK5H3_>rar*HHUrmb~SPS9c zgTQcQ89n-=5w@&od-J%tLUo?q9wb+V@^a_J%|^%Vu&@A!{sIDhG6PFd_q-zgV~F?s zLQY9PN8R&+O?<4_#Z}uQmdy?WpV3u%p{c1xEi9k=bL|uzx5rD@6#4p@+__` z3fV%cTvPF6jQWnIA626nz;PMQpF{|DQ$MHY75gCoqr?~ zbe zK|V4kx7&SSInJjiNkO!=d`j!59jnJQ4gPRT0Rw@l*uS?~UH<3EJ{L}SyaKVxz!DxV z9)?I&Bj{gIazeM4kSuu@%H$T`U4QGHQEL#4ud8c@`3l|GN06?nV(;K;*R{`aHst9% zS}$}Y{@bR$>wh2`Y!T(Q^+INCeh2dLVQi;tM^p%@zj*|NSRI}dGk{YEYm3KfH;@@d zYfJ=Vkj@Ey;`*?i3_ej4c6Jsqm|8DuY3(p<&psiV=wFNLEBi5%yR7PdSa(>@^y`U} zzI*dLod{9BtUNngtZSu}YTaMMHXLU)dxF5mTb_ryUwoGriYsoXmk4gI{OV{i5G3X1 zUnJP((9Ng(kugZ+4F!KtJ^LIRv+k0vt|1*uBUn{k6BjFiJurZs!a{(NQ2aWOYo=8X zQvU7cbUJo(S&+tUK{)967$L0!%=f`haCSDNUZkkVa?ZiJ{aayCSq1@*c&-1_^|uE> zR!=1&U$iWT;;KR+n;oO9=j9lB5wQDf1Xf-_Y2BY9G=8r&40hsFOuW- zfu8I`&~GEi<*jBju!iA>wu&*#-R^Nt=uue0ao5*kB;j?2KCK+ti*G+qHk91iljB)8 zG*Xwz>LmLVA4Pap{;K9f-=$_1m~~VdDuRTS{@sM}3>N88uI}AeW|V!;7GBcl$=B5U zsPu{UCEfuQ75}z1XHlgYI#MF(`OfYLE1%zGcyey*lXvUI-?xju(VU6ciYyi!q1{4+ zlVn1q0&EAcYaHgq)X>JGX)dG}f8KXW1&kysf08XC_l?msSLT`%Ag!Ldc;|qgaI!;`=Y1Puz!4pQ5PwfYQEj1D*K-6v zl}tTQn>gDy_Vts+^<_QXVjB4n6Q6YEH@va_pNew@-#ZNL)qWJG9XIEj8R+sC6J<+Nm??sXI z@5v|(G-{*L1oQksZhnGQaB18`>K)J zUT+P~EA|aFIzkH@UaJTW;}35)zk*Wx*GiuBTzlOWyvI3HA@E{zgV8V4!?_jb6mhM#aTWBmt@(CgS5%KHc9Q!#QHc6uEQqvnn zSYwvlR-=tS@dVrNDtFldVVPlRa$A`L zlLkw$-uIAsNj`+SU1zIGmjlTY{F17{e)As7@TAqFGg-V9CIf&>>hWMFQ^r#fM=xhI zKd(%#WCTWg-X-fjUDn5MUu}Cc zDp?OgluVOguf;?eG5xVnj4+NEsEu@FV;dG_2xGt6qJTi0irMpvH5R$V*SS;u7VHYP zGlz7)7c^rjCwX)ys7&--2qKaDQ{{JT)EFBq;k+P_%2K4gc&=IjFoD*SI7zR44s~7X z2FKMDYlklLLJ$Z>j}V28?sIXL#Z8&-?*~9-ecZO>N_w;Byn_e;`mO%4Kf(ocQv zJXmvyk7 zS6m+cVo+`&wZ1Gb_m7F1#Xtdr>9ONey`m^b>Cs}fBwdwddCkL$YlGCnJ)+d7G5&!D;=u%g3L)k%{Nu)pp$l10}f3 zKPmZT6_sQ>!tW00dt0>jw`ykgurcaSB93f{m)|}eiWv0`Nq#T$B5=duizg1t$*ksJ zIriv3*MI3Q8Tg!oX7NvxF9_sIDNVF*3a-nIPhI-zck-vX@haQhd0*OkjHDozD3@w@ zDZwVBC1a$jSezBJlJ9?4lw$tc$Du5iV&o=Gp$z(^QrN{y(d%(#d=msz*f?ZNm@%P7 z)DGhXtbU`fJFn4wsFrb42MDp|(l`i3INte%aa3zMXNL~133CnO;C>-(z9V+dP)4Xi)9L+ zYgIp`gdOcI&6|uJk5XHyY2)~f^Qa67t$`Iyyy*5{&aQ*d6eDp5YB{~;!jCxp_}y@==o9YbHC+v zVFM-o0+ACvf#_T|?B7^DeC5+`M+h;TA+Tj*f?(?!Hpy52W~`*}oxDP^(9)XIj7r8Y zi@8{1`3?AO(3t}1Y$9NWpOPt-xW9cx7rZ0j;W&Ku6c518mM-2>0}WfiW)LVzE8RP` zo_Yodvq5>k#u)DvSv7Oa;WdUYWpkAcZAboGlgn!z;;AJiODSH|AW$U0@VV_p0c%!( z!s?8@7$XQffjfRq^R1WqRFV1783I{Q;+ft4WZ;}O1OnkS17m_fCexqpUUyfco85H& z$cI!ne<%=Kt6CDzZjOlwI)0@=5)q>sQDgV&#|psJC@b`rbd!unyaD6J4yLbx+Yo#b zJlr&%c-c)iT?1h0fCR1|Ks{xa2J5uLX;rg7z}Ml?5l`sN$n4_9={+mjL9WWv^th*T zgl)~)Y>4ru4w4ZiU3@pC7lVf@?%ut*@o-0~0LaB=oI2A8eKv#TGXgwHNh=m>Pih~{u8p>kWoe2GoQeJ$?%XmBbfk8K_!sQYC0-@o^* zKHz@?JMAYQoowxjT8$E|3Ynd>q`iX=6*RhK6g9N1jmLCF>TpSRd?$vT;8Y3|iex?+ zuQk5s{%K=pej_nb>kI-_t(Y0v0%gXl<_o1vYt;{NOHJQSS};+v?XJG<^!U8ev-e&i zX?o|hiw6sOS!tUs!E`9mA&Op}34PNNm8Ru7$e{Meg@{aSw--YxQPRps#d)7Q;E-tN zWc2gansNW~>ZwNBdu1!vZ8vO^E^B_H{tSXX?<=$=5x;M5!_q;{h>gfGzgl9BCzI5rFsjM{q-BNuEf*5Rt@c%`M zSNO={+8gKL?q25&$I7HW0(dp90Tr-A%2;hYKf~`ZK*y*#8k6eYdn-vkWO}>|R*#m( z5|@0s6R#vF&ElYEO~KF+{;H+hE>r(#=<~OPM~323`ZK@rxvhi8nA+C3*W}ifSCOy{ z&CTqh;S&0mI>aF(xH$G99Bx6S5n3JWVFuky=0is_qX$=no^gL}E^-iB%_)A!L4*G= z!nPbjmOsNZfzbLpLJ3Qjl4i|6q|Dabf!R+87cP7lNMRTie* zJ~67vJc@^Pp3+pKsD5S`$~&G-nK>MjN5xvo2`MWWy&TskS2ua;a+la)Y*cJ=iBIr9 zr{xZ$BOl_3LC&e#tK;S66z;c0EWL|sX`le(+ebkvnA+0W8qTX49koA}Q@4PY=N3C> z04Xn!WqCJIn4C76`Xm>|{ARHXLZQLJ@|LSsXhM)Z$wkAXOlRC^%nixQJYG-8QT@EIo;x?@%?*-RZ@2|hcE&A<}$Jl4|n=yS$ zYn2j?2*xa@kqTt~oIok)cC$%TH~6$Tl1dA^jX9Zz%7DMvWMwV-`CSN-_ zN&Xu{&wfV>C^3G3A!BPM&q1KS`W>AF&|!}lAZ2LCT~Z#fE7ql{6_RKEtnXIPWxoyS z-0UQ2>Hcz-5?Y!w!8Fxm3rT;n6^&zjM-2fBmIt}D6%0PU zbEePhIZEUck2xMwn-vfmnEX-ANQA^^McmKK^J<_?nU7Sj_Hd@D+)UGO#Wu`)2(OPI zYNc~G7w4~4V8!8qL`~&J5l|xLJ6M#bvzZSye>ZAW0ypJvaH3|uNE4U3x}^N@Zozd+ zn>g%Y$=t{`KK1YAnV(Njy)KIk8aM>+V{p{3@&k{6m5~9TE=i3xFGwmAqWet?PFwO(Et)yrf;+_mzFpB;S6K$Q-{8MJ2nusqLBC|F4 zJmjUo-7~>Pl){foXYxH}r>3(8RR?Qewe>MTMuvg|-LewOopL z;ixzLrSzgR2AO&;?CLg9fA{jnt7y8o^xhJ&YIh`m?fQ%h69b5<==1rc>J7SdohoGz z2+&TAJ+6MG0@(PGhQ`l1 zpICSjr0S|lF0jRx%pxtP627!glHlPaoQX+?N0rLbmY3*5Z5#^dBY1_^yRntD`5w!Y zXG)4$G-Mn@CI*!r?EvKkMy75)Z94`|Aw_OAm3{b#K>Y#>V|)5H{##-SZS!OA2M_uY z#aGqdg6Z_!3GS32(3?`CX}vNSuWr%HUA-n-P$L7ivg!+gRsbWJ5X~_R0nn}p&fVJv zu5eTDh7&;VQf6DG%v5=I2u@+L-@RYh{z=4`H%TIUV)o(XD*w$N_(6Z;Ol6b)d^&;n zS{FO2-s;&9H ztDrhQBl&rQGq9RRa<7|L%^D$Y<7bjs~Sekb05KSxz)_T|mmioNY z<}TZ1R2>)q@GCw+;J&X+v8mz){s6I1$<>KrPZ->xYOd)%bM=Ux@q$;GytW9BgmxCYoCeg2lu18?EJw zUh+}gLZ`EOqXm7O@(dmMMMOZDM0lR|02-k`nY#`sr!V`MZA)-k9E>zFQV`-TzkAbH zYUt#fq3j79bw$yxw`q6v?Mcz%e7+6a*zENlU8z(rjdAUl41)7ZhyYb&|Jbp)>W6-G zwOb$i{oIP}35t+jlq+r}1(K(2AauO$vJ86S_=?}KB~HgHC}B%vsxT@r2a4u%%yVNc z4+n2=Yw5`_mhp>G8Z@^=o==aV;Ga93#Pd>Uo1^ zo1=u!_|wX)7xktUE2qtR11(fc>(XG^#pl{KqJuGT!*lx+A}gzgPjuF7kxT9;6l%Ka zxfGDH@}5kvz(IQkpRS71~aKv$aKsMU0iN-`*``k zkDI2ZQqK~~z7NJcJe2AJKgP|coMvGDJ25flgbhrvZVKSH%zIWALlY(|CFh_}dI zIRYo6o6M<87AS!fQJUoz{RNG7v=h)bFoC?jbS0pJXl*4`l z%_lwx$(&x=70H*p`H_rsN=Nu;{ z&t$6_4fFsJK~&01zn$jP51+%_>gJkYg!o+NWOQhKIxCLb$HB#@fLNn_u;uF-hdv5$ z+$ev&9vFZh5AX;$EJj@Dnsh-y%6ew!tQ9aQqgN$Yv%CvXfx>JSN3!g7_`@Bs-nfoL zYv{RNtr|v$fN5a?irX(vc*gMsu7NOmP*JdSjR@1uS{%MJDI}-wtqV4#C+dQ$X8o2# zt_>VFx5|LmSR^sGG{EnJlHxkd7!(+-Jras1YRHWd^to8{7K@tc_({)wZ<_Zt*BxC79B zjFT6J-$U0)A5TNL0ssj|V5pzoyn880pMr+wQIwDP0Rn+; zxptdk0bR9Tl%HuWOJENj7# z5z|AC*V!r#r$Rb4qVVkAe~+|HXLafwY;W^)!7BhvIMX?i0xS7>#8EzABZENvZO+3* z_i^7JH`CoYuyMbPu~TI4&gQ2x6!Z3dxY{!W_Mn@J*M4Ah538R&jTqSH78|+U7X-TM z<>Vt<5*jL(Z&lC~jYRB?1J2 Date: Thu, 30 May 2019 10:37:08 +0200 Subject: [PATCH 68/85] 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 69/85] 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 70/85] 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 71/85] 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 72/85] 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 73/85] 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 74/85] 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 75/85] 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 76/85] 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 77/85] 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 78/85] 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 79/85] 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 80/85] 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 81/85] 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 82/85] 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 83/85] 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 722f580ea85aefd448bd826cc176603dae1e856a Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 4 Jun 2019 14:36:53 -0700 Subject: [PATCH 84/85] 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 85/85] 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 %}