From ceb96a2cb439007dc0afd17cce7e43fd21fe5a73 Mon Sep 17 00:00:00 2001 From: Andrew Sayre <6730289+andrewsayre@users.noreply.github.com> Date: Thu, 14 Feb 2019 03:26:34 -0600 Subject: [PATCH 01/64] Add SmartThings Lock platform docs (#8493) --- source/_components/smartthings.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_components/smartthings.markdown b/source/_components/smartthings.markdown index 33ae99bb977..2df31934330 100644 --- a/source/_components/smartthings.markdown +++ b/source/_components/smartthings.markdown @@ -15,6 +15,7 @@ ha_category: - Climate - Fan - Light + - Lock - Sensor - Switch ha_release: "0.87" @@ -28,6 +29,8 @@ redirect_from: - /components/fan.smartthings/ - /components/smartthings.light/ - /components/light.smartthings/ + - /components/smartthings.lock/ + - /components/lock.smartthings/ - /components/smartthings.sensor/ - /components/sensor.smartthings/ - /components/smartthings.switch/ @@ -113,6 +116,7 @@ SmartThings represents devices as a set of [capabilities](https://smartthings.de - [Climate](#climate) - [Fan](#fan) - [Light](#light) +- [Lock](#lock) - [Sensor](#sensor) - [Switch](#switch) @@ -166,6 +170,10 @@ The SmartThings Light platform lets you control devices that have light-related | [`colorControl`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Color-Control) | `color` | [`colorTemperature`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Color-Temperature) | `color_temp` +### {% linkable_title Lock %} + +The SmartThings Lock platform lets you control devices that have the [`lock`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Lock) capability, showing current lock status and supporting lock and unlock commands. + ### {% linkable_title Sensor %} The SmartThings Sensor platform lets your view devices that have sensor-related capabilities. A Sensor entity is created for each attribute (below) supported by the device. From cf2817c78299ccd429434f960733fe9824e394c9 Mon Sep 17 00:00:00 2001 From: Victor Cerutti Date: Thu, 14 Feb 2019 16:04:04 +0100 Subject: [PATCH 02/64] =?UTF-8?q?Documentation=20for=20the=20M=C3=A9t?= =?UTF-8?q?=C3=A9o-France=20weather=20platform=20(#7480)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * météo france weather platform documentation * Add infos about the content of forecast on card * Introducing Meteo-France component * Minor changes --- source/_components/meteo_france.markdown | 126 ++++++++++++++++++ .../_components/sensor.meteo_france.markdown | 73 +--------- .../_components/weather.meteo_france.markdown | 20 +++ 3 files changed, 150 insertions(+), 69 deletions(-) create mode 100644 source/_components/meteo_france.markdown create mode 100644 source/_components/weather.meteo_france.markdown diff --git a/source/_components/meteo_france.markdown b/source/_components/meteo_france.markdown new file mode 100644 index 00000000000..11b8a376981 --- /dev/null +++ b/source/_components/meteo_france.markdown @@ -0,0 +1,126 @@ +--- +layout: page +title: "Météo-France" +description: "Instructions on how to integrate Météo-France within Home Assistant." +date: 2018-10-18 08:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: meteo-france.png +ha_category: Hub +ha_release: 0.88 +ha_iot_class: "Cloud Polling" +ha_category: + - Sensor + - Weather +ha_iot_class: "Local Push" +redirect_from: + - /components/sensor.meteo_france/ + - /components/weather.meteo_france/ +--- + +The `meteo_france` component uses the [Météo-France](http://www.meteofrance.com/) web service as a source for meteorological data for your location. The location is based on the `city` configured in your `configuration.yaml` file. + +It displays the current weather along with a 4 days forecast and can create sensors based on the `monitored_conditions` set in your `configuration.yaml` file. + +## {% linkable_title Configuration %} + +To add Météo-France to your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +meteo_france: + - city: '76000' +``` + +{% configuration %} + city: + description: Name of the city ([see below](#about-city-configuration)). + required: true + type: string + monitored_conditions: + description: The conditions types to monitor. + required: true + type: list + keys: + temperature: + description: The current temperature. + weather: + description: A human-readable text summary of the current conditions. + wind_speed: + description: The wind speed. + uv: + description: The current UV index. + next_rain: + description: Time to the next rain if happening for the next hour ([see note below](#about-next_rain-condition-sensor)). + freeze_chance: + description: Probability of temperature below 0°C for the day. + rain_chance: + description: Probability of rain for the day. + snow_chance: + description: Probability of snow for the day. + thunder_chance: + description: Probability of thunderstorm for the day. +{% endconfiguration %} + + +### {% linkable_title About `city` configuration %} + +This component use the Météo-France search API to get the first city from the results returned. + +It works well with french postal code, city name, etc. In case your expected result doesn't come first, you can set a more specified query like `, `. + +It also works with international city, with mixed results. You may have to find the correct city query. +For example `Montreal, Canada` will return a city in Ardèche, France, whereas `Montreal, america` works + +[http://www.meteofrance.com/mf3-rpc-portlet/rest/lieu/facet/previsions/search/montreal,amerique](http://www.meteofrance.com/mf3-rpc-portlet/rest/lieu/facet/previsions/search/montreal,amerique) + +```yaml +# Example configuration.yaml entry for Montreal, Canada +meteo_france: + - city: 'montreal,amerique' +``` + +### {% linkable_title About `next_rain` condition sensor %} + +

+ The 1 hour rain forecast is supported for more than 75 % of metropolitan France.
+ You can check if your city is covered on the [Météo-France website](http://www.meteofrance.com/previsions-meteo-france/previsions-pluie). +

+ +The `next_rain` sensor value is the time to next rain, from 0 to 55 minutes. +If no rain is forecasted for the next hour, value will be "No rain". + +Attributes also give the forecast for the next hour in 5 minutes intervals. +Possible value for each intervals attributes are: + +- 1 No rain +- 2 Light rain +- 3 Moderate rain +- 4 Heavy rain + + +### {% linkable_title Complete example %} + +This is an example for 3 cities forecast with different monitored conditions: + +```yaml +# Complete example configuration.yaml entry +meteo_france: + - city: 'Rouen' + monitored_conditions: + - rain_chance + - freeze_chance + - thunder_chance + - snow_chance + - weather + - next_rain + - wind_speed + - temperature + - uv + - city: 'Oslo, norvege' + monitored_conditions: + - temperature + - city: '51100' +``` diff --git a/source/_components/sensor.meteo_france.markdown b/source/_components/sensor.meteo_france.markdown index 23a139e2dca..0c2910b811f 100644 --- a/source/_components/sensor.meteo_france.markdown +++ b/source/_components/sensor.meteo_france.markdown @@ -1,85 +1,20 @@ --- layout: page title: "Météo-France Sensor" -description: "Show 1hr rain forecast from Météo-France." +description: "Instructions on how to integrate Météo-France within Home Assistant." date: 2018-10-18 08:00 sidebar: true comments: false sharing: true footer: true logo: meteo-france.png -ha_category: Sensor +ha_category: Weather ha_release: 0.82 ha_iot_class: "Cloud Polling" --- -The `meteo_france` platform uses the [Météo-France](http://www.meteofrance.com/) web service as a source for meteorological data for your location. The location is based on the `postal_code` configured in your `configuration.yaml` file. +The `meteo_france` platform uses the [Météo-France](http://www.meteofrance.com/) web service as a source for meteorological data for your location. ## {% linkable_title Configuration %} -To add Météo-France to your installation, add the following to your `configuration.yaml` file: - -```yaml -# Example configuration.yaml entry -sensor: - - platform: meteo_france - postal_code: '76000' - monitored_conditions: - - temperature - - weather - - wind_speed - - uv - - next_rain - - freeze_chance - - rain_chance - - snow_chance - - thunder_chance -``` - -{% configuration %} - postal_code: - description: Postal code of the city. - required: true - type: string - monitored_conditions: - description: The conditions types to monitor. - required: true - type: list - keys: - temperature: - description: The current temperature. - weather: - description: A human-readable text summary of the current conditions. - wind_speed: - description: The wind speed. - uv: - description: The current UV index. - next_rain: - description: Time to the next rain if happening for the next hour. (see note below) - freeze_chance: - description: Probability of temperature below 0°C for the day. - rain_chance: - description: Probability of rain for the day. - snow_chance: - description: Probability of snow for the day. - thunder_chance: - description: Probability of thunderstorm for the day. -{% endconfiguration %} - - -### {% linkable_title About `next_rain` condition sensor %} - -

- The 1 hour rain forecast is supported for more than 75% of metropolitan France.
- You can check if your city is covered on the [Météo-France website](http://www.meteofrance.com/previsions-meteo-france/previsions-pluie) -

- -The `next_rain` sensor value is the time to next rain, from 0 to 55min. -If no rain is forecasted for the next hour, value will be "No rain". - -Attributes also give the forecast for the next hour in 5min intervals. -Possible value for each intervals attributes are : -- 1 No rain -- 2 Light rain -- 3 Moderate rain -- 4 Heavy rain +Please see the [component](/components/meteo_france/) documentation for details and configuration. diff --git a/source/_components/weather.meteo_france.markdown b/source/_components/weather.meteo_france.markdown new file mode 100644 index 00000000000..2b61cb65e86 --- /dev/null +++ b/source/_components/weather.meteo_france.markdown @@ -0,0 +1,20 @@ +--- +layout: page +title: "Météo-France Weather" +description: "Instructions on how to integrate Météo-France within Home Assistant." +date: 2018-10-18 08:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: meteo-france.png +ha_category: Weather +ha_release: 0.88 +ha_iot_class: "Cloud Polling" +--- + +The `meteo_france` platform uses the [Météo-France](http://www.meteofrance.com/) web service as a source for meteorological data for your location. + +## {% linkable_title Configuration %} + +Please see the [component](/components/meteo_france/) documentation for details and configuration. From ef2050501af56a2a64f0b127999569758a705151 Mon Sep 17 00:00:00 2001 From: Jorim Tielemans Date: Thu, 14 Feb 2019 19:05:59 +0100 Subject: [PATCH 03/64] Example fix (#8576) --- source/_components/speedtestdotnet.markdown | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/_components/speedtestdotnet.markdown b/source/_components/speedtestdotnet.markdown index 25da80f840e..f4898d452a1 100644 --- a/source/_components/speedtestdotnet.markdown +++ b/source/_components/speedtestdotnet.markdown @@ -111,13 +111,13 @@ Every half hour of every day: ```yaml # Example configuration.yaml entry -speedtest: +speedtestdotnet: update_interval: minutes: 30 - monitored_conditions: - - ping - - download - - upload + monitored_conditions: + - ping + - download + - upload ``` ### {% linkable_title Using as a trigger in an automation %} From bc137041d8c33778efbce53a606637a8cab66f87 Mon Sep 17 00:00:00 2001 From: Alok Saboo Date: Thu, 14 Feb 2019 14:39:09 -0500 Subject: [PATCH 04/64] Added templates to Bayesian sensor (#8408) * Added templates to Bayesian sensor * change quotes * more changes * Added raw/endraw tags --- .../binary_sensor.bayesian.markdown | 65 +++++++++++++------ 1 file changed, 44 insertions(+), 21 deletions(-) diff --git a/source/_components/binary_sensor.bayesian.markdown b/source/_components/binary_sensor.bayesian.markdown index 6154fbaa1f2..81424f7d666 100644 --- a/source/_components/binary_sensor.bayesian.markdown +++ b/source/_components/binary_sensor.bayesian.markdown @@ -57,10 +57,21 @@ observations: required: true type: list keys: - entity_id: - description: Name of the entity to monitor. + platform: + description: > + The supported platforms are `state`, `numeric_state`, and `template`. + They are modeled after their corresponding triggers for automations, + requiring `to_state` (for `state`), `below` and/or `above` (for `numeric_state`) and `value_template` (for `template`). required: true type: string + entity_id: + description: Name of the entity to monitor. + required: true (for `state` and `numeric_state`) + type: string + value_template: + description: Defines the template to be used. + required: true (for `template`) + type: template prob_given_true: description: The probability of the observation occurring, given the event is `true`. required: true @@ -70,17 +81,10 @@ observations: required: false type: float default: "`1 - prob_given_true` if `prob_given_false` is not set" - platform: - description: > - The only supported observation platforms are `state` and `numeric_state`, - which are modeled after their corresponding triggers for automations, - requiring `below` and/or `above` instead of `to_state`. - required: true - type: string to_state: description: The target state. - required: true - type: string + required: true (for `state`) + type: string {% endconfiguration %} ## {% linkable_title Full examples %} @@ -95,23 +99,23 @@ binary_sensor: prior: 0.25 probability_threshold: 0.95 observations: - - entity_id: 'sensor.living_room_motion' + - platform: 'state' + entity_id: 'sensor.living_room_motion' prob_given_true: 0.4 prob_given_false: 0.2 - platform: 'state' to_state: 'off' - - entity_id: 'sensor.basement_motion' + - platform: 'state' + entity_id: 'sensor.basement_motion' prob_given_true: 0.5 prob_given_false: 0.4 - platform: 'state' to_state: 'off' - - entity_id: 'sensor.bedroom_motion' + - platform: 'state' + entity_id: 'sensor.bedroom_motion' prob_given_true: 0.5 - platform: 'state' to_state: 'on' - - entity_id: 'sun.sun' + - platform: 'state' + entity_id: 'sun.sun' prob_given_true: 0.7 - platform: 'state' to_state: 'below_horizon' ``` @@ -126,8 +130,27 @@ binary_sensor: prior: 0.2 probability_threshold: 0.9 observations: - - entity_id: 'sensor.outside_air_temperature_fahrenheit' + - platform: 'numeric_state' + entity_id: 'sensor.outside_air_temperature_fahrenheit' prob_given_true: 0.95 - platform: 'numeric_state' below: 50 ``` + +Finally, here's an example for `template` observation platform, +as seen in the configuration it requires `value_template` and does not use `entity_id`. + +{% raw %} +```yaml +# Example configuration.yaml entry +binary_sensor: + name: 'Paulus Home' + platform: 'bayesian' + prior: 0.5 + probability_threshold: 0.9 + observations: + - platform: template + value_template: > + {{is_state('device_tracker.paulus','not_home') and ((as_timestamp(now()) - as_timestamp(states.device_tracker.paulus.last_changed)) > 300)}} + prob_given_true: 0.95 +``` +{% endraw %} From d1f994b4dcedb9165b85a1ad05b42de051907f0d Mon Sep 17 00:00:00 2001 From: Ryan Wagoner <8441200+rwagoner@users.noreply.github.com> Date: Thu, 14 Feb 2019 14:39:31 -0500 Subject: [PATCH 05/64] Add night arm mode to MQTT alarm control panel (#8471) --- source/_components/alarm_control_panel.mqtt.markdown | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/source/_components/alarm_control_panel.mqtt.markdown b/source/_components/alarm_control_panel.mqtt.markdown index f563e6eeaeb..f084ef7d17a 100644 --- a/source/_components/alarm_control_panel.mqtt.markdown +++ b/source/_components/alarm_control_panel.mqtt.markdown @@ -20,6 +20,7 @@ The component will accept the following states from your Alarm Panel (in lower c - `disarmed` - `armed_home` - `armed_away` +- 'armed_night' - `pending` - `triggered` @@ -75,6 +76,11 @@ payload_arm_away: required: false type: string default: ARM_AWAY +payload_arm_night: + description: The payload to set armed-night mode on your Alarm Panel. + required: false + type: string + default: ARM_NIGHT code: description: If defined, specifies a code to enable or disable the alarm in the frontend. required: false From c4b868e0fe2363ce5b5bb6d2b1f8d495a5013b78 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Thu, 14 Feb 2019 21:28:17 +0100 Subject: [PATCH 06/64] =?UTF-8?q?=F0=9F=9A=9C=20Merge=20Meteo=20France=20C?= =?UTF-8?q?omponent=20and=20:arrow=5Fup:=20ha=5Frelease=20(#8582)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/_components/meteo_france.markdown | 11 ++++++---- .../_components/sensor.meteo_france.markdown | 20 ------------------- .../_components/weather.meteo_france.markdown | 20 ------------------- 3 files changed, 7 insertions(+), 44 deletions(-) delete mode 100644 source/_components/sensor.meteo_france.markdown delete mode 100644 source/_components/weather.meteo_france.markdown diff --git a/source/_components/meteo_france.markdown b/source/_components/meteo_france.markdown index 11b8a376981..06fb6f606c2 100644 --- a/source/_components/meteo_france.markdown +++ b/source/_components/meteo_france.markdown @@ -9,7 +9,7 @@ sharing: true footer: true logo: meteo-france.png ha_category: Hub -ha_release: 0.88 +ha_release: 0.89 ha_iot_class: "Cloud Polling" ha_category: - Sensor @@ -22,6 +22,11 @@ redirect_from: The `meteo_france` component uses the [Météo-France](http://www.meteofrance.com/) web service as a source for meteorological data for your location. The location is based on the `city` configured in your `configuration.yaml` file. +There is currently support for the following device types within Home Assistant: + +- Sensor +- Weather + It displays the current weather along with a 4 days forecast and can create sensors based on the `monitored_conditions` set in your `configuration.yaml` file. ## {% linkable_title Configuration %} @@ -61,10 +66,9 @@ meteo_france: snow_chance: description: Probability of snow for the day. thunder_chance: - description: Probability of thunderstorm for the day. + description: Probability of thunderstorm for the day. {% endconfiguration %} - ### {% linkable_title About `city` configuration %} This component use the Météo-France search API to get the first city from the results returned. @@ -100,7 +104,6 @@ Possible value for each intervals attributes are: - 3 Moderate rain - 4 Heavy rain - ### {% linkable_title Complete example %} This is an example for 3 cities forecast with different monitored conditions: diff --git a/source/_components/sensor.meteo_france.markdown b/source/_components/sensor.meteo_france.markdown deleted file mode 100644 index 0c2910b811f..00000000000 --- a/source/_components/sensor.meteo_france.markdown +++ /dev/null @@ -1,20 +0,0 @@ ---- -layout: page -title: "Météo-France Sensor" -description: "Instructions on how to integrate Météo-France within Home Assistant." -date: 2018-10-18 08:00 -sidebar: true -comments: false -sharing: true -footer: true -logo: meteo-france.png -ha_category: Weather -ha_release: 0.82 -ha_iot_class: "Cloud Polling" ---- - -The `meteo_france` platform uses the [Météo-France](http://www.meteofrance.com/) web service as a source for meteorological data for your location. - -## {% linkable_title Configuration %} - -Please see the [component](/components/meteo_france/) documentation for details and configuration. diff --git a/source/_components/weather.meteo_france.markdown b/source/_components/weather.meteo_france.markdown deleted file mode 100644 index 2b61cb65e86..00000000000 --- a/source/_components/weather.meteo_france.markdown +++ /dev/null @@ -1,20 +0,0 @@ ---- -layout: page -title: "Météo-France Weather" -description: "Instructions on how to integrate Météo-France within Home Assistant." -date: 2018-10-18 08:00 -sidebar: true -comments: false -sharing: true -footer: true -logo: meteo-france.png -ha_category: Weather -ha_release: 0.88 -ha_iot_class: "Cloud Polling" ---- - -The `meteo_france` platform uses the [Météo-France](http://www.meteofrance.com/) web service as a source for meteorological data for your location. - -## {% linkable_title Configuration %} - -Please see the [component](/components/meteo_france/) documentation for details and configuration. From eb45e03cb03e6b176f44cd1433e5f47c8e2b5420 Mon Sep 17 00:00:00 2001 From: Jonas Pedersen Date: Fri, 15 Feb 2019 13:15:46 +0100 Subject: [PATCH 07/64] Additional sensors and switch platform for Danfoss Air. (#8554) --- .../binary_sensor.danfoss_air.markdown | 1 + .../_components/sensor.danfoss_air.markdown | 5 +++++ .../_components/switch.danfoss_air.markdown | 22 +++++++++++++++++++ 3 files changed, 28 insertions(+) create mode 100644 source/_components/switch.danfoss_air.markdown diff --git a/source/_components/binary_sensor.danfoss_air.markdown b/source/_components/binary_sensor.danfoss_air.markdown index 1c150fcb3c9..83367ced284 100644 --- a/source/_components/binary_sensor.danfoss_air.markdown +++ b/source/_components/binary_sensor.danfoss_air.markdown @@ -19,3 +19,4 @@ To get your Danfoss Air binary sensors working with Home Assistant, follow the i The following binary sensor is supported. * **Bypass active:** Indicator if heat recovery is currrently bypassed. +* **Away mode active:** Indicator if away mode is currently active. diff --git a/source/_components/sensor.danfoss_air.markdown b/source/_components/sensor.danfoss_air.markdown index dacffcc6e08..8f159ce2d01 100644 --- a/source/_components/sensor.danfoss_air.markdown +++ b/source/_components/sensor.danfoss_air.markdown @@ -17,9 +17,14 @@ ha_iot_class: "Local Polling" To get your Danfoss Air sensors working with Home Assistant, follow the instructions for the general [Danfoss Air component](/components/danfoss_air/).

+ The following sensors are supported. * **Outdoor temperature:** Outdoor air temperature. * **Supply temperature:** Air temperature of the air supplied to the house. * **Extract temperature:** Air temperature of the air extracted from the house. * **Exhaust temperature:** Exhausted air temperature. * **Remaining filter lifetime:** Reamining filter lifetime measured in percent. +* **Fan step:** Fan step in percent. +* **Exhaust fan speed:** Exhaust fan speed RPM. +* **Supply fan speed:** Supply fan speed RPM. +* **Battery:** Danfoss Air Dial remaning battery. If your system is without an Air Dial control panel the sensor will show 0%. diff --git a/source/_components/switch.danfoss_air.markdown b/source/_components/switch.danfoss_air.markdown new file mode 100644 index 00000000000..d0242c052c3 --- /dev/null +++ b/source/_components/switch.danfoss_air.markdown @@ -0,0 +1,22 @@ +--- +layout: page +title: "Danfoss Air Switch" +description: "Instructions for how to setup Danfoss Air switches within Home Assistant." +date: 2019-02-13 13:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: danfoss_air.png +ha_category: Switch +ha_release: "0.88" +ha_iot_class: "Local Polling" +--- + +

+To get your Danfoss Air sensors working with Home Assistant, follow the instructions for the general [Danfoss Air component](/components/danfoss_air/). +

+ + +The following switches. +* **Boost:** Switch to manually activate boost. From e9344e150f9591e4732792be3ee216cff6826eb2 Mon Sep 17 00:00:00 2001 From: Phil Cole Date: Fri, 15 Feb 2019 12:41:15 +0000 Subject: [PATCH 08/64] Initial documentation for nissan_leaf (#8073) * Initial documentation for nissan_leaf * Use correct brand names. * Include defaults, extend notes and add nissan_leaf.update service. * Nissan leaf, hope for release in 0.88 * Use markers in example config. Remove redirects. * Add redirects * Add missing redirect * Remove some things to get the build pass --- source/_components/nissan_leaf.markdown | 126 ++++++++++++++++++++++ source/images/supported_brands/nissan.png | Bin 0 -> 41319 bytes 2 files changed, 126 insertions(+) create mode 100644 source/_components/nissan_leaf.markdown create mode 100644 source/images/supported_brands/nissan.png diff --git a/source/_components/nissan_leaf.markdown b/source/_components/nissan_leaf.markdown new file mode 100644 index 00000000000..19357efa985 --- /dev/null +++ b/source/_components/nissan_leaf.markdown @@ -0,0 +1,126 @@ +--- +layout: page +title: "Nissan Leaf" +description: "Instructions for how to integrate Nissan Leaf(s) into Home Assistant." +date: 2019-01-05 07:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: nissan.png +ha_category: Car +ha_release: 0.88 +ha_iot_class: "Cloud Polling" +--- + +The `nissan_leaf` component offers integration with the [NissanConnect EV](http://youplus.nissan.co.uk/GB/en/YouPlus/ConnectedServices.html) cloud service. NissanConnect EV was previously known as Nissan Carwings. It offers: + +* sensors for the battery status and range +* a switch to start and stop the climate control +* a switch to start the car charging (cannot be stopped remotely - API limitation) +* a device tracker to locate the car (only on later Leaf models) + +## {% linkable_title Configuration %} + +To use Nissan Leaf in your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +nissan_leaf: + username: "YOUR_USERNAME" + password: "YOUR_PASSWORD" + region: "YOUR_REGION" +``` +{% configuration %} +username: + description: The username associated with your NissanConnect EV account. Enclose in quotes. + required: true + type: string +password: + description: The password for your given NissanConnect EV account. Enclose in quotes. + required: true + type: string +region: + description: The region where the NissanConnect EV account is registered. Should be one of the following, NE (for Europe), NNA (USA), NCI (Canada), NMA (Australia), NML (Japan). + required: true + type: string +nissan_connect: + description: If your car has the updated head unit (NissanConnect rather than Carwings) then the location can be aquired and exposed via a device tracker. If you have a pre-2014 24 kWh Leaf then you will have Carwings and this should be set to false. + required: false + type: boolean +update_interval: + description: The interval between updates if the climate control is off and the car is not charging. Set in any time unit (e.g. minutes, hours, days!). + required: false + default: 1 hour + type: time +update_interval_charging: + description: The interval in minutes between updates if charging. + required: false + default: 15 + type: time +update_interval_climate: + description: The interval in minutes between updates if climate control on. + required: false + default: 5 + type: time +{% endconfiguration %} + +## {% linkable_title Full configuration sample %} + +A more advanced example for setting the update interval: + +```yaml +# Example configuration.yaml entry +nissan_leaf: + username: "YOUR_USERNAME" + password: "YOUR_PASSWORD" + region: "YOUR_REGION" + nissan_connect: true + update_interval: + hours: 1 + update_interval_charging: + minutes: 15 + update_interval_climate: + minutes: 5 + force_miles: true +``` + +## {% linkable_title Updating on-demand using Automation %} + +You can also use the `nissan_leaf.update` service to request an on-demand update. To update almost exclusively via the service set the `update_interval` to a high value in the component configuration. The service requires you to provide the vehicle identification number (VIN) as a parameter. You can see the VIN on the attributes of all the entities created by this component, except the device_tracker. + +```yaml +- id: update_when_driver_not_home + alias: 'Update when driver not home' + initial_state: on + trigger: + - platform: time_pattern + minutes: '/30' + condition: + - condition: state + entity_id: device_tracker.drivername # replace + state: 'not_home' + action: + - service: nissan_leaf.update + data: + vin: '1HGBH41JXMN109186' # replace +``` + +## {% linkable_title Hints %} + +* The update interval has a minimum of two minutes. +* Requesting updates uses a small amount of power from the 12 V battery. The 12 V battery charges from the main traction battery when the car is not plugged in. If the car is left plugged in for a long time, or if the main traction battery is very low then the 12 V battery may gradually discharge. A low update interval may cause the 12 V battery to become flat. When the 12 V battery is flat the car will not start. _Do not set the update interval too low. Use at your own risk._ +* This component communicates with the Nissan Servers which then communicate with the car. The communication between the car and the Nissan Servers is very slow, and takes up to five minutes to get information from the car, therefore the default polling interval is set to one hour to not overwhelm the connection. +* Responses from the Nissan servers are received separately for the battery/range, climate control and location. The `updated_on` attribute will show the last time the data was retrieved from the server. There are separate attributes for when the `next_update` is scheduled, and if an `update_inprogress`. The `nissan_leaf.update` service will reset the `next_update` attribute. + +Please report bugs using the following logger configuration. + +```yaml +logger: + default: critical + logs: + homeassistant.components.nissan_leaf: debug + homeassistant.components.device_tracker.nissan_leaf: debug + homeassistant.components.sensor.nissan_leaf: debug + homeassistant.components.switch.nissan_leaf: debug +``` diff --git a/source/images/supported_brands/nissan.png b/source/images/supported_brands/nissan.png new file mode 100644 index 0000000000000000000000000000000000000000..23b947e8dcb8a78e428b66760d5b5a6de53d11bc GIT binary patch literal 41319 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 literal 0 HcmV?d00001 From 8e019dd2517cb702d432007700fddec2b2531616 Mon Sep 17 00:00:00 2001 From: Klaudiusz Staniek Date: Fri, 15 Feb 2019 14:00:42 +0100 Subject: [PATCH 09/64] Create binary_sensor.tod.markdown (#8172) * Create binary_sensor.tod.markdown * Update binary_sensor.tod.markdown * Update source/_components/binary_sensor.tod.markdown Co-Authored-By: kstaniek * Update source/_components/binary_sensor.tod.markdown Co-Authored-By: kstaniek * Update source/_components/binary_sensor.tod.markdown Co-Authored-By: kstaniek * Update source/_components/binary_sensor.tod.markdown Co-Authored-By: kstaniek * Update source/_components/binary_sensor.tod.markdown Co-Authored-By: kstaniek * Update source/_components/binary_sensor.tod.markdown Co-Authored-By: kstaniek * Update source/_components/binary_sensor.tod.markdown Co-Authored-By: kstaniek * Update binary_sensor.tod.markdown * :pencil2: Tweaks * Updated to follow latest configuration change * Minor changes --- source/_components/binary_sensor.tod.markdown | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 source/_components/binary_sensor.tod.markdown diff --git a/source/_components/binary_sensor.tod.markdown b/source/_components/binary_sensor.tod.markdown new file mode 100644 index 00000000000..fafbd195876 --- /dev/null +++ b/source/_components/binary_sensor.tod.markdown @@ -0,0 +1,76 @@ +--- +layout: page +title: "Times of the Day Binary Sensor" +description: "Instructions on how to integrate Times of the Day binary sensors within Home Assistant." +date: 2019-01-14 23:35 +sidebar: true +comments: false +sharing: true +footer: true +ha_category: Binary Sensor +ha_release: 0.88 +ha_iot_class: "Local Push" +logo: home-assistant.png +ha_qa_scale: internal +--- + +The `tod` platform supports binary sensors which get their values by checking if the current time is within defined time ranges. + +The time ranges can be provided as absolute local time or using the `sunrise` or `sunset` keyword calculated based on the sun position for location. The location must be provided in the configuration. + +In addition for sun position based ranges, the negative or positive offset can be configured. + +## {% linkable_title Configuration %} + +Here is an example of adding a sensor to the `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +binary_sensor: + - platform: tod + name: Early Morning + after: sunrise + after_offset: '-02:00' + before: '07:00' +``` + +{% configuration %} +name: + description: Name of the sensor. + required: true + type: string +before: + description: The absolute local time value or sun event for beginning of the time range. + required: true + type: string or time +before_offset: + description: The time offset of the beginning time range. + required: false + type: time +after: + description: The absolute local time value or sun event for ending of the time range. + required: true + type: string or time +after_offset: + description: The time offset of the beginning time range. + type: time + required: false +{% endconfiguration %} + +## {% linkable_title Considerations %} + +The primary purpose of this sensor is to use a simple time range definition instead of creating a complex template with references to `sun.sun` component attributes. + +The sensor state is ON when this condition `after` + `after_offset` <= `current time` < `before` + `before_offset`. + +If `after` time is later than `before` then the next day is considered, i.e.: + +```yaml +binary_sensor: + - platform: tod + name: Night + after: sunset + before: sunrise +``` + +In the above example, the next day `sunrise` is calculated as a time range end. From cebb49b6e9217c0e3a5039412355f1d51de34870 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Fri, 15 Feb 2019 15:01:07 +0100 Subject: [PATCH 10/64] Update 'ha_release' --- source/_components/binary_sensor.tod.markdown | 2 +- source/_components/nissan_leaf.markdown | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/source/_components/binary_sensor.tod.markdown b/source/_components/binary_sensor.tod.markdown index fafbd195876..4971fbf8015 100644 --- a/source/_components/binary_sensor.tod.markdown +++ b/source/_components/binary_sensor.tod.markdown @@ -8,7 +8,7 @@ comments: false sharing: true footer: true ha_category: Binary Sensor -ha_release: 0.88 +ha_release: 0.89 ha_iot_class: "Local Push" logo: home-assistant.png ha_qa_scale: internal diff --git a/source/_components/nissan_leaf.markdown b/source/_components/nissan_leaf.markdown index 19357efa985..3efd61cc4f6 100644 --- a/source/_components/nissan_leaf.markdown +++ b/source/_components/nissan_leaf.markdown @@ -9,14 +9,14 @@ sharing: true footer: true logo: nissan.png ha_category: Car -ha_release: 0.88 +ha_release: 0.89 ha_iot_class: "Cloud Polling" --- The `nissan_leaf` component offers integration with the [NissanConnect EV](http://youplus.nissan.co.uk/GB/en/YouPlus/ConnectedServices.html) cloud service. NissanConnect EV was previously known as Nissan Carwings. It offers: * sensors for the battery status and range -* a switch to start and stop the climate control +* a switch to start and stop the climate control * a switch to start the car charging (cannot be stopped remotely - API limitation) * a device tracker to locate the car (only on later Leaf models) From 0d39edaac5d9bf96f5d780526815278b4d509a0f Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Fri, 15 Feb 2019 15:19:53 +0100 Subject: [PATCH 11/64] Update 'ha_release' --- source/_components/switch.danfoss_air.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/switch.danfoss_air.markdown b/source/_components/switch.danfoss_air.markdown index d0242c052c3..6203a9a1041 100644 --- a/source/_components/switch.danfoss_air.markdown +++ b/source/_components/switch.danfoss_air.markdown @@ -9,7 +9,7 @@ sharing: true footer: true logo: danfoss_air.png ha_category: Switch -ha_release: "0.88" +ha_release: 0.89 ha_iot_class: "Local Polling" --- From 8e561c6530fb133af5c4e7d950d1eecdb85c8238 Mon Sep 17 00:00:00 2001 From: Fredrik Erlandsson Date: Fri, 15 Feb 2019 16:40:16 +0100 Subject: [PATCH 12/64] Add documentation for Point alarm_control_panel (#8477) * add documentation for Point alarm_control_panel * ha_config_flow: true * Point reaches gold standard * Apply suggestions from code review Co-Authored-By: fredrike * merged documentation * updated merged documentation * updated automation examples --- .../_components/binary_sensor.point.markdown | 35 ------ source/_components/point.markdown | 108 +++++++++++++++++- source/_components/sensor.point.markdown | 29 ----- 3 files changed, 102 insertions(+), 70 deletions(-) delete mode 100644 source/_components/binary_sensor.point.markdown delete mode 100644 source/_components/sensor.point.markdown diff --git a/source/_components/binary_sensor.point.markdown b/source/_components/binary_sensor.point.markdown deleted file mode 100644 index f12d9275172..00000000000 --- a/source/_components/binary_sensor.point.markdown +++ /dev/null @@ -1,35 +0,0 @@ ---- -layout: page -title: "Minut Point Binary Sensor" -description: "Access your Minut Point Events as binary sensors." -date: 2018-11-19 -sidebar: true -comments: false -sharing: true -footer: true -logo: minut.svg -ha_category: Binary Sensor -ha_release: "0.83" -ha_iot_class: "Cloud Push" -ha_qa_scale: silver ---- - -Each Point exposes the following binary sensors: - -- **battery**: `On` means low, `Off` means normal -- **button_press**: `On` means the button was pressed, `Off` means normal -- **cold**: `On` means cold, `Off` means normal -- **connectivity**: `On` means connected, `Off` means disconnected -- **dry**: `On` means too dry, `Off` means normal -- **heat**: `On` means hot, `Off` means normal -- **light**: `On` means light detected, `Off` means no light -- **moisture**: `On` means moisture detected (wet), `Off` means no moisture (dry) -- **motion**: `On` means motion detected, `Off` means no motion (clear) -- **sound**: `On` means sound detected, `Off` means no sound (clear) -- **tamper**: `On` means the point was removed or attached - -For installation instructions, see [the Point component](/components/point/). - -

-The events sent from the Point is also sent as a webhook back to Home Assistant with `event_type` as `point_webhook_received`, please consider the documentation for the [IFTT](/components/ifttt/) component on how to write automations for webhooks. -

diff --git a/source/_components/point.markdown b/source/_components/point.markdown index 36d790aca80..705e94f2376 100644 --- a/source/_components/point.markdown +++ b/source/_components/point.markdown @@ -8,16 +8,24 @@ comments: false sharing: true footer: true logo: minut.svg -ha_category: Hub +ha_category: + - Hub + - Alarm + - Binary Sensor + - Sensor featured: false ha_release: "0.83" +ha_config_flow: true ha_iot_class: "Cloud Polling" -ha_qa_scale: silver +ha_qa_scale: gold +redirect_from: + - /components/binary_sensor.point/ + - /components/sensor.point/ --- -The Point component is the main component to integrate the [Minut Point](https://minut.com/). To connect Point, you will have to [sign up for a developer account](https://minut.com/community/developers/) and get a `client_id` and `client_secret` using the `callback url` as `base_url` + `/api/minut`, e.g., `http://localhost:8123/api/minut`. The `client_id` and `client_secret` should be used as below. +The Point hub enables integration with the [Minut Point](https://minut.com/). To connect with Point, you will have to [sign up for a developer account](https://minut.com/community/developers/) and get a `client_id` and `client_secret` with the `callback url` configured as your Home Assistant `base_url` + `/api/minut`, e.g. `http://localhost:8123/api/minut`. The `client_id` and `client_secret` should be used as below. -Once Home Assistant is started, a configurator will pop up asking you to Authenticate your Point account via a link when you follow the link and have clicked on **Accept** you will be redirected to the `callback url` and the Point integration will be automatically configured and you can go back to the original dialog and press **Submit**. +Once Home Assistant is started, a configurator will pop up asking you to Authenticate your Point account via a link. When you follow the link and click on **Accept** you will be redirected to the `callback url` and the Point integration will be automatically configured and you can go back to the original dialog and press **Submit**. ### {% linkable_title Configuration %} @@ -39,7 +47,95 @@ client_secret: type: string {% endconfiguration %} +# {% linkable_title Device types %} + +The integration supports the following device types within Home Assistant: + - [Alarm](#alarm) + - [Binary Sensor](#binary-sensor) + - [Sensor](#sensor) +

-The Point is just active occasionally so the sensors are only updated every hour or so. -The events sent from the Point is sent as a webhook back to Home Assistant with `event_type` as `point_webhook_received`, please consider the documentation for the [IFTT](/components/ifttt/) component on how to write automations for webhooks. +The Point is just active occasionally so the [Sensors](#sensor) are only updated every hour or so. The [Binary Sensors](#binary-sensor) are however updated via [Cloud Push](https://www.home-assistant.io/blog/2016/02/12/classifying-the-internet-of-things/#cloud-pushing-new-state), making the changes close to instant.

+ +## {% linkable_title Alarm %} + +Each home configured in the Point mobile application will show up as a separate alarm control panel. The panels allow **arming** and **disarming** of the Point home alarm system. + +

+The Point only supports a Arm/Disarm action, so there is no difference between `Arm Home` and `Arm Away`. +

+ +## {% linkable_title Binary Sensor %} + +Each Point exposes the following binary sensors: + +- **battery**: `On` means low, `Off` means normal +- **button_press**: `On` means the button was pressed, `Off` means normal +- **cold**: `On` means cold, `Off` means normal +- **connectivity**: `On` means connected, `Off` means disconnected +- **dry**: `On` means too dry, `Off` means normal +- **heat**: `On` means hot, `Off` means normal +- **light**: `On` means light detected, `Off` means no light +- **moisture**: `On` means moisture detected (wet), `Off` means no moisture (dry) +- **motion**: `On` means motion detected, `Off` means no motion (clear) +- **sound**: `On` means sound detected, `Off` means no sound (clear) +- **tamper**: `On` means the point was removed or attached, `Off` means normal + +

+The binary sensors **battery**, **button_press** and **tamper** are switched `On` for a breif moment and are then switched back to `Off`. +

+ +### {% linkable_title Automation example %} + +The following example show how to implement an automation for the **button_press** binary sensor. + +{% raw %} +```yaml +# Example configuration.yaml Automation entry +automation: + alias: Point button press + trigger: + - platform: state + entity_id: binary_sensor.point_button_press # Change this accordingly + to: 'on' + action: + - service: persistent_notification.create + data: + title: Point button press + message: Point button was pressed. +``` +{% endraw %} + +### {% linkable_title Webhook events %} + +The events shown as [binary sensors](#binary-sensor) are sent to Home Assistant as webhooks with the `event_type` set to `point_webhook_received`. Below is an example of how to use such a webhook do note the `trigger.event.data.event.device_id` which translates to the id of the Point device that sent the event. + +{% raw %} +```yaml +# Example configuration.yaml Automation entry +automation: + alias: Point button press (webhook) + trigger: + - platform: event + event_type: point_webhook_received + event_data: {} + condition: + condition: template + value_template: "{{ trigger.event.data.event.type == 'short_button_press' }}" + action: + - service: persistent_notification.create + data_template: + title: Point button press (webhook) + message: "Button press on Point {{ trigger.event.data.event.device_id }}" +``` +{% endraw %} + +## {% linkable_title Sensor %} + +Each Point exposes the following sensors: + +- **temperature**: Temperature in °C. +- **humidity**: Percentage of humidity in the air. +- **pressure**: Pressure in hPa. +- **sound_level**: Sound level in dBA diff --git a/source/_components/sensor.point.markdown b/source/_components/sensor.point.markdown deleted file mode 100644 index ad491d427c6..00000000000 --- a/source/_components/sensor.point.markdown +++ /dev/null @@ -1,29 +0,0 @@ ---- -layout: page -title: "Minut Point Sensor" -description: "Access your Minut Point Sensors." -date: 2018-11-19 -sidebar: true -comments: false -sharing: true -footer: true -logo: minut.svg -ha_category: Sensor -ha_release: "0.83" -ha_iot_class: "Cloud Polling" -ha_qa_scale: silver ---- - -Each Point exposes the following sensors: - -- **temperature**: Temperature in °C. -- **humidity**: Percentage of humidity in the air. -- **pressure**: Pressure in hPa. -- **sound_level**: Sound level in dBa. - - -For installation instructions, see [the Point component](/components/point/). - -

-The Point is just active occasionally so the sensors are only updated every hour or so. -

From 193d4169c4fab7042a51caa9fb18f8146edd414b Mon Sep 17 00:00:00 2001 From: David Barrera Date: Sat, 16 Feb 2019 03:29:42 -0500 Subject: [PATCH 13/64] Add index configuration (#8590) Adds an index configuration variable for cases where the CSS selector returns more than one result. --- source/_components/sensor.scrape.markdown | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/_components/sensor.scrape.markdown b/source/_components/sensor.scrape.markdown index 82241743ae0..bb20562e14a 100644 --- a/source/_components/sensor.scrape.markdown +++ b/source/_components/sensor.scrape.markdown @@ -38,6 +38,11 @@ attribute: description: Get value of an attribute on the selected tag. required: false type: string +index: + description: Defines which of the elements returned by the CSS selector to use. + required: false + default: 0 + type: integer name: description: Name of the sensor. required: false From c3ad7786dc7a15c2b027ebc82d18a71bce5709b4 Mon Sep 17 00:00:00 2001 From: Julius Mittenzwei Date: Sat, 16 Feb 2019 17:43:46 +0100 Subject: [PATCH 14/64] added information about required firmware version (#8606) --- source/_components/velux.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_components/velux.markdown b/source/_components/velux.markdown index 68468b6b08d..8735998d7be 100644 --- a/source/_components/velux.markdown +++ b/source/_components/velux.markdown @@ -19,6 +19,8 @@ redirect_from: [Velux](http://www.velux.com) integration for Home Assistant allows you to connect to a Velux KLF 200 interface, to control [io-homecontrol](http://www.io-homecontrol.com) devices like windows and blinds. The module allows you to start scenes configured within KLF 200. +At least firmware version > 2.0.0.0 is required on the KLF 200 device. The firmware images may be obtained [here](https://www.velux.com/api/klf200) and may be imported via the webinterface of your KLF 200. + There is currently support for the following device types within Home Assistant: - Cover From b1918f69b808e104df297793d8ad5caf94f7228f Mon Sep 17 00:00:00 2001 From: Matt Snyder Date: Sat, 16 Feb 2019 11:25:20 -0600 Subject: [PATCH 15/64] Owlet documentation --- source/_components/owlet.markdown | 50 ++++++++++++++++++++++++ source/images/supported_brands/owlet.svg | 1 + 2 files changed, 51 insertions(+) create mode 100644 source/_components/owlet.markdown create mode 100644 source/images/supported_brands/owlet.svg diff --git a/source/_components/owlet.markdown b/source/_components/owlet.markdown new file mode 100644 index 00000000000..b58d86e791e --- /dev/null +++ b/source/_components/owlet.markdown @@ -0,0 +1,50 @@ +--- +layout: page +title: "Owlet" +description: "Instructions on how to integrate Owlet baby monitor into Home Assistant." +date: 2019-01-19 +sidebar: true +comments: false +sharing: true +footer: true +logo: owlet.svg +ha_category: Health +ha_release: "0.89" +ha_iot_class: "Cloud Polling" +--- + +### {% linkable_title Configuration %} + +```yaml +# Example configuration.yaml entry +owlet: + username: OWLET_USER + password: OWLET_PASSWORD +``` + +{% configuration %} +username: + description: Your Owlet account user ID. + required: true + type: string +password: + description: Your Owlet account password. + required: true + type: string +name: + description: Custom name for your Owlet device. + required: false + type: string +{% endconfiguration %} + +

+The intended purpose of this component is to enable data logging and automations +such as battery status updates and charging reminders. This component should not +replace the Owlet app nor should it be used for life-critical notifications. +

+ +Owlet Care baby monitors check your baby's oxygen level and heart rate while +sleeping. Configuring this component will enable tracking of heart rate, oxygen +level, motion, and base station connection status. Battery status is available +as an attribute on oxygen and heart rate sensors. + diff --git a/source/images/supported_brands/owlet.svg b/source/images/supported_brands/owlet.svg new file mode 100644 index 00000000000..a14154fa005 --- /dev/null +++ b/source/images/supported_brands/owlet.svg @@ -0,0 +1 @@ + Page 1@3x Created with Sketch. \ No newline at end of file From be3c6d860119de8c993483107dcdd294f87e873f Mon Sep 17 00:00:00 2001 From: Matt Snyder Date: Sat, 16 Feb 2019 12:22:43 -0600 Subject: [PATCH 16/64] Document used platforms. --- source/_components/owlet.markdown | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/source/_components/owlet.markdown b/source/_components/owlet.markdown index b58d86e791e..d408c3da8a7 100644 --- a/source/_components/owlet.markdown +++ b/source/_components/owlet.markdown @@ -48,3 +48,12 @@ sleeping. Configuring this component will enable tracking of heart rate, oxygen level, motion, and base station connection status. Battery status is available as an attribute on oxygen and heart rate sensors. +This component enables the following platforms automatically: + +#### Binary Sensors +- Base Station Status +- Motion + +#### Sensors +- Heart rate +- Oxygen level \ No newline at end of file From 6af7a774cdd0f37cb248d032fee7000319f6f70e Mon Sep 17 00:00:00 2001 From: Matt Snyder Date: Sat, 16 Feb 2019 16:14:47 -0600 Subject: [PATCH 17/64] Update categories. Move summary sentence. --- source/_components/owlet.markdown | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/source/_components/owlet.markdown b/source/_components/owlet.markdown index d408c3da8a7..cfd37e1b31a 100644 --- a/source/_components/owlet.markdown +++ b/source/_components/owlet.markdown @@ -8,11 +8,17 @@ comments: false sharing: true footer: true logo: owlet.svg -ha_category: Health +ha_category: + - Health + - Binary Sensor + - Sensor ha_release: "0.89" ha_iot_class: "Cloud Polling" --- +Owlet Care baby monitors check your baby's oxygen level and heart rate while +sleeping. + ### {% linkable_title Configuration %} ```yaml @@ -43,8 +49,7 @@ such as battery status updates and charging reminders. This component should no replace the Owlet app nor should it be used for life-critical notifications.

-Owlet Care baby monitors check your baby's oxygen level and heart rate while -sleeping. Configuring this component will enable tracking of heart rate, oxygen +Configuring this component will enable tracking of heart rate, oxygen level, motion, and base station connection status. Battery status is available as an attribute on oxygen and heart rate sensors. From 9731ee71c50229f3b932ef121c50702ec95d7637 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sun, 17 Feb 2019 09:45:51 +0100 Subject: [PATCH 18/64] Move details up --- source/_components/owlet.markdown | 35 ++++++++++++++----------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/source/_components/owlet.markdown b/source/_components/owlet.markdown index cfd37e1b31a..b2f4dd3d4f8 100644 --- a/source/_components/owlet.markdown +++ b/source/_components/owlet.markdown @@ -16,8 +16,21 @@ ha_release: "0.89" ha_iot_class: "Cloud Polling" --- -Owlet Care baby monitors check your baby's oxygen level and heart rate while -sleeping. +[Owlet Care](https://owletcare.com/) baby monitors check your baby's oxygen level and heart rate while sleeping. + +Configuring this component will enable tracking of heart rate, oxygen level, motion and base station connection status. Battery status is available as an attribute on oxygen and heart rate sensors. + +This component enables the following platforms automatically: + +#### {% linkable_title Binary Sensors %} + +- Base Station Status +- Motion + +#### {% linkable_title Sensors %} + +- Heart rate +- Oxygen level ### {% linkable_title Configuration %} @@ -44,21 +57,5 @@ name: {% endconfiguration %}

-The intended purpose of this component is to enable data logging and automations -such as battery status updates and charging reminders. This component should not -replace the Owlet app nor should it be used for life-critical notifications. +The intended purpose of this component is to enable data logging and automations such as battery status updates and charging reminders. This component should not replace the Owlet app nor should it be used for life-critical notifications.

- -Configuring this component will enable tracking of heart rate, oxygen -level, motion, and base station connection status. Battery status is available -as an attribute on oxygen and heart rate sensors. - -This component enables the following platforms automatically: - -#### Binary Sensors -- Base Station Status -- Motion - -#### Sensors -- Heart rate -- Oxygen level \ No newline at end of file From f17e397588b6c355467534dd4563944b54bc0e1d Mon Sep 17 00:00:00 2001 From: Andrew Sayre <6730289+andrewsayre@users.noreply.github.com> Date: Sun, 17 Feb 2019 04:28:24 -0600 Subject: [PATCH 19/64] Add SmartThings troubleshooting steps and demo video (#8609) * Add troubleshooting and fan video * Minor changes --- source/_components/smartthings.markdown | 64 ++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/source/_components/smartthings.markdown b/source/_components/smartthings.markdown index 2df31934330..60de6c4f629 100644 --- a/source/_components/smartthings.markdown +++ b/source/_components/smartthings.markdown @@ -44,6 +44,13 @@ Samsung SmartThings is integrated into Home Assistant through the SmartThings Cl 3. Support for multiple SmartThings accounts and locations, each represented as a unique integration in the front-end configuration. 4. No brokers, bridges, or additional dependencies. +See it in action, with a step-by-step setup guide, thanks to a fan! (v0.87 featured): + +
+ +
+ + ## {% linkable_title Basic requirements %} 1. A [personal access token](https://account.smartthings.com/tokens) tied to a Samsung or SmartThings account (see below for instructions). @@ -83,6 +90,8 @@ The SmartThings component is configured exclusively through the front-end. Manua Advanced: If you have multiple locations in SmartThings, each can be integrated into Home Assistant. Follow the steps above, then for each subsequent location, install the SmartApp and it will automatically add to Home Assistant. This can be completed during step 3 (install SmartApp) above or at any time after that.

+See the [troubleshooting](#troubleshooting) if you are having issues setting up the integration. + ## {% linkable_title Events %} The SmartThings component triggers events for select device capabilities. @@ -109,6 +118,8 @@ The component will trigger an event when a device with the [button](https://smar `value` | Describes the action taken on the button. See the [button](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Button) capability reference for a list of possible values (not all are supported by every device). `name` | The name given to the device in SmartThings. +Event data payloads are logged at the debug level, see [debugging](#debugging) for more information. + ## {% linkable_title Platforms %} SmartThings represents devices as a set of [capabilities](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html) and the SmartThings component maps those to entity platforms in Home Assistant. A single device may be represented by one or more platforms. @@ -237,4 +248,55 @@ The SmartThings Sensor platform lets your view devices that have sensor-related ### {% linkable_title Switch %} -The SmartThings Switch platform lets you control devices that have the [`switch`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Switch) capability that are not already represented by a more specific platform. \ No newline at end of file +The SmartThings Switch platform lets you control devices that have the [`switch`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Switch) capability that are not already represented by a more specific platform. + +## {% linkable_title Troubleshooting %} + +### {% linkable_title Setup %} + +Perform the following steps if you receive one of the following error messages while attempting to setup the integration: + +- "SmartThings could not validate the endpoint configured in base_url. Please review the component requirements." +- "Unable to setup the SmartApp. Please try again." + +#### {% linkable_title Checklist %} + +1. Ensure `base_url` is properly set to the _external address_ that Home Assistant is available to the internet. SmartThings must be able to reach this address. +1. Validate there are no problems with your certificate or SSL configuration by using an online checker, such as [https://www.digicert.com/help/](https://www.digicert.com/help/). +1. Some reverse proxy configuration settings can interfere with communication from SmartThings. For example, TLSv1.3 is not supported. Setting the supported cipher suite too restrictly will prevent handshaking. The following NGINX SSL configuration is known to work: + ```nginx + # cert.crt also contains intermediate certificates + ssl_certificate /path/to/cert.crt; + ssl_certificate_key /path/to/cert.key; + ssl_dhparam /path/to/dhparam.pem; + ssl_protocols TLSv1.2; + ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH'; + ssl_prefer_server_ciphers on; + ssl_ecdh_curve secp384r1; + ssl_session_timeout 10m; + ssl_session_cache shared:SSL:10m; + ssl_session_tickets off; + ``` +1. While the error message (above) is being displayed, run the following command from outside your local network to confirm it is responding to the ping lifecycle event: + ```bash + curl -X POST https://{BASE_URL}/api/webhook/{WEBHOOK_ID} -H "Content-Type: application/json; charset=utf-8" -d $'{"lifecycle": "PING", "executionId": "00000000-0000-0000-0000-000000000000", "locale": "en", "version": "1.0.0", "pingData": { "challenge": "00000000-0000-0000-0000-000000000000"}}' + ``` + Where `{BASE_URL}` is your external address and `{WEBHOOK_ID}` is the value of `webhook_id` from `.storage/smartthings` in your Home Assistant configuration directory. + + The expected response is: + ```bash + {"pingData": {"challenge": "00000000-0000-0000-0000-000000000000"}} + ``` + +If you have completed the checklist above and are still unable to setup the platform, [activate debug logging](#debugging) for the SmartThings component and include the log messages up until the point of failure in [a new issue](https://github.com/home-assistant/home-assistant/issues). + +### {% linkable_title Debugging %} + +The SmartThings component will log additional information about push updates received, events fired, and other messages when the log level is set to `debug`. Add the the relevent line below to the `configuration.yaml`: + +```yaml +logger: + default: info + logs: + homeassistant.components.smartthings: debug +``` From b9e7f41b76ef08b20ff288167b2891743b725fe5 Mon Sep 17 00:00:00 2001 From: akloeckner Date: Sun, 17 Feb 2019 11:29:22 +0100 Subject: [PATCH 20/64] Add hint on how to restart on crash (#8610) I was experiencing crashes, when I requested too many data points for plotting. So, this configuration makes my system come back automatically. --- source/_docs/autostart/systemd.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_docs/autostart/systemd.markdown b/source/_docs/autostart/systemd.markdown index 450ee5a8a20..30faef2d122 100644 --- a/source/_docs/autostart/systemd.markdown +++ b/source/_docs/autostart/systemd.markdown @@ -134,3 +134,11 @@ When working on Home Assistant, you can easily restart the system and then watch $ sudo systemctl restart home-assistant@YOUR_USER && sudo journalctl -f -u home-assistant@YOUR_USER ``` +### {% linkable_title Automatically restarting Home Assistant on failure %} + +If you want to restart the Home Assistant service automatically after a crash, add the following lines to the `[Service]` section of your unit file: + +``` +Restart=on-failure +RestartSec=5s +``` From 956e9a2f43dcdeaa9579c9157952bae82167673f Mon Sep 17 00:00:00 2001 From: Daniel Perna Date: Sun, 17 Feb 2019 12:32:20 +0100 Subject: [PATCH 21/64] Add documentation for Netatmo webhooks (#8463) Add documentation for Netatmo webhooks --- source/_components/netatmo.markdown | 62 ++++++++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/source/_components/netatmo.markdown b/source/_components/netatmo.markdown index 5bd5aa7481f..8f856e9b691 100644 --- a/source/_components/netatmo.markdown +++ b/source/_components/netatmo.markdown @@ -46,8 +46,13 @@ password: discovery: description: Whether to discover Netatmo devices. Set it to False, if you want to choose which Netatmo device you want to add. required: false - type: string + type: boolean default: true +webhooks: + description: Enable webhooks for instant events of the Welcome and Presence cameras. + required: false + type: boolean + default: false {% endconfiguration %} ### {% linkable_title Get API and Secret Key %} @@ -69,3 +74,58 @@ That's it. You can copy and paste your new `client id` and `client secret` in yo

+ +### {% linkable_title Webhooks %} + +The Welcome and Presence cameras can send instant events to Home Assistant by using webhooks. There are different types of events, each with slightly different data attached. To enable the webhooks add `webhooks: true` to your configuration. It is also required to have your camera enabled in Home Assistant. You can do this either by manually setting up the [platform](https://www.home-assistant.io/components/camera.netatmo/) or by enabeling [discovery](https://www.home-assistant.io/components/netatmo/#discovery). + +To be able to receive events from Netatmo, your Home Assistant instance needs to be accessible from the web ([Hass.io instructions](https://www.home-assistant.io/addons/duckdns/)) and you need to have the base_url configured for the HTTP component ([docs](https://www.home-assistant.io/components/http/#base_url)). + +Events coming in from Netatmo will be available as events in Home Assistant and are fired as netatmo_*, along with their data. You can use this event to trigger automations. + +#### {% linkable_title Events %} + +The following events are available: + +- netatmo_person (Welcome) +- netatmo_movement (Welcome & Presence) +- netatmo_human (Presence) +- netatmo_animal (Presence) +- netatmo_vehicle (Presence) +- netatmo_other (Welcome & Presence) + +All events (except `netatmo_other`) contain the following attributes: + +| Attribute | Description | +| --------- | ----------- | +| event_type | Type of event. E.G. `movement`. +| home_name | Name of the home the camera belongs to. +| camera_id | MAC address of the camera. +| message | Message describing what has been seen by the camera. + +The Presence camera additionally has these attributes: + +| Attribute | Description | +| --------- | ----------- | +| snapshot_url | URL to a picture of the full frame of the event. +| vignette_url | URL to a picture cropped down to the area of interest. + +The Welcome camera additionally has these attributes for `netatmo_person` events: + +| Attribute | Description | +| --------- | ----------- | +| id | ID of the person that has been seen. +| name | Name of the person that has been seen. +| is_known | Boolean value if the person is known. +| face_url | URL to a picture of the person. + +The `netatmo_other` event passes all the webhook data through for all webhook events that don't match any of the above. Set the [level of logging](https://www.home-assistant.io/components/logger/) for the `netatmo` component to `debug` to view the data in the Home Assistant logs. + +### {% linkable_title Services (only for webhooks) %} + +There are two services to manually add and drop the webhooks. This might be useful if your webhook has been banned and you want to readd the webhook without restarting Home Assistant. + +| Service | Description | +| ------- | ----------- | +| addwebhook | Subscribe to webhooks. By default the automatically generated URL will be used. But you can pass `{"url": "https://yourdomain.com/yourwebhook/"}` as service data to the service call if you want to use a manually created [webhook trigger](https://www.home-assistant.io/docs/automation/trigger/#webhook-trigger). In this case you have to manually process the data that is sent by Netatmo. +| dropwebhook | Unsubscribe existing webhooks. \ No newline at end of file From 232a86323ba557ff3a09c8b1f795f24919c1dbe0 Mon Sep 17 00:00:00 2001 From: ktnrg45 <38207570+ktnrg45@users.noreply.github.com> Date: Mon, 18 Feb 2019 06:16:59 -0700 Subject: [PATCH 22/64] Add docs for media_player.ps4 component (#8146) * Created docs for media_player.ps4 * Added PlayStation 4 Logo * :pencil2: Tweaks * Updated for Integrations/ Renamed * Update ps4.markdown * Added service docs. * Update services. * typo * Update ps4.markdown * updated docs * Update media_player.ps4.markdown * Update media_player.ps4.markdown * Update media_player.ps4.markdown * Update media_player.ps4.markdown * Update ha_release to 0.89 --- source/_components/media_player.ps4.markdown | 114 +++++++++++++++++++ source/images/supported_brands/ps4.png | Bin 0 -> 3255 bytes 2 files changed, 114 insertions(+) create mode 100644 source/_components/media_player.ps4.markdown create mode 100644 source/images/supported_brands/ps4.png diff --git a/source/_components/media_player.ps4.markdown b/source/_components/media_player.ps4.markdown new file mode 100644 index 00000000000..0db9f0f54fb --- /dev/null +++ b/source/_components/media_player.ps4.markdown @@ -0,0 +1,114 @@ +--- +layout: page +title: "Sony PlayStation 4" +description: "Instructions on how to integrate a Sony PlayStation 4 into Home Assistant." +date: 2019-02-12 01:08 +sidebar: true +comments: false +sharing: true +footer: true +logo: ps4.png +ha_category: Media Player +ha_release: 0.89 +ha_iot_class: "Local Polling" +--- + +The `ps4` component allows you to control a +[Sony PlayStation 4 console](https://www.playstation.com/en-us/explore/ps4/). + +- This component supports controlling a single PlayStation 4 for your instance. Additional consoles may be supported in a future release. + +## {% linkable_title Requirements %} + +- Android or iOS device +- PS4 Second Screen App for [Android](https://play.google.com/store/apps/details?id=com.playstation.mobile2ndscreen&hl=en_US) or [iOS](https://itunes.apple.com/us/app/ps4-second-screen/id1201372796?mt=8) installed on device. + +## {% linkable_title Set up %} + +1. Download the Second Screen App and make sure that you can find and control your PlayStation 4 normally. + +

+ Read the section "Granting Port Access" below before continuing. +

+ +2. Navigate to `Configuration -> Integrations` and select `Configure` for `PlayStation 4`. + +3. Follow instructions displayed to generate user credentials. You will know this step is completed when a form with fields appears. + +4. Pair Home Assistant to your PlayStation 4 by filling in the fields. +- **Note:** To find your correct region refer to the section [Regions](#regions) + +## {% linkable_title Granting Port Access %} + +The PlayStation 4 component requires the use of privileged ports to work correctly, specifically UDP port 987 and TCP port 997. Depending on your OS of your Home Assistant instance you may need to allow usage of privileged ports manually. +Home Assistant installed on a Debian-type OS for example, such as *Debian*, *Hassbian*, *Rassbian*, and *Armbian* may require configuration. + +

+ Do not run your Home Assistant instance itself as root or with root/sudo privileges to accomplish this. This would create a security risk for your host system. +

+ +There are varying methods to perform this, dependent on your OS that is running Home Assistant. Specifically, your *Python Interpreter* which runs your Home Assistant instance needs access to the mentioned ports. + +

+ If your Home Assistant device is running Hass.io on HassOS, it does not require additional configuration. +

+ +- Example for Debian: +`sudo setcap 'cap_net_bind_service=+ep' /usr/bin/python3.5` +Replace "/usr/bin/python3.5" with your path to Python that is running Home Assistant. + + +## {% linkable_title Configuration %} + +

+ The PlayStation 4 component does not use entries from `configuration.yaml`. You must configure this component by using `Integrations` +

+ +## {% linkable_title Regions %} + +Some titles will have different SKUs in the PlayStation Store database depending on your region. You must select your specific region in the setup in order to retrieve the cover art for such titles correctly. If you do not know your [region](https://www.gamerbraves.com/ps4-games-region-codes-explained/), reference the table below: + +| Region ID | Locales | +| ----------- | ---------------------------------------------- | +| R1 | Bermuda, Canada, United States | +| | and U.S. territories | +| R2 | The Middle East, Western Europe, | +| | Central Europe, Egypt, | +| | French overseas territories, Greenland, | +| | Japan, Lesotho, South Africa and Swaziland | +| R3 | Southeast Asia, Hong Kong, Macau, | +| | South Korea and Taiwan | +| R4 | Australasia, Central America, | +| | the Caribbean, Mexico, Oceania, South America | +| R5 | The rest of Africa, Former Soviet Union, | +| | the Indian subcontinent, Mongolia, North Korea | + +

+ Region 6: Mainland China, is not supported as there is no English database available. +

+ +## {% linkable_title Services %} + +### {% linkable_title Service `send_command` %} + +Emulate button press on PlayStation 4. This emulates the commands available for the PS4 Second Screen App. This is not to be confused with DualShock 4 controller buttons. + +| Service data attribute | Optional | Example | Description | +| ---------------------- | -------- | ---------------------------- | ------------------------------------- | +| `entity_id` | No | `media_player.playstation_4` | The entity id for your PlayStation 4. | +| `command` | No | `ps` | The command you want to send. | + +#### {% linkable_title Available Commands %} + +Full list of supported commands. + +| Command | Button Emulated | +| -------- | ---------------- | +| `ps` | PS (PlayStation) | +| `option` | Option | +| `enter` | Enter | +| `back` | Back | +| `up` | Swipe Up | +| `down` | Swipe Down | +| `left` | Swipe Left | +| `right` | Swipe Right | diff --git a/source/images/supported_brands/ps4.png b/source/images/supported_brands/ps4.png new file mode 100644 index 0000000000000000000000000000000000000000..b3263216f1fb0d1863eb9c77d4b4436d3401a67e GIT binary patch literal 3255 zcmV;o3`p~dP)+xtsyww*cm-t+i9zQ4yg1AZy6{$Ddb z3mo5uKPH{=& zQ6O9trGQhBVL|=}OmejE2etwC0e1tNM1TM)M!T?FmXbQvYNW9suC`r3pJ74t6#~QZ zw=SRU1J(nt0VY`fN=YS+I{^uD3W)w2I=4cbP)OM&+Rw+hon1a~0u!7O)1Dz_E4QxrvJGBfQ@yYy2-d6*jCysqziu>|H z#sK)Oz>G%yPg1HAr1-u9oCtgnxL5>1TeL~S%=0}8?L{IS_PlKZz90~9IOAMaB+$|d z>#ha73Va$^4V+{MWMs4rih@?nocJ^lixd!RKr}$wGMK#MtQs(+sLQOdz8!boXsIV< z)dM`n*y@J8z>650gGw`wpan`*_n{_#&j5BBNFy|a*-k>gKMP+Jh3WIs1mKtg;Zx1VzeVE{bfX*}H> z#sj8cOaR^uJPf=?`U|5vdhodB^Shx3|LO9crmNCg$Hyi~Mi zXfg2))Q(IailV4IMcVm29k>x#Xz*wRTn&6p6s8@*?Fa#hTa;>s1&dNR!{0QtYSz3% zRtTvVU@lZ;?CdfILarfx4Oa(p(TxJRJ zL%=5lR?#G2lQlTfatjise4d6I)h5hxnK3c#vLJJT9{{f?7|xlN;}MDAJm3))O=#ns zns7M;K716mEB$}yrAG0p(69kqA=7Q=y$JkLox=2!b-F9f~~EHlPk2Yw2C*zi3od7SN5 z3P@lrn*MvDnER!`8)Xq!rVtE0;2TgCvkOp3s~*uD4+H;ZY(_RPoaD&E0tZd{x)N2| zVGGC4#fkoB3m0v`F~+C~EJ_2Fh7&-nz@wmPC|(!dTO*Kls$n&@2x{2q7@Z1G}lhx z0#v>rYO$8BwD29>6ulDhA`;AWS*T$bkxR z*L8AVvtq?(q}|&DLJi3kSEJ-Q*ungKNO1c3j6S*199P!;)aS;GVYLN6(;RTo3H#dh zXNz#}0a+f??=0h~%5{;fycqw;8NI_z!@D`+=sgNtDAAcPr{>1dFWvWNIWp*2 zT9*scJas1U2MM?wD|6c?|DOl^hGMo+WI_`fVx0hd3$-s`qQeYVEOTro@YVu9Llum5 zr(nLiTvZF!ndbCvRKn;l;diz*RWX7EJ?_#-MqzRS3$?untR)|kxxPKbGC%?enI`ErpsOuaE!FR+~H z$57?a>qS7!HeD$f%4WC&V!7^=$kvmN`?Y`42>-A4Bp^p>aik8VpKdXf7LI>qWKxYt zrlB^QoyypX;JLt`X`KJcvJO=df=W!kt_QBPl>AfT`v#3H$ZZl$s53g&Y%=dY@kchu zOK-7!CV4Bt`r>43qLGf*4I`ovv$0$5lR=DynU2h2s8h1$V( zKt4Meb-Kn9F_-!fxWN>QjR;2M@IU6Gl5?*U=eyP*)Mr|uei7!|4NKPU>R;a)F+!DH zER^-i^E)mstiMrwyC8=kgUSz`h1x@3iSaSgZWBlXw}!<(z0+zJ0-q5C6z4(=iVyyM z)Q>=&2i#FZ?at~Et$TvukZX;+5_g8&He;2H6WT3SY%%JD_gTjCD-H~6Mz9V_Zr{1%@Qnlg3%{5R;|8=9)%=y^e-w{KJQM-zupT}*ihbqwb9V)BLNhNur{{s|kDA>YL{s{m8002ovPDHLkV1mA2-NFC> literal 0 HcmV?d00001 From 1f91ee005c36f35e8e0867466135b70ced8ff3c6 Mon Sep 17 00:00:00 2001 From: Rohan Kapoor Date: Mon, 18 Feb 2019 11:23:56 -0800 Subject: [PATCH 23/64] Deprecate conf_update_interval (#8603) --- source/_components/fastdotcom.markdown | 10 +++++----- source/_components/freedns.markdown | 2 +- source/_components/nissan_leaf.markdown | 4 ++-- source/_components/sensor.broadlink.markdown | 6 +++--- source/_components/sensor.darksky.markdown | 6 +++--- source/_components/sensor.fedex.markdown | 8 ++++---- source/_components/sensor.ups.markdown | 8 ++++---- source/_components/snips.markdown | 2 +- source/_components/speedtestdotnet.markdown | 10 +++++----- source/_components/tellduslive.markdown | 8 ++++---- 10 files changed, 32 insertions(+), 32 deletions(-) diff --git a/source/_components/fastdotcom.markdown b/source/_components/fastdotcom.markdown index c665142808b..6a9f1c32aa7 100644 --- a/source/_components/fastdotcom.markdown +++ b/source/_components/fastdotcom.markdown @@ -26,7 +26,7 @@ Currently fast.com only supports measuring download bandwidth. If you want to me Enabling this component will automatically create the Fast.com Sensor. -By default, a speed test will be run every hour. The user can change the update frequency in the configuration by defining the `update_interval` for a speed test to run. +By default, a speed test will be run every hour. The user can change the update frequency in the configuration by defining the `scan_interval` for a speed test to run. ## {% linkable_title Configuration %} @@ -42,13 +42,13 @@ Every half hour of every day: ```yaml fastdotcom: - update_interval: + scan_interval: minutes: 30 ``` {% configuration %} -update_interval: - description: "Minimum time interval between updates. Supported formats: `update_interval: 'HH:MM:SS'`, `update_interval: 'HH:MM'` and Time period dictionary (see example below)." +scan_interval: + description: "Minimum time interval between updates. Supported formats: `scan_interval: 'HH:MM:SS'`, `scan_interval: 'HH:MM'` and Time period dictionary (see example below)." required: false default: 60 minutes type: time @@ -62,7 +62,7 @@ manual: #### {% linkable_title Time period dictionary example %} ```yaml -update_interval: +scan_interval: # At least one of these must be specified: days: 0 hours: 0 diff --git a/source/_components/freedns.markdown b/source/_components/freedns.markdown index 0f128208110..73c2160c7a9 100644 --- a/source/_components/freedns.markdown +++ b/source/_components/freedns.markdown @@ -44,7 +44,7 @@ freedns: description: The full update URL. This is exclusive to `access_token`. required: false type: string - update_interval: + scan_interval: description: How often to call the update service. required: false type: time period diff --git a/source/_components/nissan_leaf.markdown b/source/_components/nissan_leaf.markdown index 3efd61cc4f6..5a1c4ce801a 100644 --- a/source/_components/nissan_leaf.markdown +++ b/source/_components/nissan_leaf.markdown @@ -48,7 +48,7 @@ nissan_connect: description: If your car has the updated head unit (NissanConnect rather than Carwings) then the location can be aquired and exposed via a device tracker. If you have a pre-2014 24 kWh Leaf then you will have Carwings and this should be set to false. required: false type: boolean -update_interval: +scan_interval: description: The interval between updates if the climate control is off and the car is not charging. Set in any time unit (e.g. minutes, hours, days!). required: false default: 1 hour @@ -76,7 +76,7 @@ nissan_leaf: password: "YOUR_PASSWORD" region: "YOUR_REGION" nissan_connect: true - update_interval: + scan_interval: hours: 1 update_interval_charging: minutes: 15 diff --git a/source/_components/sensor.broadlink.markdown b/source/_components/sensor.broadlink.markdown index 4688cf2aa03..2b8e534ef30 100644 --- a/source/_components/sensor.broadlink.markdown +++ b/source/_components/sensor.broadlink.markdown @@ -33,7 +33,7 @@ Configuration options: - **host** (*Required*): The hostname/IP address to connect to. - **mac** (*Required*): Device mac address. - **name** (*Optional*): Default BL. Sensor name -- **update_interval** (*Optional*): Time in seconds to fetch data from sensors. Default 300. +- **scan_interval** (*Optional*): Time in seconds to fetch data from sensors. Default 300. - **timeout** (*Optional*): Timeout in seconds for the connection to the device. - **monitored_conditions** array (*Required*): States to monitor. - 'temperature' @@ -49,7 +49,7 @@ Obtain sensor data from an A1: ```yaml sensor: - platform: broadlink - update_interval: 60 + scan_interval: 60 host: IP_ADDRESS mac: 'MAC_ADDRESS' monitored_conditions: @@ -65,7 +65,7 @@ Obtain temperature data from an RM2: ```yaml sensor: - platform: broadlink - update_interval: 60 + scan_interval: 60 host: IP_ADDRESS mac: 'MAC_ADDRESS' monitored_conditions: diff --git a/source/_components/sensor.darksky.markdown b/source/_components/sensor.darksky.markdown index bedf4fe225f..71f7d10f668 100644 --- a/source/_components/sensor.darksky.markdown +++ b/source/_components/sensor.darksky.markdown @@ -143,8 +143,8 @@ units: required: false default: "`si` or `us`, based on the temperature preference in Home Assistant." type: string -update_interval: - description: "Minimum time interval between updates. Supported formats: `update_interval: 'HH:MM:SS'`, `update_interval: 'HH:MM'` and Time period dictionary (see example below)." +scan_interval: + description: "Minimum time interval between updates. Supported formats: `scan_interval: 'HH:MM:SS'`, `scan_interval: 'HH:MM'` and Time period dictionary (see example below)." required: false default: 2 minutes type: time @@ -153,7 +153,7 @@ update_interval: #### {% linkable_title Time period dictionary example %} ```yaml -update_interval: +scan_interval: # At least one of these must be specified: days: 0 hours: 0 diff --git a/source/_components/sensor.fedex.markdown b/source/_components/sensor.fedex.markdown index 00e8a6c1b62..d19e870756f 100644 --- a/source/_components/sensor.fedex.markdown +++ b/source/_components/sensor.fedex.markdown @@ -32,11 +32,11 @@ Configuration options for the FedEx Sensor: - **username** (*Required*): The username to access the FedEx Delivery Manager service. - **password** (*Required*): The password for the given username. - **name** (*Optional*): Name the sensor. -- **update_inverval** (*Optional*): Minimum time interval between updates. Default is 1 hour. Supported formats: - - `update_interval: 'HH:MM:SS'` - - `update_interval: 'HH:MM'` +- **scan_inverval** (*Optional*): Minimum time interval between updates. Default is 1 hour. Supported formats: + - `scan_interval: 'HH:MM:SS'` + - `scan_interval: 'HH:MM'` - Time period dictionary, e.g.: -
update_interval:
+    
scan_interval:
         # At least one of these must be specified:
         days: 0
         hours: 0
diff --git a/source/_components/sensor.ups.markdown b/source/_components/sensor.ups.markdown
index 0c78dac2067..2b57a0e2663 100644
--- a/source/_components/sensor.ups.markdown
+++ b/source/_components/sensor.ups.markdown
@@ -32,11 +32,11 @@ Configuration options for the UPS Sensor:
 - **username** (*Required*): The username to access the UPS My Choice service.
 - **password** (*Required*): The password for the given username.
 - **name** (*Optional*): Name the sensor.
-- **update_inverval** (*Optional*): Minimum time interval between updates. Default is 1 hour. Supported formats:
-  - `update_interval: 'HH:MM:SS'`
-  - `update_interval: 'HH:MM'`
+- **scan_inverval** (*Optional*): Minimum time interval between updates. Default is 1 hour. Supported formats:
+  - `scan_interval: 'HH:MM:SS'`
+  - `scan_interval: 'HH:MM'`
   - Time period dictionary, e.g.:
-    
update_interval:
+    
scan_interval:
         # At least one of these must be specified:
         days: 0
         hours: 0
diff --git a/source/_components/snips.markdown b/source/_components/snips.markdown
index edb894e6e1d..3b3be76e9e0 100644
--- a/source/_components/snips.markdown
+++ b/source/_components/snips.markdown
@@ -277,7 +277,7 @@ So now you can open and close your garage door, let's check the weather. Add the
 - platform: darksky
   name: "Dark Sky Weather"
   api_key: !secret dark_sky_key
-  update_interval:
+  scan_interval:
     minutes: 10
   monitored_conditions:
     - summary
diff --git a/source/_components/speedtestdotnet.markdown b/source/_components/speedtestdotnet.markdown
index f4898d452a1..a6386845bb3 100644
--- a/source/_components/speedtestdotnet.markdown
+++ b/source/_components/speedtestdotnet.markdown
@@ -23,7 +23,7 @@ The `speedtestdotnet` component uses the [Speedtest.net](https://speedtest.net/)
 
 Enabling this component will automatically create the Speedtest.net Sensors for the monitored conditions (below).
 
-By default, a speed test will be run every hour. The user can change the update frequency in the configuration by defining the `update_interval` for a speed test to run.
+By default, a speed test will be run every hour. The user can change the update frequency in the configuration by defining the `scan_interval` for a speed test to run.
 
 ## {% linkable_title Configuration %}
 
@@ -56,8 +56,8 @@ speedtestdotnet:
     description: Specify the speed test server to perform the test against.
     required: false
     type: integer
-  update_interval:
-    description: "Minimum time interval between updates. Supported formats: `update_interval: 'HH:MM:SS'`, `update_interval: 'HH:MM'` and Time period dictionary (see example below)."
+  scan_interval:
+    description: "Minimum time interval between updates. Supported formats: `scan_interval: 'HH:MM:SS'`, `scan_interval: 'HH:MM'` and Time period dictionary (see example below)."
     required: false
     default: 60 minutes
     type: time
@@ -72,7 +72,7 @@ speedtestdotnet:
 #### {% linkable_title Time period dictionary example %}
 
 ```yaml
-update_interval:
+scan_interval:
   # At least one of these must be specified:
   days: 0
   hours: 0
@@ -112,7 +112,7 @@ Every half hour of every day:
 ```yaml
 # Example configuration.yaml entry
 speedtestdotnet:
-  update_interval:
+  scan_interval:
     minutes: 30
   monitored_conditions:
     - ping
diff --git a/source/_components/tellduslive.markdown b/source/_components/tellduslive.markdown
index 665f8845199..266cef58007 100644
--- a/source/_components/tellduslive.markdown
+++ b/source/_components/tellduslive.markdown
@@ -8,7 +8,7 @@ comments: false
 sharing: true
 footer: true
 logo: tellduslive.svg
-ha_category: 
+ha_category:
   - Hub
   - Binary Sensor
   - Cover
@@ -50,15 +50,15 @@ host:
   description: Host address to Tellstick Net or Tellstick ZNet for Local API, only useful when automatic discovery is not enabled.
   required: false
   type: string
-update_interval:
+scan_interval:
   description: Interval (in seconds) for polling the Telldus Live server (or the local server).
   required: false
   type: integer
   default: 60
 {% endconfiguration %}
 
-

-It is only possible to configure the `update_interval` when setting up the device. If the polling interval needs to be changed after the device is configured it must be changed manually by changing `"scan_interval": 60,` for the device in the file `.storage/core.config_entries`. +

+It is only possible to configure the `scan_interval` when setting up the device. If the polling interval needs to be changed after the device is configured it must be changed manually by changing `"scan_interval": 60,` for the device in the file `.storage/core.config_entries`.

The component will offer configuration through the Home Assistant user interface where it will let you associate it with your Telldus Live account. From 7abcaad61200701353a66ef1580a1b07bb0d92f1 Mon Sep 17 00:00:00 2001 From: zewelor Date: Tue, 19 Feb 2019 19:06:43 +0100 Subject: [PATCH 24/64] Add yeelight flow action param support (#8628) --- source/_components/light.yeelight.markdown | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/source/_components/light.yeelight.markdown b/source/_components/light.yeelight.markdown index 9e6ca94dcae..198c2b7038c 100644 --- a/source/_components/light.yeelight.markdown +++ b/source/_components/light.yeelight.markdown @@ -158,6 +158,7 @@ Start flow with specified transitions |---------------------------|----------|---------------------------------------------------------------------------------------------| | `entity_id` | no | Only act on a specific lights. | | `count` | yes | The number of times to run this flow (0 to run forever). | +| `action` | yes | The action to take after the flow stops. Can be 'recover', 'stay', 'off'. Default 'recover' | | `transitions` | no | Array of transitions. See [examples below](#custom-effects). | ## {% linkable_title Examples %} @@ -196,11 +197,11 @@ light: ### {% linkable_title Custom effects %} -This example shows how you can add your custom effects in your configuration. +This example shows how you can add your custom effects in your configuration. To turn on the effect you can use [light.turn_on](/components/light/#service-lightturn_on) service. Possible transitions are `RGBTransition`, `HSVTransition`, `TemperatureTransition`, `SleepTransition`. - where the array values are as per the following: +Where the array values are as per the following: - RGBTransition: [red, green, blue, duration, brightness] with red / green / blue being an integer between 0 and 255, duration being in milliseconds (minimum of 50) and final brightness to transition to 0-100 (%) - HSVTransition: [hue, saturation, duration, brightness] with hue being an integer between 0 and 359, saturation 0 -100, duration in milliseconds (minimum 50) and final brightness 0-100 (%) - TemperatureTransition: [temp, duration, brightness] with temp being the final color temperature between 1700 and 6500, duration in milliseconds (minimum 50) and final brightness to transition to 0-100 (%) From ce70167423e9b013a5d150101636ecd51bac0d32 Mon Sep 17 00:00:00 2001 From: Robert Svensson Date: Wed, 20 Feb 2019 14:10:08 +0100 Subject: [PATCH 25/64] deCONZ climate support (#8424) * Add documentation for deCONZ climate * Mark deCONZ as supporting config flow * Move climate documentation in line with the rest of deconz platforms * Removed too much * :pencil2: Tweak * Add shortcut to climate section --- source/_components/deconz.markdown | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/source/_components/deconz.markdown b/source/_components/deconz.markdown index e9f3819c529..4fcd99d1457 100644 --- a/source/_components/deconz.markdown +++ b/source/_components/deconz.markdown @@ -19,8 +19,10 @@ ha_category: ha_release: "0.61" ha_iot_class: "Local Push" ha_qa_scale: platinum +ha_config_flow: true redirect_from: - /components/binary_sensor.deconz/ + - /components/climate.deconz/ - /components/cover.deconz/ - /components/light.deconz/ - /components/scene.deconz/ @@ -34,12 +36,13 @@ redirect_from: There is currently support for the following device types within Home Assistant: -- [Binary Sensor](/components/deconz/#binary-sensor) -- [Cover](/components/deconz/#cover) -- [Light](/components/deconz/#light) -- [Scene](/components/deconz/#scene) -- [Sensor](/components/deconz/#sensor) -- [Switch](/components/deconz/#switch) +- [Binary Sensor](#binary-sensor) +- [Climate](#climate) +- [Cover](#cover) +- [Light](#light) +- [Scene](#scene) +- [Sensor](#sensor) +- [Switch](#switch) ## {% linkable_title Recommended way of running deCONZ %} @@ -323,6 +326,21 @@ The `entity_id` name will be `binary_sensor.device_name`, where `device_name` is - Xiaomi Motion Sensor - Xiaomi Smart Home Aqara Human Body Sensor +## {% linkable_title Climate %} + +See the [deCONZ main component](/components/deconz/) for configuration instructions. + +Climate currently represent thermostats. + +Note that devices in the climate platform identify as sensors, so there is a manually curated list that defines which "sensors" are climate devices. + +The `entity_id` name will be `climate.device_name`, where `device_name` is defined in deCONZ. + +#### {% linkable_title Verified supported climate devices %} + +- Bitron Thermostat 902010/32 +- Eurotronic SPZB0001 + ## {% linkable_title Cover %} Covers are devices like ventilation dampers or smart window covers. From bc9c8a2a9bb5bf6940a1d4a065b6eb86632a59b0 Mon Sep 17 00:00:00 2001 From: Gido Date: Thu, 21 Feb 2019 15:51:17 +0100 Subject: [PATCH 26/64] Add suffix to house_number (#8624) * Add suffix to house_number **Description:** **Pull request in [home-assistant](https://github.com/home-assistant/home-assistant) (if applicable):** home-assistant/home-assistant#21182 * Update sensor.rova.markdown --- source/_components/sensor.rova.markdown | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/source/_components/sensor.rova.markdown b/source/_components/sensor.rova.markdown index 226c0ca6b55..9894a97afe8 100644 --- a/source/_components/sensor.rova.markdown +++ b/source/_components/sensor.rova.markdown @@ -36,6 +36,10 @@ house_number: description: Your house number. required: true type: string +house_number_suffix: + description: A suffix for your house number. + required: false + type: string name: description: Let you overwrite the name of the device in the frontend. required: false @@ -68,6 +72,7 @@ sensor: - platform: rova zip_code: ZIP_CODE house_number: HOUSE_NUMBER + house_number_suffix: HOUSE_NUMBER_SUFFIX name: Rova monitored_conditions: - bio @@ -99,3 +104,7 @@ automation: message: 'Reminder: put out biowaste bin' ``` {% endraw %} + +

+This component is not affiliated with Rova and retrieves data from the endpoints of their website. Use at your own risk. +

From 81ac4bde9d730745882ffb20b1ce6bdfa1fe03f0 Mon Sep 17 00:00:00 2001 From: Joakim Plate Date: Fri, 22 Feb 2019 16:36:22 +0100 Subject: [PATCH 27/64] Remove invalid configuration parameter (#8688) Fix for https://github.com/home-assistant/home-assistant/issues/21300 --- source/_components/remote.itach.markdown | 5 ----- 1 file changed, 5 deletions(-) diff --git a/source/_components/remote.itach.markdown b/source/_components/remote.itach.markdown index fcdbc308265..35fcf4e200d 100644 --- a/source/_components/remote.itach.markdown +++ b/source/_components/remote.itach.markdown @@ -23,7 +23,6 @@ To use your iTach remote in your installation, you will need to know the IR comm # Example configuration.yaml entry remote: - platform: itach - name: Living Room host: itach023fdc devices: - name: TV @@ -36,10 +35,6 @@ remote: ``` {% configuration %} -name: - description: The iTach's name to display in the front end. - required: false - type: string host: description: The iTach's IP address. required: true From 9e5887dac0ad334e45347779b1e1faa4c29f0c8f Mon Sep 17 00:00:00 2001 From: Teemu R Date: Fri, 22 Feb 2019 17:12:30 +0100 Subject: [PATCH 28/64] Add documentation for TP-Link Smart Home devices (#7338) * Update tplink documentation * Make configuration linkable, add documentation for list elements * :pencil2: Tweaks * Add KL series of bulbs from #8134 * Add LB230 from #8090 * Add extracting energy sensor data from the switch platform * fix indent * add 0.89 for version * re-add HS103 --- source/_components/tplink.markdown | 133 ++++++++++++++++++++ source/_docs/configuration/devices.markdown | 5 +- 2 files changed, 134 insertions(+), 4 deletions(-) create mode 100644 source/_components/tplink.markdown diff --git a/source/_components/tplink.markdown b/source/_components/tplink.markdown new file mode 100644 index 00000000000..e32f37d9ec4 --- /dev/null +++ b/source/_components/tplink.markdown @@ -0,0 +1,133 @@ +--- +layout: page +title: "TP-Link Smart Home Devices" +description: "Instructions on integrating TP-Link Smart Home Devices to Home Assistant." +date: 2018-09-12 13:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: tp-link.png +ha_category: Hub +featured: false +ha_release: 0.89 +ha_iot_class: "Local Polling" +redirect_from: + - /components/switch.tplink/ + - /components/light.tplink/ +--- + +The `tplink` component allows you to control your [TP-Link Smart Home Devices](https://www.tp-link.com/kasa-smart/) such as smart plugs and smart bulbs. + +In order to activate the support, you will have to enable the integration inside the config panel. +The supported devices in your network are automatically discovered, but if you want to control devices residing in other networks you will need to configure them manually as shown below. + +## {% linkable_title Supported Devices %} + +This component supports devices that are controllable with the [KASA app](https://www.tp-link.com/us/kasa-smart/kasa.html). +The following devices are known to work with this component. + +### {% linkable_title Plugs %} + +- HS100 +- HS103 +- HS105 +- HS110 + +### {% linkable_title Wall Switches %} + +- HS200 +- HS210 +- HS220 (acts as a light) + +### {% linkable_title Bulbs %} + +- LB100 +- LB110 +- LB120 +- LB130 +- LB230 +- KL110 +- KL120 +- KL130 + +## {% linkable_title Configuration %} + +```yaml +# Example configuration.yaml +tplink: +``` + +{% configuration %} +discovery: + description: Whether to do automatic discovery of devices. + required: false + type: boolean + default: true +light: + description: List of light devices. + required: false + type: list + keys: + host: + description: Hostname or IP address of the device. + required: true + type: string +switch: + description: List of switch devices. + required: false + type: list + keys: + host: + description: Hostname or IP address of the device. + required: true + type: string +{% endconfiguration %} + +## {% linkable_title Manual configuration example %} + +```yaml +# Example configuration.yaml entry with manually specified addresses +tplink: + discovery: false + light: + - host: 192.168.200.1 + - host: 192.168.200.2 + switch: + - host: 192.168.200.3 + - host: 192.168.200.4 +``` + +## {% linkable_title Extracting Energy Sensor data %} + +In order to get the power consumption readings from supported devices, you'll have to create a [template sensor](/components/switch.template/). +In the example below, change all of the `my_tp_switch`'s to match your device's entity ID. + +{% raw %} +```yaml +sensor: + - platform: template + sensors: + my_tp_switch_amps: + friendly_name_template: "{{ states.switch.my_tp_switch.name}} Current" + value_template: '{{ states.switch.my_tp_switch.attributes["current_a"] | float }}' + unit_of_measurement: 'A' + my_tp_switch_watts: + friendly_name_template: "{{ states.switch.my_tp_switch.name}} Current Consumption" + value_template: '{{ states.switch.my_tp_switch.attributes["current_power_w"] | float }}' + unit_of_measurement: 'W' + my_tp_switch_total_kwh: + friendly_name_template: "{{ states.switch.my_tp_switch.name}} Total Consumption" + value_template: '{{ states.switch.my_tp_switch.attributes["total_energy_kwh"] | float }}' + unit_of_measurement: 'kWh' + my_tp_switch_volts: + friendly_name_template: "{{ states.switch.my_tp_switch.name}} Voltage" + value_template: '{{ states.switch.my_tp_switch.attributes["voltage"] | float }}' + unit_of_measurement: 'V' + my_tp_switch_today_kwh: + friendly_name_template: "{{ states.switch.my_tp_switch.name}} Today's Consumption" + value_template: '{{ states.switch.my_tp_switch.attributes["today_energy_kwh"] | float }}' + unit_of_measurement: 'kWh' +``` +{% endraw %} + diff --git a/source/_docs/configuration/devices.markdown b/source/_docs/configuration/devices.markdown index 6aedad89483..61b2213feda 100644 --- a/source/_docs/configuration/devices.markdown +++ b/source/_docs/configuration/devices.markdown @@ -37,8 +37,6 @@ sensor: switch: - platform: vera - - platform: tplink - host: IP_ADDRESS ``` ## {% linkable_title Style 2: List each device separately %} @@ -65,8 +63,7 @@ switch 1: platform: vera switch 2: - platform: tplink - host: IP_ADDRESS + platform: vera ``` ## {% linkable_title Grouping devices %} From 7aabe522f357dd4878fac8681287ee4192d93857 Mon Sep 17 00:00:00 2001 From: Daniel Shokouhi Date: Sat, 23 Feb 2019 01:01:47 -0800 Subject: [PATCH 29/64] Allow user to disable device tracker (#8701) Useful for users who only wish to track alarms or only track devices from specific google home units. --- source/_components/googlehome.markdown | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/_components/googlehome.markdown b/source/_components/googlehome.markdown index ba1d6e9954b..c0644592aed 100644 --- a/source/_components/googlehome.markdown +++ b/source/_components/googlehome.markdown @@ -59,6 +59,11 @@ devices: required: false type: boolean default: false + track_devices: + description: Setting to tell the component to track nearby devices. + required: false + type: boolean + default: true {% endconfiguration %} ## {% linkable_title Device types %} From eac4f792e59070a2aaafe2ef2eb0ef1de3ac842a Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 23 Feb 2019 16:38:53 +0100 Subject: [PATCH 30/64] Add freedaily option (#8708) --- source/_components/weather.openweathermap.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/weather.openweathermap.markdown b/source/_components/weather.openweathermap.markdown index 1d83077ef80..6bebcff19f3 100644 --- a/source/_components/weather.openweathermap.markdown +++ b/source/_components/weather.openweathermap.markdown @@ -39,7 +39,7 @@ name: type: string default: OpenWeatherMap mode: - description: "Can specify `hourly` or `daily`. Select `hourly` for a three-hour forecast or `daily` for daily forecast." + description: "Can specify `hourly`, `daily` of `freedaily`. Select `hourly` for a three-hour forecast, `daily` for daily forecast or `freedaily` for a five days forecast with the free tier." required: false type: string default: "`hourly`" From 469973df47b5f6dda09c9a77fa4585354dd58489 Mon Sep 17 00:00:00 2001 From: philipperequile Date: Sat, 23 Feb 2019 17:37:43 +0100 Subject: [PATCH 31/64] Added 2 new PLC types DINT and UDINT (#8700) 1) added 2 new PLC types. 2) Correction in the configuration.yaml example: port is typically 801 or 851, not 48898 (48898 is the TCP port on the PLC. 801 (twincat 2) or 851 (twincat 3) are the default ADS ports under which the PLC runtime is accessible. --- source/_components/ads.markdown | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/_components/ads.markdown b/source/_components/ads.markdown index 735fbded017..599086ef75a 100644 --- a/source/_components/ads.markdown +++ b/source/_components/ads.markdown @@ -40,7 +40,7 @@ To enable ADS, add the following lines to your `configuration.yaml` file: # Example configuration.yaml entry ads: device: '127.0.0.1.1.1' - port: 48898 + port: 801 ``` {% configuration %} @@ -137,7 +137,7 @@ name: ## {% linkable_title Sensor %} -The `ads` sensor platform allows reading the value of a numeric variable on your ADS device. The variable can be of type *INT*, *UINT* or *BYTE*. +The `ads` sensor platform allows reading the value of a numeric variable on your ADS device. The variable can be of type *INT*, *UINT*, *BYTE*, *DINT* or *UDINT*. To use your ADS device, you first have to set up your [ADS hub](/components/ads/) and then add the following to your `configuration.yaml` file: @@ -158,7 +158,7 @@ adsvar: type: string adstype: required: false - description: The datatype of the ADS variable, possible values are int, uint, byte. + description: The datatype of the ADS variable, possible values are int, uint, byte, dint, udint. default: int type: string name: @@ -197,4 +197,4 @@ name: required: false description: An identifier for the switch in the frontend. type: string -{% endconfiguration %} \ No newline at end of file +{% endconfiguration %} From 407628099b4b0f9592ab2e07b1829c55681062ce Mon Sep 17 00:00:00 2001 From: Gamester17 Date: Sat, 23 Feb 2019 22:58:13 +0100 Subject: [PATCH 32/64] Update zha.markdown to mention ZHA Device Handlers (#8681) * Update zha.markdown to mention ZHA Device Handlers Update zha.markdown to mention the ZHA Device Handlers (a.k.a. ZHA quirks handler) by @dmulcahey This proposes adding text: "Zigbee devices that deviate or do not fully conform from standard specification set by the [Zigbee Alliance](https://www.zigbee.org) may require the development of custom [ZHA Device Handlers](https://github.com/dmulcahey/zha-device-handlers) (a.k.a. ZHA quirks handler implementation) to for all their functions to work properly with the ZHA component in Home Assistant." * Minor changes --- source/_components/zha.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/_components/zha.markdown b/source/_components/zha.markdown index da056f7a9c3..a48d20b2ecc 100644 --- a/source/_components/zha.markdown +++ b/source/_components/zha.markdown @@ -35,6 +35,10 @@ There is currently support for the following device types within Home Assistant: - Switch - Fan +ZHA exception and deviation handling: + +Zigbee devices that deviate from or do not fully conform to the standard specification set by the [Zigbee Alliance](https://www.zigbee.org) may require the development of custom [ZHA Device Handlers](https://github.com/dmulcahey/zha-device-handlers) (ZHA quirks handler implementation) to for all their functions to work properly with the ZHA component in Home Assistant. + Known working Zigbee radio modules: - EmberZNet based radios using the EZSP protocol (via the [bellows](https://github.com/zigpy/bellows) library for zigpy) From 697c48ff0b27ecdd61c4fab458c9ba4af5e61e4d Mon Sep 17 00:00:00 2001 From: Thibault Maekelbergh Date: Sat, 23 Feb 2019 23:15:27 +0100 Subject: [PATCH 33/64] Update config options for sensor.discogs (#8214) * Update config options for sensor.discogs * Update monitored_conditions --- source/_components/sensor.discogs.markdown | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/source/_components/sensor.discogs.markdown b/source/_components/sensor.discogs.markdown index ec600a21b44..9fa6012fe73 100644 --- a/source/_components/sensor.discogs.markdown +++ b/source/_components/sensor.discogs.markdown @@ -32,6 +32,8 @@ sensor: token: YOUR_TOKEN ``` +The monitored conditions can create a sensor which displays the amount of records currently in your collection and/or wantlist, and an option to pick a random record from your collection. + {% configuration %} token: description: The Discogs API token to use as identification to get your collection. @@ -41,4 +43,15 @@ name: description: Name to use in the frontend. required: false type: string +monitored_conditions: + description: A list of sensor to include. + required: false + type: list + keys: + collection: + description: Shows the amount of records in the user's collection. + wantlist: + description: Shows the amount of records in the user's wantlist. + random_record: + description: Proposes a random record from the collection to play. {% endconfiguration %} From d68d943efebea822a4960867b1b592c69feb67aa Mon Sep 17 00:00:00 2001 From: Jeff Irion Date: Sun, 24 Feb 2019 15:20:27 -0800 Subject: [PATCH 34/64] Add ADB server functionality to the Fire TV component (#8641) --- .../_components/media_player.firetv.markdown | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/source/_components/media_player.firetv.markdown b/source/_components/media_player.firetv.markdown index 69b77283d2f..3078d45b9bd 100644 --- a/source/_components/media_player.firetv.markdown +++ b/source/_components/media_player.firetv.markdown @@ -42,12 +42,11 @@ media_player: host: 192.168.0.222 adbkey: "/config/android/adbkey" - # a device for which getting the current app (source) and the running apps (sources) cause issues + # use an ADB server for sending ADB commands instead of the Python ADB implementation - platform: firetv name: Fire TV 3 host: 192.168.0.123 - get_source: false - get_sources: false + adb_server_ip: 127.0.0.1 ``` {% configuration %} @@ -69,11 +68,15 @@ adbkey: description: The path to your `adbkey` file. Note that the file `adbkey.pub` must be in the same directory. required: false type: string -get_source: - description: Whether or not to retrieve the current app as the source. +adb_server_ip: + description: The IP address of the ADB server. required: false - default: true - type: boolean + type: string +adb_server_port: + description: The port for the ADB server. + required: false + default: 5037 + type: port get_sources: description: Whether or not to retrieve the running apps as the list of sources. required: false @@ -81,6 +84,13 @@ get_sources: type: boolean {% endconfiguration %} +## {% linkable_title ADB Setup %} + +This component works by sending ADB commands to your Fire TV device. There are two ways to accomplish this: + +1. Using the `adb` Python package. If your device requires ADB authentication, you will need to follow the instructions in the "ADB Authentication (for Fire TV devices with recent software)" section below. Once you have an authenticated key, this approach does not require any additional setup or addons. However, users with newer devices may find that the ADB connection is unstable. If setting the `get_sources` configuration option to `false` does not help, they should use the next option. +2. Using an ADB server. For Hass.io users, you can install the [Android Debug Bridge](https://github.com/hassio-addons/addon-adb/blob/v0.1.0/README.md) addon. With this approach, Home Assistant will send the ADB commands to the server, which will then send them to the Fire TV device and report back to Home Assistant. To use this option, add the `adb_server_ip` option to your configuration. If you are running the server on the same machine as Home Assistant, you can use `127.0.0.1` for this value. + ### {% linkable_title ADB Authentication (for Fire TV devices with recent software) %} If you get a "Device authentication required, no keys available" error when trying to set up Fire TV, then you'll need to create an adbkey and add its path to your configuration. Follow the instructions on this page to connect to your Fire TV from your computer: [Connecting to Fire TV Through adb](https://developer.amazon.com/zh/docs/fire-tv/connecting-adb-to-device.html). From 2d93a61b438fc064f61f89379534490908bb5087 Mon Sep 17 00:00:00 2001 From: Andre Lengwenus Date: Mon, 25 Feb 2019 12:33:14 +0100 Subject: [PATCH 35/64] Add documentation for LCN cover platform (#8234) * Add documentation for LCN cover platform * Updated hass version number * Removed old cover.lcn.markdown * Added redirect_from * Update lcn.markdown --- source/_components/lcn.markdown | 41 ++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/source/_components/lcn.markdown b/source/_components/lcn.markdown index 7eb96395b68..1e788904e12 100644 --- a/source/_components/lcn.markdown +++ b/source/_components/lcn.markdown @@ -10,6 +10,7 @@ footer: true logo: lcn.png ha_category: - Hub + - Cover - Light - Switch ha_release: 0.85 @@ -26,6 +27,7 @@ With this setup sending and receiving commands to and from LCN modules is possib There is currently support for the following device types within Home Assistant: +- [Cover](#cover) - [Light](#light) - [Switch](#switch) @@ -43,6 +45,11 @@ lcn: port: 4114 username: lcn password: lcn + + covers: + - name: Living room cover + address: myhome.s0.m7 + motor: motor1 lights: - name: Bedroom light @@ -95,6 +102,24 @@ connections: default: steps50 type: string +covers: + description: List of your covers. + required: false + type: map + keys: + name: + description: Name of the cover. + required: true + type: string + address: + description: "[Address](/components/lcn#lcn-addresses) of the module/group." + required: true + type: string + motor: + description: "Motor port ([MOTOR_PORT](/components/lcn#ports))." + required: true + type: string + lights: description: List of your lights. required: true @@ -184,6 +209,20 @@ The platforms and service calls use several predefined constants as parameters. | -------- | ------ | | OUTPUT_PORT | `output1`, `output2`, `output3`, `output4` | | RELAY_PORT | `relay1`, `relay2`, `relay3`, `relay4`, `relay5`, `relay6`, `relay7`, `relay8` | +| MOTOR_PORT | `motor1`, `motor2`, `motor3`, `motor4` | + +The [MOTOR_PORT](/components/lcn#ports) values specify which hardware relay configuration will be used: + +| Motor | Relay on/off | Relay up/down | +| :------: | :----------: | :-----------: | +| `motor1` | `relay1` | `relay2` | +| `motor2` | `relay3` | `relay4` | +| `motor3` | `relay5` | `relay6` | +| `motor4` | `relay7` | `relay8` | + +## {% linkable_title Cover %} + +The `lcn` cover platform allows the control of [LCN](http://www.lcn.eu) relays which have been configured as motor controllers. ## {% linkable_title Light %} @@ -197,4 +236,4 @@ The `lcn` light platform allows the control of the following [LCN](http://www.lc The `lcn` switch platform allows the control of the following [LCN](http://www.lcn.eu) ports: - Output ports -- Relays \ No newline at end of file +- Relays From 24b8678a90e41ca4973ce5f84d8161d0d9f0ed4a Mon Sep 17 00:00:00 2001 From: Andrew Sayre <6730289+andrewsayre@users.noreply.github.com> Date: Mon, 25 Feb 2019 08:52:57 -0600 Subject: [PATCH 36/64] Update SmartThings switch platform docs (#8713) --- source/_components/smartthings.markdown | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/source/_components/smartthings.markdown b/source/_components/smartthings.markdown index 60de6c4f629..d1af3f494ef 100644 --- a/source/_components/smartthings.markdown +++ b/source/_components/smartthings.markdown @@ -248,7 +248,13 @@ The SmartThings Sensor platform lets your view devices that have sensor-related ### {% linkable_title Switch %} -The SmartThings Switch platform lets you control devices that have the [`switch`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Switch) capability that are not already represented by a more specific platform. +The SmartThings Switch platform lets you control devices that have the [`switch`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Switch) capability that are not already represented by a more specific platform. The following optional capabilities will provide energy and power utilization information: + +| Capability |Switch Features +|-------------------------------------|--------------------------------------------| +| [`energyMeter`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Energy-Meter) | energy consumption (`today_energy_kwh` state attribute) +| [`powerMeter`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Power-Meter) | power consumption (`current_power_w` state attribute) + ## {% linkable_title Troubleshooting %} From ca223dfc28ef980e14afe7227c760f9b640e8bf9 Mon Sep 17 00:00:00 2001 From: Tobias Hoff Date: Mon, 25 Feb 2019 21:25:49 +0100 Subject: [PATCH 37/64] google maps allow multiple accounts (#8020) cookie file extension to allow multiple accounts to be scanned --- source/_components/device_tracker.google_maps.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/device_tracker.google_maps.markdown b/source/_components/device_tracker.google_maps.markdown index 6289ba26332..d2a6a643121 100644 --- a/source/_components/device_tracker.google_maps.markdown +++ b/source/_components/device_tracker.google_maps.markdown @@ -19,7 +19,7 @@ The `google_maps` platform allows you to detect presence using the unofficial AP You first need to create an additional Google account and share your location with that account. This platform will use that account to fetch the location of your device(s). You have to setup sharing through the Google Maps app on your mobile phone. You can find more information [here](https://support.google.com/accounts?p=location_sharing). -This platform will create a file named `.google_maps_location_sharing.cookies` where it caches your login session. +This platform will create a file named `.google_maps_location_sharing.cookies` extended with the slugified username where it caches your login session.

Since this platform is using an unofficial API with the help of [locationsharinglib](https://github.com/costastf/locationsharinglib), Google seems to block access to your data the first time you've logged in with this platform. From 747ac6e09e6a90f079a90bc8e94330edc61eb5d0 Mon Sep 17 00:00:00 2001 From: Marco Gazzola Date: Mon, 25 Feb 2019 21:26:42 +0100 Subject: [PATCH 38/64] xiaomi vacuum with zone and reps (#8047) * xiaomi vacuum with zone and reps * xiaomi vacuum with zone and reps * xiaomi vacuum with zone and reps * xiaomi vacuum with zone and reps * xiaomi vacuum with zone and reps * add reps template * rytilahti tips * rytilahti tips * automation editor fix * Revert "automation editor fix" This reverts commit 58bb3ad6a77c90b2fe4b080c1e36a7db18897224. * rytilahti tips * data_template schema * conflict resolve * conflict * fix merge error * :pencil2: Tweak --- .../_components/vacuum.xiaomi_miio.markdown | 104 ++++++++++++++---- 1 file changed, 85 insertions(+), 19 deletions(-) diff --git a/source/_components/vacuum.xiaomi_miio.markdown b/source/_components/vacuum.xiaomi_miio.markdown index cbbe93bf530..4a806f3298d 100644 --- a/source/_components/vacuum.xiaomi_miio.markdown +++ b/source/_components/vacuum.xiaomi_miio.markdown @@ -25,6 +25,7 @@ Currently supported services are: - `clean_spot` - `set_fan_speed` - remote control of your robot. +- `xiaomi_clean_zone` ## {% linkable_title Configuration %} @@ -64,6 +65,7 @@ In addition to all of the services provided by the `vacuum` component (`start`, - `xiaomi_remote_control_stop` - `xiaomi_remote_control_move` - `xiaomi_remote_control_move_step` +- `xiaomi_clean_zone` ### {% linkable_title Service `vacuum.xiaomi_remote_control_start` %} @@ -103,6 +105,73 @@ Enter remote control mode, make one move, stop, and exit remote control mode. | `rotation` | no | Rotation: between -179 degrees and 179 degrees | | `duration` | no | The number of milliseconds that the robot should move for | +### {% linkable_title Service `vacuum.xiaomi_clean_zone` %} + +Start the cleaning operation in the areas selected for the number of repeats indicated. + +| Service data attribute | Optional | Description | +|---------------------------|----------|-------------------------------------------------------| +| `entity_id` | yes | Only act on specific robot; default targets all | +| `zone` | no | List of zones. Each zone is an array of 4 integer value. Example: [[23510,25311,25110,26361]] | +| `repeats` | no | Number of cleaning repeats for each zone between 1 and 3. | + +Example of `vacuum.xiaomi_clean_zone` use: + +Inline array: +```yaml +automation: + - alias: Test vacuum zone3 + trigger: + - event: start + platform: homeassistant + condition: [] + action: + - service: vacuum.xiaomi_clean_zone + data_template: + entity_id: vacuum.xiaomi_vacuum + repeats_template: '{{states.input_number.vacuum_passes.state|int}}' + zone: [[30914,26007,35514,28807], [20232,22496,26032,26496]] +``` +Array with inline zone: +```yaml +automation: + - alias: Test vacuum zone3 + trigger: + - event: start + platform: homeassistant + condition: [] + action: + - service: vacuum.xiaomi_clean_zone + data_template: + entity_id: vacuum.xiaomi_vacuum + repeats_template: '{{states.input_number.vacuum_passes.state|int}}' + zone: + - [30914,26007,35514,28807] + - [20232,22496,26032,26496] +``` +Array mode: +```yaml +automation: + - alias: Test vacuum zone3 + trigger: + - event: start + platform: homeassistant + condition: [] + action: + - service: vacuum.xiaomi_clean_zone + data: + entity_id: vacuum.xiaomi_vacuum + repeats: 1 + zone: + - - 30914 + - 26007 + - 35514 + - 28807 + - - 20232 + - 22496 + - 26032 + - 26496 +``` ## {% linkable_title Attributes %} In addition to [all of the attributes provided by the `vacuum` component](/components/vacuum/#attributes), @@ -293,22 +362,19 @@ Software Required: - [Mi-Home version 5.0.30](https://www.apkmirror.com/apk/xiaomi-inc/mihome/mihome-5-0-30-release/) - [Android Backup Extractor](https://sourceforge.net/projects/adbextractor/) - [SQLite Browser](https://sqlitebrowser.org/) - -Steps to take: - -1. Install an old Version of MiHome (e.g. Mi-Home version 5.0.30) on your Android-Device. -2. Open MiHome, log-in and add your devices. -3. Enable USB-Debugging on your Android. -4. Create a backup from your MiHome App, by using adb: - ```bash - adb backup com.xiaomi.smarthome - ``` - Now the backup App opens on you Android-Device. You don't need to set a password, just click save. -5. Extract the backup-file with android-backup-extractor: - ```bash - java -jar abe.jar unpack backup.ab backup.tar - ``` - After that, extract the file with WinRAR, 7-Zip (or similar). -6. Go to `\apps\com.xiaomi.smarthome\db`. -7. Open `miio2.db` with the SQLite Browser. -8. You can find your device tokens in `devicerecord` table. +1. Install an old Version of MiHome (e.g. Mi-Home version 5.0.30) on your Android-Device +2. Open MiHome, log-in and add your devices +3. Enable USB-Debugging on your Android +4. Create a backup from your MiHome App, by using adb + ```bash + adb backup com.xiaomi.smarthome + ``` + Now the backup App opens on you Android-Device. You don't need to set a password, just click save. +5. Extract the backup-file with android-backup-extractor + ```bash + java -jar abe.jar unpack backup.ab backup.tar + ``` + After that, you kann open the file with WinRaR or what ever you like. +6. Go to \apps\com.xiaomi.smarthome\db +7. Open miio2.db with SQLite Browser +8. You can find your device tokens in "devicerecord" table From d18de794f54dd502e7393f26e98aa5c25eefa05d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miroslav=20=C5=BDdrale?= Date: Mon, 25 Feb 2019 21:27:28 +0100 Subject: [PATCH 39/64] Added documentation for Ubee router device tracker (#7955) * Added Documentation for Ubee Router Device Tracker. * Added Documentation for Ubee Router Device Tracker (this time for real) * Updated Ubee logo to be visible on white background and changed title * Changed HA version to 0.87. * Changed HA version to 0.88. * Bumped to 0.89 version * :pencil2: Tweaks --- .../_components/device_tracker.ubee.markdown | 44 ++++++++++++++++++ source/images/supported_brands/ubee.png | Bin 0 -> 6913 bytes 2 files changed, 44 insertions(+) create mode 100644 source/_components/device_tracker.ubee.markdown create mode 100644 source/images/supported_brands/ubee.png diff --git a/source/_components/device_tracker.ubee.markdown b/source/_components/device_tracker.ubee.markdown new file mode 100644 index 00000000000..fd6e74526fb --- /dev/null +++ b/source/_components/device_tracker.ubee.markdown @@ -0,0 +1,44 @@ +--- +layout: page +title: "Ubee Router" +description: "Instructions on how to integrate Ubee routers into Home Assistant." +date: 2018-12-26 18:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: ubee.png +ha_category: Presence Detection +ha_release: 0.89 +--- + +This platform offers presence detection by looking at connected devices to a [Ubee Router](http://www.ubeeinteractive.com/products). + +To use a Ubee router in your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +device_tracker: + - platform: ubee + host: ROUTER_IP_ADDRESS + username: YOUR_ADMIN_USERNAME + password: YOUR_ADMIN_PASSWORD +``` + +{% configuration %} +host: + description: The IP address of your router, e.g., `192.168.1.1`. + required: true + type: string +username: + description: The username of a user with administrative privileges, usually `admin`. + required: true + type: string +password: + description: The password for your given admin account. + required: true + type: string +{% endconfiguration %} + +By default, Home Assistant pulls information about connected devices from Ubee router every 5 seconds. +See the [device tracker component page](/components/device_tracker/) for instructions on how to configure the people to be tracked. diff --git a/source/images/supported_brands/ubee.png b/source/images/supported_brands/ubee.png new file mode 100644 index 0000000000000000000000000000000000000000..460bb0506dbcf32c7de27f31104f19d9692798c0 GIT binary patch literal 6913 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 Hu0mjfr5-op literal 0 HcmV?d00001 From f36ce0c25351b14f70eb2b1749292005c84640ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20W?= Date: Mon, 25 Feb 2019 20:36:05 +0000 Subject: [PATCH 40/64] Neato supports custom cleaning (#8421) * Neato supports custom cleaning * Adding some details about the new service * More details on the new service * Revert back the domain to vacuum as requested --- source/_components/neato.markdown | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/source/_components/neato.markdown b/source/_components/neato.markdown index 6d17e1ccdea..63b20cbde64 100644 --- a/source/_components/neato.markdown +++ b/source/_components/neato.markdown @@ -42,7 +42,7 @@ password: {% endconfiguration %}

-After the update to firmware 4.0 (which adds cleaning maps) there is also support for displaying the maps of the Botvac D3 Connected and Botvac D5 Connected robots. More information on how to update can be found [here](https://support.neatorobotics.com/hc/en-us/articles/115004320694-Software-Update-4-0-for-Neato-Botvac-Connected-D3-D5-). +After the update to firmware 4.0 (which adds cleaning maps) there is also support for displaying the maps of the Botvac D3 Connected and Botvac D5 Connected robots. More information on how to update can be found [here](https://support.neatorobotics.com/hc/en-us/articles/115004320694-Software-Update-4-0-for-Neato-Botvac-Connected-D3-D5-).

## {% linkable_title Vacuum %} @@ -54,7 +54,7 @@ The status will contain attributes on the robots last clean session. If you notice the robot stops responding to commands check the state to see if the robot is "unavailable". If you see "unavailable" first try to restart the vacuum and wait about 5 minutes to see if it is no longer "unavailable". If you are still having issues check the Neato app and make sure your robot is connected and working. If it is not then follow the steps in the app to reset your robot and give it the same name as before then restart Home Assistant.

-### {% linkable_title Configuration %} +### {% linkable_title Services %} Currently supported services are: @@ -65,6 +65,30 @@ Currently supported services are: - `locate` - `spot_clean` +And a specific Platform Service: + +- `vacuum.neato_custom_cleaning` + +### {% linkable_title Platform Services %} + +#### {% linkable_title Service `vacuum.neato_custom_cleaning` %} + +Starts a custom cleaning of your house. You can set the various options like in the mobile application (mode, map usage, navigation mode, zone). + +

+Not all Botvac models support all the attributes. Only the Neato Botvac D7 supports the `zone` attribute. +Some information about the capabilities might be found on the [Neato Developer Portal](https://developers.neatorobotics.com/api/robot-remote-protocol/housecleaning). +

+ +| Service data attribute | Optional | Description | +| ---------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `entity_id` | no | Only act on a specific robot | +| `mode` | yes | Set the cleaning mode: 1 for eco and 2 for turbo. Defaults to turbo if not set. | +| `navigation` | yes | Set the navigation mode: 1 for normal, 2 for extra care, 3 for deep. Defaults to normal if not set. | +| `category` | yes | Whether to use a persistent map or not for cleaning (i.e. No go lines): 2 for no map, 4 for map. Default to using map if not set (and fallback to no map if no map is found). | +| `zone` | yes | Only supported on the Botvac D7. Name of the zone to clean. Defaults to no zone i.e. complete house cleanup. | + + ## {% linkable_title Camera %} The `neato` camera platform allows you to view the latest cleaning map of your [Neato Botvac Connected](https://www.neatorobotics.com/robot-vacuum/botvac-connected-series/botvac-connected/). @@ -73,4 +97,4 @@ The `neato` camera platform allows you to view the latest cleaning map of your [ The `neato` switch platform allows you to enable or disable the schedule of your [Neato Botvac Connected](https://www.neatorobotics.com/robot-vacuum/botvac-connected-series/botvac-connected/). -To add `neato` switch, camera and vacuum to your installation, follow instructions above. \ No newline at end of file +To add `neato` switch, camera and vacuum to your installation, follow instructions above. From 7f5beaacecc897eee3023253f444c5d66418b18b Mon Sep 17 00:00:00 2001 From: msvinth Date: Mon, 25 Feb 2019 20:43:29 +0000 Subject: [PATCH 41/64] Health_idx (#8613) --- source/_components/sensor.netatmo.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_components/sensor.netatmo.markdown b/source/_components/sensor.netatmo.markdown index cb13ea766cc..7e0c9827ac8 100644 --- a/source/_components/sensor.netatmo.markdown +++ b/source/_components/sensor.netatmo.markdown @@ -65,6 +65,8 @@ modules: description: Noise level in dB. humidity: description: "Humidity in %." + health_idx: + description: "Air health as one of the values Healthy, Fine, Fair, Poor, Unhealthy." rain: description: Estimated rainfall for today in mm. sum_rain_1: From 70a7b5bf3260bceb45f28196801fc9e32bad56cb Mon Sep 17 00:00:00 2001 From: Alistair Galbraith Date: Mon, 25 Feb 2019 12:43:51 -0800 Subject: [PATCH 42/64] Add documentation for sony_projector switch component (#8390) * Add documentation for sony_projector switch component * :arrow_up: ha_release 0.89 --- .../switch.sony_projector.markdown | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 source/_components/switch.sony_projector.markdown diff --git a/source/_components/switch.sony_projector.markdown b/source/_components/switch.sony_projector.markdown new file mode 100644 index 00000000000..298454f3443 --- /dev/null +++ b/source/_components/switch.sony_projector.markdown @@ -0,0 +1,39 @@ +--- +layout: page +title: "Sony Projector Switch" +description: "Instructions on how to integrate Sony Projector switches into Home Assistant." +date: 2019-01-01 07:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: sony.png +ha_category: Multimedia +ha_iot_class: "Local Polling" +ha_release: 0.89 +--- + +The `sony_projector` switch platform allows you to control the state of SDCP compatible network-connected projectors from [Sony](http://www.sony.com). + +## {% linkable_title Configuration %} + +To use your Sony Projector in your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +switch: + - platform: sony_projector + host: "192.168.1.47" + name: "Projector" +``` + +{% configuration %} +host: + description: The hostname or IP address of the projector. + required: true + type: string +name: + description: The name to use when displaying this switch. + required: false + type: string +{% endconfiguration %} From 8a0cf23e69c7b6d9cc4aa81ac8237df3a3779fe0 Mon Sep 17 00:00:00 2001 From: lapy Date: Mon, 25 Feb 2019 20:53:20 +0000 Subject: [PATCH 43/64] Update traccar documentation with new parameters (#8618) * Update traccar documentation with new parameters Added scan_interval and monitored_conditions * Add clarification on monitored_conditions * :pencil2: Removes scan_interval --- .../_components/device_tracker.traccar.markdown | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/source/_components/device_tracker.traccar.markdown b/source/_components/device_tracker.traccar.markdown index 688d02d036e..17da63ecc64 100644 --- a/source/_components/device_tracker.traccar.markdown +++ b/source/_components/device_tracker.traccar.markdown @@ -60,4 +60,17 @@ verify_ssl: required: false type: boolean default: true -{% endconfiguration %} \ No newline at end of file +monitored_conditions: + description: Additional traccar computed attributes or device-related attributes to include in the scan. + required: false + type: list +{% endconfiguration %} + +The parameter `monitored_conditions` allows you to track non standard attributes from the traccar platform and use them in your Home Assistant. For example if you need to monitor the state of the non standard attribute `alarm` and a custom computed attribute `mycomputedattribute` just fill the configuration with: + +```yaml +device_tracker: + - platform: traccar + ... + monitored_conditions: ['alarm', 'mycomputedattribute'] +``` From 194a35f97ee0b5eeb1039b9fbc4b1131ba141635 Mon Sep 17 00:00:00 2001 From: UnrealKazu <9115757+UnrealKazu@users.noreply.github.com> Date: Mon, 25 Feb 2019 21:53:55 +0100 Subject: [PATCH 44/64] Add Docker specific explanation for PS4 component (#8629) The new PS4 component requires some extra settings from Home Assistant if one is using Docker. I've added an entry in the docs to make sure these settings are clear for those who use Docker. --- source/_components/media_player.ps4.markdown | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/_components/media_player.ps4.markdown b/source/_components/media_player.ps4.markdown index 0db9f0f54fb..4b35521c547 100644 --- a/source/_components/media_player.ps4.markdown +++ b/source/_components/media_player.ps4.markdown @@ -57,6 +57,9 @@ There are varying methods to perform this, dependent on your OS that is running `sudo setcap 'cap_net_bind_service=+ep' /usr/bin/python3.5` Replace "/usr/bin/python3.5" with your path to Python that is running Home Assistant. +### {% linkable_title Docker %} + +When running Home Assistant using Docker, make sure that the Home Assistant container is discoverable by the PS4. This can be achieved by ensuring that the Home Assistant container uses the `host` network driver (by passing `--net=host` to the container when creating, or adding `network_mode: "host"` to your compose file when using `docker-compose`). ## {% linkable_title Configuration %} From 5cb1609b9d47431452750189af322ff15ee26c68 Mon Sep 17 00:00:00 2001 From: Andrew Sayre <6730289+andrewsayre@users.noreply.github.com> Date: Mon, 25 Feb 2019 14:56:17 -0600 Subject: [PATCH 45/64] Add SmartThings cover platform and update cover device classes (#8625) * Add SmartThings Cover docs * Update cover component device classes * Add additional cover types * Sync device class descriptions * :pencil2: Tweaks --- source/_components/cover.markdown | 12 +++++++++--- source/_components/smartthings.markdown | 19 ++++++++++++++++--- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/source/_components/cover.markdown b/source/_components/cover.markdown index d954ee83f0e..dcb91354422 100644 --- a/source/_components/cover.markdown +++ b/source/_components/cover.markdown @@ -23,9 +23,15 @@ The display style of each entity can be modified in the [customize section](/get The way these sensors are displayed in the frontend can be modified in the [customize section](/docs/configuration/customizing-devices/). The following device classes are supported for covers: - **None**: Generic cover. This is the default and doesn't need to be set. -- **damper**: Ventilation damper controller. -- **garage**: Garage door controller. -- **window**: Window controller. +- **awning**: Control of an awning, such as an exterior retractable window, door, or patio cover. +- **blind**: Control of blinds, which are linked slats that expand or collapse to cover an opening or may be tilted to partially covering an opening, such as window blinds. +- **curtain**: Control of curtains or drapes, which is often fabric hung above a window or door that can be drawn open. +- **damper**: Control of a mechanical damper that reduces airflow, sound, or light. +- **door**: Control of a door or gate that provides access to an area. +- **garage**: Control of a garage door that provides access to a garage. +- **shade**: Control of shades, which are a continuous plane of material or connected cells that expanded or collapsed over an opening, such as window shades. +- **shutter**: Control of shutters, which are linked slats that swing out/in to covering an opening or may be tilted to partially cover an opening, such as indoor or exterior window shutters. +- **window**: Control of a physical window that opens and closes or may tilt. ## {% linkable_title Services %} diff --git a/source/_components/smartthings.markdown b/source/_components/smartthings.markdown index d1af3f494ef..9a5ddc68558 100644 --- a/source/_components/smartthings.markdown +++ b/source/_components/smartthings.markdown @@ -13,6 +13,7 @@ ha_category: - Hub - Binary Sensor - Climate + - Cover - Fan - Light - Lock @@ -25,6 +26,8 @@ redirect_from: - /components/binary_sensor.smartthings/ - /components/smartthings.climate/ - /components/climate.smartthings/ + - /components/smartthings.cover/ + - /components/cover.smartthings/ - /components/smartthings.fan/ - /components/fan.smartthings/ - /components/smartthings.light/ @@ -125,6 +128,7 @@ Event data payloads are logged at the debug level, see [debugging](#debugging) f SmartThings represents devices as a set of [capabilities](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html) and the SmartThings component maps those to entity platforms in Home Assistant. A single device may be represented by one or more platforms. - [Binary Sensor](#binary-sensor) - [Climate](#climate) +- [Cover](#cover) - [Fan](#fan) - [Light](#light) - [Lock](#lock) @@ -163,6 +167,18 @@ The SmartThings Climate platform lets you control devices that have thermostat-r | [`thermostatFanMode`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Thermostat-Fan-Mode) | `fan mode` | [`relativeHumidityMeasurement`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Relative-Humidity-Measurement) | `humidity` (state attribute) +### {% linkable_title Cover %} + +The SmartThings Cover platform lets you control devices that have open/close related capabilities. For a device to be represented by the cover platform, it must have one of the capabilities from "set a" below. + +| Capability |Cover Features +|-------------------------------------|--------------------------------------------| +| [`doorControl`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Door-Control) (set a) | `open` and `close` +| [`garageDoorControl`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Garage-Door-Control) (seb a) | `open` and `close` +| [`windowShade`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Window-Shade) (set a) | `open` and `close` +| [`switchLevel`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Switch-Level) | `position` +| [`battery`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Battery) | `battery_level` (state attribute) + ### {% linkable_title Fan %} The SmartThings Fan platform lets you control devices that have fan-related capabilities. For a SmartThings device to be represented by the fan platform, it must have one or more of the capabilities below in addition to the [`switch`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Switch) capability. @@ -203,14 +219,12 @@ The SmartThings Sensor platform lets your view devices that have sensor-related | [`carbonMonoxideDetector`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Carbon-Monoxide-Detector) | `carbonMonoxide` | [`carbonMonoxideMeasurement`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Carbon-Monoxide-Measurement) | `carbonMonoxideLevel` | [`dishwasherOperatingState`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Dishwasher-Operating-State) | `machineState`, `dishwasherJobState` and `completionTime` -| [`doorControl`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Door-Control) | `door` | [`dryerMode`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Dryer-Mode) | `dryerMode` | [`dryerOperatingState`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Dryer-Operating-State) | `machineState`, `dryerJobState` and `completionTime` | [`dustSensor`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Dust-Sensor) | `fineDustLevel` and `dustLevel` | [`energyMeter`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Energy-Meter) | `energy` | [`equivalentCarbonDioxideMeasurement`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Equivalent-Carbon-Dioxide-Measurement) | `equivalentCarbonDioxideMeasurement` | [`formaldehydeMeasurement`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Formaldehyde-Measurement) | `formaldehydeLevel` -| [`garageDoorControl`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Garage-Door-Control) | `door` | [`illuminanceMeasurement`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Illuminance-Measurement) | `illuminance` | [`infraredLevel`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Infrared-Level) | `infraredLevel` | [`lock`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Lock) | `lock` @@ -244,7 +258,6 @@ The SmartThings Sensor platform lets your view devices that have sensor-related | [`voltageMeasurement`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Voltage-Measurement) | `voltage` | [`washerMode`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Washer-Mode) | `washerMode` | [`washerOperatingState`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Washer-Operating-State) | `machineState`, `washerJobState` and `completionTime` -| [`windowShade`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Window-Shade) | `windowShade` ### {% linkable_title Switch %} From 2631c9b97e29497df38317cf9023509aa1ca001f Mon Sep 17 00:00:00 2001 From: Justin Bassett Date: Mon, 25 Feb 2019 16:13:10 -0500 Subject: [PATCH 46/64] utility_meter net metering support (#8631) * utility_meter net metering support Add documentation around net metering for utility_sensor. * Change config item to new name New name to make it more obvious what the configuration does. * :pencil2: Tweaks * :pencil2: Tweak --- source/_components/utility_meter.markdown | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/_components/utility_meter.markdown b/source/_components/utility_meter.markdown index d90b12ee434..17d13b8763b 100644 --- a/source/_components/utility_meter.markdown +++ b/source/_components/utility_meter.markdown @@ -50,6 +50,11 @@ offset: required: false default: 0 type: integer +net_consumption: + description: Set this to True if you would like to treat the source as a net meter. This will allow your counter to go both positive and negative. + required: false + default: false + type: boolean tariffs: description: List of tariffs supported by the utility meter. required: false From 0deefbb31e8619c4987f78552a4aa2cbcb8f0adc Mon Sep 17 00:00:00 2001 From: Anders Melchiorsen Date: Mon, 25 Feb 2019 22:27:27 +0100 Subject: [PATCH 47/64] Sonos updates (#8724) --- source/_components/sonos.markdown | 167 ++++++++++++++++++++---------- 1 file changed, 115 insertions(+), 52 deletions(-) diff --git a/source/_components/sonos.markdown b/source/_components/sonos.markdown index ea08f23eaff..e78ecb0a220 100644 --- a/source/_components/sonos.markdown +++ b/source/_components/sonos.markdown @@ -23,82 +23,151 @@ If you don't have the discovery component enabled, you can configure the Sonos c Sonos makes various services available to allow configuring groups. They are currently registered under the media player component. -### {% linkable_title Service `sonos_snapshot` %} +### {% linkable_title Service `media_player.sonos_snapshot` %} Take a snapshot of what is currently playing on one or more speakers. This service, and the following one, are useful if you want to play a doorbell or notification sound and resume playback afterwards. If no `entity_id` is provided, all speakers are snapshotted. -| Service data attribute | Optional | Description | -| ---------------------- | -------- | ----------- | -| `entity_id` | yes | String or list of strings that point at `entity_id`s of coordinator speakers. -| `with_group` | yes | Should be also snapshot the group state of the speaker. +

+The queue is not snapshotted and must be left untouched until the restore. Using `media_player.play_media` is safe and can be used to play a notification sound, including [TTS](/components/tts/) announcements. +

-### {% linkable_title Service `sonos_restore` %} +{% configuration %} +entity_id: + description: The speakers to snapshot. + required: false + type: entity_id +with_group: + description: Should we also snapshot the group layout and the state of other speakers in the group. + required: false + type: boolean +{% endconfiguration %} + +### {% linkable_title Service `media_player.sonos_restore` %} Restore a previously taken snapshot of one or more speakers. If no `entity_id` is provided, all speakers are restored. -| Service data attribute | Optional | Description | -| ---------------------- | -------- | ----------- | -| `entity_id` | yes | String or list of strings that point at `entity_id`s of coordinator speakers. -| `with_group` | yes | Should be also restore the group state of the speaker. Only if was snapshot with group. +

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

-### {% linkable_title Service `sonos_join` %} +

+A cloud queue cannot be restarted. This includes queues started from within Spotify and queues controlled by Amazon Alexa. +

-Do group players together under a single coordinator. That will make a new group or join to exists group. +{% configuration %} +entity_id: + description: The speakers that should have their snapshot restored. + required: false + type: entity_id +with_group: + description: Should we also restore the group layout and the state of other speakers in the group. + required: false + type: boolean +{% endconfiguration %} -| Service data attribute | Optional | Description | -| ---------------------- | -------- | ----------- | -| `master` | no | A single `entity_id` that will become/hold the coordinator speaker. -| `entity_id` | no | String or list of a single `entity_id` that will group to master speaker. +### {% linkable_title Service `media_player.sonos_join` %} -### {% linkable_title Service `sonos_unjoin` %} +Group players together under a single coordinator. This will make a new group or join to an existing group. -Remove one or more speakers from a group of speakers. If no `entity_id` is provided, all speakers are unjoined. +{% configuration %} +master: + description: A single `entity_id` that will become/stay the coordinator speaker. + required: true + type: entity_id +entity_id: + description: The speakers to join to the master. + required: false + type: entity_id +{% endconfiguration %} -| Service data attribute | Optional | Description | -| ---------------------- | -------- | ----------- | -| `entity_id` | no | String or list of `entity_id`s that will be separated from their coordinator speaker. +### {% linkable_title Service `media_player.sonos_unjoin` %} -### {% linkable_title Service `sonos_set_sleep_timer` %} +Remove one or more speakers from their group of speakers. If no `entity_id` is provided, all speakers are unjoined. + +{% configuration %} +entity_id: + description: The speakers to separate from their coordinator speaker. + required: false + type: entity_id +{% endconfiguration %} + +### {% linkable_title Service `media_player.sonos_set_sleep_timer` %} Sets a timer that will turn off a speaker by tapering the volume down to 0 after a certain amount of time. Protip: If you set the sleep_time value to 0, then the speaker will immediately start tapering the volume down. -| Service data attribute | Optional | Description | -| ---------------------- | -------- | ----------- | -| `entity_id` | no | String or list of `entity_id`s that will have their timers set. Must be a coordinator speaker. -| `sleep_time` | no | Integer number of seconds that the speaker should wait until it starts tapering. Cannot exceed 86399 (one day). +{% configuration %} +entity_id: + description: The speakers that will have their timers set. + required: true + type: entity_id +sleep_time: + description: Number of seconds that the speaker should wait until it starts tapering. Cannot exceed 86399 (one day). + required: true + type: integer +{% endconfiguration %} -### {% linkable_title Service `sonos_clear_sleep_timer` %} +### {% linkable_title Service `media_player.sonos_clear_sleep_timer` %} Clear the sleep timer on a speaker, if one is set. -| Service data attribute | Optional | Description | -| ---------------------- | -------- | ----------- | -| `entity_id` | no | String or list of `entity_id`s that will have their timers cleared. Must be a coordinator speaker. +{% configuration %} +entity_id: + description: The speakers that will have their timers cleared. + required: true + type: entity_id +{% endconfiguration %} -### {% linkable_title Service `sonos_update_alarm` %} +### {% linkable_title Service `media_player.sonos_update_alarm` %} Update an existing Sonos alarm. -| Service data attribute | Optional | Description | -| ---------------------- | -------- | ----------- | -| `entity_id` | no | String or list of `entity_id`s that will have their timers cleared. Must be a coordinator speaker. -| `alarm_id` | no | Integer that is used in Sonos to refer to your alarm. -| `time` | yes | Time to set the alarm. -| `volume` | yes | Float for volume level. -| `enabled` | yes | Boolean for whether or not to enable this alarm. -| `include_linked_zones` | yes | Boolean that defines if the alarm also plays on grouped players. +{% configuration %} +entity_id: + description: The speaker that will have its alarm updated. + required: true + type: entity_id +alarm_id: + description: Integer that is used in Sonos to refer to your alarm. + required: true + type: integer +time: + description: Time to set the alarm. + required: no + type: time +volume: + description: Float for volume level (0.0-1.0). + required: no + type: float +enabled: + description: Boolean for whether or not to enable this alarm. + required: no + type: boolean +include_linked_zones: + description: Boolean that defines if the alarm also plays on grouped players. + required: no + type: boolean +{% endconfiguration %} -### {% linkable_title Service `sonos_set_option` %} +### {% linkable_title Service `media_player.sonos_set_option` %} Set Sonos speaker options. -Night Sound and Speech Enhancement modes are only supported on Sonos PLAYBAR and PLAYBASE speakers when playing from the TV source. Other speaker types will ignore these options. +Night Sound and Speech Enhancement modes are only supported when playing from the TV source of products like Sonos Playbar and Sonos Beam. Other speaker types will ignore these options. -| Service data attribute | Optional | Description | -| ---------------------- | -------- | ----------- | -| `entity_id` | no | String or list of `entity_id`s that will have their options set. -| `night_sound` | yes | Boolean to control Night Sound mode. -| `speech_enhance` | yes | Boolean to control Speech Enhancement mode. +{% configuration %} +entity_id: + description: The speakers that will have their options set. + required: true + type: entity_id +night_sound: + description: Boolean to control Night Sound mode. + required: no + type: boolean +speech_enhance: + description: Boolean to control Speech Enhancement mode. + required: no + type: boolean +{% endconfiguration %} ## {% linkable_title Advanced use %} @@ -133,9 +202,3 @@ sonos: - 192.0.2.26 - 192.0.2.27 ``` - -## {% linkable_title Additional information %} - -This component is using the [SoCo](https://github.com/SoCo/SoCo) project. - -To be able to support the Sonos components and features it is mandatory to have TCP port 1400 opened. This port is used to receive events about changes on the Sonos network. For more details please see the [SoCo documentation](https://github.com/SoCo/SoCo) and source code of the SoCo project. From d8dd6bc544844dcce4c3d4684d0afbea8f58557a Mon Sep 17 00:00:00 2001 From: Rohan Kapoor Date: Tue, 26 Feb 2019 06:25:18 -0800 Subject: [PATCH 48/64] Remove the google travel time update service (#8749) --- source/_components/sensor.google_travel_time.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_components/sensor.google_travel_time.markdown b/source/_components/sensor.google_travel_time.markdown index 53766d3f7cc..4439d4ebe71 100644 --- a/source/_components/sensor.google_travel_time.markdown +++ b/source/_components/sensor.google_travel_time.markdown @@ -139,7 +139,7 @@ sensor: ## {% linkable_title Updating sensors on-demand using Automation %} -You can also use the `sensor.google_travel_sensor_update` service to update the sensor on-demand. For example, if you want to update `sensor.morning_commute` every 2 minutes on weekday mornings, you can use the following automation: +You can also use the `homeassistant.update` service to update the sensor on-demand. For example, if you want to update `sensor.morning_commute` every 2 minutes on weekday mornings, you can use the following automation: ```yaml - id: update_morning_commute_sensor @@ -160,7 +160,7 @@ You can also use the `sensor.google_travel_sensor_update` service to update the - thu - fri action: - - service: sensor.google_travel_sensor_update + - service: homeassistant.update data: entity_id: sensor.morning_commute ``` From 5a41ba398ac13d36cb74fe1653c961cb48b35ea3 Mon Sep 17 00:00:00 2001 From: Giorgos Logiotatidis Date: Tue, 26 Feb 2019 20:24:34 +0200 Subject: [PATCH 49/64] Add timeout option docs for sensor.rest and binary_sensor.rest. (#8161) --- source/_components/binary_sensor.rest.markdown | 5 +++++ source/_components/sensor.rest.markdown | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/source/_components/binary_sensor.rest.markdown b/source/_components/binary_sensor.rest.markdown index dbb0cd102cc..96a6db48a93 100644 --- a/source/_components/binary_sensor.rest.markdown +++ b/source/_components/binary_sensor.rest.markdown @@ -92,6 +92,11 @@ verify_ssl: required: false type: boolean default: true +timeout: + description: Defines max time to wait data from the endpoint. + required: false + type: positive integer + default: 10 authentication: description: "Type of the HTTP authentication. `basic` or `digest`." required: false diff --git a/source/_components/sensor.rest.markdown b/source/_components/sensor.rest.markdown index 98958f3797f..3c595a6de3e 100644 --- a/source/_components/sensor.rest.markdown +++ b/source/_components/sensor.rest.markdown @@ -70,7 +70,12 @@ verify_ssl: description: Verify the SSL certificate of the endpoint. required: false type: boolean - default: true + default: True +timeout: + description: Defines max time to wait data from the endpoint. + required: false + type: positive integer + default: 10 unit_of_measurement: description: Defines the units of measurement of the sensor, if any. required: false From 52921f8daa96ee7095d600f82b91db2dc3757a4e Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 26 Feb 2019 19:49:49 +0100 Subject: [PATCH 50/64] :books: Updates Toon documentation to match rewrite (#8627) --- source/_components/toon.markdown | 56 +++++++++++++++++--------------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/source/_components/toon.markdown b/source/_components/toon.markdown index ec93aa16bf4..4c6a5f40316 100644 --- a/source/_components/toon.markdown +++ b/source/_components/toon.markdown @@ -8,10 +8,10 @@ comments: false sharing: true footer: true ha_category: - - Hub - Climate + - Binary Sensor + - Energy - Sensor - - Switch ha_release: 0.56 logo: toon.png ha_iot_class: "Cloud Polling" @@ -21,52 +21,52 @@ redirect_from: - /components/switch.toon/ --- -The `toon` component platform can be used to control your Toon thermostat. This component adds a climate device for your Toon thermostat and sensors for power and gas consumption. The component also auto-detects any smart plugs, solar panels and smoke detectors connected to Toon and adds sensors and switches for them. +The `toon` component platform can be used to control your Toon thermostat. This component adds a climate device for your Toon thermostat, sensors for power and gas consumption, sensors for solar production and several binary sensors for things like boiler burner on/off, hot tap water and boiler health status. + +For the `toon` component to work, you'll need an active Toon subscription with Eneco and a Toon API developer account. There is currently support for the following device types within Home Assistant: +- Binary Sensor - [Climate](#climate) - Sensor -- Switch -For the `toon` component to work, you'll need an active Toon subscription with Eneco. The component uses your Mijn Eneco credentials to control your thermostat through the [toonopafstand](https://toonopafstand.eneco.nl) domain. +## {% linkable_title Setting up a developer account %} + +In order to be able to use this component, you'll need to sign up for a free Toon API developer account. + +1. Visit the [Toon API developers website](https://developer.toon.eu/), and [sign in](https://developer.toon.eu/user/login). [Create an account](https://developer.toon.eu/user/register) if you don’t have one already. +2. Open the "[My Apps](https://developer.toon.eu/user/me/apps)" page and click on "Add a new App" button on the top right. +3. The "Add App" page shows a form with two fields: + - **App Name**: Can be anything you like, for example, "Home Assistant" will just do. + - **Callback URL**: Fill in `localhost` in this field. +4. Click on "Create App" to complete the creation process. +5. Open the "[My Apps](https://developer.toon.eu/user/me/apps)" page again and click on the app that you've just created. +6. You need the codes now shown: "Consumer Key" and "Consumer Secret". +7. Add the Toon component to your `configuration.yaml` and restart Home Assistant. Then, go to `Configuration > Integrations` and select `CONFIGURE` next to Toon and follow the setup instructions. ## {% linkable_title Configuration %} -To use your Toon thermostat in your installation, add the following to your `configuration.yaml` file: +To use your Toon in your installation, add the following to your `configuration.yaml` file: ```yaml # Example configuration.yaml entry toon: - username: YOUR_USERNAME - password: YOUR_PASSWORD + client_id: YOUR_CONSUMER_KEY + client_secret: YOUR_CONSUMER_SECRET ``` {% configuration %} -username: - description: Username for Mijn Eneco. +client_id: + description: Toon API Consumer Key. required: true type: string -password: - description: Password for Mijn Eneco. +client_secret: + description: Toon API Consumer Secret. required: true type: string -gas: - description: With this option you can choose whether you want to measure gas consumption. - required: false - type: boolean - default: true -solar: - description: With this option you can choose whether you want to measure electricity production. - required: false - type: boolean - default: false {% endconfiguration %} -Toon is a smart thermostat delivered by the Eneco power company in The Netherlands. It can measure energy consumption (power and gas), but also the amount of energy generated in case solar panels are connected to it. Toon also acts as a z-wave hub for supported devices like the wall plug and the smoke detector. This component uses the [toonlib library](https://github.com/costastf/toonlib) by Costas Tyfoxylos that connects to the unofficial API on [https://toonopafstand.eneco.nl](https://toonopafstand.eneco.nl). - -The current version of this component supports setting any of the four built-in programs and setting the temperature manually. It polls the Toon API at 30 second intervals so the status is relatively fresh without overloading the API. - ## {% linkable_title Climate %} The `toon` climate platform allows you to interact with your Toon thermostat. For compatibility reasons, the states in Home Assistant are different from the states displayed on your Toon device and are mapped as follows: @@ -77,3 +77,7 @@ The `toon` climate platform allows you to interact with your Toon thermostat. Fo | Heat | Thuis | | Eco | Weg | | Cool | Slapen | + +It also supports setting the temperature manually. + +The Toon API is polled at a 30-second interval, so the status is relatively fresh without overloading the API. From 33336fb7c25e4badd0e745509bef38f0aec773dc Mon Sep 17 00:00:00 2001 From: Thibault Maekelbergh Date: Wed, 27 Feb 2019 00:08:33 +0100 Subject: [PATCH 51/64] Update new configuration options for sensor.nmbs (#8201) * Add docs * Update to use the standars * Update source/_components/sensor.nmbs.markdown Co-Authored-By: thibmaek * Update source/_components/sensor.nmbs.markdown Co-Authored-By: thibmaek * Update source/_components/sensor.nmbs.markdown Co-Authored-By: thibmaek * Update source/_components/sensor.nmbs.markdown Co-Authored-By: thibmaek * Update source/_components/sensor.nmbs.markdown Co-Authored-By: thibmaek * Update source/_components/sensor.nmbs.markdown Co-Authored-By: thibmaek * Update source/_components/sensor.nmbs.markdown Co-Authored-By: thibmaek * Update source/_components/sensor.nmbs.markdown Co-Authored-By: thibmaek * Add nmbs logo * Add note on where to find station identifiers * Update source/_components/sensor.nmbs.markdown Co-Authored-By: thibmaek * Change release version * Correct key * Update with new conf options for sensor.nmbs * :pencil2: Tweaks * :ambulance: Reverts ha_version change --- source/_components/sensor.nmbs.markdown | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/source/_components/sensor.nmbs.markdown b/source/_components/sensor.nmbs.markdown index 664588f99c8..34395044768 100644 --- a/source/_components/sensor.nmbs.markdown +++ b/source/_components/sensor.nmbs.markdown @@ -26,6 +26,7 @@ sensor: station_from: "STATION_1" station_to: "STATION_2" station_live: "STATION_1" + exclude_vias: true ``` The stations can only be provided by their standard names and not ids. The list of stations can be checked on the NMBS/SCNB website but for most accurate results check them on the [iRail API page](https://api.irail.be/stations/) which this component uses internally. @@ -43,9 +44,19 @@ station_live: description: Setting this will create another sensor to monitor the liveboard in a station. required: false type: string +exclude_vias: + description: Setting this will not show connections for which you have to transfer to another station. + required: false + type: boolean + default: false name: description: Name to use in the frontend. required: false type: string default: "`NMBS`, `NMBS Live` for the liveboard sensor when set." +show_on_map: + description: Show the station on the map. + required: false + type: boolean + default: false {% endconfiguration %} From b25f598c35ec83855e40e6f362a0c22b76ca3d27 Mon Sep 17 00:00:00 2001 From: Rohan Kapoor Date: Tue, 26 Feb 2019 16:38:34 -0800 Subject: [PATCH 52/64] Update docs for the new iperf3 component (#8750) --- ...sensor.iperf3.markdown => iperf3.markdown} | 69 ++++++++++++++----- 1 file changed, 53 insertions(+), 16 deletions(-) rename source/_components/{sensor.iperf3.markdown => iperf3.markdown} (63%) diff --git a/source/_components/sensor.iperf3.markdown b/source/_components/iperf3.markdown similarity index 63% rename from source/_components/sensor.iperf3.markdown rename to source/_components/iperf3.markdown index 44c5e7f3696..4b0e7f85883 100644 --- a/source/_components/sensor.iperf3.markdown +++ b/source/_components/iperf3.markdown @@ -8,17 +8,23 @@ comments: false sharing: true footer: true logo: iperf3.png -ha_category: System Monitor +ha_category: + - System Monitor + - Sensor featured: false ha_release: 0.71 ha_iot_class: "Local Polling" +redirect_from: + - /components/sensor.iperf3/ --- The `iperf3` sensor component allows you to measure network bandwidth performance against a private or public Iperf3 server. -## {% linkable_title Configuration %} +Enabling this component will automatically create the Iperf3 Sensors for the monitored conditions (below). -By default, it will run every hour. The user can change the update frequency in the config by defining the minute, hour, and day for a iperf3 test to run. +By default, it will run every hour. The user can change the update frequency in the config by defining the `scan_interval` for a iperf3 test to run. + +## {% linkable_title Configuration %} To add the `iperf3` sensor to your installation, add the following to your `configuration.yaml` file: @@ -28,26 +34,48 @@ Once per hour, on the hour (default): # Example configuration.yaml entry sensor: - platform: iperf3 - host: iperf.he.net - monitored_conditions: - - download - - upload + hosts: + - host: iperf.he.net ``` {% configuration %} monitored_conditions: description: Sensors to display in the frontend. - required: true + required: false type: list keys: download: description: Download speed (Mbit/s) upload: description: Upload speed (Mbit/s) + hosts: + description: A list of Iperf3 servers to perform the test against. + required: true + type: list + scan_interval: + description: "Minimum time interval between updates. Supported formats: `scan_interval: 'HH:MM:SS'`, `scan_interval: 'HH:MM'` and Time period dictionary (see example below)." + required: false + default: 60 minutes + type: time + manual: + description: > + `true` or `false` to turn manual mode on or off. Manual mode will disable scheduled tests. + required: false + type: boolean + default: false +{% endconfiguration %} + +Configuration variables (host): +{% configuration %} host: - description: Specify the Iperf3 test to perform the test against. + description: Server name/ip address running Iperf3 to test against. required: true type: string + port: + description: Port that Iperf3 is running on. + required: false + default: 5201 + type: integer duration: description: Specify the test duration in seconds. Default is 10 and the valid range is from 5 to 10. required: false @@ -62,13 +90,20 @@ sensor: required: false default: tcp type: string - scan_interval: - description: Specify the frequency in seconds which the test will be perfomed. Default value is 1 hour. - required: false - default: 3600 - type: integer {% endconfiguration %} +#### {% linkable_title Time period dictionary example %} + +```yaml +scan_interval: + # At least one of these must be specified: + days: 0 + hours: 0 + minutes: 3 + seconds: 30 + milliseconds: 0 +``` + You can find a list of public Iperf3 servers [here](https://iperf.fr/iperf-servers.php). You can also start your own Iperf3 server using the [mlabbe/iperf3's](https://hub.docker.com/r/mlabbe/iperf3/) docker image or just refer to your `iperf3` command's man page. The frequency when the test will be automatically triggered can be adjusted by setting the value `scan_interval` in seconds. @@ -77,10 +112,12 @@ Parallel streams can help in some situations. As TCP attempts to be fair and con You can use the service `sensor.iperf3_update` to trigger a manual speed test for all sensors. Iperf3 has its own service call that allow to perform a speed test on a particular entity. -### {% linkable_title Service `sensor.iperf3_update` %} +### {% linkable_title Service %} + +Once loaded, the `iperf3` component will expose a service (`iperf3.speedtest`) that can be called to run a speed test on demand. This can be useful if you have enabled manual mode. | Service data attribute | Description | -| `entity_id` | String that point at `entity_id`s of the Iperf3 sensor. Else targets all. +| `host` | String that point at a configured `host` from configuration.yaml. Otherwise, tests will be run against all configured hosts. ## {% linkable_title Notes %} From 02140fb2b1f4e2b148c19ec6a57bde107e75d8fd Mon Sep 17 00:00:00 2001 From: Andrew Sayre <6730289+andrewsayre@users.noreply.github.com> Date: Tue, 26 Feb 2019 18:55:01 -0600 Subject: [PATCH 53/64] Add SmartThings Scene platform docs (#8718) * Add SmartThings Scene docs * :pencil2: Tweak --- source/_components/smartthings.markdown | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/source/_components/smartthings.markdown b/source/_components/smartthings.markdown index 9a5ddc68558..db2b6fa7530 100644 --- a/source/_components/smartthings.markdown +++ b/source/_components/smartthings.markdown @@ -18,6 +18,7 @@ ha_category: - Light - Lock - Sensor + - Scene - Switch ha_release: "0.87" ha_iot_class: "Cloud Push" @@ -36,6 +37,8 @@ redirect_from: - /components/lock.smartthings/ - /components/smartthings.sensor/ - /components/sensor.smartthings/ + - /components/smartthings.scene/ + - /components/scene.smartthings/ - /components/smartthings.switch/ - /components/switch.smartthings/ --- @@ -132,7 +135,8 @@ SmartThings represents devices as a set of [capabilities](https://smartthings.de - [Fan](#fan) - [Light](#light) - [Lock](#lock) -- [Sensor](#sensor) +- [Sensor](#sensor) +- [Scene](#scene) - [Switch](#switch) Support for additional platforms will be added in the future. @@ -259,6 +263,10 @@ The SmartThings Sensor platform lets your view devices that have sensor-related | [`washerMode`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Washer-Mode) | `washerMode` | [`washerOperatingState`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Washer-Operating-State) | `machineState`, `washerJobState` and `completionTime` +### {% linkable_title Scene %} + +The SmartThings Scene platform lets you activate scenes defined in SmartThings with a scene entity representing each SmartThings scenes within the location. + ### {% linkable_title Switch %} The SmartThings Switch platform lets you control devices that have the [`switch`](https://smartthings.developer.samsung.com/develop/api-ref/capabilities.html#Switch) capability that are not already represented by a more specific platform. The following optional capabilities will provide energy and power utilization information: From 3514a7baea066ce7fa5bddf8ac4ebcf7be968264 Mon Sep 17 00:00:00 2001 From: Jason Hu Date: Tue, 26 Feb 2019 16:58:46 -0800 Subject: [PATCH 54/64] Add config for trusted networks auth provider (#8605) * Update providers.markdown * Update providers.markdown --- .../_docs/authentication/providers.markdown | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/source/_docs/authentication/providers.markdown b/source/_docs/authentication/providers.markdown index d5d9e9bdbff..a36531c6258 100644 --- a/source/_docs/authentication/providers.markdown +++ b/source/_docs/authentication/providers.markdown @@ -63,7 +63,7 @@ The Trusted Networks auth provider defines a range of IP addresses for which no When you log in from one of these networks, you will be asked which user account to use and won't need to enter a password.

-The [multi-factor authentication module](/docs/authentication/multi-factor-auth/) will not participate in the login process if you using this auth provider. +The [multi-factor authentication module](/docs/authentication/multi-factor-auth/) will not participate in the login process if you are using this auth provider.

Here is an example in `configuration.yaml` to set up Trusted Networks: @@ -71,18 +71,16 @@ Here is an example in `configuration.yaml` to set up Trusted Networks: ```yaml homeassistant: auth_providers: - - type: trusted_networks - -# Temporary, this will be moved to be part of auth provider config -# https://github.com/home-assistant/home-assistant/issues/16149 -http: - trusted_networks: - - 127.0.0.1 - - ::1 - - 192.168.0.0/24 - - fd00::/8 + - type: trusted_networks + trusted_networks: + - 127.0.0.1 + - ::1 + - 192.168.0.0/24 + - fd00::/8 ``` +If you don't specify any `auth_providers` section in the `configuration.yaml` file then this provider will be set up automatically if `trusted_networks` was configured under `http` section. + ### {% linkable_title Command Line %} The Command Line auth provider executes a configurable shell command to perform user authentication. Two environment variables, `username` and `password`, are passed to the command. Access is granted when the command exits successfully (with exit code 0). @@ -141,6 +139,8 @@ http: Activating this auth provider will also allow you to provide the API password using an authentication header to make requests against the Home Assistant API. This feature will be dropped in the future in favor of long-lived access tokens. +If you don't specify any `auth_providers` section in the `configuration.yaml` file then this provider will be set up automatically if `api_password` was configured under `http` section. +

[Issue 16441](https://github.com/home-assistant/home-assistant/issues/16441): the legacy API password auth provider, won't be automatically configured if your API password is located in a package. This is because Home Assistant processes the `auth_provider` during the `core` section loading, which is earlier than the `packages` processing.

From bf8ad659dbd0feff8613362acfb22f1a40d63491 Mon Sep 17 00:00:00 2001 From: Leonardo Merza Date: Tue, 26 Feb 2019 20:06:44 -0500 Subject: [PATCH 55/64] Reddit Sensor (#8675) * automated commit 21/02/2019 20:05:00 * :pencil2: Tweaks --- source/_components/sensor.reddit.markdown | 59 ++++++++++++++++++++++ source/images/reddit.png | Bin 0 -> 11272 bytes 2 files changed, 59 insertions(+) create mode 100644 source/_components/sensor.reddit.markdown create mode 100644 source/images/reddit.png diff --git a/source/_components/sensor.reddit.markdown b/source/_components/sensor.reddit.markdown new file mode 100644 index 00000000000..33abd9c9b03 --- /dev/null +++ b/source/_components/sensor.reddit.markdown @@ -0,0 +1,59 @@ +--- +layout: page +title: "Reddit Sensor" +description: "How to integrate the Reddit sensor into Home Assistant." +date: 2018-02-21 20:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: reddit.png +ha_category: Sensor +ha_release: 0.89 +ha_iot_class: "Cloud Polling" +--- + +The Reddit sensor integrates data from [Reddit](https://reddit.com/) to monitor your favorite subreddits. + +## {% linkable_title Setup %} + +To set up this sensor, you will need to generate a `client_id` and `client_secret` for the user account you will use to connect. Follow the first steps in [this wiki](https://github.com/reddit-archive/reddit/wiki/OAuth2-Quick-Start-Example). + +## {% linkable_title Configuration %} + +To enable this platform, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +- platform: reddit + username: !secret reddit_username + password: !secret reddit_password + client_id: !secret reddit_client_id + client_secret: !secret reddit_client_secret + subreddits: + - news + - worldnews +``` + +{% configuration %} +username: + description: Your Reddit account username. + required: true + type: string +password: + description: Your Reddit account password. + required: true + type: string +client_id: + description: Your Reddit account client_id generated from the wiki above. + required: true + type: string +client_secret: + description: Your Reddit account client_secret generated from the wiki above. + required: true + type: string +subreddits: + description: List of subreddits you want to get data on. + required: true + type: list +{% endconfiguration %} diff --git a/source/images/reddit.png b/source/images/reddit.png new file mode 100644 index 0000000000000000000000000000000000000000..b560fb18f37522a046f5966562a252ccefa9433e GIT binary patch literal 11272 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 LijvjhZ-V{<9)czA literal 0 HcmV?d00001 From 4cea9f0cf5060d7080ae638a6bef6771f2913137 Mon Sep 17 00:00:00 2001 From: Petro31 <35082313+Petro31@users.noreply.github.com> Date: Tue, 26 Feb 2019 23:03:00 -0500 Subject: [PATCH 56/64] Add person domain to Waze Travel Time (#8757) Linked PR https://github.com/home-assistant/home-assistant/pull/21471 --- source/_components/sensor.waze_travel_time.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_components/sensor.waze_travel_time.markdown b/source/_components/sensor.waze_travel_time.markdown index 4886e21ce55..ba24f4da73e 100644 --- a/source/_components/sensor.waze_travel_time.markdown +++ b/source/_components/sensor.waze_travel_time.markdown @@ -32,11 +32,11 @@ sensor: {% configuration %} origin: - description: Enter the starting address or the GPS coordinates of the location (GPS coordinates has to be separated by a comma). You can also enter the entity id of a sensor, device_tracker or zone, which provides this information in its state. + description: Enter the starting address or the GPS coordinates of the location (GPS coordinates has to be separated by a comma). You can also enter the entity id of a sensor, device_tracker, person, or zone, which provides this information in its state. required: true type: string destination: - description: Enter the destination address or the GPS coordinates of the location (GPS coordinates has to be separated by a comma). You can also enter the entity id of a sensor, device_tracker or zone, which provides this information in its state. + description: Enter the destination address or the GPS coordinates of the location (GPS coordinates has to be separated by a comma). You can also enter the entity id of a sensor, device_tracker, person, or zone, which provides this information in its state. required: true type: string region: From 5f6c660821ad67c2429b291b1da20be02d79be52 Mon Sep 17 00:00:00 2001 From: Kevin Tuhumury Date: Wed, 27 Feb 2019 07:21:26 +0100 Subject: [PATCH 57/64] Add cpu_use_percent as a resource to the Glances sensor. (#8752) --- source/_components/sensor.glances.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_components/sensor.glances.markdown b/source/_components/sensor.glances.markdown index 1773dda96f5..a8a10feddea 100644 --- a/source/_components/sensor.glances.markdown +++ b/source/_components/sensor.glances.markdown @@ -125,6 +125,8 @@ resources: description: The number of threads. process_sleeping: description: The number of sleeping processes. + cpu_use_percent: + description: The used CPU in percent. cpu_temp: description: The CPU temperature (may not be available on all platforms). docker_active: From 25a8c49225e3f3fa69222deedb8a0cf6adb5b1a6 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 27 Feb 2019 16:49:49 -0800 Subject: [PATCH 58/64] Release 89 draft --- source/_posts/2019-03-13-release-89.markdown | 552 +++++++++++++++++++ 1 file changed, 552 insertions(+) create mode 100644 source/_posts/2019-03-13-release-89.markdown diff --git a/source/_posts/2019-03-13-release-89.markdown b/source/_posts/2019-03-13-release-89.markdown new file mode 100644 index 00000000000..4bb59919dc0 --- /dev/null +++ b/source/_posts/2019-03-13-release-89.markdown @@ -0,0 +1,552 @@ +--- +layout: post +title: "0.89: TBD - UPDATE DAte" +description: "TBD" +date: 2019-02-27 00:11:03 +date_formatted: "March 13, 2019" +author: Paulus Schoutsen +author_twitter: balloob +comments: true +categories: Release-Notes +og_image: /images/blog/2019-03-release-89/components.png +--- + +
+ +## {% linkable_title New Platforms %} + +- Météo-France platform for the weather component ([@victorcerutti] - [#18404]) ([sensor.meteo_france docs]) ([weather.meteo_france docs]) (new-platform) +- Point alarm control ([@fredrike] - [#20972]) ([point docs]) (new-platform) +- Times of The Day Binary Sensor ([@kstaniek] - [#20068]) ([binary_sensor.tod docs]) (new-platform) +- Nissan Leaf Integration (Carwings / NissanConnect EV) ([@filcole] - [#19786]) ([device_tracker docs]) ([nissan_leaf docs]) ([binary_sensor.nissan_leaf docs]) ([sensor.nissan_leaf docs]) ([switch.nissan_leaf docs]) (new-platform) +- Add switch platform for Danfoss Air and additional sensors. ([@JonasPed] - [#21046]) ([danfoss_air docs]) (new-platform) +- Owlet baby monitor component ([@oblogic7] - [#21108]) ([owlet docs]) (new-platform) +- deCONZ thermostat support ([@Kane610] - [#20586]) ([deconz docs]) (new-platform) +- Added device tracker support for Ubee Router ([@mzdrale] - [#19586]) ([device_tracker docs]) (new-platform) +- Nissanleaf ([@filcole] - [#21145]) ([nissan_leaf docs]) (new-platform) +- Add LCN cover platform ([@alengwenus] - [#20288]) ([lcn docs]) ([cover.lcn docs]) (new-platform) +- Split out iperf3 into a component with a sensor platform ([@rohankapoorcom] - [#21138]) ([iperf3 docs]) ([sensor.iperf3 docs]) (breaking change) (new-platform) +- Add initial support for Sony SDCP projector control ([@alistairg] - [#20269]) ([switch.sony_projector docs]) (new-platform) +- Refactoring. Moved LCN constants to const.py ([@alengwenus] - [#21376]) ([lcn docs]) (new-platform) +- Add SmartThings Cover platform and add cover device classes ([@andrewsayre] - [#21192]) ([cover docs]) ([smartthings docs]) (breaking change) (new-platform) +- Rewrite of Toon component ([@frenck] - [#21186]) ([toon docs]) (breaking change) (new-platform) +- Add SmartThings Scene platform ([@andrewsayre] - [#21405]) ([smartthings docs]) (new-platform) +- Reddit Sensor ([@ljmerza] - [#21344]) ([sensor.reddit docs]) (new-platform) + +## {% linkable_title New Features %} + +- Enhance SmartThings component subscription ([@andrewsayre] - [#21124]) ([smartthings docs]) (breaking change) (new-feature) +- SmartThings Lock platform state attributes enhancement ([@andrewsayre] - [#21379]) ([smartthings docs]) (new-feature) +- Add power and energy attributes to SmartThings switch ([@andrewsayre] - [#21375]) ([smartthings docs]) (new-feature) + +## {% linkable_title If you need help... %} + +...don't hesitate to use our very active [forums](https://community.home-assistant.io/) or join us for a little [chat](https://discord.gg/c5DvZ4e). The release notes have comments enabled but it's preferred if you use the former communication channels. Thanks. + +## {% linkable_title Reporting Issues %} + +Experiencing issues introduced by this release? Please report them in our [issue tracker](https://github.com/home-assistant/home-assistant/issues). Make sure to fill in all fields of the issue template. + + + +## {% linkable_title Breaking Changes %} + +- RSSI_PEER and RSSI_DEVICE are different things (fixes #20900) ([@dagobert] - [#20902]) ([homematic docs]) (breaking change) +- Add yeelight flow action support ([@zewelor] - [#21195]) ([light.yeelight docs]) (breaking change) +- Prevent partial custom component overlays ([@balloob] - [#21070]) (breaking change) +- Add support for automatic discovery of TP-Link switches, bulbs and dimmers ([@rytilahti] - [#18091]) ([tplink docs]) ([light.tplink docs]) ([switch.tplink docs]) (breaking change) +- Enhance SmartThings component subscription ([@andrewsayre] - [#21124]) ([smartthings docs]) (breaking change) (new-feature) +- Split out iperf3 into a component with a sensor platform ([@rohankapoorcom] - [#21138]) ([iperf3 docs]) ([sensor.iperf3 docs]) (breaking change) (new-platform) +- Remove the google travel time update service ([@rohankapoorcom] - [#21153]) ([sensor.google_travel_time docs]) (breaking change) +- Add ADB server functionality to Fire TV ([@JeffLIrion] - [#21221]) ([media_player.firetv docs]) (breaking change) +- Add SmartThings Cover platform and add cover device classes ([@andrewsayre] - [#21192]) ([cover docs]) ([smartthings docs]) (breaking change) (new-platform) +- Rewrite of Toon component ([@frenck] - [#21186]) ([toon docs]) (breaking change) (new-platform) +- Add config for trusted networks auth provider ([@awarecan] - [#21111]) (breaking change) +- HomeMatic: Add error-attribute ([@dagobert] - [#21009]) ([homematic docs]) (breaking change) + +## {% linkable_title All changes %} + +- Météo-France platform for the weather component ([@victorcerutti] - [#18404]) ([sensor.meteo_france docs]) ([weather.meteo_france docs]) (new-platform) +- Update file header ([@fabaff] - [#21061]) +- Climate const.py move ([@elupus] - [#20945]) +- Update file header ([@fabaff] - [#21067]) +- Rename CONF_ATTRIBUTION to ATTRIBUTION ([@fabaff] - [#21069]) +- Bump pyHik library to 0.2.2, improve connections, add sensors ([@mezz64] - [#21086]) ([binary_sensor.hikvision docs]) +- Meteo france ([@fabaff] - [#21065]) ([meteo_france docs]) +- Fix "Unable to find entity" at Waze component ([@VirtualL] - [#21087]) ([sensor.waze_travel_time docs]) +- Point alarm control ([@fredrike] - [#20972]) ([point docs]) (new-platform) +- Times of The Day Binary Sensor ([@kstaniek] - [#20068]) ([binary_sensor.tod docs]) (new-platform) +- Nissan Leaf Integration (Carwings / NissanConnect EV) ([@filcole] - [#19786]) ([device_tracker docs]) ([nissan_leaf docs]) ([binary_sensor.nissan_leaf docs]) ([sensor.nissan_leaf docs]) ([switch.nissan_leaf docs]) (new-platform) +- Add switch platform for Danfoss Air and additional sensors. ([@JonasPed] - [#21046]) ([danfoss_air docs]) (new-platform) +- Config Entry migrations ([@andrewsayre] - [#20888]) +- Refactor http CachingStaticResource ([@awarecan] - [#21062]) ([http docs]) +- Add index parameter to scrape sensor ([@davidbb] - [#21084]) ([sensor.scrape docs]) +- Owlet baby monitor component ([@oblogic7] - [#21108]) ([owlet docs]) (new-platform) +- Order imports ([@fabaff] - [#21117]) ([owlet docs]) +- Add Groups to Homematic IP ([@SukramJ] - [#21076]) ([homematicip_cloud docs]) +- Remove outdated url pattern match support for static file hosting ([@awarecan] - [#21109]) ([http docs]) +- Upgrade pytest to 4.2.1 ([@scop] - [#21112]) +- Make Netatmo able to discover both Weather station and Health Coach ([@msvinth] - [#20274]) +- Add webhook support for Netatmo Cameras ([@danielperna84] - [#20755]) ([netatmo docs]) +- Logging to find what deCONZ events get created ([@Kane610] - [#20551]) +- Add traccar scan_interval configuration option ([@lapy] - [#21079]) ([device_tracker docs]) +- Add component media player.ps4 ([@ktnrg45] - [#21074]) ([ps4 docs]) +- Add traccar monitored_conditions option ([@lapy] - [#21149]) ([device_tracker docs]) +- RSSI_PEER and RSSI_DEVICE are different things (fixes #20900) ([@dagobert] - [#20902]) ([homematic docs]) (breaking change) +- Upgrade voluptuous-serialize to 2.1.0 ([@fabaff] - [#21166]) +- Upgrade youtube_dl to 2019.02.18 ([@fabaff] - [#21164]) ([media_extractor docs]) +- Upgrade sqlalchemy to 1.2.18 ([@fabaff] - [#21162]) ([sensor.sql docs]) +- Upgrade psutil to 5.5.1 ([@fabaff] - [#21171]) ([sensor.systemmonitor docs]) +- Fix HomematicIP Cloud fix cover position property ([@mxworm] - [#21154]) ([homematicip_cloud docs]) +- Clean up upc_connect tests ([@MartinHjelmare] - [#21150]) +- deCONZ thermostat support ([@Kane610] - [#20586]) ([deconz docs]) (new-platform) +- Add context to service call event ([@balloob] - [#21181]) +- Expose effect_list attribute for turned off lights ([@OleksandrBerchenko] - [#20750]) +- Philips Hue: Add bridge update prompt ([@starkillerOG] - [#21119]) ([hue docs]) +- Upgrade crimereports to 1.0.1 ([@fabaff] - [#21187]) ([sensor.crimereports docs]) +- Netatmo, address comments from #20755 ([@danielperna84] - [#21157]) ([netatmo docs]) +- Use constants from const.py ([@fabaff] - [#21068]) ([insteon docs]) ([knx docs]) ([raspihats docs]) ([light.rpi_gpio_pwm docs]) ([sensor.etherscan docs]) ([sensor.ripple docs]) ([sensor.sochain docs]) +- Bump Synology SRM dependency to version 0.0.6 ([@aerialls] - [#21212]) ([device_tracker docs]) +- Upgrade numpy to 1.16.1 ([@fabaff] - [#21190]) ([binary_sensor.trend docs]) ([image_processing.tensorflow docs]) ([sensor.pollen docs]) +- Fix Homematic IP Cloud configuration ([@bauerj] - [#21202]) ([homematicip_cloud docs]) +- Add yeelight flow action support ([@zewelor] - [#21195]) ([light.yeelight docs]) (breaking change) +- Fix the build ([@balloob] - [#21229]) +- Update pyhomematic to 0.1.56 ([@danielperna84] - [#21227]) ([homematic docs]) +- Add self to integration sensor and utility_meter ([@dgomes] - [#21226]) +- Add zone and reps for Xiaomi vacuum ([@marcogazzola] - [#19777]) ([vacuum.xiaomi_miio docs]) +- Bump zigpy ([@damarco] - [#21203]) ([zha docs]) +- Support OpenWRT 18.06 in luci device tracker ([@fbradyirl] - [#21236]) ([device_tracker docs]) +- Remove constraint from regex ([@balloob] - [#21239]) +- Upgrade opensensemap-api to 0.1.4 ([@fabaff] - [#21240]) ([air_quality docs]) +- Alarm trigger support for Point ([@fredrike] - [#21207]) ([point docs]) +- Prevent partial custom component overlays ([@balloob] - [#21070]) (breaking change) +- Correctly detect devices, which went offline during HA restart ([@OleksandrBerchenko] - [#20933]) ([device_tracker docs]) +- Update rova component with suffix for house number ([@GidoHakvoort] - [#21182]) ([sensor.rova docs]) +- Added device tracker support for Ubee Router ([@mzdrale] - [#19586]) ([device_tracker docs]) (new-platform) +- account specific cookies file to enable multiple accounts ([@ToSa27] - [#19811]) ([device_tracker docs]) +- Add support for automatic discovery of TP-Link switches, bulbs and dimmers ([@rytilahti] - [#18091]) ([tplink docs]) ([light.tplink docs]) ([switch.tplink docs]) (breaking change) +- Version bump: python-anthemav to v1.1.9 ([@nugget] - [#21273]) ([media_player.anthemav docs]) +- Do not warn for internally loaded components ([@balloob] - [#21287]) +- Remove index ([@fabaff] - [#21304]) +- Adding myself as codeowner for Freebox component ([@SNoof85] - [#21288]) +- Nissanleaf ([@filcole] - [#21145]) ([nissan_leaf docs]) (new-platform) +- Config entry options ([@Kane610] - [#18929]) ([deconz docs]) +- Enhance SmartThings component subscription ([@andrewsayre] - [#21124]) ([smartthings docs]) (breaking change) (new-feature) +- Add more ads plc types ([@philipperequile] - [#19801]) ([ads docs]) +- Add note to issue template regarding iOS issues ([@robbiet480] - [#21342]) +- Allow google home component device tracker to be optional ([@dshokouhi] - [#21335]) ([googlehome docs]) +- Add LCN cover platform ([@alengwenus] - [#20288]) ([lcn docs]) ([cover.lcn docs]) (new-platform) +- Add location to Norway airquality ([@Danielhiversen] - [#21347]) ([air_quality docs]) ([weather.met docs]) +- Updated pyvlx from 0.2.8 to 0.2.9. This version has slightly improved logging ([@Julius2342] - [#21349]) ([velux docs]) +- Update buienradar.py ([@hmmbob] - [#21351]) ([sensor.buienradar docs]) +- Fixes the sensor.filter outlier filter (handle step-changes correctly) ([@siberx] - [#21332]) ([sensor.filter docs]) +- Allows the utility_meter to net meter rather than only allow increases. ([@JBassett] - [#21204]) ([utility_meter docs]) +- implementing freedaily mode ([@tmechen] - [#21314]) ([weather.openweathermap docs]) +- Add voltage per phase ([@leeuwte] - [#21319]) ([sensor.dsmr docs]) +- Add conf_key check for LCN platform load ([@alengwenus] - [#21354]) ([lcn docs]) +- Update luci device tracker ([@fbradyirl] - [#21321]) ([device_tracker docs]) +- Support the person component in Prometheus ([@mitchellrj] - [#21363]) ([prometheus docs]) +- Update Starling Bank Integration to v2 API ([@Dullage] - [#21358]) ([sensor.starlingbank docs]) +- Split out iperf3 into a component with a sensor platform ([@rohankapoorcom] - [#21138]) ([iperf3 docs]) ([sensor.iperf3 docs]) (breaking change) (new-platform) +- Add custom and zone cleaning to Neato Vacuums ([@RomRider] - [#20779]) ([neato docs]) +- Add initial support for Sony SDCP projector control ([@alistairg] - [#20269]) ([switch.sony_projector docs]) (new-platform) +- Check for attribute existence for HS220 support ([@rytilahti] - [#21309]) ([tplink docs]) +- Generate new Discogs sensors + fix scan interval ([@thibmaek] - [#19443]) ([sensor.discogs docs]) +- Update panasonic_viera.py ([@Tony763] - [#21365]) ([media_player.panasonic_viera docs]) +- Handle connection issue for netatmo ([@Danielhiversen] - [#21346]) ([netatmo docs]) +- Refactoring. Moved LCN constants to const.py ([@alengwenus] - [#21376]) ([lcn docs]) (new-platform) +- Clean up owntracks tests ([@MartinHjelmare] - [#21378]) +- Remove the google travel time update service ([@rohankapoorcom] - [#21153]) ([sensor.google_travel_time docs]) (breaking change) +- SmartThings Lock platform state attributes enhancement ([@andrewsayre] - [#21379]) ([smartthings docs]) (new-feature) +- Upgrade shodan to 1.11.0 ([@fabaff] - [#21384]) ([sensor.shodan docs]) +- Update ordering ([@fabaff] - [#21377]) ([modbus docs]) +- Bump nessclient version to 0.9.10 ([@nickw444] - [#21388]) ([ness_alarm docs]) +- Handle capitalized HomeKit property names ([@koreth] - [#21382]) ([homekit_controller docs]) +- Update WazeTravelSensor to 0.9 ([@hmmbob] - [#21130]) ([sensor.waze_travel_time docs]) +- Clean up geofency test ([@MartinHjelmare] - [#21397]) +- Clean up locative tests ([@MartinHjelmare] - [#21400]) +- Add Sonos discovery of multiple households ([@amelchio] - [#21337]) ([sonos docs]) +- Philips js state ([@elupus] - [#21407]) ([media_player.philips_js docs]) +- Add ADB server functionality to Fire TV ([@JeffLIrion] - [#21221]) ([media_player.firetv docs]) (breaking change) +- Upgrade pytest to 4.3.0 ([@scop] - [#21412]) +- Upgrade mypy to 0.670 ([@scop] - [#20934]) +- Update pylinky ([@tiste] - [#21416]) ([sensor.linky docs]) +- Mark water_heater as significant domain ([@elupus] - [#21390]) ([history docs]) +- Add power and energy attributes to SmartThings switch ([@andrewsayre] - [#21375]) ([smartthings docs]) (new-feature) +- Add SmartThings Cover platform and add cover device classes ([@andrewsayre] - [#21192]) ([cover docs]) ([smartthings docs]) (breaking change) (new-platform) +- Add ESPHome User-Defined Services ([@OttoWinter] - [#21409]) ([esphome docs]) +- Handle GA Disconnect intent ([@balloob] - [#21387]) ([google_assistant docs]) +- Fix double events on Lutron Pico keypads ([@koreth] - [#21408]) ([lutron docs]) +- Fix Sonos snapshot/restore ([@amelchio] - [#21411]) ([sonos docs]) +- Increase travis timeout ([@andrewsayre] - [#21447]) +- Rewrite of Toon component ([@frenck] - [#21186]) ([toon docs]) (breaking change) (new-platform) +- Check if a script requirement is available before install ([@kellerza] - [#20517]) +- Add timeout option to sensor.rest and binary_sensor.rest. ([@glogiotatidis] - [#20065]) ([binary_sensor.rest docs]) ([sensor.rest docs]) +- Clean up codeowners file ([@amelchio] - [#21442]) +- Upgrade flake8 to 3.7.7 ([@scop] - [#21452]) +- Clean up ZHA post rewrite ([@dmulcahey] - [#21448]) ([zha docs]) +- Add friendly name to devices in the device registry ([@dmulcahey] - [#21318]) ([config docs]) +- Fix ESPHome nodes being auto-added without user confirmation ([@OttoWinter] - [#21444]) ([esphome docs]) +- Fix for Snips platform update that breaks hermes api. ([@ptc] - [#21443]) ([snips docs]) +- Remove launching a server in a test ([@balloob] - [#21445]) +- Add SmartThings Scene platform ([@andrewsayre] - [#21405]) ([smartthings docs]) (new-platform) +- Adjust GTFS dates when crossing midnight ([@renemarc] - [#20916]) ([sensor.gtfs docs]) +- Reddit Sensor ([@ljmerza] - [#21344]) ([sensor.reddit docs]) (new-platform) +- Add config for trusted networks auth provider ([@awarecan] - [#21111]) (breaking change) +- Add HomematicIP HmIP-OC8 module ([@mxworm] - [#21401]) ([homematicip_cloud docs]) +- Added new econet states ([@w1ll1am23] - [#21420]) ([water_heater docs]) +- Comment out bluepy libraries from requirements_all.txt ([@Danielhiversen] - [#20856]) ([switch.switchbot docs]) ([switch.switchmate docs]) +- Update sensor.nmbs to support vias better + show on map ([@thibmaek] - [#20063]) ([sensor.nmbs docs]) +- Add mitemp bt sensor device class ([@blackray12] - [#20293]) ([sensor.mitemp_bt docs]) +- Add Somfy IO Garage door ([@dfournie] - [#21320]) ([tahoma docs]) +- Add person support for Waze Travel Time ([@Petro31] - [#21471]) ([sensor.waze_travel_time docs]) +- Add cpu_use_percent as a new resource to the Glances sensor. ([@kevintuhumury] - [#21455]) ([sensor.glances docs]) +- Added a digit for precipitation ([@helto4real] - [#21439]) ([smhi docs]) +- Upgrade bcrypt to 3.1.6 ([@fabaff] - [#21476]) +- Upgrade shodan to 1.11.1 ([@fabaff] - [#21478]) ([sensor.shodan docs]) +- Upgrade astral to 1.10.1 ([@fabaff] - [#21474]) +- Refactor async_turn_on() for ZHA Light. ([@Adminiuga] - [#21156]) ([zha docs]) +- Add device_info to enable HA-devices for Homematic IP ([@SukramJ] - [#21241]) ([homematicip_cloud docs]) +- Fire events when Google Assistant commands come in #15139 ([@Swamp-Ig] - [#20204]) ([google_assistant docs]) +- pylint 2.3.0 ([@Danielhiversen] - [#21485]) +- HomeMatic: Add error-attribute ([@dagobert] - [#21009]) ([homematic docs]) (breaking change) +- Avoid unnecessary commands in Vizio update function ([@JeffLIrion] - [#20867]) +- Upgrade pyairvisual to 3.0.1 ([@bachya] - [#21512]) ([sensor.airvisual docs]) +- Bump simplisafe-python to 3.4.1 ([@bachya] - [#21511]) ([simplisafe docs]) +- Upgrade aioambient to 0.1.3 ([@bachya] - [#21510]) ([ambient_station docs]) +- Upgrade tibber lib ([@Danielhiversen] - [#21486]) ([tibber docs]) +- ness_alarm: Bump nessclient version to 0.9.13 ([@nickw444] - [#21466]) ([ness_alarm docs]) +- Bump ihc to 2.3.0 ([@msvinth] - [#21494]) ([ihc docs]) +- Changed source priority for Person ([@gorynychzmey] - [#21479]) + +[#18091]: https://github.com/home-assistant/home-assistant/pull/18091 +[#18404]: https://github.com/home-assistant/home-assistant/pull/18404 +[#18929]: https://github.com/home-assistant/home-assistant/pull/18929 +[#19443]: https://github.com/home-assistant/home-assistant/pull/19443 +[#19586]: https://github.com/home-assistant/home-assistant/pull/19586 +[#19777]: https://github.com/home-assistant/home-assistant/pull/19777 +[#19786]: https://github.com/home-assistant/home-assistant/pull/19786 +[#19801]: https://github.com/home-assistant/home-assistant/pull/19801 +[#19811]: https://github.com/home-assistant/home-assistant/pull/19811 +[#20063]: https://github.com/home-assistant/home-assistant/pull/20063 +[#20065]: https://github.com/home-assistant/home-assistant/pull/20065 +[#20068]: https://github.com/home-assistant/home-assistant/pull/20068 +[#20204]: https://github.com/home-assistant/home-assistant/pull/20204 +[#20269]: https://github.com/home-assistant/home-assistant/pull/20269 +[#20274]: https://github.com/home-assistant/home-assistant/pull/20274 +[#20288]: https://github.com/home-assistant/home-assistant/pull/20288 +[#20293]: https://github.com/home-assistant/home-assistant/pull/20293 +[#20517]: https://github.com/home-assistant/home-assistant/pull/20517 +[#20551]: https://github.com/home-assistant/home-assistant/pull/20551 +[#20586]: https://github.com/home-assistant/home-assistant/pull/20586 +[#20750]: https://github.com/home-assistant/home-assistant/pull/20750 +[#20755]: https://github.com/home-assistant/home-assistant/pull/20755 +[#20779]: https://github.com/home-assistant/home-assistant/pull/20779 +[#20856]: https://github.com/home-assistant/home-assistant/pull/20856 +[#20867]: https://github.com/home-assistant/home-assistant/pull/20867 +[#20888]: https://github.com/home-assistant/home-assistant/pull/20888 +[#20902]: https://github.com/home-assistant/home-assistant/pull/20902 +[#20916]: https://github.com/home-assistant/home-assistant/pull/20916 +[#20933]: https://github.com/home-assistant/home-assistant/pull/20933 +[#20934]: https://github.com/home-assistant/home-assistant/pull/20934 +[#20945]: https://github.com/home-assistant/home-assistant/pull/20945 +[#20972]: https://github.com/home-assistant/home-assistant/pull/20972 +[#21009]: https://github.com/home-assistant/home-assistant/pull/21009 +[#21046]: https://github.com/home-assistant/home-assistant/pull/21046 +[#21061]: https://github.com/home-assistant/home-assistant/pull/21061 +[#21062]: https://github.com/home-assistant/home-assistant/pull/21062 +[#21065]: https://github.com/home-assistant/home-assistant/pull/21065 +[#21067]: https://github.com/home-assistant/home-assistant/pull/21067 +[#21068]: https://github.com/home-assistant/home-assistant/pull/21068 +[#21069]: https://github.com/home-assistant/home-assistant/pull/21069 +[#21070]: https://github.com/home-assistant/home-assistant/pull/21070 +[#21074]: https://github.com/home-assistant/home-assistant/pull/21074 +[#21076]: https://github.com/home-assistant/home-assistant/pull/21076 +[#21079]: https://github.com/home-assistant/home-assistant/pull/21079 +[#21084]: https://github.com/home-assistant/home-assistant/pull/21084 +[#21086]: https://github.com/home-assistant/home-assistant/pull/21086 +[#21087]: https://github.com/home-assistant/home-assistant/pull/21087 +[#21108]: https://github.com/home-assistant/home-assistant/pull/21108 +[#21109]: https://github.com/home-assistant/home-assistant/pull/21109 +[#21111]: https://github.com/home-assistant/home-assistant/pull/21111 +[#21112]: https://github.com/home-assistant/home-assistant/pull/21112 +[#21117]: https://github.com/home-assistant/home-assistant/pull/21117 +[#21119]: https://github.com/home-assistant/home-assistant/pull/21119 +[#21124]: https://github.com/home-assistant/home-assistant/pull/21124 +[#21130]: https://github.com/home-assistant/home-assistant/pull/21130 +[#21138]: https://github.com/home-assistant/home-assistant/pull/21138 +[#21145]: https://github.com/home-assistant/home-assistant/pull/21145 +[#21149]: https://github.com/home-assistant/home-assistant/pull/21149 +[#21150]: https://github.com/home-assistant/home-assistant/pull/21150 +[#21153]: https://github.com/home-assistant/home-assistant/pull/21153 +[#21154]: https://github.com/home-assistant/home-assistant/pull/21154 +[#21156]: https://github.com/home-assistant/home-assistant/pull/21156 +[#21157]: https://github.com/home-assistant/home-assistant/pull/21157 +[#21162]: https://github.com/home-assistant/home-assistant/pull/21162 +[#21164]: https://github.com/home-assistant/home-assistant/pull/21164 +[#21166]: https://github.com/home-assistant/home-assistant/pull/21166 +[#21171]: https://github.com/home-assistant/home-assistant/pull/21171 +[#21181]: https://github.com/home-assistant/home-assistant/pull/21181 +[#21182]: https://github.com/home-assistant/home-assistant/pull/21182 +[#21186]: https://github.com/home-assistant/home-assistant/pull/21186 +[#21187]: https://github.com/home-assistant/home-assistant/pull/21187 +[#21190]: https://github.com/home-assistant/home-assistant/pull/21190 +[#21192]: https://github.com/home-assistant/home-assistant/pull/21192 +[#21195]: https://github.com/home-assistant/home-assistant/pull/21195 +[#21202]: https://github.com/home-assistant/home-assistant/pull/21202 +[#21203]: https://github.com/home-assistant/home-assistant/pull/21203 +[#21204]: https://github.com/home-assistant/home-assistant/pull/21204 +[#21207]: https://github.com/home-assistant/home-assistant/pull/21207 +[#21212]: https://github.com/home-assistant/home-assistant/pull/21212 +[#21221]: https://github.com/home-assistant/home-assistant/pull/21221 +[#21226]: https://github.com/home-assistant/home-assistant/pull/21226 +[#21227]: https://github.com/home-assistant/home-assistant/pull/21227 +[#21229]: https://github.com/home-assistant/home-assistant/pull/21229 +[#21236]: https://github.com/home-assistant/home-assistant/pull/21236 +[#21239]: https://github.com/home-assistant/home-assistant/pull/21239 +[#21240]: https://github.com/home-assistant/home-assistant/pull/21240 +[#21241]: https://github.com/home-assistant/home-assistant/pull/21241 +[#21273]: https://github.com/home-assistant/home-assistant/pull/21273 +[#21287]: https://github.com/home-assistant/home-assistant/pull/21287 +[#21288]: https://github.com/home-assistant/home-assistant/pull/21288 +[#21304]: https://github.com/home-assistant/home-assistant/pull/21304 +[#21309]: https://github.com/home-assistant/home-assistant/pull/21309 +[#21314]: https://github.com/home-assistant/home-assistant/pull/21314 +[#21318]: https://github.com/home-assistant/home-assistant/pull/21318 +[#21319]: https://github.com/home-assistant/home-assistant/pull/21319 +[#21320]: https://github.com/home-assistant/home-assistant/pull/21320 +[#21321]: https://github.com/home-assistant/home-assistant/pull/21321 +[#21332]: https://github.com/home-assistant/home-assistant/pull/21332 +[#21335]: https://github.com/home-assistant/home-assistant/pull/21335 +[#21337]: https://github.com/home-assistant/home-assistant/pull/21337 +[#21342]: https://github.com/home-assistant/home-assistant/pull/21342 +[#21344]: https://github.com/home-assistant/home-assistant/pull/21344 +[#21346]: https://github.com/home-assistant/home-assistant/pull/21346 +[#21347]: https://github.com/home-assistant/home-assistant/pull/21347 +[#21349]: https://github.com/home-assistant/home-assistant/pull/21349 +[#21351]: https://github.com/home-assistant/home-assistant/pull/21351 +[#21354]: https://github.com/home-assistant/home-assistant/pull/21354 +[#21358]: https://github.com/home-assistant/home-assistant/pull/21358 +[#21363]: https://github.com/home-assistant/home-assistant/pull/21363 +[#21365]: https://github.com/home-assistant/home-assistant/pull/21365 +[#21375]: https://github.com/home-assistant/home-assistant/pull/21375 +[#21376]: https://github.com/home-assistant/home-assistant/pull/21376 +[#21377]: https://github.com/home-assistant/home-assistant/pull/21377 +[#21378]: https://github.com/home-assistant/home-assistant/pull/21378 +[#21379]: https://github.com/home-assistant/home-assistant/pull/21379 +[#21382]: https://github.com/home-assistant/home-assistant/pull/21382 +[#21384]: https://github.com/home-assistant/home-assistant/pull/21384 +[#21387]: https://github.com/home-assistant/home-assistant/pull/21387 +[#21388]: https://github.com/home-assistant/home-assistant/pull/21388 +[#21390]: https://github.com/home-assistant/home-assistant/pull/21390 +[#21397]: https://github.com/home-assistant/home-assistant/pull/21397 +[#21400]: https://github.com/home-assistant/home-assistant/pull/21400 +[#21401]: https://github.com/home-assistant/home-assistant/pull/21401 +[#21405]: https://github.com/home-assistant/home-assistant/pull/21405 +[#21407]: https://github.com/home-assistant/home-assistant/pull/21407 +[#21408]: https://github.com/home-assistant/home-assistant/pull/21408 +[#21409]: https://github.com/home-assistant/home-assistant/pull/21409 +[#21411]: https://github.com/home-assistant/home-assistant/pull/21411 +[#21412]: https://github.com/home-assistant/home-assistant/pull/21412 +[#21416]: https://github.com/home-assistant/home-assistant/pull/21416 +[#21420]: https://github.com/home-assistant/home-assistant/pull/21420 +[#21439]: https://github.com/home-assistant/home-assistant/pull/21439 +[#21442]: https://github.com/home-assistant/home-assistant/pull/21442 +[#21443]: https://github.com/home-assistant/home-assistant/pull/21443 +[#21444]: https://github.com/home-assistant/home-assistant/pull/21444 +[#21445]: https://github.com/home-assistant/home-assistant/pull/21445 +[#21447]: https://github.com/home-assistant/home-assistant/pull/21447 +[#21448]: https://github.com/home-assistant/home-assistant/pull/21448 +[#21452]: https://github.com/home-assistant/home-assistant/pull/21452 +[#21455]: https://github.com/home-assistant/home-assistant/pull/21455 +[#21466]: https://github.com/home-assistant/home-assistant/pull/21466 +[#21471]: https://github.com/home-assistant/home-assistant/pull/21471 +[#21474]: https://github.com/home-assistant/home-assistant/pull/21474 +[#21476]: https://github.com/home-assistant/home-assistant/pull/21476 +[#21478]: https://github.com/home-assistant/home-assistant/pull/21478 +[#21479]: https://github.com/home-assistant/home-assistant/pull/21479 +[#21485]: https://github.com/home-assistant/home-assistant/pull/21485 +[#21486]: https://github.com/home-assistant/home-assistant/pull/21486 +[#21494]: https://github.com/home-assistant/home-assistant/pull/21494 +[#21510]: https://github.com/home-assistant/home-assistant/pull/21510 +[#21511]: https://github.com/home-assistant/home-assistant/pull/21511 +[#21512]: https://github.com/home-assistant/home-assistant/pull/21512 +[@Adminiuga]: https://github.com/Adminiuga +[@Danielhiversen]: https://github.com/Danielhiversen +[@Dullage]: https://github.com/Dullage +[@GidoHakvoort]: https://github.com/GidoHakvoort +[@JBassett]: https://github.com/JBassett +[@JeffLIrion]: https://github.com/JeffLIrion +[@JonasPed]: https://github.com/JonasPed +[@Julius2342]: https://github.com/Julius2342 +[@Kane610]: https://github.com/Kane610 +[@MartinHjelmare]: https://github.com/MartinHjelmare +[@OleksandrBerchenko]: https://github.com/OleksandrBerchenko +[@OttoWinter]: https://github.com/OttoWinter +[@Petro31]: https://github.com/Petro31 +[@RomRider]: https://github.com/RomRider +[@SNoof85]: https://github.com/SNoof85 +[@SukramJ]: https://github.com/SukramJ +[@Swamp-Ig]: https://github.com/Swamp-Ig +[@ToSa27]: https://github.com/ToSa27 +[@Tony763]: https://github.com/Tony763 +[@VirtualL]: https://github.com/VirtualL +[@aerialls]: https://github.com/aerialls +[@alengwenus]: https://github.com/alengwenus +[@alistairg]: https://github.com/alistairg +[@amelchio]: https://github.com/amelchio +[@andrewsayre]: https://github.com/andrewsayre +[@awarecan]: https://github.com/awarecan +[@bachya]: https://github.com/bachya +[@balloob]: https://github.com/balloob +[@bauerj]: https://github.com/bauerj +[@blackray12]: https://github.com/blackray12 +[@dagobert]: https://github.com/dagobert +[@damarco]: https://github.com/damarco +[@danielperna84]: https://github.com/danielperna84 +[@davidbb]: https://github.com/davidbb +[@dfournie]: https://github.com/dfournie +[@dgomes]: https://github.com/dgomes +[@dmulcahey]: https://github.com/dmulcahey +[@dshokouhi]: https://github.com/dshokouhi +[@elupus]: https://github.com/elupus +[@fabaff]: https://github.com/fabaff +[@fbradyirl]: https://github.com/fbradyirl +[@filcole]: https://github.com/filcole +[@fredrike]: https://github.com/fredrike +[@frenck]: https://github.com/frenck +[@glogiotatidis]: https://github.com/glogiotatidis +[@gorynychzmey]: https://github.com/gorynychzmey +[@helto4real]: https://github.com/helto4real +[@hmmbob]: https://github.com/hmmbob +[@kellerza]: https://github.com/kellerza +[@kevintuhumury]: https://github.com/kevintuhumury +[@koreth]: https://github.com/koreth +[@kstaniek]: https://github.com/kstaniek +[@ktnrg45]: https://github.com/ktnrg45 +[@lapy]: https://github.com/lapy +[@leeuwte]: https://github.com/leeuwte +[@ljmerza]: https://github.com/ljmerza +[@marcogazzola]: https://github.com/marcogazzola +[@mezz64]: https://github.com/mezz64 +[@mitchellrj]: https://github.com/mitchellrj +[@msvinth]: https://github.com/msvinth +[@mxworm]: https://github.com/mxworm +[@mzdrale]: https://github.com/mzdrale +[@nickw444]: https://github.com/nickw444 +[@nugget]: https://github.com/nugget +[@oblogic7]: https://github.com/oblogic7 +[@philipperequile]: https://github.com/philipperequile +[@ptc]: https://github.com/ptc +[@renemarc]: https://github.com/renemarc +[@robbiet480]: https://github.com/robbiet480 +[@rohankapoorcom]: https://github.com/rohankapoorcom +[@rytilahti]: https://github.com/rytilahti +[@scop]: https://github.com/scop +[@siberx]: https://github.com/siberx +[@starkillerOG]: https://github.com/starkillerOG +[@thibmaek]: https://github.com/thibmaek +[@tiste]: https://github.com/tiste +[@tmechen]: https://github.com/tmechen +[@victorcerutti]: https://github.com/victorcerutti +[@w1ll1am23]: https://github.com/w1ll1am23 +[@zewelor]: https://github.com/zewelor +[ads docs]: /components/ads/ +[air_quality docs]: /components/air_quality/ +[ambient_station docs]: /components/ambient_station/ +[binary_sensor.hikvision docs]: /components/binary_sensor.hikvision/ +[binary_sensor.nissan_leaf docs]: /components/binary_sensor.nissan_leaf/ +[binary_sensor.rest docs]: /components/binary_sensor.rest/ +[binary_sensor.tod docs]: /components/binary_sensor.tod/ +[binary_sensor.trend docs]: /components/binary_sensor.trend/ +[config docs]: /components/config/ +[cover docs]: /components/cover/ +[cover.lcn docs]: /components/cover.lcn/ +[danfoss_air docs]: /components/danfoss_air/ +[deconz docs]: /components/deconz/ +[device_tracker docs]: /components/device_tracker/ +[esphome docs]: /components/esphome/ +[google_assistant docs]: /components/google_assistant/ +[googlehome docs]: /components/googlehome/ +[history docs]: /components/history/ +[homekit_controller docs]: /components/homekit_controller/ +[homematic docs]: /components/homematic/ +[homematicip_cloud docs]: /components/homematicip_cloud/ +[http docs]: /components/http/ +[hue docs]: /components/hue/ +[ihc docs]: /components/ihc/ +[image_processing.tensorflow docs]: /components/image_processing.tensorflow/ +[insteon docs]: /components/insteon/ +[iperf3 docs]: /components/iperf3/ +[knx docs]: /components/knx/ +[lcn docs]: /components/lcn/ +[light.rpi_gpio_pwm docs]: /components/light.rpi_gpio_pwm/ +[light.tplink docs]: /components/light.tplink/ +[light.yeelight docs]: /components/light.yeelight/ +[lutron docs]: /components/lutron/ +[media_extractor docs]: /components/media_extractor/ +[media_player.anthemav docs]: /components/media_player.anthemav/ +[media_player.firetv docs]: /components/media_player.firetv/ +[media_player.panasonic_viera docs]: /components/media_player.panasonic_viera/ +[media_player.philips_js docs]: /components/media_player.philips_js/ +[meteo_france docs]: /components/meteo_france/ +[modbus docs]: /components/modbus/ +[neato docs]: /components/neato/ +[ness_alarm docs]: /components/ness_alarm/ +[netatmo docs]: /components/netatmo/ +[nissan_leaf docs]: /components/nissan_leaf/ +[owlet docs]: /components/owlet/ +[point docs]: /components/point/ +[prometheus docs]: /components/prometheus/ +[ps4 docs]: /components/ps4/ +[raspihats docs]: /components/raspihats/ +[sensor.airvisual docs]: /components/sensor.airvisual/ +[sensor.buienradar docs]: /components/sensor.buienradar/ +[sensor.crimereports docs]: /components/sensor.crimereports/ +[sensor.discogs docs]: /components/sensor.discogs/ +[sensor.dsmr docs]: /components/sensor.dsmr/ +[sensor.etherscan docs]: /components/sensor.etherscan/ +[sensor.filter docs]: /components/sensor.filter/ +[sensor.glances docs]: /components/sensor.glances/ +[sensor.google_travel_time docs]: /components/sensor.google_travel_time/ +[sensor.gtfs docs]: /components/sensor.gtfs/ +[sensor.iperf3 docs]: /components/sensor.iperf3/ +[sensor.linky docs]: /components/sensor.linky/ +[sensor.meteo_france docs]: /components/sensor.meteo_france/ +[sensor.mitemp_bt docs]: /components/sensor.mitemp_bt/ +[sensor.nissan_leaf docs]: /components/sensor.nissan_leaf/ +[sensor.nmbs docs]: /components/sensor.nmbs/ +[sensor.pollen docs]: /components/sensor.pollen/ +[sensor.reddit docs]: /components/sensor.reddit/ +[sensor.rest docs]: /components/sensor.rest/ +[sensor.ripple docs]: /components/sensor.ripple/ +[sensor.rova docs]: /components/sensor.rova/ +[sensor.scrape docs]: /components/sensor.scrape/ +[sensor.shodan docs]: /components/sensor.shodan/ +[sensor.sochain docs]: /components/sensor.sochain/ +[sensor.sql docs]: /components/sensor.sql/ +[sensor.starlingbank docs]: /components/sensor.starlingbank/ +[sensor.systemmonitor docs]: /components/sensor.systemmonitor/ +[sensor.waze_travel_time docs]: /components/sensor.waze_travel_time/ +[simplisafe docs]: /components/simplisafe/ +[smartthings docs]: /components/smartthings/ +[smhi docs]: /components/smhi/ +[snips docs]: /components/snips/ +[sonos docs]: /components/sonos/ +[switch.nissan_leaf docs]: /components/switch.nissan_leaf/ +[switch.sony_projector docs]: /components/switch.sony_projector/ +[switch.switchbot docs]: /components/switch.switchbot/ +[switch.switchmate docs]: /components/switch.switchmate/ +[switch.tplink docs]: /components/switch.tplink/ +[tahoma docs]: /components/tahoma/ +[tibber docs]: /components/tibber/ +[toon docs]: /components/toon/ +[tplink docs]: /components/tplink/ +[utility_meter docs]: /components/utility_meter/ +[vacuum.xiaomi_miio docs]: /components/vacuum.xiaomi_miio/ +[velux docs]: /components/velux/ +[water_heater docs]: /components/water_heater/ +[weather.met docs]: /components/weather.met/ +[weather.meteo_france docs]: /components/weather.meteo_france/ +[weather.openweathermap docs]: /components/weather.openweathermap/ +[zha docs]: /components/zha/ From 666b3a0d0c345f0a441c1dd4fff650c03c27a610 Mon Sep 17 00:00:00 2001 From: Victor Vostrikov <1998617+gorynychzmey@users.noreply.github.com> Date: Tue, 5 Mar 2019 22:56:04 +0100 Subject: [PATCH 59/64] Add example of choice of sources for Person (#8779) * Added description for source priority. * Changed description of source priority. * Added example of sources' choice. * Corrected example * Added TL;DR to example * Updated TL:DR * Added hint for consider_home --- source/_components/person.markdown | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/source/_components/person.markdown b/source/_components/person.markdown index 6a0782635c8..37203c01855 100644 --- a/source/_components/person.markdown +++ b/source/_components/person.markdown @@ -13,7 +13,27 @@ ha_qa_scale: internal ha_release: 0.88 --- -The person component allows to connect device tracker entities to one or more person entities. The last state update of a connected device tracker will set the state of the person. For example if you connect your router and your OwnTracks device as trackers to your person, the last state update from either the router or your OwnTracks device will set the state of your person. +The person component allows to connect device tracker entities to one or more person entities. The state updates of a connected device trackers will set the state of the person. When multiple device tracers used, the state of berson will be determined next way: + +1. If there are stationary sources (which type is not 'gps') presenting status 'home', than latest of this sources will be taken. +2. If there are sources of type 'gps', than latest of this sources will be taken. +3. Otherwise will be taken latest source with status 'not_home'. + +Lets say for example, that you have 3 trackers: 'tracker_gps', 'tracker_router' and 'tracker_ble'. + +1. You're at home, all 3 devices shows status 'home' - status of your Person entity will be 'home' with source 'tracker_router' or 'tracker_ble', whatever was latest. +2. You're going out. 'tracker_gps' shows status 'not_home', but other two trackers show status 'home' according to their setting 'consider_home'. You are still considered to be at home. +3. After some time both stationary trackers show status 'not_home'. Now your Person entity has status 'not_home' with source 'tracker_gps'. +4. While you are outside your home, your Home Assistant was suddenly restarted. Until 'tracker_gps' receives update, your status will be determined by stationary tracker, which gets latest update after restart. Obviously the status will be 'not_home'. +5. Than you're going into area marked as 'zone1', 'tracker_gps' is getting update, and now your status is 'zone1' with source 'tracker_gps'. +6. You've returned home, and your mobile device has connected to router, but GPS update yet didn't occur. Your status will be 'home' with source 'tracker_router'. +7. After GPS update occurs, your status still be 'home' with source 'tracker_router' or 'tracker_ble', whatever updates later. + +TL;DR: When you're at home, your position is determined firstly by stationary trackers (if any) and then by GPS. When you're outside your home, your position is determined firstly by GPS and then by stationary trackers. + + +**Hint**: When you use multiple device trackers together, especially stationary and GPS trackers, it's advisable to set `consider_home`for stationary trackers as low as possible. + You can manage persons via the UI from the person page inside the configuration panel or via `YAML`. From fd7f78565205b2017be3e23d211fa5f8ac1325d0 Mon Sep 17 00:00:00 2001 From: yosilevy <37745463+yosilevy@users.noreply.github.com> Date: Mon, 4 Mar 2019 19:00:12 +0200 Subject: [PATCH 60/64] Added conditional element documentation (#8795) * Added conditional element documentation Will add an example later on * Fixed required * Added conditional example * Update picture-elements.markdown --- source/_lovelace/picture-elements.markdown | 55 ++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/source/_lovelace/picture-elements.markdown b/source/_lovelace/picture-elements.markdown index 997bccd14c3..38aac6b58e9 100644 --- a/source/_lovelace/picture-elements.markdown +++ b/source/_lovelace/picture-elements.markdown @@ -397,6 +397,38 @@ style: default: "position: absolute, transform: translate(-50%, -50%)" {% endconfiguration %} +### {% linkable_title Conditional Element %} + +Much like the Conditional card, this element will let you show its sub-elements based on entity states. + +{% configuration %} +type: + required: true + description: conditional + type: string +conditions: + required: true + description: List of entity IDs and matching states. + type: list + keys: + entity: + required: true + description: HA entity ID. + type: string + state: + required: false + description: Entity state is equal to this value.* + type: string + state_not: + required: false + description: Entity state is unequal to this value.* + type: string +elements: + required: true + description: One or more elements of any type to show when conditions are met. See below for an example. + type: list +{% endconfiguration %} + ### {% linkable_title Custom Elements %} {% configuration %} @@ -554,3 +586,26 @@ elements: left: 75% width: 5% ``` + +## {% linkable_title Conditional Example %} + +```yaml +type: picture-elements +image: /local/House.png +elements: + # conditionally show TV off button shortcut when dad's away and daughter is home + - type: conditional + conditions: + - entity: sensor.presence_daughter + state: 'home' + - entity: sensor.presence_dad + state: 'not_home' + elements: + - type: state-icon + entity: switch.tv + tap_action: + action: toggle + style: + top: 47% + left: 42% +``` From 5832ced7b8e1fe58302d9c06344da6c97b3ba193 Mon Sep 17 00:00:00 2001 From: Phil Cole Date: Mon, 4 Mar 2019 12:13:45 +0000 Subject: [PATCH 61/64] Add nissan_leaf.start_charge service and doc fixes. (#8801) --- source/_components/nissan_leaf.markdown | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/source/_components/nissan_leaf.markdown b/source/_components/nissan_leaf.markdown index 5a1c4ce801a..4650df72481 100644 --- a/source/_components/nissan_leaf.markdown +++ b/source/_components/nissan_leaf.markdown @@ -15,10 +15,10 @@ ha_iot_class: "Cloud Polling" The `nissan_leaf` component offers integration with the [NissanConnect EV](http://youplus.nissan.co.uk/GB/en/YouPlus/ConnectedServices.html) cloud service. NissanConnect EV was previously known as Nissan Carwings. It offers: -* sensors for the battery status and range +* sensors for the battery status, range and charging status * a switch to start and stop the climate control -* a switch to start the car charging (cannot be stopped remotely - API limitation) * a device tracker to locate the car (only on later Leaf models) +* services to request updates from the car and to request the car starts charging. ## {% linkable_title Configuration %} @@ -48,7 +48,7 @@ nissan_connect: description: If your car has the updated head unit (NissanConnect rather than Carwings) then the location can be aquired and exposed via a device tracker. If you have a pre-2014 24 kWh Leaf then you will have Carwings and this should be set to false. required: false type: boolean -scan_interval: +update_interval: description: The interval between updates if the climate control is off and the car is not charging. Set in any time unit (e.g. minutes, hours, days!). required: false default: 1 hour @@ -76,7 +76,7 @@ nissan_leaf: password: "YOUR_PASSWORD" region: "YOUR_REGION" nissan_connect: true - scan_interval: + update_interval: hours: 1 update_interval_charging: minutes: 15 @@ -85,9 +85,19 @@ nissan_leaf: force_miles: true ``` +## {% linkable_title Starting a Charge %} + +You can use the `nissan_leaf.start_charge` service to send a request to the Nissan servers to start a charge. The car must be plugged in! The service requires you to provide the vehicle identification number (VIN) as a parameter. You can see the VIN on the attributes of all the entities created by this component, except the device_tracker. + +```yaml +- service: nissan_leaf.start_charge + data: + vin: '1HGBH41JXMN109186' # replace +``` + ## {% linkable_title Updating on-demand using Automation %} -You can also use the `nissan_leaf.update` service to request an on-demand update. To update almost exclusively via the service set the `update_interval` to a high value in the component configuration. The service requires you to provide the vehicle identification number (VIN) as a parameter. You can see the VIN on the attributes of all the entities created by this component, except the device_tracker. +You can also use the `nissan_leaf.update` service to request an on-demand update. To update almost exclusively via the service set the `update_interval` to a high value in the component configuration. The service requests the VIN number as described above. ```yaml - id: update_when_driver_not_home @@ -111,7 +121,9 @@ You can also use the `nissan_leaf.update` service to request an on-demand update * The update interval has a minimum of two minutes. * Requesting updates uses a small amount of power from the 12 V battery. The 12 V battery charges from the main traction battery when the car is not plugged in. If the car is left plugged in for a long time, or if the main traction battery is very low then the 12 V battery may gradually discharge. A low update interval may cause the 12 V battery to become flat. When the 12 V battery is flat the car will not start. _Do not set the update interval too low. Use at your own risk._ * This component communicates with the Nissan Servers which then communicate with the car. The communication between the car and the Nissan Servers is very slow, and takes up to five minutes to get information from the car, therefore the default polling interval is set to one hour to not overwhelm the connection. -* Responses from the Nissan servers are received separately for the battery/range, climate control and location. The `updated_on` attribute will show the last time the data was retrieved from the server. There are separate attributes for when the `next_update` is scheduled, and if an `update_inprogress`. The `nissan_leaf.update` service will reset the `next_update` attribute. +* Responses from the Nissan servers are received separately for the battery/range, climate control and location. The `updated_on` attribute will show the last time the data was retrieved from the server. There are separate attributes for when the `next_update` is scheduled, and to indicate if `update_in_progress`. The `nissan_leaf.update` service will reset the `next_update` attribute. +* The Nissan APIs do not allow charging to be stopped remotely. +* The Nissan servers have a history of being unstable, therefore please confirm that the official Nissan Leaf app/website is working correctly before reporting bugs. Please report bugs using the following logger configuration. From 5af50555596dafaad2b29d623bf4fbdc290e6d24 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 5 Mar 2019 14:07:57 -0800 Subject: [PATCH 62/64] Update notes --- source/_posts/2019-03-13-release-89.markdown | 104 +++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git a/source/_posts/2019-03-13-release-89.markdown b/source/_posts/2019-03-13-release-89.markdown index 4bb59919dc0..b3be091d8ee 100644 --- a/source/_posts/2019-03-13-release-89.markdown +++ b/source/_posts/2019-03-13-release-89.markdown @@ -32,6 +32,7 @@ og_image: /images/blog/2019-03-release-89/components.png - Rewrite of Toon component ([@frenck] - [#21186]) ([toon docs]) (breaking change) (new-platform) - Add SmartThings Scene platform ([@andrewsayre] - [#21405]) ([smartthings docs]) (new-platform) - Reddit Sensor ([@ljmerza] - [#21344]) ([sensor.reddit docs]) (new-platform) +- mobile_app component ([@robbiet480] - [#21475]) ([mobile_app docs]) (beta fix) (new-platform) ## {% linkable_title New Features %} @@ -64,6 +65,38 @@ Experiencing issues introduced by this release? Please report them in our [issue - Add config for trusted networks auth provider ([@awarecan] - [#21111]) (breaking change) - HomeMatic: Add error-attribute ([@dagobert] - [#21009]) ([homematic docs]) (breaking change) +## {% linkable_title Beta Fixes %} + +- Add PLATFORM_SCHEMA_BASE to telegram_bot component ([@veleek] - [#21155]) ([telegram_bot docs]) (beta fix) +- Add watchdog to Ambient PWS ([@bachya] - [#21507]) ([ambient_station docs]) (beta fix) +- Improve new Sonos snapshot/restore ([@amelchio] - [#21509]) ([sonos docs]) (beta fix) +- Fix lint ([@balloob] - [#21520]) ([person docs]) ([sensor.airvisual docs]) (beta fix) +- Only use a single store instance ([@balloob] - [#21521]) ([frontend docs]) (beta fix) +- Allow skip-pip applied to HA core ([@awarecan] - [#21527]) (beta fix) +- Updated variable name for readability ([@gorynychzmey] - [#21528]) ([person docs]) (beta fix) +- Add missing retain option to mqtt.climate configuration schema ([@emontnemery] - [#21536]) ([mqtt docs]) (beta fix) +- Fix warning ([@awarecan] - [#21538]) ([http docs]) (beta fix) +- Fix incorrect pyairvisual call ([@bachya] - [#21542]) ([sensor.airvisual docs]) (beta fix) +- mobile_app component ([@robbiet480] - [#21475]) ([mobile_app docs]) (beta fix) (new-platform) +- Make time trigger data trigger.now local ([@emontnemery] - [#21544]) (beta fix) +- Bump zigpy-deconz ([@damarco] - [#21566]) ([zha docs]) (beta fix) +- Re-thrown exception occurred in the blocking service call ([@awarecan] - [#21573]) ([websocket_api docs]) (beta fix) +- Upgrade PyXiaomiGateway library ([@Danielhiversen] - [#21582]) ([xiaomi_aqara docs]) (beta fix) +- Log exception occurred in WS service call command ([@awarecan] - [#21584]) ([websocket_api docs]) (beta fix) +- Word the tplink deprecation warning more strongly ([@amelchio] - [#21586]) ([tplink docs]) (beta fix) +- Handle when installed app has already been removed ([@andrewsayre] - [#21595]) ([smartthings docs]) (beta fix) +- Resolve race condition when HA auth provider is loading ([@awarecan] - [#21619]) (beta fix) +- Upgrade pysonos to 0.0.8 ([@amelchio] - [#21624]) ([sonos docs]) (beta fix) +- Fix calc next ([@balloob] - [#21630]) (beta fix) +- Cast displaytime to int for JSON RPC ([@GGeezes] - [#21649]) ([notify docs]) (beta fix) +- :shirt: Corrects unit of measurement symbol for Watt ([@frenck] - [#21654]) ([toon docs]) (beta fix) +- Rename Google Assistant evenets ([@balloob] - [#21655]) ([google_assistant docs]) (beta fix) +- :ambulance: Fixes Toon doing I/O in coroutines ([@frenck] - [#21657]) ([toon docs]) (beta fix) +- Upgrade toonapilib to 3.1.0 ([@frenck] - [#21661]) ([toon docs]) (beta fix) +- Avoid recorder thread crashing ([@balloob] - [#21668]) (beta fix) +- check we have a tb ([@dgomes] - [#21670]) ([system_log docs]) (beta fix) +- Fix ADS race condition ([@carstenschroeder] - [#21677]) ([ads docs]) (beta fix) + ## {% linkable_title All changes %} - Météo-France platform for the weather component ([@victorcerutti] - [#18404]) ([sensor.meteo_france docs]) ([weather.meteo_france docs]) (new-platform) @@ -218,6 +251,35 @@ Experiencing issues introduced by this release? Please report them in our [issue - ness_alarm: Bump nessclient version to 0.9.13 ([@nickw444] - [#21466]) ([ness_alarm docs]) - Bump ihc to 2.3.0 ([@msvinth] - [#21494]) ([ihc docs]) - Changed source priority for Person ([@gorynychzmey] - [#21479]) +- Add PLATFORM_SCHEMA_BASE to telegram_bot component ([@veleek] - [#21155]) ([telegram_bot docs]) (beta fix) +- Add watchdog to Ambient PWS ([@bachya] - [#21507]) ([ambient_station docs]) (beta fix) +- Improve new Sonos snapshot/restore ([@amelchio] - [#21509]) ([sonos docs]) (beta fix) +- Fix lint ([@balloob] - [#21520]) ([person docs]) ([sensor.airvisual docs]) (beta fix) +- Only use a single store instance ([@balloob] - [#21521]) ([frontend docs]) (beta fix) +- Allow skip-pip applied to HA core ([@awarecan] - [#21527]) (beta fix) +- Updated variable name for readability ([@gorynychzmey] - [#21528]) ([person docs]) (beta fix) +- Add missing retain option to mqtt.climate configuration schema ([@emontnemery] - [#21536]) ([mqtt docs]) (beta fix) +- Fix warning ([@awarecan] - [#21538]) ([http docs]) (beta fix) +- Fix incorrect pyairvisual call ([@bachya] - [#21542]) ([sensor.airvisual docs]) (beta fix) +- mobile_app component ([@robbiet480] - [#21475]) ([mobile_app docs]) (beta fix) (new-platform) +- Make time trigger data trigger.now local ([@emontnemery] - [#21544]) (beta fix) +- Bump zigpy-deconz ([@damarco] - [#21566]) ([zha docs]) (beta fix) +- Re-thrown exception occurred in the blocking service call ([@awarecan] - [#21573]) ([websocket_api docs]) (beta fix) +- Upgrade PyXiaomiGateway library ([@Danielhiversen] - [#21582]) ([xiaomi_aqara docs]) (beta fix) +- Log exception occurred in WS service call command ([@awarecan] - [#21584]) ([websocket_api docs]) (beta fix) +- Word the tplink deprecation warning more strongly ([@amelchio] - [#21586]) ([tplink docs]) (beta fix) +- Handle when installed app has already been removed ([@andrewsayre] - [#21595]) ([smartthings docs]) (beta fix) +- Resolve race condition when HA auth provider is loading ([@awarecan] - [#21619]) (beta fix) +- Upgrade pysonos to 0.0.8 ([@amelchio] - [#21624]) ([sonos docs]) (beta fix) +- Fix calc next ([@balloob] - [#21630]) (beta fix) +- Cast displaytime to int for JSON RPC ([@GGeezes] - [#21649]) ([notify docs]) (beta fix) +- :shirt: Corrects unit of measurement symbol for Watt ([@frenck] - [#21654]) ([toon docs]) (beta fix) +- Rename Google Assistant evenets ([@balloob] - [#21655]) ([google_assistant docs]) (beta fix) +- :ambulance: Fixes Toon doing I/O in coroutines ([@frenck] - [#21657]) ([toon docs]) (beta fix) +- Upgrade toonapilib to 3.1.0 ([@frenck] - [#21661]) ([toon docs]) (beta fix) +- Avoid recorder thread crashing ([@balloob] - [#21668]) (beta fix) +- check we have a tb ([@dgomes] - [#21670]) ([system_log docs]) (beta fix) +- Fix ADS race condition ([@carstenschroeder] - [#21677]) ([ads docs]) (beta fix) [#18091]: https://github.com/home-assistant/home-assistant/pull/18091 [#18404]: https://github.com/home-assistant/home-assistant/pull/18404 @@ -280,6 +342,7 @@ Experiencing issues introduced by this release? Please report them in our [issue [#21150]: https://github.com/home-assistant/home-assistant/pull/21150 [#21153]: https://github.com/home-assistant/home-assistant/pull/21153 [#21154]: https://github.com/home-assistant/home-assistant/pull/21154 +[#21155]: https://github.com/home-assistant/home-assistant/pull/21155 [#21156]: https://github.com/home-assistant/home-assistant/pull/21156 [#21157]: https://github.com/home-assistant/home-assistant/pull/21157 [#21162]: https://github.com/home-assistant/home-assistant/pull/21162 @@ -362,18 +425,47 @@ Experiencing issues introduced by this release? Please report them in our [issue [#21466]: https://github.com/home-assistant/home-assistant/pull/21466 [#21471]: https://github.com/home-assistant/home-assistant/pull/21471 [#21474]: https://github.com/home-assistant/home-assistant/pull/21474 +[#21475]: https://github.com/home-assistant/home-assistant/pull/21475 [#21476]: https://github.com/home-assistant/home-assistant/pull/21476 [#21478]: https://github.com/home-assistant/home-assistant/pull/21478 [#21479]: https://github.com/home-assistant/home-assistant/pull/21479 [#21485]: https://github.com/home-assistant/home-assistant/pull/21485 [#21486]: https://github.com/home-assistant/home-assistant/pull/21486 [#21494]: https://github.com/home-assistant/home-assistant/pull/21494 +[#21507]: https://github.com/home-assistant/home-assistant/pull/21507 +[#21509]: https://github.com/home-assistant/home-assistant/pull/21509 [#21510]: https://github.com/home-assistant/home-assistant/pull/21510 [#21511]: https://github.com/home-assistant/home-assistant/pull/21511 [#21512]: https://github.com/home-assistant/home-assistant/pull/21512 +[#21520]: https://github.com/home-assistant/home-assistant/pull/21520 +[#21521]: https://github.com/home-assistant/home-assistant/pull/21521 +[#21527]: https://github.com/home-assistant/home-assistant/pull/21527 +[#21528]: https://github.com/home-assistant/home-assistant/pull/21528 +[#21536]: https://github.com/home-assistant/home-assistant/pull/21536 +[#21538]: https://github.com/home-assistant/home-assistant/pull/21538 +[#21542]: https://github.com/home-assistant/home-assistant/pull/21542 +[#21544]: https://github.com/home-assistant/home-assistant/pull/21544 +[#21566]: https://github.com/home-assistant/home-assistant/pull/21566 +[#21573]: https://github.com/home-assistant/home-assistant/pull/21573 +[#21582]: https://github.com/home-assistant/home-assistant/pull/21582 +[#21584]: https://github.com/home-assistant/home-assistant/pull/21584 +[#21586]: https://github.com/home-assistant/home-assistant/pull/21586 +[#21595]: https://github.com/home-assistant/home-assistant/pull/21595 +[#21619]: https://github.com/home-assistant/home-assistant/pull/21619 +[#21624]: https://github.com/home-assistant/home-assistant/pull/21624 +[#21630]: https://github.com/home-assistant/home-assistant/pull/21630 +[#21649]: https://github.com/home-assistant/home-assistant/pull/21649 +[#21654]: https://github.com/home-assistant/home-assistant/pull/21654 +[#21655]: https://github.com/home-assistant/home-assistant/pull/21655 +[#21657]: https://github.com/home-assistant/home-assistant/pull/21657 +[#21661]: https://github.com/home-assistant/home-assistant/pull/21661 +[#21668]: https://github.com/home-assistant/home-assistant/pull/21668 +[#21670]: https://github.com/home-assistant/home-assistant/pull/21670 +[#21677]: https://github.com/home-assistant/home-assistant/pull/21677 [@Adminiuga]: https://github.com/Adminiuga [@Danielhiversen]: https://github.com/Danielhiversen [@Dullage]: https://github.com/Dullage +[@GGeezes]: https://github.com/GGeezes [@GidoHakvoort]: https://github.com/GidoHakvoort [@JBassett]: https://github.com/JBassett [@JeffLIrion]: https://github.com/JeffLIrion @@ -401,6 +493,7 @@ Experiencing issues introduced by this release? Please report them in our [issue [@balloob]: https://github.com/balloob [@bauerj]: https://github.com/bauerj [@blackray12]: https://github.com/blackray12 +[@carstenschroeder]: https://github.com/carstenschroeder [@dagobert]: https://github.com/dagobert [@damarco]: https://github.com/damarco [@danielperna84]: https://github.com/danielperna84 @@ -410,6 +503,7 @@ Experiencing issues introduced by this release? Please report them in our [issue [@dmulcahey]: https://github.com/dmulcahey [@dshokouhi]: https://github.com/dshokouhi [@elupus]: https://github.com/elupus +[@emontnemery]: https://github.com/emontnemery [@fabaff]: https://github.com/fabaff [@fbradyirl]: https://github.com/fbradyirl [@filcole]: https://github.com/filcole @@ -448,6 +542,7 @@ Experiencing issues introduced by this release? Please report them in our [issue [@thibmaek]: https://github.com/thibmaek [@tiste]: https://github.com/tiste [@tmechen]: https://github.com/tmechen +[@veleek]: https://github.com/veleek [@victorcerutti]: https://github.com/victorcerutti [@w1ll1am23]: https://github.com/w1ll1am23 [@zewelor]: https://github.com/zewelor @@ -466,6 +561,7 @@ Experiencing issues introduced by this release? Please report them in our [issue [deconz docs]: /components/deconz/ [device_tracker docs]: /components/device_tracker/ [esphome docs]: /components/esphome/ +[frontend docs]: /components/frontend/ [google_assistant docs]: /components/google_assistant/ [googlehome docs]: /components/googlehome/ [history docs]: /components/history/ @@ -490,12 +586,16 @@ Experiencing issues introduced by this release? Please report them in our [issue [media_player.panasonic_viera docs]: /components/media_player.panasonic_viera/ [media_player.philips_js docs]: /components/media_player.philips_js/ [meteo_france docs]: /components/meteo_france/ +[mobile_app docs]: /components/mobile_app/ [modbus docs]: /components/modbus/ +[mqtt docs]: /components/mqtt/ [neato docs]: /components/neato/ [ness_alarm docs]: /components/ness_alarm/ [netatmo docs]: /components/netatmo/ [nissan_leaf docs]: /components/nissan_leaf/ +[notify docs]: /components/notify/ [owlet docs]: /components/owlet/ +[person docs]: /components/person/ [point docs]: /components/point/ [prometheus docs]: /components/prometheus/ [ps4 docs]: /components/ps4/ @@ -538,7 +638,9 @@ Experiencing issues introduced by this release? Please report them in our [issue [switch.switchbot docs]: /components/switch.switchbot/ [switch.switchmate docs]: /components/switch.switchmate/ [switch.tplink docs]: /components/switch.tplink/ +[system_log docs]: /components/system_log/ [tahoma docs]: /components/tahoma/ +[telegram_bot docs]: /components/telegram_bot/ [tibber docs]: /components/tibber/ [toon docs]: /components/toon/ [tplink docs]: /components/tplink/ @@ -549,4 +651,6 @@ Experiencing issues introduced by this release? Please report them in our [issue [weather.met docs]: /components/weather.met/ [weather.meteo_france docs]: /components/weather.meteo_france/ [weather.openweathermap docs]: /components/weather.openweathermap/ +[websocket_api docs]: /components/websocket_api/ +[xiaomi_aqara docs]: /components/xiaomi_aqara/ [zha docs]: /components/zha/ From 48e46da980e75c65db5558d6a2492e99254885fe Mon Sep 17 00:00:00 2001 From: Courtenay Date: Wed, 6 Mar 2019 09:51:50 -0800 Subject: [PATCH 63/64] update of breaking change paragraphs (#8837) * update of breaking change paragraphs I did my best :) Thanks @balloob for the coaching! * fixed initial description of smartthings change * picky picky fixes * Update 2019-03-13-release-89.markdown --- source/_posts/2019-03-13-release-89.markdown | 41 ++++++++++++++------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/source/_posts/2019-03-13-release-89.markdown b/source/_posts/2019-03-13-release-89.markdown index b3be091d8ee..1b3fef91194 100644 --- a/source/_posts/2019-03-13-release-89.markdown +++ b/source/_posts/2019-03-13-release-89.markdown @@ -12,6 +12,23 @@ og_image: /images/blog/2019-03-release-89/components.png --- +## {% linkable_title Noteworthy Breaking Change %} + +__Custom Components file structure change:__ A significant change in how the "under the hood" of Home Assistant works has led to forcing platforms to be resolved based off the component path, if it exists. + +Today, if you want, you can override the Hue light platform, but not the other parts of the Hue integration. If a future update evolves the Hue component, removing or changing internal methods that the custom platform relied upon, the custom platform will start failing ([like this report](https://github.com/home-assistant/home-assistant/issues/17943#issuecomment-462014778)). + +To avoid this, we're going to __no longer allow custom components to be partial overlays__ (just a platform). Instead, if you want to override a built-in platform, __you will need to override the whole component__. + +This is enforced by first resolving the platform as a component, and if it exists, limiting the lookup path to the component path. + +Example: if I look up the hue component, and it is provided by a custom component, then all platform lookups will also be looked up in the custom component dir. The same works the other way around, if a user would only try to override `hue/light.py` but not` hue/__init__.py`, the custom platform will be ignored. + +Paulus has written some detailed information about this change on the developers' blog, if you'd like more information. [The Great Migration by Paulus](https://developers.home-assistant.io/blog/2019/02/19/the-great-migration.html) + + +__Existing SmartThings configuration entries will be removed,__ including the SmartApp/Automation from the SmartThings app. Home Assistant will prompt you to configure the integration again or it can be invoked from the integrations page. The configuration process is the same as before. To prepare, have your _personal access token and a mobile device with the SmartThings Classic App handy._ This will not affect the naming of devices or entities and is a __one-time inconvenience.__ The implementation switches over to the SmartApp access token to synchronize subscriptions during setup of the config entry, which cannot be done using the personal access token. + ## {% linkable_title New Platforms %} @@ -52,18 +69,18 @@ Experiencing issues introduced by this release? Please report them in our [issue ## {% linkable_title Breaking Changes %} -- RSSI_PEER and RSSI_DEVICE are different things (fixes #20900) ([@dagobert] - [#20902]) ([homematic docs]) (breaking change) -- Add yeelight flow action support ([@zewelor] - [#21195]) ([light.yeelight docs]) (breaking change) -- Prevent partial custom component overlays ([@balloob] - [#21070]) (breaking change) -- Add support for automatic discovery of TP-Link switches, bulbs and dimmers ([@rytilahti] - [#18091]) ([tplink docs]) ([light.tplink docs]) ([switch.tplink docs]) (breaking change) -- Enhance SmartThings component subscription ([@andrewsayre] - [#21124]) ([smartthings docs]) (breaking change) (new-feature) -- Split out iperf3 into a component with a sensor platform ([@rohankapoorcom] - [#21138]) ([iperf3 docs]) ([sensor.iperf3 docs]) (breaking change) (new-platform) -- Remove the google travel time update service ([@rohankapoorcom] - [#21153]) ([sensor.google_travel_time docs]) (breaking change) -- Add ADB server functionality to Fire TV ([@JeffLIrion] - [#21221]) ([media_player.firetv docs]) (breaking change) -- Add SmartThings Cover platform and add cover device classes ([@andrewsayre] - [#21192]) ([cover docs]) ([smartthings docs]) (breaking change) (new-platform) -- Rewrite of Toon component ([@frenck] - [#21186]) ([toon docs]) (breaking change) (new-platform) -- Add config for trusted networks auth provider ([@awarecan] - [#21111]) (breaking change) -- HomeMatic: Add error-attribute ([@dagobert] - [#21009]) ([homematic docs]) (breaking change) +- __HomeMatic component's wireless actors__ are having two RSSI values. The way the component was programmed one of them was being overwritten. With this new change, the __`rssi` attribute of HomeMatic entities has been removed.__ As a replacement the attributes rssi_device and rssi_peer have been added. The attribute of `rssi` will no longer be available, you'll need to __update to `rssi_device`,__ and you can add `rssi_peer` now as well! (fixes #20900) ([@dagobert] - [#20902]) ([homematic docs]) (breaking change) +- You can now specifiy an action when calling the __yeelight_start_flow service__ on your yeelights. The __default action will be 'recover'__ if you do not specify something else. This action will be taken after the flow stops. ([@zewelor] - [#21195]) ([light.yeelight docs]) (breaking change) +- Custom platforms that override a built-in platform that has a component, should now also include the component in the custom_components/ folder. So if you want to override `hue/light.py` with a custom version, __you will also need to provide/copy over `hue/__init__.py`.__ See details in main section about this change. ([@balloob] - [#21070]) (breaking change) +- Automatic discovery of __TP-Link switches, bulbs and dimmers.__ This is a continuation of #15329 and adds support for automatic discovery of TP-Link bulbs, switches, and dimmers based on the new config flow. The integration needs to be enabled either in the __integration configuration or__ alternatively by __adding tplink component__ to the configuration file. As the devices are now configured on the component, this is a __breaking change for light.tplink and switch.tplink.__ ([@rytilahti] - [#18091]) ([tplink docs]) ([light.tplink docs]) ([switch.tplink docs]) (breaking change) +- Enhance __SmartThings component__ subscription. See details in main section about this change. ([@andrewsayre] - [#21124]) ([smartthings docs]) (breaking change) (new-feature) +- The __iperf3 sensor platform__ has been __separated__ into a component and a sensor to remove the service from the sensor platform. Configuration options have changed, __please review the documentation__ and select the correct options. ([@rohankapoorcom] - [#21138]) ([iperf3 docs]) __([sensor.iperf3 docs])__ (breaking change) (new-platform) +- The __`google_travel_time`__ platform no longer has an update service, use __homeassistant.update with the appropriate entity_id(s) instead.__ ([@rohankapoorcom] - [#21153]) ([sensor.google_travel_time docs]) (breaking change) +- Add ADB server functionality to __Fire TV.__ This change __removes the `get_source`__ configuration option. ([@JeffLIrion] - [#21221]) ([media_player.firetv docs]) (breaking change) +- With the addition of the __SmartThings Cover__ platform, the SmartThings __Sensor platform will no longer represent Door, Garage Door and Window Share attributes.__ Additionally, if the cover device reports battery status, the value will be present as a __state attribute__ (battery_level) and not a discrete sensor. ([@andrewsayre] - [#21192]) ([cover docs]) ([smartthings docs]) (breaking change) (new-platform) +- The __Toon component__ was broken some time ago, so now requires a Toon API developer account and __can be configured using the Home Assistant integrations.__ Support for Switches & Smoke detectors has been removed. ([@frenck] - [#21186]) ([toon docs]) (breaking change) (new-platform) +- Addition of config for __trusted networks auth provider.__ It is a breaking changes for users who __manually configured__ trusted network auth provider. An invalid config error will be thrown and HA won't be able to fully started. (It is NOT a breaking changes for user who didn't manual configured trusted network auth provider.) ([@awarecan] - [#21111]) (breaking change) +- For some __HomeMatic devices the `sabotage` attribute is replaced by `error`.__ The value (if not 0) is a device specific error code. ([@dagobert] - [#21009]) ([homematic docs]) (breaking change) ## {% linkable_title Beta Fixes %} From 41b4b69e834c8c9ddcc172a859b8978718a4c361 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 6 Mar 2019 15:45:42 -0800 Subject: [PATCH 64/64] Finish release --- _config.yml | 6 +-- source/_components/esphome.markdown | 1 + source/_components/lcn.markdown | 5 ++- source/_components/mobile_app.markdown | 20 +++++++++ source/_components/mysensors.markdown | 2 +- source/_components/nissan_leaf.markdown | 4 ++ ...media_player.ps4.markdown => ps4.markdown} | 0 source/_posts/2019-03-13-release-89.markdown | 38 +++++++++--------- .../blog/2019-03-release-89/components.png | Bin 0 -> 53251 bytes .../images/{ => supported_brands}/reddit.png | Bin 10 files changed, 52 insertions(+), 24 deletions(-) create mode 100644 source/_components/mobile_app.markdown rename source/_components/{media_player.ps4.markdown => ps4.markdown} (100%) create mode 100644 source/images/blog/2019-03-release-89/components.png rename source/images/{ => supported_brands}/reddit.png (100%) diff --git a/_config.yml b/_config.yml index 5c9641209ca..33b89bf248e 100644 --- a/_config.yml +++ b/_config.yml @@ -138,9 +138,9 @@ social: # Home Assistant release details current_major_version: 0 -current_minor_version: 88 -current_patch_version: 2 -date_released: 2019-02-27 +current_minor_version: 89 +current_patch_version: 0 +date_released: 2019-03-06 # Either # or the anchor link to latest release notes in the blog post. # Must be prefixed with a # and have double quotes around it. diff --git a/source/_components/esphome.markdown b/source/_components/esphome.markdown index ae995bccbf1..736d2cc49e7 100644 --- a/source/_components/esphome.markdown +++ b/source/_components/esphome.markdown @@ -6,6 +6,7 @@ date: 2018-12-16 14:20 sidebar: true comments: false sharing: true +featured: true footer: true logo: esphome.png ha_category: DIY diff --git a/source/_components/lcn.markdown b/source/_components/lcn.markdown index 1e788904e12..d2862df27ae 100644 --- a/source/_components/lcn.markdown +++ b/source/_components/lcn.markdown @@ -18,6 +18,7 @@ ha_iot_class: "Local Push" redirect_from: - /components/light.lcn/ - /components/switch.lcn/ + - /components/cover.lcn/ --- The `lcn` integration for Home Assistant allows you to connect to [LCN](http://www.lcn.eu) hardware devices. @@ -50,14 +51,14 @@ lcn: - name: Living room cover address: myhome.s0.m7 motor: motor1 - + lights: - name: Bedroom light address: myhome.s0.m7 output: output1 dimmable: true transition: 5 - + switches: - name: Sprinkler switch address: myhome.s0.m7 diff --git a/source/_components/mobile_app.markdown b/source/_components/mobile_app.markdown new file mode 100644 index 00000000000..0d1ab607ce4 --- /dev/null +++ b/source/_components/mobile_app.markdown @@ -0,0 +1,20 @@ +--- +layout: page +title: "Mobile App" +description: "The Mobile App component allows a generic platform for integrating with mobile apps." +date: 2019-03-06 01:30 +sidebar: true +comments: false +sharing: true +footer: true +logo: home-assistant.png +ha_category: "Other" +ha_release: 0.89 +ha_qa_scale: internal +--- + +The Mobile App component allows Home Assistant mobile apps to easily integrate with Home Assistant. + +If you are planning to use a mobile application that integrates with Home Assistant, we recommend that you keep this component enabled. + +If you are a mobile app developer, see the [developer documentation](https://developers.home-assistant.io/docs/en/app_integration_index.html) for instructions on how to build your app on top of the mobile app component. diff --git a/source/_components/mysensors.markdown b/source/_components/mysensors.markdown index 832ad97b9d2..855749eefa5 100644 --- a/source/_components/mysensors.markdown +++ b/source/_components/mysensors.markdown @@ -9,7 +9,7 @@ sharing: true footer: true logo: mysensors.png ha_category: DIY -featured: true +featured: false ha_iot_class: "Local Push" --- diff --git a/source/_components/nissan_leaf.markdown b/source/_components/nissan_leaf.markdown index 4650df72481..2e9945f0a8b 100644 --- a/source/_components/nissan_leaf.markdown +++ b/source/_components/nissan_leaf.markdown @@ -11,6 +11,10 @@ logo: nissan.png ha_category: Car ha_release: 0.89 ha_iot_class: "Cloud Polling" +redirect_from: + - /components/binary_sensor.nissan_leaf/ + - /components/sensor.nissan_leaf/ + - /components/switch.nissan_leaf/ --- The `nissan_leaf` component offers integration with the [NissanConnect EV](http://youplus.nissan.co.uk/GB/en/YouPlus/ConnectedServices.html) cloud service. NissanConnect EV was previously known as Nissan Carwings. It offers: diff --git a/source/_components/media_player.ps4.markdown b/source/_components/ps4.markdown similarity index 100% rename from source/_components/media_player.ps4.markdown rename to source/_components/ps4.markdown diff --git a/source/_posts/2019-03-13-release-89.markdown b/source/_posts/2019-03-13-release-89.markdown index 1b3fef91194..368397e38ce 100644 --- a/source/_posts/2019-03-13-release-89.markdown +++ b/source/_posts/2019-03-13-release-89.markdown @@ -1,9 +1,9 @@ --- layout: post -title: "0.89: TBD - UPDATE DAte" -description: "TBD" -date: 2019-02-27 00:11:03 -date_formatted: "March 13, 2019" +title: "0.89: Nissan Leaf, PlayStation 4, Point alarm control, Owlet baby monitor" +description: "Vroom vroom vrooooooooooom." +date: 2019-03-06 00:11:03 +date_formatted: "March 6, 2019" author: Paulus Schoutsen author_twitter: balloob comments: true @@ -12,7 +12,12 @@ og_image: /images/blog/2019-03-release-89/components.png --- -## {% linkable_title Noteworthy Breaking Change %} + +It's time for release 0.89. It's another great new release with some cool new features, bug fixes and improvements. The first cool new feature is that yet another car is integrated into Home Assistant: the Nissan Leaf. Both deConz and SmartThings integrations keep expanding to cover more devices. + +This release introduces a new mobile app component. [@robbiet480], who also works on the iOS app, has taken the best parts of the Home Assistant iOS app component and turned it into a standardized API that any mobile app can build upon. This will allow any mobile apps to integrate with Home Assistant with a great user experience. If you are a mobile app developer, please check the updated [app integration docs](https://developers.home-assistant.io/docs/en/app_integration_index.html). We will be fine tuning the API in upcoming releases. Feedback is welcome. + +## {% linkable_title Noteworthy Breaking Changes %} __Custom Components file structure change:__ A significant change in how the "under the hood" of Home Assistant works has led to forcing platforms to be resolved based off the component path, if it exists. @@ -26,36 +31,26 @@ Example: if I look up the hue component, and it is provided by a custom componen Paulus has written some detailed information about this change on the developers' blog, if you'd like more information. [The Great Migration by Paulus](https://developers.home-assistant.io/blog/2019/02/19/the-great-migration.html) - __Existing SmartThings configuration entries will be removed,__ including the SmartApp/Automation from the SmartThings app. Home Assistant will prompt you to configure the integration again or it can be invoked from the integrations page. The configuration process is the same as before. To prepare, have your _personal access token and a mobile device with the SmartThings Classic App handy._ This will not affect the naming of devices or entities and is a __one-time inconvenience.__ The implementation switches over to the SmartApp access token to synchronize subscriptions during setup of the config entry, which cannot be done using the personal access token. - ## {% linkable_title New Platforms %} - Météo-France platform for the weather component ([@victorcerutti] - [#18404]) ([sensor.meteo_france docs]) ([weather.meteo_france docs]) (new-platform) - Point alarm control ([@fredrike] - [#20972]) ([point docs]) (new-platform) -- Times of The Day Binary Sensor ([@kstaniek] - [#20068]) ([binary_sensor.tod docs]) (new-platform) - Nissan Leaf Integration (Carwings / NissanConnect EV) ([@filcole] - [#19786]) ([device_tracker docs]) ([nissan_leaf docs]) ([binary_sensor.nissan_leaf docs]) ([sensor.nissan_leaf docs]) ([switch.nissan_leaf docs]) (new-platform) +- Rewrite of Toon component ([@frenck] - [#21186]) ([toon docs]) (breaking change) (new-platform) +- Times of The Day Binary Sensor ([@kstaniek] - [#20068]) ([binary_sensor.tod docs]) (new-platform) - Add switch platform for Danfoss Air and additional sensors. ([@JonasPed] - [#21046]) ([danfoss_air docs]) (new-platform) - Owlet baby monitor component ([@oblogic7] - [#21108]) ([owlet docs]) (new-platform) - deCONZ thermostat support ([@Kane610] - [#20586]) ([deconz docs]) (new-platform) - Added device tracker support for Ubee Router ([@mzdrale] - [#19586]) ([device_tracker docs]) (new-platform) -- Nissanleaf ([@filcole] - [#21145]) ([nissan_leaf docs]) (new-platform) - Add LCN cover platform ([@alengwenus] - [#20288]) ([lcn docs]) ([cover.lcn docs]) (new-platform) -- Split out iperf3 into a component with a sensor platform ([@rohankapoorcom] - [#21138]) ([iperf3 docs]) ([sensor.iperf3 docs]) (breaking change) (new-platform) - Add initial support for Sony SDCP projector control ([@alistairg] - [#20269]) ([switch.sony_projector docs]) (new-platform) -- Refactoring. Moved LCN constants to const.py ([@alengwenus] - [#21376]) ([lcn docs]) (new-platform) - Add SmartThings Cover platform and add cover device classes ([@andrewsayre] - [#21192]) ([cover docs]) ([smartthings docs]) (breaking change) (new-platform) -- Rewrite of Toon component ([@frenck] - [#21186]) ([toon docs]) (breaking change) (new-platform) - Add SmartThings Scene platform ([@andrewsayre] - [#21405]) ([smartthings docs]) (new-platform) - Reddit Sensor ([@ljmerza] - [#21344]) ([sensor.reddit docs]) (new-platform) - mobile_app component ([@robbiet480] - [#21475]) ([mobile_app docs]) (beta fix) (new-platform) - -## {% linkable_title New Features %} - -- Enhance SmartThings component subscription ([@andrewsayre] - [#21124]) ([smartthings docs]) (breaking change) (new-feature) -- SmartThings Lock platform state attributes enhancement ([@andrewsayre] - [#21379]) ([smartthings docs]) (new-feature) -- Add power and energy attributes to SmartThings switch ([@andrewsayre] - [#21375]) ([smartthings docs]) (new-feature) +- Add component media player.ps4 ([@ktnrg45] - [#21074]) ([ps4 docs]) ## {% linkable_title If you need help... %} @@ -113,6 +108,8 @@ Experiencing issues introduced by this release? Please report them in our [issue - Avoid recorder thread crashing ([@balloob] - [#21668]) (beta fix) - check we have a tb ([@dgomes] - [#21670]) ([system_log docs]) (beta fix) - Fix ADS race condition ([@carstenschroeder] - [#21677]) ([ads docs]) (beta fix) +- resync hass that changes have occured ([@fredrike] - [#21705]) ([tellduslive docs]) (beta fix) +- Upgrade toonapilib to 3.2.1 ([@frenck] - [#21706]) ([toon docs]) (beta fix) ## {% linkable_title All changes %} @@ -297,6 +294,8 @@ Experiencing issues introduced by this release? Please report them in our [issue - Avoid recorder thread crashing ([@balloob] - [#21668]) (beta fix) - check we have a tb ([@dgomes] - [#21670]) ([system_log docs]) (beta fix) - Fix ADS race condition ([@carstenschroeder] - [#21677]) ([ads docs]) (beta fix) +- resync hass that changes have occured ([@fredrike] - [#21705]) ([tellduslive docs]) (beta fix) +- Upgrade toonapilib to 3.2.1 ([@frenck] - [#21706]) ([toon docs]) (beta fix) [#18091]: https://github.com/home-assistant/home-assistant/pull/18091 [#18404]: https://github.com/home-assistant/home-assistant/pull/18404 @@ -479,6 +478,8 @@ Experiencing issues introduced by this release? Please report them in our [issue [#21668]: https://github.com/home-assistant/home-assistant/pull/21668 [#21670]: https://github.com/home-assistant/home-assistant/pull/21670 [#21677]: https://github.com/home-assistant/home-assistant/pull/21677 +[#21705]: https://github.com/home-assistant/home-assistant/pull/21705 +[#21706]: https://github.com/home-assistant/home-assistant/pull/21706 [@Adminiuga]: https://github.com/Adminiuga [@Danielhiversen]: https://github.com/Danielhiversen [@Dullage]: https://github.com/Dullage @@ -658,6 +659,7 @@ Experiencing issues introduced by this release? Please report them in our [issue [system_log docs]: /components/system_log/ [tahoma docs]: /components/tahoma/ [telegram_bot docs]: /components/telegram_bot/ +[tellduslive docs]: /components/tellduslive/ [tibber docs]: /components/tibber/ [toon docs]: /components/toon/ [tplink docs]: /components/tplink/ diff --git a/source/images/blog/2019-03-release-89/components.png b/source/images/blog/2019-03-release-89/components.png new file mode 100644 index 0000000000000000000000000000000000000000..1e4f2e9c6027373e10fe09d5b29db8ff14b2c09e GIT binary patch literal 53251 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 UNfqq}7K+83?A`1h*@h7Q1v1l9=Kufz literal 0 HcmV?d00001 diff --git a/source/images/reddit.png b/source/images/supported_brands/reddit.png similarity index 100% rename from source/images/reddit.png rename to source/images/supported_brands/reddit.png