From 3461dc17a53461c528cc433944cfc15b0889286f Mon Sep 17 00:00:00 2001 From: rafale77 Date: Tue, 14 Aug 2018 01:55:08 +0800 Subject: [PATCH 01/47] Update amcrest.markdown (#5216) * Update amcrest.markdown * :pencil2: Minor tweaks --- source/_components/amcrest.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/amcrest.markdown b/source/_components/amcrest.markdown index 9c0aad4929e..220ab96d17f 100644 --- a/source/_components/amcrest.markdown +++ b/source/_components/amcrest.markdown @@ -46,7 +46,7 @@ Configuration variables: - **host** (*Required*): The IP address or hostname of your camera. If using a hostname, make sure the DNS works as expected. - **username** (*Required*): The username for accessing your camera. - **password** (*Required*): The password for accessing your camera. -- **name** (*Optional*): This parameter allows you to override the name of your camera. The default is "Amcrest Camera". +- **name** (*Optional*): This parameter allows you to override the name of your camera. The default is "Amcrest Camera". In the case of multi-camera setups, this is highly recommended as camera id number will be randomly changed at each reboot if a name is not allocated. - **port** (*Optional*): The port that the camera is running on. The default is 80. - **resolution** (*Optional*): This parameter allows you to specify the camera resolution. For a high resolution (1080/720p), specify the option `high`. For VGA resolution (640x480p), specify the option `low`. If omitted, it defaults to *high*. - **stream_source** (*Optional*): The data source for the live stream. `mjpeg` will use the camera's native MJPEG stream, whereas `snapshot` will use the camera's snapshot API to create a stream from still images. You can also set the `rtsp` option to generate the streaming via RTSP protocol. If omitted, it defaults to *snapshot*. From 91477858fd8065f460b71091d8503c263d901acc Mon Sep 17 00:00:00 2001 From: rafale77 Date: Tue, 14 Aug 2018 02:03:46 +0800 Subject: [PATCH 02/47] Update to reflect new pull under review (#5217) * Update to reflect new pull under review Addresses multi-camera setups with naming issues * Update switch.amcrest.markdown * Update switch.amcrest.markdown * :rocket: Trigger rebuild * :pencil2: Tweaks * :pencil2: Rewording --- source/_components/switch.amcrest.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/_components/switch.amcrest.markdown b/source/_components/switch.amcrest.markdown index d9ed4564b22..d494df7b02b 100644 --- a/source/_components/switch.amcrest.markdown +++ b/source/_components/switch.amcrest.markdown @@ -16,3 +16,7 @@ ha_iot_class: "Local Polling" The `amcrest` switch platform lets you control settings of [Amcrest IP Camera](https://home-assistant.io/components/camera.amcrest/) through Home Assistant. Switches will be configured automatically. Please refer to the [component](/components/amcrest/) configuration on how to setup. + +

+In previous versions, switch devices in setups with multiple cameras, would not have specific entity ID causing them to change randomly after each Home Assistant restart. The current version adds the name of the camera at the end of the switch entity ID, making it more specific and consistent and causes the name option to be required in a multi-camera system. This behavior matches the sensor behavior of the Amcrest component. Because of this, older automations may require updates to the entity ID. +

From def92b9b3963ee49d065440b1ab77f7ebacdc203 Mon Sep 17 00:00:00 2001 From: "Hovo (Luke)" Date: Tue, 14 Aug 2018 04:24:35 +1000 Subject: [PATCH 03/47] Allow wait template to run the remainder of the script (#5954) * Adding new proceed variable * Fixing documentation langauage * Updating documentation due to code changes * Changing default to continue to execute after delay --- source/_docs/scripts.markdown | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/source/_docs/scripts.markdown b/source/_docs/scripts.markdown index 41579318f06..7534ae05787 100644 --- a/source/_docs/scripts.markdown +++ b/source/_docs/scripts.markdown @@ -81,7 +81,7 @@ Delays are useful for temporarily suspending your script and start it at a later ### {% linkable_title Wait %} -Wait until some things are complete. We support at the moment `wait_template` for waiting until a condition is `true`, see also on [Template-Trigger](/docs/automation/trigger/#template-trigger). It is possible to set a timeout after which the script will abort its execution if the condition is not satisfied. Timeout has the same syntax as `delay`. +Wait until some things are complete. We support at the moment `wait_template` for waiting until a condition is `true`, see also on [Template-Trigger](/docs/automation/trigger/#template-trigger). It is possible to set a timeout after which the script will continue its execution if the condition is not satisfied. Timeout has the same syntax as `delay`. {% raw %} ```yaml @@ -92,9 +92,10 @@ Wait until some things are complete. We support at the moment `wait_template` fo {% raw %} ```yaml -# wait until a valve is < 10 or abort after 1 minute. -- wait_template: "{{ states.climate.kitchen.attributes.valve|int < 10 }}" +# wait for sensor to trigger or 1 minute before continuing to execute. +- wait_template: "{{ is_state('binary_sensor.entrance', 'on') }}" timeout: '00:01:00' + continue_on_timeout: 'true' ``` {% endraw %} @@ -120,6 +121,17 @@ It is also possible to use dummy variables, e.g., in scripts, when using `wait_t ``` {% endraw %} +You can also get the script to abort after the timeout by using `continue_on_timeout` + +{% raw %} +```yaml +# wait until a valve is < 10 or continue after 1 minute. +- wait_template: "{{ states.climate.kitchen.attributes.valve|int < 10 }}" + timeout: '00:01:00' + continue_on_timeout: 'false' +``` +{% endraw %} + ### {% linkable_title Fire an Event %} This action allows you to fire an event. Events can be used for many things. It could trigger an automation or indicate to another component that something is happening. For instance, in the below example it is used to create an entry in the logbook. From 8ff94bff08a50e6b07f445041f475020d177308c Mon Sep 17 00:00:00 2001 From: Jason Hu Date: Mon, 13 Aug 2018 11:25:30 -0700 Subject: [PATCH 04/47] Embedded MQTT broker needs setup its own password (#5993) * Embedded MQTT broker needs setup its own password * Update broker.markdown * :pencil2: Minor tweak --- source/_docs/mqtt/broker.markdown | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/_docs/mqtt/broker.markdown b/source/_docs/mqtt/broker.markdown index 47a19df934f..b834900a6fc 100644 --- a/source/_docs/mqtt/broker.markdown +++ b/source/_docs/mqtt/broker.markdown @@ -22,13 +22,15 @@ Home Assistant contains an embedded MQTT broker. If no broker configuration is g | Port | 1883 | | Protocol | 3.1.1 | | User | homeassistant | -| Password | Your API [password](/components/http/) | +| Password | no default value | | Websocket port | 8080 | +> Since release 0.77, the embedded broker does not use your [API password](/components/http/) as the default password. The MQTT component will fail to set up if you have API password configured, but don't have MQTT password configured as in the following example. ```yaml # Example configuration.yaml entry mqtt: + password: YOUR_MQTT_PASSWORD ```

From ee1c05ea37c8e80008b3ab56970569a05e26a473 Mon Sep 17 00:00:00 2001 From: cgtobi Date: Mon, 13 Aug 2018 20:51:16 +0200 Subject: [PATCH 05/47] Add documentation for new RMV public transport sensor (#5947) * Initial documentation for the rmvtransport sensor. * Fix name * Fix typo * Added missing variable description for max number of journeys. * Minor wording fix * Fix setting names after code change. * Use configuration tag syntax. * Add logo. * Update logo file name. * Fix liquid syntax error. * Fix config setting name. * :pencil2: Markdown tweaks --- .../_components/sensor.rmvtransport.markdown | 101 ++++++++++++++++++ source/images/supported_brands/RMV.png | Bin 0 -> 12964 bytes 2 files changed, 101 insertions(+) create mode 100644 source/_components/sensor.rmvtransport.markdown create mode 100644 source/images/supported_brands/RMV.png diff --git a/source/_components/sensor.rmvtransport.markdown b/source/_components/sensor.rmvtransport.markdown new file mode 100644 index 00000000000..e6584282bda --- /dev/null +++ b/source/_components/sensor.rmvtransport.markdown @@ -0,0 +1,101 @@ +--- +layout: page +title: "RMV" +description: "Instructions on how to integrate Rhein-Main public transport departure times into Home Assistant." +date: 2018-08-02 22:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: RMV.png +ha_category: Transport +ha_release: 0.76 +ha_iot_class: "Cloud Polling" +--- + +The `rvmtransport` sensor will give you the departure time of the next bus, tram, subway, or train at the next station or stop in the Rhein-Main area public transport network. Additional details such as the line number and destination are present in the attributes. + +## {% linkable_title Configuration %} + +To enable this sensor, add the following lines to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +sensor: + - platform: rmvtransport + next_departure: + - station: STATION_OR_STOP_ID +``` + +{% configuration %} +name: + description: Name to use in the frontend. + required: false + default: The default is the station name. + type: string +stationId: + description: ID of the stop or station, e.g. 3000010. Visit [the RMV OpenData web site](https://opendata.rmv.de) to find a list of valid IDs. + required: true + type: string +destinations: + description: "One or multiple final stop names, e.g., 'Frankfurt (Main) Hauptbahnhof' or ['Frankfurt (Main) Hauptbahnhof','Frankfurt (Main) Stadion']. This can be used to only consider a particular direction of travel." + required: false + type: [string] +lines: + description: "One or more line numbers, e.g., `'S8'` or `['S8', 'RB33', '41']`" + required: false + default: The default is the station name. + type: [string, int] +products: + description: "One or more modes of transport `['U-Bahn', 'Tram', 'Bus', 'S-Bahn', 'RB', 'RE', 'EC', 'IC', 'ICE']`." + required: false + default: Defaults to all. + type: [string] +time_offset: + description: Do not display departures leaving sooner than this number of minutes. Useful if you are a couple of minutes away from the stop. + required: false + default: The defaults is 0. + type: int +max_journeys: + description: Specify the maximal number of journeys. + required: false + default: The default is 5. + type: string +{% endconfiguration %} + +## {% linkable_title Examples %} + +### {% linkable_title Full configuration %} + +The example below shows a full configuration with three sensors that showcase the various configuration options. + +```yaml +# Example configuration.yaml entry +sensor: + - platform: rmvtransport + next_departure: + - station: 3000010 + time_offset: 5 + destinations: + - 'Frankfurt (Main) Flughafen Regionalbahnhof' + - 'Frankfurt (Main) Stadion' + products: + - 'RB' + - 'RE' + - 'Bus' + - 'S' + - station: 3006907 + products: 'Bus' + destinations: ['Wiesbaden Dernsches Gelände', 'Mainz Hauptbahnhof'] + name: Destination + - station: 3006904 + lines: 'S8' + max_journeys: 5 + products: 'S' +``` + +The first sensor will return S-Bahn, bus, RB and RE trains departures from Frankfurt Hauptbahnhof to Frankfurt Airport or Stadium that are at least 5 minutes away. + +The second sensor returns bus departures from Wiesbaden Hauptbahnhof going to Dernsches Gelände and Mainz Hauptbahnhof. To retrieve the time of the second departure, you would use states.sensor.ENTITY_NAME.attributes.departures[1].time. + +The third sensor returns all S-Bahn trains from Mainz Hauptbahnhof for line S8. diff --git a/source/images/supported_brands/RMV.png b/source/images/supported_brands/RMV.png new file mode 100644 index 0000000000000000000000000000000000000000..250e90e4d4b2970aff5fa85df4cb15e947a2e674 GIT binary patch literal 12964 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 literal 0 HcmV?d00001 From 0310f607aaf2bbcc3bc381cf5f94bd72b56a88d5 Mon Sep 17 00:00:00 2001 From: Thom Troy Date: Mon, 13 Aug 2018 19:56:23 +0100 Subject: [PATCH 06/47] Update EphEmber to show new operations modes (#5967) * Include EphEmber operation modes * Remove All Day state from supported modes * :pencil2: Spelling --- source/_components/climate.ephember.markdown | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/source/_components/climate.ephember.markdown b/source/_components/climate.ephember.markdown index 0b77e6a58b7..d2fba985e2c 100644 --- a/source/_components/climate.ephember.markdown +++ b/source/_components/climate.ephember.markdown @@ -1,7 +1,7 @@ --- layout: page -title: "EPH Controls Ember Thermostat" -description: "Instructions on how to integrate EPH Controls Ember thermostats within Home Assistant." +title: "EPH Controls EMBER Thermostat" +description: "Instructions on how to integrate EPH Controls EMBER thermostats within Home Assistant." date: 2017-10-07 12:40 sidebar: true comments: false @@ -14,7 +14,7 @@ ha_iot_class: "Local Polling" --- -The `ephember` climate platform lets you control [EPH Controls](http://emberapp.ephcontrols.com/) thermostats. The module only works if you have a WiFi gateway to control your EPH system and an account on the ember app. +The `ephember` climate platform lets you control [EPH Controls](http://emberapp.ephcontrols.com/) thermostats. The module only works if you have a WiFi gateway to control your EPH system and an account on the EMBER app. To set it up, add the following information to your `configuration.yaml` file: @@ -29,5 +29,13 @@ A single interface can handle up to 32 connected devices. Configuration variables: -- **username** (*Required*): The email address you used to sign up to the ember app -- **password** (*Required*): The password you used to sign up to the ember app +- **username** (*Required*): The email address you used to sign up to the EMBER app +- **password** (*Required*): The password you used to sign up to the EMBER app + +The supported operation modes map to the ON/OFF period selection of your timeswitch / EMBER app. These include: + +- **Auto** The timeswitch operates 3 on / off periods per day. +- **On** The timeswitch is permanently on. +- **Off** The timeswitch is permanently off. + +If **All Day** is selected in the EMBER app it will show as **Auto** in Home Assistant. From 2ed664bdc9c151ddfe027b84ce5ab7668d7ab2af Mon Sep 17 00:00:00 2001 From: Robert Svensson Date: Mon, 13 Aug 2018 21:15:29 +0200 Subject: [PATCH 07/47] Improve deCONZ switch platform documentation (#5986) --- source/_components/switch.deconz.markdown | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/_components/switch.deconz.markdown b/source/_components/switch.deconz.markdown index e55a875cc8e..1b7a1b3e3f8 100644 --- a/source/_components/switch.deconz.markdown +++ b/source/_components/switch.deconz.markdown @@ -15,10 +15,12 @@ ha_iot_class: "Local Push" See the [deCONZ main component](/components/deconz/) for configuration instructions. -The `Entity Id` names will be `switch.device_name`, where `device_name` is defined in deCONZ. +Switches are devices like power plugs and sirens. Note that devices in the switch platform identify as lights, so there is a manually curated list that defines which "lights" are switches. +The `Entity Id` names will be `switch.device_name`, where `device_name` is defined in deCONZ. + #### {% linkable_title Verified supported switches %} - Innr SP120 From 7e5f2a1bbb61431f1f05bb8dc50595f440a9af5b Mon Sep 17 00:00:00 2001 From: Charles Garwood Date: Mon, 13 Aug 2018 15:22:30 -0400 Subject: [PATCH 08/47] Add monitored_conditions info to Unifi docs (#5977) --- .../_components/device_tracker.unifi.markdown | 61 ++++++++++++++++++- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/source/_components/device_tracker.unifi.markdown b/source/_components/device_tracker.unifi.markdown index e9410667707..94dee4ca71c 100644 --- a/source/_components/device_tracker.unifi.markdown +++ b/source/_components/device_tracker.unifi.markdown @@ -67,6 +67,11 @@ ssid_filter: type: list of strings required: false default: None +monitored_conditions: + description: A list of extra attributes to pull from the Unifi controller. + type: list + required: false + default: None {% endconfiguration %} @@ -78,7 +83,7 @@ The Unifi controller allows you to create multiple users on it besides the main ### {% linkable_title Conflicts with MQTT %} -The Unifi controller can either be a dedicated hardware device (Unifi's cloud key), or as software any Linux system. If you run the the Unifi controller on the same operating system as Home Assistant there may be conflicts in ports if you have the MQTT component as well. +The Unifi controller can either be a dedicated hardware device (Unifi's cloud key), or as software any Linux system. If you run the Unifi controller on the same operating system as Home Assistant there may be conflicts in ports if you have the MQTT component as well. It is recommended that you run the Unifi controller in a dedicated virtual machine to avoid that situation. @@ -86,6 +91,58 @@ It is recommended that you run the Unifi controller in a dedicated virtual machi Presence detection depends on accurate time configuration between Home Assistant and the Unifi controller. -If Home Assistant and the Unifi controller are running on separate machines or VMs ensure that all clocks are syncronized. Failing to have syncronized clocks will lead to Home Assistant failing to mark a device as home. +If Home Assistant and the Unifi controller are running on separate machines or VMs ensure that all clocks are synchronized. Failing to have synchronized clocks will lead to Home Assistant failing to mark a device as home. [Related Issue](https://github.com/home-assistant/home-assistant/issues/10507) + +### {% linkable_title Monitored Conditions %} + +The Unifi controller returns a number of additional attributes that can be used for tracking devices, including signal strength, rx/tx rates, and which AP it is connected to. The list of possible options may vary depending on your Unifi controller version and if a device is wired or wireless. + +Unifi Controller version 5.6.29 has the following options: + - _id + - _is_guest_by_uap + - _last_seen_by_uap + - _uptime_by_uap + - ap_mac + - assoc_time + - authorized + - bssid + - bytes-r + - ccq + - channel + - essid + - first_seen + - hostname + - idletime + - ip + - is_11r + - is_guest + - is_wired + - last_seen + - latest_assoc_time + - mac + - name + - noise + - noted + - oui + - powersave_enabled + - qos_policy_applied + - radio + - radio_proto + - rssi + - rx_bytes + - rx_bytes-r + - rx_packets + - rx_rate + - signal + - site_id + - tx_bytes + - tx_bytes-r + - tx_packets + - tx_power + - tx_rate + - uptime + - user_id + - usergroup_id + - vlan From 8da78438963e5f2507f5bc139ae37d22d375807e Mon Sep 17 00:00:00 2001 From: Conrad Juhl Andersen Date: Mon, 13 Aug 2018 22:51:31 +0200 Subject: [PATCH 09/47] Xiaomi Vacuum: Updated to reflect that it is no longer a toggle (#5902) * Updated to reflect that it is no longer a toggle * Added start as a supported feature and split up start_pause --- source/_components/vacuum.xiaomi_miio.markdown | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/source/_components/vacuum.xiaomi_miio.markdown b/source/_components/vacuum.xiaomi_miio.markdown index be3f1ed0bbf..a23e015ce7e 100644 --- a/source/_components/vacuum.xiaomi_miio.markdown +++ b/source/_components/vacuum.xiaomi_miio.markdown @@ -17,11 +17,10 @@ The `xiaomi miio` vacuum platform allows you to control the state of your [Xiaom Currently supported features are: -- `turn_on` +- `start` - `pause` - `stop` - `return_to_home` -- `turn_off` (stop all activity and return to dock) - `locate` - `clean_spot` - `set_fan_speed` @@ -49,7 +48,7 @@ Configuration variables: ## {% linkable_title Platform Services %} -In addition to all of the services provided by the `vacuum` component (`turn_on`, `turn_off`, `start_pause`, `stop`, `return_to_home`, `locate`, `set_fan_speed` and `send_command`), the `xiaomi` platform introduces specific services to access the remote control mode of the robot. These are: +In addition to all of the services provided by the `vacuum` component (`start`, `pause`, `stop`, `return_to_home`, `locate`, `set_fan_speed` and `send_command`), the `xiaomi` platform introduces specific services to access the remote control mode of the robot. These are: - `xiaomi_remote_control_start` - `xiaomi_remote_control_stop` @@ -97,7 +96,7 @@ Enter remote control mode, make one move, stop, and exit remote control mode. ## {% linkable_title Attributes %} In addition to [all of the attributes provided by the `vacuum` component](/components/vacuum/#attributes), -(`battery_icon`, `cleaned_area`, `fan_speed`, `fan_speed_list`, `status`, and `params`), the `xiaomi` platform introduces specific attributes. These are: +(`battery_icon`, `cleaned_area`, `fan_speed`, `fan_speed_list`, and `params`), the `xiaomi` platform introduces specific attributes. These are: - `cleaning_time` - `do_not_disturb` From 257054787f614d7343a1c91e5603c4474acfb881 Mon Sep 17 00:00:00 2001 From: Colin Frei Date: Tue, 14 Aug 2018 00:31:15 +0200 Subject: [PATCH 10/47] Add documentation for netatmo public component (#5893) * Add documentation for netatmo public component * :pencil2: Minor typo * Use configuration block instead of plain text * Change version and clarify that sensor is rain-only * :fire: Removes duplicate configuration variables header * :pencil2: Tweaks * Update 'ha_releases' --- .../sensor.netatmo_public.markdown | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 source/_components/sensor.netatmo_public.markdown diff --git a/source/_components/sensor.netatmo_public.markdown b/source/_components/sensor.netatmo_public.markdown new file mode 100644 index 00000000000..9c89a1c5a71 --- /dev/null +++ b/source/_components/sensor.netatmo_public.markdown @@ -0,0 +1,67 @@ +--- +layout: page +title: "Netatmo Public" +description: "Instructions on how to add sensors using Netatmo public data to Home Assistant." +date: 2018-07-22 21:18 +sidebar: true +comments: false +sharing: true +footer: true +logo: netatmo.png +ha_category: Sensor +ha_iot_class: "Cloud Polling" +ha_release: 0.77 +--- + +The `netatmo_public` sensor allows you to expose data from [Netatmo](https://weathermap.netatmo.com/) to Home Assistant, even if you don't have a Netatmo device yourself. Currently, only live rain data is supported. + +To enable the Netatmo sensor, you have to set up [netatmo](/components/netatmo/). + +## {% linkable_title Configuration %} + +Next, enable the sensor by adding the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +sensor: + - platform: netatmo_public + areas: + - lat_ne: 40.719 + lon_ne: -73.735 + lat_sw: 40.552 + lon_sw: -74.105 +``` + +{% configuration %} +areas: + description: The list contains one or more areas to add as sensors. + required: true + type: map + keys: + lat_ne: + description: Latitude of north-eastern corner of area. + required: true + type: string + lon_ne: + description: Longitude of north-eastern corner of area. + required: true + type: string + lat_sw: + description: Latitude of south-western corner of area. + required: true + type: string + lon_sw: + description: Longitude of south-western corner of area. + required: true + type: string + name: + description: Name of the sensor. + required: false + type: string + default: Netatmo Public Data + type: + description: How to calculate the value of the sensor if there are multiple stations reporting data. Accepts `max` or `avg`. + required: false + type: string + default: max +{% endconfiguration %} From ba12a561fc1bcc2e4f77e13300f54070e0cc01be Mon Sep 17 00:00:00 2001 From: Oscar Tin Yiu Lai Date: Tue, 14 Aug 2018 08:53:58 +1000 Subject: [PATCH 11/47] added docs for added attributes for dyson fan (#5938) --- source/_components/fan.dyson.markdown | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/source/_components/fan.dyson.markdown b/source/_components/fan.dyson.markdown index d1ae60c6381..c3480135efb 100644 --- a/source/_components/fan.dyson.markdown +++ b/source/_components/fan.dyson.markdown @@ -22,3 +22,12 @@ You have first to setup the [Dyson component](/components/dyson/) - Pure Cool link (desk and tower) - Pure Hot+cool link (but heating is not yet supported) + +### {% linkable_title Attributes %} + +The are several attributes that can be useful for automations and templates. + +| Attribute | Description | +| --------- | ----------- | +| `is_night_mode` | A boolean that indicates if the night mode of the fan device is on. +| `is_auto_mode` | A boolean that indicates if the auto mode of the fan device is on. From 69a2d37b260c6fd4e2d0de4d67f73e3d7d28331d Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 14 Aug 2018 08:22:14 +0200 Subject: [PATCH 12/47] Add Mozilla SSL docs (#6013) * Add Mozilla SSL docs * Update http.markdown --- source/_components/http.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_components/http.markdown b/source/_components/http.markdown index 0616476bf07..557c87681dd 100644 --- a/source/_components/http.markdown +++ b/source/_components/http.markdown @@ -42,6 +42,7 @@ Configuration variables: - **trusted_networks** (*Optional*): List of trusted networks, consisting of IP addresses or networks, that are allowed to bypass password protection when accessing Home Assistant. If using a reverse proxy with the `use_x_forwarded_for` option enabled, requests proxied to Home Assistant with a trusted `X-Forwarded-For` header will appear to come from the IP given in that header instead of the proxy IP. - **ip_ban_enabled** (*Optional*): Flag indicating whether additional IP filtering is enabled. Defaults to False. - **login_attempts_threshold** (*Optional*): Number of failed login attempt from single IP after which it will be automatically banned if `ip_ban_enabled` is True. Defaults to -1, meaning that no new automatic bans will be added. +- **ssl_profile** (*Optional*): The [Mozilla SSL profile](https://wiki.mozilla.org/Security/Server_Side_TLS) to use. Either `modern` or `intermediate`. Default is `modern`. Only lower if you are experiencing integrations causing SSL handshake errors. The sample below shows a configuration entry with possible values: From b673a41b16132c7a302bd8d72e4f418ece0f2b51 Mon Sep 17 00:00:00 2001 From: Nate Clark Date: Tue, 14 Aug 2018 15:15:50 -0400 Subject: [PATCH 13/47] add support for momentary beep/blink configuration options (#6016) --- source/_components/konnected.markdown | 33 +++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/source/_components/konnected.markdown b/source/_components/konnected.markdown index 4710844aa45..8a5f245af0e 100644 --- a/source/_components/konnected.markdown +++ b/source/_components/konnected.markdown @@ -74,7 +74,7 @@ devices: description: The number corresponding to the _IO index_ of the labeled pin on the NodeMCU dev board. See the [NodeMCU GPIO documentation](https://nodemcu.readthedocs.io/en/master/en/modules/gpio/) for more details. Valid values are 1, 2, 5, 6, 7 and 9. required: exclusive zone: - description: The number corresponding to the labeled zone on the [Konnected Alarm Panel](https://konnected.io) board. Valid values are 1, 2, 3, 4, 5 and 6. + description: The number corresponding to the labeled zone on the [Konnected Alarm Panel](https://konnected.io) board. Valid values are `1`, `2`, `3`, `4`, `5` and `6`. required: exclusive type: description: Any [binary sensor](/components/binary_sensor/) class, typically `door`, `window`, `motion` or `smoke`. @@ -92,16 +92,25 @@ devices: description: The number corresponding to the _IO index_ of the labeled pin on the NodeMCU dev board. See the [NodeMCU GPIO documentation](https://nodemcu.readthedocs.io/en/master/en/modules/gpio/) for more details. Valid values are 1, 2, 5, 6, 7 and 8. required: exclusive zone: - description: The number corresponding to the labeled zone on the [Konnected Alarm Panel](https://konnected.io) board or the word `out` to specify the dedicated ALARM/OUT terminal on the Konnected board. Valid values are 1, 2, 3, 4, 5 and out. + description: The number corresponding to the labeled zone on the [Konnected Alarm Panel](https://konnected.io) board or the word `out` to specify the dedicated ALARM/OUT terminal on the Konnected board. Valid values are `1`, `2`, `3`, `4`, `5` and `out`. required: exclusive name: description: The name of the device used in the front end. required: false default: automatically generated activation: - description: Either "low" or "high" to specify the state when the switch is turned on. + description: Either `low` or `high` to specify the state when the switch is turned on. default: high required: false + momentary: + description: Duration of the momentary pulse in milliseconds. To make a half-second momentary contact using a relay for a garage door opener, set this value to `500`. + required: false + pause: + description: Time of the pause between pulses in milliseconds when also used with _momentary_ and _repeat_. To make a door chime "beep" with piezo buzzer, set this value to `55`, set _momentary_ to `65`, and _repeat_ to `3` or `4`. + required: false + repeat: + description: Number of times to repeat a momentary pulse. Set to `-1` to make an infinite repeat. This is useful as an alarm or warning when used with a piezo buzzer. + required: false {% endconfiguration%} #### {% linkable_title Configuration Notes %} @@ -109,7 +118,7 @@ devices: - Either **pin** or **zone** is required for each actuator or sensor. Do not use both in the same definition. - Pin `D8` or the `out` zone will only work when activation is set to high (the default). -## {% linkable_title Full configuration %} +## {% linkable_title Full Configuration %} ```yaml # Example configuration.yaml entry @@ -121,12 +130,25 @@ konnected: - zone: 1 type: door name: 'Front Door' + - zone: 2 + type: smoke + name: 'Bedroom Smoke Detector' - zone: 3 type: motion name: 'Test Motion' switches: - zone: out name: siren + - zone: 5 + name: 'Beep Beep' + momentary: 65 + pause: 55 + repeat: 4 + - zone: 5 + name: Warning + momentary: 65 + pause: 55 + repeat: -1 - id: 438a38 binary_sensors: - pin: 1 @@ -139,6 +161,9 @@ konnected: - pin: 5 name: 'Garage Door' activation: low + momentary: 500 + - pin: 8 + name: LED Light ``` ### {% linkable_title Pin Mapping %} From d2a52b21d1ef94c7b8d4dc40e99da8c7066eb1d5 Mon Sep 17 00:00:00 2001 From: Jason Hu Date: Tue, 14 Aug 2018 23:10:48 -0700 Subject: [PATCH 14/47] Embedded MQTT password change backport to 0.76 (#6020) * Embedded MQTT password change backport to 0.76 * Fix formatting --- source/_docs/mqtt/broker.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_docs/mqtt/broker.markdown b/source/_docs/mqtt/broker.markdown index 628c6dbdb0b..e936f059e00 100644 --- a/source/_docs/mqtt/broker.markdown +++ b/source/_docs/mqtt/broker.markdown @@ -25,7 +25,7 @@ Home Assistant contains an embedded MQTT broker. If no broker configuration is g | Password | no default value | | Websocket port | 8080 | -> Since release 0.77, the embedded broker does not use your [API password](/components/http/) as the default password. The MQTT component will fail to set up if you have API password configured, but don't have MQTT password configured as in the following example. +Since release 0.76, the embedded broker does not use your [API password](/components/http/) as the default password. The MQTT component will fail to set up if you have API password configured, but don't have MQTT password configured as in the following example. ```yaml # Example configuration.yaml entry From e2e56dce9f9deb77593fb08bc3eafa9e1b8d9d38 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Wed, 15 Aug 2018 08:31:52 +0200 Subject: [PATCH 15/47] Add new option (#6019) * Add new option * Fix typos --- source/_components/sensor.glances.markdown | 109 +++++++++++++-------- 1 file changed, 68 insertions(+), 41 deletions(-) diff --git a/source/_components/sensor.glances.markdown b/source/_components/sensor.glances.markdown index f455945493e..6750e177b99 100644 --- a/source/_components/sensor.glances.markdown +++ b/source/_components/sensor.glances.markdown @@ -16,6 +16,8 @@ ha_release: 0.7.3 The `glances` sensor platform is consuming the system information provided by the [Glances](https://github.com/nicolargo/glances) API. This enables one to track remote host and display their stats in Home Assistant. +## {% linkable_title Setup %} + This sensors needs a running instance of `glances` on the host. The minimal supported version of `glances` is 2.3. To start a Glances RESTful API server on its default port 61208, the a test the following command can be used: @@ -35,6 +37,8 @@ $ curl -X GET http://IP_ADDRESS:61208/api/2/mem/free For details about auto-starting `glances`, please refer to [Start Glances through Systemd](https://github.com/nicolargo/glances/wiki/Start-Glances-through-Systemd). +## {% linkable_title Configuration %} + To enable the Glances sensor, add the following lines to your `configuration.yaml`: ```yaml @@ -44,48 +48,71 @@ sensor: host: IP_ADDRESS resources: - 'disk_use_percent' - - 'disk_use' - - 'disk_free' - - 'memory_use_percent' - - 'memory_use' - - 'memory_free' - - 'swap_use_percent' - - 'swap_use' - - 'swap_free' - - 'processor_load' - - 'process_running' - - 'process_total' - - 'process_thread' - - 'process_sleeping' - - 'cpu_temp' - - 'docker_active' - - 'docker_cpu_use' - - 'docker_memory_use' ``` -Configuration variables: - -- **host** (*Required*): The IP address of your host, eg. `192.168.1.32`. -- **port** (*Option*): The network port to connect to. Default is `61208`. -- **name** (*Optional*): Name of the Glances sensor. -- **resources** (*Required*): Entries to monitor. - - **disk_use_percent**: Used disk space in percent - - **disk_use**: Used disk space - - **disk_free**: Free disk space - - **memory_use_percent**: Used memory in percent - - **memory_use**: Used memory - - **memory_free**: Free memory - - **swap_use_percent**: Used swap space in percent - - **swap_use**: Used swap space - - **swap_free**: Free swap space - - **processor_load**: Load - - **process_running**: Number of running processes - - **process_total**: Total number of processes - - **process_thread**: Number of threads - - **process_sleeping**: Number of sleeping processes - - **cpu_temp**: CPU Temperature (may not available on all platforms) - - **docker_active**: Count of active Docker containers - - **docker_cpu_use**: Total CPU usage in percent of Docker containers - - **docker_memory_use**: Total memory used of Docker containers +{% configuration %} +host: + description: IP address of the host where Glances is running. + required: false + type: string + default: localhost +port: + description: The port where Glances is listening. + required: false + type: int + default: 61208 +name: + description: The prefix for the sensors. + required: false + type: string + default: Glances +version: + description: "The version of the Glances API. Supported version: `2` and `3`." + required: false + type: int + default: 2 +resources: + description: Entries to monitor. + required: false + type: map + default: disk_use + keys: + disk_use_percent: + description: The used disk space in percent. + disk_use: + description: The used disk space. + disk_free: + description: The free disk space. + memory_use_percent: + description: The used memory in percent. + memory_use: + description: The used memory. + memory_free: + description: The free memory. + swap_use_percent: + description: The used swap space in percent. + swap_use: + description: The used swap space. + swap_free: + description: The free swap space. + processor_load: + description: The load. + process_running: + description: The number of running processes. + process_total: + description: The total number of processes. + process_thread: + description: The number of threads. + process_sleeping: + description: The number of sleeping processes. + cpu_temp: + description: The CPU temperature (may not be available on all platforms). + docker_active: + description: The count of active Docker containers. + docker_cpu_use: + description: The total CPU usage in percent of Docker containers. + docker_memory_use: + description: The total memory used by Docker containers. +{% endconfiguration %} Not all platforms are able to provide all metrics. For instance `cpu_temp` is requires installing and configuring `lmsensors` in Ubuntu, and may not be available at all in other platforms. From 7e01072d210b6e9cc65df28e03ba31fe483b83f4 Mon Sep 17 00:00:00 2001 From: Jorim Tielemans Date: Fri, 17 Aug 2018 10:08:00 +0200 Subject: [PATCH 16/47] Fix DLNA entry (#6028) Correct variable is dlna_dmr --- source/_components/discovery.markdown | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/_components/discovery.markdown b/source/_components/discovery.markdown index f923c0ddb3f..1edebdc702b 100644 --- a/source/_components/discovery.markdown +++ b/source/_components/discovery.markdown @@ -11,7 +11,6 @@ logo: home-assistant.png ha_category: Other --- - Home Assistant can discover and automatically configure [zeroconf](https://en.wikipedia.org/wiki/Zero-configuration_networking)/[mDNS](https://en.wikipedia.org/wiki/Multicast_DNS) and [uPnP](https://en.wikipedia.org/wiki/Universal_Plug_and_Play) devices on your network. Currently the `discovery` component can detect: * [Apple TV](/components/apple_tv/) @@ -44,7 +43,8 @@ Home Assistant can discover and automatically configure [zeroconf](https://en.wi * [Yeelight Sunflower bulb](/components/light.yeelightsunflower/) * [Xiaomi Gateway (Aqara)](/components/xiaomi_aqara/) -It will be able to add Google Chromecasts and Belkin WeMo switches automatically, for Philips Hue it will require some configuration from the user. +It will be able to add Google Chromecasts and Belkin WeMo switches automatically, +for Philips Hue it will require some configuration from the user. To load this component, add the following lines to your `configuration.yaml`: @@ -64,11 +64,11 @@ discovery: ignore: description: A list of platforms that never will be automatically configured by `discovery`. required: false - type: string + type: list enable: description: A list of platforms not enabled by default that `discovery` should discover. required: false - type: string + type: list {% endconfiguration %} Valid values for ignore are: @@ -80,7 +80,6 @@ Valid values for ignore are: * `bose_soundtouch`: Bose Soundtouch speakers * `denonavr`: Denon network receivers * `directv`: DirecTV receivers - * `dlna`: DLNA DMR enabled devices * `frontier_silicon`: Frontier Silicon internet radios * `google_cast`: Google Cast * `harmony`: Logitech Harmony Hub @@ -105,6 +104,7 @@ Valid values for ignore are: Valid values for enable are: + * `dlna_dmr`: DLNA DMR enabled devices * `homekit`: HomeKit accessories ## {% linkable_title Troubleshooting %} From 1bdb25d1b236cfdacc7b6ac474c2e430b2221db2 Mon Sep 17 00:00:00 2001 From: Alexxander0 Date: Fri, 17 Aug 2018 11:52:30 +0200 Subject: [PATCH 17/47] Update bmw_connected_drive.markdown (#6024) * Update bmw_connected_drive.markdown * Update bmw_connected_drive.markdown * Update bmw_connected_drive.markdown --- source/_components/bmw_connected_drive.markdown | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/_components/bmw_connected_drive.markdown b/source/_components/bmw_connected_drive.markdown index 94f493ff242..30c60fa32b7 100644 --- a/source/_components/bmw_connected_drive.markdown +++ b/source/_components/bmw_connected_drive.markdown @@ -50,6 +50,11 @@ bmw_connected_drive: description: "The region of your Connected Drive account. Please use of these values: `north_america`, `china`, `rest_of_world`" required: true type: string + read_only: + description: In read only mode, all services including the lock of the vehicle are disabled. + required: false + type: boolean + default: false {% endconfiguration %} ## {% linkable_title Services %} From 13b20ac7d5c0a2ed2f3b1c446f9d9fb0be4c20fb Mon Sep 17 00:00:00 2001 From: Daniel Shokouhi Date: Sat, 18 Aug 2018 11:23:32 -0700 Subject: [PATCH 18/47] Update neato docs for new features (#6036) --- source/_components/vacuum.neato.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_components/vacuum.neato.markdown b/source/_components/vacuum.neato.markdown index d1d334bc3de..48a31aa24c9 100644 --- a/source/_components/vacuum.neato.markdown +++ b/source/_components/vacuum.neato.markdown @@ -21,8 +21,8 @@ To add `neato` vacuum to your installation, please follow instructions in [Neato Currently supported features are: -- `turn_on` +- `start` - `pause` - `stop` - `return_to_home` -- `turn_off` (stop all activity and return to dock) +- `locate` From 4bd702e65af11abd916ef6b75c51bc85bd96ea4d Mon Sep 17 00:00:00 2001 From: Oleksii Serdiuk Date: Mon, 20 Aug 2018 14:22:47 +0200 Subject: [PATCH 19/47] openuv: Add documentation for Current UV Level (#6041) --- source/_components/openuv.markdown | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/source/_components/openuv.markdown b/source/_components/openuv.markdown index e157ee396dc..69e22a94e60 100644 --- a/source/_components/openuv.markdown +++ b/source/_components/openuv.markdown @@ -80,7 +80,7 @@ sensors: description: the conditions to create sensors from required: false type: list - default: all ( `current_ozone_index`, `current_uv_index`, `max_uv_index`, `safe_exposure_time_type_1`, `safe_exposure_time_type_2`, `safe_exposure_time_type_3`, `safe_exposure_time_type_4`, `safe_exposure_time_type_5`, `safe_exposure_time_type_6` ) + default: all ( `current_ozone_index`, `current_uv_index`, `current_uv_level`, `max_uv_index`, `safe_exposure_time_type_1`, `safe_exposure_time_type_2`, `safe_exposure_time_type_3`, `safe_exposure_time_type_4`, `safe_exposure_time_type_5`, `safe_exposure_time_type_6` ) {% endconfiguration %} ## {% linkable_title Binary Sensor Types %} @@ -100,6 +100,11 @@ This sensor displays the current ozone level in du (Dobson Units). This sensor displays the current UV index. +### {% linkable_title `current_uv_level` %} + +This sensor displays the level of current UV index, which is calculated based +on [UV Index Levels & Colors](https://www.openuv.io/kb/uv-index-levels-colors). + ### {% linkable_title `max_uv_index` %} This sensor displays the maximum UV index that will be encountered that day (at From 03e53ea64b91aab5400c64d9461d4465e2e73466 Mon Sep 17 00:00:00 2001 From: Greg Laabs Date: Mon, 20 Aug 2018 08:43:01 -0700 Subject: [PATCH 20/47] Add documentation for the new Ecovacs (Deebot) component and vacuum (#5922) * Add documentation for the new Ecovacs (Deebot) component and vacuum * Copy paste error fix * Typo fix and template improvements From PR review --- source/_components/ecovacs.markdown | 69 +++++++++++++++++++++ source/_components/vacuum.ecovacs.markdown | 69 +++++++++++++++++++++ source/images/supported_brands/ecovacs.png | Bin 0 -> 4449 bytes 3 files changed, 138 insertions(+) create mode 100644 source/_components/ecovacs.markdown create mode 100644 source/_components/vacuum.ecovacs.markdown create mode 100644 source/images/supported_brands/ecovacs.png diff --git a/source/_components/ecovacs.markdown b/source/_components/ecovacs.markdown new file mode 100644 index 00000000000..9470860e6c0 --- /dev/null +++ b/source/_components/ecovacs.markdown @@ -0,0 +1,69 @@ +--- +layout: page +title: "Ecovacs" +description: "Instructions on how to integrate Ecovacs vacuums within Home Assistant." +date: 2018-07-29 09:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: ecovacs.png +ha_category: Hub +ha_iot_class: "Cloud Push" +ha_release: 0.75 +--- + +The `ecovacs` component is the main component to integrate all [Ecovacs](https://www.ecovacs.com) (Deebot) vacuums. You will need your Ecovacs account information (username, password) to discover and control vacuums in your account. + +Please see the [Ecovacs Vacuum](/components/vacuum.ecovacs/) documentation for more information about using the vacuum entity. + +## {% linkable_title Configuration %} + +To add your Ecovacs devices into your Home Assistant installation, add the following to your `configuration.yaml` file: + +```yaml +ecovacs: + username: YOUR_ECOVACS_USERNAME + password: YOUR_ECOVACS_PASSWORD + country: YOUR_TWO_LETTER_COUNTRY_CODE + continent: YOUR_TWO_LETTER_CONTINENT_CODE +``` + +{% configuration %} +username: + description: Your username to login to your Ecovacs account. + required: true + type: string +password: + description: Your password to login to your Ecovacs account. + required: true + type: string +country: + description: Your two-letter country code (us, uk, etc). + required: true + type: string +continent: + description: Your two-letter continent code (na, eu, etc). + required: true + type: string +{% endconfiguration %} + +Note: For some countries, you will need to set `continent` to `ww` (meaning worldwide.) There is unfortunately no way to know the correct settings other than guessing and checking. See the [sucks library protocol documentation](https://github.com/wpietri/sucks/blob/master/protocol.md) for more information about what has been figured out about the Ecovacs servers. + +### {% linkable_title Stability and Reporting Bugs %} + +The library that talks to the Ecovacs servers is in a very early state and still under development. As such, it is likely that not all regions and devices will work at the current time. + +Please see the [sucks library documentation](https://github.com/wpietri/sucks) for some more information about what has been tested, and check out the GitHub issues to see if the issue you're having is known or being worked on. + +If you have an issue with the Ecovacs component, please file a [GitHub Issue](https://github.com/home-assistant/home-assistant/issues) and include your Home Assistant logs in the report. To get full debug output from both the Ecovacs component and the underlying `sucks` library, place this in your `configuration.yaml` file: + +```yaml +logger: + logs: + homeassistant.components.ecovacs: debug + homeassistant.components.vacuum.ecovacs: debug + sucks: debug +``` + +Warning: doing this will cause your authentication token to visible in your log files. Be sure to remove any tokens and other authentication details from your log before posting them in an issue. \ No newline at end of file diff --git a/source/_components/vacuum.ecovacs.markdown b/source/_components/vacuum.ecovacs.markdown new file mode 100644 index 00000000000..723a30e17ea --- /dev/null +++ b/source/_components/vacuum.ecovacs.markdown @@ -0,0 +1,69 @@ +--- +layout: page +title: "Ecovacs Deebot Vacuum" +description: "Instructions on how to setup Ecovacs Deebot vacuums within Home Assistant." +date: 2018-07-27 09:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: ecovacs.png +ha_category: Vacuum +ha_iot_class: "Cloud Push" +ha_release: 0.75 +--- + +The `ecovacs` vacuum platform allows you to monitor and control your Ecovacs Deebot vacuums. + +You have first to setup the [Ecovacs component](/components/ecovacs/) + +### {% linkable_title Component Lifespans %} + +The remaining lifespan of components on your Deebot vacuum will be reported as attributes on the vacuum entity. The value will be a whole number representing the percentage of life remaining. + +Here's an example of how to extract the filter's lifespan to its own sensor using a [template sensor](/components/sensor.template/): + +{% raw %} +```yaml +# Example configuration.yaml entry +sensor: + - platform: template + sensors: + vacuum_filter: + friendly_name: "Vacuum Filter Remaining Lifespan" + unit_of_measurement: '%' + value_template: "{{ state_attr('vacuum.my_vacuum_id', 'component_filter') }}" +``` +{% endraw %} + +Or, if you want a simple binary sensor that becomes `On` when the filter needs to be replaced (5% or less): + +{% raw %} +```yaml +# Example configuration.yaml entry +binary_sensor: + - platform: template + sensors: + vacuum_filter_replace: + friendly_name: "Vacuum Filter" + device_class: problem + value_template: "{{ state_attr('vacuum.my_vacuum_id', 'component_filter') <= 5 }}" +``` +{% endraw %} + +### {% linkable_title Handling Errors %} + +The vacuum entity has an `error` attribute that will contain the _most recent_ error message that came from the vacuum. There is not a comprehensive list of all error messages, so you may need to do some experimentation to determine the error messages that your vacuum can send. + +If the vacuum fires a "no error" event, the `error` attribute will change back to `None`. Note, however, that this does not happen for all types of errors. + +Alternatively, you can use the `ecovacs_error` event to watch for errors. This event will contain a data payload that looks like: + +```json +{ + "entity_id": "vacuum.deebot_m80", + "error": "an_error_name" +} +``` + +Finally, if a vacuum becomes unavailable (usually due to being idle and off its charger long enough for it to completely power off,) the vacuum's `status` attribute will change to `offline` until it is turned back on. \ No newline at end of file diff --git a/source/images/supported_brands/ecovacs.png b/source/images/supported_brands/ecovacs.png new file mode 100644 index 0000000000000000000000000000000000000000..83aa4be9dd80481cdee9d4cf60473fb3bbc49460 GIT binary patch literal 4449 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 R8`pk<;CJn@ud($z`Y*;ahbI64 literal 0 HcmV?d00001 From bcd7772053dfa5539cb08dcb361502e9a2b09c9a Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 20 Aug 2018 17:43:49 +0200 Subject: [PATCH 21/47] Update ecovacs.markdown --- source/_components/ecovacs.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_components/ecovacs.markdown b/source/_components/ecovacs.markdown index 9470860e6c0..1f5157073e1 100644 --- a/source/_components/ecovacs.markdown +++ b/source/_components/ecovacs.markdown @@ -10,7 +10,7 @@ footer: true logo: ecovacs.png ha_category: Hub ha_iot_class: "Cloud Push" -ha_release: 0.75 +ha_release: 0.77 --- The `ecovacs` component is the main component to integrate all [Ecovacs](https://www.ecovacs.com) (Deebot) vacuums. You will need your Ecovacs account information (username, password) to discover and control vacuums in your account. @@ -66,4 +66,4 @@ logger: sucks: debug ``` -Warning: doing this will cause your authentication token to visible in your log files. Be sure to remove any tokens and other authentication details from your log before posting them in an issue. \ No newline at end of file +Warning: doing this will cause your authentication token to visible in your log files. Be sure to remove any tokens and other authentication details from your log before posting them in an issue. From f3e0efcf79fac42657b59b4e15e560f908369f2e Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 20 Aug 2018 17:44:00 +0200 Subject: [PATCH 22/47] Update vacuum.ecovacs.markdown --- source/_components/vacuum.ecovacs.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_components/vacuum.ecovacs.markdown b/source/_components/vacuum.ecovacs.markdown index 723a30e17ea..144bc7afcd7 100644 --- a/source/_components/vacuum.ecovacs.markdown +++ b/source/_components/vacuum.ecovacs.markdown @@ -10,7 +10,7 @@ footer: true logo: ecovacs.png ha_category: Vacuum ha_iot_class: "Cloud Push" -ha_release: 0.75 +ha_release: 0.77 --- The `ecovacs` vacuum platform allows you to monitor and control your Ecovacs Deebot vacuums. @@ -66,4 +66,4 @@ Alternatively, you can use the `ecovacs_error` event to watch for errors. This e } ``` -Finally, if a vacuum becomes unavailable (usually due to being idle and off its charger long enough for it to completely power off,) the vacuum's `status` attribute will change to `offline` until it is turned back on. \ No newline at end of file +Finally, if a vacuum becomes unavailable (usually due to being idle and off its charger long enough for it to completely power off,) the vacuum's `status` attribute will change to `offline` until it is turned back on. From 0817f273baf39d1fd288e9b87edd0b380e9d71dd Mon Sep 17 00:00:00 2001 From: Tom Harris Date: Wed, 22 Aug 2018 03:11:46 -0400 Subject: [PATCH 23/47] Insteon merge (#6057) * Add X10 support * insteon_plm binary_sensor on event * revert * Add binary_sensor_on event information * Describe events for Mini-Remotes * Remove blank line * Update for Hub connections * Merge insteon_plm and insteon_local into insteon * Revert GEM changes * Revert Gem changes --- .../binary_sensor.insteon.markdown | 21 ++ .../binary_sensor.insteon_plm.markdown | 21 -- source/_components/fan.insteon.markdown | 24 ++ source/_components/fan.insteon_local.markdown | 18 -- source/_components/fan.insteon_plm.markdown | 16 - source/_components/insteon.markdown | 288 ++++++++++++++++++ source/_components/insteon_local.markdown | 50 +-- source/_components/insteon_plm.markdown | 205 +------------ source/_components/light.insteon.markdown | 21 ++ .../_components/light.insteon_local.markdown | 19 -- source/_components/light.insteon_plm.markdown | 16 - source/_components/sensor.insteon.markdown | 21 ++ .../_components/sensor.insteon_plm.markdown | 16 - source/_components/switch.insteon.markdown | 21 ++ .../_components/switch.insteon_local.markdown | 17 -- .../_components/switch.insteon_plm.markdown | 16 - 16 files changed, 402 insertions(+), 388 deletions(-) create mode 100644 source/_components/binary_sensor.insteon.markdown delete mode 100644 source/_components/binary_sensor.insteon_plm.markdown create mode 100644 source/_components/fan.insteon.markdown delete mode 100644 source/_components/fan.insteon_local.markdown delete mode 100644 source/_components/fan.insteon_plm.markdown create mode 100644 source/_components/insteon.markdown create mode 100644 source/_components/light.insteon.markdown delete mode 100644 source/_components/light.insteon_local.markdown delete mode 100644 source/_components/light.insteon_plm.markdown create mode 100644 source/_components/sensor.insteon.markdown delete mode 100644 source/_components/sensor.insteon_plm.markdown create mode 100644 source/_components/switch.insteon.markdown delete mode 100644 source/_components/switch.insteon_local.markdown delete mode 100644 source/_components/switch.insteon_plm.markdown diff --git a/source/_components/binary_sensor.insteon.markdown b/source/_components/binary_sensor.insteon.markdown new file mode 100644 index 00000000000..67a7b6a4f85 --- /dev/null +++ b/source/_components/binary_sensor.insteon.markdown @@ -0,0 +1,21 @@ +--- +layout: page +title: "Insteon Binary Sensor" +description: "Instructions on how to setup the Insteon binary sensors locally within Home Assistant." +date: 2018-08-20 16:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: insteon.png +ha_category: Binary Sensor +ha_iot_class: "Local Push" +ha_version: 0.77 +--- + +The `insteon` binary sensor platform lets you control your sensors through +an INSTEON Modem (PLM and Hub) device connected directly to your system on a +USB, serial port or TCPIP connection. To add support, set up the primary +[insteon] component. + +[insteon]: /components/insteon/ \ No newline at end of file diff --git a/source/_components/binary_sensor.insteon_plm.markdown b/source/_components/binary_sensor.insteon_plm.markdown deleted file mode 100644 index 0ee0aaf0375..00000000000 --- a/source/_components/binary_sensor.insteon_plm.markdown +++ /dev/null @@ -1,21 +0,0 @@ ---- -layout: page -title: "Insteon PLM Binary Sensor" -description: "Instructions on how to setup the Insteon PLM binary sensors locally within Home Assistant." -date: 2017-02-19 17:00 -sidebar: true -comments: false -sharing: true -footer: true -logo: insteon.png -ha_category: Binary Sensor -ha_iot_class: "Local Push" -ha_release: 0.39 ---- - -The `insteon_plm` binary sensor platform lets you control your sensors through -an INSTEON PowerLinc Modem (PLM) device connected directly to your system on a -USB or serial port. To add support, set up the primary [insteon_plm] -component. - -[insteon_plm]: /components/insteon_plm/ diff --git a/source/_components/fan.insteon.markdown b/source/_components/fan.insteon.markdown new file mode 100644 index 00000000000..0e17deda50e --- /dev/null +++ b/source/_components/fan.insteon.markdown @@ -0,0 +1,24 @@ +--- +layout: page +title: "Insteon Fan" +description: "Instructions on how to setup the Insteon fan locally within Home Assistant." +date: 2018-08-20 16:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: insteon.png +ha_category: Fan +ha_iot_class: "Local Push" +ha_version: 0.77 +--- + +The `insteon` fan platform lets you control your [FanLinc] through +an INSTEON Modem (PLM and Hub) device connected directly to your system on a +USB, serial port or TCPIP connection. To add support, set up the primary +[insteon] component. + +[insteon]: /components/insteon/ +[FanLinc]: https://www.smarthome.com/fanlinc-insteon-2475f-ceiling-fan-and-light-controller-fixture-module-dual-band.html + + diff --git a/source/_components/fan.insteon_local.markdown b/source/_components/fan.insteon_local.markdown deleted file mode 100644 index 69a2249ff9a..00000000000 --- a/source/_components/fan.insteon_local.markdown +++ /dev/null @@ -1,18 +0,0 @@ ---- -layout: page -title: "Insteon (local) Fan" -description: "Instructions on how to setup the Insteon Hub Fans locally within Home Assistant." -date: 2017-04-06 11:00 -sidebar: true -comments: false -sharing: true -footer: true -logo: insteon.png -ha_category: Fan -ha_release: 0.48 -redirect_from: /components/fan.insteon_hub/ ---- - -The `insteon_local` fan component lets you control your fans connected to an [Insteon Hub](http://www.insteon.com/insteon-hub/) with Home Assistant. - -To get your Insteon fans working with Home Assistant, follow the instructions for the general [Insteon local component](/components/insteon_local/). The fans will be automatically discovered and added to Home Assistant. The device names will be the Insteon address of the fans. diff --git a/source/_components/fan.insteon_plm.markdown b/source/_components/fan.insteon_plm.markdown deleted file mode 100644 index 0c4478778e3..00000000000 --- a/source/_components/fan.insteon_plm.markdown +++ /dev/null @@ -1,16 +0,0 @@ ---- -layout: page -title: "Insteon PLM Fan" -description: "Instructions on how to setup the Insteon PLM Fans locally within Home Assistant." -date: 2017-02-19 17:00 -sidebar: true -comments: false -sharing: true -footer: true -logo: insteon.png -ha_category: Fan -ha_iot_class: "Local Push" -ha_release: 0.65 ---- - -The `insteon_plm` fan platform lets you control your [FanLinc](https://www.smarthome.com/fanlinc-insteon-2475f-ceiling-fan-and-light-controller-fixture-module-dual-band.html) through an INSTEON PowerLinc Modem (PLM) device connected directly to your system on a USB or serial port. To add support, set up the primary [insteon_plm](/components/insteon_plm/) component. diff --git a/source/_components/insteon.markdown b/source/_components/insteon.markdown new file mode 100644 index 00000000000..e2518a09784 --- /dev/null +++ b/source/_components/insteon.markdown @@ -0,0 +1,288 @@ +--- +layout: page +title: "Insteon" +description: "Instructions on how to setup an Insteon Modem (PLM or Hub) locally within Home Assistant." +date: 2018-08-20 16:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: insteon.png +ha_category: Hub +ha_iot_class: "Local Push" +ha_version: 0.77 +--- + +This component adds "local push" support for INSTEON Modems allowing +linked INSTEON devices to be used within Home Assistant as binary sensors, +lights, fans, sensors and switches. Device support is provided by the +underlying [insteonplm] package. It is known to work with the [2413U] USB and +[2412S] RS242 flavors of PLM and the [2448A7] USB stick. It has also been +tested to work with the [2245] Hub. + +[insteonplm]: https://github.com/nugget/python-insteonplm +[2413U]: https://www.insteon.com/powerlinc-modem-usb +[2412S]: https://www.insteon.com/powerlinc-modem-serial +[2448A7]: https://www.smarthome.com/insteon-2448a7-portable-usb-adapter.html +[2245]: https://www.insteon.com/insteon-hub/ + + +### {% linkable_title INSTEON Modem configuration %} + +To setup a Powerline Modem (PLM) device such as the [2413U], use the following +configuration: + +```yaml +# PLM configuration variables +insteon: + port: SERIAL_PORT +``` + +To setup an INSTEON Hub such as the [2245], use the following configuration: + +```yaml +# Hub configuration variables +insteon: + host: HOST + ip_port: IP_PORT + username: USERNAME + password: PASSWORD +``` + +Addtional configuration items are available: + +```yaml +insteon: + + device_override: + - address: ADDRESS + cat: CATEGORY + subcat: SUBCATEGORY + firmware: FIRMWARE + product_key: PRODUCT_KEY + x10_devices: + - housecode: HOUSECODE + unitcode: UNITCODE + platform: PLATFORM + steps: STEPS + x10_all_units_off: HOUSECODE + x10_all_lights_on: HOUSECODE + x10_all_lights_off: HOUSECODE +``` +Configuration variables: +- **port** (*Required for PLM setup*): The serial or USB port for your device, + e.g., `/dev/ttyUSB0` +- **host** (*Required for Hub setup*): The host name or IP address of the Hub +- **ip_port** (*Optional for Hub setup*): The IP port number of the Hub. + (default value is 25105) +- **username** (*Required for Hub setup*): The username to login to the local + Hub +- **password** (*Required for Hub setup*): The password to login to the local + Hub +- **device_override** (*Optional*): Override the default device definition + - *ADDRESS* is found on the device itself in the form 1A.2B.3C or 1a2b3c + - *CATEGORY* is found in the back of the device's User Guide in the form of + 0x00 - 0xff + - *SUBCATEGORY* is found in the back of the device's User Guide in the form + of 0x00 - 0xff + - *FIRMWARE* and *PRODUCT_KEY* are more advanced options and will typically + not be used. +- **x10_devices** (*Optional*): Define X10 devices to control or respond to + - *HOUSECODE* is the X10 housecode values a - p + - *UNITCODE* is the X10 unit code values 1 - 16 + - *PLATFORM* is the Home Assistant Platform to associate the device with. + The following platforms are supported + - binary_sensor: Used for on/off devices or keypad buttons that are read only. + - light: Used for dimmable X10 devices + - switch: Used for On/Off X10 devices + - *STEPS* is the number of dim/bright steps the device supports. Used for + dimmable X10 devices only. Default value is 22. +- **x10_all_units_off** (*Optional*): Creates an binary_sensor that responds + to the X10 standard command for All Units Off. +- **x10_all_lights_on** (*Optional*): Creates an binary_sensor that responds + to the X10 standard command for All Lights On +- **x10_all_lights_off** (*Optional*): Creates an binary_sensor that responds + to the X10 standard command for All Lights Off + +### {% linkable_title Autodiscovery %} + +The first time autodiscovery runs, the duration may require up to 20 seconds +per device. Subsequent startups will occur much quicker using cached device +information. If a device is not recognized during autodiscovery, you can add +the device to the **device_override** configuration. + +In order for a device to be discovered it must be linked to the INSTEON Modem +as either a responder or a controller. + +### {% linkable_title Linking Devices to the INSTEON Modem %} + +In order for any two Insteon devices to talk with one another, they must be +linked. For an overview of device linking please read the Insteon page on +[understanding linking]. The Insteon Modem module supports All-Linking through +[Development Tools] service calls. The following services are available: + +- **insteon.add_all_link**: Puts the Insteon Modem (IM) into All-Linking +mode. The IM can be set as as controller or a responder. If the IM is a +controler, put the IM into linking mode then press the SET button on the +device. If the IM is a responer, press the SET button on the device then +put the IM into linking mode. +- **insteon.delete_all_link**: Tells the Insteon Modem (IM) to remove an +All-Link record from the All-Link Database of the IM and a device. Once the IM +is set to delete the link, press the SET button on the corresponding device +to complete the process. +- **insteon.load_all_link_database**: Load the All-Link Database for a +device. WARNING - Loading a device All-Link database may take a LONG time and +may need to be repeated to obtain all records. +- **insteon.print_all_link_database**: Print the All-Link Database for a +device. Requires that the All-Link Database is loaded first. +- **insteon.print_im_all_link_database**: Print the All-Link Database for +the INSTEON Modem (IM). + +If you are looking for more advanced options, you can use the +[insteonplm_interactive] command line tool that is distributed with the +[insteonplm] Python module. Please see the documentation on the [insteonplm] +GitHub site. Alternatively, you can download [HouseLinc] which runs on any +Windows PC, or you can use [Insteon Terminal] which is open source and runs +on most platforms. SmartHome no longer supports HouseLinc, but it still +works. Insteon Terminal is a very useful tool but please read the disclaimers +carefully, they are important. + +[understanding linking]: http://www.insteon.com/support-knowledgebase/2015/1/28/understanding-linking +[Development Tools]: https://www.home-assistant.io/docs/tools/dev-tools/ +[HouseLinc]: https://www.smarthome.com/houselinc.html +[Insteon Terminal]: https://github.com/pfrommerd/insteon-terminal +[insteonplm_interactive]: https://github.com/nugget/python-insteonplm#command-line-interface + +### {% linkable_title Customization %} + +The only configuration item that is necessary is the PLM port or Hub IP +address, username and password so that Home Assistant can connect to the +INSTEON Modem. This will expose all the supported INSTEON devices which exist +in the modem’s ALL-Link database. However, devices will only be shown by their +INSTEON hex address (e.g., “1A.2B.3C”) which can be a bit unwieldy. As you link +and unlink devices using the ‘Set’ buttons, they’ll be added and removed from +Home Assistant automatically. + +You can use the normal Home Assistant [device customization] section of your +configuration to assign friendly names and special icons to your devices. This +is especially useful for setting device_class on your binary_sensor INSTEON +devices. + +[device customization]: /getting-started/customizing-devices/ + +### {% linkable_title Device Overrides %} + +INSTEON devices are added to Home Assistant using the platform(s) that make the +most sense given the model and features of the hardware. The features of the +INSTEON device are built into the Home Assistant platform. Changing the +platform is not recommended. There are two primary uses for the +**device_override** feature. +- Devices that do not respond during autodiscovery. This is common for battery + operated devices. +- Devices that have not been fully developed. This allows an unknown device to + be mapped to a device that operates similarly to another device. + +### {% linkable_title Example Configuration with Options%} + +```yaml +# Full example of insteon configuration with customizations and overrides + +homeassistant: + customize: + light.a1b2c3: + friendly_name: Bedside Lamp + binary_sensor.a2b3c4: + friendly_name: Garage Door + device_class: opening + +insteon: + port: /dev/ttyUSB0 + device_override: + - address: a1b2c3 # Hidden Door Sensor [2845-222] + cat: 0x10 + subcat: 0x11 +``` + +### {% linkable_title What NOT to do %} + +Insteon Modem is a top level component and device discovery will identify +the Home Assistant platform the device belongs in. As such, do not +declare Insteon devices in other platforms. For example, this configuration +will NOT work: + +```yaml +light: + - platform: insteon + address: 1a2b3c +``` + +### {% linkable_title Events and Mini-Remotes %} + +Mini-Remote devices do not appear as Home Assistant entities. They generate +events. The following events are available: + +- **insteon.button_on** + - **address**: (required) The Insteon device address in lower case without + dots (e.g. 1a2b3c) + - **button**: (Optional) The button id in lower case. For an 4 button remote + the values are a to d. For an 8 button remote the values are a to g. For + a one button remote this field is not used. +- **insteon.button_of** + - **address**: (required) The Insteon device address in lower case without + dots (e.g. 1a2b3c) + - **button**: (Optional) The button id in lower case. For an 4 button remote + the values are a to d. For an 8 button remote the values are a to g. For + a one button remote this field is not used. + +This allows the mini-remotes to be configured as + +Here is an example of how to use these events for automations: + +``` +automation: + # 4 or 8 button remote with button c pressed + trigger: + platform: event + event_type: insteon.button_on + event_data: + address: 1a2b3c + button: c + condition: + - condition: state + entity_id: light.some_light + state: 'off' + action: + service: light.turn_on + entity_id: light.some_light + + # single button remote + trigger: + platform: event + event_type: insteon.button_on + event_data: + address: 1a2b3c + condition: + - condition: state + entity_id: light.some_light + state: 'off' + action: + service: light.turn_on + entity_id: light.some_light +``` + +### {% linkable_title Known Issues with the INSTEON Hub %} + +The INSTEON Hub has three known issues that are inherent to the design of the +Hub: + +1. If you see multiple error messages in the log file stating the Hub +connection is closed and reconnection has failed, this generally requires +the Hub to be restarted in order to reconnect. + +2. You cannot use both Home Assistant and the INSTEON app. If you do, the +changes made in the app will not appear in Home Assistant. Changes made in +Home Assistant will appear in the app after a period of time, however. + +3. The Hub response times can be very slow. This is due to the Hub polling +devices frequently. Since only one INSTEON message can be broadcast at a time, +messages to and from Home Assistant can be delayed. diff --git a/source/_components/insteon_local.markdown b/source/_components/insteon_local.markdown index b4b534aabd9..513e640778c 100644 --- a/source/_components/insteon_local.markdown +++ b/source/_components/insteon_local.markdown @@ -10,53 +10,9 @@ footer: true logo: insteon.png ha_category: Hub ha_iot_class: "Local Polling" -ha_release: 0.36 -redirect_from: /components/insteon_hub/ +ha_version: 0.36 --- -The `insteon_local` component let you use your [Insteon Hub](http://www.insteon.com/insteon-hub/) with Home Assistant. +The `insteon_local` component is depreciated and has been replaced by the [Insteon] component. -## {% linkable_title Configuration %} - -To integrate your Insteon Hub (local setup) with Home Assistant, add the following to your `configuration.yaml` file: - -```yaml -# Example configuration.yaml platform entry -insteon_local: - host: YOUR_HUB_IP - username: YOUR_HUB_USERNAME - password: YOUR_HUB_PASSWORD -``` - -{% configuration %} -host: - description: The IP address of your hub. - required: true - type: string -username: - description: The username used to access the Insteon interface (find in your Insteon app). - required: true - type: string -password: - description: The password used to access the Insteon interface. - required: true - type: string -timeout: - description: Timeout to wait for connections. - required: false - type: time - default: 10 seconds -port: - description: The port your hub is configured to listen to. - required: false - type: string - default: 25105 -{% endconfiguration %} - -*Note: The username and password here are for the hub and are different than the ones used to access the app. You can usually find these on the bottom of your hub (unless you've changed them through the settings in the app)* - -The `insteon_local` component currently supports lights (dimmers), switches and fans. - -

-This component replaces the old `insteon_hub` component, which has been removed due to a complaint by Insteon. -

+[Insteon] /component/insteon diff --git a/source/_components/insteon_plm.markdown b/source/_components/insteon_plm.markdown index 52f7b93530c..b438d90e4fd 100644 --- a/source/_components/insteon_plm.markdown +++ b/source/_components/insteon_plm.markdown @@ -10,209 +10,10 @@ footer: true logo: insteon.png ha_category: Hub ha_iot_class: "Local Push" -ha_release: 0.39 +ha_version: 0.39 --- -This component adds "local push" support for INSTEON PowerLinc Modems allowing linked INSTEON devices to be used within Home Assistant as lights, switches, and binary sensors. Device support is provided by the underlying [insteonplm] package. It is known to work with the [2413U] USB and [2412S] RS242 flavors of PLM and the [2448A7] USB stick. This component does not work with the IP-based hub products. For that, you'll want the [Insteon local component](/components/insteon_local/) instead. +The `insteon_plm` component is depreciated and has been replaced by the [Insteon] component. -[insteonplm]: https://github.com/nugget/python-insteonplm -[2413U]: https://www.insteon.com/powerlinc-modem-usb -[2412S]: https://www.insteon.com/powerlinc-modem-serial -[2448A7]: https://www.smarthome.com/insteon-2448a7-portable-usb-adapter.html +[Insteon] /component/insteon -## {% linkable_title Configuration %} - -```yaml -# insteon_plm supported configuration variables -insteon_plm: - port: SERIAL_PORT - device_override: - - address: ADDRESS - cat: CATEGORY - subcat: SUBCATEGORY - firmware: FIRMWARE - product_key: PRODUCT_KEY - x10_devices: - - housecode: HOUSECODE - unitcode: UNITCODE - platform: PLATFORM - steps: STEPS - x10_all_units_off: HOUSECODE - x10_all_lights_on: HOUSECODE - x10_all_lights_off: HOUSECODE -``` - -{% configuration %} -port: - description: The port for your device, e.g., `/dev/ttyUSB0` - required: true - type: string -device_override: - description: Override the default device definition - required: false - type: list - keys: - ADDRESS: - description: is found on the device itself in the form 1A.2B.3C or 1a2b3c - CATEGORY: - description: is found in the back of the device's User Guide in the form of 0x00 - 0xff - SUBCATEGORY: - description: is found in the back of the device's User Guide in the form of 0x00 - 0xff - FIRMWARE: - description: is a more advanced option and will typically not be used. - PRODUCT_KEY: - description: is a more advanced option and will typically not be used. -x10_devices: - description: Define X10 devices to control or respond to - required: false - type: list - keys: - HOUSECODE: - description: is the X10 housecode values a - p - UNITCODE: - description: is the X10 unit code values 1 - 16 - PLATFORM: - description: is the Home Assistant Platform to associate the device with. Choose one of the following supported platforms. - type: string - keys: - binary_sensor: - description: Used for on/off devices or keypad buttons that are read only. - light: - description: Used for dimmable X10 devices - switch: - description: Used for On/Off X10 devices - STEPS: - description: is the number of dim/bright steps the device supports. Used for dimmable X10 devices only. - default: 22 -x10_all_units_off: - description: Creates an binary_sensor that responds to the X10 standard command for All Units Off. - required: false -x10_all_lights_on: - description: Creates an binary_sensor that responds to the X10 standard command for All Lights On - required: false -x10_all_lights_off: - description: Creates an binary_sensor that responds to the X10 standard command for All Lights Off - required: false -{% endconfiguration %} - -### {% linkable_title Autodiscovery %} - -The first time autodiscovery runs, the duration may require up to 20 seconds per device. Subsequent startups will occur much quicker using cached device information. If a device is not recognized during autodiscovery, you can add the device to the **device_override** configuration. - -In order for a device to be discovered it must be linked to the PLM as either a responder or a controller. - -### {% linkable_title Linking Devices to the PLM %} - -In order for any two Insteon devices to talk with one another, they must be linked. For an overview of device linking, please read the Insteon page on [understanding linking]. The Insteon PLM module supports All-Linking through [Development Tools] service calls. The following services are available: - -- **insteon_plm.add_all_link**: Tells the Insteon Modem (IM) start All-Linking mode. Once the IM is in All-Linking mode, press the link button on the device to complete All-Linking. -- **insteon_plm.delete_all_link**: Tells the Insteon Modem (IM) to remove an All-Link record from the All-Link Database of the IM and a device. Once the IM is set to delete the link, press the link button on the corresponding device to complete the process. -- **insteon_plm.load_all_link_database**: Load the All-Link Database for a device. WARNING - Loading a device All-Link database is very time consuming and inconsistent. This may take a LONG time and may need to be repeated to obtain all records. -- **insteon_plm.print_all_link_database**: Print the All-Link Database for a device. Requires that the All-Link Database is loaded into memory. -- **insteon_plm.print_im_all_link_database**: Print the All-Link Database for the INSTEON Modem (IM). - -If you are looking for more advanced options, you can use the [insteonplm_interactive] command line tool that is distributed with the -[insteonplm] Python module. Please see the documentation on the [insteonplm] GitHub site. Alternatively, you can download [HouseLinc] which runs on any Windows PC, or you can use [Insteon Terminal] which is open source and runs on most platforms. SmartHome no longer supports HouseLinc, but it still works. Insteon Terminal is a very useful tool but please read the disclaimers carefully, they are important. - -[understanding linking]: http://www.insteon.com/support-knowledgebase/2015/1/28/understanding-linking -[Development Tools]: https://www.home-assistant.io/docs/tools/dev-tools/ -[HouseLinc]: https://www.smarthome.com/houselinc.html -[Insteon Terminal]: https://github.com/pfrommerd/insteon-terminal -[insteonplm_interactive]: https://github.com/nugget/python-insteonplm#command-line-interface - -### {% linkable_title Customization %} - -The only configuration item that is absolutely necessary is the port so that Home Assistant can connect to the PLM. This will expose all the supported INSTEON devices which exist in the modem’s ALL-Link database. However, devices will only be shown by their INSTEON hex address (e.g., “1A.2B.3C”) which can be a bit unwieldy. As you link and unlink devices using the ‘Set’ buttons, they’ll be added and removed from Home Assistant automatically. - -You can use the normal Home Assistant [device customization](/getting-started/customizing-devices/) section of your configuration to assign friendly names and special icons to your devices. This is especially useful for setting device_class on your binary_sensor INSTEON devices. - -### {% linkable_title Device Overrides %} - -INSTEON devices are added to Home Assistant using the platform(s) that make the most sense given the model and features of the hardware. The features of the INSTEON device are built into the Home Assistant platform. Changing the platform is not recommended. There are two primary uses for the **device_override** feature. -- Devices that do not respond during autodiscovery. This is common for battery operated devices. -- Devices that have not been fully developed. This allows an unknown device to be mapped to a device that operates similarly to another device. - -### {% linkable_title Example Configuration with Options%} - -```yaml -# Full example of insteon_plm configuration with customizations and overrides - -homeassistant: - customize: - light.a1b2c3: - friendly_name: Bedside Lamp - binary_sensor.a2b3c4: - friendly_name: Garage Door - device_class: opening - -insteon_plm: - port: /dev/ttyUSB0 - device_override: - - address: a1b2c3 # Hidden Door Sensor [2845-222] - cat: 0x10 - subcat: 0x11 -``` - -### {% linkable_title What NOT to do %} - -Insteon PLM is a top level component and device discovery will identify the Home Assistant platform the device belongs in. As such, do not declare Insteon devices in other platforms. For example, this configuration will NOT work: - -```yaml -light: - - platform: insteon_plm - address: 1a2b3c -``` - -### {% linkable_title Events and Mini-Remotes %} - -Mini-Remote devices do not appear as Home Assistant entities. They generate -events. The following events are available: - -- **insteon_plm.button_on** - - **address**: (required) The Insteon device address in lower case without - dots (e.g. 1a2b3c) - - **button**: (Optional) The button id in lower case. For an 4 button remote - the values are a to d. For an 8 button remote the values are a to g. For - a one button remote this field is not used. -- **insteon_plm.button_of** - - **address**: (required) The Insteon device address in lower case without - dots (e.g. 1a2b3c) - - **button**: (Optional) The button id in lower case. For an 4 button remote - the values are a to d. For an 8 button remote the values are a to g. For - a one button remote this field is not used. - -This allows the mini-remotes to be configured as - -Here is an example of how to use these events for automations: - -``` -automation: - # 4 or 8 button remote with button c pressed - trigger: - platform: event - event_type: insteon_plm.button_on - event_data: - address: 1a2b3c - button: c - condition: - - condition: state - entity_id: light.some_light - state: 'off' - action: - service: light.turn_on - entity_id: light.some_light - - # single button remote - trigger: - platform: event - event_type: insteon_plm.button_on - event_data: - address: 1a2b3c - condition: - - condition: state - entity_id: light.some_light - state: 'off' - action: - service: light.turn_on - entity_id: light.some_light -``` diff --git a/source/_components/light.insteon.markdown b/source/_components/light.insteon.markdown new file mode 100644 index 00000000000..a6db155d5e4 --- /dev/null +++ b/source/_components/light.insteon.markdown @@ -0,0 +1,21 @@ +--- +layout: page +title: "Insteon Light" +description: "Instructions on how to setup Insteon lights locally within Home Assistant." +date: 2018-08-20 16:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: insteon.png +ha_category: Light +ha_iot_class: "Local Push" +ha_version: 0.77 +--- + +The `insteon` light platform lets you control your lights through +an INSTEON Modem (PLM and Hub) device connected directly to your system on a +USB, serial port or TCPIP connection. To add support, set up the primary +[insteon] component. + +[insteon]: /components/insteon/ \ No newline at end of file diff --git a/source/_components/light.insteon_local.markdown b/source/_components/light.insteon_local.markdown deleted file mode 100644 index 818e450eb90..00000000000 --- a/source/_components/light.insteon_local.markdown +++ /dev/null @@ -1,19 +0,0 @@ ---- -layout: page -title: "Insteon (local) Light" -description: "Instructions on how to setup the Insteon Hub Lights locally within Home Assistant." -date: 2016-12-18 08:00 -sidebar: true -comments: false -sharing: true -footer: true -logo: insteon.png -ha_category: Light -ha_iot_class: "Local Push" -ha_release: 0.36 -redirect_from: /components/light.insteon_hub/ ---- - -The `insteon_local` light component lets you control your lights connected to an [Insteon Hub](http://www.insteon.com/insteon-hub/) with Home Assistant. - -To get your Insteon lights working with Home Assistant, follow the instructions for the general [Insteon local component] (/components/insteon_local/). The lights will be automatically discovered and added to Home Assistant. The device names will be the Insteon address of the lights. diff --git a/source/_components/light.insteon_plm.markdown b/source/_components/light.insteon_plm.markdown deleted file mode 100644 index 40561bdd914..00000000000 --- a/source/_components/light.insteon_plm.markdown +++ /dev/null @@ -1,16 +0,0 @@ ---- -layout: page -title: "Insteon PLM Light" -description: "Instructions on how to setup the Insteon PLM Lights locally within Home Assistant." -date: 2017-02-19 17:00 -sidebar: true -comments: false -sharing: true -footer: true -logo: insteon.png -ha_category: Light -ha_iot_class: "Local Push" -ha_release: 0.39 ---- - -The `insteon_plm` light platform lets you control your dimmable light switches through an INSTEON PowerLinc Modem (PLM) device connected directly to your system on an USB or serial port. To add support, set up the primary [insteon_plm](/components/insteon_plm/) component. diff --git a/source/_components/sensor.insteon.markdown b/source/_components/sensor.insteon.markdown new file mode 100644 index 00000000000..ab5116050e3 --- /dev/null +++ b/source/_components/sensor.insteon.markdown @@ -0,0 +1,21 @@ +--- +layout: page +title: "Insteon Sensor" +description: "Instructions on how to setup the Insteon sensors locally within Home Assistant." +date: 2018-08-20 16:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: insteon.png +ha_category: Sensor +ha_iot_class: "Local Push" +ha_version: 0.77 +--- + +The `insteon` sensor platform lets you control your sensors through +an INSTEON Modem (PLM and Hub) device connected directly to your system on a +USB, serial port or TCPIP connection. To add support, set up the primary +[insteon] component. + +[insteon]: /components/insteon/ \ No newline at end of file diff --git a/source/_components/sensor.insteon_plm.markdown b/source/_components/sensor.insteon_plm.markdown deleted file mode 100644 index d394cd05d82..00000000000 --- a/source/_components/sensor.insteon_plm.markdown +++ /dev/null @@ -1,16 +0,0 @@ ---- -layout: page -title: "Insteon PLM Sensor" -description: "Instructions on how to setup the Insteon PLM sensors locally within Home Assistant." -date: 2017-02-19 17:00 -sidebar: true -comments: false -sharing: true -footer: true -logo: insteon.png -ha_category: Sensor -ha_iot_class: "Local Push" -ha_release: 0.65 ---- - -The `insteon_plm` sensor platform lets you control your sensors through an INSTEON PowerLinc Modem (PLM) device connected directly to your system on a USB or serial port. To add support, set up the primary [insteon_plm](/components/insteon_plm/) component. diff --git a/source/_components/switch.insteon.markdown b/source/_components/switch.insteon.markdown new file mode 100644 index 00000000000..0af789e8a3e --- /dev/null +++ b/source/_components/switch.insteon.markdown @@ -0,0 +1,21 @@ +--- +layout: page +title: "Insteon Switch" +description: "Instructions on how to setup the Insteon switches locally within Home Assistant." +date: 2018-08-20 16:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: insteon.png +ha_category: Switch +ha_iot_class: "Local Push" +ha_version: 0.77 +--- + +The `insteon` switch platform lets you control your on/off switches through +an INSTEON Modem (PLM and Hub) device connected directly to your system on a +USB, serial port or TCPIP connection. To add support, set up the primary +[insteon] component. + +[insteon]: /components/insteon/ \ No newline at end of file diff --git a/source/_components/switch.insteon_local.markdown b/source/_components/switch.insteon_local.markdown deleted file mode 100644 index d465cae2fe5..00000000000 --- a/source/_components/switch.insteon_local.markdown +++ /dev/null @@ -1,17 +0,0 @@ ---- -layout: page -title: "Insteon (local) Switch" -description: "Instructions on how to setup the Insteon Hub switches locally within Home Assistant." -date: 2016-12-18 08:00 -sidebar: true -comments: false -sharing: true -footer: true -logo: insteon.png -ha_category: Switch -ha_release: 0.36 ---- - -The `insteon_local` switch component lets you control your switches connected to an [Insteon Hub](http://www.insteon.com/insteon-hub/) with Home Assistant. - -To get your Insteon switches working with Home Assistant, follow the instructions for the general [Insteon local component](/components/insteon_local/). The switches will be automatically discovered and added to Home Assistant. The device names will be the Insteon address of the switch. diff --git a/source/_components/switch.insteon_plm.markdown b/source/_components/switch.insteon_plm.markdown deleted file mode 100644 index 39f7d1235dc..00000000000 --- a/source/_components/switch.insteon_plm.markdown +++ /dev/null @@ -1,16 +0,0 @@ ---- -layout: page -title: "Insteon PLM Switch" -description: "Instructions on how to setup the Insteon PLM switches locally within Home Assistant." -date: 2017-02-19 17:00 -sidebar: true -comments: false -sharing: true -footer: true -logo: insteon.png -ha_category: Switch -ha_iot_class: "Local Push" -ha_release: 0.39 ---- - -The `insteon_plm` switch platform lets you control your on/off switches through an INSTEON PowerLinc Modem (PLM) device connected directly to your system on a USB or serial port. To add support, set up the primary [insteon_plm](/components/insteon_plm/) component. From 062f7855637c7b8cbec9c84aeaa66a6be992b122 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 22 Aug 2018 17:41:59 +0200 Subject: [PATCH 24/47] Remove entity registry docs (#6030) --- .../configuration/entity-registry.markdown | 48 ------------------- source/_docs/z-wave/control-panel.markdown | 22 --------- source/_includes/asides/docs_navigation.html | 2 - source/_posts/2018-03-30-release-66.markdown | 2 +- 4 files changed, 1 insertion(+), 73 deletions(-) delete mode 100644 source/_docs/configuration/entity-registry.markdown diff --git a/source/_docs/configuration/entity-registry.markdown b/source/_docs/configuration/entity-registry.markdown deleted file mode 100644 index b699bb979eb..00000000000 --- a/source/_docs/configuration/entity-registry.markdown +++ /dev/null @@ -1,48 +0,0 @@ ---- -layout: page -title: "Entity Registry" -description: "The entity registry contains." -date: 2016-04-20 06:00 -sidebar: true -comments: false -sharing: true -footer: true ---- - -Starting with version 0.63, Home Assistant keeps a registry of known entities. The entity registry makes sure that entities get unique identifiers and allow customizing the identifiers and names of these entities. - -Changes require that Home Assistant is shut down when you edit the file, otherwise Home Assistant may over-write your changes, and a restart of Home Assistant is required for your changes to take effect. Version 0.75 introduced a configuration user interface. - -

-An entity needs to have a unique ID to be registered in the entity registry. -Not all integrations currently provide a unique id for their entities. -

- -The entity registry is stored in `/entity_registry.yaml`. As a user, you are unable to add entries, only update them. Here is an example file: - -```yaml -climate.downstairs_virtual: - platform: nest - unique_id: EPoMyWkpNyoYu3pGlmGxabcdefghijkl - name: Downstairs thermostat -light.study_ceiling: - platform: hue - unique_id: f0:fe:6b:00:14:00:00:00-00 - disabled_by: user -``` - -As a user, you can change the `entity_id` and add the `name` and `disabled_by`value to each entry. - - - Changing the _first line_ of each entry will change the `entity_id` of the entity throughout Home Assistant. - - The value of `name` will override the _friendly name_ of the entity as given by the integration. - - _Added in Home Assistant 0.64._ - - The key `disabled_by` can either be `hass` or `user`. This functionality is even more experimental than the whole entity registry itself and might cause integrations to fail and might be removed in the future. - - _Added in Home Assistant 0.64._ - -{% linkable_title Supported Components %} - -Only components that provide a unique ID for entities will are supported. - -Note that for Weather Underground, second and subsequent Personal Weather Station ID (pws_id) will have their monitored conditions suffixed with an index number. diff --git a/source/_docs/z-wave/control-panel.markdown b/source/_docs/z-wave/control-panel.markdown index d3169a41c9f..dc3f19c5cc5 100644 --- a/source/_docs/z-wave/control-panel.markdown +++ b/source/_docs/z-wave/control-panel.markdown @@ -32,10 +32,6 @@ Here is where you [include and exclude](/docs/z-wave/adding/) Z-Wave devices fro ## {% linkable_title Z-Wave Node Management %} -

-Since 0.63 and the new experimental [entity registry](/docs/configuration/entity-registry/) **Rename Node** no longer changes the entity id for anything other than the `zwave.` entity for the node (it does change the default *friendly_name* attribute for all the entities). If you would like to update the entity id after renaming a z-wave device, you need to manually edit the [entity_registry.yaml](/docs/configuration/entity-registry/) file. See [this issue](https://github.com/home-assistant/home-assistant/issues/12430). -

- * **Refresh Node** refreshes the information on the node and its entities. If used on a battery powered device, the device will first need to wake for this to work. * **Remove Failed Node** will remove a failed node from the network. The node needs to be on the controller's Failed Node List (marked as `is_failed: true`), otherwise this command will fail. * **Replace Failed Node** will replace a failed device with another. If the node is not in the controller's Failed Node List, or the node responds, this command will fail. @@ -49,24 +45,6 @@ Since 0.63 and the new experimental [entity registry](/docs/configuration/entity Battery powered devices need to be awake before you can use the Z-Wave control panel to update their settings. How to wake your device is device specific, and some devices will stay awake for only a couple of seconds. Please refer to the manual of your device for more details.

-### {% linkable_title Renaming all entities of a node %} - -When you use *Rename Node* it, as mentioned above, only changes the `zwave.` entity. If you've just added a device then the other entities for that device will use that new entity name as the base. However existing entities won't be renamed, so you need to remove them from `entity_registry.yaml`, and the process is like this: - -1. Use *Rename Node* to rename the `zwave.` entity and set the base for all the other entities -2. Shut down Home Assistant and wait for it to stop -3. Delete the relevant entries from `entity_registry.yaml` -4. Start Home Assistant again - -Each block you need to delete will look something like this, you need to delete all 4 lines for each entry. The first number of the `unique-id` is the Node ID of the Z-Wave node. - -```yaml -sensor.fibaro_door_sensor_access_control: - name: - platform: zwave - unique_id: 5-72057594126614528 -``` - #### {% linkable_title Entities of this node %} This is a dropdown where you can select all the entities of this node. Once selected you can then use: diff --git a/source/_includes/asides/docs_navigation.html b/source/_includes/asides/docs_navigation.html index 8256e7e1e1a..7f7e2ac99d4 100644 --- a/source/_includes/asides/docs_navigation.html +++ b/source/_includes/asides/docs_navigation.html @@ -12,7 +12,6 @@
  • {% active_link /hassio/ Hass.io %}
  • {% active_link /docs/installation/virtualenv/ Python Virtual Env %}
  • {% active_link /docs/installation/hassbian/ Hassbian %}
  • -
  • {% active_link /docs/installation/updating/ Updating %}
  • {% active_link /docs/installation/troubleshooting/ Troubleshooting %}
  • @@ -23,7 +22,6 @@
  • {% active_link /docs/configuration/yaml/ YAML %}
  • {% active_link /docs/configuration/basic/ Basic information %}
  • {% active_link /docs/configuration/devices/ Setting up devices %}
  • -
  • {% active_link /docs/configuration/entity-registry/ Entity Registry %}
  • {% active_link /docs/configuration/customizing-devices/ Customizing entities %}
  • {% active_link /docs/configuration/troubleshooting/ Troubleshooting %}
  • {% active_link /docs/configuration/securing/ Security Check Points %}
  • diff --git a/source/_posts/2018-03-30-release-66.markdown b/source/_posts/2018-03-30-release-66.markdown index 26aba182bea..8ade7e296e7 100644 --- a/source/_posts/2018-03-30-release-66.markdown +++ b/source/_posts/2018-03-30-release-66.markdown @@ -55,7 +55,7 @@ Experiencing issues introduced by this release? Please report them in our [issue ## Breaking Changes - Refactor Hue: If you specify a bridge in your config, the `host` key is now required and needs to be a valid ip address. Option `allow_in_emulated_hue` has been removed. Exclude the lights via the emulated hue config. Due to the internal changes of how the Hue integration works, any Hue custom component will no longer work. ([@balloob] - [#13043]) ([hue docs]) ([light.hue docs]) (breaking change) -- Z-Wave: In version 0.47, the opt-in `new_entity_ids` configuration was added to Z-Wave to smooth the transition through the change. Support for old entity IDs is now removed, and the configuration is no longer necessary. If you are migrating from 0.63 or higher, your entity IDs will already be stored in the Entity Registry and no changes are required. If not, [entity IDs can now be manually configured using the Entity Registry](/docs/configuration/entity-registry/) if necessary. ([@armills] - [#12652]) ([zwave docs]) (breaking change) +- Z-Wave: In version 0.47, the opt-in `new_entity_ids` configuration was added to Z-Wave to smooth the transition through the change. Support for old entity IDs is now removed, and the configuration is no longer necessary. If you are migrating from 0.63 or higher, your entity IDs will already be stored in the Entity Registry and no changes are required. If not, entity IDs can now be manually configured using the Entity Registry if necessary. ([@armills] - [#12652]) ([zwave docs]) (breaking change) - Spotcrime sensor: This update changes the sensor to require a user supplied API key as a configuration entry. The default key has been removed from the Spotcrime package and has also been modified to accept a user supplied API key.([@jcconnell] - [#12926]) ([sensor.spotcrime docs]) (breaking change) - Smappee sensor: Fixed SI units for current consumption. Total consumption should be in kWh. not kW. ([@vandenberghev] - [#13190]) ([sensor.smappee docs]) (breaking change) - System monitor sensor: Used and available swap space reported by the system monitor component is now measured in MiB instead of GiB. ([@DanNixon] - [#13148]) ([sensor.systemmonitor docs]) (breaking change) From ee69e93902456bb1f8a61518ffa37615c8536350 Mon Sep 17 00:00:00 2001 From: Dan Klaffenbach Date: Wed, 22 Aug 2018 22:32:23 +0200 Subject: [PATCH 25/47] List example for homematic.put_paramset in documentation (#6032) See home-assistant/home-assistant#16024 --- source/_components/homematic.markdown | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/source/_components/homematic.markdown b/source/_components/homematic.markdown index 5f860b4d6d0..a60d144ec27 100644 --- a/source/_components/homematic.markdown +++ b/source/_components/homematic.markdown @@ -187,6 +187,7 @@ To get the `homematic.keypress` event for some HomeMatic IP devices like WRC2 / - *homematic.reconnect*: Reconnect to CCU/Homegear without restarting Home Assistant (useful when CCU has been restarted) - *homematic.set_variable_value*: Set the value of a system variable. - *homematic.set_device_value*: Control a device manually (even devices without support). Equivalent to setValue-method from XML-RPC. +- *homematic.put_paramset*: Manually change a device's paramset (even devices without support). Equivalent to putParamset-method from XML-RPC. #### {% linkable_title Examples %} @@ -257,6 +258,20 @@ action: value: 23.0 ``` +Set the week program of a wall thermostat: + +```yaml +... +action: + service: homematic.put_paramset + data: + interface: wireless + address: LEQ1234567 + paramset_key: MASTER + paramset: + WEEK_PROGRAM_POINTER: 1 +``` + Manually set lock on KeyMatic devices: ```yaml From d1e59700b7b3dbe5fc34a7d3fd3cb582a0635c49 Mon Sep 17 00:00:00 2001 From: JC Connell Date: Wed, 22 Aug 2018 18:21:24 -0400 Subject: [PATCH 26/47] Add noaa_tides documentation (#5881) * Add noaa_tides documentation * Remove error on last line * Formatting fix * :pencil2: Minor tweaks * Change units to unit_system * Minor changes --- source/_components/sensor.noaa_tides.markdown | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 source/_components/sensor.noaa_tides.markdown diff --git a/source/_components/sensor.noaa_tides.markdown b/source/_components/sensor.noaa_tides.markdown new file mode 100644 index 00000000000..42441690f92 --- /dev/null +++ b/source/_components/sensor.noaa_tides.markdown @@ -0,0 +1,60 @@ +--- +layout: page +title: "NOAA Tides" +description: "Instructions to add NOAA Tide information to Home Assistant." +date: 2018-07-24 08:00 +sidebar: true +comments: false +sharing: true +footer: true +ha_category: Weather +ha_release: 0.75 +logo: noaa.png +--- + +The `noaa_tides` sensor platform uses details from [NOAA Tides and Currents](https://tidesandcurrents.noaa.gov/api/) to provide information about the prediction for the tides for any location in the United States. + +This sensor requires the use of an NOAA station id. Search [NOAA Tide Predictions](https://tidesandcurrents.noaa.gov/tide_predictions.html) to find a location. Use the Id from the search results in your configuration. Alternately, you can determine a station id from a URL. For example, `8721164` in the following URL `https://tidesandcurrents.noaa.gov/noaatidepredictions.html?id=8721164` + +To use this sensor, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +sensor: + - platform: noaa_tides + station_id: 8721164 +``` + +{% configuration %} +station_id: + description: ID of the station you'd like to track from https://tidesandcurrents.noaa.gov/tide_predictions.html. + required: true + type: string +name: + description: User supplied sensor name. + required: false + default: NOAA Tides. + type: string +time_zone: + description: User selected timezone. + required: false + default: Local Standard Time/Local Daylight Time. + type: list + keys: + gmt: + description: Greenwich Mean Time. + lst: + description: Local Standard Time. The time local to the requested station. + lst_ldt: + description: Local Standard/Local Daylight Time. The time local to the requested station. +unit_system: + description: Specify the unit system. + required: false + default: Defaults to `metric` or `imperial` based on the Home Assistant configuration. + type: string + keys: + metric: + description: Metric (Celsius, meters, cm/s) units. + english: + description: English (fahrenheit, feet, knots) units. +{% endconfiguration %} From 49d13e9ca6a729461d4514ecd39db3c148dd9b82 Mon Sep 17 00:00:00 2001 From: squidwardy Date: Thu, 23 Aug 2018 11:15:16 +0200 Subject: [PATCH 27/47] Add documentation for js_is_module in panel_custom (#6056) * Update panel_custom.markdown * Update panel_custom.markdown * Update panel_custom.markdown --- source/_components/panel_custom.markdown | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/source/_components/panel_custom.markdown b/source/_components/panel_custom.markdown index cced1f71abe..2ce5ee84284 100644 --- a/source/_components/panel_custom.markdown +++ b/source/_components/panel_custom.markdown @@ -38,8 +38,9 @@ Configuration variables: - **sidebar_title** (*Optional*): Friendly title for the panel in the sidebar. Omitting it means no sidebar entry (but still accessible through the URL). - **sidebar_icon** (*Optional*): Icon for entry. Pick an icon that you can find on [materialdesignicons.com](https://materialdesignicons.com/) to use for your input and prefix the name with `mdi:`. For example `mdi:car`, `mdi:ambulance`, or `mdi:motorbike`. - **url_path** (*Optional*): The URL your panel will be available on in the frontend. If omitted will default to the panel name. -- **js_url** (*Required*): The URL that contains the JavaScript of your panel. +- **js_url** (*Required*): The URL that contains the JavaScript of your panel. This is exclusive to `module_url` and `webcomponent_path`. +- **module_url** (*Optional*): The URL that contains the JavaScript module of your panel. Loaded as a JavaScript module instead of a script. This is exclusive to `js_url` and `webcomponent_path`. - **config** (*Optional*): Configuration to be passed into your web component when being instantiated. -- **embed_iframe** (*Optional*): Set to `true` to embed panel in iframe. This is necessary if the panel is panel is using the React framework or if it contains conflicting web components. +- **embed_iframe** (*Optional*): Set to `true` to embed panel in iframe. This is necessary if the panel is using the React framework or if it contains conflicting web components. - **trust_external_script** (*Optional*): By default the user has to confirm before loading a script from an external source. Setting this to `true` will omit this confirmation. -- **webcomponent_path** (*Optional* *DEPRECATED*): The HTML path to your component. If omitted will default to `/panels/.html` +- **webcomponent_path** (*Optional* *DEPRECATED*): The HTML path to your component. If omitted will default to `/panels/.html` This is exclusive to `js_url` and `module_url`. From 4bdd51eb30f9a9d93d967d44ce5d4eb29507f8bc Mon Sep 17 00:00:00 2001 From: Robert Svensson Date: Fri, 24 Aug 2018 01:14:13 +0200 Subject: [PATCH 28/47] Small improvements requested on previous PR (#6067) --- source/_components/binary_sensor.deconz.markdown | 2 +- source/_components/light.deconz.markdown | 2 +- source/_components/scene.deconz.markdown | 2 +- source/_components/sensor.deconz.markdown | 2 +- source/_components/switch.deconz.markdown | 3 ++- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/source/_components/binary_sensor.deconz.markdown b/source/_components/binary_sensor.deconz.markdown index f0499482838..3e41d4b1614 100644 --- a/source/_components/binary_sensor.deconz.markdown +++ b/source/_components/binary_sensor.deconz.markdown @@ -22,7 +22,7 @@ The following sensor types are supported: * Presence detection * Water leakage detection -Entity ids will be binary_sensor.device_name, where device_name is defined in deCONZ. +The `entity_id` name will be `binary_sensor.device_name`, where `device_name` is defined in deCONZ. #### {% linkable_title Verified to be supported binary sensors %} diff --git a/source/_components/light.deconz.markdown b/source/_components/light.deconz.markdown index 918f0733665..8bafa152397 100644 --- a/source/_components/light.deconz.markdown +++ b/source/_components/light.deconz.markdown @@ -15,7 +15,7 @@ ha_iot_class: "Local Push" See the [deCONZ main component](/components/deconz/) for configuration instructions. -The `Entity Id` names will be `light.device_name`, where `device_name` is defined in deCONZ. Light groups created in deCONZ will be created in Home Assistant as lights named `light.group_name_in_deconz`, allowing the user to control groups of lights with only a single API call to deCONZ. +The `entity_id` names will be `light.device_name`, where `device_name` is defined in deCONZ. Light groups created in deCONZ will be created in Home Assistant as lights named `light.group_name_in_deconz`, allowing the user to control groups of lights with only a single API call to deCONZ. #### {% linkable_title Verified supported lights %} diff --git a/source/_components/scene.deconz.markdown b/source/_components/scene.deconz.markdown index b5fdf7fa7fe..3509f033c83 100644 --- a/source/_components/scene.deconz.markdown +++ b/source/_components/scene.deconz.markdown @@ -15,4 +15,4 @@ ha_iot_class: "Local Push" See the [deCONZ main component](/components/deconz/) for configuration instructions. -Entity Ids will be scene.group_scene_name, where group is which group the scene belongs to and the name of the scene, both group and name are defined in deCONZ. \ No newline at end of file +The `entity_id` name will be `scene.group_scene_name`, where `group` is which group the scene belongs to and the name of the scene, both group and name are defined in deCONZ. \ No newline at end of file diff --git a/source/_components/sensor.deconz.markdown b/source/_components/sensor.deconz.markdown index 46dad20c0e2..7dd29e19035 100644 --- a/source/_components/sensor.deconz.markdown +++ b/source/_components/sensor.deconz.markdown @@ -23,7 +23,7 @@ The following sensor types are supported: * Switches * Temperature sensor -Entity ids will be sensor.device_name, where device_name is defined in deCONZ. Switches aren't exposed as ordinary entities, see the [deCONZ main component](/components/deconz/) for more details. +The `entity_id` name will be `sensor.device_name`, where `device_name` is defined in deCONZ. Switches aren't exposed as ordinary entities, see the [deCONZ main component](/components/deconz/) for more details. #### {% linkable_title Verified to be supported sensors %} diff --git a/source/_components/switch.deconz.markdown b/source/_components/switch.deconz.markdown index 1b7a1b3e3f8..4a251b9fcb9 100644 --- a/source/_components/switch.deconz.markdown +++ b/source/_components/switch.deconz.markdown @@ -19,9 +19,10 @@ Switches are devices like power plugs and sirens. Note that devices in the switch platform identify as lights, so there is a manually curated list that defines which "lights" are switches. -The `Entity Id` names will be `switch.device_name`, where `device_name` is defined in deCONZ. +The `entity_id` name will be `switch.device_name`, where `device_name` is defined in deCONZ. #### {% linkable_title Verified supported switches %} - Innr SP120 - Osram Outdoor plug +- Heiman siren From 0c47a9122456bdda52468c94207ef68e2c3b4735 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 24 Aug 2018 17:11:41 +0200 Subject: [PATCH 29/47] initial 77 release blog --- _config.yml | 8 +- source/_posts/2018-08-31-release-77.markdown | 340 +++++++++++++++++++ 2 files changed, 344 insertions(+), 4 deletions(-) create mode 100644 source/_posts/2018-08-31-release-77.markdown diff --git a/_config.yml b/_config.yml index 62c8df641b9..360563d2a1c 100644 --- a/_config.yml +++ b/_config.yml @@ -141,14 +141,14 @@ social: # Home Assistant release details current_major_version: 0 -current_minor_version: 76 -current_patch_version: 2 -date_released: 2018-08-21 +current_minor_version: 77 +current_patch_version: 0 +date_released: 2018-08-31 # Either # or the anchor link to latest release notes in the blog post. # Must be prefixed with a # and have double quotes around it. # Major release: -patch_version_notes: "#release-0762---august-21" +patch_version_notes: "#" # Minor release (Example #release-0431---april-25): # Date we moved to Discourse for comments diff --git a/source/_posts/2018-08-31-release-77.markdown b/source/_posts/2018-08-31-release-77.markdown new file mode 100644 index 00000000000..85e59ea2228 --- /dev/null +++ b/source/_posts/2018-08-31-release-77.markdown @@ -0,0 +1,340 @@ +--- +layout: post +title: "0.77: TODO - UPDATE DATE" +description: "" +date: 2018-08-24 00:01:00 +date_formatted: "August 31, 2018" +author: Paulus Schoutsen +author_twitter: balloob +comments: true +categories: Release-Notes +og_image: /images/blog/2018-08-0.77/components.png +--- + + + +Auth enabled by default ! If you had auth providers configured before, recommended to remove the configuration and start using the default config. + +Notification drawer for lovelace. + +Hangouts + + + +## {% linkable_title New Platforms %} + +- Netatmo public ([@colinfrei] - [#15684]) ([sensor.netatmo_public docs]) (new-platform) +- Add ecovacs component ([@OverloadUT] - [#15520]) ([ecovacs docs]) ([vacuum.ecovacs docs]) (new-platform) +- Add support for NOAA tide information (new PR) ([@jcconnell] - [#15947]) ([sensor.noaa_tides docs]) (new-platform) +- Hangouts ([@hobbypunk90] - [#16049]) ([hangouts docs]) ([notify docs]) (new-platform) + +## {% linkable_title New Features %} + +- Add trusted networks auth provider ([@awarecan] - [#15812]) ([auth docs]) ([http docs]) ([websocket_api docs]) (breaking change) (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 %} + +- Allow wait template to run the remainder of the script ([@lhovo] - [#15836]) (breaking change) +- Add trusted networks auth provider ([@awarecan] - [#15812]) ([auth docs]) ([http docs]) ([websocket_api docs]) (breaking change) (new-feature) +- Update Xiaomi Vacuum to new StateVacuumDevice ([@cnrd] - [#15643]) (breaking change) +- Update neato to support new StateVacuumDevice ([@dshokouhi] - [#16035]) ([vacuum.neato docs]) (breaking change) +- Remove homeassistant.remote ([@balloob] - [#16099]) ([api docs]) ([http docs]) ([mqtt_eventstream docs]) ([mqtt_statestream docs]) ([notify docs]) ([splunk docs]) ([websocket_api docs]) (breaking change) +- Merge insteon_plm and insteon_local to insteon component ([@teharris1] - [#16102]) (breaking change) +- Remove unit_of_measurement from climate entities ([@jeradM] - [#16012]) ([climate docs]) ([climate.generic_thermostat docs]) ([climate.knx docs]) ([climate.maxcube docs]) ([climate.sensibo docs]) (breaking change) +- Adds support for routers implementing IGDv2 ([@dgomes] - [#16108]) ([upnp docs]) (breaking change) +- Enable auth by default 🙈 ([@balloob] - [#16107]) (breaking change) + +## {% linkable_title All changes %} + +- Eph ember support operation modes ([@ttroy50] - [#15820]) ([climate.ephember docs]) +- Fixed race condition in Generic Thermostat ([@aronsky] - [#15784]) ([climate.generic_thermostat docs]) +- Fix magic cube support of the Aqara LAN Protocol V2 ([@syssi] - [#15940]) ([binary_sensor.xiaomi_aqara docs]) +- Upgrade beautifulsoup4 to 4.6.3 ([@fabaff] - [#15946]) ([device_tracker docs]) ([sensor.geizhals docs]) ([sensor.scrape docs]) ([sensor.sytadin docs]) +- Allow wait template to run the remainder of the script ([@lhovo] - [#15836]) (breaking change) +- Add trusted networks auth provider ([@awarecan] - [#15812]) ([auth docs]) ([http docs]) ([websocket_api docs]) (breaking change) (new-feature) +- Add monitored conditions for Unifi device_tracker ([@cgarwood] - [#15888]) ([device_tracker docs]) +- Netatmo public ([@colinfrei] - [#15684]) ([sensor.netatmo_public docs]) (new-platform) +- Update Xiaomi Vacuum to new StateVacuumDevice ([@cnrd] - [#15643]) (breaking change) +- HomeMatic: Enable entity registry ([@danielperna84] - [#15950]) ([homematic docs]) +- Fix google calendar documentation link. ([@cgtobi] - [#15968]) ([calendar.google docs]) +- Remove unnecessary log ([@colinfrei] - [#15966]) ([sensor.netatmo_public docs]) +- Make setup fail if location is not available ([@fabaff] - [#15967]) ([sensor.worldtidesinfo docs]) +- Remove warning ([@balloob] - [#15969]) +- Update waterfurnace library to 0.7, add reconnect logic ([@sdague] - [#15657]) ([waterfurnace docs]) +- adds support for momentary and beep/blink switches ([@heythisisnate] - [#15973]) ([konnected docs]) ([switch.konnected docs]) +- Add -j$(nproc) make option to speed up build time ([@vrih] - [#15928]) +- Update Glances sensor ([@fabaff] - [#15981]) ([sensor.glances docs]) +- Upgrade psutil to 5.4.7 ([@fabaff] - [#15982]) ([sensor.systemmonitor docs]) +- Upgrade aladdin_connect to 0.3 and provide Unique ID ([@shoejosh] - [#15986]) ([cover.aladdin_connect docs]) +- Entity service ([@balloob] - [#15991]) +- More entity service ([@balloob] - [#15998]) ([camera docs]) ([climate docs]) +- Wemo custom ports and network errors handling ([@mcspr] - [#14516]) ([wemo docs]) ([binary_sensor.wemo docs]) ([light.wemo docs]) ([switch.wemo docs]) +- Clean up input-datetime ([@balloob] - [#16000]) ([input_datetime docs]) +- BMW Connected drive: option to disable the services ([@Alexxander0] - [#15993]) ([bmw_connected_drive docs]) ([lock.bmw_connected_drive docs]) +- Add type hints to homeassistant.auth ([@scop] - [#15853]) +- Fix check config packages key error ([@MartinHjelmare] - [#15840]) +- Update SoCo to 0.16 ([@amelchio] - [#16007]) ([sonos docs]) ([media_player.sonos docs]) +- Upgrade sendgrid to 5.5.0 ([@fabaff] - [#16021]) ([notify docs]) +- Split out storage delay save ([@balloob] - [#16017]) ([hassio docs]) ([onboarding docs]) +- Disable assuming Optional type for values with None default ([@scop] - [#16029]) +- Update RitAssist to support maximum speed and current address ([@depl0y] - [#16037]) ([device_tracker docs]) +- Handle missing mpd capabilities ([@logic] - [#15945]) ([media_player.mpd docs]) +- Storage entity registry ([@balloob] - [#16018]) +- Attempt to fix flaky TTS test ([@balloob] - [#16025]) +- Update neato to support new StateVacuumDevice ([@dshokouhi] - [#16035]) ([vacuum.neato docs]) (breaking change) +- vacuum/xiaomi_miio: Expose "sensor_dirty_left" attribute ([@klada] - [#16003]) ([vacuum.xiaomi_miio docs]) +- Grammar and spelling fixes ([@scop] - [#16065]) +- Use aiohttp web.AppRunner ([@balloob] - [#16020]) ([http docs]) +- Update pushsafer.py ([@appzer] - [#16060]) ([notify docs]) +- Alexa: context + log events ([@balloob] - [#16023]) ([alexa docs]) +- openuv: Add Current UV Level to list of conditions ([@leppa] - [#16042]) ([openuv docs]) ([sensor.openuv docs]) +- TpLink Device Tracker Error ([@TimBailey-pnk] - [#15918]) ([device_tracker docs]) +- Deprecated stuff ([@balloob] - [#16019]) ([device_tracker docs]) ([websocket_api docs]) ([camera.push docs]) +- Add recent context ([@balloob] - [#15989]) +- Add ecovacs component ([@OverloadUT] - [#15520]) ([ecovacs docs]) ([vacuum.ecovacs docs]) (new-platform) +- Bumped NDMS2 client library to 0.0.4 to get compatible with python 3.5 ([@foxel] - [#16077]) ([device_tracker docs]) +- fritzdect change to current_power_w ([@Danielhiversen] - [#16079]) ([switch.fritzdect docs]) +- Update pyhomematic to 0.1.47 ([@danielperna84] - [#16083]) ([homematic docs]) +- Get user after login flow finished ([@awarecan] - [#16047]) ([auth docs]) +- Upgrade pytest to 3.7.2 ([@scop] - [#16091]) +- Add verify ssl to generic camera ([@fliphess] - [#15949]) ([camera.generic docs]) +- Upgrade afsapi to 0.0.4, prevents aiohttp session close message, Fixes #13099 ([@zhelev] - [#16098]) ([media_player.frontier_silicon docs]) +- Remove homeassistant.remote ([@balloob] - [#16099]) ([api docs]) ([http docs]) ([mqtt_eventstream docs]) ([mqtt_statestream docs]) ([notify docs]) ([splunk docs]) ([websocket_api docs]) (breaking change) +- Use new session when fetching remote urls ([@balloob] - [#16093]) ([auth docs]) +- Allow finish_flow callback to change data entry result type ([@awarecan] - [#16100]) +- Add support for revoking refresh tokens ([@balloob] - [#16095]) ([auth docs]) +- Refactoring login flow ([@awarecan] - [#16104]) +- Minor updates ([@fabaff] - [#16106]) +- Bump python-miio version ([@syssi] - [#16110]) ([device_tracker docs]) ([fan.xiaomi_miio docs]) ([light.xiaomi_miio docs]) ([remote.xiaomi_miio docs]) ([sensor.xiaomi_miio docs]) ([switch.xiaomi_miio docs]) ([vacuum.xiaomi_miio docs]) +- homematic: Add homematic.put_paramset service ([@klada] - [#16024]) ([homematic docs]) +- Upgrade shodan to 1.9.1 ([@fabaff] - [#16113]) ([sensor.shodan docs]) +- Upgrade sendgrid to 5.6.0 ([@fabaff] - [#16111]) ([notify docs]) +- Merge insteon_plm and insteon_local to insteon component ([@teharris1] - [#16102]) (breaking change) +- Remove unit_of_measurement from climate entities ([@jeradM] - [#16012]) ([climate docs]) ([climate.generic_thermostat docs]) ([climate.knx docs]) ([climate.maxcube docs]) ([climate.sensibo docs]) (breaking change) +- Add multi-factor authentication modules ([@awarecan] - [#15489]) ([config docs]) +- Device Registry ([@Kane610] - [#15980]) +- Check correctly if package is loadable ([@balloob] - [#16121]) +- Upgrade numpy to 1.15.1 ([@fabaff] - [#16126]) ([binary_sensor.trend docs]) ([image_processing.opencv docs]) +- Upgrade youtube_dl to 2018.08.22 ([@fabaff] - [#16125]) ([media_extractor docs]) +- Fix the protocol v2 data_key of several aqara devices ([@syssi] - [#16112]) ([binary_sensor.xiaomi_aqara docs]) +- Upgrade brunt package ([@eavanvalkenburg] - [#16130]) ([cover.brunt docs]) +- Add support for NOAA tide information (new PR) ([@jcconnell] - [#15947]) ([sensor.noaa_tides docs]) (new-platform) +- Adds support for routers implementing IGDv2 ([@dgomes] - [#16108]) ([upnp docs]) (breaking change) +- Add support for JS modules in custom panels ([@squidwardy] - [#16096]) ([panel_custom docs]) +- Prevent legacy api password with empty password ([@balloob] - [#16127]) +- Enable auth by default 🙈 ([@balloob] - [#16107]) (breaking change) +- Remove commented out API password from default config ([@balloob] - [#16147]) +- Spelling fixes ([@scop] - [#16150]) ([insteon_local docs]) ([insteon_plm docs]) +- Update pydocstyle to 2.1.1 and flake8-docstrings to 1.3.0 ([@scop] - [#14557]) +- Hangouts ([@hobbypunk90] - [#16049]) ([hangouts docs]) ([notify docs]) (new-platform) +- Hangouts localization typo fix ([@armills] - [#16174]) ([hangouts docs]) +- deCONZ - Allow sub second light transitions ([@Kane610] - [#16170]) ([light.deconz docs]) +- add_devices -> add_entities ([@balloob] - [#16171]) + +[#14516]: https://github.com/home-assistant/home-assistant/pull/14516 +[#14557]: https://github.com/home-assistant/home-assistant/pull/14557 +[#15489]: https://github.com/home-assistant/home-assistant/pull/15489 +[#15520]: https://github.com/home-assistant/home-assistant/pull/15520 +[#15643]: https://github.com/home-assistant/home-assistant/pull/15643 +[#15657]: https://github.com/home-assistant/home-assistant/pull/15657 +[#15684]: https://github.com/home-assistant/home-assistant/pull/15684 +[#15784]: https://github.com/home-assistant/home-assistant/pull/15784 +[#15812]: https://github.com/home-assistant/home-assistant/pull/15812 +[#15820]: https://github.com/home-assistant/home-assistant/pull/15820 +[#15836]: https://github.com/home-assistant/home-assistant/pull/15836 +[#15840]: https://github.com/home-assistant/home-assistant/pull/15840 +[#15853]: https://github.com/home-assistant/home-assistant/pull/15853 +[#15888]: https://github.com/home-assistant/home-assistant/pull/15888 +[#15918]: https://github.com/home-assistant/home-assistant/pull/15918 +[#15928]: https://github.com/home-assistant/home-assistant/pull/15928 +[#15940]: https://github.com/home-assistant/home-assistant/pull/15940 +[#15945]: https://github.com/home-assistant/home-assistant/pull/15945 +[#15946]: https://github.com/home-assistant/home-assistant/pull/15946 +[#15947]: https://github.com/home-assistant/home-assistant/pull/15947 +[#15949]: https://github.com/home-assistant/home-assistant/pull/15949 +[#15950]: https://github.com/home-assistant/home-assistant/pull/15950 +[#15966]: https://github.com/home-assistant/home-assistant/pull/15966 +[#15967]: https://github.com/home-assistant/home-assistant/pull/15967 +[#15968]: https://github.com/home-assistant/home-assistant/pull/15968 +[#15969]: https://github.com/home-assistant/home-assistant/pull/15969 +[#15973]: https://github.com/home-assistant/home-assistant/pull/15973 +[#15980]: https://github.com/home-assistant/home-assistant/pull/15980 +[#15981]: https://github.com/home-assistant/home-assistant/pull/15981 +[#15982]: https://github.com/home-assistant/home-assistant/pull/15982 +[#15986]: https://github.com/home-assistant/home-assistant/pull/15986 +[#15989]: https://github.com/home-assistant/home-assistant/pull/15989 +[#15991]: https://github.com/home-assistant/home-assistant/pull/15991 +[#15993]: https://github.com/home-assistant/home-assistant/pull/15993 +[#15998]: https://github.com/home-assistant/home-assistant/pull/15998 +[#16000]: https://github.com/home-assistant/home-assistant/pull/16000 +[#16003]: https://github.com/home-assistant/home-assistant/pull/16003 +[#16007]: https://github.com/home-assistant/home-assistant/pull/16007 +[#16012]: https://github.com/home-assistant/home-assistant/pull/16012 +[#16017]: https://github.com/home-assistant/home-assistant/pull/16017 +[#16018]: https://github.com/home-assistant/home-assistant/pull/16018 +[#16019]: https://github.com/home-assistant/home-assistant/pull/16019 +[#16020]: https://github.com/home-assistant/home-assistant/pull/16020 +[#16021]: https://github.com/home-assistant/home-assistant/pull/16021 +[#16023]: https://github.com/home-assistant/home-assistant/pull/16023 +[#16024]: https://github.com/home-assistant/home-assistant/pull/16024 +[#16025]: https://github.com/home-assistant/home-assistant/pull/16025 +[#16029]: https://github.com/home-assistant/home-assistant/pull/16029 +[#16035]: https://github.com/home-assistant/home-assistant/pull/16035 +[#16037]: https://github.com/home-assistant/home-assistant/pull/16037 +[#16042]: https://github.com/home-assistant/home-assistant/pull/16042 +[#16047]: https://github.com/home-assistant/home-assistant/pull/16047 +[#16049]: https://github.com/home-assistant/home-assistant/pull/16049 +[#16060]: https://github.com/home-assistant/home-assistant/pull/16060 +[#16065]: https://github.com/home-assistant/home-assistant/pull/16065 +[#16077]: https://github.com/home-assistant/home-assistant/pull/16077 +[#16079]: https://github.com/home-assistant/home-assistant/pull/16079 +[#16083]: https://github.com/home-assistant/home-assistant/pull/16083 +[#16091]: https://github.com/home-assistant/home-assistant/pull/16091 +[#16093]: https://github.com/home-assistant/home-assistant/pull/16093 +[#16095]: https://github.com/home-assistant/home-assistant/pull/16095 +[#16096]: https://github.com/home-assistant/home-assistant/pull/16096 +[#16098]: https://github.com/home-assistant/home-assistant/pull/16098 +[#16099]: https://github.com/home-assistant/home-assistant/pull/16099 +[#16100]: https://github.com/home-assistant/home-assistant/pull/16100 +[#16102]: https://github.com/home-assistant/home-assistant/pull/16102 +[#16104]: https://github.com/home-assistant/home-assistant/pull/16104 +[#16106]: https://github.com/home-assistant/home-assistant/pull/16106 +[#16107]: https://github.com/home-assistant/home-assistant/pull/16107 +[#16108]: https://github.com/home-assistant/home-assistant/pull/16108 +[#16110]: https://github.com/home-assistant/home-assistant/pull/16110 +[#16111]: https://github.com/home-assistant/home-assistant/pull/16111 +[#16112]: https://github.com/home-assistant/home-assistant/pull/16112 +[#16113]: https://github.com/home-assistant/home-assistant/pull/16113 +[#16121]: https://github.com/home-assistant/home-assistant/pull/16121 +[#16125]: https://github.com/home-assistant/home-assistant/pull/16125 +[#16126]: https://github.com/home-assistant/home-assistant/pull/16126 +[#16127]: https://github.com/home-assistant/home-assistant/pull/16127 +[#16130]: https://github.com/home-assistant/home-assistant/pull/16130 +[#16147]: https://github.com/home-assistant/home-assistant/pull/16147 +[#16150]: https://github.com/home-assistant/home-assistant/pull/16150 +[#16170]: https://github.com/home-assistant/home-assistant/pull/16170 +[#16171]: https://github.com/home-assistant/home-assistant/pull/16171 +[#16174]: https://github.com/home-assistant/home-assistant/pull/16174 +[@Alexxander0]: https://github.com/Alexxander0 +[@Danielhiversen]: https://github.com/Danielhiversen +[@Kane610]: https://github.com/Kane610 +[@MartinHjelmare]: https://github.com/MartinHjelmare +[@OverloadUT]: https://github.com/OverloadUT +[@TimBailey-pnk]: https://github.com/TimBailey-pnk +[@amelchio]: https://github.com/amelchio +[@appzer]: https://github.com/appzer +[@armills]: https://github.com/armills +[@aronsky]: https://github.com/aronsky +[@awarecan]: https://github.com/awarecan +[@balloob]: https://github.com/balloob +[@cgarwood]: https://github.com/cgarwood +[@cgtobi]: https://github.com/cgtobi +[@cnrd]: https://github.com/cnrd +[@colinfrei]: https://github.com/colinfrei +[@danielperna84]: https://github.com/danielperna84 +[@depl0y]: https://github.com/depl0y +[@dgomes]: https://github.com/dgomes +[@dshokouhi]: https://github.com/dshokouhi +[@eavanvalkenburg]: https://github.com/eavanvalkenburg +[@fabaff]: https://github.com/fabaff +[@fliphess]: https://github.com/fliphess +[@foxel]: https://github.com/foxel +[@heythisisnate]: https://github.com/heythisisnate +[@hobbypunk90]: https://github.com/hobbypunk90 +[@jcconnell]: https://github.com/jcconnell +[@jeradM]: https://github.com/jeradM +[@klada]: https://github.com/klada +[@leppa]: https://github.com/leppa +[@lhovo]: https://github.com/lhovo +[@logic]: https://github.com/logic +[@mcspr]: https://github.com/mcspr +[@scop]: https://github.com/scop +[@sdague]: https://github.com/sdague +[@shoejosh]: https://github.com/shoejosh +[@squidwardy]: https://github.com/squidwardy +[@syssi]: https://github.com/syssi +[@teharris1]: https://github.com/teharris1 +[@ttroy50]: https://github.com/ttroy50 +[@vrih]: https://github.com/vrih +[@zhelev]: https://github.com/zhelev +[alexa docs]: /components/alexa/ +[api docs]: /components/api/ +[auth docs]: /components/auth/ +[binary_sensor.trend docs]: /components/binary_sensor.trend/ +[binary_sensor.wemo docs]: /components/binary_sensor.wemo/ +[binary_sensor.xiaomi_aqara docs]: /components/binary_sensor.xiaomi_aqara/ +[bmw_connected_drive docs]: /components/bmw_connected_drive/ +[calendar.google docs]: /components/calendar.google/ +[camera docs]: /components/camera/ +[camera.generic docs]: /components/camera.generic/ +[camera.push docs]: /components/camera.push/ +[climate docs]: /components/climate/ +[climate.ephember docs]: /components/climate.ephember/ +[climate.generic_thermostat docs]: /components/climate.generic_thermostat/ +[climate.knx docs]: /components/climate.knx/ +[climate.maxcube docs]: /components/climate.maxcube/ +[climate.sensibo docs]: /components/climate.sensibo/ +[config docs]: /components/config/ +[cover.aladdin_connect docs]: /components/cover.aladdin_connect/ +[cover.brunt docs]: /components/cover.brunt/ +[device_tracker docs]: /components/device_tracker/ +[ecovacs docs]: /components/ecovacs/ +[fan.xiaomi_miio docs]: /components/fan.xiaomi_miio/ +[hangouts docs]: /components/hangouts/ +[hassio docs]: /components/hassio/ +[homematic docs]: /components/homematic/ +[http docs]: /components/http/ +[image_processing.opencv docs]: /components/image_processing.opencv/ +[input_datetime docs]: /components/input_datetime/ +[insteon_local docs]: /components/insteon_local/ +[insteon_plm docs]: /components/insteon_plm/ +[konnected docs]: /components/konnected/ +[light.deconz docs]: /components/light.deconz/ +[light.wemo docs]: /components/light.wemo/ +[light.xiaomi_miio docs]: /components/light.xiaomi_miio/ +[lock.bmw_connected_drive docs]: /components/lock.bmw_connected_drive/ +[media_extractor docs]: /components/media_extractor/ +[media_player.frontier_silicon docs]: /components/media_player.frontier_silicon/ +[media_player.mpd docs]: /components/media_player.mpd/ +[media_player.sonos docs]: /components/media_player.sonos/ +[mqtt_eventstream docs]: /components/mqtt_eventstream/ +[mqtt_statestream docs]: /components/mqtt_statestream/ +[notify docs]: /components/notify/ +[onboarding docs]: /components/onboarding/ +[openuv docs]: /components/openuv/ +[panel_custom docs]: /components/panel_custom/ +[remote.xiaomi_miio docs]: /components/remote.xiaomi_miio/ +[sensor.geizhals docs]: /components/sensor.geizhals/ +[sensor.glances docs]: /components/sensor.glances/ +[sensor.netatmo_public docs]: /components/sensor.netatmo_public/ +[sensor.noaa_tides docs]: /components/sensor.noaa_tides/ +[sensor.openuv docs]: /components/sensor.openuv/ +[sensor.scrape docs]: /components/sensor.scrape/ +[sensor.shodan docs]: /components/sensor.shodan/ +[sensor.systemmonitor docs]: /components/sensor.systemmonitor/ +[sensor.sytadin docs]: /components/sensor.sytadin/ +[sensor.worldtidesinfo docs]: /components/sensor.worldtidesinfo/ +[sensor.xiaomi_miio docs]: /components/sensor.xiaomi_miio/ +[sonos docs]: /components/sonos/ +[splunk docs]: /components/splunk/ +[switch.fritzdect docs]: /components/switch.fritzdect/ +[switch.konnected docs]: /components/switch.konnected/ +[switch.wemo docs]: /components/switch.wemo/ +[switch.xiaomi_miio docs]: /components/switch.xiaomi_miio/ +[upnp docs]: /components/upnp/ +[vacuum.ecovacs docs]: /components/vacuum.ecovacs/ +[vacuum.neato docs]: /components/vacuum.neato/ +[vacuum.xiaomi_miio docs]: /components/vacuum.xiaomi_miio/ +[waterfurnace docs]: /components/waterfurnace/ +[websocket_api docs]: /components/websocket_api/ +[wemo docs]: /components/wemo/ From b0a6e824f78f8b15e0808c64853d4fb9f64cdfea Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sat, 25 Aug 2018 11:20:18 +0200 Subject: [PATCH 30/47] Update notes --- source/_posts/2018-08-31-release-77.markdown | 33 ++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/source/_posts/2018-08-31-release-77.markdown b/source/_posts/2018-08-31-release-77.markdown index 85e59ea2228..32d7c5d8eb2 100644 --- a/source/_posts/2018-08-31-release-77.markdown +++ b/source/_posts/2018-08-31-release-77.markdown @@ -19,6 +19,7 @@ Notification drawer for lovelace. Hangouts +Device registry!! ## {% linkable_title New Platforms %} @@ -27,6 +28,7 @@ Hangouts - Add ecovacs component ([@OverloadUT] - [#15520]) ([ecovacs docs]) ([vacuum.ecovacs docs]) (new-platform) - Add support for NOAA tide information (new PR) ([@jcconnell] - [#15947]) ([sensor.noaa_tides docs]) (new-platform) - Hangouts ([@hobbypunk90] - [#16049]) ([hangouts docs]) ([notify docs]) (new-platform) +- Add multi-factor auth module setup flow ([@awarecan] - [#16141]) ([auth docs]) (beta fix) (new-platform) ## {% linkable_title New Features %} @@ -54,6 +56,17 @@ Experiencing issues introduced by this release? Please report them in our [issue - Adds support for routers implementing IGDv2 ([@dgomes] - [#16108]) ([upnp docs]) (breaking change) - Enable auth by default 🙈 ([@balloob] - [#16107]) (breaking change) +## {% linkable_title Beta Fixes %} + +- deCONZ - Support device registry ([@Kane610] - [#16115]) ([deconz docs]) ([binary_sensor.deconz docs]) ([light.deconz docs]) ([sensor.deconz docs]) ([switch.deconz docs]) (beta fix) +- Add multi-factor auth module setup flow ([@awarecan] - [#16141]) ([auth docs]) (beta fix) (new-platform) +- Decouple Konnected entity setup from discovery ([@heythisisnate] - [#16146]) ([konnected docs]) ([switch.konnected docs]) (beta fix) +- Device registry store config entry ([@Kane610] - [#16152]) (beta fix) +- fix error message for cv.matches_regex ([@heythisisnate] - [#16175]) (beta fix) +- Fix hangouts ([@balloob] - [#16180]) ([hangouts docs]) (beta fix) +- Tweak log level for bearer token warning ([@awarecan] - [#16182]) ([http docs]) (beta fix) +- Default load trusted_network auth provider if configured trusted networks ([@awarecan] - [#16184]) (beta fix) + ## {% linkable_title All changes %} - Eph ember support operation modes ([@ttroy50] - [#15820]) ([climate.ephember docs]) @@ -140,6 +153,14 @@ Experiencing issues introduced by this release? Please report them in our [issue - Hangouts localization typo fix ([@armills] - [#16174]) ([hangouts docs]) - deCONZ - Allow sub second light transitions ([@Kane610] - [#16170]) ([light.deconz docs]) - add_devices -> add_entities ([@balloob] - [#16171]) +- deCONZ - Support device registry ([@Kane610] - [#16115]) ([deconz docs]) ([binary_sensor.deconz docs]) ([light.deconz docs]) ([sensor.deconz docs]) ([switch.deconz docs]) (beta fix) +- Add multi-factor auth module setup flow ([@awarecan] - [#16141]) ([auth docs]) (beta fix) (new-platform) +- Decouple Konnected entity setup from discovery ([@heythisisnate] - [#16146]) ([konnected docs]) ([switch.konnected docs]) (beta fix) +- Device registry store config entry ([@Kane610] - [#16152]) (beta fix) +- fix error message for cv.matches_regex ([@heythisisnate] - [#16175]) (beta fix) +- Fix hangouts ([@balloob] - [#16180]) ([hangouts docs]) (beta fix) +- Tweak log level for bearer token warning ([@awarecan] - [#16182]) ([http docs]) (beta fix) +- Default load trusted_network auth provider if configured trusted networks ([@awarecan] - [#16184]) (beta fix) [#14516]: https://github.com/home-assistant/home-assistant/pull/14516 [#14557]: https://github.com/home-assistant/home-assistant/pull/14557 @@ -215,16 +236,24 @@ Experiencing issues introduced by this release? Please report them in our [issue [#16111]: https://github.com/home-assistant/home-assistant/pull/16111 [#16112]: https://github.com/home-assistant/home-assistant/pull/16112 [#16113]: https://github.com/home-assistant/home-assistant/pull/16113 +[#16115]: https://github.com/home-assistant/home-assistant/pull/16115 [#16121]: https://github.com/home-assistant/home-assistant/pull/16121 [#16125]: https://github.com/home-assistant/home-assistant/pull/16125 [#16126]: https://github.com/home-assistant/home-assistant/pull/16126 [#16127]: https://github.com/home-assistant/home-assistant/pull/16127 [#16130]: https://github.com/home-assistant/home-assistant/pull/16130 +[#16141]: https://github.com/home-assistant/home-assistant/pull/16141 +[#16146]: https://github.com/home-assistant/home-assistant/pull/16146 [#16147]: https://github.com/home-assistant/home-assistant/pull/16147 [#16150]: https://github.com/home-assistant/home-assistant/pull/16150 +[#16152]: https://github.com/home-assistant/home-assistant/pull/16152 [#16170]: https://github.com/home-assistant/home-assistant/pull/16170 [#16171]: https://github.com/home-assistant/home-assistant/pull/16171 [#16174]: https://github.com/home-assistant/home-assistant/pull/16174 +[#16175]: https://github.com/home-assistant/home-assistant/pull/16175 +[#16180]: https://github.com/home-assistant/home-assistant/pull/16180 +[#16182]: https://github.com/home-assistant/home-assistant/pull/16182 +[#16184]: https://github.com/home-assistant/home-assistant/pull/16184 [@Alexxander0]: https://github.com/Alexxander0 [@Danielhiversen]: https://github.com/Danielhiversen [@Kane610]: https://github.com/Kane610 @@ -270,6 +299,7 @@ Experiencing issues introduced by this release? Please report them in our [issue [alexa docs]: /components/alexa/ [api docs]: /components/api/ [auth docs]: /components/auth/ +[binary_sensor.deconz docs]: /components/binary_sensor.deconz/ [binary_sensor.trend docs]: /components/binary_sensor.trend/ [binary_sensor.wemo docs]: /components/binary_sensor.wemo/ [binary_sensor.xiaomi_aqara docs]: /components/binary_sensor.xiaomi_aqara/ @@ -287,6 +317,7 @@ Experiencing issues introduced by this release? Please report them in our [issue [config docs]: /components/config/ [cover.aladdin_connect docs]: /components/cover.aladdin_connect/ [cover.brunt docs]: /components/cover.brunt/ +[deconz docs]: /components/deconz/ [device_tracker docs]: /components/device_tracker/ [ecovacs docs]: /components/ecovacs/ [fan.xiaomi_miio docs]: /components/fan.xiaomi_miio/ @@ -314,6 +345,7 @@ Experiencing issues introduced by this release? Please report them in our [issue [openuv docs]: /components/openuv/ [panel_custom docs]: /components/panel_custom/ [remote.xiaomi_miio docs]: /components/remote.xiaomi_miio/ +[sensor.deconz docs]: /components/sensor.deconz/ [sensor.geizhals docs]: /components/sensor.geizhals/ [sensor.glances docs]: /components/sensor.glances/ [sensor.netatmo_public docs]: /components/sensor.netatmo_public/ @@ -327,6 +359,7 @@ Experiencing issues introduced by this release? Please report them in our [issue [sensor.xiaomi_miio docs]: /components/sensor.xiaomi_miio/ [sonos docs]: /components/sonos/ [splunk docs]: /components/splunk/ +[switch.deconz docs]: /components/switch.deconz/ [switch.fritzdect docs]: /components/switch.fritzdect/ [switch.konnected docs]: /components/switch.konnected/ [switch.wemo docs]: /components/switch.wemo/ From ca3ee8c4ea520ca812dd918bad501b8934e7ceef Mon Sep 17 00:00:00 2001 From: Ken Davidson Date: Sat, 25 Aug 2018 06:35:23 -0400 Subject: [PATCH 31/47] Update sensor.noaa_tides.markdown (#6077) Grammar fixes. --- source/_components/sensor.noaa_tides.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/_components/sensor.noaa_tides.markdown b/source/_components/sensor.noaa_tides.markdown index 42441690f92..fca7249529b 100644 --- a/source/_components/sensor.noaa_tides.markdown +++ b/source/_components/sensor.noaa_tides.markdown @@ -14,7 +14,7 @@ logo: noaa.png The `noaa_tides` sensor platform uses details from [NOAA Tides and Currents](https://tidesandcurrents.noaa.gov/api/) to provide information about the prediction for the tides for any location in the United States. -This sensor requires the use of an NOAA station id. Search [NOAA Tide Predictions](https://tidesandcurrents.noaa.gov/tide_predictions.html) to find a location. Use the Id from the search results in your configuration. Alternately, you can determine a station id from a URL. For example, `8721164` in the following URL `https://tidesandcurrents.noaa.gov/noaatidepredictions.html?id=8721164` +This sensor requires the use of a NOAA station ID. Search [NOAA Tide Predictions](https://tidesandcurrents.noaa.gov/tide_predictions.html) to find a location. Use the ID from the search results in your configuration. Alternatively, you can determine a station ID from a URL. For example, `8721164` in the following URL: `https://tidesandcurrents.noaa.gov/noaatidepredictions.html?id=8721164` To use this sensor, add the following to your `configuration.yaml` file: @@ -31,12 +31,12 @@ station_id: required: true type: string name: - description: User supplied sensor name. + description: User-supplied sensor name. required: false default: NOAA Tides. type: string time_zone: - description: User selected timezone. + description: User-selected timezone. required: false default: Local Standard Time/Local Daylight Time. type: list From e133c38491aaaa6487c63f121828f6fb7ea2bbe2 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 26 Aug 2018 21:23:17 +0200 Subject: [PATCH 32/47] Add link to auth docs --- source/_posts/2018-08-31-release-77.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_posts/2018-08-31-release-77.markdown b/source/_posts/2018-08-31-release-77.markdown index 32d7c5d8eb2..affb6e35f3e 100644 --- a/source/_posts/2018-08-31-release-77.markdown +++ b/source/_posts/2018-08-31-release-77.markdown @@ -13,7 +13,7 @@ og_image: /images/blog/2018-08-0.77/components.png -Auth enabled by default ! If you had auth providers configured before, recommended to remove the configuration and start using the default config. +Auth enabled by default ! If you had auth providers configured before, recommended to remove the configuration and start using the default config. [Read the docs](/docs/authentication/) Notification drawer for lovelace. From 48b2dcc45c7ac1e8d3b356841d6406743df2451e Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 26 Aug 2018 22:40:32 +0200 Subject: [PATCH 33/47] Add note about rollback --- source/_posts/2018-08-31-release-77.markdown | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/source/_posts/2018-08-31-release-77.markdown b/source/_posts/2018-08-31-release-77.markdown index affb6e35f3e..897f9856618 100644 --- a/source/_posts/2018-08-31-release-77.markdown +++ b/source/_posts/2018-08-31-release-77.markdown @@ -13,7 +13,11 @@ og_image: /images/blog/2018-08-0.77/components.png -Auth enabled by default ! If you had auth providers configured before, recommended to remove the configuration and start using the default config. [Read the docs](/docs/authentication/) +Auth enabled by default ! If you had auth providers configured before, recommended to remove the configuration and start using the default config. [Read the docs](/docs/authentication/). + +If you were using auth before 0.77: + - Please remove the auth providers from your configuration and switch to the default config + - Due to changing how the home assistant auth provider hashes passwords, you cannot rollback to 76 with auth enabled unless you remove `.storage/auth*.*` and `.storage/hassio` Notification drawer for lovelace. From 05fdd225d71b8dbb964905b0e090083dfe49f65b Mon Sep 17 00:00:00 2001 From: Marcel Hoppe Date: Mon, 27 Aug 2018 09:16:13 +0200 Subject: [PATCH 34/47] Add documentation for hangouts and notify.hangouts components (#6044) * Add documentation for hangouts and notify.hangouts components * use {% configuration %} * name is not required * Update hangouts.markdown remove email and password from config add integrations description * Update hangouts.markdown Add notice for 2fa * Typo * More fixes * Update notify.hangouts.markdown * Update notify.hangouts.markdown add hint to hangouts.conversations * cleaner doc removing name option from conversations entries --- source/_components/hangouts.markdown | 126 ++++++++++++++++++++ source/_components/notify.hangouts.markdown | 52 ++++++++ source/images/supported_brands/hangouts.png | Bin 0 -> 28244 bytes 3 files changed, 178 insertions(+) create mode 100644 source/_components/hangouts.markdown create mode 100644 source/_components/notify.hangouts.markdown create mode 100644 source/images/supported_brands/hangouts.png diff --git a/source/_components/hangouts.markdown b/source/_components/hangouts.markdown new file mode 100644 index 00000000000..ba290e276f1 --- /dev/null +++ b/source/_components/hangouts.markdown @@ -0,0 +1,126 @@ +--- +layout: page +title: "Google Hangouts" +description: "Hangouts chatbot support" +date: 2018-08-18 20:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: hangouts.png +ha_category: Hub +ha_release: 0.77 +--- + +This component allows you to send messages to [Google Hangouts](http://hangouts.google.com) conversations, as well as to react to messages in conversations. Reacting to commands is accomplished by firing an event when one of the configured commands is triggered. + +## {% linkable_title Setup the component via the frontend %} + +Menu: *Configuration* -> *Integrations* + +Fill the form: +* Your **Google Mail Address** and **Password** +* If needed, you will be asked for a 2-factor authorization token + +**IMPORTANT:** If you secured your account with 2 factor authorization: Only verification by app or SMS are supported. There is no support for verification by prompt on your phone. + +The authentication token will be generated and stored internally. + +```yaml +# Example configuration.yaml entry +hangouts: + commands: + - word: testword + conversations: + - id: CONVERSATION_ID1 + - id: CONVERSATION_ID2 + - expression: "My name is (?P.*)" + name: introduction +``` +{% configuration %} +commands: + description: "A list of commands that the bot should listen for. If a command is triggered (via its *word* or *expression*, see below), an event is fired that you can handle using automations. Every command consists of these possible configuration options:" + required: false + type: map + default: empty + keys: + word: + description: "Specifies a word that the bot should listen for. If you specify 'my_command' here, the bot will react to any message starting with 'my_command'." + required: false + type: string + expression: + description: "Specifies a regular expression (in python regexp syntax) that the bot should listen to. The bot will react to any message that matches the regular expression." + required: false + type: string + name: + description: "The name of the command. This will be an attribute of the event that is fired when this command triggers." + required: true + type: string + conversations: + description: "A list of conversations that the bot should listen for this command in. If this is not given, all conversations are used." + required: false + type: [map] + default: empty + keys: + id: + description: "Specifies the id of the conversation. *The conversation id can be obtained from the `hangouts.conversations` entity.*" + required: true + type: string +{% endconfiguration %} + +The conversations has to be precreated, the conversation id can be obtained from the `hangouts.conversations` entity. Make sure to use quotes around the conversation id or alias to escape special characters (`!`, and `#`) in YAML. + +### {% linkable_title Event Data %} + +If a command is triggered, a `hangouts_command` event is fired. The event contains the name of the command in the `command` field. + +If the command is a word command, the `data` field contains a list of the command's arguments, i.e., everything that stood behind the word, split at spaces. If the command is an expression command, the `data` field contains the [group dictionary](https://docs.python.org/3.6/library/re.html?highlight=re#re.match.groupdict) of the regular expression that matched the message. + +There are these additional fields: `conversation_id`, `user_id` and `user_name`. + +### {% linkable_title Comprehensive Configuration Example %} + +```yaml +# The Hangouts component +hangouts: + commands: + - word: testword + conversations: + - name: "someothertest" + - expression: "My name is (?P.*)" + name: introduction + +automation: + - alias: 'React to !testword' + trigger: + platform: event + event_type: hangouts_command + event_data: + command: testword + action: + service: hangouts.send_message + data_template: + target: + - name: "hasstest" + message: + - text: 'It looks like you wrote testword' + - alias: 'React to an introduction' + trigger: + platform: event + event_type: hangouts_command + event_data: + command: introduction + action: + service: hangouts.send_message + data_template: + target: + - id: '{{ trigger.event.data.conversation_id}}' + message: + - text: "Hello {{ trigger.event.data.data.name }}" + +``` + +This configuration will: +- Listen for "testword" in the room "someothertest" (and only) there. + If such a message is encountered, it will answer with "It looks like you wrote testword" into the "hasstest" conversation. +- Listen in all conversations for any message matching "My name is (any name)" and answer with "Hello (the given name)" into the same conversation. diff --git a/source/_components/notify.hangouts.markdown b/source/_components/notify.hangouts.markdown new file mode 100644 index 00000000000..e1dcdf83e54 --- /dev/null +++ b/source/_components/notify.hangouts.markdown @@ -0,0 +1,52 @@ +--- +layout: page +title: "Google Hangouts" +description: "Instructions on how to add Google Hangouts notifications to Home Assistant." +date: 2018-08-18 20:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: hangouts.png +ha_category: Notifications +ha_release: 0.77 +--- + + +The `hangouts` platform allows you to deliver notifications from Home Assistant to [Google Hangouts](http://hangouts.google.com) conversations. Conversations can be both direct as well as group chats. + +## {% linkable_title Configuration %} + +To enable Hangouts notifications in your installation, you first need to configure +the [Hangouts component](/components/hangouts/). Then, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +notify: + - name: NOTIFIER_NAME + platform: hangouts + default_conversations: + - id: CONVERSATION_ID1 + - id: CONVERSATION_ID2 +``` + +{% configuration %} +name: + description: "Setting the optional parameter `name` allows multiple notifiers to be created. The default value is `notify`. The notifier will bind to the service `notify.NOTIFIER_NAME`." + required: false + type: string +default_conversations: + description: "The conversations all messages will be sent to, when no other target is given." + required: true + type: [map] + keys: + id: + description: "Specifies the id of the conversation. *The conversation id can be obtained from the `hangouts.conversations` entity.*" + required: true + type: string +{% endconfiguration %} + +The conversations has to be precreated, the conversation id can be obtained from the `hangouts.conversations` entity. Make sure to use quotes around the conversation id or alias to escape special characters (`!`, and `#`) in YAML. + +To use notifications, please see the [getting started with automation page](/getting-started/automation/). + diff --git a/source/images/supported_brands/hangouts.png b/source/images/supported_brands/hangouts.png new file mode 100644 index 0000000000000000000000000000000000000000..30df744826caa772ffa31b474c00d4157ef87bec GIT binary patch literal 28244 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 e1Q>zyhrs{)!kw1$S$ Date: Mon, 27 Aug 2018 00:23:08 -0700 Subject: [PATCH 35/47] Add TOTP MFA docs (#6089) * Add TOTP MFA docs * Remove configuration options --- .../authentication/multi-factor-auth.markdown | 49 +++++++++++++++++-- .../_docs/authentication/providers.markdown | 8 ++- 2 files changed, 52 insertions(+), 5 deletions(-) diff --git a/source/_docs/authentication/multi-factor-auth.markdown b/source/_docs/authentication/multi-factor-auth.markdown index 751f2010569..fd229645c24 100644 --- a/source/_docs/authentication/multi-factor-auth.markdown +++ b/source/_docs/authentication/multi-factor-auth.markdown @@ -1,7 +1,7 @@ --- layout: page title: "Multi-factor authentication" -description: "Guide on configuring different multi-factor authentication providers." +description: "Guide on configuring different multi-factor authentication modules." date: 2018-08-23 09:40 redirect_from: /components/auth/ sidebar: true @@ -14,6 +14,49 @@ footer: true This is an advanced feature. If misconfigured, you will not be able to access Home Assistant anymore!

    -Besides the normal authentication providers, it's also possible to configure multi-factor authentication providers. These authentication providers will require the user to solve a second challenge besides just logging in. The idea is that you ask the user for something they know, their username/password, and something they have, like a time-based authentication token from their phone. +Besides the authentication providers, it's also possible to configure multi-factor authentication modules. These authentication modules will require the user to solve a second challenge besides just logging in. The idea is that you ask the user for something they know, their username/password, and something they have, like a time-based authentication token from their phone. -This feature is currently a work in progress and no configurable multi-factor authentication providers are currently available. +Multi-factor authentication module can be used mixed-match with authentication providers. After normal authentication provider validation, the login flow will ask user for addional challenge if there are multi-factor authentication modules enabled for this user. If more than one mutli-factor authentication module enabled, user can select one of them during the login. + +Multi-factor authentication module has to be enabled for user before it can be used in the login process, user can go to profile page enable it by himself. + +## {% linkable_title Configuring mutli-factor authentication modules %} + +

    +By configuring your own instead of using the default configuration, you take full responsibility for the authentication of the system. +

    + +Multi-factor authentication modules are configured in your `configuration.yaml` under the `homeassistant:` block: + +```yaml +homeassistant: + auth_mfa_modules: + - type: totp +``` + +## {% linkable_title Available mutli-factor authentication modules %} + +Below is a list of currently available auth providers. + +### {% linkable_title Time-based One-Time Password mutli-factor authentication module %} + +[Time-based One-Time Password](https://en.wikipedia.org/wiki/Time-based_One-time_Password_algorithm) is widely adopted in modern authencation system, it combines a secret key with the current timestamp using a cryptographic hash function to generate a one-time password. Whoever possessed the secret key will get same one-time password in certain time period. By verifying that password, Home Assistant knows the user have the right secrt key. + +When try to set up TOTP module, a QR code will show up, user can scan it by an authenticator app, or set it up manauly using the code showed in UI. After setup, user need to input a six digit number generate in the autendicator app to verify the setup is good. If the verificaiton keep falling, you need to check whether the clock on Home Asistant is accurate. + +There are several authenctior apps on the market, we recommend either [Google Authenticator](https://support.google.com/accounts/answer/1066447) or [Authy](https://authy.com/) + +

    +Please treat the secret key like a password, never exposure it to others. +

    + + +By default one TOTP multi-factor named "Authenticator app" will be auto loaded if no `auth_mfa_modules` config section defined in `configuration.yaml`. + +Example of configuration + +```yaml +homeassistant: + auth_mfa_modules: + - type: totp +``` \ No newline at end of file diff --git a/source/_docs/authentication/providers.markdown b/source/_docs/authentication/providers.markdown index 1a190543355..a2949c2f557 100644 --- a/source/_docs/authentication/providers.markdown +++ b/source/_docs/authentication/providers.markdown @@ -51,9 +51,13 @@ homeassistant: - type: homeassistant ``` -### {% linkable_title Trusted Network %} +### {% linkable_title Trusted Networks %} -With the trusted network auth provider you can whitelist an IP range for which no authentication will be required. The user will be prompted to pick a user to log in as. +With the trusted networks auth provider you can whitelist an IP range for which no authentication will be required. The user will be prompted to pick a user to log in as. + +

    +The [multi-factor autentication module](multi-factor-auth) will not participate in login process by using this auth provider. +

    ```yaml homeassistant: From 7829920550b4ae6bc9eaf3031cf0458fbdcb2863 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 27 Aug 2018 23:01:02 +0200 Subject: [PATCH 36/47] Update blogpost --- source/_posts/2018-08-31-release-77.markdown | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/_posts/2018-08-31-release-77.markdown b/source/_posts/2018-08-31-release-77.markdown index 897f9856618..c211f953799 100644 --- a/source/_posts/2018-08-31-release-77.markdown +++ b/source/_posts/2018-08-31-release-77.markdown @@ -15,10 +15,13 @@ og_image: /images/blog/2018-08-0.77/components.png Auth enabled by default ! If you had auth providers configured before, recommended to remove the configuration and start using the default config. [Read the docs](/docs/authentication/). +You might still have applications that will reach Home Assistant using the API password. This will cause a warning to be printed. If possible, ask the applications developer to transition to use the [OAuth2](https://developers.home-assistant.io/docs/en/auth_api.html) to obtain a token to communicate with Home Assistant. For non-interactive scripts or other applications that are unable to update, we are planning to introduce a migration path for components to adopt url specific auth tokens and also introduce long lived access tokens to replace API passwords. A list of impacted components can be found [here](https://github.com/home-assistant/home-assistant/issues/15376#issuecomment-415890552). + If you were using auth before 0.77: - Please remove the auth providers from your configuration and switch to the default config - Due to changing how the home assistant auth provider hashes passwords, you cannot rollback to 76 with auth enabled unless you remove `.storage/auth*.*` and `.storage/hassio` + Notification drawer for lovelace. Hangouts From ba16ee36f27bbff7a8430d35071cdf6df45e526b Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 28 Aug 2018 00:41:44 +0200 Subject: [PATCH 37/47] Mention iOS app --- source/_posts/2018-08-31-release-77.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_posts/2018-08-31-release-77.markdown b/source/_posts/2018-08-31-release-77.markdown index c211f953799..969a1e2890b 100644 --- a/source/_posts/2018-08-31-release-77.markdown +++ b/source/_posts/2018-08-31-release-77.markdown @@ -21,6 +21,8 @@ If you were using auth before 0.77: - Please remove the auth providers from your configuration and switch to the default config - Due to changing how the home assistant auth provider hashes passwords, you cannot rollback to 76 with auth enabled unless you remove `.storage/auth*.*` and `.storage/hassio` +The iOS app will soon be updated to work with the new auth. It's already in testing. The old app will continue to work with the legacy API password support. It will require a second login when using the webview. + Notification drawer for lovelace. From 0902b3b9cfaa4a6bd0c25bae9a695e5e3972bffc Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 28 Aug 2018 00:46:57 +0200 Subject: [PATCH 38/47] Update notes --- source/_posts/2018-08-31-release-77.markdown | 40 ++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/source/_posts/2018-08-31-release-77.markdown b/source/_posts/2018-08-31-release-77.markdown index 969a1e2890b..0e070ccc489 100644 --- a/source/_posts/2018-08-31-release-77.markdown +++ b/source/_posts/2018-08-31-release-77.markdown @@ -38,6 +38,7 @@ Device registry!! - Add support for NOAA tide information (new PR) ([@jcconnell] - [#15947]) ([sensor.noaa_tides docs]) (new-platform) - Hangouts ([@hobbypunk90] - [#16049]) ([hangouts docs]) ([notify docs]) (new-platform) - Add multi-factor auth module setup flow ([@awarecan] - [#16141]) ([auth docs]) (beta fix) (new-platform) +- rewrite hangouts to use intents instead of commands ([@hobbypunk90] - [#16220]) ([conversation docs]) ([hangouts docs]) (beta fix) (new-platform) ## {% linkable_title New Features %} @@ -75,6 +76,17 @@ Experiencing issues introduced by this release? Please report them in our [issue - Fix hangouts ([@balloob] - [#16180]) ([hangouts docs]) (beta fix) - Tweak log level for bearer token warning ([@awarecan] - [#16182]) ([http docs]) (beta fix) - Default load trusted_network auth provider if configured trusted networks ([@awarecan] - [#16184]) (beta fix) +- Replace pbkdf2 with bcrypt ([@Eriner] - [#16071]) (beta fix) +- Add Time-based Onetime Password Multi-factor Authentication Module ([@awarecan] - [#16129]) (beta fix) +- Handle exception from pillow ([@PhracturedBlue] - [#16190]) ([camera.proxy docs]) (beta fix) +- remove hangouts.users state, simplifies hangouts.conversations ([@hobbypunk90] - [#16191]) ([hangouts docs]) (beta fix) +- Update aiohttp to version 3.4.0. ([@Swamp-Ig] - [#16198]) (beta fix) +- Revert changes to platforms using self.device ([@Kane610] - [#16209]) (beta fix) +- homematic: Make device avilable again when UNREACH becomes False ([@klada] - [#16202]) ([homematic docs]) (beta fix) +- Change auth warning ([@balloob] - [#16216]) ([http docs]) (beta fix) +- rewrite hangouts to use intents instead of commands ([@hobbypunk90] - [#16220]) ([conversation docs]) ([hangouts docs]) (beta fix) (new-platform) +- Fix device telldus ([@balloob] - [#16224]) ([tellduslive docs]) (beta fix) +- Update trusted networks flow ([@balloob] - [#16227]) (beta fix) ## {% linkable_title All changes %} @@ -170,6 +182,17 @@ Experiencing issues introduced by this release? Please report them in our [issue - Fix hangouts ([@balloob] - [#16180]) ([hangouts docs]) (beta fix) - Tweak log level for bearer token warning ([@awarecan] - [#16182]) ([http docs]) (beta fix) - Default load trusted_network auth provider if configured trusted networks ([@awarecan] - [#16184]) (beta fix) +- Replace pbkdf2 with bcrypt ([@Eriner] - [#16071]) (beta fix) +- Add Time-based Onetime Password Multi-factor Authentication Module ([@awarecan] - [#16129]) (beta fix) +- Handle exception from pillow ([@PhracturedBlue] - [#16190]) ([camera.proxy docs]) (beta fix) +- remove hangouts.users state, simplifies hangouts.conversations ([@hobbypunk90] - [#16191]) ([hangouts docs]) (beta fix) +- Update aiohttp to version 3.4.0. ([@Swamp-Ig] - [#16198]) (beta fix) +- Revert changes to platforms using self.device ([@Kane610] - [#16209]) (beta fix) +- homematic: Make device avilable again when UNREACH becomes False ([@klada] - [#16202]) ([homematic docs]) (beta fix) +- Change auth warning ([@balloob] - [#16216]) ([http docs]) (beta fix) +- rewrite hangouts to use intents instead of commands ([@hobbypunk90] - [#16220]) ([conversation docs]) ([hangouts docs]) (beta fix) (new-platform) +- Fix device telldus ([@balloob] - [#16224]) ([tellduslive docs]) (beta fix) +- Update trusted networks flow ([@balloob] - [#16227]) (beta fix) [#14516]: https://github.com/home-assistant/home-assistant/pull/14516 [#14557]: https://github.com/home-assistant/home-assistant/pull/14557 @@ -226,6 +249,7 @@ Experiencing issues introduced by this release? Please report them in our [issue [#16049]: https://github.com/home-assistant/home-assistant/pull/16049 [#16060]: https://github.com/home-assistant/home-assistant/pull/16060 [#16065]: https://github.com/home-assistant/home-assistant/pull/16065 +[#16071]: https://github.com/home-assistant/home-assistant/pull/16071 [#16077]: https://github.com/home-assistant/home-assistant/pull/16077 [#16079]: https://github.com/home-assistant/home-assistant/pull/16079 [#16083]: https://github.com/home-assistant/home-assistant/pull/16083 @@ -250,6 +274,7 @@ Experiencing issues introduced by this release? Please report them in our [issue [#16125]: https://github.com/home-assistant/home-assistant/pull/16125 [#16126]: https://github.com/home-assistant/home-assistant/pull/16126 [#16127]: https://github.com/home-assistant/home-assistant/pull/16127 +[#16129]: https://github.com/home-assistant/home-assistant/pull/16129 [#16130]: https://github.com/home-assistant/home-assistant/pull/16130 [#16141]: https://github.com/home-assistant/home-assistant/pull/16141 [#16146]: https://github.com/home-assistant/home-assistant/pull/16146 @@ -263,11 +288,23 @@ Experiencing issues introduced by this release? Please report them in our [issue [#16180]: https://github.com/home-assistant/home-assistant/pull/16180 [#16182]: https://github.com/home-assistant/home-assistant/pull/16182 [#16184]: https://github.com/home-assistant/home-assistant/pull/16184 +[#16190]: https://github.com/home-assistant/home-assistant/pull/16190 +[#16191]: https://github.com/home-assistant/home-assistant/pull/16191 +[#16198]: https://github.com/home-assistant/home-assistant/pull/16198 +[#16202]: https://github.com/home-assistant/home-assistant/pull/16202 +[#16209]: https://github.com/home-assistant/home-assistant/pull/16209 +[#16216]: https://github.com/home-assistant/home-assistant/pull/16216 +[#16220]: https://github.com/home-assistant/home-assistant/pull/16220 +[#16224]: https://github.com/home-assistant/home-assistant/pull/16224 +[#16227]: https://github.com/home-assistant/home-assistant/pull/16227 [@Alexxander0]: https://github.com/Alexxander0 [@Danielhiversen]: https://github.com/Danielhiversen +[@Eriner]: https://github.com/Eriner [@Kane610]: https://github.com/Kane610 [@MartinHjelmare]: https://github.com/MartinHjelmare [@OverloadUT]: https://github.com/OverloadUT +[@PhracturedBlue]: https://github.com/PhracturedBlue +[@Swamp-Ig]: https://github.com/Swamp-Ig [@TimBailey-pnk]: https://github.com/TimBailey-pnk [@amelchio]: https://github.com/amelchio [@appzer]: https://github.com/appzer @@ -316,6 +353,7 @@ Experiencing issues introduced by this release? Please report them in our [issue [calendar.google docs]: /components/calendar.google/ [camera docs]: /components/camera/ [camera.generic docs]: /components/camera.generic/ +[camera.proxy docs]: /components/camera.proxy/ [camera.push docs]: /components/camera.push/ [climate docs]: /components/climate/ [climate.ephember docs]: /components/climate.ephember/ @@ -324,6 +362,7 @@ Experiencing issues introduced by this release? Please report them in our [issue [climate.maxcube docs]: /components/climate.maxcube/ [climate.sensibo docs]: /components/climate.sensibo/ [config docs]: /components/config/ +[conversation docs]: /components/conversation/ [cover.aladdin_connect docs]: /components/cover.aladdin_connect/ [cover.brunt docs]: /components/cover.brunt/ [deconz docs]: /components/deconz/ @@ -373,6 +412,7 @@ Experiencing issues introduced by this release? Please report them in our [issue [switch.konnected docs]: /components/switch.konnected/ [switch.wemo docs]: /components/switch.wemo/ [switch.xiaomi_miio docs]: /components/switch.xiaomi_miio/ +[tellduslive docs]: /components/tellduslive/ [upnp docs]: /components/upnp/ [vacuum.ecovacs docs]: /components/vacuum.ecovacs/ [vacuum.neato docs]: /components/vacuum.neato/ From 40f8fd1b4787765ab28b1b57c5527192efa4393b Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 29 Aug 2018 10:18:15 +0200 Subject: [PATCH 39/47] Update screenshots --- source/_docs/authentication.markdown | 8 +++++--- source/images/docs/authentication/login.png | Bin 38191 -> 22078 bytes source/images/docs/authentication/mfa.png | Bin 0 -> 44484 bytes 3 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 source/images/docs/authentication/mfa.png diff --git a/source/_docs/authentication.markdown b/source/_docs/authentication.markdown index 9ebb653c51a..e32349a9693 100644 --- a/source/_docs/authentication.markdown +++ b/source/_docs/authentication.markdown @@ -28,10 +28,12 @@ When logging in, make sure that the URL in the URL bar is showing the address of ## {% linkable_title Profile %} -Once you're logged in, you can access the profile page to change your user preferences. Here you can change your preferred language or password. You can also log out. You can access the profile page by clicking on your user badge in the sidebar. +Once you're logged in, you can access the profile page by clicking on the badge next to the Home Assistant title in the sidebar. Here you can change your preferred language or change your password. You can also log out. Screenshot of the profile page -## {% linkable_title Multi-factor authentication %} (soon) +## {% linkable_title Multi-factor authentication %} -As a user, you can setup multi-factor authentication like time-based one-time passwords. This is an extra challenge that you have to solve after you finish your login. You will be able to set up these challenges from the profile page once you're logged in. +As a user, you can setup multi-factor authentication with time-based one-time passwords. This is an extra challenge that you have to solve after you finish your login. You will be able to set up these challenges from the profile page once you're logged in. + +Screenshot of setting up multi-factor authentication diff --git a/source/images/docs/authentication/login.png b/source/images/docs/authentication/login.png index cca95180f6c3900fdab062a5c7d63189ba852933..e1446748c2eb101cd1d452aa3d3f2255b2faedf9 100644 GIT binary patch literal 22078 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
    `zDboHhb>bCFPIsbxcPyspf}q4 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 s!(PgKBkAHyJ Date: Wed, 29 Aug 2018 11:55:21 +0200 Subject: [PATCH 40/47] Update blog post --- .../_components/binary_sensor.wemo.markdown | 20 ++++ source/_posts/2018-08-31-release-77.markdown | 100 +++++++++++------- source/images/blog/2018-08-0.77/social.png | Bin 0 -> 29960 bytes 3 files changed, 84 insertions(+), 36 deletions(-) create mode 100644 source/_components/binary_sensor.wemo.markdown create mode 100644 source/images/blog/2018-08-0.77/social.png diff --git a/source/_components/binary_sensor.wemo.markdown b/source/_components/binary_sensor.wemo.markdown new file mode 100644 index 00000000000..9b304f5fc61 --- /dev/null +++ b/source/_components/binary_sensor.wemo.markdown @@ -0,0 +1,20 @@ +--- +layout: page +title: "Belkin WeMo Binary Sensors" +description: "Instructions on how to integrate Belkin WeMo binary sensors into Home Assistant." +date: 2016-02-20 00:45 +sidebar: true +comments: false +sharing: true +footer: true +logo: belkin_wemo.png +ha_category: Binary Sensor +ha_iot_class: "Local Push" +ha_release: 0.14 +--- + +The `wemo` platform allows you to integrate your Belkin WeMo Binary Sensor from within Home Assistant. + +They will be automatically discovered if the discovery component is enabled. + +For more configuration information see the [WeMo component](/components/wemo/) documentation. diff --git a/source/_posts/2018-08-31-release-77.markdown b/source/_posts/2018-08-31-release-77.markdown index 0e070ccc489..2e7ac236fa5 100644 --- a/source/_posts/2018-08-31-release-77.markdown +++ b/source/_posts/2018-08-31-release-77.markdown @@ -1,35 +1,43 @@ --- layout: post -title: "0.77: TODO - UPDATE DATE" -description: "" -date: 2018-08-24 00:01:00 -date_formatted: "August 31, 2018" +title: "0.77: Authentication system + Hangouts bot" +description: "The new authentication system is live! Chat on hangouts! " +date: 2018-08-29 00:01:00 +date_formatted: "August 29, 2018" author: Paulus Schoutsen author_twitter: balloob comments: true categories: Release-Notes -og_image: /images/blog/2018-08-0.77/components.png +og_image: /images/blog/2018-08-0.77/social.png --- - +
    + +
    -Auth enabled by default ! If you had auth providers configured before, recommended to remove the configuration and start using the default config. [Read the docs](/docs/authentication/). +It's time for a great new release and it includes a big change: the new [authentication system](/docs/authentication/) has been activated! We've worked very hard on this for the last couple of months to make the transition as smooth as possible. Updating to this release is a non-breaking change (unless you had no API password configured). As can be seen in the video above, when you start Home Assistant after the update, you will be presented with our new onboarding flow. This will ask you to create a new account after which you will be able to log in to Home Assistant. -You might still have applications that will reach Home Assistant using the API password. This will cause a warning to be printed. If possible, ask the applications developer to transition to use the [OAuth2](https://developers.home-assistant.io/docs/en/auth_api.html) to obtain a token to communicate with Home Assistant. For non-interactive scripts or other applications that are unable to update, we are planning to introduce a migration path for components to adopt url specific auth tokens and also introduce long lived access tokens to replace API passwords. A list of impacted components can be found [here](https://github.com/home-assistant/home-assistant/issues/15376#issuecomment-415890552). +Once logged in, you will have access to the following new features: -If you were using auth before 0.77: - - Please remove the auth providers from your configuration and switch to the default config - - Due to changing how the home assistant auth provider hashes passwords, you cannot rollback to 76 with auth enabled unless you remove `.storage/auth*.*` and `.storage/hassio` + - Change your password + - Configure multifactor authentication (TOTP) + - Manage other users (limited to account created during onboarding) -The iOS app will soon be updated to work with the new auth. It's already in testing. The old app will continue to work with the legacy API password support. It will require a second login when using the webview. +Although it's possible to configure authentication, we stronlgy recommend to stick with the default authentication configuration. If you had auth providers configured in a previous Home Assistant release, we recommend to remove the configuration and start using the default. +It will take some time before all of the Home Assistant ecosystem has been migrated over to the new auth system. Home Assistant will print a warning whenever an application connects to Home Assistant with the legacy authentication. This will help users notify the application developers to transition to use the new [OAuth2](https://developers.home-assistant.io/docs/en/auth_api.html) authentication. For non-interactive scripts or other applications that are unable to update, we are planning to introduce a migration path for components to adopt url specific auth tokens and also introduce long lived access tokens to replace API passwords. A list of impacted components can be found [here](https://github.com/home-assistant/home-assistant/issues/15376#issuecomment-415890552). -Notification drawer for lovelace. +The iOS app will soon be updated to work with the new auth. It's already in testing. The old app will continue to work with the legacy API password support. It will however require a second login when using the webview. -Hangouts +I want to say a biiiig thank you to all the people that have been involved in the development and testing of the new authentication system. It's been a big project and it's been great to see how we, as a community, have rallied together to tackle it. Especially a big shout out to [@awarecan]. -Device registry!! +#### {% linkable_title Hangouts %} +And that's not it ! [@hobbypunk90] has contributed a new integration for [Google Hangouts][hangouts docs]. You can send messages but can also configure intents to handle incoming messages from specific people. Very cool! + +#### {% linkable_title Lovelace %} + +You didn't think we would forget about Lovelace, did you? This release include a new notification drawer thanks to [@jeradM]. It will collect all persistent notifications and configurator entities and shows it in a new sidebar toggleable from the toolbar. ## {% linkable_title New Platforms %} @@ -37,12 +45,6 @@ Device registry!! - Add ecovacs component ([@OverloadUT] - [#15520]) ([ecovacs docs]) ([vacuum.ecovacs docs]) (new-platform) - Add support for NOAA tide information (new PR) ([@jcconnell] - [#15947]) ([sensor.noaa_tides docs]) (new-platform) - Hangouts ([@hobbypunk90] - [#16049]) ([hangouts docs]) ([notify docs]) (new-platform) -- Add multi-factor auth module setup flow ([@awarecan] - [#16141]) ([auth docs]) (beta fix) (new-platform) -- rewrite hangouts to use intents instead of commands ([@hobbypunk90] - [#16220]) ([conversation docs]) ([hangouts docs]) (beta fix) (new-platform) - -## {% linkable_title New Features %} - -- Add trusted networks auth provider ([@awarecan] - [#15812]) ([auth docs]) ([http docs]) ([websocket_api docs]) (breaking change) (new-feature) ## {% linkable_title If you need help... %} @@ -56,20 +58,21 @@ Experiencing issues introduced by this release? Please report them in our [issue ## {% linkable_title Breaking Changes %} -- Allow wait template to run the remainder of the script ([@lhovo] - [#15836]) (breaking change) -- Add trusted networks auth provider ([@awarecan] - [#15812]) ([auth docs]) ([http docs]) ([websocket_api docs]) (breaking change) (new-feature) -- Update Xiaomi Vacuum to new StateVacuumDevice ([@cnrd] - [#15643]) (breaking change) -- Update neato to support new StateVacuumDevice ([@dshokouhi] - [#16035]) ([vacuum.neato docs]) (breaking change) -- Remove homeassistant.remote ([@balloob] - [#16099]) ([api docs]) ([http docs]) ([mqtt_eventstream docs]) ([mqtt_statestream docs]) ([notify docs]) ([splunk docs]) ([websocket_api docs]) (breaking change) -- Merge insteon_plm and insteon_local to insteon component ([@teharris1] - [#16102]) (breaking change) +- Enable auth by default 🙈. It is no longer possible to access Home Assistant without authentication ([@balloob] - [#16107]) (breaking change) +- It's no longer possible to use a trusted network to connect to the websocket API. You need to get a token and use that to connect. ([@awarecan] - [#15812]) ([auth docs]) ([http docs]) ([websocket_api docs]) (breaking change) +- Script Syntax: The wait template will now continue to run the remainder of the script on timeout, the original functionality can be gained by setting `continue_on_timeout: false`. Allow wait template to run the remainder of the script ([@lhovo] - [#15836]) (breaking change) +- Update Xiaomi Vacuum to new StateVacuumDevice changed some services: `turn_on` -> `start`, `turn_off` -> `return_to_dock`, `toggle` has been removed. States 'on' and 'off' will also no longer be used. ([@cnrd] - [#15643]) (breaking change) +- Update neato to support new StateVacuumDevice changed some services: `turn_on` -> `start`, `turn_off` -> `return_to_dock`, `toggle` has been removed. States 'on' and 'off' will also no longer be used. ([@dshokouhi] - [#16035]) ([vacuum.neato docs]) (breaking change) +- The previously deprecated package `homeassistant.remote` has been removed. ([@balloob] - [#16099]) ([api docs]) ([http docs]) ([mqtt_eventstream docs]) ([mqtt_statestream docs]) ([notify docs]) ([splunk docs]) ([websocket_api docs]) (breaking change) +- Merge `insteon_plm` and `insteon_local` components to insteon component ([@teharris1] - [#16102]) (breaking change) - Remove unit_of_measurement from climate entities ([@jeradM] - [#16012]) ([climate docs]) ([climate.generic_thermostat docs]) ([climate.knx docs]) ([climate.maxcube docs]) ([climate.sensibo docs]) (breaking change) -- Adds support for routers implementing IGDv2 ([@dgomes] - [#16108]) ([upnp docs]) (breaking change) -- Enable auth by default 🙈 ([@balloob] - [#16107]) (breaking change) +- Upnp component no longer enables port mapping by default ([@dgomes] - [#16108]) ([upnp docs]) (breaking change) +- The entity registry yaml file has been removed. It is now stored inside `.storage` and should only be managed via the UI ([@balloob] - [#16018]) ## {% linkable_title Beta Fixes %} - deCONZ - Support device registry ([@Kane610] - [#16115]) ([deconz docs]) ([binary_sensor.deconz docs]) ([light.deconz docs]) ([sensor.deconz docs]) ([switch.deconz docs]) (beta fix) -- Add multi-factor auth module setup flow ([@awarecan] - [#16141]) ([auth docs]) (beta fix) (new-platform) +- Add multi-factor auth module setup flow ([@awarecan] - [#16141]) ([auth docs]) (beta fix) - Decouple Konnected entity setup from discovery ([@heythisisnate] - [#16146]) ([konnected docs]) ([switch.konnected docs]) (beta fix) - Device registry store config entry ([@Kane610] - [#16152]) (beta fix) - fix error message for cv.matches_regex ([@heythisisnate] - [#16175]) (beta fix) @@ -84,9 +87,17 @@ Experiencing issues introduced by this release? Please report them in our [issue - Revert changes to platforms using self.device ([@Kane610] - [#16209]) (beta fix) - homematic: Make device avilable again when UNREACH becomes False ([@klada] - [#16202]) ([homematic docs]) (beta fix) - Change auth warning ([@balloob] - [#16216]) ([http docs]) (beta fix) -- rewrite hangouts to use intents instead of commands ([@hobbypunk90] - [#16220]) ([conversation docs]) ([hangouts docs]) (beta fix) (new-platform) +- rewrite hangouts to use intents instead of commands ([@hobbypunk90] - [#16220]) ([conversation docs]) ([hangouts docs]) (beta fix) - Fix device telldus ([@balloob] - [#16224]) ([tellduslive docs]) (beta fix) - Update trusted networks flow ([@balloob] - [#16227]) (beta fix) +- Fix hangouts ([@balloob] - [#16232]) ([hangouts docs]) (beta fix) +- Warning missed a space ([@balloob] - [#16233]) ([http docs]) (beta fix) +- Package loadable: compare case insensitive ([@balloob] - [#16234]) (beta fix) +- Avoid insecure pycryptodome ([@balloob] - [#16238]) (beta fix) +- Change log level to error when auth provider failed loading ([@awarecan] - [#16235]) (beta fix) +- Blow up startup if init auth providers or modules failed ([@awarecan] - [#16240]) (beta fix) +- Tweak MFA login flow ([@awarecan] - [#16254]) (beta fix) +- def device shouldnt call it self but self._device ([@Kane610] - [#16255]) ([media_player.plex docs]) (beta fix) ## {% linkable_title All changes %} @@ -95,7 +106,7 @@ Experiencing issues introduced by this release? Please report them in our [issue - Fix magic cube support of the Aqara LAN Protocol V2 ([@syssi] - [#15940]) ([binary_sensor.xiaomi_aqara docs]) - Upgrade beautifulsoup4 to 4.6.3 ([@fabaff] - [#15946]) ([device_tracker docs]) ([sensor.geizhals docs]) ([sensor.scrape docs]) ([sensor.sytadin docs]) - Allow wait template to run the remainder of the script ([@lhovo] - [#15836]) (breaking change) -- Add trusted networks auth provider ([@awarecan] - [#15812]) ([auth docs]) ([http docs]) ([websocket_api docs]) (breaking change) (new-feature) +- Add trusted networks auth provider ([@awarecan] - [#15812]) ([auth docs]) ([http docs]) ([websocket_api docs]) (breaking change) - Add monitored conditions for Unifi device_tracker ([@cgarwood] - [#15888]) ([device_tracker docs]) - Netatmo public ([@colinfrei] - [#15684]) ([sensor.netatmo_public docs]) (new-platform) - Update Xiaomi Vacuum to new StateVacuumDevice ([@cnrd] - [#15643]) (breaking change) @@ -119,7 +130,7 @@ Experiencing issues introduced by this release? Please report them in our [issue - Fix check config packages key error ([@MartinHjelmare] - [#15840]) - Update SoCo to 0.16 ([@amelchio] - [#16007]) ([sonos docs]) ([media_player.sonos docs]) - Upgrade sendgrid to 5.5.0 ([@fabaff] - [#16021]) ([notify docs]) -- Split out storage delay save ([@balloob] - [#16017]) ([hassio docs]) ([onboarding docs]) +- Split out storage delay save ([@balloob] - [#16017]) ([hassio docs]) - Disable assuming Optional type for values with None default ([@scop] - [#16029]) - Update RitAssist to support maximum speed and current address ([@depl0y] - [#16037]) ([device_tracker docs]) - Handle missing mpd capabilities ([@logic] - [#15945]) ([media_player.mpd docs]) @@ -175,7 +186,7 @@ Experiencing issues introduced by this release? Please report them in our [issue - deCONZ - Allow sub second light transitions ([@Kane610] - [#16170]) ([light.deconz docs]) - add_devices -> add_entities ([@balloob] - [#16171]) - deCONZ - Support device registry ([@Kane610] - [#16115]) ([deconz docs]) ([binary_sensor.deconz docs]) ([light.deconz docs]) ([sensor.deconz docs]) ([switch.deconz docs]) (beta fix) -- Add multi-factor auth module setup flow ([@awarecan] - [#16141]) ([auth docs]) (beta fix) (new-platform) +- Add multi-factor auth module setup flow ([@awarecan] - [#16141]) ([auth docs]) (beta fix) - Decouple Konnected entity setup from discovery ([@heythisisnate] - [#16146]) ([konnected docs]) ([switch.konnected docs]) (beta fix) - Device registry store config entry ([@Kane610] - [#16152]) (beta fix) - fix error message for cv.matches_regex ([@heythisisnate] - [#16175]) (beta fix) @@ -190,9 +201,17 @@ Experiencing issues introduced by this release? Please report them in our [issue - Revert changes to platforms using self.device ([@Kane610] - [#16209]) (beta fix) - homematic: Make device avilable again when UNREACH becomes False ([@klada] - [#16202]) ([homematic docs]) (beta fix) - Change auth warning ([@balloob] - [#16216]) ([http docs]) (beta fix) -- rewrite hangouts to use intents instead of commands ([@hobbypunk90] - [#16220]) ([conversation docs]) ([hangouts docs]) (beta fix) (new-platform) +- rewrite hangouts to use intents instead of commands ([@hobbypunk90] - [#16220]) ([conversation docs]) ([hangouts docs]) (beta fix) - Fix device telldus ([@balloob] - [#16224]) ([tellduslive docs]) (beta fix) - Update trusted networks flow ([@balloob] - [#16227]) (beta fix) +- Fix hangouts ([@balloob] - [#16232]) ([hangouts docs]) (beta fix) +- Warning missed a space ([@balloob] - [#16233]) ([http docs]) (beta fix) +- Package loadable: compare case insensitive ([@balloob] - [#16234]) (beta fix) +- Avoid insecure pycryptodome ([@balloob] - [#16238]) (beta fix) +- Change log level to error when auth provider failed loading ([@awarecan] - [#16235]) (beta fix) +- Blow up startup if init auth providers or modules failed ([@awarecan] - [#16240]) (beta fix) +- Tweak MFA login flow ([@awarecan] - [#16254]) (beta fix) +- def device shouldnt call it self but self._device ([@Kane610] - [#16255]) ([media_player.plex docs]) (beta fix) [#14516]: https://github.com/home-assistant/home-assistant/pull/14516 [#14557]: https://github.com/home-assistant/home-assistant/pull/14557 @@ -297,7 +316,16 @@ Experiencing issues introduced by this release? Please report them in our [issue [#16220]: https://github.com/home-assistant/home-assistant/pull/16220 [#16224]: https://github.com/home-assistant/home-assistant/pull/16224 [#16227]: https://github.com/home-assistant/home-assistant/pull/16227 +[#16232]: https://github.com/home-assistant/home-assistant/pull/16232 +[#16233]: https://github.com/home-assistant/home-assistant/pull/16233 +[#16234]: https://github.com/home-assistant/home-assistant/pull/16234 +[#16235]: https://github.com/home-assistant/home-assistant/pull/16235 +[#16238]: https://github.com/home-assistant/home-assistant/pull/16238 +[#16240]: https://github.com/home-assistant/home-assistant/pull/16240 +[#16254]: https://github.com/home-assistant/home-assistant/pull/16254 +[#16255]: https://github.com/home-assistant/home-assistant/pull/16255 [@Alexxander0]: https://github.com/Alexxander0 +[@blackgold9]: https://github.com/blackgold9 [@Danielhiversen]: https://github.com/Danielhiversen [@Eriner]: https://github.com/Eriner [@Kane610]: https://github.com/Kane610 @@ -385,11 +413,11 @@ Experiencing issues introduced by this release? Please report them in our [issue [media_extractor docs]: /components/media_extractor/ [media_player.frontier_silicon docs]: /components/media_player.frontier_silicon/ [media_player.mpd docs]: /components/media_player.mpd/ +[media_player.plex docs]: /components/media_player.plex/ [media_player.sonos docs]: /components/media_player.sonos/ [mqtt_eventstream docs]: /components/mqtt_eventstream/ [mqtt_statestream docs]: /components/mqtt_statestream/ [notify docs]: /components/notify/ -[onboarding docs]: /components/onboarding/ [openuv docs]: /components/openuv/ [panel_custom docs]: /components/panel_custom/ [remote.xiaomi_miio docs]: /components/remote.xiaomi_miio/ diff --git a/source/images/blog/2018-08-0.77/social.png b/source/images/blog/2018-08-0.77/social.png new file mode 100644 index 0000000000000000000000000000000000000000..5a1bbec92016bff7ce9928a1bbee627c738d9357 GIT binary patch literal 29960 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 Uo3%q3^-q(Ef~I_ptOfYL0r+yu<^TWy literal 0 HcmV?d00001 From eb1bc588e00890f6ade1e8312d38fe18d8b01fc7 Mon Sep 17 00:00:00 2001 From: Marcel Hoppe Date: Tue, 28 Aug 2018 00:39:59 +0200 Subject: [PATCH 41/47] rewrite the doc for hangouts with intents instead of commands (#6096) * rewrite the doc for hangouts with intents instead of commands * Typos --- source/_components/hangouts.markdown | 179 ++++++++++++++++----------- 1 file changed, 109 insertions(+), 70 deletions(-) diff --git a/source/_components/hangouts.markdown b/source/_components/hangouts.markdown index ba290e276f1..66340a0e49f 100644 --- a/source/_components/hangouts.markdown +++ b/source/_components/hangouts.markdown @@ -29,98 +29,137 @@ The authentication token will be generated and stored internally. ```yaml # Example configuration.yaml entry hangouts: - commands: - - word: testword + intents: + LivingRoomTemperature: + sentences: + - What is the temperature in the living room conversations: - id: CONVERSATION_ID1 - id: CONVERSATION_ID2 - - expression: "My name is (?P.*)" - name: introduction + error_suppressed_conversations: + - id: CONVERSATION_ID2 + ``` {% configuration %} -commands: - description: "A list of commands that the bot should listen for. If a command is triggered (via its *word* or *expression*, see below), an event is fired that you can handle using automations. Every command consists of these possible configuration options:" +intents: + description: "Intents that the hangouts component should understand." required: false type: map default: empty keys: - word: - description: "Specifies a word that the bot should listen for. If you specify 'my_command' here, the bot will react to any message starting with 'my_command'." - required: false - type: string - expression: - description: "Specifies a regular expression (in python regexp syntax) that the bot should listen to. The bot will react to any message that matches the regular expression." - required: false - type: string - name: - description: "The name of the command. This will be an attribute of the event that is fired when this command triggers." + '``': + description: "Single intent entry." + required: true + type: map + keys: + sentences: + description: "Sentences that should trigger this intent." + required: true + type: list + conversations: + description: "A list of conversations that triggers this intent. If no conversation are given, every conversations triggers the intent." + required: false + type: [map] + default: empty + keys: + id: + description: "Specifies the id of the conversation. *The conversation id can be obtained from the `hangouts.conversations` entity.*" + required: true + type: string +error_suppressed_conversations: + description: "A list of conversations that won't get a message if the intent is not known." + required: false + type: [map] + default: empty + keys: + id: + description: "Specifies the id of the conversation. *The conversation id can be obtained from the `hangouts.conversations` entity.*" required: true type: string - conversations: - description: "A list of conversations that the bot should listen for this command in. If this is not given, all conversations are used." - required: false - type: [map] - default: empty - keys: - id: - description: "Specifies the id of the conversation. *The conversation id can be obtained from the `hangouts.conversations` entity.*" - required: true - type: string {% endconfiguration %} The conversations has to be precreated, the conversation id can be obtained from the `hangouts.conversations` entity. Make sure to use quotes around the conversation id or alias to escape special characters (`!`, and `#`) in YAML. -### {% linkable_title Event Data %} - -If a command is triggered, a `hangouts_command` event is fired. The event contains the name of the command in the `command` field. - -If the command is a word command, the `data` field contains a list of the command's arguments, i.e., everything that stood behind the word, split at spaces. If the command is an expression command, the `data` field contains the [group dictionary](https://docs.python.org/3.6/library/re.html?highlight=re#re.match.groupdict) of the regular expression that matched the message. - -There are these additional fields: `conversation_id`, `user_id` and `user_name`. - -### {% linkable_title Comprehensive Configuration Example %} +## {% linkable_title Adding sentences %} ```yaml # The Hangouts component hangouts: - commands: - - word: testword + intents: + HassLightSet: + sentences: + - Toggle {name}. conversations: - - name: "someothertest" - - expression: "My name is (?P.*)" - name: introduction + - id: CONVERSATION_ID1 + Ping: + sentences: + - How many Conversation do you know + error_suppressed_conversations: + - id: CONVERSATION_ID2 -automation: - - alias: 'React to !testword' - trigger: - platform: event - event_type: hangouts_command - event_data: - command: testword - action: - service: hangouts.send_message - data_template: - target: - - name: "hasstest" - message: - - text: 'It looks like you wrote testword' - - alias: 'React to an introduction' - trigger: - platform: event - event_type: hangouts_command - event_data: - command: introduction - action: - service: hangouts.send_message - data_template: - target: - - id: '{{ trigger.event.data.conversation_id}}' - message: - - text: "Hello {{ trigger.event.data.data.name }}" +intent_script: + Ping: + speech: + text: I know {% raw %}{{ states.hangouts.conversations.state }}{% endraw %} conversations ``` This configuration will: -- Listen for "testword" in the room "someothertest" (and only) there. - If such a message is encountered, it will answer with "It looks like you wrote testword" into the "hasstest" conversation. -- Listen in all conversations for any message matching "My name is (any name)" and answer with "Hello (the given name)" into the same conversation. +- Toggle the light in the given location in a specific conversation. +- Return the conversations the bot know. + +## {% linkable_title Adding advanced custom sentences %} + +Sentences can contain slots (marked with curly braces: `{name}`) and optional words (marked with square brackets: `[the]`). The values of slots will be passed on to the intent and are available inside the templates. + +The following configuration can handle the following sentences: + + - Change the lights to red + - Change the lights to green + - Change the lights to blue + - Change the lights to the color red + - Change the lights to the color green + - Change the lights to the color blue + +```yaml +# Example configuration.yaml entry +hangouts: + intents: + ColorLight: + sentences: + - Change the lights to [the color] {color} +{% raw %} +intent_script: + ColorLight: + speech: + text: Changed the lights to {{ color }}. + action: + service: light.turn_on + data_template: + rgb_color: + - "{% if color == 'red' %}255{% else %}0{% endif %}" + - "{% if color == 'green' %}255{% else %}0{% endif %}" + - "{% if color == 'blue' %}255{% else %}0{% endif %}" +{% endraw %} +``` + +## {% linkable_title Services %} + +### {% linkable_title Service `hangouts.update` %} + +Updates the list of conversations. + +| Service data attribute | Optional | Description | +|------------------------|----------|--------------------------------------------------| +| | | | + +### {% linkable_title Service `hangouts.send_message` %} + +Sends a message to the given conversations. + +| Service data attribute | Optional | Description | +|------------------------|----------|--------------------------------------------------| +| target | List of targets with id or name. [Required] | [{"id": "UgxrXzVrARmjx_C6AZx4AaABAagBo-6UCw"}, {"name": "Test Conversation"}] | +| message | List of message segments, only the "text" field is required in every segment. [Required] | [{"text":"test", "is_bold": false, "is_italic": false, "is_strikethrough": false, "is_underline": false, "parse_str": false, "link_target": "http://google.com"}, ...] | + + From 3db342f545676a92038ac6a4bb70d2c3d70a29eb Mon Sep 17 00:00:00 2001 From: Marcel Hoppe Date: Wed, 29 Aug 2018 10:57:15 +0200 Subject: [PATCH 42/47] Update hangouts.markdown (#6105) * Update hangouts.markdown Add an important hint for captchas and a best practice for using a second google account as bot. * typo --- source/_components/hangouts.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/_components/hangouts.markdown b/source/_components/hangouts.markdown index 66340a0e49f..5400f81ecd0 100644 --- a/source/_components/hangouts.markdown +++ b/source/_components/hangouts.markdown @@ -22,8 +22,12 @@ Fill the form: * Your **Google Mail Address** and **Password** * If needed, you will be asked for a 2-factor authorization token +**BEST PRACTICE:** You can't write messages to yourself or get notifications in a group, if "you" write the message. The best way is to create a own google account for your hangouts bot. + **IMPORTANT:** If you secured your account with 2 factor authorization: Only verification by app or SMS are supported. There is no support for verification by prompt on your phone. +**IMPORTANT 2:** If you are sure your email and password is correct, but the component says the login is invalid. Wait a few hours and try it again, it might be, that google asks for a captcha which we can't support. Google official don't support bots at hangouts, that's why we have to work around this. + The authentication token will be generated and stored internally. ```yaml From c76e262bcbaba2d728c6bd22e12cd13096fdc1d5 Mon Sep 17 00:00:00 2001 From: Jason Hu Date: Wed, 29 Aug 2018 02:58:39 -0700 Subject: [PATCH 43/47] Fix a link (#6106) --- source/_docs/authentication/providers.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_docs/authentication/providers.markdown b/source/_docs/authentication/providers.markdown index a2949c2f557..aa1508255d7 100644 --- a/source/_docs/authentication/providers.markdown +++ b/source/_docs/authentication/providers.markdown @@ -56,7 +56,7 @@ homeassistant: With the trusted networks auth provider you can whitelist an IP range for which no authentication will be required. The user will be prompted to pick a user to log in as.

    -The [multi-factor autentication module](multi-factor-auth) will not participate in login process by using this auth provider. +The [multi-factor autentication module](../multi-factor-auth) will not participate in login process by using this auth provider.

    ```yaml From abf846f2c4c2e7afa1f6db050e54b5e910e79bb6 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 29 Aug 2018 11:59:37 +0200 Subject: [PATCH 44/47] Add link to ios app --- source/_posts/2018-08-31-release-77.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_posts/2018-08-31-release-77.markdown b/source/_posts/2018-08-31-release-77.markdown index 2e7ac236fa5..7bba4fe9fea 100644 --- a/source/_posts/2018-08-31-release-77.markdown +++ b/source/_posts/2018-08-31-release-77.markdown @@ -27,7 +27,7 @@ Although it's possible to configure authentication, we stronlgy recommend to sti It will take some time before all of the Home Assistant ecosystem has been migrated over to the new auth system. Home Assistant will print a warning whenever an application connects to Home Assistant with the legacy authentication. This will help users notify the application developers to transition to use the new [OAuth2](https://developers.home-assistant.io/docs/en/auth_api.html) authentication. For non-interactive scripts or other applications that are unable to update, we are planning to introduce a migration path for components to adopt url specific auth tokens and also introduce long lived access tokens to replace API passwords. A list of impacted components can be found [here](https://github.com/home-assistant/home-assistant/issues/15376#issuecomment-415890552). -The iOS app will soon be updated to work with the new auth. It's already in testing. The old app will continue to work with the legacy API password support. It will however require a second login when using the webview. +Our [iOS app](/ios) will soon be updated to work with the new auth. It's already in testing. The old app will continue to work with the legacy API password support. It will however require a second login when using the webview. I want to say a biiiig thank you to all the people that have been involved in the development and testing of the new authentication system. It's been a big project and it's been great to see how we, as a community, have rallied together to tackle it. Especially a big shout out to [@awarecan]. From a80ec3deec28a5db88e1284e6d5457b81da59c59 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 29 Aug 2018 12:05:17 +0200 Subject: [PATCH 45/47] Add blog post for proxies --- source/_posts/2018-08-31-release-77.markdown | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/source/_posts/2018-08-31-release-77.markdown b/source/_posts/2018-08-31-release-77.markdown index 7bba4fe9fea..c7f472d726c 100644 --- a/source/_posts/2018-08-31-release-77.markdown +++ b/source/_posts/2018-08-31-release-77.markdown @@ -29,7 +29,9 @@ It will take some time before all of the Home Assistant ecosystem has been migra Our [iOS app](/ios) will soon be updated to work with the new auth. It's already in testing. The old app will continue to work with the legacy API password support. It will however require a second login when using the webview. -I want to say a biiiig thank you to all the people that have been involved in the development and testing of the new authentication system. It's been a big project and it's been great to see how we, as a community, have rallied together to tackle it. Especially a big shout out to [@awarecan]. +If you are using a proxy server (NGINX etc) in front of Home Assistant to provide authentication, check [this blogpost](https://blog.ceard.tech/2018/08/turbulence-ahead-fasten-your-seatbelt.html) by [@DubhAd] how to make it work. + +I want to say a biiiig thank you to all the people that have been involved in the development and testing of the new authentication system. It's been a big project and it's been great to see how we, as a community, have rallied together to tackle it. Especially a big shout out to [@awarecan] who has done an amazing job on this. #### {% linkable_title Hangouts %} @@ -325,7 +327,7 @@ Experiencing issues introduced by this release? Please report them in our [issue [#16254]: https://github.com/home-assistant/home-assistant/pull/16254 [#16255]: https://github.com/home-assistant/home-assistant/pull/16255 [@Alexxander0]: https://github.com/Alexxander0 -[@blackgold9]: https://github.com/blackgold9 +[@DubhAd]: https://github.com/DubhAd [@Danielhiversen]: https://github.com/Danielhiversen [@Eriner]: https://github.com/Eriner [@Kane610]: https://github.com/Kane610 From 79c74de77a7fba42ba7ef7b64a1746ea5f7bc788 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 29 Aug 2018 12:11:43 +0200 Subject: [PATCH 46/47] Update date --- _config.yml | 2 +- ...08-31-release-77.markdown => 2018-08-29-release-77.markdown} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename source/_posts/{2018-08-31-release-77.markdown => 2018-08-29-release-77.markdown} (100%) diff --git a/_config.yml b/_config.yml index 360563d2a1c..60823e3e2d0 100644 --- a/_config.yml +++ b/_config.yml @@ -143,7 +143,7 @@ social: current_major_version: 0 current_minor_version: 77 current_patch_version: 0 -date_released: 2018-08-31 +date_released: 2018-08-29 # Either # or the anchor link to latest release notes in the blog post. # Must be prefixed with a # and have double quotes around it. diff --git a/source/_posts/2018-08-31-release-77.markdown b/source/_posts/2018-08-29-release-77.markdown similarity index 100% rename from source/_posts/2018-08-31-release-77.markdown rename to source/_posts/2018-08-29-release-77.markdown From ed0d61f8f28be7d1ce230394c1ba4bc5e8e25a3a Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 29 Aug 2018 12:12:14 +0200 Subject: [PATCH 47/47] Emoji --- source/_posts/2018-08-29-release-77.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_posts/2018-08-29-release-77.markdown b/source/_posts/2018-08-29-release-77.markdown index c7f472d726c..fdaf74551a6 100644 --- a/source/_posts/2018-08-29-release-77.markdown +++ b/source/_posts/2018-08-29-release-77.markdown @@ -1,6 +1,6 @@ --- layout: post -title: "0.77: Authentication system + Hangouts bot" +title: "0.77: Authentication system 👮‍♂️ + Hangouts bot 🤖" description: "The new authentication system is live! Chat on hangouts! " date: 2018-08-29 00:01:00 date_formatted: "August 29, 2018"