From ce4bfdbdf66dfaae0f57d65f8fce2e8d8554d17e Mon Sep 17 00:00:00 2001 From: Robbie Trencheny Date: Sat, 4 Feb 2017 22:41:07 -0800 Subject: [PATCH 01/40] Spelling fix --- source/getting-started/index.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/getting-started/index.markdown b/source/getting-started/index.markdown index 64e28ee8181..fd1e441c5a5 100644 --- a/source/getting-started/index.markdown +++ b/source/getting-started/index.markdown @@ -31,7 +31,7 @@ You will need to install Home Assistant before we can get started. You can insta For advanced users we have several alternative guides for installing Home Assistant. - [Docker](/getting-started/installation-docker/) -- [Manual Raspberry Pi installtion](/getting-started/installation-raspberry-pi/) (requires existing Raspbian installation) +- [Manual Raspberry Pi installation](/getting-started/installation-raspberry-pi/) (requires existing Raspbian installation) - [Raspberry Pi All-In-One Installer Script](/getting-started/installation-raspberry-pi-all-in-one/) (requires existing Raspbian installation) - [Vagrant](/getting-started/installation-vagrant/) - [Synology NAS](/getting-started/installation-synology/) From 30b3a55344a13a1c91c83ba31ef2954a7067d34d Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sat, 4 Feb 2017 22:43:51 -0800 Subject: [PATCH 02/40] Update installation-raspberry-pi.markdown --- .../installation-raspberry-pi.markdown | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/source/getting-started/installation-raspberry-pi.markdown b/source/getting-started/installation-raspberry-pi.markdown index 7c500b90284..e4e7c76f426 100644 --- a/source/getting-started/installation-raspberry-pi.markdown +++ b/source/getting-started/installation-raspberry-pi.markdown @@ -9,20 +9,6 @@ sharing: true footer: true --- -### {% linkable_title Installation %} - -There's currently three documented ways to install Home Assistant on a Raspberry Pi. - - [Manual installation](/getting-started/installation-raspberry-pi/#manual-installation). Following this guide doing each step manually. This is highly recommended as a first installation since you get a good overview of the installation. - - [Hassbian image](/getting-started/installation-raspberry-pi-image). Basic installation with the same settings as following the manual installation guide. Some additional software is preinstalled to make installation quicker and easier. Installation uses `homeassistant` user. - - [All-in-One Installer](/getting-started/installation-raspberry-pi-all-in-one/). Fabric based installation script that installs and compiles many of the things an advanced Home Assistant install is likely to need. Installation uses `homeassistant` user. - -

- Since each installation type uses a different user for Home Assistant, be sure to note and use the correct username for the `adduser` commands listed below for camera and GPIO extensions. -

- - -### {% linkable_title Manual Installation %} - This installation of Home Assistant requires the Raspberry Pi to run [Raspbian Lite](https://www.raspberrypi.org/downloads/raspbian/). The installation will be installed in a [Virtual Environment](/getting-started/installation-virtualenv) with minimal overhead. Instructions assume this is a new installation of Raspbian Lite. From 87e7c16ef2b53fc063b594f9224f77740ddd8086 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Sun, 5 Feb 2017 08:30:14 +0100 Subject: [PATCH 03/40] Added note regarding dashes in script names (#1518) --- source/_components/script.markdown | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/source/_components/script.markdown b/source/_components/script.markdown index c3457fd0458..b8ad2d156cc 100644 --- a/source/_components/script.markdown +++ b/source/_components/script.markdown @@ -25,9 +25,15 @@ script: # This is Home Assistant Script Syntax - service: notify.notify data_template: - message: Current temperature is {% raw %}{{ states.sensor.temperature.state }}{% endraw %} +          message: Current temperature is {% raw %}{{ states.sensor.temperature.state }}{% endraw %} +``` +

+Script names (e.g. `message_temperature` in the example above) are not allowed to contain dash (minus) characters, i.e. `-`. +The preferred way to separate words for better readability is to use underscore (`_`) characters. +

- # Turns on the bedroom lights and then the living room lights 1 minute later +```yaml +  # Turns on the bedroom lights and then the living room lights 1 minute later wakeup: alias: Wake Up sequence: From efd9a5e68da79c55c12753cc69fdef23428ee507 Mon Sep 17 00:00:00 2001 From: Carlo Costanzo Date: Sun, 5 Feb 2017 03:28:13 -0500 Subject: [PATCH 04/40] Added cross linking to Automation templating. (#1965) Trigger templates where not easy to find in the current structure. --- source/_topics/templating.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_topics/templating.markdown b/source/_topics/templating.markdown index 7b71cabebc9..58731bef6f3 100644 --- a/source/_topics/templating.markdown +++ b/source/_topics/templating.markdown @@ -22,6 +22,7 @@ Templating is a powerful feature in Home Assistant that allows the user control - Formatting outgoing messages in, for example, the [notify] and [alexa] components. - Process incoming data from sources that provide raw data, like [MQTT], [REST sensor], or the [command line sensor]. +- [Advanced Automation templating](https://home-assistant.io/getting-started/automation-templating/) [notify]: /components/notify/ [alexa]: /components/alexa/ From eab1207db0b21c1b32fdfe091f4ae3fe5b6eef65 Mon Sep 17 00:00:00 2001 From: Fredrik Lindqvist Date: Sun, 5 Feb 2017 12:20:14 +0100 Subject: [PATCH 05/40] Update templating.markdown Fix formatting to be inline with rest of document. --- source/_topics/templating.markdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/_topics/templating.markdown b/source/_topics/templating.markdown index 58731bef6f3..cb87e480e17 100644 --- a/source/_topics/templating.markdown +++ b/source/_topics/templating.markdown @@ -22,13 +22,14 @@ Templating is a powerful feature in Home Assistant that allows the user control - Formatting outgoing messages in, for example, the [notify] and [alexa] components. - Process incoming data from sources that provide raw data, like [MQTT], [REST sensor], or the [command line sensor]. -- [Advanced Automation templating](https://home-assistant.io/getting-started/automation-templating/) +- [Advanced Automation templating]auto-template] [notify]: /components/notify/ [alexa]: /components/alexa/ [MQTT]: /components/mqtt/ [REST sensor]: /components/sensor.rest/ [command line sensor]: /components/sensor.command_line/ +[auto-template]: /getting-started/automation-templating/ ## {% linkable_title Building templates %} From eecb79efa2a27cbedf67ff11cbb646ee28fbbcff Mon Sep 17 00:00:00 2001 From: Alok Saboo Date: Sun, 5 Feb 2017 10:48:01 -0500 Subject: [PATCH 06/40] Added quotes around the templates. (#1975) --- source/_cookbook/sonos_say.markdown | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/source/_cookbook/sonos_say.markdown b/source/_cookbook/sonos_say.markdown index 9efe5e50085..0591d765507 100644 --- a/source/_cookbook/sonos_say.markdown +++ b/source/_cookbook/sonos_say.markdown @@ -21,22 +21,22 @@ script: sequence: - service: media_player.sonos_snapshot data_template: - entity_id: {% raw %}{{ sonos_entity }}{% endraw %} + entity_id: {% raw %}"{{ sonos_entity }}"{% endraw %} - service: media_player.sonos_unjoin data_template: - entity_id: {% raw %}{{ sonos_entity }}{% endraw %} + entity_id: {% raw %}"{{ sonos_entity }}"{% endraw %} - service: media_player.volume_set data_template: - entity_id: {% raw %}{{ sonos_entity }}{% endraw %} - volume_level: {% raw %}{{ volume }}{% endraw %} + entity_id: {% raw %}"{{ sonos_entity }}"{% endraw %} + volume_level: {% raw %}"{{ volume }}"{% endraw %} - service: tts.voicerss_say data_template: - entity_id: {% raw %}{{ sonos_entity }}{% endraw %} - message: {% raw %}{{ message }}{% endraw %} - - delay: {% raw %}{{ delay }}{% endraw %} + entity_id: {% raw %}"{{ sonos_entity }}"{% endraw %} + message: {% raw %}"{{ message }}"{% endraw %} + - delay: {% raw %}"{{ delay }}"{% endraw %} - service: media_player.sonos_restore data_template: - entity_id: {% raw %}{{ sonos_entity }}{% endraw %} + entity_id: {% raw %}"{{ sonos_entity }}"{% endraw %} ``` We call this now with: From a382aed9d11d16322c69a37b032e07adc0206388 Mon Sep 17 00:00:00 2001 From: arjenfvellinga Date: Sun, 5 Feb 2017 16:49:27 +0100 Subject: [PATCH 07/40] Update hassbian.markdown (#1974) Typo in url --- source/getting-started/hassbian.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/getting-started/hassbian.markdown b/source/getting-started/hassbian.markdown index 26669b0e039..969eaad57c3 100644 --- a/source/getting-started/hassbian.markdown +++ b/source/getting-started/hassbian.markdown @@ -16,7 +16,7 @@ Hassbian is our customized operating system for the Raspberry Pi 3. It is the ea - [Pi specific integrations][integrations] - [Learn how to perform common tasks][common] -[install]: /getting-started/hassbian-installatino/ +[install]: /getting-started/hassbian-installation/ [customize]: /getting-started/hassbian-customization/ [common]: /getting-started/hassbian-common-tasks/ [integrations]: /getting-started/hassbian-integrations/ From 74fd315660f53797747b6099d2bb59d9925c1d0f Mon Sep 17 00:00:00 2001 From: clach04 Date: Sun, 5 Feb 2017 07:54:50 -0800 Subject: [PATCH 08/40] Clarify CLA signing sequence of events (#1964) * Clarify CLA signing sequence of events. --- source/developers/cla.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/developers/cla.markdown b/source/developers/cla.markdown index 46f9192c0a0..f48588f5e17 100644 --- a/source/developers/cla.markdown +++ b/source/developers/cla.markdown @@ -41,7 +41,7 @@ and not mention sign-off. ## Signing -To sign this CLA you must first submit a pull request to a repository under the Home Assistant organization. +If you have not signed the CLA and you submit a pull request to a repository under the Home Assistant organization, a link will be automatically generated. Just follow the link and the instructions in the link. ## Adoption From 44d345faaea95cec31c843809b16b375920082fd Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 5 Feb 2017 12:01:32 -0800 Subject: [PATCH 09/40] Redirect image installation url --- source/getting-started/hassbian-installation.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/getting-started/hassbian-installation.markdown b/source/getting-started/hassbian-installation.markdown index ab3aaf97535..6ed77c59642 100644 --- a/source/getting-started/hassbian-installation.markdown +++ b/source/getting-started/hassbian-installation.markdown @@ -7,6 +7,7 @@ sidebar: true comments: false sharing: true footer: true +redirect_from: /getting-started/installation-raspberry-pi-image/ --- The easiest way to install Home Assistant on your Raspberry Pi is by using HASSbian: a Raspberry Pi image with Home Assistant built-in. The image will install the latest version of Home Assistant on initial boot (~10 minutes). From 79e2d61109834d1c58e26716e00414baea43b3cb Mon Sep 17 00:00:00 2001 From: Duoxilian Date: Sun, 5 Feb 2017 02:26:33 -0600 Subject: [PATCH 10/40] Update climate.ecobee.markdown (#1967) --- source/_components/climate.ecobee.markdown | 247 +++++++++++++++++++++ 1 file changed, 247 insertions(+) diff --git a/source/_components/climate.ecobee.markdown b/source/_components/climate.ecobee.markdown index 48c31005144..7c5884da8c7 100644 --- a/source/_components/climate.ecobee.markdown +++ b/source/_components/climate.ecobee.markdown @@ -13,4 +13,251 @@ ha_release: 0.9 ha_iot_class: "Cloud Push" --- +

To get your Ecobee thermostats working with Home Assistant, follow the instructions for the general [Ecobee component](/components/ecobee/). +

