From b74516620d02c3217922ccb4598a8f56fd93cdcf Mon Sep 17 00:00:00 2001 From: Ivan Bessarabov Date: Tue, 2 Mar 2021 13:10:09 +0300 Subject: [PATCH 01/16] Fixing incorrect code sample (#16802) --- source/_lovelace/entities.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_lovelace/entities.markdown b/source/_lovelace/entities.markdown index c71d7246bf1..24aaa5e6fea 100644 --- a/source/_lovelace/entities.markdown +++ b/source/_lovelace/entities.markdown @@ -417,7 +417,7 @@ entities: name: Bed light transition action_name: Toggle light tap_action: - type: call-service + action: call-service service: light.toggle service_data: entity_id: light.bed_light From 06bdb81ce6a240a97a07e8f917575c761e35d91e Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Tue, 2 Mar 2021 11:14:08 +0100 Subject: [PATCH 02/16] Correct supported features for MQTT light basic schema (#16795) --- source/_integrations/light.mqtt.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/light.mqtt.markdown b/source/_integrations/light.mqtt.markdown index bf6abbdc195..8f833fbe3b2 100644 --- a/source/_integrations/light.mqtt.markdown +++ b/source/_integrations/light.mqtt.markdown @@ -27,7 +27,7 @@ The `mqtt` light platform lets you control your MQTT enabled lights through one ## Default schema -The `mqtt` light platform with default schema lets you control your MQTT enabled lights. It supports setting brightness, color temperature, effects, flashing, on/off, RGB colors, transitions, XY colors and white values. +The `mqtt` light platform with default schema lets you control your MQTT enabled lights. It supports setting brightness, color temperature, effects, on/off, RGB colors, XY colors and white values. ## Default schema - Configuration From 7789696e941ab352c7dad51f0b96cc15b427b57d Mon Sep 17 00:00:00 2001 From: Cooper Dale Date: Tue, 2 Mar 2021 12:13:03 +0100 Subject: [PATCH 03/16] deleted no longer valid note (#16804) no longer useful: "Then add `verify_ssl: true` to `mikrotik` device tracker entry in your `configuration.yaml` file." --- source/_integrations/mikrotik.markdown | 2 -- 1 file changed, 2 deletions(-) diff --git a/source/_integrations/mikrotik.markdown b/source/_integrations/mikrotik.markdown index 345f9960f31..a5462e78aeb 100644 --- a/source/_integrations/mikrotik.markdown +++ b/source/_integrations/mikrotik.markdown @@ -50,8 +50,6 @@ To use SSL to connect to the API (via `api-ssl` instead of `api` service) furthe /ip service enable api-ssl ``` -Then add `verify_ssl: true` to `mikrotik` device tracker entry in your `configuration.yaml` file. - If everything is working fine you can disable the pure `api` service in RouterOS: ```bash From 27a55af9bb4a5c65cfba72e1c883b6f1d6090f6f Mon Sep 17 00:00:00 2001 From: Stefan Agner Date: Tue, 2 Mar 2021 14:54:03 +0100 Subject: [PATCH 04/16] Reflect current restrictions on 64-bit Raspberry Pi images (#16810) The current Raspberry Pi images (with current Home Assistant Core releases) does work fine for GPIOs as well as various HATs. Drop the hints about 32-bit. The 32-bit variant also boots fine with the 8GB variant now. However, using the 64-bit variant is still recommended since the OS level support does not need not that well tested features such as LPAE etc. --- source/_includes/installation/operating_system.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/source/_includes/installation/operating_system.md b/source/_includes/installation/operating_system.md index 0666814ec43..1b0b235406e 100644 --- a/source/_includes/installation/operating_system.md +++ b/source/_includes/installation/operating_system.md @@ -40,9 +40,7 @@ We will need a few things to get started with installing Home Assistant. Links b {% if variant.key == "odroid-n2" %} [Guide: Flashing Odroid-N2 using OTG-USB](/hassio/flashing_n2_otg/) {% elsif variant.key == "rpi4" %} - _(To use the full 8GB of memory on the 8GB model 64-bit is **required**)_ - {% elsif variant.key == "rpi4-64" or variant.key == "rpi3-64" %} - _(For GPIO and HAT 32-bit is **required**)_ + _(On the 8GB model 64-bit is recommended)_ {% endif %} {% endfor %} From ab17af9ca030c352b64c4452fb0436a36c12397c Mon Sep 17 00:00:00 2001 From: stu247 Date: Tue, 2 Mar 2021 08:09:14 -0600 Subject: [PATCH 05/16] Document logging default log severity level (#16801) Python module logging has a default log level of warning. If logger integration is not enabled, then Home Assistant uses log level of warning. --- source/_integrations/logger.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_integrations/logger.markdown b/source/_integrations/logger.markdown index bc797d0c154..e61bca4380a 100644 --- a/source/_integrations/logger.markdown +++ b/source/_integrations/logger.markdown @@ -22,6 +22,8 @@ add the following to your `configuration.yaml` file: logger: ``` +The log severity level is `warning` if the logger integration is not enabled in `configuration.yaml`. + To log all messages and ignore events lower than critical for specified components: From 5e7cf344870c430b56e237d34349b53375dc1eb5 Mon Sep 17 00:00:00 2001 From: Thanasis Date: Tue, 2 Mar 2021 16:01:56 +0100 Subject: [PATCH 06/16] Fix grammar issues (#16800) Co-authored-by: Franck Nijhof --- source/_integrations/alexa.intent.markdown | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/source/_integrations/alexa.intent.markdown b/source/_integrations/alexa.intent.markdown index 063aebf23f5..e231a759a87 100644 --- a/source/_integrations/alexa.intent.markdown +++ b/source/_integrations/alexa.intent.markdown @@ -18,8 +18,8 @@ The built-in Alexa integration allows you to integrate Home Assistant into Alexa ### Requirements - Amazon Developer Account. You can sign on [here](https://developer.amazon.com). -- An [AWS account](https://aws.amazon.com/free/) is need if you want to use Alexa Custom Skill API. Part of your Alexa Custom Skill will be hosted on [AWS Lambda](https://aws.amazon.com/lambda/pricing/). However you don't need worry the cost, AWS Lambda allow free to use up to 1 millions requests and 1GB outbound data transfer per month. -- The Alexa Custom Skill API also needs your Home Assistant instance to be accessible from the internet via HTTPS on port 443 using a certificate signed by [an Amazon approved certificate authority](https://ccadb-public.secure.force.com/mozilla/IncludedCACertificateReport), this is so account linking can take place. Read more on [our blog](/blog/2015/12/13/setup-encryption-using-lets-encrypt/) about how to set up encryption for Home Assistant. When running Home Assistant using the [Duck DNS](/addons/duckdns/) add-on is the easiest method. +- An [AWS account](https://aws.amazon.com/free/) is needed if you want to use the Alexa Custom Skill API. Part of your Alexa Custom Skill will be hosted on [AWS Lambda](https://aws.amazon.com/lambda/pricing/). However, you don't need to worry about the cost, as AWS Lambda allows for free to use up to 1 million requests and 1GB outbound data transfer per month. +- The Alexa Custom Skill API also needs your Home Assistant instance to be accessible from the internet via HTTPS on port 443 using a certificate signed by [an Amazon approved certificate authority](https://ccadb-public.secure.force.com/mozilla/IncludedCACertificateReport). This is so account linking can take place. Read more on [our blog](/blog/2015/12/13/setup-encryption-using-lets-encrypt/) about how to set up encryption for Home Assistant. When running Home Assistant OS or Supervised, using the [Duck DNS](/addons/duckdns/) add-on is the easiest method. ### Create Your Amazon Alexa Custom Skill @@ -38,7 +38,7 @@ You can use this [specially sized Home Assistant logo][large-icon] as the large The Alexa Custom skill will trigger a AWS Lambda function to process the request, we will write a small piece of code hosted as a Lambda function to basically redirect the request to your Home Assistant instance, then the Alexa integration in Home Assistant will process the request and send back the response. Your Lambda function will deliver the response back to Alexa. -OK, let's go. You first need sign in your [AWS console](https://console.aws.amazon.com/), if you don't have an AWS account yet, you can create a new user [here](https://aws.amazon.com/free/) with 12-month free tier benefit. You don't need worry the cost if your account has already passed the first 12 months, AWS provides up to 1 million Lambda requests, 1GB of outbound data and unlimited inbound data for free every month for all users. See [Lambda pricing](https://aws.amazon.com/lambda/pricing/) for details. +OK, let's go. You first need sign in your [AWS console](https://console.aws.amazon.com/), if you don't have an AWS account yet, you can create a new user [here](https://aws.amazon.com/free/) with 12-month free tier benefit. You don't need to worry about the cost if your account has already passed the first 12 months, AWS provides up to 1 million Lambda requests, 1GB of outbound data and unlimited inbound data for free every month for all users. See [Lambda pricing](https://aws.amazon.com/lambda/pricing/) for details. #### Create an IAM Role for Lambda @@ -59,7 +59,7 @@ The first thing you need to do after you sign in to the [AWS console](https://co Next you need to create a Lambda function. -- Click `Service` in top navigation bar, expand the menu to display all AWS services, click `Lambda` under `Compute` section to navigate to Lambda console. Or you may use this [link](https://console.aws.amazon.com/lambda/home) +- Click `Service` in top navigation bar, expand the menu to display all AWS services, click `Lambda` under `Compute` section to navigate to the Lambda console. Or you may use this [link](https://console.aws.amazon.com/lambda/home) - **IMPORTANT** Your current region will be displayed in the top right corner. Make sure you select the right region based on your Amazon account's country: - **US East (N.Virginia)** region for English (US) or English (CA) skills - **EU (Ireland)** region for English (UK), English (IN), German (DE), Spanish (ES) or French (FR) skills @@ -68,8 +68,8 @@ Next you need to create a Lambda function. - Click `Create function`, select `Author from scratch`, then input a `Function name`. - Select *Python 3.6* or *Python 3.7* as `Runtime`. - Select *Use an existing role* as `Execution role`, then select the role you just created from the `Existing role` list. -- Click `Create function`, then you can configuration detail of Lambda function. -- Under `Configuration` tab, expand `Designer`, then click `Alexa Skills Kit` in the left part of the panel to add a Alexa Skills Kit trigger to your Lambda function. +- Click `Create function`, then you can configure the details of the Lambda function. +- Under the `Configuration` tab, expand `Designer`, then click on `+ Add trigger` in the left part of the panel and select `Alexa Skills Kit` from the dropdown list to add an Alexa Skills Kit trigger to your Lambda function. - Scroll down a little bit, you need to input the `Skill ID` from the skill you created in the previous step. (You may need to switch back to the Alexa Developer Console to copy the `Skill ID`). - Click your Lambda Function icon in the middle of the diagram and scroll down, you will see a `Function code` window. - Clear the example code and copy the Python script from this [GitHub Gist](https://gist.github.com/lpomfrey/97381cf4316553b03622c665ae3a47da). @@ -78,7 +78,7 @@ Next you need to create a Lambda function. - BASE_URL *(required)*: your Home Assistant instance's Internet accessible URL with port if needed. *Do not include the trailing `/`*. - NOT_VERIFY_SSL *(optional)*: set to *True* to ignore the SSL issue, if you don't have a valid SSL certificate or you are using self-signed certificate. - DEBUG *(optional)*: set to *True* to log debugging messages. - - LONG_LIVED_ACCESS_TOKEN *(optional, not recommended)*: you will connect your Alexa Custom skill with your Home Assistant user account in the later steps, so that you don't need to use long-lived access token here. However, the access token you got from login flow is only valid for 30 minutes. It will be hard for you to test lambda function with the access token in test data. So for your convinces, you can remove the access token from the test data, [generate a long-lived access token][generate-long-lived-access-token] put here, then the function will fall back to reading the token from environment variables. (tips: You did not enable the security storage for your environment variables, so your token saved here is not that safe. You should only use it for debugging and testing purpose. You should remove and delete the long-lived access token after you finish the debugging.) + - LONG_LIVED_ACCESS_TOKEN *(optional, not recommended)*: you will connect your Alexa Custom skill with your Home Assistant user account in the later steps, so that you don't need to use long-lived access token here. However, the access token you got from login flow is only valid for 30 minutes. It will be hard for you to test lambda function with the access token in test data. So for your convenience, you can remove the access token from the test data, [generate a long-lived access token][generate-long-lived-access-token] to put here, then the function will fall back to reading the token from environment variables. (tips: You did not enable the security storage for your environment variables, so your token saved here is not that safe. You should only use it for debugging and testing purpose. You should remove and delete the long-lived access token after you finish the debugging.) - Save your environmental variables by clicking the `Save` button. - Next, copy the ARN displayed in the top of the page, which is the identify of this Lambda function. Set the end point of the custom Alexa Skill you created earlier to this value. From 3800337c6a83ca370a2062aa7f6bf69be43eae58 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 2 Mar 2021 21:05:25 +0100 Subject: [PATCH 07/16] Move Pi-Hole API key instructions (#16811) --- source/_integrations/pi_hole.markdown | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/source/_integrations/pi_hole.markdown b/source/_integrations/pi_hole.markdown index 5eaf47fd2f2..7a7d88b8f37 100644 --- a/source/_integrations/pi_hole.markdown +++ b/source/_integrations/pi_hole.markdown @@ -19,16 +19,19 @@ ha_platforms: - switch --- -The `pi_hole` integration allows you to retrieve statistics and interact with a [Pi-hole](https://pi-hole.net/) system. +The Pi-hole integration allows you to retrieve statistics and interact with a +[Pi-hole](https://pi-hole.net/) system. {% include integrations/config_flow.md %} +Please note, that during the integration set up, an API key can be provided. +Providing one, gives access to the Pi-Hole `disable` service and a switch +to enable/disable Pi-Hole from Home Assistant. + ## Services The platform provides the following services to interact with your Pi-hole. Use switch entities when calling the services. -_Note: Switch entity requires `api_key` to be configured._ - ### Service `pi_hole.disable` Disables configured Pi-hole(s) for the specified amount of time. From 0522b9fa716fbe1dbb7b677d6cc167fa02dab047 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 2 Mar 2021 21:05:38 +0100 Subject: [PATCH 08/16] Enquote username/password in evohome example (#16809) --- source/_integrations/evohome.markdown | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/source/_integrations/evohome.markdown b/source/_integrations/evohome.markdown index 3b9d00e4496..56098ebde59 100644 --- a/source/_integrations/evohome.markdown +++ b/source/_integrations/evohome.markdown @@ -33,8 +33,8 @@ To set up this integration, add the following to your `configuration.yaml` file: ```yaml # Example configuration.yaml entry evohome: - username: YOUR_USERNAME - password: YOUR_PASSWORD + username: "YOUR_USERNAME" + password: "YOUR_PASSWORD" ``` {% configuration %} @@ -64,8 +64,8 @@ This is an IoT cloud-polling integration and the recommended minimum `scan_inter TCC systems are implemented as a _location_, which consist of 1-12 _zones_ and, optionally, a DHW controller: - - The system location (e.g., a house) is used for operating modes such as home, away, economy, etc. - - Heating zones (e.g., rooms) are used for the target temperature. +- The system location (e.g., a house) is used for operating modes such as home, away, economy, etc. +- Heating zones (e.g., rooms) are used for the target temperature. ### Evohome @@ -113,7 +113,7 @@ In the Home Assistant schema, all this is done via a combination of `HVAC_MODE` ## Service Calls -This integration provides its own service calls to expose the full functionality of TCC systems beyond the limitations of Home Assistant's standardised schema. Mostly, this relates to specifying the duration of mode changes, after which time the entities revert to **Auto** or **FollowSchedule** (for locations and zones, respectively). +This integration provides its own service calls to expose the full functionality of TCC systems beyond the limitations of Home Assistant's standardized schema. Mostly, this relates to specifying the duration of mode changes, after which time the entities revert to **Auto** or **FollowSchedule** (for locations and zones, respectively). It is recommended to use the native service calls (e.g., `evohome.set_system_mode`) instead of Home Assistant's generic equivalents (e.g., `climate.set_hvac_mode`) whenever possible. However, it may be necessary to use the generic service calls for integration with 3rd party systems such as Amazon Alexa or Google Home. @@ -159,7 +159,7 @@ This service call will set the `setpoint` of a zone, as identified by its `entit - action: - service: evohome.set_zone_override target: - entity_id: climate.loungeroom\ + entity_id: climate.loungeroom data: setpoint: 10 ``` From 485772431a8bd12f864b83723094eb56ae8b422a Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 2 Mar 2021 21:05:51 +0100 Subject: [PATCH 09/16] Remove YAML optionals from Sighthound config example (#16808) * Remove YAML defaults from Sighthound config example * Add default value --- source/_integrations/sighthound.markdown | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/source/_integrations/sighthound.markdown b/source/_integrations/sighthound.markdown index 5bd341ac985..550c37dc25d 100644 --- a/source/_integrations/sighthound.markdown +++ b/source/_integrations/sighthound.markdown @@ -12,7 +12,7 @@ ha_domain: sighthound Detect people in camera images using [Sighthound Cloud](https://www.sighthound.com/products/cloud). The Sighthound Developer tier (free for non-commercial use) allows 5000 images to be processed per month. If you need more processing per month you will need to sign up for a production account (i.e., a Basic or Pro account). -This integration adds an image processing entity where the state of the entity is the number of people detected in an image. For each person detected, an `sighthound.person_detected` event is fired. The event data includes the entity_id of the image processing entity firing the event, and the bounding box around the detected person. +This integration adds an image processing entity where the state of the entity is the number of people detected in an image. For each person detected, an `sighthound.person_detected` event is fired. The event data includes the entity_id of the image processing entity firing the event, and the bounding box around the detected person. If `save_file_folder` is configured, on each new detection of a person, an annotated image with the name `sighthound_{camera_name}_latest.jpg` is saved in the configured folder if it doesn't already exist, and overwritten if it does exist. The saved image shows the bounding box around detected people and can be displayed on the Home Assistant front end using a [Local File](/integrations/local_file/) camera, and used in notifications. If `save_timestamped_file` is configured as `true`, then the annotated image is saved with a file name that includes the time of detection. @@ -26,9 +26,7 @@ To enable this platform in your installation, add the following to your `configu # Example configuration.yaml entry image_processing: - platform: sighthound - api_key: some_key - save_file_folder: /my_dir/ - save_timestamped_file: True + api_key: "MY_API_KEY" source: - entity_id: camera.my_cam ``` @@ -49,7 +47,8 @@ save_file_folder: save_timestamped_file: description: Save the processed image with the time of detection in the filename. Requires save_file_folder to be configured. required: false - type: string + default: false + type: boolean source: description: The list of image sources. required: true From f26bca8524602c3e25e415cc678b27c080724e76 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 2 Mar 2021 21:06:08 +0100 Subject: [PATCH 10/16] Add missing Switch device classes (#16813) --- .../configuration/customizing-devices.markdown | 13 +++++++------ source/_integrations/switch.markdown | 8 ++++++++ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/source/_docs/configuration/customizing-devices.markdown b/source/_docs/configuration/customizing-devices.markdown index a6e8b05b8e5..6b6f5b57917 100644 --- a/source/_docs/configuration/customizing-devices.markdown +++ b/source/_docs/configuration/customizing-devices.markdown @@ -66,12 +66,13 @@ initial_state: #### Device Class -Device class is currently supported by the following components: +Device class is currently supported by the following platforms: -* [Binary Sensor](/integrations/binary_sensor/) -* [Sensor](/integrations/sensor/) -* [Cover](/integrations/cover/) -* [Media Player](/integrations/media_player/) +- [Binary Sensor](/integrations/binary_sensor/) +- [Cover](/integrations/cover/) +- [Media Player](/integrations/media_player/) +- [Sensor](/integrations/sensor/) +- [Switch](/integrations/switch/) ### Manual customization @@ -123,7 +124,7 @@ Home Assistant offers a service to reload the core configuration while Home Assi To reload customizations, navigate to Configuration > Server Controls and then press the "Reload Location & Customizations" button. If you don't see this, enable Advanced Mode on your user profile page first. -Alternatively, you can reload via service call. Navigate to Developer Tools > Services tab, select `homeassistant.reload_core_config` from the dropdown and press the "Call Service" button. +Alternatively, you can reload via service call. Navigate to Developer Tools > Services tab, select `homeassistant.reload_core_config` from the dropdown and press the "Call Service" button.
New customize information will be applied the next time the state of the entity gets updated. diff --git a/source/_integrations/switch.markdown b/source/_integrations/switch.markdown index 5b5c8190442..a91b20d5eb4 100644 --- a/source/_integrations/switch.markdown +++ b/source/_integrations/switch.markdown @@ -16,6 +16,14 @@ Keeps track which switches are in your environment, their state and allows you t - Maintains a state per switch and a combined state `all_switches`. - Registers services `switch.turn_on`, `switch.turn_off`, and `switch.toggle` to control switches. +## Device Class + +The way these switches are displayed in the frontend can be modified in the [customize section](/docs/configuration/customizing-devices/). The following device classes are supported for switches: + +- **None**: Generic switch. This is the default and doesn't need to be set. +- **outlet**: This switch, switches a power outlet. +- **switch**: A generic switch. + ## Use the services In the frontend open the sidebar. At the bottom, under **Developer Tools**, click **Services**. From the Service dropdown menu choose `switch.turn_on` or `switch.turn_off` from the list of available services. In the Entity dropdown menu choose or enter the entity ID you want to work with. This will enter something like the sample below into the **Service Data** field. Now hit **CALL SERVICE**. From a6b0bd1104cb6344a6ff65c33160941e7b85decb Mon Sep 17 00:00:00 2001 From: OzGav Date: Wed, 3 Mar 2021 17:58:23 +1000 Subject: [PATCH 11/16] Update turn_on_light_for_10_minutes_when_motion_detected.markdown (#16819) --- .../turn_on_light_for_10_minutes_when_motion_detected.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_cookbook/turn_on_light_for_10_minutes_when_motion_detected.markdown b/source/_cookbook/turn_on_light_for_10_minutes_when_motion_detected.markdown index 07a929ebda9..aeb91e0e89f 100644 --- a/source/_cookbook/turn_on_light_for_10_minutes_when_motion_detected.markdown +++ b/source/_cookbook/turn_on_light_for_10_minutes_when_motion_detected.markdown @@ -4,7 +4,7 @@ description: "Turn on lights for 10 minutes when motion detected." ha_category: Automation Examples --- -#### Turn on lights with a resetable off timer +#### Turn on lights with a resettable off timer This recipe will turn on a light when there is motion and turn off the light when ten minutes has passed without any motion events. From b5d64ae91060f29f1072719f365990acea77b60d Mon Sep 17 00:00:00 2001 From: Fredrik Andersson Date: Wed, 3 Mar 2021 10:20:34 +0100 Subject: [PATCH 12/16] Updates to the Google Assistant setup instructions (#16015) Co-authored-by: Franck Nijhof --- .../_integrations/google_assistant.markdown | 72 +++++++++++-------- 1 file changed, 41 insertions(+), 31 deletions(-) diff --git a/source/_integrations/google_assistant.markdown b/source/_integrations/google_assistant.markdown index 90e7861c0ee..51cd64c08c7 100644 --- a/source/_integrations/google_assistant.markdown +++ b/source/_integrations/google_assistant.markdown @@ -29,34 +29,40 @@ To use Google Assistant, your Home Assistant configuration has to be [externally
+### Google Cloud Platform configuration + 1. Create a new project in the [Actions on Google console](https://console.actions.google.com/). 1. Click `New Project` and give your project a name. 2. Click on the `Smart Home` card, then click the `Start Building` button. 3. Click `Name your Smart Home action` under `Quick Setup` to give your Action a name - Home Assistant will appear in the Google Home app as `[test] ` - 4. Click `Build your Action`, then click `Add Action(s)`. - 5. Add your Home Assistant URL: `https://[YOUR HOME ASSISTANT URL:PORT]/api/google_assistant` in the `Fulfillment URL` box, replace the `[YOUR HOME ASSISTANT URL:PORT]` with the domain / IP address and the port under which your Home Assistant is reachable. - 6. Click `Save`. - 7. Click on the `Overview` tab, which will lead you back to the app details screen. + 4. Click on the `Overview` tab at the top of the page to go back. + 5. Click `Build your Action`, then click `Add Action(s)`. + 6. Add your Home Assistant URL: `https://[YOUR HOME ASSISTANT URL:PORT]/api/google_assistant` in the `Fulfillment URL` box, replace the `[YOUR HOME ASSISTANT URL:PORT]` with the domain / IP address and the port under which your Home Assistant is reachable. + 7. Click `Save`. + 8. Click the three little dots (more) icon in the upper right corner, select `Project settings` + 9. Make note of the `Project ID` that are listed on the `GENERAL` tab of the `Settings` page. 2. `Account linking` is required for your app to interact with Home Assistant. - 1. Set this up by clicking on `Setup account linking` under the `Quick Setup` section of the `Overview` page. - 2. If asked, leave options as they default `No, I only want to allow account creation on my website` and select `Next`. - 3. Then if asked, for the `Linking type` select `OAuth` and `Authorization Code`. Click `Next` - 4. Enter the following: - 1. Client ID: `https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID`. (Find your YOUR_PROJECT_ID by clicking on the three little dots (more) icon in the upper right corner of the console, selecting `Project settings`, your Project ID will be listed on the `GENERAL` tab of the `Settings` page.) - 2. Client Secret: Anything you like, Home Assistant doesn't need this field. - 3. Authorization URL (replace with your actual URL): `https://[YOUR HOME ASSISTANT URL:PORT]/auth/authorize`. - 4. Token URL (replace with your actual URL): `https://[YOUR HOME ASSISTANT URL:PORT]/auth/token`. - Click `Next`, then `Next` again. - 5. In the `Configure your client` `Scopes` textbox, type `email` and click `Add scope`, then type `name` and click `Add scope` again. - 6. Do **NOT** check `Google to transmit clientID and secret via HTTP basic auth header`. - 7. Click `Next`, then click `Save` + 1. Start by going back to the `Overview` tab. + 2. Click on `Setup account linking` under the `Quick Setup` section of the `Overview` page. + 3. If asked, leave options as they default `No, I only want to allow account creation on my website` and select `Next`. + 4. Then if asked, for the `Linking type` select `OAuth` and `Authorization Code`. Click `Next` + 5. Enter the following: + 1. Client ID: `https://oauth-redirect.googleusercontent.com/r/[YOUR_PROJECT_ID]`. (Replace `[YOUR_PROJECT_ID]` with your project ID from above) + 2. Client Secret: Anything you like, Home Assistant doesn't need this field. + 3. Authorization URL: `https://[YOUR HOME ASSISTANT URL:PORT]/auth/authorize`. (Replace `[YOUR HOME ASSISTANT URL:PORT]` with your values.) + 4. Token URL (replace with your actual URL): `https://[YOUR HOME ASSISTANT URL:PORT]/auth/token`. (Replace `[YOUR HOME ASSISTANT URL:PORT]` with your values.) + Click `Next`, then `Next` again. + 6. In the `Configure your client` `Scopes` textbox, type `email` and click `Add scope`, then type `name` and click `Add scope` again. + 7. Do **NOT** check `Google to transmit clientID and secret via HTTP basic auth header`. + 8. Click `Next`, then click `Save` Screenshot: Account linking 3. Select the `Develop` tab at the top of the page, then in the upper right hand corner select the `Test` button to generate the draft version Test App. If you don't see this option, go to the `Test` tab instead, click on the `Settings` button in the top right below the header, and ensure `On device testing` is enabled (if it isn't, enable it). 4. Add the `google_assistant` integration configuration to your `configuration.yaml` file and restart Home Assistant following the [configuration guide](#configuration) below. -5. (Note that app versions may be slightly different.) Open the Google Home app and go to `Settings`. -6. Click `Add...`, `+ Set up or add`, `+ Set up device`, and click `Have something already setup?`. You should have `[test] your app name` listed under 'Add new'. Selecting that should lead you to a browser to login your Home Assistant instance, then redirect back to a screen where you can set rooms and nicknames for your devices if you wish. +5. Add services in the Google Home App (Note that app versions may be slightly different.) + 1. Open the Google Home app and go to `Settings`. + 2. Click `Add...`, `+ Set up or add`, `+ Set up device`, and click `Have something already setup?`. You should have `[test] your app name` listed under 'Add new'. Selecting that should lead you to a browser to login your Home Assistant instance, then redirect back to a screen where you can set rooms and nicknames for your devices if you wish.
@@ -83,20 +89,24 @@ If you want to allow other household users to control the devices: If you want to support active reporting of state to Google's server (configuration option `report_state`) and synchronize Home Assistant devices with the Google Home app (`google_assistant.request_sync` service), you will need to create a service account. It is recommended to set up this configuration key as it also allows the usage of the following command, "Ok Google, sync my devices". Once you have set up this component, you will need to call this service (or command) each time you add a new device in Home Assistant that you wish to control via the Google Assistant integration. This allows you to update devices without unlinking and relinking an account (see [below](#troubleshooting)). -1. In the GCP Console, go to the [Create Service account key](https://console.cloud.google.com/apis/credentials/serviceaccountkey) page. -2. At the top left of the page next to "Google Cloud Platform" logo, select your project created in the Actions on Google console. Confirm this by reviewing the `project_id` and it ensure it matches. -3. From the Service account list, select New service account. -4. In the Service account name field, enter a name. -5. In the Service account ID field, enter an ID. -6. From the Role list, select Service Accounts > Service Account Token Creator. -7. For the Key type, select the JSON option. -8. Click Create. A JSON file that contains your key downloads to your computer. -9. Use the information in this file or the file directly to add to the `service_account` key in the configuration. -10. Go to the [Google API Console](https://console.cloud.google.com/apis/api/homegraph.googleapis.com/overview). -11. Select your project and click Enable HomeGraph API. -12. Try "OK Google, sync my devices" - the Google Home app should import your exposed Home Assistant devices and prompt you to assign them to rooms +1. Service Account + 1. In the Google Cloud Platform Console, go to the [Create Service account key](https://console.cloud.google.com/apis/credentials/serviceaccountkey) page. + 2. At the top left of the page next to "Google Cloud Platform" logo, select your project created in the Actions on Google console. Confirm this by reviewing the project ID and it ensure it matches. + 3. From the Service account list, select New service account. + 4. In the Service account name field, enter a name. + 5. In the Service account ID field, enter an ID. + 6. From the Role list, select `Service Accounts` > `Service Account Token Creator`. + 7. For the Key type, select the JSON option. + 8. Click `Create`. A JSON file that contains your key downloads to your computer. + 9. Use the information in this file or the file directly to add to the `service_account` key in the configuration. + 10. Click `close`. +2. HomeGraph API + 1. Go to the [Google API Console](https://console.cloud.google.com/apis/api/homegraph.googleapis.com/overview). + 2. At the top left of the page next to "Google Cloud Platform" logo, select your project created in the Actions on Google console. Confirm this by reviewing the project ID and it ensure it matches. + 3. Click Enable HomeGraph API. +3. Try "OK Google, sync my devices" - the Google Home app should import your exposed Home Assistant devices and prompt you to assign them to rooms. -### Configuration +### YAML Configuration Now add your setup to your `configuration.yaml` file, such as: From 4050f916d7701a5851f3da8cd5d19d92d991e278 Mon Sep 17 00:00:00 2001 From: Daniel Shokouhi Date: Wed, 3 Mar 2021 01:29:46 -0800 Subject: [PATCH 13/16] Add missing obihai breaking change (#16331) --- source/_posts/2021-02-03-release-20212.markdown | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/source/_posts/2021-02-03-release-20212.markdown b/source/_posts/2021-02-03-release-20212.markdown index 6f1827d7cfe..25730ce8e50 100644 --- a/source/_posts/2021-02-03-release-20212.markdown +++ b/source/_posts/2021-02-03-release-20212.markdown @@ -952,6 +952,20 @@ the quality of matches.

+
+ Obihai +

+ +The `last_caller_info` sensor now has the leading `'' ` (quotes and space) removed +as those were not needed and were randomly provided by the Obihai device. + +So previously the state would be `'' 8185551212` now it is `8185551212` + +([@dshokouhi] - [#44768]) + +

+
+ ## Farewell to the following The following integrations have been removed: From 519e318c588fc1d29832a5ef5b2c3d76848c9660 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 3 Mar 2021 11:20:00 +0100 Subject: [PATCH 14/16] Revert Flux LED config flow changes (#16827) --- source/_integrations/flux_led.markdown | 178 +++++++++++++++++++++---- 1 file changed, 155 insertions(+), 23 deletions(-) diff --git a/source/_integrations/flux_led.markdown b/source/_integrations/flux_led.markdown index c3c426b36c0..c5b30bb9d07 100644 --- a/source/_integrations/flux_led.markdown +++ b/source/_integrations/flux_led.markdown @@ -12,13 +12,148 @@ ha_platforms: The `flux_led` support is integrated into Home Assistant as a light platform. Several brands of both bulbs and controllers use the same protocol and they have the HF-LPB100 chipset in common. The chances are high that your bulb or controller (eg. WiFi LED CONTROLLER) will work if you can control the device with the MagicHome app. -This integration will provide local control over your LED lights/strips and can be configured to auto-scan your network for controllers or for you to manually configure individual lights by their IP address. +Example of bulbs: -### Configuration Details +- [Flux Smart Lighting](https://www.fluxsmartlighting.com/) +- [Flux WiFi Smart LED Light Bulb4](https://amzn.to/2X0dVwu) +- [WIFI smart LED light Bulb1](https://amzn.to/2J2fksr) -The `flux_led` integration is configured through the Configuration -> Integrations page. You can select either auto configuration or manual configuration. For auto configuration the integration will automatically scan your network for any supported devices. +Examples of controllers: -If you select the manual flow you can specify the name and host address of the light controller. You can add multiple lights/strips by adding additional instances of the integration. +- [Ledenet WiFi RGBW Controller](https://amzn.to/2WZKXNa) +- [SUPERNIGHT WiFi Wireless LED Smart Controller](https://amzn.to/2WURx7w) + +## Configuration + +To enable those lights, add the following lines to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +light: + - platform: flux_led +``` + +{% configuration %} +automatic_add: + description: To enable the automatic addition of lights on startup. + required: false + default: false + type: boolean +devices: + description: A list of devices with their IP address. + required: false + type: list + keys: + name: + description: A friendly name for the device. + required: false + type: string + mode: + description: "The chosen brightness mode, options are: `rgbw`, `rgb` and `w`." + required: false + default: rgbw + type: string + protocol: + description: Set this to `ledenet` if you are using a ledenet bulb. + required: false + type: string + custom_effect: + description: A definition of the custom effect. + required: false + type: map + keys: + colors: + description: A list of 1 to 16 colors, used in the effect loop (see example below). Defined as three comma-separated integers between 0 and 255 that represent the color in RGB. There is no way to set brightness, but you can define lower RGB values to simulate lower brightness. E.g., if you want 50% red, define it as `[127,0,0]` instead of `[255,0,0]`. + required: true + type: list + speed_pct: + description: A speed in percents (100 being the fastest), at which controller will transition between the colors. + required: false + type: integer + default: 50 + transition: + description: "A type of transition, which will be used to transition between the colors. Supported values are: `gradual`, `jump` and `strobe`." + required: false + type: string + default: gradual +{% endconfiguration %} + +
+ +Depending on your controller or bulb type, there are two ways to configure brightness. +The integration defaults to rgbw. If your device has a separate white channel, you do not need to specify anything else; changing the white value will adjust the brightness of white channel keeping rgb color constant. However, if your device does not have a separate white channel, you will need to set the mode to rgb. In this mode, the device will keep the same color, and adjust the rgb values to dim or brighten the color. + +
+ +### Example configuration + +Will automatically search and add all lights on start up: + +```yaml +# Example configuration.yaml entry +light: + - platform: flux_led + automatic_add: true +``` + +Will add two lights with given name and create an automation rule to randomly set color each 45 seconds: + +```yaml +light: +# Example configuration.yaml entry + - platform: flux_led + devices: + 192.168.0.106: + name: flux_lamppost + 192.168.0.109: + name: flux_living_room_lamp + +automation: + alias: random_flux_living_room_lamp + trigger: + platform: time_pattern + seconds: '/45' + action: + service: light.turn_on + data: + entity_id: light.flux_living_room_lamp + effect: random +``` + +Will add a light without the white mode: + +```yaml + 192.168.1.10: + name: NAME + mode: "rgb" +``` + +Will add a light with rgb+white mode (default). White and RGB channels can be adjusted independently using a slider and color picker respectively. + +```yaml + 192.168.1.10: + name: NAME + mode: "rgbw" +``` + +Will add a light with white mode only. This is useful when only W channel is connected to an RGBW controller and allows the white level to be controlled via brightness value. + +```yaml + 192.168.1.10: + name: NAME + mode: "w" +``` + +Some devices such as the Ledenet RGBW controller use a slightly different protocol for communicating the brightness to each color channel. If your device is only turning on or off but not changing color or brightness try adding the LEDENET protocol. + +```yaml +light: + - platform: flux_led + devices: + 192.168.1.10: + name: NAME + protocol: 'ledenet' +``` ### Effects @@ -35,26 +170,23 @@ The Flux LED light offers a number of effects which are not included in other li | `gb_cross_fade` | Fades between green and blue. | | `red_strobe`, `green_strobe`, `blue_strobe`, `yellow_strobe`, `cyan_strobe`, `purple_strobe`, `white_strobe` | Strobes the color indicated by the effect name. | | `random` | Chooses a random color by selecting random values for R, G, and B. | -| +| `custom` | Custom effect (if defined, see below). | -### Custom Effects - Service `flux_led.set_custom_effect` - -The `flux_led` integration offers a custom service to enable you to set the lights to a custom light effect. - -| Service data attribute | Description | -| ---------------------- | ----------- | -| `entity_id` | The entity_id of the LED light to set the effect on. | -| `colors` | List of RGB colors to transition between in your effect. (Max 16, Required) | -| `speed_pct` | The speed of the effect in % (0-100. Default 50) | -| `transition` | The transition effect you would like. Valid options are `gradual`, `jump`, or `strobe`. (Default `gradual`) | +Users can define their own custom effect. It consists of three parameters: a list of 1 to 16 colors, speed and type of transition. The controller will transition between the colors in a loop, with sepcified transition and speed. Here is an example of a custom effect that will quickly flash red, yellow, green, cyan, blue, magenta in a loop: ```yaml -#Example Service Call -entity_id: light.led_strip -colors: - - [255,0,0] - - [0,255,0] - - [0,0,255] -speed_pct: 80 -transition: jump +light: + - platform: flux_led + devices: + 192.168.1.10: + custom_effect: + speed_pct: 100 + transition: 'strobe' + colors: + - [255,0,0] + - [255,255,0] + - [0,255,0] + - [0,255,255] + - [0,0,255] + - [255,0,255] ``` From 0816d5c88aa9334ec9e1d4efd49932eda6c7e613 Mon Sep 17 00:00:00 2001 From: DeepCoreSystem Date: Wed, 3 Mar 2021 11:36:56 +0100 Subject: [PATCH 15/16] Update documentation for the light integration (#16781) Co-authored-by: Franck Nijhof --- source/_integrations/light.markdown | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/source/_integrations/light.markdown b/source/_integrations/light.markdown index 70b225bb20f..2b492aeb88c 100644 --- a/source/_integrations/light.markdown +++ b/source/_integrations/light.markdown @@ -13,9 +13,17 @@ This integration allows you to track and control various light bulbs. Read the i ### Default turn-on values -To set the default color, brightness and transition values when the light is turned on, create a custom `light_profiles.csv` (as described below in the `profile` attribute of `light.turn_on`). +To set the default color, brightness and transition values when the light is turned on, create a custom `light_profiles.csv`, normally located in the default configuration folder where you find `configuration.yaml`. -The `.default` suffix should be added to the entity identifier of each light to define a default value, e.g., for `light.ceiling_2` the `id` field is `light.ceiling_2.default`. To define a default for all lights, the identifier `group.all_lights.default` can be used. Individual settings always supercede the `all_lights` default setting. +The `light_profiles.csv` has to have a header. The format of the header is: + +```txt +profile,color_x,color_y,brightness,transition +``` + +The field transition is optional and can be omitted. + +The `.default` suffix should be added to the entity identifier of each light to define a default value, e.g., for `light.ceiling_2` the `profile` field is `light.ceiling_2.default`. To define a default for all lights, the identifier `group.all_lights.default` can be used. Individual settings always supercede the `all_lights` default setting. ### Service `light.turn_on` From 2d80f23bbe07ebd4c3271363ba46ae5b9d1be5c6 Mon Sep 17 00:00:00 2001 From: Allen Porter Date: Wed, 3 Mar 2021 05:54:52 -0800 Subject: [PATCH 16/16] Improve nest troubleshooting and clarify steps based on latest feedback (#16767) --- source/_integrations/nest.markdown | 25 +++++++++++------- .../nest/oauth_consent_production_status.png | Bin 0 -> 21192 bytes 2 files changed, 16 insertions(+), 9 deletions(-) create mode 100644 source/images/integrations/nest/oauth_consent_production_status.png diff --git a/source/_integrations/nest.markdown b/source/_integrations/nest.markdown index 0b039074864..c76b23be06d 100644 --- a/source/_integrations/nest.markdown +++ b/source/_integrations/nest.markdown @@ -85,18 +85,20 @@ Project**. Note: This is a different type of project from the Device Access proj 1. Give your API Project a name then click **Create**. Note: You can ignore the *Project ID* here as Home Assistant does not need it. 1. Click *OAuth consent screen* and make sure you have that configured, otherwise you can do that now... - - Ensure that the ***Publishing status*** is **In Production** and not **Testing**! ![Screenshot of OAuth consent screen creation](/images/integrations/nest/oauth_consent_create.png) -1. Select **External** (the only choice if you are not a G-Suite user) then click **Create**. While you are here, you may click the *Let us know what you think* to give Google's OAuth team any feedback about your experience configuring credentials for self-hosted software. They make regular improvements to this flow and appear to value feedback. +1. Select **External** (the only choice if you are not a G-Suite user) then click **Create**. While you are here, you may click the *Let us know what you think* to give Google's OAuth team any feedback about your experience configuring credentials for self-hosted software. They make regular improvements to this flow and appear to value feedback. -1. The *App Information* screen needs you to enter an **App name** and **User support email**, then enter your email again under **Developer contact email**. These are only shown while you later go through the OAuth flow to authorize Home Assistant to access your account. Click **Save and Continue**. +1. The *App Information* screen needs you to enter an **App name** and **User support email**, then enter your email again under **Developer contact email**. These are only shown while you later go through the OAuth flow to authorize Home Assistant to access your account. Click **Save and Continue**. Omit unnecessary information (e.g. logo) to avoid additional review by Google. 1. On the *Scopes* step click **Save and Continue**. 1. On the *Test Users* step, you need to add your Google Account (e.g., your @gmail.com address) to the list. Click *Save* on your test account then **Save and Continue** to finish the consent flow. ![Screenshot of OAuth consent screen test users](/images/integrations/nest/oauth_consent_test_users.png) +1. Navigate back to the *OAuth consent screen* and click **Publish App** to set the *Publishing status* is *In Production* and not *Testing*. The warning says your *app will be available to any user with a Google Account* which refers to the fields you entered on the *App Information* screen if someone finds the URL. This does not expose your Google Account or Nest data. + ![Screenshot of OAuth consent screen production status](/images/integrations/nest/oauth_consent_production_status.png) + 1. Navigate to the **Credentials** page and click **Create Credentials**. ![Screenshot of APIs and Services Cloud Console](/images/integrations/nest/create_credentials.png) @@ -219,6 +221,17 @@ everything, however, you can leave out any feature you do not wish to use with H - For general trouble with the SDM API OAuth authorization flow with Google, see [Troubleshooting](https://developers.google.com/nest/device-access/authorize#troubleshooting). +- Check **Configuration** then **Logs** to see if there are any error messages or misconfigurations then see the error messages below. + +- *Reauthentication required often*: If you are frequently getting logged out, this means your authentication token was revoked by Google. This most likely reason is the *OAuth Consent Screen* is set to *Testing* by default which expires the token after 7 days. Follow the steps above to set it to *Production* to resolve this and reauthorize your integration one more time to get a new token. You may also see this as the error message *invalid_grant: Token has been expired or revoked*. See [Google Identity: Refresh token expiration](https://developers.google.com/identity/protocols/oauth2#expiration) for more reasons on why your token may have expired. + +- *Thermostat does not appear or is unavailable* happens due to a bug where the SDM API does return the devices. A common fix get the API to work again is to: + - Restart the Thermostat device. See [How to restart or reset a Nest thermostat](https://support.google.com/googlenest/answer/9247296) for more details. + - In the official Nest app or on https://home.nest.com: Move the Thermostat to a different or fake/temporary room. + - Reload the integration in Home Assistant: Navigate to **Configuration** then **Integrations**, click `...` next to *Nest* and choose **Reload**. + +- *No devices or entities are created* if the SDM API is not returning any devices for the authorized account. Double-check that GCP is configured correctly to [Enable the API](https://developers.google.com/nest/device-access/get-started#set_up_google_cloud_platform) and authorize at least one device in the OAuth setup flow. If you have trouble here, then you may want to walk through the Google instructions and issue commands directly against the API until you successfully get back the devices. + - *Error 400: redirect_uri_mismatch* means that your OAuth Client ID is not configured to match your Home Assistant URL. - To resolve this, copy and paste the redirect URI in the error message (`https://:/auth/external/callback`). @@ -243,18 +256,12 @@ everything, however, you can leave out any feature you do not wish to use with H - *Error: invalid_client no application name* means the [OAuth Consent Screen](https://console.developers.google.com/apis/credentials/consent) has not been fully configured for the project. Enter the required fields (App Name, Support Email, Developer Email) and leave everything else as default. -- *No devices or entities are created* if the SDM API is not returning any devices for the authorized account. Double-check that GCP is configured correctly to [Enable the API](https://developers.google.com/nest/device-access/get-started#set_up_google_cloud_platform) and authorize at least one device in the OAuth setup flow. If you have trouble here, then you may want to walk through the Google instructions and issue commands directly against the API until you successfully get back the devices. - -- *Thermostat not created* may be resolved by restarting the *Nest Thermostat*. See [How to restart or reset a Nest thermostat](https://support.google.com/googlenest/answer/9247296) for more details. - - *Subscriber error: Subscription misconfigured. Expected subscriber_id to match...* means that the `configuration.yaml` has an incorrect `subscriber_id` field. Re-enter the the *Subscription Name* which looks like `projects/project-label-22ee1/subscriptions/SUBSCRIBER_ID`. Make sure this is not the *Topic name*. - *Subscriber error: Subscription misconfigured. Expected topic name to match ...* means that the topic name in the Google Cloud Console was entered incorrectly. The topic name comes from the Device Console and must start with `projects/sdm-prod/topics/`. It is easy to make the mistake of creating a new topic rather than manually entering the right topic name. - *Not receiving updates* typically means a problem with the subscriber configuration. Changes for things like sensors or thermostat temperature set points should be instantly published to a topic and received by the Home Assistant susbcriber when everything is configured correctly. -- *invalid_grant: Token has been expired or revoked* can mean the OAuth token was revoked by Google due to account changes like resetting a password. In addition, if the app is marked as "testing" and not "production" mode, the token may automatically expire after 7 days. Go to the project page to publish it to production mode. - - You can see stats about your subscriber in the [Cloud Console](https://console.cloud.google.com/cloudpubsub/subscription/list) which includes counts of messages published by your devices, and how many have been acknowledged by your Home Assistant subscriber. You can also `View Messages` to see examples of published. Many old unacknowledged messages indicate the subscriber is not receivng the messages and working properly or not connected at all. Double check the `subscriber_id` matches the `Subscription Name` - To aid in diagnosing subscriber problems or camera stream issues it may help to turn up verbose logging by adding some or all of these to your `configuration.yaml` depending on where you are having trouble: diff --git a/source/images/integrations/nest/oauth_consent_production_status.png b/source/images/integrations/nest/oauth_consent_production_status.png new file mode 100644 index 0000000000000000000000000000000000000000..ba8daacf9de0ab1e75d83fbe4e897cc3d5eb37e1 GIT binary patch literal 21192 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