From 34ec0f3c9432cc42c40aefd6a32c74ad3caaa899 Mon Sep 17 00:00:00 2001 From: Derek Brooks Date: Sat, 11 Nov 2017 16:26:57 -0600 Subject: [PATCH 01/60] add initial NuHeat documentation --- source/_components/climate.nuheat.markdown | 169 +++++++++++++++++++++ source/_components/nuheat.markdown | 43 ++++++ source/images/supported_brands/nuheat.png | Bin 0 -> 4061 bytes 3 files changed, 212 insertions(+) create mode 100644 source/_components/climate.nuheat.markdown create mode 100644 source/_components/nuheat.markdown create mode 100644 source/images/supported_brands/nuheat.png diff --git a/source/_components/climate.nuheat.markdown b/source/_components/climate.nuheat.markdown new file mode 100644 index 00000000000..4880f4b9a24 --- /dev/null +++ b/source/_components/climate.nuheat.markdown @@ -0,0 +1,169 @@ +--- +layout: page +title: "NuHeat Thermostat" +description: "Instructions how to integrate your NuHeat Signature thermostats within Home Assistant." +date: 2017-11-11 18:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: nuheat.png +ha_category: Climate +ha_release: 0.53 +ha_iot_class: "Cloud Polling" +--- + +

+To get your [NuHeat Signature](http://www.nuheat.com/products/thermostats/signature-thermostat) thermostats working within Home Assistant, please follow the instructions for the general [NuHeat component](/components/nuheat) +

+ +## {% linkable_title Concepts %} + +The NuHeat Thermostat supports the following key concepts. + +The _target temperature_ is the temperature that the device attempts to achieve. The target temperature is either determined by the schedule programmed into the thermostat (_auto mode_) or may be overridden. When the target temperature is set by home assistant, the thermostat will hold this temperature until the schedule is resumed. + +When in _away mode_ the temperature is permanently overridden to the minimum temperature supported by the thermostat. + + +## {% linkable_title Attributes %} + +The following attributes are provided by the NuHeat thermostat: `name`, `temperature_unit`, `current_temperature`, `target_temperature`, `target_temperature_low`, `target_temperature_high`, `current_hold_mode`, `current_operation`, `operation_list`, `is_away_mode_on`, `min_temp`, `max_temp` + + +### {% linkable_title Attribute `name` %} + +Returns the name of the NuHeat Thermostat. + +| Attribute type | Description | +| ---------------| ----------- | +| String | Name of the thermostat + +### {% linkable_title Attribute `temperature_unit` %} + +Returns the unit of measurement used for temperature by the thermostat. + +| Attribute type | Description | +| ---------------| ----------- | +| String | Name of the temperature unit + +### {% linkable_title Attribute `current_temperature` %} + +Returns the current temperature measured by the thermostat. + +| Attribute type | Description | +| ---------------| ----------- | +| Integer | Currently measured temperature + +### {% linkable_title Attribute `target_temperature` %} + +Returns the target temperature of the thermostat, when the thermostat is +not in auto operation mode. + +| Attribute type | Description | +| ---------------| ----------- | +| Integer | Target temperature + +### {% linkable_title Attribute `target_temperature_low` %} + +Returns the desired heating temperature set in the thermostat when in +auto operation mode. + +| Attribute type | Description | +| ---------------| ----------- | +| Integer | Target temperature + +### {% linkable_title Attribute `target_temperature_high` %} + +Returns the desired cooling temperature set in the thermostat when in +auto operation mode. + +| Attribute type | Description | +| ---------------| ----------- | +| Integer | Target temperature + +### {% linkable_title Attribute `current_hold_mode` %} + +Returns the current temperature hold, if any. + +| Attribute type | Description | +| ---------------| ----------- | +| String | 'temperature', 'temporary_temperature', 'away', 'auto', etc. + +### {% linkable_title Attribute `current_operation` %} + +Returns the current operation of the thermostat. + +| Attribute type | Description | +| ---------------| ----------- | +| String | 'heat', 'idle' + +### {% linkable_title Attribute `operation_list` %} + +Returns the list of available operation modes. + +| Attribute type | Description | +| ---------------| ----------- | +| List of String | Available operation modes + +### {% linkable_title Attribute `is_away_mode_on` %} + +Returns whether the thermostat is in away mode. + +| Attribute type | Description | +| ---------------| ----------- | +| Boolean | True, False + +### {% linkable_title Attribute `min_temp` %} + +Returns the minimum supported temperature by the thermostat + +| Attribute type | Description | +| ---------------| ----------- | +| Integer | Minimum supported temperature + +### {% linkable_title Attribute `max_temp` %} + +Returns the maximum supported temperature by the thermostat + +| Attribute type | Description | +| ---------------| ----------- | +| Integer | Maximum supported temperature + + +## {% linkable_title Services %} + +The following services are provided by the NuHeat Thermostat: `set_away_mode`, `set_temperature`, `resume_program`. + +The services `fan_min_on_time`, `set_aux_heat`, `set_hold_mode`, `set_humidity`, `set_fan_mode`, `set_operation_mode`, and `set_swing_mode` offered by the [Climate component](/components/climate/) are not implemented for this thermostat. + +### {% linkable_title Service `set_away_mode` %} + +Turns the away mode on or off for the thermostat. + +| Service data attribute | Optional | Description | +| ---------------------- | -------- | ----------- | +| `entity_id` | yes | String or list of strings that point at `entity_id`'s of climate devices to control. Else targets all. +| `away_mode` | no | 'on' or 'off' + +### {% linkable_title Service `set_temperature` %} + +Puts the thermostat into a temporary hold at the given temperature. + +| Service data attribute | Optional | Description | +| ---------------------- | -------- | ----------- | +| `entity_id` | yes | String or list of strings that point at `entity_id`'s of climate devices to control. Else targets all. +| `target_temp_low` | no | Desired heating target temperature (when in auto mode) +| `target_temp_high` | no | Desired cooling target temperature (when in auto mode) +| `temperature` | no | Desired target temperature (when not in auto mode) + +Only the target temperatures relevant for the current operation mode need to +be provided. + +### {% linkable_title Service `resume_program` %} + +Resumes the currently active schedule. + +| Service data attribute | Optional | Description | +| ---------------------- | -------- | ----------- | +| `entity_id` | yes | String or list of strings that point at `entity_id`'s of climate devices to control. Else targets all. diff --git a/source/_components/nuheat.markdown b/source/_components/nuheat.markdown new file mode 100644 index 00000000000..946c5ca5232 --- /dev/null +++ b/source/_components/nuheat.markdown @@ -0,0 +1,43 @@ +--- +layout: page +title: "NuHeat" +description: "Instructions how to integrate your NuHeat Signature thermostats within Home Assistant." +date: 2017-11-11 18:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: nuheat.png +ha_category: Hub +ha_release: 0.53 +ha_iot_class: "Cloud Polling" +--- + +The `nuheat` component lets you control connected floor heating thermostats from [NuHeat](http://www.nuheat.com/). + +First, you will need to obtain your thermostat's numeric serial number or ID by logging into [MyNuHeat.com](https://mynuheat.com/) and selecting your thermostat(s). + +Once you have the Thermostat ID(s), add the following information to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +nuheat: + username: you@example.com + password: very-secure-password + devices: 12345 + +# Example configuration.yaml entry with multiple thermostats +nuheat: + username: you@example.com + password: very-secure-password + devices: + - 12345 + - 67890 +``` + +Configuration variables: + +- **username** (*Required*): The username for accessing your MyNuHeat account. +- **password** (*Required*): The password for accessing your MyNuHeat account. +- **devices** (*Required*): The serial number / ID of each thermostat you would like integrate with Home Assistant. + diff --git a/source/images/supported_brands/nuheat.png b/source/images/supported_brands/nuheat.png new file mode 100644 index 0000000000000000000000000000000000000000..35016d1c223346c94cce0b7d6be6a7547977c84c GIT binary patch literal 4061 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 Date: Sat, 11 Nov 2017 16:30:23 -0600 Subject: [PATCH 02/60] bump ha_release to 0.58 --- source/_components/climate.nuheat.markdown | 2 +- source/_components/nuheat.markdown | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_components/climate.nuheat.markdown b/source/_components/climate.nuheat.markdown index 4880f4b9a24..053cb0c5fdb 100644 --- a/source/_components/climate.nuheat.markdown +++ b/source/_components/climate.nuheat.markdown @@ -9,7 +9,7 @@ sharing: true footer: true logo: nuheat.png ha_category: Climate -ha_release: 0.53 +ha_release: 0.58 ha_iot_class: "Cloud Polling" --- diff --git a/source/_components/nuheat.markdown b/source/_components/nuheat.markdown index 946c5ca5232..cf3405edd19 100644 --- a/source/_components/nuheat.markdown +++ b/source/_components/nuheat.markdown @@ -9,7 +9,7 @@ sharing: true footer: true logo: nuheat.png ha_category: Hub -ha_release: 0.53 +ha_release: 0.58 ha_iot_class: "Cloud Polling" --- From 3627455804a178b749b767fb69da62c460abae2c Mon Sep 17 00:00:00 2001 From: Derek Brooks Date: Sat, 11 Nov 2017 16:45:23 -0600 Subject: [PATCH 03/60] documentation guideline fixes --- source/_components/climate.nuheat.markdown | 2 +- source/_components/nuheat.markdown | 20 ++++++++++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/source/_components/climate.nuheat.markdown b/source/_components/climate.nuheat.markdown index 053cb0c5fdb..01addf47328 100644 --- a/source/_components/climate.nuheat.markdown +++ b/source/_components/climate.nuheat.markdown @@ -135,7 +135,7 @@ Returns the maximum supported temperature by the thermostat The following services are provided by the NuHeat Thermostat: `set_away_mode`, `set_temperature`, `resume_program`. -The services `fan_min_on_time`, `set_aux_heat`, `set_hold_mode`, `set_humidity`, `set_fan_mode`, `set_operation_mode`, and `set_swing_mode` offered by the [Climate component](/components/climate/) are not implemented for this thermostat. +The services `fan_min_on_time`, `set_aux_heat`, `set_hold_mode`, `set_humidity`, `set_fan_mode`, `set_operation_mode` and `set_swing_mode` offered by the [Climate component](/components/climate/) are not implemented for this thermostat. ### {% linkable_title Service `set_away_mode` %} diff --git a/source/_components/nuheat.markdown b/source/_components/nuheat.markdown index cf3405edd19..250f5ec7d7f 100644 --- a/source/_components/nuheat.markdown +++ b/source/_components/nuheat.markdown @@ -35,9 +35,17 @@ nuheat: - 67890 ``` -Configuration variables: - -- **username** (*Required*): The username for accessing your MyNuHeat account. -- **password** (*Required*): The password for accessing your MyNuHeat account. -- **devices** (*Required*): The serial number / ID of each thermostat you would like integrate with Home Assistant. - +{% configuration %} +username: + description: The username for accessing your MyNuHeat account. + required: true + type: string +password: + description: The password for accessing your MyNuHeat account. + required: true + type: string +devices: + description: The serial number / ID of each thermostat you would like integrate with Home Assistant. + required: true + type: [string, int] +{% endconfiguration %} From 0e5f2e90078b7000afc785e831d2e1ccac8f1890 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 19 Nov 2017 19:16:09 +0100 Subject: [PATCH 04/60] :pencil2: Fixes a small typo --- source/_components/nuheat.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/nuheat.markdown b/source/_components/nuheat.markdown index 250f5ec7d7f..6c22c3aa0ef 100644 --- a/source/_components/nuheat.markdown +++ b/source/_components/nuheat.markdown @@ -45,7 +45,7 @@ password: required: true type: string devices: - description: The serial number / ID of each thermostat you would like integrate with Home Assistant. + description: The serial number / ID of each thermostat you would like to integrate with Home Assistant. required: true type: [string, int] {% endconfiguration %} From 5b8aabf3833fa5e7c8c4317eac3c3d9e27977e25 Mon Sep 17 00:00:00 2001 From: Derek Brooks Date: Wed, 6 Dec 2017 22:46:13 -0600 Subject: [PATCH 05/60] remove away mode documentation, since that functionality was requested to be removed --- source/_components/climate.nuheat.markdown | 29 +++------------------- 1 file changed, 4 insertions(+), 25 deletions(-) diff --git a/source/_components/climate.nuheat.markdown b/source/_components/climate.nuheat.markdown index 01addf47328..5f5ecaa0a89 100644 --- a/source/_components/climate.nuheat.markdown +++ b/source/_components/climate.nuheat.markdown @@ -23,12 +23,10 @@ The NuHeat Thermostat supports the following key concepts. The _target temperature_ is the temperature that the device attempts to achieve. The target temperature is either determined by the schedule programmed into the thermostat (_auto mode_) or may be overridden. When the target temperature is set by home assistant, the thermostat will hold this temperature until the schedule is resumed. -When in _away mode_ the temperature is permanently overridden to the minimum temperature supported by the thermostat. - ## {% linkable_title Attributes %} -The following attributes are provided by the NuHeat thermostat: `name`, `temperature_unit`, `current_temperature`, `target_temperature`, `target_temperature_low`, `target_temperature_high`, `current_hold_mode`, `current_operation`, `operation_list`, `is_away_mode_on`, `min_temp`, `max_temp` +The following attributes are provided by the NuHeat thermostat: `name`, `temperature_unit`, `current_temperature`, `target_temperature`, `current_hold_mode`, `current_operation`, `operation_list`, `min_temp`, `max_temp` ### {% linkable_title Attribute `name` %} @@ -88,7 +86,7 @@ Returns the current temperature hold, if any. | Attribute type | Description | | ---------------| ----------- | -| String | 'temperature', 'temporary_temperature', 'away', 'auto', etc. +| String | 'temperature', 'temporary_temperature', 'auto', etc. ### {% linkable_title Attribute `current_operation` %} @@ -106,14 +104,6 @@ Returns the list of available operation modes. | ---------------| ----------- | | List of String | Available operation modes -### {% linkable_title Attribute `is_away_mode_on` %} - -Returns whether the thermostat is in away mode. - -| Attribute type | Description | -| ---------------| ----------- | -| Boolean | True, False - ### {% linkable_title Attribute `min_temp` %} Returns the minimum supported temperature by the thermostat @@ -133,18 +123,9 @@ Returns the maximum supported temperature by the thermostat ## {% linkable_title Services %} -The following services are provided by the NuHeat Thermostat: `set_away_mode`, `set_temperature`, `resume_program`. +The following services are provided by the NuHeat Thermostat: `set_temperature`, `resume_program`. -The services `fan_min_on_time`, `set_aux_heat`, `set_hold_mode`, `set_humidity`, `set_fan_mode`, `set_operation_mode` and `set_swing_mode` offered by the [Climate component](/components/climate/) are not implemented for this thermostat. - -### {% linkable_title Service `set_away_mode` %} - -Turns the away mode on or off for the thermostat. - -| Service data attribute | Optional | Description | -| ---------------------- | -------- | ----------- | -| `entity_id` | yes | String or list of strings that point at `entity_id`'s of climate devices to control. Else targets all. -| `away_mode` | no | 'on' or 'off' +The services `fan_min_on_time`, `set_aux_heat`, `set_away_mode`, `set_hold_mode`, `set_humidity`, `set_fan_mode`, `set_operation_mode` and `set_swing_mode` offered by the [Climate component](/components/climate/) are not implemented for this thermostat. ### {% linkable_title Service `set_temperature` %} @@ -153,8 +134,6 @@ Puts the thermostat into a temporary hold at the given temperature. | Service data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that point at `entity_id`'s of climate devices to control. Else targets all. -| `target_temp_low` | no | Desired heating target temperature (when in auto mode) -| `target_temp_high` | no | Desired cooling target temperature (when in auto mode) | `temperature` | no | Desired target temperature (when not in auto mode) Only the target temperatures relevant for the current operation mode need to From 918487ba885339bdd7fb6821da9b1e56d7134dc4 Mon Sep 17 00:00:00 2001 From: Mark Harrison Date: Fri, 15 Dec 2017 10:15:55 +0100 Subject: [PATCH 06/60] Updated links and configuration example (#4215) Updated external links and added channel_id variable to configuration example as it is now required. --- source/_components/sensor.eliqonline.markdown | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/source/_components/sensor.eliqonline.markdown b/source/_components/sensor.eliqonline.markdown index 7d8452595fc..87dd5ac8fd6 100644 --- a/source/_components/sensor.eliqonline.markdown +++ b/source/_components/sensor.eliqonline.markdown @@ -14,7 +14,7 @@ ha_iot_class: "Cloud Polling" --- -Integrate your [ELIQ Online](http://eliq.se) smart meter information into Home Assistant. To get an [access token](https://my.eliq.se/user/settings/api) and the [Channel ID](https://my.eliq.se/user/settings/data), log in to your account. +Integrate your [ELIQ Online](http://eliq.io) smart meter information into Home Assistant. To get an [access token](https://my.eliq.io/user/settings/api) and the [Channel ID](https://my.eliq.io/user/settings/locations), log in to your account. To enable this sensor in your installation, add the following to your `configuration.yaml` file: @@ -23,6 +23,7 @@ To enable this sensor in your installation, add the following to your `configura sensor: - platform: eliqonline access_token: ACCESS_TOKEN + channel_id: CHANNEL_ID ``` Configuration variables: @@ -31,5 +32,5 @@ Configuration variables: - **channel_id** (*Required*): Channel ID (as integer) of your device. - **name** (*Optional*): The name of the sensor, eg. the city. -For details please check the [API documentation](https://my.eliq.se/knowledge/sv-SE/49-eliq-online/299-eliq-online-api). +For details please check the [API documentation](https://eliq.zendesk.com/hc/en-us/articles/115002708449-API-Eliq-Online). From 54d609caf9a77262789c8deae173c16716ffea4b Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Sun, 17 Dec 2017 10:33:42 +0100 Subject: [PATCH 07/60] Changes for 0.60 / homematic (#4219) * Changes for 0.60 / homematic * Update homematic.markdown --- source/_components/homematic.markdown | 49 ++++++++++++++++----------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/source/_components/homematic.markdown b/source/_components/homematic.markdown index 93cf903eb44..73287f74209 100644 --- a/source/_components/homematic.markdown +++ b/source/_components/homematic.markdown @@ -28,58 +28,69 @@ To set up the component, add the following information to your `configuration.ya ```yaml homematic: - hosts: + interfaces: wireless: - ip: 127.0.0.1 + host: 127.0.0.1 ``` Configuration variables (global): -- **hosts** (*Required*): Configuration for each host to integrate into Home Assistant. +- **interfaces** (*Required*): Configuration for each XML-RPC interface to integrate into Home Assistant. +- **hosts** (*Optional*): Configuration for each Hub (CCU/Homegear) to integrate into Home Assistant. - **local_ip** (*Optional*): IP of device running Home Assistant. Override auto-detected value for exotic network setups. - **local_port** (*Optional*): Port for connection with Home Assistant. By default it is randomly assigned. -Configuration variables (host): +Configuration variables (interface): -- **ip** (*Required*): IP address of CCU/Homegear device. +- **host** (*Required*): IP address or Hostname of CCU/Homegear device or Hass.io add-on. - **port** (*Optional*): Port of CCU/Homegear XML-RPC Server. Wireless: 2001, wired: 2000, IP: 2010, thermostatgroups: 9292. - **callback_ip** (*Optional*): Set this, if Home Assistant is reachable under a different IP from the CCU (NAT, Docker etc.). - **callback_port** (*Optional*): Set this, if Home Assistant is reachable under a different port from the CCU (NAT, Docker etc.). - **resolvenames** (*Optional*): [`metadata`, `json`, `xml`] Try to fetch device names. Defaults to `false` if not specified. - **username** (*Optional*): When fetching names via JSON-RPC, you need to specify a user with guest-access to the CCU. - **password** (*Optional*): When fetching names via JSON-RPC, you need to specify the password of the user you have configured above. -- **primary** (*Optional*): Set to `true` when using multiple hosts and this host should provide the services and variables. -- **variables** (*Optional*): Set to `true` if you want to use CCU2/Homegear variables. Should only be enabled for the primary host. When using a CCU credentials are required. - **path** (*Optional*): Set to `/groups` when using port 9292. +Configuration variables (host): + +- **host** (*Required*): IP address of CCU/Homegear device. +- **username** (*Optional*): When fetching names via JSON-RPC, you need to specify a user with guest-access to the CCU. +- **password** (*Optional*): When fetching names via JSON-RPC, you need to specify the password of the user you have configured above. + #### Example configuration with multiple protocols and some other options set: ```yaml homematic: - hosts: + interfaces: rf: - ip: 127.0.0.1 + host: 127.0.0.1 resolvenames: json username: Admin password: secret primary: true variables: true wired: - ip: 127.0.0.1 + host: 127.0.0.1 port: 2000 resolvenames: json username: Admin password: secret ip: - ip: 127.0.0.1 + host: 127.0.0.1 port: 2010 groups: - ip: 127.0.0.1 + host: 127.0.0.1 port: 9292 resolvenames: json username: Admin password: secret path: /groups + hosts: + ccu2: + host: 127.0.0.1 + username: Admin + password: secret + ``` ### {% linkable_title The `resolvenames` option %} @@ -115,7 +126,7 @@ sensor: ### {% linkable_title Variables %} It is possible to read and set values of system variables you have setup on the CCU/Homegear. The supported types for setting values are float- and bool-variables. -The states of the variables are available through the attributes of your hub entity (e.g. `homematic.rf`). Use templates (as mentioned above) to make your variables available to automations or as entities. +The states of the variables are available through the attributes of your hub entity (e.g. `homematic.ccu2`). Use templates (as mentioned above) to make your variables available to automations or as entities. The values of variables are polled from the CCU/Homegear in an interval of 30 seconds. Setting the value of a variable happens instantly and is directly pushed. ### {% linkable_title Events %} @@ -154,8 +165,8 @@ The name depends on if you chose to resolve names or not. If not, it will be the * *homematic.virtualkey*: Simulate a keypress (or other valid action) on CCU/Homegear with device or virtual keys. * *homematic.reconnect*: Reconnect to CCU/Homegear without restarting Home Assistant (useful when CCU has been restarted) -* *homematic.set_var_value*: Set the value of a system variable. -* *homematic.set_dev_value*: Control a device manually (even devices without support). Equivalent to setValue-method from XML-RPC. +* *homematic.set_variable_value*: Set the value of a system variable. +* *homematic.set_device_value*: Control a device manually (even devices without support). Equivalent to setValue-method from XML-RPC. #### {% linkable_title Examples %} Simulate a button being pressed @@ -184,9 +195,9 @@ Set boolean variable to true ```yaml ... action: - service: homematic.set_var_value + service: homematic.set_variable_value data: - entity_id: homematic.rf + entity_id: homematic.ccu2 name: Variablename value: true ``` @@ -200,7 +211,7 @@ Manually turn on a switch actor ```yaml ... action: - service: homematic.set_dev_value + service: homematic.set_device_value data: address: LEQ1234567 channel: 1 @@ -212,7 +223,7 @@ Manually set temperature on thermostat ```yaml ... action: - service: homematic.set_dev_value + service: homematic.set_device_value data: address: LEQ1234567 channel: 4 From 9ec27db1789fdc6cc322c724c06eaa5b2ad7ef41 Mon Sep 17 00:00:00 2001 From: GreenTurtwig Date: Sun, 17 Dec 2017 13:37:48 +0000 Subject: [PATCH 08/60] Documentation for Logitech UE Smart Radios (#3538) * Documentation for Logitech UE Smart Radios * Updated name. * Update example config. * Update with new configuration format. * Updated with requested changes. --- .../media_player.ue_smart_radio.markdown | 38 ++++++++++++++++++ source/images/supported_brands/ueradio.png | Bin 0 -> 6473 bytes 2 files changed, 38 insertions(+) create mode 100644 source/_components/media_player.ue_smart_radio.markdown create mode 100644 source/images/supported_brands/ueradio.png diff --git a/source/_components/media_player.ue_smart_radio.markdown b/source/_components/media_player.ue_smart_radio.markdown new file mode 100644 index 00000000000..217b625b8d5 --- /dev/null +++ b/source/_components/media_player.ue_smart_radio.markdown @@ -0,0 +1,38 @@ +--- +layout: page +title: "Logitech UE Smart Radio" +description: "Instructions on how to integrate a Logitech UE Smart Radio player into Home Assistant." +date: 2017-12-09 20:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: ueradio.png +ha_category: Media Player +ha_release: "0.60" +ha_iot_class: "Cloud Polling" +--- + + +The `ue_radio` platform allows you to control a [Logitech UE Smart Radio](https://www.uesmartradio.com) from Home Assistant. This lets you control both Logitech UE Smart Radios and Logitech Squeezebox Radios that have been updated with the UE Smart Radio update. + +To add your UE Smart Radio player to your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +media_player: + - platform: ue_smart_radio + username: USERNAME + password: PASSWORD +``` + +{% configuration %} +username: + description: The email you use to log in to `uesmartradio.com`. + required: true + type: string +password: + description: The password you use to log in to `uesmartradio.com`. + required: true + type: string +{% endconfiguration %} diff --git a/source/images/supported_brands/ueradio.png b/source/images/supported_brands/ueradio.png new file mode 100644 index 0000000000000000000000000000000000000000..ebbde9e8eb074f093a4456ddcf0b11c6f848d001 GIT binary patch literal 6473 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 Date: Mon, 18 Dec 2017 19:11:04 +0100 Subject: [PATCH 09/60] Add documentation for Discogs sensor (#4138) * Add documentation for Discogs sensor * Update config style --- source/_components/sensor.discogs.markdown | 39 ++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 source/_components/sensor.discogs.markdown diff --git a/source/_components/sensor.discogs.markdown b/source/_components/sensor.discogs.markdown new file mode 100644 index 00000000000..4c4bfe4ef65 --- /dev/null +++ b/source/_components/sensor.discogs.markdown @@ -0,0 +1,39 @@ +--- +layout: page +title: Discogs Sensor +description: "Instructions on how to set up Discogs sensors within Home Assistant." +date: 2017-12-04 22:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: https://www.magneticmag.com/.image/t_share/MTQ5OTE1NzU4NTczMzk3OTYw/discogs-vinyl-record-mark.png +ha_category: Sensor +ha_release: 0.61 +ha_iot_class: "Cloud Polling" +--- + +The `discogs` platform allows you to see the current amount of records in your [Discogs](https://discogs.com) collection. + +First, you'll need to get a personal access token from your Discogs account. +You can generate a token from your profile's [Developer settings](https://www.discogs.com/settings/developers). + +To enable this sensor, add the following lines to your `configuration.yaml`: + +```yaml +# Example configuration.yaml entry +sensor: + - platform: discogs + token: YOUR_TOKEN +``` + +{% configuration %} +token: + description: The Discogs API token to use as identification to get your collection. + required: true + type: string +name: + description: Name to use in the frontend. + required: false + type: string +{% endconfiguration %} From 12afecde0d86ce89a9c6072cdad0e554b073e5aa Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Tue, 19 Dec 2017 01:49:52 +0100 Subject: [PATCH 10/60] Update with range (#4242) --- .../binary_sensor.threshold.markdown | 39 ++++++++++++++----- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/source/_components/binary_sensor.threshold.markdown b/source/_components/binary_sensor.threshold.markdown index c2e9e875b39..aa12fad99f5 100644 --- a/source/_components/binary_sensor.threshold.markdown +++ b/source/_components/binary_sensor.threshold.markdown @@ -14,15 +14,17 @@ ha_release: 0.34 --- -The `threshold` binary sensor platform observes the state of another sensor. If the value is below (`lower`) or higher (`upper`) than the given threshold then state of the threshold sensor is changed. +The `threshold` binary sensor platform observes the state of another sensor. If the value is below (`lower`) or higher (`upper`) than the given threshold then state of the threshold sensor is changed. It support also a range if `lower` and `upper` are given. If the sensor is configured with no hysteresis and the sensor value is equal to the threshold, the sensor is turned off since it is not `lower` or `upper` with respect to the threshold. It's an alternative to the template binary sensor's `value_template:` to get the abnormal/too high/too low states. +{% raw %} ```yaml -{% raw %}{{ states.sensor.furnace.state > 2.5 }}{% endraw %} +{{ states.sensor.furnace.state > 2.5 }} ``` +{% endraw %} To enable the threshold sensor, add the following lines to your `configuration.yaml`: @@ -30,15 +32,32 @@ To enable the threshold sensor, add the following lines to your `configuration.y # Example configuration.yaml entry binary_sensor: - platform: threshold - threshold: 15 - type: lower entity_id: sensor.random + lower: 20 ``` -Configuration variables: +{% configuration %} +entity_id: + description: "The entity to monitor. Only [sensors](/components/sensor/) are supported." + required: true + type: entity_id +lower: + description: The lower threshold which the observed value is compared against. + required: false + type: float +upper: + description: The upper threshold which the observed value is compared against. + required: false + type: float +hysteresis: + description: The distance the observed value must be from the threshold before the state is changed. + required: false + type: float + default: 0.0 +name: + description: Name of the sensor to use in the frontend. + required: false + type: string + default: +{% endconfiguration %} -- **entity_id** (*Required*): The entity to monitor. Only [sensors](/components/sensor/) are supported. -- **threshold** (*Required*): The threshold which the observed value is compared against. -- **type** (*Required*): `lower` if the value needs to be below the threshold or `upper` if higher. -- **hysteresis** (*Optional*): The distance the observed value must be from the threshold before the state is changed. Defaults to `0.0` -- **name** (*Optional*): Name of the sensor to use in the frontend. Defaults to `Stats`. From 29b4c672a7a5a3806e72c60290a9fe37ac5d5c6c Mon Sep 17 00:00:00 2001 From: Ryan McLean Date: Thu, 21 Dec 2017 15:25:08 +0000 Subject: [PATCH 11/60] updated docs to add SSL option (#4238) * updated docs to add SSL option * Update sensor.plex.markdown --- source/_components/sensor.plex.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_components/sensor.plex.markdown b/source/_components/sensor.plex.markdown index f3dcd7affae..34781716237 100644 --- a/source/_components/sensor.plex.markdown +++ b/source/_components/sensor.plex.markdown @@ -36,3 +36,4 @@ Configuration variables: - **password** (*Optional*): The password for your given account on the remote Plex server. - **server** (*Optional*): The name of your remote Plex server. - **token** (*Optional*): X-Plex-Token of your remote Plex server. +- **ssl** (*Optional*): Use HTTPS to connect to Plex server, *NOTE* host *must not* be an IP when this option is enabled. Defaults to "False" From fd2dd4d2981bf1d7694137c6bccdddee51911e8b Mon Sep 17 00:00:00 2001 From: Jordy <31309880+jbarrancos@users.noreply.github.com> Date: Sun, 24 Dec 2017 23:54:24 +0100 Subject: [PATCH 12/60] Updated documentation with new sensor (#4094) * Removed parts related to the component * Component configuration * Update rainbird.markdown * Update rainbird.markdown * Create sensor.rainbird.markdown * Update sensor.rainbird.markdown * Update rainbird.markdown * Update sensor.rainbird.markdown * Update sensor.rainbird.markdown * Update sensor.rainbird.markdown * Update rainbird.markdown * Update sensor.rainbird.markdown --- source/_components/rainbird.markdown | 33 +++++++++++++++++++++ source/_components/sensor.rainbird.markdown | 32 ++++++++++++++++++++ source/_components/switch.rainbird.markdown | 7 +---- 3 files changed, 66 insertions(+), 6 deletions(-) create mode 100644 source/_components/rainbird.markdown create mode 100644 source/_components/sensor.rainbird.markdown diff --git a/source/_components/rainbird.markdown b/source/_components/rainbird.markdown new file mode 100644 index 00000000000..4257826b7d4 --- /dev/null +++ b/source/_components/rainbird.markdown @@ -0,0 +1,33 @@ +--- +layout: page +title: "Rain Bird" +description: "Instructions on how to integrate your Rain Bird LNK WiFi Module within Home Assistant." +date: 2017-12-07 12:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: rainbird.png +ha_category: Hub +ha_release: 0.61 +ha_iot_class: "Local Polling" +--- + +This `rainbird` component allows interacting with [LNK WiFi](http://www.rainbird.com/landscape/products/controllers/LNK-WiFi.htm) module of the Rain Bird Irrigation system in Home Assistant. + +To enable it, add the following to your `configuration.yaml` file: + +```yaml +rainbird: + host: '1.1.1.1' + password: 'XXXXXXX' +``` + +Configuration variables: + +- **host** (*Required*): The IP address of your LNK WiFi Module. +- **password** (*Required*): The password for accessing the module. + +Finish its configuration by visiting the [Rain Bird sensor](/components/sensor.rainbird/) and [Rain Bird switch](/components/switch.rainbird/) documentation. + +Please note that due to the implementation of the API within the LNK Module, there is a concurrency issue. For example, the Rain Bird app will give connection issues (like already a connection active). diff --git a/source/_components/sensor.rainbird.markdown b/source/_components/sensor.rainbird.markdown new file mode 100644 index 00000000000..aebb59be073 --- /dev/null +++ b/source/_components/sensor.rainbird.markdown @@ -0,0 +1,32 @@ +--- +layout: page +title: "Rain Bird Sensor" +description: "Instructions on how to integrate your Rain Bird LNK WiFi Module rain sensor within Home Assistant." +date: 2017-08-25 12:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: rainbird.png +ha_category: Hub +ha_release: 0.61 +ha_iot_class: "Local Polling" +--- + +This `rainbird` sensor allows interacting with [LNK WiFi](http://www.rainbird.com/landscape/products/controllers/LNK-WiFi.htm) module of the Rain Bird Irrigation system in Home Assistant. + +Once you have enabled the [Rain Bird component](/components/rainburd), add the following to your `configuration.yaml` file to enable the rain sensor: + +```yaml +# Example configuration.yaml entry +sensor: + - platform: rainbird + monitored_conditions: + - rainsensor +``` + +Configuration variables: + +- **monitored_conditions**: Currently only rainsensor is supported. Returns the sensor level. + +Please note that due to the implementation of the API within the LNK Module, there is a concurrency issue. For example, the Rain Bird app will give connection issues (like already a connection active). diff --git a/source/_components/switch.rainbird.markdown b/source/_components/switch.rainbird.markdown index 5a8598c3021..eee1d471b9e 100644 --- a/source/_components/switch.rainbird.markdown +++ b/source/_components/switch.rainbird.markdown @@ -15,13 +15,10 @@ ha_iot_class: "Local Polling" This `rainbird` switch platform allows interacting with [LNK WiFi](http://www.rainbird.com/landscape/products/controllers/LNK-WiFi.htm) module of the Rain Bird Irrigation system in Home Assistant. -To enable stations as switches inside Home Assistant, add the following to your `configuration.yaml` file: +Once you have enabled the [Rain Bird component](/components/rainbird), add the following to your `configuration.yaml` file: ```yaml switch: - platform: rainbird - host: '1.1.1.1' - password: 'secretpassword' sprinkler_1: zone: 1 friendly_name: "Front sprinklers" @@ -36,8 +33,6 @@ switch: Configuration variables: -- **stickip** (*Required*): The IP address of your LNK WiFi Module. -- **password** (*Required*): The password for accessing the module. - **zone** (*Required*): Station zone identifier. - **friendly_name** (*Optional*): Just a friendly name for the station. - **trigger_time** (*Required*): The default duration to sprinkle the zone. From b40d325460bf03101a99ec63359ffbefac5ba613 Mon Sep 17 00:00:00 2001 From: Michael Irigoyen Date: Mon, 25 Dec 2017 05:35:39 -0500 Subject: [PATCH 13/60] Update the Alarm Decoder docs to outline the services and attributes (#4277) * Update the Alarm Decoder alarm panel doc to outline the services and attributes available * Update docs to meet standards --- .../alarm_control_panel.alarmdecoder.markdown | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/source/_components/alarm_control_panel.alarmdecoder.markdown b/source/_components/alarm_control_panel.alarmdecoder.markdown index fec4f0cb3fd..991bdeb7724 100644 --- a/source/_components/alarm_control_panel.alarmdecoder.markdown +++ b/source/_components/alarm_control_panel.alarmdecoder.markdown @@ -18,3 +18,58 @@ The `alarmdecoder` alarm control panel platform allows you to control your [Alar The requirement is that you have setup your [AlarmDecoder hub](/components/alarmdecoder/). +### {% linkable_title Services %} + +The Alarm Decoder component gives you access to several services for you to control your alarm with. + +- `alarm_arm_away`: Arms the alarm in away mode; all faults will trigger the alarm. +- `alarm_arm_home`: Arms the alarm in stay mode; faults to the doors or windows will trigger the alarm. +- `alarm_arm_night`: Arms the alarm in instant mode; all faults will trigger the alarm. Additionally, the entry delay is turned off on the doors. +- `alarm_disarm`: Disarms the alarm from any state. Also clears a `check_zone` flag after an alarm was triggered. +- `alarmdecoder_alarm_toggle_chime`: Toggles the alarm's chime state. + +**Note**: `alarm_arm_custom_bypass` and `alarm_trigger`, while available in the services list in Home Assistant, are not currently implemented in the Alarm Decoder component. + +### {% linkable_title Attributes %} + +There are several attributes available on the alarm panel to give you more information about your alarm. + +- `ac_power`: Set to `true` if your system has AC power supplying it. +- `backlight_on`: Set to `true` if your keypad's backlight is on. +- `battery_low`: Set to `true` if your system's back-up battery is low. +- `check_zone`: Set to `true` if your system was recently triggered. When `check_zone` is `true`, it must be cleared by entering your code + 1 before attempting to rearm your alarm. +- `chime`: Set to `true` if your system's chime is activated. When activated, your system will beep anytime a door or window is faulted while the alarm is disarmed. +- `entry_delay_off`: Set to `true` if your system is in "Instant" mode, meaning the alarm will sound on any faults. +- `programming_mode`: Set to `true` if your system is in programming mode. +- `ready`: Set to `true` if your system is ready to be armed. Any faults, including motions sensors, will make this value `false`. +- `zone_bypassed`: Set to `true` if your system is currently bypassing a zone. + +### {% linkable_title Examples %} + +Using a combination of the available services and attributes, you can create switch templates. + +#### {% linkable_title Chime Status and Control %} + +{% raw %} +```yaml +- platform: template + switches: + alarm_chime: + friendly_name: Chime + value_template: "{{ is_state_attr('alarm_control_panel.alarm_panel', 'chime', true) }}" + turn_on: + service: alarm_control_panel.alarmdecoder_alarm_toggle_chime + data: + code: !secret alarm_code + turn_off: + service: alarm_control_panel.alarmdecoder_alarm_toggle_chime + data: + code: !secret alarm_code + icon_template: >- + {% if is_state_attr('alarm_control_panel.alarm_panel', 'chime', true) %} + mdi:bell-ring + {% else %} + mdi:bell-off + {% endif %} +``` +{% endraw %} From af8529395c66774fb260fb7e3cd07b4440d711df Mon Sep 17 00:00:00 2001 From: PhracturedBlue Date: Mon, 25 Dec 2017 07:29:31 -0800 Subject: [PATCH 14/60] Add documentation on associating an RF serial-number with the zone (#4091) * Add documentation on associating an RF serial-number with the corresponding zone * Spelling --- source/_components/alarmdecoder.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_components/alarmdecoder.markdown b/source/_components/alarmdecoder.markdown index 82beb4b5e62..aa1109dbdf7 100644 --- a/source/_components/alarmdecoder.markdown +++ b/source/_components/alarmdecoder.markdown @@ -39,6 +39,7 @@ alarmdecoder: 01: name: 'Smoke Detector' type: 'smoke' + rfid: '0123456' 02: name: 'Front Door' type: 'opening' @@ -53,3 +54,4 @@ Configuration variables: - **baudrate** (*Optional*): The baud rate of the AlarmDecoder device, if using serial type. Default: `115200` - **panel_display** (*Optional*): Create a sensor called sensor.alarm_display to match the Alarm Keypad display. Default: `off` - **zones** (*Optional*): AlarmDecoder has no way to tell us which zones are actually in use, so each zone must be configured in Home Assistant. For each zone, at least a name must be given. For more information on the available zone types, take a look at the [Binary Sensor](/components/binary_sensor.alarmdecoder/) docs. *Note: If no zones are specified, Home Assistant will not load any binary_sensor components.* +- **rfid** (*Optional*): The RF serial-number associated with RF zones. Providing this field allows Home Assistant to associate raw sensor data to a given zone, allowing direct monitoring of the state, battery, and supervision status. From 93535411ec63b1a47b10eacee7b6fe2c3154ba65 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Thu, 28 Dec 2017 10:44:45 +0100 Subject: [PATCH 15/60] Update 'ha_release' and other minor changes (#4291) --- source/_components/climate.nuheat.markdown | 6 +++--- source/_components/nuheat.markdown | 4 ++-- source/images/supported_brands/nuheat.png | Bin 4061 -> 3730 bytes 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/source/_components/climate.nuheat.markdown b/source/_components/climate.nuheat.markdown index 5f5ecaa0a89..5c033f46eb4 100644 --- a/source/_components/climate.nuheat.markdown +++ b/source/_components/climate.nuheat.markdown @@ -9,7 +9,7 @@ sharing: true footer: true logo: nuheat.png ha_category: Climate -ha_release: 0.58 +ha_release: 0.61 ha_iot_class: "Cloud Polling" --- @@ -21,12 +21,12 @@ To get your [NuHeat Signature](http://www.nuheat.com/products/thermostats/signat The NuHeat Thermostat supports the following key concepts. -The _target temperature_ is the temperature that the device attempts to achieve. The target temperature is either determined by the schedule programmed into the thermostat (_auto mode_) or may be overridden. When the target temperature is set by home assistant, the thermostat will hold this temperature until the schedule is resumed. +The `target temperature` is the temperature that the device attempts to achieve. The target temperature is either determined by the schedule programmed into the thermostat (`auto mode`) or may be overridden. When the target temperature is set by Home Assistant, the thermostat will hold this temperature until the schedule is resumed. ## {% linkable_title Attributes %} -The following attributes are provided by the NuHeat thermostat: `name`, `temperature_unit`, `current_temperature`, `target_temperature`, `current_hold_mode`, `current_operation`, `operation_list`, `min_temp`, `max_temp` +The following attributes are provided by the NuHeat thermostat: `name`, `temperature_unit`, `current_temperature`, `target_temperature`, `current_hold_mode`, `current_operation`, `operation_list`, `min_temp` and `max_temp`. ### {% linkable_title Attribute `name` %} diff --git a/source/_components/nuheat.markdown b/source/_components/nuheat.markdown index 6c22c3aa0ef..a261aececba 100644 --- a/source/_components/nuheat.markdown +++ b/source/_components/nuheat.markdown @@ -9,7 +9,7 @@ sharing: true footer: true logo: nuheat.png ha_category: Hub -ha_release: 0.58 +ha_release: 0.61 ha_iot_class: "Cloud Polling" --- @@ -45,7 +45,7 @@ password: required: true type: string devices: - description: The serial number / ID of each thermostat you would like to integrate with Home Assistant. + description: The serial number/ID of each thermostat you would like to integrate. required: true type: [string, int] {% endconfiguration %} diff --git a/source/images/supported_brands/nuheat.png b/source/images/supported_brands/nuheat.png index 35016d1c223346c94cce0b7d6be6a7547977c84c..4bc30571f0bfd123d2c1a87fe04e558076ce429f 100644 GIT binary patch delta 3683 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 BVU7R* delta 4016 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 W*=hWwYGv{O0000 Date: Thu, 28 Dec 2017 05:02:41 -0800 Subject: [PATCH 16/60] Documentation updates for the changes to ISY994 (#4288) --- source/_components/isy994.markdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/_components/isy994.markdown b/source/_components/isy994.markdown index 0b59c64b24e..558765a764b 100644 --- a/source/_components/isy994.markdown +++ b/source/_components/isy994.markdown @@ -35,7 +35,8 @@ Configuration variables: - **username** (*Required*): The username that used to access the ISY interface. - **password** (*Required*): The password that used to access the ISY interface. - **sensor_string** (*Optional*): This is the string that is used to identify which devices are to be assumed to be sensors instead of lights of switches. By default, this string is 'sensor'. If this string is found in the device name or folder, Home Assistant will assume it is as a sensor or binary sensor (if the device has on/off or true/false states). This is only necessary for nodes that are not automatically detected as sensors by Home Assistant. Insteon door, window, motion and leak sensors should all be detected automatically. -- **hidden_string** (*Optional*): The HIDDEN_STRING is a string that is used to identify which devices are to be hidden on Home Assistant's front page. This string will be stripped from the device's name before being used. By default, this value is '{HIDE ME}'. +- **ignore_string** (*Optional*): Any devices that contain this string in their name (or folder path) will be ignored by Home Assistant. They will not become entities at all. The default value is `{IGNORE ME}`. +- **enable_climate** (*Optional*): When enabled, climate measurements from the optional climate module in the ISY994 will show up in Home Assistant as sensors. The default value is `True`. - **tls** (*Optional*): This entry should reflect the version of TLS that the ISY controller is using for HTTPS encryption. This value can be either 1.1 or 1.2. If this value is not set, it is assumed to be version 1.1. This is the default for most users. ISY994 Pro users may likely be using 1.2. When using HTTPS in the host entry, it is best practice to set this value. Once the ISY controller is configured, it will automatically import any binary sensors, covers, fans, lights, locks, sensors and switches it can locate. From d3b1bd6431ce90bc43f8b4eabb0f49ab39445ff9 Mon Sep 17 00:00:00 2001 From: Aaron Bach Date: Thu, 28 Dec 2017 10:15:19 -0700 Subject: [PATCH 17/60] Device tracker: disabled Tiles and automatic session renewal (#4223) * Added doc update for HASS PR #11172 * Requested changes --- source/_components/device_tracker.tile.markdown | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/source/_components/device_tracker.tile.markdown b/source/_components/device_tracker.tile.markdown index 7dc534339f4..63ba3d693c8 100644 --- a/source/_components/device_tracker.tile.markdown +++ b/source/_components/device_tracker.tile.markdown @@ -25,9 +25,6 @@ device_tracker: - platform: tile username: email@address.com password: MY_PASSWORD_123 - monitored_variables: - - TILE - - PHONE ``` {% configuration %} @@ -43,4 +40,8 @@ device_tracker: description: the Tile types to monitor; valid values are `TILE` and `PHONE` (default is for all types to be included) required: false type: list + show_inactive: + description: whether to show expired/disabled Tiles + required: false + type: boolean {% endconfiguration %} From 4db836f80af821ddb14b0208d437fe312ea1f354 Mon Sep 17 00:00:00 2001 From: Egor Tsinko Date: Thu, 28 Dec 2017 10:16:26 -0700 Subject: [PATCH 18/60] added documentation for monoprice_snapshot/monoprice_restore services. (#3874) * added documentation for monoprice_snapshot/monoprice_restore services. * :pencil2: Tiny spelling & grammar fixes * minor changes * Changed service names to snapshot and restore * fixed minor typo --- .../media_player.monoprice.markdown | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/source/_components/media_player.monoprice.markdown b/source/_components/media_player.monoprice.markdown index 7487e75b1e8..75e41d9b631 100644 --- a/source/_components/media_player.monoprice.markdown +++ b/source/_components/media_player.monoprice.markdown @@ -47,3 +47,25 @@ Configuration variables: - **port** (*Required*): The serial port to which Monoprice amplifier is connected - **zones** (*Required*): This is the list of zones available. Valid zones are 11,12,13,14,15,16. In case multiple Monoprice devices are stacked together the list of valid zones is extended by 21,22,23,24,25,26 for the second device and 31,32,33,34,35,36 for the third device. Each zone must have a name assigned to it. - **sources** (*Required*): The list of sources available. Valid source numbers are 1,2,3,4,5,6. Each source number corresponds to the input number on the Monoprice amplifier. Similar to zones, each source must have a name assigned to it. + +### {% linkable_title Service `snapshot` %} + +Take a snapshot of one or more zones' states. This service, and the following one are useful if you want to play a doorbell or notification sound and resume playback afterward. If no `entity_id` is provided, all zones are snapshotted. + +The following attributes are stored in a snapshot: +- Power status (On/Off) +- Mute status (On/Off) +- Volume level +- Source + +| Service data attribute | Optional | Description | +| ---------------------- | -------- | ----------- | +| `entity_id` | yes | String or list of strings that point at `entity_id`s of zones. + +### {% linkable_title Service `restore` %} + +Restore a previously taken snapshot of one or more speakers. If no `entity_id` is provided, all zones are restored. + +| Service data attribute | Optional | Description | +| ---------------------- | -------- | ----------- | +| `entity_id` | yes | String or list of strings that point at `entity_id`s of zones. From 3c43e0b45b3a3e15dfc735bf5b038fe7a9b9c8b3 Mon Sep 17 00:00:00 2001 From: Derek Brooks Date: Thu, 28 Dec 2017 09:52:30 -0800 Subject: [PATCH 19/60] update nuheat docs for recent component changes (#4296) --- source/_components/climate.nuheat.markdown | 35 ++++++++-------------- 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/source/_components/climate.nuheat.markdown b/source/_components/climate.nuheat.markdown index 5c033f46eb4..51ffd6fee4b 100644 --- a/source/_components/climate.nuheat.markdown +++ b/source/_components/climate.nuheat.markdown @@ -62,24 +62,6 @@ not in auto operation mode. | ---------------| ----------- | | Integer | Target temperature -### {% linkable_title Attribute `target_temperature_low` %} - -Returns the desired heating temperature set in the thermostat when in -auto operation mode. - -| Attribute type | Description | -| ---------------| ----------- | -| Integer | Target temperature - -### {% linkable_title Attribute `target_temperature_high` %} - -Returns the desired cooling temperature set in the thermostat when in -auto operation mode. - -| Attribute type | Description | -| ---------------| ----------- | -| Integer | Target temperature - ### {% linkable_title Attribute `current_hold_mode` %} Returns the current temperature hold, if any. @@ -123,13 +105,13 @@ Returns the maximum supported temperature by the thermostat ## {% linkable_title Services %} -The following services are provided by the NuHeat Thermostat: `set_temperature`, `resume_program`. +The following services are provided by the NuHeat Thermostat: `set_temperature`, `set_hold_mode`, `nuheat_resume_program`. -The services `fan_min_on_time`, `set_aux_heat`, `set_away_mode`, `set_hold_mode`, `set_humidity`, `set_fan_mode`, `set_operation_mode` and `set_swing_mode` offered by the [Climate component](/components/climate/) are not implemented for this thermostat. +The services `fan_min_on_time`, `set_aux_heat`, `set_away_mode`, `set_humidity`, `set_fan_mode`, `set_operation_mode` and `set_swing_mode` offered by the [Climate component](/components/climate/) are not implemented for this thermostat. ### {% linkable_title Service `set_temperature` %} -Puts the thermostat into a temporary hold at the given temperature. +Puts the thermostat into an indefinite hold at the given temperature. | Service data attribute | Optional | Description | | ---------------------- | -------- | ----------- | @@ -139,7 +121,16 @@ Puts the thermostat into a temporary hold at the given temperature. Only the target temperatures relevant for the current operation mode need to be provided. -### {% linkable_title Service `resume_program` %} +### {% linkable_title Service `set_hold_mode` %} + +Sets the thermostat's hold mode. The NuHeat thermostat supports "auto" (to run the thermostat's programmed schedule), "temperature" (to indefinitely hold the thermostat's current target temperature), or "temporary_temperature" (to hold the thermostat's current target temperature until the thermostat's next scheduled event). + +| Service data attribute | Optional | Description | +| ---------------------- | -------- | ----------- | +| `entity_id` | yes | String or list of strings that point at `entity_id`'s of climate devices to control. Else targets all. +| `hold_mode` | no | New value of hold mode. + +### {% linkable_title Service `nuheat_resume_program` %} Resumes the currently active schedule. From 2ecb5c44fbbc344a0f1292f45f7bf67e30bfddd7 Mon Sep 17 00:00:00 2001 From: Matt Schmitt Date: Thu, 28 Dec 2017 12:55:51 -0500 Subject: [PATCH 20/60] Additional device classes for binary sensors (#4267) * Add additional device classes for binary sensor --- source/_components/binary_sensor.markdown | 33 ++++++++++++----------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/source/_components/binary_sensor.markdown b/source/_components/binary_sensor.markdown index 6b6d1d8c5d3..781f4f45576 100644 --- a/source/_components/binary_sensor.markdown +++ b/source/_components/binary_sensor.markdown @@ -15,23 +15,26 @@ The way these sensors are displayed in the frontend can be modified in the [cust - **None**: Generic on/off. This is the default and doesn't need to be set. - **battery**: `On` means low, `Off` means normal -- **cold**: `On` means cold -- **connectivity**: `On` means connection present, `Off` means no connection -- **gas**: `On` means gas detected -- **heat**: `On` means hot -- **light**: Lightness threshold -- **moisture**: `On` means wet -- **motion**: `On` means motion detected -- **moving**: `On` means moving, `Off` means stopped -- **occupancy**: `On` means occupied, `Off` means not occupied +- **cold**: `On` means cold, `Off` means normal +- **connectivity**: `On` means connected, `Off` means disconnected +- **door**: `On` means open, `Off` means closed +- **garage_door**: `On` means open, `Off` means closed +- **gas**: `On` means gas detected, `Off` means no gas (clear) +- **heat**: `On` means hot, `Off` means normal +- **light**: `On` means light detected, `Off` means no light +- **moisture**: `On` means moisture detected (wet), `Off` means no moisture (dry) +- **motion**: `On` means motion detected, `Off` means no motion (clear) +- **moving**: `On` means moving, `Off` means not moving (stopped) +- **occupancy**: `On` means occupied, `Off` means not occupied (clear) - **opening**: `On` means open, `Off` means closed - **plug**: `On` means device is plugged in, `Off` means device is unplugged -- **power**: Power, over-current, etc. -- **presence**: `On` means Home, `Off` means Away -- **problem**: `On` means a problem was detected, `Off` means the status is OK +- **power**: `On` means power detected, `Off` means no power +- **presence**: `On` means home, `Off` means away +- **problem**: `On` means problem detected, `Off` means no problem (OK) - **safety**: `On` means unsafe, `Off` means safe -- **smoke**: `On` means smoke detected -- **sound**: `On` means sound detected, `Off` means no sound -- **vibration**: `On` means vibration detected, `Off` means no vibration +- **smoke**: `On` means smoke detected, `Off` means no smoke (clear) +- **sound**: `On` means sound detected, `Off` means no sound (clear) +- **vibration**: `On` means vibration detected, `Off` means no vibration (clear) +- **window**: `On` means open, `Off` means closed For analog sensors please check the [component overview](https://home-assistant.io/components/#sensor). From 57855e2165262fe988cb610c53e187026e554f7d Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Thu, 28 Dec 2017 20:23:16 +0000 Subject: [PATCH 21/60] Document default names for TP-Link devces (#4294) - Document default names for smart sockets and bulbs - Change all references to the company to "TP-Link" --- source/_components/light.tplink.markdown | 24 ++++++++++++++--------- source/_components/switch.tplink.markdown | 12 +++++------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/source/_components/light.tplink.markdown b/source/_components/light.tplink.markdown index 68fff983950..71fc4e97171 100644 --- a/source/_components/light.tplink.markdown +++ b/source/_components/light.tplink.markdown @@ -1,7 +1,7 @@ --- layout: page -title: "TPLink Bulb" -description: "Instructions how to integrate TPLink bulbs into Home Assistant." +title: "TP-Link Bulb" +description: "Instructions how to integrate TP-Link bulbs into Home Assistant." date: 2017-07-25 08:00 sidebar: true comments: false @@ -14,7 +14,7 @@ ha_release: "0.50" --- -The `tplink` light platform allows you to control the state of your [TPLink smart bulb](http://www.tp-link.com/en/products/list-5609.html). +The `tplink` light platform allows you to control the state of your [TP-Link smart bulb](http://www.tp-link.com/en/products/list-5609.html). Supported units: @@ -23,7 +23,7 @@ Supported units: - LB120 - LB130 -To use your TPLink light in your installation, add the following to your `configuration.yaml` file: +To use your TP-Link light in your installation, add the following to your `configuration.yaml` file: ```yaml # Example configuration.yaml entry @@ -32,9 +32,15 @@ light: host: IP_ADDRESS ``` -Configuration variables: - -- **host** (*Required*): The IP address of your TP-Link bulb, eg. `192.168.1.32`. -- **name** (*Optional*): The name to use when displaying this bulb. - +{% configuration %} +name: + description: The name to use when displaying this bulb. + required: false + type: string + default: TP-Link Light +host: + description: "The IP address of your TP-Link bulb, eg. `192.168.1.32`." + required: true + type: string +{% endconfiguration %} diff --git a/source/_components/switch.tplink.markdown b/source/_components/switch.tplink.markdown index ee56f356880..4feabe67348 100644 --- a/source/_components/switch.tplink.markdown +++ b/source/_components/switch.tplink.markdown @@ -1,7 +1,7 @@ --- layout: page -title: "TPLink Switch" -description: "Instructions how to integrate TPLink switches into Home Assistant." +title: "TP-Link Switch" +description: "Instructions how to integrate TP-Link switches into Home Assistant." date: 2016-07-13 08:00 sidebar: true comments: false @@ -14,7 +14,7 @@ ha_release: "0.24" --- -The `tplink` switch platform allows you to control the state of your [TPLink smart switch](http://www.tp-link.com/en/products/list-5258.html). +The `tplink` switch platform allows you to control the state of your [TP-Link smart switch](http://www.tp-link.com/en/products/list-5258.html). Supported units: @@ -23,7 +23,7 @@ Supported units: - HS110 - HS200 -To use your TPLink switch in your installation, add the following to your `configuration.yaml` file: +To use your TP-Link switch in your installation, add the following to your `configuration.yaml` file: ```yaml # Example configuration.yaml entry @@ -37,7 +37,7 @@ name: description: The name to use when displaying this switch. required: false type: string - default: Random Sensor + default: TP-Link Switch host: description: "The IP address of your TP-Link switch, eg. `192.168.1.32`." required: true @@ -49,5 +49,3 @@ enable_leds: default: true {% endconfiguration %} - - From bb938dd2ad6836a6252d2e85a99aa6c33b2c1408 Mon Sep 17 00:00:00 2001 From: Gregory Benner Date: Thu, 28 Dec 2017 16:11:49 -0500 Subject: [PATCH 22/60] add docs for sochain sensor (#4287) * add sochain documentation * Minimize configuration sample --- source/_components/sensor.sochain.markdown | 50 +++++++++++++++++++++ source/images/supported_brands/sochain.png | Bin 0 -> 28597 bytes 2 files changed, 50 insertions(+) create mode 100644 source/_components/sensor.sochain.markdown create mode 100644 source/images/supported_brands/sochain.png diff --git a/source/_components/sensor.sochain.markdown b/source/_components/sensor.sochain.markdown new file mode 100644 index 00000000000..77bf1c78364 --- /dev/null +++ b/source/_components/sensor.sochain.markdown @@ -0,0 +1,50 @@ +--- +layout: page +title: "SoChain" +description: "Instructions how to integrate chain.so data within Home Assistant." +date: 2017-06-01 16:20 +sidebar: true +comments: false +sharing: true +footer: true +logo: sochain.png +ha_category: Finance +ha_release: 0.61 +ha_iot_class: "Cloud Polling" +--- + + +The `SoChain` sensor platform displays supported cryptocurrency wallet balances from [SoChain](https://chain.so). + +To add the SoChain sensor to your installation, specify a network and address to watch in the `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +sensor: + - platform: sochain + network: LTC + address: 'M9m37h3dVkLDS13wYK7vcs7ck6MMMX6yhK' +``` + +{% configuration %} +network: + description: The network or blockchain of the cryptocurrency to watch. + required: true + type: string +address: + description: Cryptocurrency wallet address to watch. + required: true + type: string +name: + description: The name of the sensor used in the frontend. (recommended) + required: false + type: string + default: Crypto Balance +{% endconfiguration %} + +Supported networks (which can also be found [here](https://chain.so/api#networks-supported)) are: + +* BTC +* LTC +* DOGE +* DASH diff --git a/source/images/supported_brands/sochain.png b/source/images/supported_brands/sochain.png new file mode 100644 index 0000000000000000000000000000000000000000..0cfc42bc6eb6ae59e030ebed4d6507e1ef5b4b36 GIT binary patch literal 28597 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 Date: Fri, 29 Dec 2017 03:36:33 +0100 Subject: [PATCH 23/60] Update alarm_control_panel.egardia.markdown (#4282) * Update alarm_control_panel.egardia.markdown * Update alarm_control_panel.egardia.markdown --- .../alarm_control_panel.egardia.markdown | 38 ++++--------------- 1 file changed, 8 insertions(+), 30 deletions(-) diff --git a/source/_components/alarm_control_panel.egardia.markdown b/source/_components/alarm_control_panel.egardia.markdown index 04bc5bf8819..6706a50f23e 100644 --- a/source/_components/alarm_control_panel.egardia.markdown +++ b/source/_components/alarm_control_panel.egardia.markdown @@ -12,11 +12,11 @@ ha_release: 0.51 ha_category: Alarm --- -The `egardia` platform enables the ability to control an [Egardia](http://egardia.com/)/Woonveilig control panel. These alarm panels are known under different brand names across the world, including Woonveilig in the Netherlands. This was tested on a Gate01 version of the Egardia/Woonveilig platform. +The `egardia` platform enables the ability to control an [Egardia](http://egardia.com/)/[Woonveilig](http://woonveilig.nl) control panel. These alarm panels are known under different brand names across the world, including Woonveilig in the Netherlands. This was tested on a GATE-01 and GATE-02 version of the Egardia/Woonveilig platform. You will need to know the IP of your alarm panel on your local network. Test if you can login to the panel by browsing to the IP address and log in using your Egardia/Woonveilig account. -To enable this, add the following lines to your `configuration.yaml` file: +To enable the integration with your alarm panel, add the following lines to your `configuration.yaml` file: ```yaml # Example configuration.yaml entry @@ -32,17 +32,18 @@ Configuration variables: - **host** (*Required*): The local IP address of the Egardia/Woonveilig alarm panel. - **username** (*Required*): Username for the Egardia/Woonveilig account. - **password** (*Required*): Password for Egardia/Woonveilig account. +- **version** (*Optional*): The version of the Egardia system. `GATE-01` and `GATE-02` are currently supported. Defaults to `GATE-01`. - **port** (*Optional*): The port of the alarm panel. Defaults to 80. - **name** (*Optional*): Name to use for the alarm panel. Defaults to `Egardia`. - **report_server_enabled** (*Optional*): Enable reporting by server. Defaults to `False`. -- **report_server_port** (*Optional*): Port of the Egardia server. Defaults to 85. +- **report_server_port** (*Optional*): Port of the Egardia server. Defaults to 52010. - **report_server_codes** list (*Optional*): List of codes for the different states. Note that this basic configuration will only enable you to read the armed/armed away/disarmed status of your alarm and will **not** update the status if the alarm is triggered. This is because of how Egardia built their system. The alarm triggers normally go through their servers. You can change this, however, using the following procedure. This is a more advanced configuration. 1. Log in into your alarm system's control panel. You will need to access http://[IP of your control panel]. You know this already since you need it in the basic configuration from above. Log in to the control panel with your Egardia/Woonveilig username and password. -2. Once logged in, go to *System Settings*, *Report* and change the Server Address for your primary server to the IP or hostname of your Home Assistant machine. Also, update the port number 85 or to anything you like. The provided software that you will set up in the next steps runs on port 85 by default. **Make sure to change the settings of the primary server otherwise the messages will not come through. Note that this will limit (or fully stop) the number of alarm messages you will get through Egardia's / Woonveilig services.** Maybe, that is just what you want. Make sure to save your settings by selecting 'OK'. +2. Once logged in, go to *System Settings*, *Report* and change the Server Address for your primary server to the IP or hostname of your Home Assistant machine. You can leave the port number set to 52010 or change it to anything you like. **Make sure to change the settings of the primary server otherwise the messages will not come through. Note that this will limit (or fully stop) the number of alarm messages you will get through Egardia's / Woonveilig services.** Maybe, that is just what you want. Make sure to save your settings by selecting 'OK'. 3. On your Home Assistant machine run `$ sudo python3 egardiaserver.py`. Refer to the [python-egardia repository](https://github.com/jeroenterheerdt/python-egardia) for detailed documentation on parameters. This will receive status codes from your alarm control panel and display them. You will need the codes to include in your configuration.yaml. Make sure to change the status of your alarm to all states (disarm, arm, home) by all means possible (all users, remotes, web login, app) as well as trigger the alarm in all ways possible to get 100% coverage. **Before triggering the alarm it might be good to disable the siren temporarily (can be done in Panel Settings).** 4. Once you have the codes, update your `configuration.yaml`: ```yaml @@ -53,7 +54,7 @@ alarm_control_panel:   username: YOUR_USERNAME   password: YOUR_PASSWORD report_server_enabled: True - report_server_port: PORT_OF_EGARDIASERVER (85 as per the instructions above) + report_server_port: PORT_OF_EGARDIASERVER (optional, defaults to 52010) report_server_codes: arm: XXXXXXXXXXXXXXXX, XXXXXXXXXXXXXXXX disarm: XXXXXXXXXXXXXXXX, XXXXXXXXXXXXXXXX @@ -62,29 +63,6 @@ alarm_control_panel: ignore: XXXXXXXXXXXXXXXX ``` -Note that for triggered, arm and disarm multiple codes can be entered since each sensor triggers with a different code and each user of the system has its own arm and disarm codes. Also note that your system will do regular system checks which will be reported as well. Since Home Assistant provides no way of handling them properly, you can enter those codes as ignore (again, multiple codes can be used here). The egardia component will ignore these codes and continue returning the old status if it receives any of the codes that are listed as ignore. This is useful for example when you have armed your alarm at night: normally a system check will occur at least once during the night and if that code is not specified anywhere Home Assistant will set the status of the alarm to its default, which is unarmed. This is in fact wrong. Listing the code as ignore changes this behavior and Home Assistant will continue to show the status the alarm is in (disarm, arm, home, triggered) even when system checks occur. +Note that for *triggered*, *arm* and *disarm* multiple codes can be entered since each sensor triggers with a different code and each user of the system has its own arm and disarm codes. Also note that your system will do regular system checks which will be reported as well. Since Home Assistant provides no way of handling them properly, you can enter those codes as *ignore* (again, multiple codes can be used here). The egardia component will ignore these codes and continue returning the old status if it receives any of the codes that are listed as ignore. This is useful for example when you have armed your alarm at night: normally a system check will occur at least once during the night and if that code is not specified anywhere Home Assistant will set the status of the alarm to its default, which is unarmed. This is in fact wrong. Listing the code as ignore changes this behavior and Home Assistant will continue to show the status the alarm is in (disarm, arm, home, triggered) even when system checks occur. -5. Start the `egardiaserver.py` script on boot of your Home Assistant machine, for example by using `systemctl` by `systemd`. To use this method, create a shell script named `egardiaserver.sh` that contains something like the following: - -```bash -$ source /srv/homeassistant/bin/activate -$ python3 /srv/homeassistant/lib/python3.5/site-packages/pythonegardia/egardiaserver.py -host [YOURHOST] -password '[YOURPASSWORD]' -ssl True > /tmp/egardiaserver.log 2>&1 -``` - -Mark it as executable (`$ chmod +x`) and run `sudo nano /lib/systemd/system/egardiaserver.service`. Enter the following into the `egardiaserver.service` file: - -```bash -[Unit] -Description=Egardia Server Service - -[Service] -ExecStart=/bin/bash /srv/homeassistant/homeassistant_venv/lib/python3.5/site-packages/pythonegardia/egardiaserver.sh -StandardOutput=journal+console - -[Install] -WantedBy=multi-user.target -Alias=egardiaserver.service -``` - -Save and then run `sudo systemctl enable egardiaserver.service` and `sudo systemctl start egardiaserver.service`. -6. Test your setup and enjoy. The component will update if the alarm status changes, including triggers. You can use this to build your own automations and send notifications as you wish. +5. Test your setup and enjoy. The component will update if the alarm status changes, including triggers. You can use this to build your own automations and send notifications as you wish. *Note*: previous versions required a separate egardiaserver to be set up. This is no longer necessary and corresponding system services can be removed (using systemctl). From df0e39561614b5a391dc682afdf1e7e4450e3ba1 Mon Sep 17 00:00:00 2001 From: goldminenine <34691572+goldminenine@users.noreply.github.com> Date: Fri, 29 Dec 2017 09:20:31 +0100 Subject: [PATCH 24/60] Update modbus.markdown (#4261) Documentation change associated to pull request: https://github.com/home-assistant/home-assistant/pull/11238 --- source/_components/modbus.markdown | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/source/_components/modbus.markdown b/source/_components/modbus.markdown index f673298d82e..9d560058290 100644 --- a/source/_components/modbus.markdown +++ b/source/_components/modbus.markdown @@ -30,7 +30,10 @@ modbus: Configuration variables: -- **type** (*Required*): Type of the connection to Modbus. +- **type** (*Required*): Type of the connection to Modbus. Possible values are: + - *tcp*: Modbus TCP protocol according to "MODBUS Messaging Implementation Guide version 1.0b" provided by Schneider Automation, + - *udp*: Modbus TCP form, but using UDP for transport (removes the overheads required for TCP), + - *rtuovertcp*: Modbus RTU message transmitted with a TCP/IP wrapper and sent over a network instead of serial lines. - **host** (*Required*): The IP address of your Modbus device, eg. 192.168.1.1. - **port** (*Required*): The port for the communication. - **timeout** (*Optional*): Timeout for slave response in seconds. (default: 3) @@ -51,7 +54,7 @@ modbus: Configuration variables: -- **type** (*Required*): Type of the connection to Modebus. +- **type** (*Required*): Type of the connection to Modbus. - **method** (*Required*): Method of the connection to Modbus. - **port** (*Required*): The port where your Modbus device is connected to your Home Assistant host. - **baudrate** (*Required*): The speed for the serial connection. From 309b287b9dde97233345c6ec12235a44be1f09c7 Mon Sep 17 00:00:00 2001 From: Andy Castille Date: Fri, 29 Dec 2017 02:40:08 -0600 Subject: [PATCH 25/60] Doorbird live view update (#4230) * doorbird live_view option * Change Doorbird binary sensor to Local Push after code change * Document DoorBird events * Remove DoorBird camera options https://github.com/home-assistant/home-assistant/pull/11193/commits/2d7d1d72e5b45bb951d0314c4b0e161c5d91d9f5 --- .../binary_sensor.doorbird.markdown | 28 ------------------- source/_components/camera.doorbird.markdown | 6 +--- source/_components/doorbird.markdown | 5 ++++ 3 files changed, 6 insertions(+), 33 deletions(-) delete mode 100644 source/_components/binary_sensor.doorbird.markdown diff --git a/source/_components/binary_sensor.doorbird.markdown b/source/_components/binary_sensor.doorbird.markdown deleted file mode 100644 index b16dc68c5e9..00000000000 --- a/source/_components/binary_sensor.doorbird.markdown +++ /dev/null @@ -1,28 +0,0 @@ ---- -layout: page -title: "DoorBird Binary Sensor" -description: "Instructions how to integrate DoorBird video doorbell state into Home Assistant." -date: 2017-08-06 11:30 -sidebar: true -comments: false -sharing: true -footer: true -logo: doorbird.png -ha_category: Binary Sensor -ha_release: "0.54" -ha_iot_class: "Local Polling" ---- - -The `doorbird` binary sensor platform allows Home Assistant to monitor when your [DoorBird](http://www.doorbird.com/) doorbell rings. - -

- You must have the [DoorBird component](/components/doorbird/) configured to use this binary sensor. -

- -To enable the binary sensor, add the following to your `configuration.yaml` file: - -```yaml -# Example configuration.yaml entry -binary_sensor: - - platform: doorbird -``` diff --git a/source/_components/camera.doorbird.markdown b/source/_components/camera.doorbird.markdown index 55fcb419f8c..d96a1ebe9b7 100644 --- a/source/_components/camera.doorbird.markdown +++ b/source/_components/camera.doorbird.markdown @@ -13,7 +13,7 @@ ha_release: "0.54" ha_iot_class: "Local Polling" --- -The `doorbird` implementation allows you to view the live video and saved images from your [DoorBird](http://www.doorbird.com/) device in Home Assistant. +The `doorbird` implementation allows you to view the live video and previous images from your [DoorBird](http://www.doorbird.com/) device in Home Assistant.

You must have the [DoorBird component](/components/doorbird/) configured to use this camera. @@ -26,7 +26,3 @@ To enable the camera, add the following to your `configuration.yaml` file: camera: - platform: doorbird ``` - -Configuration variables: - -- **last_visitor** (*Optional*): Adds a second camera that shows the last picture taken when someone rang the doorbell. Default is `false`. diff --git a/source/_components/doorbird.markdown b/source/_components/doorbird.markdown index 0b7f1e4120a..4ce686ec640 100644 --- a/source/_components/doorbird.markdown +++ b/source/_components/doorbird.markdown @@ -30,3 +30,8 @@ Configuration variables: - **host** (*Required*): The LAN IP address or hostname of your device. You can find this by going to the [DoorBird Online check](http://www.doorbird.com/checkonline) and entering the information from the paper that was included in the box. - **username** (*Required*): The username of a non-administrator user account on the device. - **password** (*Required*): The password for the user specified. +- **doorbell_events** (*Optional*): Setting this to `true` this will register a callback URL with the device so that events can be published to the event bus when the doorbell rings. + +

+Enabling `doorbell_events` will delete all other registered push notification services with the device every time Home Assistant starts. This will not affect notifications delivered by the DoorBird mobile app. +

From 59beeef4925fc41eebf72dc6909bc05a61da819f Mon Sep 17 00:00:00 2001 From: William Scanlon Date: Fri, 29 Dec 2017 13:06:43 -0500 Subject: [PATCH 26/60] Doc for EcoNet water heaters (#4299) --- source/_components/climate.econet.markdown | 64 +++++++++++++++++++++ source/images/supported_brands/econet.png | Bin 0 -> 285502 bytes 2 files changed, 64 insertions(+) create mode 100644 source/_components/climate.econet.markdown create mode 100644 source/images/supported_brands/econet.png diff --git a/source/_components/climate.econet.markdown b/source/_components/climate.econet.markdown new file mode 100644 index 00000000000..3feb4aa6437 --- /dev/null +++ b/source/_components/climate.econet.markdown @@ -0,0 +1,64 @@ +--- +layout: page +title: "EcoNet water heater" +description: "Instructions how to integrate Rheem EcoNet water heaters into Home Assistant." +date: 2017-12-28 14:51 +sidebar: true +comments: false +sharing: true +footer: true +logo: econet.png +ha_category: Climate +ha_release: 0.61.0 +ha_iot_class: "Cloud Polling" +--- + + +The `econet` water heater platform is consuming the information provided by a [EcoNet enabled Rheem water heater](http://www.rheem.com/EcoNet/Home). This component allows you to set the temperature, the operation mode, and enable vaction mode. + +To enable the `econet` water heater platform add the following to your config. + + +```yaml +# Example configuration.yaml entry +climate: + - platform: econet + username: YOUR_ECONET_EMAIL + password: YOUR_ECONET_PASSWORD +``` + +{% configuration %} +username: + description: The username used to connect to your EcoNet account. + required: true + type: string +password: + description: The password used to connect to your EcoNet account. + required: true + type: string +{% endconfiguration %} + + +### {% linkable_title Service `econet_add_vacation` %} + +You can use the service econet/add_vacation to create a new vacation for your EcoNet water heaters. + +| Service data attribute | Optional | Description | +| ---------------------- | -------- | ----------- | +| `entity_id` | yes | The entity id of the water heater to add the vaction to. +| `start_date` | yes | This is a Unix timestamp for when the vaction should start. +| `end_date` | yes | this is a Unix timestamp for when the vaction should end. + +

+The Unix timestamps can be obtained from the input_datetime component. This will allow you to graphically set the start and end date. +

+ +### {% linkable_title Service `econet_delete_vacation` %} + +You can use the service econet/delete_vacation to remove all vactions from an EcoNet water heater. + +| Service data attribute | Optional | Description | +| ---------------------- | -------- | ----------- | +| `entity_id` | yes | The entity id of the water heater to remove the vaction from. + + diff --git a/source/images/supported_brands/econet.png b/source/images/supported_brands/econet.png new file mode 100644 index 0000000000000000000000000000000000000000..cff0e0706c447bbc6024597af5415bc4ab56ccc3 GIT binary patch literal 285502 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 Date: Sat, 30 Dec 2017 09:01:06 +0000 Subject: [PATCH 27/60] Hive Component Release Two (#4178) * Update documentation for hive active light colour changing light * Updated hive climate documentation for aux heat / boost feature --- source/_components/binary_sensor.hive.markdown | 2 +- source/_components/climate.hive.markdown | 1 + source/_components/hive.markdown | 1 + source/_components/light.hive.markdown | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/source/_components/binary_sensor.hive.markdown b/source/_components/binary_sensor.hive.markdown index 62022aa898c..ef695f46014 100644 --- a/source/_components/binary_sensor.hive.markdown +++ b/source/_components/binary_sensor.hive.markdown @@ -1,6 +1,6 @@ --- layout: page -title: "Hive Sensor" +title: "Hive Binary Sensor" description: "Instructions on how to integrate Hive Sensors with Home Assistant." date: 2017-09-24 21:00 sidebar: true diff --git a/source/_components/climate.hive.markdown b/source/_components/climate.hive.markdown index a6c40b14623..dd3fd41ca51 100644 --- a/source/_components/climate.hive.markdown +++ b/source/_components/climate.hive.markdown @@ -15,6 +15,7 @@ ha_iot_class: "Cloud Polling" The 'hive' climate component integrates your Hive thermostat and hot water into Home Assistant, enabling control of setting the **mode** and setting the **target temperature**. +A short boost for Hive Heating or Hive Hot water can be set by using the **Aux Heat** function, this will turn on the boost feature for Hive Heating or Hive Hot water for 30 minutes at 0.5 degrees higher than the current temperature. The Hive climate component supports the following Hive products: - **Hive Active Heating** diff --git a/source/_components/hive.markdown b/source/_components/hive.markdown index 7c3d47a3c9f..8f760b08c76 100644 --- a/source/_components/hive.markdown +++ b/source/_components/hive.markdown @@ -49,6 +49,7 @@ The Hive Home Assistant platform currently supports the following Hive devices: - Hive Active Heating (including hot water and Hive Multizone) - Hive Active Light Dimmable - Hive Active Light Cool to Warm White +- Hive Active Light Colour Changing - Hive Active Plug - Hive Window or Door Sensor - Hive Motion Sensor diff --git a/source/_components/light.hive.markdown b/source/_components/light.hive.markdown index 7b9038ae169..89f55459fb0 100644 --- a/source/_components/light.hive.markdown +++ b/source/_components/light.hive.markdown @@ -19,6 +19,7 @@ The 'hive' light component integrates your Hive lights into Home Assistant, enab The Hive light component supports the following Hive products: - **Hive Active Light Dimmable** - **Hive Active Light Cool to Warm White** +- **Hive Active Light Colour Changing**

From dceec870d86d5867ef202a5d2b36bfadf4c95562 Mon Sep 17 00:00:00 2001 From: David Fiel Date: Sat, 30 Dec 2017 05:05:14 -0500 Subject: [PATCH 28/60] Documentation for new TCP Lighting (Greenwave Reality) component (#4005) * Create light.tcpbulbs.markdown * Change Version to 0.59 * Change Configuration to correct formatting * Removed Configuration Variables Header * Update and rename light.tcpbulbs.markdown to light.greenwave.markdown * Update light.greenwave.markdown * Update light.greenwave.markdown * :lipstick: Adds the Greenwave Reality logo * :lipstick: Improved crop of logo --- source/_components/light.greenwave.markdown | 41 ++++++++++++++++++ .../supported_brands/greenwavereality.png | Bin 0 -> 12550 bytes 2 files changed, 41 insertions(+) create mode 100644 source/_components/light.greenwave.markdown create mode 100644 source/images/supported_brands/greenwavereality.png diff --git a/source/_components/light.greenwave.markdown b/source/_components/light.greenwave.markdown new file mode 100644 index 00000000000..a0cba942d4c --- /dev/null +++ b/source/_components/light.greenwave.markdown @@ -0,0 +1,41 @@ +--- +layout: page +title: Greenwave Reality (TCP Connected) Lights +description: "Instructions on how to set up Greenwave Reality lights within Home Assistant." +date: 2017-11-17 18:50 +sidebar: true +comments: false +sharing: true +footer: true +logo: greenwavereality.png +ha_category: Light +ha_release: 0.61 +ha_iot_class: "Local Polling" +--- + +This component communicates with the Greenwave Reality (TCP Connected) Gateway to allow control of all lights and fixtures registered to the gateway. Bulbs and Fixtures can be created and modified inside the TCP Lighting App for Android and iOS. + +This component has been tested on firmware revisions: + +- 2.0.105 + +To configure the connection to the gateway, add the following to your `configuration.yaml` file: + +```yaml +light: + - platform: greenwave + host: XXX.XXX.XXX.XXX + version: 3 +``` +The version option is the major revision of your firmware, which should be 2 or 3. If you are running Version 2, there are no extra steps. If you are running Version 3, you must press the Sync button on the gateway prior to the first launch of Home Assistant, so a token can be grabbed. Once home assistant has started, you can either press the Sync button again or wait for it to time out manually. + +{% configuration %} +host: + description: The IP Address of your Gateway + required: true + type: string +version: + description: Major version of the gateway firmware + required: true + type: integer +{% endconfiguration %} diff --git a/source/images/supported_brands/greenwavereality.png b/source/images/supported_brands/greenwavereality.png new file mode 100644 index 0000000000000000000000000000000000000000..d80243b4750402b2cff235dd27a829b63b4a36a2 GIT binary patch literal 12550 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 literal 0 HcmV?d00001 From 9c599e592b1b6cba75fa77068b4e7c3a93659a17 Mon Sep 17 00:00:00 2001 From: Andrey Kupreychik Date: Sat, 30 Dec 2017 17:05:49 +0700 Subject: [PATCH 29/60] GPS Logger auth section (#4253) --- source/_components/device_tracker.gpslogger.markdown | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/source/_components/device_tracker.gpslogger.markdown b/source/_components/device_tracker.gpslogger.markdown index 6b6a439cdee..994b8c2989a 100644 --- a/source/_components/device_tracker.gpslogger.markdown +++ b/source/_components/device_tracker.gpslogger.markdown @@ -19,7 +19,14 @@ To integrate GPSLogger in Home Assistant, add the following section to your `con # Example configuration.yaml entry device_tracker: - platform: gpslogger + password: !secret gpslogger_password ``` +{% configuration %} +password: + description: Separate password for GPS Logger endpoint. If provided using regular API password to contact endpoint will result in 401 response. + required: false + type: string +{% endconfiguration %} ## {% linkable_title Setup on your smartphone %} From efa6a029ffdd4c2f40367aee4476de6f48632e40 Mon Sep 17 00:00:00 2001 From: Jeroen ter Heerdt Date: Mon, 1 Jan 2018 02:11:47 +0100 Subject: [PATCH 30/60] Add support for GATE-03 version of Ergardia alarm system (#4315) --- source/_components/alarm_control_panel.egardia.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_components/alarm_control_panel.egardia.markdown b/source/_components/alarm_control_panel.egardia.markdown index 6706a50f23e..20c555587e4 100644 --- a/source/_components/alarm_control_panel.egardia.markdown +++ b/source/_components/alarm_control_panel.egardia.markdown @@ -12,7 +12,7 @@ ha_release: 0.51 ha_category: Alarm --- -The `egardia` platform enables the ability to control an [Egardia](http://egardia.com/)/[Woonveilig](http://woonveilig.nl) control panel. These alarm panels are known under different brand names across the world, including Woonveilig in the Netherlands. This was tested on a GATE-01 and GATE-02 version of the Egardia/Woonveilig platform. +The `egardia` platform enables the ability to control an [Egardia](http://egardia.com/)/[Woonveilig](http://woonveilig.nl) control panel. These alarm panels are known under different brand names across the world, including Woonveilig in the Netherlands. This was tested on the GATE-01, GATE-02 and GATE-03 versions of the Egardia/Woonveilig platform. You will need to know the IP of your alarm panel on your local network. Test if you can login to the panel by browsing to the IP address and log in using your Egardia/Woonveilig account. @@ -32,7 +32,7 @@ Configuration variables: - **host** (*Required*): The local IP address of the Egardia/Woonveilig alarm panel. - **username** (*Required*): Username for the Egardia/Woonveilig account. - **password** (*Required*): Password for Egardia/Woonveilig account. -- **version** (*Optional*): The version of the Egardia system. `GATE-01` and `GATE-02` are currently supported. Defaults to `GATE-01`. +- **version** (*Optional*): The version of the Egardia system. `GATE-01`, `GATE-02` and `GATE-03` are currently supported. Defaults to `GATE-01`. - **port** (*Optional*): The port of the alarm panel. Defaults to 80. - **name** (*Optional*): Name to use for the alarm panel. Defaults to `Egardia`. - **report_server_enabled** (*Optional*): Enable reporting by server. Defaults to `False`. From da754f48b042dab03e8f0f55ec0840b24ca278ce Mon Sep 17 00:00:00 2001 From: ChristianKuehnel Date: Mon, 1 Jan 2018 14:38:09 +0100 Subject: [PATCH 31/60] Added documentation for completing/updating tasks (#4186) * Added documentation for completing/updating tasks * extended documentation with table and examples * fixed missing %} --- source/_components/remember_the_milk.markdown | 53 ++++++++++++++++++- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/source/_components/remember_the_milk.markdown b/source/_components/remember_the_milk.markdown index d4cc22fa10d..1c3169028b1 100644 --- a/source/_components/remember_the_milk.markdown +++ b/source/_components/remember_the_milk.markdown @@ -59,12 +59,61 @@ If the registration was successful, the Configuration panel will disappear from In the background Home Assistant downloaded a "token" from the Remember The Milk server which is stored in the `remember_the_milk.conf` file locally. So you only need to register once. After that the token is used to authenticate with the server. -## {% linkable_title Creating tasks %} +## {% linkable_title Creating/updating tasks with service ```create_task```%} -This component offers a new service domain ```remember_the_milk``` with the service ```create_task```. You can call this service with the argument ```name``` to create a new task in your Remember The Milk account. You can call this service from your usual automations. +This component offers a new service domain ```remember_the_milk``` with the services ```_create_task```. You can call this service with the argument ```name``` and the optional parameter ```id``` to create a new task in your Remember The Milk account. You can call this service from your usual automations. + +If you set an ```id``` and a task with that id exists already, the existing task is updated, rather than creating a new task. This way you can change the name of the task. If you do not set an ```id```, a new task is created with every call. If you're using this from an automation, you could use the name of your automation as id or the entity that triggered the task to be created. This way you can later on update or complete this task. The task creation supports the "smart syntax", so to create a task with the tag "from_hass" which is due today you can create a task with the name ```test task created in Home Assistant ^today #from_hass```. More info about the smart syntax is available on the [Remember The Milk documentation](https://www.rememberthemilk.com/help/answer/basics-smartadd-howdoiuse). +**Note:** +At the moment, smart syntax is *not* supported when updating tasks. All smart syntax commands are ignored during the update and will end up as normal text in the name of the task. + +|Service data attribute | Optional | Description | Example | +|-----------------------|----------|-------------|---------| +| name | no | Name of the new task, you can use the smart syntax here. | "do this ^today #from_hass" | +| id | yes | Identifier for the task you're creating, can be used to update or complete the task later on | "myid" | + +## {% linkable_title Completing tasks with service ```complete_task```%} + +Complete a tasks that was privously created from Home Assistant. You can not complete tasks that were created outside of Home Assistant. + +If you have created your task with an ```id```, calling ```_complete_task``` with the parameter ```id``` will then complete your task. + +|Service data attribute | Optional | Description | Example | +|-----------------------|----------|-------------|---------| +| id | no | Identifier that was defined when creating the task | "myid" | + +## {% linkable_title Automation example %} + +Here's an example for an automation that creates a new task whenever ```sensor.mysensor``` is ```on``` and completes it when the sensor reports ```off```. This way it reminds you to switch it off. By using the ```entity_id``` as id for the task, you can use the same rule also for multiple sensors. + + +```yaml +- id: mysensor_on + trigger: + platform: state + entity_id: sensor.mysensor + to: on + action: + - service: remember_the_milk.myaccount_create_task + data_template: + name: "Please switch of {{trigger.entity_id}}" + id: "{{trigger.entity_id}}" +- id: mysensor_off + trigger: + platform: state + entity_id: sensor.mysensor + to: off + action: + - service: remember_the_milk.myaccount_complete_task + data_template: + id: "{{trigger.entity_id}}" + +``` + + ## {% linkable_title Disclaimer %} This product uses the Remember The Milk API but is not endorsed or certified by Remember The Milk. From 943b2e311923ead807e5f1d12a9229c94d37b011 Mon Sep 17 00:00:00 2001 From: Kane610 Date: Mon, 1 Jan 2018 18:35:59 +0100 Subject: [PATCH 32/60] Add deCONZ component documentation (#3967) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Deconz hub documentation * Add binary sensor documentation * Add sensor documentation * Add light documentation * Improve description * Add information about HASS events from ZHASwitch buttonpresses * Added description about how entity id naming works * Added links to dresden elektronik, deconz and deconz rest api Added automation examples for a IKEA Trådfri dimmer and input number Added list of supported device types Added lists of verified to work devices Removed references to Axis component * Changed description of how to generate API key * Added information about configuration variables username and password * Updated lists of verified devices * Links from list of supported device to sub modules * Remove documentation for api_key_generation since functionality has been removed * Add documentation for configure service * Documentation for scenes * Bumped HASS release version to 0.59 * Added Xiaomi Aqara Smart Wireless Switch to list of verified to work devices * Added improved automation example by simonporter007 * Added information about deCONZ configurator * Fix raw code * Added more lights to supported list * Make description about entity id same in all types * Updated installation instructions * Added Dresden Elektroniks logo * Added Tseels verified to work devices * Bump ha_release string * Added information about groups Added additional verified lights * Link to information about switch not being an entity on main hub page * Improved information about switches not being normal entities * It should be api_key not api-key * Removed specifying deconz version * Bump version to 0.61 * Fix typos * Use configuration tags to describe configuration parameters * Fix martinhjelamares comments * Rename parameter service data attribute --- .../_components/binary_sensor.deconz.markdown | 33 ++++ source/_components/deconz.markdown | 148 ++++++++++++++++++ source/_components/light.deconz.markdown | 29 ++++ source/_components/scene.deconz.markdown | 18 +++ source/_components/sensor.deconz.markdown | 45 ++++++ source/images/supported_brands/deconz.jpeg | Bin 0 -> 12197 bytes 6 files changed, 273 insertions(+) create mode 100644 source/_components/binary_sensor.deconz.markdown create mode 100644 source/_components/deconz.markdown create mode 100644 source/_components/light.deconz.markdown create mode 100644 source/_components/scene.deconz.markdown create mode 100644 source/_components/sensor.deconz.markdown create mode 100644 source/images/supported_brands/deconz.jpeg diff --git a/source/_components/binary_sensor.deconz.markdown b/source/_components/binary_sensor.deconz.markdown new file mode 100644 index 00000000000..f06c89241bd --- /dev/null +++ b/source/_components/binary_sensor.deconz.markdown @@ -0,0 +1,33 @@ +--- +layout: page +title: "deCONZ Binary Sensor" +description: "Instructions on how to integrate Zigbee binary sensors from deCONZ into Home Assistant." +date: 2017-11-12 16:30 +sidebar: true +comments: false +sharing: true +footer: true +logo: deconz.jpeg +ha_category: Binary Sensor +ha_release: "0.61" +ha_iot_class: "Local Push" +--- + +See the [deCONZ main component](/components/deconz/) for configuration instructions. + +The following sensor types are supported: + + * Open/Close detection + * Presence detection + +Entity ids will be binary_sensor.device_name, where device_name is defined in deCONZ. + +#### {% linkable_title Verified to be supported binary sensors %} + +- Open/Close Detection + - Xiaomi Smart Home Security Door & Window Contact Sensor +- Presence Detection + - IKEA Trådfri Motion Sensor + - Philips Hue Motion Sensor + - Xiaomi Motion Sensor + - Xiaomi Smart Home Aqara Human Body Sensor diff --git a/source/_components/deconz.markdown b/source/_components/deconz.markdown new file mode 100644 index 00000000000..8d050e7d43d --- /dev/null +++ b/source/_components/deconz.markdown @@ -0,0 +1,148 @@ +--- +layout: page +title: "deCONZ" +description: "Instructions on how to setup Conbee/Raspbee devices with deCONZ from Dresden Elektronik within Home Assistant." +date: 2017-11-12 16:30 +sidebar: true +comments: false +sharing: true +footer: true +logo: deconz.jpeg +ha_category: Hub +ha_release: "0.61" +ha_iot_class: "Local Push" +--- + +[deCONZ](https://www.dresden-elektronik.de/funktechnik/products/software/pc/deconz/) by [Dresden Elektronik](https://www.dresden-elektronik.de) is a software that communicates with Conbee/Raspbee Zigbee gateways and exposes Zigbee devices that are connected to the gateway. + +[deCONZ REST API](http://dresden-elektronik.github.io/deconz-rest-doc/). + +Home Assistant will automatically discover deCONZ presence on your network, if `discovery:` is present in your `configuration.yaml` file. + +If you don't have the API key, you can generate an API key for deCONZ by using the one-click functionality similar to Philips Hue. Go to Menu->Settings->Unlock Gateway in deCONZ and then use the deCONZ configurator in Home Assistant GUI to create an API key. When you've generated the API key from Home Assistant, the API key will be stored in deconz.conf inside the home-assistant folder. + +You can add the following to your configuration.yaml file if you are not using the `discovery:` component: + +```yaml +# Example configuration.yaml entry +deconz: + host: IP ADDRESS +``` + +#### {% linkable_title Supported Device types %} + +- [Zigbee Lights](/components/light/deconz/) +- [Humidity Sensors](/components/sensor/deconz/) +- [Light Level Sensors](/components/sensor/deconz/) +- [OpenClose Detectors](/components/binary_sensor/deconz/) +- [Presence Detectors](/components/binary_sensor/deconz/) +- [Pressure Sensors](/components/sensor/deconz/) +- [Switches (Remote Controls)](/components/sensor/deconz/) +- [Temperature Sensors](/components/sensor/deconz/) + +{% configuration %} +host: + description: The IP address of your deCONZ web server. + required: false + type: string +api_key: + description: The API key to access your deCONZ web server. + required: false + type: string +port: + description: Configure port deCONZ web server is accessible from. + required: false + default: 80 + type: int +{% endconfiguration %} + +A full configuration could look like this: + +```yaml +# Example configuration.yaml entry +deconz: + host: 127.0.0.1 + api_key: 0123456789 + port: 80 +``` + +## {% linkable_title Device services %} +Available services: `configure`. + +#### {% linkable_title Service `deconz/configure` %} +Set attribute of device in Deconz using [Rest API](http://dresden-elektronik.github.io/deconz-rest-doc/rest/). + +| Service data attribute | Optional | Description | +|-----------|----------|-------------| +| `field` | No | String representing a specific device in deCONZ. | +| `data` | No | Data is a JSON object with what data you want to alter. | + +{ "field": "/lights/1", "data": {"name": "light2"} } + +{ "field": "/config", "data": {"permitjoin": 60} } + +## {% linkable_title Remote control devices%} + +Remote controls (ZHASwitch category) will be not be exposed as a regular entity, but as events named 'deconz_event' with a payload of 'id' and 'event'. Id will be the device name from deCONZ and Event will be the momentary state of the switch. However, a sensor entity will be created that shows the battery level of the switch as reported by deCONZ, named sensor.device_name_battery_level. + +Typical values for switches, the event codes are 4 numbers where the first and last number are of interest here. + +| Switch code | Description | +|-------------|-------------| +| 1XXX | Button #1 up to #8 | +| XXX1 | Button hold | +| XXX2 | Button short release | +| XXX3 | Button long release | + +Where for example on a Philips Hue Dimmer, 2001 would be holding the dim up button. + +## {% linkable_title Examples %} + +### {% linkable_title Step up and step down input number with wireless dimmer %} + +```yaml +automation: + - alias: 'Toggle lamp from dimmer' + initial_state: 'on' + trigger: + platform: event + event_type: deconz_event + event_data: + id: remote_control_1 + event: 1002 + action: + service: light.toggle + entity_id: light.lamp + + - alias: 'Increase brightness of lamp from dimmer' + initial_state: 'on' + trigger: + platform: event + event_type: deconz_event + event_data: + id: remote_control_1 + event: 2002 + action: + - service: light.turn_on + data_template: + entity_id: light.lamp + brightness: {% raw %}> + {% set bri = states.light.lamp.attributes.brightness | int %} + {{ [bri+30, 249] | min }}{% endraw %} + + - alias: 'Decrease brightness of lamp from dimmer' + initial_state: 'on' + trigger: + platform: event + event_type: deconz_event + event_data: + id: remote_control_1 + event: 3002 + action: + - service: light.turn_on + data_template: + entity_id: light.lamp + brightness: {% raw %}> + {% set bri = states.light.lamp.attributes.brightness | int %} + {{ [bri-30, 0] | max }}{% endraw %} +``` diff --git a/source/_components/light.deconz.markdown b/source/_components/light.deconz.markdown new file mode 100644 index 00000000000..7ee2d591950 --- /dev/null +++ b/source/_components/light.deconz.markdown @@ -0,0 +1,29 @@ +--- +layout: page +title: "deCONZ lights" +description: "Instructions on how to integrate Zigbee lights from deCONZ into Home Assistant." +date: 2017-11-12 16:30 +sidebar: true +comments: false +sharing: true +footer: true +logo: deconz.jpeg +ha_category: Light +ha_release: "0.61" +ha_iot_class: "Local Push" +--- + +See the [deCONZ main component](/components/deconz/) for configuration instructions. + +Entity Ids names will be light.device_name, where device_name is defined in deCONZ. Light groups created in deCONZ will be created in Home Assistant as lights named light.group_name_in_deconz, allowing the user to control groups of lights with only a single API call to deCONZ. + +#### {% linkable_title Verified to be supported sensors %} + +- IKEA Trådfri bulb E14 WS opal 400lm +- IKEA Trådfri Bulb E27 WS Opal 980lm +- IKEA Trådfri Bulb E27 WS Opal 1000lm +- IKEA Trådfri Bulb GU10 W 400lm +- OSRAM Flex RGBW +- OSRAM Gardenpole RGBW +- Philips Hue White A19 +- Philips Hue White Ambiance A19 diff --git a/source/_components/scene.deconz.markdown b/source/_components/scene.deconz.markdown new file mode 100644 index 00000000000..b5fdf7fa7fe --- /dev/null +++ b/source/_components/scene.deconz.markdown @@ -0,0 +1,18 @@ +--- +layout: page +title: "deCONZ scenes" +description: "Instructions on how to integrate deCONZ scenes into Home Assistant." +date: 2017-11-19 20:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: deconz.jpeg +ha_category: Scene +ha_release: "0.61" +ha_iot_class: "Local Push" +--- + +See the [deCONZ main component](/components/deconz/) for configuration instructions. + +Entity Ids will be scene.group_scene_name, where group is which group the scene belongs to and the name of the scene, both group and name are defined in deCONZ. \ No newline at end of file diff --git a/source/_components/sensor.deconz.markdown b/source/_components/sensor.deconz.markdown new file mode 100644 index 00000000000..6844c88d833 --- /dev/null +++ b/source/_components/sensor.deconz.markdown @@ -0,0 +1,45 @@ +--- +layout: page +title: deCONZ Sensor +description: "Instructions on how to integrate Zigbee sensors from deCONZ into Home Assistant." +date: 2017-11-12 16:30 +sidebar: true +comments: false +sharing: true +footer: true +logo: deconz.jpeg +ha_category: Sensor +ha_release: "0.61" +ha_iot_class: "Local Push" +--- + +See the [deCONZ main component](/components/deconz/) for configuration instructions. + +The following sensor types are supported: + + * Humidity sensor + * Light level sensor + * Pressure sensor + * Switches + * Temperature sensor + +Entity ids will be sensor.device_name, where device_name is defined in deCONZ. Switches aren't exposed as ordinary entities, see the [deCONZ main component](/components/deconz/) for more details. + +#### {% linkable_title Verified to be supported sensors %} + +- Humidity Sensor + - Xiaomi Aqara Humidity/Temperature Sensor + - Xiaomi MiJia Smart Temperature & Humidity Sensor +- Light Level Sensor +- Pressure Sensor +- Switches + - IKEA Trådfri Wireless Dimmer + - Philips Hue Motion Sensor + - IKEA Trådfri Remote + - Philips Hue Dimmer Switch + - Xiaomi Cube + - Xiaomi Aqara Smart Light Switch + - Xiaomi Aqara Smart Wireless Switch + - Xiaomi Smart Home Wireless Switch +- Temperature Sensor + - Xiaomi Temperature/Humidity Sensor diff --git a/source/images/supported_brands/deconz.jpeg b/source/images/supported_brands/deconz.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..6bd2e5373d78d218e61aa4c935dcf4640cb16931 GIT binary patch literal 12197 zcmeHtcUY52*Y}O6s3=&FE?8EOUZhE13n(lgy(bHiPAEYVnxJbzB{3odWNE7q1H^!o z&_You5fG3Lfq;|%p_kAJd_f=G`aIY3UhhBOAMfO1=G;@x`OTR#XBykx+n<5M271@@ z05&!NU}OD&?V(-2UAuG%eBI1M@7hmSz7*_w>J5Pg?3M=rsLxH9nf}F-Hnw&rIr@RU zz(HU?zz&>nf&}>ec>VfMz`qU4ojcqCpiO3n*T1dy&jp+}Tmm30fcsd*Y7jrzO%|=o zqKy$Z{dVZ5ESd-6?sS7ir?Y5j7z-ea{^jJzPr7}j zrFUrOuk=n|PD0#aP*xpp7X1U%JCKFpOW5hjK^GrOb5<(+)mEC78wdmdF09m*mG8p(d9!M; z!jA5DQULf}rva|#clfcoe9!;@_6%=tFG>OcM0>Ckr zt`FG%Z_B^xo5g#FKakc102ZMD@KYlIB>V~hVk~*w4%@xJC14Nx?%liD_pqWpd-m+* zIJl346}UM$_a8jMee~!N?juKz@e1=D;}JZ5yaqZ>c*u}vr-^Iqhd(YmZ97j$onjPai_2Wfn*vox9 zXB12=o&0}!7L(W7cKl9s?2Gq5Tr!8`zMJDcdtT{sKugt-xW$c|chd%UM1GOBBlKSa zzcSssZx08nRQw1Vuxm#M3&FoC>^k~I=8;nhrcUqXe#{*__F|g?9AsxzJi>ki&;c@a zgApBXcilevlBT8vhcm#{wc@kQ=z>KyWZJqn3isM6MXWBPFWW z4*a4p*^q~EhEQsA4Xx6u_}6R2v|fAh5Ir>&(65;yk&mjMJY-hhS<$}hXZ*Nn@|7#B*SGd_kV=V;AWG)m~#&Nf7pa~whcLG)5;+RAFu)p2w}Xysjm z{>|xc(3<-rZUHCA&;B!{-%EE3b3DD}{OwzdVwD=8KI>W?(z*?Zie4Iv2?a&0rTpTdG^}T*jH7b z{c_Q4GxFzFKk;NlJ?i-qb~E?d6s5?uL&gpX*|!8a+K7ik%{nq_<W%(8Z2Q!>Pp((*)OFvgM8h$6SvtcADNGt}W{h-Y z+n*hhO;t@zyMxnMajTX0P!C(oo;OT$)$)jtHVaiD^blEg#{XW+raIq~nrK1vR6w5T zK!SaLtR2?B96q44q8i{kX}_gB+$);I+y->HdOzO&?{Iys_08TmRz`kPSJzII&RVh0 zjrG>=f_b#bw9fNg$_$j%F&b_NUkj?$3H!N)(c@xWI)Fa(aGkCM5!8!DLiove{%E9! zpq>H}BJ$cK5I>ZapF(?wMf}FqF!w*f#q#wWY$KvJx7jxquCv^m zVVq+qp&#{dea0xnB@ZM&9w>_?)60T=2U7XTvq(V}@=Sz1V=!OTQ49&W+R6gM&l*rA z)S0Wbths5WAQFYDee!U%YOLw=441y$2q^q1xlmi@6Nk&ra`}g_%dl`+Y`X7AI)iXb z5-!z>nk<;H!jIQGD8#qyc6YSnJ}HQ)Zw(nOL8C;c=1)lx*INe%mtx9=qM_(JCWz{W zcDKgP`nq^(xz)REDehMpAI|OwAicIkAXQq8H*5iF4{hX&%c* z?Q56}2p}EIwbFez(r|0EHI`TyaHg4AbSS6tTxr~zAZ?dF-9v@2ZW~t_XJo}I*)TV9 zDYRY*DfJA)u+ z9?6x4a~jqETgQhl%2eGi=R<$Av+@O2`hprB8O!K^i1hj zkYTrf`@>LtBM*fkt9vWU0Ql!>S<~ltqc}2N+{bb_NbOrQT%Sh*v#;Rj2SXvl%(V~f zd7Ixven~?L%5^j>8Xxc`M@2}9g)foh$1v7x+S@}YAM0V z$V1&VEsNH6?5FpY3E>qC>Gx*Ox+t1=Cwd(CR>T6!wFl55|~QruqO_oCw4R_VSEIHsPF2BAr|%Mi~9el}-t z`*)0fE4&@O8xID!iqeNh8xntwKg;Do9!&}{WoCaqAQuQbW>Cn9`4|1AVTkyhb2yM7oNV2gk>O5L$x({_$ zz?_D)ztQpF0dhd|q5C?@#|26nc$w$YI-@v-d1O6%X(?c{{`}49TL|yb4Qt!CB$Tb; z3+)2gb;XG~I0X51ef=FX09=$X4j9pPv(|6L$6Ot#6wqsaoLm&w_R1bR%$=c*vlwPH zY3?{`$TkrEX04?l^Tr~$vL&}?0lN(lfB1bM|2Vtv{%dy6RI|r5OL&JG)`9aG zo%|^tvuIdFmq13T`p-7iY*@=U-Ya(7Pkvw;?`rB3D-`?0h+#DBY3+8vX~Gm;GHQ=D zsPLxKu9!aatb>%4Ex*bqDyx6?;x7|+aI9x&s^sVs4Yq+yHLsuljBA(HOS*p@4)GzK z6d!HedWpYQVGtPvIqc`&vg668mzpX+OlqRnp$zmqdRVlwNmqFG%YybVHb;$33gNi2 zz$_;xy*IgBf+IINwKxxNdB7pVOLse(K155rfu=Bpg^y10T1I#Bdo0Y9+)|r{`VisxC9ON@(+ssjlGA zjwc1dfx^;`m$+s`e6(I8LkmVrd`5zYB~=vp{cIiHEV#rF<@!35N{zQ3X(am;%zJ^w z!hK!A_Duwf+k5`3z(0Jc3nBEHyOxrm;y)3oFqn9i$j4B#_{76ERk+&Q5#i;B&hJW+ zN1L2xlomQswgF0~y}pk}DELZII$b45x~fW|AqO6Qp}yjRrb8-JOUG@Tm(eHb-$w{q zkn7ZJE!T-0T|F0j+RR(`=x^Vp`V(aui*D8#_rJ)dKaW3UFn@8z;*1==x#=^A2L9P5 z=Ma_b3A!JZzwu`GXREFf&+fuONwS>Etm8vbmkJj0ft5mdGbwob~( zzsxCwX)>94uk`Bk3@rX}P?1ODM1V#}_#(xYfy`Bv#lVOwFQhZ{z*ZH9uSQm%6{wB5 z?_twbWzbf;@f{dPs+34ANV(5D(XZTf#A|j^PLvvgBm9bTz**f-myNezP_h)GnYn2n3UIO z{`7d2-V>iJDtMZv`(5Op3HAx4*s-g%im_N({#tEwGnn|B;R1$^k83ZEp46>pJvp4u zE!Lrv*u-$pDSx6N)Z4QSO#9%x)@5ayg!!#f_EXVIDaf!?jTZNN21XBeS$t*BP4jBJ zVq00_@~J>}GV-OBdTm&U=3IR7MbOR796g=F+XX(x^7q};Tjfy~Chb-+%agPSclSUH z{sOE+F^vflH_+S$q}MC+lT(VqSNlj=Q)?V zTBkBpjOO;rGx&MHs{d@gXrOxUW`VDk#;^U3n^3DhkH*FruLoc|VeO)$g-4YNyJ!vG z6Urz8L{$80Iam@j={2ceHSxOfyehY8%@fdG7bNM}1T`NPgRFGq4{Yx(-O4Rm^hkI) zp*lAk>~M6vxfN|?%1E&4DZC<@TN0QXe!YtNJhwKre7eum;7tyWs~|jRKCH!|Ti|)Z zDtu8MCUaw$iq;|(;;!jgtVv?DbiXQ={Z55S)847xE(UVluQpr=;b9zXm-^V^hF0Cn zF?Yd!tLTiX5*nm$Fy7TMLBBCJ#HbJ-e5-rD&+bs*YfeqOSE)XhqqxeD=E`&Hrjz%EV`KS;sru^i-d>8dq4ErNekqVl~ zsGkt5weY4aoH98$W1Y{x+6OXQS&q*upcpVRqci$(jIgT>SUGj@?uZTn#LXEQd)P#N zI}w=)E|*0@M(oh83JcB|H7W)r*Jy_J)Bw_bl+>^Am|1hdzEW$Cv4(m^NJYFY_^u7` z+xLE5UDjrFEkE&vx5Ak3&4x&*fGW>ftVma~$TKx|`vu>6UR2q9khDQ@DW-UlT2&$& zk3Fzvx(!$wJ$K`f66aLxw>q&Arzm6igb!-ST4oZ(qDDe7p+b=*?v%|zh}8t8++??6 z<-yGX(U`e23edRj{nx(;XP1F3=Iit%w>WGHIjFm0B^-$c`e~lC@!X?m>?j^yM?2=- zO-(eH(r zYVKSd8zrx91A=fw)971DD13{MI*3$PA()l5l5}|7KP09)v?D}HqVW@m&{tR10zEqJ zg*_)XK2GDItxkqyhZD0#JVR10FTiFEQv!0RXjg5o>c1EwcSgMh=B$8Uy_T)Eu6xs^ zHRCwqKIn8+D3f*|0CJ;w>y=hQFk`7AB7D%vOVy{RlCuyeg>aIU3bzPo6ozl2Lg`;)yo$GCz45j~hy+uQ3{ zUZM(m@wz`fZ91xgc3|x=?iU`W#h|`JPlv#2v*mXY8#bJu^W&A|PW zBW0gy?CBwK7G@hzyA2fY4R<0*M)&KoM;_37R@KRxp=B@LMIQ)Og|x&Etzq@l9V%+3 ztE8a;8qk3f5G|hD+XfXujI>W|MfcrE6ED0F*>;;){=)N%(iox{inczh?&|q5jt?W zZH$Y~S<;!N)|OjSBWL}nK)||t`q6ZX#T%c+fHvNajlA_|k&9QdqT{OBSl7z{+dRzw zp45fT=zAW`c3ss6-%X)9v6-;@no*M4q(#f82Tp}2y%s-GqZ$I8Bjj9vR-1po8stdW&vY&OKh zW&vH8C(*eL6me_JFl`#HPZKx|dP^OYrq3Mhm(|p?z!?Otx`0oZC#YoU_$+W_j@VfFw zD*@1Sm*|4wdibm%dhyfr*%2y=WU=NV%NOmnA)w^x=If0zn=Y*v^wIJ<&{YE)(@V(_ zyt0z7vdr7vTU;u8(Bqx6)`hu6tC7vjhB5d%&cF8H+qcB5WW){TW0ROEuQDYp)KflQ zr|umrb=96{1v8K*DoTP`XE@-viyiX=s{o)cJ&*BZ>e0Wv)kqgG93~z zk#mJ_%9x-LH;hI{39+^vA!>^=-M1BVS&uqeG^eTOIorS?)>XxT-8QgadOftB+#}(W zKhlagQ`P9D*p8jlUwfD@{gxebnz=0Ai;`E}(=2K2tq0a)Im!B8KwCA!&k?E zDK*_~^#pbQoQ19Sx?IrPQ!Ekx7p<@fFpiu{muP%PRcTcaQ{)?*>__amdXWN%XnM|oX>6vX zfg)>#&bvx=X8SO+l3%7W1*JKn>0#=60#@5V!K!RqWBgpsgvqBbtL#7MgYCyq3F5ek zxKS_Mt+_AFq3mI6g=L65Gfb;(($vpai;ROh?%E=-#(lRY@AM)gySeV34Qued1b$sE zNqFsfY$id#T8%ck3=vgP7-t^8av|WY{a@v8Q7~pw@aVJ_t;qA=)A_OD>{WI0x49s(;CMQvJytd{2i`*&~~} ze7QXywBS56hWF{n3Z|UXzo+O?7KoTW5!R=Czs`?Bl2Z)a1`cckykG&-(qWKfKntVR z9ueY0*rimIKABJ`a|!R7H%t_LA$ty6tXb@f^fWJRFlyKa%28D-XL&jbJ=uOGZTX5u z70A6It>GdXhv(t<7kZh4qBN}jj=UQ=my ztt?#jQ^ot)(f@1nHywcEOk_!|OBMV!tqPNrB9ykA9Zb^p)l=$Hy$F?Jv-kvl0~WAW z${(~eR?<8Mm!L=R`gL8n+W%`!7Ug4~fJKpAfEBNrcWc2^*WJie`sqB@6@kRfbV}US zm92%2q9=HVM!j22)tdaPpW-i8NBruTc}BPJua?Yu8%EXn;MO5AR6dQAGRqoNW@m-P z;3rIYfhSq!(3D-LR&J597H=SZaHN)Tfj0QLM0B&N^G4$FCU%tW4!8TThN1|H(Vf&s zu2i>pv|T5d4PeMg@E=KT5)x?7K0APGUmCuAXx%<(ntHz%7VEa(U(a;m#-Ua< z`(q9dMks>t`~z)Kr#m#T5+hB?0^~`v?8!$z?{GZ1`DU7XxzYn%o9mOBt`I!y)IgMz z6jjRH3<}@xzUamDp+>^{^Q{HaQ;B91 zRMaCqQII2VRCibmw4CHaogy9X2ow#s&O6n-uj^xExoB527z26Ph!SMF%BSOqmg`=-E>-bLa5-5{>sBATTI{C58b6&~!mq5P8#)TF1`wa=tdB`8*4SR#A zoMqd9++*;y-}`TzD_>-8C~QR&IZcSx z4(i*&L^V@ZaH2g`;EuEF)%F3_b)S}|WWZdY=}5RLWDK4*Ua!U5&`U`XBc=^abe|v2 z#rVWKfm3V1aVZOm-KDx;Pj-tgL){;%NslnDeBPk@PVhc@vw$9mDPWFijEv4#&Z@6= zL0qki#iK&=nSEvB>jUc8zONJ7b(prjem`@H zVEAAgIL_2&V5h^f^xuJ191~8>T>gV0u}H3zo=;0!HTd4vf}~(@9cg4u9*vPOtb3?k zSa?5U#>l5O21^FRYiYDi8*T$4;&-1h zqwnM~?1t?Ka$}&;I4cuwP~{#?irCfI#KXHY0FHRGch&80qI=muIDhD~UKX!>0h{c|Lr+6jv7uUZuS(x#-K#hhrk z7He;T2{-6?GJ6p|)6_nEuIcDttjkDU9Z#ja;M+fU@#_~GVnd)P5IO>)2o#m7s^xqR zSjBgiaE~(0RxR$f;6`tJcI|1ZB1zfuFQR(Q(RPYx0|}v6yNbgmNTWd!5)w=n~(X|CB8YclOB*xu47 ziPy&5`!*fh5~xU0XAqcN6i?tI3A;Y&VjE#`+geWgQ-uB=Z zo_#?O{gQ<5xA`CX3Ozox1)Fvf>?a&a!VlNYQQ~rTW?pfY%a;ulX(rdxT?Vmup7{31 zFO%?ZdH->k0KjNXq(8r>_nE3(y;+;$D%AB-eowNt4YOY?hg|M;x?0XAN!C8eL(N!u zEIku^g5M=LR77A@_(u&} zb<2ruV4*8`&^EXwUI+g^XDLN@X)2`2&N%08!U6MlhAo(cu37Wd?Dwh1P8h}4~r7Cc^+mEZ~9zB_<#=* z4<_rFL}IQ{F+JpQa@wSLV(8OkVx&!9$6|iqh1zn1(EC|T*7L4w&+D-$R17BOptm8P zZ+}v;lV|%`2?LO~bH0l2>BL0q&y}yO1XZL<9lAmgG=?TP+k#;yr29$9h>Pss!YFe% zw`lf^kP%=2iY;FYFS1pUd^A;IvfR{mU+R^UKW%QVL3YJ>sv3Z_lD^ixOrE zudyIcQ)IAi=b4;YBd|3RD`hKibjB>l{ueF&kle@2W!>3x?)D%%5t)INCz<;%y<=LY zhQOHN{B29iwir`m-G66dqNcGgSi9_47m-*Oz7L1ae~38usjv7*OQ3zht9&#U63;r+ z90&%bdMz&(L-hpSHPpTRn4b_CPD4f=LryzJvYbO~yYN#OI*K$$zng3iSH>%>7=|y& z=@)S?zC6oY1Nk@aTdaw?FXx;+$+(AdoN6d*k-Qc_<`a2F2c#3ao>~pw#M$Ls_Rj&NhoJm`|LL8!W zWW*%J@%hfCUDjRZ_7|VIwXt_=9QUNqb+6M8!@y_P7fA zV5Ne7r4}#U8oxm%a%&8t*Rjvvcgj-p!w*Gc>Jt|y(XI@drv&a4xcRtb>s)uR>- zL&VdB1Qy17Ned?VavFHK7_vZ=cPaU!SB-Iq_Osvq2?!hSKrh*#hoY2E6vC8*gqf0S z@0B93Tc)cnLt9*`5`9>@hI;k9w3Wd6$F!NC_ISOnWO#*b#GPuX&#!k!oU9 zpJHq@a3Uo4+f94OO7?h%Du}3MXhz!6l?e7B+<9;p>)#6hQ^;GBr$H=xPc#^J1TD#k zXz!~^rFxrxjK_$ofbdtQ38B~e)Nh_=cuxigEsTy0<`^8Gs!!Q;SH+N!P;zFN8|Icl4b>iB^mWe11=_`@h#I*(51>i=0F5< zFuKn#Q}&!w&zv2)LAE2@_B0-8?nV!p?u%Ni3`fX1CKcl@G(0wo_cZy)^Y*Wx{`$=( z-6Q;)4-{)>-RtJ~3e4 z?=_we+D{ZJ#0m5!Ul>;FO2MRYl6vhCGe$)1TS8WqC@xtE+o541_=W6a$zBzN!pE0| zWVxp~hX{4)2FeS0^7!Tn!})M*Y7wHgqfZH`lpMfI>#=^I;wC!=&tsfzl-x=$sy7Bc zeTNHEX4bqIhi|;f#XAk&3?3FL^0?N}g07TnC#dSkuJfJ{cf0tmGRqNN9x_`@VUR4> z3-(msn+2H_vaSgmY%jDoG@|cPo+oQ0Z6R3u`ji!4iBOV1!q8SdDcAq(=jFl^p|KZ8 ziVJu~`UA<#yblAKZ+skUgq{~4Wpdw@J6%0VbrX$?h`evVIB)$}w-Y$`9oc^-t}bt_ zP)kpoI&t2yk?48C-n@kBv~yy`g~-Wipar9!WWMrPzbDZdtM_Kwyzv(AO|c>6d)FrLMuj^uvj^ma~o}yRl9@8WY9L(Z*%Es!<8iO-niMf6* z=cs+p&0a_34v|(QEW9jeUG5Mo|LWTIMZC!C7oPI>Dhi6rt=xso8gMqWZNR*w`GmM` zP3>ZyPyOs1`T#d!A+dZZ95o#wR+C*TuAFLjLXs(Qs>+kxQP(s=(}=;;H4r2WADe~U S)&0-P{lC)xwFWr0d;TB&{nn%a literal 0 HcmV?d00001 From 5d321e66f73716d1f3cc05b2cac01a9752735772 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Tue, 2 Jan 2018 02:33:19 +0000 Subject: [PATCH 33/60] Update MQTT platforms that now support availablity (#4293) To accompany changes from: https://github.com/home-assistant/home-assistant/pull/11336 Updated platforms: - Switch (previously supported) - Binary sensor (previously supported) - Cover (previously supported) - Light - JSON light - Template light - Sensor - Alarm control panel - Lock - HVAC - Fan - Vacuum --- .../alarm_control_panel.mqtt.markdown | 64 +++++-- .../_components/binary_sensor.mqtt.markdown | 60 ++++-- source/_components/climate.mqtt.markdown | 143 +++++++++++--- source/_components/cover.mqtt.markdown | 148 +++++++++++--- source/_components/fan.mqtt.markdown | 135 ++++++++++--- source/_components/light.mqtt.markdown | 180 ++++++++++++++---- source/_components/light.mqtt_json.markdown | 105 ++++++++-- .../_components/light.mqtt_template.markdown | 101 ++++++++-- source/_components/lock.mqtt.markdown | 73 +++++-- source/_components/sensor.mqtt.markdown | 15 +- source/_components/switch.mqtt.markdown | 72 +++++-- source/_components/vacuum.mqtt.markdown | 157 ++++++++++++--- 12 files changed, 1024 insertions(+), 229 deletions(-) diff --git a/source/_components/alarm_control_panel.mqtt.markdown b/source/_components/alarm_control_panel.mqtt.markdown index 7e6feaa7a2e..199ebacaee1 100644 --- a/source/_components/alarm_control_panel.mqtt.markdown +++ b/source/_components/alarm_control_panel.mqtt.markdown @@ -35,14 +35,56 @@ alarm_control_panel: command_topic: "home/alarm/set" ``` -Configuration variables: - -- **state_topic** (*Required*): The MQTT topic subscribed to receive state updates. -- **command_topic** (*Required*): The MQTT topic to publish commands to change the alarm state. -- **name** (*Optional*): The name of the alarm. Default is 'MQTT Alarm'. -- **qos** (*Optional*): The maximum QoS level of the state topic. Default is 0. This QoS will also be used to publishing messages. -- **payload_disarm** (*Optional*): The payload to disarm your Alarm Panel. Default is "DISARM". -- **payload_arm_home** (*Optional*): The payload to set armed-home mode on your Alarm Panel. Default is "ARM_HOME". -- **payload_arm_away** (*Optional*): The payload to set armed-away mode on your Alarm Panel. Default is "ARM_AWAY". -- **code** (*Optional*): If defined, specifies a code to enable or disable the alarm in the frontend. - +{% configuration %} +name: + description: The name of the alarm. + required: false + type: string + default: MQTT Alarm +state_topic: + description: The MQTT topic subscribed to receive state updates. + required: true + type: string +command_topic: + description: The MQTT topic to publish commands to change the alarm state. + required: true + type: string +qos: + description: The maximum QoS level of the state topic. + required: false + type: integer + default: 0 +payload_disarm: + description: The payload to disarm your Alarm Panel. + required: false + type: string + default: DISARM +payload_arm_home: + description: The payload to set armed-home mode on your Alarm Panel. + required: false + type: string + default: ARM_HOME +payload_arm_away: + description: The payload to set armed-away mode on your Alarm Panel. + required: false + type: string + default: ARM_AWAY +code: + description: If defined, specifies a code to enable or disable the alarm in the frontend. + required: false + type: string +availability_topic: + description: The MQTT topic subscribed to receive availability (online/offline) updates. + required: false + type: string +payload_available: + description: The payload that represents the available state. + required: false + type: string + default: online +payload_not_available: + description: The payload that represents the unavailable state. + required: false + type: string + default: offline +{% endconfiguration %} diff --git a/source/_components/binary_sensor.mqtt.markdown b/source/_components/binary_sensor.mqtt.markdown index 3b1ff864534..65058598382 100644 --- a/source/_components/binary_sensor.mqtt.markdown +++ b/source/_components/binary_sensor.mqtt.markdown @@ -29,18 +29,54 @@ binary_sensor: state_topic: "home-assistant/window/contact" ``` -Configuration variables: - -- **name** (*Optional*): The name of the binary sensor. Default is `MQTT Binary Sensor`. -- **state_topic** (*Required*): The MQTT topic subscribed to receive sensor values. -- **payload_on** (*Optional*): The payload that represents the on state. Default is `ON`. -- **payload_off** (*Optional*): The payload that represents the off state. Default is `OFF`. -- **availability_topic** (*Optional*): The MQTT topic subscribed to receive birth and LWT messages from the MQTT device. If `availability_topic` is not defined, the binary sensor availability state will always be `available`. If `availability_topic` is defined, the binary sensor availability state will be `unavailable` by default. -- **payload_available** (*Optional*): The payload that represents the online state. Default is `online`. -- **payload_not_available** (*Optional*): The payload that represents the offline state. Default is `offline`. -- **qos** (*Optional*): The maximum QoS level to be used when receiving messages. Default is `0`. -- **device_class** (*Optional*): The [type/class](/components/binary_sensor/) of the sensor to set the icon in the frontend. -- **value_template** (*Optional*): Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract a value from the payload. +{% configuration %} +name: + description: The name of the binary sensor. + required: false + type: string + default: MQTT Binary Sensor +state_topic: + description: The MQTT topic subscribed to receive sensor values. + required: true + type: string +payload_on: + description: The payload that represents the on state. + required: false + type: string + default: ON +payload_off: + description: The payload that represents the off state. + required: false + type: string + default: OFF +availability_topic: + description: "The MQTT topic subscribed to receive birth and LWT messages from the MQTT device. If `availability_topic` is not defined, the binary sensor availability state will always be `available`. If `availability_topic` is defined, the binary sensor availability state will be `unavailable` by default." + required: false + type: string +payload_available: + description: The payload that represents the online state. + required: false + type: string + default: online +payload_not_available: + description: The payload that represents the offline state. + required: false + type: string + default: offline +qos: + description: The maximum QoS level to be used when receiving messages. + required: false + type: integer + default: 0 +device_class: + description: "The [type/class](/components/binary_sensor/) of the sensor to set the icon in the frontend." + required: false + type: string +value_template: + description: "Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract a value from the payload." + required: false + type: string +{% endconfiguration %} To test, you can use the command line tool `mosquitto_pub` shipped with `mosquitto` or the `mosquitto-clients` package to send MQTT messages. To set the state of the binary sensor manually: diff --git a/source/_components/climate.mqtt.markdown b/source/_components/climate.mqtt.markdown index 7d624b4d9a9..3713b1274c4 100644 --- a/source/_components/climate.mqtt.markdown +++ b/source/_components/climate.mqtt.markdown @@ -28,34 +28,121 @@ climate: temperature_command_topic: /sensors/hvac_study/target_temp ``` -Configuration variables *except* for MQTT topics: - -- **name** (*Required*): Name of MQTT HVAC. -- **qos** (*Optional*): The maximum QoS level of the state topic. Default is `0` and will also be used to publishing messages. -- **retain** (*Optional*): If the published message should have the retain flag on or not. -- **send_if_off** (*Optional*): Set to `false` to suppress sending of all MQTT messages when the current mode is `Off`. Defaults to `true`. -- **initial** (*Optional*): Set the initial target temperature. Defaults to 21 degrees. -- **payload_on** (*Optional*): For MQTT topics that control an `on` / `off` value (e.g., `aux_command_topic`), set the value that should be sent for `on`. Defaults to 'ON'. -- **payload_off** (*Optional*): For MQTT topics that control an `on` / `off` value (e.g., `aux_command_topic`), set the value that should be sent for `off`. Defaults to 'OFF'. - -Configuration of the MQTT topics: - -- **current_temperature_topic** (*Optional*): The MQTT topic on which to listen for the current temperature -- **power_command_topic** (*Optional*): The MQTT topic to publish commands to change the power state. This is useful if your device has a separate power toggle in addition to mode. -- **mode_command_topic** (*Optional*): The MQTT topic to publish commands to change the HVAC operation mode. -- **mode_state_topic** (*Optional*): The MQTT topic to subscribe for changes of the HVAC operation mode. If this is not set, the operation mode works in optimistic mode (see below). -- **temperature_command_topic** (*Optional*): The MQTT topic to publish commands to change the target temperature. -- **temperature_state_topic** (*Optional*): The MQTT topic to subscribe for changes in the target temperature. If this is not set, the target temperature works in optimistic mode (see below). -- **fan_mode_command_topic** (*Optional*): The MQTT topic to publish commands to change the fan mode. -- **fan_mode_state_topic** (*Optional*): The MQTT topic to subscribe for changes of the HVAC fan mode. If this is not set, the fan mode works in optimistic mode (see below). -- **swing_mode_command_topic** (*Optional*): The MQTT topic to publish commands to change the swing mode. -- **swing_mode_state_topic** (*Optional*): The MQTT topic to subscribe for changes of the HVAC swing mode. If this is not set, the swing mode works in optimistic mode (see below). -- **away_mode_command_topic** (*Optional*): The MQTT topic to publish commands to change the away mode. -- **away_mode_state_topic** (*Optional*): The MQTT topic to subscribe for changes of the HVAC away mode. If this is not set, the away mode works in optimistic mode (see below). -- **hold_command_topic** (*Optional*): The MQTT topic to publish commands to change the hold mode. -- **hold_state_topic** (*Optional*): The MQTT topic to subscribe for changes of the HVAC hold mode. If this is not set, the hold mode works in optimistic mode (see below). -- **aux_command_topic** (*Optional*): The MQTT topic to publish commands to switch auxiliary heat. -- **aux_state_topic** (*Optional*): The MQTT topic to subscribe for changes of the auxiliary heat mode. If this is not set, the auxiliary heat mode works in optimistic mode (see below). +{% configuration %} +name: + description: The name of the HVAC. + required: false + type: string + default: MQTT HVAC +qos: + description: The maximum QoS level to be used when receiving and publishing messages. + required: false + type: integer + default: 0 +retain: + description: Defines if published messages should have the retain flag set. + required: false + type: boolean + default: false +send_if_off: + description: "Set to `false` to suppress sending of all MQTT messages when the current mode is `Off`." + required: false + type: boolean + default: true +initial: + description: Set the initial target temperature. + required: false + type: number + default: 21 +payload_on: + description: The payload that represents enabled state. + required: false + type: string + default: ON +payload_off: + description: The payload that represents disabled state. + required: false + type: string + default: OFF +availability_topic: + description: The MQTT topic subscribed to receive availability (online/offline) updates. + required: false + type: string +payload_available: + description: The payload that represents the available state. + required: false + type: string + default: online +payload_not_available: + description: The payload that represents the unavailable state. + required: false + type: string + default: offline +current_temperature_topic: + description: The MQTT topic on which to listen for the current temperature. + required: false + type: string +power_command_topic: + description: The MQTT topic to publish commands to change the power state. This is useful if your device has a separate power toggle in addition to mode. + required: false + type: string +mode_command_topic: + description: The MQTT topic to publish commands to change the HVAC operation mode. + required: false + type: string +mode_state_topic: + description: The MQTT topic to subscribe for changes of the HVAC operation mode. If this is not set, the operation mode works in optimistic mode (see below). + required: false + type: string +temperature_command_topic: + description: The MQTT topic to publish commands to change the target temperature. + required: false + type: string +temperature_state_topic: + description: The MQTT topic to subscribe for changes in the target temperature. If this is not set, the target temperature works in optimistic mode (see below). + required: false + type: string +fan_mode_command_topic: + description: The MQTT topic to publish commands to change the fan mode. + required: false + type: string +fan_mode_state_topic: + description: The MQTT topic to subscribe for changes of the HVAC fan mode. If this is not set, the fan mode works in optimistic mode (see below). + required: false + type: string +swing_mode_command_topic: + description: The MQTT topic to publish commands to change the swing mode. + required: false + type: string +swing_mode_state_topic: + description: The MQTT topic to subscribe for changes of the HVAC swing mode. If this is not set, the swing mode works in optimistic mode (see below). + required: false + type: string +away_mode_command_topic: + description: The MQTT topic to publish commands to change the away mode. + required: false + type: string +away_mode_state_topic: + description: The MQTT topic to subscribe for changes of the HVAC away mode. If this is not set, the away mode works in optimistic mode (see below). + required: false + type: string +hold_command_topic: + description: The MQTT topic to publish commands to change the hold mode. + required: false + type: string +hold_state_topic: + description: The MQTT topic to subscribe for changes of the HVAC hold mode. If this is not set, the hold mode works in optimistic mode (see below). + required: false + type: string +aux_command_topic: + description: The MQTT topic to publish commands to switch auxiliary heat. + required: false + type: string +aux_state_topic: + description: The MQTT topic to subscribe for changes of the auxiliary heat mode. If this is not set, the auxiliary heat mode works in optimistic mode (see below). + required: false + type: string +{% endconfiguration %} #### Optimistic mode diff --git a/source/_components/cover.mqtt.markdown b/source/_components/cover.mqtt.markdown index e466514cadd..94cc013f787 100755 --- a/source/_components/cover.mqtt.markdown +++ b/source/_components/cover.mqtt.markdown @@ -35,33 +35,125 @@ cover: command_topic: "home-assistant/cover/set" ``` -Configuration variables: - -- **name** (*Optional*): The name of the sensor. Default is `MQTT Cover`. -- **command_topic** (*Optional*): The MQTT topic to publish commands to control the cover. -- **payload_open** (*Optional*): The payload that opens the cover. Default is `OPEN`. -- **payload_close** (*Optional*): The payload that closes the cover. Default is `CLOSE`. -- **payload_stop** (*Optional*): The payload that stops the cover. default is `STOP`. -- **state_topic** (*Optional*): The MQTT topic subscribed to receive cover state messages. -- **state_open** (*Optional*): The payload that represents the open state. Default is `open`. -- **state_closed** (*Optional*): The payload that represents the closed state. Default is `closed`. -- **availability_topic** (*Optional*): The MQTT topic subscribed to to receive birth and LWT messages from the MQTT cover device. If `availability_topic` is not defined, the cover availability state will always be "available". If `availability_topic` is defined, the cover availability state will be "unavailable" by default. -- **payload_available** (*Optional*): The payload that represents the online state. Default is `online`. -- **payload_not_available** (*Optional*): The payload that represents the offline state. Default is `offline`. -- **optimistic** (*Optional*): Flag that defines if switch works in optimistic mode. Default is `true` if no state topic defined, else `false`. -- **qos** (*Optional*): The maximum QoS level to be used when receiving and publishing messages. Default is `0`. -- **retain** (*Optional*): Defines if published messages should have the retain flag set. Default is `false`. -- **value_template** (*Optional*): Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract a value from the payload. -- **set_position_topic** (*Optional*): The MQTT topic to publish position commands to. -- **set_position_template** (*Optional*): Defines a [template](/topics/templating/) to define the position to be sent to the `set_position_topic` topic. Incoming position value is available for use in the template `{{position}}`. If no template is defined, the numeric position (0-100) will be written directly to the topic. -- **tilt_command_topic** (*Optional*): The MQTT topic to publish commands to control the cover tilt. -- **tilt_status_topic** (*Optional*): The MQTT topic subscribed to receive tilt status update values. -- **tilt_min** (*Optional*): The minimum tilt value. Default is `0` -- **tilt_max** (*Optional*): The maximum tilt value. Default is `100` -- **tilt_closed_value** (*Optional*): The value that will be sent on a `close_cover_tilt` command. Default is `0` -- **tilt_opened_value** (*Optional*): The value that will be sent on an `open_cover_tilt` command. Default is `100` -- **tilt_status_optimistic** (*Optional*): Flag that determines if tilt works in optimistic mode. Default is `true` if `tilt_status_topic` is not defined, else `false` -- **tilt_invert_state** (*Optional*): Flag that determines if open/close are flipped; higher values toward closed and lower values toward open. Default is `False` +{% configuration %} +name: + description: The name of the cover. + required: false + type: string + default: MQTT Cover +command_topic: + description: The MQTT topic to publish commands to control the cover. + required: false + type: string +payload_open: + description: The command payload that opens the cover. + required: false + type: string + default: OPEN +payload_close: + description: The command payload that closes the cover. + required: false + type: string + default: CLOSE +payload_stop: + description: The command payload that stops the cover. + required: false + type: string + default: STOP +state_topic: + description: The MQTT topic subscribed to receive cover state messages. + required: false + type: string +state_open: + description: The payload that represents the open state. + required: false + type: string + default: open +state_closed: + description: The payload that represents the closed state. + required: false + type: string + default: closed +availability_topic: + description: "The MQTT topic subscribed to to receive birth and LWT messages from the MQTT cover device. If `availability_topic` is not defined, the cover availability state will always be `available`. If `availability_topic` is defined, the cover availability state will be `unavailable` by default." + required: false + type: string +payload_available: + description: The payload that represents the online state. + required: false + type: string + default: online +payload_not_available: + description: The payload that represents the offline state. + required: false + type: string + default: offline +optimistic: + description: Flag that defines if switch works in optimistic mode. + required: false + type: string + default: "`true` if no state topic defined, else `false`." +qos: + description: The maximum QoS level to be used when receiving and publishing messages. + required: false + type: integer + default: 0 +retain: + description: Defines if published messages should have the retain flag set. + required: false + type: boolean + default: false +value_template: + description: "Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract a value from the payload." + required: false + type: string +set_position_topic: + description: The MQTT topic to publish position commands to. + required: false + type: string +set_position_template: + description: " Defines a [template](/topics/templating/) to define the position to be sent to the `set_position_topic` topic. Incoming position value is available for use in the template `{{position}}`. If no template is defined, the numeric position (0-100) will be written directly to the topic." + required: false + type: string +tilt_command_topic: + description: The MQTT topic to publish commands to control the cover tilt. + required: false + type: string +tilt_status_topic: + description: The MQTT topic subscribed to receive tilt status update values. + required: false + type: string +tilt_min: + description: The minimum tilt value. + required: false + type: integer + default: 0 +tilt_max: + description: The maximum tilt value + required: false + type: integer + default: 100 +tilt_closed_value: + description: The value that will be sent on an `close_cover_tilt` command. + required: false + type: integer + default: 0 +tilt_opened_value: + description: The value that will be sent on an `open_cover_tilt` command. + required: false + type: integer + default: 0 +tilt_status_optimistic: + description: Flag that determines if tilt works in optimistic mode. + required: false + type: boolean + default: "`true` if `tilt_status_topic` is not defined, else `false`" +tilt_invert_state: + description: Flag that determines if open/close are flipped; higher values toward closed and lower values toward open. + required: false + type: boolean + default: false +{% endconfiguration %} ## {% linkable_title Examples %} @@ -78,7 +170,7 @@ cover: name: "MQTT Cover" command_topic: "home-assistant/cover/set" state_topic: "home-assistant/cover/state" - availability_topic: "home-assistant/cover/availability" + availability_topic: "home-assistant/cover/availability" qos: 0 retain: true payload_open: "OPEN" diff --git a/source/_components/fan.mqtt.markdown b/source/_components/fan.mqtt.markdown index 82c5193ba30..1a0329404f8 100644 --- a/source/_components/fan.mqtt.markdown +++ b/source/_components/fan.mqtt.markdown @@ -30,30 +30,117 @@ fan: command_topic: "bedroom_fan/on/set" ``` -Configuration variables: - -- **command_topic** (*Required*): The MQTT topic to publish commands to change the fan state. -- **state_topic** (*Optional*): The MQTT topic subscribed to receive state updates. -- **name** (*Optional*): The name of the fan. Default is 'MQTT Fan'. -- **state_topic** (*Optional*): The MQTT topic subscribed to receive state updates. -- **payload_on** (*Optional*): The payload that represents the running state. Default is "ON". -- **payload_off** (*Optional*): The payload that represents the stop state. Default is "OFF". -- **state_value_template** (*Optional*): Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract a value from the state. -- **qos** (*Optional*): The maximum QoS level of the state topic. Default is 0 and will also be used to publishing messages. -- **optimistic** (*Optional*): Flag that defines if lock works in optimistic mode. Default is `true` if no state topic defined, else `false`. -- **retain** (*Optional*): If the published message should have the retain flag on or not. -- **oscillation_state_topic** (*Optional*): The MQTT topic subscribed to receive oscillation state updates. -- **oscillation_command_topic** (*Optional*): The MQTT topic to publish commands to change the oscillation state. -- **payload_oscillation_on** (*Optional*): The payload that represents the oscillation on state. Default is "oscillate_on". -- **payload_oscillation_off** (*Optional*): The payload that presents the oscillation off state. Default is "oscillate_off". -- **oscillation_value_template** (*Optional*): Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract a value from the oscillation. -- **speed_state_topic** (*Optional*): The MQTT topic subscribed to receive speed state updates. -- **speed_command_topic** (*Optional*): The MQTT topic to publish commands to change speed state. -- **payload_low_speed** (*Optional*): The payload that represents the fan's low speed. -- **payload_medium_speed** (*Optional*): The payload that represents the fan's medium speed. -- **payload_high_speed** (*Optional*): The payload that represents the fan's high speed. -- **speed_value_template** (*Optional*): Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract a value from the speed payload. -- **speeds** array (*Optional*): Valid entries for the list are `off`, `low`, `medium`, and `high`. +{% configuration %} +name: + description: The name of the fan. + required: false + type: string + default: MQTT Fan +command_topic: + description: The MQTT topic to publish commands to change the fan state. + required: true + type: string +state_topic: + description: The MQTT topic subscribed to receive state updates. + required: false + type: string +payload_on: + description: The payload that represents the running state. + required: false + type: string + default: ON +payload_off: + description: The payload that represents the stop state. + required: false + type: string + default: OFF +state_value_template: + description: "Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract a value from the state." + required: false + type: string +qos: + description: The maximum QoS level of the state topic. + required: false + type: integer + default: 0 +optimistic: + description: Flag that defines if lock works in optimistic mode + required: false + type: boolean + default: "`true` if no state topic defined, else `false`." +retain: + description: If the published message should have the retain flag on or not. + required: false + type: boolean + default: true +oscillation_state_topic: + description: The MQTT topic subscribed to receive oscillation state updates. + required: false + type: string +oscillation_command_topic: + description: The MQTT topic to publish commands to change the oscillation state. + required: false + type: string +payload_oscillation_on: + description: The payload that represents the oscillation on state. + required: false + type: string + default: oscillate_on +payload_oscillation_off: + description: The payload that represents the oscillation off state. + required: false + type: string + default: oscillate_off +oscillation_value_template: + description: "Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract a value from the oscillation." + required: false + type: string +speed_state_topic: + description: The MQTT topic subscribed to receive speed state updates. + required: false + type: string +speed_command_topic: + description: The MQTT topic to publish commands to change speed state. + required: false + type: string +payload_low_speed: + description: The payload that represents the fan's low speed. + required: false + type: string + default: low +payload_medium_speed: + description: The payload that represents the fan's medium speed. + required: false + type: string + default: medium +payload_high_speed: + description: The payload that represents the fan's high speed. + required: false + type: string + default: high +speed_value_template: + description: "Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract a value from the speed payload." + required: false + type: string +speeds: + description: "List of speeds this fan is capable of running at. Valid entries are `off`, `low`, `medium`, and `high`." + required: false + type: string list +availability_topic: + description: The MQTT topic subscribed to receive availability (online/offline) updates. + required: false + type: string +payload_available: + description: The payload that represents the available state. + required: false + type: string + default: online +payload_not_available: + description: The payload that represents the unavailable state. + required: false + type: string + default: offline +{% endconfiguration %}

Make sure that your topics match exactly. `some-topic/` and `some-topic` are different topics. diff --git a/source/_components/light.mqtt.markdown b/source/_components/light.mqtt.markdown index ba3041dde38..33f76eb5cc1 100644 --- a/source/_components/light.mqtt.markdown +++ b/source/_components/light.mqtt.markdown @@ -27,39 +27,153 @@ light: command_topic: "office/rgb1/light/switch" ``` -Configuration variables: - -- **command_topic** (*Required*): The MQTT topic to publish commands to change the switch state. -- **brightness_command_topic** (*Optional*): The MQTT topic to publish commands to change the light's brightness. -- **brightness_scale** (*Optional*): Defines the maximum brightness value (i.e. 100%) of the MQTT device (defaults to 255). -- **brightness_state_topic** (*Optional*): The MQTT topic subscribed to receive brightness state updates. -- **brightness_value_template** (*Optional*): Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract the brightness value. -- **color_temp_command_topic** (*Optional*): The MQTT topic to publish commands to change the light's color temperature state. The color temperature command slider has a range of 157 to 500 mireds (micro reciprocal degrees). -- **color_temp_state_topic** (*Optional*): The MQTT topic subscribed to receive color temperature state updates. -- **color_temp_value_template** (*Optional*): Defines a [template](/topics/templating/) to extract the color temperature value. -- **effect_command_topic** (*Optional*): The MQTT topic to publish commands to change the light's effect state. -- **effect_state_topic** (*Optional*): The MQTT topic subscribed to receive effect state updates. -- **effect_value_template** (*Optional*): Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract the effect value. -- **effect_list** (*Optional*): The list of effects the light supports. -- **name** (*Optional*): The name of the switch. Default is 'MQTT Switch'. -- **on_command_type** (*Optional*): Defines when on the payload_on is sent. Using `last` (the default) will send any style (brightness, color, etc) topics first and then a `payload_on` to the `command_topic`. Using `first` will send the `payload_on` and then any style topics. Using `brightness` will only send brightness commands instead of the `payload_on` to turn the light on. -- **optimistic** (*Optional*): Flag that defines if switch works in optimistic mode. Default is true if no state topic defined, else false. -- **payload_off** (*Optional*): The payload that represents disabled state. Default is "OFF". -- **payload_on** (*Optional*): The payload that represents enabled state. Default is "ON". -- **qos** (*Optional*): The maximum QoS level of the state topic. Default is 0 and will also be used to publishing messages. -- **retain** (*Optional*): If the published message should have the retain flag on or not. -- **rgb_command_template** (*Optional*): Defines a [template](/docs/configuration/templating/#processing-incoming-data) to compose message which will be sent to `rgb_command_topic`. Available variables: `red`, `green` and `blue`. -- **rgb_command_topic** (*Optional*): The MQTT topic to publish commands to change the light's RGB state. -- **rgb_state_topic** (*Optional*): The MQTT topic subscribed to receive RGB state updates. -- **rgb_value_template** (*Optional*): Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract the RGB value. -- **state_topic** (*Optional*): The MQTT topic subscribed to receive state updates. -- **state_value_template** (*Optional*): Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract the state value. The template should match the payload "on" and "off" values, so if your light uses "power on" to turn on, your `state_value_template` string should return "power on" when the switch is on. For example if the message is just "on", your `state_value_template` should be `power {{ value }}`. -- **white_value_command_topic** (*Optional*): The MQTT topic to publish commands to change the light's white value. -- **white_value_state_topic** (*Optional*): The MQTT topic subscribed to receive white value updates. -- **white_value_value_template** (*Optional*): Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract the white value. -- **xy_command_topic** (*Optional*): The MQTT topic to publish commands to change the light's XY state. -- **xy_state_topic** (*Optional*): The MQTT topic subscribed to receive XY state updates. -- **xy_value_template** (*Optional*): Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract the XY value. +{% configuration %} +name: + description: The name of the light. + required: false + type: string + default: MQTT Light +command_topic: + description: The MQTT topic to publish commands to change the switch state. + required: true + type: string +brightness_command_topic: + description: The MQTT topic to publish commands to change the light’s brightness. + required: false + type: string +brightness_scale: + description: "Defines the maximum brightness value (i.e. 100%) of the MQTT device." + required: false + type: integer + default: 255 +brightness_state_topic: + description: The MQTT topic subscribed to receive brightness state updates. + required: false + type: string +brightness_value_template: + description: "Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract the brightness value." + required: false + type: string +color_temp_command_topic: + description: The MQTT topic to publish commands to change the light’s color temperature state. The color temperature command slider has a range of 157 to 500 mireds (micro reciprocal degrees). + required: false + type: string +color_temp_state_topic: + description: The MQTT topic subscribed to receive color temperature state updates. + required: false + type: string +color_temp_value_template: + description: "Defines a [template](/topics/templating/) to extract the color temperature value." + required: false + type: string +effect_command_topic: + description: "The MQTT topic to publish commands to change the light's effect state." + required: false + type: string +effect_state_topic: + description: The MQTT topic subscribed to receive effect state updates. + required: false + type: string +effect_value_template: + description: "Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract the effect value." + required: false + type: string +effect_list: + description: The list of effects the light supports. + required: false + type: string list +on_command_type: + description: "Defines when on the payload_on is sent. Using `last` (the default) will send any style (brightness, color, etc) topics first and then a `payload_on` to the `command_topic`. Using `first` will send the `payload_on` and then any style topics. Using `brightness` will only send brightness commands instead of the `payload_on` to turn the light on." + required: false + type: string +optimistic: + description: Flag that defines if switch works in optimistic mode. + required: false + type: boolean + default: "`true` if no state topic defined, else `false`." +payload_on: + description: The payload that represents enabled state. + required: false + type: string + default: ON +payload_off: + description: The payload that represents disabled state. + required: false + type: string + default: OFF +qos: + description: The maximum QoS level of the state topic. + required: false + type: integer + default: 0 +retain: + description: If the published message should have the retain flag on or not. + required: false + type: boolean + default: false +rgb_command_template: + description: "Defines a [template](/docs/configuration/templating/#processing-incoming-data) to compose message which will be sent to `rgb_command_topic`. Available variables: `red`, `green` and `blue`." + required: false + type: string +rgb_command_topic: + description: "The MQTT topic to publish commands to change the light's RGB state." + required: false + type: string +rgb_state_topic: + description: The MQTT topic subscribed to receive RGB state updates. + required: false + type: string +rgb_value_template: + description: "Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract the RGB value." + required: false + type: string +state_topic: + description: The MQTT topic subscribed to receive state updates. + required: false + type: string +state_value_template: + description: "Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract the state value. The template should match the payload `on` and `off` values, so if your light uses `power on` to turn on, your `state_value_template` string should return `power on` when the switch is on. For example if the message is just `on`, your `state_value_template` should be `power {{ value }}`." + required: false + type: string +white_value_command_topic: + description: "The MQTT topic to publish commands to change the light's white value." + required: false + type: string +white_value_state_topic: + description: The MQTT topic subscribed to receive white value updates. + required: false + type: string +white_value_value_template: + description: "Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract the white value." + required: false + type: string +xy_command_topic: + description: "The MQTT topic to publish commands to change the light's XY state." + required: false + type: string +xy_state_topic: + description: The MQTT topic subscribed to receive XY state updates. + required: false + type: string +xy_value_template: + description: "Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract the XY value." + required: false + type: string +availability_topic: + description: The MQTT topic subscribed to receive availability (online/offline) updates. + required: false + type: string +payload_available: + description: The payload that represents the available state. + required: false + type: string + default: online +payload_not_available: + description: The payload that represents the unavailable state. + required: false + type: string + default: offline +{% endconfiguration %}

Make sure that your topics match exactly. `some-topic/` and `some-topic` are different topics. diff --git a/source/_components/light.mqtt_json.markdown b/source/_components/light.mqtt_json.markdown index 54732fe5bff..d6ba5ad07d0 100644 --- a/source/_components/light.mqtt_json.markdown +++ b/source/_components/light.mqtt_json.markdown @@ -48,23 +48,94 @@ light: command_topic: "home/rgb1/set" ``` -Configuration variables: - -- **command_topic** (*Required*): The MQTT topic to publish commands to change the light's state. -- **brightness** (*Optional*): Flag that defines if the light supports brightness. Default is false. -- **color_temp** (*Optional*): Flag that defines if the light supports color temperature. Default is false. -- **effect** (*Optional*): Flag that defines if the light supports effects. Default is false. -- **effect_list** (*Optional*): The list of effects the light supports. -- **flash_time_long** (*Optional*): The duration, in seconds, of a "long" flash. Default is 10. -- **flash_time_short** (*Optional*): The duration, in seconds, of a "short" flash. Default is 2. -- **name** (*Optional*): The name of the light. Default is "MQTT JSON Light." -- **optimistic** (*Optional*): Flag that defines if the light works in optimistic mode. Default is true if no state topic defined, else false. -- **qos** (*Optional*): The maximum QoS level of the state topic. Default is 0 and will also be used to publishing messages. -- **retain** (*Optional*): If the published message should have the retain flag on or not. -- **rgb** (*Optional*): Flag that defines if the light supports RGB colors. Default is false. -- **state_topic** (*Optional*): The MQTT topic subscribed to receive state updates. -- **white_value** (*Optional*): Flag that defines if the light supports white values. Default is false. -- **xy** (*Optional*): Flag that defines if the light supports XY colors. Default is false. +{% configuration %} +name: + description: The name of the light. + required: false + type: string + default: MQTT JSON Light +command_topic: + description: The MQTT topic to publish commands to change the light’s state. + required: true + type: string +brightness: + description: Flag that defines if the light supports brightness. + required: false + type: boolean + default: false +color_temp: + description: Flag that defines if the light supports color temperature. + required: false + type: boolean + default: false +effect: + description: Flag that defines if the light supports effects. + required: false + type: boolean + default: false +effect_list: + description: The list of effects the light supports. + required: false + type: string list +flash_time_long: + description: The duration, in seconds, of a “long” flash. + required: false + type: integer + default: 10 +flash_time_short: + description: The duration, in seconds, of a “short” flash. + required: false + type: integer + default: 2 +optimistic: + description: Flag that defines if the light works in optimistic mode. + required: false + type: boolean + default: "`true` if no state topic defined, else `false`." +qos: + description: The maximum QoS level of the state topic. + required: false + type: integer + default: 0 +retain: + description: If the published message should have the retain flag on or not. + required: false + type: boolean + default: false +rgb: + description: Flag that defines if the light supports RGB colors. + required: false + type: boolean + default: false +state_topic: + description: The MQTT topic subscribed to receive state updates. + required: false + type: string +white_value: + description: Flag that defines if the light supports white values. + required: false + type: boolean + default: false +xy: + description: Flag that defines if the light supports XY colors. + required: false + type: boolean + default: false +availability_topic: + description: The MQTT topic subscribed to receive availability (online/offline) updates. + required: false + type: string +payload_available: + description: The payload that represents the available state. + required: false + type: string + default: online +payload_not_available: + description: The payload that represents the unavailable state. + required: false + type: string + default: offline +{% endconfiguration %}

Make sure that your topics match exact. `some-topic/` and `some-topic` are different topics. diff --git a/source/_components/light.mqtt_template.markdown b/source/_components/light.mqtt_template.markdown index 3eed0fa3445..5a13ea9dfb6 100644 --- a/source/_components/light.mqtt_template.markdown +++ b/source/_components/light.mqtt_template.markdown @@ -33,24 +33,89 @@ light: command_off_template: "off" ``` -Configuration variables: - -- **name** (*Optional*): The name of the light. Default is "MQTT Template Light." -- **effect_list** (*Optional*): List of possible effects. -- **command_topic** (*Required*): The MQTT topic to publish commands to change the light's state. -- **state_topic** (*Optional*): The MQTT topic subscribed to receive state updates. -- **command_on_template** (*Required*): The [template](/docs/configuration/templating/#processing-incoming-data) for *on* state changes. Available variables: `state`, `brightness`, `red`, `green`, `blue`, `flash`, `transition` and `effect`. -- **command_off_template** (*Required*): The [template](/docs/configuration/templating/#processing-incoming-data) for *off* state changes. Available variables: `state` and `transition`. -- **state_template** (*Optional*): [Template](/docs/configuration/templating/#processing-incoming-data) to extract state from the state payload value. -- **brightness_template** (*Optional*): [Template](/docs/configuration/templating/#processing-incoming-data) to extract brightness from the state payload value. -- **red_template** (*Optional*): [Template](/docs/configuration/templating/#processing-incoming-data) to extract red color from the state payload value. -- **green_template** (*Optional*): [Template](/docs/configuration/templating/#processing-incoming-data) to extract green color from the state payload value. -- **blue_template** (*Optional*): [Template](/docs/configuration/templating/#processing-incoming-data) to extract blue color from the state payload value. -- **color_temp_template** (*Optional*): [Template](/docs/configuration/templating/#processing-incoming-data) to extract color temperature from the state payload value. -- **effect_template** (*Optional*): [Template](/docs/configuration/templating/#processing-incoming-data) to extract effect from the state payload value. -- **white_value_template** (*Optional*): [Template](/docs/configuration/templating/#processing-incoming-data) to extract white value from the state payload value. -- **optimistic** (*Optional*): Flag that defines if the light works in optimistic mode. Default is true if no state topic or state template is defined, else false. -- **qos** (*Optional*): The maximum QoS level of the state topic. Default is 0 and will also be used to publishing messages. +{% configuration %} +name: + description: The name of the light. + required: false + type: string + default: MQTT Template Light +effect_list: + description: List of possible effects. + required: false + type: string list +command_topic: + description: The MQTT topic to publish commands to change the light’s state. + required: true + type: string +state_topic: + description: The MQTT topic subscribed to receive state updates. + required: false + type: string +command_on_template: + description: "The [template](/docs/configuration/templating/#processing-incoming-data) for *on* state changes. Available variables: `state`, `brightness`, `red`, `green`, `blue`, `flash`, `transition` and `effect`." + required: true + type: string +command_off_template: + description: "The [template](/docs/configuration/templating/#processing-incoming-data) for *off* state changes. Available variables: `state` and `transition`." + required: true + type: string +state_template: + description: "[Template](/docs/configuration/templating/#processing-incoming-data) to extract state from the state payload value." + required: false + type: string +brightness_template: + description: "[Template](/docs/configuration/templating/#processing-incoming-data) to extract brightness from the state payload value." + required: false + type: string +red_template: + description: "[Template](/docs/configuration/templating/#processing-incoming-data) to extract red color from the state payload value." + required: false + type: string +green_template: + description: "[Template](/docs/configuration/templating/#processing-incoming-data) to extract green color from the state payload value." + required: false + type: string +blue_template: + description: "[Template](/docs/configuration/templating/#processing-incoming-data) to extract blue color from the state payload value." + required: false + type: string +color_temp_template: + description: "[Template](/docs/configuration/templating/#processing-incoming-data) to extract color temperature from the state payload value." + required: false + type: string +effect_template: + description: "[Template](/docs/configuration/templating/#processing-incoming-data) to extract effect from the state payload value." + required: false + type: string +white_value_template: + description: "[Template](/docs/configuration/templating/#processing-incoming-data) to extract white value from the state payload value." + required: false + type: string +optimistic: + description: Flag that defines if the light works in optimistic mode. + required: false + type: string + default: "`true` if no state topic or state template is defined, else `false`." +qos: + description: The maximum QoS level of the state topic. + required: false + type: integer + default: 0 +availability_topic: + description: The MQTT topic subscribed to receive availability (online/offline) updates. + required: false + type: string +payload_available: + description: The payload that represents the available state. + required: false + type: string + default: online +payload_not_available: + description: The payload that represents the unavailable state. + required: false + type: string + default: offline +{% endconfiguration %}

Make sure that your topics match exact. `some-topic/` and `some-topic` are different topics. diff --git a/source/_components/lock.mqtt.markdown b/source/_components/lock.mqtt.markdown index 6f91de7d133..8ed47ccf4ab 100644 --- a/source/_components/lock.mqtt.markdown +++ b/source/_components/lock.mqtt.markdown @@ -30,17 +30,64 @@ lock: command_topic: "home/frontdoor/set" ``` -Configuration variables: - -- **command_topic** (*Required*): The MQTT topic to publish commands to change the lock state. -- **name** (*Optional*): The name of the lock. Default is 'MQTT Lock'. -- **state_topic** (*Optional*): The MQTT topic subscribed to receive state updates. -- **payload_lock** (*Optional*): The payload that represents enabled/locked state. Default is "LOCK". -- **payload_unlock** (*Optional*): The payload that represents disabled/unlocked state. Default is "UNLOCK". -- **optimistic** (*Optional*): Flag that defines if lock works in optimistic mode. Default is `true` if no `state_topic` defined, else `false`. -- **qos** (*Optional*): The maximum QoS level of the state topic. Default is 0 and will also be used to publishing messages. -- **retain** (*Optional*): If the published message should have the retain flag on or not. -- **value_template** (*Optional*): Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract a value from the payload. +{% configuration %} +name: + description: The name of the lock. + required: false + type: string + default: MQTT Lock +command_topic: + description: The MQTT topic to publish commands to change the lock state. + required: true + type: string +state_topic: + description: The MQTT topic subscribed to receive state updates. + required: false + type: string +payload_lock: + description: The payload that represents enabled/locked state. + required: false + type: string + default: LOCK +payload_unlock: + description: The payload that represents disabled/unlocked state. + required: false + type: string + default: UNLOCK +optimistic: + description: Flag that defines if lock works in optimistic mode. + required: false + type: string + default: "`true` if no `state_topic` defined, else `false`." +qos: + description: The maximum QoS level of the state topic. + required: false + type: integer + default: 0 +retain: + description: If the published message should have the retain flag on or not. + required: false + type: boolean + default: false +value_template: + description: "Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract a value from the payload." + required: false + type: string +availability_topic: + description: The MQTT topic subscribed to receive availability (online/offline) updates. + required: false + type: string +payload_available: + description: The payload that represents the available state. + required: false + type: string + default: online +payload_not_available: + description: The payload that represents the unavailable state. + required: false + type: string + default: offline +{% endconfiguration %}

Make sure that your topics match exactly. `some-topic/` and `some-topic` are different topics. @@ -58,7 +105,7 @@ The example below shows a full configuration for a MQTT lock. # Example configuration.yml entry lock: - platform: mqtt - name: Frontdoor + name: Frontdoor state_topic: "home-assistant/frontdoor/" command_topic: "home-assistant/frontdoor/set" payload_lock: "LOCK" @@ -69,7 +116,7 @@ lock: value_template: '{% raw %}{{ value.x }}{% endraw %}' ``` -Keep an eye on retaining messages to keep the state as you don't want to unlock your door by accident when you restart something. +Keep an eye on retaining messages to keep the state as you don't want to unlock your door by accident when you restart something. For a check you can use the command line tools `mosquitto_pub` shipped with `mosquitto` to send MQTT messages. This allows you to operate your lock manually: diff --git a/source/_components/sensor.mqtt.markdown b/source/_components/sensor.mqtt.markdown index 0fb3ab1175f..9a7e6c00deb 100644 --- a/source/_components/sensor.mqtt.markdown +++ b/source/_components/sensor.mqtt.markdown @@ -58,8 +58,21 @@ force_update: reqired: false type: boolean default: False +availability_topic: + description: The MQTT topic subscribed to receive availability (online/offline) updates. + required: false + type: string +payload_available: + description: The payload that represents the available state. + required: false + type: string + default: online +payload_not_available: + description: The payload that represents the unavailable state. + required: false + type: string + default: offline {% endconfiguration %} - ## {% linkable_title Examples %} In this section you find some real life examples of how to use this sensor. diff --git a/source/_components/switch.mqtt.markdown b/source/_components/switch.mqtt.markdown index 4ad0a6c1f87..3804130cc61 100644 --- a/source/_components/switch.mqtt.markdown +++ b/source/_components/switch.mqtt.markdown @@ -30,20 +30,64 @@ switch: command_topic: "home/bedroom/switch1/set" ``` -Configuration variables: - -- **name** (*Optional*): The name of the switch. Default is 'MQTT Switch'. -- **state_topic** (*Optional*): The MQTT topic subscribed to receive state updates. -- **command_topic** (*Required*): The MQTT topic to publish commands to change the switch state. -- **availability_topic** (*Optional*): The MQTT topic subscribed to receive availability (online/offline) updates. -- **payload_on** (*Optional*): The payload that represents enabled state. Default is "ON". -- **payload_off** (*Optional*): The payload that represents disabled state. Default is "OFF". -- **payload_available** (*Optional*): The payload that represents the available state, e.g. 'online'. Default is "ON". -- **payload_not_available** (*Optional*): The payload that represents the unavailable state, e.g. 'offline'. Default is "OFF". -- **optimistic** (*Optional*): Flag that defines if switch works in optimistic mode. Default is `true` if no `state_topic` defined, else `false`. -- **qos** (*Optional*): The maximum QoS level of the state topic. Default is 0 and will also be used to publishing messages. -- **retain** (*Optional*): If the published message should have the retain flag on or not. -- **value_template** (*Optional*): Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract a value from the payload. +{% configuration %} +name: + description: The name to use when displaying this switch. + required: false + type: string + default: MQTT Switch +state_topic: + description: The MQTT topic subscribed to receive state updates. + required: false + type: string +command_topic: + description: The MQTT topic to publish commands to change the switch state. + required: false + type: string +availability_topic: + description: The MQTT topic subscribed to receive availability (online/offline) updates. + required: false + type: string +payload_on: + description: The payload that represents enabled state. + required: false + type: string + default: ON +payload_off: + description: The payload that represents disabled state. + required: false + type: string + default: OFF +payload_available: + description: The payload that represents the available state. + required: false + type: string + default: online +payload_not_available: + description: The payload that represents the unavailable state. + required: false + type: string + default: offline +optimistic: + description: Flag that defines if switch works in optimistic mode. + required: false + type: boolean + default: "`true` if no `state_topic` defined, else `false`." +qos: + description: The maximum QoS level of the state topic. Default is 0 and will also be used to publishing messages. + required: false + type: integer + default: 0 +retain: + description: If the published message should have the retain flag on or not. + required: false + type: boolean + default: false +value_template: + description: "Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract a value from the payload." + required: false + type: string +{% endconfiguration %}

Make sure that your topic matches exactly. `some-topic/` and `some-topic` are different topics. diff --git a/source/_components/vacuum.mqtt.markdown b/source/_components/vacuum.mqtt.markdown index df5a01a8cf8..65ed9679cef 100644 --- a/source/_components/vacuum.mqtt.markdown +++ b/source/_components/vacuum.mqtt.markdown @@ -53,36 +53,133 @@ vacuum: send_command_topic: 'vacuum/send_command' ``` -Basic Configuration variables: - -- **name** (*Optional*): The name of the vacuum. Defaults to `MQTT Vacuum`. -- **supported_features** (*Optional*): List of features that the vacuum supports (possible values are `turn_on`, `turn_off`, `pause`, `stop`, `return_home`, `battery`, `status`, `locate`, `clean_spot`, `fan_speed`, `send_command`). Defaults to `turn_on`, `turn_off`, `stop`, `return_home`, `status`, `battery`, `clean_spot`. -- **command_topic** (*Optional*): The MQTT topic to publish commands to control the vacuum. - -Advanced Configuration variables: - -- **qos** (*Optional*): The maximum QoS level of the state topic. Defaults to `0`. Will also be used when publishing messages. -- **retain** (*Optional*): If the published message should have the retain flag on or not. Defaults to `false`. -- **payload_turn_on** (*Optional*): The payload to send to the `command_topic` to begin the cleaning cycle. Defaults to `turn_on`. -- **payload_turn_off** (*Optional*): The payload to send to the `command_topic` to turn the vacuum off. Defaults to `turn_off`. -- **payload_return_to_base** (*Optional*): The payload to send to the `command_topic` to tell the vacuum to return to base. Defaults to `return_to_base`. -- **payload_stop** (*Optional*): The payload to send to the `command_topic` to stop the vacuum. Defaults to `stop`. -- **payload_clean_spot** (*Optional*): The payload to send to the `command_topic` to begin a spot cleaning cycle. Defaults to `clean_spot`. -- **payload_locate** (*Optional*): The payload to send to the `command_topic` to locate the vacuum (typically plays a song). Defaults to `locate`. -- **payload_start_pause** (*Optional*): The payload to send to the `command_topic` to start or pause the vacuum. Defaults to `start_pause`. -- **battery_level_topic** (*Optional*): The MQTT topic subscribed to receive battery level values from the vacuum. -- **battery_level_template** (*Optional*): Defines a [template](/topics/templating/) to define the battery level of the vacuum. -- **charging_topic** (*Optional*): The MQTT topic subscribed to receive charging state values from the vacuum. -- **charging_template** (*Optional*): Defines a [template](/topics/templating/) to define the charging state of the vacuum. -- **cleaning_topic** (*Optional*): The MQTT topic subscribed to receive cleaning state values from the vacuum. -- **cleaning_template** (*Optional*): Defines a [template](/topics/templating/) to define the cleaning state of the vacuum. -- **docked_topic** (*Optional*): The MQTT topic subscribed to receive docked state values from the vacuum. -- **docked_template** (*Optional*): Defines a [template](/topics/templating/) to define the docked state of the vacuum. -- **fan_speed_topic** (*Optional*): The MQTT topic subscribed to receive fan speed values from the vacuum. -- **fan_speed_template** (*Optional*): Defines a [template](/topics/templating/) to define the fan speed of the vacuum. -- **set_fan_speed_topic** (*Optional*): The MQTT topic to publish commands to control the vacuum's fan speed. -- **fan_speed_list** (*Optional*): List of possible fan speeds for the vacuum. -- **send_command_topic** (*Optional*): The MQTT topic to publish custom commands to the vacuum. +{% configuration %} +name: + description: The name of the vacuum. + required: false + type: string + default: MQTT Vacuum +supported_features: + description: "List of features that the vacuum supports (possible values are `turn_on`, `turn_off`, `pause`, `stop`, `return_home`, `battery`, `status`, `locate`, `clean_spot`, `fan_speed`, `send_command`)." + required: false + type: string list + default: "`turn_on`, `turn_off`, `stop`, `return_home`, `status`, `battery`, `clean_spot`" +command_topic: + description: The MQTT topic to publish commands to control the vacuum. + required: false + type: string +qos: + description: The maximum QoS level of the state topic. + required: false + type: integer + default: 0 +retain: + description: If the published message should have the retain flag on or not. + required: false + type: boolean + default: false +payload_turn_on: + description: "The payload to send to the `command_topic` to begin the cleaning cycle." + required: false + type: string + default: turn_on +payload_turn_off: + description: "The payload to send to the `command_topic` to turn the vacuum off." + required: false + type: string + default: turn_off +payload_return_to_base: + description: The payload to send to the `command_topic` to tell the vacuum to return to base. + required: false + type: string + default: return_to_base +payload_stop: + description: The payload to send to the `command_topic` to stop the vacuum. + required: false + type: string + default: stop +payload_clean_spot: + description: The payload to send to the `command_topic` to begin a spot cleaning cycle. + required: false + type: string + default: clean_spot +payload_locate: + description: The payload to send to the `command_topic` to locate the vacuum (typically plays a song). + required: false + type: string + default: locate +payload_start_pause: + description: The payload to send to the `command_topic` to start or pause the vacuum. + required: false + type: string + default: start_pause +battery_level_topic: + description: The MQTT topic subscribed to receive battery level values from the vacuum. + required: false + type: string +battery_level_template: + description: "Defines a [template](/topics/templating/) to define the battery level of the vacuum." + required: false + type: string +charging_topic: + description: The MQTT topic subscribed to receive charging state values from the vacuum. + required: false + type: string +charging_template: + description: "Defines a [template](/topics/templating/) to define the charging state of the vacuum." + required: false + type: string +cleaning_topic: + description: The MQTT topic subscribed to receive cleaning state values from the vacuum. + required: false + type: string +cleaning_template: + description: "Defines a [template](/topics/templating/) to define the cleaning state of the vacuum." + required: false + type: string +docked_topic: + description: The MQTT topic subscribed to receive docked state values from the vacuum. + required: false + type: string +docked_template: + description: "Defines a [template](/topics/templating/) to define the docked state of the vacuum." + required: false + type: string +fan_speed_topic: + description: The MQTT topic subscribed to receive fan speed values from the vacuum. + required: false + type: string +fan_speed_template: + description: "Defines a [template](/topics/templating/) to define the fan speed of the vacuum." + required: false + type: string +set_fan_speed_topic: + description: The MQTT topic to publish commands to control the vacuum's fan speed. + required: false + type: string +fan_speed_list: + description: List of possible fan speeds for the vacuum. + required: false + type: string list +send_command_topic: + description: The MQTT topic to publish custom commands to the vacuum. + required: false + type: string +availability_topic: + description: The MQTT topic subscribed to receive availability (online/offline) updates. + required: false + type: string +payload_available: + description: The payload that represents the available state. + required: false + type: string + default: online +payload_not_available: + description: The payload that represents the unavailable state. + required: false + type: string + default: offline +{% endconfiguration %} ### {% linkable_title Default MQTT Protocol %} From 6bad36ef05c9fbd15c4e1ff0400117de727749d5 Mon Sep 17 00:00:00 2001 From: Anders Melchiorsen Date: Tue, 2 Jan 2018 20:51:24 +0100 Subject: [PATCH 34/60] TP-Link switch LEDs are unchanged by default (#4327) --- source/_components/switch.tplink.markdown | 1 - 1 file changed, 1 deletion(-) diff --git a/source/_components/switch.tplink.markdown b/source/_components/switch.tplink.markdown index 4feabe67348..5839ff2cef0 100644 --- a/source/_components/switch.tplink.markdown +++ b/source/_components/switch.tplink.markdown @@ -46,6 +46,5 @@ enable_leds: description: If the LEDs on the switch (WiFi and power) should be lit. required: false type: boolean - default: true {% endconfiguration %} From f12f5f96ea1f1ae868d1dff20145419a049f711a Mon Sep 17 00:00:00 2001 From: Dave Finlay Date: Wed, 3 Jan 2018 12:02:39 -0800 Subject: [PATCH 35/60] Yamaha Receiver Documentation update for `zone_names`. Added information on missing configuration option `ignore_zones`. (#4320) --- source/_components/media_player.yamaha.markdown | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/source/_components/media_player.yamaha.markdown b/source/_components/media_player.yamaha.markdown index 8ab1d511144..c958aa1466c 100644 --- a/source/_components/media_player.yamaha.markdown +++ b/source/_components/media_player.yamaha.markdown @@ -36,7 +36,9 @@ Configuration variables: default name (often model number) that is returned by the device. - **host** (*Optional*): IP address or hostname of the device - **source_ignore** (*Optional*): List of sources to hide in the front-end -- **source_names** (*Optional*): Mapping of internal AVR source names to custom ones, allowing to rename e.g. `HDMI1` to `ChromeCast` +- **source_names** (*Optional*): Mapping of internal AVR source names to custom ones, allowing one to rename e.g. `HDMI1` to `ChromeCast` +- **zone_ignore** (*Optional*): List of zones to hide in the front-end +- **zone_names** (*Optional*): Mapping of zone names to custom ones, allowing one to rename e.g. `Main_Zone` to `Family Room` ### {% linkable_title Discovery notes %} @@ -76,6 +78,10 @@ media_player: source_names: HDMI1: "ChromeCast" AV4: "Vinyl" + zone_ignore: + - "Zone_2" + zone_names: + Main_Zone: "Family Room" ``` ### {% linkable_title Example `play_media` script %} From 0c03654efa6e9da9c5dc84800bdf82b547a81d0f Mon Sep 17 00:00:00 2001 From: Andrey Date: Thu, 4 Jan 2018 00:11:09 +0200 Subject: [PATCH 36/60] Climate: Add turn_on/turn_off services (#4306) * Add turn_on/turn_off services * Reword based on feedback --- source/_components/climate.markdown | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/source/_components/climate.markdown b/source/_components/climate.markdown index ce47cc8a3cb..53cfc080136 100644 --- a/source/_components/climate.markdown +++ b/source/_components/climate.markdown @@ -23,7 +23,7 @@ climate: ## {% linkable_title Services %} ### {% linkable_title Climate control services %} -Available services: `climate.set_aux_heat`, `climate.set_away_mode`, `climate.set_temperature`, `climate.set_humidity`, `climate.set_fan_mode`, `climate.set_operation_mode`, `climate.set_swing_mode`, `climate.set_hold_mode` +Available services: `climate.set_aux_heat`, `climate.set_away_mode`, `climate.set_temperature`, `climate.set_humidity`, `climate.set_fan_mode`, `climate.set_operation_mode`, `climate.set_swing_mode`, `climate.set_hold_mode`, `climate.turn_on`, `climate.turn_off`

Not all climate services may be available for your platform. Be sure to check the available services Home Assistant has enabled by checking service developer tool icon **Services**. @@ -222,6 +222,22 @@ automation: entity_id: climate.kitchen swing_mode: 1 ``` +### {% linkable_title Service `climate.turn_on` %} + +Turn climate device on + +| Service data attribute | Optional | Description | +| ---------------------- | -------- | ----------- | +| `entity_id` | yes | String or list of strings that point at `entity_id`'s of climate devices to control. Targets all when omitted. + +### {% linkable_title Service `climate.turn_off` %} + +Turn climate device off + +| Service data attribute | Optional | Description | +| ---------------------- | -------- | ----------- | +| `entity_id` | yes | String or list of strings that point at `entity_id`'s of climate devices to control. Targets all when omitted. + #### {% linkable_title Customization %} The step for the setpoint can be adjusted (default to 0,5 increments) by adding the following line into configuration From 864e67903dc920efefd19a0f080513a0e1983b46 Mon Sep 17 00:00:00 2001 From: Frantz Date: Thu, 4 Jan 2018 13:57:11 +0200 Subject: [PATCH 37/60] Added new daikin platform (climate + sensors) (#4127) * Create climate.daikin.markdown * Update climate.daikin.markdown * Update climate.daikin.markdown * Added the entire Daikin platform and also Daikin sensors docs * Update climate.daikin.markdown * Update daikin.markdown * Update sensor.daikin.markdown --- source/_components/climate.daikin.markdown | 46 ++++++++++++++++ source/_components/daikin.markdown | 63 ++++++++++++++++++++++ source/_components/sensor.daikin.markdown | 61 +++++++++++++++++++++ 3 files changed, 170 insertions(+) create mode 100644 source/_components/climate.daikin.markdown create mode 100644 source/_components/daikin.markdown create mode 100644 source/_components/sensor.daikin.markdown diff --git a/source/_components/climate.daikin.markdown b/source/_components/climate.daikin.markdown new file mode 100644 index 00000000000..5b4c2182a9e --- /dev/null +++ b/source/_components/climate.daikin.markdown @@ -0,0 +1,46 @@ +--- +layout: page +title: "Daikin AC" +description: "Instructions on how to integrate Daikin AC(s) with Home Assistant." +date: 2017-12-03 05:00 +sidebar: false +comments: false +sharing: true +footer: true +logo: N/A +ha_category: Climate +ha_release: 0.59 +ha_iot_class: "Local Polling" +--- + +### Description ### + +The climate component integrates Daikin air conditioning systems into Home Assistant, enabling control of setting the following parameters: +- **mode** (cool, heat, dry, fan only or auto) +- **fan speed** +- **target temperature** +- **swing mode** (on supported models) + +Current temperature is displayed. + +

+ Please note, the `daikin` platform integrates **ONLY the european versions of Daikin ACs (models BRP069A41, 42, 43, 45)** into Home Assistant +

+ +### Configuration ### + +Manual configuration and customization is possible by using the sample configuration from below: + +```yaml +# Example configuration.yaml entry +climate: + - platform: daikin + host: 10.0.0.1 + name: optional name +``` + +Configuration variables: + +- **host** (*Required*): IP or hostname of the device +- **name** (*Optional*): If the device has a name previously set by the user than that name will be used + diff --git a/source/_components/daikin.markdown b/source/_components/daikin.markdown new file mode 100644 index 00000000000..548c05ec313 --- /dev/null +++ b/source/_components/daikin.markdown @@ -0,0 +1,63 @@ +--- +layout: page +title: "Daikin AC" +description: "Instructions on how to integrate Hive devices with Home Assistant." +date: 2017-12-10 21:00 +sidebar: false +comments: false +sharing: true +footer: true +logo: N/A +ha_category: Climate +ha_release: 0.59 +ha_iot_class: "Local Polling" +--- + +### Description ### + +The component integrates Daikin air conditioning systems into Home Assistant. + +To automatically add all your Daikin devices (ACs and associated sensors) into your Home Assistant installation, add the following to your 'configuration.yaml' file: + +

+ Please note, the Daikin platform integrates **ONLY the european versions of Daikin ACs (models BRP069A41, 42, 43, 45)** into Home Assistant +

+ +```yaml +# Example configuration.yaml entry +daikin: + hosts: + - 192.168.4.161 + + monitored_conditions: + - inside_temperature + - outside_temperature + +``` + +{% configuration %} +hosts: + description: List of IP addresses or hostnames. + required: true + type: array +monitored_conditions: + description: List of items you want to monitor for each device. + required: false + detault: All conditions + type: list + keys: + inside_temperature: + description: The current temperature measured inside the house. + outside_temperature: + description: The current temperature measured outside the house. +{% endconfiguration %} + +

+ Please note that some AC devices may report outside temperature only when they are turned on. +

+ + +The Daikin Home Assistant platform currently supports the following Hive devices: + +- [Climate](/components/climate.daikin) +- [Sensor](/components/sensor.daikin) diff --git a/source/_components/sensor.daikin.markdown b/source/_components/sensor.daikin.markdown new file mode 100644 index 00000000000..dfb69786405 --- /dev/null +++ b/source/_components/sensor.daikin.markdown @@ -0,0 +1,61 @@ +--- +layout: page +title: "Daikin AC" +description: "Instructions on how to integrate Daikin AC(s) with Home Assistant." +date: 2017-12-03 05:00 +sidebar: false +comments: false +sharing: true +footer: true +logo: N/A +ha_category: Climate +ha_release: 0.59 +ha_iot_class: "Local Polling" +--- + +### Description ### + +The sensor component integrates Daikin air conditioning systems into Home Assistant, enabling displaying the following parameters: +- **inside temperature** +- **outside temperature** + +

+ Please note, the `daikin` platform integrates **ONLY the european versions of Daikin ACs (models BRP069A41, 42, 43, 45)** into Home Assistant +

+ +### Configuration ### + +Manual configuration and customization is possible by using the sample configuration from below: + +```yaml +# Example configuration.yaml entry +sensor: + - platform: daikin + host: 10.0.0.1 + name: optional name + monitored_conditions: + - inside_temperature + - outside_temperature + +``` + +{% configuration %} +host: + description: IP or hostname of the device. + required: true + type: string +monitored_conditions: + description: List of items you want to monitor for each device. + required: false + detault: All conditions + type: list + keys: + inside_temperature: + description: The current temperature measured inside the house. + outside_temperature: + description: The current temperature measured outside the house. +{% endconfiguration %} + +

+ Please note that some AC devices may report outside temperature only when they are turned on. +

From 3867353a4fb1b20361a5a52bb0096aaa18041013 Mon Sep 17 00:00:00 2001 From: Kevin Siml Date: Fri, 5 Jan 2018 17:31:45 +0100 Subject: [PATCH 38/60] Update Pushsafer documentation (#4345) * Update notify.pushsafer.markdown * Update notify.pushsafer.markdown * Update notify.pushsafer.markdown * Update notify.pushsafer.markdown * Update notify.pushsafer.markdown * Change format --- source/_components/notify.pushsafer.markdown | 71 +++++++++++++++++++- 1 file changed, 69 insertions(+), 2 deletions(-) diff --git a/source/_components/notify.pushsafer.markdown b/source/_components/notify.pushsafer.markdown index 4b003d97d82..a62e213e747 100644 --- a/source/_components/notify.pushsafer.markdown +++ b/source/_components/notify.pushsafer.markdown @@ -2,7 +2,7 @@ layout: page title: "Pushsafer" description: "Instructions how to add Pushsafer notifications to Home Assistant." -date: 2017-02-17 20:46 +date: 2018-01-05 11:15 sidebar: true comments: false sharing: true @@ -27,11 +27,78 @@ notify: private_key: ABCDEFGHJKLMNOPQRSTUVXYZ ``` -Configuration variables: +**Configuration variables:** - **name** (*Optional*): Setting the optional parameter `name` allows multiple notifiers to be created. The default value is `notify`. The notifier will bind to the service `notify.NOTIFIER_NAME`. - **private_key** (*Required*): Your private or alias key. Private key = send the notification to all devices with standard params, alias key send the notification to the devices stored in the alias with predefined params. +### {% linkable_title Examples %} + +Message to two devices with formated text. + +```json +{ + "title": "Test to 2 devices", + "message": "Attention [b]bold[/b] text[br][url=https://www.pushsafer.com]Link to Pushsafer[/url]", + "target": ["1111", "2222"], + "data": { + "icon": "2", + "iconcolor": "#FF0000", + "sound": "2", + "vibration": "1", + "url": "https://home-assistant.io/", + "urltitle": "Open Home Assistant", + "time2live": "0" + } +} +``` + +Message to one device with formated text and image from an external URL. + +```json +{ + "title": "Test to 1 device with image from an url", + "message": "Attention [i]italic[/i] Text[br][url=https://home-assistant.io/]Testlink[/url]", + "target": ["1111"], + "data": { + "icon": "14", + "iconcolor": "#FFFF00", + "sound": "22", + "vibration": "3", + "url": "https://home-assistant.io/", + "urltitle": "Open Home Assistant", + "time2live": "60", + "picture1": { + "url":"https://home-assistant.io/images/components/alexa/alexa-512x512.png" + } + } +} +``` + +Message to two devices and one device group with formated text and local image. + +```json +{ + "title": "Test to 3 devices with local image", + "message": "Attention [i]italic[/i] Text[br][url=https://home-assistant.io/]Testlink[/url]", + "target": ["1111","2222","gs3333"], + "data": { + "icon": "20", + "iconcolor": "#FF00FF", + "sound": "33", + "vibration": "0", + "url": "https://home-assistant.io/", + "urltitle": "Open Home Assistant", + "time2live": "10", + "picture1": { + "path":"C:\\Users\\Kevin\\AppData\\Roaming\\.homeassistant\\image-760-testimage.jpg" + } + } +} +``` + +To customize your push-notification you can take a look at the [Pushsafer API description](https://www.pushsafer.com/en/pushapi). + When setting up the application you can use this [icon](https://home-assistant.io/images/favicon-192x192.png). To use notifications, please see the [getting started with automation page](/getting-started/automation/). From 2ff654ef2bb855bb008f61f137b5983265b34235 Mon Sep 17 00:00:00 2001 From: tadly Date: Sat, 6 Jan 2018 00:39:18 +0100 Subject: [PATCH 39/60] reference python-miio instead of python-mirobo (#4346) --- source/_components/vacuum.xiaomi_miio.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_components/vacuum.xiaomi_miio.markdown b/source/_components/vacuum.xiaomi_miio.markdown index e14e1506578..4abc27588cb 100644 --- a/source/_components/vacuum.xiaomi_miio.markdown +++ b/source/_components/vacuum.xiaomi_miio.markdown @@ -155,7 +155,7 @@ To fetch the token follow these instructions depending on your mobile phone plat Follow the pairing process using your phone and Mi-Home app. You will be able to retrieve the token from a SQLite file inside your phone. -Before you begin you need to install `libffi-dev` and `libssl-dev` by running the command below. This is needed for `python-mirobo` to be installed correctly. +Before you begin you need to install `libffi-dev` and `libssl-dev` by running the command below. This is needed for `python-miio` to be installed correctly. ```bash $ sudo apt-get install libffi-dev libssl-dev @@ -185,7 +185,7 @@ To fetch the token follow these instructions depending on your mobile phone plat Follow the pairing process using your phone and Mi-Home app. You will be able to retrieve the token from a SQLite file inside your phone. -Before you begin you need to install `libffi-dev` and `libssl-dev` by running the command below. This is needed for `python-mirobo` to be installed correctly. +Before you begin you need to install `libffi-dev` and `libssl-dev` by running the command below. This is needed for `python-miio` to be installed correctly. ```bash $ sudo apt-get install libffi-dev libssl-dev From f4be3e95e4723e75dc3e3706d313316fcb073ce7 Mon Sep 17 00:00:00 2001 From: tbergo Date: Sat, 6 Jan 2018 11:15:41 +0100 Subject: [PATCH 40/60] Add Roth Touchline documentation (#4336) * Add Roth Touchline documentation Add Roth Touchline documentation Pull request in home-assistant (if applicable): home-assistant/home-assistant#10547 * Minor changes --- source/_components/climate.touchline.markdown | 32 ++++++++++++++++++ source/images/supported_brands/roth.png | Bin 0 -> 2479 bytes 2 files changed, 32 insertions(+) create mode 100644 source/_components/climate.touchline.markdown create mode 100644 source/images/supported_brands/roth.png diff --git a/source/_components/climate.touchline.markdown b/source/_components/climate.touchline.markdown new file mode 100644 index 00000000000..ebc48a9df82 --- /dev/null +++ b/source/_components/climate.touchline.markdown @@ -0,0 +1,32 @@ +--- +layout: page +title: "Roth Touchline" +description: "Instructions how to integrate Roth Touchline within Home Assistant." +date: 2018-01-03 12:35 +sidebar: true +comments: false +sharing: true +footer: true +logo: roth.png +ha_category: Climate +ha_release: 0.61 +ha_iot_class: "Local Polling" +--- + +The `touchline` climate platform let you control [ROTH Touchline](http://www.roth-nordic.dk/dk/roth-touchline-tradloes-gulvvarmeregulering-1475.htm) floor heating thermostats from Roth. + + +To set it up, add the following information to your `configuration.yaml` file: + +```yaml +climate: + - platform: touchline + host: YOUR_IPADDRESS +``` + +{% configuration %} +host: + description: The IP address of your controller, e.g., http://192.168.1.1. + required: false + type: string +{% endconfiguration %} diff --git a/source/images/supported_brands/roth.png b/source/images/supported_brands/roth.png new file mode 100644 index 0000000000000000000000000000000000000000..7fadc544d069d2b98b8b7bd63ea338b84b82c5e9 GIT binary patch literal 2479 zcmV;g2~hTlP)KLZ*U+qVlCO z1pvGRfFglV&Idqp0U#$^Ayoh%zXAYT78B(MfKmX6ds6?vDSu#Dd_p1sxdZ^%smpv6 z0N5$Z+yMY=g)m0}0N^K)?vRO6(-gRspEd5t0@sEESYlILoWgV4K%?BY`_V;AQ+-yBcy>0@?alSKrJ*uD_nqU za2xKyG`xWK2!=2a4q}SfAufn75`wHpl96;oiR2?iNEK3#G$S3zWuzY&MkbJ_$UO1^ zC8O%7K5BvTP!BW!jX)DoAu2_8q6KILT8o}U+tF{)0dy3dLSLYZ7zNYBOfW9C8Vkna zFaajRKEq0}!&o!cja|p?VAI%Z0!mOP7!!B|Z$boN3qeZACsYuQ5zY~=5Pl@g5Z)3g zL|vjS(Tf;C;u`Nj^=!LcULaO;MqkQamUzlnhD%rJmAF8KTTlNmQKbPK~8Xs72Hh)L!a1 z^&O2(*tv&-3+*t41(%|K0s zW`pLC7NW(|+M-pi)uZ)N+gLkFd$)F{_7jc{XB{Vx)5@9B(bie3vrDI4=OOdRBUy^{Vu4>J#)m^yT`e^rsCB4B`yR4EhZ*Lr=qO!*hnujjW9XMn{b%a2-4j z{{kO0W*UbY7aQL&p_;5QDKzObrI-er?l&DUqnm}9m75KjYnsQKA2xqrVQP_TaoXaQ zrL$$O<#$#Tt1zo7t8r^HYq52Q^`cFH%>kRS6(%dhE4pkE+Ys9t+bKJqU9Mffy_P-S zzRiA#8^*2U&hb2W#k_F`TZcS{TaLJ+%<<|^6qOw{8=VyWLyT`sSFBBJ zeH=TkC~j%Ja{XMqApU+rbizQQf8ym0E*sjCY?Hp;XtMFhCf!Y6Zf0+;*uva$Aeo+A zlA@AQ%%}591q?yCkR`0z%Gp|*il;WFS*M*9If*W8^V!yy9+5sKP8L7QkY{|z+$Uj4 z>ZI1v&h0+iZ^@Emv+^7TSy7#3k=3OPQjTSdvKMm>>@eQZ`RSTZCw9tm$+>lTEAwvb zO5XMUvxCx|*?rr%l z`-;z1`qj~E4c8^#ukNGvjrKR)$QlT^sd@9sKfk%P|A!5??FZ4pk)h_{{2ycQ*p6T$ z_eRf+72g%y^SaNu|9bq^MDygn2ZD#bkMKuJk0+-tPuI`nKS}w?|Ec9O+OuC~hkx## zJMw(bFX=C$UwXVUn^&EG`})zZH{WzGG`_8Px9h$5UmJc~yXgMG=6Ag%)upA6z1)-o z5c&ImcePz5z#$w!ed9;Zq#r=zF+lI_e*=`;j^&OFoksuw03c&XQcVB=hYA1yj12$* z1-AeIfam}KQUw436trpZx~=PLdaZ8Svfl{ckCMZ_@^FWNw#AT4|H!M}GDk__DnBL(RFksOc_CAorz_ zUs#HDu8d7V0k(vhnGb*o@YBQbuK}>=3otVUY?^BX*kKMlS90L7GXDthOn@oyQMn(R zxhl2|Y0Aq)h2`vYeWI|0O%4?fIR`aLKI++ zfNghDcB|8+0R04PgNQ*)1?VT>sfcxjDq5~$o08P@t^#y~=)+Eo0Qd4_*~QpL6rhKI zm{GWBcuq>WUG|H8i_Ud6!2OB+>AwLy2Js#E Date: Sun, 7 Jan 2018 09:52:43 +1300 Subject: [PATCH 41/60] Add documentation for iGlo component (#4222) * Add documentation for iGlo component * Bump to 0.61 and update mistake * Minor changes and minimize the config sample --- source/_components/light.iglo.markdown | 42 ++++++++++++++++++++++++ source/images/supported_brands/iglo.png | Bin 0 -> 22440 bytes 2 files changed, 42 insertions(+) create mode 100644 source/_components/light.iglo.markdown create mode 100644 source/images/supported_brands/iglo.png diff --git a/source/_components/light.iglo.markdown b/source/_components/light.iglo.markdown new file mode 100644 index 00000000000..5bc12ba1d64 --- /dev/null +++ b/source/_components/light.iglo.markdown @@ -0,0 +1,42 @@ +--- +layout: page +title: "iGlo" +description: "Instructions on how to integrate iGlo lights into Home Assistant." +date: 2017-12-17 08:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: iglo.png +ha_category: Light +ha_iot_class: "Local Polling" +ha_release: 0.61 +--- + +The `iglo` platform allows you to integrate your [iGlo Lights](https://www.youtube.com/watch?v=oHTS9ji_v-s) into Home Assistant. + +To use your iGlo light in your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +light: + - platform: iglo + host: 192.168.1.10 +``` + +{% configuration %} +host: + required: true + description: The IP address for connecting to the light. + type: string +name: + required: false + description: The name for this light. + default: iGlo Light + type: string +port: + required: false + description: The port used to connect to the light. + default: 8080 + type: integer +{% endconfiguration %} diff --git a/source/images/supported_brands/iglo.png b/source/images/supported_brands/iglo.png new file mode 100644 index 0000000000000000000000000000000000000000..69b51da1d346c3d0e94c4bf925bd4efec1b052b3 GIT binary patch literal 22440 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 J#VwnN{{!AyRmK1S literal 0 HcmV?d00001 From 5d8f0fc7c254a6418d831896db6441bb7248dcb4 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 6 Jan 2018 22:56:57 +0100 Subject: [PATCH 42/60] Add missing configuration variables (#4310) --- source/_components/sensor.metoffice.markdown | 25 ++++++++++++++----- source/_components/weather.metoffice.markdown | 5 ++-- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/source/_components/sensor.metoffice.markdown b/source/_components/sensor.metoffice.markdown index 8a327524c0e..ff622357718 100644 --- a/source/_components/sensor.metoffice.markdown +++ b/source/_components/sensor.metoffice.markdown @@ -15,8 +15,8 @@ ha_iot_class: "Cloud Polling" The `metoffice` sensor platform uses the Met Office's [DataPoint API][datapoint] for weather data. -- Each sensor will be given the `device_id` of "Met Office [condition]" -- The sensor checks for new data every minute, starting 30 minutes after the timestamp of the most recent data as the data is updated every half-hour. +- Each sensor will be given the `device_id` of "Met Office [condition]" if `name:` is not set. +- The sensor checks for new data every minute, starting 30 minutes after the timestamp of the most recent data as the data is updated every half hour. To add the Met Office weather to your installation you'll need to register for a free api key at the link above and then add the following to your `configuration.yaml` file: @@ -24,7 +24,7 @@ To add the Met Office weather to your installation you'll need to register for a # Example configuration.yaml entry sensor: - platform: metoffice - api_key: "my-api-key" + api_key: YOUR_API_KEY monitored_conditions: - weather - temperature @@ -43,12 +43,25 @@ Your location will be detected from your home `latitude` and `longitude` setting Configuration variables: -- **api_key** (*Required*): Your personal API key from the [Datapoint website][datapoint]. -- **name** (*Optional*): Name to use in the frontend, will be the prefix. +- **api_key** (*Required*): Your personal API key from the [Datapoint website](http://www.metoffice.gov.uk/datapoint). +- **name** (*Optional*): Additional name for the sensors. Default to platform name. +- **latitude** (*Optional*): Latitude coordinate to monitor weather of (required if **longitude** is specified), defaults to coordinates defined in your `configuration.yaml`. +- **longitude** (*Optional*): Longitude coordinate to monitor weather of (required if **latitude** is specified), defaults to coordinates defined in your `configuration.yaml`. +- **monitored_conditions** array (*Required*): Conditions to display in the frontend. + - **weather**: A human-readable text summary of the current conditions. + - **temperature**: The current temperature. + - **feels_like_temperature**: A numerical value representing the apparent (or "feels like") temperature. + - **wind_speed**: The wind speed. + - **wind_direction**: Where the wind is coming from. + - **wind_gust**: If there are wind gusts. + - **visibility**: The average visibility. + - **visibility_distance**: The visibility distance. + - **uv**: The UV index. + - **precipitation**: The average expected intensity of precipitation occurring. + - **humidity**: The relative humidity.

This sensor is an alternative to the [`metoffice`](/components/weather.metoffice/) weather platform. The weather platform is easier to configure but less customizable.

-[datapoint]: http://www.metoffice.gov.uk/datapoint diff --git a/source/_components/weather.metoffice.markdown b/source/_components/weather.metoffice.markdown index d05b55431e6..58751218063 100644 --- a/source/_components/weather.metoffice.markdown +++ b/source/_components/weather.metoffice.markdown @@ -20,16 +20,15 @@ To add the Met Office weather platform to your installation, you'll need to regi ```yaml weather: - platform: metoffice - api_key: "my-api-key" + api_key: YOUR_API_KEY ``` Configuration variables: -- **api_key** (*Required*): Your personal API key from the [Datapoint website][datapoint]. +- **api_key** (*Required*): Your personal API key from the [Datapoint website](http://www.metoffice.gov.uk/datapoint).

This platform is an alternative to the [`metoffice`](/components/sensor.metoffice/) sensor. The weather platform is easier to configure but less customizable.

-[datapoint]: http://www.metoffice.gov.uk/datapoint From 88d3c88c61c1a53bba3b4fb12977c7345f3ba67f Mon Sep 17 00:00:00 2001 From: florianj1 <35061897+florianj1@users.noreply.github.com> Date: Sun, 7 Jan 2018 14:10:14 +0100 Subject: [PATCH 43/60] Update addon_config.markdown (#4361) Documation updated, since the newly added docker options 'SYS_TIME' and 'SYS_NICE' are missing --- source/developers/hassio/addon_config.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/developers/hassio/addon_config.markdown b/source/developers/hassio/addon_config.markdown index 43cf11f7869..5ed0ef41554 100644 --- a/source/developers/hassio/addon_config.markdown +++ b/source/developers/hassio/addon_config.markdown @@ -120,7 +120,7 @@ The config for an add-on is stored in `config.json`. | auto_uart | no | Default False. Auto mapping all UART/Serial device from host into add-on. | hassio_api | no | This add-on can access to Hass.io REST API. It set the host alias `hassio`. | homeassistant_api | no | This add-on can access to Hass.io Home-Assistant REST API proxy. Use `http://hassio/homeassistant/api`. -| privileged | no | Privilege for access to hardware/system. Available access: `NET_ADMIN`, `SYS_ADMIN`, `SYS_RAWIO` +| privileged | no | Privilege for access to hardware/system. Available access: `NET_ADMIN`, `SYS_ADMIN`, `SYS_RAWIO`, `SYS_TIME`, `SYS_TIME` | map | no | List of maps for additional Hass.io folders. Possible values: `config`, `ssl`, `addons`, `backup`, `share`. Defaults to `ro`, which you can change by adding `:rw` to the end of the name. | environment | no | A dict of environment variable to run add-on. | audio | no | Boolean. Mark this add-on to use internal an audio system. The available environment variables are `ALSA_INPUT` and `ALSA_OUTPUT` which provide internal information to access alsa. From 5223e10ffd968bab59eb8d0291849c9a3b7fb742 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Sun, 7 Jan 2018 22:00:33 +0000 Subject: [PATCH 44/60] Document Dark Sky weather platform (#4333) --- source/_components/sensor.darksky.markdown | 6 +- source/_components/weather.darksky.markdown | 70 +++++++++++++++++++++ 2 files changed, 73 insertions(+), 3 deletions(-) create mode 100644 source/_components/weather.darksky.markdown diff --git a/source/_components/sensor.darksky.markdown b/source/_components/sensor.darksky.markdown index ee366dfa66e..427d5afb683 100644 --- a/source/_components/sensor.darksky.markdown +++ b/source/_components/sensor.darksky.markdown @@ -1,6 +1,6 @@ --- layout: page -title: "Dark Sky" +title: "Dark Sky Sensor" description: "How to integrate Dark Sky within Home Assistant." date: 2016-09-26 08:00 sidebar: true @@ -20,7 +20,7 @@ The `darksky` platform uses the [Dark Sky](https://darksky.net/) web service as You need an API key which is free but requires [registration](https://darksky.net/dev/register). You can make up to 1000 calls per day for free which means that you could make one approximately every 86 seconds.

-[Dark Sky](https://darksky.net/) will charge you $0.0001 per API call if you enter your credit card details and create more than 1000 calls per day. +[Dark Sky](https://darksky.net/dev/) will charge you $0.0001 per API call if you enter your credit card details and create more than 1000 calls per day.

To add Dark Sky to your installation, add the following to your `configuration.yaml` file: @@ -67,7 +67,7 @@ Configuration variables: - **apparent_temperature_min**: Today's expected apparent low temperature. - **precip_intensity_max**: Today's expected maximum intensity of precipitation. - **uv_index**: The current UV index. -- **units** (*Optional*): Specify the unit system. Default to `si` or `us` based on the temperature preference in Home Assistant. Other options are `auto`, `us`, `si`, `ca`, and `uk2`. +- **units** (*Optional*): Specify the unit system. Default to `si` or `us` based on the temperature preference in Home Assistant. Other options are `auto`, `us`, `si`, `ca`, `uk` and `uk2`. `auto` will let Dark Sky decide the unit system based on location. - **update_interval** (*Optional*): Minimum time interval between updates. Default is 2 minutes. Supported formats: - `update_interval: 'HH:MM:SS'` diff --git a/source/_components/weather.darksky.markdown b/source/_components/weather.darksky.markdown new file mode 100644 index 00000000000..0352ef6074e --- /dev/null +++ b/source/_components/weather.darksky.markdown @@ -0,0 +1,70 @@ +--- +layout: page +title: "Dark Sky" +description: "Instructions how to integrate Dark Sky within Home Assistant." +date: 2016-09-29 09:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: dark_sky.png +ha_category: Weather +ha_release: 0.61 +ha_iot_class: "Cloud Polling" +--- + +The `darksky` platform uses the [Dark Sky](https://darksky.net/) web service as +a source for meteorological data for your location. + +You need an API key which is free but requires +[registration](https://darksky.net/dev/register). The free tier allows up to +1000 calls per day, this platform updates at most every 3 minutes, using up to +480 of those calls. + +

+[Dark Sky](https://darksky.net/dev/) will charge you $0.0001 per API call if you +enter your credit card details and create more than 1000 calls per day. +

+ +To add Dark Sky to your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +weather: + - platform: darksky + api_key: YOUR_API_KEY +``` + +{% configuration %} +api_key: + description: "Your API key for [Dark Sky](https://darksky.net/dev/)." + required: true + type: string +latitude: + description: Manually specify latitude. By default the value will be taken from the Home Assistant configuration. + required: false + type: number + default: Provided by Home Assistant configuration +longitude: + description: Manually specify longitude. By default the value will be taken from the Home Assistant configuration. + required: false + type: number + default: Provided by Home Assistant configuration +units: + description: "Manually specify unit system. Valid values are: `auto`, `us`, `si`, `ca`, `uk` and `uk2`." + required: false + type: string + default: "`si` if Home Assistant unit system is metric, `us` if imperial." +name: + description: Name to use in the frontend. + required: false + type: string + default: Open Sky +{% endconfiguration %} + +

+This platform is an alternative to the [`darksky`](/components/sensor.darksky/) +sensor. +

+ +Details about the API are available in the [Dark Sky documentation](https://darksky.net/dev/docs). From 0ed4db4d59d306f4bf70914d268e18f3e5960145 Mon Sep 17 00:00:00 2001 From: Chris Cowart Date: Sun, 7 Jan 2018 23:17:49 -0800 Subject: [PATCH 45/60] Updates for new Owntracks features (#4350) --- source/_components/device_tracker.owntracks.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_components/device_tracker.owntracks.markdown b/source/_components/device_tracker.owntracks.markdown index 20cf68ab97a..f23457ad8d6 100644 --- a/source/_components/device_tracker.owntracks.markdown +++ b/source/_components/device_tracker.owntracks.markdown @@ -32,6 +32,9 @@ Configuration variables: - **waypoints** (*Optional*): Owntracks users can define [waypoints](http://owntracks.org/booklet/features/waypoints/) (a.k.a regions) which are similar in spirit to Home Assistant zones. If this configuration variable is `True`, the Owntracks users who are in `waypoint_whitelist` can export waypoints from the device and Home Assistant will import them as zone definitions. Defaults to `True`. - **waypoint_whitelist** (*Optional*): A list of user names (as defined for [Owntracks](/components/device_tracker.owntracks/)) who can export their waypoints from Owntracks to Home Assistant. This would be the `username` portion of the Base Topic Name, (e.g. owntracks/**username**/iPhone). Defaults to all users who are connected to Home Assistant via Owntracks. - **secret** (*Optional*): [Payload encryption key](http://owntracks.org/booklet/features/encrypt/). This is usable when communicating with a third-party untrusted server or a public server (where anybody can subscribe to any topic). By default the payload is assumed to be unencrypted (although the communication between Home Assistant and the server might still be encrypted). This feature requires the `libsodium` library to be present. +- **mqtt_topic** (*Optional*): The topic to subscribe for Owntracks updates on your MQTT instance (defaults to `owntracks/#`). +- **events_only** (*Optional*): Home Assistant will ignore all location updates and rely solely on geofence enter/leave events. +- **region_mapping** (*Optional*): Dictionary to remap names of regions as configured in the Owntracks app to Home Assistant zones. Use this if you have multiple homes or Home Assistant instances and want to map a different label to 'home'. `key: value` maps Owntracks region `key` to Home Assistant zone `value`. A full sample configuration for the `owntracks` platform is shown below: @@ -41,9 +44,14 @@ device_tracker: - platform: owntracks max_gps_accuracy: 200 waypoints: True + mqtt_topic: "owntracks/#" + events_only: True waypoint_whitelist: - jon - ram + region_mapping: + cabin: home + office: work ``` ### {% linkable_title Using Owntracks with other device trackers %} From f850f2e109708cd3b1504fdd071235b2855b7b92 Mon Sep 17 00:00:00 2001 From: timstanley1985 Date: Mon, 8 Jan 2018 16:07:54 +0000 Subject: [PATCH 46/60] MQTT json sensor attributes (#4334) * MQTT json sensor attributes * Add line break --- source/_components/sensor.mqtt.markdown | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/_components/sensor.mqtt.markdown b/source/_components/sensor.mqtt.markdown index 9a7e6c00deb..2f80c563b15 100644 --- a/source/_components/sensor.mqtt.markdown +++ b/source/_components/sensor.mqtt.markdown @@ -72,7 +72,12 @@ payload_not_available: required: false type: string default: offline +json_attributes: + description: A list of keys to extract values from a JSON dictionary payload and then set as sensor attributes. + reqired: false + type: list, string {% endconfiguration %} + ## {% linkable_title Examples %} In this section you find some real life examples of how to use this sensor. From 18fe3e4452baece2e190d0409afff2050b62a577 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 8 Jan 2018 17:09:04 +0100 Subject: [PATCH 47/60] Add details for foreign exchange support (#4374) --- .../_components/sensor.alpha_vantage.markdown | 45 +++++++++++++++++-- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/source/_components/sensor.alpha_vantage.markdown b/source/_components/sensor.alpha_vantage.markdown index 3e78232b24b..29712a8d0c9 100644 --- a/source/_components/sensor.alpha_vantage.markdown +++ b/source/_components/sensor.alpha_vantage.markdown @@ -33,21 +33,58 @@ api_key: symbols: description: List of stock market symbols for given companies. required: false - type: string, list default: GOOGL + type: map + keys: + name: + description: The name of the sensor to use for the frontend. + required: false + type: string + currency: + description: The name of the sensor to use for the frontend. + required: false + type: string + default: USD + symbol: + description: The stock market symbol for the given company. + required: required + type: string +foreign_exchange: + description: List of currencies. + type: map + required: false + keys: + name: + description: The name of the sensor to use for the frontend. + required: false + type: string + from: + description: The source currency. + required: required + type: string + to: + description: The target currency. + required: required + type: string {% endconfiguration %} ## {% linkable_title Examples %} In this section you find some real life examples of how to use this sensor. -### {% linkable_title Red Hat and Google %} +### {% linkable_title Google and the exchange rate for Bitcoin %} ```yaml sensor: - platform: alpha_vantage + api_key: YOUR_API_KEY symbols: - - RHT - - GOOGL + - name: Google + currency: USD + symbol: GOOGL + foreign_exchange: + - from: BTC + to: USD + name: Bitcoin ``` From 7c47fac5671815b2b7e15f916ec40728217f663d Mon Sep 17 00:00:00 2001 From: Cameron Llewellyn Date: Mon, 8 Jan 2018 11:18:54 -0600 Subject: [PATCH 48/60] Update insteon local documentation (#4198) * Update insteon local documentation * Update Insteon_local Changes * Small docs cleanup * Remove duplicated config info --- source/_components/fan.insteon_local.markdown | 19 +----------------- source/_components/insteon_local.markdown | 14 ++----------- .../_components/light.insteon_local.markdown | 20 +------------------ .../_components/switch.insteon_local.markdown | 18 +---------------- 4 files changed, 5 insertions(+), 66 deletions(-) diff --git a/source/_components/fan.insteon_local.markdown b/source/_components/fan.insteon_local.markdown index 8476fc43d06..359f099477b 100644 --- a/source/_components/fan.insteon_local.markdown +++ b/source/_components/fan.insteon_local.markdown @@ -14,21 +14,4 @@ ha_version: 0.48 The `insteon_local` fan component lets you control your fan connected to an [Insteon Hub](http://www.insteon.com/insteon-hub/) with Home Assistant. -To integrate add a fan, configure your hub Insteon(local) with Home Assistant, add the following section to your `configuration.yaml` file: - -```yaml -# Example configuration.yaml platform entry -insteon_local: - host: YOUR HUB IP - username: YOUR HUB USERNAME - password: YOUR HUB PASSWORD - timeout: 10 - port: 25105 -``` - -To add fans to your set-up, add the platform to your light configuration: -```yaml -fan: - - platform: insteon_local -``` - +To get your insteon fans working with Home Assistant, follow the instructions for the general [Insteon local component](/components/insteon_local/). The fans will be automatically disovered and added to Home Assistant. The device names will be the Insteon address of the fans. diff --git a/source/_components/insteon_local.markdown b/source/_components/insteon_local.markdown index 96a339f0f03..fba10871713 100644 --- a/source/_components/insteon_local.markdown +++ b/source/_components/insteon_local.markdown @@ -33,9 +33,9 @@ Configuration variables: - **timeout** (*Optional*): Timeout to wait for connections. Defaults to 10 seconds. - **port** (*Optional*): The port your hub is configured to listen to. Defaults to `25105`. -### {% linkable_title Full configuration %} +### {% linkable_title Full configuration %} -The `insteon_local` component currently supports both lights (dimmers) and switches. A full configuration may look like so: +The `insteon_local` component currently supports lights (dimmers), switches and fans. ```yaml insteon_local: @@ -44,14 +44,4 @@ insteon_local: password: YOUR HUB PASSWORD timeout: 10 port: 25105 - -light: - - platform: insteon_local - -switch: - - platform: insteon_local - -fan: - - platform: insteon_local ``` - diff --git a/source/_components/light.insteon_local.markdown b/source/_components/light.insteon_local.markdown index 14f91598c91..06af902dfd7 100644 --- a/source/_components/light.insteon_local.markdown +++ b/source/_components/light.insteon_local.markdown @@ -15,22 +15,4 @@ ha_iot_class: "Local Push" The `insteon_local` light component lets you control your lights connected to an [Insteon Hub](http://www.insteon.com/insteon-hub/) with Home Assistant. -To integrate add a light, configure your hub Insteon(local) with Home Assistant, add the following section to your `configuration.yaml` file: - -```yaml -# Example configuration.yaml platform entry -insteon_local: - host: YOUR HUB IP - username: YOUR HUB USERNAME - password: YOUR HUB PASSWORD - timeout: 10 - port: 25105 -``` - -To add lights (dimmers) to your set-up, add the platform to your light configuration: - -```yaml -light: - - platform: insteon_local -``` - +To get your insteon lights working with Home Assistant, follow the instructions for the general [Insteon local component](/components/insteon_local/). The lights will be automatically disovered and added to Home Assistant. The device names will be the Insteon address of the lights. diff --git a/source/_components/switch.insteon_local.markdown b/source/_components/switch.insteon_local.markdown index 0200b5cd439..0d8c71aa8d8 100644 --- a/source/_components/switch.insteon_local.markdown +++ b/source/_components/switch.insteon_local.markdown @@ -14,20 +14,4 @@ ha_version: 0.36 The `insteon_local` switch component lets you control your switches connected to an [Insteon Hub](http://www.insteon.com/insteon-hub/) with Home Assistant. -To integrate add a switch, configure your hub Insteon(local) with Home Assistant, add the following section to your `configuration.yaml` file: -```yaml -# Example configuration.yaml platform entry -insteon_local: - host: YOUR HUB IP - username: YOUR HUB USERNAME - password: YOUR HUB PASSWORD - timeout: 10 - port: 25105 -``` - -To add switches to your set-up, add the platform to your light configuration: -```yaml -switch: - - platform: insteon_local -``` - +To get your insteon switches working with Home Assistant, follow the instructions for the general [Insteon local component](/components/insteon_local/). The switches will be automatically disovered and added to Home Assistant. The device names will be the Insteon address of the switch. From 08b3c109cc63f719be297bc1711843f9563341ef Mon Sep 17 00:00:00 2001 From: Sean Wilson Date: Tue, 9 Jan 2018 15:59:04 -0500 Subject: [PATCH 49/60] Add monitored_conditions documentation. (#4303) * Add monitored_conditions documentation. * Remove monitored_conditions from example * Add missing 'week' monitored_condition --- source/_components/sensor.zoneminder.markdown | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/source/_components/sensor.zoneminder.markdown b/source/_components/sensor.zoneminder.markdown index 5ab384d0020..e60e2742058 100644 --- a/source/_components/sensor.zoneminder.markdown +++ b/source/_components/sensor.zoneminder.markdown @@ -32,3 +32,10 @@ sensor: Configuration variables: - **include_archived** (*Optional*): Whether to include archived ZoneMinder events in event counts. Default is `false`. +- **monitored_conditions** array (*Optional*): Event count sensors to display in the frontend. Default is 'all'. + - **all**: All events. + - **month**: Events in the last month. + - **week**: Events in the last week. + - **day**: Events in the last day. + - **hour**: Events in the last hour. + From 4d46155c4dec9d4ff64753b4c45e02c271a351e1 Mon Sep 17 00:00:00 2001 From: Eric Pignet Date: Wed, 10 Jan 2018 14:05:32 +1100 Subject: [PATCH 50/60] Doc for Squeezebox new services (#4142) * Add service squeezebox_call_method to Squeezebox doc * Update media_player.squeezebox.markdown * Add Squeezebox as supporting shuffle_set * Adapted to component's pull request feedback --- source/_components/media_player.markdown | 2 +- .../media_player.squeezebox.markdown | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/source/_components/media_player.markdown b/source/_components/media_player.markdown index 18350ce1326..5e19cf34e9c 100644 --- a/source/_components/media_player.markdown +++ b/source/_components/media_player.markdown @@ -58,7 +58,7 @@ Available services: `turn_on`, `turn_off`, `toggle`, `volume_up`, `volume_down`, #### {% linkable_title Service `media_player/shuffle_set` %} -Currently only supported on [Spotify](/components/media_player.spotify/), [MPD](/components/media_player.mpd/), [Kodi](/components/media_player.kodi/), and [Universal](/components/media_player.universal/). +Currently only supported on [Spotify](/components/media_player.spotify/), [MPD](/components/media_player.mpd/), [Kodi](/components/media_player.kodi/), [Squeezebox](/components/media_player.squeezebox/) and [Universal](/components/media_player.universal/). | Service data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------- | diff --git a/source/_components/media_player.squeezebox.markdown b/source/_components/media_player.squeezebox.markdown index d091d13b6d9..b226960e31b 100644 --- a/source/_components/media_player.squeezebox.markdown +++ b/source/_components/media_player.squeezebox.markdown @@ -33,3 +33,25 @@ Configuration variables: - **password** (*Optional*): The password, if password protection is enabled.

This platform now uses the web interface of the Logitech Media Server to send commands. The default port of the web interface is 9000. It is the same port that you use to access the LMS through your web browser. Originally, this platform used the telnet interface, which defaults to 9090. If you previously specified the port in your configuration file, you will likely need to update it.

+ +### {% linkable_title Service `squeezebox_call_method` %} + +Call a custom Squeezebox JSONRPC API. + +See documentation for this interface on http://HOST:PORT/html/docs/cli-api.html?player= where HOST and PORT are the host name and port for your Logitech Media Server. + +| Service data attribute | Optional | Description | +| ---------------------- | -------- | ----------- | +| `entity_id` | no | Name(s) of the Squeezebox entities where to run the API method. +| `command` | no | Command to pass to Logitech Media Server (p0 in the CLI documentation). +| `parameters` | yes | Array of additional parameters to pass to Logitech Media Server (p1, ..., pN in the CLI documentation). + +This service can be used to integrate any Squeezebox action to an automation. + +It can also be used to target a Squeezebox from IFTT (or DialogFlow, Alexa...). + +For example, to play an album from your collection, create an IFTT applet like this: +- Trigger: Google assistant, with sentence: `I want to listen to album $` +- Action: JSON post query with such JSON body: +`{ "entity_id": "media_player.squeezebox_radio", "command": "playlist", "parameters": ["loadtracks", "album.titlesearch={{TextField}}"] }` +This can work with title search and basically any thing. The same wouldn't have worked by calling directly Squeezebox server as IFTT cannot escape the text field. From 9109d9d67ffd725c1bd9b9b23e7dbb31fabc78cf Mon Sep 17 00:00:00 2001 From: Nolan Gilley Date: Wed, 10 Jan 2018 18:42:41 -0500 Subject: [PATCH 51/60] Add coinbase component and sensor (#4168) * coinbase. pr 11036 * Update coinbase.markdown * exchange rate sensors * Update coinbase.markdown * Update sensor.coinbase.markdown * Update coinbase.markdown --- source/_components/coinbase.markdown | 47 ++++++++++++++++++++ source/_components/sensor.coinbase.markdown | 15 +++++++ source/images/supported_brands/coinbase.png | Bin 0 -> 37777 bytes 3 files changed, 62 insertions(+) create mode 100644 source/_components/coinbase.markdown create mode 100644 source/_components/sensor.coinbase.markdown create mode 100755 source/images/supported_brands/coinbase.png diff --git a/source/_components/coinbase.markdown b/source/_components/coinbase.markdown new file mode 100644 index 00000000000..d39e34e3a73 --- /dev/null +++ b/source/_components/coinbase.markdown @@ -0,0 +1,47 @@ +--- +layout: page +title: "coinbase" +description: "Instructions for how to add Coinbase sensors to Home Assistant." +date: 2017-12-08 17:54 +sidebar: true +comments: false +sharing: true +footer: true +logo: coinbase.png +ha_release: 0.61 +ha_iot_class: "Cloud Polling" +--- + + +The `coinbase` component lets you access account balances and exchange rates from [coinbase](https://coinbase.com). + +You will need to obtain an API key from coinbase's [developer site](https://www.coinbase.com/settings/api) to use this component. You need to give read access to `wallet:accounts` in order for the component to access relevant data. + +To set it up, add the following information to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +coinbase: + api_key: asdfghjklqwertyuiopzxcvbnm + api_secret: nkjnewncfghjklqwertyuiopzxcvbnm + exchange_rate_currencies: + - BTC + - ETH + - LTC +======= +``` + +{% configuration %} +api_key: + description: Your API key to access coinbase. + required: true + type: string +api_secret: + description: Your API secret to access coinbase. + required: true + type: string +exchange_rate_currencies: + description: List of currencies to create exchange rate sensors for. + required: false + type: list +{% endconfiguration %} diff --git a/source/_components/sensor.coinbase.markdown b/source/_components/sensor.coinbase.markdown new file mode 100644 index 00000000000..89c06fc6f35 --- /dev/null +++ b/source/_components/sensor.coinbase.markdown @@ -0,0 +1,15 @@ +--- +layout: page +title: "Coinbase Sensor" +description: "Instructions how to setup Coinbase sensors within Home Assistant." +date: 2017-12-08 18:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: coinbase.png +ha_category: Sensor +ha_release: 0.61 +--- + +To get your coinbase sensors working with Home Assistant, follow the instructions for the general [Coinbase component](/components/coinbase/). diff --git a/source/images/supported_brands/coinbase.png b/source/images/supported_brands/coinbase.png new file mode 100755 index 0000000000000000000000000000000000000000..03f5018cae890348203e3f0a777e4293e10071d0 GIT binary patch literal 37777 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

!xj+OVVkF*suG!SnF=yf}`YE2EKdVZk$} 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 Date: Thu, 11 Jan 2018 16:48:28 +0100 Subject: [PATCH 52/60] Included note instructing to enclose Norwegian language code in quotes to avoid it being evaluated as a boolean. (#4393) --- source/_components/binary_sensor.workday.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_components/binary_sensor.workday.markdown b/source/_components/binary_sensor.workday.markdown index 3864850d146..7730c514fec 100644 --- a/source/_components/binary_sensor.workday.markdown +++ b/source/_components/binary_sensor.workday.markdown @@ -37,6 +37,7 @@ Configuration variables: Days are specified as follows: `mon`, `tue`, `wed`, `thu`, `fri`, `sat`, `sun`. The keyword `holiday` is used for public holidays identified by the holidays module.

+If you use the sensor for Norway (`NO`) you need to wrap `NO`in quotes or write the name in full. Otherwise the value is evaluated as `False`. If you use the sensor for Canada (`CA`) with Ontario (`ON`) as `province:` then you need to wrap `ON` in quotes. Otherwise the value is evaluated as `True` (check the YAML documentation for further details) and the sensor will not work.

From 06fe679bd8abc574d2a8cbcb71168c1aca2b7ec6 Mon Sep 17 00:00:00 2001 From: Mitko Masarliev Date: Thu, 11 Jan 2018 22:23:47 +0200 Subject: [PATCH 53/60] PR#11027 (#4196) --- source/_components/notify.webostv.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/notify.webostv.markdown b/source/_components/notify.webostv.markdown index 408c31eef02..8064c8fbf85 100644 --- a/source/_components/notify.webostv.markdown +++ b/source/_components/notify.webostv.markdown @@ -33,7 +33,7 @@ Configuration variables: - **host** (*Required*): The IP of the LG WebOS Smart TV, e.g. 192.168.0.10 - **name** (*Required*): The name you would like to give to the LG WebOS Smart TV. - **filename** (*Optional*): The filename where the pairing key with the TV should be stored. This path is relative to Home Assistant's config directory. It defaults to `webostv.conf`. -- **icon** (*Optional*): The path to an image file to use as the icon in notifications. If provided, this image will override the Home Assistant logo. +- **icon** (*Optional*): The path to an image file to use as the icon in notifications. A possible automation could be: From fa13b976188d4b4791e20d551e3da575d2105456 Mon Sep 17 00:00:00 2001 From: Bob Anderson Date: Thu, 11 Jan 2018 13:17:05 -0800 Subject: [PATCH 54/60] Add note about ordering (#4289) * add note about ordering, matching PR #11340 in HA * :pencil2: Grammar --- source/_components/history.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/history.markdown b/source/_components/history.markdown index b7cd506edd5..4bddad4fbba 100644 --- a/source/_components/history.markdown +++ b/source/_components/history.markdown @@ -71,7 +71,7 @@ history: - media_player ``` -Use the `include` list to define the domains/entities to display, and exclude some of them with in the `exclude` list. This makes sense if you for instance include the `sensor` domain, but want to exclude some specific sensors. Instead of adding every sensor entity to the `include` `entities` list just include the `sensor` domain and exclude the sensor entities you are not interested in. +Use the `include` list to define the domains/entities to display, and exclude some of them within the `exclude` list. This makes sense if you, for instance, include the `sensor` domain, but want to exclude some specific sensors. Instead of adding every sensor entity to the `include` `entities` list just include the `sensor` domain and exclude the sensor entities you are not interested in. Note that the order of any `include` `entities` will be displayed as listed in the configuration, otherwise, the display order is arbitrary. ```yaml # Example configuration.yaml entry with include and exclude From b4b0972cc54a3a06535de47b2da3922080c4f114 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 11 Jan 2018 13:45:14 -0800 Subject: [PATCH 55/60] Add docs for entity_config for Google Assistant and Alexa (#4386) * Update cloud docs and google assistant docs * Unpublish Google Assistant * :pencil2: Grammar * :pencil2: Missing comma * :pencil2: Spelling & grammar --- source/_components/cloud.alexa.markdown | 119 ++++++++++++++++ .../cloud.google_assistant.markdown | 98 +++++++++++++ source/_components/cloud.markdown | 106 +++----------- source/_components/google_assistant.markdown | 131 +++++++++++------- ...-introducing-home-assistant-cloud.markdown | 4 +- source/index.html | 2 +- 6 files changed, 324 insertions(+), 136 deletions(-) create mode 100644 source/_components/cloud.alexa.markdown create mode 100644 source/_components/cloud.google_assistant.markdown diff --git a/source/_components/cloud.alexa.markdown b/source/_components/cloud.alexa.markdown new file mode 100644 index 00000000000..81a4b09eac6 --- /dev/null +++ b/source/_components/cloud.alexa.markdown @@ -0,0 +1,119 @@ +--- +layout: page +title: "Alexa via Home Assistant Cloud" +description: "Enable the Alexa integration via Home Assistant Cloud integration." +date: 2017-11-17 20:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: home-assistant.png +ha_release: 0.60 +ha_category: Cloud +ha_iot_class: "Cloud Push" +--- + +The Alexa integration allows users to control the entities via the [Home Assistant Smart Home skill for Alexa][alexa skill]. This means that you can say things like "Alexa, turn on the kitchen light" to control your local Home Assistant. + +To use this integration, you need to have: + + - The cloud component set up. [Learn more](/components/cloud/) + - An Alexa enabled device like the Amazon Echo + - Activated the [Home Assistant Smart Home skill for Alexa][alexa skill] + +

Only Amazon US is currently supported. Other regions are being certified.

+ +You can use `configuration.yaml` to configure the entities that are being shown to Alexa and how they are exposed. + +```yaml +# Example configuration.yaml entry configuring Alexa +cloud: + alexa: + filter: + include_entities: + - light.kitchen + - light.kitchen_left + include_domains: + - switch + exclude_entities: + - switch.outside + entity_config: + light.kitchen: + name: Custom Name for Alexa + description: The light in the kitchen + switch.stairs: + display_categories: LIGHT +``` + +{% configuration %} +alexa: + description: Configuration options for the Amazon Alexa integration. + required: false + type: map + keys: + filter: + description: Filters for entities to include/exclude from Alexa. + required: false + type: map + keys: + include_entities: + description: Entity IDs to include. + required: false + type: list + include_domains: + description: Domains to include. + required: false + type: list + exclude_entities: + description: Entity IDs to exclude. + required: false + type: list + exclude_domains: + description: Domains to exclude. + required: false + type: list + entity_config: + description: Entity specific configuration for Alexa + required: false + type: map + keys: + '``': + description: Entity to configure + required: false + type: map + keys: + name: + description: Name of entity to show in Alexa + required: false + type: string + description: + description: Description of entity to show in Alexa + required: false + type: string + display_categories: + description: The display category to use in Alexa. [Available categories](https://developer.amazon.com/docs/device-apis/alexa-discovery.html#display-categories) + required: false + type: string +{% endconfiguration %} + +### {% linkable_title Possible values for customizing %} + +_Configuration via `customize:` is no longer available. Use the entity config as described above._ + +### {% linkable_title Available domains %} +Currently, the following domains are available to be used with Alexa: + +- alert +- automation (enables/disables) +- cover +- fan (supports on/off and set speed) +- group +- input_boolean +- light +- lock (lock and unlock, but unlock is untested as Amazon has disabled unlock for now) +- media_player (play, pause, stop, set volume, adjust volume, next track, and previous track) +- scene +- script (enables/disables) +- switch + +[alexa skill]: https://alexa.amazon.com/spa/index.html#skills/dp/B0772J1QKB/?ref=skill_dsk_skb_sr_2 diff --git a/source/_components/cloud.google_assistant.markdown b/source/_components/cloud.google_assistant.markdown new file mode 100644 index 00000000000..1ab00b84377 --- /dev/null +++ b/source/_components/cloud.google_assistant.markdown @@ -0,0 +1,98 @@ +--- +layout: page +title: "Google Assistant via Home Assistant Cloud" +description: "Enable the Google Assistant via Home Assistant Cloud integration." +date: 2017-11-17 20:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: home-assistant.png +ha_release: 0.61 +ha_category: Cloud +ha_iot_class: "Cloud Push" +published: false +--- + +The Google Assistant integration allows users to control the entities via the Home Assistant Smart Home skill for Google Assistant. This means that you can say things like "Ok Google, turn on the kitchen light" to control your local Home Assistant. + +To use this integration, you need to have: + + - The cloud component set up. [Learn more](/components/cloud/) + - A Google Assistant enabled device like the Google Home + - Activated the Home Assistant Smart Home skill for Google Assistant + +You can use `configuration.yaml` to configure the entities that are being shown to Google Assistant and how they are exposed. + +```yaml +# Example configuration.yaml entry configuring Google Assistant +cloud: + google_actions: + filter: + include_entities: + - light.kitchen + - light.kitchen_left + include_domains: + - switch + exclude_entities: + - switch.outside + entity_config: + switch.kitchen: + name: Custom Name for Alexa + aliases: + - bright lights + - entry lights + type: 'action.devices.types.LIGHT' +``` + +{% configuration %} +google_actions: + description: Configuration options for the Google Assistant integration. + required: false + type: map + keys: + filter: + description: Filters for entities to include/exclude from Alexa. + required: false + type: map + keys: + include_entities: + description: Entity IDs to include. + required: false + type: list + include_domains: + description: Domains to include. + required: false + type: list + exclude_entities: + description: Entity IDs to exclude. + required: false + type: list + exclude_domains: + description: Domains to exclude. + required: false + type: list + entity_config: + description: Entity specific configuration for Google Assistant + required: false + type: map + keys: + '``': + description: Entity to configure + required: false + type: map + keys: + name: + description: Name of entity to show in Google Assistant + required: false + type: string + aliases: + description: Aliases that can also be used to refer to this entity + required: false + type: list + type: + description: Override the type of the entity in Google Assistant. [List of available types](https://developers.google.com/actions/smarthome/guides/) + required: false + type: string +{% endconfiguration %} + diff --git a/source/_components/cloud.markdown b/source/_components/cloud.markdown index 3710eeff24e..57717e6eabe 100644 --- a/source/_components/cloud.markdown +++ b/source/_components/cloud.markdown @@ -1,6 +1,6 @@ --- layout: page -title: "Cloud" +title: "Home Assistant Cloud" description: "Enable the Home Assistant Cloud integration." date: 2017-11-17 20:00 sidebar: true @@ -13,95 +13,35 @@ ha_category: Voice ha_iot_class: "Cloud Push" --- -The Home Assistant Cloud allows you to quickly integrate your local Home Assistant with various cloud services. Any processing of services from other cloud services is handled by your local Home Assistant. +

The Home Assistant Cloud is currently in open beta and will become part of the upcoming Community Support Package. [Learn more](/blog/2017/12/17/introducing-home-assistant-cloud/)

+ +The Home Assistant Cloud allows you to quickly integrate your local Home Assistant with various cloud services like Amazon Alexa. + +The following integrations are currently available: + + - [Amazon Alexa (Amazon Echo)](/components/cloud.alexa/) + + + +### {% linkable_title How does it work? %} + +The Home Assistant Cloud has been designed with security in mind. When you activate the Cloud component, your instance will create a secure connection to the Home Assistant Cloud. There is no need for any further configuration or to expose your instance to the internet. + +Integrations like Alexa will deliver messages to our cloud which we will forward to your local instance for processing. We just forward the response back to Alexa. This means that we do not have to store the state of your house in our cloud, we’re just the messenger! + +You can find a list of frequently asked questions (and their answers) in [this blog post](/blog/2017/12/17/introducing-home-assistant-cloud/#faq). + +### {% linkable_title Enabling the cloud %} + +The Home Assistant Cloud is enabled by default. If not, add this to your configuration: ```yaml # Example configuration.yaml entry to enable the cloud component cloud: ``` -Once activated, go to the configuration panel in Home Assistant and create an account and log in. There is no need to configure your router or expose your instance to the internet in any other way. - -If you are not seeing the **Configuration** panel, make sure you have the following option enabled in your configuration.yaml` file. +Once activated, go to the configuration panel in Home Assistant and create an account and log in. If you are not seeing the **Configuration** panel, make sure you have the following option enabled in your configuration.yaml` file. ```yaml config: ``` - -### {% linkable_title Amazon Alexa %} - -The Alexa integration allows users to control the entities via the [Home Assistant Smart Home skill for Alexa][alexa skill]. This means that you can say things like "Alexa, turn on the kitchen light" to control your local instance. - -```yaml -# Example configuration.yaml entry configuring Alexa -cloud: - alexa: - filter: - include_entities: - - light.kitchen - include_domains: - - switch - exclude_entities: - - light.living_room - exclude_domains: - - script -``` - -{% configuration %} -alexa: - description: Configuration options for the Amazon Alexa integration. - required: false - type: map - keys: - filter: - description: Filters for entities to include/exclude from Alexa. - required: false - type: map - keys: - include_entities: - description: Entity IDs to include. - required: false - type: list - include_domains: - description: Domains to include. - required: false - type: list - exclude_entities: - description: Entity IDs to exclude. - required: false - type: list - exclude_domains: - description: Domains to exclude. - required: false - type: list -{% endconfiguration %} - -### {% linkable_title Possible values for customize %} - -| Attribute | Description | -| --------- | ----------- | -| `alexa_hidden` | Hide the entity from the Alexa smart home devices. -| `alexa_name` | Defines name of the entity for a Alexa smart home device. Useful if you have an entity with a friendly name in a local language that you want to access using an English sounding name. -| `alexa_description` | The description of the device in the Alexa smart home device list. -| `alexa_display_categories` | Set displayCategories, useful for things like media_player (TV/SPEAKERS) or scene (ACTIVITY_TRIGGER/SCENE_TRIGGER). More info can be found [here](https://developer.amazon.com/docs/device-apis/alexa-discovery.html#display-categories). - -### {% linkable_title Available domains %} -Currently, the following domains are available to be used with Alexa: -- alert -- automation (enables/disables) -- cover -- fan (supports on/off and set speed) -- group -- input_boolean -- light -- lock (lock and unlock, but unlock is untested as Amazon has disabled unlock for now) -- media_player (play, pause, stop, set volume, adjust volume, next track and previous track) -- scene -- script (enables/disables) -- switch - -[alexa skill]: https://alexa.amazon.com/spa/index.html#skills/dp/B0772J1QKB/?ref=skill_dsk_skb_sr_2 - -### {% linkable_title Frequently Asked Questions %} - -You can find a list of frequently asked questions (and their answers) in [this blog post](https://home-assistant.io/blog/2017/12/17/introducing-home-assistant-cloud/#faq). diff --git a/source/_components/google_assistant.markdown b/source/_components/google_assistant.markdown index 1e27ce6cc33..8d52c96919a 100644 --- a/source/_components/google_assistant.markdown +++ b/source/_components/google_assistant.markdown @@ -18,7 +18,7 @@ The `google_assistant` component allows you to control things via Google Assista The Google Assistant component requires a bit more setup than most due to the way Google requires Assistant Apps to be set up.

-To use Google Assistant your Home Assistant configuration has to be externally accessible, with a hostname and SSL certificate. If you haven't already configured that you should do so before continuing. +To use Google Assistant, your Home Assistant configuration has to be externally accessible, with a hostname and SSL certificate. If you haven't already configured that you should do so before continuing.

To enable this, add the following lines to your `configuration.yaml` file: @@ -35,26 +35,77 @@ google_assistant: - switch - light - group + entity_config: + switch.kitchen: + name: Custom Name for Alexa + aliases: + - bright lights + - entry lights + type: 'action.devices.types.LIGHT' + light.living_room: + expose: false ``` Configuration variables: -- **expose_by_default** (*Optional*): Expose devices in all supported domains by default. -- **project_id** (*Required*): Project ID from the Google Developer console (looks like `words-2ab12`) -- **client_id** (*Required*): A long random URL safe string (no spaces or special characters) that will be used for Implicit OAuth. -- **access_token** (*Required*): Another different long random URL safe string. -- **agent_user_id** (*Optional*): A string to identify the user, e.g., email address. If not provided, the component will generate one. -- **api_key** (*Optional*): An API Key generated for the project from [Google Console](https://console.cloud.google.com/apis/api/homegraph.googleapis.com/overview) which allows you to update devices without unlinking and relinking an account (see setup below). If not provided then the request_sync service is not exposed. -- **exposed_domains** (*Optional*): An array of Home Assistant domains to expose to Google Assistant. Options include: - - `switch` - - `light` - - `cover` - - `media_player` - - `group` - - `fan` - - `scene` - - `script` - - `climate` +{% configuration %} + +project_id: + description: Project ID from the Google Developer console (looks like `words-2ab12`) + required: true + type: string +client_id: + description: A long random URL safe string (no spaces or special characters) that will be used for Implicit OAuth (example `aBcDeFgHiJkLmNoP`) + required: true + type: string +access_token: + description: Another different long random URL safe string (example `aBcDeFgHiJkLmNoP`) + required: true + type: string +agent_user_id: + description: A string to identify the user, e.g., email address. If not provided, the component will generate one. + required: false + type: string +api_key: + description: An API Key generated for the project from [Google Console](https://console.cloud.google.com/apis/api/homegraph.googleapis.com/overview) which allows you to update devices without unlinking and relinking an account (see setup below). If not provided then the request_sync service is not exposed. + required: false + type: string +expose_by_default: + description: Expose devices in all supported domains by default. + required: false + default: True + type: boolean +exposed_domains: + description: List of entity domains to expose to Google Assistant. + required: false + type: list +entity_config: + description: Entity specific configuration for Google Assistant + required: false + type: map + keys: + '``': + description: Entity to configure + required: false + type: map + keys: + name: + description: Name of the entity to show in Google Assistant + required: false + type: string + expose: + description: Force an entity to be exposed/excluded. + required: false + type: boolean + aliases: + description: Aliases that can also be used to refer to this entity + required: false + type: list + type: + description: Override the type of the entity in Google Assistant. [List of available types](https://developers.google.com/actions/smarthome/guides/) + required: false + type: string +{% endconfiguration %} It's very important that you use very long strings for `client_id` and `access_token`. Those are essentially the credentials to your Home Assistant instance. You can generate them with the following command: @@ -64,31 +115,6 @@ $ cat /dev/urandom | fold -w 120 | head -n 1 | base64 -w 0 | tr -dc '0-9A-Za-z' If you're not using Linux, you can use sites such as [this one](https://www.browserling.com/tools/random-string) to generate a random string (containing mixed case letters and numbers) of up to 80 characters. - -You can also customize your devices similar to other components by adding keys to entities: - -```yaml -homeassistant: - customize: - master_bedroom_light: - google_assistant: true - google_assistant_name: bedroom light - bedroom_blinds: - aliases: - - bedroom shades - - bedroom covers - hallway_ceiling_switch: - google_assistant: true - google_assistant_type: light -``` - -Entity Customization Keys: - -- **google_assistant**: True exposes entity, false will hide it. -- **google_assistant_name**: Can be used to override the primary name of an entity. By default the `friendly_name` of an entity is used. -- **google_assistant_type**: Can be used to override the domain/type of an entity. For example a switch can be treated as a light -- **aliases**: Provides "nicknames" to Google Assistant. These function as alternate names for an entity that Assistant will understand when spoken. - ### {% linkable_title Setup %} 1. Download the [gactions CLI](https://developers.google.com/actions/tools/gactions-cli) (you'll use this later) - you can download and run this anywhere and on any machine, just remember where you put it for later (and don't forget to run `chmod +x gactions`to make it executable on mac or linux) @@ -132,8 +158,8 @@ Entity Customization Keys: 8. If you haven't already added the component configuration to `configuration.yaml` and restarted Home Assistant, you'll be unable to continue until you have. 8. Open the Google Assistant app and go into `Settings > Home Control` 9. Click the `+` sign, and near the bottom, you should have `[test] your app name`. Selecting that should lead to you the screen where you can set rooms for your devices or nicknames for your devices. -10. If you want to allow other houshold users to control the devices: - 1. Go to the developer console using address from point 4. +10. If you want to allow other household users to control the devices: + 1. Go to the developer console using the address from point 4. 2. Under the gear icon, click `Permissions` 3. Click `Add`, type the new user's e-mail address and choose `Project -> Editor` role 4. Have the new user go to [developer console](https://console.actions.google.com/) and repeat steps starting from point 7. @@ -143,11 +169,14 @@ Entity Customization Keys: 3. Go to Credentials and select API Key from Create Credentials 4. Note down the generated API Key and use this in the configuration -*Note:* The request_sync service requires that the initial sync from Google includes the agent_user_id. If not, the service will log an error that reads something like "Request contains an invalid argument". If this happens, then [unlink the account](https://support.google.com/googlehome/answer/7506443?hl=en-GB) from Home Control and relink. +### {% linkable_title Troubleshooting the request_sync service %} -*Note:* The request_sync service may fail with a 404 if the project_id of the Homegraph API differs from the project_id of the Actions SDK found in the preferences of your project on [developer console](https://console.actions.google.com). Resolve this by: - 1. Removing your project on the [developer console](https://console.actions.google.com). - 2. Add a new project in the [cloud console](https://console.cloud.google.com). Here you get a new project_id. - 3. Enable Homegraph API to the new project. - 4. Generete a new API key. - 5. Again create a new project in the [developer console](https://console.actions.google.com/). Described above. But at the step 'Build under the Actions SDK box' choose your newly created project. By this they share the same project_id. +The request_sync service requires that the initial sync from Google includes the agent_user_id. If not, the service will log an error that reads something like "Request contains an invalid argument". If this happens, then [unlink the account](https://support.google.com/googlehome/answer/7506443?hl=en-GB) from Home Control and relink. + +The request_sync service may fail with a 404 if the project_id of the Homegraph API differs from the project_id of the Actions SDK found in the preferences of your project on [developer console](https://console.actions.google.com). Resolve this by: + + 1. Removing your project from the [developer console](https://console.actions.google.com). + 2. Add a new project to the [cloud console](https://console.cloud.google.com). Here you get a new project_id. + 3. Enable Homegraph API to the new project. + 4. Generate a new API key. + 5. Again create a new project in the [developer console](https://console.actions.google.com/). Described above. But at the step 'Build under the Actions SDK box' choose your newly created project. By this, they share the same project_id. diff --git a/source/_posts/2017-12-17-introducing-home-assistant-cloud.markdown b/source/_posts/2017-12-17-introducing-home-assistant-cloud.markdown index ddc52e5ab7c..b55eabb3e31 100644 --- a/source/_posts/2017-12-17-introducing-home-assistant-cloud.markdown +++ b/source/_posts/2017-12-17-introducing-home-assistant-cloud.markdown @@ -14,7 +14,9 @@ Today we’re introducing the next step in the Home Assistant saga: the Home Ass The first service that is supported via the Home Assistant Cloud is the Amazon Alexa Smart Home skill. This integration will allow you to control all your devices in Home Assistant via Amazon Alexa. You will be able to say _“Alexa, turn on the kitchen lights”_ and your local Home Assistant will turn on the lights. Because Alexa talks to Home Assistant, it doesn’t matter what kind of lights they are! Anything that is linked to Home Assistant will work. IKEA lights, a 10 year old X10 switch or something you’ve made yourself. As long as Home Assistant can control it, you can control it via Alexa. -We have designed the Home Assistant Cloud with security in mind. When you activate the new Cloud component, your instance will setup a secure connection to the Home Assistant Cloud. Alexa will deliver messages to our cloud which we will forward to your local instance for processing. We just forward the response back to Alexa. This means that we do not have to store the state of your house in our cloud, we’re just the messenger! +We have designed the Home Assistant Cloud with security in mind. When you activate the new Cloud component, your instance will create a secure connection to the Home Assistant Cloud. There is no need for any further configuration or to expose your instance to the internet. + +Integrations like Alexa will deliver messages to our cloud which we will forward to your local instance for processing. We just forward the response back to Alexa. This means that we do not have to store the state of your house in our cloud, we’re just the messenger! We are making the beta of the Home Assistant Cloud publicly available today. During the beta period the Home Assistant Cloud will be free to use. We are currently planning to run a beta till March 1, 2018 0:00 UTC. Once the beta ends, the Home Assistant Cloud will be part of our Community Support package which will run at $5 USD/month. diff --git a/source/index.html b/source/index.html index 173bef72c13..a847b2632b9 100644 --- a/source/index.html +++ b/source/index.html @@ -38,7 +38,7 @@ description: Open-source home automation platform running on Python 3. Track and Use Alexa to control Home Assistant. From 88932265276720993e1f2736c01efc098955e861 Mon Sep 17 00:00:00 2001 From: Marius Date: Thu, 11 Jan 2018 23:52:49 +0200 Subject: [PATCH 56/60] Updated generic thermostat documentation (#4285) * Updated documentation for PR https://github.com/home-assistant/home-assistant/pull/11325/files * Updated documentation to match implementation using only one away_temp * Updated documentation to add back initial_operation_mode avoiding breaking change * :pencil2: Minor grammar --- .../climate.generic_thermostat.markdown | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/source/_components/climate.generic_thermostat.markdown b/source/_components/climate.generic_thermostat.markdown index 180f67f04e7..d816c7ac5fe 100644 --- a/source/_components/climate.generic_thermostat.markdown +++ b/source/_components/climate.generic_thermostat.markdown @@ -14,7 +14,7 @@ ha_iot_class: "Local Polling" --- -The `generic_thermostat` climate platform is a thermostat implemented in Home Assistant. It uses a sensor and a switch connected to a heater under the hood. If the measured temperature is cooler then the target temperature, the heater will be turned on and turned off when required temperature is reached. +The `generic_thermostat` climate platform is a thermostat implemented in Home Assistant. It uses a sensor and a switch connected to a heater or air conditioning under the hood. When in heater mode, if the measured temperature is cooler then the target temperature, the heater will be turned on and turned off when the required temperature is reached. When in air conditioning mode, if the measured temperature is hotter then the target temperature, the air conditioning will be turned on and turned off when required temperature is reached. ```yaml # Example configuration.yaml entry @@ -28,20 +28,25 @@ climate: Configuration variables: - **name** (*Required*): Name of thermostat -- **heater** (*Required*): `entity_id` for heater switch, must be a toggle device. +- **heater** (*Required*): `entity_id` for heater switch, must be a toggle device. Becomes air conditioning switch when `ac_mode` is set to `True` - **target_sensor** (*Required*): `entity_id` for a temperature sensor, target_sensor.state must be temperature. - **min_temp** (*Optional*): Set minimum set point available (default: 7) - **max_temp** (*Optional*): Set maximum set point available (default: 35) -- **target_temp** (*Optional*): Set initial target temperature. Failure to set this variable will result in target temperature being set to null on startup. As of version 0.59 it will retain the target temperature set before restart if this variable is not configured. +- **target_temp** (*Optional*): Set initial target temperature. Failure to set this variable will result in target temperature being set to null on startup. As of version 0.59, it will retain the target temperature set before restart if available. - **ac_mode** (*Optional*): Set the switch specified in the *heater* option to be treated as a cooling device instead of a heating device. - **min_cycle_duration** (*Optional*): Set a minimum amount of time that the switch specified in the *heater* option must be in it's current state prior to being switched either off or on. - **cold_tolerance** (*Optional*): Set a minimum amount of difference between the temperature read by the sensor specified in the *target_sensor* option and the target temperature that must change prior to being switched on. For example, if the target temperature is 25 and the tolerance is 0.5 the heater will start when the sensor equals or goes below 24.5. - **hot_tolerance** (*Optional*): Set a minimum amount of difference between the temperature read by the sensor specified in the *target_sensor* option and the target temperature that must change prior to being switched off. For example, if the target temperature is 25 and the tolerance is 0.5 the heater will stop when the sensor equals or goes above 25.5. -- **keep_alive** (*Optional*): Set a keep-alive interval. If set, the switch specified in the *heater* option will be triggered every time the interval elapses. Use with heaters and A/C units that shut off if they don't receive a signal from their remote for a while. +- **keep_alive** (*Optional*): Set a keep-alive interval. If set, the switch specified in the *heater* option will be triggered every time the interval elapses. Use with heaters and A/C units that shut off if they don't receive a signal from their remote for a while. Use also with switches that might lose state. The keep-alive call is done with the current valid climate component state (either on or off). - **initial_operation_mode** (*Optional*): Set the initial operation mode. Valid values are `off` or `auto`. Value has to be double quoted. If this parameter is not set, it is preferable to set a *keep_alive* value. This is helpful to align any discrepancies between *generic_thermostat* and *heater* state. +- **away_temp** (*Optional*): Set the temperature used by "away_mode" (default: 16). Please specify when using `ac_mode: True` to a higher value. A full configuration example looks like the one below. `min_cycle_duration` and `keep_alive` must contain at least one of the following entries: `days:`, `hours:`, `minutes:`, `seconds:` or `milliseconds:`. +Currently the `generic_thermostat` climate platform supports 'heat', 'cool' and 'off' operation modes. You can force your `generic_thermstat` to avoid starting by setting Operation to 'off'. + +Please note that changing Away Mode you will force a target temperature change as well that will get restored once the Away Mode is turned off. + ```yaml # Full example configuration.yaml entry climate: @@ -51,6 +56,7 @@ climate: target_sensor: sensor.study_temperature min_temp: 15 max_temp: 21 + ac_mode: False target_temp: 17 cold_tolerance: 0.3 hot_tolerance: 0 @@ -59,4 +65,5 @@ climate: keep_alive: minutes: 3 initial_operation_mode: "off" + away_temp: 16 ``` From 666c8657b0ed9fbfe59a9319380ea798fdd8c6e5 Mon Sep 17 00:00:00 2001 From: NotoriousBDG Date: Thu, 11 Jan 2018 17:00:32 -0500 Subject: [PATCH 57/60] Change default IMAP Email Content sensor value from body to subject (#4199) * Change default sensor value from body to subject * :pencil2: Grammar --- source/_components/sensor.imap_email_content.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/sensor.imap_email_content.markdown b/source/_components/sensor.imap_email_content.markdown index cb639b436cf..35f9d2d694a 100644 --- a/source/_components/sensor.imap_email_content.markdown +++ b/source/_components/sensor.imap_email_content.markdown @@ -38,7 +38,7 @@ Configuration variables: - **username** (*Required*): Username for the IMAP server. - **password** (*Required*): Password for the IMAP server. - **senders** (*Required*): A list of sender email addresses that are allowed to report state via email. Only emails received from these addresses will be processed. -- **value_template** (*Optional*): If specified this template will be used to render the state of sensor. If a template is not supplied the raw message body will be used for the sensor value. The following attributes will be supplied to the template: +- **value_template** (*Optional*): If specified this template will be used to render the state of the sensor. If a template is not supplied the message subject will be used for the sensor value. The following attributes will be supplied to the template: * **from**: The from address of the email * **body**: The body of the email From 99541284dc5c25e518322856acb129ab964f7ae6 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 15 Jan 2018 09:32:27 +0100 Subject: [PATCH 58/60] Update for 0.61 --- _config.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/_config.yml b/_config.yml index 413de4a3ab4..f05fc66aca5 100644 --- a/_config.yml +++ b/_config.yml @@ -139,12 +139,12 @@ social: # Home Assistant release details current_major_version: 0 -current_minor_version: 60 -current_patch_version: 1 -date_released: 2018-01-06 +current_minor_version: 61 +current_patch_version: 0 +date_released: 2018-01-14 # Either # or the anchor link to latest release notes in the blog post. # Must be prefixed with a # and have double quotes around it. # Major release: -patch_version_notes: "#release-0601---january-6" +patch_version_notes: "#" # Minor release (Example #release-0431---april-25): From 08970671b16773ba5c197e69c9e9f8b5dec591d8 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 15 Jan 2018 11:41:07 +0100 Subject: [PATCH 59/60] Add Discogs logo --- source/_components/sensor.discogs.markdown | 1 + source/images/supported_brands/discogs.png | Bin 0 -> 59964 bytes 2 files changed, 1 insertion(+) create mode 100644 source/images/supported_brands/discogs.png diff --git a/source/_components/sensor.discogs.markdown b/source/_components/sensor.discogs.markdown index 4c4bfe4ef65..281852abc79 100644 --- a/source/_components/sensor.discogs.markdown +++ b/source/_components/sensor.discogs.markdown @@ -10,6 +10,7 @@ footer: true logo: https://www.magneticmag.com/.image/t_share/MTQ5OTE1NzU4NTczMzk3OTYw/discogs-vinyl-record-mark.png ha_category: Sensor ha_release: 0.61 +logo: discogs.png ha_iot_class: "Cloud Polling" --- diff --git a/source/images/supported_brands/discogs.png b/source/images/supported_brands/discogs.png new file mode 100644 index 0000000000000000000000000000000000000000..e207579d99af6f3a8c169314aeff12e9e952d724 GIT binary patch literal 59964 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 Date: Mon, 15 Jan 2018 12:00:17 +0100 Subject: [PATCH 60/60] Add release blog post for 0.61 --- source/_posts/2018-01-14-release-61.markdown | 732 ++++++++++++++++++ .../images/blog/2018-01-0.61/components.png | Bin 0 -> 106189 bytes 2 files changed, 732 insertions(+) create mode 100644 source/_posts/2018-01-14-release-61.markdown create mode 100644 source/images/blog/2018-01-0.61/components.png diff --git a/source/_posts/2018-01-14-release-61.markdown b/source/_posts/2018-01-14-release-61.markdown new file mode 100644 index 00000000000..230b737f83b --- /dev/null +++ b/source/_posts/2018-01-14-release-61.markdown @@ -0,0 +1,732 @@ +--- +layout: post +title: "0.61: Coinbase, Discogs, iGlo, Sochain" +description: "New crypto currency sensors and other new stuff including breaking changes." +date: 2018-01-14 18:00:00 +date_formatted: "January 14, 2018" +author: Fabian Affolter +author_twitter: fabaff +comments: true +categories: Release-Notes +og_image: /images/blog/2018-01-0.61/components.png +--- + + + +Almost a 100 contributors to this release 🎉 That's what you get when you skip a release. It's a little late but "Happy New Year" and welcome to 0.61 the first release 2018. + +This release contain some breaking changes. Please make sure that you check the section below if you are running into trouble. + +There is not much more to tell and I don't want to make something up. + + +## {% linkable_title New Platforms %} + +- Add Discogs Sensor platform ([@thibmaek] - [#10957]) ([sensor.discogs docs]) (new-platform) +- Greenwave Reality (TCP Connected) Lighting Component ([@dfiel] - [#11282]) ([light.greenwave docs]) (new-platform) +- Added rainsensor ([@jbarrancos] - [#11023]) ([rainbird docs]) ([sensor.rainbird docs]) ([switch.rainbird docs]) (new-platform) +- Sochain cryptocurrency sensor ([@Klathmon] - [#11335]) ([sensor.sochain docs]) (new-platform) +- Support for EcoNet water heaters ([@w1ll1am23] - [#11260]) ([climate.econet docs]) (new-platform) +- Add deCONZ component ([@Kane610] - [#10321]) ([deconz docs]) ([binary_sensor.deconz docs]) ([light.deconz docs]) ([sensor.deconz docs]) (new-platform) +- Added new climate component from Daikin ([@rofrantz] - [#10983]) ([climate.daikin docs]) (new-platform) +- Add Touchline climate platform ([@abondoe] - [#10547]) ([climate.touchline docs]) (new-platform) +- Add new iGlo component ([@jesserockz] - [#11171]) ([light.iglo docs]) (new-platform) +- Add Dark Sky weather component ([@DanNixon] - [#11435]) ([weather.darksky docs]) (new-platform) +- Coinbase.com sensor platform ([@nkgilley] - [#11036]) ([coinbase docs]) ([sensor.coinbase 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 %} + +- Extend Threshold binary sensor to support ranges. This means that you can now set `up` and `lower`. ([@DanNixon] - [#11110]) ([binary_sensor.threshold docs]) (breaking change) +- The Steam game platform contains changes: + - `game` attribute no longer set in `device_state_attributes` if no game is currently being played as the string "None" is no longer passed if no current game is being played, instead the `game` attribute is not present. + - States now use lower snake case. + - The "Play" and "Trade" states has been renamed to "looking_to_play" and "looking_to_trade". + ([@frwickst] - [#11182]) ([sensor.steam_online docs]) (breaking change) +- The [`tile`][device_tracker.tile docs] platform now shows only active Tiles by default; to show all Tiles, including expired/inactive ones, `show_inactive` must be `True`. The following state attributes have been removed: `last_seen` and `last_updated`. ([@bachya] - [#11172]) ([device_tracker.tile docs]) (breaking change) +- The `hidden_string` feature has been removed from the isy994 component. Previously, this allowed entities to be "hidden" in Home Assistant if a configured string was present in an ISY device's name or folder path. This was removed because hiding devices is now done via the customization feature. +Note however, that this feature was replaced by a new ignore_string config option, which will now cause Home Assistant to completely ignore devices with the matching string so that they will not be imported as a Home Assistant device at all. This can be helpful if you have nodes in the ISY that aren't useful at all in Hass (IR transmitter nodes are a good example.) ([@OverloadUT] - [#11243]) ([isy994 docs]) ([binary_sensor.isy994 docs]) ([cover.isy994 docs]) ([fan.isy994 docs]) ([light.isy994 docs]) ([lock.isy994 docs]) ([sensor.isy994 docs]) ([switch.isy994 docs]) (breaking change) +- The [`egardia` alarm panel][alarm_control_panel.egardia docs] platform no longer a need the users to run a separate Egardiaserver component. It can now also run on HASS.io. ([@jeroenterheerdt] - [#11344]) ([alarm_control_panel.egardia docs]) (breaking change) +- The binary sensor platform of the DoorBird integration has been deleted, so remove DoorBird from your `binary_sensor` configuration. Instead, set the `doorbell_events` option of the `doorbird` component to `True`. The `last_visitor` option has been removed from the camera component, as it is now always added as an entity. ([@Klikini] - [#11193]) ([camera.doorbird docs]) (breaking change) +- The following attributes of the TP-Link switch and light platform have been renamed: + - Light: `current_consumption` -> `current_power_w`, `daily_consumption` -> `daily_energy_kwh` and `monthly_consumption` -> `monthly_energy_kwh` + - Switch: `current` -> `current_a`, `current_consumption` -> `current_power_w`, `total_consumption` -> `total_energy_kwh` and `daily_consumption` -> `today_energy_kwh` ([@DanNixon] - [#10979]) ([light.tplink docs]) ([switch.tplink docs]) (breaking change) +- Move IMAP Email Content body to an attribute ([@notoriousbdg] - [#11096]) ([sensor.imap_email_content docs]) (breaking change) +- Automations which were using `state` that was returning `target_temperature` of the `netatmo` climate platform needs an update. ([@ciotlosm] - [#11345]) ([climate.netatmo docs]) (breaking change) +- The default availability payloads for the `MQTT` switch platform have changed from "ON" and "OFF" to "online" and "offline" (in order to match the majority of MQTT platforms that already supported availability reporting). ([@DanNixon] - [#11336]) (breaking change) +- Customizations for how entities are exposed to Alexa are no longer set via `customize`. Instead they are set via the configuration of the cloud component: + + ```yaml + cloud: + alexa: + entity_config: + switch.kitchen: + name: 'Name for Alexa' + description: 'Description for Alexa' + display_categories: 'LIGHT' + ``` + ([@balloob] - [#11461]) ([cloud docs]) ([alexa.smart_home docs]) (breaking change) +- The extension of the `alpha_vantage` requires an update of the configuration as now are exchange data available as well. ([@ChristianKuehnel] - [#11427]) ([sensor.alpha_vantage docs]) (breaking change) +- The `prometheus` component now supports pushing all sensors and fixes wrong metrics. If may require that you update your configuration. ([@michaelkuty] - [#11159]) ([prometheus docs]) (breaking change) +- Insteon local devices will now use their address as the `entity_id` and `name`. The friendly name can be customized using the [standard customization configuration](https://home-assistant.io/docs/configuration/customizing-devices/). ([@camrun91] - [#11088]) ([insteon_local docs]) ([fan.insteon_local docs]) ([light.insteon_local docs]) ([switch.insteon_local docs]) (breaking change) +- Google Assistant is no longer configured via `customize` but instead has its configuration under the `google_assistant` entry in your `configuration.yaml`. The attributes will no longer have to be prefixed with `google_assistant_` either. + + | Old option | New option | + | ---------- | ------------ | + | google_assistant | expose | + | aliases | aliases | + | google_assistant_name | name | + | google_assistant_type | type | + + Before: + + ```yaml + homeassistant: + customize: + switch.kitchen: + google_assistant: false + google_assistant_name: nice lights + google_assistant_type: light + aliases: + - roof lights + + google_assistant: + ``` + + After: + + ```yaml + google_assistant: + entity_config: + switch.kitchen: + expose: false + alias: roof lights + name: nice lights + type: light + ``` +([@balloob] - [#11499]) ([cloud docs]) ([google_assistant docs]) (breaking change) +- The `climate.set_aux_heat` service is no longer available for the Sensibo cliamte platform. Now call `climate.turn_on` or `climate.turn_off`. ([@andrey-git] - [#11579]) ([climate.sensibo docs]) (breaking change) + +## {% linkable_title All changes %} + +- Try multiple methods of getting data in asuswrt. ([@PeWu] - [#11140]) ([device_tracker.asuswrt docs]) +- Hydroquebec component use now asyncio ([@titilambert] - [#10795]) ([sensor.hydroquebec docs]) +- Hive Component Release Two ([@KJonline] - [#11053]) ([hive docs]) ([climate.hive docs]) ([light.hive docs]) +- Add Discogs Sensor platform ([@thibmaek] - [#10957]) ([sensor.discogs docs]) (new-platform) +- Fix statistics sensor mean and median when only one sample is available. ([@markferry] - [#11180]) ([sensor.statistics docs]) +- Extend Threshold binary sensor to support ranges ([@DanNixon] - [#11110]) ([binary_sensor.threshold docs]) (breaking change) +- Bump python-miio version ([@djchen] - [#11232]) ([fan.xiaomi_miio docs]) ([light.xiaomi_miio docs]) ([switch.xiaomi_miio docs]) ([vacuum.xiaomi_miio docs]) +- Backup configuration files before overwriting ([@cgarwood] - [#11216]) +- Upgrade to new miflora version 0.2.0 ([@ChristianKuehnel] - [#11250]) ([sensor.miflora docs]) +- Add workaround for running tox on Windows platforms ([@veleek] - [#11188]) +- added myself to become code owner for miflora and plant ([@ChristianKuehnel] - [#11251]) +- Proper Steam game names and small fixes ([@frwickst] - [#11182]) ([sensor.steam_online docs]) (breaking change) +- Bugfix: 10509 - http is hard coded in plex sensor ([@ryanm101] - [#11072]) ([sensor.plex docs]) +- Adding MotionIP to BinarySensors for HMIP-SMI ([@schnoetz] - [#11268]) ([homematic docs]) +- Revert "Backup configuration files before overwriting" ([@pvizeli] - [#11269]) +- Functinality to save/restore snapshots for monoprice platform ([@etsinko] - [#10296]) ([media_player.monoprice docs]) +- Change manifest path to /states as this is the path / actually sets. ([@andrey-git] - [#11274]) +- Report Sensibo as off when it is off ([@andrey-git] - [#11281]) ([climate.sensibo docs]) +- Added password for GPS logger endpoint ([@foxel] - [#11245]) ([device_tracker.gpslogger docs]) +- Greenwave Reality (TCP Connected) Lighting Component ([@dfiel] - [#11282]) ([light.greenwave docs]) (new-platform) +- Adds support for disabled Tiles and automatic session renewal ([@bachya] - [#11172]) ([device_tracker.tile docs]) (breaking change) +- Plex refactor ([@ryanm101] - [#11235]) ([media_player.plex docs]) +- alexa: Add handling for covers ([@philk] - [#11242]) ([alexa.smart_home docs]) +- Added rainsensor ([@jbarrancos] - [#11023]) ([rainbird docs]) ([sensor.rainbird docs]) ([switch.rainbird docs]) (new-platform) +- Store raw state of RF sensors from alarmdecoder ([@PhracturedBlue] - [#10841]) ([alarmdecoder docs]) ([binary_sensor.alarmdecoder docs]) +- Add Chime status and control to Alarm Decoder component ([@goyney] - [#11271]) ([alarm_control_panel.alarmdecoder docs]) +- Better error handling ([@rofrantz] - [#11297]) ([sensor.transmission docs]) ([switch.transmission docs]) +- Removed error log used as debug ([@cmsimike] - [#11301]) ([octoprint docs]) +- Huge ISY994 platform cleanup, fixes support for 5.0.10 firmware ([@OverloadUT] - [#11243]) ([isy994 docs]) ([binary_sensor.isy994 docs]) ([cover.isy994 docs]) ([fan.isy994 docs]) ([light.isy994 docs]) ([lock.isy994 docs]) ([sensor.isy994 docs]) ([switch.isy994 docs]) (breaking change) +- Add heartbeat to websocket connections ([@balloob] - [#11298]) ([cloud.iot docs]) +- Fix typo in bitcoin.py component for mined blocks. ([@awkwardDuck] - [#11318]) ([sensor.bitcoin docs]) +- xiaomi_aqara: Fix covers never being closed ([@cnrd] - [#11319]) ([cover.xiaomi_aqara docs]) +- Fix for track_new_devices BC ([@masarliev] - [#11202]) ([device_tracker docs]) +- Upgrade aiohttp_cors to 0.6.0 ([@fabaff] - [#11310]) ([http docs]) +- Upgrade pysnmp to 4.4.3 ([@fabaff] - [#11317]) ([device_tracker.snmp docs]) ([sensor.snmp docs]) ([switch.snmp docs]) +- Upgrade luftdaten to 0.1.3 ([@fabaff] - [#11316]) ([sensor.luftdaten docs]) +- Upgrade yahooweather to 0.10 ([@fabaff] - [#11309]) ([weather.yweather docs]) +- Upgrade distro to 1.2.0 ([@fabaff] - [#11312]) ([updater docs]) +- Upgrade python-digitalocean to 1.13.2 ([@fabaff] - [#11311]) ([digital_ocean docs]) +- Upgrade youtube_dl to 2017.12.23 ([@fabaff] - [#11308]) ([media_extractor docs]) +- Upgrade alpha_vantage to 1.6.0 ([@fabaff] - [#11307]) ([sensor.alpha_vantage docs]) +- Bugfix for HA Issue 7292, 9412 - switch to gamertag to receive ssl image url ([@ReneNulschDE] - [#11315]) ([sensor.xbox_live docs]) +- closes #11314 by not restricting the voice to anything but a string ([@Human] - [#11326]) ([tts.marytts docs]) +- Additional device classes for binary sensors ([@schmittx] - [#11280]) ([binary_sensor docs]) +- Remove need for separate EgardiaServer setup ([@jeroenterheerdt] - [#11344]) ([alarm_control_panel.egardia docs]) (breaking change) +- Add default names and validation for TP-Link devices ([@DanNixon] - [#11346]) ([light.tplink docs]) ([switch.tplink docs]) +- Sochain cryptocurrency sensor ([@Klathmon] - [#11335]) ([sensor.sochain docs]) (new-platform) +- pass stops_at to get_station_by_name ([@ttroy50] - [#11304]) ([sensor.irish_rail_transport docs]) +- Move data instance to setup ([@fabaff] - [#11350]) ([sensor.swiss_public_transport docs]) +- Update modbus.py ([@goldminenine] - [#11238]) ([modbus docs]) +- DoorBird feature update ([@Klikini] - [#11193]) ([camera.doorbird docs]) (breaking change) +- Upgrade aiohttp to 2.3.7 ([@fabaff] - [#11329]) +- Upgrade fuzzywuzzy to 0.16.0 ([@fabaff] - [#11331]) ([conversation docs]) +- Upgrade pyowm to 2.8.0 ([@fabaff] - [#11332]) ([sensor.openweathermap docs]) ([weather.openweathermap docs]) +- Upgrade sqlalchemy to 1.2.0 ([@fabaff] - [#11333]) +- Upgrade mypy to 0.560 ([@fabaff] - [#11334]) +- Upgrade python-telegram-bot to 9.0.0 ([@fabaff] - [#11341]) ([telegram_bot docs]) +- Upgrade youtube_dl to 2017.12.28 ([@fabaff] - [#11357]) ([media_extractor docs]) +- Correct units used in TP-Link energy monioring ([@DanNixon] - [#10979]) ([light.tplink docs]) ([switch.tplink docs]) (breaking change) +- Add HTTP endpoint for resending email confirmation ([@balloob] - [#11354]) ([cloud.auth_api docs]) ([cloud.http_api docs]) +- Fix RGB template ordering in MQTT Light ([@DanNixon] - [#11362]) ([light.mqtt docs]) +- Ping device tracker now respects interval_seconds ([@tschmidty69] - [#11348]) ([device_tracker.ping docs]) +- Fido component use now asyncio ([@titilambert] - [#11244]) ([sensor.fido docs]) +- Support for EcoNet water heaters ([@w1ll1am23] - [#11260]) ([climate.econet docs]) (new-platform) +- Remember the Milk - updating and completing tasks ([@ChristianKuehnel] - [#11069]) ([remember_the_milk docs]) +- Reverts unit conversions in TP-Link bulb ([@DanNixon] - [#11381]) ([light.tplink docs]) +- Clean up Google Assistant ([@balloob] - [#11375]) ([google_assistant docs]) ([google_assistant.http docs]) ([google_assistant.smart_home docs]) +- Adding support for Egardia / Woonveilig version GATE-03 ([@jeroenterheerdt] - [#11397]) ([alarm_control_panel.egardia docs]) +- Add deCONZ component ([@Kane610] - [#10321]) ([deconz docs]) ([binary_sensor.deconz docs]) ([light.deconz docs]) ([sensor.deconz docs]) (new-platform) +- Fix broken tests ([@balloob] - [#11395]) +- Upgrade pychromecast to 1.0.3 ([@OttoWinter] - [#11410]) ([media_player.cast docs]) +- Bump pywemo to fix request include problems. ([@pavoni] - [#11401]) ([wemo docs]) +- Log exceptions that happen during service call ([@balloob] - [#11394]) +- Move IMAP Email Content body to an attribute ([@notoriousbdg] - [#11096]) ([sensor.imap_email_content docs]) (breaking change) +- Notify webos timeout error fix ([@masarliev] - [#11027]) ([notify.webostv docs]) +- Removed status block to allow https://github.com/home-assistant/home-assistant-polymer/pull/766 with no impact ([@ciotlosm] - [#11345]) ([climate.netatmo docs]) (breaking change) +- More support for availability reporting on MQTT components ([@DanNixon] - [#11336]) (breaking change) +- Do not purge the most recent state for an entity ([@tinloaf] - [#11039]) +- Performance optimization of TP-Link switch ([@amelchio] - [#11416]) ([switch.tplink docs]) +- Fixing OpenWeatherMap Sensor. Current weather is 'unknown' if forecast: false. It was reported as #8640. ([@tomaszduda23] - [#11417]) ([sensor.openweathermap docs]) +- Silence redundant warnings about slow setup ([@amelchio] - [#11352]) +- Account for User-Agent being non-existent, causing a TypeError ([@akatrevorjay] - [#11064]) +- Cloud Updates ([@balloob] - [#11404]) ([cloud docs]) +- Add support for the renaming of Yamaha Receiver Zones via configuration file. Added a test to cover the change, plus previously untested options. ([@dfinlay] - [#11402]) ([media_player.yamaha docs]) +- Plex api update ([@ryanm101] - [#11423]) ([media_player.plex docs]) ([sensor.plex docs]) +- fix: hmip-etrv-2 now working with homeassistant ([@daenny] - [#11175]) ([homematic docs]) ([climate.homematic docs]) +- Fix errors in zigbee push state ([@SteveEasley] - [#11386]) ([zigbee docs]) +- Add on/off supported feature to climate ([@andrey-git] - [#11379]) ([climate docs]) ([climate.demo docs]) ([climate.sensibo docs]) +- Fix CONF_FRIENDLY_NAME ([@cdce8p] - [#11438]) ([cover.template docs]) ([light.template docs]) +- Climate: fix missing "|" ([@andrey-git] - [#11441]) ([climate.demo docs]) +- Google Assistant -> Google Actions ([@balloob] - [#11442]) ([cloud.iot docs]) +- Added new climate component from Daikin ([@rofrantz] - [#10983]) ([climate.daikin docs]) (new-platform) +- Updated generic thermostat to respect operation_mode and added away mode ([@ciotlosm] - [#11445]) ([climate.generic_thermostat docs]) +- Reconnect to alarmdecoder on disconnect ([@PhracturedBlue] - [#11383]) ([alarmdecoder docs]) +- Set tahoma cover scan interval to 60 seconds ([@bakedraccoon] - [#11447]) ([cover.tahoma docs]) +- Add some tests to the cloud component ([@balloob] - [#11460]) ([cloud docs]) ([cloud.iot docs]) +- Input Select - Added service description ([@cdce8p] - [#11456]) ([input_select docs]) +- Input Boolean - Deleted 'DEFAULT_INITIAL' ([@cdce8p] - [#11453]) ([input_boolean docs]) +- Updated gitignore file ([@cdce8p] - [#11452]) +- Update hydroquebec component to use hass httpsession ([@titilambert] - [#11412]) ([sensor.hydroquebec docs]) +- Catch everything when calling to OctoPrint API to fix #10557 ([@w1ll1am23] - [#11457]) ([octoprint docs]) +- Update PULL_REQUEST_TEMPLATE.md ([@danielhiversen] - [#11465]) +- Alexa to not use customize for entity config ([@balloob] - [#11461]) ([cloud docs]) ([alexa.smart_home docs]) (breaking change) +- Don't duplicate html5 registrations ([@Chris-V] - [#11451]) ([notify.html5 docs]) +- AlarmDecoder remove icon function as BinarySensorDevice handles it correctly now ([@hawk259] - [#11467]) ([binary_sensor.alarmdecoder docs]) +- Upgrade psutil to 5.4.3 ([@fabaff] - [#11468]) ([sensor.systemmonitor docs]) +- Upgrade alpha_vantage to 1.8.0 ([@fabaff] - [#11476]) ([sensor.alpha_vantage docs]) +- Fix vultr tests ([@balloob] - [#11477]) +- Upgrade yarl to 0.17.0 ([@fabaff] - [#11478]) +- Add Touchline climate platform ([@abondoe] - [#10547]) ([climate.touchline docs]) (new-platform) +- Upgrade pysnmp to 4.4.4 ([@fabaff] - [#11485]) ([device_tracker.snmp docs]) ([sensor.snmp docs]) ([switch.snmp docs]) +- Add new iGlo component ([@jesserockz] - [#11171]) ([light.iglo docs]) (new-platform) +- Add missing configuration variables ([@fabaff] - [#11390]) ([sensor.metoffice docs]) +- Clean up Alexa.intent and DialogFlow.intent ([@balloob] - [#11492]) ([alexa.intent docs]) +- Fix time functions would throw errors in python scripts ([@tomwaters] - [#11414]) ([python_script docs]) +- Upgrade pywebpush to 1.5.0 ([@Chris-V] - [#11497]) ([notify.html5 docs]) +- upgrade schiene to 0.20 ([@JulianKahnert] - [#11504]) ([sensor.deutsche_bahn docs]) +- timer: include the remaining time in the state attributes ([@Julio-Guerra] - [#11510]) ([timer docs]) +- More tolerant KNX component if gateway cant be connected ([@Julius2342] - [#11511]) ([knx docs]) ([binary_sensor.knx docs]) ([climate.knx docs]) ([cover.knx docs]) ([light.knx docs]) ([sensor.knx docs]) ([switch.knx docs]) +- Snips (new) added speech response, parse snips/duration ([@tschmidty69] - [#11513]) ([snips docs]) +- Add Dark Sky weather component ([@DanNixon] - [#11435]) ([weather.darksky docs]) (new-platform) +- Lazy loading of service descriptions ([@amelchio] - [#11479]) ([api docs]) ([websocket_api docs]) ([light.lifx docs]) +- Fix canary flaky test ([@balloob] - [#11519]) +- Address missed review comments for Dark Sky weather ([@DanNixon] - [#11520]) ([weather.darksky docs]) +- New features for Owntracks device_tracker ([@cpcowart] - [#11480]) ([device_tracker.owntracks docs]) +- Reconnect before mochad switch send command ([@aosadchyy] - [#11296]) ([switch.mochad docs]) +- Fix Kodi channels media type ([@florianj1] - [#11505]) ([media_player.kodi docs]) +- Extension sensor alpha_vantage ([@ChristianKuehnel] - [#11427]) ([sensor.alpha_vantage docs]) (breaking change) +- MQTT json attributes ([@timstanley1985] - [#11439]) ([sensor.mqtt docs]) +- Support pushing all sensors and fix wrong metrics. ([@michaelkuty] - [#11159]) ([prometheus docs]) (breaking change) +- Add options feature to Baidu TTS. ([@yienxu] - [#11462]) ([tts.baidu docs]) +- Insteon local update ([@camrun91] - [#11088]) ([insteon_local docs]) ([fan.insteon_local docs]) ([light.insteon_local docs]) ([switch.insteon_local docs]) (breaking change) +- Snips: (fix) support new intentName format ([@tschmidty69] - [#11509]) ([snips docs]) +- Upgrade numpy to 1.14.0 ([@fabaff] - [#11542]) ([binary_sensor.trend docs]) ([image_processing.opencv docs]) +- Upgrade python-etherscan-api to 0.0.2 ([@fabaff] - [#11535]) ([sensor.etherscan docs]) +- Upgrade Sphinx to 1.6.6 ([@fabaff] - [#11534]) +- ZoneMinder event sensor updates ([@swilson] - [#11369]) ([sensor.zoneminder docs]) +- Move Google Assistant entity config out of customize ([@balloob] - [#11499]) ([cloud docs]) ([google_assistant docs]) (breaking change) +- Upgrade lightify to 1.0.6.1 ([@fabaff] - [#11545]) ([light.osramlightify docs]) +- Improved test runtime ([@cdce8p] - [#11553]) ([binary_sensor.workday docs]) +- Add 2 media_player services and 1 custom service to Squeezebox platform ([@ericpignet] - [#10969]) ([media_player.squeezebox docs]) +- Fix error on entity_config missing ([@philk] - [#11561]) ([google_assistant.http docs]) +- Upgrade keyring to 10.3.2 ([@fabaff] - [#11531]) +- Coinbase.com sensor platform ([@nkgilley] - [#11036]) ([coinbase docs]) ([sensor.coinbase docs]) (new-platform) +- Try to fix crashes after Hue refactoring ([@andreacampi] - [#11270]) ([light.hue docs]) +- Remove execution file perm ([@balloob] - [#11563]) +- Deprecate explicit entity_id in template platforms ([@amelchio] - [#11123]) ([binary_sensor.template docs]) ([cover.template docs]) ([light.template docs]) ([sensor.template docs]) ([switch.template docs]) +- Test tweaks ([@balloob] - [#11560]) +- Add Velux Windows to Tahoma ([@bakedraccoon] - [#11538]) ([tahoma docs]) ([cover.tahoma docs]) +- Extend hass.io services / updater ([@pvizeli] - [#11549]) ([hassio docs]) +- Add sensibo_assume_state service to Sensibo climate ([@andrey-git] - [#11567]) ([climate.sensibo docs]) +- Tracking all groups to allow changing of existing groups ([@randellhodges] - [#11444]) ([group docs]) +- Fix new squeezebox service descriptions for lazy loading ([@amelchio] - [#11574]) ([media_player.squeezebox docs]) +- Mark REST binary_sensor unavailable if request fails ([@DanNixon] - [#11506]) ([binary_sensor.rest docs]) +- Tado improvements - hot water zone sensors and climate precision ([@andersonshatch] - [#11521]) ([climate.tado docs]) ([sensor.tado docs]) +- Make the rpi_rf component thread-safe using an RLock ([@ulido] - [#11487]) ([switch.rpi_rf docs]) +- Update pyhomematic, support new devices ([@danielperna84] - [#11578]) ([homematic docs]) +- Alarmdecoder add validation of the zone types ([@hawk259] - [#11488]) ([alarmdecoder docs]) +- Support OSRAM lights on ZHA ([@armills] - [#11522]) ([light.zha docs]) +- Fix bluetooth tracker source ([@swilson] - [#11469]) ([device_tracker docs]) ([device_tracker.bluetooth_le_tracker docs]) ([device_tracker.bluetooth_tracker docs]) +- Fix for asuswrt, telnet not working and presence-detection for router mode ([@kennedyshead] - [#11422]) ([device_tracker.asuswrt docs]) +- Remove aux_heat support from Sensibo now that UI supports on/off ([@andrey-git] - [#11579]) ([climate.sensibo docs]) (breaking change) +- Changed device type of media player and cover to switch ([@Laqoore] - [#11483]) ([google_assistant.smart_home docs]) +- Control ordering of display in history component ([@rwa] - [#11340]) ([history docs]) +- Pr/11430 ([@balloob] - [#11587]) +- Cast return values and add unit tests for the yahoo weather component. ([@cgtobi] - [#10699]) ([weather.yweather docs]) +- add velux roller shutter to tahoma ([@bakedraccoon] - [#11586]) ([tahoma docs]) +- Added support for enable/disable motion detection ([@abjorshammar] - [#11583]) ([camera.uvc docs]) +- Avoid returning empty media_image_url string ([@JackWindows] - [#11557]) ([media_player.cast docs]) +- Core support for hass.io calls & Bugfix check_config ([@pvizeli] - [#11571]) ([__init__ docs]) ([hassio docs]) ([updater docs]) +- Fix Tahoma stop command for 2 types of shutters ([@bakedraccoon] - [#11588]) ([cover.tahoma docs]) +- Pushbullet email support (fix) ([@tschmidty69] - [#11590]) ([notify.pushbullet docs]) +- Fix state for trigger with forced updates ([@armills] - [#11595]) ([automation.state docs]) +- Snips add say and say_actions services (new) ([@tschmidty69] - [#11596]) ([snips docs]) +- Concord232 alarm arm away fix ([@rwa] - [#11597]) ([alarm_control_panel.concord232 docs]) ([binary_sensor.concord232 docs]) +- Bugfix and cleanup for Rfxtrx ([@danielhiversen] - [#11600]) +- Xiaomi lib upgrade ([@danielhiversen] - [#11603]) +- Upgrade yarl to 0.18.0 ([@fabaff] - [#11609]) +- patch stop command ([@bakedraccoon] - [#11612]) ([cover.tahoma docs]) +- Use kelvin/mireds correctly for setting iglo white ([@jesserockz] - [#11622]) +- Update Pyarlo to 0.1.2 ([@arsaboo] - [#11626]) + +[#10296]: https://github.com/home-assistant/home-assistant/pull/10296 +[#10321]: https://github.com/home-assistant/home-assistant/pull/10321 +[#10547]: https://github.com/home-assistant/home-assistant/pull/10547 +[#10699]: https://github.com/home-assistant/home-assistant/pull/10699 +[#10795]: https://github.com/home-assistant/home-assistant/pull/10795 +[#10841]: https://github.com/home-assistant/home-assistant/pull/10841 +[#10957]: https://github.com/home-assistant/home-assistant/pull/10957 +[#10969]: https://github.com/home-assistant/home-assistant/pull/10969 +[#10979]: https://github.com/home-assistant/home-assistant/pull/10979 +[#10983]: https://github.com/home-assistant/home-assistant/pull/10983 +[#11023]: https://github.com/home-assistant/home-assistant/pull/11023 +[#11027]: https://github.com/home-assistant/home-assistant/pull/11027 +[#11036]: https://github.com/home-assistant/home-assistant/pull/11036 +[#11039]: https://github.com/home-assistant/home-assistant/pull/11039 +[#11053]: https://github.com/home-assistant/home-assistant/pull/11053 +[#11064]: https://github.com/home-assistant/home-assistant/pull/11064 +[#11069]: https://github.com/home-assistant/home-assistant/pull/11069 +[#11072]: https://github.com/home-assistant/home-assistant/pull/11072 +[#11088]: https://github.com/home-assistant/home-assistant/pull/11088 +[#11096]: https://github.com/home-assistant/home-assistant/pull/11096 +[#11110]: https://github.com/home-assistant/home-assistant/pull/11110 +[#11123]: https://github.com/home-assistant/home-assistant/pull/11123 +[#11140]: https://github.com/home-assistant/home-assistant/pull/11140 +[#11159]: https://github.com/home-assistant/home-assistant/pull/11159 +[#11171]: https://github.com/home-assistant/home-assistant/pull/11171 +[#11172]: https://github.com/home-assistant/home-assistant/pull/11172 +[#11175]: https://github.com/home-assistant/home-assistant/pull/11175 +[#11180]: https://github.com/home-assistant/home-assistant/pull/11180 +[#11182]: https://github.com/home-assistant/home-assistant/pull/11182 +[#11188]: https://github.com/home-assistant/home-assistant/pull/11188 +[#11193]: https://github.com/home-assistant/home-assistant/pull/11193 +[#11202]: https://github.com/home-assistant/home-assistant/pull/11202 +[#11216]: https://github.com/home-assistant/home-assistant/pull/11216 +[#11232]: https://github.com/home-assistant/home-assistant/pull/11232 +[#11235]: https://github.com/home-assistant/home-assistant/pull/11235 +[#11238]: https://github.com/home-assistant/home-assistant/pull/11238 +[#11242]: https://github.com/home-assistant/home-assistant/pull/11242 +[#11243]: https://github.com/home-assistant/home-assistant/pull/11243 +[#11244]: https://github.com/home-assistant/home-assistant/pull/11244 +[#11245]: https://github.com/home-assistant/home-assistant/pull/11245 +[#11250]: https://github.com/home-assistant/home-assistant/pull/11250 +[#11251]: https://github.com/home-assistant/home-assistant/pull/11251 +[#11260]: https://github.com/home-assistant/home-assistant/pull/11260 +[#11268]: https://github.com/home-assistant/home-assistant/pull/11268 +[#11269]: https://github.com/home-assistant/home-assistant/pull/11269 +[#11270]: https://github.com/home-assistant/home-assistant/pull/11270 +[#11271]: https://github.com/home-assistant/home-assistant/pull/11271 +[#11274]: https://github.com/home-assistant/home-assistant/pull/11274 +[#11280]: https://github.com/home-assistant/home-assistant/pull/11280 +[#11281]: https://github.com/home-assistant/home-assistant/pull/11281 +[#11282]: https://github.com/home-assistant/home-assistant/pull/11282 +[#11296]: https://github.com/home-assistant/home-assistant/pull/11296 +[#11297]: https://github.com/home-assistant/home-assistant/pull/11297 +[#11298]: https://github.com/home-assistant/home-assistant/pull/11298 +[#11301]: https://github.com/home-assistant/home-assistant/pull/11301 +[#11304]: https://github.com/home-assistant/home-assistant/pull/11304 +[#11307]: https://github.com/home-assistant/home-assistant/pull/11307 +[#11308]: https://github.com/home-assistant/home-assistant/pull/11308 +[#11309]: https://github.com/home-assistant/home-assistant/pull/11309 +[#11310]: https://github.com/home-assistant/home-assistant/pull/11310 +[#11311]: https://github.com/home-assistant/home-assistant/pull/11311 +[#11312]: https://github.com/home-assistant/home-assistant/pull/11312 +[#11315]: https://github.com/home-assistant/home-assistant/pull/11315 +[#11316]: https://github.com/home-assistant/home-assistant/pull/11316 +[#11317]: https://github.com/home-assistant/home-assistant/pull/11317 +[#11318]: https://github.com/home-assistant/home-assistant/pull/11318 +[#11319]: https://github.com/home-assistant/home-assistant/pull/11319 +[#11326]: https://github.com/home-assistant/home-assistant/pull/11326 +[#11329]: https://github.com/home-assistant/home-assistant/pull/11329 +[#11331]: https://github.com/home-assistant/home-assistant/pull/11331 +[#11332]: https://github.com/home-assistant/home-assistant/pull/11332 +[#11333]: https://github.com/home-assistant/home-assistant/pull/11333 +[#11334]: https://github.com/home-assistant/home-assistant/pull/11334 +[#11335]: https://github.com/home-assistant/home-assistant/pull/11335 +[#11336]: https://github.com/home-assistant/home-assistant/pull/11336 +[#11340]: https://github.com/home-assistant/home-assistant/pull/11340 +[#11341]: https://github.com/home-assistant/home-assistant/pull/11341 +[#11344]: https://github.com/home-assistant/home-assistant/pull/11344 +[#11345]: https://github.com/home-assistant/home-assistant/pull/11345 +[#11346]: https://github.com/home-assistant/home-assistant/pull/11346 +[#11348]: https://github.com/home-assistant/home-assistant/pull/11348 +[#11350]: https://github.com/home-assistant/home-assistant/pull/11350 +[#11352]: https://github.com/home-assistant/home-assistant/pull/11352 +[#11354]: https://github.com/home-assistant/home-assistant/pull/11354 +[#11357]: https://github.com/home-assistant/home-assistant/pull/11357 +[#11362]: https://github.com/home-assistant/home-assistant/pull/11362 +[#11369]: https://github.com/home-assistant/home-assistant/pull/11369 +[#11375]: https://github.com/home-assistant/home-assistant/pull/11375 +[#11379]: https://github.com/home-assistant/home-assistant/pull/11379 +[#11381]: https://github.com/home-assistant/home-assistant/pull/11381 +[#11383]: https://github.com/home-assistant/home-assistant/pull/11383 +[#11386]: https://github.com/home-assistant/home-assistant/pull/11386 +[#11390]: https://github.com/home-assistant/home-assistant/pull/11390 +[#11394]: https://github.com/home-assistant/home-assistant/pull/11394 +[#11395]: https://github.com/home-assistant/home-assistant/pull/11395 +[#11397]: https://github.com/home-assistant/home-assistant/pull/11397 +[#11401]: https://github.com/home-assistant/home-assistant/pull/11401 +[#11402]: https://github.com/home-assistant/home-assistant/pull/11402 +[#11404]: https://github.com/home-assistant/home-assistant/pull/11404 +[#11410]: https://github.com/home-assistant/home-assistant/pull/11410 +[#11412]: https://github.com/home-assistant/home-assistant/pull/11412 +[#11414]: https://github.com/home-assistant/home-assistant/pull/11414 +[#11416]: https://github.com/home-assistant/home-assistant/pull/11416 +[#11417]: https://github.com/home-assistant/home-assistant/pull/11417 +[#11422]: https://github.com/home-assistant/home-assistant/pull/11422 +[#11423]: https://github.com/home-assistant/home-assistant/pull/11423 +[#11427]: https://github.com/home-assistant/home-assistant/pull/11427 +[#11435]: https://github.com/home-assistant/home-assistant/pull/11435 +[#11438]: https://github.com/home-assistant/home-assistant/pull/11438 +[#11439]: https://github.com/home-assistant/home-assistant/pull/11439 +[#11441]: https://github.com/home-assistant/home-assistant/pull/11441 +[#11442]: https://github.com/home-assistant/home-assistant/pull/11442 +[#11444]: https://github.com/home-assistant/home-assistant/pull/11444 +[#11445]: https://github.com/home-assistant/home-assistant/pull/11445 +[#11447]: https://github.com/home-assistant/home-assistant/pull/11447 +[#11451]: https://github.com/home-assistant/home-assistant/pull/11451 +[#11452]: https://github.com/home-assistant/home-assistant/pull/11452 +[#11453]: https://github.com/home-assistant/home-assistant/pull/11453 +[#11456]: https://github.com/home-assistant/home-assistant/pull/11456 +[#11457]: https://github.com/home-assistant/home-assistant/pull/11457 +[#11460]: https://github.com/home-assistant/home-assistant/pull/11460 +[#11461]: https://github.com/home-assistant/home-assistant/pull/11461 +[#11462]: https://github.com/home-assistant/home-assistant/pull/11462 +[#11465]: https://github.com/home-assistant/home-assistant/pull/11465 +[#11467]: https://github.com/home-assistant/home-assistant/pull/11467 +[#11468]: https://github.com/home-assistant/home-assistant/pull/11468 +[#11469]: https://github.com/home-assistant/home-assistant/pull/11469 +[#11476]: https://github.com/home-assistant/home-assistant/pull/11476 +[#11477]: https://github.com/home-assistant/home-assistant/pull/11477 +[#11478]: https://github.com/home-assistant/home-assistant/pull/11478 +[#11479]: https://github.com/home-assistant/home-assistant/pull/11479 +[#11480]: https://github.com/home-assistant/home-assistant/pull/11480 +[#11483]: https://github.com/home-assistant/home-assistant/pull/11483 +[#11485]: https://github.com/home-assistant/home-assistant/pull/11485 +[#11487]: https://github.com/home-assistant/home-assistant/pull/11487 +[#11488]: https://github.com/home-assistant/home-assistant/pull/11488 +[#11492]: https://github.com/home-assistant/home-assistant/pull/11492 +[#11497]: https://github.com/home-assistant/home-assistant/pull/11497 +[#11499]: https://github.com/home-assistant/home-assistant/pull/11499 +[#11504]: https://github.com/home-assistant/home-assistant/pull/11504 +[#11505]: https://github.com/home-assistant/home-assistant/pull/11505 +[#11506]: https://github.com/home-assistant/home-assistant/pull/11506 +[#11509]: https://github.com/home-assistant/home-assistant/pull/11509 +[#11510]: https://github.com/home-assistant/home-assistant/pull/11510 +[#11511]: https://github.com/home-assistant/home-assistant/pull/11511 +[#11513]: https://github.com/home-assistant/home-assistant/pull/11513 +[#11519]: https://github.com/home-assistant/home-assistant/pull/11519 +[#11520]: https://github.com/home-assistant/home-assistant/pull/11520 +[#11521]: https://github.com/home-assistant/home-assistant/pull/11521 +[#11522]: https://github.com/home-assistant/home-assistant/pull/11522 +[#11531]: https://github.com/home-assistant/home-assistant/pull/11531 +[#11534]: https://github.com/home-assistant/home-assistant/pull/11534 +[#11535]: https://github.com/home-assistant/home-assistant/pull/11535 +[#11538]: https://github.com/home-assistant/home-assistant/pull/11538 +[#11542]: https://github.com/home-assistant/home-assistant/pull/11542 +[#11545]: https://github.com/home-assistant/home-assistant/pull/11545 +[#11549]: https://github.com/home-assistant/home-assistant/pull/11549 +[#11553]: https://github.com/home-assistant/home-assistant/pull/11553 +[#11557]: https://github.com/home-assistant/home-assistant/pull/11557 +[#11560]: https://github.com/home-assistant/home-assistant/pull/11560 +[#11561]: https://github.com/home-assistant/home-assistant/pull/11561 +[#11563]: https://github.com/home-assistant/home-assistant/pull/11563 +[#11567]: https://github.com/home-assistant/home-assistant/pull/11567 +[#11571]: https://github.com/home-assistant/home-assistant/pull/11571 +[#11574]: https://github.com/home-assistant/home-assistant/pull/11574 +[#11578]: https://github.com/home-assistant/home-assistant/pull/11578 +[#11579]: https://github.com/home-assistant/home-assistant/pull/11579 +[#11583]: https://github.com/home-assistant/home-assistant/pull/11583 +[#11586]: https://github.com/home-assistant/home-assistant/pull/11586 +[#11587]: https://github.com/home-assistant/home-assistant/pull/11587 +[#11588]: https://github.com/home-assistant/home-assistant/pull/11588 +[#11590]: https://github.com/home-assistant/home-assistant/pull/11590 +[#11595]: https://github.com/home-assistant/home-assistant/pull/11595 +[#11596]: https://github.com/home-assistant/home-assistant/pull/11596 +[#11597]: https://github.com/home-assistant/home-assistant/pull/11597 +[#11600]: https://github.com/home-assistant/home-assistant/pull/11600 +[#11603]: https://github.com/home-assistant/home-assistant/pull/11603 +[#11609]: https://github.com/home-assistant/home-assistant/pull/11609 +[#11612]: https://github.com/home-assistant/home-assistant/pull/11612 +[#11622]: https://github.com/home-assistant/home-assistant/pull/11622 +[#11626]: https://github.com/home-assistant/home-assistant/pull/11626 +[@Chris-V]: https://github.com/Chris-V +[@ChristianKuehnel]: https://github.com/ChristianKuehnel +[@DanNixon]: https://github.com/DanNixon +[@Human]: https://github.com/Human +[@JackWindows]: https://github.com/JackWindows +[@JulianKahnert]: https://github.com/JulianKahnert +[@Julio-Guerra]: https://github.com/Julio-Guerra +[@Julius2342]: https://github.com/Julius2342 +[@KJonline]: https://github.com/KJonline +[@Kane610]: https://github.com/Kane610 +[@Klathmon]: https://github.com/Klathmon +[@Klikini]: https://github.com/Klikini +[@Laqoore]: https://github.com/Laqoore +[@OttoWinter]: https://github.com/OttoWinter +[@OverloadUT]: https://github.com/OverloadUT +[@PeWu]: https://github.com/PeWu +[@PhracturedBlue]: https://github.com/PhracturedBlue +[@ReneNulschDE]: https://github.com/ReneNulschDE +[@SteveEasley]: https://github.com/SteveEasley +[@abjorshammar]: https://github.com/abjorshammar +[@abondoe]: https://github.com/abondoe +[@akatrevorjay]: https://github.com/akatrevorjay +[@amelchio]: https://github.com/amelchio +[@andersonshatch]: https://github.com/andersonshatch +[@andreacampi]: https://github.com/andreacampi +[@andrey-git]: https://github.com/andrey-git +[@aosadchyy]: https://github.com/aosadchyy +[@armills]: https://github.com/armills +[@arsaboo]: https://github.com/arsaboo +[@awkwardDuck]: https://github.com/awkwardDuck +[@bachya]: https://github.com/bachya +[@bakedraccoon]: https://github.com/bakedraccoon +[@balloob]: https://github.com/balloob +[@camrun91]: https://github.com/camrun91 +[@cdce8p]: https://github.com/cdce8p +[@cgarwood]: https://github.com/cgarwood +[@cgtobi]: https://github.com/cgtobi +[@ciotlosm]: https://github.com/ciotlosm +[@cmsimike]: https://github.com/cmsimike +[@cnrd]: https://github.com/cnrd +[@cpcowart]: https://github.com/cpcowart +[@daenny]: https://github.com/daenny +[@danielhiversen]: https://github.com/danielhiversen +[@danielperna84]: https://github.com/danielperna84 +[@dfiel]: https://github.com/dfiel +[@dfinlay]: https://github.com/dfinlay +[@djchen]: https://github.com/djchen +[@ericpignet]: https://github.com/ericpignet +[@etsinko]: https://github.com/etsinko +[@fabaff]: https://github.com/fabaff +[@florianj1]: https://github.com/florianj1 +[@foxel]: https://github.com/foxel +[@frwickst]: https://github.com/frwickst +[@goldminenine]: https://github.com/goldminenine +[@goyney]: https://github.com/goyney +[@hawk259]: https://github.com/hawk259 +[@jbarrancos]: https://github.com/jbarrancos +[@jeroenterheerdt]: https://github.com/jeroenterheerdt +[@jesserockz]: https://github.com/jesserockz +[@kennedyshead]: https://github.com/kennedyshead +[@markferry]: https://github.com/markferry +[@masarliev]: https://github.com/masarliev +[@michaelkuty]: https://github.com/michaelkuty +[@nkgilley]: https://github.com/nkgilley +[@notoriousbdg]: https://github.com/notoriousbdg +[@pavoni]: https://github.com/pavoni +[@philk]: https://github.com/philk +[@pvizeli]: https://github.com/pvizeli +[@randellhodges]: https://github.com/randellhodges +[@rofrantz]: https://github.com/rofrantz +[@rwa]: https://github.com/rwa +[@ryanm101]: https://github.com/ryanm101 +[@schmittx]: https://github.com/schmittx +[@schnoetz]: https://github.com/schnoetz +[@swilson]: https://github.com/swilson +[@thibmaek]: https://github.com/thibmaek +[@timstanley1985]: https://github.com/timstanley1985 +[@tinloaf]: https://github.com/tinloaf +[@titilambert]: https://github.com/titilambert +[@tomaszduda23]: https://github.com/tomaszduda23 +[@tomwaters]: https://github.com/tomwaters +[@tschmidty69]: https://github.com/tschmidty69 +[@ttroy50]: https://github.com/ttroy50 +[@ulido]: https://github.com/ulido +[@veleek]: https://github.com/veleek +[@w1ll1am23]: https://github.com/w1ll1am23 +[@yienxu]: https://github.com/yienxu +[__init__ docs]: https://home-assistant.io/components/__init__/ +[alarm_control_panel.alarmdecoder docs]: https://home-assistant.io/components/alarm_control_panel.alarmdecoder/ +[alarm_control_panel.concord232 docs]: https://home-assistant.io/components/alarm_control_panel.concord232/ +[alarm_control_panel.egardia docs]: https://home-assistant.io/components/alarm_control_panel.egardia/ +[alarmdecoder docs]: https://home-assistant.io/components/alarmdecoder/ +[alexa.intent docs]: https://home-assistant.io/components/alexa.intent/ +[alexa.smart_home docs]: https://home-assistant.io/components/alexa.smart_home/ +[api docs]: https://home-assistant.io/components/api/ +[automation.state docs]: https://home-assistant.io/docs/automation/trigger/#state-trigger +[binary_sensor docs]: https://home-assistant.io/components/binary_sensor/ +[binary_sensor.alarmdecoder docs]: https://home-assistant.io/components/binary_sensor.alarmdecoder/ +[binary_sensor.concord232 docs]: https://home-assistant.io/components/binary_sensor.concord232/ +[binary_sensor.deconz docs]: https://home-assistant.io/components/binary_sensor.deconz/ +[binary_sensor.isy994 docs]: https://home-assistant.io/components/binary_sensor.isy994/ +[binary_sensor.knx docs]: https://home-assistant.io/components/binary_sensor.knx/ +[binary_sensor.rest docs]: https://home-assistant.io/components/binary_sensor.rest/ +[binary_sensor.template docs]: https://home-assistant.io/components/binary_sensor.template/ +[binary_sensor.threshold docs]: https://home-assistant.io/components/binary_sensor.threshold/ +[binary_sensor.trend docs]: https://home-assistant.io/components/binary_sensor.trend/ +[binary_sensor.workday docs]: https://home-assistant.io/components/binary_sensor.workday/ +[camera.doorbird docs]: https://home-assistant.io/components/camera.doorbird/ +[camera.uvc docs]: https://home-assistant.io/components/camera.uvc/ +[climate docs]: https://home-assistant.io/components/climate/ +[climate.daikin docs]: https://home-assistant.io/components/climate.daikin/ +[climate.demo docs]: https://home-assistant.io/components/climate.demo/ +[climate.econet docs]: https://home-assistant.io/components/climate.econet/ +[climate.generic_thermostat docs]: https://home-assistant.io/components/climate.generic_thermostat/ +[climate.hive docs]: https://home-assistant.io/components/climate.hive/ +[climate.homematic docs]: https://home-assistant.io/components/climate.homematic/ +[climate.knx docs]: https://home-assistant.io/components/climate.knx/ +[climate.netatmo docs]: https://home-assistant.io/components/climate.netatmo/ +[climate.sensibo docs]: https://home-assistant.io/components/climate.sensibo/ +[climate.tado docs]: https://home-assistant.io/components/climate.tado/ +[climate.touchline docs]: https://home-assistant.io/components/climate.touchline/ +[cloud docs]: https://home-assistant.io/components/cloud/ +[cloud.auth_api docs]: https://home-assistant.io/components/cloud.auth_api/ +[cloud.http_api docs]: https://home-assistant.io/components/cloud.http_api/ +[cloud.iot docs]: https://home-assistant.io/components/cloud.iot/ +[coinbase docs]: https://home-assistant.io/components/coinbase/ +[conversation docs]: https://home-assistant.io/components/conversation/ +[cover.isy994 docs]: https://home-assistant.io/components/cover.isy994/ +[cover.knx docs]: https://home-assistant.io/components/cover.knx/ +[cover.tahoma docs]: https://home-assistant.io/components/cover.tahoma/ +[cover.template docs]: https://home-assistant.io/components/cover.template/ +[cover.xiaomi_aqara docs]: https://home-assistant.io/components/cover.xiaomi_aqara/ +[deconz docs]: https://home-assistant.io/components/deconz/ +[device_tracker docs]: https://home-assistant.io/components/device_tracker/ +[device_tracker.asuswrt docs]: https://home-assistant.io/components/device_tracker.asuswrt/ +[device_tracker.bluetooth_le_tracker docs]: https://home-assistant.io/components/device_tracker.bluetooth_le_tracker/ +[device_tracker.bluetooth_tracker docs]: https://home-assistant.io/components/device_tracker.bluetooth_tracker/ +[device_tracker.gpslogger docs]: https://home-assistant.io/components/device_tracker.gpslogger/ +[device_tracker.owntracks docs]: https://home-assistant.io/components/device_tracker.owntracks/ +[device_tracker.ping docs]: https://home-assistant.io/components/device_tracker.ping/ +[device_tracker.snmp docs]: https://home-assistant.io/components/device_tracker.snmp/ +[device_tracker.tile docs]: https://home-assistant.io/components/device_tracker.tile/ +[digital_ocean docs]: https://home-assistant.io/components/digital_ocean/ +[fan.insteon_local docs]: https://home-assistant.io/components/fan.insteon_local/ +[fan.isy994 docs]: https://home-assistant.io/components/fan.isy994/ +[fan.xiaomi_miio docs]: https://home-assistant.io/components/fan.xiaomi_miio/ +[google_assistant docs]: https://home-assistant.io/components/google_assistant/ +[google_assistant.http docs]: https://home-assistant.io/components/google_assistant.http/ +[google_assistant.smart_home docs]: https://home-assistant.io/components/google_assistant.smart_home/ +[group docs]: https://home-assistant.io/components/group/ +[hassio docs]: https://home-assistant.io/components/hassio/ +[history docs]: https://home-assistant.io/components/history/ +[hive docs]: https://home-assistant.io/components/hive/ +[homematic docs]: https://home-assistant.io/components/homematic/ +[http docs]: https://home-assistant.io/components/http/ +[image_processing.opencv docs]: https://home-assistant.io/components/image_processing.opencv/ +[input_boolean docs]: https://home-assistant.io/components/input_boolean/ +[input_select docs]: https://home-assistant.io/components/input_select/ +[insteon_local docs]: https://home-assistant.io/components/insteon_local/ +[isy994 docs]: https://home-assistant.io/components/isy994/ +[knx docs]: https://home-assistant.io/components/knx/ +[light.deconz docs]: https://home-assistant.io/components/light.deconz/ +[light.greenwave docs]: https://home-assistant.io/components/light.greenwave/ +[light.hive docs]: https://home-assistant.io/components/light.hive/ +[light.hue docs]: https://home-assistant.io/components/light.hue/ +[light.iglo docs]: https://home-assistant.io/components/light.iglo/ +[light.insteon_local docs]: https://home-assistant.io/components/light.insteon_local/ +[light.isy994 docs]: https://home-assistant.io/components/light.isy994/ +[light.knx docs]: https://home-assistant.io/components/light.knx/ +[light.lifx docs]: https://home-assistant.io/components/light.lifx/ +[light.mqtt docs]: https://home-assistant.io/components/light.mqtt/ +[light.osramlightify docs]: https://home-assistant.io/components/light.osramlightify/ +[light.template docs]: https://home-assistant.io/components/light.template/ +[light.tplink docs]: https://home-assistant.io/components/light.tplink/ +[light.xiaomi_miio docs]: https://home-assistant.io/components/light.xiaomi_miio/ +[light.zha docs]: https://home-assistant.io/components/light.zha/ +[lock.isy994 docs]: https://home-assistant.io/components/lock.isy994/ +[media_extractor docs]: https://home-assistant.io/components/media_extractor/ +[media_player.cast docs]: https://home-assistant.io/components/media_player.cast/ +[media_player.kodi docs]: https://home-assistant.io/components/media_player.kodi/ +[media_player.monoprice docs]: https://home-assistant.io/components/media_player.monoprice/ +[media_player.plex docs]: https://home-assistant.io/components/media_player.plex/ +[media_player.squeezebox docs]: https://home-assistant.io/components/media_player.squeezebox/ +[media_player.yamaha docs]: https://home-assistant.io/components/media_player.yamaha/ +[modbus docs]: https://home-assistant.io/components/modbus/ +[notify.html5 docs]: https://home-assistant.io/components/notify.html5/ +[notify.pushbullet docs]: https://home-assistant.io/components/notify.pushbullet/ +[notify.webostv docs]: https://home-assistant.io/components/notify.webostv/ +[octoprint docs]: https://home-assistant.io/components/octoprint/ +[prometheus docs]: https://home-assistant.io/components/prometheus/ +[python_script docs]: https://home-assistant.io/components/python_script/ +[rainbird docs]: https://home-assistant.io/components/rainbird/ +[remember_the_milk docs]: https://home-assistant.io/components/remember_the_milk/ +[sensor.alpha_vantage docs]: https://home-assistant.io/components/sensor.alpha_vantage/ +[sensor.bitcoin docs]: https://home-assistant.io/components/sensor.bitcoin/ +[sensor.coinbase docs]: https://home-assistant.io/components/sensor.coinbase/ +[sensor.deconz docs]: https://home-assistant.io/components/sensor.deconz/ +[sensor.deutsche_bahn docs]: https://home-assistant.io/components/sensor.deutsche_bahn/ +[sensor.discogs docs]: https://home-assistant.io/components/sensor.discogs/ +[sensor.etherscan docs]: https://home-assistant.io/components/sensor.etherscan/ +[sensor.fido docs]: https://home-assistant.io/components/sensor.fido/ +[sensor.hydroquebec docs]: https://home-assistant.io/components/sensor.hydroquebec/ +[sensor.imap_email_content docs]: https://home-assistant.io/components/sensor.imap_email_content/ +[sensor.irish_rail_transport docs]: https://home-assistant.io/components/sensor.irish_rail_transport/ +[sensor.isy994 docs]: https://home-assistant.io/components/sensor.isy994/ +[sensor.knx docs]: https://home-assistant.io/components/sensor.knx/ +[sensor.luftdaten docs]: https://home-assistant.io/components/sensor.luftdaten/ +[sensor.metoffice docs]: https://home-assistant.io/components/sensor.metoffice/ +[sensor.miflora docs]: https://home-assistant.io/components/sensor.miflora/ +[sensor.mqtt docs]: https://home-assistant.io/components/sensor.mqtt/ +[sensor.openweathermap docs]: https://home-assistant.io/components/sensor.openweathermap/ +[sensor.plex docs]: https://home-assistant.io/components/sensor.plex/ +[sensor.rainbird docs]: https://home-assistant.io/components/sensor.rainbird/ +[sensor.snmp docs]: https://home-assistant.io/components/sensor.snmp/ +[sensor.sochain docs]: https://home-assistant.io/components/sensor.sochain/ +[sensor.statistics docs]: https://home-assistant.io/components/sensor.statistics/ +[sensor.steam_online docs]: https://home-assistant.io/components/sensor.steam_online/ +[sensor.swiss_public_transport docs]: https://home-assistant.io/components/sensor.swiss_public_transport/ +[sensor.systemmonitor docs]: https://home-assistant.io/components/sensor.systemmonitor/ +[sensor.tado docs]: https://home-assistant.io/components/sensor.tado/ +[sensor.template docs]: https://home-assistant.io/components/sensor.template/ +[sensor.transmission docs]: https://home-assistant.io/components/sensor.transmission/ +[sensor.xbox_live docs]: https://home-assistant.io/components/sensor.xbox_live/ +[sensor.zoneminder docs]: https://home-assistant.io/components/sensor.zoneminder/ +[snips docs]: https://home-assistant.io/components/snips/ +[switch.insteon_local docs]: https://home-assistant.io/components/switch.insteon_local/ +[switch.isy994 docs]: https://home-assistant.io/components/switch.isy994/ +[switch.knx docs]: https://home-assistant.io/components/switch.knx/ +[switch.mochad docs]: https://home-assistant.io/components/switch.mochad/ +[switch.rainbird docs]: https://home-assistant.io/components/switch.rainbird/ +[switch.rpi_rf docs]: https://home-assistant.io/components/switch.rpi_rf/ +[switch.snmp docs]: https://home-assistant.io/components/switch.snmp/ +[switch.template docs]: https://home-assistant.io/components/switch.template/ +[switch.tplink docs]: https://home-assistant.io/components/switch.tplink/ +[switch.transmission docs]: https://home-assistant.io/components/switch.transmission/ +[switch.xiaomi_miio docs]: https://home-assistant.io/components/switch.xiaomi_miio/ +[tahoma docs]: https://home-assistant.io/components/tahoma/ +[telegram_bot docs]: https://home-assistant.io/components/telegram_bot/ +[timer docs]: https://home-assistant.io/components/timer/ +[tts.baidu docs]: https://home-assistant.io/components/tts.baidu/ +[tts.marytts docs]: https://home-assistant.io/components/tts.marytts/ +[updater docs]: https://home-assistant.io/components/updater/ +[vacuum.xiaomi_miio docs]: https://home-assistant.io/components/vacuum.xiaomi_miio/ +[weather.darksky docs]: https://home-assistant.io/components/weather.darksky/ +[weather.openweathermap docs]: https://home-assistant.io/components/weather.openweathermap/ +[weather.yweather docs]: https://home-assistant.io/components/weather.yweather/ +[websocket_api docs]: https://home-assistant.io/components/websocket_api/ +[wemo docs]: https://home-assistant.io/components/wemo/ +[zigbee docs]: https://home-assistant.io/components/zigbee/ diff --git a/source/images/blog/2018-01-0.61/components.png b/source/images/blog/2018-01-0.61/components.png new file mode 100644 index 0000000000000000000000000000000000000000..8f03dfe6b70bf2b2e071afb83f82449b15e56767 GIT binary patch literal 106189 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

pxK|IDl{Qx*}gfNrC>D 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 literal 0 HcmV?d00001