+ +## {% linkable_title Concepts %} + +The Ecobee 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 +currently active climate or it may be overridden by a hold. When the +thermostat is not in auto mode, there is a single target +temperature. When the thermostat is in auto operation mode, there is a +pair of target temperatures: the lower target temperature determines +the lowest desired temperature, while the higher target temperature +determines the highest desired temperature (the thermostat will switch +between heating and cooling to keep the temperature within these +limits). + +A _climate_ is a predefined or user-defined set of states that the +thermostat aims to achieve. The ecobee thermostat provides three predefined +climates: home, away, and sleep. The user can define additional climates. + +A _hold_ is an override of the target temperature defined in the +currently active climate. The temperature targeted in the hold mode may be +explicitly set (temperature hold) or it may be derived from a reference +climate (home or away hold). All holds are temporary. Temperature and +climate holds expire when the thermostat transitions to the next climate +defined in its program. + +When in _away mode_, the target temperature is permanently overridden by +the target temperature defined for the away climate. The away mode is a +simple way to emulate a vacation mode. + +The _operation mode_ of the device is the currently active operational +modes that the Ecobee thermostat provides: heat, auxHeatOnly, cool, +auto, and off. + + +## {% linkable_title Attributes %} + +The following attributes are provided by the Ecobee Thermostat: +`name`, `temperature_unit`, `current_temperature`, `target_temperature`, +`target_temperature_low`, `target_temperature_high`, `desired_fan_mode`, +`fan`, `current_hold_mode`, `current_operation`, `operation_list`, +`operation_mode`, `mode`, `fan_min_on_time`, `device_state_attributes`, +`is_away_mode_on`. +The attributes `min_temp` and `max_temp` are meaningless constant values. + + +### {% linkable_title Attribute `name` %} + +Returns the name of the Ecobee Thermostat. + +| Attribute type | Description | +| ---------------| ----------- | +| String | Name of the Ecobee 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 | Currenly 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 `desired_fan_mode` %} + +Returns the desired fan mode of the current operation. + +| Attribute type | Description | +| ---------------| ----------- | +| String | 'on', 'off' + +### {% linkable_title Attribute `fan` %} + +Returns the current fan state. + +| Attribute type | Description | +| ---------------| ----------- | +| String | 'on', 'off' + +### {% linkable_title Attribute `current_hold_mode` %} + +Returns the current temperature hold, if any. + +| Attribute type | Description | +| ---------------| ----------- | +| String | 'home', 'away', 'temp', None + +### {% linkable_title Attribute `current_operation` %} + +Returns the current operation of the thermostat. + +| Attribute type | Description | +| ---------------| ----------- | +| String | 'auto', 'cool', 'heat', 'off' + +### {% linkable_title Attribute `operation_list` %} + +Returns the list of available operation modes. + +| Attribute type | Description | +| ---------------| ----------- | +| List of String | Available operation modes + +### {% linkable_title Attribute `operation_mode` %} + +Returns the current operation mode of the thermostat. + +| Attribute type | Description | +| ---------------| ----------- | +| String | Currently active operation mode + +### {% linkable_title Attribute `mode` %} + +Returns the climate currently active on the thermostat. + +### {% linkable_title Attribute `fan_min_on_time` %} + +Returns the current fan mimimum on time. + +| Attribute type | Description | +| ---------------| ----------- | +| Integer | Current fan minimum on time in minutes + +### {% linkable_title Attribute `is_away_mode_on` %} + +Returns whether the thermostat is in away mode (see the corresponding +service for more detail). + +### {% linkable_title Attribute `actual humidity` %} + +Returns the humidity as measured by the thermostat. + +| Attribute type | Description | +| ---------------| ----------- | +| Integer | Current humidity + + +## {% linkable_title Services %} + +The following services are provided by the Ecobee Thermostat: +`set_away_mode`, `set_hold_mode`, `set_temperature`, `set_operation_mode`, +`fan_min_on_time`, `resume_program`. +The services `set_aux_heat`, `set_humidity`, `set_fan_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_hold_mode` %} + +Puts the thermostat into the given hold mode. For 'home' and 'away', the +target temperature is taken from the home or away, climate, respectively. +For 'temp', the current temperature is taken as the target temperature. +When None is provided as parameter, the hold_mode is turned 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. Else targets all. +| `hold_mode` | no | 'home', 'away', 'temp', None + +### {% 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 `set_operation_mode` %} + +Sets the current operation mode of 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. +| `operation_mode` | no | 'auto', 'auxHeatOnly', 'cool', 'heat', 'off' + +### {% linkable_title Service `fan_min_on_time` %} + +Sets the fan minimum on time. + +| 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. +| `fan_min_on_time` | no | Desired fan minimum on time + +### {% 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. +| `resume_all` | no | true or false From 2b0c208e1fb509041839657a7d17708456e4bde9 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sun, 5 Feb 2017 22:13:20 +0100 Subject: [PATCH 11/40] Fix tables --- source/_components/climate.ecobee.markdown | 111 ++++++++------------- 1 file changed, 41 insertions(+), 70 deletions(-) diff --git a/source/_components/climate.ecobee.markdown b/source/_components/climate.ecobee.markdown index 7c5884da8c7..cf4835272d4 100644 --- a/source/_components/climate.ecobee.markdown +++ b/source/_components/climate.ecobee.markdown @@ -21,45 +21,23 @@ To get your Ecobee thermostats working with Home Assistant, follow the instructi The Ecobee 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 -currently active climate or it may be overridden by a hold. When the -thermostat is not in auto mode, there is a single target -temperature. When the thermostat is in auto operation mode, there is a -pair of target temperatures: the lower target temperature determines -the lowest desired temperature, while the higher target temperature -determines the highest desired temperature (the thermostat will switch -between heating and cooling to keep the temperature within these -limits). +The _target temperature_ is the temperature that the device attempts to achieve. The target temperature is either determined by the +currently active climate or it may be overridden by a hold. When the thermostat is not in auto mode, there is a single target temperature. When the thermostat is in auto operation mode, there is a pair of target temperatures: the lower target temperature determines the lowest desired temperature, while the higher target temperature determines the highest desired temperature (the thermostat will switch between heating and cooling to keep the temperature within these limits). -A _climate_ is a predefined or user-defined set of states that the -thermostat aims to achieve. The ecobee thermostat provides three predefined -climates: home, away, and sleep. The user can define additional climates. +A _climate_ is a predefined or user-defined set of states that the thermostat aims to achieve. The ecobee thermostat provides three predefined climates: home, away, and sleep. The user can define additional climates. -A _hold_ is an override of the target temperature defined in the -currently active climate. The temperature targeted in the hold mode may be -explicitly set (temperature hold) or it may be derived from a reference -climate (home or away hold). All holds are temporary. Temperature and -climate holds expire when the thermostat transitions to the next climate -defined in its program. +A _hold_ is an override of the target temperature defined in the currently active climate. The temperature targeted in the hold mode may be explicitly set (temperature hold) or it may be derived from a reference climate (home or away hold). All holds are temporary. Temperature and climate holds expire when the thermostat transitions to the next climate defined in its program. -When in _away mode_, the target temperature is permanently overridden by -the target temperature defined for the away climate. The away mode is a -simple way to emulate a vacation mode. +When in _away mode_, the target temperature is permanently overridden by the target temperature defined for the away climate. The away mode is a simple way to emulate a vacation mode. -The _operation mode_ of the device is the currently active operational -modes that the Ecobee thermostat provides: heat, auxHeatOnly, cool, -auto, and off. +The _operation mode_ of the device is the currently active operational modes that the Ecobee thermostat provides: heat, auxHeatOnly, cool, auto, and off. ## {% linkable_title Attributes %} The following attributes are provided by the Ecobee Thermostat: -`name`, `temperature_unit`, `current_temperature`, `target_temperature`, -`target_temperature_low`, `target_temperature_high`, `desired_fan_mode`, -`fan`, `current_hold_mode`, `current_operation`, `operation_list`, -`operation_mode`, `mode`, `fan_min_on_time`, `device_state_attributes`, -`is_away_mode_on`. +`name`, `temperature_unit`, `current_temperature`, `target_temperature`, `target_temperature_low`, `target_temperature_high`, `desired_fan_mode`, `fan`, `current_hold_mode`, `current_operation`, `operation_list`,`operation_mode`, `mode`, `fan_min_on_time`, `device_state_attributes`, `is_away_mode_on`. + The attributes `min_temp` and `max_temp` are meaningless constant values. @@ -69,7 +47,7 @@ Returns the name of the Ecobee Thermostat. | Attribute type | Description | | ---------------| ----------- | -| String | Name of the Ecobee Thermostat +| String | Name of the Ecobee Thermostat | ### {% linkable_title Attribute `temperature_unit` %} @@ -77,7 +55,7 @@ Returns the unit of measurement used for temperature by the thermostat. | Attribute type | Description | | ---------------| ----------- | -| String | Name of the temperature unit +| String | Name of the temperature unit | ### {% linkable_title Attribute `current_temperature` %} @@ -85,7 +63,7 @@ Returns the current temperature measured by the thermostat. | Attribute type | Description | | ---------------| ----------- | -| Integer | Currenly measured temperature +| Integer | Currenly measured temperature | ### {% linkable_title Attribute `target_temperature` %} @@ -94,7 +72,7 @@ not in auto operation mode. | Attribute type | Description | | ---------------| ----------- | -| Integer | Target temperature +| Integer | Target temperature | ### {% linkable_title Attribute `target_temperature_low` %} @@ -103,7 +81,7 @@ auto operation mode. | Attribute type | Description | | ---------------| ----------- | -| Integer | Target temperature +| Integer | Target temperature | ### {% linkable_title Attribute `target_temperature_high` %} @@ -112,7 +90,7 @@ auto operation mode. | Attribute type | Description | | ---------------| ----------- | -| Integer | Target temperature +| Integer | Target temperature | ### {% linkable_title Attribute `desired_fan_mode` %} @@ -120,7 +98,7 @@ Returns the desired fan mode of the current operation. | Attribute type | Description | | ---------------| ----------- | -| String | 'on', 'off' +| String | 'on', 'off' | ### {% linkable_title Attribute `fan` %} @@ -128,7 +106,7 @@ Returns the current fan state. | Attribute type | Description | | ---------------| ----------- | -| String | 'on', 'off' +| String | 'on', 'off' | ### {% linkable_title Attribute `current_hold_mode` %} @@ -136,7 +114,7 @@ Returns the current temperature hold, if any. | Attribute type | Description | | ---------------| ----------- | -| String | 'home', 'away', 'temp', None +| String | 'home', 'away', 'temp', None | ### {% linkable_title Attribute `current_operation` %} @@ -144,7 +122,7 @@ Returns the current operation of the thermostat. | Attribute type | Description | | ---------------| ----------- | -| String | 'auto', 'cool', 'heat', 'off' +| String | 'auto', 'cool', 'heat', 'off' | ### {% linkable_title Attribute `operation_list` %} @@ -152,7 +130,7 @@ Returns the list of available operation modes. | Attribute type | Description | | ---------------| ----------- | -| List of String | Available operation modes +| List of String | Available operation modes | ### {% linkable_title Attribute `operation_mode` %} @@ -160,7 +138,7 @@ Returns the current operation mode of the thermostat. | Attribute type | Description | | ---------------| ----------- | -| String | Currently active operation mode +| String | Currently active operation mode | ### {% linkable_title Attribute `mode` %} @@ -172,12 +150,11 @@ Returns the current fan mimimum on time. | Attribute type | Description | | ---------------| ----------- | -| Integer | Current fan minimum on time in minutes +| Integer | Current fan minimum on time in minutes | ### {% linkable_title Attribute `is_away_mode_on` %} -Returns whether the thermostat is in away mode (see the corresponding -service for more detail). +Returns whether the thermostat is in away mode (see the corresponding service for more detail). ### {% linkable_title Attribute `actual humidity` %} @@ -185,17 +162,15 @@ Returns the humidity as measured by the thermostat. | Attribute type | Description | | ---------------| ----------- | -| Integer | Current humidity +| Integer | Current humidity | ## {% linkable_title Services %} The following services are provided by the Ecobee Thermostat: -`set_away_mode`, `set_hold_mode`, `set_temperature`, `set_operation_mode`, -`fan_min_on_time`, `resume_program`. -The services `set_aux_heat`, `set_humidity`, `set_fan_mode`, and -`set_swing_mode` offered by the [Climate component](/components/climate/) -are not implemented for this thermostat. +`set_away_mode`, `set_hold_mode`, `set_temperature`, `set_operation_mode`, `fan_min_on_time`, `resume_program`. + +The services `set_aux_heat`, `set_humidity`, `set_fan_mode`, and `set_swing_mode` offered by the [Climate component](/components/climate/) are not implemented for this thermostat. @@ -205,21 +180,18 @@ 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' +| `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_hold_mode` %} -Puts the thermostat into the given hold mode. For 'home' and 'away', the -target temperature is taken from the home or away, climate, respectively. -For 'temp', the current temperature is taken as the target temperature. -When None is provided as parameter, the hold_mode is turned off. +Puts the thermostat into the given hold mode. For 'home' and 'away', the target temperature is taken from the home or away, climate, respectively. For 'temp', the current temperature is taken as the target temperature. When None is provided as parameter, the hold_mode is turned 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. Else targets all. -| `hold_mode` | no | 'home', 'away', 'temp', None +| `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 | 'home', 'away', 'temp', None | ### {% linkable_title Service `set_temperature` %} @@ -228,12 +200,11 @@ 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) +| `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. +Only the target temperatures relevant for the current operation mode need to be provided. ### {% linkable_title Service `set_operation_mode` %} @@ -241,8 +212,8 @@ Sets the current operation mode of 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. -| `operation_mode` | no | 'auto', 'auxHeatOnly', 'cool', 'heat', 'off' +| `entity_id` | yes | String or list of strings that point at `entity_id`'s of climate devices to control. Else targets all. | +| `operation_mode` | no | 'auto', 'auxHeatOnly', 'cool', 'heat', 'off' | ### {% linkable_title Service `fan_min_on_time` %} @@ -250,8 +221,8 @@ Sets the fan minimum on time. | 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. -| `fan_min_on_time` | no | Desired fan minimum on time +| `entity_id` | yes | String or list of strings that point at `entity_id`'s of climate devices to control. Else targets all. | +| `fan_min_on_time` | no | Desired fan minimum on time | ### {% linkable_title Service `resume_program` %} @@ -259,5 +230,5 @@ 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. -| `resume_all` | no | true or false +| `entity_id` | yes | String or list of strings that point at `entity_id`'s of climate devices to control. Else targets all. | +| `resume_all` | no | true or false | From 2b0557b388c1a55f14ce59aefab22ed1474bb709 Mon Sep 17 00:00:00 2001 From: Duoxilian Date: Sun, 29 Jan 2017 02:24:10 -0600 Subject: [PATCH 12/40] Update climate.markdown (#1898) Add documentation for hold_mode. --- source/_components/climate.markdown | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/source/_components/climate.markdown b/source/_components/climate.markdown index 24caf95194e..d90be5414d8 100644 --- a/source/_components/climate.markdown +++ b/source/_components/climate.markdown @@ -54,12 +54,17 @@ automation: ### {% linkable_title Service `climate.set_away_mode` %} -Turn away mode on/off for climate device +This service has been deprecated. Use `climate.set_hold_mode` instead. + + +### {% linkable_title Service `climate.set_hold_mode` %} + +Set hold mode for climate device | 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 | New value of away mode. +| `hold_mode` | no | New value of hold mode. #### {% linkable_title Automation example %} @@ -69,10 +74,10 @@ automation: platform: time after: "07:15:00" action: - - service: climate.set_away_mode + - service: climate.set_hold_mode data: entity_id: climate.kitchen - away_mode: true + hold_mode: 'away' ``` ### {% linkable_title Service `climate.set_temperature` %} From 0f4865b038e74ae6cf60d98ac7db4f2efb412608 Mon Sep 17 00:00:00 2001 From: Brian J King Date: Mon, 6 Feb 2017 00:49:33 -0600 Subject: [PATCH 13/40] Fix typo in configuration variables for TP-Link Smart Switches (#1982) Page had indicated [MyStrom)(https://mystrom.ch/en/), however, this appears to be another smart switch option, not TP-Link as the page is about. --- source/_components/switch.tplink.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/switch.tplink.markdown b/source/_components/switch.tplink.markdown index 9194054217d..d2a6a8053cf 100644 --- a/source/_components/switch.tplink.markdown +++ b/source/_components/switch.tplink.markdown @@ -33,7 +33,7 @@ switch: Configuration variables: -- **host** (*Required*): The IP address of your myStrom switch, eg. `http://192.168.1.32`. +- **host** (*Required*): The IP address of your TP-Link switch, eg. `http://192.168.1.32`. - **name** (*Optional*): The name to use when displaying this switch. From 1595a715cb18a381b2149a748c305dc520b107ec Mon Sep 17 00:00:00 2001 From: arjenfvellinga Date: Mon, 6 Feb 2017 18:44:27 +0100 Subject: [PATCH 14/40] Update notify.pushbullet.markdown (#1983) More specific instruction where to retrieve your api key. --- source/_components/notify.pushbullet.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/notify.pushbullet.markdown b/source/_components/notify.pushbullet.markdown index f7880b7c751..3d6ad9a45dd 100644 --- a/source/_components/notify.pushbullet.markdown +++ b/source/_components/notify.pushbullet.markdown @@ -26,7 +26,7 @@ notify: Configuration variables: -- **api_key** (*Required*): Enter the API key for Pushbullet. Go to https://www.pushbullet.com/ to retrieve your API key. +- **api_key** (*Required*): Enter the API key for Pushbullet. Go to https://www.pushbullet.com/#settings/account to retrieve your API key / access token. - **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`. ### {% linkable_title Usage %} From e157039ab31bb9ec69d14405465e07d5797b3921 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 6 Feb 2017 08:59:16 +0100 Subject: [PATCH 15/40] Update sample --- source/_components/binary_sensor.mqtt.markdown | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/source/_components/binary_sensor.mqtt.markdown b/source/_components/binary_sensor.mqtt.markdown index e701a556c4f..5ab90a6900e 100644 --- a/source/_components/binary_sensor.mqtt.markdown +++ b/source/_components/binary_sensor.mqtt.markdown @@ -46,13 +46,13 @@ An extended configuration for the same sensor could look like this if you want/n ```yaml # Example configuration.yml entry binary_sensor: - platform: mqtt - state_topic: "home-assistant/window/contact" - name: "Windows contact" - qos: 0 - payload_on: "1" - payload_off: "0" - sensor_class: opening - value_template: '{% raw %}{{ value.x }}{% endraw %}' + - platform: mqtt + state_topic: "home-assistant/window/contact" + name: "Windows contact" + qos: 0 + payload_on: "1" + payload_off: "0" + sensor_class: opening + value_template: '{% raw %}{{ value.x }}{% endraw %}' ``` From 87d018214cd7f5fd9088f3b890754eb9f97a2d75 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 6 Feb 2017 21:56:35 +0100 Subject: [PATCH 16/40] Add more examples --- source/developers/websocket_api.markdown | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/source/developers/websocket_api.markdown b/source/developers/websocket_api.markdown index e7a1d974ef2..785b907b9fe 100644 --- a/source/developers/websocket_api.markdown +++ b/source/developers/websocket_api.markdown @@ -1,7 +1,7 @@ --- layout: page -title: "Websocket API" -description: "Home Assistant Websocket API documentation" +title: "WebSocket API" +description: "Home Assistant WebSocket API documentation" date: 2016-11-26 13:27 sidebar: true comments: false @@ -9,9 +9,11 @@ sharing: true footer: true --- -Home Assistant contains a websocket API. This API can be used to stream information from a Home Assistant instance to any client that implements websockets. Implementations in different languages: +Home Assistant contains a WebSocket API. This API can be used to stream information from a Home Assistant instance to any client that implements WebSocket. Implementations in different languages: - [JavaScript](https://github.com/home-assistant/home-assistant-js-websocket) - powers the frontend + - [Python](https://raw.githubusercontent.com/home-assistant/home-assistant-dev-helper/master/ha-websocket-client.py) - CLI client using [`asyncws`](https://async-websockets.readthedocs.io/en/latest/) + - [JavaScript/HTML](https://raw.githubusercontent.com/home-assistant/home-assistant-dev-helper/master/ha-websocket.html) - WebSocket connection in your browser Connect your websocket implementation to `ws://localhost:8123/api/websocket`. From 8a16b0d4130222870a3a7ef663206e12469988d6 Mon Sep 17 00:00:00 2001 From: Alok Saboo Date: Mon, 6 Feb 2017 16:33:06 -0500 Subject: [PATCH 17/40] Update Sonos say script (#1985) --- source/_cookbook/sonos_say.markdown | 34 ++++++++++++++--------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/source/_cookbook/sonos_say.markdown b/source/_cookbook/sonos_say.markdown index 0591d765507..fc1d7c9ff2f 100644 --- a/source/_cookbook/sonos_say.markdown +++ b/source/_cookbook/sonos_say.markdown @@ -1,7 +1,7 @@ --- layout: page title: "Sonos say script to speak with text-to-speech" -description: "Sonos say script to speak with text-to-speech." +description: "Sonos say script to use text-to-speech with Sonos" date: 2017-01-18 00:00 sidebar: true comments: false @@ -12,7 +12,7 @@ ha_category: Automation Examples #### {% linkable_title Sonos say script to speak with text-to-speech %} -This script allow you to use TTS on sonos in a easy way with all features. +This script allows you to use [TTS](https://home-assistant.io/components/#text-to-speech) on Sonos. ```yaml script: @@ -22,21 +22,21 @@ script: - service: media_player.sonos_snapshot data_template: entity_id: {% raw %}"{{ sonos_entity }}"{% endraw %} - - service: media_player.sonos_unjoin - data_template: - entity_id: {% raw %}"{{ sonos_entity }}"{% endraw %} - - service: media_player.volume_set - data_template: - entity_id: {% raw %}"{{ sonos_entity }}"{% endraw %} - volume_level: {% raw %}"{{ volume }}"{% endraw %} - - service: tts.voicerss_say - data_template: - entity_id: {% raw %}"{{ sonos_entity }}"{% endraw %} - message: {% raw %}"{{ message }}"{% endraw %} - - delay: {% raw %}"{{ delay }}"{% endraw %} - - service: media_player.sonos_restore - data_template: - entity_id: {% raw %}"{{ sonos_entity }}"{% endraw %} + - service: media_player.sonos_unjoin + data_template: + entity_id: {% raw %}"{{ sonos_entity }}"{% endraw %} + - service: media_player.volume_set + data_template: + entity_id: {% raw %}"{{ sonos_entity }}"{% endraw %} + volume_level: {% raw %}"{{ volume }}"{% endraw %} + - service: tts.voicerss_say + data_template: + entity_id: {% raw %}"{{ sonos_entity }}"{% endraw %} + message: {% raw %}"{{ message }}"{% endraw %} + - delay: {% raw %}"{{ delay }}"{% endraw %} + - service: media_player.sonos_restore + data_template: + entity_id: {% raw %}"{{ sonos_entity }}"{% endraw %} ``` We call this now with: From 43eafc7a0ceb42ea61dd9a60e9f5eea9251adfe4 Mon Sep 17 00:00:00 2001 From: bbrendon Date: Mon, 6 Feb 2017 13:34:50 -0800 Subject: [PATCH 18/40] fix some syntax errors and made the example more complete (#1981) --- source/_cookbook/sonos_say.markdown | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/source/_cookbook/sonos_say.markdown b/source/_cookbook/sonos_say.markdown index fc1d7c9ff2f..6c73f0e1bb6 100644 --- a/source/_cookbook/sonos_say.markdown +++ b/source/_cookbook/sonos_say.markdown @@ -41,10 +41,16 @@ script: We call this now with: ```yaml -service: script.sonos_say -data: - sonos_entity: media_player.kitchen - volume: 0.3 - message: 'Your husband comming home!' - delay: '00:00:05' +automation: + - alias: 'test' + trigger: + - platform: state + entity_id: input_boolean.mytest + action: + - service: script.sonos_say + data: + sonos_entity: media_player.office + volume: 0.5 + message: 'Your husband comming home!' + delay: '00:00:05' ``` From 00a1b09386e59d96f7631d8cdffdbfd324ecceb3 Mon Sep 17 00:00:00 2001 From: Alok Saboo Date: Mon, 6 Feb 2017 16:35:26 -0500 Subject: [PATCH 19/40] Minor fixes. (#1984) --- source/_components/notify.pushbullet.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/notify.pushbullet.markdown b/source/_components/notify.pushbullet.markdown index 3d6ad9a45dd..d1cd11a92c0 100644 --- a/source/_components/notify.pushbullet.markdown +++ b/source/_components/notify.pushbullet.markdown @@ -26,7 +26,7 @@ notify: Configuration variables: -- **api_key** (*Required*): Enter the API key for Pushbullet. Go to https://www.pushbullet.com/#settings/account to retrieve your API key / access token. +- **api_key** (*Required*): Enter the API key for Pushbullet. Go to [https://www.pushbullet.com/#settings/account](https://www.pushbullet.com/#settings/account) to retrieve your API key/access token. - **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`. ### {% linkable_title Usage %} From 42be2b1e1bdbd6b9e58189f9133d7fdf40262c22 Mon Sep 17 00:00:00 2001 From: Jerry Workman Date: Tue, 7 Feb 2017 02:05:11 -0500 Subject: [PATCH 20/40] fix error in switch/turn_on example (#1988) Corrected CURL bash command ( thanks to David): '$ curl -X POST -H "x-ha-access: YOUR_PASSWORD" \ -H "Content-Type: application/json" \ -d '{"entity_id": "switch.christmas_lights", "state": "on"}' \ http://localhost:8123/api/services/switch/turn_on' --- source/developers/rest_api.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/developers/rest_api.markdown b/source/developers/rest_api.markdown index 23f5a2e4c8b..27b4392e1a7 100644 --- a/source/developers/rest_api.markdown +++ b/source/developers/rest_api.markdown @@ -418,7 +418,7 @@ Sample `curl` command: ```bash $ curl -X POST -H "x-ha-access: YOUR_PASSWORD" \ -H "Content-Type: application/json" \ - -d '{"entity_id": "switch.christmas_lights", "state": "on"}' \ + -d '{"entity_id": "switch.christmas_lights"}' \ http://localhost:8123/api/services/switch/turn_on ``` From a4c695920f73bde6aaaa775dfa335bf8204a678f Mon Sep 17 00:00:00 2001 From: azeroth12 Date: Tue, 7 Feb 2017 12:34:40 -0600 Subject: [PATCH 21/40] Update z-wave-controllers.markdown (#1990) Works solid on my intel xserve running 10.11.6 --- source/getting-started/z-wave-controllers.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/getting-started/z-wave-controllers.markdown b/source/getting-started/z-wave-controllers.markdown index 42699a01ea4..694f7263d0c 100644 --- a/source/getting-started/z-wave-controllers.markdown +++ b/source/getting-started/z-wave-controllers.markdown @@ -20,7 +20,7 @@ Upon first run, the `zwave` component will take time to initialize entities and | Device | Works on Linux | Works on Windows | Works on OSX | |-------------------------|----------------|------------------|--------------| | Aeotec Z-Stick Series 2 | ✓ | | | -| Aeotec Z-Stick Series 5 | ✓ | | | +| Aeotec Z-Stick Series 5 | ✓ | | ✓ | | Pine64 Z-Wave Module | ✓ | | | | Razberry GPIO Module | ✓ | | | | ZWave.me UZB1 | ✓ | | | From f821cf290033f5aa2807628c2e386760bffeff92 Mon Sep 17 00:00:00 2001 From: R Huish Date: Tue, 7 Feb 2017 18:39:27 +0000 Subject: [PATCH 22/40] Updated to reflect firebase.google.com changes (#1987) firebase.google.com has moved to a new longer key and the regenerate button is no longer present. --- source/_components/notify.html5.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/notify.html5.markdown b/source/_components/notify.html5.markdown index 63197a526ea..54ae837cfd7 100644 --- a/source/_components/notify.html5.markdown +++ b/source/_components/notify.html5.markdown @@ -37,7 +37,7 @@ Configuration variables: - Go to [https://console.cloud.google.com/apis/credentials/domainverification](https://console.cloud.google.com/apis/credentials/domainverification) and verify your domain. - After that, go to [https://console.firebase.google.com](https://console.firebase.google.com) and select import Google project, select the project you created. - Then, click the cogwheel on top left and select "Project settings". -- Select Cloud messaging tab if under server key is button Regenerate key, click that. +- Select 'Cloud Messaging' tab, listed beneath Project Credentials will be your 152 character 'Server Key' and 12 digit ID 'Sender ID'. ### {% linkable_title Requirements %} From 043022647ffc7c9ef9b0ffb8c0059a886fa3a29e Mon Sep 17 00:00:00 2001 From: Carlo Costanzo Date: Tue, 7 Feb 2017 14:41:48 -0500 Subject: [PATCH 23/40] Add in to and from I think due to the rapid changes/reporting of states, a clear delimiter is needed for examples. --- source/_cookbook/dim_lights_when_playing_media.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_cookbook/dim_lights_when_playing_media.markdown b/source/_cookbook/dim_lights_when_playing_media.markdown index 55fe9413b59..89a7700f512 100644 --- a/source/_cookbook/dim_lights_when_playing_media.markdown +++ b/source/_cookbook/dim_lights_when_playing_media.markdown @@ -56,6 +56,7 @@ automation: - platform: state entity_id: media_player.htpc from: 'playing' + to: 'idle' condition: - condition: state entity_id: sun.sun @@ -69,6 +70,7 @@ automation: - platform: state entity_id: media_player.htpc to: 'playing' + from: 'idle' condition: - condition: state entity_id: sun.sun From 883885bd00c7f5b5321fc07e26c3ddcd2cc9f274 Mon Sep 17 00:00:00 2001 From: neonbunny Date: Tue, 7 Feb 2017 21:08:23 +0000 Subject: [PATCH 24/40] Fix markdown in WOL Switch (#1994) Currently the final code example is garbled on the home assistant website (but not github). I suspect it needs a line of whitespace before the code block. --- source/_components/switch.wake_on_lan.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_components/switch.wake_on_lan.markdown b/source/_components/switch.wake_on_lan.markdown index 510299accbc..78df4ddf479 100644 --- a/source/_components/switch.wake_on_lan.markdown +++ b/source/_components/switch.wake_on_lan.markdown @@ -51,6 +51,7 @@ from Home Assistant running on another Linux computer (the **server**). 6. On the **target**, we need to let the hass user execute the program needed to suspend/shut down the target computer. I'm using `pm-suspend`, use `poweroff` to turn off the computer. First, get the full path: `which pm-suspend`. On my system, this is `/usr/sbin/pm-suspend`. 7. On the **target**, using an account with sudo access (typically your main account), `sudo visudo`. Add this line last in the file: `hass ALL=NOPASSWD:/usr/sbin/pm-suspend`, where you replace `hass` with the name of your user on the target, if different, and `/usr/sbin/pm-suspend` with the command of your choice, if different. 8. On the **server**, add the following to your configuration, replacing TARGET with the target's name: + ```yaml switch: - platform: wake_on_lan From 38e6098ad8606d2da45e44dafd92a16998ed7aa1 Mon Sep 17 00:00:00 2001 From: Johann Kellerman Date: Wed, 8 Feb 2017 19:16:32 +0200 Subject: [PATCH 25/40] SMA New factor for units (#1999) --- source/_components/sensor.sma.markdown | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/source/_components/sensor.sma.markdown b/source/_components/sensor.sma.markdown index 2744a5a57ed..99ef3984a0a 100644 --- a/source/_components/sensor.sma.markdown +++ b/source/_components/sensor.sma.markdown @@ -14,7 +14,7 @@ ha_release: 0.36 --- -The `sma` sensor will poll a [SMA][http://www.sma-america.com/] solar inverter and present the values as sensors (or attributes of sensors) in Home Assistant. +The `sma` sensor will poll a [SMA](http://www.sma-solar.com/) [(US)](http://www.sma-america.com/) solar inverter and present the values as sensors (or attributes of sensors) in Home Assistant. To enable this sensor, add the following lines to your `configuration.yaml` file: @@ -60,7 +60,8 @@ Example: custom: yesterday_consumption: key: 6400_00543A01 - unit: W + unit: kWh + factor: 1000 ``` Over time more sensors will be added as standard sensors to the [pysma library](https://github.com/kellerza/pysma/blob/master/pysma/__init__.py#L18). Feel free to submit additional sensors on that repository. From daa11ee5504e742800e5539d02785bd929ffac0e Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Wed, 8 Feb 2017 12:30:58 -0500 Subject: [PATCH 26/40] Update example platforms for async conventions (#1998) --- source/developers/platform_example_light.markdown | 11 ++++++++--- source/developers/platform_example_sensor.markdown | 13 ++++++++++++- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/source/developers/platform_example_light.markdown b/source/developers/platform_example_light.markdown index 9e530f65221..a5092db30ca 100644 --- a/source/developers/platform_example_light.markdown +++ b/source/developers/platform_example_light.markdown @@ -76,11 +76,14 @@ class AwesomeLight(Light): def __init__(self, light): """Initialize an AwesomeLight.""" self._light = light + self._name = light.name + self._state = None + self._brightness = None @property def name(self): """Return the display name of this light.""" - return self._light.name + return self._name @property def brightness(self): @@ -89,12 +92,12 @@ class AwesomeLight(Light): This method is optional. Removing it indicates to Home Assistant that brightness is not supported for this light. """ - return self._light.brightness + return self._brightness @property def is_on(self): """Return true if light is on.""" - return self._light.is_on() + return self._state def turn_on(self, **kwargs): """Instruct the light to turn on. @@ -115,4 +118,6 @@ class AwesomeLight(Light): This is the only method that should fetch new data for Home Assistant. """ self._light.update() + self._state = self._light.is_on() + self._brightness = self._light.brightness ``` diff --git a/source/developers/platform_example_sensor.markdown b/source/developers/platform_example_sensor.markdown index 2fd29db8faa..94b84f0d374 100644 --- a/source/developers/platform_example_sensor.markdown +++ b/source/developers/platform_example_sensor.markdown @@ -38,6 +38,10 @@ def setup_platform(hass, config, add_devices, discovery_info=None): class ExampleSensor(Entity): """Representation of a Sensor.""" + def __init__(self): + """Initialize the sensor.""" + self._state = None + @property def name(self): """Return the name of the sensor.""" @@ -46,10 +50,17 @@ class ExampleSensor(Entity): @property def state(self): """Return the state of the sensor.""" - return 23 + return self._state @property def unit_of_measurement(self): """Return the unit of measurement.""" return TEMP_CELSIUS + + def update(self): + """Fetch new state data for the sensor. + + This is the only method that should fetch new data for Home Assistant. + """ + self._state = 23 ``` From ba3bfb63f8c112c66fbcf98e1804f822dc41ef42 Mon Sep 17 00:00:00 2001 From: Johann Kellerman Date: Wed, 8 Feb 2017 19:31:41 +0200 Subject: [PATCH 27/40] Update component_generic_discovery.markdown (#2000) --- .../developers/component_generic_discovery.markdown | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/source/developers/component_generic_discovery.markdown b/source/developers/component_generic_discovery.markdown index 7fc39adf8e6..cb9ab891b3e 100644 --- a/source/developers/component_generic_discovery.markdown +++ b/source/developers/component_generic_discovery.markdown @@ -10,13 +10,13 @@ footer: true --- New controller or hub components often need to add platforms in sub-components (i.e. Lights & Switches) without additional configuration. -This can be achieved using the `homeassistant.components.discovery.load_platform` method: +This can be achieved using the `load_platform` or `async_load_platform` methods from `homeassistant.helpers.discovery`: ```python -def load_platform(hass, component, platform, info=None, hass_config=None) +def load_platform(hass, component, platform, discovered=None, hass_config=None) ``` -From more info on how this works, refer to the [load_platform](https://github.com/home-assistant/home-assistant/blob/dev/homeassistant/components/discovery.py#L78) method. +From more info on how this works, refer to the [load_platform](https://github.com/home-assistant/home-assistant/blob/dev/homeassistant/helpers/discovery.py#L136) method. ### {% linkable_title Example %} @@ -40,7 +40,7 @@ The source for your component can be located in your configuration directory for In the hub component `myflashyhub.py` you can call your light and switch components. To pass any non-serializable information to the platforms in the sub-component, you can use a global variable. ```python -from homeassistant.components.discovery import load_platform +from homeassistant.helpers.discovery import load_platform DOMAIN = 'myflashyhub' MFH_GLOBAL = None @@ -77,7 +77,3 @@ The `load_platform` method allows the platforms to be loaded with the need for a #switch: # platform: myflashyhub ``` - -

-In the past, this was achieved by adding your component to the `DISCOVERY_PLATFORMS` in the target sub-component. Generic discovery through `load_platform()` allows you to load any sub-component, including custom components, without changing the sub-component. -

From 355febf56820471098683dd5a9fd84cf0e3ab81b Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 8 Feb 2017 22:02:48 +0200 Subject: [PATCH 28/40] Fix sqlite file name --- source/_components/recorder.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/recorder.markdown b/source/_components/recorder.markdown index 1026ecba718..7a23bfee0b5 100644 --- a/source/_components/recorder.markdown +++ b/source/_components/recorder.markdown @@ -16,7 +16,7 @@ The `recorder` component is storing details in a database which then are handled Home Assistant uses [SQLAlchemy](http://www.sqlalchemy.org/) as Object Relational Mapper (ORM). This means that you can now use **any** SQL backend for the recorder that is supported by SQLAlchemy, like [MySQL](https://www.mysql.com/), [MariaDB](https://mariadb.org/), or [PostgreSQL](https://www.postgresql.org/). -The default database engine is [SQLite](https://www.sqlite.org/) which doesn't require any configuration. The database is stored in your Home Assistant configuration directory (`.homeassistant`) and called `home-assistant.db`. +The default database engine is [SQLite](https://www.sqlite.org/) which doesn't require any configuration. The database is stored in your Home Assistant configuration directory (`.homeassistant`) and called `home-assistant_v2.db`. To setup the `recorder` component in your installation, add the following to your `configuration.yaml` file: From e049b830ef60b57de2c62c631121c717a7cefab2 Mon Sep 17 00:00:00 2001 From: Fredrik Lindqvist Date: Thu, 9 Feb 2017 22:22:54 +0100 Subject: [PATCH 29/40] Fix link to Mysensors API. Fix link to Mysensors API. Missing part of the url tag. --- source/_components/mysensors.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/mysensors.markdown b/source/_components/mysensors.markdown index 37a20d48079..ab5e13f3cc2 100644 --- a/source/_components/mysensors.markdown +++ b/source/_components/mysensors.markdown @@ -176,6 +176,6 @@ void receive(const MyMessage &message) { Sending a heartbeat from the MySensors device to Home Assistant activates the SmartSleep functionality in Home Assistant. This means that messages are buffered and only sent to the device upon receiving a heartbeat from the device. State changes are stored so that only the last requested state change is sent to the device. Other types of messages are queued in a FIFO queue. SmartSleep is useful for battery powered actuators that are waiting for commands. See the MySensors library API for information on how to send heartbeats and sleep device. -Visit the [library api] of MySensors for more information. +Visit the [library api][MySensors library api] of MySensors for more information. [MySensors library api]: http://www.mysensors.org/download From d7204f461f979479b17129648c30ec98f25db864 Mon Sep 17 00:00:00 2001 From: Andrey Date: Fri, 10 Feb 2017 20:13:06 +0200 Subject: [PATCH 30/40] Add set_wakeup service documentation --- source/getting-started/z-wave.markdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/getting-started/z-wave.markdown b/source/getting-started/z-wave.markdown index 3b657fd31f8..be6c4c91c54 100644 --- a/source/getting-started/z-wave.markdown +++ b/source/getting-started/z-wave.markdown @@ -236,7 +236,8 @@ The `zwave` component exposes multiple services to help maintain the network. | print_config_parameter | Prints Z-wave node's config parameter value to the log. | remove_node | Put the Z-Wave controller in exclusion mode. Allows one to remove a device from the Z-Wave network.| | rename_node | Sets a node's name. Requires an `entity_id` and `name` field. | -| set_config_parameter | Let's the user set a config parameter to a node. +| set_config_parameter | Let's the user set a config parameter to a node.| +| set_wakeup | Sets wakeup interval for battery-operated nodes. Note that in order for the interval to be actually written to the node the node must wake up.| | soft_reset | Tells the controller to do a "soft reset". This is not supposed to lose any data, but different controllers can behave differently to a "soft reset" command.| | start_network | Starts the Z-Wave network.| | stop_network | Stops the Z-Wave network.| From 9d70b2d35ba7d734b98bc82624a4fa285072175b Mon Sep 17 00:00:00 2001 From: Andrey Date: Fri, 10 Feb 2017 20:18:32 +0200 Subject: [PATCH 31/40] Revert set_wakeup change --- source/getting-started/z-wave.markdown | 1 - 1 file changed, 1 deletion(-) diff --git a/source/getting-started/z-wave.markdown b/source/getting-started/z-wave.markdown index be6c4c91c54..1e02d9d8f31 100644 --- a/source/getting-started/z-wave.markdown +++ b/source/getting-started/z-wave.markdown @@ -237,7 +237,6 @@ The `zwave` component exposes multiple services to help maintain the network. | remove_node | Put the Z-Wave controller in exclusion mode. Allows one to remove a device from the Z-Wave network.| | rename_node | Sets a node's name. Requires an `entity_id` and `name` field. | | set_config_parameter | Let's the user set a config parameter to a node.| -| set_wakeup | Sets wakeup interval for battery-operated nodes. Note that in order for the interval to be actually written to the node the node must wake up.| | soft_reset | Tells the controller to do a "soft reset". This is not supposed to lose any data, but different controllers can behave differently to a "soft reset" command.| | start_network | Starts the Z-Wave network.| | stop_network | Stops the Z-Wave network.| From eaa1d9ecb1782c395e738ef320593fa969024e8f Mon Sep 17 00:00:00 2001 From: Robbie Trencheny Date: Fri, 10 Feb 2017 17:01:49 -0800 Subject: [PATCH 32/40] Add Apple TV to the featured section --- source/_components/media_player.apple_tv.markdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/_components/media_player.apple_tv.markdown b/source/_components/media_player.apple_tv.markdown index 4a63c08b933..e9707203e10 100644 --- a/source/_components/media_player.apple_tv.markdown +++ b/source/_components/media_player.apple_tv.markdown @@ -11,12 +11,13 @@ logo: apple.png ha_category: Media Player ha_iot_class: "Local Polling" ha_release: 0.38 +featured: true --- The `apple_tv` platform allows you to control an Apple TV (3rd and 4th generation).

-Currently you must have Home Sharing enabled for this to work. Support for pairing Home Assistant with your device will be supported in a later released. +Currently you must have Home Sharing enabled for this to work. Support for pairing Home Assistant with your device will be supported in a later release.

If you want to automatically discover new devices, just make sure you have `discovery:` in your `configuration.yaml` file. To manually add an Apple TV to your installation, add the following to your `configuration.yaml` file: From 5a4cac7ade8d071b3c208498c42ee97afbc0b363 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 10 Feb 2017 20:40:42 -0800 Subject: [PATCH 33/40] Unfeature neato --- source/_components/neato.markdown | 1 - 1 file changed, 1 deletion(-) diff --git a/source/_components/neato.markdown b/source/_components/neato.markdown index 24fc98b3c60..6e0849e6f01 100644 --- a/source/_components/neato.markdown +++ b/source/_components/neato.markdown @@ -10,7 +10,6 @@ footer: true logo: neato.png ha_category: Hub ha_release: 0.33 -featured: true --- The `neato` component allows you to control your [Neato Botvac Connected](https://www.neatorobotics.com/robot-vacuum/botvac-connected-series/botvac-connected/). From f6cd2717f7dc898e7e147be530b43300c66171a2 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 10 Feb 2017 20:41:51 -0800 Subject: [PATCH 34/40] Bump version --- _config.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/_config.yml b/_config.yml index 02db5419bab..d91423a1787 100644 --- a/_config.yml +++ b/_config.yml @@ -131,10 +131,10 @@ social: # Home Assistant release details current_major_version: 0 -current_minor_version: 37 -current_patch_version: 1 -date_released: 2017-02-02 +current_minor_version: 38 +current_patch_version: 0 +date_released: 2017-02-11 # Either # or the anchor link to latest release notes in the blog post. # Must be prefixed with a # and have double quotes around it. -patch_version_notes: "#release-0371---february-2" +patch_version_notes: "#" From 1601df1129952ce2676d9ea91a45c92439ee1688 Mon Sep 17 00:00:00 2001 From: Johan Bloemberg Date: Sat, 11 Feb 2017 15:40:30 +0100 Subject: [PATCH 35/40] Add Rflink component documentation. (#1715) * Add Rflink component documentation. * Add sensor docs. * Add lights and switch documentation. * Add logo. * Update to latest changes. * Use relative hyperlinks for internal links. * Fix links, some text changes. --- source/_components/light.rflink.markdown | 104 ++++++++++++++++++++++ source/_components/rflink.markdown | 91 +++++++++++++++++++ source/_components/sensor.rflink.markdown | 69 ++++++++++++++ source/_components/switch.rflink.markdown | 81 +++++++++++++++++ source/images/supported_brands/rflink.png | Bin 0 -> 3920 bytes 5 files changed, 345 insertions(+) create mode 100644 source/_components/light.rflink.markdown create mode 100644 source/_components/rflink.markdown create mode 100644 source/_components/sensor.rflink.markdown create mode 100644 source/_components/switch.rflink.markdown create mode 100644 source/images/supported_brands/rflink.png diff --git a/source/_components/light.rflink.markdown b/source/_components/light.rflink.markdown new file mode 100644 index 00000000000..37381ba395e --- /dev/null +++ b/source/_components/light.rflink.markdown @@ -0,0 +1,104 @@ +--- +layout: page +title: "Rflink Light" +description: "Instructions how to integrate Rflink lights into Home Assistant." +date: 2016-01-04 +sidebar: true +comments: false +sharing: true +footer: true +logo: rflink.png +ha_category: Light +ha_release: 0.38 +--- + +The `rflink` component support devices that use [Rflink gateway firmware](http://www.nemcon.nl/blog2/), for example the [Nodo Rflink Gateway](https://www.nodo-shop.nl/nl/21-rflink-gateway). Rflink gateway is an Arduino firmware that allows communication with 433Mhz devices using cheap hardware (Arduino + 433Mhz tranceiver). + +First you have to set up your [rflink hub](/components/rflink/). + +After configuring the Rflink hub lights will be automatically discovered and added. + +New/unknown lights can be assigned to a default group automatically by specifying the `new_devices_group` option with a group name. If the group doesn't exist it will be created. + +For example: + +```yaml +# Example configuration.yaml entry +sensor: + platform: rflink + new_devices_group: "New Rflink Lights" +``` + +Rflink switch/light ID's are composed of: protocol, id, switch. For example: `newkaku_0000c6c2_1`. + +Once the ID of a light is known it can be used to configure the light in HA, for example to add it to a different group, hide it or configure a nice name. + +Configuring a device as light with a nice name: + +```yaml +# Example configuration.yaml entry +light: + platform: rflink + devices: + newkaku_0000c6c2_1: + name: Living room +``` + +Configuration variables: + +- **devices** (*Optional*): A list of devices with their name to use in the frontend. +- **new_devices_group** (*Optional*): Create group to add new/unknown devices to. +- **device_defaults**: (*Optional*) + - **fire_event_** (*Optional*): Set default `fire_event` for Rflink switch devices (see below). + - **signal_repetitions** (*Optional*): Set default `signal_repetitions` for Rflink switch devices (see below). + +Device configuration variables: + +- **name** (*Optional*): Name for the device, defaults to Rflink ID. +- **type** (*Optional*): Override automatically detected type of the light device, can be: switchable, dimmable or hybrid. See 'Light Types' below. +- **aliasses** (*Optional*): Alternative Rflink ID's this device is known by. +- **fire_event_** (*Optional*): Fire an `button_pressed` event if this device is turned on or off (default: False). +- **signal_repetitions** (*Optional*): Repeat every Rflink command this number of times (default: 1) + +# Light state + +Initially the state of a light is unknown. When the light is turned on or off (via frontend or 433Mhz remote) the state is known and will be shown in the frontend. + +Sometimes a light is controlled by multiple 433Mhz remotes, each remote has its own code programmed in the light. To allow tracking of the state when switched via other remotes add the corresponding remote codes as aliasses: + +```yaml +# Example configuration.yaml entry +light: + platform: rflink + devices: + newkaku_0000c6c2_1: + name: Living room + aliasses: + - newkaku_000000001_2 + - kaku_000001_a +``` + +Any on/off command from any allias ID updates the current state of the light. However when sending a command through the frontend only the primary ID is used. + +# Light types + +Light devices can come in different forms. Some only switch on and off, other support dimming. Dimmable devices might not always respond nicely to repeated `on` command as they turn into a pulsating state until `on` is pressed again (for example KlikAanKlikUit). The Rflink component support three types of lights to make things work in every situation: + +*Hybrid*: This type sends a `dim` followed by an a `on` command; and `off` commands. This will make dimmable devices turn on at the requested dim level and on/off devices on. One caveat is this type is not compatible with signal repetition as multiple `on` signals will cause dimmers to go into disco mode. + +*Switchable*: Device type that sends only `on` and `off` commands. It work for both on/off and dimmable type switches. However dimmables might have issues with signal repetition (see above). + +*Dimmable*: Sends only `dim` and `off` commands. This does not work on on/off type devices as they don't understand the `dim` command. For dimmers this does not cause issues with signal repetitions. + +By default new lights are assigned the `switchable` type. Protocol supporting dimming are assigned the `hybrid` type. Currently only `newkaku` protocol is detected as dimmable. Please refer to Device Support to get your dimmers supported. + +# Hiding/ignoring lights +Lights are added automatically when the Rflink gateway intercepts a 433Mhz command in the ether. To prevent cluttering the frontend use any of these methods: + +- Configure a `new_devices_group` for lights and optionally add it to a different `view`. +- Hide unwanted devices using [customizations](/getting-started/customizing-devices/) +- [Ignore devices on a platform level](/components/rflink/#ignoring-devices) + +# Device support +See [device support](/components/rflink/#device-support) + diff --git a/source/_components/rflink.markdown b/source/_components/rflink.markdown new file mode 100644 index 00000000000..b2d931d5e62 --- /dev/null +++ b/source/_components/rflink.markdown @@ -0,0 +1,91 @@ +--- +layout: page +title: "Rflink" +description: "Instructions how to integrate Rflink gateway into Home Assistant." +date: 2016-01-04 +sidebar: true +comments: false +sharing: true +footer: true +logo: rflink.png +ha_category: Hub +ha_release: 0.38 +--- + +The `rflink` component support devices that use [Rflink gateway firmware](http://www.nemcon.nl/blog2/), for example the [Nodo Rflink Gateway](https://www.nodo-shop.nl/nl/21-rflink-gateway). Rflink gateway is an Arduino firmware that allows communication with 433Mhz devices using cheap hardware (Arduino + 433Mhz tranceiver). + +The 433Mhz spectrum is used by many manufacturers mostly using their own protocol/standard and includes devices like: light switches, blinds, weather stations, alarms and various other sensors. + +A complete list of devices supported by Rflink can be found [here](http://www.nemcon.nl/blog2/devlist) + +This component is tested with the following hardware/software: + +- Nodo Rflink Gateway V1.4/Rflink R44 + +To enable Rflink in your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +rflink: + port: /dev/serial/by-id/usb-id01234 +``` + +Configuration variables: + +- **port** (*Required*): The path to Rflink usb/serial device or TCP port in TCP mode. +- **host** (*Optional*): Switches to TCP mode, connects to host instead of to usb/serial. +- **wait_for_ack** (*Optional*): Wait for Rflink to ackowledge commands sent before sending new command (slower but more reliable). Default: True +- **ignore_devices** (*Optional*): List of devices id's to ignore. Supports wildcards (*) at the end. +- **reconnect_interval** (*Optional*): Time in seconds between reconnect attempts. + +Complete example: + +```yaml +# Example configuration.yaml entry +rflink: + port: /dev/serial/by-id/usb-id01234 + wait_for_ack: False + ignore_devices: + - newkaku_000001_01 + - digitech_* +``` + +# TCP mode + +TCP mode allows connect to a Rflink device over TCP/IP network. This is for example useful if placing the Rflink device next to the HA server is not optimal or desired (eg: bad reception). + +To expose the usb/serial interface over TCP on a different host (Linux) the following command can be used: + + socat /dev/ttyACM0,b57600 TCP-LISTEN:1234,reuseaddr + +Other methods of exposing the serial interface over TCP are possible (eg: ESP8266 or using Arduino Wifi shield). Basically the serial stream should be directly mapped to the TCP stream. + +```yaml +# Example configuration.yaml entry +rflink: + host: 192.168.0.10 + port: 1234 +``` +# Ignoring devices +Rflink platform can be configured to completely ignore a device on a platform level. This is useful when you have neighbors which also use 433Mhz technology. + +For example: + +```yaml +# Example configuration.yaml entry +rflink: + port: /dev/serial/by-id/usb-id01234 + wait_for_ack: False + ignore_devices: + - newkaku_000001_01 + - digitech_* + - kaku_1_* +``` + +This configuration will ignore the button `1` of the `newkaku` device with ID `000001`, all devices of the `digitech` protocol and all switches of the `kaku` protocol device with codewheel ID `1`. + +Wildcards only work at the end of the ID, not in the middle of front! + +# Device support +Even though a lot of devices are supported by Rflink, not all have been tested/implemented. If you have a device supported by Rflink but not by this component please consider testing and adding support yourself or [create an issue](https://github.com/home-assistant/home-assistant/issues/new) and mention `@aequitas` in the description. + diff --git a/source/_components/sensor.rflink.markdown b/source/_components/sensor.rflink.markdown new file mode 100644 index 00000000000..11c26f26527 --- /dev/null +++ b/source/_components/sensor.rflink.markdown @@ -0,0 +1,69 @@ +--- +layout: page +title: "Rflink Sensor" +description: "Instructions how to integrate Rflink sensors into Home Assistant." +date: 2016-01-04 +sidebar: true +comments: false +sharing: true +footer: true +logo: rflink.png +ha_category: Sensor +ha_release: 0.38 +--- + +The `rflink` component support devices that use [Rflink gateway firmware](http://www.nemcon.nl/blog2/), for example the [Nodo Rflink Gateway](https://www.nodo-shop.nl/nl/21-rflink-gateway). Rflink gateway is an Arduino firmware that allows communication with 433Mhz devices using cheap hardware (Arduino + 433Mhz tranceiver). + +First you have to set up your [rflink hub](/components/rflink/). + +After configuring the Rflink hub sensors will be automatically discovered and added. + +New/unknown sensors can be assigned to a default group automatically by specifying the `new_devices_group` option with a group name. If the group doesn't exist it will be created. + +For example: + +```yaml +# Example configuration.yaml entry +sensor: + platform: rflink + new_devices_group: "New Rflink Sensors" +``` + +Rflink sensor ID's are composed of: protocol, id and type (optional). For example: `alectov1_0334_temp`. Some sensors emit multiple types of data. Each will be created as its own + +Once the ID of a sensor is known it can be used to configure the sensor in HA, for example to add it to a different group, hide it or configure a nice name. + +Assigning name to a sensor: + +```yaml +# Example configuration.yaml entry +sensor: + platform: rflink + devices: + # assign name to a sensor + alectov1_0334_temp: + name: Temperature Outside +``` + +Configuration variables: + +- **devices** (*Optional*): A list of devices with their name to use in the frontend. +- **new_devices_group** (*Optional*): Create group to add new/unknown devices to. + +Device configuration variables: + +- **name** (*Optional*): Name for the device, defaults to Rflink ID. +- **sensor_type_** (*Optional*): Override automatically detected type of sensor. +- **unit_of_measurement** (*Optional*): Override automatically detected unit of sensor. +- **aliasses** (*Optional*): Alternative Rflink ID's this device is known by. + +# Hiding/ignoring sensors +Sensors are added automatically when the Rflink gateway intercepts a 433Mhz command in the ether. To prevent cluttering the frontend use any of these methods: + +- Configure a `new_devices_group` for sensors and optionally add it to a different `view`. +- Hide unwanted devices using [customizations](/getting-started/customizing-devices/) +- [Ignore devices on a platform level](/components/rflink/#ignoring-devices) + +# Device support +See [device support](/components/rflink/#device-support) + diff --git a/source/_components/switch.rflink.markdown b/source/_components/switch.rflink.markdown new file mode 100644 index 00000000000..bae099388d9 --- /dev/null +++ b/source/_components/switch.rflink.markdown @@ -0,0 +1,81 @@ +--- +layout: page +title: "Rflink Switch" +description: "Instructions how to integrate Rflink switches into Home Assistant." +date: 2016-01-04 +sidebar: true +comments: false +sharing: true +footer: true +logo: rflink.png +ha_category: Switch +ha_release: 0.38 +--- + +The `rflink` component support devices that use [Rflink gateway firmware](http://www.nemcon.nl/blog2/), for example the [Nodo Rflink Gateway](https://www.nodo-shop.nl/nl/21-rflink-gateway). Rflink gateway is an Arduino firmware that allows communication with 433Mhz devices using cheap hardware (Arduino + 433Mhz tranceiver). + +First you have to set up your [rflink hub](/components/rflink/). + +The Rflink component does not know the difference between a `switch` and a `light`. Therefore all switchable devices are automatically added as `light` by default. + +Rflink switch/light ID's are composed of: protocol, id, switch. For example: `newkaku_0000c6c2_1`. + +Once the ID of a switch is known it can be used to configure it as a switch type in HA, for example to add it to a different group, hide it or configure a nice name. + +Configuring a device as switch with a nice name: + +```yaml +# Example configuration.yaml entry +switch: + platform: rflink + device_defaults: + fire_event: true + signal_repetitions: 2 + devices: + newkaku_0000c6c2_1: + name: Ceiling fan + icon: mdi:fan + conrad_00785c_0a: + name: Motion sensor kitchen + icon: mdi:run + +``` + +Configuration variables: + +- **devices** (*Optional*): A list of devices with their name to use in the frontend. +- **device_defaults**: (*Optional*) + - **fire_event_** (*Optional*): Set default `fire_event` for Rflink switch devices (see below). + - **signal_repetitions** (*Optional*): Set default `signal_repetitions` for Rflink switch devices (see below). + +Device configuration variables: + +- **name** (*Optional*): Name for the device, defaults to Rflink ID. +- **aliasses** (*Optional*): Alternative Rflink ID's this device is known by. +- **fire_event_** (*Optional*): Fire an `button_pressed` event if this device is turned on or off (default: False). +- **signal_repetitions** (*Optional*): Repeat every Rflink command this number of times (default: 1) + +# Switch state + +Initially the state of a switch is unknown. When the switch is turned on or off (via frontend or 433Mhz remote) the state is known and will be shown in the frontend. + +Sometimes a switch is controlled by multiple 433Mhz remotes, each remote has its own code programmed in the switch. To allow tracking of the state when switched via other remotes add the corresponding remote codes as aliasses: + +```yaml +# Example configuration.yaml entry +switch: + platform: rflink + devices: + newkaku_0000c6c2_1: + name: Ceiling fan + icon: mdi:fan + aliasses: + - newkaku_000000001_2 + - kaku_000001_a +``` + +Any on/off command from any alias ID updates the current state of the switch. However when sending a command through the frontend only the primary ID is used. + +# Device support +See [device support](/components/rflink/#device-support) + diff --git a/source/images/supported_brands/rflink.png b/source/images/supported_brands/rflink.png new file mode 100644 index 0000000000000000000000000000000000000000..e044a89afdb89e873a4fabad2c4f56eb4ae477c3 GIT binary patch literal 3920 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 literal 0 HcmV?d00001 From ecfc9a4718267dfcec8b596b46ad40419547011b Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 11 Feb 2017 15:37:15 +0100 Subject: [PATCH 36/40] Update for 0.38 --- source/_components/ha.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_components/ha.markdown b/source/_components/ha.markdown index 9c319931421..5773362c209 100644 --- a/source/_components/ha.markdown +++ b/source/_components/ha.markdown @@ -1,6 +1,6 @@ --- layout: page -title: "Home Assistant 0.37" +title: "Home Assistant 0.38" description: "" date: 2016-12-16 17:00 sidebar: true @@ -9,7 +9,7 @@ sharing: true footer: true logo: home-assistant.png ha_category: Other -ha_release: 0.37 +ha_release: 0.38 --- Details about the latest release can always be found at: From 8111f0f4f708759e7836998d47b0ee1fb0ed1947 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 11 Feb 2017 15:58:20 +0100 Subject: [PATCH 37/40] Minor changes and fixes --- source/_components/light.rflink.markdown | 18 +++++++++--------- source/_components/rflink.markdown | 23 ++++++++++++++--------- source/_components/sensor.rflink.markdown | 6 ++++-- source/_components/switch.rflink.markdown | 5 +++-- 4 files changed, 30 insertions(+), 22 deletions(-) diff --git a/source/_components/light.rflink.markdown b/source/_components/light.rflink.markdown index 37381ba395e..babb149f5a6 100644 --- a/source/_components/light.rflink.markdown +++ b/source/_components/light.rflink.markdown @@ -60,7 +60,7 @@ Device configuration variables: - **fire_event_** (*Optional*): Fire an `button_pressed` event if this device is turned on or off (default: False). - **signal_repetitions** (*Optional*): Repeat every Rflink command this number of times (default: 1) -# Light state +### {% linkable_title Light state %} Initially the state of a light is unknown. When the light is turned on or off (via frontend or 433Mhz remote) the state is known and will be shown in the frontend. @@ -80,25 +80,25 @@ light: Any on/off command from any allias ID updates the current state of the light. However when sending a command through the frontend only the primary ID is used. -# Light types +### {% linkable_title Light types %} Light devices can come in different forms. Some only switch on and off, other support dimming. Dimmable devices might not always respond nicely to repeated `on` command as they turn into a pulsating state until `on` is pressed again (for example KlikAanKlikUit). The Rflink component support three types of lights to make things work in every situation: -*Hybrid*: This type sends a `dim` followed by an a `on` command; and `off` commands. This will make dimmable devices turn on at the requested dim level and on/off devices on. One caveat is this type is not compatible with signal repetition as multiple `on` signals will cause dimmers to go into disco mode. - -*Switchable*: Device type that sends only `on` and `off` commands. It work for both on/off and dimmable type switches. However dimmables might have issues with signal repetition (see above). - -*Dimmable*: Sends only `dim` and `off` commands. This does not work on on/off type devices as they don't understand the `dim` command. For dimmers this does not cause issues with signal repetitions. +- *Hybrid*: This type sends a `dim` followed by an a `on` command; and `off` commands. This will make dimmable devices turn on at the requested dim level and on/off devices on. One caveat is this type is not compatible with signal repetition as multiple `on` signals will cause dimmers to go into disco mode. +- *Switchable*: Device type that sends only `on` and `off` commands. It work for both on/off and dimmable type switches. However dimmables might have issues with signal repetition (see above). +- *Dimmable*: Sends only `dim` and `off` commands. This does not work on on/off type devices as they don't understand the `dim` command. For dimmers this does not cause issues with signal repetitions. By default new lights are assigned the `switchable` type. Protocol supporting dimming are assigned the `hybrid` type. Currently only `newkaku` protocol is detected as dimmable. Please refer to Device Support to get your dimmers supported. -# Hiding/ignoring lights +### {% linkable_title Hiding/ignoring lights %} + Lights are added automatically when the Rflink gateway intercepts a 433Mhz command in the ether. To prevent cluttering the frontend use any of these methods: - Configure a `new_devices_group` for lights and optionally add it to a different `view`. - Hide unwanted devices using [customizations](/getting-started/customizing-devices/) - [Ignore devices on a platform level](/components/rflink/#ignoring-devices) -# Device support +### {% linkable_title Device support %} + See [device support](/components/rflink/#device-support) diff --git a/source/_components/rflink.markdown b/source/_components/rflink.markdown index b2d931d5e62..91462a0f026 100644 --- a/source/_components/rflink.markdown +++ b/source/_components/rflink.markdown @@ -12,9 +12,9 @@ ha_category: Hub ha_release: 0.38 --- -The `rflink` component support devices that use [Rflink gateway firmware](http://www.nemcon.nl/blog2/), for example the [Nodo Rflink Gateway](https://www.nodo-shop.nl/nl/21-rflink-gateway). Rflink gateway is an Arduino firmware that allows communication with 433Mhz devices using cheap hardware (Arduino + 433Mhz tranceiver). +The `rflink` component support devices that use [Rflink gateway firmware](http://www.nemcon.nl/blog2/), for example the [Nodo Rflink Gateway](https://www.nodo-shop.nl/nl/21-rflink-gateway). Rflink gateway is an Arduino firmware that allows communication with 433 Mhz devices using cheap hardware (Arduino + 433 Mhz tranceiver). -The 433Mhz spectrum is used by many manufacturers mostly using their own protocol/standard and includes devices like: light switches, blinds, weather stations, alarms and various other sensors. +The 433 Mhz spectrum is used by many manufacturers mostly using their own protocol/standard and includes devices like: light switches, blinds, weather stations, alarms and various other sensors. A complete list of devices supported by Rflink can be found [here](http://www.nemcon.nl/blog2/devlist) @@ -33,8 +33,8 @@ rflink: Configuration variables: - **port** (*Required*): The path to Rflink usb/serial device or TCP port in TCP mode. -- **host** (*Optional*): Switches to TCP mode, connects to host instead of to usb/serial. -- **wait_for_ack** (*Optional*): Wait for Rflink to ackowledge commands sent before sending new command (slower but more reliable). Default: True +- **host** (*Optional*): Switches to TCP mode, connects to host instead of to USB/serial. +- **wait_for_ack** (*Optional*): Wait for Rflink to ackowledge commands sent before sending new command (slower but more reliable). Defaults to `True` - **ignore_devices** (*Optional*): List of devices id's to ignore. Supports wildcards (*) at the end. - **reconnect_interval** (*Optional*): Time in seconds between reconnect attempts. @@ -50,13 +50,15 @@ rflink: - digitech_* ``` -# TCP mode +### {% linkable_title TCP mode %} TCP mode allows connect to a Rflink device over TCP/IP network. This is for example useful if placing the Rflink device next to the HA server is not optimal or desired (eg: bad reception). To expose the usb/serial interface over TCP on a different host (Linux) the following command can be used: - socat /dev/ttyACM0,b57600 TCP-LISTEN:1234,reuseaddr +```bash +$ socat /dev/ttyACM0,b57600 TCP-LISTEN:1234,reuseaddr +``` Other methods of exposing the serial interface over TCP are possible (eg: ESP8266 or using Arduino Wifi shield). Basically the serial stream should be directly mapped to the TCP stream. @@ -66,8 +68,10 @@ rflink: host: 192.168.0.10 port: 1234 ``` -# Ignoring devices -Rflink platform can be configured to completely ignore a device on a platform level. This is useful when you have neighbors which also use 433Mhz technology. + +### {% linkable_title Ignoring devices %} + +Rflink platform can be configured to completely ignore a device on a platform level. This is useful when you have neighbors which also use 433 Mhz technology. For example: @@ -86,6 +90,7 @@ This configuration will ignore the button `1` of the `newkaku` device with ID `0 Wildcards only work at the end of the ID, not in the middle of front! -# Device support +### {% linkable_title Device support %} + Even though a lot of devices are supported by Rflink, not all have been tested/implemented. If you have a device supported by Rflink but not by this component please consider testing and adding support yourself or [create an issue](https://github.com/home-assistant/home-assistant/issues/new) and mention `@aequitas` in the description. diff --git a/source/_components/sensor.rflink.markdown b/source/_components/sensor.rflink.markdown index 11c26f26527..9a07fc001d3 100644 --- a/source/_components/sensor.rflink.markdown +++ b/source/_components/sensor.rflink.markdown @@ -57,13 +57,15 @@ Device configuration variables: - **unit_of_measurement** (*Optional*): Override automatically detected unit of sensor. - **aliasses** (*Optional*): Alternative Rflink ID's this device is known by. -# Hiding/ignoring sensors +### {% linkable_title Hiding/ignoring sensors %} + Sensors are added automatically when the Rflink gateway intercepts a 433Mhz command in the ether. To prevent cluttering the frontend use any of these methods: - Configure a `new_devices_group` for sensors and optionally add it to a different `view`. - Hide unwanted devices using [customizations](/getting-started/customizing-devices/) - [Ignore devices on a platform level](/components/rflink/#ignoring-devices) -# Device support +### {% linkable_title Device support %} + See [device support](/components/rflink/#device-support) diff --git a/source/_components/switch.rflink.markdown b/source/_components/switch.rflink.markdown index bae099388d9..9fb8ecb9cd0 100644 --- a/source/_components/switch.rflink.markdown +++ b/source/_components/switch.rflink.markdown @@ -55,7 +55,7 @@ Device configuration variables: - **fire_event_** (*Optional*): Fire an `button_pressed` event if this device is turned on or off (default: False). - **signal_repetitions** (*Optional*): Repeat every Rflink command this number of times (default: 1) -# Switch state +### {% linkable_title Switch state %} Initially the state of a switch is unknown. When the switch is turned on or off (via frontend or 433Mhz remote) the state is known and will be shown in the frontend. @@ -76,6 +76,7 @@ switch: Any on/off command from any alias ID updates the current state of the switch. However when sending a command through the frontend only the primary ID is used. -# Device support +### {% linkable_title Device support %} + See [device support](/components/rflink/#device-support) From 0ebf6f85b5dda4f9b57632a34c2ac47bfc2deafc Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 11 Feb 2017 16:44:05 +0100 Subject: [PATCH 38/40] Add details --- source/_components/rflink.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_components/rflink.markdown b/source/_components/rflink.markdown index 91462a0f026..43fe9c4b609 100644 --- a/source/_components/rflink.markdown +++ b/source/_components/rflink.markdown @@ -94,3 +94,11 @@ Wildcards only work at the end of the ID, not in the middle of front! Even though a lot of devices are supported by Rflink, not all have been tested/implemented. If you have a device supported by Rflink but not by this component please consider testing and adding support yourself or [create an issue](https://github.com/home-assistant/home-assistant/issues/new) and mention `@aequitas` in the description. + +### {% linkable_title Technical overview %} + +- The`rflink` Python module a asyncio transport/protocol is setup that fires an callback for every (valid/supported) packet received by the Rflink gateway. +- This component uses this callback to distribute 'rflink packet events' over the HASS bus which can be subscribed to by entities/platform implementations. +- The platform implementions take care of creating new devices (if enabled) for unsees incoming packet id's. +- Device entities take care of matching to the packet ID, interpreting and performing actions based on the packet contents. Common entitiy logic is maintained in this main component. + From a6b619924cb8d5f4659e395b8e8682b63af60485 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 11 Feb 2017 16:50:35 +0100 Subject: [PATCH 39/40] Add social image for 0.38 --- source/images/blog/2017-02-0.38/social.png | Bin 0 -> 113811 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 source/images/blog/2017-02-0.38/social.png diff --git a/source/images/blog/2017-02-0.38/social.png b/source/images/blog/2017-02-0.38/social.png new file mode 100644 index 0000000000000000000000000000000000000000..b0446f46f9297cff36560370b7b6de082646ced6 GIT binary patch literal 113811 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 znt�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
azHV`^ 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 Xf(i+V6)$Tr;4f80ltQ_j>68Bj+Rjdq literal 0 HcmV?d00001 From 1dbd7c45b4bb5ce735a930825ba87c78fea9faad Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 11 Feb 2017 17:46:57 +0100 Subject: [PATCH 40/40] Add blog post for 0.38 --- ...02-11-alert-appletv-mqtt-yeelight.markdown | 189 ++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 source/_posts/2017-02-11-alert-appletv-mqtt-yeelight.markdown diff --git a/source/_posts/2017-02-11-alert-appletv-mqtt-yeelight.markdown b/source/_posts/2017-02-11-alert-appletv-mqtt-yeelight.markdown new file mode 100644 index 00000000000..a19eeecd56f --- /dev/null +++ b/source/_posts/2017-02-11-alert-appletv-mqtt-yeelight.markdown @@ -0,0 +1,189 @@ +--- +layout: post +title: "0.38: Alert, AppleTV, MQTT discovery, and Yeelight" +description: "Faster and more configurable frontend, " +date: 2017-02-11 08:04:05 +0000 +date_formatted: "February 11, 2017" +author: Fabian Affolter et al. +author_twitter: fabaff +comments: true +categories: Release-Notes +og_image: /images/blog/2017-02-0.38/social.png +--- + +0.38, hurry :tada: In this release we (special thanks to [@pvizeli]) have migrated all core components to work asynchronous. + +The configuration checking support was expanded. We have now `homeassistant.check_config`. This means that the service `homeassistant.restart` will now only restart your Home Assistant installation if the configuration is valid. + +### {% linkable_title Rewritten frontend core %} +The core of the frontend has been completely been rewritten, optimizing for speed and lost connection recovery. Even on the slowest phones it should fly now. + +### {% linkable_title Custom state-card UI %} +A nice new feature is the possibility to create [custom state-card][custom-ui] in the frondend. Go ahead and write your own state-card for [lights][light], sensors, locks, etc. + +### {% linkable_title MQTT discovery %} +The latest MQTT feature is [discovery][mqtt-discovery] support. Do not confuse this which the Home Assistant [Discovery][discovery]. MQTT Discover is for MQTT-only. Similar to the HTTP sensor/binary sensor allows this to use devices with minimal configuration. + +### {% linkable_title Alert component %} +If you left your front door open, then the [`alert`][alert] component can be used to remind you of this by sending you repeating notifications at a given interval. + +### {% linkable_title Yeelight %} +The [`yeelight`][yeelight] component has been ported to use a more stable and feature-complete [python-yeelight][python-yeelight] backend, and supports now both white and RGB bulbs. The component also supports transitions and can be configured to save the settings to the bulb on changes. The users currently using custom components for Yeelight are encouraged to move back to use the included version and report any problems with it to our [issue tracker][issue]. + +### {% linkable_title All changes %} +#### {% linkable_title New platforms/components %} + +- Sensor: Support for monitoring [OpenEVSE][openevse] chargers ([@miniconfig]) +- Voice command [API.AI][apiai] ([@adrianlzt]) +- [Alert][alert] Component ([@rmkraus]) +- [Rflink][rflink] 433Mhz gateway platform and components ([@aequitas]) +- Lock: Support for [Nuki.io][nuki] smart locks ([@pschmitt]) +- Sensor: [QNAP][qnap] Sensor ([@colinodell]) +- Switch: Add support for [FRITZ!DECT][fritz] wireless switches based on fritzhome ([@BastianPoe]) +- Sensor: Add [moon][moon] sensor ([@fabaff]) +- Media player: Support for the [Orange Livebox Play TV][orange] appliance ([@pschmitt]) +- Media player: Initial support for [Apple TV][apple] ([@postlund]) +- MQTT: [MQTT discovery][mqtt-discovery] support ([@balloob], [@fabaff]) +- Notify: [Mailgun][mailgun] notify service ([@pschmitt]) + +#### {% linkable_title Improvements %} + +- Switch - Pilight: Validation no longer rejects alphanumeric IDs ([@DavidLP]) +- Device tracker - ASUSWrt: Fixes `ip neigh` regex to handle the possible IPv6 "router" flag ([@kylehendricks]) +- Light - MySensors: Fix mysensors RGB and W light turn on ([@MartinHjelmare]) +- Light - Yeelight: new yeelight backend lib, new features ([@rytilahti]) +- Climate - Eq3btsmart: Cleanup modes & available, bump version requirement ([@rytilahti]) +- Sensor - SMA: Handle units correctly ([@kellerza]) +- MQTT eventstream: Prevent infinite loop in cross configured MQTT event streams ([@aequitas]) +- Light - [Hue][hue]: Fix lightgroups not syncing state ([@tboyce1]) +- Dvice tracker - Owntracks: Fix OwnTracks state names ([@tboyce1]) +- Wink: Wink AC and additional sensor support ([@w1ll1am23]) +- Modbus: Modbus write_register accept list ([@benvm]) +- Device tracker - Ping: Add devices detected by ping as SOURCE_TYPE_ROUTER instead of GPS ([@michaelarnauts]) +- Climate - Ecobee: Cleanup climate and ecobee ([@Duoxilian]) +- Sensor - Miflora: Allow specification of bluetooth adapter ([@Danielhiversen]) +- Sensor - [Systemmonitor][systemmonitor]: Add average load to systemmonitor ([@eagleamon]) +- Sensor - [Openweathermap][owm]: Add wind bearing ([@fabaff]) +- Notify - Facebook: Allow to use data for enhanced messages ([@adrianlzt]) +- Light - Hyperion: Change CONF_DEFAULT_COLOR CV type ([@Joeboyc2]) +- Mysensors: Fix validation of serial port on windows ([@MartinHjelmare]) +- Notify - Webostv: Store the key file in the configuration directory ([@pschmitt]) +- TTS: TTS ID3 support ([@robbiet480]) +- Switch - Broadlink: Add send packet service ([@Yannic-HAW]) +- Wink: Add support for position on Wink cover ([@albertoarias]) +- Light - Flux: Make brightness display work for RGB devices. ([@aequitas]) +- Media player - Roku: Fix attribute error for media_player/roku ([@tchellomello]) +- Light - MQTT template: Fix brightness slider for MQTT template lights ([@ray0711]) +- Template: Add `min` and `max` Jinja2 [filters][filters] ([@sbidoul]) +- Device tracker - Skyhub: Improve Sky Hub error handling ([@alexmogavero]) +- Notify - SMTP: Add error checking to the MIMEImage encoding ([@stratosmacker]) +- Light - MQTT: Check for command topics when determining the capabilities of an MQTT light ([@herm]) +- Core: Check config before restarting ([@andrey-git]) +- Light - [Hue][hue]: Fix groups with same names ([@tboyce1]) +- Template: Add icon_template to template sensor ([@tboyce1]) +- Recorder: Refactoring, scoping, and better handling of SQLAlchemy Sessions ([@kellerza]) +- Light - Flux: Add support for fluxled discovery. ([@aequitas]) +- Media player - AppleTV: Add discovery support to Apple TV ([@postlund]) +- Sensor - Template: Improve warning message in template rendering ([@Danielhiversen]) +- Light - Demo: Add available property and typing hints ([@rytilahti]) +- Sensor - ARWN: Enhancements to [ARWN][arwn] platform ([@sdague]) +- Fan - ISY994: Change medium state for filtering ([@Teagan42]) +- Climate - Ecobee: Support away_mode as permanent hold and hold_mode as temporary hold. ([@Duoxilian]) +- Tellduslive: Don't throw exception if connection to server is lost ([@molobrakos]) +- Zoneminder: Refactoring and JSON decode error handling ([@pschmitt]) +- Image processing: Cleanup Base face class add support for microsoft face detect ([@pvizeli]) + +Bugfix(es): [@balloob], [@fabaff], [@pvizeli], [@mnoorenberghe] [@Danielhiversen], [@armills], [@tchellomello], [@aequitas], [@mathewpeterson], [@molobrakos], [@michaelarnauts], [@jabesq], [@turbokongen], [@JshWright], [@andriej], [@jawilson], [@andrey-git], [@nodinosaur], [@konikvranik], and you if you are missing here. + +### {% linkable_title Breaking changes %} +- The support for [LG webOS Smart TVs][webostv] was improved. This requires you to move `$HOME/.pylgtv` to `$HASS_CONFIG_DIR/webostv.conf` or Home Assistant will need to be paired with the TV again. +- Image processing events have been renamed: `identify_face` has become `image_processing.detect_face`, `found_plate` has become `image_processing.found_plate` +- The [FFmpeg binary sensor][ffmpeg-bin] change the platform name from `ffmpeg` to `ffmpeg_noise` and `ffmpeg_motion`. Also all FFmpeg-related services are moved from a platform implementation to a the [FFmpeg components][ffmpeg] and were rename from `binary_sensor.ffmpeg_xy` to `ffmpeg.xy`. + +### {% linkable_title If you need help... %} +...don't hesitate to use our [Forum][forum] or join us for a little [chat][gitter]. 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][issue]. Make sure to fill in all fields of the issue template. + +[@acambitsis]: https://github.com/acambitsis +[@adrianlzt]: https://github.com/adrianlzt +[@aequitas]: https://github.com/aequitas +[@albertoarias]: https://github.com/albertoarias +[@alexmogavero]: https://github.com/alexmogavero +[@andrey-git]: https://github.com/andrey-git +[@andriej]: https://github.com/andriej +[@armills]: https://github.com/armills +[@balloob]: https://github.com/balloob +[@BastianPoe]: https://github.com/BastianPoe +[@benvm]: https://github.com/benvm +[@colinodell]: https://github.com/colinodell +[@Danielhiversen]: https://github.com/Danielhiversen +[@DavidLP]: https://github.com/DavidLP +[@Duoxilian]: https://github.com/Duoxilian +[@eagleamon]: https://github.com/eagleamon +[@fabaff]: https://github.com/fabaff +[@herm]: https://github.com/herm +[@jabesq]: https://github.com/jabesq +[@jawilson]: https://github.com/jawilson +[@Joeboyc2]: https://github.com/Joeboyc2 +[@JshWright]: https://github.com/JshWright +[@kellerza]: https://github.com/kellerza +[@konikvranik]: https://github.com/konikvranik +[@kylehendricks]: https://github.com/kylehendricks +[@LinuxChristian]: https://github.com/LinuxChristian +[@MartinHjelmare]: https://github.com/MartinHjelmare +[@mathewpeterson]: https://github.com/mathewpeterson +[@michaelarnauts]: https://github.com/michaelarnauts +[@miniconfig]: https://github.com/miniconfig +[@mnoorenberghe]: https://github.com/mnoorenberghe +[@molobrakos]: https://github.com/molobrakos +[@nodinosaur]: https://github.com/nodinosaur +[@postlund]: https://github.com/postlund +[@pschmitt]: https://github.com/pschmitt +[@pvizeli]: https://github.com/pvizeli +[@ray0711]: https://github.com/ray0711 +[@rmkraus]: https://github.com/rmkraus +[@robbiet480]: https://github.com/robbiet480 +[@rytilahti]: https://github.com/rytilahti +[@sbidoul]: https://github.com/sbidoul +[@sdague]: https://github.com/sdague +[@stratosmacker]: https://github.com/stratosmacker +[@tboyce1]: https://github.com/tboyce1 +[@tchellomello]: https://github.com/tchellomello +[@Teagan42]: https://github.com/Teagan42 +[@turbokongen]: https://github.com/turbokongen +[@valentinalexeev]: https://github.com/valentinalexeev +[@w1ll1am23]: https://github.com/w1ll1am23 +[@Yannic-HAW]: https://github.com/Yannic-HAW + +[alert]: https://home-assistant.io/components/alert/ +[apiai]: https://home-assistant.io/components/apiai/ +[apple]: https://home-assistant.io/components/media_player.apple_tv/ +[arwn]: https://home-assistant.io/components/sensor.arwn/ +[custom-ui]: https://home-assistant.io/developers/frontend_creating_custom_ui/ +[discovery]: https://home-assistant.io/components/discovery/ +[ffmpeg-bin]: https://home-assistant.io/components/binary_sensor.ffmpeg/ +[ffmpeg]: https://home-assistant.io/components/ffmpeg/ +[filters]: https://home-assistant.io/topics/templating/#home-assistant-template-extensions +[fritz]: https://home-assistant.io/components/switch.fritzdect/ +[hue]: https://home-assistant.io/components/light.hue/ +[light]: https://home-assistant.io/cookbook/custom_ui_by_andrey-git +[mailgun]: https://home-assistant.io/components/notify.mailgun/ +[moon]: https://home-assistant.io/components/sensor.moon/ +[mqtt-discovery]: https://home-assistant.io/components/mqtt/#discovery +[nuki]: https://home-assistant.io/components/lock.nuki/ +[openevse]: https://home-assistant.io/components/sensor.openevse/ +[orange]: https://home-assistant.io/components/media_player.liveboxplaytv/ +[owm]: https://home-assistant.io/components/sensor.openweathermap/ +[python-yeelight]: https://gitlab.com/stavros/python-yeelight +[qnap]: https://home-assistant.io/components/sensor.qnap/ +[rflink]: https://home-assistant.io/components/rflink/ +[systemmonitor]: https://home-assistant.io/components/sensor.systemmonitor/ +[webostv]: https://home-assistant.io/components/media_player.webostv/ +[yeelight]: https://home-assistant.io/components/light.yeelight/ + +[issue]: https://github.com/home-assistant/home-assistant/issues +[gitter]: https://gitter.im/home-assistant/home-assistant +[forum]: https://community.home-assistant.io/ +