From d79f9978d02dfd98acc98e537bb8b5c5b44a7f6d Mon Sep 17 00:00:00 2001 From: rikroe <42204099+rikroe@users.noreply.github.com> Date: Sun, 5 Dec 2021 17:02:32 +0100 Subject: [PATCH 001/247] BMW ConnectedDrive: Update vehicle finder description. (#20570) --- source/_integrations/bmw_connected_drive.markdown | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/source/_integrations/bmw_connected_drive.markdown b/source/_integrations/bmw_connected_drive.markdown index 828a3b96959..83d7b4ad419 100644 --- a/source/_integrations/bmw_connected_drive.markdown +++ b/source/_integrations/bmw_connected_drive.markdown @@ -154,6 +154,19 @@ The service `bmw_connected_drive.light_flash` flashes the lights of the vehicle. The service `bmw_connected_drive.find_vehicle` requests the vehicle to update the GPS location. This can be used for older vehicles which don't automatically send the updated GPS location. The vehicle is identified via the parameter `vin`. +
+ + Using this service will **send your Home Assistant location to BMW**, as this is required by the API (like sharing your mobile phone's location with the MyBMW app for vehicle tracking). + If you do not want this, trigger the `vehicle_finder` service from your phone and it should update in Home Assistant within 5 minutes. + +
+ +
+ + On some older cars (non i3/i8 series produced before 7/2014) this service will fail in getting your vehicles position, if the vehicle is more than 1.5 km away from the location of your Home Assistant instance. This is a limitation of the BMW API. + +
+ ### Update the state The service `bmw_connected_drive.update_state` fetches the last state of the vehicles of all your accounts from the BMW server. This does *not* trigger an update from the vehicle; it gets the data from the BMW servers. So this service does *not* interact with your vehicles. From 5789c44177147f9d5d13e4c75462d5c8ae6df2d0 Mon Sep 17 00:00:00 2001 From: Maximilian <43999966+DeerMaximum@users.noreply.github.com> Date: Mon, 6 Dec 2021 08:01:03 +0000 Subject: [PATCH 002/247] Added documentation for nina (#19472) * Added documentation for nina * Update source/_integrations/nina.markdown Co-authored-by: Marvin Wichmann * Formulations modified and version changed Co-authored-by: Marvin Wichmann --- source/_integrations/nina.markdown | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 source/_integrations/nina.markdown diff --git a/source/_integrations/nina.markdown b/source/_integrations/nina.markdown new file mode 100644 index 00000000000..2f945838acd --- /dev/null +++ b/source/_integrations/nina.markdown @@ -0,0 +1,20 @@ +--- +title: NINA +description: Instructions on how to set up NINA warnings in Home Assistant. +ha_category: + - Binary Sensor +ha_release: 2022.2 +ha_iot_class: Cloud Polling +ha_config_flow: true +ha_codeowners: + - '@DeerMaximum' +ha_domain: nina +ha_platforms: + - binary_sensor +--- + +The [NINA](https://www.bbk.bund.de/DE/Warnung-Vorsorge/Warn-App-NINA/warn-app-nina_node.html) integration displays warnings from the [Bundesamt für Bevölkerungsschutz und Katastrophenhilfe](https://www.bbk.bund.de/) in Germany. + +For each county/city it creates warning slots that change to Unsafe when warnings are present. The text of the warning and the metadata are stored in the attributes of the slots. + +{% include integrations/config_flow.md %} From 8913efccff3dd4aac8d06975d6cfa6a333c36cd5 Mon Sep 17 00:00:00 2001 From: Charles Garwood Date: Tue, 7 Dec 2021 14:52:16 -0500 Subject: [PATCH 003/247] Remove loopenergy docs (#20607) --- CODEOWNERS | 1 - source/_integrations/loopenergy.markdown | 90 ------------------------ source/_redirects | 7 +- 3 files changed, 4 insertions(+), 94 deletions(-) delete mode 100644 source/_integrations/loopenergy.markdown diff --git a/CODEOWNERS b/CODEOWNERS index eedc7d89a3b..794981244eb 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -273,7 +273,6 @@ source/_integrations/local_ip.markdown @issacg source/_integrations/logger.markdown @home-assistant/core source/_integrations/logi_circle.markdown @evanjd source/_integrations/lookin.markdown @ANMalko -source/_integrations/loopenergy.markdown @pavoni source/_integrations/luci.markdown @mzdrale source/_integrations/luftdaten.markdown @fabaff source/_integrations/lupusec.markdown @majuss diff --git a/source/_integrations/loopenergy.markdown b/source/_integrations/loopenergy.markdown deleted file mode 100644 index fc5e7931f13..00000000000 --- a/source/_integrations/loopenergy.markdown +++ /dev/null @@ -1,90 +0,0 @@ ---- -title: Loop Energy -description: Instructions on how to integrate Loop Energy devices within Home Assistant. -ha_category: - - Energy -ha_release: 0.17 -ha_iot_class: Cloud Push -ha_domain: loopenergy -ha_codeowners: - - '@pavoni' -ha_platforms: - - sensor ---- - -
- -Loop Energy has said that on November 13, 2020, they will [switch off the servers which this integration uses](https://email.loop.homes/action-required-how-to-claim-your-free-loop-upgrade-1). This integration will stop working then. - -
- -Integrate your [Loop Energy](https://www.your-loop.com/) meter information into Home Assistant. To use this sensor you need the client serial number and secret keys for your devices. - -The library used to get the data isn't officially supported and the only way to get the keys is to log into loop energy's website and type a command into your browser console. - -To do this log into [Loop Energy](https://www.your-loop.com/). Once you're logged in you should be able see your live readings on the web page. - -You can then open your browser's console window, how you do this varies by browser but in Chrome you click on `More Tools / Developer Tools' and click on the console window. You then type: - -`Drupal.settings.navetas_realtime.` - -This should show something like - -```yaml -client_ip: "127.0.0.1" -gas_secret: "GAS_SECRET" -gas_serial: "GAS_SERIAL" -host: "www.your-loop.com" -... -secret: "ELECTRICAL_SECRET" -serial: "ELECTRICAL_SERIAL" -``` - -The serial and secret tokens are the ones you need. If you just have an electricity monitor then you won't see the gas keys. - -Now you have the keys, add the following lines to your `configuration.yaml`, replacing the `*_SERIAL` and `*_SECRET` keys with the ones you found in the console: - -```yaml -# Example configuration.yaml entry -sensor: - - platform: loopenergy - electricity: - electricity_serial: "ELECTRICAL_SERIAL" - electricity_secret: "ELECTRICAL_SECRET" - gas: - gas_serial: "GAS_SERIAL" - gas_secret: "GAS_SECRET" -``` - -{% configuration %} -electricity_serial: - description: Serial number of your electricity sensor. - required: true - type: string -electricity_secret: - description: Secret key for your electricity sensor. - required: true - type: string -gas_serial: - description: Serial number for your gas sensor. - required: true - type: string -gas_secret: - description: Secret key for your gas sensor. - required: true - type: string -gas_type: - description: Type of meter `imperial` or `metric`. - required: false - default: metric - type: string -gas_calorific: - description: Calorific value of your gas supply (usually on your gas bill). - required: false - default: 39.11 - type: float -{% endconfiguration %} - -The electricity readings are updated every 10 seconds and the gas readings every 15 minutes. - -The gas readings are experimental and not all gas meters are properly supported. So if the data you see doesn't agree with the readings you see via loop energy please report an issue. diff --git a/source/_redirects b/source/_redirects index 2ca0cb706f9..9481809266f 100644 --- a/source/_redirects +++ b/source/_redirects @@ -755,8 +755,6 @@ /components/sensor.logi_circle /integrations/logi_circle#sensor /components/sensor.london_air /integrations/london_air /components/sensor.london_underground /integrations/london_underground -/components/sensor.loop_energy /integrations/loopenergy -/components/sensor.loopenergy /integrations/loopenergy /components/sensor.luftdaten /integrations/luftdaten#sensor /components/sensor.magicseaweed /integrations/magicseaweed /components/sensor.meteo_france /integrations/meteo_france @@ -1505,7 +1503,6 @@ /components/logi_circle /integrations/logi_circle /components/london_air /integrations/london_air /components/london_underground /integrations/london_underground -/components/loopenergy /integrations/loopenergy /components/luci /integrations/luci /components/luftdaten /integrations/luftdaten /components/lupusec /integrations/lupusec @@ -2352,3 +2349,7 @@ /integrations/mychevy /more-info/removed-integration 301 /components/binary_sensor.mychevy /more-info/removed-integration 301 /components/sensor.mychevy /more-info/removed-integration 301 +/integrations/loopenergy /more-info/removed-integration 301 +/components/loopenergy /more-info/removed-integration 301 +/components/sensor.loop_energy /more-info/removed-integration 301 +/components/sensor.loopenergy /more-info/removed-integration 301 \ No newline at end of file From 7e95b7945761c844b2cc4a267c2e9475e059814c Mon Sep 17 00:00:00 2001 From: Alberto Geniola Date: Tue, 7 Dec 2021 22:46:20 +0100 Subject: [PATCH 004/247] Add Elmax integration documentation. (#20240) * Add Elmax integration documentation. * Remove quality scale. Co-authored-by: Marvin Wichmann * Update HA_RELEASE version. Co-authored-by: Marvin Wichmann * Update source/_integrations/elmax.markdown Co-authored-by: Marvin Wichmann * Fix iot_class. Align Elmax naming in a consistent manner. Co-authored-by: Marvin Wichmann --- source/_integrations/elmax.markdown | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 source/_integrations/elmax.markdown diff --git a/source/_integrations/elmax.markdown b/source/_integrations/elmax.markdown new file mode 100644 index 00000000000..0763f0e890d --- /dev/null +++ b/source/_integrations/elmax.markdown @@ -0,0 +1,23 @@ +--- +title: Elmax +description: Instructions on how to integrate Elmax panels within Home Assistant. +ha_category: + - Switch +ha_release: 2022.2 +ha_iot_class: Cloud Polling +ha_config_flow: true +ha_codeowners: + - '@albertogeniola' +ha_domain: elmax +ha_platforms: + - switch +--- + +The Elmax integration enables Home Assistant integration with +[ELMAX](https://www.elmaxsrl.it/) control panels. Elmax panels are +domotic systems focused on intrusion detection and home surveillance. + +The current integration is capable of controlling domotic switches +and actuators connected to the Elmax panels. + +{% include integrations/config_flow.md %} From 7b25d95df4cafdda616fbc32694b82bc57d5c8d3 Mon Sep 17 00:00:00 2001 From: Allen Porter Date: Tue, 7 Dec 2021 23:57:27 -0800 Subject: [PATCH 005/247] Add back simple `redirect_uri_mismatch` instructions (#20614) --- source/_integrations/nest.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_integrations/nest.markdown b/source/_integrations/nest.markdown index 7280de6b8d4..b07da902d42 100644 --- a/source/_integrations/nest.markdown +++ b/source/_integrations/nest.markdown @@ -289,6 +289,8 @@ In this section you will authorize Home Assistant to access your account by gene {% enddetails %} +- *Error 400: redirect_uri_mismatch*: This means you have an existing *Web Application* credential. It is recommended to delete the existing OAuth Client id and create a new *Desktop App* credential using the instructions above. This has the advantage of not requiring SSL or a public DNS name. + - *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: {% details "How to restart thermostat" %} From b31d76d46011507d3a73f8ff8faea11405bbc585 Mon Sep 17 00:00:00 2001 From: purcell-lab <79175134+purcell-lab@users.noreply.github.com> Date: Wed, 8 Dec 2021 19:00:25 +1100 Subject: [PATCH 006/247] Clarify integration is for Gen 3 (#20616) --- source/_integrations/tesla_wall_connector.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/tesla_wall_connector.markdown b/source/_integrations/tesla_wall_connector.markdown index ea65426b814..fbf929ac6d7 100644 --- a/source/_integrations/tesla_wall_connector.markdown +++ b/source/_integrations/tesla_wall_connector.markdown @@ -16,6 +16,6 @@ ha_platforms: - sensor --- -The Tesla Wall Connector integration allows you to integrate your [Tesla Wall Connector](https://www.tesla.com/support/home-charging-installation/wall-connector) into Home Assistant. +The Tesla Wall Connector integration allows you to integrate your Gen 3 [Tesla Wall Connector](https://www.tesla.com/support/home-charging-installation/wall-connector) with Wi-Fi into Home Assistant. {% include integrations/config_flow.md %} From ba3b24e2ea1457200c13fae049365702c062abe5 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 7 Dec 2021 22:30:41 -1000 Subject: [PATCH 007/247] Update flux_led naming (#20613) --- source/_integrations/flux_led.markdown | 70 ++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 5 deletions(-) diff --git a/source/_integrations/flux_led.markdown b/source/_integrations/flux_led.markdown index 0741ecc4502..311105661ac 100644 --- a/source/_integrations/flux_led.markdown +++ b/source/_integrations/flux_led.markdown @@ -1,6 +1,6 @@ --- -title: Flux LED/MagicHome -description: Instructions on how to setup Flux led/MagicHome/MagicLight within Home Assistant. +title: Magic Home +description: Instructions on how to setup Magic Home within Home Assistant. ha_category: - Light - Switch @@ -17,7 +17,7 @@ ha_config_flow: true ha_dhcp: true --- -The Flux LED integration supports several brands of switches, bulbs, and controllers that use the same protocol and have the HF-LPB100 chipset in common. Chances are high that your bulb or controller (eg. WiFi LED CONTROLLER) will work with this integration if you can control the device with the MagicHome app. +The Magic Home integration supports several brands of switches, bulbs, and controllers that use the same protocol. Chances are high that your bulb or controller (eg. WiFi LED CONTROLLER) will work with this integration if you can control the device with the Magic Home 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. @@ -32,11 +32,71 @@ Examples of controllers: - [Ledenet WiFi RGBW Controller](https://amzn.to/2WZKXNa) - [SUPERNIGHT WiFi Wireless LED Smart Controller](https://amzn.to/2WURx7w) +These devices have been sold under at least the following brands: +- Aislan +- [Allkeys](http://allkeystech.com/) +- Apobob +- [Arilux](https://www.ariluxworldwide.com/) +- Aubric +- BERENNIS +- BHGY +- [Brizled](https://www.brizled.com/) +- Bunpeon +- [Chichin](https://chichinlighting.com/) +- Comoyda +- dalattin +- [DALS RGBW / Armacost Lighting / MyLED](https://www.armacostlighting.com/) +- DARKPROOF +- [Daybetter](https://www.daybetter.com/) +- deerdance +- DIAMOND +- [Diode Dynamics](https://www.diodedynamics.com/) +- [Flux LED](https://www.fluxsmartlighting.com/) +- [FVTLED](https://fvtled.com/) +- [GEV LIG](https://www.gev.de/) +- GEYUEYA Home +- GIDEALED +- [GIDERWEL](https://giderwel.com/) +- GMK +- Goldwin +- Hakkatronics +- [HaoDeng](http://www.zengge.com/appkzd) +- HDDFL +- illume RGBW +- INDARUN +- iNextStation +- LEDENET +- Lytworx +- Magic Ambient +- [Magic Home](http://www.zengge.com/appkzd) +- [Magic Hue](http://www.magichue.com/) +- [Magic Light](https://www.magiclightbulbs.com/) +- Miheal +- Mowelai +- Nexlux +- OBSESS +- [Offdarks](http://offdarks.net) +- PH LED +- PHOPOLLO +- [Pin Stadium Pinball Lights](https://pinstadium.com/) +- POV Lamp +- [Rimikon](https://www.rimikon.com/) +- SMFX +- [Sumaote](https://fvtled.com/) +- [Superhome](https://superhome.com.cy/) +- [SuperlightingLED](https://www.superlightingled.com/) +- Svipear +- Tommox +- Vanance +- Yetaida +- YHW +- [Zengge](http://www.zengge.com/sy) +- Zombber {% include integrations/config_flow.md %} -After the devices have been added they can be configured with different effects listed below. These settings can be accessed by navigating to the integration settings in Configuration -> Integrations and selecting the "Flux Led/Magic Home" configuration for the bulb or controller. +After the devices have been added they can be configured with different effects listed below. These settings can be accessed by navigating to the integration settings in Configuration -> Integrations and selecting the "Magic Home" configuration for the bulb or controller. **Custom Effect**\ @@ -48,7 +108,7 @@ This determines the transition between each color. ### Effects -The Flux LED light offers a number of effects which are not included in other lighting packages. These can be selected from the front-end, or sent in the effect field of the `light.turn_on` command. +The Magic Home light offers a number of effects which are not included in other lighting packages. These can be selected from the front-end, or sent in the effect field of the `light.turn_on` command. | Effect Name | Description | |--------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------| From a0d701ccdba95ef6bbb0dd09b394cb87359f229b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Wed, 8 Dec 2021 10:50:19 +0100 Subject: [PATCH 008/247] Change Integrations to Devices & Services (#20620) --- source/_integrations/aemet.markdown | 2 +- source/_integrations/asuswrt.markdown | 2 +- source/_integrations/bmw_connected_drive.markdown | 4 ++-- source/_integrations/control4.markdown | 2 +- source/_integrations/dexcom.markdown | 2 +- source/_integrations/dlna_dmr.markdown | 2 +- source/_integrations/dsmr.markdown | 2 +- source/_integrations/eafm.md | 2 +- source/_integrations/ecobee.markdown | 8 ++++---- source/_integrations/flume.markdown | 2 +- source/_integrations/freebox.markdown | 2 +- source/_integrations/harmony.markdown | 2 +- source/_integrations/homekit.markdown | 12 ++++++------ source/_integrations/huawei_lte.markdown | 2 +- source/_integrations/keenetic_ndms2.markdown | 2 +- source/_integrations/konnected.markdown | 8 ++++---- source/_integrations/meteo_france.markdown | 4 ++-- source/_integrations/mysensors.markdown | 2 +- source/_integrations/nest.markdown | 2 +- source/_integrations/netatmo.markdown | 2 +- source/_integrations/plex.markdown | 2 +- source/_integrations/rfxtrx.markdown | 2 +- source/_integrations/ruckus_unleashed.markdown | 2 +- source/_integrations/screenlogic.markdown | 2 +- source/_integrations/sentry.markdown | 2 +- source/_integrations/somfy_mylink.markdown | 2 +- source/_integrations/subaru.markdown | 2 +- source/_integrations/xiaomi_aqara.markdown | 2 +- source/_integrations/zha.markdown | 4 ++-- source/_integrations/zwave.markdown | 2 +- source/_integrations/zwave_js.markdown | 2 +- 31 files changed, 45 insertions(+), 45 deletions(-) diff --git a/source/_integrations/aemet.markdown b/source/_integrations/aemet.markdown index 205daa6ba74..fe5bce9d3aa 100644 --- a/source/_integrations/aemet.markdown +++ b/source/_integrations/aemet.markdown @@ -27,7 +27,7 @@ The AEMET OpenData service is completely free but is limited to the Spanish terr ## Configuration -To add AEMET OpenData integration go to **Configuration** >> **Integrations** and find the integration in the list. +To add AEMET OpenData integration go to **Configuration** >> **Devices & Services** and find the integration in the list. {% configuration_basic %} API Key: diff --git a/source/_integrations/asuswrt.markdown b/source/_integrations/asuswrt.markdown index 4147c6cdc3e..fd1a56ce702 100644 --- a/source/_integrations/asuswrt.markdown +++ b/source/_integrations/asuswrt.markdown @@ -28,7 +28,7 @@ There is currently support for the following device types within Home Assistant: To add your ASUSWRT devices into your Home Assistant installation, go to: -**Configuration** -> **Integrations** in the UI, click the button with `+` sign and from the list of integrations select **ASUSWRT**. +**Configuration** -> **Devices & Services** in the UI, click the button with `+` sign and from the list of integrations select **ASUSWRT**.
diff --git a/source/_integrations/bmw_connected_drive.markdown b/source/_integrations/bmw_connected_drive.markdown index 83d7b4ad419..eeab1531106 100644 --- a/source/_integrations/bmw_connected_drive.markdown +++ b/source/_integrations/bmw_connected_drive.markdown @@ -44,14 +44,14 @@ This integration provides the following platforms: ## Configuration -The preferred way to enable the `bmw_connected_drive` integration is via **Configuration** > **Integrations**. After connecting to your account, you can set the following settings in the integration's options: +The preferred way to enable the `bmw_connected_drive` integration is via **Configuration** > **Devices & Services**. After connecting to your account, you can set the following settings in the integration's options: | Setting | Description | |---------|-------------| | Read-only | No execution of services to the vehicle. Still possible to send messages and POIs via `notify` and to request a status update via `bmw_connected_drive.update_state`. | Use Home Assistant location for car location polls | Older cars (non i3/i8 build before 7/2014) require the phone to be close to the car to get location updates. Enable this option to use the location of your Home Assistant instance for these queries, so updates are available when your car is in the surrounding of your home. | -The following settings in your `configuration.yaml` file are considered legacy. They will be imported into **Configuration** > **Integrations** and you can set the options from above. Changes to `configuration.yaml` after the first import will be ignored. +The following settings in your `configuration.yaml` file are considered legacy. They will be imported into **Configuration** > **Devices & Services** and you can set the options from above. Changes to `configuration.yaml` after the first import will be ignored. ### Legacy configuration diff --git a/source/_integrations/control4.markdown b/source/_integrations/control4.markdown index a919eb2ebb4..54d08b7f0d3 100644 --- a/source/_integrations/control4.markdown +++ b/source/_integrations/control4.markdown @@ -23,7 +23,7 @@ Before setting up, you should assign a static IP address/DHCP reservation on you ## Options -The Control4 integration offers additional options in **Configuration** -> **Integrations** -> **Control4** -> **Options**: +The Control4 integration offers additional options in **Configuration** -> **Devices & Services** -> **Control4** -> **Options**: {% configuration %} Seconds between updates: diff --git a/source/_integrations/dexcom.markdown b/source/_integrations/dexcom.markdown index f9b52bb8dc8..09f67da9752 100644 --- a/source/_integrations/dexcom.markdown +++ b/source/_integrations/dexcom.markdown @@ -31,7 +31,7 @@ There are two Dexcom Share servers, `US` for United States customers, and `OUS` ### Unit of measurement -The integrations allows both `mg/dL` and `mmol/l` units of measurement for blood glucose values. To change your preferred unit of measurement, got to **Configuration** >> **Integrations** in the UI, and click `OPTIONS`. +The integrations allows both `mg/dL` and `mmol/l` units of measurement for blood glucose values. To change your preferred unit of measurement, got to **Configuration** >> **Devices & Services** in the UI, and click `OPTIONS`. ## Sensor diff --git a/source/_integrations/dlna_dmr.markdown b/source/_integrations/dlna_dmr.markdown index 2a3fc1721e8..ab6db01576d 100644 --- a/source/_integrations/dlna_dmr.markdown +++ b/source/_integrations/dlna_dmr.markdown @@ -23,7 +23,7 @@ Please note that some devices, such as Samsung TVs, are rather picky about the s ## Options -Options for DLNA DMR devices can be set going to **Configuration** -> **Integrations** -> **DLNA Digital Media Renderer** -> **Configuration**. +Options for DLNA DMR devices can be set going to **Configuration** -> **Devices & Services** -> **DLNA Digital Media Renderer** -> **Configuration**. {% configuration_basic %} Event listener port: diff --git a/source/_integrations/dsmr.markdown b/source/_integrations/dsmr.markdown index 0a8d32bd63a..2c306988856 100644 --- a/source/_integrations/dsmr.markdown +++ b/source/_integrations/dsmr.markdown @@ -36,7 +36,7 @@ A sensor platform for Belgian, Dutch, Luxembourg and Swedish Smart Meters which ### Options -To configure options for DSMR integration go to **Configuration** >> **Integrations** and press **Options** on the DSMR card. +To configure options for DSMR integration go to **Configuration** >> **Devices & Services** and press **Options** on the DSMR card. #### Time between updates diff --git a/source/_integrations/eafm.md b/source/_integrations/eafm.md index 46dedd7499c..552f283f5ef 100644 --- a/source/_integrations/eafm.md +++ b/source/_integrations/eafm.md @@ -21,7 +21,7 @@ The UK Environment Agency Flood Monitoring only provides data for England - Nort ## Configuration -Home Assistant offers the flood monitoring integration through **Configuration** -> **Integrations** -> **Environment Agency Flood Gauges**. +Home Assistant offers the flood monitoring integration through **Configuration** -> **Devices & Services** -> **Environment Agency Flood Gauges**. You will be prompted to select a monitoring station. You can find the name of nearby monitoring stations on the Flood information service [website](https://flood-warning-information.service.gov.uk/river-and-sea-levels). diff --git a/source/_integrations/ecobee.markdown b/source/_integrations/ecobee.markdown index f65f11165c8..6e8345ab093 100644 --- a/source/_integrations/ecobee.markdown +++ b/source/_integrations/ecobee.markdown @@ -50,14 +50,14 @@ Your new application will now appear on the left. Upon clicking on the applicati ## Configuration -1. In the **Configuration** > **Integrations** menu, click **+** and then select "ecobee" from the pop-up menu. +1. In the **Configuration** > **Devices & Services** menu, click **+** and then select "ecobee" from the pop-up menu. 2. In the pop-up box, enter the API key you obtained from ecobee's [developer portal](https://ecobee.com/developers). 3. In the next pop-up box, you will be presented with a unique four-character PIN code which you will need to authorize in the [ecobee consumer portal](https://www.ecobee.com/consumerportal/index.html). You can do this by logging in, selecting **My Apps** from the hamburger menu, clicking **Add Application** on the left, entering the PIN code from Home Assistant, clicking **Validate** and then **Add Application** in the bottom right. 4. After authorizing the app with ecobee, return to Home Assistant and click **Submit**. If the authorization was successful, a configuration entry will be created and your thermostats and sensors will be available in Home Assistant. ## Manual Configuration -If you prefer to set up the integration in [`configuration.yaml`](/docs/configuration/), add your API key (and optional parameters) as follows (however, you must still complete authorization via the **Integrations** menu): +If you prefer to set up the integration in [`configuration.yaml`](/docs/configuration/), add your API key (and optional parameters) as follows (however, you must still complete authorization via the **Integrations** panel): ```yaml # Example configuration.yaml entry @@ -67,7 +67,7 @@ ecobee: {% configuration %} api_key: - description: Your ecobee API key. This is only needed for the initial setup of the integration. Once registered it can be removed. If you revoke the key in the ecobee portal, you will need to remove the existing `ecobee` configuration in the **Integrations** menu, update this, and then configure the integration again. + description: Your ecobee API key. This is only needed for the initial setup of the integration. Once registered it can be removed. If you revoke the key in the ecobee portal, you will need to remove the existing `ecobee` configuration in the **Integrations** panel, update this, and then configure the integration again. required: false type: string {% endconfiguration %} @@ -77,7 +77,7 @@ api_key:

-You must [restart Home Assistant](/docs/configuration/#reloading-changes) for the changes to take effect. After restarting, navigate to the **Configuration** > **Integrations** menu, hit **Configure** next to the discovered `ecobee` entry, and continue to authorize the app according to the above **Automatic Configuration**, starting at step 2. +You must [restart Home Assistant](/docs/configuration/#reloading-changes) for the changes to take effect. After restarting, navigate to the **Configuration** > **Devices & Services** menu, hit **Configure** next to the discovered `ecobee` entry, and continue to authorize the app according to the above **Automatic Configuration**, starting at step 2. ## Notifications diff --git a/source/_integrations/flume.markdown b/source/_integrations/flume.markdown index 8c82bd82711..69b39943575 100644 --- a/source/_integrations/flume.markdown +++ b/source/_integrations/flume.markdown @@ -25,7 +25,7 @@ You can find your Client ID and Client Secret under "API Access" on the [setting The Flume API access is available to Flume Insight users only, which may require a paid subscription. -To add `Flume` to your installation, go to **Configuration** >> **Integrations** in the UI, click the button with `+` sign and from the list of integrations select **Flume**. +To add `Flume` to your installation, go to **Configuration** >> **Devices & Services** in the UI, click the button with `+` sign and from the list of integrations select **Flume**. ## Configuration for Binary Sensor diff --git a/source/_integrations/freebox.markdown b/source/_integrations/freebox.markdown index 7f6c806f84a..2b751485aaa 100644 --- a/source/_integrations/freebox.markdown +++ b/source/_integrations/freebox.markdown @@ -36,7 +36,7 @@ Please consult the [API documentation](https://dev.freebox.fr/sdk/os/) for more ### Via the frontend -Menu: **Configuration** -> **Integrations**. Search for "Freebox", add your host and port, click submit. +Menu: **Configuration** -> **Devices & Services**. Search for "Freebox", add your host and port, click submit. If you add the integration for the first time, follow the instructions in the [Initial setup](#initial-setup) section. diff --git a/source/_integrations/harmony.markdown b/source/_integrations/harmony.markdown index 5f403dbc461..c61e59d8c73 100644 --- a/source/_integrations/harmony.markdown +++ b/source/_integrations/harmony.markdown @@ -32,7 +32,7 @@ Supported units: {% include integrations/config_flow.md %} -Once the Logitech Harmony Hub has been configured, the default activity and duration in seconds between sending commands to a device can be adjusted in the settings via **Configuration** >> **Integrations** >> **Your Logitech Harmony Hub** +Once the Logitech Harmony Hub has been configured, the default activity and duration in seconds between sending commands to a device can be adjusted in the settings via **Configuration** >> **Devices & Services** >> **Your Logitech Harmony Hub** ### Configuration file diff --git a/source/_integrations/homekit.markdown b/source/_integrations/homekit.markdown index 94229cdc5f7..c91e197cf18 100644 --- a/source/_integrations/homekit.markdown +++ b/source/_integrations/homekit.markdown @@ -306,7 +306,7 @@ The HomeKit Accessory Protocol Specification only allows a maximum of 150 unique ### Multiple HomeKit instances -If you create a HomeKit integration via the UI (i.e., **Configuration** >> **Integrations**), it must be configured via the UI **only**. While the UI only offers limited configuration options at the moment, any attempt to configure a HomeKit instance created in the UI via the `configuration.yaml` file will result in another instance of HomeKit running on a different port. +If you create a HomeKit integration via the UI (i.e., **Configuration** >> **Devices & Services**), it must be configured via the UI **only**. While the UI only offers limited configuration options at the moment, any attempt to configure a HomeKit instance created in the UI via the `configuration.yaml` file will result in another instance of HomeKit running on a different port. It is recommended to only edit a HomeKit instance in the UI that was created in the UI, and likewise, only edit a HomeKit instance in YAML that was created in YAML. @@ -479,15 +479,15 @@ The following home hubs have been reported to have trouble with a large number o ### Resetting when created via YAML - 1. Delete the `HomeKit` integration in the **{% my integrations %}** screen. + 1. Delete the `HomeKit` integration in the **{% my integrations %}** panel. 2. **Restart** Home Assistant. 3. The configuration will be automatically reimported from YAML. 4. [Pair the bridge or accessory](#setup). -### Resetting when created via the **Integrations** screen +### Resetting when created via the **Integrations** panel - 1. Delete the `HomeKit` integration in the **Integrations** screen. - 2. Recreate the `HomeKit` integration in the **Integrations** screen. + 1. Delete the `HomeKit` integration in the **Integrations** panel. + 2. Recreate the `HomeKit` integration in the **Integrations** panel. 3. [Pair the bridge or accessory](#setup). ### Errors during pairing @@ -600,7 +600,7 @@ Ensure that the [`ffmpeg`](/integrations/ffmpeg) integration is configured corre #### Camera streaming is unstable or slow -If your camera supports native H.264 streams, Home Assistant can avoid converting the video stream, which is an expensive operation. To enable native H.264 streaming when configured via YAML, change the `video_codec` to `copy`. To allow native H.264 streaming when setting up HomeKit via the UI, go to **Configuration** >> **Integrations** in the UI, click **Options** for your HomeKit Bridge, and check the box for your camera on the `Cameras that support native H.264 streams` screen. +If your camera supports native H.264 streams, Home Assistant can avoid converting the video stream, which is an expensive operation. To enable native H.264 streaming when configured via YAML, change the `video_codec` to `copy`. To allow native H.264 streaming when setting up HomeKit via the UI, go to **Configuration** >> **Devices & Services** in the UI, click **Options** for your HomeKit Bridge, and check the box for your camera on the `Cameras that support native H.264 streams` screen. #### Multiple camera streams diff --git a/source/_integrations/huawei_lte.markdown b/source/_integrations/huawei_lte.markdown index eba6ea7c1f7..883cd9f91cc 100644 --- a/source/_integrations/huawei_lte.markdown +++ b/source/_integrations/huawei_lte.markdown @@ -68,7 +68,7 @@ entities varies by device model and firmware version. ### Configuration via the frontend -Menu: **Configuration** -> **Integrations**. +Menu: **Configuration** -> **Devices & Services**. Click on the `+` sign to add an integration and click on **Huawei LTE**, and follow the configuration flow. After finishing, the Huawei diff --git a/source/_integrations/keenetic_ndms2.markdown b/source/_integrations/keenetic_ndms2.markdown index 70e64e5453f..7ab8027803d 100644 --- a/source/_integrations/keenetic_ndms2.markdown +++ b/source/_integrations/keenetic_ndms2.markdown @@ -20,4 +20,4 @@ Router running NDMS firmware versions 2.05 and up. It uses telnet connection so ## Configuration -To add Keenetic router to your installation, go to **Configuration** >> **Integrations** in the UI, click the button with `+` sign and from the list of integrations select **Keenetic NDMS2 Router**. +To add Keenetic router to your installation, go to **Configuration** >> **Devices & Services** in the UI, click the button with `+` sign and from the list of integrations select **Keenetic NDMS2 Router**. diff --git a/source/_integrations/konnected.markdown b/source/_integrations/konnected.markdown index 6c7385da613..8f8dc4df672 100644 --- a/source/_integrations/konnected.markdown +++ b/source/_integrations/konnected.markdown @@ -48,7 +48,7 @@ Konnected devices communicate with Home Assistant over your local LAN -- there i ### Web Interface -Starting with 0.106.0 Home Assistant requires UI based configuration of Konnected via **Configuration** -> **Integrations** in the Home Assistant (web) frontend. If you have Konnected Alarm Panels on your LAN, or in your configuration.yaml, you will see one or more **Konnected.io** entries appear in the **Discovered** integrations list. +Starting with 0.106.0 Home Assistant requires UI based configuration of Konnected via **Configuration** -> **Devices & Services** in the Home Assistant (web) frontend. If you have Konnected Alarm Panels on your LAN, or in your configuration.yaml, you will see one or more **Konnected.io** entries appear in the **Discovered** integrations list. Selecting one of these discovered panels will guide you through connecting and configuring the panel. If your panel was discovered via SSDP, you shouldn't need any information to complete configuration - simply confirm that the information displayed is correct. If the UI prompts you for IP/Port, you'll need to enter it. IP/Port info can be found using the Konnected mobile app. @@ -56,15 +56,15 @@ Selecting one of these discovered panels will guide you through connecting and c If you have an existing `configuration.yaml` completing the UI configuration will do a one time import of the settings contained in `configuration.yaml`. Once the import creates a **Configured** integration the Konnected section of the `configuration.yaml` is no longer used - it is recommended to remove the `konnected` section of `configuration.yaml` and after the import occurs. Any future changes to settings should occur via the settings provided in the Home Assistant web interface. -If you want to retain `configuration.yaml` and need to re-import any changes or updates you will need to delete the entry in **Configuration** -> **Integrations** -> **Configured** and repeat the UI configuration for that device. +If you want to retain `configuration.yaml` and need to re-import any changes or updates you will need to delete the entry in **Configuration** -> **Devices & Services** -> **Configured** and repeat the UI configuration for that device.
-Once configuration is completed you'll see a Konnected.io entry in **Configuration** -> **Integrations** => **Configured**. If you imported settings from `configuration.yaml` you are now done! If you are setting up a new Konnected Alarm Panel or modifying settings, you'll need to utilize the settings UI to configure zone behavior. +Once configuration is completed you'll see a Konnected.io entry in **Configuration** -> **Devices & Services** => **Configured**. If you imported settings from `configuration.yaml` you are now done! If you are setting up a new Konnected Alarm Panel or modifying settings, you'll need to utilize the settings UI to configure zone behavior. #### Using Settings UI to Configure Zone Behavior -The settings for each panel can be accessed by selecting the entry in **Configuration** -> **Integrations** => **Configured** and then clicking on the gear icon in the upper right corner. You can reconfigure these settings at any time and once completed the settings will be immediately applied. +The settings for each panel can be accessed by selecting the entry in **Configuration** -> **Devices & Services** => **Configured** and then clicking on the gear icon in the upper right corner. You can reconfigure these settings at any time and once completed the settings will be immediately applied. The settings UI starts by having you configure the general behavior of each zone. You need to specify `Disabled`, `Binary Sensor`, `Digital Sensor`, or `Switchable Output` for each zone. After that, you'll be prompted, for each zone that is not disabled, to configure details of the zones' behavior. All zones will allow entry of a Name. Additional fields depend on how you configured the general behavior of the zone. **Note some zones do not support all behaviors. The UI will reflect specific options available to each zone.** diff --git a/source/_integrations/meteo_france.markdown b/source/_integrations/meteo_france.markdown index 086caf9645e..f2d2e518469 100644 --- a/source/_integrations/meteo_france.markdown +++ b/source/_integrations/meteo_france.markdown @@ -33,7 +33,7 @@ It displays the current weather along with a 5 days forecast and create sensors, To be used with the weather Lovelace card to access current condition, today and next four days forecast. -The weather platform can be configured in the frontend to decide if the forecast is given daily (default) or hourly. To change the setting go in **Configuration** -> **Integrations**, click on the city name in **Météo-France** box and click on **Options**. You can update the `Forecast mode` by choosing between `daily` or `hourly`. +The weather platform can be configured in the frontend to decide if the forecast is given daily (default) or hourly. To change the setting go in **Configuration** -> **Devices & Services**, click on the city name in **Météo-France** box and click on **Options**. You can update the `Forecast mode` by choosing between `daily` or `hourly`. ## Sensor platforms @@ -58,7 +58,7 @@ All the following sensors will be created : Warning: The probability entities data are not always provided by the API. They are added only if available. -To enable an entity disabled by default, go in **Configuration** -> **Integrations**, click on the city name in **Météo-France** and then the **X entities** link. You will have the list of the enabled entities. Here click the filter button and select **Show disable entities**. The disabled entities will be visible in the list, select the one you want to enable and click the **Enable Selected** button. +To enable an entity disabled by default, go in **Configuration** -> **Devices & Services**, click on the city name in **Météo-France** and then the **X entities** link. You will have the list of the enabled entities. Here click the filter button and select **Show disable entities**. The disabled entities will be visible in the list, select the one you want to enable and click the **Enable Selected** button. ### About `next_rain` condition sensor diff --git a/source/_integrations/mysensors.markdown b/source/_integrations/mysensors.markdown index 593bc3a79ff..e5f8c4b2381 100644 --- a/source/_integrations/mysensors.markdown +++ b/source/_integrations/mysensors.markdown @@ -25,7 +25,7 @@ The [MySensors](https://www.mysensors.org) project combines devices like Arduino ## Configuration -To integrate your Serial, Ethernet (LAN) or MQTT MySensors Gateway, go to **Configuration** >> **Integrations** in the UI, click the button with `+` sign and from the list of integration select **MySensors**. +To integrate your Serial, Ethernet (LAN) or MQTT MySensors Gateway, go to **Configuration** >> **Devices & Services** in the UI, click the button with `+` sign and from the list of integration select **MySensors**. Configuration depends on the type of Gateway you use: diff --git a/source/_integrations/nest.markdown b/source/_integrations/nest.markdown index b07da902d42..5d3af5b4d35 100644 --- a/source/_integrations/nest.markdown +++ b/source/_integrations/nest.markdown @@ -297,7 +297,7 @@ In this section you will authorize Home Assistant to access your account by gene - 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**. +- Reload the integration in Home Assistant: Navigate to **Configuration** then **Devices & Services**, click `...` next to *Nest* and choose **Reload**. {% enddetails %} diff --git a/source/_integrations/netatmo.markdown b/source/_integrations/netatmo.markdown index 70d4cea4e2f..598cc26c383 100644 --- a/source/_integrations/netatmo.markdown +++ b/source/_integrations/netatmo.markdown @@ -235,7 +235,7 @@ client_secret: **After the client_id and client_secret is added to your `configuration.yaml` you must enable Netatmo through the integrations page.** -Menu: **Configuration** -> **Integrations**. +Menu: **Configuration** -> **Devices & Services**. Click on the `+` sign to add an integration and click on **Netatmo**. After completing the configuration flow, the Netatmo integration will be available. diff --git a/source/_integrations/plex.markdown b/source/_integrations/plex.markdown index 82867e5dd89..c3e1f15c164 100644 --- a/source/_integrations/plex.markdown +++ b/source/_integrations/plex.markdown @@ -338,5 +338,5 @@ play_plex_on_tv: ## Notes -- The Plex integration supports multiple Plex servers. Additional connections can be configured under **Configuration** > **Integrations**. +- The Plex integration supports multiple Plex servers. Additional connections can be configured under **Configuration** > **Devices & Services**. - Movies must be located under the 'Movies' section in a Plex library to properly view the 'playing' state. diff --git a/source/_integrations/rfxtrx.markdown b/source/_integrations/rfxtrx.markdown index f23df8486f7..7691eebf043 100644 --- a/source/_integrations/rfxtrx.markdown +++ b/source/_integrations/rfxtrx.markdown @@ -62,7 +62,7 @@ You can host your device on another computer by setting up ser2net and example c ## Settings options -To configure options for RFXtrx integration go to **Configuration** >> **Integrations** and press **Options** on the RFXtrx card. +To configure options for RFXtrx integration go to **Configuration** >> **Devices & Services** and press **Options** on the RFXtrx card. diff --git a/source/_integrations/ruckus_unleashed.markdown b/source/_integrations/ruckus_unleashed.markdown index 4471131124c..59fc1e633b5 100644 --- a/source/_integrations/ruckus_unleashed.markdown +++ b/source/_integrations/ruckus_unleashed.markdown @@ -21,7 +21,7 @@ There is currently support for the following device types within Home Assistant: ## Configuration -To add a Ruckus Unleashed device to your installation, go to **Configuration** -> **Integrations**, click the `+` button, then select **Ruckus** from the list of integrations. +To add a Ruckus Unleashed device to your installation, go to **Configuration** -> **Devices & Services**, click the `+` button, then select **Ruckus** from the list of integrations. It is required to configure the IP address of your **master access point**. See the section Access Points on the management web interface. And perhaps consider to set a preferred master (Admin & Services>System>System Info>Preferred master). diff --git a/source/_integrations/screenlogic.markdown b/source/_integrations/screenlogic.markdown index f94235da592..95f0de35c09 100644 --- a/source/_integrations/screenlogic.markdown +++ b/source/_integrations/screenlogic.markdown @@ -28,7 +28,7 @@ The Pentair ScreenLogic integration allows you to integrate your Pentair Intelli ## Options -ScreenLogic options are set via **Configuration** -> **Integrations** -> **Pentair ScreenLogic** -> **Options**. +ScreenLogic options are set via **Configuration** -> **Devices & Services** -> **Pentair ScreenLogic** -> **Options**. * Seconds between scans - How many seconds between each polling of the ScreenLogic gateway. diff --git a/source/_integrations/sentry.markdown b/source/_integrations/sentry.markdown index a70830676ce..28e2d6a0830 100644 --- a/source/_integrations/sentry.markdown +++ b/source/_integrations/sentry.markdown @@ -45,6 +45,6 @@ The Sentry integration provides settings to: - Ability to send out events originating from third-party Python packages. - Enable performance tracing and tune the tracing sample rate used. -To change the settings go in **Configuration** -> **Integrations**, find the already installed **Sentry** box and click on **Options**. +To change the settings go in **Configuration** -> **Devices & Services**, find the already installed **Sentry** box and click on **Options**. After changing Sentry settings, you'll need to restart Home Assistant in order to make them effective. diff --git a/source/_integrations/somfy_mylink.markdown b/source/_integrations/somfy_mylink.markdown index 61020e115f7..0b86d60ba8b 100644 --- a/source/_integrations/somfy_mylink.markdown +++ b/source/_integrations/somfy_mylink.markdown @@ -17,4 +17,4 @@ The `Somfy MyLink` integration is used as an interface to a compatible Somfy MyL {% include integrations/config_flow.md %} -If any of your devices are reversed, they can be adjusted in **Configuration** >> **Integrations** >> **Somfy MyLink** >> `Options`. +If any of your devices are reversed, they can be adjusted in **Configuration** >> **Devices & Services** >> **Somfy MyLink** >> `Options`. diff --git a/source/_integrations/subaru.markdown b/source/_integrations/subaru.markdown index d7ca78bbc09..c9f396a143f 100644 --- a/source/_integrations/subaru.markdown +++ b/source/_integrations/subaru.markdown @@ -54,7 +54,7 @@ If your account includes multiple vehicles, the same PIN will be used for all ve Subaru integration options are set via: -**Configuration** -> **Integrations** -> **Subaru** -> **Options**. +**Configuration** -> **Devices & Services** -> **Subaru** -> **Options**. The only option is: diff --git a/source/_integrations/xiaomi_aqara.markdown b/source/_integrations/xiaomi_aqara.markdown index 7f3455c4599..df311d749b3 100644 --- a/source/_integrations/xiaomi_aqara.markdown +++ b/source/_integrations/xiaomi_aqara.markdown @@ -65,7 +65,7 @@ Please note, there are two versions of the hub: v1 and v2. v1 can be used with H Follow the setup process using your phone and Mi-Home app. From here you will be able to retrieve the key (password) from within the app following [this tutorial](https://www.domoticz.com/wiki/Xiaomi_Gateway_(Aqara)#Adding_the_Xiaomi_Gateway_to_Domoticz). -To enable {{ page.title }} in your installation, go to **Configuration** in the sidebar, then click **Integrations**. Xiaomi Aqara gateways should be discovered automatically and should show up in the overview. Hit configure and go through the steps to specify the optional settings. If your aqara gateway does not show up automatically, click the + icon in the lower right. Then search for "xiaomi_aqara" and enter the setup. Multiple gateways can be configured by simply repeating the setup multiple times. +To enable {{ page.title }} in your installation, go to **Configuration** in the sidebar, then click **Devices & Services**. Xiaomi Aqara gateways should be discovered automatically and should show up in the overview. Hit configure and go through the steps to specify the optional settings. If your aqara gateway does not show up automatically, click the + icon in the lower right. Then search for "xiaomi_aqara" and enter the setup. Multiple gateways can be configured by simply repeating the setup multiple times. {% configuration %} interface: diff --git a/source/_integrations/zha.markdown b/source/_integrations/zha.markdown index 18aced7b7c2..464c99219e9 100644 --- a/source/_integrations/zha.markdown +++ b/source/_integrations/zha.markdown @@ -338,7 +338,7 @@ This service disables a lock code on a Zigbee lock. To add a new device: -1. Go to the **Integrations** page, find the **Zigbee Home Automation** integration that was added by the configuration steps above, and select **Configure**. +1. Go to the **Integrations** panel, find the **Zigbee Home Automation** integration that was added by the configuration steps above, and select **Configure**. 1. Click on the plus button at the bottom right corner to start a scan for new devices. 1. Reset your Zigbee devices according to the device instructions provided by the manufacturer (e.g., turn on/off lights up to 10 times, switches usually have a reset button/pin). It might take a few seconds for the devices to appear. You can click on **Show logs** for more verbose output. 1. Once the device is found, it will appear on that page and will be automatically added to your devices. You can optionally change its name and add it to an area (you can change this later). You can search again to add another device, or you can go back to the list of added devices. @@ -405,7 +405,7 @@ When reporting issues, please provide the following information in addition to i 1. Debug logs for the issue, see [debug logging](#debug-logging) 2. Model of Zigbee radio being used 3. If issue is related to a specific Zigbee device, provide device Zigbee signature. Signature is available at -**Configuration** -> **Integrations** -> **Zigbee Home Automation** (click **Configure**) -> **Devices** (pick your device) -> **Zigbee Device Signature** +**Configuration** -> **Devices & Services** -> **Zigbee Home Automation** (click **Configure**) -> **Devices** (pick your device) -> **Zigbee Device Signature** ### Debug logging diff --git a/source/_integrations/zwave.markdown b/source/_integrations/zwave.markdown index 41ddbf00efe..c26e041c371 100644 --- a/source/_integrations/zwave.markdown +++ b/source/_integrations/zwave.markdown @@ -674,7 +674,7 @@ You can use the **Remove Failed Node** button to remove a failed device (e.g., b ## Control panel -The Z-Wave control panel is available via **Configuration** → **Integrations** → **Z-Wave** → **Configure**. +The Z-Wave control panel is available via **Configuration** → **Devices & Services** → **Z-Wave** → **Configure**. - **No Z-Wave integration?** Follow the [set up instructions](/integrations/zwave/#detailed-installation-instructions) to enable it. - **Missing the *Configuration* button?** See the [configuration documentation](/integrations/config/) for instructions on enabling it. diff --git a/source/_integrations/zwave_js.markdown b/source/_integrations/zwave_js.markdown index 8146f02e63b..5d7f788e8af 100644 --- a/source/_integrations/zwave_js.markdown +++ b/source/_integrations/zwave_js.markdown @@ -724,7 +724,7 @@ to pick up those new names, either reload the integration or restart Home Assist When trying to determine why something isn't working as you expect, or when reporting an issue with the integration, it is helpful to know what Z-Wave JS sees as the current state of your Z-Wave network. To get a dump of your current network state, follow the menu: -**Configuration** -> **Integrations** -> **Z-Wave JS** -> **Configure** -> **Download a dump of your network to help diagnose issues** +**Configuration** -> **Devices & Services** -> **Z-Wave JS** -> **Configure** -> **Download a dump of your network to help diagnose issues** ### Interference issues From 2bb896b758880c4ef92dcb443ae54f02ca47d53f Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 8 Dec 2021 21:52:31 +0100 Subject: [PATCH 009/247] Fix example on MQTT button page (#20621) --- source/_integrations/button.mqtt.markdown | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/source/_integrations/button.mqtt.markdown b/source/_integrations/button.mqtt.markdown index 50d590af744..6ed781f664f 100644 --- a/source/_integrations/button.mqtt.markdown +++ b/source/_integrations/button.mqtt.markdown @@ -180,20 +180,21 @@ In this section, you will find some real-life examples of how to use this featur ### Full configuration -The example below shows a full configuration for a switch. +The example below shows a full configuration for a button. ```yaml # Example configuration.yaml entry -switch: +button: - platform: mqtt unique_id: bedroom_switch_reboot_btn - name: "Reboot Bedroom Switch" + name: "Restart Bedroom Switch" state_topic: "home/bedroom/switch1" command_topic: "home/bedroom/switch1/commands" availability: - topic: "home/bedroom/switch1/available" - payload_press: "reboot" + payload_press: "restart" qos: 0 retain: false entity_category: "config" + device_class: "restart" ``` From f27a54960788fe8df58c81dd2dabe9f4dc1a1695 Mon Sep 17 00:00:00 2001 From: purcell-lab <79175134+purcell-lab@users.noreply.github.com> Date: Thu, 9 Dec 2021 08:02:42 +1100 Subject: [PATCH 010/247] Include Category Energy (#20625) --- source/_integrations/tesla_wall_connector.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_integrations/tesla_wall_connector.markdown b/source/_integrations/tesla_wall_connector.markdown index fbf929ac6d7..8d47a55a057 100644 --- a/source/_integrations/tesla_wall_connector.markdown +++ b/source/_integrations/tesla_wall_connector.markdown @@ -4,6 +4,7 @@ description: Instructions on how to integrate Tesla Wall Connector (Gen 3) into ha_category: - Binary Sensor - Sensor + - Energy ha_release: 2021.12 ha_iot_class: Local Polling ha_config_flow: true From 4a31659318c2b389b135ab039aad4b8c16f81290 Mon Sep 17 00:00:00 2001 From: Matthias Alphart Date: Thu, 9 Dec 2021 13:29:59 +0100 Subject: [PATCH 011/247] Add Ohmpilot and energy dashboard recommendations to Fronius (#20573) --- source/_integrations/fronius.markdown | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/source/_integrations/fronius.markdown b/source/_integrations/fronius.markdown index d2caa4f40f0..0716df911fe 100644 --- a/source/_integrations/fronius.markdown +++ b/source/_integrations/fronius.markdown @@ -56,7 +56,11 @@ Each device adds a set of sensors to Home Assistant. - `meter` - Detailed information about power, current and voltage, if supported split among the phases. Updated every minute interval. + Detailed information about power, current and voltage, if supported split among the phases. Updated every minute. + +- `ohmpilot` + + Detailed information about energy, power, and temperature of your Ohmpilots. Updated every minute. - `storage` @@ -68,6 +72,16 @@ This means for example that when Home Assistant is started at night, there might This does not need to be problematic as the values will be added on sunrise, when the Fronius devices begins providing the needed data. When a device is not responding correctly the update interval will increase to 10 minutes (3 minutes for power flow) until valid data is received again. +## Energy dashboard + +Recommended energy dashboard configuration for meter location in feed in path (`Meter location: 0`): + +- For `Grid consumption` use the meters `Energy real consumed` entity. +- For `Return to grid` use the meters `Energy real produced` entity. +- For `Solar production` add each inverters `Energy total` entity. +- `Battery systems` aren't supported directly. Use [Riemann sum](/integrations/integration/) with negative values of `Power battery` entity (from power_flow endpoint found in your `SolarNet` device) for charging and positive values for discharging. +- For `Devices` use the Ohmpilots `Energy consumed` entity. + ## Note Fronius often provides firmware updates for the datamanager interfaces and the devices in their system, it's recommended to check and apply them regularly. This integration relies on functionality present in rather recent firmware. From 09bc80585b32b704f1b911cb0054b6d231cb065c Mon Sep 17 00:00:00 2001 From: Anton Malko Date: Fri, 10 Dec 2021 21:53:10 +0300 Subject: [PATCH 012/247] Add media_player platform to lookin (#20646) --- source/_integrations/lookin.markdown | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/_integrations/lookin.markdown b/source/_integrations/lookin.markdown index 3f1383c1bba..60858c0711f 100644 --- a/source/_integrations/lookin.markdown +++ b/source/_integrations/lookin.markdown @@ -1,8 +1,9 @@ --- title: LOOKin -description: Instructions on how to integrate LookIN devices into Home Assistant. +description: Instructions on how to integrate LOOKin devices into Home Assistant. ha_category: - Climate + - Media Player - Sensor ha_release: 2021.11 ha_iot_class: Local Push @@ -12,6 +13,7 @@ ha_domain: lookin ha_config_flow: true ha_platforms: - climate + - media_player - sensor ha_zeroconf: true --- From fad84ecf76192687e3f111ca917be327ae831c13 Mon Sep 17 00:00:00 2001 From: Hedda Date: Mon, 13 Dec 2021 17:02:57 +0100 Subject: [PATCH 013/247] List Siren under support device types in ZHA docs (#20679) --- source/_integrations/zha.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_integrations/zha.markdown b/source/_integrations/zha.markdown index 464c99219e9..1af6cca8781 100644 --- a/source/_integrations/zha.markdown +++ b/source/_integrations/zha.markdown @@ -53,6 +53,7 @@ There is currently support for the following device types within Home Assistant: - Lock - Number (i.e. analog output) - Sensor +- Siren - Switch There is also support for grouping of lights, switches, and fans (i.e. support for commanding device groups as entities). At least two entities must be added to a group before the group entity is created. As well as support for binding/unbinding (i.e. bind a remote to a lightbulb or group). From e6af10c666f3e0c4272aedfd409c811600e7f69d Mon Sep 17 00:00:00 2001 From: Austin Mroczek Date: Mon, 13 Dec 2021 12:40:28 -0800 Subject: [PATCH 014/247] Update totalconnect.markdown (#20599) Co-authored-by: Franck Nijhof --- source/_integrations/totalconnect.markdown | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/source/_integrations/totalconnect.markdown b/source/_integrations/totalconnect.markdown index 45dd9ad2334..26237174fe4 100644 --- a/source/_integrations/totalconnect.markdown +++ b/source/_integrations/totalconnect.markdown @@ -50,6 +50,15 @@ automation: service: scene.turn_on target: entity_id: scene.OnArmedAway + - alias: "Alarm: Arm Home Instant at Sunset" + trigger: + platform: sun + event: sunset + offset: '0' + action: + service: totalconnect.arm_home_instant + target: + entity_id: alarm_control_panel.total_connect ``` {% details "Notes for Home Assistant Core Installations" %} @@ -66,7 +75,7 @@ sudo apt install libxml2-dev libxmlsec1-dev The integration provides an Alarm Control Panel for each TotalConnect location. It uses the name of your location from TotalConnect. For example, if your location name in TotalConnect is "Home", then you will get `alarm_control_panel.home` in Home Assistant. -The alarm control panel supports the following services: `alarm_arm_away`, `alarm_arm_home`, `alarm_arm_night` and `alarm_disarm`. +The alarm control panel supports the following services: `alarm_arm_away`, `alarm_arm_home`, `alarm_arm_night`, and `alarm_disarm`. The integration also provides unique services for `totalconnect.arm_home_instant` and `totalconnect.arm_away_instant` which arm the system with zero entry delay, triggering the alarm instantly if someone opens a door. The `triggered` state also provides a state attribute called `triggered_source` giving more detail on what triggered the alarm: From aa6e88088afe59114b9744d38494295e4ffa7d8d Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 14 Dec 2021 19:57:53 +0100 Subject: [PATCH 015/247] Remove deprecated YAML configuration from Luftdaten (#20690) --- source/_integrations/luftdaten.markdown | 81 +------------------------ 1 file changed, 1 insertion(+), 80 deletions(-) diff --git a/source/_integrations/luftdaten.markdown b/source/_integrations/luftdaten.markdown index 9bb5bba4f01..b0fba15dc0a 100644 --- a/source/_integrations/luftdaten.markdown +++ b/source/_integrations/luftdaten.markdown @@ -17,88 +17,9 @@ ha_platforms: The `luftdaten` integration will query the open data API of [luftdaten.info](https://luftdaten.info/) to monitor air quality and other weather data from a specific (self build) sensor station. -## Setup +## Prerequisites - To get the ID of a particle sensor you need to select it on the [Feinstaub map](https://deutschland.maps.luftdaten.info/) and find it in the sidebar (Column "Sensor ID"). - To get the ID of a temperature/humidity sensor you need to find it on the map hosted on [Madavi](https://www.madavi.de/sensor/feinstaub-map-dht/). {% include integrations/config_flow.md %} - -## Manual Configuration - -To enable this sensor, add the following lines to your `configuration.yaml` file: - -```yaml -# Example configuration.yaml entry -luftdaten: -``` - -{% configuration %} -sensor_id: - description: The ID of the sensor. - required: true - type: string -show_on_map: - description: Option to show the position of the sensor on the map. - required: false - default: false - type: boolean -scan_interval: - description: the frequency (in seconds) between data updates. - required: false - type: integer - default: 600 -sensors: - description: The sensor-related configuration options. - required: false - type: map - keys: - monitored_conditions: - description: A list of conditions you want to monitor. - required: true - type: list - keys: - P1: - description: Show the particle sensors (particles 10 microns and below). - P2: - description: Show the particle sensors (particles 2.5 microns and below). - temperature: - description: Display the temperature from the sensor. - humidity: - description: Display the humidity from the sensor. - pressure: - description: Display the pressure from the sensor. -{% endconfiguration %} - -
- -If you set `show_on_map` to `true` then the location attributes are named `latitude` and `longitude`. The default name of the location attributes is `lat` and `long` to avoid showing them on the map. - -
- -Not all sensors provide all conditions. Also, it's possible that the sensor values are not available all the time. To check what a sensor is publishing use `curl`: - -```bash -curl https://data.sensor.community/airrohr/v1/sensor/[sensorid]/ -``` - -## Full example - -This example would use the sensor with the ID 155, show it on the `map` and would monitor `temperature` and `humidity`. - -```yaml -# Example configuration.yaml entry -luftdaten: - sensor_id: 155 - show_on_map: true - sensors: - monitored_conditions: - - temperature - - humidity -``` - -## Sensor - -The `luftdaten` sensor platform will query the open data API of [luftdaten.info](https://luftdaten.info/) to monitor air quality and other weather data from a specific (self build) sensor station. - -You must have the `luftdaten` integration (from above) configured to use this platform. After configuring that component, sensors will automatically appear. From 6902060349d3ffd20d59b081d08abd1af4a6a6dc Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 19 Dec 2021 01:41:19 -0600 Subject: [PATCH 016/247] Add pico remote support to non-pro lutron caseta bridges (#20575) --- source/_integrations/lutron_caseta.markdown | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/source/_integrations/lutron_caseta.markdown b/source/_integrations/lutron_caseta.markdown index 57845c6a5d2..195d1dbb84f 100644 --- a/source/_integrations/lutron_caseta.markdown +++ b/source/_integrations/lutron_caseta.markdown @@ -40,9 +40,6 @@ The currently supported Caseta and RA2 Select devices are: - Lutron shades as [covers](#cover) - Lutron smart [fan](#fan) speed control - Lutron Occupancy/Vacancy [sensors](#sensor) - -Additionally RA2 Select Main Repeater (`RR-SEL-REP2-BL`) or Lutron Caséta Smart Bridge PRO (`L-BDGPRO2-WH`) models support: - - Pico Remotes as [device triggers](/integrations/device_automation/) - Shade Remotes as [device triggers](/integrations/device_automation/) @@ -164,7 +161,7 @@ For more information on working with binary sensors in Home Assistant, see the [ ## Pico and Shade Remotes -Pico and Shade remotes require a RA2 Select Main Repeater (`RR-SEL-REP2-BL`) or Lutron Caséta Smart Bridge PRO (`L-BDGPRO2-WH`) with Telnet Support enabled in the Lutron app under `Settings` >> `Advanced` >> `Integration` +Pico and Shade remotes are supported on the Smart Bridge (L-BDG2-WH), Smart Bridge PRO (L-BDGPRO2-WH), and RA2 Select (RR-SEL-REP2-BL) models. Device Triggers are implemented for `press` and `release` of each button on the remotes via watching for `lutron_caseta_button_event` events in the format: From 4862dee16b6ce65d160f04fa0da396c979138060 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 19 Dec 2021 10:48:53 -0600 Subject: [PATCH 017/247] Update flux_led for reboot button (#20765) --- source/_integrations/flux_led.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_integrations/flux_led.markdown b/source/_integrations/flux_led.markdown index 33b3e1d547b..fb261dc3bda 100644 --- a/source/_integrations/flux_led.markdown +++ b/source/_integrations/flux_led.markdown @@ -2,12 +2,14 @@ title: Magic Home description: Instructions on how to setup Magic Home within Home Assistant. ha_category: + - Button - Light - Switch ha_iot_class: Local Push ha_release: 0.25 ha_domain: flux_led ha_platforms: + - button - light - switch ha_codeowners: From 69dc61caf24cbac0be9a16fe7cac4af4081bb2f6 Mon Sep 17 00:00:00 2001 From: Eduard van Valkenburg Date: Sun, 19 Dec 2021 18:07:48 +0100 Subject: [PATCH 018/247] Add config flow to Azure_event_hub integration documentation (#20726) --- source/_integrations/azure_event_hub.markdown | 146 ++++++------------ 1 file changed, 43 insertions(+), 103 deletions(-) diff --git a/source/_integrations/azure_event_hub.markdown b/source/_integrations/azure_event_hub.markdown index 5d35e1715b2..067467fdd3e 100644 --- a/source/_integrations/azure_event_hub.markdown +++ b/source/_integrations/azure_event_hub.markdown @@ -8,6 +8,7 @@ ha_iot_class: Cloud Push ha_codeowners: - '@eavanvalkenburg' ha_domain: azure_event_hub +ha_config_flow: true --- The `Azure Event Hub` integration allows you to hook into the Home Assistant event bus and send events to [Azure Event Hub](https://azure.microsoft.com/en-us/services/event-hubs/) or to an [Azure IoT Hub](https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-devguide-messages-read-builtin). @@ -24,60 +25,59 @@ Once you have the name of your namespace, instance, Shared Access Policy and the The alternative approach is to use a connection string and instance name, this can be retrieved in the same way as the Shared Access Policy and this can also be gotten for a device in an IoT Hub (Event Hub-compatible connection string). In the case of IoT Hub, you need to put the Device ID as the instance name. -The final thing to consider is how often you want the integration to send messages in a batch to your hub, this is set with the `send_interval`, with a default of 5 seconds. The other thing to look at is what the maximum delay you want to use, since this component runs in an asynchronous way there is no guarantee that the sending happens exactly on time, so depending on your semantics you might want messages discarded. The actual check of the time happens with `max_delay` plus `send_interval`, so that even with a long `send_interval` the semantics are the same. +The final thing to consider is how often you want the integration to send messages in a batch to your hub, this is set with the `send_interval`, with a default of 5 seconds. Since this component runs in an asynchronous way there is no guarantee that the sending happens exactly on time, and because your Home Assistant might be very busy with lots of events happening it might discard several events that are older then 20 seconds plus the `send_interval`. -## Configuration +{% include integrations/config_flow.md %} -Add the following lines to your `configuration.yaml` file: +You can setup [filters](#filter-configuration) through the `configuration.yaml`. + +
+Not filtering domains or entities will send every event to Azure Event Hub, thus taking up a lot of space and bandwidth. +
+ +
+Event Hubs have a retention time of at most 7 days, if you do not capture or use the events they are deleted automatically from the Event Hub, the default retention is 1 day. +
+ +### Filter Configuration + +By default, no entity will be excluded. To limit which entities are being exposed to `Azure Event Hub`, you can use the `filter` parameter. ```yaml -# Example configuration.yaml entry +# Example filter to include specified domains and exclude specified entities azure_event_hub: - event_hub_namespace: NAMESPACE_NAME - event_hub_instance_name: EVENT_HUB_INSTANCE_NAME - event_hub_sas_policy: SAS_POLICY_NAME - event_hub_sas_key: SAS_KEY filter: include_domains: - - homeassistant - - light - - media_player + - alarm_control_panel + - light + include_entity_globs: + - binary_sensor.*_occupancy + exclude_entities: + - light.kitchen_light ``` +Filters are applied as follows: + +1. No includes or excludes - pass all entities +2. Includes, no excludes - only include specified entities +3. Excludes, no includes - only exclude specified entities +4. Both includes and excludes: + - Include domain and/or glob patterns specified + - If domain is included, and entity not excluded or match exclude glob pattern, pass + - If entity matches include glob pattern, and entity does not match any exclude criteria (domain, glob pattern or listed), pass + - If domain is not included, glob pattern does not match, and entity not included, fail + - Exclude domain and/or glob patterns specified and include does not list domains or glob patterns + - If domain is excluded and entity not included, fail + - If entity matches exclude glob pattern and entity not included, fail + - If entity does not match any exclude criteria (domain, glob pattern or listed), pass + - Neither include or exclude specifies domains or glob patterns + - If entity is included, pass (as #2 above) + - If entity include and exclude, the entity exclude is ignored + {% configuration %} -event_hub_namespace: - description: The name of your Event Hub namespace. - required: exclusive - type: string -event_hub_instance_name: - description: The name of your Event Hub instance. - required: true - type: string -event_hub_sas_policy: - description: The name of your Shared Access Policy. - required: exclusive - type: string -event_hub_sas_key: - description: The key for the Shared Access Policy. - required: exclusive - type: string -event_hub_connection_string: - description: The connection string to your event hub. - required: exclusive - type: string -send_interval: - description: The interval in seconds should events be sent to the Event Hub. - required: false - type: integer - default: 5 -max_delay: - description: The time in seconds after which a message is to be discarded. - required: false - type: integer - default: 30 filter: - description: Filter domains and entities for Event Hub. ([Configure Filter](#configure-filter)) - required: true + description: Filter domains and entities for Event Hub. + required: false type: map default: Includes all entities from all domains keys: @@ -107,66 +107,6 @@ filter: type: list {% endconfiguration %} -
-Not filtering domains or entities will send every event to Azure Event Hub, thus taking up a lot of space. -
- -
-Event Hubs have a retention time of at most 7 days, if you do not capture or use the events they are deleted automatically from the Event Hub, the default retention is 1 day. -
- -### Configure Filter - -By default, no entity will be excluded. To limit which entities are being exposed to `Azure Event Hub`, you can use the `filter` parameter. - -```yaml -# Example filter to include specified domains and exclude specified entities -azure_event_hub: - event_hub_namespace: NAMESPACE_NAME - event_hub_instance_name: EVENT_HUB_INSTANCE_NAME - event_hub_sas_policy: SAS_POLICY_NAME - event_hub_sas_key: SAS_KEY - filter: - include_domains: - - alarm_control_panel - - light - include_entity_globs: - - binary_sensor.*_occupancy - exclude_entities: - - light.kitchen_light -``` - -Filters are applied as follows: - -1. No includes or excludes - pass all entities -2. Includes, no excludes - only include specified entities -3. Excludes, no includes - only exclude specified entities -4. Both includes and excludes: - - Include domain and/or glob patterns specified - - If domain is included, and entity not excluded or match exclude glob pattern, pass - - If entity matches include glob pattern, and entity does not match any exclude criteria (domain, glob pattern or listed), pass - - If domain is not included, glob pattern does not match, and entity not included, fail - - Exclude domain and/or glob patterns specified and include does not list domains or glob patterns - - If domain is excluded and entity not included, fail - - If entity matches exclude glob pattern and entity not included, fail - - If entity does not match any exclude criteria (domain, glob pattern or listed), pass - - Neither include or exclude specifies domains or glob patterns - - If entity is included, pass (as #2 above) - - If entity include and exclude, the entity exclude is ignored - -### Advanced configuration - -This is what the configuration will look like when using a connection string directly, instead of the four parameters. It also shows how to set the send_interval and max_delay to something other than the default. This means once every minute the integration will connect to your hub and send messages, but the messages have to be less than 65 seconds old at the time of sending for them to be counted (send_interval + max_delay). - -```yaml -# Connection string config with non-defaults for send_interval and max_delay -azure_event_hub: - event_hub_connection_string: CONNECTION_STRING - event_hub_instance_name: EVENT_HUB_INSTANCE_NAME - send_interval: 60 - max_delay: 5 -``` - ## Using the data in Azure There are a number of ways to stream the data that comes into the Event Hub into storages in Azure, the easiest way is to use the built-in Capture function and this allows you to capture the data in Azure Blob Storage or Azure Data Lake store, [details here](https://docs.microsoft.com/en-us/azure/event-hubs/event-hubs-capture-overview). From 32659e2561478907fd704be24053ce36e599fc67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Hjelseth=20H=C3=B8yer?= Date: Sun, 19 Dec 2021 18:11:45 +0100 Subject: [PATCH 019/247] Update tibber.markdown (#20703) Co-authored-by: Franck Nijhof --- source/_integrations/tibber.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/tibber.markdown b/source/_integrations/tibber.markdown index a248c77d7ee..78be2eaf1cf 100644 --- a/source/_integrations/tibber.markdown +++ b/source/_integrations/tibber.markdown @@ -18,7 +18,7 @@ ha_platforms: --- The `tibber` integration provides a sensor with the current electricity price if you are a [Tibber](https://tibber.com/) customer. -If you have a [Tibber Pulse](https://norge.tibber.com/products/pulse/) or [Watty](https://tibber.com/se/store/produkt/watty-smart-energimatare) it will also show the electricity consumption in real time. +If you have a [Tibber Pulse](https://norge.tibber.com/products/pulse/) or [Watty](https://tibber.com/se/store/produkt/watty-smart-energimatare) it will also show the electricity consumption in real-time. If you do not have a real-time meter, you get a sensor for monthly consumption, monthly cost, and monthly peak hour updated once per day. There is currently support for the following device types within Home Assistant: From 8f705e4d13e792fc351b2e03341ef4c1b8afca11 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 19 Dec 2021 18:23:57 +0100 Subject: [PATCH 020/247] Add Open-Meteo integration (#20478) --- source/_integrations/open_meteo.markdown | 26 ++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 source/_integrations/open_meteo.markdown diff --git a/source/_integrations/open_meteo.markdown b/source/_integrations/open_meteo.markdown new file mode 100644 index 00000000000..825e4716ccf --- /dev/null +++ b/source/_integrations/open_meteo.markdown @@ -0,0 +1,26 @@ +--- +title: Open-Meteo +description: Instructions on how to integrate Open-Meteo within Home Assistant. +ha_category: + - Weather +ha_release: 2022.2 +ha_iot_class: Cloud Polling +ha_config_flow: true +ha_codeowners: + - '@frenck' +ha_domain: open_meteo +ha_platforms: + - weather +--- + +The Open-Meteo integration integrates the free weather forecast from +[Open-Meteo](https://open-meteo.com) with Home Assistant. + +Open-Meteo offers free weather forecast APIs for open-source developers and +non-commercial use. No account or API key is required to use this service. + +Open-Meteo collaborates with National Weather Services providing Open Data +with 11 to 2 km resolution. Their high-performance APIs select the best +weather model for your location. + +{% include integrations/config_flow.md %} From d21e38e18598312164b6b6334067739e82d1f31a Mon Sep 17 00:00:00 2001 From: Andre Lengwenus Date: Sun, 19 Dec 2021 18:30:58 +0100 Subject: [PATCH 021/247] Add events and device triggers to LCN (#20080) Co-authored-by: Franck Nijhof --- source/_integrations/lcn.markdown | 227 ++++++++++++++++++++++++++++-- 1 file changed, 212 insertions(+), 15 deletions(-) diff --git a/source/_integrations/lcn.markdown b/source/_integrations/lcn.markdown index 90bc71607dc..2d60157e210 100644 --- a/source/_integrations/lcn.markdown +++ b/source/_integrations/lcn.markdown @@ -42,8 +42,8 @@ There is currently support for the following device types within Home Assistant:
- Please note: Besides the implemented platforms, the `lcn` integration offers a variety of [service calls](#services). - These service calls cover functionalities of the LCN system, which cannot be represented by the platform implementations. + The implemented platforms do not cover the whole functionality of the LCN system. + Therefore the `lcn` integration offers a variety of [events](#events), [device triggers](#device-triggers) and [service calls](#services). They are ideal to be used in automation scripts or for the `template` platforms.
@@ -483,8 +483,10 @@ The `lcn` sensor platform allows the monitoring of the following [LCN](https://w The sensor can be used in automation scripts or in conjunction with `template` platforms.
+ Ensure that the LCN module is configured properly to provide the requested value. Otherwise, the module might show unexpected behavior or return error messages. +
### Switch @@ -494,12 +496,207 @@ The `lcn` switch platform allows the control of the following [LCN](https://www. - Output ports - Relays +## Additional Features + +### Transponder and fingerprint sensor + +To use LCN transponders or fingerprint sensors ensure that the corresponding module's I-port property +is enabled in the LCN-PRO software and properly configured. +LCN transponders and fingerprints are identified by a six value hexadecimal code (e.g. *123abc*). +If a code is received a corresponding event ([transponder event](#event-lcn_transponder), [fingerprint event](#event-lcn_fingerprint)) +is fired and can be used to trigger an automation. +Alternatively, you can use the corresponding [device triggers](#device-triggers). + +Example: + +This example shows how the `event_data` can be extracted and used in a condition using Home Assistant's templating engine. +Trigger on a transponder event and ensure that the received code is in the given list: + +{% raw %} + +```yaml +automation: + trigger: + - platform: event + event_type: lcn_transponder + condition: "{{ trigger.event.data.code in ['aabbcc', 'ddeeff', '112233'] }}" + action: + ... +``` + +{% endraw %} + +Further examples can be found in the [event section](#events). + +### Remote control + +To use LCN remote controls (e.g., LCN-RT or LCN-RT16) ensure that the corresponding module's I-port property +is enabled in the LCN-PRO software and its behavior is properly configured as "IR access control". +With this configuration each remote control is identified by a six value hexadecimal code (e.g. *123abc*). +If a command from a remote control is received a corresponding event ([transponder event](#event-lcn_transponder)) +is fired and can be used to trigger an automation. Along with the transmitted code, the pressed key and the key action +are transmitted. +Alternatively, you can use the corresponding [device triggers](#device-triggers). + +Examples can be found in the [event section](#events). + +### LCN commands addressed to PCHK host (Home Assistant) + +A LCN module can not only be programmed to send commands to other modules/groups but also to the PCHK host configured +in the LCN integration. These commands are directly passed to Home Assistant and can be evaluated. Only the *send keys* +(former) command is supported. + +Within LCN-PRO program the *send keys* command (only "A-C former command" is supported) to a key. For the target address +manually enter the PCHK host id (default: 4). Select the keys and key actions as desired. + +When a *send keys* command is received, the LCN integration will fire a [send keys event](#event-lcn_send_keys) for each +key configured. These events can be used to trigger an automation. +Alternatively, you can use the corresponding [device triggers](#device-triggers). + +Examples can be found in the [event section](#events). + +
+ + Only commands sent from physical buttons of a module are evaluated. The "Test command" button in the LCN-PRO software + is not evaluated and therefore cannot be used for testing purposes. + +
+ +## Events + +There are several functionalities of the LCN system which are not exposed as regular entities by the integration, but as events. +Examples are button presses from remote controls (transmitters), transponder findings, fingerprint sensors and so called *send keys* events. + +
+ + If you find it difficult to deal with events in scripted automations, you can also use [device triggers](#device-triggers) + which offer automation design via the UI. + +
+ +All events have some common attributes in their `event_data` which identify the sending LCN hardware module (e.g., the module the transponder is connected to): + +| Event payload | Description | Values | +| ------------- | ----------- | ------ | +| `device_id` | Internal device id of LCN module | string | +| `segment_id` | Module's segment id | 5..128 | +| `module_id` | Module id | 5..254 | + +In addition, every event has its own special attributes which are described below. +All special attributes are optional and can be used as supplementary filters. + +### Event: `lcn_transmitter` + +The `lcn_transmitter` event is fired if a LCN remote control command is received. + +| Special payload | Description | Values | +| --------------- | ----------- | ------ | +| `code` | Transmitter code | string (6 hex values) | +| `level` | Key level | 0..4 | +| `key` | Key | 0..4 | +| `action` | Key action | `hit`, `make`, `break` | + +Example: + +The trigger will fire if any key on the remote control with code *123abc* is `hit` as long as the +receiver hardware is connected to module 7 in segment 0. + +```yaml +automation: + trigger: + - platform: event + event_type: lcn_transmitter + event_data: + segment_id: 0 + module_id: 7 + code: 123abc + action: hit +``` + +### Event: `lcn_transponder` + +The `lcn_transponder` event is fired if a LCN transponder command is received. + +| Special payload | Description | Values | +| --------------- | ----------- | ------ | +| `code` | Transponder code | string (6 hex values) | + +Example: + +The trigger will fire if the transponder with code *123abc* was detected at +any hardware module. + +```yaml +automation: + trigger: + - platform: event + event_type: lcn_transponder + event_data: + code: 123abc +``` + +### Event: `lcn_fingerprint` + +The `lcn_fingerprint` event is fired if a LCN fingerprint command is received. + +| Special payload | Description | Values | +| --------------- | ----------- | ------ | +| `code` | Fingerprint code | string (6 hex values) | + +Example: + +The trigger will fire if the fingerprint with code *123abc* was detected at +any hardware module. + +```yaml +automation: + trigger: + - platform: event + event_type: lcn_fingerprint + event_data: + code: 123abc +``` + +### Event: `lcn_send_keys` + +The `lcn_send_keys` event is fired if the PCHK host receives a *send keys* command. + +| Special payload | Description | Values | +| --------------- | ----------- | ------ | +| `key` | LCN Key | a1..c8 | +| `action` | Key action | `hit`, `make`, `break` | + +Example: + +The trigger will fire if the PCHK host receives a command that issues a `hit` of +key `a1`. + +```yaml +automation: + trigger: + - platform: event + event_type: lcn_send_keys + event_data: + key: a1 + action: hit +``` + +## Device triggers + +To simplify using events in automations the LCN integration exposes them as device triggers. +Those device triggers can be selected from the automation editor within Home Assistant. + +After creating a new automation select *Device* as trigger type and search for the module which is +supposed to cause the event in the device list. You may select the trigger type and configure its +attributes. If an attribute is optional it is considered as a supplementary filter for the trigger. +For an explanation of the attributes refer to the corresponding [events](#events). + ## Services In order to directly interact with the LCN system, and invoke commands which are not covered by the implemented platforms, the following service calls can be used. Refer to the [Services Calls](/docs/scripts/service-calls) page for examples on how to use them. -### Service `output_abs` +### Service: `output_abs` Set absolute brightness of output port in percent. @@ -521,7 +718,7 @@ data: transition: 0 ``` -### Service `output_rel` +### Service: `output_rel` Set relative brightness of output port in percent. @@ -542,7 +739,7 @@ data: brightness: 30 ``` -### Service `output_toggle` +### Service: `output_toggle` Toggle output port. @@ -562,7 +759,7 @@ data: transition: 0 ``` -### Service `relays` +### Service: `relays` Set the relays status. The relays states are defined as a string with eight characters. Each character represents the state change of a relay (1=on, 0=off, t=toggle, -=nochange). @@ -583,7 +780,7 @@ data: state: t---001- ``` -### Service `led` +### Service: `led` Set the LED status. @@ -602,7 +799,7 @@ data: state: blink ``` -### Service `var_abs` +### Service: `var_abs` Set the absolute value of a variable or setpoint. If `value` is not defined, it is assumed to be 0. @@ -631,7 +828,7 @@ data: Otherwise the module might show unexpected behaviors or return error messages. -### Service `var_rel` +### Service: `var_rel` Set the relative value of a variable or setpoint. If `value` is not defined, it is assumed to be 0. @@ -660,7 +857,7 @@ data: Otherwise the module might show unexpected behavior or return error messages. -### Service `var_reset` +### Service: `var_reset` Reset value of variable or setpoint. @@ -683,7 +880,7 @@ data: Otherwise the module might show unexpected behavior or return error messages. -### Service `lock_regulator` +### Service: `lock_regulator` Locks a regulator setpoint. If `state` is not defined, it is assumed to be `False`. @@ -704,7 +901,7 @@ data: state: true ``` -### Service `send_keys` +### Service: `send_keys` Send keys (which executes bound commands). The keys attribute is a string with one or more key identifiers. Example: `a1a5d8` @@ -741,7 +938,7 @@ data: time_unit: s ``` -### Service `lock_keys` +### Service: `lock_keys` Locks keys. If the table is not defined, it is assumed to be table `a`. @@ -778,7 +975,7 @@ data: time_unit: s ``` -### Service `dyn_text` +### Service: `dyn_text` Send dynamic text to LCN-GTxD displays. The displays support four rows for text messages. @@ -801,7 +998,7 @@ data: text: "text in row 1" ``` -### Service `pck` +### Service: `pck` Send arbitrary PCK command. Only the command part of the PCK command has to be specified in the `pck` string. From f9907ef906514ce451e536d2ceb58acc5cc09eb0 Mon Sep 17 00:00:00 2001 From: Penny Wood Date: Mon, 20 Dec 2021 14:25:14 +0800 Subject: [PATCH 022/247] Device is polled, not pushed (#20753) --- source/_integrations/izone.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/izone.markdown b/source/_integrations/izone.markdown index 3e7c998cd4e..e9b504e83b3 100644 --- a/source/_integrations/izone.markdown +++ b/source/_integrations/izone.markdown @@ -4,7 +4,7 @@ description: Instructions on how to integrate iZone climate control devices with ha_category: - Climate ha_release: '0.100' -ha_iot_class: Local Push +ha_iot_class: Local Polling ha_config_flow: true ha_codeowners: - '@Swamp-Ig' From 670cbe96193fb22f204722c441cb0173b3ee763f Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 20 Dec 2021 06:45:40 -0600 Subject: [PATCH 023/247] Add set_zones service to flux_led (#20584) Co-authored-by: Franck Nijhof --- source/_integrations/flux_led.markdown | 27 ++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/source/_integrations/flux_led.markdown b/source/_integrations/flux_led.markdown index fb261dc3bda..2c42885c8a9 100644 --- a/source/_integrations/flux_led.markdown +++ b/source/_integrations/flux_led.markdown @@ -193,3 +193,30 @@ colors: speed_pct: 80 transition: "jump" ``` + +### Set Zones - Service `flux_led.set_zones` + +The Addressable v3 (0xA3) models allow setting a color effect per zone. The length of each zone is the number of pixels per segment divided by the number of colors. If the device is turned off, setting the zones will not turn it on. A separate call to `light.turn_on` is needed to turn on the device. + +| Service data attribute | Description | +| ---------------------- | ----------- | +| `entity_id` | The entity_id of the LED light to set the effect on. | +| `colors` | List of colors for each zone (RGB). (Max 2048 Colors) | +| `speed_pct` | The speed of the effect in % (0-100. Default 50) | +| `effect` | The effect you would like. Valid options are `static`, `running_water`, `strobe`, `jump`, or `breathing`. (Default `static`) | + +```yaml +#Example Service Call +service: flux_led.set_zones +target: + entity_id: + - light.addressable_v3_8e2f7f + - light.addressable_v3_8ebdeb +data: + colors: + - [255, 0, 0] + - [0, 255, 0] + - [0, 0, 255] + - [255, 255, 255] + speed_pct: 80 +``` From 273ac97596bc8452fa84b21fb3c4b2fa8fb4d98f Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 20 Dec 2021 15:20:14 -0600 Subject: [PATCH 024/247] Update known supported vendors for flux_led (#20786) --- source/_integrations/flux_led.markdown | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/source/_integrations/flux_led.markdown b/source/_integrations/flux_led.markdown index 2c42885c8a9..e3c1b6c6c55 100644 --- a/source/_integrations/flux_led.markdown +++ b/source/_integrations/flux_led.markdown @@ -64,11 +64,16 @@ These devices have been sold under at least the following brands: - Goldwin - Hakkatronics - [HaoDeng](http://www.zengge.com/appkzd) +- [Heissner](https://www.heissner.de/) - HDDFL -- illume RGBW +- [illume RGBW](https://dals.com/illume/) +- [Illumination FX](https://www.illumination-fx.com/) - INDARUN - iNextStation +- [Koopower](https://www.koopower.com/) +- [Lallumer](https://www.lapuretes.cn/) - LEDENET +- [LiteWRX](https://litewrx.com/) - Lytworx - Magic Ambient - [Magic Home](http://www.zengge.com/appkzd) @@ -83,6 +88,7 @@ These devices have been sold under at least the following brands: - PHOPOLLO - [Pin Stadium Pinball Lights](https://pinstadium.com/) - POV Lamp +- [PROTEAM Europe Pool Lights](https://proteam-me.com/) - [Rimikon](https://www.rimikon.com/) - SMFX - [Sumaote](https://fvtled.com/) From 4652b75c68e07f1c924f05f0ec39abdbb63782f2 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 21 Dec 2021 03:58:01 -0600 Subject: [PATCH 025/247] Add select platform to Magic Home/flux_led (#20755) --- source/_integrations/flux_led.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_integrations/flux_led.markdown b/source/_integrations/flux_led.markdown index e3c1b6c6c55..c86053cdceb 100644 --- a/source/_integrations/flux_led.markdown +++ b/source/_integrations/flux_led.markdown @@ -4,6 +4,7 @@ description: Instructions on how to setup Magic Home within Home Assistant. ha_category: - Button - Light + - Select - Switch ha_iot_class: Local Push ha_release: 0.25 @@ -11,6 +12,7 @@ ha_domain: flux_led ha_platforms: - button - light + - select - switch ha_codeowners: - '@icemanch' From c6a9cd2366827c95d82f802b9dffaad81eda57c7 Mon Sep 17 00:00:00 2001 From: Brynley McDonald Date: Tue, 21 Dec 2021 23:54:09 +1300 Subject: [PATCH 026/247] Add documenation for slugify template filter (#20069) Co-authored-by: Franck Nijhof --- source/_docs/configuration/templating.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_docs/configuration/templating.markdown b/source/_docs/configuration/templating.markdown index d809f053734..219d864c4e7 100644 --- a/source/_docs/configuration/templating.markdown +++ b/source/_docs/configuration/templating.markdown @@ -595,6 +595,7 @@ See: https://docs.python.org/3/library/struct.html ### String filters - Filter `urlencode` will convert an object to a percent-encoded ASCII text string (e.g., for HTTP requests using `application/x-www-form-urlencoded`). +- Filter `slugify(separator="_")` will convert a given string into a "slug". ### Regular expressions From f9a8777f124fa97e180a3fce7fd651d2b5546ec5 Mon Sep 17 00:00:00 2001 From: Hedda Date: Tue, 21 Dec 2021 12:00:15 +0100 Subject: [PATCH 027/247] ZHA USB discovery of SONOFF Zigbee 3.0 USB Dongle (#20778) --- source/_integrations/zha.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_integrations/zha.markdown b/source/_integrations/zha.markdown index 1af6cca8781..eb73d83ff8e 100644 --- a/source/_integrations/zha.markdown +++ b/source/_integrations/zha.markdown @@ -163,6 +163,7 @@ Some devices can be auto-discovered, which can simplify the ZHA setup process. T | Device | Discovery Method | Identifier | | -------| ---------------- | ---------- | +| [ITead SONOFF Zigbee 3.0 USB Dongle Plus](https://itead.cc/product/sonoff-zigbee-3-0-usb-dongle-plus/) | USB | 10C4:EA60 | | [Bitron Video/SMaBiT BV AV2010/10](https://bv.smabit.eu/index.php/smart-home-produkte/zb-funkstick/) | USB | 10C4:8B34 | | [ConBee II](https://phoscon.de/en/conbee2) | USB | 1CF1:0030 | | [Nortek HUSBZB-1](https://www.nortekcontrol.com/products/2gig/husbzb-1-gocontrol-quickstick-combo/) | USB | 10C4:8A2A | From 45071ecdc0a289cfbb63f0131412859ae0ec85cf Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 21 Dec 2021 05:09:48 -0600 Subject: [PATCH 028/247] Add flux_led.set_music_mode service (#20784) --- source/_integrations/flux_led.markdown | 31 ++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/source/_integrations/flux_led.markdown b/source/_integrations/flux_led.markdown index c86053cdceb..9e9e6e782a3 100644 --- a/source/_integrations/flux_led.markdown +++ b/source/_integrations/flux_led.markdown @@ -228,3 +228,34 @@ data: - [255, 255, 255] speed_pct: 80 ``` + + +### Set Music Mode - Service `flux_led.set_music_mode` + +The RGB with MIC (0x08), Addressable v2 (0xA2), and Addressable v3 (0xA3) models have a built-in microphone that have multiple music mode settings. + +| Service data attribute | Description | +| ---------------------- | ----------- | +| `entity_id` | The entity_id of the LED light to set the effect on. | +| `sensitivity` | Microphone sensitivity (0-100) | +| `brightness` | Light brightness (0-100) | +| `light_screen` | Light screen mode for 2 dimensional pixels (Addressable models only) | +| `effect` | Effect (1-16 on Addressable models, 0-3 on RGB with MIC models)| +| `foreground_color` | The foreground RGB color | +| `background_color` | The background RGB color (Addressable models only) | + +```yaml +#Example Service Call +service: flux_led.set_music_mode +target: + entity_id: + - light.addressable_v3_8e2f7f + - light.addressable_v3_8ebdeb +data: + sensitivity: 100 + brightness: 100 + effect: 2 + light_screen: false + background_color: [0, 255, 0] + foreground_color: [255, 0, 0] +``` From 65ef7786dd3fa50eeeaaa58cbf94d7bfd7cd34b4 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Tue, 21 Dec 2021 12:29:48 +0100 Subject: [PATCH 029/247] Document short hand templates in condition actions (#20794) --- source/_docs/scripts/conditions.markdown | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/source/_docs/scripts/conditions.markdown b/source/_docs/scripts/conditions.markdown index 7e9efacc8f8..5075306feff 100644 --- a/source/_docs/scripts/conditions.markdown +++ b/source/_docs/scripts/conditions.markdown @@ -424,7 +424,7 @@ condition: {% endraw %} -But also in the `repeat` action's `while` or `until` option, or in a `choose` action's `conditions` option: +It's also supported in the `repeat` action's `while` or `until` option, or in a `choose` action's `conditions` option: {% raw %} @@ -447,15 +447,15 @@ But also in the `repeat` action's `while` or `until` option, or in a `choose` ac {% endraw %} -
+It's also supported in script or automation `condition` actions: -While conditions can be used in script sequences or automation actions, the -shorthand for template conditions cannot be used directly in those constructs. +{% raw %} -However, if an used action supports conditions itself, like `choose` and - `repeat`, the shorthand template conditions will be accepted in those cases. +```yaml +- condition: "{{ is_state('device_tracker.iphone', 'away') }}" +``` -
+{% endraw %} [template]: /topics/templating/ [automation-templating]: /getting-started/automation-templating/ From 1a75e8db503937601a1d540f8f19a187f0745f18 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 21 Dec 2021 13:20:05 +0100 Subject: [PATCH 030/247] Deprecate mcp23017 integration (ADR-0019) (#20795) --- source/_integrations/mcp23017.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_integrations/mcp23017.markdown b/source/_integrations/mcp23017.markdown index f8ccfd7f30a..c4617f89b10 100644 --- a/source/_integrations/mcp23017.markdown +++ b/source/_integrations/mcp23017.markdown @@ -15,6 +15,14 @@ ha_platforms: - switch --- +
+ +This integration is deprecated and will be removed in Home Assistant Core 2022.4. + +For more information see: [Architectural Decision Record 0019](https://github.com/home-assistant/architecture/blob/master/adr/0019-GPIO.md). + +
+ The `mcp23017` integration is the base for all related mcp23017 platforms in Home Assistant. There is no setup needed for the integration itself, for the platforms please check their corresponding sections. For more details about the MCP23017 I2C I/O port expander you can find its datasheet here: [MCP23017](https://www.microchip.com/wwwproducts/en/MCP23017). From a203df28ef851f77f9461172b4c8ad367dac535a Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 21 Dec 2021 13:24:39 +0100 Subject: [PATCH 031/247] Deprecate pcal9535a integration (ADR-0019) (#20797) --- source/_integrations/pcal9535a.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_integrations/pcal9535a.markdown b/source/_integrations/pcal9535a.markdown index 8c628556f42..619c9f47dda 100644 --- a/source/_integrations/pcal9535a.markdown +++ b/source/_integrations/pcal9535a.markdown @@ -15,6 +15,14 @@ ha_platforms: - switch --- +
+ +This integration is deprecated and will be removed in Home Assistant Core 2022.4. + +For more information see: [Architectural Decision Record 0019](https://github.com/home-assistant/architecture/blob/master/adr/0019-GPIO.md). + +
+ The `pcal9535a` integration is the base for all related pcal9535a platforms in Home Assistant. There is no setup needed for the integration itself, for the platforms, please check their corresponding sections. One of the use cases is [Seeed studio Raspberry Pi Relay Board](http://wiki.seeedstudio.com/Raspberry_Pi_Relay_Board_v1.0/). From b337e5605e7cb9c2379140522426d6e8c75a6fd2 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 21 Dec 2021 17:14:25 +0100 Subject: [PATCH 032/247] Deprecate Sensirion SHT31 integration (ADR-0019) (#20804) --- source/_integrations/sht31.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_integrations/sht31.markdown b/source/_integrations/sht31.markdown index 79406c0de61..cb9d3deb84f 100644 --- a/source/_integrations/sht31.markdown +++ b/source/_integrations/sht31.markdown @@ -10,6 +10,14 @@ ha_platforms: - sensor --- +
+ +This integration is deprecated and will be removed in Home Assistant Core 2022.4. + +For more information see: [Architectural Decision Record 0019](https://github.com/home-assistant/architecture/blob/master/adr/0019-GPIO.md). + +
+ The `sht31` sensor platform allows you to get the current temperature and humidity from a Sensirion SHT31 device. ## Configuration From 424bf851077003407d822e7aaf5ff819276b6e59 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 21 Dec 2021 17:16:44 +0100 Subject: [PATCH 033/247] Deprecate DHT Sensor integration (ADR-0019) (#20803) --- source/_integrations/dht.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_integrations/dht.markdown b/source/_integrations/dht.markdown index aad155414ee..fe91f6c7ad4 100644 --- a/source/_integrations/dht.markdown +++ b/source/_integrations/dht.markdown @@ -13,6 +13,14 @@ ha_codeowners: - '@thegardenmonkey' --- +
+ +This integration is deprecated and will be removed in Home Assistant Core 2022.4. + +For more information see: [Architectural Decision Record 0019](https://github.com/home-assistant/architecture/blob/master/adr/0019-GPIO.md). + +
+ The `dht` sensor platform allows you to get the current temperature and humidity from a DHT11, DHT22 or AM2302 device. ## Setup From 31931ef3188dc3e4001ad02dbe3b50027b1610c4 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 21 Dec 2021 17:18:17 +0100 Subject: [PATCH 034/247] Deprecate BH1750 integration (ADR-0019) (#20802) --- source/_integrations/bh1750.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_integrations/bh1750.markdown b/source/_integrations/bh1750.markdown index 7060bab6caa..9ab91bef01b 100644 --- a/source/_integrations/bh1750.markdown +++ b/source/_integrations/bh1750.markdown @@ -10,6 +10,14 @@ ha_platforms: - sensor --- +
+ +This integration is deprecated and will be removed in Home Assistant Core 2022.4. + +For more information see: [Architectural Decision Record 0019](https://github.com/home-assistant/architecture/blob/master/adr/0019-GPIO.md). + +
+ The `bh1750` sensor platform allows you to read the ambient light level in Lux from a [BH1750FVI sensor](https://www.mouser.com/ds/2/348/bh1750fvi-e-186247.pdf) connected via [I2c](https://en.wikipedia.org/wiki/I²C) bus (SDA, SCL pins). It allows you to use all the resolution modes of the sensor described in its datasheet. Tested devices: From 5e18ca163e52a6a8a32a6ee7205d83124532520b Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 21 Dec 2021 17:23:26 +0100 Subject: [PATCH 035/247] Deprecate pi4ioe5v9xxxx integration (ADR-0019) (#20799) --- source/_integrations/pi4ioe5v9xxxx.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_integrations/pi4ioe5v9xxxx.markdown b/source/_integrations/pi4ioe5v9xxxx.markdown index 526ab65d634..0cb33629887 100644 --- a/source/_integrations/pi4ioe5v9xxxx.markdown +++ b/source/_integrations/pi4ioe5v9xxxx.markdown @@ -16,6 +16,14 @@ ha_platforms: - switch --- +
+ +This integration is deprecated and will be removed in Home Assistant Core 2022.4. + +For more information see: [Architectural Decision Record 0019](https://github.com/home-assistant/architecture/blob/master/adr/0019-GPIO.md). + +
+ The `pi4ioe5v9xxxx` integration provides support for the quasi-bidirectional devices PI4IOE5V9570, PI4IOE5V9674, PI4IOE5V9673, PI4IOE5V96224 and PI4IOE5V96248 from [diodes.com](https://www.diodes.com). For more details about the pi4ioe5v9xxxx I2C I/O port expander you can find the datasheets here: From eb83510f0899e651f161e6dd772f0d8e3fae51ba Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 21 Dec 2021 17:54:03 +0100 Subject: [PATCH 036/247] Deprecate BeagleBone Black GPIO integration (ADR-0019) (#20800) --- source/_integrations/bbb_gpio.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_integrations/bbb_gpio.markdown b/source/_integrations/bbb_gpio.markdown index ba1bb16140c..1e4eeb328fb 100644 --- a/source/_integrations/bbb_gpio.markdown +++ b/source/_integrations/bbb_gpio.markdown @@ -13,6 +13,14 @@ ha_platforms: - switch --- +
+ +This integration is deprecated and will be removed in Home Assistant Core 2022.4. + +For more information see: [Architectural Decision Record 0019](https://github.com/home-assistant/architecture/blob/master/adr/0019-GPIO.md). + +
+ The `bbb_gpio` integration is the base for all [BeagleBone Black](https://beagleboard.org/black) related GPIO platforms in Home Assistant. There is no setup needed for the integration itself. From b76d2db200e4c1fcf239c016fb38f545064e1192 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 22 Dec 2021 12:35:29 +0100 Subject: [PATCH 037/247] Add iif (immediate if) template function/filter (#20769) Co-authored-by: Erik Montnemery --- .../_docs/configuration/templating.markdown | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/source/_docs/configuration/templating.markdown b/source/_docs/configuration/templating.markdown index 219d864c4e7..392b3b1eb4c 100644 --- a/source/_docs/configuration/templating.markdown +++ b/source/_docs/configuration/templating.markdown @@ -297,6 +297,62 @@ The same thing can also be expressed as a filter: {% endraw %} +### Immediate if (iif) + +A common case is to conditionally return a value based on another value. +For example, return a "Yes" or "No" when the light is on or off. + +This can be written as: + +{% raw %} + +```text +{% if is_state('light.kitchen', 'on') %} + Yes +{% else %} + No +{% endif %} +``` + +{% endraw %} + +Or using a shorter syntax: + +{% raw %} + +```text +{{ 'Yes' if is_state('light.kitchen', 'on') else 'No' }} +``` + +{% endraw %} + +Additionally, to the above, you can use the `iif` function/filter, which is +an immediate if. + +Syntax: `iif(condition, if_true, if_false, if_none)` + +`iif` returns the value of `if_true` if the condition is truthy, the value of `if_false` if it's `falsy` and the value of `if_none` if it's `None`. +An empty string, an empty mapping or an an empty list, are all falsy, refer to [the Python documentation](https://docs.python.org/3/library/stdtypes.html#truth-value-testing) for an in depth explanation. + +`if_true` is optional, if it's omitted `True` is returned if the condition is truthy. +`if_false` is optional, if it's omitted `False` is returned if the condition is falsy. +`if_none` is optional, if it's omitted the value of `if_false` is returned if the condition is `None`. + +Examples using `iif`: + +{% raw %} + +```text +{{ iif(is_state('light.kitchen', 'on'), 'Yes', 'No') }} + +{{ is_state('light.kitchen', 'on') | iif('Yes', 'No') }} + +{{ (state('light.kitchen') == 'on') | iif('Yes', 'No') }} +``` + +{% endraw %} + + ### Time `now()` and `utcnow()` are not supported in [limited templates](#limited-templates). From d7b990fb8238214ad58844b3ccec133541c19b2d Mon Sep 17 00:00:00 2001 From: G Johansson Date: Wed, 22 Dec 2021 21:33:29 +0100 Subject: [PATCH 038/247] Update Sensibo for config_flow (#20554) --- source/_integrations/sensibo.markdown | 33 ++++----------------------- 1 file changed, 4 insertions(+), 29 deletions(-) diff --git a/source/_integrations/sensibo.markdown b/source/_integrations/sensibo.markdown index 386d16243b3..f64a6ab99e1 100644 --- a/source/_integrations/sensibo.markdown +++ b/source/_integrations/sensibo.markdown @@ -5,6 +5,7 @@ ha_category: - Climate ha_release: 0.44 ha_iot_class: Cloud Polling +ha_config_flow: true ha_codeowners: - '@andrey-git' ha_domain: sensibo @@ -14,42 +15,16 @@ ha_platforms: Integrates [Sensibo](https://sensibo.com) Air Conditioning controller into Home Assistant. -To enable this platform, add the following lines to your `configuration.yaml` file: - -```yaml -# Example configuration.yaml entry -climate: - - platform: sensibo - api_key: YOUR_API_KEY -``` - -{% configuration %} -api_key: - description: Your Sensibo API key (To get your API key visit `https://home.sensibo.com/me/api`). - required: true - type: string -id: - description: A unit ID or a list of IDs. If none specified then all units accessible by the `api_key` will be used. - required: false - type: string -{% endconfiguration %} +## Prerequisites +Please click [here](https://home.sensibo.com/me/api) and register to obtain the API key.
If you create the API key using a dedicated user (and not your main user), then in the Sensibo app log you will be able to distinguish between actions done in the app and actions done by Home Assistant.
-## Full configuration example - -```yaml -climate: - - platform: sensibo - api_key: YOUR_API_KEY - id: - - id1 - - id2 -``` +{% include integrations/config_flow.md %} ## Adding a quick switch example From 24c4bca7f4c3891216b27306f8bac5175e3ccef8 Mon Sep 17 00:00:00 2001 From: Simone Chemelli Date: Wed, 22 Dec 2021 22:19:12 +0100 Subject: [PATCH 039/247] Fritz deprecate services for button entities (#20725) --- source/_integrations/fritz.markdown | 33 +++++++---------------------- 1 file changed, 8 insertions(+), 25 deletions(-) diff --git a/source/_integrations/fritz.markdown b/source/_integrations/fritz.markdown index 13117316eac..8386c1891c1 100644 --- a/source/_integrations/fritz.markdown +++ b/source/_integrations/fritz.markdown @@ -15,6 +15,7 @@ ha_codeowners: ha_iot_class: Local Polling ha_platforms: - binary_sensor + - button - device_tracker - sensor - switch @@ -27,6 +28,7 @@ There is support for the following platform types within Home Assistant: - **Device tracker** - presence detection by looking at connected devices. - **Binary sensor** - connectivity status. +- **Button** - reboot, reconnect, firmware_update. - **Sensor** - external IP address, uptime and network monitors. - **Switch** - call deflection, port forward, parental control and Wi-Fi networks. @@ -44,29 +46,10 @@ The configuration in the UI asks for a username. Starting from FRITZ!OS 7.24 the Currently supported services are Platform specific: -- `fritz.reconnect` -- `fritz.reboot` - `fritz.cleanup` ### Platform Services -#### Service `fritz.reboot` - -Reboot the router. - -| Service data attribute | Optional | Description | -| ---------------------- | -------- | -------------------------------------------------------------------------------------------------------------- | -| `entity_id` | no | Only act on a specific router | - -#### Service `fritz.reconnect` - -Disconnect and reconnect the router to the Internet. -If you have a dynamic IP address, most likely it will change. - -| Service data attribute | Optional | Description | -| ---------------------- | -------- | -------------------------------------------------------------------------------------------------------------- | -| `entity_id` | no | Only act on a specific router | - #### Service `fritz.cleanup` Remove all stale devices from Home Assistant. @@ -112,11 +95,11 @@ The following script can be used to easily add a reconnect button to your UI. If ```yaml fritz_box_reconnect: - alias: "Reconnect FRITZ!Box" + alias: "Reboot FRITZ!Box" sequence: - - service: fritz.reconnect + - service: button.press target: - entity_id: binary_sensor.fritzbox_7530_connection + entity_id: button.fritzbox_7530_reboot ``` @@ -124,14 +107,14 @@ fritz_box_reconnect: ```yaml automation: -- alias: "System - Reconnect FRITZ!Box" +- alias: "Reconnect FRITZ!Box" trigger: - platform: time at: "05:00:00" action: - - service: fritz.reconnect + - service: button.press target: - entity_id: binary_sensor.fritzbox_7530_connection + entity_id: button.fritzbox_7530_reconnect ``` From b97fb8025518a5f36695d1e466167278102fde06 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Thu, 23 Dec 2021 10:29:51 +0100 Subject: [PATCH 040/247] Document apparent and reactive power sensor device classes (#20836) Co-authored-by: Franck Nijhof --- source/_integrations/sensor.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_integrations/sensor.markdown b/source/_integrations/sensor.markdown index e726d0c939d..357c10cfe03 100644 --- a/source/_integrations/sensor.markdown +++ b/source/_integrations/sensor.markdown @@ -17,6 +17,7 @@ Some of these sensors are built-in to Home Assistant, some are created automatic The type of data a sensor returns impacts how it is displayed in the frontend. This is controlled by the sensor's device class designation. Built-in sensors and many created from an integration will have this designation predefined. Those can be modified in the [customize section](/docs/configuration/customizing-devices/). When manually creating a new sensor the device class may be optionally assigned. A full list of available sensor device classes is below: - **None**: Generic sensor. This is the default and doesn't need to be set. +- **apparent_power**: Apparent power in VA. - **aqi**: Air Quality Index - **battery**: Percentage of battery that is left. - **carbon_dioxide**: Carbon Dioxide in CO2 (Smoke) @@ -39,6 +40,7 @@ The type of data a sensor returns impacts how it is displayed in the frontend. T - **power_factor**: Power factor in %. - **power**: Power in W or kW. - **pressure**: Pressure in hPa or mbar. +- **reactive_power**: Reactive power in var. - **signal_strength**: Signal strength in dB or dBm. - **sulphur_dioxide**: Concentration of sulphur dioxide in µg/m³ - **temperature**: Temperature in °C or °F. From 6dcfbb7fb736602cd77b4c3b162a70451e593742 Mon Sep 17 00:00:00 2001 From: Mick Vleeshouwer Date: Thu, 23 Dec 2021 08:04:24 -0800 Subject: [PATCH 041/247] Remove TaHoma documentation (#20823) --- .textlintrc.json | 1 - CODEOWNERS | 1 - source/_integrations/somfy.markdown | 30 +------------ source/_integrations/tahoma.markdown | 67 ---------------------------- source/_redirects | 3 +- 5 files changed, 3 insertions(+), 99 deletions(-) delete mode 100644 source/_integrations/tahoma.markdown diff --git a/.textlintrc.json b/.textlintrc.json index 17a7ccfff05..54378392155 100644 --- a/.textlintrc.json +++ b/.textlintrc.json @@ -233,7 +233,6 @@ "SwitchBot", "Synology", "Tado", - "Tahoma", "TCP/IP", "TensorFlow", "Tesla", diff --git a/CODEOWNERS b/CODEOWNERS index 794981244eb..b92430e9286 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -503,7 +503,6 @@ source/_integrations/syslog.markdown @fabaff source/_integrations/system_bridge.markdown @timmo001 source/_integrations/tado.markdown @michaelarnauts @noltari source/_integrations/tag.markdown @balloob @dmulcahey -source/_integrations/tahoma.markdown @philklei source/_integrations/tankerkoenig.markdown @guillempages source/_integrations/tapsaff.markdown @bazwilliams source/_integrations/tasmota.markdown @emontnemery diff --git a/source/_integrations/somfy.markdown b/source/_integrations/somfy.markdown index be05c6c4846..52739144e06 100644 --- a/source/_integrations/somfy.markdown +++ b/source/_integrations/somfy.markdown @@ -17,7 +17,7 @@ ha_platforms: - switch --- -The Somfy integration will allow users to integrate their Somfy devices into Home Assistant using the [official API](https://developer.somfy.com/somfy-open-api/apis), unlike the [Tahoma](/integrations/tahoma/) integration. +The Somfy integration will allow users to integrate their Somfy devices into Home Assistant using the [official API](https://developer.somfy.com/somfy-open-api/apis). ## Installation @@ -71,31 +71,3 @@ optimistic: **optimistic** mode should only be used when the integration is not able to gain information on whether a cover is open or closed (e.g., [RTS](https://www.somfysystems.com/en-us/discover-somfy/technology/radio-technology-somfy) devices). It will attempt to track the status within Home Assistant. This mode should only be used if Home Assistant is the only way you operate the blind. If you also use the physical remote control or the Somfy app, Home Assistant will become out of sync. {% include integrations/config_flow.md %} - -### Potential duplicate with the Tahoma integration - -If you use the [Tahoma](/integrations/tahoma) integration, you will have to exclude the covers added by this one. Otherwise, they will be added twice. - -```yaml -# Example configuration.yaml entry -tahoma: - username: YOUR_USERNAME - password: YOUR_PASSWORD - exclude: - [ - "rts:RollerShutterRTSComponent", - "rts:CurtainRTSComponent", - "rts:BlindRTSComponent", - "rts:VenetianBlindRTSComponent", - "rts:DualCurtainRTSComponent", - "rts:ExteriorVenetianBlindRTSComponent", - "io:ExteriorVenetianBlindIOComponent", - "io:RollerShutterUnoIOComponent", - "io:RollerShutterWithLowSpeedManagementIOComponent", - "io:RollerShutterVeluxIOComponent", - "io:RollerShutterGenericIOComponent", - "io:WindowOpenerVeluxIOComponent", - "io:VerticalExteriorAwningIOComponent", - "io:HorizontalAwningIOComponent", - ] -``` diff --git a/source/_integrations/tahoma.markdown b/source/_integrations/tahoma.markdown deleted file mode 100644 index fcfa612d2c5..00000000000 --- a/source/_integrations/tahoma.markdown +++ /dev/null @@ -1,67 +0,0 @@ ---- -title: Tahoma -description: Instructions on how to integrate Somfy Tahoma devices with Home Assistant. -ha_category: - - Hub - - Binary Sensor - - Cover - - Lock - - Scene - - Switch - - Sensor -ha_release: 0.59 -ha_iot_class: Cloud Polling -ha_codeowners: - - '@philklei' -ha_domain: tahoma -ha_platforms: - - binary_sensor - - cover - - lock - - scene - - sensor - - switch ---- - -The Tahoma integration is used as an interface to the [tahomalink.com](https://www.tahomalink.com) website. It adds covers, scenes and a sun sensor from the Tahoma platform. - -There is currently support for the following device types within Home Assistant: - -- Binary Sensor -- Sensor -- Cover -- Lock -- Switch -- Scene - -## Configuration - -To use your Tahoma devices in your installation, add the following to your `configuration.yaml` file: - -```yaml -# Example configuration.yaml entry -tahoma: - username: "YOUR_USERNAME" - password: "YOUR_PASSWORD" - exclude: - - "BridgeHUEComponent" - - "HueLampHUEComponent" - - "PodComponent" -``` - -{% configuration %} -username: - description: Your username for tahomalink.com. - required: true - type: string -password: - description: Your password for tahomalink.com. - required: true - type: string -exclude: - description: List of devices to exclude. - required: false - type: list -{% endconfiguration %} - -This also works with the Somfy Connexoon. Check [here](https://www.somfy.nl/keuzehulp/verschillen-tahoma-en-connexoon) for the differences between the bridges. diff --git a/source/_redirects b/source/_redirects index 9481809266f..ff6772e46fd 100644 --- a/source/_redirects +++ b/source/_redirects @@ -2352,4 +2352,5 @@ /integrations/loopenergy /more-info/removed-integration 301 /components/loopenergy /more-info/removed-integration 301 /components/sensor.loop_energy /more-info/removed-integration 301 -/components/sensor.loopenergy /more-info/removed-integration 301 \ No newline at end of file +/components/sensor.loopenergy /more-info/removed-integration 301 +/integrations/tahoma /more-info/removed-integration 301 \ No newline at end of file From 65efb4ef0c177b932355f69adbc3d726391d46a2 Mon Sep 17 00:00:00 2001 From: "David F. Mulcahey" Date: Thu, 23 Dec 2021 17:54:07 -0500 Subject: [PATCH 042/247] Add Button platform to ZHA docs (#20845) --- source/_integrations/zha.markdown | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/_integrations/zha.markdown b/source/_integrations/zha.markdown index eb73d83ff8e..db49f050892 100644 --- a/source/_integrations/zha.markdown +++ b/source/_integrations/zha.markdown @@ -5,6 +5,7 @@ ha_category: - Hub - Alarm - Binary Sensor + - Button - Climate - Fan - Light @@ -25,6 +26,7 @@ ha_domain: zha ha_platforms: - alarm_control_panel - binary_sensor + - button - climate - cover - device_tracker @@ -46,6 +48,7 @@ There is currently support for the following device types within Home Assistant: - Alarm Control Panel - Binary Sensor +- Button - Climate (beta) - Cover - Fan From cfb69e24dd5e6e665baea2f7ac0f45c0c24acd17 Mon Sep 17 00:00:00 2001 From: Brian Egge Date: Thu, 23 Dec 2021 19:29:56 -0500 Subject: [PATCH 043/247] Generic thermostats presets (#20264) --- .../_integrations/generic_thermostat.markdown | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/source/_integrations/generic_thermostat.markdown b/source/_integrations/generic_thermostat.markdown index ecc7086facf..6f767ba2f98 100644 --- a/source/_integrations/generic_thermostat.markdown +++ b/source/_integrations/generic_thermostat.markdown @@ -81,7 +81,23 @@ initial_hvac_mode: required: false type: string away_temp: - description: "Set the temperature used by `preset_mode: away`. If this is not specified, the preset mode feature will not be available." + description: "Set the temperature used by `preset_mode: away`." + required: false + type: float +comfort_temp: + description: "Set the temperature used by `preset_mode: comfort`." + required: false + type: float +home_temp: + description: "Set the temperature used by `preset_mode: home`." + required: false + type: float +sleep_temp: + description: "Set the temperature used by `preset_mode: sleep`." + required: false + type: float +activity_temp: + description: "Set the temperature used by `preset_mode: activity`." required: false type: float precision: From 20364dbab20fee7f1be16efa0565ea8b64474345 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Fri, 24 Dec 2021 13:22:52 +0100 Subject: [PATCH 044/247] Add config flow instructions to version integration (#18935) Co-authored-by: Franck Nijhof --- source/_integrations/version.markdown | 40 ++------------------------- 1 file changed, 3 insertions(+), 37 deletions(-) diff --git a/source/_integrations/version.markdown b/source/_integrations/version.markdown index a0ed0a44e79..5ab7114c58a 100644 --- a/source/_integrations/version.markdown +++ b/source/_integrations/version.markdown @@ -13,43 +13,9 @@ ha_codeowners: ha_domain: version ha_platforms: - sensor +ha_config_flow: true --- -The `version` sensor platform that can display the current Home Assistant versions. +The Version integration can display the current Home Assistant versions. -## Configuration - -To enable this sensor, add the following lines to your `configuration.yaml`: - -```yaml -# Example configuration.yaml entry -sensor: - - platform: version -``` - -{% configuration %} -name: - description: Name to use in the frontend. - required: false - type: string - default: "`Current Version` in case of `source: local`, `Latest Version` otherwise." -beta: - description: Flag to indicate that it will check for beta versions, only supported for the sources `pypi`, `supervisor` and `container`. - required: false - type: boolean - default: false -image: - description: The image you want to check against, this is only supported for `supervisor` and `container`, see full list under. - required: false - type: string - default: default -source: - description: The source you want to check against, possible values are `local`, `pypi`, `supervisor`, `haio` and `container`. - required: false - type: string - default: local -{% endconfiguration %} - -### Supported images for Home Assistant - -`default`, `qemux86`, `qemux86-64`, `qemuarm`, `qemuarm-64`, `generic-x86-64`, `raspberrypi`, `raspberrypi2`, `raspberrypi3`, `raspberrypi3-64`, `raspberrypi4`, `raspberrypi4-64`, `tinker`, `odroid-c2`, `odroid-n2`, `odroid-xu` +{% include integrations/config_flow.md %} From d26c8ed82fec407902eb5e0eca2d32a7e903d5a1 Mon Sep 17 00:00:00 2001 From: Mick Vleeshouwer Date: Fri, 24 Dec 2021 12:30:40 -0800 Subject: [PATCH 045/247] Add Overkiz documentation for new integration (#20841) --- .textlintrc.json | 1 + source/_integrations/overkiz.markdown | 73 +++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 source/_integrations/overkiz.markdown diff --git a/.textlintrc.json b/.textlintrc.json index 54378392155..ac8949f7298 100644 --- a/.textlintrc.json +++ b/.textlintrc.json @@ -233,6 +233,7 @@ "SwitchBot", "Synology", "Tado", + "TaHoma", "TCP/IP", "TensorFlow", "Tesla", diff --git a/source/_integrations/overkiz.markdown b/source/_integrations/overkiz.markdown new file mode 100644 index 00000000000..6ef8c21ebba --- /dev/null +++ b/source/_integrations/overkiz.markdown @@ -0,0 +1,73 @@ +--- +title: Overkiz (by Somfy) +description: Instructions on how to integrate hubs whom use the Overkiz platform with Home Assistant. +ha_category: + - Hub + - Sensor + - Button + - Lock + - Number +ha_release: 2022.1.0 +ha_config_flow: true +ha_iot_class: Cloud Polling +ha_codeowners: + - '@tetienne' + - '@imicknl' + - '@vlebourl' +ha_domain: overkiz +ha_platforms: + - sensor + - button + - lock + - number +--- + +The Overkiz (by Somfy) integration platform is used by many different vendors, like Somfy, Hitachi and Atlantic. This integration will allow users to integrate their devices into Home Assistant using the Overkiz API. + +## Supported hubs + +- Atlantic Cozytouch +- Hitachi Hi Kumo +- Nexity Eugénie +- Rexel Energeasy Connect +- Somfy Connexoon IO +- Somfy Connexoon RTS +- Somfy TaHoma +- Somfy TaHoma Switch [(instructions)](#tahoma-switch) +- Thermor Cozytouch + +If you own a Somfy hub, you could also use the [Somfy integration](/integrations/somfy/) which uses the official API. + +### TaHoma Switch + +Multiple users reported that the TaHoma Switch will work with this integration **after** you create a scene in the TaHoma app and wait for a few hours. + +## Supported devices + +Over 6000 devices from 60 brands are compatible with the Overkiz platform. This integration will retrieve your devices and map them to the relevant Home Assistant platforms. + +{% include integrations/config_flow.md %} + +## Known limitations + +### Z-Wave, Hue and Sonos not supported + +Even though most Overkiz hubs supports adding Z-Wave, Hue and Sonos devices, this isn't supported in the Overkiz integration. All these platforms have native integrations in Home Assistant which are more stable and feature rich. + +### Overkiz API limits + +**Execution queue is full on gateway: #xxxx-xxxx-xxxx (soft limit: 10)** + +The Overkiz has a limit of 10 actions that can be executed in parallel. Currently this can only be solved by adding a time-out in between your executions, where you need to take the execution time into account. + +**Server busy, please try again later. (Too many executions)** + +During peak hours, it could happen that the Overkiz platform is unable to execute your command. The integration will try to retry this command, however this is not guaranteed to succeed. + +### Internet connectivity required + +This integration communicates via the cloud based Overkiz API, since Overkiz doesn't expose a local API on their hubs. If you are only using Somfy IO compatible devices, you could purchase a Velux KLF200 hub and use to [the Velux integration](/integrations/velux/) which has a local API. + +#### Local API via HomeKit Controller + +If your hub (e.g. Somfy TaHoma) supports HomeKit natively, your setup code will be added as a sensor in Home Assistant. Look up your hub in Home Assistant and retrieve the value from the 'HomeKit Setup Code' sensor. You can now configure the [HomeKit Controller](/integrations/homekit_controller/) integration in Home Assistant and benefit from local support. From ff67f313571a7b63a97685793ca1c8a672ca2f43 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Mon, 27 Dec 2021 22:21:32 +0100 Subject: [PATCH 046/247] Add configuration flow to PVOutput (#20837) Co-authored-by: Martin Hjelmare --- source/_integrations/pvoutput.markdown | 30 +++++--------------------- 1 file changed, 5 insertions(+), 25 deletions(-) diff --git a/source/_integrations/pvoutput.markdown b/source/_integrations/pvoutput.markdown index 62c1c00f6f4..0fb23884786 100644 --- a/source/_integrations/pvoutput.markdown +++ b/source/_integrations/pvoutput.markdown @@ -7,38 +7,18 @@ ha_release: 0.33 ha_iot_class: Cloud Polling ha_codeowners: - '@fabaff' + - '@frenck' +ha_config_flow: true ha_domain: pvoutput ha_platforms: - sensor --- -The `pvoutput` sensor platform consumes information from [PVOutput](https://pvoutput.org/) which were uploaded by your solar photovoltaic (PV) system. +The PVOutput integration consumes information from [PVOutput](https://pvoutput.org/) which was uploaded by your solar photovoltaic (PV) system. -To add PVOutput details to your installation, add the following to your `configuration.yaml` file: +{% include integrations/config_flow.md %} -```yaml -# Example configuration.yaml entry -sensor: - - platform: pvoutput - system_id: YOUR_SYSTEM_ID - api_key: YOUR_API_KEY -``` - -{% configuration %} -api_key: - description: Your API key. A read-only key is fine. - required: true - type: string -system_id: - description: The ID of your station. - required: true - type: string -name: - description: Name of the sensor. - required: false - default: PVOutput - type: string -{% endconfiguration %} +## Extracting data into separate sensors To format the PVoutput sensor it's recommended to use the [template component](/topics/templating/). For example: From 8d267850df962c3e836a0a3b6bc3d40a98c510a8 Mon Sep 17 00:00:00 2001 From: Mick Vleeshouwer Date: Mon, 27 Dec 2021 16:00:02 -0800 Subject: [PATCH 047/247] Add Scene platform and category to current Overkiz docs (#20890) --- source/_integrations/overkiz.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_integrations/overkiz.markdown b/source/_integrations/overkiz.markdown index 6ef8c21ebba..014b1083ed6 100644 --- a/source/_integrations/overkiz.markdown +++ b/source/_integrations/overkiz.markdown @@ -7,6 +7,7 @@ ha_category: - Button - Lock - Number + - Scene ha_release: 2022.1.0 ha_config_flow: true ha_iot_class: Cloud Polling @@ -20,6 +21,7 @@ ha_platforms: - button - lock - number + - scene --- The Overkiz (by Somfy) integration platform is used by many different vendors, like Somfy, Hitachi and Atlantic. This integration will allow users to integrate their devices into Home Assistant using the Overkiz API. From 9f04d51fbf8b3d98ae4f1c3a2309657b3811f9f5 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 28 Dec 2021 08:34:33 +0100 Subject: [PATCH 048/247] Extract attribute into sensor for PVOutput (#20892) --- source/_integrations/pvoutput.markdown | 29 -------------------------- 1 file changed, 29 deletions(-) diff --git a/source/_integrations/pvoutput.markdown b/source/_integrations/pvoutput.markdown index 0fb23884786..15ee252a46a 100644 --- a/source/_integrations/pvoutput.markdown +++ b/source/_integrations/pvoutput.markdown @@ -17,32 +17,3 @@ ha_platforms: The PVOutput integration consumes information from [PVOutput](https://pvoutput.org/) which was uploaded by your solar photovoltaic (PV) system. {% include integrations/config_flow.md %} - -## Extracting data into separate sensors - -To format the PVoutput sensor it's recommended to use the [template component](/topics/templating/). For example: - -{% raw %} - -```yaml -sensor: - - platform: pvoutput - system_id: YOUR_SYSTEM_ID - api_key: YOUR_API_KEY -template: - - sensor: - - name: Power Consumption - state: "{{ state_attr('sensor.pvoutput', 'power_consumption') | float(default=0) }}" - unit_of_measurement: "W" - - name: Energy Consumption - state: "{{ '%0.1f' | format(state_attr('sensor.pvoutput', 'energy_consumption') | float(default=0) / 1000) }}" - unit_of_measurement: "kWh" - - name: Power Generation - state: "{{ state_attr('sensor.pvoutput', 'power_generation') | float(default=0) }}" - unit_of_measurement: "W" - - name: Energy Generation - state: "{{ '%0.2f' | format(state_attr('sensor.pvoutput', 'energy_generation') | float(default=0) / 1000) }}" - unit_of_measurement: "kWh" -``` - -{% endraw %} From 7b1784a3405f7176f8591f1d12021cdfe9c0fc54 Mon Sep 17 00:00:00 2001 From: Mick Vleeshouwer Date: Tue, 28 Dec 2021 01:11:00 -0800 Subject: [PATCH 049/247] Add binary sensor entity to Overkiz documentation (#20905) --- source/_integrations/overkiz.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_integrations/overkiz.markdown b/source/_integrations/overkiz.markdown index 014b1083ed6..bf9335044bd 100644 --- a/source/_integrations/overkiz.markdown +++ b/source/_integrations/overkiz.markdown @@ -8,6 +8,7 @@ ha_category: - Lock - Number - Scene + - Binary Sensor ha_release: 2022.1.0 ha_config_flow: true ha_iot_class: Cloud Polling @@ -22,6 +23,7 @@ ha_platforms: - lock - number - scene + - binary_sensor --- The Overkiz (by Somfy) integration platform is used by many different vendors, like Somfy, Hitachi and Atlantic. This integration will allow users to integrate their devices into Home Assistant using the Overkiz API. From 8c880402a07b893a8bc83f7e7ac7aa97dee2162a Mon Sep 17 00:00:00 2001 From: Mick Vleeshouwer Date: Tue, 28 Dec 2021 01:12:07 -0800 Subject: [PATCH 050/247] Add light platform to current Overkiz documentation (#20880) --- source/_integrations/overkiz.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_integrations/overkiz.markdown b/source/_integrations/overkiz.markdown index bf9335044bd..f3900e93865 100644 --- a/source/_integrations/overkiz.markdown +++ b/source/_integrations/overkiz.markdown @@ -7,6 +7,7 @@ ha_category: - Button - Lock - Number + - Light - Scene - Binary Sensor ha_release: 2022.1.0 @@ -22,6 +23,7 @@ ha_platforms: - button - lock - number + - light - scene - binary_sensor --- From 49f9719e206a5152de8e7c609a7da4b3732abcd6 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 28 Dec 2021 15:36:03 +0100 Subject: [PATCH 051/247] Deprecate Bosch BME680 Environmental Sensor (ADR-0019) (#20912) --- source/_integrations/bme680.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_integrations/bme680.markdown b/source/_integrations/bme680.markdown index 476b35a4d08..3c05ba672d4 100644 --- a/source/_integrations/bme680.markdown +++ b/source/_integrations/bme680.markdown @@ -10,6 +10,14 @@ ha_platforms: - sensor --- +
+ +This integration is deprecated and will be removed in Home Assistant Core 2022.4. + +For more information see: [Architectural Decision Record 0019](https://github.com/home-assistant/architecture/blob/master/adr/0019-GPIO.md). + +
+ The `bme680` sensor platform allows you to read temperature, humidity, pressure and gas resistance values of a [Bosch BME680 Environmental sensor](https://cdn-shop.adafruit.com/product-files/3660/BME680.pdf) connected via an [I2C](https://en.wikipedia.org/wiki/I²C) bus (SDA, SCL pins). It allows you to use all the operation modes of the sensor described in its datasheet. In addition, it includes a basic air quality calculation that uses gas resistance and humidity measurements to calculate a percentage based air quality measurement. Tested devices: From b390ad46ec4c9a4a4fd495b7608785eeccfc7207 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 28 Dec 2021 15:38:21 +0100 Subject: [PATCH 052/247] Deprecate Bosch BMP280 Environmental Sensor (ADR-0019) (#20913) --- source/_integrations/bmp280.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_integrations/bmp280.markdown b/source/_integrations/bmp280.markdown index 5ae64297615..6ea6b37d784 100644 --- a/source/_integrations/bmp280.markdown +++ b/source/_integrations/bmp280.markdown @@ -15,6 +15,14 @@ ha_platforms: - sensor --- +
+ +This integration is deprecated and will be removed in Home Assistant Core 2022.4. + +For more information see: [Architectural Decision Record 0019](https://github.com/home-assistant/architecture/blob/master/adr/0019-GPIO.md). + +
+ The `bmp280` sensor platform allows you to read temperature and pressure values of a [Bosch BMP280 Environmental sensor](https://www.bosch-sensortec.com/products/environmental-sensors/pressure-sensors/bmp280/) connected via [I2C](https://en.wikipedia.org/wiki/I²C) bus (SDA, SCL pins). This integration has been tested on a Raspberry Pi 4B, but it should work on any device which is supported by [CircuitPython](https://circuitpython.org/). From 9bff704fcf3791bd3fb098e95fd44d5988cd7676 Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Tue, 28 Dec 2021 21:38:09 +0100 Subject: [PATCH 053/247] Add CO device classes to binary_sensor (#20721) --- source/_integrations/binary_sensor.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_integrations/binary_sensor.markdown b/source/_integrations/binary_sensor.markdown index 47fc263c988..fb769c6d3cf 100644 --- a/source/_integrations/binary_sensor.markdown +++ b/source/_integrations/binary_sensor.markdown @@ -46,6 +46,7 @@ The full list of supported binary sensor device classes is below - **None**: Generic on/off. This is the default and doesn't need to be set. - **battery**: `on` means low, `off` means normal - **battery_charging**: `on` means charging, `off` means not charging +- **carbon_monoxide**: `on` means carbon monoxide detected, `off` no carbon monoxide (clear) - **cold**: `on` means cold, `off` means normal - **connectivity**: `on` means connected, `off` means disconnected - **door**: `on` means open, `off` means closed From d8e33385859b994271e3b3d9566d9f3ed33191b2 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 29 Dec 2021 01:25:56 +0100 Subject: [PATCH 054/247] Deprecate Time of Flight (ADR-0019) (#20917) --- source/_integrations/tof.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_integrations/tof.markdown b/source/_integrations/tof.markdown index 81e7edd91f7..2fcd761612a 100644 --- a/source/_integrations/tof.markdown +++ b/source/_integrations/tof.markdown @@ -11,6 +11,14 @@ ha_platforms: - sensor --- +
+ +This integration is deprecated and will be removed in Home Assistant Core 2022.4. + +For more information see: [Architectural Decision Record 0019](https://github.com/home-assistant/architecture/blob/master/adr/0019-GPIO.md). + +
+ The Time of Flight sensor uses an invisible laser to measure distance with millimeter resolution. Tested devices: From 5f1a08883e5129309c0f52745a6c442f6f1cebb2 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 29 Dec 2021 01:26:35 +0100 Subject: [PATCH 055/247] Deprecate HTU21D(F) Sensor (ADR-0019) (#20918) --- source/_integrations/htu21d.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_integrations/htu21d.markdown b/source/_integrations/htu21d.markdown index a687bb0e487..187f837bb5b 100644 --- a/source/_integrations/htu21d.markdown +++ b/source/_integrations/htu21d.markdown @@ -10,6 +10,14 @@ ha_platforms: - sensor --- +
+ +This integration is deprecated and will be removed in Home Assistant Core 2022.4. + +For more information see: [Architectural Decision Record 0019](https://github.com/home-assistant/architecture/blob/master/adr/0019-GPIO.md). + +
+ The `htu21d` sensor platform allows you to read the temperature and humidity from a [HTU21D sensor](https://cdn-shop.adafruit.com/datasheets/1899_HTU21D.pdf) connected via [I2c](https://en.wikipedia.org/wiki/I²C) bus (SDA, SCL pins). Tested devices: From 1e96488917ba8b61e928220676990bb2401ca940 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20L=C3=B6vdahl?= Date: Wed, 29 Dec 2021 15:31:37 +0200 Subject: [PATCH 056/247] Update Vallox documentation for config flow (#20861) --- source/_integrations/vallox.markdown | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/source/_integrations/vallox.markdown b/source/_integrations/vallox.markdown index de93525458d..4183e742401 100644 --- a/source/_integrations/vallox.markdown +++ b/source/_integrations/vallox.markdown @@ -4,6 +4,7 @@ description: Instructions on how to integrate Vallox ventilation units into Home ha_category: - Fan - Sensor +ha_config_flow: true ha_release: 0.96 ha_iot_class: Local Polling ha_domain: vallox @@ -25,24 +26,7 @@ The **fan** platform of this integration allows you to either turn on/off the co Also, there is a **sensor** platform that exposes a number of relevant metrics like fan speed, various air temperatures and humidity. -## Configuration - -```yaml -vallox: - host: IP_ADDRESS -``` - -{% configuration %} -host: - description: The IP or hostname of the ventilation unit in your home network. - required: true - type: string -name: - description: The name of this device as you want to see it in Home Assistant. - required: false - default: Vallox - type: string -{% endconfiguration %} +{% include integrations/config_flow.md %} ## Profile Switching From 655c425d4ed010166052618933126b37a07fbce4 Mon Sep 17 00:00:00 2001 From: Mirko Lenz Date: Wed, 29 Dec 2021 18:17:37 +0100 Subject: [PATCH 057/247] Add response parameter for knx.send service (#20927) --- source/_integrations/knx.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/_integrations/knx.markdown b/source/_integrations/knx.markdown index 9fe80eb8f5d..1c776b03256 100644 --- a/source/_integrations/knx.markdown +++ b/source/_integrations/knx.markdown @@ -178,6 +178,10 @@ payload: type: description: If set, the payload will not be sent as raw bytes, but encoded as given DPT. KNX sensor types are valid values - see table in [KNX Sensor](#sensor). type: [string, integer, float] +response: + description: If set to `true`, the telegram will be sent as a `GroupValueResponse` instead of a `GroupValueWrite`. + type: boolean + default: false {% endconfiguration %} ### Read From c164ed32fd00c3707ae0ab939fc4c6081c46d1d4 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 29 Dec 2021 07:54:09 -1000 Subject: [PATCH 058/247] Update supported models for flux_led (#20934) --- source/_integrations/flux_led.markdown | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/source/_integrations/flux_led.markdown b/source/_integrations/flux_led.markdown index d379a17edab..388ffe07e72 100644 --- a/source/_integrations/flux_led.markdown +++ b/source/_integrations/flux_led.markdown @@ -122,6 +122,8 @@ The following models have been tested with integration. | Model | Description | Notes | | ----- | --------------------------- | ------------------------------- | +| 0x01 | Legacy RGB Controller | Original protocol | +| 0x03 | Legacy CCT Controller | Original protocol | | 0x04 | UFO Controller RGBW | | | 0x06 | Controller RGBW | | | 0x07 | Controller RGBCW | | @@ -136,6 +138,7 @@ The following models have been tested with integration. | 0x35 | Bulb RGBCW | | | 0x41 | Controller Dimmable | | | 0x44 | Bulb RGBW | | +| 0x52 | Bulb CCT | | | 0x54 | Downlight RGBW | | | 0x93 | Switch 1c | | | 0x94 | Switch 1c Watt | | @@ -150,20 +153,22 @@ The following models have not been tested with integration but may work. | Model | Description | Notes | | ----- | --------------------------- | ------------------------------- | +| 0x02 | Legacy Dimmable Controller | Original protocol | | 0x09 | Ceiling Light CCT | | | 0x16 | Magnetic Light CCT | | | 0x17 | Magnetic Light Dimmable | | | 0x19 | Socket 2 USB | | | 0x18 | Plant Light | | | 0x1B | Spray Light | | +| 0x1E | Ceiling Light RGBCW | Probably works & same as 0x35 | | 0x62 | Controller CCT | May be discontinued | -| 0x52 | Bulb CCT | May be discontinued | | 0x95 | Switch 2c | | | 0x96 | Switch 4c | | | 0xD1 | Digital Light | | | 0xE1 | Ceiling Light | | | 0xE2 | Ceiling Light Assist | | -| 0xA4 | Addressable v4 | | +| 0xA4 | Addressable v4 | Probably works & same as 0xA3 | +| 0xA6 | Addressable v6 | Probably works & same as 0xA3 | ### Effects From 85c520ad67ac70d916d1bb279f188e4c175e32b6 Mon Sep 17 00:00:00 2001 From: Allen Porter Date: Wed, 29 Dec 2021 14:22:38 -0800 Subject: [PATCH 059/247] Deprecate Legacy Works with Nest API (#20936) --- source/_integrations/nest.markdown | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/_integrations/nest.markdown b/source/_integrations/nest.markdown index c431c30bb00..353da48f9e3 100644 --- a/source/_integrations/nest.markdown +++ b/source/_integrations/nest.markdown @@ -449,12 +449,12 @@ logger: - It is recommended to let Home Assistant create the Pub/Sub subscription for you. However, if you would like more control you can enter a `susbcriber_id` in the configuration. See [Subscribe to Events](https://developers.google.com/nest/device-access/subscribe-to-events) for more instructions on how to manually create a subscription and use the full subscription name in the Home Assistant configuration e.g. `projects/gcp-project-name/subscriptions/subscription-id` -# Legacy Works With Nest API - -This section contains instructions for the Legacy [Works with Nest](https://developers.nest.com/) API. +# Works With Nest API (Deprecated)
-New users are not currently able to set up a Works With Nest Developer account. The documentation is preserved here for existing users of the API. + +The [Works with Nest](https://developers.nest.com/) API is deprecated and will be removed in Home Assistant Core 2022.5. +
{% details "Legacy Works with Nest Configuration Steps" %} From 13f953afd5d9c7bcc6c8d2523c44ed10836e3306 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Thu, 30 Dec 2021 22:43:11 +0100 Subject: [PATCH 060/247] Add configuration flow to Whois (#20942) --- source/_integrations/whois.markdown | 27 +++++---------------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/source/_integrations/whois.markdown b/source/_integrations/whois.markdown index 2dcb68dd6d1..e2c092a7818 100644 --- a/source/_integrations/whois.markdown +++ b/source/_integrations/whois.markdown @@ -6,31 +6,14 @@ ha_category: ha_release: 0.57 ha_iot_class: Cloud Polling ha_domain: whois +ha_config_flow: true +ha_codeowners: + - "@frenck" ha_platforms: - sensor --- -The `whois` sensor platform allows you to perform daily WHOIS lookups against your owned domains. This provides you with information such as `expiration_date`, `name_servers` and `registrar` details. +The Whois integration allows you to perform daily WHOIS lookups against your owned domains. This provides you with information such as `expiration_date`, `name_servers` and `registrar` details. -## Configuration -To use this sensor in your installation, add the following to your `configuration.yaml` file: - -```yaml -# Example configuration.yaml entry -sensor: - - platform: whois - domain: example.net -``` - -{% configuration %} - domain: - description: The domain you want to perform WHOIS lookups against. - required: true - type: string - name: - description: Name to use in the frontend. - required: false - default: Whois - type: string -{% endconfiguration %} +{% include integrations/config_flow.md %} From 2846d6ce459050192802f210722f6c99c9f2d18c Mon Sep 17 00:00:00 2001 From: Christopher Bailey Date: Fri, 31 Dec 2021 14:52:22 -0500 Subject: [PATCH 061/247] Adds UniFi Protect integration (#20851) Co-authored-by: J. Nick Koston --- CODEOWNERS | 1 + source/_integrations/unifiprotect.markdown | 84 ++++++++++++++++++ .../unifiprotect/unifi_os_admin.png | Bin 0 -> 48532 bytes 3 files changed, 85 insertions(+) create mode 100644 source/_integrations/unifiprotect.markdown create mode 100644 source/images/integrations/unifiprotect/unifi_os_admin.png diff --git a/CODEOWNERS b/CODEOWNERS index f80fe2625b7..439500e0935 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -544,6 +544,7 @@ source/_integrations/twinkly.markdown @dr1rrb source/_integrations/ubus.markdown @noltari source/_integrations/unifi.markdown @Kane610 source/_integrations/unifiled.markdown @florisvdk +source/_integrations/unifiprotect.markdown @briis @AngellusMortis @bdraco source/_integrations/upb.markdown @gwww source/_integrations/upc_connect.markdown @pvizeli @fabaff source/_integrations/upcloud.markdown @scop diff --git a/source/_integrations/unifiprotect.markdown b/source/_integrations/unifiprotect.markdown new file mode 100644 index 00000000000..ff10239c2b2 --- /dev/null +++ b/source/_integrations/unifiprotect.markdown @@ -0,0 +1,84 @@ +--- +title: UniFi Protect +description: Instructions on how to configure UniFi Protect integration by Ubiquiti. +ha_category: + - Hub + - Camera +ha_release: 2022.2 +ha_iot_class: Local Push +ha_config_flow: true +ha_quality_scale: platinum +ha_codeowners: + - '@briis' + - '@AngellusMortis' + - '@bdraco' +ha_domain: unifiprotect +ha_platforms: + - camera +--- + +The UniFi Protect integration, adds support for retrieving Camera feeds and Sensor data from an [UniFi Protect application](https://ui.com/camera-security) by [Ubiquiti Networks, inc.](https://www.ui.com/) that is running on an UniFi OS Console. + +## Prerequisites + +### Hardware Support + +This Integration supports all UniFi OS Consoles that can run UniFi Protect. Currently, this includes: + +* UniFi Protect Network Video Recorder (**UNVR**) +* UniFi Protect Network Video Recorder Pro (**UNVRPRO**) +* UniFi Dream Machine Pro (**UDMP**) +* UniFi Cloud Key Gen2 Plus (**CKGP**) firmware version v2.0.24+ + +CKGP with Firmware v1.x **do NOT run UniFiOS**, you must upgrade to firmware v2.0.24 or newer. + +### Software Support + +The absolute **minimal** software version is `1.20.0` for UniFi Protect. If you have an older version, you will get errors trying to set up the integration. However, the general advice is the latest 2 minor versions of UniFi Protect and hardware supported by those are supported. Since UniFi Protect has its own release cycle, you should only upgrade UniFi Protect _after_ the next Home Assistant release comes out to ensure the new version is fully supported. + +Example: as of `2022.2.0` of Home Assistant, UniFi Protect `1.21.0-beta.1` is the newest UniFi Protect version. So the recommended versions of UniFi Protect to run for a `2022.2.0` version of Home Assistant are `1.20.0`, `1.20.1` or `1.21.0-beta.1`. + +### Local User + +You will need a local user created in your UniFi OS Console to log in with. Ubiquiti Cloud Users will **not** work. + +1. Login to your *Local Portal* on your UniFiOS device, and click on *Users* +1. In the upper right corner, click on *Add User* +1. Click *Add Admin*, and fill out the form. Specific Fields to pay attention to: + * Role: Must be *Limited Admin* + * Account Type: *Local Access Only* + * CONTROLLER PERMISSIONS - Under UniFi Protect, select Administrators. **NOTE**: Other roles may work, but only the default Administrators rule is fully tested. +1. Click *Add* in at the bottom Right. + +**HINT**: A few users have reported that they had to restart their UDMP device after creating the local user for it to work. So if you get some kind of *Error 500* when setting up the Integration, try restart the UDMP. + +![ADMIN_UNIFIOS](/images/integrations/unifiprotect/unifi_os_admin.png) + +### Camera Streams + +The Integration uses the RTSP(S) Streams as the Live Feed source, so this needs to be enabled on each camera to ensure you can stream your camera in Home Assistant. This may already be enabled by default, but it is recommended to just check that this is done. To check and enable the feature: + +1. Open UniFi Protect and click on *Devices* +1. Select *Manage* in the Menu bar at the top +1. Click on the + sign next to RTSP +1. Enable a minimum 1 stream out of the 3 available. The Stream with the Highest resolution is the default enabled one. + +{% include integrations/config_flow.md %} + +## Features + +All known UniFi Protect devices are should be supported. Each UniFi Protect device will get a variety of entities added for each of the different entity platforms. + +### Cameras + +Each UniFi Protect camera will get the following entities added: + +* **Camera** - A camera entity for each camera channel and RTSP(S) combination found for each camera (up to 6). Only the highest resolution RTSPS camera entity will be enabled by default. + +## Troubleshooting + +### Delay in Video Feed + +The default settings on the stream integration will give you a 5-15+ second delay. You can reduce this delay to 1-3 seconds, by enabling [LL-HLS in the stream integration](/integrations/stream/#ll-hls). You will also want to put an HTTP/2 reserve proxy in front of Home Assistant so you can have connection pooling. If you do not add a reverse proxy, you may start to get "Waiting for Websocket..." messages while trying to view too many camera streams at once. One way to do this is using the official NGINX Proxy Add-on: + +[![NGINX Proxy Add-on](https://my.home-assistant.io/badges/supervisor_addon.svg)](https://my.home-assistant.io/redirect/supervisor_addon/?addon=core_nginx_proxy) diff --git a/source/images/integrations/unifiprotect/unifi_os_admin.png b/source/images/integrations/unifiprotect/unifi_os_admin.png new file mode 100644 index 0000000000000000000000000000000000000000..4b7ceac0a832c5ed4059c4c82b0751ce9a4be924 GIT binary patch literal 48532 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
FiMyQ6!&G8O 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 cP;&D0j_Ui)?}X`YIN(oKQc literal 0 HcmV?d00001 From 6055675683b7a44c6d2c87a7b2aa8e017a15683b Mon Sep 17 00:00:00 2001 From: Christopher Bailey Date: Fri, 31 Dec 2021 15:54:36 -0500 Subject: [PATCH 062/247] Adds docs for the unifiprotect media_player platform (#20966) Co-authored-by: J. Nick Koston --- source/_integrations/unifiprotect.markdown | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/source/_integrations/unifiprotect.markdown b/source/_integrations/unifiprotect.markdown index ff10239c2b2..afabe46bad3 100644 --- a/source/_integrations/unifiprotect.markdown +++ b/source/_integrations/unifiprotect.markdown @@ -4,6 +4,7 @@ description: Instructions on how to configure UniFi Protect integration by Ubiqu ha_category: - Hub - Camera + - Media Player ha_release: 2022.2 ha_iot_class: Local Push ha_config_flow: true @@ -15,6 +16,7 @@ ha_codeowners: ha_domain: unifiprotect ha_platforms: - camera + - media_player --- The UniFi Protect integration, adds support for retrieving Camera feeds and Sensor data from an [UniFi Protect application](https://ui.com/camera-security) by [Ubiquiti Networks, inc.](https://www.ui.com/) that is running on an UniFi OS Console. @@ -36,7 +38,7 @@ CKGP with Firmware v1.x **do NOT run UniFiOS**, you must upgrade to firmware v2. The absolute **minimal** software version is `1.20.0` for UniFi Protect. If you have an older version, you will get errors trying to set up the integration. However, the general advice is the latest 2 minor versions of UniFi Protect and hardware supported by those are supported. Since UniFi Protect has its own release cycle, you should only upgrade UniFi Protect _after_ the next Home Assistant release comes out to ensure the new version is fully supported. -Example: as of `2022.2.0` of Home Assistant, UniFi Protect `1.21.0-beta.1` is the newest UniFi Protect version. So the recommended versions of UniFi Protect to run for a `2022.2.0` version of Home Assistant are `1.20.0`, `1.20.1` or `1.21.0-beta.1`. +Example: as of `2022.2.0` of Home Assistant, UniFi Protect `1.21.0-beta.2` is the newest UniFi Protect version. So the recommended versions of UniFi Protect to run for a `2022.2.0` version of Home Assistant are `1.20.0`, `1.20.1`, `1.20.2`, `1.20.3`, `1.21.0-beta.1`, or `1.21.0-beta.2`. ### Local User @@ -74,11 +76,27 @@ All known UniFi Protect devices are should be supported. Each UniFi Protect devi Each UniFi Protect camera will get the following entities added: * **Camera** - A camera entity for each camera channel and RTSP(S) combination found for each camera (up to 6). Only the highest resolution RTSPS camera entity will be enabled by default. +* **Media Player** - If your camera has a speaker, you will get a media player entity that allows you to play audio to your camera's speaker. Any audio file URI that is playable by FFmpeg will be able to be played to your speaker, including via the [TTS Say Service](https://www.home-assistant.io/integrations/tts/#service-say). ## Troubleshooting +### Enabling Debug Logging + +Both the UniFi Protect integration and the Python library it uses provide a ton of debug logging that can help you with troubleshooting connectivity issues. To enable debug logging for both, add the following to your `configuration.yaml` file: + +```yaml +logger: + logs: + pyunifiprotect: debug + homeassistant.components.unifiprotect: debug +``` + ### Delay in Video Feed The default settings on the stream integration will give you a 5-15+ second delay. You can reduce this delay to 1-3 seconds, by enabling [LL-HLS in the stream integration](/integrations/stream/#ll-hls). You will also want to put an HTTP/2 reserve proxy in front of Home Assistant so you can have connection pooling. If you do not add a reverse proxy, you may start to get "Waiting for Websocket..." messages while trying to view too many camera streams at once. One way to do this is using the official NGINX Proxy Add-on: [![NGINX Proxy Add-on](https://my.home-assistant.io/badges/supervisor_addon.svg)](https://my.home-assistant.io/redirect/supervisor_addon/?addon=core_nginx_proxy) + +### Cannot Play Audio to Speakers + +Unlike with many other things, playing audio to your speakers requires your Home Assistant to be able to reach your camera directly. Specifically via port `tcp/7004`. You can [enable debug logging](#enabling-debug-logging) and it will output the full FFmpeg command that will be run and the output from FFmpeg to help you troubleshoot why audio is not playing to the device. From eb6acd769f1634c2ca8339c34b00764cffbbe2e5 Mon Sep 17 00:00:00 2001 From: Christopher Bailey Date: Fri, 31 Dec 2021 16:12:41 -0500 Subject: [PATCH 063/247] Add docs for the UniFi Protect button platform (#20967) Co-authored-by: J. Nick Koston --- source/_integrations/unifiprotect.markdown | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/source/_integrations/unifiprotect.markdown b/source/_integrations/unifiprotect.markdown index afabe46bad3..737fa7180e7 100644 --- a/source/_integrations/unifiprotect.markdown +++ b/source/_integrations/unifiprotect.markdown @@ -3,6 +3,7 @@ title: UniFi Protect description: Instructions on how to configure UniFi Protect integration by Ubiquiti. ha_category: - Hub + - Button - Camera - Media Player ha_release: 2022.2 @@ -15,6 +16,7 @@ ha_codeowners: - '@bdraco' ha_domain: unifiprotect ha_platforms: + - button - camera - media_player --- @@ -77,6 +79,25 @@ Each UniFi Protect camera will get the following entities added: * **Camera** - A camera entity for each camera channel and RTSP(S) combination found for each camera (up to 6). Only the highest resolution RTSPS camera entity will be enabled by default. * **Media Player** - If your camera has a speaker, you will get a media player entity that allows you to play audio to your camera's speaker. Any audio file URI that is playable by FFmpeg will be able to be played to your speaker, including via the [TTS Say Service](https://www.home-assistant.io/integrations/tts/#service-say). +* **Button** - A disabled by default button entity is added for each camera entity. The button will let you reboot your camera device. + +### Floodlight + +Each UniFi Protect flood light will get the following entities added: + +* **Button** - A disabled by default button entity is added for each floodlight entity. The button will let you reboot your floodlight device. + +### Sensor + +Each UniFi Protect sensor will get the following entities added: + +* **Button** - A disabled by default button entity is added for each sensor entity. The button will let you reboot your sensor device. + +### Viewport + +Each UniFi Protect viewport will get the following entities added: + +* **Button** - A disabled by default button entity is added for each viewport entity. The button will let you reboot your viewport device. ## Troubleshooting From 382efa282ebbcdb2064d0282b745cd4de03e2560 Mon Sep 17 00:00:00 2001 From: Christopher Bailey Date: Fri, 31 Dec 2021 16:22:13 -0500 Subject: [PATCH 064/247] Add docs for UniFi Protect light platform (#20968) --- source/_integrations/unifiprotect.markdown | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/source/_integrations/unifiprotect.markdown b/source/_integrations/unifiprotect.markdown index 737fa7180e7..c547c756ae5 100644 --- a/source/_integrations/unifiprotect.markdown +++ b/source/_integrations/unifiprotect.markdown @@ -5,6 +5,7 @@ ha_category: - Hub - Button - Camera + - Light - Media Player ha_release: 2022.2 ha_iot_class: Local Push @@ -18,6 +19,7 @@ ha_domain: unifiprotect ha_platforms: - button - camera + - light - media_player --- @@ -79,25 +81,26 @@ Each UniFi Protect camera will get the following entities added: * **Camera** - A camera entity for each camera channel and RTSP(S) combination found for each camera (up to 6). Only the highest resolution RTSPS camera entity will be enabled by default. * **Media Player** - If your camera has a speaker, you will get a media player entity that allows you to play audio to your camera's speaker. Any audio file URI that is playable by FFmpeg will be able to be played to your speaker, including via the [TTS Say Service](https://www.home-assistant.io/integrations/tts/#service-say). -* **Button** - A disabled by default button entity is added for each camera entity. The button will let you reboot your camera device. +* **Button** - A disabled by default button entity is added for each camera device. The button will let you reboot your camera device. -### Floodlight +### Floodlights Each UniFi Protect flood light will get the following entities added: -* **Button** - A disabled by default button entity is added for each floodlight entity. The button will let you reboot your floodlight device. +* **Light** - A light entity will be added for each floodlight device. The light entity will let you control turning on or off your light as well as adjust the brightness of your floodlight. +* **Button** - A disabled by default button entity is added for each floodlight device. The button will let you reboot your floodlight device. -### Sensor +### Sensors Each UniFi Protect sensor will get the following entities added: -* **Button** - A disabled by default button entity is added for each sensor entity. The button will let you reboot your sensor device. +* **Button** - A disabled by default button entity is added for each sensor device. The button will let you reboot your sensor device. -### Viewport +### Viewports Each UniFi Protect viewport will get the following entities added: -* **Button** - A disabled by default button entity is added for each viewport entity. The button will let you reboot your viewport device. +* **Button** - A disabled by default button entity is added for each viewport device. The button will let you reboot your viewport device. ## Troubleshooting From a111a2a8bf16d752f596a24a10985f2ade052979 Mon Sep 17 00:00:00 2001 From: Christopher Bailey Date: Sat, 1 Jan 2022 16:30:46 -0500 Subject: [PATCH 065/247] Add UniFi Protect switch platform (#20975) Co-authored-by: J. Nick Koston --- source/_integrations/unifiprotect.markdown | 31 ++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/source/_integrations/unifiprotect.markdown b/source/_integrations/unifiprotect.markdown index c547c756ae5..8f1a8e1a974 100644 --- a/source/_integrations/unifiprotect.markdown +++ b/source/_integrations/unifiprotect.markdown @@ -7,6 +7,7 @@ ha_category: - Camera - Light - Media Player + - Switch ha_release: 2022.2 ha_iot_class: Local Push ha_config_flow: true @@ -21,6 +22,7 @@ ha_platforms: - camera - light - media_player + - switch --- The UniFi Protect integration, adds support for retrieving Camera feeds and Sensor data from an [UniFi Protect application](https://ui.com/camera-security) by [Ubiquiti Networks, inc.](https://www.ui.com/) that is running on an UniFi OS Console. @@ -77,30 +79,55 @@ All known UniFi Protect devices are should be supported. Each UniFi Protect devi ### Cameras +#### Smart Detections + +A clarification about "Smart Detections" below and which cameras have them. The following cameras have Smart Detections: + +* All "AI" series cameras. This includes the AI 360 and the AI Bullet. +* All "G4" series cameras _except_ the G4 Instant. This includes the G4 Doorbell, G4 Bullet and G4 Pro. + +G3 Series cameras do _not_ have Smart detections. + +#### Entities + Each UniFi Protect camera will get the following entities added: * **Camera** - A camera entity for each camera channel and RTSP(S) combination found for each camera (up to 6). Only the highest resolution RTSPS camera entity will be enabled by default. * **Media Player** - If your camera has a speaker, you will get a media player entity that allows you to play audio to your camera's speaker. Any audio file URI that is playable by FFmpeg will be able to be played to your speaker, including via the [TTS Say Service](https://www.home-assistant.io/integrations/tts/#service-say). +* **Switch** - The following switch entities will be added for each camera: + * **Overlay (Show Name, Show Date, Show Logo, Show Bitrate)** - 4 configuration switches will be added to configuration the Overlay Information on your camera's video feed. + * **Smart Detections (Person, Vehicle)** - If your camera has smart detections, there will be a switch added for each smart detection type to enable or disable that type. + * **Status Light** - If your camera has a status light, there will be a configuration switch to turn it on and off. + * **HDR Mode** - If your camera has HDR, there will be a configuration switch to turn it on and off. + * **High FPS** - If your camera has a "High FPS" mode, there will be a configuration switch to toggle between Default and High FPS mode. + * **Privacy Mode** - If your camera allows for Privacy Masks, there will be a configuration switch to toggle a "Privacy Mode" that disables recording, microphone, and a black privacy zone over the whole camera. + * **System Sounds** - If your camera has a speaker, there will be a configuration switch to toggle system sounds. + * **SSH Enabled** - A disabled by default switch entity will be added to let you toggle on and off SSH for your camera. Username is `ubnt` and password is your Device Password as configured in UniFi Protect. * **Button** - A disabled by default button entity is added for each camera device. The button will let you reboot your camera device. ### Floodlights -Each UniFi Protect flood light will get the following entities added: +Each UniFi Protect floodlight will get the following entities added: * **Light** - A light entity will be added for each floodlight device. The light entity will let you control turning on or off your light as well as adjust the brightness of your floodlight. +* **Switch** - The following switch entities will be added for each camera: + * **Status Light** - A configuration switch to turn it on and off to turn on and off the status light for your floodlight. + * **SSH Enabled** - A disabled by default switch entity will be added to let you toggle on and off SSH for your floodlight. Username is `ubnt` and password is your Device Password as configured in UniFi Protect. * **Button** - A disabled by default button entity is added for each floodlight device. The button will let you reboot your floodlight device. ### Sensors -Each UniFi Protect sensor will get the following entities added: +Each UniFi Protect smart sensor will get the following entities added: * **Button** - A disabled by default button entity is added for each sensor device. The button will let you reboot your sensor device. +* **Switch** - A disabled by default switch entity will be added to let you toggle on and off SSH for your sensor. Username is `ubnt` and password is your Device Password as configured in UniFi Protect. ### Viewports Each UniFi Protect viewport will get the following entities added: * **Button** - A disabled by default button entity is added for each viewport device. The button will let you reboot your viewport device. +* **Switch** - A disabled by default switch entity will be added to let you toggle on and off SSH for your viewport. Username is `ubnt` and password is your Device Password as configured in UniFi Protect. ## Troubleshooting From 2de20cb4e56176e129db2ce354b4af2c11725d8c Mon Sep 17 00:00:00 2001 From: Christopher Bailey Date: Sun, 2 Jan 2022 14:48:06 -0500 Subject: [PATCH 066/247] Add docs for UniFi Protect number platform (#20985) --- source/_integrations/unifiprotect.markdown | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/source/_integrations/unifiprotect.markdown b/source/_integrations/unifiprotect.markdown index 8f1a8e1a974..41fe3c640ac 100644 --- a/source/_integrations/unifiprotect.markdown +++ b/source/_integrations/unifiprotect.markdown @@ -7,6 +7,7 @@ ha_category: - Camera - Light - Media Player + - Number - Switch ha_release: 2022.2 ha_iot_class: Local Push @@ -22,6 +23,7 @@ ha_platforms: - camera - light - media_player + - number - switch --- @@ -38,7 +40,7 @@ This Integration supports all UniFi OS Consoles that can run UniFi Protect. Curr * UniFi Dream Machine Pro (**UDMP**) * UniFi Cloud Key Gen2 Plus (**CKGP**) firmware version v2.0.24+ -CKGP with Firmware v1.x **do NOT run UniFiOS**, you must upgrade to firmware v2.0.24 or newer. +CKGP with Firmware v1.x **do NOT run UniFi OS**, you must upgrade to firmware v2.0.24 or newer. ### Software Support @@ -50,7 +52,7 @@ Example: as of `2022.2.0` of Home Assistant, UniFi Protect `1.21.0-beta.2` is th You will need a local user created in your UniFi OS Console to log in with. Ubiquiti Cloud Users will **not** work. -1. Login to your *Local Portal* on your UniFiOS device, and click on *Users* +1. Login to your *Local Portal* on your UniFi OS device, and click on *Users* 1. In the upper right corner, click on *Add User* 1. Click *Add Admin*, and fill out the form. Specific Fields to pay attention to: * Role: Must be *Limited Admin* @@ -94,6 +96,11 @@ Each UniFi Protect camera will get the following entities added: * **Camera** - A camera entity for each camera channel and RTSP(S) combination found for each camera (up to 6). Only the highest resolution RTSPS camera entity will be enabled by default. * **Media Player** - If your camera has a speaker, you will get a media player entity that allows you to play audio to your camera's speaker. Any audio file URI that is playable by FFmpeg will be able to be played to your speaker, including via the [TTS Say Service](https://www.home-assistant.io/integrations/tts/#service-say). +* **Number** - The following number entities will be added for each camera: + * **Chime Duration** - If your camera has a chime (doorbell), a configuration number entity will be added to adjust the chime duration of your doorbell chime. + * **Zoom Level** - If your camera has optical zoom, a configuration number entity will be added to adjust the zoom level. + * **Microphone Level** - If your camera has a microphone, a configuration number entity will be added to adjust the camera's microphone sensitivity. + * **WDR Level** - If your camera does not have HDR, a configuration number entity will be added to adjust the WDR level. * **Switch** - The following switch entities will be added for each camera: * **Overlay (Show Name, Show Date, Show Logo, Show Bitrate)** - 4 configuration switches will be added to configuration the Overlay Information on your camera's video feed. * **Smart Detections (Person, Vehicle)** - If your camera has smart detections, there will be a switch added for each smart detection type to enable or disable that type. @@ -110,7 +117,10 @@ Each UniFi Protect camera will get the following entities added: Each UniFi Protect floodlight will get the following entities added: * **Light** - A light entity will be added for each floodlight device. The light entity will let you control turning on or off your light as well as adjust the brightness of your floodlight. -* **Switch** - The following switch entities will be added for each camera: +* **Number** - The following number entities will be added for each floodlight: + * **Motion Sensitivity** - A configuration number entity to adjust the sensitivity of the PIR sensor for your floodlight. + * **Auto-shutoff Duration** - A configuration number entity to adjust the the auto-shutoff timer after motion is detected. +* **Switch** - The following switch entities will be added for each floodlight: * **Status Light** - A configuration switch to turn it on and off to turn on and off the status light for your floodlight. * **SSH Enabled** - A disabled by default switch entity will be added to let you toggle on and off SSH for your floodlight. Username is `ubnt` and password is your Device Password as configured in UniFi Protect. * **Button** - A disabled by default button entity is added for each floodlight device. The button will let you reboot your floodlight device. From d932672a18f2eeccc029989cd9dc64935b01c667 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 2 Jan 2022 09:53:41 -1000 Subject: [PATCH 067/247] Add Oncue by Kohler integration (#20979) --- source/_integrations/oncue.markdown | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 source/_integrations/oncue.markdown diff --git a/source/_integrations/oncue.markdown b/source/_integrations/oncue.markdown new file mode 100644 index 00000000000..4a5af56055e --- /dev/null +++ b/source/_integrations/oncue.markdown @@ -0,0 +1,25 @@ +--- +title: Oncue by Kohler +description: Documentation about the oncue sensors. +ha_category: + - Sensor +ha_iot_class: Cloud Polling +ha_release: 2022.2 +ha_config_flow: true +ha_codeowners: + - '@bdraco' +ha_domain: oncue +ha_platforms: + - sensor +--- + +The Oncue by Kohler integration will allow you to monitor the state of your [Oncue enabled Kohler generator](https://api.kohler.com/oncueplus/#/auth). + +## Supported Devices + +- [38RCLB](https://kohlerpower.com/en/residential/generators/product/38rclb) +- [48RCLB](https://kohlerpower.com/en/residential/generators/product/48rclb) +- [60RCLA](https://kohlerpower.com/en/residential/generators/product/60rcla) +- [KG80R](https://kohlerpower.com/en/residential/generators/product/kg80r) + +{% include integrations/config_flow.md %} \ No newline at end of file From 225a9ee5f30bc95a2221a44e3675fdaf1c9c25fc Mon Sep 17 00:00:00 2001 From: uvjustin <46082645+uvjustin@users.noreply.github.com> Date: Mon, 3 Jan 2022 03:55:19 +0800 Subject: [PATCH 068/247] Update generic with no still_image_url option (#20862) --- source/_integrations/generic.markdown | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/source/_integrations/generic.markdown b/source/_integrations/generic.markdown index 4cb5701a424..34c7714f230 100644 --- a/source/_integrations/generic.markdown +++ b/source/_integrations/generic.markdown @@ -28,11 +28,11 @@ camera: {% configuration %} still_image_url: - description: "The URL your camera serves the image on, e.g., `http://192.168.1.21:2112/`. Can be a [template](/topics/templating/)." - required: true + description: "The URL your camera serves the image on, e.g., `http://192.168.1.21:2112/`. Can be a [template](/topics/templating/). At least one of still_image_url or stream_source must be provided." + required: false type: string stream_source: - description: "The URL your camera serves the live stream on, e.g., `rtsp://192.168.1.21:554/`. Can be a [template](/topics/templating/)." + description: "The URL your camera serves the live stream on, e.g., `rtsp://user:pass@192.168.1.21:554/`. Can be a [template](/topics/templating/). Usernames and passwords must be embedded in the URL. At least one of still_image_url or stream_source must be provided." required: false type: string name: @@ -40,11 +40,11 @@ name: required: false type: string username: - description: The username for accessing your camera. + description: The username for accessing your camera. Note that this username applies only to still_image_url and not to stream_source. required: false type: string password: - description: The password for accessing your camera. + description: The password for accessing your camera. Note that this password applies only to still_image_url and not to stream_source. required: false type: string authentication: @@ -121,6 +121,7 @@ camera: name: Host instance camera feed still_image_url: https://127.0.0.5:8123/api/camera_proxy/camera.live_view ``` + ### Image from HTTP only camera To access a camera which is only available via HTTP, you must turn off SSL verification. @@ -142,7 +143,18 @@ camera: - platform: generic name: Streaming Enabled still_image_url: http://194.218.96.92/jpg/image.jpg - stream_source: rtsp://194.218.96.92:554 + username: user + password: pass + stream_source: rtsp://user:pass@194.218.96.92:554 +``` + +If a camera only has a live stream URL and no snapshot URL, the [stream](/integrations/stream/) component can also generate still images from the live stream URL. + +```yaml +camera: + - platform: generic + name: Streaming + stream_source: rtsp://user:pass@194.218.96.92:554 ``` ### Secured access to the camera From d8b04f1a1e9e63d7fb327ee2c3c12007211c69e4 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 2 Jan 2022 10:36:22 -1000 Subject: [PATCH 069/247] Update oncue for binary_sensor platform (#20988) --- source/_integrations/oncue.markdown | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/_integrations/oncue.markdown b/source/_integrations/oncue.markdown index 4a5af56055e..79d1feab126 100644 --- a/source/_integrations/oncue.markdown +++ b/source/_integrations/oncue.markdown @@ -2,6 +2,7 @@ title: Oncue by Kohler description: Documentation about the oncue sensors. ha_category: + - Binary Sensor - Sensor ha_iot_class: Cloud Polling ha_release: 2022.2 @@ -10,6 +11,7 @@ ha_codeowners: - '@bdraco' ha_domain: oncue ha_platforms: + - binary_sensor - sensor --- @@ -22,4 +24,4 @@ The Oncue by Kohler integration will allow you to monitor the state of your [Onc - [60RCLA](https://kohlerpower.com/en/residential/generators/product/60rcla) - [KG80R](https://kohlerpower.com/en/residential/generators/product/kg80r) -{% include integrations/config_flow.md %} \ No newline at end of file +{% include integrations/config_flow.md %} From c04d02926885d713d457438d5c73fcc8dea58bc5 Mon Sep 17 00:00:00 2001 From: Thomas Dietrich Date: Sun, 2 Jan 2022 21:36:44 +0100 Subject: [PATCH 070/247] Statistics integration optional unique_id (#20542) --- source/_integrations/statistics.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/_integrations/statistics.markdown b/source/_integrations/statistics.markdown index 0d164fffcdf..6b613dcf36d 100644 --- a/source/_integrations/statistics.markdown +++ b/source/_integrations/statistics.markdown @@ -141,4 +141,8 @@ quantile_method: required: false default: exclusive type: string +unique_id: + description: An ID that uniquely identifies the statistics sensor. Set this to a unique value to allow customization through the UI. Change the unique ID after switching the `state_characteristic` of a previously configured sensor, to start with a fresh recorder history. + required: false + type: string {% endconfiguration %} From 635a6ecff91d0a68ec0a5bcc6106578fe4fdaa43 Mon Sep 17 00:00:00 2001 From: ollo69 <60491700+ollo69@users.noreply.github.com> Date: Sun, 2 Jan 2022 22:13:31 +0100 Subject: [PATCH 071/247] AndroidTV Config Flow (#20787) Co-authored-by: Franck Nijhof --- source/_integrations/androidtv.markdown | 171 +++++------------------- 1 file changed, 36 insertions(+), 135 deletions(-) diff --git a/source/_integrations/androidtv.markdown b/source/_integrations/androidtv.markdown index f37d3ac9145..d6fb75d75d0 100644 --- a/source/_integrations/androidtv.markdown +++ b/source/_integrations/androidtv.markdown @@ -4,9 +4,11 @@ description: Instructions on how to integrate Android TV and Fire TV devices int ha_category: - Media Player ha_release: 0.7.6 +ha_config_flow: true ha_iot_class: Local Polling ha_codeowners: - '@JeffLIrion' + - '@ollo69' ha_domain: androidtv ha_platforms: - media_player @@ -34,152 +36,45 @@ For Fire TV devices, the instructions are as follows: - From the main (Launcher) screen, select Settings. - Select My Fire TV > About > Network. -## Configuration +{% include integrations/config_flow.md %} -```yaml -# Example configuration.yaml entry -media_player: - # Use the Python ADB implementation - - platform: androidtv - name: Android TV 1 - host: 192.168.0.111 -``` - -{% configuration %} -host: - description: The IP address for your Android TV / Fire TV device. - required: true - type: string -name: - description: The friendly name of the device. - required: false - default: Android TV - type: string -port: - description: The port for your Android TV / Fire TV device. - required: false - default: 5555 - type: integer -adbkey: - description: The path to your `adbkey` file; if not provided, Home Assistant will generate a key for you (if necessary). - required: false - type: string -adb_server_ip: - description: The IP address of the ADB server. If this is provided, the integration will utilize an [ADB server](#2-adb-server) to communicate with the device. - required: false - type: string -adb_server_port: - description: The port for the ADB server. - required: false - default: 5037 - type: integer -get_sources: - description: Whether or not to retrieve the running apps as the list of sources. - required: false - default: true - type: boolean -apps: - description: A dictionary where the keys are app IDs and the values are app names that will be displayed in the UI; see example below. If a name is not provided, the app will never be shown in the sources list. ([These app names](https://github.com/JeffLIrion/python-androidtv/blob/748d6b71cad611c624ef7526d9928431167531a3/androidtv/constants.py#L290-L308) are configured in the backend package and do not need to be included in your configuration.) - required: false - default: {} - type: map -exclude_unnamed_apps: - description: If this is true, then only the apps you specify in the `apps` configuration parameter and [those specified in the backend library](https://github.com/JeffLIrion/python-androidtv/blob/5c39196ade3f88ab453b205fd15b32472d3e0482/androidtv/constants.py#L267-L283) will be shown in the sources list. - required: false - default: false - type: boolean -device_class: - description: "The type of device: `auto` (detect whether it is an Android TV or Fire TV device), `androidtv`, or `firetv`." - required: false - default: auto - type: string -state_detection_rules: - description: A dictionary whose keys are app IDs and whose values are lists of state detection rules; see the section [Custom State Detection](#custom-state-detection) for more info. - required: false - default: {} - type: map -turn_on_command: - description: An ADB shell command that will override the default `turn_on` command. - required: false - type: string -turn_off_command: - description: An ADB shell command that will override the default `turn_off` command. - required: false - type: string -screencap: - description: Determines if album art should be pulled from what is shown onscreen. - required: false - default: true - type: boolean -{% endconfiguration %} - -### Full Configuration - -```yaml -# Example configuration.yaml entry -media_player: - # Use the Python ADB implementation with a user-provided key to setup an - # Android TV device. Provide some app names and don't display other apps - # in the sources menu. Override the default turn on/off commands, and - # provide custom state detection rules. - - platform: androidtv - name: Android TV - device_class: androidtv - host: 192.168.0.222 - adbkey: "/config/android/adbkey" - exclude_unnamed_apps: true - apps: - com.amazon.tv.launcher: "Fire TV" - some.background.app: # this will never show up in the sources list - another.background.app: "" # this will also never show up in the sources list - turn_on_command: "input keyevent 3" - turn_off_command: "input keyevent 223" - state_detection_rules: - 'com.amazon.tv.launcher': - - 'standby' - 'com.netflix.ninja': - - 'media_session_state' - 'com.ellation.vrv': - - 'audio_state' - 'com.plexapp.android': - - 'paused': - 'media_session_state': 3 # this indentation is important! - 'wake_lock_size': 1 # this indentation is important! - - 'playing': - 'media_session_state': 3 # this indentation is important! - - 'standby' - 'com.amazon.avod': - - 'playing': - 'wake_lock_size': 4 # this indentation is important! - - 'playing': - 'wake_lock_size': 3 # this indentation is important! - - 'paused': - 'wake_lock_size': 2 # this indentation is important! - - 'paused': - 'wake_lock_size': 1 # this indentation is important! - - 'standby' - - # Use an ADB server to setup a Fire TV device and don't get the running apps. - - platform: androidtv - name: Fire TV - device_class: firetv - host: 192.168.0.222 - adb_server_ip: 127.0.0.1 - adb_server_port: 5037 - get_sources: false -``` +{% include integrations/option_flow.md %} +{% configuration_basic %} +Configure Applications List: + description: Here you can define applications that are not automatically detected by the backend library, where the keys are app IDs and the values are app names that will be displayed in the UI. If a name is not provided and the option `Exclude apps with unknown name` is enabled, the app will never be shown in the sources list. +Retrieve the running apps as the list of sources: + description: "Whether or not to retrieve the running apps as the list of sources. If this option is checked, the running apps will be retrieved and used as the sources. If not, there will be only one source: the current app." +Exclude apps with unknown name: + description: "Exclude app with unknown name from the source list. If this option is checked, then only apps configured in `Configured Application List` option will be listed among the sources." +Use screen capture for album art: + description: "Determines if album art should be pulled from what is shown on screen." +ADB shell turn off command: + description: "ADB shell command to override default turn off command. Leave empty to use default." +ADB shell turn on command: + description: "ADB shell command to override default turn on command. Leave empty to use default." +Configure State Detection Rules: + description: Here you can configure a list of rules where the rule key is the app IDs and whose values are lists of state detection rules. As example a valid value for a detection rule is `["standby", {"playing":{"media_session_state":4}}, {"paused":{"media_session_state":3, "wake_lock_size":4}}]`. Note that rule values must be always inside square bracket (`[...]`). See the section [Custom State Detection](#custom-state-detection) for more info. +{% endconfiguration_basic %} ## ADB Setup This integration works by sending ADB commands to your Android TV / Fire TV device. There are two ways to accomplish this.
+ When connecting to your device for the first time, a dialog will appear on your Android TV / Fire TV asking you to approve the connection. Check the box that says "always allow connections from this device" and hit OK. +
### 1. Python ADB Implementation -The default approach is to connect to your device using the `adb-shell` Python package. As of Home Assistant 0.101, if a key is needed for authentication and it is not provided by the `adbkey` configuration option, then Home Assistant will generate a key for you. +The default approach is to connect to your device using the `adb-shell` Python package. As of Home Assistant 0.101, if a key is needed for authentication and it is not provided by the `ADB Key` setup option, then Home Assistant will generate a key for you. + +
+ +To be able to provide `ADB Key` on integration setup, you need to enable [advanced mode](/blog/2019/07/17/release-96/#advanced-mode). + +
Prior to Home Assistant 0.101, this approach did not work well for newer devices. Efforts have been made to resolve these issues, but if you experience problems then you should use the ADB server option. @@ -187,6 +82,12 @@ Prior to Home Assistant 0.101, this approach did not work well for newer devices The second option is to use an ADB server to connect to your Android TV and Fire TV devices. +
+ +To configure ADB server on integration setup, you need to enable [advanced mode](/blog/2019/07/17/release-96/#advanced-mode). + +
+ Using this approach, Home Assistant will send the ADB commands to the server, which will then send them to the Android TV / Fire TV device and report back to Home Assistant. To use this option, add the `adb_server_ip` option to your configuration. If you are running the server on the same machine as Home Assistant, you can use `127.0.0.1` for this value. ## ADB Troubleshooting @@ -264,7 +165,7 @@ Available key commands include: - `BACK` - `MENU` -The full list of key commands can be found [here](https://github.com/JeffLIrion/python-androidtv/blob/748d6b71cad611c624ef7526d9928431167531a3/androidtv/constants.py#L189-L233). +The full list of key commands can be found in the backend [androidtv](https://github.com/JeffLIrion/python-androidtv) package. You can also use the command `GET_PROPERTIES` to retrieve the properties used by Home Assistant to update the device's state. These will be stored in the media player's `'adb_response'` attribute and logged at the INFO level. This information can be used to help improve state detection in the backend [androidtv](https://github.com/JeffLIrion/python-androidtv) package, and also to define your own [custom state detection](#custom-state-detection) rules. From 7dbd4467f8a7d984a254214277d867f880a7bc23 Mon Sep 17 00:00:00 2001 From: Raman Gupta <7243222+raman325@users.noreply.github.com> Date: Mon, 3 Jan 2022 04:57:59 -0500 Subject: [PATCH 072/247] Add documentation for template.button platform (#20717) --- source/_integrations/template.markdown | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/source/_integrations/template.markdown b/source/_integrations/template.markdown index cbfe805edd0..b192e36fccc 100644 --- a/source/_integrations/template.markdown +++ b/source/_integrations/template.markdown @@ -15,6 +15,7 @@ ha_domain: template ha_platforms: - alarm_control_panel - binary_sensor + - button - cover - fan - light @@ -29,7 +30,7 @@ ha_platforms: The `template` integration allows creating entities which derive their values from other data. This is done by specifying [templates](/docs/configuration/templating/) for properties of an entity, like the name or the state. -Sensors, binary (on/off) sensors, numbers and selects are covered on this page. For other types, please see the specific pages: +Sensors, binary (on/off) sensors, buttons, numbers and selects are covered on this page. For other types, please see the specific pages: - [Alarm Control Panel](/integrations/alarm_control_panel.template/) - [Cover](/integrations/cover.template/) @@ -40,7 +41,7 @@ Sensors, binary (on/off) sensors, numbers and selects are covered on this page. - [Vacuum](/integrations/vacuum.template/) - [Weather](/integrations/weather.template/) -Sensor, binary sensor, number and select template entities are defined in your YAML configuration files, directly under the `template:` key and cannot be configured via the UI. You can define multiple configuration blocks as a list. Each block defines sensor/binary sensor/number/select entities and can contain an optional update trigger. +Sensor, binary sensor, button, number and select template entities are defined in your YAML configuration files, directly under the `template:` key and cannot be configured via the UI. You can define multiple configuration blocks as a list. Each block defines sensor/binary sensor/number/select entities and can contain an optional update trigger. _For old sensor/binary sensor configuration format, [see below](#legacy-binary-sensor-configuration-format)._ @@ -218,8 +219,17 @@ select: required: false type: boolean default: false -"[all sensor, binary sensor, number, select entities]": - description: Fields that can be used above for sensors, binary sensors, numbers, and selects. +button: + description: List of buttons + required: true + type: map + keys: + press: + description: Defines actions to run to press the button. + required: true + type: action +"[all sensor, binary sensor, button, number, select entities]": + description: Fields that can be used above for sensors, binary sensors, buttons, numbers, and selects. required: false type: map keys: From 25e18524ffec105690dbe7e63944030bcad63d41 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Mon, 3 Jan 2022 11:28:20 +0100 Subject: [PATCH 073/247] Deprecate Bosch BME280 Environmental Sensor (ADR-0019) (#20911) --- source/_integrations/bme280.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_integrations/bme280.markdown b/source/_integrations/bme280.markdown index 06c31687839..8cb43deab83 100644 --- a/source/_integrations/bme280.markdown +++ b/source/_integrations/bme280.markdown @@ -10,6 +10,14 @@ ha_platforms: - sensor --- +
+ +This integration is deprecated and will be removed in Home Assistant Core 2022.4. + +For more information see: [Architectural Decision Record 0019](https://github.com/home-assistant/architecture/blob/master/adr/0019-GPIO.md). + +
+ The Bosch BME280 integration allows you to read temperature, humidity and pressure values of a [Bosch BME280 Environmental sensor](https://cdn-shop.adafruit.com/datasheets/BST-BME280_DS001-10.pdf) connected via [I2c](https://en.wikipedia.org/wiki/I²C) bus (SDA, SCL pins) or connected via SPI. It allows you to use all the operation modes of the sensor described in its datasheet. ## Configuration From c1553559f0cce668232641c4efb3518008ad604b Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Mon, 3 Jan 2022 11:28:43 +0100 Subject: [PATCH 074/247] Add configuration flow to CPU Speed (#20910) --- source/_integrations/cpuspeed.markdown | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/source/_integrations/cpuspeed.markdown b/source/_integrations/cpuspeed.markdown index 35a70bd8563..edc2f6a3bc7 100644 --- a/source/_integrations/cpuspeed.markdown +++ b/source/_integrations/cpuspeed.markdown @@ -9,11 +9,12 @@ ha_iot_class: Local Push ha_codeowners: - '@fabaff' ha_domain: cpuspeed +ha_config_flow: true ha_platforms: - sensor --- -The `cpuspeed` sensor platform to allow you to monitor the current CPU speed. +The CPU Speed integration allows you to monitor the current CPU speed.
@@ -21,20 +22,4 @@ The `cpuspeed` sensor platform to allow you to monitor the current CPU speed.
-## Configuration - -To add this platform to your installation, add the following to your `configuration.yaml` file: - -```yaml -# Example configuration.yaml entry -sensor: - - platform: cpuspeed -``` - -{% configuration %} -name: - description: Name to use in the frontend. - required: false - type: string - default: CPU speed -{% endconfiguration %} +{% include integrations/config_flow.md %} From f73d44b3317a2ee95433d587e86b27729f92076e Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Mon, 3 Jan 2022 11:35:26 +0100 Subject: [PATCH 075/247] Rename Luftdaten -> Sensor.Community (#20887) --- source/_integrations/luftdaten.markdown | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/_integrations/luftdaten.markdown b/source/_integrations/luftdaten.markdown index b0fba15dc0a..465d6aa2cae 100644 --- a/source/_integrations/luftdaten.markdown +++ b/source/_integrations/luftdaten.markdown @@ -1,6 +1,6 @@ --- -title: Luftdaten -description: Instructions on how to setup Luftdaten sensors in Home Assistant. +title: Sensor.Community +description: Instructions on how to add Sensor.Community sensors to Home Assistant. ha_category: - Health - Sensor @@ -15,11 +15,11 @@ ha_platforms: - sensor --- -The `luftdaten` integration will query the open data API of [luftdaten.info](https://luftdaten.info/) to monitor air quality and other weather data from a specific (self build) sensor station. +The Sensor.Communtiy integration will query the open data API of [Sensor.Community](https://sensor.community) to monitor air quality and other weather data from a specific (self build) sensor station. ## Prerequisites -- To get the ID of a particle sensor you need to select it on the [Feinstaub map](https://deutschland.maps.luftdaten.info/) and find it in the sidebar (Column "Sensor ID"). -- To get the ID of a temperature/humidity sensor you need to find it on the map hosted on [Madavi](https://www.madavi.de/sensor/feinstaub-map-dht/). +To get the ID of a particle, pressure, noise, temperature, or humidity sensor by selecting it on the [Sensor.Community map](https://maps.sensor.community/). +After selecting the sensor, it will show the needed ID in the sidebar with a `#` in front of it. {% include integrations/config_flow.md %} From dd2d933406791d8469333fbff03bff7605570750 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Mon, 3 Jan 2022 11:36:51 +0100 Subject: [PATCH 076/247] Add input_button (#20764) --- source/_integrations/input_button.markdown | 88 ++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 source/_integrations/input_button.markdown diff --git a/source/_integrations/input_button.markdown b/source/_integrations/input_button.markdown new file mode 100644 index 00000000000..1a747b6da56 --- /dev/null +++ b/source/_integrations/input_button.markdown @@ -0,0 +1,88 @@ +--- +title: Input Button +description: Instructions on how to use the Input Button helper with Home Assistant. +ha_category: + - Automation +ha_release: 2022.2 +ha_quality_scale: internal +ha_codeowners: + - '@home-assistant/core' +ha_domain: input_button +--- + +The Input Button helper integration allows you to define buttons that +can be pressed via the user interface, and can be used to trigger things, +like an automation. + +## Configuration + +The preferred way to configure button helpers is via the user interface. +To add one, go to **{% my helpers title="Configuration -> Helpers" %}** +and click the add button; next choose the "**Button**" option. + +To be able to add **Helpers** via the user interface you should have +`default_config:` in your `configuration.yaml`, it should already be there by +default unless you removed it. If you removed `default_config:` from your +configuration, you must add `input_button:` to your `configuration.yaml` first, +then you can use the UI. + +Input buttons can also be configured via `configuration.yaml`: + +```yaml +# Example configuration.yaml entry +input_button: + ring_bell: + name: Ring bell + icon: mdi:bell +``` + +{% configuration %} +input_button: + description: Alias for the input. Multiple entries are allowed. + required: true + type: map + keys: + name: + description: Friendly name of the input. + required: false + type: string + icon: + description: Icon to display in front of the input element in the frontend. + required: false + type: icon +{% endconfiguration %} + +## Automation Examples + +The `input_button` entity is stateless, as in, it cannot have a state like the +`on` or `off` state that, for example, a normal switch entity has. + +Every input button entity does keep track of the timestamp of when the last time +the input button entity has been pressed in the Home Assistant UI or pressed via +a service call. + +Because the state of a input button entity in Home Assistant is a timestamp, it +means we can use it in our automations. For example: + +```yaml +trigger: + - platform: state + entity_id: button.my_button +action: + - service: notify.frenck + data: + message: "My button has been pressed!" +``` + +## Services + +The input button entities exposes a single service: +{% my developer_call_service service="input_button.press" %} + +This service can be called to trigger a button press for that entity. + +```yaml +- service: input_button.press + target: + entity_id: input_button.my_button +``` From 15fe2e699989c4ebde5b1496abf965e5013ef836 Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Mon, 3 Jan 2022 05:22:43 -0600 Subject: [PATCH 077/247] Update roku for binary_sensor platform (#20991) --- source/_integrations/roku.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_integrations/roku.markdown b/source/_integrations/roku.markdown index 789a297c2aa..a7194c80bec 100644 --- a/source/_integrations/roku.markdown +++ b/source/_integrations/roku.markdown @@ -3,6 +3,7 @@ title: Roku description: Instructions how to integrate Roku devices into Home Assistant. ha_category: - Hub + - Binary Sensor - Media Player - Remote ha_iot_class: Local Polling @@ -15,6 +16,7 @@ ha_codeowners: ha_ssdp: true ha_homekit: true ha_platforms: + - binary_sensor - media_player - remote --- From 48e7e709e056935edf4c8c1a6c3e107985e1e0be Mon Sep 17 00:00:00 2001 From: Gabriel Rauter Date: Mon, 3 Jan 2022 15:10:18 +0100 Subject: [PATCH 078/247] Add unique_id configuration variable to command_line integration (#20031) --- source/_integrations/command_line.markdown | 4 ++++ source/_integrations/cover.command_line.markdown | 4 ++++ source/_integrations/sensor.command_line.markdown | 4 ++++ source/_integrations/switch.command_line.markdown | 4 ++++ 4 files changed, 16 insertions(+) diff --git a/source/_integrations/command_line.markdown b/source/_integrations/command_line.markdown index fb2485ba441..d8a5ebf4a8e 100644 --- a/source/_integrations/command_line.markdown +++ b/source/_integrations/command_line.markdown @@ -72,6 +72,10 @@ command_timeout: required: false type: integer default: 15 +unique_id: + description: An ID that uniquely identifies this binary sensor. Set this to a unique value to allow customization through the UI. + required: false + type: string {% endconfiguration %} ## Execution diff --git a/source/_integrations/cover.command_line.markdown b/source/_integrations/cover.command_line.markdown index c6e2f5c9229..d5210523a2b 100644 --- a/source/_integrations/cover.command_line.markdown +++ b/source/_integrations/cover.command_line.markdown @@ -67,6 +67,10 @@ covers: required: false type: integer default: 15 + unique_id: + description: An ID that uniquely identifies this cover. Set this to a unique value to allow customization through the UI. + required: false + type: string {% endconfiguration %} ## Examples diff --git a/source/_integrations/sensor.command_line.markdown b/source/_integrations/sensor.command_line.markdown index c15e824401b..011c5b4446d 100644 --- a/source/_integrations/sensor.command_line.markdown +++ b/source/_integrations/sensor.command_line.markdown @@ -54,6 +54,10 @@ json_attributes: description: Defines a list of keys to extract values from a JSON dictionary result and then set as sensor attributes. required: false type: [string, list] +unique_id: + description: An ID that uniquely identifies this sensor. Set this to a unique value to allow customization through the UI. + required: false + type: string {% endconfiguration %} ## Execution diff --git a/source/_integrations/switch.command_line.markdown b/source/_integrations/switch.command_line.markdown index c50ae9d6cf8..7c22c201571 100644 --- a/source/_integrations/switch.command_line.markdown +++ b/source/_integrations/switch.command_line.markdown @@ -65,6 +65,10 @@ switches: required: false type: integer default: 15 + unique_id: + description: An ID that uniquely identifies this switch. Set this to a unique value to allow customization through the UI. + required: false + type: string {% endconfiguration %} A note on `friendly_name`: From 6c390b7a1d2726a2d048898be5adca28bf5bc7f1 Mon Sep 17 00:00:00 2001 From: Jan Bouwhuis Date: Mon, 3 Jan 2022 19:37:10 +0100 Subject: [PATCH 079/247] Add Mqtt encoding parameter (#20745) --- .../alarm_control_panel.mqtt.markdown | 5 +++++ source/_integrations/binary_sensor.mqtt.markdown | 2 +- source/_integrations/button.mqtt.markdown | 5 +++++ source/_integrations/climate.mqtt.markdown | 5 +++++ source/_integrations/cover.mqtt.markdown | 5 +++++ source/_integrations/fan.mqtt.markdown | 5 +++++ source/_integrations/humidifier.mqtt.markdown | 5 +++++ source/_integrations/light.mqtt.markdown | 15 +++++++++++++++ source/_integrations/lock.mqtt.markdown | 5 +++++ source/_integrations/number.mqtt.markdown | 5 +++++ source/_integrations/select.mqtt.markdown | 5 +++++ source/_integrations/sensor.mqtt.markdown | 2 +- source/_integrations/switch.mqtt.markdown | 5 +++++ source/_integrations/vacuum.mqtt.markdown | 10 ++++++++++ 14 files changed, 77 insertions(+), 2 deletions(-) diff --git a/source/_integrations/alarm_control_panel.mqtt.markdown b/source/_integrations/alarm_control_panel.mqtt.markdown index f8e40c0512c..5b5c540f6d3 100644 --- a/source/_integrations/alarm_control_panel.mqtt.markdown +++ b/source/_integrations/alarm_control_panel.mqtt.markdown @@ -148,6 +148,11 @@ enabled_by_default: required: false type: boolean default: true +encoding: + description: The encoding of the payloads received and published messages. Set to `""` to disable decoding of incoming payload. + required: false + type: string + default: "utf-8" entity_category: description: The [category](https://developers.home-assistant.io/docs/core/entity#generic-properties) of the entity. required: false diff --git a/source/_integrations/binary_sensor.mqtt.markdown b/source/_integrations/binary_sensor.mqtt.markdown index cc93b6e9bf7..ef9b3d92de8 100644 --- a/source/_integrations/binary_sensor.mqtt.markdown +++ b/source/_integrations/binary_sensor.mqtt.markdown @@ -118,7 +118,7 @@ enabled_by_default: type: boolean default: true encoding: - description: The encoding of the payload received at `state_topic` and availability topics `availability_topic` and `topic`. Set to `""` to disable decoding. + description: The encoding of the payloads received. Set to `""` to disable decoding of incoming payload. required: false type: string default: "utf-8" diff --git a/source/_integrations/button.mqtt.markdown b/source/_integrations/button.mqtt.markdown index 19c78d42d3c..cbbd310639b 100644 --- a/source/_integrations/button.mqtt.markdown +++ b/source/_integrations/button.mqtt.markdown @@ -111,6 +111,11 @@ enabled_by_default: required: false type: boolean default: true +encoding: + description: The encoding of the published messages. + required: false + type: string + default: "utf-8" entity_category: description: The [category](https://developers.home-assistant.io/docs/core/entity#generic-properties) of the entity. required: false diff --git a/source/_integrations/climate.mqtt.markdown b/source/_integrations/climate.mqtt.markdown index 3b91b5d74d1..e33f0027eab 100644 --- a/source/_integrations/climate.mqtt.markdown +++ b/source/_integrations/climate.mqtt.markdown @@ -145,6 +145,11 @@ enabled_by_default: required: false type: boolean default: true +encoding: + description: The encoding of the payloads received and published messages. Set to `""` to disable decoding of incoming payload. + required: false + type: string + default: "utf-8" entity_category: description: The [category](https://developers.home-assistant.io/docs/core/entity#generic-properties) of the entity. required: false diff --git a/source/_integrations/cover.mqtt.markdown b/source/_integrations/cover.mqtt.markdown index a3af3c3cb1d..44aea9c2595 100644 --- a/source/_integrations/cover.mqtt.markdown +++ b/source/_integrations/cover.mqtt.markdown @@ -127,6 +127,11 @@ enabled_by_default: required: false type: boolean default: true +encoding: + description: The encoding of the payloads received and published messages. Set to `""` to disable decoding of incoming payload. + required: false + type: string + default: "utf-8" entity_category: description: The [category](https://developers.home-assistant.io/docs/core/entity#generic-properties) of the entity. required: false diff --git a/source/_integrations/fan.mqtt.markdown b/source/_integrations/fan.mqtt.markdown index f3ddca991f9..3a1ae169fb1 100644 --- a/source/_integrations/fan.mqtt.markdown +++ b/source/_integrations/fan.mqtt.markdown @@ -118,6 +118,11 @@ enabled_by_default: required: false type: boolean default: true +encoding: + description: The encoding of the payloads received and published messages. Set to `""` to disable decoding of incoming payload. + required: false + type: string + default: "utf-8" entity_category: description: The [category](https://developers.home-assistant.io/docs/core/entity#generic-properties) of the entity. required: false diff --git a/source/_integrations/humidifier.mqtt.markdown b/source/_integrations/humidifier.mqtt.markdown index ea6b7a86be8..59d780546cb 100644 --- a/source/_integrations/humidifier.mqtt.markdown +++ b/source/_integrations/humidifier.mqtt.markdown @@ -124,6 +124,11 @@ enabled_by_default: required: false type: boolean default: true +encoding: + description: The encoding of the payloads received and published messages. Set to `""` to disable decoding of incoming payload. + required: false + type: string + default: "utf-8" entity_category: description: The [category](https://developers.home-assistant.io/docs/core/entity#generic-properties) of the entity. required: false diff --git a/source/_integrations/light.mqtt.markdown b/source/_integrations/light.mqtt.markdown index cb9d7bf8774..99d3b5dd68f 100644 --- a/source/_integrations/light.mqtt.markdown +++ b/source/_integrations/light.mqtt.markdown @@ -177,6 +177,11 @@ enabled_by_default: required: false type: boolean default: true +encoding: + description: The encoding of the payloads received and published messages. Set to `""` to disable decoding of incoming payload. + required: false + type: string + default: "utf-8" entity_category: description: The [category](https://developers.home-assistant.io/docs/core/entity#generic-properties) of the entity. required: false @@ -559,6 +564,11 @@ enabled_by_default: required: false type: boolean default: true +encoding: + description: The encoding of the payloads received and published messages. Set to `""` to disable decoding of incoming payload. + required: false + type: string + default: "utf-8" entity_category: description: The [category](https://developers.home-assistant.io/docs/core/entity#generic-properties) of the entity. required: false @@ -918,6 +928,11 @@ enabled_by_default: required: false type: boolean default: true +encoding: + description: The encoding of the payloads received and published messages. Set to `""` to disable decoding of incoming payload. + required: false + type: string + default: "utf-8" entity_category: description: The [category](https://developers.home-assistant.io/docs/core/entity#generic-properties) of the entity. required: false diff --git a/source/_integrations/lock.mqtt.markdown b/source/_integrations/lock.mqtt.markdown index 7a56dfc4f20..8e8e1ab6639 100644 --- a/source/_integrations/lock.mqtt.markdown +++ b/source/_integrations/lock.mqtt.markdown @@ -116,6 +116,11 @@ enabled_by_default: required: false type: boolean default: true +encoding: + description: The encoding of the payloads received and published messages. Set to `""` to disable decoding of incoming payload. + required: false + type: string + default: "utf-8" entity_category: description: The [category](https://developers.home-assistant.io/docs/core/entity#generic-properties) of the entity. required: false diff --git a/source/_integrations/number.mqtt.markdown b/source/_integrations/number.mqtt.markdown index 776cdf4b43d..26ba4e7db6c 100644 --- a/source/_integrations/number.mqtt.markdown +++ b/source/_integrations/number.mqtt.markdown @@ -104,6 +104,11 @@ enabled_by_default: required: false type: boolean default: true +encoding: + description: The encoding of the payloads received and published messages. Set to `""` to disable decoding of incoming payload. + required: false + type: string + default: "utf-8" entity_category: description: The [category](https://developers.home-assistant.io/docs/core/entity#generic-properties) of the entity. required: false diff --git a/source/_integrations/select.mqtt.markdown b/source/_integrations/select.mqtt.markdown index 3a0b5808f0f..cdc9e634860 100644 --- a/source/_integrations/select.mqtt.markdown +++ b/source/_integrations/select.mqtt.markdown @@ -116,6 +116,11 @@ enabled_by_default: required: false type: boolean default: true +encoding: + description: The encoding of the payloads received and published messages. Set to `""` to disable decoding of incoming payload. + required: false + type: string + default: "utf-8" entity_category: description: The [category](https://developers.home-assistant.io/docs/core/entity#generic-properties) of the entity. required: false diff --git a/source/_integrations/sensor.mqtt.markdown b/source/_integrations/sensor.mqtt.markdown index 305bd6bdd42..c529e87481d 100644 --- a/source/_integrations/sensor.mqtt.markdown +++ b/source/_integrations/sensor.mqtt.markdown @@ -110,7 +110,7 @@ enabled_by_default: type: boolean default: true encoding: - description: The encoding of the payload received at `state_topic` and availability topics `availability_topic` and `topic`. Set to `""` to disable decoding. + description: The encoding of the payloads received. Set to `""` to disable decoding of incoming payload. required: false type: string default: "utf-8" diff --git a/source/_integrations/switch.mqtt.markdown b/source/_integrations/switch.mqtt.markdown index 36a380f6c88..3c401acbeac 100644 --- a/source/_integrations/switch.mqtt.markdown +++ b/source/_integrations/switch.mqtt.markdown @@ -119,6 +119,11 @@ enabled_by_default: required: false type: boolean default: true +encoding: + description: The encoding of the payloads received and published messages. Set to `""` to disable decoding of incoming payload. + required: false + type: string + default: "utf-8" entity_category: description: The [category](https://developers.home-assistant.io/docs/core/entity#generic-properties) of the entity. required: false diff --git a/source/_integrations/vacuum.mqtt.markdown b/source/_integrations/vacuum.mqtt.markdown index ba2c27095c6..84f52d242e6 100644 --- a/source/_integrations/vacuum.mqtt.markdown +++ b/source/_integrations/vacuum.mqtt.markdown @@ -106,6 +106,11 @@ enabled_by_default: required: false type: boolean default: true +encoding: + description: The encoding of the payloads received and published messages. Set to `""` to disable decoding of incoming payload. + required: false + type: string + default: "utf-8" entity_category: description: The [category](https://developers.home-assistant.io/docs/core/entity#generic-properties) of the entity. required: false @@ -398,6 +403,11 @@ device: description: 'Identifier of a device that routes messages between this device and Home Assistant. Examples of such devices are hubs, or parent devices of a sub-device. This is used to show device topology in Home Assistant.' required: false type: string +encoding: + description: The encoding of the payloads received and published messages. Set to `""` to disable decoding of incoming payload. + required: false + type: string + default: "utf-8" fan_speed_list: description: List of possible fan speeds for the vacuum. required: false From 06e8d3e8991e3611c1fabd0eb5658d3bf7fd57cf Mon Sep 17 00:00:00 2001 From: Christopher Bailey Date: Mon, 3 Jan 2022 18:42:58 -0500 Subject: [PATCH 080/247] Add UniFi Protect select platform (#21007) Co-authored-by: J. Nick Koston --- source/_integrations/unifiprotect.markdown | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/source/_integrations/unifiprotect.markdown b/source/_integrations/unifiprotect.markdown index 41fe3c640ac..51ef9f93f26 100644 --- a/source/_integrations/unifiprotect.markdown +++ b/source/_integrations/unifiprotect.markdown @@ -8,6 +8,7 @@ ha_category: - Light - Media Player - Number + - Select - Switch ha_release: 2022.2 ha_iot_class: Local Push @@ -24,6 +25,7 @@ ha_platforms: - light - media_player - number + - select - switch --- @@ -136,6 +138,7 @@ Each UniFi Protect smart sensor will get the following entities added: Each UniFi Protect viewport will get the following entities added: +* **Liveview Select** - A select control will be added for each viewport device that will allow you to select which liveview is being displayed on the viewport. * **Button** - A disabled by default button entity is added for each viewport device. The button will let you reboot your viewport device. * **Switch** - A disabled by default switch entity will be added to let you toggle on and off SSH for your viewport. Username is `ubnt` and password is your Device Password as configured in UniFi Protect. @@ -161,3 +164,7 @@ The default settings on the stream integration will give you a 5-15+ second dela ### Cannot Play Audio to Speakers Unlike with many other things, playing audio to your speakers requires your Home Assistant to be able to reach your camera directly. Specifically via port `tcp/7004`. You can [enable debug logging](#enabling-debug-logging) and it will output the full FFmpeg command that will be run and the output from FFmpeg to help you troubleshoot why audio is not playing to the device. + +### Liveview Options for Viewport Missing Options or Out of Date + +Main control selects currently cannot have dynamic options since the options are exported out to voice assistants. After you add/remove/change a Liveview in UniFi Protect, you must restart Home Assistant to get the new options for your Viewport. From 906b9af95cc06379898bf5062a8661dcb0b9e80d Mon Sep 17 00:00:00 2001 From: avee87 <6134677+avee87@users.noreply.github.com> Date: Tue, 4 Jan 2022 10:01:20 +0000 Subject: [PATCH 081/247] Update template min/max/average documentation (#20448) --- source/_docs/configuration/templating.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/_docs/configuration/templating.markdown b/source/_docs/configuration/templating.markdown index bf6e046639b..0f0f6b3a080 100644 --- a/source/_docs/configuration/templating.markdown +++ b/source/_docs/configuration/templating.markdown @@ -614,6 +614,9 @@ The numeric functions and filters will not fail if the input is not a valid numb - `atan(value, default)` will return the arcus tangent of the input. If `value` can't be converted to a `float`, returns the `default` value, or if omitted `value`. Can be used as a filter. - `atan2(y, x, default)` will return the four quadrant arcus tangent of y / x. If `y` or `x` can't be converted to a `float`, returns the `default` value, or if omitted `value`. Can be used as a filter. - `sqrt(value, default)` will return the square root of the input. If `value` can't be converted to a `float`, returns the `default` value, or if omitted `value`. Can be used as a filter. +- `max([x, y, ...])` will obtain the largest item in a sequence. Uses the same parameters as the built-in [max](https://jinja.palletsprojects.com/en/latest/templates/#jinja-filters.max) filter. +- `min([x, y, ...])` will obtain the smallest item in a sequence. Uses the same parameters as the built-in [min](https://jinja.palletsprojects.com/en/latest/templates/#jinja-filters.min) filter. +- `average([x, y, ...])` will return the average value of the sequence. Can be used as a filter. - `e` mathematical constant, approximately 2.71828. - `pi` mathematical constant, approximately 3.14159. - `tau` mathematical constant, approximately 6.28318. @@ -621,9 +624,6 @@ The numeric functions and filters will not fail if the input is not a valid numb - `round(precision, "floor", default)` will always round down to `precision` decimals - `round(precision, "ceil", default)` will always round up to `precision` decimals - `round(1, "half", default)` will always round to the nearest .5 value. `precision` should be 1 for this mode -- Filter `[x, y, ...] | max` will obtain the largest item in a sequence. -- Filter `[x, y, ...] | min` will obtain the smallest item in a sequence. -- Filter `[x, y, ...] | average` will return the average value of the sequence. - Filter `value_one|bitwise_and(value_two)` perform a bitwise and(&) operation with two values. - Filter `value_one|bitwise_or(value_two)` perform a bitwise or(\|) operation with two values. - Filter `ord` will return for a string of length one an integer representing the Unicode code point of the character when the argument is a Unicode object, or the value of the byte when the argument is an 8-bit string. From 0019b2d681e32e64db1b4df2614b43e756529ca3 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Tue, 4 Jan 2022 12:44:00 +0100 Subject: [PATCH 082/247] Update group documentation for lock (#21011) --- source/_integrations/group.markdown | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/source/_integrations/group.markdown b/source/_integrations/group.markdown index 32fb1b35f4c..f7a5847aa89 100644 --- a/source/_integrations/group.markdown +++ b/source/_integrations/group.markdown @@ -89,13 +89,13 @@ The system can calculate group state with entities from the following domains: When entities all have a single on and off state, the group state will be calculated as follows: -| Domain | on | off | -|-------------------|--------|----------| -| device_tracker | home | not_home | -| cover | open | closed | -| lock | locked | unlocked | -| person | home | not_home | -| media_player | ok | problem | +| Domain | on | off | +|-------------------|----------|----------| +| device_tracker | home | not_home | +| cover | open | closed | +| lock | unlocked | locked | +| person | home | not_home | +| media_player | ok | problem | When a group contains entities from domains that have multiple `on` states or only use `on` and `off`, the group state will be `on` or `off`. From a1a84832bbbc34d62ca0b23687e98e6979d8238c Mon Sep 17 00:00:00 2001 From: "David F. Mulcahey" Date: Tue, 4 Jan 2022 07:40:46 -0500 Subject: [PATCH 083/247] Add Select to ZHA (#20867) --- source/_integrations/zha.markdown | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/_integrations/zha.markdown b/source/_integrations/zha.markdown index 7911c2c2cce..8c14b2c5b0f 100644 --- a/source/_integrations/zha.markdown +++ b/source/_integrations/zha.markdown @@ -10,6 +10,7 @@ ha_category: - Fan - Light - Lock + - Select - Sensor - Siren - Switch @@ -34,6 +35,7 @@ ha_platforms: - light - lock - number + - select - sensor - siren - switch @@ -55,6 +57,7 @@ There is currently support for the following device types within Home Assistant: - Light - Lock - Number (i.e. analog output) +- Select - Sensor - Siren - Switch From da8d0af6ec8a9c2e3d292fb6f2e0c627c1ac0a57 Mon Sep 17 00:00:00 2001 From: Hmmbob <33529490+hmmbob@users.noreply.github.com> Date: Tue, 4 Jan 2022 18:41:40 +0100 Subject: [PATCH 084/247] Add Picnic last_order_max_order_time sensor docs (#20973) --- source/_integrations/picnic.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_integrations/picnic.markdown b/source/_integrations/picnic.markdown index d92f9a9f90a..e5f55017d29 100644 --- a/source/_integrations/picnic.markdown +++ b/source/_integrations/picnic.markdown @@ -34,5 +34,6 @@ This integration provides the following sensors. Some sensors are disabled by de | Last order status | Status of the last order, either `CURRENT`, `CANCELLED` or `COMPLETED`. Will only transition to `COMPLETED` after the invoice email has been sent. | | Last order ETA start | Start of the ETA window of the last order, will get more precise if the driver is underway. | | Last order ETA end | End of the ETA window of the last order. | +| Last order max order time | Maximum time it is/was still possible to add products to the last order. | Last order delivery time | The delivery time of the last order, `unavailable` if not yet delivered. | | Last order total price | The total price of the last order. | From 8d8778296fa2426ca8fe2ba66348c8ef9957f19b Mon Sep 17 00:00:00 2001 From: jjlawren Date: Tue, 4 Jan 2022 11:45:50 -0600 Subject: [PATCH 085/247] Add notes on Sonos mic sensor, descriptions of additional entities (#20976) --- source/_integrations/sonos.markdown | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/source/_integrations/sonos.markdown b/source/_integrations/sonos.markdown index 0c8bbd16c7e..2a1f1b47696 100644 --- a/source/_integrations/sonos.markdown +++ b/source/_integrations/sonos.markdown @@ -28,13 +28,21 @@ The `sonos` integration allows you to control your [Sonos](https://www.sonos.com ## Feature controls & sensors -Speaker-level features are exposed as `number` or `switch` entities which report current values and allow direct control. +Speaker-level controls are exposed as `number` or `switch` entities. Additionally, various `sensor` and `binary_sensor` entities are provided. -- **All devices**: Bass, Treble, Crossfade, Status Light, Touch Controls -- **Home theater devices**: Night Sound, Speech Enhancement, Surround Enabled, Audio Input Format (read-only) +### Controllable features + +- **All devices**: Alarms, Bass, Treble, Crossfade, Status Light, Touch Controls +- **Home theater devices**: Night Sound, Speech Enhancement, Surround Enabled - **When paired with a sub**: Subwoofer Enabled -## Battery support +### Sensors + +- **Devices with battery**: Battery level, Power state +- **Home theater devices**: Audio Input Format +- **Voice-enabled devices**: Microphone Enabled + +### Battery support notes Battery sensors are fully supported for the `Sonos Roam` and `Sonos Move` devices on S2 firmware. `Sonos Move` speakers still on S1 firmware are supported but may update infrequently. @@ -46,10 +54,14 @@ The battery sensors rely on working change events or updates will be delayed. S1 -## Alarm support +### Alarm support notes The Sonos integration adds one `switch` for each alarm set in the Sonos app. The alarm switches are detected, deleted and assigned automatically and come with several attributes that help to monitor Sonos alarms. +### Microphone support notes + +The microphone can only be enabled/disabled from physical buttons on the Sonos device and cannot be controlled from Home Assistant. A `binary_sensor` reports its current state. + ## Playing media Sonos accepts a variety of `media_content_id` formats in the `media_player.play_media` service, but most commonly as URIs. For example, both Spotify and Tidal share links can be provided as-is. Playback of [music hosted on a Plex server](/integrations/plex#sonos-playback) is possible. Direct HTTP/HTTPS links to local or remote media files can also be used if the Sonos device can reach the URI directly, but specific media encoding support may vary. From 5212dd7a83225a63ab3615ae06b9509fe85170bf Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 5 Jan 2022 09:16:32 +0100 Subject: [PATCH 086/247] Remove deprecated Arduino integration (#21022) --- CODEOWNERS | 1 - source/_integrations/arduino.markdown | 154 -------------------------- source/_redirects | 7 +- 3 files changed, 4 insertions(+), 158 deletions(-) delete mode 100644 source/_integrations/arduino.markdown diff --git a/CODEOWNERS b/CODEOWNERS index 439500e0935..2cb7c511164 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -39,7 +39,6 @@ source/_integrations/apple_tv.markdown @postlund source/_integrations/apprise.markdown @caronc source/_integrations/aprs.markdown @PhilRW source/_integrations/arcam_fmj.markdown @elupus -source/_integrations/arduino.markdown @fabaff source/_integrations/arest.markdown @fabaff source/_integrations/arris_tg2492lg.markdown @vanbalken source/_integrations/asuswrt.markdown @kennedyshead @ollo69 diff --git a/source/_integrations/arduino.markdown b/source/_integrations/arduino.markdown deleted file mode 100644 index 64a41bf8688..00000000000 --- a/source/_integrations/arduino.markdown +++ /dev/null @@ -1,154 +0,0 @@ ---- -title: Arduino -description: Instructions on how to setup an Arduino boards within Home Assistant. -ha_category: - - DIY - - Sensor - - Switch -ha_release: pre 0.7 -ha_iot_class: Local Polling -ha_codeowners: - - '@fabaff' -ha_domain: arduino -ha_platforms: - - sensor - - switch ---- - -
- -This integration is deprecated. Please move to the [Firmata integration](/integrations/firmata). - -
- -The [Arduino](https://www.arduino.cc/) device family are microcontroller boards that are often based on the ATmega328 chip. They come with digital input/output pins (some can be used as PWM outputs), analog inputs, and a USB connection. -The equipment depends on the [type](https://www.arduino.cc/en/Main/Products) of the board. The most common ones are the Arduino Uno and the Arduino Leonardo with 14 digital input/output pins and 6 analog input pins. - -There are a lot of extensions (so-called [shields](https://www.arduino.cc/en/Main/ArduinoShields)) available. Those shields can be plugged-in into the existing connectors and stacked on top of each other. This makes it possible to expand the capabilities of the Arduino boards. - -The `arduino` integration is designed to let you use a directly attached board to your Home Assistant host over USB. - -There is currently support for the following device types within Home Assistant: - -- [Sensor](#sensor) -- [Switch](#switch) - -## Configuration - -You need to have the [Firmata firmware](https://github.com/firmata/) on your board. Please upload the `StandardFirmata` sketch to your board; please refer to the [Arduino documentation](https://www.arduino.cc/en/Main/Howto) for further information. - -To integrate an Arduino boards with Home Assistant, add the following section to your `configuration.yaml` file: - -```yaml -# Example configuration.yaml entry -arduino: - port: /dev/ttyACM0 -``` - -{% configuration %} -port: - description: The port where your board is connected to your Home Assistant host. If you are using an original Arduino, the port will be named `ttyACM*` otherwise `ttyUSB*`. - required: true - type: string -{% endconfiguration %} - -The exact number can be determined with the command shown below. - -```bash -ls /dev/ttyACM* -``` - -If that's not working, check your `dmesg` or `journalctl -f` output. Keep in mind that Arduino clones are often using a different name for the port (e.g., `/dev/ttyUSB*`). - -
-A word of caution: The Arduino boards are not storing states. This means that with every initialization the pins are set to off/low. -
- -Add the user who is used to run Home Assistant to the groups to allow access to the serial port. - -```bash -sudo usermod -a -G dialout,lock $USER -``` - -## Sensor - -The `arduino` sensor platform allows you to get numerical values from an analog input pin of an [Arduino](https://www.arduino.cc/) board. Usually the value is between 0 and 1024. - -To enable an Arduino sensor with Home Assistant, add the following section to your `configuration.yaml` file: - -```yaml -# Example configuration.yaml entry -sensor: - platform: arduino - pins: - 1: - name: Door switch - 0: - name: Brightness -``` - -{% configuration %} -pins: - description: List of pins to use. - required: true - type: map - keys: - pin_number: - description: The pin number that corresponds with the pin numbering schema of your board. - required: true - type: map - keys: - name: - description: Name that will be used in the frontend for the pin. - type: string -{% endconfiguration %} - -The 6 analog pins of an Arduino UNO are numbered from A0 to A5. - -## Switch - -The `arduino` switch platform allows you to control the digital pins of your [Arduino](https://www.arduino.cc/) board. Support for switching pins is limited to high/on and low/off of the digital pins. PWM (pin 3, 5, 6, 9, 10, and 11 on an Arduino Uno) is not supported yet. - -To enable the Arduino pins with Home Assistant, add the following section to your `configuration.yaml` file: - -```yaml -# Example configuration.yaml entry -switch: - platform: arduino - pins: - 11: - name: Fan Office - 12: - name: Light Desk - initial: true - negate: true -``` - -{% configuration %} -pins: - description: List of pins to use. - required: true - type: map - keys: - pin_number: - description: The pin number that corresponds with the pin numbering schema of your board. - required: true - type: map - keys: - name: - description: Name that will be used in the frontend for the pin. - type: string - required: false - initial: - description: The initial value for this port. - type: boolean - required: false - default: false - negate: - description: If this pin should be inverted. - type: boolean - required: false - default: false -{% endconfiguration %} - -The digital pins are numbered from 0 to 13 on a Arduino UNO. The available pins are 2 till 13. For testing purposes you can use pin 13 because with that pin you can control the internal LED. diff --git a/source/_redirects b/source/_redirects index 489c05cf42f..faaa68cf69c 100644 --- a/source/_redirects +++ b/source/_redirects @@ -634,7 +634,6 @@ /components/sensor.api_stream /integrations/websocket_api /components/sensor.api_streams /integrations/websocket_api /components/sensor.aqualogic /integrations/aqualogic#sensor -/components/sensor.arduino /integrations/arduino#sensor /components/sensor.arest /integrations/arest#sensor /components/sensor.arlo /integrations/arlo#sensor /components/sensor.arwn /integrations/arwn @@ -928,7 +927,6 @@ /components/switch.android_ip_webcam /integrations/android_ip_webcam /components/switch.anel_pwrctrl /integrations/anel_pwrctrl /components/switch.aqualogic /integrations/aqualogic#switch -/components/switch.arduino /integrations/arduino#switch /components/switch.arest /integrations/arest#switch /components/switch.bbb_gpio /integrations/bbb_gpio#switch /components/switch.broadlink /integrations/broadlink#switch @@ -1110,7 +1108,6 @@ /components/aqualogic /integrations/aqualogic /components/aquostv /integrations/aquostv /components/arcam_fmj /integrations/arcam_fmj -/components/arduino /integrations/arduino /components/arest /integrations/arest /components/arlo /integrations/arlo /components/aruba /integrations/aruba @@ -2354,3 +2351,7 @@ /components/sensor.loop_energy /more-info/removed-integration 301 /components/sensor.loopenergy /more-info/removed-integration 301 /integrations/tahoma /more-info/removed-integration 301 +/components/arduino /more-info/removed-integration 301 +/components/sensor.arduino /more-info/removed-integration 301 +/components/switch.arduino /more-info/removed-integration 301 +/integrations/arduino /more-info/removed-integration 301 From 581e946f4672c8739b86a5ba625382ad78dae4e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Hjelseth=20H=C3=B8yer?= Date: Wed, 5 Jan 2022 11:11:56 +0100 Subject: [PATCH 087/247] Update tibber.markdown (#21026) Co-authored-by: Franck Nijhof --- source/_integrations/tibber.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/tibber.markdown b/source/_integrations/tibber.markdown index 78be2eaf1cf..dea715f8241 100644 --- a/source/_integrations/tibber.markdown +++ b/source/_integrations/tibber.markdown @@ -18,7 +18,7 @@ ha_platforms: --- The `tibber` integration provides a sensor with the current electricity price if you are a [Tibber](https://tibber.com/) customer. -If you have a [Tibber Pulse](https://norge.tibber.com/products/pulse/) or [Watty](https://tibber.com/se/store/produkt/watty-smart-energimatare) it will also show the electricity consumption in real-time. If you do not have a real-time meter, you get a sensor for monthly consumption, monthly cost, and monthly peak hour updated once per day. +If you have a [Tibber Pulse](https://norge.tibber.com/products/pulse/) or [Watty](https://tibber.com/se/store/produkt/watty-smart-energimatare) it will also show the electricity consumption in real-time. If you do not have a real-time meter, you get a sensor for monthly consumption, monthly cost, and monthly peak hour updated once per day. Once a day a statistics with hourly consumption data is generated that can be used in the [Energy Dashboard](/docs/energy/). (The id is `tibber:energy_consumption_HOMEID` ) There is currently support for the following device types within Home Assistant: From c3d646bc786afc690b9fa1a29b76ab1fa3fc0336 Mon Sep 17 00:00:00 2001 From: Allen Porter Date: Wed, 5 Jan 2022 10:03:58 -0800 Subject: [PATCH 088/247] Add documentation for the rtsp_to_webrtc integration (#20306) Co-authored-by: Klaas Schoute Co-authored-by: Franck Nijhof --- source/_integrations/rtsp_to_webrtc.markdown | 42 ++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 source/_integrations/rtsp_to_webrtc.markdown diff --git a/source/_integrations/rtsp_to_webrtc.markdown b/source/_integrations/rtsp_to_webrtc.markdown new file mode 100644 index 00000000000..24baaea0dc6 --- /dev/null +++ b/source/_integrations/rtsp_to_webrtc.markdown @@ -0,0 +1,42 @@ +--- +title: RTSPtoWebRTC +description: Instructions on how to integrate RTSPtoWebRTC server within Home Assistant. +ha_category: + - Camera +ha_config_flow: true +ha_release: 2022.2 +ha_iot_class: Local Push +ha_quality_scale: internal +ha_codeowners: + - '@allenporter' +ha_domain: rtsp_to_webrtc +--- + +The RTSPtoWebRTC integration registers with [camera integration](/integration/camera) to provide WebRTC live streams for any RTSP camera. The integration initiates a connection to a [RTSPtoWeb](https://github.com/deepch/RTSPtoWeb) or [RTSPtoWebRTC](https://github.com/deepch/RTSPtoWebRTC) proxy server that converts an RTSP stream to a WebRTC stream. + +The integraton configuration requires the URL to your server (e.g. `http://example.com:8083`) and will automatically discover which type of server you have. + +{% include integrations/config_flow.md %} + +## Technical Details + +RTSPtoWebRTC registers with the camera integration to override the camera attribute `frontend_stream_type` of `STREAM_TYPE_WEBRTC` to instruct the frontend to use WebRTC streams. + + + +See [WebRTC](https://webrtc.org/) for more technical details on the open standard for real-time communication. Here is a short summary of how it works: + +- The Home Assistant Frontend is a WebRTC client. This just means there is some javascript for initiating a WebRTC stream which creates an *offer*. +- The `webrtc` integration is responsible for *signaling*, passing the *offer* and an RTSP URL to the *RTSPtoWebRTC* server. +- The *RTSPtoWeb{RTC}* server opens the RTSP URL, and returns back an *answer*. +- The Frontend accepts the answer and then establishes a *peer connection* to the *RTSPtoWebRTC* server. +- Establishing a peer connection may be a direct connection on the local network, or using a variety of techniques to communicate through a NAT (e.g. with a STUN server). +- The Frontend then communicates directly with the *RTSPtoWeb{RTC}* proxy server to view the stream. + +See [Getting started with peer connections](https://webrtc.org/getting-started/peer-connections) for more on the technical details. + +## Troubleshooting + +The integration may not work for your particular setup, and Home Assistant cannot support and troubleshoot user problems that are unrelated to the actual integration in Home Assistant. + +The WebRTC stream negotiation process and streaming can very a lot depending on your network setup and camera setup. See the specific audio and video codecs supported at [RTSPtoWeb Limitations](https://github.com/deepch/RTSPtoWeb#limitations) and [RTSPtoWebRTC Limitations](https://github.com/deepch/RTSPtoWebRTC#limitations). From 04afa8997e3fe8d0fa8662535e13645344a4bf7a Mon Sep 17 00:00:00 2001 From: Jan Bouwhuis Date: Wed, 5 Jan 2022 19:04:57 +0100 Subject: [PATCH 089/247] Explain mqtt templating and mention attribute use (#20735) --- .../_docs/configuration/templating.markdown | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/source/_docs/configuration/templating.markdown b/source/_docs/configuration/templating.markdown index 0f0f6b3a080..60eed9e7316 100644 --- a/source/_docs/configuration/templating.markdown +++ b/source/_docs/configuration/templating.markdown @@ -771,6 +771,51 @@ To evaluate a response, go to **{% my developer_template title="Developer Tools {% endraw %} +### Using templates with the MQTT integration + +The [MQTT integration](/integrations/mqtt/) relies heavily on templates. Templates are used to transform incoming payloads (value templates) to status updates or incoming service calls (command templates) to payloads that configure the MQTT device. + +#### Using value templates with MQTT + +For incoming data a value template translates incoming JSON or raw data to a valid payload. +Incoming payloads are rendered with possible JSON values, so when rendering the `value_json` can be used access the attributes in a JSON based payload. + +
+ +Example value template: + +With given payload: + +```json +{ "state": "ON", "temperature": 21.902 } +``` + +Template {% raw %}```{{ value_json.temperature | round(1) }}```{% endraw %} renders to `21.9`. + +Additional the MQTT entity attributes `entity_id` and `name` can be used as variables in the template. + +
+ +#### Using command templates with MQTT + +For service calls command templates are defined to format the outgoing MQTT payload to the device. When a service call is executed `value` can be used to generate the correct payload to the device. + +
+ +Example command template: + +With given value `21.9` template {% raw %}```{"temperature": {{ value }} }```{% endraw %} renders to: + +```json +{ + "temperature": 21.9 +} +``` + +Additional the MQTT entity attributes `entity_id` and `name` can be used as variables in the template. + +
+ ## Some more things to keep in mind ### `entity_id` that begins with a number From d97a3f7d7a9d53e87ffc8de515b4e814fbe3526f Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 5 Jan 2022 19:35:25 +0100 Subject: [PATCH 090/247] Deprecate Sense HAT (ADR-0019) (#21034) --- source/_integrations/sensehat.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_integrations/sensehat.markdown b/source/_integrations/sensehat.markdown index 6f7a303f250..99a8d580de7 100644 --- a/source/_integrations/sensehat.markdown +++ b/source/_integrations/sensehat.markdown @@ -13,6 +13,14 @@ ha_platforms: - sensor --- +
+ +This integration is deprecated and will be removed in Home Assistant Core 2022.4. + +For more information see: [Architectural Decision Record 0019](https://github.com/home-assistant/architecture/blob/master/adr/0019-GPIO.md). + +
+ There is currently support for the following device types within Home Assistant: - [Light](#light) From 6258b58085d746dc77d87b1d7ae737f909688c33 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 5 Jan 2022 19:39:15 +0100 Subject: [PATCH 091/247] Deprecate Raspberry Pi RF (ADR-0019) (#21035) --- source/_integrations/rpi_rf.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_integrations/rpi_rf.markdown b/source/_integrations/rpi_rf.markdown index 9c1f419ce0d..b4628a4a988 100644 --- a/source/_integrations/rpi_rf.markdown +++ b/source/_integrations/rpi_rf.markdown @@ -10,6 +10,14 @@ ha_platforms: - switch --- +
+ +This integration is deprecated and will be removed in Home Assistant Core 2022.4. + +For more information see: [Architectural Decision Record 0019](https://github.com/home-assistant/architecture/blob/master/adr/0019-GPIO.md). + +
+ The `rpi_rf` switch platform allows you to control devices over 433/315MHz LPD/SRD signals with generic low-cost GPIO RF modules on a [Raspberry Pi](https://www.raspberrypi.org/). Interoperable with codes sniffed via [the rpi-rf module](https://pypi.python.org/pypi/rpi-rf) or [rc-switch](https://github.com/sui77/rc-switch). From 1812bdd320bd10576e79b45f7e229324dce63551 Mon Sep 17 00:00:00 2001 From: Christopher Bailey Date: Wed, 5 Jan 2022 17:08:45 -0500 Subject: [PATCH 092/247] Add UniFi Protect binary_sensor platform (#21032) Co-authored-by: J. Nick Koston Co-authored-by: Franck Nijhof --- source/_integrations/unifiprotect.markdown | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/source/_integrations/unifiprotect.markdown b/source/_integrations/unifiprotect.markdown index 51ef9f93f26..233365b2db6 100644 --- a/source/_integrations/unifiprotect.markdown +++ b/source/_integrations/unifiprotect.markdown @@ -3,6 +3,7 @@ title: UniFi Protect description: Instructions on how to configure UniFi Protect integration by Ubiquiti. ha_category: - Hub + - Binary Sensor - Button - Camera - Light @@ -20,6 +21,7 @@ ha_codeowners: - '@bdraco' ha_domain: unifiprotect ha_platforms: + - binary_sensor - button - camera - light @@ -112,6 +114,7 @@ Each UniFi Protect camera will get the following entities added: * **Privacy Mode** - If your camera allows for Privacy Masks, there will be a configuration switch to toggle a "Privacy Mode" that disables recording, microphone, and a black privacy zone over the whole camera. * **System Sounds** - If your camera has a speaker, there will be a configuration switch to toggle system sounds. * **SSH Enabled** - A disabled by default switch entity will be added to let you toggle on and off SSH for your camera. Username is `ubnt` and password is your Device Password as configured in UniFi Protect. +* **Sensors** - Sensors are provided for data provided from the camera device. Sensors include "Is Dark" and "Doorbell Chime" (if camera has a chime). * **Button** - A disabled by default button entity is added for each camera device. The button will let you reboot your camera device. ### Floodlights @@ -125,12 +128,14 @@ Each UniFi Protect floodlight will get the following entities added: * **Switch** - The following switch entities will be added for each floodlight: * **Status Light** - A configuration switch to turn it on and off to turn on and off the status light for your floodlight. * **SSH Enabled** - A disabled by default switch entity will be added to let you toggle on and off SSH for your floodlight. Username is `ubnt` and password is your Device Password as configured in UniFi Protect. +* **Sensors** - Sensors are provided for data provided from floodlight devices. Sensors include "Is Dark" and "Motion Detected". * **Button** - A disabled by default button entity is added for each floodlight device. The button will let you reboot your floodlight device. ### Sensors Each UniFi Protect smart sensor will get the following entities added: +* **Sensors** - Sensors are provided for data provided from smart sensor devices. Sensors include "Door", "Motion Detected" and "Battery Low". * **Button** - A disabled by default button entity is added for each sensor device. The button will let you reboot your sensor device. * **Switch** - A disabled by default switch entity will be added to let you toggle on and off SSH for your sensor. Username is `ubnt` and password is your Device Password as configured in UniFi Protect. @@ -142,6 +147,12 @@ Each UniFi Protect viewport will get the following entities added: * **Button** - A disabled by default button entity is added for each viewport device. The button will let you reboot your viewport device. * **Switch** - A disabled by default switch entity will be added to let you toggle on and off SSH for your viewport. Username is `ubnt` and password is your Device Password as configured in UniFi Protect. +### NVR + +Your main UniFi Protect NVR device also gets a number of diagnostics sensors that can be used for tracking the state of your UniFi Protect system: + +* **Disk Health**: Each disk installed in your NVR will have a disk health sensor. These are simple good/bad sensors and the order is not promised to match the order in UniFi OS. Disk model number is provided as a state attribute though to help map sensor to disk. + ## Troubleshooting ### Enabling Debug Logging From 3ac8583df3e4399090265d34e99cc9ea87246ebc Mon Sep 17 00:00:00 2001 From: Phil Cole Date: Wed, 5 Jan 2022 22:33:53 +0000 Subject: [PATCH 093/247] Add button.start_mycar_charging documentation for Nissan Leaf (#21000) --- source/_integrations/nissan_leaf.markdown | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/source/_integrations/nissan_leaf.markdown b/source/_integrations/nissan_leaf.markdown index 5c6ca870d00..7a1bc07556d 100644 --- a/source/_integrations/nissan_leaf.markdown +++ b/source/_integrations/nissan_leaf.markdown @@ -10,6 +10,7 @@ ha_codeowners: ha_domain: nissan_leaf ha_platforms: - binary_sensor + - button - sensor - switch --- @@ -18,7 +19,8 @@ The `nissan_leaf` integration offers integration with the [NissanConnect EV](htt * sensors for the battery status, range and charging status * a switch to start and stop the climate control -* services to request updates from the car and to request the car starts charging. +* a button to request the car starts charging. +* service to request updates from the car. ## Configuration @@ -31,6 +33,7 @@ nissan_leaf: password: "YOUR_PASSWORD" region: "YOUR_REGION" ``` + {% configuration %} username: description: The username associated with your NissanConnect EV account. Enclose in quotes. @@ -82,12 +85,12 @@ nissan_leaf: ## Starting a Charge -You can use the `nissan_leaf.start_charge` service to send a request to the Nissan servers to start a charge. The car must be plugged in! The service requires you to provide the vehicle identification number (VIN) as a parameter. You can see the VIN on the attributes of all the entities created by this component. +You can use the `button.press` service to send a request to the Nissan servers to start a charge. The car must be plugged in! ```yaml -- service: nissan_leaf.start_charge - data: - vin: "1HGBH41JXMN109186" # replace +- service: button.press + target: + entity_id: button.start_NICKNAME_charging # replace ``` ## Updating on-demand using Automation @@ -114,7 +117,7 @@ You can also use the `nissan_leaf.update` service to request an on-demand update ## Hints * The update interval has a minimum of two minutes. -* Requesting updates uses a small amount of power from the 12 V battery. The 12 V battery charges from the main traction battery when the car is not plugged in. If the car is left plugged in for a long time, or if the main traction battery is very low then the 12 V battery may gradually discharge. A low update interval may cause the 12 V battery to become flat. When the 12 V battery is flat the car will not start. _Do not set the update interval too low. Use at your own risk._ +* Requesting updates uses a small amount of energy from the 12 V battery. The 12 V battery charges from the main traction battery when the car is not plugged in. If the car is left plugged in for a long time, or if the main traction battery is very low then the 12 V battery may gradually discharge. A low update interval may cause the 12 V battery to become flat. When the 12 V battery is flat the car will not start. _Do not set the update interval too low. Use at your own risk._ * This integration communicates with the Nissan Servers which then communicate with the car. The communication between the car and the Nissan Servers is very slow, and takes up to five minutes to get information from the car, therefore the default polling interval is set to one hour to not overwhelm the connection. * Responses from the Nissan servers are received separately for the battery/range, climate control and location. The `updated_on` attribute will show the last time the data was retrieved from the server. There are separate attributes for when the `next_update` is scheduled, and to indicate if `update_in_progress`. The `nissan_leaf.update` service will reset the `next_update` attribute. * The Nissan APIs do not allow charging to be stopped remotely. @@ -129,6 +132,8 @@ logger: default: critical logs: homeassistant.components.nissan_leaf: debug + homeassistant.components.binary_sensor.nissan_leaf: debug + homeassistant.components.button.nissan_leaf: debug homeassistant.components.sensor.nissan_leaf: debug homeassistant.components.switch.nissan_leaf: debug ``` From daa00faabb8f00b7ac6d00fb9b492b9e7ef47846 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 5 Jan 2022 23:41:41 +0100 Subject: [PATCH 094/247] Deprecate Raspberry Pi GPIO (ADR-0019) (#21036) --- source/_integrations/rpi_gpio.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_integrations/rpi_gpio.markdown b/source/_integrations/rpi_gpio.markdown index 9de4ccdbf24..4fe398843cc 100644 --- a/source/_integrations/rpi_gpio.markdown +++ b/source/_integrations/rpi_gpio.markdown @@ -15,6 +15,14 @@ ha_platforms: - switch --- +
+ +This integration is deprecated and will be removed in Home Assistant Core 2022.6. + +For more information see: [Architectural Decision Record 0019](https://github.com/home-assistant/architecture/blob/master/adr/0019-GPIO.md). + +
+ The `rpi_gpio` integration is the base for all related GPIO platforms in Home Assistant. There is no setup needed for the integration itself, for the platforms please check their corresponding pages. ## Binary Sensor From 694b40fd991b679e3be8b66dc241f518523c11ff Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 5 Jan 2022 23:41:56 +0100 Subject: [PATCH 095/247] Deprecate pigpio Daemon PWM LED (ADR-0019) (#21037) --- source/_integrations/rpi_gpio_pwm.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_integrations/rpi_gpio_pwm.markdown b/source/_integrations/rpi_gpio_pwm.markdown index c37c29e3f25..dfa863fc2f4 100644 --- a/source/_integrations/rpi_gpio_pwm.markdown +++ b/source/_integrations/rpi_gpio_pwm.markdown @@ -12,6 +12,14 @@ ha_platforms: - light --- +
+ +This integration is deprecated and will be removed in Home Assistant Core 2022.4. + +For more information see: [Architectural Decision Record 0019](https://github.com/home-assistant/architecture/blob/master/adr/0019-GPIO.md). + +
+ The `rpi_gpio_pwm` platform allows to control multiple lights using pulse-width modulation, for example LED strips. It supports one-color, RGB and RGBW LEDs driven by GPIOs of a Raspberry Pi (same host or remote) or a PCA9685 controller. For controlling the GPIOs, the platform connects to the [pigpio-daemon](http://abyz.me.uk/rpi/pigpio/pigpiod.html), which must be running. On Raspbian Jessie 2016-05-10 or newer the `pigpio` library is already included. On other operating systems it needs to be installed first (see [installation instructions](https://github.com/soldag/python-pwmled#installation)). From 458ef8d90cfe9ce692d3b8eeb335e49acca6aaa7 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 5 Jan 2022 23:42:05 +0100 Subject: [PATCH 096/247] Deprecate Piglow (ADR-0019) (#21038) --- source/_integrations/piglow.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_integrations/piglow.markdown b/source/_integrations/piglow.markdown index aea4e938134..79c53b84a23 100644 --- a/source/_integrations/piglow.markdown +++ b/source/_integrations/piglow.markdown @@ -10,6 +10,14 @@ ha_platforms: - light --- +
+ +This integration is deprecated and will be removed in Home Assistant Core 2022.4. + +For more information see: [Architectural Decision Record 0019](https://github.com/home-assistant/architecture/blob/master/adr/0019-GPIO.md). + +
+ The `piglow` platform lets you control the [Piglow](https://shop.pimoroni.com/products/piglow) lights on your Raspberry Pi from within Home Assistant. ## Configuration From 88d5b89548dbeb475f9b3df2e1ebc11f82a8ade3 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 5 Jan 2022 23:42:11 +0100 Subject: [PATCH 097/247] Deprecate PiFace Digital I/O (PFIO) (ADR-0019) (#21039) --- source/_integrations/rpi_pfio.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_integrations/rpi_pfio.markdown b/source/_integrations/rpi_pfio.markdown index 5ad00d8e064..7c9e85a46cf 100644 --- a/source/_integrations/rpi_pfio.markdown +++ b/source/_integrations/rpi_pfio.markdown @@ -13,6 +13,14 @@ ha_platforms: - switch --- +
+ +This integration is deprecated and will be removed in Home Assistant Core 2022.4. + +For more information see: [Architectural Decision Record 0019](https://github.com/home-assistant/architecture/blob/master/adr/0019-GPIO.md). + +
+ The `rpi_pfio` integration is the base for all related [PiFace Digital I/O (PFIO)](http://www.piface.org.uk/) platforms in Home Assistant. There is no setup needed for the integration itself; for the platforms, please check their corresponding pages. There is currently support for the following device types within Home Assistant: From 773a8238a1ad0f40f11b22bb2472466ac4f9cca7 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 5 Jan 2022 23:42:33 +0100 Subject: [PATCH 098/247] Deprecate Orange Pi GPIO (ADR-0019) (#21040) --- source/_integrations/orangepi_gpio.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_integrations/orangepi_gpio.markdown b/source/_integrations/orangepi_gpio.markdown index 1f1fa3cf57e..8190196c90a 100644 --- a/source/_integrations/orangepi_gpio.markdown +++ b/source/_integrations/orangepi_gpio.markdown @@ -13,6 +13,14 @@ ha_platforms: - binary_sensor --- +
+ +This integration is deprecated and will be removed in Home Assistant Core 2022.4. + +For more information see: [Architectural Decision Record 0019](https://github.com/home-assistant/architecture/blob/master/adr/0019-GPIO.md). + +
+ The `orangepi_gpio` integration is the base for all related GPIO platforms in Home Assistant. There is no setup needed for the integration itself, for the platforms please check their corresponding pages. This integration provides the following platforms: From 36ddf49803b9bde459762af236b4fb9c19623d31 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 5 Jan 2022 23:42:41 +0100 Subject: [PATCH 099/247] Deprecate MH-Z19 CO2 Sensor (ADR-0019) (#21041) --- source/_integrations/mhz19.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_integrations/mhz19.markdown b/source/_integrations/mhz19.markdown index a35e552153c..2a6b92e0aaf 100644 --- a/source/_integrations/mhz19.markdown +++ b/source/_integrations/mhz19.markdown @@ -10,6 +10,14 @@ ha_platforms: - sensor --- +
+ +This integration is deprecated and will be removed in Home Assistant Core 2022.4. + +For more information see: [Architectural Decision Record 0019](https://github.com/home-assistant/architecture/blob/master/adr/0019-GPIO.md). + +
+ The MH-Z19 is a small non-dispersive infrared sensor that can measure CO2 level. High CO2 levels can lead to drowsiness, poor concentration, loss of attention or increased heart rate. The CO2 level outside is around 400ppm, but inside levels can reach between 1000 and 5000 ppm. High CO2 levels indicate that you should increase ventilation. **Note:** the new version MH-Z19B requires the VIN to be connected to a 5V pin, rather than 3.3V. From 03a6185b63fc4c920cb1083b65ac5d23ede0fda2 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 5 Jan 2022 23:42:48 +0100 Subject: [PATCH 100/247] Deprecate Enviro pHAT (ADR-0019) (#21042) --- source/_integrations/envirophat.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_integrations/envirophat.markdown b/source/_integrations/envirophat.markdown index 2adb0c6d05d..05434ea79cf 100644 --- a/source/_integrations/envirophat.markdown +++ b/source/_integrations/envirophat.markdown @@ -10,6 +10,14 @@ ha_platforms: - sensor --- +
+ +This integration is deprecated and will be removed in Home Assistant Core 2022.4. + +For more information see: [Architectural Decision Record 0019](https://github.com/home-assistant/architecture/blob/master/adr/0019-GPIO.md). + +
+ The `envirophat` sensor platform allows you to display information collected by an [Enviro pHAT](https://shop.pimoroni.com/products/enviro-phat) add-on board for the Raspberry Pi. The board features a wide range of sensors, such as: - BMP280 temperature/pressure sensor From 7cafafdf4cf29c2eb602e3d0a04bccb621b29c78 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 5 Jan 2022 23:42:55 +0100 Subject: [PATCH 101/247] Deprecate Blinkt! (ADR-0019) (#21043) --- source/_integrations/blinkt.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_integrations/blinkt.markdown b/source/_integrations/blinkt.markdown index af9709d8838..81fa8287106 100644 --- a/source/_integrations/blinkt.markdown +++ b/source/_integrations/blinkt.markdown @@ -10,6 +10,14 @@ ha_platforms: - light --- +
+ +This integration is deprecated and will be removed in Home Assistant Core 2022.4. + +For more information see: [Architectural Decision Record 0019](https://github.com/home-assistant/architecture/blob/master/adr/0019-GPIO.md). + +
+ The `blinkt` light platform lets you control the [Blinkt!](https://shop.pimoroni.com/products/blinkt) board, featuring eight super-bright RGB LEDs. ## Configuration From 9c83e8274f27ef98d8a586ee7e0df96b03023cd2 Mon Sep 17 00:00:00 2001 From: Tim Rightnour <6556271+garbled1@users.noreply.github.com> Date: Wed, 5 Jan 2022 16:11:17 -0700 Subject: [PATCH 102/247] Docs for HB_HUB and moisture sensor binary_sensor/switches (#20569) --- source/_integrations/onewire.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_integrations/onewire.markdown b/source/_integrations/onewire.markdown index 2b739b05ae4..2e30eb8522c 100644 --- a/source/_integrations/onewire.markdown +++ b/source/_integrations/onewire.markdown @@ -33,6 +33,7 @@ Each 1-wire component data sheet describes the different properties the componen | 12 | [DS2406](https://datasheets.maximintegrated.com/en/ds/DS2406.pdf) | 2 sensed (sensed.A/B) [4](#note_4) | | 29 | [DS2408](https://datasheets.maximintegrated.com/en/ds/DS2408.pdf) | 8 sensed (sensed.0-7) [4](#note_4) | | 3A | [DS2413](https://datasheets.maximintegrated.com/en/ds/DS2413.pdf) | 2 sensed (sensed.A/B) [4](#note_4) | +| EF | [HobbyBoard](https://hobbyboards.com/) | Hub Branch State [3](#note_3) [4](#note_4) | #### Sensors: @@ -57,6 +58,7 @@ Each 1-wire component data sheet describes the different properties the componen | 12 | [DS2406](https://datasheets.maximintegrated.com/en/ds/DS2406.pdf) | 2 latches (latch.A/B) and 2 PIOs (PIO.A/B) [4](#note_4) | | 29 | [DS2408](https://datasheets.maximintegrated.com/en/ds/DS2408.pdf) | 8 latches (latch.0-7) and 8 PIOs (PIO.0/7) [4](#note_4) | | 3A | [DS2413](https://datasheets.maximintegrated.com/en/ds/DS2413.pdf) | 2 PIOs (PIO.A/B) [4](#note_4) | +| EF | [HobbyBoard](https://hobbyboards.com/) | Hub Branch Enable, Moisture Sensor Type [3](#note_3) [4](#note_4) | #### Bridges: From 6db40dee7b359ed38d9051cbc35a61961a18518c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Hjelseth=20H=C3=B8yer?= Date: Thu, 6 Jan 2022 00:13:18 +0100 Subject: [PATCH 103/247] Adax local access (#20374) Co-authored-by: J. Nick Koston Co-authored-by: Franck Nijhof --- source/_integrations/adax.markdown | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/source/_integrations/adax.markdown b/source/_integrations/adax.markdown index 6e8a9ed2b2c..2cd99eb8c52 100644 --- a/source/_integrations/adax.markdown +++ b/source/_integrations/adax.markdown @@ -4,7 +4,7 @@ description: Instructions on how to integrate Adax heater into Home Assistant. ha_category: - Climate ha_release: 2021.8 -ha_iot_class: Cloud Polling +ha_iot_class: Local Polling ha_codeowners: - '@danielhiversen' ha_domain: adax @@ -15,7 +15,11 @@ ha_platforms: Integrates Adax heater into Home Assistant. -You'll need the Account ID (which can be found in the Adax Wifi app, pressing 'Account'). You will also need a credential, which you can create in the Adax app: +You can configure the heaters to use a local or cloud interface. + +The local integrations only works with newer Adax heaters with both Bluetooth and wifi. Home Assistant uses Bluetooth to configure the heaters. For the local integration, you have to reset the heater by pressing + and OK until the display shows 'Reset'. Then press and hold the OK button on the heater until the blue LED starts blinking before pressing Submit. Configuring the heater might take some minutes. Using the local integration will disable cloud communication and the Adax app will not work. + +For the cloud integration, you'll need the Account ID (which can be found in the Adax Wifi app, pressing 'Account'). You will also need a credential, which you can create in the Adax app: 1. Navigate to Account Tab, 2. Select “Remote user client API” From ceb3d2e3b0d43f393db682f37b2b11741fd1cf84 Mon Sep 17 00:00:00 2001 From: Milan Meulemans Date: Thu, 6 Jan 2022 00:28:29 +0100 Subject: [PATCH 104/247] Add Aseko Pool Live integration (#19383) Co-authored-by: Franck Nijhof --- source/_integrations/aseko_pool_live.markdown | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 source/_integrations/aseko_pool_live.markdown diff --git a/source/_integrations/aseko_pool_live.markdown b/source/_integrations/aseko_pool_live.markdown new file mode 100644 index 00000000000..c806b67281e --- /dev/null +++ b/source/_integrations/aseko_pool_live.markdown @@ -0,0 +1,22 @@ +--- +title: Aseko Pool Live +description: Instructions on how to integrate Aseko ASIN AQUA dosing systems within Home Assistant. +ha_iot_class: Cloud Polling +ha_config_flow: true +ha_release: 2022.2 +ha_category: + - Sensor +ha_codeowners: + - '@milanmeu' +ha_domain: aseko_pool_live +ha_platforms: + - sensor +--- + +The Aseko Pool Live integration allows you to monitor your Aseko ASIN Aqua dosing systems. + +The integration is fully compatible with ASIN AQUA Net and ASIN AQUA Home. + +If you have an ASIN AQUA Oxygen, Home, Salt or Profi dosing system and not all probes are listed in Home Assistant, [open an issue on GitHub](https://github.com/home-assistant/core/issues/new?template=bug_report.yml&title=Add%20support%20for%20ASIN%20AQUA%20[your%20device%20model]) and include the first 8 digits of your serial number so that your device model can be made fully compatible with Home Assistant. + +{% include integrations/config_flow.md %} From 21451c4a45f5cc2dec8c0e7ad2c1cb408312c0d9 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 5 Jan 2022 15:56:04 -1000 Subject: [PATCH 105/247] Add steamist integration (#20995) --- source/_integrations/steamist.markdown | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 source/_integrations/steamist.markdown diff --git a/source/_integrations/steamist.markdown b/source/_integrations/steamist.markdown new file mode 100644 index 00000000000..b2156976087 --- /dev/null +++ b/source/_integrations/steamist.markdown @@ -0,0 +1,23 @@ +--- +title: Steamist +description: Documentation about Steamist steam showers. +ha_category: + - Switch +ha_iot_class: Local Polling +ha_release: 2022.2 +ha_config_flow: true +ha_codeowners: + - '@bdraco' +ha_domain: steamist +ha_platforms: + - switch +--- + +The Steamist will allow you to monitor the state of your [Steamist](https://steamist.com/digital-controls/) steam shower and turn on and off the steam generator. + +## Supported Devices + +- 450 Digital Control +- 550 Digital Control + +{% include integrations/config_flow.md %} From 5b08fc26e41a96c40994244dcba22f61707f2f1a Mon Sep 17 00:00:00 2001 From: Christopher Bailey Date: Wed, 5 Jan 2022 20:57:19 -0500 Subject: [PATCH 106/247] Add UniFi Protect sensor platform (#21049) Co-authored-by: J. Nick Koston --- source/_integrations/unifiprotect.markdown | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/_integrations/unifiprotect.markdown b/source/_integrations/unifiprotect.markdown index 233365b2db6..258351148f6 100644 --- a/source/_integrations/unifiprotect.markdown +++ b/source/_integrations/unifiprotect.markdown @@ -10,6 +10,7 @@ ha_category: - Media Player - Number - Select + - Sensor - Switch ha_release: 2022.2 ha_iot_class: Local Push @@ -28,6 +29,7 @@ ha_platforms: - media_player - number - select + - sensor - switch --- @@ -114,7 +116,7 @@ Each UniFi Protect camera will get the following entities added: * **Privacy Mode** - If your camera allows for Privacy Masks, there will be a configuration switch to toggle a "Privacy Mode" that disables recording, microphone, and a black privacy zone over the whole camera. * **System Sounds** - If your camera has a speaker, there will be a configuration switch to toggle system sounds. * **SSH Enabled** - A disabled by default switch entity will be added to let you toggle on and off SSH for your camera. Username is `ubnt` and password is your Device Password as configured in UniFi Protect. -* **Sensors** - Sensors are provided for data provided from the camera device. Sensors include "Is Dark" and "Doorbell Chime" (if camera has a chime). +* **Sensors** - Sensors are provided for data provided from the camera device. Sensors include "Is Dark" and "Doorbell Chime" (if camera has a chime). Several diagnostics sensors are added including sensors on uptime, network connection stats, and storage stats. Doorbells will also have a "Voltage" sensor for troubleshooting electrical issues. * **Button** - A disabled by default button entity is added for each camera device. The button will let you reboot your camera device. ### Floodlights @@ -152,6 +154,7 @@ Each UniFi Protect viewport will get the following entities added: Your main UniFi Protect NVR device also gets a number of diagnostics sensors that can be used for tracking the state of your UniFi Protect system: * **Disk Health**: Each disk installed in your NVR will have a disk health sensor. These are simple good/bad sensors and the order is not promised to match the order in UniFi OS. Disk model number is provided as a state attribute though to help map sensor to disk. +* **Utilization and Storage Sensors**: Several other sensors are also added for uptime, hardware utilization, and distribution details of the video on disk. ## Troubleshooting From 4fde6217512389c7c9da703755c5f1995fe199e5 Mon Sep 17 00:00:00 2001 From: rikroe <42204099+rikroe@users.noreply.github.com> Date: Thu, 6 Jan 2022 12:06:03 +0100 Subject: [PATCH 107/247] Update bmw_connected_drive documentation for buttons (#20959) --- .../bmw_connected_drive.markdown | 42 ++++++++----------- 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/source/_integrations/bmw_connected_drive.markdown b/source/_integrations/bmw_connected_drive.markdown index eeab1531106..9fa17ef2ab1 100644 --- a/source/_integrations/bmw_connected_drive.markdown +++ b/source/_integrations/bmw_connected_drive.markdown @@ -4,6 +4,7 @@ description: Instructions on how to setup your BMW Connected Drive account with ha_category: - Car - Binary Sensor + - Button - Presence Detection - Lock - Sensor @@ -17,6 +18,7 @@ ha_codeowners: ha_domain: bmw_connected_drive ha_platforms: - binary_sensor + - button - device_tracker - lock - notify @@ -37,10 +39,10 @@ This integration provides the following platforms: - Binary Sensors: Doors, windows, condition based services, check control messages, parking lights, door lock state, charging status (electric cars) and connections status (electric cars). - Device tracker: The location of your car. -- Lock: Control the lock of your car. +- [Lock](/integrations/bmw_connected_drive/#lock): Control the lock of your car. - Sensors: Mileage, remaining range, remaining fuel, charging time remaining (electric cars), charging status (electric cars), remaining range electric (electric cars). -- Notifications: Send Points of Interest (POI) to your car. -- Services: Turn on air condition, sound the horn, flash the lights, update the vehicle location and update the state. More details can be found [here](/integrations/bmw_connected_drive/#services). +- [Notifications](/integrations/bmw_connected_drive/#notifications): Send Points of Interest (POI) to your car. +- [Buttons](/integrations/bmw_connected_drive/#buttons): Turn on air condition, sound the horn, flash the lights, update the vehicle location and update the state. ## Configuration @@ -98,11 +100,7 @@ bmw_connected_drive: The `bmw_connected_drive` integration offers a notification service. Using this service you can send Points of Interest (POI) to your vehicle. In your vehicle you can select this POI and the navigation will automatically start using the POI as a destination. The name of the service is `notify.bmw_connected_drive_`. -### Examples - -A few examples on how to use the notification service. - -#### Send a Point of Interest to your vehicle +### Send a Point of Interest to your vehicle ```yaml ... @@ -120,39 +118,37 @@ action: country: Country # Optional ``` -## Services +## Lock -The `bmw_connected_drive` integration offers several services. In case you need to provide the vehicle identification number (VIN) as a parameter, you can see the VIN as attribute of all entities, e.g. (binary) sensors or the device tracker. The VIN is a 17 digit alphanumeric string, e.g., `WBANXXXXXX1234567`. +The vehicle can be locked and unlocked via the lock integration that is created automatically for each vehicle. Before invoking, make sure it's safe to lock/unlock the vehicle in the current situation. -Using these services will impact the state of your vehicle. So use these services with care! +## Buttons -### Locking and unlocking +The `bmw_connected_drive` integration offers several buttons to trigger actions in your car. The buttons are automatically created and can be pressed/executed from the UI or using the `button.press` service. Please see the [button documentation](/integrations/button/) for more information. -The vehicle can be locked and unlocked via the lock integration that is created automatically for each vehicle. Before invoking these services, make sure it's safe to lock/unlock the vehicle in the current situation. +Using these buttons will impact the state of your vehicle. So use these services with care! ### Air condition -The air condition of the vehicle can be activated with the service `bmw_connected_drive.activate_air_conditioning`. +The air condition of the vehicle can be activated with the `button._activate_air_conditioning` button. What exactly is started here depends on the type of vehicle. It might range from just ventilation over auxiliary heating to real air conditioning. If your vehicle is equipped with auxiliary heating, only trigger this service if the vehicle is parked in a location where it is safe to use it (e.g., not in an underground parking or closed garage). -Some newer cars also support stopping an active air conditioning with the service `bmw_connected_drive.deactivate_air_conditioning`. +Some newer cars also support stopping an active air conditioning with the `button._deactivate_air_conditioning` button. This will only work if you have the option to stop the AC in the *MyBMW* app. If your car doesn't support this service, nothing will happen. -The vehicle is identified via the parameter `vin`. - ### Sound the horn -The service `bmw_connected_drive.sound_horn` sounds the horn of the vehicle. This option is not available in some countries (among which the UK). Use this feature responsibly, as it might annoy your neighbors. The vehicle is identified via the parameter `vin`. +The `button._sound_horn` button sounds the horn of the vehicle. This option is not available in some countries (among which the UK). Use this feature responsibly, as it might annoy your neighbors. ### Flash the lights -The service `bmw_connected_drive.light_flash` flashes the lights of the vehicle. The vehicle is identified via the parameter `vin`. +The `button._light_flash` button flashes the lights of the vehicle. ### Vehicle finder -The service `bmw_connected_drive.find_vehicle` requests the vehicle to update the GPS location. This can be used for older vehicles which don't automatically send the updated GPS location. The vehicle is identified via the parameter `vin`. +The `button._find_vehicle` button requests the vehicle to update the GPS location. This can be used for older vehicles which don't automatically send the updated GPS location.
@@ -167,11 +163,9 @@ The service `bmw_connected_drive.find_vehicle` requests the vehicle to update th
-### Update the state +### Update the state / refresh from API -The service `bmw_connected_drive.update_state` fetches the last state of the vehicles of all your accounts from the BMW server. This does *not* trigger an update from the vehicle; it gets the data from the BMW servers. So this service does *not* interact with your vehicles. - -This service does not require any attributes. +The `button._refresh_from_api` button fetches the last state of the vehicles of all your accounts from the BMW server. This does *not* trigger an update from the vehicle; it gets the data from the BMW servers. So this service does *not* interact with your vehicles. ## Disclaimer From 59376f55ae82a466dbf89e5fa4515e4320d22993 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Thu, 6 Jan 2022 12:37:55 +0100 Subject: [PATCH 108/247] Deprecate 1-Wire SysBus (ADR-0019) (#21044) --- source/_integrations/onewire.markdown | 53 +++++---------------------- 1 file changed, 9 insertions(+), 44 deletions(-) diff --git a/source/_integrations/onewire.markdown b/source/_integrations/onewire.markdown index 2e30eb8522c..3d9c6b8deba 100644 --- a/source/_integrations/onewire.markdown +++ b/source/_integrations/onewire.markdown @@ -16,6 +16,14 @@ ha_platforms: - switch --- +
+ +Using this integration via the SysBus is deprecated and will be removed in Home Assistant Core 2022.6. + +For more information see: [Architectural Decision Record 0019](https://github.com/home-assistant/architecture/blob/master/adr/0019-GPIO.md). + +
+ The `onewire` platform supports sensors which that using the One wire (1-wire) bus for communication. Every 1-wire device has a (globally) unique ID that identifies the device on the bus. The first two digits identify a device family and the last 14 digits are a globally unique number given to it during manufacturing. @@ -84,50 +92,7 @@ Notes: ## Interfacing with the 1-wire bus -The 1-Wire bus can be connected directly to the IO pins of Raspberry Pi or by using a dedicated interface adapter, for example -[DS9490R](https://datasheets.maximintegrated.com/en/ds/DS9490-DS9490R.pdf) or adapters based on [DS2482-100](https://datasheets.maximintegrated.com/en/ds/DS2482-100.pdf) that can be directly attached to the IO pins on the Raspberry Pi. - -It is also possible for this platform to interface with a remote 1-wire host over a network connection using owfs and owserver. - -### Raspberry Pi set up - -In order to setup 1-Wire support on Raspberry Pi, you'll need to edit `/boot/config.txt`. This file can not be edited through ssh. You have to put your SD card to a PC, and edit the file directly. -To edit `/boot/config.txt` on the Home Assistant Operating System, use [this documentation](https://developers.home-assistant.io/docs/operating-system/debugging.html) to enable SSH and edit `/mnt/boot/config.txt` via `vi`. - -If you use an external pull-up resistor and the default GPIO 4 for the data line, add the following line: - -```txt -dtoverlay=w1-gpio -``` - -If you don't want to use an external resistor, you can use a built-in one using the following line: - -```txt -dtoverlay=w1-gpio-pullup -``` - -It is also possible to use a different GPIO pin like this to change it to pin 15: - -```txt -dtoverlay=w1-gpio-pullup,gpiopin=15 -``` - -Furthermore, it is also possible to have multiple GPIOs as one-wire data channel by adding multiple lines like this: - -```txt -dtoverlay=w1-gpio-pullup,gpiopin=15 -dtoverlay=w1-gpio-pullup,gpiopin=16 -``` - -You can read about further parameters in this documentation: [Raspberry Pi Tutorial Series: 1-Wire DS18B20 Sensor](https://www.waveshare.com/wiki/Raspberry_Pi_Tutorial_Series:_1-Wire_DS18B20_Sensor#Enable_1-Wire). - -When using the GPIO pins on Raspberry Pi directly as a 1-wire bus, the description above uses two kernel modules. `1w_gpio`, that implements the 1-wire protocol, and `1w_therm`, that understands the DS18B20 (family 28) components inner structure and reports temperature. -There is no support for other device types (families) and hence this onewire platform only supports temperature measurements from family 28 devices. - -### Raspberry Pi checking connected devices via ssh - -If you set up ssh, you can check the connected one-wire devices in the following folder: /sys/bus/w1/devices -The device IDs begin with `28-`. +The 1-Wire bus can be connected with a remote 1-wire host over a network connection using owfs and owserver. ## Interface adapter setup From b89ab56baa628080c20f22279194e4e1dc02bfea Mon Sep 17 00:00:00 2001 From: Christopher Bailey Date: Thu, 6 Jan 2022 16:46:51 -0500 Subject: [PATCH 109/247] Adds set_doorbell_message_text service (#21070) Co-authored-by: J. Nick Koston --- source/_integrations/unifiprotect.markdown | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/source/_integrations/unifiprotect.markdown b/source/_integrations/unifiprotect.markdown index 258351148f6..fb03dc0c8d5 100644 --- a/source/_integrations/unifiprotect.markdown +++ b/source/_integrations/unifiprotect.markdown @@ -156,6 +156,18 @@ Your main UniFi Protect NVR device also gets a number of diagnostics sensors tha * **Disk Health**: Each disk installed in your NVR will have a disk health sensor. These are simple good/bad sensors and the order is not promised to match the order in UniFi OS. Disk model number is provided as a state attribute though to help map sensor to disk. * **Utilization and Storage Sensors**: Several other sensors are also added for uptime, hardware utilization, and distribution details of the video on disk. +## Services + +### Service unifiprotect.set_doorbell_message + +Use to dynamically set the message on a Doorbell LCD screen. This service should only be used to set dynamic messages (i.e. setting the current outdoor temperature on your Doorbell). + +| Service data attribute | Optional | Description | +| ---------------------- | -------- | ------------------------------------------------------------------------------------------------------------ | +| `entity_id` | No | The Doorbell Text select entity for your Doorbell | +| `message` | No | The message you would like to display on the LCD screen of your Doorbell. Must be less than 30 characters | +| `duration` | Yes | Number of minutes to display the message for before returning to the default message | + ## Troubleshooting ### Enabling Debug Logging @@ -182,3 +194,11 @@ Unlike with many other things, playing audio to your speakers requires your Home ### Liveview Options for Viewport Missing Options or Out of Date Main control selects currently cannot have dynamic options since the options are exported out to voice assistants. After you add/remove/change a Liveview in UniFi Protect, you must restart Home Assistant to get the new options for your Viewport. + +### NvrErrors with "404 - Reason: Not Found" + +If you get errors while authenticating or fetching data for `NvrError... 404 - Reason: Not Found`, there is a good chance that your UniFi Protect application has crashed. UniFi Protect runs in a supervised way on UniFi OS (similar to Home Assistant OS + Home Assistant Core). Getting a 404 for a URL that should not produce a 404 means UniFi Protect is probably not running. You may want to check the health of your disks or look into debugging UniFi Protect to see why it is crashing. + +```log +pyunifiprotect.NvrError: Fetching Camera List failed: 404 - Reason: Not Found +``` From 1455830c6a19053a79cd872d7410571fe49a0539 Mon Sep 17 00:00:00 2001 From: RefineryX <46373533+RefineryX@users.noreply.github.com> Date: Fri, 7 Jan 2022 12:51:44 +0000 Subject: [PATCH 110/247] Updated VeSync to show support for 300s and 400s (#21080) --- source/_integrations/vesync.markdown | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/source/_integrations/vesync.markdown b/source/_integrations/vesync.markdown index d3bcf7df292..35349f8f316 100644 --- a/source/_integrations/vesync.markdown +++ b/source/_integrations/vesync.markdown @@ -53,8 +53,10 @@ This integration supports devices controllable by the VeSync App. The following ### Fans +- Core 200S: Smart True HEPA Air Purifier +- Core 300S: Smart True HEPA Air Purifier +- Core 400S: Smart True HEPA Air Purifier - LEVOIT Smart Wifi Air Purifier (LV-PUR131S) -- LEVOIT Core 200S Smart True HEPA Air Purifier (Core200S) ## Prerequisite @@ -89,15 +91,15 @@ VeSync air purifiers will expose the following details depending on the features | Attribute | Description | Example | | ----------------------- | --------------------------------------------------------------------------------- | --------------- | -| `mode` | The current mode the device is in. (LV-PUR131S, Core200S) | manual | -| `speed` | The current speed setting of the device. (LV-PUR131S, Core200S) | high | +| `mode` | The current mode the device is in. (LV-PUR131S, Core200S/300s/400s) | manual | +| `speed` | The current speed setting of the device. (LV-PUR131S, Core200S/300s/400s) | high | | `speed_list` | The available list of speeds supported by the device. (LV-PUR131S) | high | | `active_time` | The number of seconds since the device has been in a non-off mode. (LV-PUR131S) | 1598 | -| `filter_life` | Remaining percentage of the filter. (LV-PUR131S, Core200S) | 142 | +| `filter_life` | Remaining percentage of the filter. (LV-PUR131S, (Core200S/300s/400s) | 142 | | `air_quality` | The current air quality reading. (LV-PUR131S) | excellent | | `screen_status` | The current status of the screen. (LV-PUR131S) | on | -| `night_light` | The current status of the night light (Core200S) | off | -| `child_lock` | The current status of the child lock (Core200S) | off | +| `night_light` | The current status of the night light (Core200S/Core400s) | off | +| `child_lock` | The current status of the child lock (Core200S/300s/400s) | off | ## Extracting Attribute data From f004bc75128d53df8ab3d2938c71876fe453672b Mon Sep 17 00:00:00 2001 From: Tobias Perschon Date: Fri, 7 Jan 2022 15:02:46 +0100 Subject: [PATCH 111/247] Add Daikin energy sensor text (#20749) Co-authored-by: Franck Nijhof --- source/_integrations/daikin.markdown | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/source/_integrations/daikin.markdown b/source/_integrations/daikin.markdown index 993dffa1889..6ba5819e8b0 100644 --- a/source/_integrations/daikin.markdown +++ b/source/_integrations/daikin.markdown @@ -98,23 +98,25 @@ The `daikin` sensor platform integrates Daikin air conditioning systems into Hom - Inside temperature - Outside temperature - Inside humidity -- Total instant power consumption +- Estimated power consumption - Hourly energy consumption in cool mode - Hourly energy consumption in heat mode -- Outside compressor frequency +- Outside unit's compressor frequency +- Today's total energy consumption (resets at 00:00)
- Some models only report outside temperature when they are turned on. -- Some models does not have humidity sensor. -- Some models does not report the power/energy consumption. -- Some models does not report the compressor frequency. +- Some models do not have humidity sensor. +- Some models do not report the power/energy consumption. +- Some models do not report the compressor frequency.
-- The 'total' power sensor is updated every time 100 Wh are consumed by all the AC summed together. +- The 'Today's total energy consumption' and 'Estimated power consumption' sensor is updated every time 100 Wh are consumed by all different operating modes summed together. +- The 'Estimated power consumption' sensor is derived from the energy consumption and not provided by the AC directly. - The 'cool/heat' energy sensors are updated hourly with the previous hour energy consumption of a given mode and a given AC. - The 'cool' mode also includes the 'fan' and 'dehumidifier' modes' power consumption. From acdf5740e8b206e7c4546eb1d54a0b3188cf857d Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 7 Jan 2022 21:26:34 -1000 Subject: [PATCH 112/247] Add sensor platform to flux_led (#21090) --- source/_integrations/flux_led.markdown | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/_integrations/flux_led.markdown b/source/_integrations/flux_led.markdown index 388ffe07e72..98d1a90bf4e 100644 --- a/source/_integrations/flux_led.markdown +++ b/source/_integrations/flux_led.markdown @@ -4,7 +4,9 @@ description: Instructions on how to setup Magic Home within Home Assistant. ha_category: - Button - Light + - Number - Select + - Sensor - Switch ha_iot_class: Local Push ha_release: 0.25 @@ -12,8 +14,9 @@ ha_domain: flux_led ha_platforms: - button - light - - select - number + - select + - sensor - switch ha_codeowners: - '@icemanch' From cc61353a7cd57d2bd865618cde4c63abaf792bbd Mon Sep 17 00:00:00 2001 From: Simon Hansen <67142049+DurgNomis-drol@users.noreply.github.com> Date: Sat, 8 Jan 2022 11:47:50 +0100 Subject: [PATCH 113/247] Update docs for refactored launch library (#20782) --- source/_integrations/launch_library.markdown | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/source/_integrations/launch_library.markdown b/source/_integrations/launch_library.markdown index 0b8e8346f3a..41afe10ae53 100644 --- a/source/_integrations/launch_library.markdown +++ b/source/_integrations/launch_library.markdown @@ -7,6 +7,7 @@ ha_iot_class: Cloud Polling ha_release: 0.83 ha_codeowners: - '@ludeeus' + - '@DurgNomis-drol' ha_domain: launch_library ha_platforms: - sensor @@ -14,23 +15,9 @@ ha_platforms: The `launch_library` sensor will provide you with information about the next planned space launch. -## Configuration - -Add the data to your `configuration.yaml` file as shown in the example: - -```yaml -# Example configuration.yaml entry -sensor: - - platform: launch_library -``` - -{% configuration %} -name: - description: Name of the sensor. - required: false - type: string -{% endconfiguration %} +{% include integrations/config_flow.md %} The data this platform presents comes from [launchlibrary.net][launchlibrary]. [launchlibrary]: https://launchlibrary.net/ + From 9adeb6e592634a0fdef6b01e42964e104e9c9d01 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sat, 8 Jan 2022 01:51:32 -1000 Subject: [PATCH 114/247] Add SenseME integration (#20906) --- source/_integrations/senseme.markdown | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 source/_integrations/senseme.markdown diff --git a/source/_integrations/senseme.markdown b/source/_integrations/senseme.markdown new file mode 100644 index 00000000000..834197f4545 --- /dev/null +++ b/source/_integrations/senseme.markdown @@ -0,0 +1,25 @@ +--- +title: SenseME +description: Instructions on how to integrate SenseME devices into Home Assistant. +ha_category: + - Fan +ha_release: 2022.2 +ha_iot_class: Local Push +ha_codeowners: + - '@mikelawrence' + - '@bdraco' +ha_domain: senseme +ha_config_flow: true +ha_platforms: + - fan +--- + +Integrates SenseME devices into Home Assistant. + +The SenseME integration supports devices that speak the [SenseME](https://www.bigassfans.com/senseme/) protocol. + +### Supported devices + +- Haiku Fans with SenseME + +{% include integrations/config_flow.md %} From 97b1b3225eb3cb6dee49b064d905397c097d848b Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sat, 8 Jan 2022 02:21:39 -1000 Subject: [PATCH 115/247] Add sensor platform to steamist (#21094) --- source/_integrations/steamist.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_integrations/steamist.markdown b/source/_integrations/steamist.markdown index b2156976087..fa8014dfbe6 100644 --- a/source/_integrations/steamist.markdown +++ b/source/_integrations/steamist.markdown @@ -2,6 +2,7 @@ title: Steamist description: Documentation about Steamist steam showers. ha_category: + - Sensor - Switch ha_iot_class: Local Polling ha_release: 2022.2 @@ -10,6 +11,7 @@ ha_codeowners: - '@bdraco' ha_domain: steamist ha_platforms: + - sensor - switch --- From 48774cc9e0364ce10b5c3b30b7ee55429890b633 Mon Sep 17 00:00:00 2001 From: Christopher Bailey Date: Sat, 8 Jan 2022 18:52:00 -0500 Subject: [PATCH 116/247] Add UniFi Protect camera motion and ThumbnailProxyView docs (#21104) Co-authored-by: J. Nick Koston --- source/_integrations/unifiprotect.markdown | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/_integrations/unifiprotect.markdown b/source/_integrations/unifiprotect.markdown index fb03dc0c8d5..b1bbc0f5fec 100644 --- a/source/_integrations/unifiprotect.markdown +++ b/source/_integrations/unifiprotect.markdown @@ -116,7 +116,9 @@ Each UniFi Protect camera will get the following entities added: * **Privacy Mode** - If your camera allows for Privacy Masks, there will be a configuration switch to toggle a "Privacy Mode" that disables recording, microphone, and a black privacy zone over the whole camera. * **System Sounds** - If your camera has a speaker, there will be a configuration switch to toggle system sounds. * **SSH Enabled** - A disabled by default switch entity will be added to let you toggle on and off SSH for your camera. Username is `ubnt` and password is your Device Password as configured in UniFi Protect. -* **Sensors** - Sensors are provided for data provided from the camera device. Sensors include "Is Dark" and "Doorbell Chime" (if camera has a chime). Several diagnostics sensors are added including sensors on uptime, network connection stats, and storage stats. Doorbells will also have a "Voltage" sensor for troubleshooting electrical issues. +* **Sensors** - Sensors include "Is Dark", "Motion Detected", "Detected Object" (if the camera supports smart detections), and "Doorbell Chime" (if the camera has a chime). Several diagnostics sensors are added including sensors on uptime, network connection stats, and storage stats. Doorbells will also have a "Voltage" sensor for troubleshooting electrical issues. + * Motion and Detected Object sensors will also contain an `event_thumbnail` attribute that can be used to get the event thumbnail directly from UniFi Protect for that motion or smart detection. + * The Detected Object sensor will have the values of "none", "person", or "vehicle" based on object UniFi Protect detected. * **Button** - A disabled by default button entity is added for each camera device. The button will let you reboot your camera device. ### Floodlights From 57fcf4da5306ee34ccd41f1589e4dfb8cc03f1e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Hjelseth=20H=C3=B8yer?= Date: Sun, 9 Jan 2022 17:19:48 +0100 Subject: [PATCH 117/247] Tibber cost statistics (#21083) * Update tibber.markdown * Update tibber.markdown --- source/_integrations/tibber.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/tibber.markdown b/source/_integrations/tibber.markdown index dea715f8241..d3e7fd71dd1 100644 --- a/source/_integrations/tibber.markdown +++ b/source/_integrations/tibber.markdown @@ -18,7 +18,7 @@ ha_platforms: --- The `tibber` integration provides a sensor with the current electricity price if you are a [Tibber](https://tibber.com/) customer. -If you have a [Tibber Pulse](https://norge.tibber.com/products/pulse/) or [Watty](https://tibber.com/se/store/produkt/watty-smart-energimatare) it will also show the electricity consumption in real-time. If you do not have a real-time meter, you get a sensor for monthly consumption, monthly cost, and monthly peak hour updated once per day. Once a day a statistics with hourly consumption data is generated that can be used in the [Energy Dashboard](/docs/energy/). (The id is `tibber:energy_consumption_HOMEID` ) +If you have a [Tibber Pulse](https://norge.tibber.com/products/pulse/) or [Watty](https://tibber.com/se/store/produkt/watty-smart-energimatare) it will also show the electricity consumption in real-time. If you do not have a real-time meter, you get a sensor for monthly consumption, monthly cost, and monthly peak hour updated once per day. Once a day a statistics with hourly consumption and cost data is generated that can be used in the [Energy Dashboard](/docs/energy/). (The ids are `tibber:energy_consumption_HOMEID` and `tibber:energy_totalcost_HOMEID` ) There is currently support for the following device types within Home Assistant: From d322e974d1643112be2ccdd3abf52b447219f793 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 9 Jan 2022 10:11:40 -1000 Subject: [PATCH 118/247] Add binary sensor platform to SenseME (#21105) --- source/_integrations/senseme.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_integrations/senseme.markdown b/source/_integrations/senseme.markdown index 834197f4545..07b2332a4a2 100644 --- a/source/_integrations/senseme.markdown +++ b/source/_integrations/senseme.markdown @@ -2,6 +2,7 @@ title: SenseME description: Instructions on how to integrate SenseME devices into Home Assistant. ha_category: + - Binary Sensor - Fan ha_release: 2022.2 ha_iot_class: Local Push @@ -11,6 +12,7 @@ ha_codeowners: ha_domain: senseme ha_config_flow: true ha_platforms: + - binary_sensor - fan --- From 3cd93c3c9dfe1e67d043154ab58b6a9b0efe972b Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 9 Jan 2022 22:24:24 -1000 Subject: [PATCH 119/247] Update steamist for discovery support (#21115) --- source/_integrations/steamist.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_integrations/steamist.markdown b/source/_integrations/steamist.markdown index fa8014dfbe6..2ab073a545c 100644 --- a/source/_integrations/steamist.markdown +++ b/source/_integrations/steamist.markdown @@ -9,6 +9,7 @@ ha_release: 2022.2 ha_config_flow: true ha_codeowners: - '@bdraco' +ha_dhcp: true ha_domain: steamist ha_platforms: - sensor From 1d9a3f41f2f5a15a4e04c46d8bcf78f875140d5e Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 9 Jan 2022 22:43:03 -1000 Subject: [PATCH 120/247] Add switch platform to SenseME (#21116) --- source/_integrations/senseme.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_integrations/senseme.markdown b/source/_integrations/senseme.markdown index 07b2332a4a2..4c949d80586 100644 --- a/source/_integrations/senseme.markdown +++ b/source/_integrations/senseme.markdown @@ -4,6 +4,7 @@ description: Instructions on how to integrate SenseME devices into Home Assistan ha_category: - Binary Sensor - Fan + - Switch ha_release: 2022.2 ha_iot_class: Local Push ha_codeowners: @@ -14,6 +15,7 @@ ha_config_flow: true ha_platforms: - binary_sensor - fan + - switch --- Integrates SenseME devices into Home Assistant. From 26a1714b1a9d8aff0a6b8b5382df4c701a3f5a54 Mon Sep 17 00:00:00 2001 From: Petro31 <35082313+Petro31@users.noreply.github.com> Date: Mon, 10 Jan 2022 07:01:52 -0500 Subject: [PATCH 121/247] Add is_number test (#21110) --- .../_docs/configuration/templating.markdown | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/source/_docs/configuration/templating.markdown b/source/_docs/configuration/templating.markdown index 60eed9e7316..4e69c06e69e 100644 --- a/source/_docs/configuration/templating.markdown +++ b/source/_docs/configuration/templating.markdown @@ -208,6 +208,28 @@ The same thing can also be expressed as a filter: {% endraw %} +{% raw %} + +```text +{% for energy in expand('group.energy_sensors') if is_number(energy.state) %} + {{ energy.state }} + {%- if not loop.last %}, {% endif -%} +{% endfor %} +``` + +{% endraw %} + +The same thing can also be expressed as a test: + +{% raw %} + +```text +{{ expand('group.energy_sensors') + | selectattr("state", 'is_number') | join(', ') }} +``` + +{% endraw %} + ### Devices - `device_entities(device_id)` returns a list of entities that are associated with a given device ID. Can also be used as a filter. From a2611da1eb9a0ab03739b505eb367e66958c1e4a Mon Sep 17 00:00:00 2001 From: Gunnar Klauberg Date: Mon, 10 Jan 2022 13:08:52 +0100 Subject: [PATCH 122/247] add documentation note for Q3D support in dsmr nxt (#21113) --- source/_integrations/dsmr.markdown | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/_integrations/dsmr.markdown b/source/_integrations/dsmr.markdown index 410611dd61a..3572534ba1d 100644 --- a/source/_integrations/dsmr.markdown +++ b/source/_integrations/dsmr.markdown @@ -17,7 +17,7 @@ ha_platforms: A sensor platform for Belgian, Dutch, Luxembourg and Swedish Smart Meters which comply to DSMR (Dutch Smart Meter Requirements), also known as 'Slimme meter' or 'P1 poort'. Swedish meters with a 'HAN port' are not supported by this integration. -- Currently support DSMR V2.2, V3, V4, V5, Belgian V5 variant, Luxembourg V5 variant (Smarty) and the Swedish V5 variant through the [dsmr_parser](https://github.com/ndokter/dsmr_parser) module by Nigel Dokter. +- Currently support DSMR V2.2, V3, V4, V5, Belgian V5 variant, Luxembourg V5 variant (Smarty), Swedish V5 variant and the EasyMeter Q3D (Germany) through the [dsmr_parser](https://github.com/ndokter/dsmr_parser) module by Nigel Dokter. - For official information about DSMR refer to: [DSMR Document](https://www.netbeheernederland.nl/dossiers/slimme-meter-15) - For official information about the P1 port refer to: [P1 Companion Standard](https://www.netbeheernederland.nl/_upload/Files/Slimme_meter_15_a727fce1f1.pdf) - For unofficial hardware connection examples refer to: [Domoticx](http://domoticx.com/p1-poort-slimme-meter-hardware/) @@ -33,6 +33,7 @@ A sensor platform for Belgian, Dutch, Luxembourg and Swedish Smart Meters which - For Dutch meters, choose DSMR version `2.2`, `4`, or `5` - For Luxembourg meters, choose DSMR version `5L` - For Swedish meters, choose DSMR version `5S` +- For EasyMeter Q3D, choose DSMR version `Q3D` ### Options @@ -59,6 +60,7 @@ This integration is known to work for: - Sagemcom XS210 ESMR5 - Sagemcom T211 - Ziv E0058 ESMR5 +- EasyMeter Q3D ### Connecting to the meter @@ -80,6 +82,7 @@ $ docker run --device /dev/ttyUSB0:/dev/ttyUSB0 -d --name="home-assistant" -v /h #### Serial to network proxies: - [ser2net](http://ser2net.sourceforge.net) +- [WIZnet WIZ110SR](https://www.wiznet.io/product-item/wiz110sr/) DIY solutions (ESP8266 based): From c15891f3cf0bf12f4a7017a7bea14008423cefc6 Mon Sep 17 00:00:00 2001 From: Ryan Fleming Date: Mon, 10 Jan 2022 07:15:44 -0500 Subject: [PATCH 123/247] Add configuration section to octoprint (#20323) --- .vscode/cSpell.json | 1 + source/_integrations/octoprint.markdown | 31 +++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/.vscode/cSpell.json b/.vscode/cSpell.json index 5425d0788b8..20a38be803c 100644 --- a/.vscode/cSpell.json +++ b/.vscode/cSpell.json @@ -57,6 +57,7 @@ "nginx", "Nijhof", "Nmap", + "OctoPrint", "ohmconnect", "Onkyo", "OpenZWave", diff --git a/source/_integrations/octoprint.markdown b/source/_integrations/octoprint.markdown index c82067b6053..7974b449abf 100644 --- a/source/_integrations/octoprint.markdown +++ b/source/_integrations/octoprint.markdown @@ -21,6 +21,37 @@ ha_platforms: {% include integrations/config_flow.md %} +{% configuration_basic %} +username: + description: Username for the server. + required: true + type: string +host: + description: Address of the server, e.g., 192.168.1.32. + required: true + type: string +port: + description: Port of the server. + required: false + type: string + default: 80 +path: + description: URL path of the server + required: false + type: string + default: / +ssl: + description: Whether to use SSL or not when communicating. + required: false + type: boolean + default: false +verify ssl: + description: Should the SSL certificate be validated. + required: false + type: boolean + default: false +{% endconfiguration_basic %} + ### API Key For the integration to work, please check that the plugin Discovery is enabled. The Octoprint integration will attempt to register itself via the [application keys plugin](https://docs.octoprint.org/en/master/bundledplugins/appkeys.html). After submitting the configuration UI in Home Assistant, open the Octoprint UI and click allow on the prompt. From 9492117316387750d76fba2965dc9721682cb0b5 Mon Sep 17 00:00:00 2001 From: jjlawren Date: Mon, 10 Jan 2022 09:04:48 -0600 Subject: [PATCH 124/247] Add Audio Delay entity note to Sonos (#21134) --- source/_integrations/sonos.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/sonos.markdown b/source/_integrations/sonos.markdown index 2a1f1b47696..2cdea4e003e 100644 --- a/source/_integrations/sonos.markdown +++ b/source/_integrations/sonos.markdown @@ -33,7 +33,7 @@ Speaker-level controls are exposed as `number` or `switch` entities. Additionall ### Controllable features - **All devices**: Alarms, Bass, Treble, Crossfade, Status Light, Touch Controls -- **Home theater devices**: Night Sound, Speech Enhancement, Surround Enabled +- **Home theater devices**: Audio Delay (aka "Lip Sync"), Night Sound, Speech Enhancement, Surround Enabled - **When paired with a sub**: Subwoofer Enabled ### Sensors From 674b1267eae23424f50856a1714ea8c05579c61f Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Mon, 10 Jan 2022 20:22:06 +0100 Subject: [PATCH 125/247] Remove ee_brightbox integration (#21136) --- source/_integrations/ee_brightbox.markdown | 48 ---------------------- source/_redirects | 5 ++- 2 files changed, 3 insertions(+), 50 deletions(-) delete mode 100644 source/_integrations/ee_brightbox.markdown diff --git a/source/_integrations/ee_brightbox.markdown b/source/_integrations/ee_brightbox.markdown deleted file mode 100644 index 62bda8d0f8f..00000000000 --- a/source/_integrations/ee_brightbox.markdown +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: EE Bright Box -description: Instructions on how to integrate EE Bright Box router into Home Assistant. -ha_category: - - Presence Detection -ha_release: 0.87 -ha_iot_class: Local Polling -ha_domain: ee_brightbox -ha_platforms: - - device_tracker ---- - -This platform offers presence detection by looking at connected devices to a [EE Bright Box 2](https://ee.co.uk/help/phones-and-device/home-broadband/bright-box-2-wireless-router/bright-box-2-wireless-router) router. - -## Configuration - -To use a EE Bright Box router in your installation, add the following to your `configuration.yaml` file: - -```yaml -# Example configuration.yaml entry -device_tracker: - - platform: ee_brightbox - password: router-admin-password -``` - -{% configuration %} -host: - description: The IP address of your router - default: 192.168.1.1 - required: false - type: string -username: - description: Found at the back of the router in 'Router login details' section - default: admin - required: false - type: string -password: - description: Found at the back of the router in 'Router login details' section - required: true - type: string -version: - description: Currently only version 2 of the router is supported - default: 2 - required: false - type: string -{% endconfiguration %} - -See the [device tracker integration page](/integrations/device_tracker/) for instructions on how to configure the people to be tracked. diff --git a/source/_redirects b/source/_redirects index faaa68cf69c..2634a6cab36 100644 --- a/source/_redirects +++ b/source/_redirects @@ -333,7 +333,6 @@ /components/device_tracker.bt_smarthub /integrations/bt_smarthub /components/device_tracker.cisco_ios /integrations/cisco_ios /components/device_tracker.ddwrt /integrations/ddwrt -/components/device_tracker.ee_brightbox /integrations/ee_brightbox /components/device_tracker.freebox /integrations/freebox /components/device_tracker.fritz /integrations/fritz /components/device_tracker.geofency /integrations/geofency @@ -1272,7 +1271,6 @@ /components/ecovacs /integrations/ecovacs /components/eddystone_temperature /integrations/eddystone_temperature /components/edimax /integrations/edimax -/components/ee_brightbox /integrations/ee_brightbox /components/efergy /integrations/efergy /components/egardia /integrations/egardia /components/eight_sleep /integrations/eight_sleep @@ -2355,3 +2353,6 @@ /components/sensor.arduino /more-info/removed-integration 301 /components/switch.arduino /more-info/removed-integration 301 /integrations/arduino /more-info/removed-integration 301 +/components/device_tracker.ee_brightbox /more-info/removed-integration 301 +/components/ee_brightbox /more-info/removed-integration 301 +/integrations/ee_brightbox /more-info/removed-integration 301 From 294f406c842067cfc2d3bb1e6f00bb2dcf64782c Mon Sep 17 00:00:00 2001 From: Christopher Bailey Date: Mon, 10 Jan 2022 16:05:01 -0500 Subject: [PATCH 126/247] Add UniFi Protect global service docs (#21119) --- source/_integrations/unifiprotect.markdown | 37 +++++++++++++++++++--- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/source/_integrations/unifiprotect.markdown b/source/_integrations/unifiprotect.markdown index b1bbc0f5fec..79fbf83fee7 100644 --- a/source/_integrations/unifiprotect.markdown +++ b/source/_integrations/unifiprotect.markdown @@ -160,15 +160,42 @@ Your main UniFi Protect NVR device also gets a number of diagnostics sensors tha ## Services -### Service unifiprotect.set_doorbell_message +### Service unifiprotect.set_default_doorbell_text -Use to dynamically set the message on a Doorbell LCD screen. This service should only be used to set dynamic messages (i.e. setting the current outdoor temperature on your Doorbell). +Sets the default doorbell message. This will be the message that is automatically selected when a message "expires". | Service data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------------------------------------------------ | -| `entity_id` | No | The Doorbell Text select entity for your Doorbell | -| `message` | No | The message you would like to display on the LCD screen of your Doorbell. Must be less than 30 characters | -| `duration` | Yes | Number of minutes to display the message for before returning to the default message | +| `device_id` | No | Any device from the UniFi Protect instance you want to change. In case you have multiple Protect Instances. | +| `message` | No | The default message for your Doorbell. Must be less than 30 characters. | + +### Service unifiprotect.add_doorbell_text + +Adds a new custom message for Doorbells. + +| Service data attribute | Optional | Description | +| ---------------------- | -------- | ------------------------------------------------------------------------------------------------------------ | +| `device_id` | No | Any device from the UniFi Protect instance you want to change. In case you have multiple Protect Instances. | +| `message` | No | New custom message to add for Doorbells. Must be less than 30 characters. | + +### Service unifiprotect.remove_doorbell_text + +Removes an existing message for Doorbells. + +| Service data attribute | Optional | Description | +| ---------------------- | -------- | ------------------------------------------------------------------------------------------------------------ | +| `device_id` | No | Any device from the UniFi Protect instance you want to change. In case you have multiple Protect Instances. | +| `message` | No | Existing custom message to remove for Doorbells. | + +### Service unifiprotect.set_doorbell_message + +Use to dynamically set the message on a Doorbell LCD screen. This service should only be used to set dynamic messages (i.e. setting the current outdoor temperature on your Doorbell). Static messages should still be set using the Select entity and can be added/removed using the `add_doorbell_text`/`remove_doorbell_text` services. + +| Service data attribute | Optional | Description | +| ---------------------- | -------- | ------------------------------------------------------------------------------------------------------------ | +| `entity_id` | No | The Doorbell Text select entity for your Doorbell. | +| `message` | No | The message you would like to display on the LCD screen of your Doorbell. Must be less than 30 characters. | +| `duration` | Yes | Number of minutes to display the message for before returning to the default message. The default is to not expire. | ## Troubleshooting From c7de991225fc1f8eab49d8888caf60d263e2cad6 Mon Sep 17 00:00:00 2001 From: Christopher Bailey Date: Mon, 10 Jan 2022 18:32:31 -0500 Subject: [PATCH 127/247] Followup cleanup of docs about added features for UniFi Protect (#20990) Co-authored-by: J. Nick Koston --- source/_integrations/unifiprotect.markdown | 77 +++++++++------------- 1 file changed, 30 insertions(+), 47 deletions(-) diff --git a/source/_integrations/unifiprotect.markdown b/source/_integrations/unifiprotect.markdown index 79fbf83fee7..0592fa51b4a 100644 --- a/source/_integrations/unifiprotect.markdown +++ b/source/_integrations/unifiprotect.markdown @@ -66,8 +66,6 @@ You will need a local user created in your UniFi OS Console to log in with. Ubiq * CONTROLLER PERMISSIONS - Under UniFi Protect, select Administrators. **NOTE**: Other roles may work, but only the default Administrators rule is fully tested. 1. Click *Add* in at the bottom Right. -**HINT**: A few users have reported that they had to restart their UDMP device after creating the local user for it to work. So if you get some kind of *Error 500* when setting up the Integration, try restart the UDMP. - ![ADMIN_UNIFIOS](/images/integrations/unifiprotect/unifi_os_admin.png) ### Camera Streams @@ -85,71 +83,54 @@ The Integration uses the RTSP(S) Streams as the Live Feed source, so this needs All known UniFi Protect devices are should be supported. Each UniFi Protect device will get a variety of entities added for each of the different entity platforms. -### Cameras +### UniFi Protect Cameras -#### Smart Detections +
-A clarification about "Smart Detections" below and which cameras have them. The following cameras have Smart Detections: +**Smart Detections**: The following cameras have Smart Detections: * All "AI" series cameras. This includes the AI 360 and the AI Bullet. * All "G4" series cameras _except_ the G4 Instant. This includes the G4 Doorbell, G4 Bullet and G4 Pro. G3 Series cameras do _not_ have Smart detections. -#### Entities +
-Each UniFi Protect camera will get the following entities added: +Each UniFi Protect camera will get a device in Home Assistant with the following: -* **Camera** - A camera entity for each camera channel and RTSP(S) combination found for each camera (up to 6). Only the highest resolution RTSPS camera entity will be enabled by default. -* **Media Player** - If your camera has a speaker, you will get a media player entity that allows you to play audio to your camera's speaker. Any audio file URI that is playable by FFmpeg will be able to be played to your speaker, including via the [TTS Say Service](https://www.home-assistant.io/integrations/tts/#service-say). -* **Number** - The following number entities will be added for each camera: - * **Chime Duration** - If your camera has a chime (doorbell), a configuration number entity will be added to adjust the chime duration of your doorbell chime. - * **Zoom Level** - If your camera has optical zoom, a configuration number entity will be added to adjust the zoom level. - * **Microphone Level** - If your camera has a microphone, a configuration number entity will be added to adjust the camera's microphone sensitivity. - * **WDR Level** - If your camera does not have HDR, a configuration number entity will be added to adjust the WDR level. -* **Switch** - The following switch entities will be added for each camera: - * **Overlay (Show Name, Show Date, Show Logo, Show Bitrate)** - 4 configuration switches will be added to configuration the Overlay Information on your camera's video feed. - * **Smart Detections (Person, Vehicle)** - If your camera has smart detections, there will be a switch added for each smart detection type to enable or disable that type. - * **Status Light** - If your camera has a status light, there will be a configuration switch to turn it on and off. - * **HDR Mode** - If your camera has HDR, there will be a configuration switch to turn it on and off. - * **High FPS** - If your camera has a "High FPS" mode, there will be a configuration switch to toggle between Default and High FPS mode. - * **Privacy Mode** - If your camera allows for Privacy Masks, there will be a configuration switch to toggle a "Privacy Mode" that disables recording, microphone, and a black privacy zone over the whole camera. - * **System Sounds** - If your camera has a speaker, there will be a configuration switch to toggle system sounds. - * **SSH Enabled** - A disabled by default switch entity will be added to let you toggle on and off SSH for your camera. Username is `ubnt` and password is your Device Password as configured in UniFi Protect. +* **Camera** - A camera for each camera channel and RTSP(S) combination found for each camera (up to 6). Only the highest resolution RTSPS camera entity will be enabled by default. +* **Media Player** - If your camera has a speaker, you will get a media player entity that allows you to play audio to your camera's speaker. Any audio file URI that is playable by FFmpeg will be able to be played to your speaker, including via the [TTS Say Service](/integrations/tts/#service-say). +* **Privacy Mode** - If your camera allows for Privacy Masks, there will be a configuration switch to toggle a "Privacy Mode" that disables recording, microphone, and a black privacy zone over the whole camera. * **Sensors** - Sensors include "Is Dark", "Motion Detected", "Detected Object" (if the camera supports smart detections), and "Doorbell Chime" (if the camera has a chime). Several diagnostics sensors are added including sensors on uptime, network connection stats, and storage stats. Doorbells will also have a "Voltage" sensor for troubleshooting electrical issues. * Motion and Detected Object sensors will also contain an `event_thumbnail` attribute that can be used to get the event thumbnail directly from UniFi Protect for that motion or smart detection. * The Detected Object sensor will have the values of "none", "person", or "vehicle" based on object UniFi Protect detected. -* **Button** - A disabled by default button entity is added for each camera device. The button will let you reboot your camera device. +* **Device Configuration** - Cameras will get various configuration controls based on the features available to the camera. Currently provided configuration controls: + * configuration sliders for Chime Duration, Zoom Level, Microphone Sensitivity, and WDR Level + * configuration switches Overlay Information, Smart Detections types, Status Light, HDR, High FPS mode, System Sounds. +* **Button** - A disabled by default button is added for each camera device. The button will let you reboot your camera device. -### Floodlights +### UniFi Protect Floodlights -Each UniFi Protect floodlight will get the following entities added: +Each UniFi Protect floodlight will get a device in Home Assistant with the following: * **Light** - A light entity will be added for each floodlight device. The light entity will let you control turning on or off your light as well as adjust the brightness of your floodlight. -* **Number** - The following number entities will be added for each floodlight: - * **Motion Sensitivity** - A configuration number entity to adjust the sensitivity of the PIR sensor for your floodlight. - * **Auto-shutoff Duration** - A configuration number entity to adjust the the auto-shutoff timer after motion is detected. -* **Switch** - The following switch entities will be added for each floodlight: - * **Status Light** - A configuration switch to turn it on and off to turn on and off the status light for your floodlight. - * **SSH Enabled** - A disabled by default switch entity will be added to let you toggle on and off SSH for your floodlight. Username is `ubnt` and password is your Device Password as configured in UniFi Protect. * **Sensors** - Sensors are provided for data provided from floodlight devices. Sensors include "Is Dark" and "Motion Detected". -* **Button** - A disabled by default button entity is added for each floodlight device. The button will let you reboot your floodlight device. +* **Device Configuration** - Floodlights will get configuration controls for the PIR Motion Sensitivity, the Auto-shutoff Duration after detected motion, Status Light switch, and SSH status. +* **Button** - A disabled by default button is added for each floodlight device. The button will let you reboot your floodlight device. -### Sensors +### UniFi Protect Smart Sensors -Each UniFi Protect smart sensor will get the following entities added: +Each UniFi Protect smart sensor will get a device in Home Assistant with the following: * **Sensors** - Sensors are provided for data provided from smart sensor devices. Sensors include "Door", "Motion Detected" and "Battery Low". -* **Button** - A disabled by default button entity is added for each sensor device. The button will let you reboot your sensor device. -* **Switch** - A disabled by default switch entity will be added to let you toggle on and off SSH for your sensor. Username is `ubnt` and password is your Device Password as configured in UniFi Protect. +* **Button** - A disabled by default button is added for each smart sensor device. The button will let you reboot your smart sensor device. -### Viewports +### UniFi Protect Viewers -Each UniFi Protect viewport will get the following entities added: +Each UniFi Protect viewer will get a device in Home Assistant with the following: -* **Liveview Select** - A select control will be added for each viewport device that will allow you to select which liveview is being displayed on the viewport. -* **Button** - A disabled by default button entity is added for each viewport device. The button will let you reboot your viewport device. -* **Switch** - A disabled by default switch entity will be added to let you toggle on and off SSH for your viewport. Username is `ubnt` and password is your Device Password as configured in UniFi Protect. +* **Liveview Select** - A select control will be added for each viewer device that will allow you to select which liveview is being displayed on the viewer. +* **Button** - A disabled by default button is added for each viewer device. The button will let you reboot your viewer device. ### NVR @@ -201,7 +182,7 @@ Use to dynamically set the message on a Doorbell LCD screen. This service should ### Enabling Debug Logging -Both the UniFi Protect integration and the Python library it uses provide a ton of debug logging that can help you with troubleshooting connectivity issues. To enable debug logging for both, add the following to your `configuration.yaml` file: +Both the UniFi Protect integration and the Python library it uses provide debug logging that can help you with troubleshooting connectivity issues. To enable debug logging for both, add the following to your `configuration.yaml` file: ```yaml logger: @@ -214,20 +195,22 @@ logger: The default settings on the stream integration will give you a 5-15+ second delay. You can reduce this delay to 1-3 seconds, by enabling [LL-HLS in the stream integration](/integrations/stream/#ll-hls). You will also want to put an HTTP/2 reserve proxy in front of Home Assistant so you can have connection pooling. If you do not add a reverse proxy, you may start to get "Waiting for Websocket..." messages while trying to view too many camera streams at once. One way to do this is using the official NGINX Proxy Add-on: -[![NGINX Proxy Add-on](https://my.home-assistant.io/badges/supervisor_addon.svg)](https://my.home-assistant.io/redirect/supervisor_addon/?addon=core_nginx_proxy) +{% my supervisor_addon addon="core_nginx_proxy" badge %} ### Cannot Play Audio to Speakers Unlike with many other things, playing audio to your speakers requires your Home Assistant to be able to reach your camera directly. Specifically via port `tcp/7004`. You can [enable debug logging](#enabling-debug-logging) and it will output the full FFmpeg command that will be run and the output from FFmpeg to help you troubleshoot why audio is not playing to the device. -### Liveview Options for Viewport Missing Options or Out of Date +### Liveview Options for Viewer Missing Options or Out of Date -Main control selects currently cannot have dynamic options since the options are exported out to voice assistants. After you add/remove/change a Liveview in UniFi Protect, you must restart Home Assistant to get the new options for your Viewport. +Main control selects currently cannot have dynamic options since the options are exported out to voice assistants. After you add/remove/change a Liveview in UniFi Protect, you must restart Home Assistant to get the new options for your Viewer. -### NvrErrors with "404 - Reason: Not Found" +### NvrErrors with "404 - Reason: Not Found" or "502 - Reason: Bad Gateway" If you get errors while authenticating or fetching data for `NvrError... 404 - Reason: Not Found`, there is a good chance that your UniFi Protect application has crashed. UniFi Protect runs in a supervised way on UniFi OS (similar to Home Assistant OS + Home Assistant Core). Getting a 404 for a URL that should not produce a 404 means UniFi Protect is probably not running. You may want to check the health of your disks or look into debugging UniFi Protect to see why it is crashing. +Similarly, a `502 Bad Gateway` also means that your UniFi Protect application may not be running. + ```log pyunifiprotect.NvrError: Fetching Camera List failed: 404 - Reason: Not Found ``` From 30db4f8dc27b22d42b1a7f1530a0d6b7d197e33f Mon Sep 17 00:00:00 2001 From: Duco Sebel <74970928+DCSBL@users.noreply.github.com> Date: Tue, 11 Jan 2022 01:37:01 +0100 Subject: [PATCH 128/247] Add HomeWizard Energy documentation page (#20939) Co-authored-by: Paulus Schoutsen Co-authored-by: Klaas Schoute --- source/_integrations/homewizard.markdown | 54 ++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 source/_integrations/homewizard.markdown diff --git a/source/_integrations/homewizard.markdown b/source/_integrations/homewizard.markdown new file mode 100644 index 00000000000..bae3cbdf860 --- /dev/null +++ b/source/_integrations/homewizard.markdown @@ -0,0 +1,54 @@ +--- +title: HomeWizard Energy +description: Instructions on how to integrate HomeWizard Energy into Home Assistant. +ha_release: 2022.2 +ha_category: + - Energy +ha_iot_class: Local Polling +ha_config_flow: true +ha_domain: homewizard +ha_codeowners: + - '@DCSBL' +ha_platforms: + - sensor +ha_zeroconf: true +--- + +Integration for the [HomeWizard Energy](https://www.homewizard.nl/energy) platform. It can collect data locally from the HomeWizard Energy products and create them as sensors in Home Assistant. + +**Supported devices** + +- [Wifi P1 Meter](https://www.homewizard.nl/p1-meter): Depending on the connected DSMR meter: sensors for power import/export, energy consumption (single or three phases) and gas. (Model: `HWE-P1`) +- [Wifi Energy Socket](https://www.homewizard.nl/energy-socket): Sensors for power import/export and energy consumption. (model: `HWE-SKT`) +- [Wifi kWh Meter](https://www.homewizard.nl/kwh-meter): Sensors for power import/export and energy consumption. (Models: `SDM230-wifi`, `SDM630-wifi`) + +## Enable the API + +You have to enable the local API to allow Home Assistant to communicate with your device. Do this in the HomeWizard Energy app: + + 1. Go to Settings. (Gear icon in the upper-right) + 2. Go to 'Meters'. + 3. Select your device. + 4. Scroll down and turn on 'Local API'. + +{% include integrations/config_flow.md %} + +## Sensors + +The HomeWizard Energy API only exposes properties that are used within the HomeWizard Energy app. The available properties are listed below. + +| Name | Unit | Availability | Description | +| --- | --- | --- | --- | +| Wifi SSID | | HWE-P1, SDM230-wifi, SDM630-wifi, HWE-SKT | The SSID of the connected network. | +| Wifi Strength | % | HWE-P1, SDM230-wifi, SDM630-wifi, HWE-SKT | Percentage of the wifi connection. | +| Total Energy Import_t1 | kWh | HWE-P1, SDM230-wifi, SDM630-wifi, HWE-SKT | Energy import reading. | +| Total Energy Import_t2 | kWh | HWE-P1 | Energy import reading for other tariff. | +| Total Energy Export_t1 | kWh | HWE-P1, SDM230-wifi, SDM630-wifi, HWE-SKT | Energy export reading. | +| Total Energy Export_t2 | kWh | HWE-P1 | Energy export reading for other tariff. | +| Active Power | w | HWE-P1, SDM230-wifi, SDM630-wifi, HWE-SKT | Active power usage. | +| Active Power_l1 | w | HWE-P1, SDM230-wifi, SDM630-wifi, HWE-SKT | Active power usage Line 1, for `SDM230-wifi` and`HWE-SKT` this value is the same as `Active Power`. | +| Active Power_l2 | w | HWE-P1, SDM630-wifi | Active power usage Line 2. | +| Active Power_l3 | w | HWE-P1, SDM630-wifi | Active power usage Line 3. | +| Total Gas | m3 | HWE-P1 | Current gas import reading, only available when your smart meter is connected to a gas meter. | +| DSMR Version | | HWE-P1 | The detected DSMR version. | +| Smart Meter Model | | HWE-P1 | The detected smart meter model. | From fc00454ce49606217a04879a5b0b489b9a1e33f3 Mon Sep 17 00:00:00 2001 From: Jonathan Keslin Date: Tue, 11 Jan 2022 00:19:07 -0800 Subject: [PATCH 129/247] Docs for exposing power & energy usage of VeSync outlets as separate sensors (#20699) --- source/_integrations/vesync.markdown | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/source/_integrations/vesync.markdown b/source/_integrations/vesync.markdown index 35349f8f316..43749fe82f9 100644 --- a/source/_integrations/vesync.markdown +++ b/source/_integrations/vesync.markdown @@ -17,6 +17,7 @@ ha_platforms: - fan - light - switch + - sensor --- The `vesync` integration enables you to control smart switches and outlets connected to the VeSync App. @@ -28,6 +29,7 @@ The following platforms are supported: - **light** - **switch** - **fan** +- **sensor** ## Supported Devices @@ -72,14 +74,22 @@ the configuration section below. |---------|-------------| | `update_devices` | Poll Vesync server to find and add any new devices | +## Power & Energy Sensors + +Many VeSync outlets support power & energy monitoring. These data are exposed as diagnostic sensor entities alongside the outlet +itself. Note that prior versions of the integration exposed these as state attributes on the outlet switch entity. + +| Sensor | Description | Example | +| --------------------------------------- | ------------------------------------------------------------------ | ------- | +| `sensor._current_power` | The present power consumption of the switch in watts | 7.89 | +| `sensor._energy_use_today` | The kilowatt hours used by the switch during the previous 24 hours | 0.12 | + ## Outlet Exposed Attributes VeSync outlets will expose the following details for only the smart outlets. Energy monitoring not available for in-wall switches. | Attribute | Description | Example | | ----------------------- | ----------------------------------------------------------------------- | --------------- | -| `current_power_w` | The present power consumption of the switch in watts. | 100 | -| `today_energy_kwh` | The kilowatt hours used by the switch during the previous 24 hours. | 0.12 | | `voltage` | Current voltage of the device | 120.32 | | `weekly_energy_total` | Total energy usage for week starting from Monday 12:01AM in kWh | 14.74 | | `monthly_energy_total` | Total energy usage for month starting from 12:01AM on the first in kWh | 52.30 | @@ -103,7 +113,7 @@ VeSync air purifiers will expose the following details depending on the features ## Extracting Attribute data -In order to get the attributes readings from supported devices, such as energy from outlets or fan attributes, you'll have to create a [template sensor](/integrations/template#state-based-template-sensors/). +In order to get the attributes readings from supported devices, such as voltage from outlets or fan attributes, you'll have to create a [template sensor](/integrations/template#state-based-template-sensors/). In the example below, change all of the `vesync_switch`'s to match your device's entity ID. @@ -114,12 +124,6 @@ Adapted from the [TP-Link integration](https://www.home-assistant.io/integration ```yaml template: - sensor: - - name: "Vesync current comsumption" - state: "{{ state_attr('switch.vesync_switch', 'current_power_w') | float(default=0) }}" - unit_of_measurement: "W" - - name: "Vesync total consumption" - state: "{{ state_attr('switch.vesync_switch', 'today_energy_kwh') | float(default=0) }}" - unit_of_measurement: "kWh" - name: "Vesync voltage" state: "{{ state_attr('switch.vesync_switch', 'voltage') | float(default=0) }}" unit_of_measurement: "V" From 8a2aa2aaac6bc2f2782fa0a5d44179535d4eb61e Mon Sep 17 00:00:00 2001 From: G Johansson Date: Wed, 12 Jan 2022 00:27:04 +0100 Subject: [PATCH 130/247] Implement lock to yale_smart_alarm (#21089) Co-authored-by: Franck Nijhof --- .../_integrations/yale_smart_alarm.markdown | 44 +++++++------------ 1 file changed, 17 insertions(+), 27 deletions(-) diff --git a/source/_integrations/yale_smart_alarm.markdown b/source/_integrations/yale_smart_alarm.markdown index d0a174a0164..4d963d91395 100644 --- a/source/_integrations/yale_smart_alarm.markdown +++ b/source/_integrations/yale_smart_alarm.markdown @@ -3,6 +3,7 @@ title: Yale Smart Living description: Instructions on how to integrate Yale Smart Alarms into Home Assistant. ha_category: - Alarm + - Lock ha_release: 0.78 ha_iot_class: Cloud Polling ha_config_flow: true @@ -11,38 +12,27 @@ ha_codeowners: ha_domain: yale_smart_alarm ha_platforms: - alarm_control_panel + - lock --- The Yale Smart Living integration provides connectivity with the Yale Smart Alarm systems and Smart Hub through Yale's API. -This platform supports the following services: `alarm_arm_away`, `alarm_arm_home` and `alarm_disarm`. -Currently only one alarm is supported. +There is currently support for the following device types within Home Assistant: + +- Alarm +- Lock {% include integrations/config_flow.md %} -## Automation example +## Alarm Control Panel -```yaml -automation: - - alias: "Alarm: Disarmed Daytime" - trigger: - platform: state - entity_id: alarm_control_panel.yale_smart_alarm - to: "disarmed" - condition: - condition: sun - before: sunset - action: - service: scene.turn_on - target: - entity_id: scene.OnDisarmedDaytime - - alias: "Alarm: Armed Away" - trigger: - platform: state - entity_id: alarm_control_panel.yale_smart_alarm - to: "armed_away" - action: - service: scene.turn_on - target: - entity_id: scene.OnArmedAway -``` +Services provided are `armed_away`, `armed_home`, and `disarmed`. + +No code is required to operate the alarm. + + +## Lock + +The lock platform requires a code for unlocking but no code for locking. + +The integration can be configured to provide a default code that is used if no code is supplied and the number of digits required. From c16c24e93c940fde989366fed3584d3c36563fa7 Mon Sep 17 00:00:00 2001 From: Christopher Bailey Date: Tue, 11 Jan 2022 20:44:41 -0500 Subject: [PATCH 131/247] Removes reference to `event_thumbnail` attribute for UniFi Protect (#21148) --- source/_integrations/unifiprotect.markdown | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/_integrations/unifiprotect.markdown b/source/_integrations/unifiprotect.markdown index 0592fa51b4a..919b38bd4d9 100644 --- a/source/_integrations/unifiprotect.markdown +++ b/source/_integrations/unifiprotect.markdown @@ -52,7 +52,7 @@ CKGP with Firmware v1.x **do NOT run UniFi OS**, you must upgrade to firmware v2 The absolute **minimal** software version is `1.20.0` for UniFi Protect. If you have an older version, you will get errors trying to set up the integration. However, the general advice is the latest 2 minor versions of UniFi Protect and hardware supported by those are supported. Since UniFi Protect has its own release cycle, you should only upgrade UniFi Protect _after_ the next Home Assistant release comes out to ensure the new version is fully supported. -Example: as of `2022.2.0` of Home Assistant, UniFi Protect `1.21.0-beta.2` is the newest UniFi Protect version. So the recommended versions of UniFi Protect to run for a `2022.2.0` version of Home Assistant are `1.20.0`, `1.20.1`, `1.20.2`, `1.20.3`, `1.21.0-beta.1`, or `1.21.0-beta.2`. +Example: as of `2022.2.0` of Home Assistant, UniFi Protect `1.21.0-beta.3` is the newest UniFi Protect version. So the recommended versions of UniFi Protect to run for a `2022.2.0` version of Home Assistant are `1.20.0`, `1.20.1`, `1.20.2`, `1.20.3`, `1.21.0-beta.1`, `1.21.0-beta.2`, and `1.21.0-beta.3`. ### Local User @@ -102,7 +102,6 @@ Each UniFi Protect camera will get a device in Home Assistant with the following * **Media Player** - If your camera has a speaker, you will get a media player entity that allows you to play audio to your camera's speaker. Any audio file URI that is playable by FFmpeg will be able to be played to your speaker, including via the [TTS Say Service](/integrations/tts/#service-say). * **Privacy Mode** - If your camera allows for Privacy Masks, there will be a configuration switch to toggle a "Privacy Mode" that disables recording, microphone, and a black privacy zone over the whole camera. * **Sensors** - Sensors include "Is Dark", "Motion Detected", "Detected Object" (if the camera supports smart detections), and "Doorbell Chime" (if the camera has a chime). Several diagnostics sensors are added including sensors on uptime, network connection stats, and storage stats. Doorbells will also have a "Voltage" sensor for troubleshooting electrical issues. - * Motion and Detected Object sensors will also contain an `event_thumbnail` attribute that can be used to get the event thumbnail directly from UniFi Protect for that motion or smart detection. * The Detected Object sensor will have the values of "none", "person", or "vehicle" based on object UniFi Protect detected. * **Device Configuration** - Cameras will get various configuration controls based on the features available to the camera. Currently provided configuration controls: * configuration sliders for Chime Duration, Zoom Level, Microphone Sensitivity, and WDR Level From 761b8916f581c8c54517bece993baf7ebfca02d8 Mon Sep 17 00:00:00 2001 From: Christopher Bailey Date: Wed, 12 Jan 2022 13:56:07 -0500 Subject: [PATCH 132/247] Replace Chime Duration with Chime Type (#21166) --- source/_integrations/unifiprotect.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/unifiprotect.markdown b/source/_integrations/unifiprotect.markdown index 919b38bd4d9..0628789ce99 100644 --- a/source/_integrations/unifiprotect.markdown +++ b/source/_integrations/unifiprotect.markdown @@ -104,7 +104,7 @@ Each UniFi Protect camera will get a device in Home Assistant with the following * **Sensors** - Sensors include "Is Dark", "Motion Detected", "Detected Object" (if the camera supports smart detections), and "Doorbell Chime" (if the camera has a chime). Several diagnostics sensors are added including sensors on uptime, network connection stats, and storage stats. Doorbells will also have a "Voltage" sensor for troubleshooting electrical issues. * The Detected Object sensor will have the values of "none", "person", or "vehicle" based on object UniFi Protect detected. * **Device Configuration** - Cameras will get various configuration controls based on the features available to the camera. Currently provided configuration controls: - * configuration sliders for Chime Duration, Zoom Level, Microphone Sensitivity, and WDR Level + * configuration sliders for Chime Type, Zoom Level, Microphone Sensitivity, and WDR Level * configuration switches Overlay Information, Smart Detections types, Status Light, HDR, High FPS mode, System Sounds. * **Button** - A disabled by default button is added for each camera device. The button will let you reboot your camera device. From f56a552b97b101426c2cfe1a73b6555e056adff1 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 12 Jan 2022 14:06:15 -1000 Subject: [PATCH 133/247] Add light platform to senseme (#21137) --- source/_integrations/senseme.markdown | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/_integrations/senseme.markdown b/source/_integrations/senseme.markdown index 4c949d80586..8579eaca57d 100644 --- a/source/_integrations/senseme.markdown +++ b/source/_integrations/senseme.markdown @@ -4,6 +4,7 @@ description: Instructions on how to integrate SenseME devices into Home Assistan ha_category: - Binary Sensor - Fan + - Light - Switch ha_release: 2022.2 ha_iot_class: Local Push @@ -15,6 +16,7 @@ ha_config_flow: true ha_platforms: - binary_sensor - fan + - light - switch --- @@ -25,5 +27,6 @@ The SenseME integration supports devices that speak the [SenseME](https://www.bi ### Supported devices - Haiku Fans with SenseME +- Haiku Lights with SenseME (discontinued) {% include integrations/config_flow.md %} From 92930f0be9d864419b91db905c7946a7c4287c83 Mon Sep 17 00:00:00 2001 From: Christopher Bailey Date: Thu, 13 Jan 2022 01:05:39 -0500 Subject: [PATCH 134/247] Add docs for UP Sense improvements for UniFi Protect (#21171) Co-authored-by: J. Nick Koston --- source/_integrations/unifiprotect.markdown | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/source/_integrations/unifiprotect.markdown b/source/_integrations/unifiprotect.markdown index 0628789ce99..f66e3eb4d18 100644 --- a/source/_integrations/unifiprotect.markdown +++ b/source/_integrations/unifiprotect.markdown @@ -114,14 +114,21 @@ Each UniFi Protect floodlight will get a device in Home Assistant with the follo * **Light** - A light entity will be added for each floodlight device. The light entity will let you control turning on or off your light as well as adjust the brightness of your floodlight. * **Sensors** - Sensors are provided for data provided from floodlight devices. Sensors include "Is Dark" and "Motion Detected". -* **Device Configuration** - Floodlights will get configuration controls for the PIR Motion Sensitivity, the Auto-shutoff Duration after detected motion, Status Light switch, and SSH status. +* **Device Configuration** - Floodlights will get configuration controls for the PIR Motion Sensitivity, the Auto-shutoff Duration after detected motion, and Status Light switch * **Button** - A disabled by default button is added for each floodlight device. The button will let you reboot your floodlight device. ### UniFi Protect Smart Sensors -Each UniFi Protect smart sensor will get a device in Home Assistant with the following: +Each UniFi Protect smart sensors are a bit different than normal sensors. They are a multi-sensor that can act as a contact sensor (door/window), a motion detector, a light level detector, a humidity sensor, a temperature level sensor, an alarm sound sensor, and/or a leak detector. Each sensor function can be enabled or disabled dynamically. Disabled sensors will be marked as "unavailable". -* **Sensors** - Sensors are provided for data provided from smart sensor devices. Sensors include "Door", "Motion Detected" and "Battery Low". +* **Sensors** - A sensor is provided for each major function of the smart sensor device: + * **Contact** - A contact sensor will be available if the mount type is set as "Door", "Window" or "Garage". + * **Motion Detection** - A motion detection sensor will be available if the mount type is not set to "Leak" and motion detection is enabled. + * **Light Level** - A light level sensor will be available if the mount type is not set to "Leak" and the light sensor is enabled. + * **Humidity** - A humidity sensor will be available if the mount type is not set to "Leak" and the humidity sensor is enabled. + * **Temperature** - A temperature sensor will be available if the mount type is not set to "Leak" and the temperature sensor is enabled. + * **Alarm Sound** - An alarm sensor will be available if the mount type is not set to "Leak" and the alarm sound sensor is enabled. The Alarm Sound sensor can have the values "none", "smoke" and "co". More values may be added over time automatically as UniFi Protect adds support for detecting more alarms. +* **Device Configuration** - Smart sensors will get configuration controls for the Status Light, enabling/disabling all of the main sensors, selecting the Paired Camera, and changing the Mount Type of the sensor. * **Button** - A disabled by default button is added for each smart sensor device. The button will let you reboot your smart sensor device. ### UniFi Protect Viewers From 97ac280f5445db23d4566e85a9091d873d80ef3b Mon Sep 17 00:00:00 2001 From: G Johansson Date: Thu, 13 Jan 2022 10:35:00 +0100 Subject: [PATCH 135/247] Implement binary sensor for yale_smart_alarm (#21155) Co-authored-by: Franck Nijhof --- source/_integrations/yale_smart_alarm.markdown | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/source/_integrations/yale_smart_alarm.markdown b/source/_integrations/yale_smart_alarm.markdown index 4d963d91395..64b3b31eb36 100644 --- a/source/_integrations/yale_smart_alarm.markdown +++ b/source/_integrations/yale_smart_alarm.markdown @@ -3,6 +3,7 @@ title: Yale Smart Living description: Instructions on how to integrate Yale Smart Alarms into Home Assistant. ha_category: - Alarm + - Binary Sensor - Lock ha_release: 0.78 ha_iot_class: Cloud Polling @@ -12,6 +13,7 @@ ha_codeowners: ha_domain: yale_smart_alarm ha_platforms: - alarm_control_panel + - binary_sensor - lock --- @@ -20,6 +22,7 @@ The Yale Smart Living integration provides connectivity with the Yale Smart Alar There is currently support for the following device types within Home Assistant: - Alarm +- Binary Sensor - Lock {% include integrations/config_flow.md %} @@ -30,6 +33,9 @@ Services provided are `armed_away`, `armed_home`, and `disarmed`. No code is required to operate the alarm. +## Binary Sensors + +Provides support for contact sensors for doors showing if door is open or closed. ## Lock From d7e40cd12c7410157618b179befa08befd575a79 Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Thu, 13 Jan 2022 12:10:09 -0600 Subject: [PATCH 136/247] Add content deeplinking support to roku (#21170) --- source/_integrations/roku.markdown | 41 +++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/source/_integrations/roku.markdown b/source/_integrations/roku.markdown index a7194c80bec..737391f582a 100644 --- a/source/_integrations/roku.markdown +++ b/source/_integrations/roku.markdown @@ -98,9 +98,6 @@ The API calls are like this: ```txt GET http://ROKU_IP:8060/query/apps POST http://ROKU_IP:8060/launch/APP_ID - -YouTube example: -POST http://YOUR_ROKU_IP:8060/launch/837?contentID=YOUR_YOUTUBE_VIDEOS_CONTENT_ID&MediaType=live ``` One method of performing the GET request is to open `http://ROKU_IP:8060/query/apps` in your web browser of choice. The Roku will return an XML-formatted list of available channels, including their full name and appID. @@ -130,6 +127,44 @@ action: media_content_type: channel ``` +## Content Deeplinking + +The `media_player.play_media` service may be used to deep link to content within an application. + +| Service data attribute | Optional | Description | Example | +| ---------------------- | -------- | ----------- | ------- | +| `entity_id` | no | Target a specific media player. To target all media players, use `all`. | | +| `media_content_id` | no | A media identifier. | 291097 +| `media_content_type` | no | A media type. | channel +| `extra.content_id` | no | A unique content identifier passed to app. | 8e06a8b7-d667-4e31-939d-f40a6dd78a88 +| `extra.media_type` | no | A media type passed to app. Should be one of `movie`, `episode`, `season`, `series`, `shortFormVideo`, `special`, `live` | movie + +### Example + +```yaml +action: + - service: media_player.play_media + target: + entity_id: media_player.roku + data: + media_content_id: 291097 + media_content_type: app + extra: + content_id: 8e06a8b7-d667-4e31-939d-f40a6dd78a88 + media_type: movie +``` + +### Obtaining Content IDs + +Content IDs are unique to each streaming service and vary in format but are often part of the video webpage URL. Here are some examples: + +| Service | App ID | URL Format | Content ID | Media Type +| ------- | ------ | ---------- | ---------- | ---------- | +| Disney Plus | 291097 | disneyplus.com/video/8e06a8b7-d667-4e31-939d-f40a6dd78a88 | 8e06a8b7-d667-4e31-939d-f40a6dd78a88 | movie +| Hulu | 2285 | hulu.com/series/american-dad-977c8e25-cde0-41b7-80ce-e746f2d2093f | american-dad-977c8e25-cde0-41b7-80ce-e746f2d2093f | series +| Spotify | 22297 | open.spotify.com/playlist/5xddIVAtLrZKtt4YGLM1SQ | spotify:playlist:5xddIVAtLrZKtt4YGLM1SQ | playlist +| YouTube | 837 | youtu.be/6ZMXE5PXPqU | 6ZMXE5PXPqU | live + ## Services ### Service `roku.search` From 7e84012c4ba0f1beab0e8728ad683318ff2acbe7 Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Thu, 13 Jan 2022 19:11:58 +0100 Subject: [PATCH 137/247] Document new `period` option for stat graph card (#21164) --- source/_lovelace/statistics-graph.markdown | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/source/_lovelace/statistics-graph.markdown b/source/_lovelace/statistics-graph.markdown index 6a13d4205c5..5b6d226eaff 100644 --- a/source/_lovelace/statistics-graph.markdown +++ b/source/_lovelace/statistics-graph.markdown @@ -39,16 +39,20 @@ days_to_show: default: 30 chart_type: required: false - description: If the chart should be rendered as a `bar` or a `line` chart. + description: If the graph should be rendered as a `bar` or a `line` chart. type: string stat_types: required: false - description: The stat types to render. `min`, `max`, `mean`, `sum` + description: The statistics types to render. `min`, `max`, `mean`, `sum` type: list title: required: false description: The card title. type: string +period: + required: false + description: The period of the rendered graph. `5minute`, `hour`, `day` or `month` + type: string {% endconfiguration %} ## Options For Entities From 29f27ea547d331020fc36b4174f9e110e92aff42 Mon Sep 17 00:00:00 2001 From: Anton Malko Date: Fri, 14 Jan 2022 06:07:39 +0300 Subject: [PATCH 138/247] Update LOOKin integration docs to add light platform (#21182) Co-authored-by: J. Nick Koston --- source/_integrations/lookin.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_integrations/lookin.markdown b/source/_integrations/lookin.markdown index 60858c0711f..edd64fcf737 100644 --- a/source/_integrations/lookin.markdown +++ b/source/_integrations/lookin.markdown @@ -3,6 +3,7 @@ title: LOOKin description: Instructions on how to integrate LOOKin devices into Home Assistant. ha_category: - Climate + - Light - Media Player - Sensor ha_release: 2021.11 @@ -13,6 +14,7 @@ ha_domain: lookin ha_config_flow: true ha_platforms: - climate + - light - media_player - sensor ha_zeroconf: true From 6630f69dfcba8e82c7a83f1c1656c47f4ae479f7 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 13 Jan 2022 22:48:42 -1000 Subject: [PATCH 139/247] Add select platform to SenseME (#21184) --- source/_integrations/senseme.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_integrations/senseme.markdown b/source/_integrations/senseme.markdown index 8579eaca57d..14632bd7ffc 100644 --- a/source/_integrations/senseme.markdown +++ b/source/_integrations/senseme.markdown @@ -5,6 +5,7 @@ ha_category: - Binary Sensor - Fan - Light + - Select - Switch ha_release: 2022.2 ha_iot_class: Local Push @@ -17,6 +18,7 @@ ha_platforms: - binary_sensor - fan - light + - select - switch --- From 8bb1b71d6515c5c95c630a1891a4c4eb18d9c2a8 Mon Sep 17 00:00:00 2001 From: Mick Vleeshouwer Date: Fri, 14 Jan 2022 00:51:15 -0800 Subject: [PATCH 140/247] Add select entity to Overkiz documentation (#20907) --- source/_integrations/overkiz.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_integrations/overkiz.markdown b/source/_integrations/overkiz.markdown index f3900e93865..57b85c131b3 100644 --- a/source/_integrations/overkiz.markdown +++ b/source/_integrations/overkiz.markdown @@ -10,6 +10,7 @@ ha_category: - Light - Scene - Binary Sensor + - Select ha_release: 2022.1.0 ha_config_flow: true ha_iot_class: Cloud Polling @@ -26,6 +27,7 @@ ha_platforms: - light - scene - binary_sensor + - select --- The Overkiz (by Somfy) integration platform is used by many different vendors, like Somfy, Hitachi and Atlantic. This integration will allow users to integrate their devices into Home Assistant using the Overkiz API. From 9d7ed6b769f65a29c12d8318b2af0bce44af14f3 Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Fri, 14 Jan 2022 14:50:09 +0100 Subject: [PATCH 141/247] Deprecate Raspihats (ADR-0019) (#21193) --- source/_integrations/raspihats.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_integrations/raspihats.markdown b/source/_integrations/raspihats.markdown index a91de6b99f7..da010ded807 100644 --- a/source/_integrations/raspihats.markdown +++ b/source/_integrations/raspihats.markdown @@ -13,6 +13,14 @@ ha_platforms: - switch --- +
+ +This integration is deprecated and will be removed in Home Assistant Core 2022.4. + +For more information see: [Architectural Decision Record 0019](https://github.com/home-assistant/architecture/blob/master/adr/0019-GPIO.md). + +
+ The `raspihats` integration is the base for all related Raspihats platforms in Home Assistant. There is no setup needed for the integration itself. ## Binary Sensor From 138d65bd5a9385b7cd0cc324edb235fcc4ff77c7 Mon Sep 17 00:00:00 2001 From: Christopher Bailey Date: Fri, 14 Jan 2022 13:46:34 -0500 Subject: [PATCH 142/247] Add package camera for UniFi Protect (#21163) Co-authored-by: J. Nick Koston --- source/_integrations/unifiprotect.markdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/_integrations/unifiprotect.markdown b/source/_integrations/unifiprotect.markdown index f66e3eb4d18..6bed70f5882 100644 --- a/source/_integrations/unifiprotect.markdown +++ b/source/_integrations/unifiprotect.markdown @@ -98,7 +98,8 @@ G3 Series cameras do _not_ have Smart detections. Each UniFi Protect camera will get a device in Home Assistant with the following: -* **Camera** - A camera for each camera channel and RTSP(S) combination found for each camera (up to 6). Only the highest resolution RTSPS camera entity will be enabled by default. +* **Camera** - A camera for each camera channel and RTSP(S) combination found for each camera (up to 7). Only the highest resolution RTSPS camera entity will be enabled by default. + * If your camera is a G4 Doorbell Pro, an additional camera entity will be added for the Package Camera. The Package Camera entity will _not_ have streaming capabilities regardless of whether RTSPS is enabled on the channel or not. This is due to the Package Camera having a very low FPS that does not make it compatible with HLS streaming. * **Media Player** - If your camera has a speaker, you will get a media player entity that allows you to play audio to your camera's speaker. Any audio file URI that is playable by FFmpeg will be able to be played to your speaker, including via the [TTS Say Service](/integrations/tts/#service-say). * **Privacy Mode** - If your camera allows for Privacy Masks, there will be a configuration switch to toggle a "Privacy Mode" that disables recording, microphone, and a black privacy zone over the whole camera. * **Sensors** - Sensors include "Is Dark", "Motion Detected", "Detected Object" (if the camera supports smart detections), and "Doorbell Chime" (if the camera has a chime). Several diagnostics sensors are added including sensors on uptime, network connection stats, and storage stats. Doorbells will also have a "Voltage" sensor for troubleshooting electrical issues. From 87f5c91a7846641064973719776bb69c158fe52d Mon Sep 17 00:00:00 2001 From: Kevin Hellemun <17928966+OGKevin@users.noreply.github.com> Date: Fri, 14 Jan 2022 22:36:45 +0100 Subject: [PATCH 143/247] Document new current_* sensors for xiaomi_miio vacuum. (#20595) Parent PR: https://github.com/home-assistant/core/pull/61098 Signed-off-by: Kevin Hellemun <17928966+OGKevin@users.noreply.github.com> --- source/_integrations/xiaomi_miio.markdown | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/source/_integrations/xiaomi_miio.markdown b/source/_integrations/xiaomi_miio.markdown index 947f642cc2f..3c81bcf4a9a 100644 --- a/source/_integrations/xiaomi_miio.markdown +++ b/source/_integrations/xiaomi_miio.markdown @@ -1402,13 +1402,17 @@ Main Brush Left*: description: How long the main brush can be used in seconds Sensor Dirty Left*: description: How long the sensor can be used in seconds +Current Clean Time: + description: The current cleaning time of the vacuum. If the vaccuum is not cleaning, this sensor will have the same value as the "Last Clean Duration" sensor. +Current Clean Area: + description: The current area that has been cleaned. If the vacuum is not cealning, this sensor will have the same value as the "Last Clean Area" sensor. Last Clean Area*: description: The last cleaned area in square meters Last Clean Duration*: description: The last clean duration in seconds -Last Clean End*: +Last Clean End: description: The last clean end time as a timestamp -Last Clean Start*: +Last Clean Start: description: The last clean start time as a timestamp Mop Attached**: description: If the mop is attached From 7aaad2d77ce6eaf6144bdf561763614a32603b89 Mon Sep 17 00:00:00 2001 From: Shay Levy Date: Sat, 15 Jan 2022 00:21:46 +0200 Subject: [PATCH 144/247] Update changes for LG webOS Smart TV config flow (#21197) * Update changes for LG webOS Smart TV config flow * Add missing "the" * Add ha_config_flow and ha_ssdp --- source/_integrations/webostv.markdown | 112 ++++---------------------- 1 file changed, 17 insertions(+), 95 deletions(-) diff --git a/source/_integrations/webostv.markdown b/source/_integrations/webostv.markdown index 9eac0a6b86a..d0c4cf0d4ca 100644 --- a/source/_integrations/webostv.markdown +++ b/source/_integrations/webostv.markdown @@ -10,6 +10,8 @@ ha_codeowners: - '@bendavid' - '@thecode' ha_domain: webostv +ha_config_flow: true +ha_ssdp: true ha_platforms: - media_player - notify @@ -24,91 +26,13 @@ There is currently support for the following device types within Home Assistant: To begin with enable *LG Connect Apps* feature in *Network* settings of the TV. -Once basic configuration is added to your `configuration.yaml` file. A notification should be visible in the frontend's **Notification** section. Follow the instructions and accept the pairing request on your TV. - -Pairing information will be saved to a configuration file `webostv.conf` in the Home Assistant configuration directory. This process is IP address-sensitive, in case the IP address of your TV would change in future. - -## Configuration - -To add a TV to your installation, add the following to your `configuration.yaml` file: - -```yaml -# Example configuration.yaml entry -webostv: -``` - -{% configuration %} -host: - description: "The IP of the LG webOS Smart TV, e.g., `192.168.0.10`." - required: true - type: string -name: - description: The name you would like to give to the LG webOS Smart TV. - required: false - type: string -turn_on_action: - description: Defines an [action](/docs/automation/action/) to turn the TV on. - required: false - type: string -customize: - description: List of options to customize. - required: false - type: map - keys: - sources: - description: List of hardware and webOS App inputs. - required: false - type: list -{% endconfiguration %} - -### Full configuration example - -A full configuration example will look like the sample below: - -```yaml -# Example configuration.yaml entry -webostv: - host: 192.168.0.10 - name: Living Room TV - turn_on_action: - service: persistent_notification.create - data: - message: "Turn on action" - customize: - sources: - - livetv - - youtube - - makotv - - netflix - -media_player: - -notify: -``` - -Avoid using `[ ]` in the `name:` of your device. - -### Using multiple TVs - -It is also possible to use multiple TVs with this integration. - -```yaml -# Example configuration.yaml entry with multiple TVs -webostv: - - name: Living Room TV - host: 192.168.1.100 - - name: Bedroom TV - host: 192.168.1.101 -``` - -Please note, the above provides a minimal example, however, all options are -available for each individual TV. +{% include integrations/config_flow.md %} ## Turn on action Home Assistant is able to turn on a LG webOS Smart TV if you specify an action, like HDMI-CEC or WakeOnLan. -Common for webOS 3.0 and higher would be to use WakeOnLan feature. To use this feature your TV should be connected to your network via Ethernet rather than Wireless and you should enable *LG Connect Apps* feature in *Network* settings of the TV [instructions](https://www.lg.com/uk/support/product-help/CT00008334-1437131798537-others) (or *Mobile App* in *General* settings for older models) (*may vary by version). +Common for webOS 3.0 and higher would be to use WakeOnLan feature. To use this feature your TV should be connected to your network via Ethernet rather than Wireless and you should enable the *LG Connect Apps* feature in *Network* settings of the TV (or *Mobile App* in *General* settings for older models) (*may vary by version). On newer models (2017+), WakeOnLan may need to be enabled in the TV settings by going to Settings > General > Mobile TV On > Turn On Via WiFi [instructions](https://support.quanticapps.com/hc/en-us/articles/115005985729-How-to-turn-on-my-LG-Smart-TV-using-the-App-WebOS-). @@ -116,31 +40,29 @@ On newer models (2017+), WakeOnLan may need to be enabled in the TV settings by This usually only works if the TV is connected to the same network. Routing the WakeOnLan packet to a different subnet requires special configuration on your router or may not be possible.
+You can create an automation from the user interface, from the device create a new automation and select the **Device is requested to turn on** automation. +Automations can also be created using an automation action: + ```yaml # Example configuration.yaml entry wake_on_lan: # enables `wake_on_lan` integration -webostv: - host: 192.168.0.10 - #other settings - turn_on_action: - service: wake_on_lan.send_magic_packet - data: - mac: AA-BB-CC-DD-EE-FF - broadcast_address: 11.22.33.44 - -media_player: - -notify: +automation: + trigger: + - platform: webostv.turn_on + entity_id: media_player.lg_webos_smart_tv + action: + - service: wake_on_lan.send_magic_packet + data: + broadcast_address: 192.168.1.255 + mac: AA-BB-CC-DD-EE-FF ``` Any other [actions](/docs/automation/action/) to power on the device can be configured. ## Sources -To obtain complete list of available sources currently configured on the TV, once the webOS TV is configured and linked, while it's powered on head to the **Developer Tools** > **States**, find your `media_player.` and use the sources listed in `source_list:` remembering to split them per line into your `sources:` configuration. If you leave the `sources:` configuration empty, the `media_player` will offer all sources of the TV. If you list a subset of sources in the configuration, only those will be displayed. - -Note: it is normal and expected behavior that for a switched-off TV only the Live TV source is offered in the `media_player`, even if you have configured other sources as well. These will show up as soon as the TV is switched on. +It is possible to select which sources will be available to the media player. When the TV is powered on press the **CONFIGURE** button in the integration card and select the sources to enable. If you don't select any source the media player will offer all of the sources of the TV. ## Change channel through play_media service From 49b10bf23803abb88f044652fcbbfdc063e7f8ed Mon Sep 17 00:00:00 2001 From: Sean Vig Date: Sat, 15 Jan 2022 14:02:42 -0500 Subject: [PATCH 145/247] Change doorbird platform from switch to button (#21208) --- source/_integrations/doorbird.markdown | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/source/_integrations/doorbird.markdown b/source/_integrations/doorbird.markdown index 66ac0ee3644..f7c6465d497 100644 --- a/source/_integrations/doorbird.markdown +++ b/source/_integrations/doorbird.markdown @@ -2,9 +2,9 @@ title: DoorBird description: Instructions on how to integrate your DoorBird video doorbell with Home Assistant. ha_category: - - Doorbell + - Button - Camera - - Switch + - Doorbell ha_release: 0.54 ha_iot_class: Local Push ha_config_flow: true @@ -14,8 +14,8 @@ ha_codeowners: ha_domain: doorbird ha_zeroconf: true ha_platforms: + - button - camera - - switch --- The `doorbird` implementation allows you to integrate your [DoorBird](https://www.doorbird.com/) device in Home Assistant. @@ -23,7 +23,7 @@ The `doorbird` implementation allows you to integrate your [DoorBird](https://ww There is currently support for the following device types within Home Assistant: - [Camera](#camera) - View live and historical event based images. -- [Switch](#switch) - Enable control of relays and camera night vision. +- [Button](#button) - Enable control of relays and camera night vision. ## Setup @@ -112,6 +112,6 @@ Note: Remember to complete the schedule assignment steps above for each event ty The `doorbird` implementation allows you to view the live video, the last doorbell ring image, and the last motion sensor image from your [DoorBird](https://www.doorbird.com/) device in Home Assistant. -## Switch +## Button -The `doorbird` switch platform allows you to power connected relays and trigger the IR array in your [DoorBird](https://www.doorbird.com/) video doorbell device. +The `doorbird` button platform allows you to power connected relays and trigger the IR array in your [DoorBird](https://www.doorbird.com/) video doorbell device. From 3592acddbdba3f46aadd32fd81374a18abaed250 Mon Sep 17 00:00:00 2001 From: Brandon Rothweiler Date: Sun, 16 Jan 2022 09:31:55 -0500 Subject: [PATCH 146/247] Add documentation for Mazda electric vehicle sensors (#21186) --- source/_integrations/mazda.markdown | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/source/_integrations/mazda.markdown b/source/_integrations/mazda.markdown index 358d72aa841..a2a168ba61b 100644 --- a/source/_integrations/mazda.markdown +++ b/source/_integrations/mazda.markdown @@ -25,8 +25,9 @@ This integration requires an active Mazda Connected Services subscription and a - Mazda3: 2019+ - CX-30: 2020+ -- CX-9: 2021+ - CX-5: 2021+ +- CX-9: 2021+ +- MX-30: 2020+ {% include integrations/config_flow.md %} @@ -39,10 +40,12 @@ This integration requires an active Mazda Connected Services subscription and a ### Sensor The following sensor entities are available: -- Fuel remaining -- Fuel distance remaining +- Fuel remaining (only for gas vehicles) +- Fuel distance remaining (only for gas vehicles) - Odometer - Tire pressure (not available for CX-5 and CX-9 models) +- Charge level (only for electric vehicles) +- Remaining range (only for electric vehicles) ### Device tracker From daf25516904f2886a3cdb65d3d0b1d0afc558f8b Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Sun, 16 Jan 2022 11:00:52 -0600 Subject: [PATCH 147/247] Add play media URL support to roku (#21185) --- source/_integrations/roku.markdown | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/source/_integrations/roku.markdown b/source/_integrations/roku.markdown index 737391f582a..6a5fd0fde6b 100644 --- a/source/_integrations/roku.markdown +++ b/source/_integrations/roku.markdown @@ -127,6 +127,33 @@ action: media_content_type: channel ``` +## Play on Roku + +The `media_player.play_media` service may be used to send media URLs (primarily videos) for direct playback on your device. This feature makes use of the built-in PlayOnRoku application. + +| Service data attribute | Optional | Description | Example | +| ---------------------- | -------- | ----------- | ------- | +| `entity_id` | no | Target a specific media player. To target all media players, use `all`. | | +| `media_content_id` | no | A media URL. | http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4 +| `media_content_type` | no | A media type. | `url` +| `extra.format` | no | A media format. Should be one of `mp4` (supports mov and m4v), `wma`, `mp3`, `hls`, `ism` (smooth streaming), `dash` (MPEG-DASH), `mkv`, `mka`, `mks` | `mp4` +| `extra.name` | yes | A name for the media. | Big Buck Bunny + +### Example + +```yaml +action: + - service: media_player.play_media + target: + entity_id: media_player.roku + data: + media_content_id: http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4 + media_content_type: url + extra: + format: mp4 + name: Big Buck Bunny +``` + ## Content Deeplinking The `media_player.play_media` service may be used to deep link to content within an application. From 0e58402ff7fbe1b811da8347e7acb76cd82b0327 Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Mon, 17 Jan 2022 04:36:59 -0600 Subject: [PATCH 148/247] Add sensor platform to roku (#21221) --- source/_integrations/roku.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_integrations/roku.markdown b/source/_integrations/roku.markdown index 6a5fd0fde6b..eac3906aeb0 100644 --- a/source/_integrations/roku.markdown +++ b/source/_integrations/roku.markdown @@ -6,6 +6,7 @@ ha_category: - Binary Sensor - Media Player - Remote + - Sensor ha_iot_class: Local Polling ha_release: 0.86 ha_domain: roku @@ -19,6 +20,7 @@ ha_platforms: - binary_sensor - media_player - remote + - sensor --- The Roku integration allows you to control a [Roku](https://www.roku.com/) device. From add6cd76c5fbe7d6f8dc4ff0f7467b4d786b0044 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 17 Jan 2022 00:42:06 -1000 Subject: [PATCH 149/247] Update nexia to add switch platform (#21213) --- source/_integrations/nexia.markdown | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/source/_integrations/nexia.markdown b/source/_integrations/nexia.markdown index c8a035f1531..e1d1f6bfd49 100644 --- a/source/_integrations/nexia.markdown +++ b/source/_integrations/nexia.markdown @@ -6,6 +6,7 @@ ha_category: - Sensor - Climate - Scene + - Switch ha_release: 0.108 ha_iot_class: Cloud Polling ha_config_flow: true @@ -18,6 +19,7 @@ ha_platforms: - climate - scene - sensor + - switch --- The `nexia` integration allows you to integrate your [Nexia](https://mynexia.com/) (Trane) thermostats or [American Standard](https://asairhome.com/) thermostats into Home Assistant. @@ -28,6 +30,7 @@ There is currently support for the following device types within Home Assistant: - [Climate](#climate) - [Sensor](#sensor) - [Scene](#scene) +- [Switch](#switch) {% include integrations/config_flow.md %} @@ -39,7 +42,7 @@ The following binary sensors are added for each thermostat: ### Sensor -The following binary sensors are added for each thermostat: +The following sensors are added for each thermostat: - Air Cleaner Mode - Current Compressor Speed @@ -48,7 +51,7 @@ The following binary sensors are added for each thermostat: - Relative Humidity - System Status -The following binary sensors are added for each thermostat zone: +The following sensors are added for each thermostat zone: - Zone Temperature - Zone Setpoint Status @@ -56,7 +59,7 @@ The following binary sensors are added for each thermostat zone: ### Climate -The `nexia` climate platform lets you control a thermostat. +The climate platform lets you control a thermostat. The following Trane thermostats are supported: `XL1050`, `XL850`, `XL824` @@ -68,7 +71,11 @@ Other thermostats may work, but they have not been tested. ### Scene -The `nexia` scene platform lets you activate a nexia automation. +The scene platform lets you activate a nexia automation. + +### Switch + +The switch platform lets you enable or disable hold mode for each thermostat. ### Service `nexia.set_aircleaner_mode` From c99018dd9a4db03bfb1e3e3c7677005a66a2f63e Mon Sep 17 00:00:00 2001 From: Mick Vleeshouwer Date: Mon, 17 Jan 2022 10:32:41 -0800 Subject: [PATCH 150/247] Add switch entity to Overkiz (#21167) Co-authored-by: Franck Nijhof --- source/_integrations/overkiz.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_integrations/overkiz.markdown b/source/_integrations/overkiz.markdown index 57b85c131b3..f4253a6d445 100644 --- a/source/_integrations/overkiz.markdown +++ b/source/_integrations/overkiz.markdown @@ -10,6 +10,7 @@ ha_category: - Light - Scene - Binary Sensor + - Switch - Select ha_release: 2022.1.0 ha_config_flow: true @@ -27,6 +28,7 @@ ha_platforms: - light - scene - binary_sensor + - switch - select --- From 5eca384ab9f28b8085e1aeae49697db4328f4f14 Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Mon, 17 Jan 2022 12:34:47 -0600 Subject: [PATCH 151/247] Improve roku documentation (#21231) --- source/_integrations/roku.markdown | 53 +++++++++++++++++++----------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/source/_integrations/roku.markdown b/source/_integrations/roku.markdown index eac3906aeb0..e4579f7ba73 100644 --- a/source/_integrations/roku.markdown +++ b/source/_integrations/roku.markdown @@ -83,30 +83,29 @@ data: ## Media Player -When the Home Assistant Roku integration is enabled and a Roku device has been configured, in the Home Assistant UI the Roku media player will show a listing of the installed channels, or apps, under “source”. Select one and it will attempt to launch the channel on your Roku device. This action can also be automated. Channels can be launched by `name` using a configuration similar to the one below: +When the Home Assistant Roku integration is enabled and a Roku device has been configured, in the Home Assistant UI the Roku media player will show a listing of the installed channels, or apps, under “source”. Select one and it will attempt to launch the channel on your Roku device. + +## Source Automation + +The `media_player.select_source` service may be used to launch specific applications/streaming channels on your Roku device. + +| Service data attribute | Optional | Description | Example | +| ---------------------- | -------- | ----------- | ------- | +| `entity_id` | no | Target a specific media player. | +| `source` | no | An application name or application ID. | Prime Video + +### Examples + ```yaml action: -- target: +- service: media_player.select_source + target: entity_id: media_player. data: source: "Prime Video" - service: media_player.select_source ``` -Alternatively, the `appID` for the channel can be used for `source:` Although this information is gathered by the Roku integration, at the moment it is not exposed to the end-user. This item might be added in a future release. For now, you can easily get the information yourself. All you need to do is a GET API call on the same network as your device. - -The API calls are like this: - -```txt -GET http://ROKU_IP:8060/query/apps -POST http://ROKU_IP:8060/launch/APP_ID -``` - -One method of performing the GET request is to open `http://ROKU_IP:8060/query/apps` in your web browser of choice. The Roku will return an XML-formatted list of available channels, including their full name and appID. - -More details can be found on the [Roku dev pages](https://developer.roku.com/docs/developer-program/debugging/external-control-api.md) - -To use this information in Home Assistant, the format is as follows. Note that `source:` is the appID you discovered in the API call: +Alternatively, the application id can be used for `source`. See [Obtaining Application IDs](#obtaining-application-ids). ```yaml action: @@ -117,7 +116,23 @@ action: source: 20197 ``` -It is also possible to tune directly to specific channels if you have a Roku TV and use an OTA antenna. This service only supports `media_channel_type` of 'channel'. `media_content_id` corresponds to the TV channel, which you should see when navigating to these on your TV UI. +### Obtaining Application IDs + +The currently active application ID can be found in the `Active App ID` diagnostic sensor. + +Alternatively, you can make a manual HTTP request (GET) to `http://ROKU_IP:8060/query/apps`, in either your browser or terminal, to retrieve a complete list of installed applications in XML format. + +## TV Channel Tuning + +The `media_player.play_media` service may be used to tune to specific channels on your Roku TV device with OTA antenna. + +| Service data attribute | Optional | Description | Example | +| ---------------------- | -------- | ----------- | ------- | +| `entity_id` | no | Target a specivic media player. | +| `media_content_id` | no | A channel number. | 5.1 +| `media_content_type` | no | A media type. | `channel` + +### Example ```yaml action: @@ -164,7 +179,7 @@ The `media_player.play_media` service may be used to deep link to content within | ---------------------- | -------- | ----------- | ------- | | `entity_id` | no | Target a specific media player. To target all media players, use `all`. | | | `media_content_id` | no | A media identifier. | 291097 -| `media_content_type` | no | A media type. | channel +| `media_content_type` | no | A media type. | `app` | `extra.content_id` | no | A unique content identifier passed to app. | 8e06a8b7-d667-4e31-939d-f40a6dd78a88 | `extra.media_type` | no | A media type passed to app. Should be one of `movie`, `episode`, `season`, `series`, `shortFormVideo`, `special`, `live` | movie From d6b0d613ed5163e745b0b58ddd9280d91186e80f Mon Sep 17 00:00:00 2001 From: Raman Gupta <7243222+raman325@users.noreply.github.com> Date: Tue, 18 Jan 2022 02:56:45 -0500 Subject: [PATCH 152/247] Zwave js diagnostics (#21234) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Joakim Sørensen Co-authored-by: Franck Nijhof --- source/_integrations/zwave_js.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/zwave_js.markdown b/source/_integrations/zwave_js.markdown index 0f176781b02..f966bd24d3c 100644 --- a/source/_integrations/zwave_js.markdown +++ b/source/_integrations/zwave_js.markdown @@ -755,7 +755,7 @@ If the interview is complete, then the device does not yet have a device file fo When trying to determine why something isn't working as you expect, or when reporting an issue with the integration, it is helpful to know what Z-Wave JS sees as the current state of your Z-Wave network. To get a dump of your current network state, follow the menu: -**Configuration** -> **Devices & Services** -> **Z-Wave JS** -> **Configure** -> **Download a dump of your network to help diagnose issues** +{% my integrations title="**Configuration** -> **Devices & Services**" %} -> **Z-Wave JS** -> **...** -> **Download diagnostics** ### Interference issues From f64f3245ad1a2909dc409b7f2f9c2af0fbb2cb03 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 18 Jan 2022 09:58:12 -1000 Subject: [PATCH 153/247] Add discovery support to unifiprotect (#21235) --- source/_integrations/unifiprotect.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_integrations/unifiprotect.markdown b/source/_integrations/unifiprotect.markdown index 6bed70f5882..9445ee1e228 100644 --- a/source/_integrations/unifiprotect.markdown +++ b/source/_integrations/unifiprotect.markdown @@ -12,6 +12,8 @@ ha_category: - Select - Sensor - Switch +ha_dhcp: true +ha_ssdp: true ha_release: 2022.2 ha_iot_class: Local Push ha_config_flow: true From 84dbd39892fd647e92384d1edd21a2dd9480f0b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Tue, 18 Jan 2022 20:59:14 +0100 Subject: [PATCH 154/247] GitHub config flow (#21228) Co-authored-by: Franck Nijhof --- source/_integrations/github.markdown | 56 ++++++++++------------------ 1 file changed, 19 insertions(+), 37 deletions(-) diff --git a/source/_integrations/github.markdown b/source/_integrations/github.markdown index 18f7ac9a102..e6f9860834f 100644 --- a/source/_integrations/github.markdown +++ b/source/_integrations/github.markdown @@ -1,8 +1,9 @@ --- title: GitHub -description: How to integrate the GitHub sensor into Home Assistant. +description: Instructions on how to integrate the GitHub integration into Home Assistant. ha_category: - Sensor +ha_config_flow: true ha_release: 0.88 ha_iot_class: Cloud Polling ha_domain: github @@ -13,45 +14,26 @@ ha_codeowners: - '@ludeeus' --- -The GitHub sensor allows you to monitor your favorite [GitHub](https://github.com/) repositories. Monitored information includes the amount of stargazers, forks, open issues and pull requests, the latest commit message, and more. +The GitHub integration allows you to monitor your favorite [GitHub][github] repositories. -## Setup +{% include integrations/config_flow.md %} -To set up this sensor you will need a GitHub [personal access token](https://github.com/settings/tokens). You will need to check the `repo` scope for the sensor to function. +When you set up this integration, you will first be guided to allow the integration to use the [GitHub API][github_api] on your behalf. If you do not yet have a [GitHub][github] account you will be prompted to create one during the configuration of the integration. -## Configuration +When you have authorized the integration, you select repositories you want to monitor, the list contains repositories you have [starred][github_starred] on GitHub with your account. -To enable this platform, add the following to your `configuration.yaml` file: +Most of the entities provided by this integration are disabled by default, you can enable these by going to the {% my entities title="entities panel" %}. -```yaml -# Example configuration.yaml entry -sensor: - - platform: github - access_token: !secret github_access_token - repositories: - - path: 'home-assistant/core' -``` +## Remove authorization -{% configuration %} -access_token: - description: Your GitHub Access Token - required: true - type: string -url: - description: If you are using a GitHub Enterprise server, add its URL here. For example, `https://mygithubserver.com` - required: false - type: string -repositories: - description: A list of repository paths and optionally a name - required: true - type: list - keys: - path: - description: Path to the repository. For Home Assistant this will be `home-assistant/core` - required: true - type: string - name: - description: Name of the sensor. Gives the sensor a custom name in Home Assistant. Defaults to the repository name from GitHub if not specified. - required: false - type: string -{% endconfiguration %} +After you have removed the integration from {% my integrations title="Configuration -> Devices & Services" %}, you need to manually revoke OAuth app authorization. + +1. Go to your [Authorized OAuth Apps][github_apps] +2. Find the "Home Assistant GitHub Integration" application +3. Click the 3 dots (`...`) to the right of the name +4. Select "Revoke" + +[github]: https://github.com/ +[github_api]: https://docs.github.com/en/rest +[github_starred]: https://github.com/stars +[github_apps]: https://github.com/settings/applications From 2cdd35498b961cf0fefa9ee158f1614563068c37 Mon Sep 17 00:00:00 2001 From: Alan Byrne <46924973+burnsie-la@users.noreply.github.com> Date: Wed, 19 Jan 2022 17:50:05 +0000 Subject: [PATCH 155/247] Documentation update for Signal Messenger integration for adding URL attachment support (#20762) Co-authored-by: Ian Byrne Co-authored-by: Franck Nijhof --- source/_integrations/signal_messenger.markdown | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/source/_integrations/signal_messenger.markdown b/source/_integrations/signal_messenger.markdown index e01b8813988..f579326d142 100644 --- a/source/_integrations/signal_messenger.markdown +++ b/source/_integrations/signal_messenger.markdown @@ -90,3 +90,21 @@ action: attachments: - "/tmp/surveillance_camera.jpg" ``` + +### Text message with an attachment from a URL + +To attach files from outside of HomeAssistant, the URLs must be added to the [`allowlist_external_urls`](/docs/configuration/basic/#allowlist_external_urls) list. + +Note there is a 50MB size limit for attachments retrieved via URLs. You can also set `verify_ssl` to `false` to ignore SSL errors (default `true`). + +```yaml +... +action: + service: notify.NOTIFIER_NAME + data: + message: "Person detected on Front Camera!" + data: + verify_ssl: false + urls: + - "http://homeassistant.local/api/frigate/notifications//thumbnail.jpg" +``` From 296fa2f3918fb4549af17ddd24dc9f0939a0ead3 Mon Sep 17 00:00:00 2001 From: Aaron Bach Date: Wed, 19 Jan 2022 11:58:48 -0700 Subject: [PATCH 156/247] Add RainMachine docs for `restrict_watering` and `unrestrict_watering` services (#21222) * Add RainMachine docs for `restrict_watering` and `unrestrict_watering` services * Add comment about max pause time * Add missing services --- source/_integrations/rainmachine.markdown | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/source/_integrations/rainmachine.markdown b/source/_integrations/rainmachine.markdown index 305e053963e..c9092cdc6f5 100644 --- a/source/_integrations/rainmachine.markdown +++ b/source/_integrations/rainmachine.markdown @@ -39,8 +39,10 @@ Services accept either device IDs or entity IDs, depending on the nature of the - Services that require a device ID as a target: - `rainmachine.pause_watering` - `rainmachine.push_weather_data` + - `rainmachine.restrict_watering` - `rainmachine.stop_all` - `rainmachine.unpause_watering` + - `rainmachine.unrestrict_watering` - Services that require an entity ID as a target (note that the correct entity ID type must be provided, such as a program for a program-related service) - `rainmachine.start_program` - `rainmachine.start_zone` @@ -49,7 +51,7 @@ Services accept either device IDs or entity IDs, depending on the nature of the ### `rainmachine.pause_watering` -Pause all watering activities for a number of seconds. +Pause all watering activities for a number of seconds. After the pause is complete, the previous watering activities will resume. Note that controllers can only be paused for a maximum of 12 hours. | Service Data Attribute | Optional | Description | | ---------------------- | -------- | ------------------------------ | @@ -81,6 +83,14 @@ See details of RainMachine API here: | `pressure` | no | Barametric Pressure (kPa) | | `dewpoint` | no | Dew Point (°C) | +### `rainmachine.restrict_watering` + +Restrict any and all watering activities from staring for a time period. + +| Service Data Attribute | Optional | Description | +| ---------------------- | -------- | ------------------------------ | +| `duration` | no | The time period to restrict (e.g., "01:00:00") | + ### `rainmachine.start_program` Start a RainnMachine program. @@ -107,7 +117,11 @@ Stop a RainMachine zone. ### `rainmachine.unpause_watering` -Unpause all watering activities. +Unpause all paused watering activities. + +### `rainmachine.unrestrict_watering` + +Remove all watering restrictions enforced by `rainmachine.restrict_watering`. ## Switch From e0710609c8524cb03d5c475292182171a4100231 Mon Sep 17 00:00:00 2001 From: Christopher Bailey Date: Wed, 19 Jan 2022 14:47:05 -0500 Subject: [PATCH 157/247] Update list of supported devices for UniFi Protect (#21256) --- source/_integrations/unifiprotect.markdown | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/source/_integrations/unifiprotect.markdown b/source/_integrations/unifiprotect.markdown index 9445ee1e228..692d13093e6 100644 --- a/source/_integrations/unifiprotect.markdown +++ b/source/_integrations/unifiprotect.markdown @@ -43,9 +43,8 @@ The UniFi Protect integration, adds support for retrieving Camera feeds and Sens This Integration supports all UniFi OS Consoles that can run UniFi Protect. Currently, this includes: -* UniFi Protect Network Video Recorder (**UNVR**) -* UniFi Protect Network Video Recorder Pro (**UNVRPRO**) -* UniFi Dream Machine Pro (**UDMP**) +* Any UniFi Protect Network Video Recorder (**UNVR** or **UNVRPRO**) +* Any UniFi "Dream" device (**UDM**, **UDMPRO**, **UDR**, or **UDMSE**) * UniFi Cloud Key Gen2 Plus (**CKGP**) firmware version v2.0.24+ CKGP with Firmware v1.x **do NOT run UniFi OS**, you must upgrade to firmware v2.0.24 or newer. From 8b25eefd3090bfb8b75db074eae09df8982e8d18 Mon Sep 17 00:00:00 2001 From: Jon Bloom Date: Wed, 19 Jan 2022 21:44:37 -0500 Subject: [PATCH 158/247] Grammar and structure fixes for unifiprotect (#21260) --- source/_integrations/unifiprotect.markdown | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/source/_integrations/unifiprotect.markdown b/source/_integrations/unifiprotect.markdown index 692d13093e6..c2c9e789397 100644 --- a/source/_integrations/unifiprotect.markdown +++ b/source/_integrations/unifiprotect.markdown @@ -1,6 +1,6 @@ --- title: UniFi Protect -description: Instructions on how to configure UniFi Protect integration by Ubiquiti. +description: Instructions on how to configure the Ubiquiti UniFi Protect integration. ha_category: - Hub - Binary Sensor @@ -35,7 +35,7 @@ ha_platforms: - switch --- -The UniFi Protect integration, adds support for retrieving Camera feeds and Sensor data from an [UniFi Protect application](https://ui.com/camera-security) by [Ubiquiti Networks, inc.](https://www.ui.com/) that is running on an UniFi OS Console. +The UniFi Protect integration adds support for retrieving Camera feeds and Sensor data from a [UniFi Protect application](https://ui.com/camera-security) by [Ubiquiti Networks, inc.](https://www.ui.com/) that is running on a UniFi OS Console. ## Prerequisites @@ -45,9 +45,9 @@ This Integration supports all UniFi OS Consoles that can run UniFi Protect. Curr * Any UniFi Protect Network Video Recorder (**UNVR** or **UNVRPRO**) * Any UniFi "Dream" device (**UDM**, **UDMPRO**, **UDR**, or **UDMSE**) -* UniFi Cloud Key Gen2 Plus (**CKGP**) firmware version v2.0.24+ +* UniFi Cloud Key Gen2 Plus (**UCKP**) firmware version v2.0.24+ -CKGP with Firmware v1.x **do NOT run UniFi OS**, you must upgrade to firmware v2.0.24 or newer. +UCKP with Firmware v1.x **do NOT run UniFi OS**, you must upgrade to firmware v2.0.24 or newer. ### Software Support @@ -64,8 +64,8 @@ You will need a local user created in your UniFi OS Console to log in with. Ubiq 1. Click *Add Admin*, and fill out the form. Specific Fields to pay attention to: * Role: Must be *Limited Admin* * Account Type: *Local Access Only* - * CONTROLLER PERMISSIONS - Under UniFi Protect, select Administrators. **NOTE**: Other roles may work, but only the default Administrators rule is fully tested. -1. Click *Add* in at the bottom Right. + * CONTROLLER PERMISSIONS - Under UniFi Protect, select Administrators. **NOTE**: Other roles may work, but only the default Administrators role is fully tested. +1. Click *Add* in the bottom Right. ![ADMIN_UNIFIOS](/images/integrations/unifiprotect/unifi_os_admin.png) @@ -82,7 +82,7 @@ The Integration uses the RTSP(S) Streams as the Live Feed source, so this needs ## Features -All known UniFi Protect devices are should be supported. Each UniFi Protect device will get a variety of entities added for each of the different entity platforms. +All known UniFi Protect devices should be supported. Each UniFi Protect device will get a variety of entities added for each of the different entity platforms. ### UniFi Protect Cameras @@ -121,7 +121,7 @@ Each UniFi Protect floodlight will get a device in Home Assistant with the follo ### UniFi Protect Smart Sensors -Each UniFi Protect smart sensors are a bit different than normal sensors. They are a multi-sensor that can act as a contact sensor (door/window), a motion detector, a light level detector, a humidity sensor, a temperature level sensor, an alarm sound sensor, and/or a leak detector. Each sensor function can be enabled or disabled dynamically. Disabled sensors will be marked as "unavailable". +UniFi Protect smart sensors are a bit different than normal sensors. They are a multi-sensor that can act as a contact sensor (door/window), a motion detector, a light level detector, a humidity sensor, a temperature level sensor, an alarm sound sensor, and/or a leak detector. Each sensor function can be enabled or disabled dynamically. Disabled sensors will be marked as "unavailable". * **Sensors** - A sensor is provided for each major function of the smart sensor device: * **Contact** - A contact sensor will be available if the mount type is set as "Door", "Window" or "Garage". @@ -155,7 +155,7 @@ Sets the default doorbell message. This will be the message that is automaticall | Service data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------------------------------------------------ | -| `device_id` | No | Any device from the UniFi Protect instance you want to change. In case you have multiple Protect Instances. | +| `device_id` | No | Any device from the UniFi Protect instance you want to change. In case you have multiple Protect instances. | | `message` | No | The default message for your Doorbell. Must be less than 30 characters. | ### Service unifiprotect.add_doorbell_text @@ -164,7 +164,7 @@ Adds a new custom message for Doorbells. | Service data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------------------------------------------------ | -| `device_id` | No | Any device from the UniFi Protect instance you want to change. In case you have multiple Protect Instances. | +| `device_id` | No | Any device from the UniFi Protect instance you want to change. In case you have multiple Protect instances. | | `message` | No | New custom message to add for Doorbells. Must be less than 30 characters. | ### Service unifiprotect.remove_doorbell_text @@ -173,7 +173,7 @@ Removes an existing message for Doorbells. | Service data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------------------------------------------------ | -| `device_id` | No | Any device from the UniFi Protect instance you want to change. In case you have multiple Protect Instances. | +| `device_id` | No | Any device from the UniFi Protect instance you want to change. In case you have multiple Protect instances. | | `message` | No | Existing custom message to remove for Doorbells. | ### Service unifiprotect.set_doorbell_message From c2b2b7c21cad84ba01973ccc08d9a4d4693d3493 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 19 Jan 2022 22:07:52 -1000 Subject: [PATCH 159/247] Explain how HomeKit handles categorized entities (#21259) --- source/_integrations/homekit.markdown | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/_integrations/homekit.markdown b/source/_integrations/homekit.markdown index dcc23e6e555..6b1352217b3 100644 --- a/source/_integrations/homekit.markdown +++ b/source/_integrations/homekit.markdown @@ -338,7 +338,7 @@ To add a single entity in accessory mode: ## Configure Filter -By default, no entity will be excluded. To limit which entities are being exposed to `HomeKit`, you can use the `filter` parameter. Keep in mind only [supported components](#supported-components) can be added. +By default, all entities except categorized entities (config, diagnostic, and system entities) are included. To limit which entities are being exposed to `HomeKit`, you can use the `filter` parameter. Keep in mind only [supported components](#supported-components) can be added. ```yaml # Example filter to include specified domains and exclude specified entities @@ -371,6 +371,8 @@ Filters are applied as follows: - If entity is included, pass (as #2 above) - If entity include and exclude, the entity exclude is ignored +Categorized entities are not included (config, diagnostic, and system entities) unless they are explicitly matched by `include_entity_globs` or `include_entities` or selected in the UI in include mode. + ## Docker Network Isolation The `advertise_ip` option can be used to run this integration even inside an ephemeral Docker container with network isolation enabled, e.g., not using the host network. From 29f7d515a55c9047068e35965b541dbef3eede9b Mon Sep 17 00:00:00 2001 From: Jeef Date: Thu, 20 Jan 2022 02:04:35 -0700 Subject: [PATCH 160/247] Add Intellifire Gas Fireplace integration (#21092) Co-authored-by: Franck Nijhof --- source/_integrations/intellifire.markdown | 29 +++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 source/_integrations/intellifire.markdown diff --git a/source/_integrations/intellifire.markdown b/source/_integrations/intellifire.markdown new file mode 100644 index 00000000000..c5d25dca45d --- /dev/null +++ b/source/_integrations/intellifire.markdown @@ -0,0 +1,29 @@ +--- +title: IntelliFire +description: Instructions on the IntelliFire Fireplace integration for Home Assistant. +ha_category: + - Binary Sensor +ha_iot_class: Local Polling +ha_release: 2022.2 +ha_codeowners: + - '@jeeftor' +ha_domain: intellifire +ha_config_flow: true +--- + +IntelliFire Wi-Fi fireplace modules provide app-based and Alexa control to various fireplaces. The modules do expose an unencrypted HTTP endpoint on the network that provides status information. This integration will read that URL and create a set of sensors displaying the current fireplace state. + +{% include integrations/config_flow.md %} + + +### Sensor Types + + +The following sensors are available as either a **Binary Sensor** when dealing with on/off. + +### Binary Sensors + +- **Power Sensor**: Whether the fire is on. +- **Pilot Light Sensor**: Whether the pilot light is turned on. +- **Timer Sensor**: Whether the sleep timer is turned on. +- **Thermostat Sensor**: Whether the thermostat is turned on. From db8fbc43f7e73c47ace0ad30ae59393ad92e8e1d Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Thu, 20 Jan 2022 07:10:44 -0600 Subject: [PATCH 161/247] Add camera play stream support to roku (#21218) --- source/_integrations/roku.markdown | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/source/_integrations/roku.markdown b/source/_integrations/roku.markdown index e4579f7ba73..66e088745a3 100644 --- a/source/_integrations/roku.markdown +++ b/source/_integrations/roku.markdown @@ -100,7 +100,7 @@ The `media_player.select_source` service may be used to launch specific applicat action: - service: media_player.select_source target: - entity_id: media_player. + entity_id: media_player.roku data: source: "Prime Video" ``` @@ -128,7 +128,7 @@ The `media_player.play_media` service may be used to tune to specific channels o | Service data attribute | Optional | Description | Example | | ---------------------- | -------- | ----------- | ------- | -| `entity_id` | no | Target a specivic media player. | +| `entity_id` | no | Target a specific media player. | | `media_content_id` | no | A channel number. | 5.1 | `media_content_type` | no | A media type. | `channel` @@ -150,7 +150,7 @@ The `media_player.play_media` service may be used to send media URLs (primarily | Service data attribute | Optional | Description | Example | | ---------------------- | -------- | ----------- | ------- | -| `entity_id` | no | Target a specific media player. To target all media players, use `all`. | | +| `entity_id` | no | Target a specific media player. | | `media_content_id` | no | A media URL. | http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4 | `media_content_type` | no | A media type. | `url` | `extra.format` | no | A media format. Should be one of `mp4` (supports mov and m4v), `wma`, `mp3`, `hls`, `ism` (smooth streaming), `dash` (MPEG-DASH), `mkv`, `mka`, `mks` | `mp4` @@ -171,13 +171,27 @@ action: name: Big Buck Bunny ``` +## Camera Stream Integration + +The `camera.play_stream` service may be used to send camera streams (HLS) directly to your device. This feature requires the `stream` integration and makes use of the built-in PlayOnRoku application. + +### Example +```yaml +action: + service: camera.play_stream + target: + entity_id: camera.camera + data: + media_player: media_player.roku +``` + ## Content Deeplinking The `media_player.play_media` service may be used to deep link to content within an application. | Service data attribute | Optional | Description | Example | | ---------------------- | -------- | ----------- | ------- | -| `entity_id` | no | Target a specific media player. To target all media players, use `all`. | | +| `entity_id` | no | Target a specific media player. | | `media_content_id` | no | A media identifier. | 291097 | `media_content_type` | no | A media type. | `app` | `extra.content_id` | no | A unique content identifier passed to app. | 8e06a8b7-d667-4e31-939d-f40a6dd78a88 From 2a57a9d411f2d6a2c2e5071421b9e777761f8c2a Mon Sep 17 00:00:00 2001 From: G Johansson Date: Thu, 20 Jan 2022 22:09:09 +0100 Subject: [PATCH 162/247] Update dnsip for config flow support (#20882) Co-authored-by: J. Nick Koston --- source/_integrations/dnsip.markdown | 64 +++-------------------------- 1 file changed, 5 insertions(+), 59 deletions(-) diff --git a/source/_integrations/dnsip.markdown b/source/_integrations/dnsip.markdown index 1fe8b6047e0..1bdc89ecccf 100644 --- a/source/_integrations/dnsip.markdown +++ b/source/_integrations/dnsip.markdown @@ -4,72 +4,18 @@ description: Instructions on how to integrate a DNS IP sensor into Home Assistan ha_category: - Network ha_iot_class: Cloud Polling +ha_config_flow: true ha_release: '0.40' ha_domain: dnsip ha_platforms: - sensor --- -The `dnsip` sensor will expose an IP address, fetched via DNS resolution, as its value. There are two operational modes: +The `dnsip` sensor will expose an IP address, fetched via DNS resolution, as its value. It provides both IPv4 and IPv6 lookup as separate sensors depending on accessibility to resolvers. -1. When you enable the sensor with minimal configuration, it will query the [OpenDNS](https://www.opendns.com/) nameservers with the hostname `myip.opendns.com`, which will resolve to your external/public IP address. +1. When you enable the sensor with the default value, it will query the [OpenDNS](https://www.opendns.com/) nameservers with the hostname `myip.opendns.com`, which will resolve to your external/public IP address. 2. If you specify a `hostname`, a regular DNS lookup will be performed, providing you the IP the hostname resolves to. -You may also override the nameserver that is being used by setting the `resolver` parameter to any nameserver you like. +You may also override the default nameservers that are being used by setting the `resolver` option in the integration to any nameserver you like. -## Configuration - -To enable this sensor, add the following lines to your `configuration.yaml` file: - -```yaml -# Example configuration.yaml entry -sensor: - - platform: dnsip -``` - -{% configuration %} -hostname: - description: The hostname for which to perform the DNS query. - required: false - default: "`myip.opendns.com` (special hostname that resolves to your public IP)" - type: string -name: - description: Name of the sensor. - required: false - default: "`myip` or hostname without dots if specified" - type: string -resolver: - description: The DNS server to target the query at. - required: false - default: "`208.67.222.222` (OpenDNS)" - type: string -ipv6: - description: Set this to `true` or `false` if IPv6 should be used. When resolving the public IP, this will be the IP of the machine where Home Assistant is running on. - required: false - default: false - type: boolean -resolver_ipv6: - description: The IPv6 DNS server to target the query at. - required: false - default: "`2620:0:ccc::2` (OpenDNS)" - type: string -scan_interval: - description: Defines number of seconds for polling interval. - required: false - default: "`120`" - type: integer -{% endconfiguration %} - -## Extended example - -```yaml -# Example configuration.yaml entry -sensor: - # Own public IPv4 address - - platform: dnsip - # Resolve IP address of home-assistant.io via Google DNS - - platform: dnsip - hostname: home-assistant.io - name: hass - resolver: 8.8.8.8 -``` +{% include integrations/config_flow.md %} From aa0a2063deec8a724257647ccf6e33fddc982124 Mon Sep 17 00:00:00 2001 From: Guido Schmitz Date: Thu, 20 Jan 2022 23:09:36 +0100 Subject: [PATCH 163/247] Add siren platform to devolo Home Control (#18588) Co-authored-by: Charles Garwood --- source/_integrations/devolo_home_control.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_integrations/devolo_home_control.markdown b/source/_integrations/devolo_home_control.markdown index 7f6cb103b96..a7873698306 100755 --- a/source/_integrations/devolo_home_control.markdown +++ b/source/_integrations/devolo_home_control.markdown @@ -7,6 +7,7 @@ ha_category: - Cover - Light - Sensor + - Siren - Switch ha_release: '0.110' ha_iot_class: Local Push @@ -22,6 +23,7 @@ ha_platforms: - cover - light - sensor + - siren - switch ha_zeroconf: true --- @@ -91,3 +93,9 @@ The integration provides support for the following features: - Temperature and brightness of devolo Sensors, that support it - Consumptions of devolo and Qubino devices, that support it - Voltage of devolo Metering Plug v2 + +## Siren + +The integration provides support for the following Z-Wave devices: + +- devolo Siren From c501b2351adf90ca3e92917f7bcd515b227f23d9 Mon Sep 17 00:00:00 2001 From: Shay Levy Date: Fri, 21 Jan 2022 11:12:39 +0200 Subject: [PATCH 164/247] Update webostv iot class to local push (#21274) --- source/_integrations/webostv.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/webostv.markdown b/source/_integrations/webostv.markdown index d0c4cf0d4ca..16286b41209 100644 --- a/source/_integrations/webostv.markdown +++ b/source/_integrations/webostv.markdown @@ -4,7 +4,7 @@ description: Instructions on how to integrate a LG webOS Smart TV within Home As ha_category: - Media Player - Notifications -ha_iot_class: Local Polling +ha_iot_class: Local Push ha_release: 0.18 ha_codeowners: - '@bendavid' From d0ddcc3711269fce9b8701ef315cd2c9be2591d4 Mon Sep 17 00:00:00 2001 From: Duco Sebel <74970928+DCSBL@users.noreply.github.com> Date: Fri, 21 Jan 2022 10:45:04 +0100 Subject: [PATCH 165/247] Add switch platform documentation for HomeWizard Energy (#21183) --- source/_integrations/homewizard.markdown | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/source/_integrations/homewizard.markdown b/source/_integrations/homewizard.markdown index bae3cbdf860..45c8a8f2b99 100644 --- a/source/_integrations/homewizard.markdown +++ b/source/_integrations/homewizard.markdown @@ -19,7 +19,7 @@ Integration for the [HomeWizard Energy](https://www.homewizard.nl/energy) platfo **Supported devices** - [Wifi P1 Meter](https://www.homewizard.nl/p1-meter): Depending on the connected DSMR meter: sensors for power import/export, energy consumption (single or three phases) and gas. (Model: `HWE-P1`) -- [Wifi Energy Socket](https://www.homewizard.nl/energy-socket): Sensors for power import/export and energy consumption. (model: `HWE-SKT`) +- [Wifi Energy Socket](https://www.homewizard.nl/energy-socket): Sensors for power import/export and energy consumption and switches for controlling the outlet (model: `HWE-SKT`) - [Wifi kWh Meter](https://www.homewizard.nl/kwh-meter): Sensors for power import/export and energy consumption. (Models: `SDM230-wifi`, `SDM630-wifi`) ## Enable the API @@ -52,3 +52,10 @@ The HomeWizard Energy API only exposes properties that are used within the HomeW | Total Gas | m3 | HWE-P1 | Current gas import reading, only available when your smart meter is connected to a gas meter. | | DSMR Version | | HWE-P1 | The detected DSMR version. | | Smart Meter Model | | HWE-P1 | The detected smart meter model. | + +## Switches + +The Wifi Energy Socket (`HWE-SKT`) outlet state can be controlled the switch platform. There are two switches: + +- **Switch**: Controls the outlet state of the Energy Socket. This switch is locked out when `Switch Lock` is turned on. +- **Switch Lock**: Forces the outlet state in the `on` position and disables the physical button. This option is useful when the socket is used for a device that must not be turned off, such as a refrigerator. From 093e55e40664561280ac31bb5d37e1c73d01185d Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Fri, 21 Jan 2022 11:13:28 +0100 Subject: [PATCH 166/247] Add Todoist service assignee parameter documentation (#21249) --- source/_integrations/todoist.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_integrations/todoist.markdown b/source/_integrations/todoist.markdown index 2ed6c8cc104..db1ea1bab1a 100644 --- a/source/_integrations/todoist.markdown +++ b/source/_integrations/todoist.markdown @@ -156,6 +156,8 @@ Here are two example JSON payloads resulting in the same task: - **labels** (*Optional*): Any labels you want to add to the task, separated by commas. +- **assignee** (*Optional*): A member's username of a shared project to assign this task to. You find the username formatted as bold text in the collaborator menu of a shared project. + - **priority** (*Optional*): The priority of the task, from 1-4. Again, 1 means least important, and 4 means most important. - **due_date_string** (*Optional*): When the task should be due, in [natural language](https://get.todoist.help/hc/articles/205325931-Dates-and-Times). Mutually exclusive with `due_date` From 36ed80160f4d0de672274653ed744411cbd679c0 Mon Sep 17 00:00:00 2001 From: G Johansson Date: Fri, 21 Jan 2022 11:33:53 +0100 Subject: [PATCH 167/247] Update dnsip.markdown (#21279) --- source/_integrations/dnsip.markdown | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/source/_integrations/dnsip.markdown b/source/_integrations/dnsip.markdown index 1bdc89ecccf..58ac84a299d 100644 --- a/source/_integrations/dnsip.markdown +++ b/source/_integrations/dnsip.markdown @@ -11,11 +11,16 @@ ha_platforms: - sensor --- -The `dnsip` sensor will expose an IP address, fetched via DNS resolution, as its value. It provides both IPv4 and IPv6 lookup as separate sensors depending on accessibility to resolvers. +The DNS IP integration will expose an IP address, fetched via DNS resolution, as its value. It provides both IPv4 and IPv6 lookup as separate sensors depending on accessibility to resolvers. -1. When you enable the sensor with the default value, it will query the [OpenDNS](https://www.opendns.com/) nameservers with the hostname `myip.opendns.com`, which will resolve to your external/public IP address. +1. When you enable the integration with the default value, it will query the [OpenDNS](https://www.opendns.com/) nameservers with the hostname `myip.opendns.com`, which will resolve to your external/public IP address. 2. If you specify a `hostname`, a regular DNS lookup will be performed, providing you the IP the hostname resolves to. -You may also override the default nameservers that are being used by setting the `resolver` option in the integration to any nameserver you like. - {% include integrations/config_flow.md %} + +{% include integrations/option_flow.md %} + +{% configuration_basic %} +Resolver: + description: "You may override the default nameservers that are being used by setting any nameserver you like." +{% endconfiguration_basic %} From 382578c2df81b3b8acb672114e238a08f9c982bb Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Fri, 21 Jan 2022 17:23:32 +0100 Subject: [PATCH 168/247] Deprecate Apple Push Notification Service (APNS) (#21284) --- source/_integrations/apns.markdown | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/source/_integrations/apns.markdown b/source/_integrations/apns.markdown index ba847c78c41..37347dd1c22 100644 --- a/source/_integrations/apns.markdown +++ b/source/_integrations/apns.markdown @@ -10,6 +10,13 @@ ha_platforms: - notify --- +
+ +This integration is deprecated and will be removed in Home Assistant Core 2022.4. +We recommend using our mobile companion applications instead. + +
+ The `apns` platform uses the Apple Push Notification service (APNS) to deliver notifications from Home Assistant. ## Setup From b599a8be76a4f34e4faa2f956620f9383bfb4c4d Mon Sep 17 00:00:00 2001 From: Nick Whyte Date: Sat, 22 Jan 2022 06:05:51 +1100 Subject: [PATCH 169/247] Add aussie_broadband documentation (#18948) Co-authored-by: Franck Nijhof Co-authored-by: Brett Adams Co-authored-by: J. Nick Koston --- .../_integrations/aussie_broadband.markdown | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 source/_integrations/aussie_broadband.markdown diff --git a/source/_integrations/aussie_broadband.markdown b/source/_integrations/aussie_broadband.markdown new file mode 100644 index 00000000000..8bacac2ad3e --- /dev/null +++ b/source/_integrations/aussie_broadband.markdown @@ -0,0 +1,45 @@ +--- +title: Aussie Broadband +description: Instructions on how to integrate Aussie Broadband within Home Assistant. +ha_category: +- Network +- Sensor +ha_release: 2022.2 +ha_iot_class: Cloud Polling +ha_config_flow: true +ha_codeowners: +- '@nickw444' +- '@Bre77' +ha_domain: aussie_broadband +ha_platforms: +- sensor +--- + +The Aussie Broadband integration displays various service metrics using the [Aussie Broadband API](https://myaussie-api.aussiebroadband.com.au). + +## Prerequisites + +You must have a [My Aussie Broadband](https://my.aussiebroadband.com.au) account, and at least 1 active service. + +{% include integrations/config_flow.md %} + +## Entities + +### Sensor + +The integration will create sensor entities for a variety of metrics that relate to your service: + +#### NBN/Internet Services +- Total Usage +- Downloaded Data +- Uploaded Data +- Billing Cycle Length +- Billing Cycle Remaining + +#### Mobile Phone +- Data Usage +- National Calls +- Mobile Calls +- SMS Sent +- Billing Cycle Length +- Billing Cycle Remaining From b6b7cc005f5382288cd5c0a225c23d59298a85bb Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sat, 22 Jan 2022 21:50:37 -1000 Subject: [PATCH 170/247] Add bond button platform, deprecate services that have been converted to buttons (#21300) --- source/_integrations/bond.markdown | 27 ++------------------------- 1 file changed, 2 insertions(+), 25 deletions(-) diff --git a/source/_integrations/bond.markdown b/source/_integrations/bond.markdown index f57d85d4fa1..d43a81ae2ed 100644 --- a/source/_integrations/bond.markdown +++ b/source/_integrations/bond.markdown @@ -2,6 +2,7 @@ title: Bond description: Instructions on setting up Bond Bridge within Home Assistant. ha_category: + - Button - Hub - Cover - Fan @@ -18,6 +19,7 @@ ha_config_flow: true ha_quality_scale: platinum ha_zeroconf: true ha_platforms: + - button - cover - fan - light @@ -58,31 +60,6 @@ upgrade your firmware from Bond app before adding this integration. Firmware version 2.10.8 or newer is required for push updates. The integration will fallback to polling for 2.10.x versions lower than .8 -### Service `bond.start_increasing_brightness` - -Start increasing the light brightness. - -| Service data attribute | Optional | Description | -| ---------------------- | -------- | ----------- | -| `entity_id` | no | String or list of strings of `entity_id`s. - -### Service `bond.start_decreasing_brightness` - -Start decreasing the light brightness. - -| Service data attribute | Optional | Description | -| ---------------------- | -------- | ----------- | -| `entity_id` | no | String or list of strings of `entity_id`s. - -### Service `bond.stop` - -Stop any in-progress action and empty the queue. Calling this service will -stop any increase or decrease in brightness that is in progress. - -| Service data attribute | Optional | Description | -| ---------------------- | -------- | ----------- | -| `entity_id` | no | String or list of strings of `entity_id`s. - ### Service `bond.set_fan_speed_tracked_state` Sets the tracked fan speed for a bond fan. From 9761fcd89d5c91a18048109775ebea1646c4d9c7 Mon Sep 17 00:00:00 2001 From: Jan Bouwhuis Date: Sun, 23 Jan 2022 15:30:11 +0100 Subject: [PATCH 171/247] Add command template for MQTT button (#21135) --- source/_integrations/button.mqtt.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/_integrations/button.mqtt.markdown b/source/_integrations/button.mqtt.markdown index cbbd310639b..b9229a44911 100644 --- a/source/_integrations/button.mqtt.markdown +++ b/source/_integrations/button.mqtt.markdown @@ -56,6 +56,10 @@ availability_topic: description: The MQTT topic subscribed to receive availability (online/offline) updates. Must not be used together with `availability`. required: false type: string +command_template: + description: Defines a [template](/docs/configuration/templating/#processing-incoming-data) to generate the payload to send to `command_topic`. + required: false + type: template command_topic: description: The MQTT topic to publish commands to trigger the button. required: false From 717530f9b6c9c6ad6e4be2d13b9541efdf0a43bd Mon Sep 17 00:00:00 2001 From: Orce MARINKOVSKI Date: Sun, 23 Jan 2022 20:03:15 +0100 Subject: [PATCH 172/247] doc update for MQTT light shema template (#21062) --- source/_integrations/light.mqtt.markdown | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/source/_integrations/light.mqtt.markdown b/source/_integrations/light.mqtt.markdown index 99d3b5dd68f..2689d1e840a 100644 --- a/source/_integrations/light.mqtt.markdown +++ b/source/_integrations/light.mqtt.markdown @@ -19,7 +19,7 @@ The `mqtt` light platform lets you control your MQTT enabled lights through one | Color temperature | ✔ | ✔ | ✔ | | Effects | ✔ | ✔ | ✔ | | Flashing | ✘ | ✔ | ✔ | -| HS Color | ✔ | ✔ | ✘ | +| HS Color | ✔ | ✔ | ✔ | | RGB Color | ✔ | ✔ | ✔ | | RGBW Color | ✔ | ✔ | ✘ | | RGBWW Color | ✔ | ✔ | ✘ | @@ -809,7 +809,7 @@ light: The `mqtt` light platform with template schema lets you control a MQTT-enabled light that receive commands on a command topic and optionally sends status update on a state topic. It is format-agnostic so you can use any data format you want (i.e., string, JSON), just configure it with templating. -This schema supports on/off, brightness, RGB colors, XY colors, color temperature, transitions, short/long flashing and effects. +This schema supports on/off, brightness, RGB colors, XY colors, HS Color, color temperature, transitions, short/long flashing and effects. ## Template schema - Configuration @@ -1034,7 +1034,7 @@ In this section you find some real-life examples of how to use this light. ### Simple string payload -For a simple string payload with the format `state,brightness,r-g-b` (e.g., `on,255,255-255-255`), add the following to your `configuration.yaml` file: +For a simple string payload with the format `state,brightness,r-g-b,h-s` (e.g., `on,255,255-255-255,360-100`), add the following to your `configuration.yaml` file: {% raw %} @@ -1045,7 +1045,7 @@ light: schema: template command_topic: "home/rgb1/set" state_topic: "home/rgb1/status" - command_on_template: "on,{{ brightness|d }},{{ red|d }}-{{ green|d }}-{{ blue|d }}" + command_on_template: "on,{{ brightness|d }},{{ red|d }}-{{ green|d }}-{{ blue|d }},{{ hue|d }}-{{ sat|d }}" command_off_template: "off" state_template: "{{ value.split(',')[0] }}" # must return `on` or `off` brightness_template: "{{ value.split(',')[1] }}" @@ -1080,6 +1080,9 @@ light: {%- if red is defined and green is defined and blue is defined -%} , "color": [{{ red }}, {{ green }}, {{ blue }}] {%- endif -%} + {%- if hue is defined and sat is defined -%} + , "huesat": [{{ hue }}, {{ sat }}] + {%- endif -%} {%- if effect is defined -%} , "effect": "{{ effect }}" {%- endif -%} From 90baa8dc5000a10216cbf60a68d0e7c2abd4880a Mon Sep 17 00:00:00 2001 From: tausen Date: Sun, 23 Jan 2022 20:03:51 +0100 Subject: [PATCH 173/247] Update IHC lights auto-setup list (#20097) --- source/_integrations/ihc.markdown | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/_integrations/ihc.markdown b/source/_integrations/ihc.markdown index 86b1592059b..2dac180b286 100644 --- a/source/_integrations/ihc.markdown +++ b/source/_integrations/ihc.markdown @@ -218,8 +218,11 @@ When auto setup is enabled the following products will be found in the IHC proje - Wireless lamp outlet dimmer - Wireless dimmer - Wireless combi dimmer 4 buttons +- Wireless combi dimmer 4 buttons touch +- Wireless combi dimmer 2 buttons touch - Wireless lamp outlet relay - Wireless combi relay 4 buttons +- Wireless combi relay 2 buttons - Wireless mobile dimmer - Dataline lamp outlet From efa507f21d142ef9ddddb6cc61c16a2eac784bd4 Mon Sep 17 00:00:00 2001 From: Hans Oischinger Date: Sun, 23 Jan 2022 20:04:29 +0100 Subject: [PATCH 174/247] vicare: Update docs (#21288) --- source/_integrations/vicare.markdown | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/source/_integrations/vicare.markdown b/source/_integrations/vicare.markdown index 54a6dff4384..9f6f8ec10f5 100644 --- a/source/_integrations/vicare.markdown +++ b/source/_integrations/vicare.markdown @@ -13,6 +13,7 @@ ha_platforms: - climate - sensor - water_heater + - button ha_dhcp: true --- @@ -24,6 +25,7 @@ There is currently support for the following device types within Home Assistant: - [Climate](#climate) (Heating) - [Water Heater](#water-heater) (Domestic Hot Water) - [Sensor](#sensor) (Sensor) +- [Button](#button) (Button) {% include integrations/config_flow.md %} @@ -123,4 +125,9 @@ Sets the target temperature of domestic hot water to the given temperature. ## Sensor -Additional data from ViCare is available as separate sensors. The sensors are automatically created based on the configured `heating_type`. +Additional data from ViCare is available as separate sensors. The sensors are automatically discovered based on the available API data points. + +## Button + +Button entities are available for triggering like a one-time charge of the water heater. + \ No newline at end of file From cc6abf1bbbdb4b2019d72929746dba23a9a7e576 Mon Sep 17 00:00:00 2001 From: micha91 Date: Sun, 23 Jan 2022 20:26:24 +0100 Subject: [PATCH 175/247] Add Select Entities to MusicCast Documentation (#20523) --- .../_integrations/yamaha_musiccast.markdown | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/source/_integrations/yamaha_musiccast.markdown b/source/_integrations/yamaha_musiccast.markdown index 87381be46ad..08ddd54e147 100644 --- a/source/_integrations/yamaha_musiccast.markdown +++ b/source/_integrations/yamaha_musiccast.markdown @@ -77,6 +77,25 @@ The following entities will be added, if they are supported by the MusicCast dev - DTS Dialogue Control (configuration, zone level) - Control the volume of dialogues for DTS:X content +### Select Entities +The following entities will be added, if they are supported by the MusicCast device: +- Dimmer (configuration, device level) + - Set the display brightness +- Surround Decoder Type (configuration, zone level) + - If sound program is set to surround decoder, the decoder type can be selected here +- Sleep (configuration, zone level) + - Set a sleep timer for the device +- Equalizer Mode (configuration, zone level) + - Some devices support multiple different equalizer modes +- Tone Control Mode (configuration, zone level) + - Some devices support multiple different tone control modes +- Link Audio Delay (configuration, zone level) + - Some devices let the user select, whether he prefers to have audio and video in sync or the audio of linked speakers in a group +- Link Control (configuration, zone level) + - Some devices support compressed audio for groups +- Link Audio Quality (configuration, zone level) + - Set the audio quality for grouped speakers + ## Troubleshooting In this section known problems and their resolution are documented. From 554f1f683e57e217731e87418e485f7e17d09a02 Mon Sep 17 00:00:00 2001 From: Kim Frellsen Date: Sun, 23 Jan 2022 20:43:57 +0100 Subject: [PATCH 176/247] update documentation to match FortiOS device tracker updates (#20713) Co-authored-by: Martin Hjelmare Co-authored-by: Franck Nijhof Co-authored-by: Franck Nijhof --- source/_integrations/fortios.markdown | 42 +++++++++++++++------------ 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/source/_integrations/fortios.markdown b/source/_integrations/fortios.markdown index 5e1ce233ce6..d302b31d172 100644 --- a/source/_integrations/fortios.markdown +++ b/source/_integrations/fortios.markdown @@ -1,28 +1,32 @@ --- title: FortiOS description: Instructions on how to use Fortinet FortiOS to track devices in Home Assistant. -ha_category: - - Presence Detection -ha_release: 0.97 +ha_category: + - Presence Detection ha_iot_class: Local Polling -ha_codeowners: - - '@kimfrellsen' +ha_release: 0.97 ha_domain: fortios ha_platforms: - device_tracker +ha_codeowners: + - '@kimfrellsen' --- -This integration enables Home Assistant to do device tracking of devices with a MAC address connected to a FortiGate from [Fortinet](https://www.fortinet.com). +The FortiOS presence detection enables Home Assistant to track devices with a MAC address connected to a FortiGate from [Fortinet](https://www.fortinet.com). -The integration relies on the [fortiosapi](https://pypi.org/project/fortiosapi/). -The integration has been tested both on FortiGate appliance and FortiGate VM running SW FortiOS v. 6.0.x and 6.2.0. +The integration relies on the [fortiosapi](https://pypi.org/project/fortiosapi/). It has been verified on FortiGate appliances and FortiGate VM running FortiOS v. 6.4.x (up to 6.4.8) and 7.0.x (up to 7.0.4). +The minimum version supported is FortiOS 6.4.3. All devices with a MAC address identified by FortiGate would be tracked, this covers both Ethernet and Wi-Fi devices, including devices detected by LLDP. The integration is based on the Home Assistant `device_tracker` platform. +### Example Configuration: + +This example uses the FortiOS integration as a device tracker, with an API token and does not verify the SSL certificate. + ```yaml -# Example configuration.yaml entry +# Example configuration.yaml device_tracker: - platform: fortios host: YOUR_HOST @@ -31,16 +35,16 @@ device_tracker: {% configuration %} host: - description: Hostname or IP address of the FortiGate. - required: true - type: string + description: Hostname or IP address of the FortiGate. Optionally port name can be added like this "10.10.10.10:443". Remember quotes if port number is added. + required: true + type: string token: - description: "See: [Generate an API token for FortiOS](https://registry.terraform.io/providers/fortinetdev/fortios/latest/docs/guides/fgt_token) for how to create an API token. Remember this integration only needs read access to a FortiGate, so configure the API user to only to have limited and read-only access." - required: true - type: string + description: "See: [Generate an API token for FortiOS](https://docs.fortinet.com/document/forticonverter/6.2.0/online-help/866905/connect-fortigate-device-via-api-token) for how to create an API token. This integration only needs read access to a FortiGate, so configure the API user to only to have limited and read-only access." + required: true + type: string verify_ssl: - description: If the SSL certificate should be verified. In most home cases users do not have a verified certificate. - required: false - type: boolean - default: false + description: If the SSL certificate should be verified. In most home cases users do not have a verified certificate. + required: false + type: boolean + default: false {% endconfiguration %} From b48f711971c219fb52962839be9d8a6b8c1d83b5 Mon Sep 17 00:00:00 2001 From: Loek Sangers <9132841+LoekSangers@users.noreply.github.com> Date: Sun, 23 Jan 2022 20:45:46 +0100 Subject: [PATCH 177/247] Enable google assistant local fulfillment (#20987) --- .../_integrations/google_assistant.markdown | 15 ++ .../integrations/google_assistant/app.js | 189 ++++++++++++++++++ 2 files changed, 204 insertions(+) create mode 100644 source/assets/integrations/google_assistant/app.js diff --git a/source/_integrations/google_assistant.markdown b/source/_integrations/google_assistant.markdown index f1b89077976..33586aafb43 100644 --- a/source/_integrations/google_assistant.markdown +++ b/source/_integrations/google_assistant.markdown @@ -107,6 +107,21 @@ If you want to support active reporting of state to Google's server (configurati 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. +### Enable Local Fulfillment + +1. Open the project you created in the [Actions on Google console](https://console.actions.google.com/). +2. Click `Develop` on the top of the page, then click `Actions` located in the hamburger menu on the top left. +3. Upload [this Javascript file](/assets/integrations/google_assistant/app.js) for both Node and Chrome by clicking the `Upload Javascript files` button. +4. Add device scan configuration: + 1. Click `+ New scan config` + 2. Select `MDNS` + 3. set mDNS service name to `_home-assistant._tcp.local` +5. `Save` your changes. +6. Either wait for 30 minutes, or restart your connected Google device. +7. Restart Home Assistant Core. + +You can debug the setup by following [these instructions](https://developers.google.com/assistant/smarthome/develop/local#debugging_from_chrome) + ### YAML Configuration Now add your setup to your `configuration.yaml` file, such as: diff --git a/source/assets/integrations/google_assistant/app.js b/source/assets/integrations/google_assistant/app.js new file mode 100644 index 00000000000..7a9a7ff1a20 --- /dev/null +++ b/source/assets/integrations/google_assistant/app.js @@ -0,0 +1,189 @@ +"use strict"; +/// +/* +BASED ON: https://github.com/NabuCasa/home-assistant-google-assistant-local-sdk +Only removed the fart sound at the end. +For license information please check the repository. +*/ +var App = smarthome.App; +var Constants = smarthome.Constants; +var DataFlow = smarthome.DataFlow; +var Execute = smarthome.Execute; +var Intents = smarthome.Intents; +var IntentFlow = smarthome.IntentFlow; +const findHassCustomDeviceDataByMdnsData = (requestId, devices, mdnsScanData) => { + let device; + device = devices.find((dev) => { + const customData = dev.customData; + return (customData && + "webhookId" in customData && + (!mdnsScanData.uuid || customData.uuid === mdnsScanData.uuid) && + (!mdnsScanData.baseUrl || customData.baseUrl === mdnsScanData.baseUrl)); + }); + // backwards compatibility for HA < 0.109 + if (!device) { + device = devices.find((dev) => dev.customData && + "webhookId" in dev.customData); + } + if (!device) { + console.log(requestId, "Unable to find HASS connection info.", devices); + throw new IntentFlow.HandlerError(requestId, "invalidRequest", "Unable to find HASS connection info."); + } + return device.customData; +}; +const findHassCustomDeviceDataByDeviceId = (requestId, devices, deviceId) => { + let device; + device = devices.find((dev) => { + const customData = dev.customData; + return (customData && + "webhookId" in customData && + customData.proxyDeviceId === deviceId); + }); + if (!device) { + console.log(requestId, "Unable to find HASS connection info.", devices); + throw new IntentFlow.HandlerError(requestId, "invalidRequest", "Unable to find HASS connection info."); + } + return device.customData; +}; +const createResponse = (request, payload) => ({ + intent: request.inputs[0].intent, + requestId: request.requestId, + payload, +}); +class UnknownInstance extends Error { + constructor(requestId) { + super(); + this.requestId = requestId; + } + throwHandlerError() { + throw new IntentFlow.HandlerError(this.requestId, "invalidRequest", "Unknown Instance"); + } +} +const forwardRequest = async (hassDeviceData, targetDeviceId, request) => { + const command = new DataFlow.HttpRequestData(); + command.method = Constants.HttpOperation.POST; + command.requestId = request.requestId; + command.deviceId = targetDeviceId; + command.isSecure = hassDeviceData.httpSSL; + command.port = hassDeviceData.httpPort; + command.path = `/api/webhook/${hassDeviceData.webhookId}`; + command.data = JSON.stringify(request); + command.dataType = "application/json"; + console.log(request.requestId, "Sending", command); + const deviceManager = await app.getDeviceManager(); + let resp; + try { + resp = await new Promise((resolve, reject) => { + setTimeout(() => reject(-1), 10000); + deviceManager + .send(command) + .then((response) => resolve(response), reject); + }); + // resp = (await deviceManager.send(command)) as HttpResponseData; + console.log(request.requestId, "Raw Response", resp); + } + catch (err) { + console.error(request.requestId, "Error making request", err); + throw new IntentFlow.HandlerError(request.requestId, "invalidRequest", err === -1 ? "Timeout" : err.message); + } + // Response if the webhook is not registered. + if (resp.httpResponse.statusCode === 200 && !resp.httpResponse.body) { + throw new UnknownInstance(request.requestId); + } + try { + const response = JSON.parse(resp.httpResponse.body); + // Local SDK wants this. + response.intent = request.inputs[0].intent; + console.log(request.requestId, "Response", response); + return response; + } + catch (err) { + console.error(request.requestId, "Error parsing body", err); + throw new IntentFlow.HandlerError(request.requestId, "invalidRequest", err.message); + } +}; +const identifyHandler = async (request) => { + console.log("IDENTIFY intent:", request); + const deviceToIdentify = request.inputs[0].payload.device; + if (!deviceToIdentify.mdnsScanData) { + console.error(request.requestId, "No usable mdns scan data"); + return createResponse(request, {}); + } + if (!deviceToIdentify.mdnsScanData.serviceName.endsWith("._home-assistant._tcp.local")) { + console.error(request.requestId, "Not Home Assistant type"); + return createResponse(request, {}); + } + try { + const hassCustomData = findHassCustomDeviceDataByMdnsData(request.requestId, request.devices, deviceToIdentify.mdnsScanData.txt); + return await forwardRequest(hassCustomData, "", request); + } + catch (err) { + if (err instanceof UnknownInstance) { + return createResponse(request, {}); + } + throw err; + } +}; +const reachableDevicesHandler = async (request) => { + console.log("REACHABLE_DEVICES intent:", request); + const hassCustomData = findHassCustomDeviceDataByDeviceId(request.requestId, request.devices, request.inputs[0].payload.device.id); + try { + return forwardRequest(hassCustomData, + // Old code would sent it to the proxy ID: hassCustomData.proxyDeviceId + // But tutorial claims otherwise, but maybe it is not for hub devices?? + // https://developers.google.com/assistant/smarthome/develop/local#implement_the_execute_handler + // Sending it to the device that has to receive the command as per the tutorial + request.inputs[0].payload.device.id, request); + } + catch (err) { + if (err instanceof UnknownInstance) { + err.throwHandlerError(); + } + throw err; + } +}; +const executeHandler = async (request) => { + console.log("EXECUTE intent:", request); + const device = request.inputs[0].payload.commands[0].devices[0]; + try { + return forwardRequest(device.customData, device.id, request); + } + catch (err) { + if (err instanceof UnknownInstance) { + err.throwHandlerError(); + } + throw err; + } +}; +const app = new App("1.0.0"); +app + .onIdentify(identifyHandler) + .onReachableDevices(reachableDevicesHandler) + .onExecute(executeHandler) + // Undocumented in TypeScript + // Suggested by Googler, seems to work :shrug: + // https://github.com/actions-on-google/smart-home-local/issues/1#issuecomment-515706997 + // @ts-ignore + .onProxySelected((req) => { + console.log("ProxySelected", req); + return createResponse(req, {}); +}) + // @ts-ignore + .onIndicate((req) => console.log("Indicate", req)) + // @ts-ignore + .onParseNotification((req) => console.log("ParseNotification", req)) + // @ts-ignore + .onProvision((req) => console.log("Provision", req)) + // @ts-ignore + .onQuery((req) => console.log("Query", req)) + // @ts-ignore + .onRegister((req) => console.log("Register", req)) + // @ts-ignore + .onUnprovision((req) => console.log("Unprovision", req)) + // @ts-ignore + .onUpdate((req) => console.log("Update", req)) + .listen() + .then(() => { + console.log("Ready!"); +}) + .catch((e) => console.error(e)); From b20226b001c3305afdd1702c94c6bb26ef7870f5 Mon Sep 17 00:00:00 2001 From: mletenay Date: Sun, 23 Jan 2022 20:56:09 +0100 Subject: [PATCH 178/247] Add Goodwe integration documentation (#20000) Co-authored-by: Franck Nijhof Co-authored-by: Franck Nijhof --- source/_integrations/goodwe.markdown | 55 ++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 source/_integrations/goodwe.markdown diff --git a/source/_integrations/goodwe.markdown b/source/_integrations/goodwe.markdown new file mode 100644 index 00000000000..d19d3e4605b --- /dev/null +++ b/source/_integrations/goodwe.markdown @@ -0,0 +1,55 @@ +--- +title: GoodWe +description: Instructions on how to connect your GoodWe Inverter to Home Assistant. +ha_category: + - Sensor + - Energy +ha_iot_class: Local Polling +ha_config_flow: true +ha_release: 2022.2 +ha_codeowners: + - "@mletenay" +ha_domain: goodwe +ha_platforms: + - sensor +--- + +The GoodWe integration will poll a [GoodWe](http://www.goodwe.com/) solar inverter over the local network and present its runtime values as sensors in Home Assistant. + +It works with GoodWe ET, EH, BT, BH, ES, EM, DT, MS, D-NS, XS and BP families of inverters. Different inverter families/models expose different sets of sensors, the newer models have usually broader support. + +
+If you can't communicate with the inverter despite your model is listed above, it is possible you have an old ARM firmware version. You should ask manufacturer support to upgrade your ARM firmware (not just inverter firmware) to be able to communicate with the inverter via UDP. + +It may work on other inverter families as well, as long as they listen on UDP port 8899 and respond to one of the supported communication protocols. In general, if you can communicate with the inverter via an official mobile application (PvMaster, SolarGo), it is very likely the integration will work too. +
+ +{% include integrations/config_flow.md %} + +## Energy dashboard + +The plugin provides several values suitable for the energy dashboard. +The best supported are the inverters of ET/EH families, where the sensors `Meter Total Energy (export)`, `Meter Total Energy (import)`, `Total PV Generation`, `Total Battery Charge` and `Total Battery Discharge` are the most suitable for the dashboard measurements and statistics. + +For the other inverter families, if such sensors are not directly available by the inverter, they can be calculated from existing sensors. [Template Sensor](/integrations/template/) can be used to separate buy and sell power values and [Riemann Sum](/integrations/integration/) can be used to convert these instant power (W) values into cumulative energy values (Wh), which then can be used within the energy dashboard. + +## Inverter polling frequency + +The integration will poll the inverter for new values every 10 seconds. If you wish to receive fresh inverter data less (or more) frequently, you can disable the automatic refresh in the integration's system options (Enable polling for updates) and create your own automation with your desired polling frequency. + +```yaml +- alias: "Goodwe inverter data polling" + trigger: + - platform: time_pattern + hours: "*" + minutes: "*" + seconds: "/30" + action: + - service: homeassistant.update_entity + target: + entity_id: sensor.ppv +``` + +
+It has been observed in some rare situations that frequent polling conflicts with updates to the Goodwe SEMS cloud portal and do not receive any updates anymore. Reducing polling frequency to 30 seconds or 1 minute seems to help in such cases. +
From 365dadd93570b287b492c09953727c4365c6e303 Mon Sep 17 00:00:00 2001 From: Allen Porter Date: Mon, 24 Jan 2022 00:08:07 -0800 Subject: [PATCH 179/247] Update stream documentation for LL-HLS enabled by default (#21310) Co-authored-by: Justin Wong <46082645+uvjustin@users.noreply.github.com> --- source/_integrations/stream.markdown | 37 ++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/source/_integrations/stream.markdown b/source/_integrations/stream.markdown index 1fe21fb826e..a6eb09e0c4b 100644 --- a/source/_integrations/stream.markdown +++ b/source/_integrations/stream.markdown @@ -17,26 +17,43 @@ The stream integration provides a way to proxy live streams through Home Assista ## Configuration -The `stream` integration is automatically loaded by `default_config` and enabled by the `camera` platforms that support it. If `default_config` is used, no separate `configuration.yaml` entry is necessary. If `default_config` is not used, the `stream` integration can be activated with the entry below: +The `stream` integration is automatically loaded by `default_config` and enabled by the `camera` platforms that support it. If `default_config` is used, no separate `configuration.yaml` entry is necessary. However, there are some extra options you can configure. -```yaml -# Example configuration.yaml entry. There are no additional options. -stream: -``` +{% configuration %} +ll_hls: + description: Allows disabling Low Latency HLS (LL-HLS) + required: false + type: boolean + default: true +segment_duration: + description: The duration of each HLS segment, in seconds (between 2 and 10) + type: float + required: false + default: 6 +part_duration: + description: The duration of each part within a segment, in seconds (between 0.2 and 1.5) + type: float + required: false + default: 1 +{% endconfiguration %} -## LL-HLS +## LL-HLS - Low Latency HLS -There is the option to enable LL-HLS for lower latency. Please note that LL-HLS has strict timing and network requirements that can be hard to meet, so this option may not work on all setups. As HTTP/2 is required by the LL-HLS specification, the use of an HTTP/2 enabled reverse proxy is strongly recommended. -To enable LL-HLS, add the following to your `configuration.yaml`: +LL-HLS reduces the start time and delay for a stream, but it has strict timing and network requirements and opens additional browser connections. To avoid running into browser limits it is strongly recommended to use an HTTP/2 proxy (e.g., NGINX or haproxy) to take advantage of request pipelining. LL-HLS is enabled by default, but when not using HTTP/2, the Home Assistant frontend will revert back to regular HLS if too many streams are open. + +You can further adjust LL-HLS settings in `configuration.yaml` as it may perform better or worse with different values depending on your network setup, cameras, or whether or not they are local or cloud. + +Example configuration: ```yaml # Example LL-HLS configuration.yaml entry. stream: ll_hls: true - part_duration: 0.75 # Range of 0.2 to 1.5 - segment_duration: 6 # Range of 2 to 10 + part_duration: 0.75 + segment_duration: 6 ``` + ## Technical Details The integration currently supports proxying H.264 and H.265 source streams to the HLS protocol and requires at least FFmpeg >= 4. Note that H.265 support is limited to Safari, iOS, and Android. The `stream` integration also provides limited support for audio. PCM codecs (e.g. G.711/G.723/G.726/G.729) are not supported. ADTS AAC audio is also currently not supported. Most other AAC and MP3 encoded audio should work. From 29102ea6f46e0d7f38bf34d1ea57ad9853b20355 Mon Sep 17 00:00:00 2001 From: Mick Vleeshouwer Date: Mon, 24 Jan 2022 04:46:16 -0800 Subject: [PATCH 180/247] Address late feedback of Overkiz integration (#20841) (#20881) --- source/_integrations/overkiz.markdown | 32 ++++++++++++--------------- 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/source/_integrations/overkiz.markdown b/source/_integrations/overkiz.markdown index f4253a6d445..95a9b7a0199 100644 --- a/source/_integrations/overkiz.markdown +++ b/source/_integrations/overkiz.markdown @@ -2,17 +2,17 @@ title: Overkiz (by Somfy) description: Instructions on how to integrate hubs whom use the Overkiz platform with Home Assistant. ha_category: - - Hub - - Sensor + - Binary Sensor - Button + - Hub + - Light - Lock - Number - - Light - Scene - - Binary Sensor - - Switch - Select -ha_release: 2022.1.0 + - Sensor + - Switch +ha_release: 2022.2 ha_config_flow: true ha_iot_class: Cloud Polling ha_codeowners: @@ -21,18 +21,18 @@ ha_codeowners: - '@vlebourl' ha_domain: overkiz ha_platforms: - - sensor + - binary_sensor - button + - light - lock - number - - light - scene - - binary_sensor - - switch - select + - sensor + - switch --- -The Overkiz (by Somfy) integration platform is used by many different vendors, like Somfy, Hitachi and Atlantic. This integration will allow users to integrate their devices into Home Assistant using the Overkiz API. +The Overkiz (by Somfy) integration platform is used by many different vendors, like Somfy, Hitachi, and Atlantic. This integration will allow users to integrate their devices into Home Assistant using the Overkiz API. ## Supported hubs @@ -62,21 +62,17 @@ Over 6000 devices from 60 brands are compatible with the Overkiz platform. This ### Z-Wave, Hue and Sonos not supported -Even though most Overkiz hubs supports adding Z-Wave, Hue and Sonos devices, this isn't supported in the Overkiz integration. All these platforms have native integrations in Home Assistant which are more stable and feature rich. +Even though most Overkiz hubs support adding Z-Wave, Hue, and Sonos devices, this isn't supported in the Overkiz integration. All these platforms have native integrations in Home Assistant which are more stable and feature-rich. ### Overkiz API limits -**Execution queue is full on gateway: #xxxx-xxxx-xxxx (soft limit: 10)** - -The Overkiz has a limit of 10 actions that can be executed in parallel. Currently this can only be solved by adding a time-out in between your executions, where you need to take the execution time into account. - **Server busy, please try again later. (Too many executions)** -During peak hours, it could happen that the Overkiz platform is unable to execute your command. The integration will try to retry this command, however this is not guaranteed to succeed. +During peak hours, it could happen that the Overkiz platform is unable to execute your command. The integration will try to retry this command, however, this is not guaranteed to succeed. ### Internet connectivity required -This integration communicates via the cloud based Overkiz API, since Overkiz doesn't expose a local API on their hubs. If you are only using Somfy IO compatible devices, you could purchase a Velux KLF200 hub and use to [the Velux integration](/integrations/velux/) which has a local API. +This integration communicates via the cloud-based Overkiz API, since Overkiz doesn't expose a local API on their hubs. If you are only using Somfy IO compatible devices, you could purchase a Velux KLF200 hub and use [the Velux integration](/integrations/velux/) which has a local API. #### Local API via HomeKit Controller From ade58d32832749255f0835088180058b458883b4 Mon Sep 17 00:00:00 2001 From: Mick Vleeshouwer Date: Mon, 24 Jan 2022 14:13:09 -0800 Subject: [PATCH 181/247] Add cover to category and platform for Overkiz (#21285) --- source/_integrations/overkiz.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_integrations/overkiz.markdown b/source/_integrations/overkiz.markdown index 95a9b7a0199..354265a75b8 100644 --- a/source/_integrations/overkiz.markdown +++ b/source/_integrations/overkiz.markdown @@ -4,6 +4,7 @@ description: Instructions on how to integrate hubs whom use the Overkiz platform ha_category: - Binary Sensor - Button + - Cover - Hub - Light - Lock @@ -23,6 +24,7 @@ ha_domain: overkiz ha_platforms: - binary_sensor - button + - cover - light - lock - number From ee33df0979407efa9855a66804ed95b21c1a0d8e Mon Sep 17 00:00:00 2001 From: Christopher Bailey Date: Mon, 24 Jan 2022 19:23:02 -0500 Subject: [PATCH 182/247] Add basic docs for Doorlock for UniFi Protect (#21318) --- source/_integrations/unifiprotect.markdown | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/source/_integrations/unifiprotect.markdown b/source/_integrations/unifiprotect.markdown index c2c9e789397..b6a4be3ed9a 100644 --- a/source/_integrations/unifiprotect.markdown +++ b/source/_integrations/unifiprotect.markdown @@ -140,6 +140,13 @@ Each UniFi Protect viewer will get a device in Home Assistant with the following * **Liveview Select** - A select control will be added for each viewer device that will allow you to select which liveview is being displayed on the viewer. * **Button** - A disabled by default button is added for each viewer device. The button will let you reboot your viewer device. +### UniFi Protect DoorLock + +Each UniFi Protect door lock will get a device in Home Assistant with the following: + +* **Device Configuration** - Door locks will get configuration controls for the Auto-Lock Timeout, selecting the Paired Camera, and Status Light switch +* **Button** - A disabled by default button is added for each door lock device. The button will let you reboot your door lock device. + ### NVR Your main UniFi Protect NVR device also gets a number of diagnostics sensors that can be used for tracking the state of your UniFi Protect system: From 445c75d74d2cf5941e337c9fcef3b87410340eb7 Mon Sep 17 00:00:00 2001 From: Michael <35783820+mib1185@users.noreply.github.com> Date: Tue, 25 Jan 2022 14:05:17 +0100 Subject: [PATCH 183/247] Replace Synology DSM services with buttons (#19677) --- source/_integrations/synology_dsm.markdown | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/source/_integrations/synology_dsm.markdown b/source/_integrations/synology_dsm.markdown index ca0dc7a18a5..74116d79ebb 100644 --- a/source/_integrations/synology_dsm.markdown +++ b/source/_integrations/synology_dsm.markdown @@ -103,20 +103,12 @@ A switch is available to enable/disable the [Surveillance Station](https://www.s For each camera added in [Surveillance Station](https://www.synology.com/en-us/surveillance), a camera will be created in Home Assistant. -## Services +## Buttons -### Service `synology_dsm.reboot` +### Button `reboot` -Reboot the specified NAS by `serial`. If only one DSM is configured, `serial` is optional. +Reboot the NAS. - | Service data attribute | Required | Description | - | ---------------------- | -------- | ----------- | - | `serial` | yes, when multiple NAS are configured | serial of DSM | +### Button `shutdown` -### Service `synology_dsm.shutdown` - -Shutdown the specified NAS by `serial`. If only one DSM is configured, `serial` is optional. - - | Service data attribute | Required | Description | - | ---------------------- | -------- | ----------- | - | `serial` | yes, when multiple NAS are configured | serial of DSM | +Shutdown the NAS. From 54c0609b145325dca94d9fdbeb5314c4d5edc1f2 Mon Sep 17 00:00:00 2001 From: Christopher Bailey Date: Tue, 25 Jan 2022 12:31:38 -0500 Subject: [PATCH 184/247] Add docs for UP Doorlock lock (#21320) --- source/_integrations/unifiprotect.markdown | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/_integrations/unifiprotect.markdown b/source/_integrations/unifiprotect.markdown index b6a4be3ed9a..7ebec9308c5 100644 --- a/source/_integrations/unifiprotect.markdown +++ b/source/_integrations/unifiprotect.markdown @@ -7,6 +7,7 @@ ha_category: - Button - Camera - Light + - Lock - Media Player - Number - Select @@ -28,6 +29,7 @@ ha_platforms: - button - camera - light + - lock - media_player - number - select @@ -144,6 +146,7 @@ Each UniFi Protect viewer will get a device in Home Assistant with the following Each UniFi Protect door lock will get a device in Home Assistant with the following: +* **Lock** - A lock control will be added to lock and unlock your door lock device. * **Device Configuration** - Door locks will get configuration controls for the Auto-Lock Timeout, selecting the Paired Camera, and Status Light switch * **Button** - A disabled by default button is added for each door lock device. The button will let you reboot your door lock device. From 954f79917a5afe204ea0f033a43128adea3621b2 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 25 Jan 2022 08:20:21 -1000 Subject: [PATCH 185/247] Add discovery flags to overkiz (#21329) --- source/_integrations/overkiz.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_integrations/overkiz.markdown b/source/_integrations/overkiz.markdown index 354265a75b8..3e62a8c18fb 100644 --- a/source/_integrations/overkiz.markdown +++ b/source/_integrations/overkiz.markdown @@ -21,6 +21,8 @@ ha_codeowners: - '@imicknl' - '@vlebourl' ha_domain: overkiz +ha_dhcp: true +ha_zeroconf: true ha_platforms: - binary_sensor - button From 748dc1c04b46523e3d208e652423651caf7b194f Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 25 Jan 2022 08:23:16 -1000 Subject: [PATCH 186/247] Add dhcp discovery to SenseME (#21322) --- source/_integrations/senseme.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_integrations/senseme.markdown b/source/_integrations/senseme.markdown index 14632bd7ffc..692a7cb72c5 100644 --- a/source/_integrations/senseme.markdown +++ b/source/_integrations/senseme.markdown @@ -7,6 +7,7 @@ ha_category: - Light - Select - Switch +ha_dhcp: true ha_release: 2022.2 ha_iot_class: Local Push ha_codeowners: From 50657a6c7caf19d6f59f92e659c0b7f94b47db37 Mon Sep 17 00:00:00 2001 From: ufodone <35497351+ufodone@users.noreply.github.com> Date: Tue, 25 Jan 2022 19:22:48 -0800 Subject: [PATCH 187/247] Document envisalink zone bypass switches (#21336) Co-authored-by: J. Nick Koston --- source/_integrations/envisalink.markdown | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/_integrations/envisalink.markdown b/source/_integrations/envisalink.markdown index 6cc1430f60c..72c0afde291 100644 --- a/source/_integrations/envisalink.markdown +++ b/source/_integrations/envisalink.markdown @@ -5,6 +5,7 @@ ha_category: - Alarm - Binary Sensor - Sensor + - Switch ha_release: 0.23 ha_iot_class: Local Push ha_domain: envisalink @@ -12,6 +13,7 @@ ha_platforms: - alarm_control_panel - binary_sensor - sensor + - switch --- The `envisalink` integration will allow Home Assistant users who own either a DSC or Honeywell alarm panel to leverage their alarm system and its sensors to provide Home Assistant with rich information about their homes. Connectivity between Home Assistant and the alarm panel is accomplished through a device produced by Eyez On, known as the Envisalink. The Envisalink evl3 and evl4 boards provide a TCP/IP interface to the alarm panel, where it emulates an alarm keypad. This board also exposes a raw TCP/IP based API, upon which this integration is built. Currently, the Envisalink version 4 is the latest model. This integration supports both the evl3 and the evl4. @@ -23,6 +25,7 @@ There is currently support for the following device types within Home Assistant: - Binary Sensor: Reports on zone status (Check the [type/class](/integrations/binary_sensor/#device-class) list for a possible visualization of your zone.) - Sensor: Emulates an alphanumeric keypad attached to the alarm panel - Alarm Control Panel: Reports on partition status, and can be used to arm/disarm the system +- Switch: Bypass individual zones. Bypass switches are only available on DSC alarm panels due to limitations in the Honeywell interface. This is a fully event-based component. Any event sent by the Envisalink device will be immediately reflected within Home Assistant. From a7fa2d117db83a7a02f67416ba883ef26d3a02ca Mon Sep 17 00:00:00 2001 From: Allen Porter Date: Wed, 26 Jan 2022 00:13:17 -0800 Subject: [PATCH 188/247] Re-merge nest docs to remove misplaced troubleshooting (#21338) --- source/_integrations/nest.markdown | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/source/_integrations/nest.markdown b/source/_integrations/nest.markdown index ea80e23ce25..45d74ef25e0 100644 --- a/source/_integrations/nest.markdown +++ b/source/_integrations/nest.markdown @@ -267,15 +267,11 @@ All Google Nest Thermostat models are exposed as a `climate` entity that use the Given a thermostat named `Upstairs` then the climate entity is created with a name such as `climate.upstairs` -- *Error 400: redirect_uri_mismatch*: This means you have an existing *Web Application* credential. It is recommended to delete the existing OAuth Client id and create a new *Desktop App* credential using the instructions above. This has the advantage of not requiring SSL or a public DNS name. - -- *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: +
This feature is enabled by the following permissions: -- 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 **Devices & Services**, click `...` next to *Nest* and choose **Reload**. +- *Allow Home Assistant to access and control your thermostat*
From 573dd42d891c200875a06c96308f01beebf43f6d Mon Sep 17 00:00:00 2001 From: Allen Porter Date: Wed, 26 Jan 2022 01:15:43 -0800 Subject: [PATCH 189/247] Update documentation for nest Media Source attachments (#21337) --- source/_integrations/nest.markdown | 126 ++++++++++++++++++++++------- 1 file changed, 98 insertions(+), 28 deletions(-) diff --git a/source/_integrations/nest.markdown b/source/_integrations/nest.markdown index 45d74ef25e0..75a38df640a 100644 --- a/source/_integrations/nest.markdown +++ b/source/_integrations/nest.markdown @@ -320,7 +320,7 @@ All cameras have motion and person triggers, however only some support capturing | Nest Cam (indoor, wired)
Nest Cam (outdoor, battery) | WebRTC | Motion
Person | N/A | | Nest Cam Indoor
Nest Cam IQ Indoor
Nest Cam IQ Outdoor
Nest Cam Outdoor | RTSP
Recording | Motion
Person
Sound | Snapshot (jpg) | | Nest Cam with floodlight | WebRTC | Motion
Person | N/A | -| Nest Doorbell (battery) | WebRTC | Motion
Person
Chime | Clip Preview (mp4) | +| Nest Doorbell (battery) | WebRTC | Motion
Person
Chime | Clip Preview (mp4, gif) | | Nest Doorbell (wired) | RTSP
Recording | Motion
Person
Sound
Chime | Snapshot (jpg) | | Nest Hub Max | RTSP
Recording | Motion
Person
Sound
* [SDM API known issue](https://github.com/home-assistant/core/issues/58482) | Snapshot (jpg) | @@ -329,13 +329,35 @@ Given a camera named `Front Yard` then the camera is created with a name such as ## Automation and Device Triggers -The Nest integration makes [device triggers](/docs/automation/trigger/#device-triggers) available to enable automation -in Home Assistant. You should review the [Automating Home Assistant](/getting-started/automation/) getting started guide on automations or the [Automation](/docs/automation/) documentation for full details. +The Nest integration provides [device triggers](/docs/automation/trigger/#device-triggers) to enable automation in Home Assistant. You should review the [Automating Home Assistant](/getting-started/automation/) getting started guide on automations or the [Automation](/docs/automation/) documentation for full details. {% my automations badge %} ![Screenshot Device Triggers](/images/integrations/nest/device_triggers.png) +{% details "Example Device Trigger / Event payload %} + +This is an example of what the `nest_event` payload looks like for a Device Trigger that you can use to power automations. + +```json +{ + "event_type": "nest_event", + "data": { + "device_id": "EXAMPLE_DEVICE_ID", + "type": "doorbell_chime", + "timestamp": "2022-01-26T04:56:54.031000+00:00", + "nest_event_id": "EXAMPLE_EVENT_ID", + }, +} +``` + +* `device_id`: The Home Assistant device identifier for the camera +* `nest_event_id`: is an opaque identifier that can be used with the Media Source Attachments described below for supported cameras. + +{% enddetails %} + +Continue reading below to *Media Source Attachments* to see how to use media with notification actions. +
This feature is enabled by the following permissions: @@ -345,37 +367,85 @@ This feature is enabled by the following permissions: - *Other permissions in the Nest or Google Home apps*.
- -## Example - -This automation will trigger when a `nest_event` event type with a type of `camera_motion` is received from the specified `device_id`. - -```yaml -alias: "motion alert" -trigger: - - platform: event - event_type: nest_event - event_data: - device_id: YOUR_DEVICE_ID - type: camera_motion -action: - - service: notify.mobile_app_pixel_2 - data: - title: motion detected - message: front door motion detected - data: - image: /api/camera_proxy/camera.front_door -``` - -The action in this section uses the [Android Companion App](https://companion.home-assistant.io/docs/notifications/notifications-basic/) and the camera proxy to send a notification with a snapshot from the camera. - - ## Media Source The Nest [Media Source](/integrations/media_source) platform allows you to browse clips for recent camera events. Home Assistant is not intended to be a Network Video Recorder (NVR) platform, however, basic support for capturing recent events is supported. The table above describes which devices support event image snapshots or 10-frame mp4 video clips for recent events. +### Media Attachments + +The Media Source APIs can be used in [Companion App Attachments](https://companion.home-assistant.io/docs/notifications/notification-attachments) for Notifications as actions for Device Triggers above like *Doorbell Pressed*. You will need to be familiar with both the Media Sources supported for your camera, as well as the media capabilities of the companion apps. + +* `/api/nest/event_media/DEVICE_ID/EVENT_ID`: Media for the event, which supports image snapshots (jpg) or clip previews (mp4) depending on the camera type. + +* `/api/nest/event_media/DEVICE_ID/EVENT_ID/thumbnail`: A thumbnail preview of the media, which supports image snapshots (jpg) or clip previews (gif) depending on the camera type. + +You can use the event payload fields `device_id` and `event_id` in an [automation](/getting-started/automation/) to send a notification from an [actions](/getting-started/automation-action/) as shown in the examples below. + +{% details "Example Action: Clip Preview (mp4) attachment for iOS %} + +Example for cameras that support Clip Previews used with iOS which can render video in notifications. + +{% raw %} + +```yaml +service: notify.mobile_app_iphone +data: + message: Doorbell Pressed + title: Someone pressed the doorbell + data: + image: >- + /api/nest/event_media/{{ trigger.event.data.device_id }}/{{ trigger.event.data.nest_event_id }}/thumbnail + video: >- + /api/nest/event_media/{{ trigger.event.data.device_id }}/{{ trigger.event.data.nest_event_id }} +mode: single +``` + +{% endraw %} + +{% enddetails %} + +{% details "Example Action: Clip Preview thumbnail (gif) for Android or iOS %} + +Example for cameras that support Clip Previews, but transcoded to an animated gif (Android does not render video notifications). + +{% raw %} + +```yaml +service: notify.mobile_app_android +data: + message: Doorbell Pressed + title: Someone pressed the doorbell + data: + image: >- + /api/nest/event_media/{{ trigger.event.data.device_id }}/{{ trigger.event.data.nest_event_id }}/thumbnail +``` + +{% endraw %} + +{% enddetails %} + +{% details "Example Action: Snapshot (jpg) attachment for Android or iOS %} + +Example for cameras that support Snaphot (jpg) on either Android or iOS. + +{% raw %} + +```yaml +service: notify.mobile_app +data: + message: Doorbell Pressed + title: Someone pressed the doorbell + data: + image: >- + /api/nest/event_media/{{ trigger.event.data.device_id }}/{{ trigger.event.data.nest_event_id }}/thumbnail +``` + +{% endraw %} + +{% enddetails %} +
This feature is enabled by the following permissions: From 6909101f8462d36227efb1f512af5b21fe0f5111 Mon Sep 17 00:00:00 2001 From: Tathar Date: Wed, 26 Jan 2022 10:37:36 +0100 Subject: [PATCH 190/247] Add unique_id to modbus entities (#21332) --- source/_integrations/modbus.markdown | 36 ++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/source/_integrations/modbus.markdown b/source/_integrations/modbus.markdown index 5f8681c0af4..f259ac0eb38 100644 --- a/source/_integrations/modbus.markdown +++ b/source/_integrations/modbus.markdown @@ -265,6 +265,10 @@ slave: required: false type: integer default: 0 +unique_id: + description: An ID that uniquely identifies this sensor. If two sensors have the same unique ID, Home Assistant will raise an exception. + required: false + type: string {% endconfiguration %} ### Configuring data_type and struct @@ -314,6 +318,10 @@ swap: required: false default: none type: string +unique_id: + description: An ID that uniquely identifies this sensor. If two sensors have the same unique ID, Home Assistant will raise an exception. + required: false + type: string {% endconfiguration %} ## Configuring platform binary sensor @@ -358,6 +366,10 @@ binary_sensors: required: false default: coil type: string + unique_id: + description: An ID that uniquely identifies this sensor. If two sensors have the same unique ID, Home Assistant will raise an exception. + required: false + type: string {% endconfiguration %} ## Configuring platform climate @@ -435,6 +447,10 @@ climates: required: false type: string default: C + unique_id: + description: An ID that uniquely identifies this sensor. If two sensors have the same unique ID, Home Assistant will raise an exception. + required: false + type: string {% endconfiguration %} ### Service `modbus.set-temperature` @@ -526,6 +542,10 @@ covers: description: Modbus register type (holding, input), default holding. required: false type: string + unique_id: + description: An ID that uniquely identifies this sensor. If two sensors have the same unique ID, Home Assistant will raise an exception. + required: false + type: string {% endconfiguration %} ### Example: Modbus cover controlled by a coil @@ -713,6 +733,10 @@ fans: required: false default: same as command_off type: integer + unique_id: + description: An ID that uniquely identifies this sensor. If two sensors have the same unique ID, Home Assistant will raise an exception. + required: false + type: string {% endconfiguration %} ## Configuring platform light @@ -802,6 +826,10 @@ lights: required: false default: same as command_off type: integer + unique_id: + description: An ID that uniquely identifies this sensor. If two sensors have the same unique ID, Home Assistant will raise an exception. + required: false + type: string {% endconfiguration %} ## Configuring platform sensor @@ -882,6 +910,10 @@ sensors: description: The [state_class](https://developers.home-assistant.io/docs/core/entity/sensor#available-state-classes) of the sensor. required: false type: string + unique_id: + description: An ID that uniquely identifies this sensor. If two sensors have the same unique ID, Home Assistant will raise an exception. + required: false + type: string {% endconfiguration %}
@@ -1001,6 +1033,10 @@ switches: required: false default: same as command_off type: integer + unique_id: + description: An ID that uniquely identifies this sensor. If two sensors have the same unique ID, Home Assistant will raise an exception. + required: false + type: string {% endconfiguration %} ## Opening an issue From 4c691e4cf2fbf3aabce3ddbfdc5349e028b0701c Mon Sep 17 00:00:00 2001 From: tokenize47 Date: Wed, 26 Jan 2022 10:11:30 +0000 Subject: [PATCH 191/247] =?UTF-8?q?Solax=20integration=20now=20support=20U?= =?UTF-8?q?I=20configuration=20and=20an=20additional=20pass=E2=80=A6=20(#1?= =?UTF-8?q?9463)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/_integrations/solax.markdown | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/source/_integrations/solax.markdown b/source/_integrations/solax.markdown index 33ec8d6fa78..9c8771876d7 100644 --- a/source/_integrations/solax.markdown +++ b/source/_integrations/solax.markdown @@ -17,26 +17,7 @@ The `solax` integration connects Home Assistant to Solax solar power inverters. ## Configuration -To use the Solax sensors in your installation, add the following to your `configuration.yaml` file: - -```yaml -# Example configuration.yaml entry -sensor: - - platform: solax - ip_address: IP_ADDRESS -``` - -{% configuration %} -ip_address: - description: The IP address of your Solax system. - required: true - type: string -port: - required: false - type: integer - default: 80 - description: The port number -{% endconfiguration %} +{% include integrations/config_flow.md %} ### Optional template sensor From aa6ca66e5397647244ccf6ce812a569fac474f20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Per=20=C3=96berg?= <62830707+droberg@users.noreply.github.com> Date: Wed, 26 Jan 2022 11:24:56 +0100 Subject: [PATCH 192/247] Add onewire ds2760 information (#20986) --- source/_integrations/onewire.markdown | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/_integrations/onewire.markdown b/source/_integrations/onewire.markdown index 3d9c6b8deba..1310ffcc528 100644 --- a/source/_integrations/onewire.markdown +++ b/source/_integrations/onewire.markdown @@ -53,6 +53,7 @@ Each 1-wire component data sheet describes the different properties the componen | 22 | [DS1822](https://datasheets.maximintegrated.com/en/ds/DS1822.pdf) | | | 26 | [DS2438](https://datasheets.maximintegrated.com/en/ds/DS2438.pdf) | Temperature, Voltage, Current (pressure when using B1-R1-A, illuminance when using S2-R1-A, humidity when using compatible Honeywell or Humirel sensor) [2](#note_2) | | 28 | [DS18B20](https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf) | Temperature | +| 30 | [DS2760](https://pdfserv.maximintegrated.com/en/ds/DS2760.pdf) | Temperature, Voltage, Thermocouple Type K [2](#note_2) | | 3B | [DS1825](https://datasheets.maximintegrated.com/en/ds/DS1825.pdf) | Temperature | | 42 | [DS28EA00](https://datasheets.maximintegrated.com/en/ds/DS28EA00.pdf) | Temperature | | 7E | [EDS00xx](https://www.embeddeddatasystems.com/assets/images/supportFiles/manuals/EN-UserMan%20%20OW-ENV%20Sensor%20v13.pdf) | Temperature/Humidity/Barometric pressure/Light [6](#note_6)| @@ -79,8 +80,8 @@ Notes: - The TAI-8570 Pressure Sensor is based on a 1-wire composite device by AAG Electronica. It contains, above 1-wire components, also a barometer, hygrometer and illuminance sensors. This onewire platform can read and present values from that device, but the sensors will default to disabled [4](#note_4). -- For hobbyists, it is quite common to use DS2438 Smart Battery Monitor as a multipurpose measurement node that can place temperature, humidity and luminosity on the 1-wire bus by just adding some standard components to the DS2438. For different component types, there are ready-made algorithms implemented in owfs. Those are exposed by the owfs software and can be read by this platform. The B1-R1-A/pressure is exposed as a barometric pressure sensor. S2-R1-A/illuminance is presented as an illuminance sensor. For a more detailed description of these properties, refer to the [owfs documentation](https://owfs.org/index_php_page_ds2438.html). - For this component, the more basic quantities (temperature, VAD, VDD and IAD) are exported as separate sensors. Please note that some of the sensors will default to disabled [4](#note_4). +- For hobbyists, it is quite common to use DS2438 or DS2760 families of Smart Battery Monitor as a multipurpose measurement node that can place temperature, humidity, current, thermocouple temperature, and luminosity on the 1-wire bus by just adding some standard components to the DS2438 or DS2760. For different component types, there are ready-made algorithms implemented in owfs. Those are exposed by the owfs software and can be read by this platform. The B1-R1-A/pressure is exposed as a barometric pressure sensor. S2-R1-A/illuminance is presented as an illuminance sensor. For a more detailed description of these properties, refer to the owfs documentation [DS2438](https://owfs.org/index_php_page_ds2438.html), [DS2760](https://owfs.org/index_php_page_ds2760.html). + For these components, the more basic quantities (temperature, VAD, VDD and IAD) are exported as separate sensors. Please note that some of the sensors will default to disabled [4](#note_4). - Hobbyboards is a company that has been selling DIY boards of different kinds. The company has been away from the market for some time, so no reference to the boards can be made. This platform has an implementation for some of those. @@ -88,8 +89,7 @@ Notes: - Bridge devices have no sensors. The `aux` and `main` branches are searched for additional 1-wire devices during discovery. -- Multisensors manufactured by Embedded Data Systems. Currently only EDS0066 (temperature/barometric pressure) and EDS0068 (temperature/humidity/barometric pressure/light) are supported. - +- Multisensors manufactured by Embedded Data Systems. Currently only EDS0066 (temperature/barometric pressure) and EDS0068 (temperature/humidity/barometric pressure/light) are supported. ## Interfacing with the 1-wire bus The 1-Wire bus can be connected with a remote 1-wire host over a network connection using owfs and owserver. From 935e0bf121cf11971ae842f240e14e25c42681ee Mon Sep 17 00:00:00 2001 From: jjlawren Date: Wed, 26 Jan 2022 07:12:34 -0600 Subject: [PATCH 193/247] Remove Plex Pass requirement for Sonos casting (#21326) --- source/_integrations/plex.markdown | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/source/_integrations/plex.markdown b/source/_integrations/plex.markdown index c3e1f15c164..c0d9c3c4121 100644 --- a/source/_integrations/plex.markdown +++ b/source/_integrations/plex.markdown @@ -19,7 +19,7 @@ ha_zeroconf: true The Plex integration allows you to connect Home Assistant to a [Plex Media Server](https://plex.tv). Once configured, actively streaming [Plex Clients](https://www.plex.tv/apps-devices/) show up as [Media Players](/integrations/media_player/) and report playback status and library sizes via [Sensors](/integrations/sensor/) in Home Assistant. Media Players will allow you to control media playback and see the current playing item. -Support for playing music directly on linked [Sonos](/integrations/sonos/) speakers is available for users with an active [Plex Pass](https://www.plex.tv/plex-pass/) subscription. More information [here](#sonos-playback). +Support for playing music directly on linked [Sonos](/integrations/sonos/) speakers is available [here](#sonos-playback). There is currently support for the following device types within Home Assistant: @@ -273,10 +273,9 @@ The search will attempt to guess the type of media based on the search parameter To play Plex music directly to Sonos speakers, the following requirements must be met: -1. Have an active [Plex Pass](https://www.plex.tv/plex-pass/) subscription. -2. Remote access enabled for your Plex server. -3. Sonos speakers linked to your Plex account [(Instructions)](https://support.plex.tv/articles/control-sonos-playback-with-a-plex-app/). -4. [Sonos](/integrations/sonos/) integration configured. +1. Remote access enabled for your Plex server. +2. Sonos speakers linked to your Plex account [(Instructions)](https://support.plex.tv/articles/control-sonos-playback-with-a-plex-app/). +3. [Sonos](/integrations/sonos/) integration configured. Call the `media_player.play_media` service with the `entity_id` of a Sonos integration device and `media_content_type` prepended with `plex://`. Both [music](#music) and [playlist](#playlist) `media_content_type` values are supported. From f01e01bd51cb829167dfed5105bcc73a8a6be05d Mon Sep 17 00:00:00 2001 From: Jeef Date: Wed, 26 Jan 2022 08:18:00 -0700 Subject: [PATCH 194/247] Update to Intellifire Docs for Sensor PR (#21276) --- source/_integrations/intellifire.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_integrations/intellifire.markdown b/source/_integrations/intellifire.markdown index c5d25dca45d..3414d2c07fa 100644 --- a/source/_integrations/intellifire.markdown +++ b/source/_integrations/intellifire.markdown @@ -27,3 +27,11 @@ The following sensors are available as either a **Binary Sensor** when dealing w - **Pilot Light Sensor**: Whether the pilot light is turned on. - **Timer Sensor**: Whether the sleep timer is turned on. - **Thermostat Sensor**: Whether the thermostat is turned on. + +### Sensors + +- **Flame Height**: Numerical indicator of flame height, where `0` is the lowest setting. +- **Temperature**: Current ambient temperature as read by the fireplace remote. +- **Target Temperature**: If the thermostat is engaged this is the target temperature the fireplace will try to reach, as measured by the remote. +- **Fan Speed**: Numerical indicator of fan speed. +- **Timer End Time**: If the sleep timer is enabled, this is time it will finish. From 7426c528ce04b6af747e4a7c6857f948bd40a6dd Mon Sep 17 00:00:00 2001 From: Simone Chemelli Date: Wed, 26 Jan 2022 18:44:45 +0100 Subject: [PATCH 195/247] Add sensor platform to UptimeRobot (#21343) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Joakim Sørensen --- source/_integrations/uptimerobot.markdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/_integrations/uptimerobot.markdown b/source/_integrations/uptimerobot.markdown index cca8648de9f..c8f1c6403b8 100644 --- a/source/_integrations/uptimerobot.markdown +++ b/source/_integrations/uptimerobot.markdown @@ -10,11 +10,12 @@ ha_codeowners: ha_domain: uptimerobot ha_platforms: - binary_sensor + - sensor ha_quality_scale: platinum ha_config_flow: true --- -The `uptimerobot` integration provides binary sensors to get the status for all of your monitors from your account on [UptimeRobot]( https://uptimerobot.com). +The `uptimerobot` integration provides entities to get the status for all of your monitors from your account on [UptimeRobot]( https://uptimerobot.com). {% include integrations/config_flow.md %} From 07715f3b71d18f8dd91272ae1dd17c75664f7824 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 26 Jan 2022 19:57:34 +0100 Subject: [PATCH 196/247] Sync codebase with docs for 2022.2 --- CODEOWNERS | 70 +++++++++++-------- source/_integrations/aemet.markdown | 2 - source/_integrations/airvisual.markdown | 1 + source/_integrations/ambient_station.markdown | 1 + .../_integrations/aussie_broadband.markdown | 10 +-- source/_integrations/axis.markdown | 1 + source/_integrations/brother.markdown | 1 + source/_integrations/co2signal.markdown | 1 + source/_integrations/coinbase.markdown | 1 + source/_integrations/cpuspeed.markdown | 2 + source/_integrations/deconz.markdown | 1 + source/_integrations/dnsip.markdown | 2 + source/_integrations/doorbird.markdown | 3 +- source/_integrations/dsmr_reader.markdown | 2 +- source/_integrations/ecobee.markdown | 2 + source/_integrations/elgato.markdown | 1 + .../_integrations/evil_genius_labs.markdown | 1 + source/_integrations/flunearyou.markdown | 1 + source/_integrations/flux_led.markdown | 3 +- source/_integrations/fortios.markdown | 4 +- source/_integrations/fritz.markdown | 1 + source/_integrations/fritzbox.markdown | 1 + source/_integrations/github.markdown | 1 + source/_integrations/goodwe.markdown | 7 +- source/_integrations/guardian.markdown | 1 + .../_integrations/homekit_controller.markdown | 1 + source/_integrations/homewizard.markdown | 1 + source/_integrations/intellifire.markdown | 2 + source/_integrations/iqvia.markdown | 1 + source/_integrations/knx.markdown | 1 + source/_integrations/konnected.markdown | 3 +- source/_integrations/lametric.markdown | 1 + source/_integrations/launch_library.markdown | 3 +- source/_integrations/lookin.markdown | 1 + source/_integrations/luftdaten.markdown | 2 + source/_integrations/mazda.markdown | 1 + source/_integrations/mobile_app.markdown | 2 +- source/_integrations/nam.markdown | 1 + source/_integrations/nanoleaf.markdown | 1 + source/_integrations/nest.markdown | 1 + source/_integrations/netatmo.markdown | 1 + source/_integrations/nmap_tracker.markdown | 2 - source/_integrations/notion.markdown | 1 + source/_integrations/onvif.markdown | 1 + source/_integrations/open_meteo.markdown | 1 + source/_integrations/openuv.markdown | 1 + source/_integrations/overkiz.markdown | 5 +- source/_integrations/philips_js.markdown | 1 + source/_integrations/proxmoxve.markdown | 1 - source/_integrations/pvoutput.markdown | 2 + source/_integrations/qnap.markdown | 2 - .../_integrations/rainforest_eagle.markdown | 1 + source/_integrations/rainmachine.markdown | 1 + source/_integrations/rdw.markdown | 1 + source/_integrations/recollect_waste.markdown | 1 + source/_integrations/renault.markdown | 1 + source/_integrations/repetier.markdown | 1 + source/_integrations/ridwell.markdown | 2 + source/_integrations/roku.markdown | 1 + source/_integrations/rtsp_to_webrtc.markdown | 1 - source/_integrations/screenlogic.markdown | 1 + source/_integrations/sensibo.markdown | 2 + source/_integrations/shelly.markdown | 1 + source/_integrations/smhi.markdown | 2 + source/_integrations/solax.markdown | 1 + source/_integrations/soma.markdown | 1 + source/_integrations/sonos.markdown | 1 + source/_integrations/statistics.markdown | 1 + source/_integrations/stookalert.markdown | 1 + source/_integrations/switcher_kis.markdown | 1 + source/_integrations/synology_dsm.markdown | 2 + source/_integrations/tado.markdown | 1 - source/_integrations/tailscale.markdown | 1 + source/_integrations/tibber.markdown | 1 + source/_integrations/tile.markdown | 1 + .../_integrations/trafikverket_train.markdown | 1 + .../trafikverket_weatherstation.markdown | 1 + source/_integrations/tuya.markdown | 2 + source/_integrations/twentemilieu.markdown | 1 + source/_integrations/twinkly.markdown | 2 + source/_integrations/ubus.markdown | 2 - source/_integrations/unifi.markdown | 1 + source/_integrations/unifiprotect.markdown | 4 +- source/_integrations/uptimerobot.markdown | 2 +- source/_integrations/vallox.markdown | 3 + source/_integrations/verisure.markdown | 1 + source/_integrations/vesync.markdown | 2 +- source/_integrations/vicare.markdown | 3 +- source/_integrations/vlc_telnet.markdown | 2 +- source/_integrations/watttime.markdown | 1 + source/_integrations/webostv.markdown | 1 + source/_integrations/whois.markdown | 3 +- .../_integrations/yamaha_musiccast.markdown | 1 + source/_integrations/yeelight.markdown | 1 - source/_integrations/zeroconf.markdown | 2 +- source/_integrations/zha.markdown | 2 +- source/_integrations/zwave_js.markdown | 1 + 97 files changed, 159 insertions(+), 69 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index 2cb7c511164..3e9b003903c 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -14,7 +14,6 @@ source/_integrations/acmeda.markdown @atmurray source/_integrations/adax.markdown @danielhiversen source/_integrations/adguard.markdown @frenck source/_integrations/advantage_air.markdown @Bre77 -source/_integrations/aemet.markdown @noltari source/_integrations/agent_dvr.markdown @ispysoftware source/_integrations/airly.markdown @bieniu source/_integrations/airnow.markdown @asymworks @@ -32,7 +31,7 @@ source/_integrations/ambiclimate.markdown @danielhiversen source/_integrations/ambient_station.markdown @bachya source/_integrations/amcrest.markdown @flacjacket source/_integrations/analytics.markdown @home-assistant/core @ludeeus -source/_integrations/androidtv.markdown @JeffLIrion +source/_integrations/androidtv.markdown @JeffLIrion @ollo69 source/_integrations/apache_kafka.markdown @bachya source/_integrations/api.markdown @home-assistant/core source/_integrations/apple_tv.markdown @postlund @@ -41,6 +40,7 @@ source/_integrations/aprs.markdown @PhilRW source/_integrations/arcam_fmj.markdown @elupus source/_integrations/arest.markdown @fabaff source/_integrations/arris_tg2492lg.markdown @vanbalken +source/_integrations/aseko_pool_live.markdown @milanmeu source/_integrations/asuswrt.markdown @kennedyshead @ollo69 source/_integrations/atag.markdown @MatsNL source/_integrations/aten_pe.markdown @mtdcr @@ -48,6 +48,7 @@ source/_integrations/atome.markdown @baqs source/_integrations/august.markdown @bdraco source/_integrations/aurora.markdown @djtimca source/_integrations/aurora_abb_powerone.markdown @davet2001 +source/_integrations/aussie_broadband.markdown @nickw444 @Bre77 source/_integrations/auth.markdown @home-assistant/core source/_integrations/automation.markdown @home-assistant/core source/_integrations/avea.markdown @pattyland @@ -97,7 +98,7 @@ source/_integrations/coolmaster.markdown @OnFreund source/_integrations/coronavirus.markdown @home-assistant/core source/_integrations/counter.markdown @fabaff source/_integrations/cover.markdown @home-assistant/core -source/_integrations/cpuspeed.markdown @fabaff +source/_integrations/cpuspeed.markdown @fabaff @frenck source/_integrations/crownstone.markdown @Crownstone @RicArch97 source/_integrations/cups.markdown @fabaff source/_integrations/daikin.markdown @fredrike @@ -117,7 +118,8 @@ source/_integrations/dht.markdown @thegardenmonkey source/_integrations/digital_ocean.markdown @fabaff source/_integrations/discogs.markdown @thibmaek source/_integrations/dlna_dmr.markdown @StevenLooman @chishm -source/_integrations/doorbird.markdown @oblogic7 @bdraco +source/_integrations/dnsip.markdown @gjohansson-ST +source/_integrations/doorbird.markdown @oblogic7 @bdraco @flacjacket source/_integrations/dsmr.markdown @Robbie1221 @frenck source/_integrations/dsmr_reader.markdown @depl0y source/_integrations/dunehd.markdown @bieniu @@ -133,6 +135,7 @@ source/_integrations/egardia.markdown @jeroenterheerdt source/_integrations/eight_sleep.markdown @mezz64 @raman325 source/_integrations/elgato.markdown @frenck source/_integrations/elkm1.markdown @gwww @bdraco +source/_integrations/elmax.markdown @albertogeniola source/_integrations/elv.markdown @majuss source/_integrations/emby.markdown @mezz64 source/_integrations/emoncms.markdown @borpin @@ -166,14 +169,14 @@ source/_integrations/flo.markdown @dmulcahey source/_integrations/flock.markdown @fabaff source/_integrations/flume.markdown @ChrisMandich @bdraco source/_integrations/flunearyou.markdown @bachya -source/_integrations/flux_led.markdown @icemanch +source/_integrations/flux_led.markdown @icemanch @bdraco source/_integrations/forecast_solar.markdown @klaasnicolaas @frenck source/_integrations/forked_daapd.markdown @uvjustin source/_integrations/fortios.markdown @kimfrellsen source/_integrations/foscam.markdown @skgsergio source/_integrations/freebox.markdown @hacf-fr @Quentame source/_integrations/freedompro.markdown @stefano055415 -source/_integrations/fritz.markdown @mammuth @AaronDavidSchneider @chemelli74 +source/_integrations/fritz.markdown @mammuth @AaronDavidSchneider @chemelli74 @mib1185 source/_integrations/fritzbox.markdown @mib1185 @flabbamann source/_integrations/fronius.markdown @nielstron @farmio source/_integrations/frontend.markdown @home-assistant/frontend @@ -191,6 +194,7 @@ source/_integrations/gitter.markdown @fabaff source/_integrations/glances.markdown @fabaff @engrbm87 source/_integrations/goalzero.markdown @tkdrob source/_integrations/gogogate2.markdown @vangorra @bdraco +source/_integrations/goodwe.markdown @mletenay @starkillerOG source/_integrations/google_assistant.markdown @home-assistant/cloud source/_integrations/google_cloud.markdown @lufton source/_integrations/gpsd.markdown @fabaff @@ -217,6 +221,7 @@ source/_integrations/homeassistant.markdown @home-assistant/core source/_integrations/homekit.markdown @bdraco source/_integrations/homekit_controller.markdown @Jc2k @bdraco source/_integrations/homematic.markdown @pvizeli @danielperna84 +source/_integrations/homewizard.markdown @DCSBL source/_integrations/honeywell.markdown @rdfurman source/_integrations/http.markdown @home-assistant/core source/_integrations/huawei_lte.markdown @scop @fphammerle @@ -236,12 +241,14 @@ source/_integrations/image.markdown @home-assistant/core source/_integrations/incomfort.markdown @zxdavb source/_integrations/influxdb.markdown @fabaff @mdegat01 source/_integrations/input_boolean.markdown @home-assistant/core +source/_integrations/input_button.markdown @home-assistant/core source/_integrations/input_datetime.markdown @home-assistant/core source/_integrations/input_number.markdown @home-assistant/core source/_integrations/input_select.markdown @home-assistant/core source/_integrations/input_text.markdown @home-assistant/core source/_integrations/insteon.markdown @teharris1 source/_integrations/integration.markdown @dgomes +source/_integrations/intellifire.markdown @jeeftor source/_integrations/intesishome.markdown @jnimmo source/_integrations/ios.markdown @robbiet480 source/_integrations/iotawatt.markdown @gtdiehl @jyavenard @@ -263,12 +270,12 @@ source/_integrations/keyboard_remote.markdown @bendavid @lanrat source/_integrations/kmtronic.markdown @dgomes source/_integrations/knx.markdown @Julius2342 @farmio @marvin-w source/_integrations/kodi.markdown @OnFreund @cgtobi -source/_integrations/konnected.markdown @heythisisnate @kit-klein +source/_integrations/konnected.markdown @heythisisnate source/_integrations/kostal_plenticore.markdown @stegm source/_integrations/kraken.markdown @eifinger source/_integrations/kulersky.markdown @emlove -source/_integrations/lametric.markdown @robbiet480 -source/_integrations/launch_library.markdown @ludeeus +source/_integrations/lametric.markdown @robbiet480 @frenck +source/_integrations/launch_library.markdown @ludeeus @DurgNomis-drol source/_integrations/lcn.markdown @alengwenus source/_integrations/lg_netcast.markdown @Drafteed source/_integrations/life360.markdown @pnbruckner @@ -278,9 +285,9 @@ source/_integrations/litterrobot.markdown @natekspencer source/_integrations/local_ip.markdown @issacg source/_integrations/logger.markdown @home-assistant/core source/_integrations/logi_circle.markdown @evanjd -source/_integrations/lookin.markdown @ANMalko +source/_integrations/lookin.markdown @ANMalko @bdraco source/_integrations/luci.markdown @mzdrale -source/_integrations/luftdaten.markdown @fabaff +source/_integrations/luftdaten.markdown @fabaff @frenck source/_integrations/lupusec.markdown @majuss source/_integrations/lutron.markdown @JonGilmore source/_integrations/lutron_caseta.markdown @swails @bdraco @@ -305,7 +312,7 @@ source/_integrations/mill.markdown @danielhiversen source/_integrations/min_max.markdown @fabaff source/_integrations/minecraft_server.markdown @elmurato source/_integrations/minio.markdown @tkislan -source/_integrations/mobile_app.markdown @robbiet480 +source/_integrations/mobile_app.markdown @home-assistant/core source/_integrations/modbus.markdown @adamchengtkc @janiversen @vzahradnik source/_integrations/modem_callerid.markdown @tkdrob source/_integrations/modern_forms.markdown @wonderslug @@ -337,8 +344,8 @@ source/_integrations/nextcloud.markdown @meichthys source/_integrations/nfandroidtv.markdown @tkdrob source/_integrations/nightscout.markdown @marciogranzotto source/_integrations/nilu.markdown @hfurubotten +source/_integrations/nina.markdown @DeerMaximum source/_integrations/nissan_leaf.markdown @filcole -source/_integrations/nmap_tracker.markdown @bdraco source/_integrations/nmbs.markdown @thibmaek source/_integrations/no_ip.markdown @fabaff source/_integrations/noaa_tides.markdown @jdelaney72 @@ -359,9 +366,11 @@ source/_integrations/ohmconnect.markdown @robbiet480 source/_integrations/ombi.markdown @larssont source/_integrations/omnilogic.markdown @oliver84 @djtimca @gentoosu source/_integrations/onboarding.markdown @home-assistant/core +source/_integrations/oncue.markdown @bdraco source/_integrations/ondilo_ico.markdown @JeromeHXP source/_integrations/onewire.markdown @garbled1 @epenet source/_integrations/onvif.markdown @hunterjm +source/_integrations/open_meteo.markdown @frenck source/_integrations/openerz.markdown @misialq source/_integrations/opengarage.markdown @danielhiversen source/_integrations/openhome.markdown @bazwilliams @@ -371,6 +380,7 @@ source/_integrations/openweathermap.markdown @fabaff @freekode @nzapponi source/_integrations/opnsense.markdown @mtreinish source/_integrations/orangepi_gpio.markdown @pascallj source/_integrations/oru.markdown @bvlaicu +source/_integrations/overkiz.markdown @imicknl @vlebourl @tetienne source/_integrations/ovo_energy.markdown @timmo001 source/_integrations/ozw.markdown @cgarwood @marcelveldt @MartinHjelmare source/_integrations/p1_monitor.markdown @klaasnicolaas @@ -394,14 +404,13 @@ source/_integrations/profiler.markdown @bdraco source/_integrations/progettihwsw.markdown @ardaseremet source/_integrations/prometheus.markdown @knyar source/_integrations/prosegur.markdown @dgomes -source/_integrations/proxmoxve.markdown @k4ds3 @jhollowe @Corbeno +source/_integrations/proxmoxve.markdown @jhollowe @Corbeno source/_integrations/ps4.markdown @ktnrg45 source/_integrations/push.markdown @dgomes -source/_integrations/pvoutput.markdown @fabaff +source/_integrations/pvoutput.markdown @fabaff @frenck source/_integrations/pvpc_hourly_pricing.markdown @azogue source/_integrations/qbittorrent.markdown @geoffreylagaisse source/_integrations/qld_bushfire.markdown @exxamalte -source/_integrations/qnap.markdown @colinodell source/_integrations/quantum_gateway.markdown @cisasteelersfan source/_integrations/qvr_pro.markdown @oblogic7 source/_integrations/qwikswitch.markdown @kellerza @@ -417,7 +426,7 @@ source/_integrations/recollect_waste.markdown @bachya source/_integrations/recorder.markdown @home-assistant/core source/_integrations/rejseplanen.markdown @DarkFox source/_integrations/renault.markdown @epenet -source/_integrations/repetier.markdown @MTrab +source/_integrations/repetier.markdown @MTrab @ShadowBr0ther source/_integrations/rflink.markdown @javicalle source/_integrations/rfxtrx.markdown @danielhiversen @elupus @RobBie1221 source/_integrations/ridwell.markdown @bachya @@ -430,6 +439,7 @@ source/_integrations/roomba.markdown @pschmitt @cyr-ius @shenxn source/_integrations/roon.markdown @pavoni source/_integrations/rpi_gpio_pwm.markdown @soldag source/_integrations/rpi_power.markdown @shenxn @swetoast +source/_integrations/rtsp_to_webrtc.markdown @allenporter source/_integrations/ruckus_unleashed.markdown @gabe565 source/_integrations/safe_mode.markdown @home-assistant/core source/_integrations/saj.markdown @fredericvl @@ -437,12 +447,13 @@ source/_integrations/samsungtv.markdown @escoand @chemelli74 source/_integrations/scene.markdown @home-assistant/core source/_integrations/schluter.markdown @prairieapps source/_integrations/scrape.markdown @fabaff -source/_integrations/screenlogic.markdown @dieselrabbit +source/_integrations/screenlogic.markdown @dieselrabbit @bdraco source/_integrations/script.markdown @home-assistant/core source/_integrations/search.markdown @home-assistant/core source/_integrations/select.markdown @home-assistant/core source/_integrations/sense.markdown @kbickar -source/_integrations/sensibo.markdown @andrey-git +source/_integrations/senseme.markdown @mikelawrence @bdraco +source/_integrations/sensibo.markdown @andrey-git @gjohansson-ST source/_integrations/sentry.markdown @dcramer @frenck source/_integrations/serial.markdown @fabaff source/_integrations/seven_segments.markdown @fabaff @@ -468,13 +479,14 @@ source/_integrations/smarthab.markdown @outadoc source/_integrations/smartthings.markdown @andrewsayre source/_integrations/smarttub.markdown @mdz source/_integrations/smarty.markdown @z0mbieprocess +source/_integrations/smhi.markdown @gjohansson-ST source/_integrations/sms.markdown @ocalvo source/_integrations/smtp.markdown @fabaff source/_integrations/solaredge.markdown @frenck source/_integrations/solaredge_local.markdown @drobtravels @scheric source/_integrations/solarlog.markdown @Ernst79 source/_integrations/solax.markdown @squishykid -source/_integrations/soma.markdown @ratsept +source/_integrations/soma.markdown @ratsept @sebfortier2288 source/_integrations/somfy.markdown @tetienne source/_integrations/sonarr.markdown @ctalkington source/_integrations/songpal.markdown @rytilahti @shenxn @@ -488,7 +500,8 @@ source/_integrations/sql.markdown @dgomes source/_integrations/squeezebox.markdown @rajlaud source/_integrations/srp_energy.markdown @briglx source/_integrations/starline.markdown @anonym-tsk -source/_integrations/statistics.markdown @fabaff +source/_integrations/statistics.markdown @fabaff @ThomDietrich +source/_integrations/steamist.markdown @bdraco source/_integrations/stiebel_eltron.markdown @fucm source/_integrations/stookalert.markdown @fwestenberg @frenck source/_integrations/stream.markdown @hunterjm @uvjustin @allenporter @@ -509,9 +522,8 @@ source/_integrations/synology_dsm.markdown @hacf-fr @Quentame @mib1185 source/_integrations/synology_srm.markdown @aerialls source/_integrations/syslog.markdown @fabaff source/_integrations/system_bridge.markdown @timmo001 -source/_integrations/tado.markdown @michaelarnauts @noltari +source/_integrations/tado.markdown @michaelarnauts source/_integrations/tag.markdown @balloob @dmulcahey -source/_integrations/tahoma.markdown @philklei source/_integrations/tailscale.markdown @frenck source/_integrations/tankerkoenig.markdown @guillempages source/_integrations/tapsaff.markdown @bazwilliams @@ -533,14 +545,13 @@ source/_integrations/totalconnect.markdown @austinmroczek source/_integrations/tplink.markdown @rytilahti @thegardenmonkey source/_integrations/traccar.markdown @ludeeus source/_integrations/tractive.markdown @Danielhiversen @zhulik @bieniu -source/_integrations/trafikverket_train.markdown @endor-force -source/_integrations/trafikverket_weatherstation.markdown @endor-force +source/_integrations/trafikverket_train.markdown @endor-force @gjohansson-ST +source/_integrations/trafikverket_weatherstation.markdown @endor-force @gjohansson-ST source/_integrations/transmission.markdown @engrbm87 @JPHutchins source/_integrations/tts.markdown @pvizeli source/_integrations/tuya.markdown @Tuya @zlinoliver @METISU @frenck source/_integrations/twentemilieu.markdown @frenck -source/_integrations/twinkly.markdown @dr1rrb -source/_integrations/ubus.markdown @noltari +source/_integrations/twinkly.markdown @dr1rrb @Robbie1221 source/_integrations/unifi.markdown @Kane610 source/_integrations/unifiled.markdown @florisvdk source/_integrations/unifiprotect.markdown @briis @AngellusMortis @bdraco @@ -553,7 +564,7 @@ source/_integrations/uptimerobot.markdown @ludeeus source/_integrations/usb.markdown @bdraco source/_integrations/usgs_earthquakes_feed.markdown @exxamalte source/_integrations/utility_meter.markdown @dgomes -source/_integrations/vallox.markdown @andre-richter +source/_integrations/vallox.markdown @andre-richter @slovdahl @viiru- source/_integrations/velbus.markdown @Cereal2nd @brefra source/_integrations/velux.markdown @Julius2342 source/_integrations/venstar.markdown @garbled1 @@ -580,6 +591,7 @@ source/_integrations/webostv.markdown @bendavid @thecode source/_integrations/websocket_api.markdown @home-assistant/core source/_integrations/wemo.markdown @esev source/_integrations/whirlpool.markdown @abmantis +source/_integrations/whois.markdown @frenck source/_integrations/wiffi.markdown @mampfes source/_integrations/wilight.markdown @leofig-rj source/_integrations/wirelesstag.markdown @sergeymaysak @@ -597,7 +609,7 @@ source/_integrations/xmpp.markdown @fabaff @flowolf source/_integrations/yale_smart_alarm.markdown @gjohansson-ST source/_integrations/yamaha_musiccast.markdown @vigonotion @micha91 source/_integrations/yandex_transport.markdown @rishatik92 @devbis -source/_integrations/yeelight.markdown @rytilahti @zewelor @shenxn @starkillerOG +source/_integrations/yeelight.markdown @zewelor @shenxn @starkillerOG source/_integrations/yeelightsunflower.markdown @lindsaymarkward source/_integrations/yi.markdown @bachya source/_integrations/youless.markdown @gjong diff --git a/source/_integrations/aemet.markdown b/source/_integrations/aemet.markdown index fe5bce9d3aa..a4382b17073 100644 --- a/source/_integrations/aemet.markdown +++ b/source/_integrations/aemet.markdown @@ -7,8 +7,6 @@ ha_category: - Sensor ha_iot_class: Cloud Polling ha_config_flow: true -ha_codeowners: - - '@noltari' ha_domain: aemet ha_platforms: - sensor diff --git a/source/_integrations/airvisual.markdown b/source/_integrations/airvisual.markdown index d205b439b6d..55ea9f0e3b0 100644 --- a/source/_integrations/airvisual.markdown +++ b/source/_integrations/airvisual.markdown @@ -10,6 +10,7 @@ ha_codeowners: ha_domain: airvisual ha_config_flow: true ha_platforms: + - diagnostics - sensor --- diff --git a/source/_integrations/ambient_station.markdown b/source/_integrations/ambient_station.markdown index ea555926294..46919a66408 100644 --- a/source/_integrations/ambient_station.markdown +++ b/source/_integrations/ambient_station.markdown @@ -11,6 +11,7 @@ ha_codeowners: ha_domain: ambient_station ha_platforms: - binary_sensor + - diagnostics - sensor --- diff --git a/source/_integrations/aussie_broadband.markdown b/source/_integrations/aussie_broadband.markdown index 8bacac2ad3e..616da313790 100644 --- a/source/_integrations/aussie_broadband.markdown +++ b/source/_integrations/aussie_broadband.markdown @@ -2,17 +2,17 @@ title: Aussie Broadband description: Instructions on how to integrate Aussie Broadband within Home Assistant. ha_category: -- Network -- Sensor + - Network + - Sensor ha_release: 2022.2 ha_iot_class: Cloud Polling ha_config_flow: true ha_codeowners: -- '@nickw444' -- '@Bre77' + - '@nickw444' + - '@Bre77' ha_domain: aussie_broadband ha_platforms: -- sensor + - sensor --- The Aussie Broadband integration displays various service metrics using the [Aussie Broadband API](https://myaussie-api.aussiebroadband.com.au). diff --git a/source/_integrations/axis.markdown b/source/_integrations/axis.markdown index ae894175cc0..e9cc5f8fb4d 100644 --- a/source/_integrations/axis.markdown +++ b/source/_integrations/axis.markdown @@ -20,6 +20,7 @@ ha_dhcp: true ha_platforms: - binary_sensor - camera + - diagnostics - light - switch --- diff --git a/source/_integrations/brother.markdown b/source/_integrations/brother.markdown index db3a927dc9d..8e5598be928 100644 --- a/source/_integrations/brother.markdown +++ b/source/_integrations/brother.markdown @@ -12,6 +12,7 @@ ha_domain: brother ha_quality_scale: platinum ha_zeroconf: true ha_platforms: + - diagnostics - sensor --- diff --git a/source/_integrations/co2signal.markdown b/source/_integrations/co2signal.markdown index 26efc46fb96..0c05344a9c5 100644 --- a/source/_integrations/co2signal.markdown +++ b/source/_integrations/co2signal.markdown @@ -7,6 +7,7 @@ ha_release: 0.87 ha_iot_class: Cloud Polling ha_domain: co2signal ha_platforms: + - diagnostics - sensor ha_config_flow: true --- diff --git a/source/_integrations/coinbase.markdown b/source/_integrations/coinbase.markdown index d9ca6393b24..7faf3bb95f9 100644 --- a/source/_integrations/coinbase.markdown +++ b/source/_integrations/coinbase.markdown @@ -8,6 +8,7 @@ ha_release: 0.61 ha_iot_class: Cloud Polling ha_domain: coinbase ha_platforms: + - diagnostics - sensor ha_codeowners: - '@tombrien' diff --git a/source/_integrations/cpuspeed.markdown b/source/_integrations/cpuspeed.markdown index edc2f6a3bc7..1605cf04f8c 100644 --- a/source/_integrations/cpuspeed.markdown +++ b/source/_integrations/cpuspeed.markdown @@ -8,9 +8,11 @@ ha_release: pre 0.7 ha_iot_class: Local Push ha_codeowners: - '@fabaff' + - '@frenck' ha_domain: cpuspeed ha_config_flow: true ha_platforms: + - diagnostics - sensor --- diff --git a/source/_integrations/deconz.markdown b/source/_integrations/deconz.markdown index 705380da8e2..6d71ea9255a 100644 --- a/source/_integrations/deconz.markdown +++ b/source/_integrations/deconz.markdown @@ -24,6 +24,7 @@ ha_ssdp: true ha_platforms: - alarm_control_panel - binary_sensor + - diagnostics - climate - cover - fan diff --git a/source/_integrations/dnsip.markdown b/source/_integrations/dnsip.markdown index 58ac84a299d..32b0ad9c823 100644 --- a/source/_integrations/dnsip.markdown +++ b/source/_integrations/dnsip.markdown @@ -9,6 +9,8 @@ ha_release: '0.40' ha_domain: dnsip ha_platforms: - sensor +ha_codeowners: + - '@gjohansson-ST' --- The DNS IP integration will expose an IP address, fetched via DNS resolution, as its value. It provides both IPv4 and IPv6 lookup as separate sensors depending on accessibility to resolvers. diff --git a/source/_integrations/doorbird.markdown b/source/_integrations/doorbird.markdown index f7c6465d497..68016716c27 100644 --- a/source/_integrations/doorbird.markdown +++ b/source/_integrations/doorbird.markdown @@ -11,11 +11,12 @@ ha_config_flow: true ha_codeowners: - '@oblogic7' - '@bdraco' + - '@flacjacket' ha_domain: doorbird ha_zeroconf: true ha_platforms: - - button - camera + - button --- The `doorbird` implementation allows you to integrate your [DoorBird](https://www.doorbird.com/) device in Home Assistant. diff --git a/source/_integrations/dsmr_reader.markdown b/source/_integrations/dsmr_reader.markdown index 98fc77d3a6c..1e270df1045 100644 --- a/source/_integrations/dsmr_reader.markdown +++ b/source/_integrations/dsmr_reader.markdown @@ -4,7 +4,7 @@ description: Instructions on how to integrate DSMR Reader. ha_category: - Energy - Sensor -ha_iot_class: Cloud Polling +ha_iot_class: Local Push ha_release: 0.103 ha_codeowners: - '@depl0y' diff --git a/source/_integrations/ecobee.markdown b/source/_integrations/ecobee.markdown index c13fda908ed..892f2de5e7f 100644 --- a/source/_integrations/ecobee.markdown +++ b/source/_integrations/ecobee.markdown @@ -22,6 +22,8 @@ ha_platforms: - notify - sensor - weather +ha_zeroconf: true +ha_homekit: true --- The `ecobee` integration lets you control and view sensor data from [ecobee](https://ecobee.com) thermostats. diff --git a/source/_integrations/elgato.markdown b/source/_integrations/elgato.markdown index bc38964c2f7..10d56b2d269 100644 --- a/source/_integrations/elgato.markdown +++ b/source/_integrations/elgato.markdown @@ -13,6 +13,7 @@ ha_domain: elgato ha_zeroconf: true ha_platforms: - button + - diagnostics - light --- diff --git a/source/_integrations/evil_genius_labs.markdown b/source/_integrations/evil_genius_labs.markdown index 00d09059204..a9216f0fc91 100644 --- a/source/_integrations/evil_genius_labs.markdown +++ b/source/_integrations/evil_genius_labs.markdown @@ -10,6 +10,7 @@ ha_codeowners: - '@balloob' ha_domain: evil_genius_labs ha_platforms: + - diagnostics - light --- diff --git a/source/_integrations/flunearyou.markdown b/source/_integrations/flunearyou.markdown index a94bbe5fa14..a83df3230cd 100644 --- a/source/_integrations/flunearyou.markdown +++ b/source/_integrations/flunearyou.markdown @@ -10,6 +10,7 @@ ha_codeowners: ha_domain: flunearyou ha_config_flow: true ha_platforms: + - diagnostics - sensor --- diff --git a/source/_integrations/flux_led.markdown b/source/_integrations/flux_led.markdown index 059d9406de1..781ebcbd375 100644 --- a/source/_integrations/flux_led.markdown +++ b/source/_integrations/flux_led.markdown @@ -15,11 +15,12 @@ ha_platforms: - button - light - number - - select - sensor + - select - switch ha_codeowners: - '@icemanch' + - '@bdraco' ha_quality_scale: platinum ha_config_flow: true ha_dhcp: true diff --git a/source/_integrations/fortios.markdown b/source/_integrations/fortios.markdown index d302b31d172..cc94800cbd3 100644 --- a/source/_integrations/fortios.markdown +++ b/source/_integrations/fortios.markdown @@ -1,8 +1,8 @@ --- title: FortiOS description: Instructions on how to use Fortinet FortiOS to track devices in Home Assistant. -ha_category: - - Presence Detection +ha_category: + - Presence Detection ha_iot_class: Local Polling ha_release: 0.97 ha_domain: fortios diff --git a/source/_integrations/fritz.markdown b/source/_integrations/fritz.markdown index 51eded2c278..6716a316355 100644 --- a/source/_integrations/fritz.markdown +++ b/source/_integrations/fritz.markdown @@ -12,6 +12,7 @@ ha_codeowners: - '@mammuth' - '@AaronDavidSchneider' - '@chemelli74' + - '@mib1185' ha_iot_class: Local Polling ha_platforms: - binary_sensor diff --git a/source/_integrations/fritzbox.markdown b/source/_integrations/fritzbox.markdown index 5be5c300b7e..310a1c6e07c 100644 --- a/source/_integrations/fritzbox.markdown +++ b/source/_integrations/fritzbox.markdown @@ -14,6 +14,7 @@ ha_config_flow: true ha_ssdp: true ha_platforms: - binary_sensor + - diagnostics - climate - light - sensor diff --git a/source/_integrations/github.markdown b/source/_integrations/github.markdown index e6f9860834f..0babed50e2d 100644 --- a/source/_integrations/github.markdown +++ b/source/_integrations/github.markdown @@ -8,6 +8,7 @@ ha_release: 0.88 ha_iot_class: Cloud Polling ha_domain: github ha_platforms: + - diagnostics - sensor ha_codeowners: - '@timmo001' diff --git a/source/_integrations/goodwe.markdown b/source/_integrations/goodwe.markdown index d19d3e4605b..39da7c38fab 100644 --- a/source/_integrations/goodwe.markdown +++ b/source/_integrations/goodwe.markdown @@ -1,5 +1,5 @@ --- -title: GoodWe +title: GoodWe Inverter description: Instructions on how to connect your GoodWe Inverter to Home Assistant. ha_category: - Sensor @@ -8,10 +8,13 @@ ha_iot_class: Local Polling ha_config_flow: true ha_release: 2022.2 ha_codeowners: - - "@mletenay" + - '@mletenay' + - '@starkillerOG' ha_domain: goodwe ha_platforms: + - number - sensor + - select --- The GoodWe integration will poll a [GoodWe](http://www.goodwe.com/) solar inverter over the local network and present its runtime values as sensors in Home Assistant. diff --git a/source/_integrations/guardian.markdown b/source/_integrations/guardian.markdown index 16caa94415d..b03e063816f 100644 --- a/source/_integrations/guardian.markdown +++ b/source/_integrations/guardian.markdown @@ -14,6 +14,7 @@ ha_domain: guardian ha_zeroconf: true ha_platforms: - binary_sensor + - diagnostics - sensor - switch ha_dhcp: true diff --git a/source/_integrations/homekit_controller.markdown b/source/_integrations/homekit_controller.markdown index f8d19a64ce2..0190b3193a9 100644 --- a/source/_integrations/homekit_controller.markdown +++ b/source/_integrations/homekit_controller.markdown @@ -27,6 +27,7 @@ ha_platforms: - binary_sensor - camera - button + - diagnostics - climate - cover - fan diff --git a/source/_integrations/homewizard.markdown b/source/_integrations/homewizard.markdown index 45c8a8f2b99..bc333b6a0f2 100644 --- a/source/_integrations/homewizard.markdown +++ b/source/_integrations/homewizard.markdown @@ -11,6 +11,7 @@ ha_codeowners: - '@DCSBL' ha_platforms: - sensor + - switch ha_zeroconf: true --- diff --git a/source/_integrations/intellifire.markdown b/source/_integrations/intellifire.markdown index 3414d2c07fa..7c622c5c514 100644 --- a/source/_integrations/intellifire.markdown +++ b/source/_integrations/intellifire.markdown @@ -9,6 +9,8 @@ ha_codeowners: - '@jeeftor' ha_domain: intellifire ha_config_flow: true +ha_platforms: + - binary_sensor --- IntelliFire Wi-Fi fireplace modules provide app-based and Alexa control to various fireplaces. The modules do expose an unencrypted HTTP endpoint on the network that provides status information. This integration will read that URL and create a set of sensors displaying the current fireplace state. diff --git a/source/_integrations/iqvia.markdown b/source/_integrations/iqvia.markdown index e7771363f15..a86426737ad 100644 --- a/source/_integrations/iqvia.markdown +++ b/source/_integrations/iqvia.markdown @@ -10,6 +10,7 @@ ha_codeowners: - '@bachya' ha_domain: iqvia ha_platforms: + - diagnostics - sensor --- diff --git a/source/_integrations/knx.markdown b/source/_integrations/knx.markdown index 1c776b03256..db01d874bd6 100644 --- a/source/_integrations/knx.markdown +++ b/source/_integrations/knx.markdown @@ -27,6 +27,7 @@ ha_quality_scale: silver ha_platforms: - binary_sensor - button + - diagnostics - climate - cover - fan diff --git a/source/_integrations/konnected.markdown b/source/_integrations/konnected.markdown index 8f8dc4df672..7525d481223 100644 --- a/source/_integrations/konnected.markdown +++ b/source/_integrations/konnected.markdown @@ -6,11 +6,10 @@ ha_category: - Binary Sensor - Switch - Sensor -ha_iot_class: Local Polling +ha_iot_class: Local Push ha_release: '0.70' ha_codeowners: - '@heythisisnate' - - '@kit-klein' ha_config_flow: true ha_domain: konnected ha_ssdp: true diff --git a/source/_integrations/lametric.markdown b/source/_integrations/lametric.markdown index 04a322e8f3b..1f0419cb3f6 100644 --- a/source/_integrations/lametric.markdown +++ b/source/_integrations/lametric.markdown @@ -8,6 +8,7 @@ ha_iot_class: Cloud Push ha_release: 0.49 ha_codeowners: - '@robbiet480' + - '@frenck' ha_domain: lametric ha_platforms: - notify diff --git a/source/_integrations/launch_library.markdown b/source/_integrations/launch_library.markdown index 41afe10ae53..97494a0b0c7 100644 --- a/source/_integrations/launch_library.markdown +++ b/source/_integrations/launch_library.markdown @@ -10,7 +10,9 @@ ha_codeowners: - '@DurgNomis-drol' ha_domain: launch_library ha_platforms: + - diagnostics - sensor +ha_config_flow: true --- The `launch_library` sensor will provide you with information about the next planned space launch. @@ -20,4 +22,3 @@ The `launch_library` sensor will provide you with information about the next pla The data this platform presents comes from [launchlibrary.net][launchlibrary]. [launchlibrary]: https://launchlibrary.net/ - diff --git a/source/_integrations/lookin.markdown b/source/_integrations/lookin.markdown index edd64fcf737..997bba8be34 100644 --- a/source/_integrations/lookin.markdown +++ b/source/_integrations/lookin.markdown @@ -10,6 +10,7 @@ ha_release: 2021.11 ha_iot_class: Local Push ha_codeowners: - '@ANMalko' + - '@bdraco' ha_domain: lookin ha_config_flow: true ha_platforms: diff --git a/source/_integrations/luftdaten.markdown b/source/_integrations/luftdaten.markdown index 465d6aa2cae..41ebce7ef01 100644 --- a/source/_integrations/luftdaten.markdown +++ b/source/_integrations/luftdaten.markdown @@ -10,8 +10,10 @@ ha_config_flow: true ha_quality_scale: gold ha_codeowners: - '@fabaff' + - '@frenck' ha_domain: luftdaten ha_platforms: + - diagnostics - sensor --- diff --git a/source/_integrations/mazda.markdown b/source/_integrations/mazda.markdown index a2a168ba61b..b5406689402 100644 --- a/source/_integrations/mazda.markdown +++ b/source/_integrations/mazda.markdown @@ -14,6 +14,7 @@ ha_codeowners: - '@bdr99' ha_domain: mazda ha_platforms: + - diagnostics - device_tracker - lock - sensor diff --git a/source/_integrations/mobile_app.markdown b/source/_integrations/mobile_app.markdown index 27439673049..b064648d54f 100644 --- a/source/_integrations/mobile_app.markdown +++ b/source/_integrations/mobile_app.markdown @@ -7,7 +7,7 @@ ha_release: 0.89 ha_config_flow: true ha_quality_scale: internal ha_codeowners: - - '@robbiet480' + - '@home-assistant/core' ha_domain: mobile_app ha_iot_class: Local Push ha_platforms: diff --git a/source/_integrations/nam.markdown b/source/_integrations/nam.markdown index 846269c4cf3..09dda88e64a 100644 --- a/source/_integrations/nam.markdown +++ b/source/_integrations/nam.markdown @@ -11,6 +11,7 @@ ha_codeowners: ha_domain: nam ha_platforms: - button + - diagnostics - sensor ha_quality_scale: platinum ha_zeroconf: true diff --git a/source/_integrations/nanoleaf.markdown b/source/_integrations/nanoleaf.markdown index 24344ae1f02..595fa4fe8b5 100644 --- a/source/_integrations/nanoleaf.markdown +++ b/source/_integrations/nanoleaf.markdown @@ -13,6 +13,7 @@ ha_release: 0.67 ha_domain: nanoleaf ha_platforms: - button + - diagnostics - light ha_zeroconf: true ha_ssdp: true diff --git a/source/_integrations/nest.markdown b/source/_integrations/nest.markdown index 75a38df640a..c9bddf02fc1 100644 --- a/source/_integrations/nest.markdown +++ b/source/_integrations/nest.markdown @@ -19,6 +19,7 @@ ha_dhcp: true ha_platforms: - binary_sensor - camera + - diagnostics - climate - sensor --- diff --git a/source/_integrations/netatmo.markdown b/source/_integrations/netatmo.markdown index 3dc3bd01a37..db0319a68c1 100644 --- a/source/_integrations/netatmo.markdown +++ b/source/_integrations/netatmo.markdown @@ -18,6 +18,7 @@ ha_domain: netatmo ha_homekit: true ha_platforms: - camera + - diagnostics - climate - light - sensor diff --git a/source/_integrations/nmap_tracker.markdown b/source/_integrations/nmap_tracker.markdown index a63762437a2..37993b3422c 100644 --- a/source/_integrations/nmap_tracker.markdown +++ b/source/_integrations/nmap_tracker.markdown @@ -9,8 +9,6 @@ ha_domain: nmap_tracker ha_platforms: - device_tracker ha_config_flow: true -ha_codeowners: - - '@bdraco' --- As an alternative to the router-based device tracking, it is possible to directly scan the network for devices by using Nmap. The IP addresses to scan can be specified in any format that Nmap understands, including the network-prefix notation (`192.168.1.1/24`) and the range notation (`192.168.1.1-255`). diff --git a/source/_integrations/notion.markdown b/source/_integrations/notion.markdown index ac37c7610c1..bfc4c53b5e3 100644 --- a/source/_integrations/notion.markdown +++ b/source/_integrations/notion.markdown @@ -13,6 +13,7 @@ ha_codeowners: ha_domain: notion ha_platforms: - binary_sensor + - diagnostics - sensor --- diff --git a/source/_integrations/onvif.markdown b/source/_integrations/onvif.markdown index 63b52c46d2d..edb03ee088e 100644 --- a/source/_integrations/onvif.markdown +++ b/source/_integrations/onvif.markdown @@ -12,6 +12,7 @@ ha_config_flow: true ha_platforms: - binary_sensor - camera + - button - sensor --- diff --git a/source/_integrations/open_meteo.markdown b/source/_integrations/open_meteo.markdown index 825e4716ccf..9c26e2f7aeb 100644 --- a/source/_integrations/open_meteo.markdown +++ b/source/_integrations/open_meteo.markdown @@ -10,6 +10,7 @@ ha_codeowners: - '@frenck' ha_domain: open_meteo ha_platforms: + - diagnostics - weather --- diff --git a/source/_integrations/openuv.markdown b/source/_integrations/openuv.markdown index 50765a0e7bb..13132915ec6 100644 --- a/source/_integrations/openuv.markdown +++ b/source/_integrations/openuv.markdown @@ -13,6 +13,7 @@ ha_codeowners: ha_domain: openuv ha_platforms: - binary_sensor + - diagnostics - sensor --- diff --git a/source/_integrations/overkiz.markdown b/source/_integrations/overkiz.markdown index 3e62a8c18fb..58cfef023c5 100644 --- a/source/_integrations/overkiz.markdown +++ b/source/_integrations/overkiz.markdown @@ -17,22 +17,23 @@ ha_release: 2022.2 ha_config_flow: true ha_iot_class: Cloud Polling ha_codeowners: - - '@tetienne' - '@imicknl' - '@vlebourl' + - '@tetienne' ha_domain: overkiz ha_dhcp: true ha_zeroconf: true ha_platforms: - binary_sensor - button + - diagnostics - cover - light - lock - number - scene - - select - sensor + - select - switch --- diff --git a/source/_integrations/philips_js.markdown b/source/_integrations/philips_js.markdown index cabd61f997a..b2eff1c0961 100644 --- a/source/_integrations/philips_js.markdown +++ b/source/_integrations/philips_js.markdown @@ -15,6 +15,7 @@ ha_platforms: - light - media_player - remote + - switch --- The `philips_js` platform allows you to control Philips TVs which expose the [jointSPACE](http://jointspace.sourceforge.net/) JSON-API. diff --git a/source/_integrations/proxmoxve.markdown b/source/_integrations/proxmoxve.markdown index 976f328efda..7bb8b278018 100644 --- a/source/_integrations/proxmoxve.markdown +++ b/source/_integrations/proxmoxve.markdown @@ -6,7 +6,6 @@ ha_category: ha_release: 0.103 ha_iot_class: Local Polling ha_codeowners: - - '@k4ds3' - '@jhollowe' - '@Corbeno' ha_domain: proxmoxve diff --git a/source/_integrations/pvoutput.markdown b/source/_integrations/pvoutput.markdown index 15ee252a46a..937868a78d4 100644 --- a/source/_integrations/pvoutput.markdown +++ b/source/_integrations/pvoutput.markdown @@ -11,7 +11,9 @@ ha_codeowners: ha_config_flow: true ha_domain: pvoutput ha_platforms: + - diagnostics - sensor +ha_quality_scale: platinum --- The PVOutput integration consumes information from [PVOutput](https://pvoutput.org/) which was uploaded by your solar photovoltaic (PV) system. diff --git a/source/_integrations/qnap.markdown b/source/_integrations/qnap.markdown index bc0662975c1..66d158da674 100644 --- a/source/_integrations/qnap.markdown +++ b/source/_integrations/qnap.markdown @@ -5,8 +5,6 @@ ha_category: - System Monitor ha_release: 0.38 ha_iot_class: Local Polling -ha_codeowners: - - '@colinodell' ha_domain: qnap ha_platforms: - sensor diff --git a/source/_integrations/rainforest_eagle.markdown b/source/_integrations/rainforest_eagle.markdown index 09765677da7..7496eea30b6 100644 --- a/source/_integrations/rainforest_eagle.markdown +++ b/source/_integrations/rainforest_eagle.markdown @@ -11,6 +11,7 @@ ha_codeowners: - '@jcalbert' ha_domain: rainforest_eagle ha_platforms: + - diagnostics - sensor ha_config_flow: true ha_dhcp: true diff --git a/source/_integrations/rainmachine.markdown b/source/_integrations/rainmachine.markdown index c9092cdc6f5..6fe9444df2e 100644 --- a/source/_integrations/rainmachine.markdown +++ b/source/_integrations/rainmachine.markdown @@ -14,6 +14,7 @@ ha_codeowners: ha_domain: rainmachine ha_platforms: - binary_sensor + - diagnostics - sensor - switch ha_zeroconf: true diff --git a/source/_integrations/rdw.markdown b/source/_integrations/rdw.markdown index ccb9bfd48b4..38c568c993b 100644 --- a/source/_integrations/rdw.markdown +++ b/source/_integrations/rdw.markdown @@ -14,6 +14,7 @@ ha_codeowners: ha_domain: rdw ha_platforms: - binary_sensor + - diagnostics - sensor --- diff --git a/source/_integrations/recollect_waste.markdown b/source/_integrations/recollect_waste.markdown index 643d4a23af7..2ef84e6134c 100644 --- a/source/_integrations/recollect_waste.markdown +++ b/source/_integrations/recollect_waste.markdown @@ -10,6 +10,7 @@ ha_codeowners: - '@bachya' ha_config_flow: true ha_platforms: + - diagnostics - sensor --- diff --git a/source/_integrations/renault.markdown b/source/_integrations/renault.markdown index 1e210b88b85..470b5ac2299 100644 --- a/source/_integrations/renault.markdown +++ b/source/_integrations/renault.markdown @@ -16,6 +16,7 @@ ha_domain: renault ha_platforms: - binary_sensor - button + - diagnostics - device_tracker - sensor - select diff --git a/source/_integrations/repetier.markdown b/source/_integrations/repetier.markdown index 38a37e93d7a..889e909a38a 100644 --- a/source/_integrations/repetier.markdown +++ b/source/_integrations/repetier.markdown @@ -8,6 +8,7 @@ ha_release: 0.94 ha_iot_class: Local Polling ha_codeowners: - '@MTrab' + - '@ShadowBr0ther' ha_domain: repetier ha_platforms: - sensor diff --git a/source/_integrations/ridwell.markdown b/source/_integrations/ridwell.markdown index 70110c66854..2c0c4614541 100644 --- a/source/_integrations/ridwell.markdown +++ b/source/_integrations/ridwell.markdown @@ -10,7 +10,9 @@ ha_codeowners: - '@bachya' ha_config_flow: true ha_platforms: + - diagnostics - sensor + - switch --- The Ridwell integration allows users to track waste recycling pickups scheduled with [Ridwell](https://www.ridwell.com). diff --git a/source/_integrations/roku.markdown b/source/_integrations/roku.markdown index 66e088745a3..f91547a104d 100644 --- a/source/_integrations/roku.markdown +++ b/source/_integrations/roku.markdown @@ -18,6 +18,7 @@ ha_ssdp: true ha_homekit: true ha_platforms: - binary_sensor + - diagnostics - media_player - remote - sensor diff --git a/source/_integrations/rtsp_to_webrtc.markdown b/source/_integrations/rtsp_to_webrtc.markdown index 24baaea0dc6..f150bc94967 100644 --- a/source/_integrations/rtsp_to_webrtc.markdown +++ b/source/_integrations/rtsp_to_webrtc.markdown @@ -6,7 +6,6 @@ ha_category: ha_config_flow: true ha_release: 2022.2 ha_iot_class: Local Push -ha_quality_scale: internal ha_codeowners: - '@allenporter' ha_domain: rtsp_to_webrtc diff --git a/source/_integrations/screenlogic.markdown b/source/_integrations/screenlogic.markdown index 8ef314b9667..6552630305d 100644 --- a/source/_integrations/screenlogic.markdown +++ b/source/_integrations/screenlogic.markdown @@ -13,6 +13,7 @@ ha_config_flow: true ha_dhcp: true ha_codeowners: - '@dieselrabbit' + - '@bdraco' ha_domain: screenlogic ha_platforms: - binary_sensor diff --git a/source/_integrations/sensibo.markdown b/source/_integrations/sensibo.markdown index f64a6ab99e1..9f4ceef1249 100644 --- a/source/_integrations/sensibo.markdown +++ b/source/_integrations/sensibo.markdown @@ -8,9 +8,11 @@ ha_iot_class: Cloud Polling ha_config_flow: true ha_codeowners: - '@andrey-git' + - '@gjohansson-ST' ha_domain: sensibo ha_platforms: - climate +ha_homekit: true --- Integrates [Sensibo](https://sensibo.com) Air Conditioning controller into Home Assistant. diff --git a/source/_integrations/shelly.markdown b/source/_integrations/shelly.markdown index 1f79b32e213..a2ca790db55 100644 --- a/source/_integrations/shelly.markdown +++ b/source/_integrations/shelly.markdown @@ -22,6 +22,7 @@ ha_zeroconf: true ha_platforms: - binary_sensor - button + - diagnostics - climate - cover - light diff --git a/source/_integrations/smhi.markdown b/source/_integrations/smhi.markdown index 28f644fc5c6..78ecf1c5071 100644 --- a/source/_integrations/smhi.markdown +++ b/source/_integrations/smhi.markdown @@ -10,6 +10,8 @@ ha_config_flow: true ha_domain: smhi ha_platforms: - weather +ha_codeowners: + - '@gjohansson-ST' --- The `smhi` integration adds support for the [SMHI.se](https://www.smhi.se/) web service as a source for meteorological data for your location. diff --git a/source/_integrations/solax.markdown b/source/_integrations/solax.markdown index 9c8771876d7..8604e1665cc 100644 --- a/source/_integrations/solax.markdown +++ b/source/_integrations/solax.markdown @@ -11,6 +11,7 @@ ha_codeowners: ha_domain: solax ha_platforms: - sensor +ha_config_flow: true --- The `solax` integration connects Home Assistant to Solax solar power inverters. Solax inverters may be connected to a home Wi-Fi network and expose a REST API. This integration retrieves information such as photovoltaic power production, battery levels and power, and how much power is being fed back into the grid. diff --git a/source/_integrations/soma.markdown b/source/_integrations/soma.markdown index cefb87e17b3..f205a4b7ed9 100644 --- a/source/_integrations/soma.markdown +++ b/source/_integrations/soma.markdown @@ -9,6 +9,7 @@ ha_config_flow: true ha_release: '0.100' ha_codeowners: - '@ratsept' + - '@sebfortier2288' ha_domain: soma ha_platforms: - cover diff --git a/source/_integrations/sonos.markdown b/source/_integrations/sonos.markdown index 2cdea4e003e..72d982d6cc6 100644 --- a/source/_integrations/sonos.markdown +++ b/source/_integrations/sonos.markdown @@ -15,6 +15,7 @@ ha_codeowners: ha_ssdp: true ha_platforms: - binary_sensor + - diagnostics - media_player - number - sensor diff --git a/source/_integrations/statistics.markdown b/source/_integrations/statistics.markdown index 6b613dcf36d..dd76cab4cb8 100644 --- a/source/_integrations/statistics.markdown +++ b/source/_integrations/statistics.markdown @@ -9,6 +9,7 @@ ha_release: '0.30' ha_quality_scale: internal ha_codeowners: - '@fabaff' + - '@ThomDietrich' ha_domain: statistics ha_platforms: - sensor diff --git a/source/_integrations/stookalert.markdown b/source/_integrations/stookalert.markdown index 8e792ebe977..ffe37429e82 100644 --- a/source/_integrations/stookalert.markdown +++ b/source/_integrations/stookalert.markdown @@ -13,6 +13,7 @@ ha_domain: stookalert ha_config_flow: true ha_platforms: - binary_sensor + - diagnostics --- The Stookalert integration queries the [RIVM Stookalert](https://www.rivm.nl/stookalert) API for unfavorable weather conditions or poor air quality. With a Stookalert, the RIVM calls on people not to burn wood. This can prevent health problems in people in the area. diff --git a/source/_integrations/switcher_kis.markdown b/source/_integrations/switcher_kis.markdown index 93230033fad..d0a0b607232 100644 --- a/source/_integrations/switcher_kis.markdown +++ b/source/_integrations/switcher_kis.markdown @@ -13,6 +13,7 @@ ha_platforms: - sensor - switch ha_config_flow: true +ha_quality_scale: platinum --- This `Switcher` integration allows you to control your [Switcher Devices](https://www.switcher.co.il/). diff --git a/source/_integrations/synology_dsm.markdown b/source/_integrations/synology_dsm.markdown index 74116d79ebb..376c1f9f151 100644 --- a/source/_integrations/synology_dsm.markdown +++ b/source/_integrations/synology_dsm.markdown @@ -16,6 +16,8 @@ ha_ssdp: true ha_platforms: - binary_sensor - camera + - button + - diagnostics - sensor - switch --- diff --git a/source/_integrations/tado.markdown b/source/_integrations/tado.markdown index 1b09bda080c..f37859d266c 100644 --- a/source/_integrations/tado.markdown +++ b/source/_integrations/tado.markdown @@ -13,7 +13,6 @@ ha_release: 0.41 ha_iot_class: Cloud Polling ha_codeowners: - '@michaelarnauts' - - '@noltari' ha_domain: tado ha_config_flow: true ha_homekit: true diff --git a/source/_integrations/tailscale.markdown b/source/_integrations/tailscale.markdown index aa4068171eb..0e3bb6c58f4 100644 --- a/source/_integrations/tailscale.markdown +++ b/source/_integrations/tailscale.markdown @@ -13,6 +13,7 @@ ha_codeowners: ha_domain: tailscale ha_platforms: - binary_sensor + - diagnostics - sensor ha_quality_scale: platinum --- diff --git a/source/_integrations/tibber.markdown b/source/_integrations/tibber.markdown index d3e7fd71dd1..b8fb2211662 100644 --- a/source/_integrations/tibber.markdown +++ b/source/_integrations/tibber.markdown @@ -13,6 +13,7 @@ ha_codeowners: ha_domain: tibber ha_config_flow: true ha_platforms: + - diagnostics - notify - sensor --- diff --git a/source/_integrations/tile.markdown b/source/_integrations/tile.markdown index ad1a9bf56be..b1fd53c4e4a 100644 --- a/source/_integrations/tile.markdown +++ b/source/_integrations/tile.markdown @@ -10,6 +10,7 @@ ha_codeowners: ha_domain: tile ha_config_flow: true ha_platforms: + - diagnostics - device_tracker --- diff --git a/source/_integrations/trafikverket_train.markdown b/source/_integrations/trafikverket_train.markdown index 49a326c4ae1..6038e4de159 100644 --- a/source/_integrations/trafikverket_train.markdown +++ b/source/_integrations/trafikverket_train.markdown @@ -8,6 +8,7 @@ ha_release: 0.96 ha_iot_class: Cloud Polling ha_codeowners: - '@endor-force' + - '@gjohansson-ST' ha_domain: trafikverket_train ha_platforms: - sensor diff --git a/source/_integrations/trafikverket_weatherstation.markdown b/source/_integrations/trafikverket_weatherstation.markdown index 6971df71739..87071698208 100644 --- a/source/_integrations/trafikverket_weatherstation.markdown +++ b/source/_integrations/trafikverket_weatherstation.markdown @@ -9,6 +9,7 @@ ha_config_flow: true ha_domain: trafikverket_weatherstation ha_codeowners: - '@endor-force' + - '@gjohansson-ST' ha_platforms: - sensor --- diff --git a/source/_integrations/tuya.markdown b/source/_integrations/tuya.markdown index 60fba6ba8fc..a27270d4a97 100644 --- a/source/_integrations/tuya.markdown +++ b/source/_integrations/tuya.markdown @@ -26,9 +26,11 @@ ha_codeowners: - '@METISU' - '@frenck' ha_platforms: + - alarm_control_panel - binary_sensor - camera - button + - diagnostics - climate - cover - fan diff --git a/source/_integrations/twentemilieu.markdown b/source/_integrations/twentemilieu.markdown index 6795f6015c4..9efcb757a29 100644 --- a/source/_integrations/twentemilieu.markdown +++ b/source/_integrations/twentemilieu.markdown @@ -11,6 +11,7 @@ ha_codeowners: - '@frenck' ha_domain: twentemilieu ha_platforms: + - diagnostics - sensor ha_quality_scale: platinum --- diff --git a/source/_integrations/twinkly.markdown b/source/_integrations/twinkly.markdown index 6d5cb600a04..7afb530ebdb 100644 --- a/source/_integrations/twinkly.markdown +++ b/source/_integrations/twinkly.markdown @@ -9,8 +9,10 @@ ha_domain: twinkly ha_iot_class: Local Polling ha_codeowners: - '@dr1rrb' + - '@Robbie1221' ha_platforms: - light +ha_dhcp: true --- The Twinkly integration allows you to control [Twinkly](https://twinkly.com/) LED string from Home Assistant. diff --git a/source/_integrations/ubus.markdown b/source/_integrations/ubus.markdown index 4ed1603edf2..65a531ac900 100644 --- a/source/_integrations/ubus.markdown +++ b/source/_integrations/ubus.markdown @@ -8,8 +8,6 @@ ha_iot_class: Local Polling ha_domain: ubus ha_platforms: - device_tracker -ha_codeowners: - - '@noltari' --- This is a presence detection scanner for [OpenWrt](https://openwrt.org/) using [ubus](https://wiki.openwrt.org/doc/techref/ubus). It scans for changes in `hostapd.*`, which will detect and report changes in devices connected to the access point on the router. diff --git a/source/_integrations/unifi.markdown b/source/_integrations/unifi.markdown index 2b03ef67c00..81b23f872d6 100644 --- a/source/_integrations/unifi.markdown +++ b/source/_integrations/unifi.markdown @@ -15,6 +15,7 @@ ha_codeowners: ha_domain: unifi ha_ssdp: true ha_platforms: + - diagnostics - device_tracker - sensor - switch diff --git a/source/_integrations/unifiprotect.markdown b/source/_integrations/unifiprotect.markdown index 7ebec9308c5..042ac33b0c8 100644 --- a/source/_integrations/unifiprotect.markdown +++ b/source/_integrations/unifiprotect.markdown @@ -26,14 +26,14 @@ ha_codeowners: ha_domain: unifiprotect ha_platforms: - binary_sensor - - button - camera + - button - light - lock - media_player - number - - select - sensor + - select - switch --- diff --git a/source/_integrations/uptimerobot.markdown b/source/_integrations/uptimerobot.markdown index c8f1c6403b8..27e22fb54c1 100644 --- a/source/_integrations/uptimerobot.markdown +++ b/source/_integrations/uptimerobot.markdown @@ -10,7 +10,7 @@ ha_codeowners: ha_domain: uptimerobot ha_platforms: - binary_sensor - - sensor + - diagnostics ha_quality_scale: platinum ha_config_flow: true --- diff --git a/source/_integrations/vallox.markdown b/source/_integrations/vallox.markdown index 4183e742401..4f213ae0456 100644 --- a/source/_integrations/vallox.markdown +++ b/source/_integrations/vallox.markdown @@ -9,10 +9,13 @@ ha_release: 0.96 ha_iot_class: Local Polling ha_domain: vallox ha_platforms: + - binary_sensor - fan - sensor ha_codeowners: - '@andre-richter' + - '@slovdahl' + - '@viiru-' --- The `vallox` integration lets you control any Vallox ventilation unit that is supported by the [vallox_websocket_api](https://github.com/yozik04/vallox_websocket_api) (follow the link for a list of supported units). diff --git a/source/_integrations/verisure.markdown b/source/_integrations/verisure.markdown index d3d9cc312e8..ab0e853b7a7 100644 --- a/source/_integrations/verisure.markdown +++ b/source/_integrations/verisure.markdown @@ -18,6 +18,7 @@ ha_platforms: - alarm_control_panel - binary_sensor - camera + - diagnostics - lock - sensor - switch diff --git a/source/_integrations/vesync.markdown b/source/_integrations/vesync.markdown index 43749fe82f9..e14019db1b2 100644 --- a/source/_integrations/vesync.markdown +++ b/source/_integrations/vesync.markdown @@ -16,8 +16,8 @@ ha_domain: vesync ha_platforms: - fan - light - - switch - sensor + - switch --- The `vesync` integration enables you to control smart switches and outlets connected to the VeSync App. diff --git a/source/_integrations/vicare.markdown b/source/_integrations/vicare.markdown index 9f6f8ec10f5..529fa8a51dd 100644 --- a/source/_integrations/vicare.markdown +++ b/source/_integrations/vicare.markdown @@ -10,10 +10,10 @@ ha_config_flow: true ha_domain: vicare ha_platforms: - binary_sensor + - button - climate - sensor - water_heater - - button ha_dhcp: true --- @@ -130,4 +130,3 @@ Additional data from ViCare is available as separate sensors. The sensors are au ## Button Button entities are available for triggering like a one-time charge of the water heater. - \ No newline at end of file diff --git a/source/_integrations/vlc_telnet.markdown b/source/_integrations/vlc_telnet.markdown index af74840b0ad..0afb7bde652 100644 --- a/source/_integrations/vlc_telnet.markdown +++ b/source/_integrations/vlc_telnet.markdown @@ -1,5 +1,5 @@ --- -title: VLC media player Telnet +title: VLC media player via Telnet description: Instructions on how to integrate VLC media player into Home Assistant using the telnet interface. ha_category: - Media Player diff --git a/source/_integrations/watttime.markdown b/source/_integrations/watttime.markdown index 0d5fa0a60d8..71f9cd5a406 100644 --- a/source/_integrations/watttime.markdown +++ b/source/_integrations/watttime.markdown @@ -10,6 +10,7 @@ ha_codeowners: - '@bachya' ha_config_flow: true ha_platforms: + - diagnostics - sensor --- diff --git a/source/_integrations/webostv.markdown b/source/_integrations/webostv.markdown index 16286b41209..5ff67295a10 100644 --- a/source/_integrations/webostv.markdown +++ b/source/_integrations/webostv.markdown @@ -15,6 +15,7 @@ ha_ssdp: true ha_platforms: - media_player - notify +ha_quality_scale: platinum --- The `webostv` platform allows you to control a [LG](https://www.lg.com/) webOS Smart TV. diff --git a/source/_integrations/whois.markdown b/source/_integrations/whois.markdown index e2c092a7818..e6d9d53775d 100644 --- a/source/_integrations/whois.markdown +++ b/source/_integrations/whois.markdown @@ -8,8 +8,9 @@ ha_iot_class: Cloud Polling ha_domain: whois ha_config_flow: true ha_codeowners: - - "@frenck" + - '@frenck' ha_platforms: + - diagnostics - sensor --- diff --git a/source/_integrations/yamaha_musiccast.markdown b/source/_integrations/yamaha_musiccast.markdown index 08ddd54e147..09dbd6b5e8b 100644 --- a/source/_integrations/yamaha_musiccast.markdown +++ b/source/_integrations/yamaha_musiccast.markdown @@ -14,6 +14,7 @@ ha_domain: yamaha_musiccast ha_platforms: - media_player - number + - select --- The Yamaha MusicCast integration allows you to control [Yamaha MusicCast Receivers](https://usa.yamaha.com/products/audio_visual/musiccast/index.html) from Home Assistant. diff --git a/source/_integrations/yeelight.markdown b/source/_integrations/yeelight.markdown index af51348ac63..61edb9dfc58 100644 --- a/source/_integrations/yeelight.markdown +++ b/source/_integrations/yeelight.markdown @@ -7,7 +7,6 @@ ha_release: 0.32 ha_iot_class: Local Push ha_config_flow: true ha_codeowners: - - '@rytilahti' - '@zewelor' - '@shenxn' - '@starkillerOG' diff --git a/source/_integrations/zeroconf.markdown b/source/_integrations/zeroconf.markdown index cf744403f49..69ec319cf54 100644 --- a/source/_integrations/zeroconf.markdown +++ b/source/_integrations/zeroconf.markdown @@ -53,4 +53,4 @@ Configure the virtual machine to accept this traffic by adding the `trustGuestRx ``` -This only works with the `virtio` network adapter type and it is disabled by default for security reasons. See [the libvirt documentation](https://libvirt.org/formatdomain.html#elementsNICS) for more details. \ No newline at end of file +This only works with the `virtio` network adapter type and it is disabled by default for security reasons. See [the libvirt documentation](https://libvirt.org/formatdomain.html#elementsNICS) for more details. diff --git a/source/_integrations/zha.markdown b/source/_integrations/zha.markdown index 8c14b2c5b0f..b080ad38efa 100644 --- a/source/_integrations/zha.markdown +++ b/source/_integrations/zha.markdown @@ -35,8 +35,8 @@ ha_platforms: - light - lock - number - - select - sensor + - select - siren - switch ha_zeroconf: true diff --git a/source/_integrations/zwave_js.markdown b/source/_integrations/zwave_js.markdown index dfdcdbc532a..66f076e17e8 100644 --- a/source/_integrations/zwave_js.markdown +++ b/source/_integrations/zwave_js.markdown @@ -23,6 +23,7 @@ ha_codeowners: ha_domain: zwave_js ha_platforms: - binary_sensor + - diagnostics - climate - cover - fan From 29d55b6757354e2cb86e8f2f475fd8e89f9e59d1 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 26 Jan 2022 20:36:42 +0100 Subject: [PATCH 197/247] 2022.2.0: Beta release notes --- _config.yml | 8 +- .../_posts/2022-02-02-release-20222.markdown | 6675 +++++++++++++++++ 2 files changed, 6679 insertions(+), 4 deletions(-) create mode 100644 source/_posts/2022-02-02-release-20222.markdown diff --git a/_config.yml b/_config.yml index dc5db2220bb..a8d9a475956 100644 --- a/_config.yml +++ b/_config.yml @@ -105,10 +105,10 @@ social: account: home_assistant # Home Assistant release details -current_major_version: 2021 -current_minor_version: 12 -current_patch_version: 10 -date_released: 2022-01-17 +current_major_version: 2022 +current_minor_version: 02 +current_patch_version: 0 +date_released: 2022-02-02 # 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/2022-02-02-release-20222.markdown b/source/_posts/2022-02-02-release-20222.markdown new file mode 100644 index 00000000000..f76d34f20ac --- /dev/null +++ b/source/_posts/2022-02-02-release-20222.markdown @@ -0,0 +1,6675 @@ +--- +layout: post +title: "2022.2: Beta release notes" +description: "The work in progress beta release notes for 2022.2." +date: 2022-01-25 00:00:00 +date_formatted: "Februari 02, 2022" +author: Franck Nijhof +author_twitter: frenck +comments: true +categories: +- Release-Notes +- Core +og_image: /images/blog/2022-2/social.png +--- + + + +These are the beta release notes for Home Assistant Core 2022.2 (and is thus a +work in progress). + +If you encounter any issues with the beta release, please report them on GitHub: + +- Issues with integrations, automations and such (Core related):
+ +- Issues with the frontend/Lovelace:
+ +- Issues with the Supervisor:
+ +- Issues with the documentation:
+ + +Please be sure to include the beta version you are running in the issue +version field (not title), so we can classify your issue correctly. + +Issues introduced in the beta are processed with priority. + +--- + +The release notes are currently a work in progress, and quite a bit has to +be done. So bear with me during this beta, as I try to make some sense of +a release that contains over 2.5K merged contributions! (An absolute record). + +I'm not sure if this is really fitting, it is Februari already... but since +this is the first release of the year, I'm still going to say it: + +**Happy New Year 🥂** + +Now don't be scared when you look at the breaking changes section. It is a lot, +however, most of those are cleanup of old deprecations or caused by things +moving to the UI. No better way to start a fresh year, by cleaning up 🧹 + +../Frenck + +- [New media player bar, local media...](#new-media-player-bar-local-media) +- [Diagnostics for Integration & Device](#diagnostics-for-integration--device) +- [Improved handling of device tracker entities](#improved-handling-of-device-tracker-entities) +- [Streamlining experiences](#streamlining-experiences) +- [More Advanced things](#more-advanced-things) +- [Python 3.8 dropped](#python-38-dropped) +- [Other noteworthy changes](#other-noteworthy-changes) +- [New Integrations](#new-integrations) +- [Integrations now available to set up from the UI](#integrations-now-available-to-set-up-from-the-ui) +- [If you need help...](#if-you-need-help) +- [Breaking Changes](#breaking-changes) +- [Farewell to the following](#farewell-to-the-following) +- [All changes](#all-changes) + + + + + +## New media player bar, local media... + +The media browser, has been renamed to: "Media". Nice, simple, and clean. + +And it now has an nice media bar in the button to control the media you +are playing: + +

+Screenshot from GitHub PR, needs to be replaced +Screenshot from GitHub PR, needs to be replaced +

+ +Sonos, VLC (via Telnet) and Roku now support playing local media. +And Sonos can now even browse other supported media. For example, if you have +set up the Spotify and Sonos integration, you can now browse your Spotify to +play it on your Sonos devices. + +## Diagnostics for Integration & Device + +To make debugging and reporting issues easier, both in terms of reporting it, +but also for developers to fix them, we have introduce an new integration: +Diagnostics. + +Diagnostics can be provided by integrations, to allow you to download +information about your integration instance or a device, directly from the +Home Assistant frontend. + +

+Screenshot from GitHub PR, needs to be replaced +Screenshot from GitHub PR, needs to be replaced +

+ +This data can be extremely helpful in finding the root causes of issues +and getting them fixed. + +Integrations that have adopted it this release (needs to be writte out nicely) + +- Add diagnostics support to Sonos ([@jjlawren] - [#64576]) ([sonos docs]) +- Add diagnostics support to Tuya ([@frenck] - [#64374]) ([tuya docs]) +- Add diagnostics support to Verisure ([@frenck] - [#64789]) ([verisure docs]) +- Add diagnostics to Launch Library ([@ludeeus] - [#64871]) ([launch_library docs]) +- Add diagnostics support to RDW ([@frenck] - [#64787]) +- Add diagnostics support to Stookalert ([@frenck] - [#64747]) ([stookalert docs]) +- Add diagnostics support to CPU Speed ([@frenck] - [#64745]) ([cpuspeed docs]) +- Add diagnostics support to Whois ([@frenck] - [#64855]) ([whois docs]) +- Add event statistics to Sonos diagnostics ([@jjlawren] - [#64845]) ([sonos docs]) +- Add diagnostics to Notion ([@bachya] - [#64713]) ([notion docs]) +- Add diagnostics to Flu Near You ([@bachya] - [#64597]) ([flunearyou docs]) +- Add diagnostics to ReCollect Waste ([@bachya] - [#64814]) ([recollect_waste docs]) +- Add diagnostics support to Tailscale ([@frenck] - [#64649]) ([tailscale docs]) +- Add diagnostics support to Sensor.Community ([@frenck] - [#64636]) ([luftdaten docs]) +- Add diagnostics support to Elgato ([@frenck] - [#64652]) ([elgato docs]) +- Add diagnostics to NAM ([@bieniu] - [#64743]) ([nam docs]) +- Add diagnostics support to PVOutput ([@frenck] - [#64625]) ([pvoutput docs]) +- Add diagnostics support to Open-Meteo ([@frenck] - [#64645]) ([open_meteo docs]) +- Add diagnostics to Renault integration ([@epenet] - [#64531]) ([renault docs]) ([diagnostics docs]) +- Add rainforest diagnostics ([@balloob] - [#64647]) ([rainforest_eagle docs]) +- Add diagnostics support to TwenteMilieu ([@frenck] - [#64627]) ([twentemilieu docs]) +- Add diagnostics to Brother integration ([@bieniu] - [#64478]) ([brother docs]) +- Add CO2signal diagnostics ([@balloob] - [#64646]) ([co2signal docs]) +- Add diagnostics platform to AVM Fritz!Smarthome ([@mib1185] - [#64657]) ([fritzbox docs]) +- Add diagnostics support to Axis integration ([@Kane610] - [#64637]) ([axis docs]) +- Add diagnostics support for homekit_controller ([@Jc2k] - [#64773]) ([homekit_controller docs]) +- Add diagnostics support to roku ([@ctalkington] - [#64729]) ([roku docs]) +- Add diagnostics platform to Shelly ([@mib1185] - [#64660]) ([shelly docs]) +- Add diagnostics to OpenUV ([@bachya] - [#64716]) ([openuv docs]) +- Add diagnostics support to UniFi Network integration ([@Kane610] - [#64640]) ([unifi docs]) +- Add diagnostics to IQVIA ([@bachya] - [#64602]) ([iqvia docs]) +- Add diagnostics to Elexa Guardian ([@bachya] - [#64599]) ([guardian docs]) +- Add diagnostics integration ([@balloob] - [#64330]) ([default_config docs]) ([diagnostics docs]) (new-integration) +- Add zwave_js support for diagnostics ([@raman325] - [#64336]) ([zwave_js docs]) +- Add diagnostics to RainMachine ([@bachya] - [#64788]) ([rainmachine docs]) +- Add diagnostics to Nanoleaf ([@ludeeus] - [#64835]) ([nanoleaf docs]) +- Add diagnostics to Synology DSM integration ([@mib1185] - [#64480]) ([synology_dsm docs]) +- Add diagnostics to Mazda integration ([@bdr99] - [#64606]) ([mazda docs]) +- Add diagnostics to deCONZ integration ([@Kane610] - [#64585]) ([deconz docs]) +- Tibber diagnostics ([@Danielhiversen] - [#64472]) ([tibber docs]) +- Add evil genius labs diagnostics ([@balloob] - [#64339]) ([evil_genius_labs docs]) +- Add diagnostic information for nest ([@allenporter] - [#64405]) ([nest docs]) +- Add diagnostics to the core files ([@epenet] - [#64417]) +- Fix attr spelling error in Nest SDM SensorBase ([@iMicknl] - [#64490]) ([nest docs]) +- Add diagnostics for the AirVisual integration ([@bachya] - [#64479]) ([airvisual docs]) +- Add diagnostics to KNX ([@farmio] - [#64471]) ([knx docs]) +- Add diagnostics to Overkiz integration ([@iMicknl] - [#64427]) ([overkiz docs]) +- Add zwave_js device diagnostics ([@raman325] - [#64504]) +- Add device diagnostics support to Tuya ([@frenck] - [#64537]) ([tuya docs]) +- Add diagnostics to Netatmo integration ([@cgtobi] - [#64392]) ([netatmo docs]) +- Add diagnostics to Ambient PWS ([@bachya] - [#64489]) ([ambient_station docs]) ([airvisual docs]) +- Add diagnostics to GitHub integration ([@ludeeus] - [#64385]) ([github docs]) +- Add diagnostics to UptimeRobot ([@ludeeus] - [#64905]) ([uptimerobot docs]) +- Add diagnostics for Coinbase ([@TomBrien] - [#64900]) +- Add diagnostics to Tile ([@bachya] - [#64875]) ([tile docs]) +- Add diagnostics to Ridwell ([@bachya] - [#64863]) ([ridwell docs]) +- Add diagnostics to WattTime ([@bachya] - [#64887]) ([watttime docs]) + +## Improved handling of device tracker entities + +If you run an integration that provides device tracker, from lets say, your +router or somehting like a UniFi integration; than you are probably aware those +can create lots of entities! + +For some this may be overwhelming, this as of today, by default, only device +tracker enties that match up with an existing - known by Home Assistant - device +will be enabled by default. + +This keeps our Home Assistant nice and tidy, but also gives you the possibility +to enable those extra ones you like to have, yourself. + +## Streamlining experiences + +We recently published a blog on our focus for this year: +[Streamlining experiences](/blog/2022/01/19/streamlining-experiences/). + +Things done in this release with that focus: + +- When a integration has a single device or a single service, if you now + click on the "1 device" shown in the integration card, it will directly + go to that device (instead of showing the table with a single device). + (Single device links to device page (#11387) @balloob) + +- "Check for updates" in configuration screen. This will check + for Core, Operating System & Add-on updates with a single click. + +

+Screenshot from GitHub PR, needs to be replaced +Screenshot from GitHub PR, needs to be replaced +

+ +- Finding known issues for an integration in our issue trackers + +

+Screenshot from GitHub PR, needs to be replaced +Screenshot from Discord, needs to be replaced +

+ +- Visit device/service and documention on discovered items. + +

+Screenshot from GitHub PR, needs to be replaced +Screenshot from GitHub PR, needs to be replaced +

+ +- Search in top left of configuration dashboard (needs screenshot) + +- Scenes now have a state, last activated timestamp (like a button entity, last pressed) + +- Zones now have a state! Instead of "zoning" they now show the counter of the + number of people entities in the zone. This means you easily automate + when "someone" gets home, or when everybody left home. + +## More Advanced things + +Short hand condition nation is now supported in conditions actions as well. +For use in automations and scripts. + +For example (needs better example): + +{% raw %} + +```yaml +sequence: + - condition: "{{ is_state('device_tracker.iphone', 'away') }}" +``` + +{% endraw %} + +- Support shorthand templates in condition actions ([@emontnemery] - [#61177]) + + +We now have an [immediate if (`iif`)](/docs/configuration/templating/#immediate-if-iif) template function that can be used: + +Syntax: `iif(condition, if_true, if_false, if_none)` + +Examples: + +{% raw %} + +```yaml +{{ iif(is_state('light.kitchen', 'on'), 'Yes', 'No') }} +{{ is_state('light.kitchen', 'on') | iif('Yes', 'No') }} +{{ (state('light.kitchen') == 'on') | iif('Yes', 'No') }} +``` + +{% endraw %} + +- Add iif (immediate if) template function/filter ([@frenck] - [#61428]) + +- Add slugify as a template filter ([@ZephireNZ] - [#58724]) +- Add is_number as a test for use in select, selectattr, reject, and re… ([@Petro31] - [#63732]) + + +## Python 3.8 dropped + +Python 3.8 was previously deprecated and support for is has been dropped. +Home Assistant currently requires Python 3.9. + +If you run Home Assistant OS, Home Assistant Container or Home Assistant +Supervised: We have taken care of this for you and no action from your end +is required for this. + +## Other noteworthy changes + +There is much more juice in this release; here are some of the other +noteworthy changes this release: + +This list needs to be sorted, reduced and styled. +Interesting PRs found in Core: + +- Enable local fulfillment google assistant ([@LoekSangers] - [#63218]) ([google_assistant docs]) +- Add unique_id to the statistics component ([@ThomDietrich] - [#59205]) ([statistics docs]) +- Add Venstar runtimes and battery sensors ([@garbled1] - [#60414]) ([venstar docs]) +- Update Apple TV integration to support tvOS 15 ([@postlund] - [#58665]) ([apple_tv docs]) +- Add support for app launching in Apple TV ([@postlund] - [#61732]) ([apple_tv docs]) +- Add Yamaha MusicCast Select Entities ([@micha91] - [#60645]) ([yamaha_musiccast docs]) +- Add local access for Adax ([@Danielhiversen] - [#60019]) ([adax docs]) +- Add sensors to Mill local heaters ([@Danielhiversen] - [#61247]) ([mill docs]) +- Add media_player platform to Lookin ([@ANMalko] - [#61337]) ([lookin docs]) (new-platform) +- Add Tibber estimated hour consumption sensor ([@Danielhiversen] - [#62003]) ([tibber docs]) +- Add hardware version to the device registry ([@bdraco] - [#61650]) +- Add hardware version support to homekit controller ([@bdraco] - [#61743]) ([homekit_controller docs]) +- Add Tibber peak hour, monthly consumption and monthly cost sensors ([@Danielhiversen] - [#61853]) ([tibber docs]) +- Add battery entity for Maxcube devices ([@petslane] - [#58699]) ([maxcube docs]) +- Add xiaomi miio gateway hw version ([@starkillerOG] - [#62274]) ([xiaomi_miio docs]) +- Add hardware version to bond ([@bdraco] - [#62256]) ([bond docs]) +- Add reboot button to Magic Home/flux_led ([@bdraco] - [#62323]) ([flux_led docs]) +- Add switch to enable/disable music mode in Magic Home/flux_led ([@bdraco] - [#62320]) ([flux_led docs]) +- Support Plex resuming and playback offset ([@jjlawren] - [#61468]) ([plex docs]) +- Add zones support to flux_led ([@bdraco] - [#61072]) ([flux_led docs]) +- Add support for changing Magic Home socket power restore state ([@bdraco] - [#62301]) ([flux_led docs]) +- Add USB discover for Sonoff zigbee dongle plus ([@OpenMyDog] - [#62171]) ([zha docs]) +- Add set_music_mode service to flux_led for detailed music mode control ([@bdraco] - [#62429]) ([flux_led docs]) +- Add input_button support to HomeKit ([@frenck] - [#62590]) ([homekit docs]) +- Add input_button support to Alexa ([@frenck] - [#62592]) ([alexa docs]) +- Add input_button support to Google Assistant ([@frenck] - [#62593]) ([google_assistant docs]) +- Add connectsense to homekit_controller ([@ecoen66] - [#62675]) ([homekit_controller docs]) +- Add identify buttons to ZHA devices ([@dmulcahey] - [#61495]) ([zha docs]) +- Generic thermostat presets ([@brianegge] - [#56080]) ([generic_thermostat docs]) +- Add new buttons for Shelly Gas ([@bieniu] - [#63099]) ([shelly docs]) +- Add hardware version to Roku device info ([@ctalkington] - [#63249]) ([roku docs]) +- Add unique_id configuration variable to command_line integration ([@rautesamtr] - [#58596]) ([command_line docs]) +- Add mqtt entity attributes command templates ([@jbouwh] - [#61937]) ([mqtt docs]) +- Add support for Pet Feeder (cwwsq) in Tuya ([@vauriga] - [#61359]) ([tuya docs]) +- Add philips.light.hbulb support ([@syssi] - [#62417]) ([xiaomi_miio docs]) +- Add hardware revision support to homekit ([@bdraco] - [#63336]) ([homekit docs]) +- Add support for Sonos microphone binary_sensor ([@jjlawren] - [#63097]) ([sonos docs]) +- Prometheus to support input_number ([@yozik04] - [#58964]) ([prometheus docs]) +- Add Goodwe solar inverter integration ([@mletenay] - [#58503]) ([goodwe docs]) (new-integration) +- Add additional service to set advanced Hue scene options ([@marcelveldt] - [#63035]) ([hue docs]) +- Add support for curtain device class to google assistant ([@emontnemery] - [#63380]) ([google_assistant docs]) +- Updated the support of Tuya Circuit Breaker 'dlq' ([@slydiman] - [#63519]) ([tuya docs]) +- Add support for Levoit Core 300S air purifier to VeSync integration ([@RefineryX] - [#62488]) ([vesync docs]) +- Tuya Alarm Initial commit ([@leeyuentuen] - [#60080]) ([tuya docs]) (new-platform) (new-integration) +- Give scenes last activated state ([@frenck] - [#62673]) ([scene docs]) ([homeassistant docs]) +- Tibber cost statistics ([@Danielhiversen] - [#63626]) ([tibber docs]) +- Add is_number as a test for use in select, selectattr, reject, and re… ([@Petro31] - [#63732]) +- Add DSMR config options for EasyMeter/Q3D ([@Aeroid] - [#63669]) ([dsmr docs]) +- Expose WLED configuration URL of discovered device ([@frenck] - [#63983]) ([wled docs]) +- Add light platform to LOOKin ([@ANMalko] - [#64076]) ([lookin docs]) (new-platform) +- Add HomeConnect Refrigerator ([@BraveChicken1] - [#63850]) ([home_connect docs]) +- Set unique id for config entry in smhi ([@gjohansson-ST] - [#63547]) ([smhi docs]) +- Add electric vehicle sensors to Mazda integration ([@bdr99] - [#64099]) ([mazda docs]) +- Revamp github integration ([@ludeeus] - [#64190]) ([github docs]) (breaking-change) +- Add AQHI sensor for Environment Canada ([@gwww] - [#63644]) ([environment_canada docs]) +- Add HVAC modes of climate entities to Prometheus exporter ([@rnurgaliyev] - [#62144]) ([prometheus docs]) +- Extract fibaro switch energy attributes into sensors ([@rappenze] - [#63697]) ([fibaro docs]) (breaking-change) +- Initial Tuya support for FSD based fans ([@candreacchio] - [#64283]) ([tuya docs]) (new-integration) +- Add Volumio repeat support ([@m4rkireland] - [#64132]) +- Expose deCONZ configuration url from discovered entry ([@Kane610] - [#64519]) ([deconz docs]) +- Add Home Assistant Content user ([@balloob] - [#64337]) ([http docs]) ([websocket_api docs]) ([auth docs]) ([cast docs]) ([media_source docs]) (breaking-change) +- Allow Sonos to browse and play local media via media browser ([@balloob] - [#64603]) +- Add support for Soma Tilt devices ([@sebfortier2288] - [#49734]) ([soma docs]) +- Add siren platform to devolo Home Control ([@Shutgun] - [#53400]) ([devolo_home_control docs]) +- Add dishwasher program to Home Connect Integration ([@jan-loeffler] - [#61237]) ([home_connect docs]) +- Add local media browser to VLC ([@balloob] - [#64655]) ([media_source docs]) ([vlc_telnet docs]) +- Fix webostv media player ([@thecode] - [#64690]) ([webostv docs]) +- Add tests for LCN switch platform ([@alengwenus] - [#52590]) ([lcn docs]) +- Refactor Tuya DPCode and data type handling ([@frenck] - [#64707]) ([tuya docs]) +- Add warning when calling deprecated bond services ([@bdraco] - [#64744]) ([bond docs]) +- Allow toggles (switches) state to be None ([@frenck] - [#64621]) (breaking-change) +- Add command template for MQTT button ([@jbouwh] - [#63838]) ([mqtt docs]) +- Add service send command in Tuya Vacuum ([@dougiteixeira] - [#63417]) ([tuya docs]) +- Expose entity device temperature from cluster in ZHA ([@rforro] - [#64189]) ([zha docs]) +- Enable Low Latency HLS (LL-HLS) by default to lower stream latency ([@allenporter] - [#64643]) ([stream docs]) +- Add option to select quality of camera snapshots taken from Synology DSM connected cameras ([@mib1185] - [#58306]) ([synology_dsm docs]) +- Add support for preset modes to bond fans ([@bdraco] - [#64786]) ([bond docs]) +- Start depreciation of custom services in Advantage Air ([@Bre77] - [#58777]) ([advantage_air docs]) (breaking-change) +- ESPHome prevent connecting to different hosts when IP reassigned ([@OttoWinter] - [#64559]) ([esphome docs]) +- Update method names reflecting changes in UniFi library ([@Kane610] - [#64817]) ([unifi docs]) +- Make sensor name consistent with other homekit_controller entity names ([@Jc2k] - [#64821]) ([homekit_controller docs]) +- Remove source and channel attributes from local version ([@ludeeus] - [#64827]) ([version docs]) (breaking-change) +- Add more vicare binary sensors and clean up constants ([@oischinger] - [#64780]) ([vicare docs]) +- Add missing voices to Amazon Polly ([@aomann] - [#64708]) +- Add Home Connect CookProcessor (Bosch Cookit) ([@noxhirsch] - [#62445]) ([home_connect docs]) +- Add a reboot button for ONVIF devices ([@esev] - [#61522]) ([onvif docs]) +- Allow roku to browse and play local media ([@ctalkington] - [#64799]) ([roku docs]) +- Add additional energy sensors to Eve Energy ([@Jc2k] - [#64826]) ([homekit_controller docs]) +- Refactor Tuya Fans ([@frenck] - [#64765]) ([tuya docs]) +- Allow browsing the Spotify media player in Sonos ([@balloob] - [#64921]) ([sonos docs]) ([spotify docs]) +- Use local Sonos API for Plex music playback ([@jjlawren] - [#63357]) ([sonos docs]) ([cast docs]) ([plex docs]) +- Add unique_id to modbus entities ([@Tathar] - [#64634]) ([modbus docs]) + +From things from the frontend that might be of interest: + +* Allow downloading diagnostics of a config entry (#11345) @balloob +* Reflect media browser panel state in URL (#11317) @balloob +* Ensure disabled device entity names are shown (#11334) @spacegaier +* Allow pressing enter to pick item at the top of the list (#11139) @balloob +* Add period option to statistics card (#10982) @bramkragten +* Add overflow menu to discovered integration item (#11165) @frenck +* use motion-sensor/-off (#11142) @Mariusthvdb +* Single device links to device page (#11387) @balloob +* Add Search Icon to Config Dashboard (#11375) @zsarnett +* Move energy to Dashboards (#11386) @zsarnett +* Add backup size to backup table (#11365) @ludeeus +* Allow downloading device diagnostics (#11370) @balloob +* Allow tab to show/hide password button for keyboard accessibility (#11416) @steverep + +This release adds support for long-term statistics to the following integrations: + +- Add state class to screenlogic sensors ([@bdraco] - [#64941]) ([screenlogic docs]) +- Add state class to powerwall charge sensor ([@bdraco] - [#64939]) ([powerwall docs]) +- Add state class to hunterdouglas_powerview ([@bdraco] - [#64936]) ([hunterdouglas_powerview docs]) +- Add state class to emonitor sensors ([@bdraco] - [#64934]) ([emonitor docs]) +- Add state class to nexia sensors ([@bdraco] - [#64932]) ([nexia docs]) +- Add state classes to august sensors ([@bdraco] - [#64931]) ([august docs]) +- Add edl21 sensor state class and device class ([@StephanU] - [#56968]) ([edl21 docs]) +- - Add state class support to Luftdaten ([@frenck] - [#62585]) ([luftdaten docs]) +- Add SensorStateClass to Kraken sensors ([@eifinger] - [#63590]) ([kraken docs]) +- Add long term statistics to buienradar ([@tedvdb] - [#58917]) ([buienradar docs]) + + +And the following integrations now have entity categories: + +- Add entity categories. ([@stegm] - [#63165]) ([kostal_plenticore docs]) +- Aurora ABB add entity category ([@davet2001] - [#61231]) ([aurora_abb_powerone docs]) +- Add Netgear entity category and configuration url ([@starkillerOG] - [#62260]) ([netgear docs]) +- Add entity category to DSMR ([@starkillerOG] - [#62262]) ([dsmr docs]) +- Motion blinds add entity category ([@starkillerOG] - [#62266]) ([motion_blinds docs]) +- Hyperion add entity category ([@starkillerOG] - [#62268]) ([hyperion docs]) +- Use entity class attributes for Mazda integration ([@bdr99] - [#59869]) ([mazda docs]) + + +## New Integrations + +We welcome the following new integration this release: + +- [`input_button`][input_button docs], added by [@frenck] +- [Aseko Pool Live][aseko_pool_live docs], added by [@milanmeu] +- [Aussie Broadband][aussie_broadband docs], added by [@nickw444] +- [Diagnostics][diagnostics docs], added by [@balloob] +- [Elmax][elmax docs], added by [@albertogeniola] +- [GoodWe][goodwe docs], added by [@mletenay] +- [HomeWizard Energy][homewizard_energy docs], added by [@DCSBL] +- [IntelliFire][intellifire docs], added by [@jeeftor] +- [NINA][nina docs], added by [@DeerMaximum] +- [Oncue by Kohler][oncue docs], added by [@bdraco] +- [Open-Meteo][open_meteo docs], added by [@frenck] +- [Overkiz][overkiz docs], added by [@iMicknl] +- [RTSPtoWebRTC][webrtc docs], added by [@allenporter] +- [SenseME][senseme docs], added by [@bdraco] +- [Steamist][steamist docs], added by [@bdraco] +- [UniFi Protect][unifiprotect docs], added by [@AngellusMortis] + + +## Integrations now available to set up from the UI + +The following integrations are now available via the Home Assistant UI: + +- [Android TV][androidtv docs], done by [@ollo69] +- [CPU Speed][cpuspeed docs], done by [@frenck] +- [DNS IP][dnsip docs], done by [@gjohansson-ST] +- [Launch Library][launch_library docs], done by [@DurgNomis-drol] +- [LG webOS Smart TV][webostv docs], done by [@thecode] +- [PVOutput][pvoutput docs], done by [@frenck] +- [Sensibo][sensibo docs], done by [@gjohansson-ST] +- [Vallox][vallox docs], done by [@slovdahl] +- [Version][version docs], done by [@ludeeus] +- [Whois][whois docs], done by [@frenck] + +## 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). + +Experiencing issues introduced by this release? Please report them in our [issue tracker](https://github.com/home-assistant/core/issues). Make sure to fill in all fields of the issue template. + + + +## Breaking Changes + +Below is a listing of the breaking change for this release, per subject or +integration. Click on one of those to read more about the breaking change +for that specific item. + +{% details "GPIO Integrations" %} + +As of this release, all integration intefacing with GPIO directly, have been +deprecated. + +There are multiple reasons for this, which includes a general low usage of +these integrations. For most Home Assistant installation, GPIO isn't easily +usable and more often the integrations are unmainted. + +More information can be found in +[Architectural Decission Record 0019](https://github.com/home-assistant/architecture/blob/master/adr/0019-GPIO.md). + +Additionally, there are many projects around that handle these purposes of GPIO +better than Home Assistant. For example, our sister project ESPHome, or +the MQTT IO project, and many more. + +We do not forbid the use of GPIO, but we are merely deprecating and removing +built-in integrations, providing GPIO functionality from Core. We welcome +custom integrations (existing or new ones) to provide alternatives. However, +for most cases we recommend on using dedicated hardware, like a ESP device, +instead. + +The following integrations have been deprecated and will be removed in +Home Assistant Core **2022.4**: + +- BeagleBone Black GPIO +- BH1750 +- Blinkt! +- Bosch BME280 Environmental Sensor +- Bosch BME680 Environmental Sensor +- Bosch BMP280 Environmental Sensor +- DHT Sensor +- Enviro pHAT +- HTU21D(F) Sensor +- mcp23017 +- MH-Z19 CO2 Sensor +- Orange Pi GPIO +- pcal9535a +- pi4ioe5v9xxxx +- PiFace Digital I/O (PFIO) +- Piglow +- pigpio Daemon PWM LED +- Raspberry Pi RF +- Rasphihats +- Sense HAT +- Sensirion SHT31 +- Time of Flight + +The following integration have been deprecated and will be removed in +Home Assistant Core **2022.6**: + +- 1-Wire (SysBus only!) +- Raspberry Pi GPIO + +Note: 1-Wire is a special case, as it supports both the SysBus and connecting +to a remote owfs server. The use of the SysBus is deprecated, however, +connecting to a remote owfs server is not. + +{% enddetails %} + +{% details "Fan/Humidifer/Light/Remote/Siren/Switch/Vaccuum" %} + +Previously, toggle-based entities (like `fan`, `light`, `switch`, `remote`, `siren`, `vacuum`, `humidifier`) could have the state `on` or `off`, and in case the device was unreachable: `unavailable`. However, compared to other entities, toggle entities aren't able to have an `unknown` state, this now has changed. + +As of now, toggle-based entities can now have the `on`, `off`, `unavailable`, or `unknown` state. + +You might need to adapt your automations or scripts to take this new `unknown` state into account. + +([@frenck] - [#64621]) + +{% enddetails %} + +{% details "iOS" %} + +The Home Assistant iOS/macOS app supports notification actions defined [in the notification itself](https://companion.home-assistant.io/docs/notifications/actionable-notifications/); the old method of defining push categories in the iOS integration is now deprecated and will be removed in the future. + +([@zacwest] - [#61078]) ([ios docs]) + +{% enddetails %} + +{% details "Flume" %} + +The previously deprecated YAML configuration of the Flume integration has been removed. + +Flume is now configured via the UI, any existing YAML configuration has been imported +in previous releases and can now be safely removed from your YAML configuration files. + +([@tkdrob] - [#61517]) ([flume docs]) + +{% enddetails %} + +{% details "Sensor.Community (previously: Luftdaten)" %} + +The Luftdaten integration has been renamed to Sensor.Community; which is +the new name of the Luftdaten project. + +The previously deprecated YAML configuration of this integration +has been removed. + +Sensor.Community is now configured via the UI, any existing YAML configuration +has been imported in previous releases and can now be safely removed from your +YAML configuration files. + +([@frenck] - [#61748] [#62865]) ([luftdaten docs]) + +{% enddetails %} + +{% details "Foscam" %} + +The previously deprecated YAML configuration of the Foscam integration +has been removed. + +Foscam is now configured via the UI, any existing YAML configuration +has been imported in previous releases and can now be safely removed from your +YAML configuration files. + +([@tkdrob] - [#61761]) ([foscam docs]) + +{% enddetails %} + +{% details "Enphase Envoy" %} + +The previously deprecated YAML configuration of the Enphase Envoy integration +has been removed. + +Enphase Envoy is now configured via the UI, any existing YAML configuration +has been imported in previous releases and can now be safely removed from your +YAML configuration files. + +([@tkdrob] - [#61840]) ([enphase_envoy docs]) + +{% enddetails %} + +{% details "Azure Event Hub" %} + +The Azure Event Hub integration migrated to configuration via the +UI. Configuring Azure Event Hub via YAML configuration has been +deprecated and will be removed in a future Home Assistant release. + +Your existing YAML configuration is automatically imported on upgrade to this +release; and thus can be safely removed from your YAML configuration after upgrading. + +([@eavanvalkenburg] - [#61155]) ([azure_event_hub docs]) + +{% enddetails %} + +{% details "FortiOS" %} + +The integration now requires FortiOS 6.4.3 and newer. + +([@kimfrellsen] - [#61970]) ([fortios docs]) + +{% enddetails %} + +{% details "Zero-configuration networking (zeroconf)" %} + +This change is only a concern for custom integration developers. + +Currently zeroconf matching only allows matching the `macaddress`, `model`, and `manufacturer` properties along with the `name` from the ZeroconfServiceInfo. + +Since properties are arbitrarily defined by the zeroconf service, +the list of named properties has grown over time. + +Matching now allows for any arbitrarily defined property. +All property matches must be lowercase, wildcards are supported + +The top level keys `model`, `manufacturer`, and `macaddress` +are now deprecated from the `manifest.json` file and should +be moved into a `properties` dict. + +For example: +``` +- {"type":"_airplay._tcp.local.","model":"appletv*"} ++ {"type":"_airplay._tcp.local.","properties":{"model":"appletv*"}} +``` + +([@bdraco] - [#62133]) ([zeroconf docs]) + +{% enddetails %} + +{% details "Environment Canada" %} + +The previously deprecated YAML configuration of the Environment Canada +integration has been removed. + +Environment Canada is now configured via the UI, any existing YAML configuration +has been imported in previous releases and can now be safely removed from your +YAML configuration files. + +([@tkdrob] - [#61839]) ([environment_canada docs]) + +--- + +The sensors no longer have `Timestamp` as an extra state attribute, instead, +use the new `timestamp` sensor that can be used in automations that track state changes. + +The sensors alert sensors (`advisories`, `endings`, `statements`, `warnings`, and `watches`) state is now a count of the number of active alerts for the sensor type +and the extra state attributes contain the alert text and alert timestamp. + +The attributes are named `alert_` and `alert_time_` where is 1 for alert 1, 2 for alert 2, etc. + +([@gwww] - [#58615]) ([environment_canada docs]) + +{% enddetails %} + +{% details "OpenGarage" %} + +The previously deprecated YAML configuration of the OpenGarage +integration has been removed. + +OpenGarage is now configured via the UI, any existing YAML configuration +has been imported in previous releases and can now be safely removed from your +YAML configuration files. + +- Remove deprecated yaml config from opengarage ([@tkdrob] - [#61961]) ([opengarage docs]) (breaking-change) + +{% enddetails %} + +{% details "Aurora ABB PowerOne Solar PV" %} + +The previously deprecated YAML configuration of the Aurora ABB PowerOne Solar PV +integration has been removed. + +Aurora ABB PowerOne Solar PV is now configured via the UI, any existing YAML +configuration has been imported in previous releases and can now be safely +removed from your YAML configuration files. + +([@tkdrob] - [#62317]) ([aurora_abb_powerone docs]) + +{% enddetails %} + +{% details "Efergy" %} + +The previously deprecated YAML configuration of the Efergy +integration has been removed. + +Efergy is now configured via the UI, any existing YAML configuration +has been imported in previous releases and can now be safely removed from your +YAML configuration files. + +([@tkdrob] - [#61520]) ([efergy docs]) + +{% enddetails %} + +{% details "Magic Home" %} + +The previously deprecated YAML configuration of the Magic Home +integration has been removed. + +Magic Home is now configured via the UI, any existing YAML configuration +has been imported in previous releases and can now be safely removed from your +YAML configuration files. + +([@tkdrob] - [#61844]) ([flux_led docs]) + +{% enddetails %} + +{% details "Broadlink" %} + +The previously deprecated YAML configuration of the Broadlink +integration has been removed. + +Broadlink is now configured via the UI, any existing YAML configuration +has been imported in previous releases and can now be safely removed from your +YAML configuration files. + +([@tkdrob] - [#62341]) ([broadlink docs]) + +{% enddetails %} + +{% details "CO2 Signal" %} + +The previously deprecated YAML configuration of the CO2 Signal +integration has been removed. + +CO2 Signal is now configured via the UI, any existing YAML configuration +has been imported in previous releases and can now be safely removed from your +YAML configuration files. + +([@tkdrob] - [#62343]) ([co2signal docs]) + +{% enddetails %} + +{% details "DLNA Digital Media Renderer" %} + +The previously deprecated YAML configuration of the DLNA Digital Media Renderer +integration has been removed. + +DLNA Digital Media Renderer is now configured via the UI, any existing YAML +configurationhas been imported in previous releases and can now be safely +removed from your YAML configuration files. + +([@tkdrob] - [#62344]) ([dlna_dmr docs]) + +{% enddetails %} + +{% details "Android TV" %} + +The Android TV integration migrated to configuration via the +UI. Configuring Android TV via YAML configuration has been +deprecated and will be removed in a future Home Assistant release. + +Your existing YAML configuration is automatically imported on upgrade to this +release; and thus can be safely removed from your YAML configuration after upgrading. + +- Add config_flow to AndroidTV integration ([@ollo69] - [#54444]) ([androidtv docs]) (breaking-change) + +{% enddetails %} + +{% details "Nuki" %} + +The previously deprecated YAML configuration of the Nuki +integration has been removed. + +Nuki is now configured via the UI, any existing YAML +configurationhas been imported in previous releases and can now be safely +removed from your YAML configuration files. + +([@tkdrob] - [#62470]) ([nuki docs]) + +{% enddetails %} + +{% details "Honeywell Total Connect Comfort (US)" %} + +The previously deprecated YAML configuration of the Honeywell Total Connect Comfort +integration has been removed. + +Honeywell Total Connect Comfort is now configured via the UI, any existing YAML +configurationhas been imported in previous releases and can now be safely +removed from your YAML configuration files. + + +([@tkdrob] - [#62469]) ([honeywell docs]) + +{% enddetails %} + +{% details "Google Maps Travel Time" %} + +The previously deprecated YAML configuration of the Google Maps Travel Time +integration has been removed. + +Google Maps Travel Time is now configured via the UI, any existing YAML +configurationhas been imported in previous releases and can now be safely +removed from your YAML configuration files. + +([@tkdrob] - [#62468]) ([google_travel_time docs]) + +{% enddetails %} + +{% details "Philips TV" %} + +The previously deprecated YAML configuration of the Philips TV +integration has been removed. + +Philips TV is now configured via the UI, any existing YAML +configurationhas been imported in previous releases and can now be safely +removed from your YAML configuration files. + +([@tkdrob] - [#62471]) ([philips_js docs]) + +{% enddetails %} + +{% details "TP-Link Kasa Smart" %} + +The previously deprecated YAML configuration of the TP-Link Kasa Smart +integration has been removed. + +TP-Link Kasa Smart is now configured via the UI, any existing YAML +configurationhas been imported in previous releases and can now be safely +removed from your YAML configuration files. + +([@bdraco] - [#62457]) ([tplink docs]) + +{% enddetails %} + +{% details "RIVM Stookalert" %} + +The previously deprecated YAML configuration of the Stookalert +integration has been removed. + +Stookalert is now configured via the UI, any existing YAML +configurationhas been imported in previous releases and can now be safely +removed from your YAML configuration files. + +([@frenck] - [#61007]) ([stookalert docs]) + +{% enddetails %} + +{% details "VLC media player Telnet" %} + +The previously deprecated YAML configuration of the VLC media player Telnet +integration has been removed. + +VLC media player Telnet is now configured via the UI, any existing YAML +configurationhas been imported in previous releases and can now be safely +removed from your YAML configuration files. + +([@tkdrob] - [#62542]) ([vlc_telnet docs]) + +{% enddetails %} + +{% details "Logitech Squeezebox" %} + +The previously deprecated YAML configuration of the Logitech Squeezebox +integration has been removed. + +Logitech Squeezebox is now configured via the UI, any existing YAML +configurationhas been imported in previous releases and can now be safely +removed from your YAML configuration files. + +([@tkdrob] - [#62537]) ([squeezebox docs]) + +{% enddetails %} + +{% details "Groups: Locks" %} + +The behavior of grouped locks has been reversed such that "unlocked" is +mapped to `on` and "locked" to off. + +This means that: + +- A group with mixed domains will be considered `on` if any lock included in + the group is unlocked. +- A group of locks will be considered "unlocked" if any lock included in the +- group is unlocked. + +([@emontnemery] - [#62580]) ([lock docs]) ([group docs]) + +{% enddetails %} + +{% details "Binary Sensors" %} + +Previously, `binary_sensor` entities could have the state `on`, `off`, and +in case the device was unreachable: `unavailable`. + +However, compared to other entities, it wasn't able to have the `unknown` state, +which has been added this release. + +So, a `binary_sensor` entity can now have the `on`, `off`, `unavailable`, or `unknown` state. + +You might need to adapt your automations or scripts to take this new +`unknown` state into account. + +([@frenck] - [#60193]) ([binary_sensor docs]) + +{% enddetails %} + +{% details "BMW Connected Drive" %} + +The `charging_time_remaining` (in hours) has been replaced with +`charging_end_time` (timestamp) to not clutter the Home Assistant state machine. + +You might need to adapt your automations or scripts for this change. + +([@rikroe] - [#60942]) ([bmw_connected_drive docs]) + +--- + +All ``bmw_connected_drive.*` services are deprecated. +Please use the new button entities with the `button.press` service instead. + +([@rikroe] - [#63136]) ([bmw_connected_drive docs]) + +{% enddetails %} + +{% details "Sensibo" %} + +The Sensibo integration migrated to configuration via the +UI. Configuring Sensibo via YAML configuration has been +deprecated and will be removed in a future Home Assistant release. + +Your existing YAML configuration is automatically imported on upgrade to this +release; and thus can be safely removed from your YAML configuration after upgrading. + +([@gjohansson-ST] - [#60900]) ([sensibo docs]) + +{% enddetails %} + +{% details "SwitchBot" %} + +The SwitchBot integration migrated to configuration via the +UI in a previous release already. Configuring SwitchBot via YAML configuration +has now been deprecated and will be removed in a future Home Assistant release. + +Your existing YAML configuration is already automatically imported; and thus +can be safely removed from your YAML configuration. + +([@tkdrob] - [#62583]) ([switchbot docs]) + +{% enddetails %} + +{% details "Trafikverket Train" %} + +The planned time, estimated time and and actual time sensor attributes have +been correct to be UTC isoformatted string which is standard in Home Assistant. + +Previously displayed as `2021-12-23T09:07:00` and now correctly set as `2021-12-23T09:07:00+00:00`. + +This may affect templates or automations based on these attributes. + +([@gjohansson-ST] - [#62636]) ([trafikverket_train docs]) + +{% enddetails %} + +{% details "Samsung SyncThru Printer" %} + +The previously deprecated YAML configuration of the Samsung SyncThru Printer +integration has been removed. + +Samsung SyncThru Printer is now configured via the UI, any existing YAML +configurationhas been imported in previous releases and can now be safely +removed from your YAML configuration files. + +([@tkdrob] - [#62541]) ([syncthru docs]) + +{% enddetails %} + +{% details "Version" %} + +The Version integration migrated to configuration via the +UI. Configuring Version via YAML configuration has been +deprecated and will be removed in a future Home Assistant release. + +Your existing YAML configuration is automatically imported on upgrade to this +release; and thus can be safely removed from your YAML configuration after upgrading. + +Additionally, the `source` and `channel` attributes have been removed from +the Version sensor for the local source. + +([@ludeeus] - [#54642] [#64827]) ([version docs]) + +{% enddetails %} + +{% details "Templates: Binary Sensors" %} + +Template trigger binary sensor should start with `unknown` value rather than always starting with `false`/`off`. This matches the template binary sensor behavior +with other sensors. + +([@amosyuen] - [#62769]) ([template docs]) + +{% enddetails %} + +{% details "PVOutput" %} + +The PVOutput integration migrated to configuration via the +UI. Configuring PVOutput via YAML configuration has been +deprecated and will be removed in a future Home Assistant release. + +Your existing YAML configuration is automatically imported on upgrade to this +release; and thus can be safely removed from your YAML configuration after upgrading. + +Additionally, all sensor attributes of the PVOutput sensor, +have been extracted in their own dedicated sensors. + +This applies to the following PVOutput attributes: + +- `energy_generation` +- `power_generation` +- `energy_consumption` +- `power_consumption` +- `efficiency` +- `temperature` +- `voltage` + +If you relied on these in your automation or scripts, you need to adopt those to use the new separate sensors instead. The attributes are currently available, however, deprecated and will be removed in Home Assistant Core 2022.4. + +([@frenck] - [#62667] [#62894]) ([pvoutput docs]) + +{% enddetails %} + +{% details "Vallox" %} + +The Vallox integration migrated to configuration via the +UI. Configuring Vallox via YAML configuration has been +deprecated and will be removed in a future Home Assistant release. + +Your existing YAML configuration is automatically imported on upgrade to this +release; and thus can be safely removed from your YAML configuration after upgrading. + +([@slovdahl] - [#62780]) ([vallox docs]) + +{% enddetails %} + +{% details "CPU Speed" %} + +The CPU Speed integration migrated to configuration via the +UI. Configuring CPU Speed via YAML configuration has been +deprecated and will be removed in a future Home Assistant release. + +Your existing YAML configuration is automatically imported on upgrade to this +release; and thus can be safely removed from your YAML configuration after upgrading. + +([@frenck] - [#62929]) ([cpuspeed docs]) + +{% enddetails %} + +{% details "Nest" %} + +The Legacy "Works With Nest API" is deprecated and support will be removed +in Home Assistant Core 2022.5; See our [documentation for using the Smart Device +Management API](/integrations/nest/) instead. + +([@allenporter] - [#63027]) ([nest docs]) + +{% enddetails %} + +{% details "MQTT" %} + +The MQTT lights no longer support, the previously deprecated, `value_template`;`state_value_template` should be used instead. + +([@emontnemery] - [#62682]) ([mqtt docs]) + +---- + +Previouysly MQTT climate would only publish to `hold_command_topic` or ` away_mode_command_topic` if the new mode is not the same as the current state. + +As of this release MQTT always publishes on both command topics (`hold_command_topic` and ` away_mode_command_topic`) (if defined) which makes it more predictable +what update the MQTT device will receive. + +([@jbouwh] - [#63463]) ([mqtt docs]) + +---- + +The `send_if_off` config parameter of the climate platform, which limits +publishing if the current operation mode is `HVAC_MODE_OFF`, is now +deprecated. + +This will break applications that depend on this feature. + +([@jbouwh] - [#63814]) ([mqtt docs]) + +{% enddetails %} + +{% details "Waze Travel Time" %} + +The previously deprecated YAML configuration of the Waze Travel Time +integration has been removed. + +Waze Travel Time is now configured via the UI, any existing YAML +configurationhas been imported in previous releases and can now be safely +removed from your YAML configuration files. + +([@tkdrob] - [#62543]) ([waze_travel_time docs]) + +{% enddetails %} + +{% details "SMA Solar" %} + +The previously deprecated YAML configuration of the SMA Solar +integration has been removed. + +SMA Solar is now configured via the UI, any existing YAML +configurationhas been imported in previous releases and can now be safely +removed from your YAML configuration files. + +([@tkdrob] - [#62472]) ([sma docs]) + +{% enddetails %} + +{% details "Nanoleaf" %} + +The Nanoleaf integration migrated to configuration via the +UI in a previous release already. Configuring Nanoleaf via YAML configuration +has now been deprecated and will be removed in a future Home Assistant release. + +Your existing YAML configuration is already automatically imported; and thus +can be safely removed from your YAML configuration. + +([@milanmeu] - [#63404]) ([nanoleaf docs]) + +{% enddetails %} + + +{% details "Viessmann ViCare" %} + +The scan interval option has been removed, since the default should be fine +in almost all cases. + +If you really need more fine-grained control you can disable automatic updates +in the system settings for the Viessmann ViCare integration and automate the +polling of the entities with the +[`homeassistant.update_entity`](/docs/scripts/service-calls#homeassistant-services) +service. + +([@oischinger] - [#63343]) ([vicare docs]) + +{% enddetails %} + +{% details "DSMR" %} + +The `sensor.energy_consumption_total` sensor for DSMR versions 2.2 and 4 has +been removed. Meters with these versions do not provide this data, +so this sensor can be safely removed. You might need to clean up +the orphaned entity in your setup. + +([@rhpijnacker] - [#63436]) ([dsmr docs]) + +{% enddetails %} + +{% details "Nissan Leaf" %} + +The service to start a charge has been deprecated; it is replaced with a button. + +Replace the `nissan_leaf.start_charge` service in any existing automations with `button.press` for the new `button.start_NICKNAME_charging` entity. + +The `nissan_leaf.start_charge` service is now deprecated and will be removed +in a future release. + +([@filcole] - [#62948]) ([nissan_leaf docs]) + +{% enddetails %} + +{% details "ReCollect Waste" %} + +ReCollect Waste no longer stories "next pickup" information as attributes of the "current pickup" sensor; instead, both pickups are now their own sensors. + +([@bachya] - [#62558]) ([recollect_waste docs]) + +{% enddetails %} + +{% details "AVM FRITZ!SmartHome" %} + +The `lock` and `devicelock` attributes are removed from all entities and now exposed as own sensors. + +([@mib1185] - [#60426]) ([fritzbox docs]) + +{% enddetails %} + +{% details "Launch Library" %} + +The Launch Libraryintegration migrated to configuration via the +UI. Configuring Launch Library via YAML configuration has been +deprecated and will be removed in a future Home Assistant release. + +Your existing YAML configuration is automatically imported on upgrade to this +release; and thus can be safely removed from your YAML configuration after upgrading. + +([@DurgNomis-drol] - [#62416]) ([launch_library docs]) + +--- + +Attributes on the current sensor is changed. Names of these attributes are +changed to better describe what information they provide. (Ex. `agency` changed +name to `provider` as this is the more correct terminology.) New attributes are +added to give more information about where it takes place. + +The `stream` attribute ios moved to the new sensor, and changed it's name to `stream_live` as it represent if the stream is live and not if a stream is +available. + +And finally, the attribute `launch_time` moved into it's own sensor. This made +it possible to add some information about the launch window start and end as attributes for the new sensor. This sensor will also contain the `stream_live` attribute. + +([@DurgNomis-drol] - [#64203]) ([launch_library docs]) + +{% enddetails %} + +{% details "Media Player Classic Home Cinema (MPC-HC)" %} + +The Media Player Classic Home Cinema (MPC-HC) integration has been deprecated +and will be removed in Home Assistant Core 2022.4. + +This integration is removed under [Architectural Decision Record 0004](https://github.com/home-assistant/architecture/blob/master/adr/0004-webscraping.md). + +([@frenck] - [#63598]) ([mpchc docs]) + +{% enddetails %} + +{% details "VeSync" %} + +Previous versions of this integration exposed power and energy usage from +VeSync outlets as state attributes on the `switch` entity itself. This used the deprecated properties: `current_power_w` and `today_energy_kwh`. + +In this version, these two attributes have been removed from the `switch` +entity and split into two new diagnostic sensor entities that are attached to +the same Device. + +Automations and template entities based on the state attribute mechanism should +be updated accordingly. + +([@decompil3d] - [#61837]) ([vesync docs]) + +{% enddetails %} + +{% details "NETGEAR" %} + +The previously deprecated YAML configuration of the NETGEAR +integration has been removed. + +NETGEAR is now configured via the UI, any existing YAML +configurationhas been imported in previous releases and can now be safely +removed from your YAML configuration files. + +([@epenet] - [#63862]) ([netgear docs]) + +{% enddetails %} + +{% details "Apple iCloud" %} + +The Apple iCloud integration migrated to configuration via the +UI in a previous release already. Configuring Apple iCloud via YAML configuration +has now been deprecated and will be removed in a future Home Assistant release. + +Your existing YAML configuration is already automatically imported; and thus +can be safely removed from your YAML configuration. + +([@epenet] - [#63875]) ([icloud docs]) + +{% enddetails %} + +{% details "Nmap Tracker" %} + +The previously deprecated YAML configuration of the Nmap Tracker +integration has been removed. + +Nmap Tracker is now configured via the UI, any existing YAML +configurationhas been imported in previous releases and can now be safely +removed from your YAML configuration files. + +([@epenet] - [#63863]) ([nmap_tracker docs]) + +{% enddetails %} + +{% details "Keenetic NDMS2 Router" %} + +The previously deprecated YAML configuration of the Keenetic NDMS2 Router +integration has been removed. + +Keenetic NDMS2 Router is now configured via the UI, any existing YAML +configurationhas been imported in previous releases and can now be safely +removed from your YAML configuration files. + +([@epenet] - [#63860]) ([keenetic_ndms2 docs]) + +{% enddetails %} + +{% details "AVM FRITZ!Box Tools" %} + +The previously deprecated YAML configuration of the AVM FRITZ!Box Tools +integration has been removed. + +AVM FRITZ!Box Tools is now configured via the UI, any existing YAML +configurationhas been imported in previous releases and can now be safely +removed from your YAML configuration files. + +[@epenet] - [#63857]) ([fritz docs]) + +---- + +The `reboot` and `reconnect` services are deprecated and will be removed in future release. Please use the newly provided button entities instead. + +([@chemelli74] - [#61483]) ([fritz docs]) + +{% enddetails %} + +{% details "Python 3.8 support dropped" %} + +Python 3.8 support has previously been deprecated and now has been removed. +Home Assistant now requires Python 3.9 to run. + +If you are using Home Assistant OS, Home Assistant Container, or Home Assistant Supervised installation method, you don't have to do anything. In those cases, we all handle this for you. Your system has been using Python 3.9 for quite some time already. + +([@frenck] - [#63883]) + +{% enddetails %} + +{% details "Foursquare" %} + +The data associated with `foursquare.checkin` event is now available as a +dictionary item with key "text". + +If you use this event in your automation or scripts, you'd need to adjust to +to match this change. + +([@epenet] - [#63982]) ([foursquare docs]) + +{% enddetails %} + +{% details "VIZIO SmartCast" %} + +If an integrated `vizio` TV supports apps and the source is currently a non-app +input (e.g. HDMI-1), the `app_id` and `app_name` attributes will no longer be in the media player entity's state. + +When the TV is using an app, the `app_name` will still always be visible and the `app_id` will continue to only be shown if the app is not recognized. + +([@raman325] - [#64025]) ([vizio docs]) + +{% enddetails %} + +{% details "Twinkly" %} + +Key `host` is removed from the (extra) state attribute of the light entity. + +([@RobBie1221] - [#64139]) ([twinkly docs]) + +{% enddetails %} + +{% details "LG webOS Smart TV" %} + +The LG webOS Smart TV integration migrated to configuration via the +UI. Configuring LG webOS Smart TV via YAML configuration has been +deprecated and will be removed in a future Home Assistant release. + +Your existing YAML configuration is automatically imported on upgrade to this +release; and thus can be safely removed from your YAML configuration after upgrading. + +The [turn on action](/integrations/webostv/#turn-on-action) for turning on the +TV via `WakeOnLan` or `HDMI-CEC` was using a service call via YAML, the turn on action is changed to use a custom automation trigger `webostv.turn_on` or a device trigger automation that can be setup from the UI. + +**Example trigger automation:** + +```yaml +automation: + trigger: + - platform: webostv.turn_on + entity_id: media_player.lg_webos_smart_tv + action: + - service: wake_on_lan.send_magic_packet + data: + mac: AA-BB-CC-DD-EE-FF +``` + +([@thecode] - [#64117]) ([webostv docs]) + +{% enddetails %} + +{% details "DoorBird" %} + +The relays and IR light switches are removed and replaced with corresponding +buttons entities. Any scripts or automations which reference these switches to +turn them on should change to instead press the button instead. + +([@flacjacket] - [#63995]) ([doorbird docs]) + +{% enddetails %} + +{% details "GitHub" %} + +The YAML configuration for the `github` sensor platform has been removed. + +There was no viable automatic migration of the configuration, so you need to +manually remove the configuration from your configuration file and set it up +again in the integration panel. + +Previously this integration created 1 sensor for each repository, now this +is split out to multiple entities which are mostly disabled by default +(you can enable the entities you want this integration to provide). + +Support for GitHub enterprise has been removed. + +([@ludeeus] - [#64190]) ([github docs]) + +{% enddetails %} + +{% details "Z-Wave JS" %} + +Due to a schema change, `zwave-js-server` version 1.14.0 or greater is required. +Ensure you are using the latest version of `zwave-js-server` (or the add-ons +that provides those). + +([@raman325] - [#64407]) ([zwave_js docs]) + +{% enddetails %} + +{% details "Fibaro" %} + +The energy values are exposed now as separate sensor entities and therefore the +state attribute `current_energy_kwh` was removed from all other entities. + +If you use the state attribute `current_energy_kwh` you need to change +that to use the new energy sensors instead. + +([@rappenze] - [#63697]) ([fibaro docs]) + +{% enddetails %} + +{% details "HomeKit" %} + +HomeKit will now automatically exclude entities with an entity category such as +a configuration or diagnostic entity unless they have been explicitly included. + +To explicitly include an entity: + +- YAML: Add the entity to the filter in either the `include_entities` or `include_entity_globs` fields. +- UI: Select the entity in the UI in include mode. If you are using exclude mode, a second bridge can be created in include mode. + +([@bdraco] - [#64492]) ([homekit docs]) + +{% enddetails %} + +{% details "API" %} + +The `/api/discovery_info` endpoint was deprecated in 2021.10, and has since only +returned blank values. From this version, the `/api/discovery_info` endpoint has +been removed completly. + +([@ludeeus] - [#64534]) ([api docs]) + +{% enddetails %} + +{% details "DNS IP" %} + +The DNS IP integration migrated to configuration via the +UI. Configuring DNS IP via YAML configuration has been +deprecated and will be removed in a future Home Assistant release. + +Your existing YAML configuration is automatically imported on upgrade to this +release; and thus can be safely removed from your YAML configuration after upgrading. + +([@gjohansson-ST] - [#62843]) ([dnsip docs]) + +{% enddetails %} + +{% details "Apple Push Notification Service (APNS)" %} + +The Apple Push Notification Service (APNS) integration has been deprecated and +will be removed in Home Assistant 2022.4. Please note, this does not affect +our mobile companion apps; as they do not use this integration for their +notifications. + +([@frenck] - [#64629]) ([apns docs]) + +{% enddetails %} + +{% details "WebSocket API / Media Source" %} + +This concerns custom integration developers only. + +The parameters for `async_sign_path` have changed. Refresh token is now a keyword parameter. If called as part of a HTTP or WebSocket request, the users refresh token will automatically be used. + +([@balloob] - [#64337]) + +{% enddetails %} + +{% details "Bond" %} + +The custom `start_increasing_brightness`, `start_decreasing_brightness` and `stop` services are now deprecated and will be removed in a future release. + +Please use the new button entities, that replace those, instead. + +([@bdraco] - [#64725]) ([bond docs]) + +{% enddetails %} + +{% details "Advantage Air" %} + +The `advantage_air.set_myzone` service has been depreciated and will be removed +in a future version of Home Assistant. + +Please use the `select.select_option` service on the MyZone select entity to change this value on supported systems instead. + +([@Bre77] - [#58777]) ([advantage_air docs]) + +{% enddetails %} + +{% details "Synology DSM" %} + +The `reboot` and `shutdown` services are deprecated and will be removed in future release. Please use the new button entities instead. + +([@mib1185] - [#57352]) ([synology_dsm docs]) (breaking-change) + +{% enddetails %} + +{% details "Fan" %} + +This is more a breaking change for custom integration developers. + +Now that all core fans are using the new fan entity model, the compatibility shim +has been removed. Custom integrations that have not yet switched to the new +fan model. For more information see: + + + +Preset modes and percentages will continue to be translated back to legacy speeds +until 2022.3 in order to give users a bit more time to update automations. + +([@bdraco] - [#59781]) ([fan docs]) + +{% enddetails %} + +{% details "Whois" %} + +The Whois integration migrated to configuration via the +UI. Configuring Whois via YAML configuration has been +deprecated and will be removed in a future Home Assistant release. + +Your existing YAML configuration is automatically imported on upgrade to this +release; and thus can be safely removed from your YAML configuration after upgrading. + +([@frenck] - [#63069]) ([whois docs]) + +{% enddetails %} + + +{% details "SolaX Power" %} + +The SolaX Power integration migrated to configuration via the +UI. Configuring SolaX Power via YAML configuration has been +deprecated and will be removed in a future Home Assistant release. + +Your existing YAML configuration is automatically imported on upgrade to this +release; and thus can be safely removed from your YAML configuration after upgrading. + +([@tokenize47] - [#56620]) ([solax docs]) + +{% enddetails %} + +## Farewell to the following + +The following integrations are no longer available as of this release: + +- **TaHoma** has been removed. The integration has been broken and now been + superseded by the [Overkiz](/integrations/overkiz) integration. + ([@iMicknl] - [#62607]) +- **Arduino** the now long time deprecated integration has been removed. + ([@frenck] - [#63406]) +- **EE Bright Box** has been broken en disabled for over a year now. + It has now been removed. ([@epenet] - [#63839]) + +## All changes + +{% details "Click to see all changes!" %} + +- 2022! Happy New Year! ([@frenck] - [#60936]) +- Updated code as per comment in #60676 ([@Swamp-Ig] - [#60682]) ([izone docs]) +- Remove legacy fan compatibility shim ([@bdraco] - [#59781]) ([fan docs]) ([demo docs]) ([template docs]) (breaking-change) +- Update integrations to use `async_setup_platforms` ([@cdce8p] - [#60956]) +- Add unique_id to the statistics component ([@ThomDietrich] - [#59205]) ([statistics docs]) +- Address late review of eight_sleep ([@raman325] - [#60951]) ([eight_sleep docs]) +- Improve asuswrt code readability ([@Chen-IL] - [#60975]) ([asuswrt docs]) +- Use platform enum (5) [P-R] ([@cdce8p] - [#60943]) +- Use platform enum (2) [E-G] ([@cdce8p] - [#60933]) +- Use platform enum (6) [S] ([@cdce8p] - [#60944]) +- Use platform enum (7) [T-Z] ([@cdce8p] - [#60948]) +- Use state variable from mpchc ([@infeeeee] - [#59341]) ([mpchc docs]) +- Revert "Use language independent variable to read MPC-HC state" ([@cgarwood] - [#60993]) ([mpchc docs]) +- Fix missing test assertion in ZHA siren test ([@dmulcahey] - [#61009]) ([zha docs]) +- Fix panasonic_viera tests ([@cdce8p] - [#60999]) ([panasonic_viera docs]) +- Remove deprecated base entity classes ([@frenck] - [#61006]) +- Add nina integration ([@DeerMaximum] - [#56647]) ([nina docs]) (new-integration) +- Remove deprecated YAML configuration from DSMR ([@frenck] - [#61008]) ([dsmr docs]) +- Address late review of Balboa ([@garbled1] - [#61004]) ([balboa docs]) +- Add Venstar runtimes and battery sensors ([@garbled1] - [#60414]) ([venstar docs]) +- Don't use ConfigEntry update listener for Fronius ([@farmio] - [#61017]) ([fronius docs]) +- Prevent ZHA coordinator from showing unavailable ([@dmulcahey] - [#61068]) ([zha docs]) +- Adjust yeelight ssdp_listener tests ([@epenet] - [#61065]) ([yeelight docs]) +- Add Aseko Pool Live integration ([@milanmeu] - [#56299]) +- Use platform enum (4) [M-O] ([@cdce8p] - [#60940]) +- Use platform enum (3) [H-L] ([@cdce8p] - [#60937]) +- Update Apple TV integration to support tvOS 15 ([@postlund] - [#58665]) ([apple_tv docs]) +- Add Yamaha MusicCast Select Entities ([@micha91] - [#60645]) ([yamaha_musiccast docs]) +- Add max/min/step to NumberEntityDescription ([@epenet] - [#61100]) ([xiaomi_miio docs]) ([number docs]) ([wallbox docs]) +- Add Open-Meteo integration ([@frenck] - [#60379]) ([open_meteo docs]) (new-integration) +- Use dataclass properties in Zeroconf tests ([@epenet] - [#61109]) ([zeroconf docs]) +- Revert "Add Open-Meteo integration (#60379)" ([@epenet] - [#61130]) ([open_meteo docs]) +- Bump cache version CI ([@balloob] - [#61137]) +- Block pytest_asyncio ([@balloob] - [#61141]) +- Add volume and tv metadata to Apple TV ([@postlund] - [#61107]) ([apple_tv docs]) +- Deprecate ios push config (in favor of inline actions) ([@zacwest] - [#61078]) ([ios docs]) (breaking-change) +- Replace deprecated DEVICE_CLASS constants with new enums in Hue integration ([@marcelveldt] - [#61149]) ([hue docs]) +- Change ondilo_ico update interval to 5 minutes ([@Alex9779] - [#61153]) ([ondilo_ico docs]) +- Add Onewire diagnostic and config switches and binary_sensors ([@garbled1] - [#59309]) ([onewire docs]) +- Fix flaky tests with unsynchronized stream `available` assertions ([@allenporter] - [#61167]) +- Fix incorrect docstring in automation trace code ([@emontnemery] - [#61168]) +- Minor deduplication of condition validation code ([@emontnemery] - [#61170]) ([automation docs]) +- Elmax integration ([@albertogeniola] - [#59321]) ([elmax docs]) (new-integration) +- Update MagicHome/flux_led OUIs for DHCP discovery ([@bdraco] - [#61192]) ([flux_led docs]) +- Add local access for Adax ([@Danielhiversen] - [#60019]) ([adax docs]) +- Use list comprehension in onewire sensor descriptions ([@epenet] - [#61157]) ([onewire docs]) +- Jewish Calendar: Do not convert datetimes to UTC ([@balloob] - [#61222]) ([jewish_calendar docs]) +- Bump actions/upload-artifact from 2.2.4 to 2.3.0 (@dependabot - [#61215]) +- Updating naming for flux_led ([@bdraco] - [#61187]) ([flux_led docs]) +- Address late review of Adax ([@Danielhiversen] - [#61200]) ([adax docs]) +- Fix flaky tests around frame helper ([@epenet] - [#61179]) +- Attempt to fix flaky prometheus test ([@emontnemery] - [#61242]) ([prometheus docs]) +- Statistics refactor testcases in async pytest style ([@ThomDietrich] - [#60935]) ([statistics docs]) +- Refactor recorder queue handling ([@emontnemery] - [#61161]) ([recorder docs]) +- Use SensorDeviceClass and SensorStateClass enums in Aurora ABB ([@davet2001] - [#61245]) ([aurora_abb_powerone docs]) +- Improve Sonos tests, begin adding coverage ([@jjlawren] - [#61198]) ([sonos docs]) +- Use new DeviceClass enums in ads ([@epenet] - [#61249]) ([ads docs]) +- Use new DeviceClass enums in acmeda ([@epenet] - [#61248]) ([acmeda docs]) +- Use new DeviceClass enums in accuweather ([@epenet] - [#61246]) ([accuweather docs]) +- Use new DeviceClass enums in abode ([@epenet] - [#61244]) ([abode docs]) +- Use _attr_* in whois integration ([@milanmeu] - [#61250]) ([whois docs]) +- Refactor Prometheus tests ([@alim4r] - [#60451]) ([prometheus docs]) +- Use new SensorDeviceClass enum in airvisual ([@epenet] - [#61261]) ([airvisual docs]) +- Use new DeviceClass, StateClass and EntityCategory enums in ambient_station ([@epenet] - [#61266]) ([ambient_station docs]) +- Use new BinarySensorDeviceClass enum in amcrest ([@epenet] - [#61268]) ([amcrest docs]) +- Use new SensorStateClass enum in amberelectric ([@epenet] - [#61265]) ([amberelectric docs]) +- Use new DeviceClass and StateClass enums in ambee ([@epenet] - [#61264]) ([ambee docs]) +- Use new CoverDeviceClass enum in aladdin_connect ([@epenet] - [#61262]) ([aladdin_connect docs]) +- Use new EntityCategory enum in airthings ([@epenet] - [#61260]) ([airthings docs]) +- Use new SensorStateClass enum in airnow ([@epenet] - [#61259]) ([airnow docs]) +- Use new DeviceClass and StateClass enums in airly ([@epenet] - [#61258]) ([airly docs]) +- Use new SensorDeviceClass enums in aemet ([@epenet] - [#61256]) ([aemet docs]) +- Use new DeviceClass and EntityCategory enums in advantage_air ([@epenet] - [#61255]) ([advantage_air docs]) +- Use new SensorDeviceClass in aqualogic ([@epenet] - [#61272]) ([aqualogic docs]) +- Remove log flooding prevention logic from discovery info ([@epenet] - [#61243]) ([zeroconf docs]) ([mqtt docs]) ([ssdp docs]) ([dhcp docs]) ([usb docs]) +- Use new EntityCategory enum in Surepetcare ([@Danielhiversen] - [#61282]) ([surepetcare docs]) +- Use new SensorDeviceClass enum in awair ([@epenet] - [#61290]) ([awair docs]) +- Use new SensorDeviceClass in apcupsd ([@epenet] - [#61271]) ([apcupsd docs]) +- Use new SensorDeviceClass in arlo ([@epenet] - [#61274]) ([arlo docs]) +- Use new SensorDeviceClass in arwn ([@epenet] - [#61275]) ([arwn docs]) +- Use new DeviceClass and StateClass enums in aseko_pool_live ([@epenet] - [#61276]) ([aseko_pool_live docs]) +- Use new DeviceClass and StateClass enums in atome ([@epenet] - [#61284]) ([atome docs]) +- Use new SwitchDeviceClass in aten_pe ([@epenet] - [#61281]) ([aten_pe docs]) +- Use new EntityCategory enum in Tibber ([@Danielhiversen] - [#61279]) ([tibber docs]) +- Use new EntityCategory in rfxtrx ([@Danielhiversen] - [#61295]) ([rfxtrx docs]) +- Use new EntityCategory in Mill ([@Danielhiversen] - [#61294]) ([mill docs]) +- Use new BinarySensorDeviceClass enum in axis ([@epenet] - [#61291]) ([axis docs]) +- Use new BinarySensorDeviceClass enum in balboa ([@epenet] - [#61292]) ([balboa docs]) +- Use new EntityCategory in Tractive ([@Danielhiversen] - [#61289]) ([tractive docs]) +- Use new EntityCategory enum in Switchbot ([@Danielhiversen] - [#61280]) ([switchbot docs]) +- Use new EntityCategory in Opengarage ([@Danielhiversen] - [#61285]) ([opengarage docs]) +- Use new DeviceClass and EntityCategory enums in august ([@epenet] - [#61288]) ([august docs]) +- Use new SensorDeviceClass enum in atag ([@epenet] - [#61278]) ([atag docs]) +- Use _attr_* in android_ip_webcam ([@epenet] - [#61270]) ([android_ip_webcam docs]) +- Aurora ABB add entity category ([@davet2001] - [#61231]) ([aurora_abb_powerone docs]) +- Use new DeviceClass enums in alexa ([@epenet] - [#61263]) ([alexa docs]) +- Use new CoverDeviceClass in bond ([@epenet] - [#61322]) ([bond docs]) +- Use new DeviceClass enums in bmw ([@epenet] - [#61321]) ([bmw_connected_drive docs]) +- Use new SensorDeviceClass enum in bmp280 ([@epenet] - [#61320]) ([bmp280 docs]) +- Use new SensorDeviceClass enum in bme280 ([@epenet] - [#61319]) ([bme280 docs]) +- Use SensorDeviceClass enum in beewi_smartclim ([@epenet] - [#61313]) ([beewi_smartclim docs]) +- Ues new SensorDeviceClass in bme680 ([@epenet] - [#61318]) ([bme680 docs]) +- Use DeviceClass and StateClass enums in broadlink ([@epenet] - [#61326]) ([broadlink docs]) +- Add sensors to Mill local heaters ([@Danielhiversen] - [#61247]) ([mill docs]) +- Use DeviceClass and StateClass enums in bbox ([@epenet] - [#61309]) ([bbox docs]) +- Use SensorDeviceClass enum in bh1750 ([@epenet] - [#61314]) ([bh1750 docs]) +- Use new DeviceClass enums in blink ([@epenet] - [#61315]) ([blink docs]) +- Use new DeviceClass enums in bloomsky ([@epenet] - [#61316]) ([bloomsky docs]) +- Use new DeviceClass enums in bosch_shc ([@epenet] - [#61324]) ([bosch_shc docs]) +- Use new MediaPlayerDeviceClass enum in braviatv ([@epenet] - [#61325]) ([braviatv docs]) +- Use new enums in brother ([@epenet] - [#61327]) ([brother docs]) +- Use new CoverDeviceClass enum in brunt ([@epenet] - [#61328]) ([brunt docs]) +- Use new SensorDeviceClass enum in buienradar ([@epenet] - [#61329]) ([buienradar docs]) +- Use new SensorDeviceClass enum in canary ([@epenet] - [#61330]) ([canary docs]) +- Use new SensorDeviceClass in cert_expiry ([@epenet] - [#61331]) ([cert_expiry docs]) +- Use new SensorStateClass enum in co2signal ([@epenet] - [#61333]) ([co2signal docs]) +- Use new DeviceClass and StateClass enums in comfoconnect ([@epenet] - [#61334]) ([comfoconnect docs]) +- Use new BinarySensorDeviceClass enum in concord232 ([@epenet] - [#61335]) ([concord232 docs]) +- Use new DeviceClass and EntityCategory enums in cloud ([@epenet] - [#61332]) ([cloud docs]) +- Use new SensorDeviceClass and SensorStateClass in velbus ([@Cereal2nd] - [#61339]) ([velbus docs]) +- Use new DeviceClass and StateClass enums in daikin ([@epenet] - [#61340]) ([daikin docs]) +- Use new DeviceClass and StateClass enums in darksky ([@epenet] - [#61342]) ([darksky docs]) +- Use _attr_* in delijn ([@epenet] - [#61344]) ([delijn docs]) +- Use new SensorDeviceClass enum in dht ([@epenet] - [#61349]) ([dht docs]) +- Use _attr_* in dte_energy_bridge ([@epenet] - [#61353]) ([dte_energy_bridge docs]) +- Use new SensorStateClass enum in dsmr_reader ([@epenet] - [#61352]) ([dsmr_reader docs]) +- Use new CoverDeviceClass enum in dynalite ([@epenet] - [#61354]) ([dynalite docs]) +- Use new enums in devolo_home_network ([@epenet] - [#61348]) ([devolo_home_network docs]) +- Use new MediaPlayerDeviceClass enum in directv ([@epenet] - [#61351]) ([directv docs]) +- Use new enums in devolo_home_control ([@epenet] - [#61345]) ([devolo_home_control docs]) +- Use _attr_* in abode ([@epenet] - [#61357]) ([abode docs]) +- Use new BinarySensorDeviceClass enum in digital_ocean ([@epenet] - [#61350]) ([digital_ocean docs]) +- Use new enums in deconz ([@epenet] - [#61343]) ([deconz docs]) +- Use new DeviceClass enums in blebox ([@epenet] - [#61361]) ([blebox docs]) +- Use new SensorDeviceClass enum in emonitor ([@epenet] - [#61385]) ([emonitor docs]) +- Improve type checking for rfxtrx ([@elupus] - [#58837]) ([rfxtrx docs]) +- Revert "Skip duplicated data when calculating fossil energy consumption (#60599)" ([@emontnemery] - [#61323]) ([energy docs]) +- Use new enums in energy ([@epenet] - [#61386]) ([energy docs]) +- Use find_coordinates in waze_travel_time ([@eifinger] - [#61400]) ([waze_travel_time docs]) +- Use new SensorDeviceClass in dsmr-reader ([@epenet] - [#61371]) ([dsmr_reader docs]) +- Use new DeviceClass and StateClass enums in ecobee ([@epenet] - [#61372]) ([ecobee docs]) +- Use new DeviceClass enums in econet ([@epenet] - [#61375]) ([econet docs]) +- Use new SensorDeviceClass enum in eddystone_temperature ([@epenet] - [#61376]) ([eddystone_temperature docs]) +- Use new DeviceClass and StateClass enums in efergy ([@epenet] - [#61377]) ([efergy docs]) +- Use new BinarySensorDeviceClass enum in egardia ([@epenet] - [#61378]) ([egardia docs]) +- Use new EntityCategory enum in elgato ([@epenet] - [#61379]) ([elgato docs]) +- Use new SensorStateClass in eliqonline ([@epenet] - [#61380]) ([eliqonline docs]) +- Use new SensorDeviceClass enum in ebusd ([@epenet] - [#61374]) ([ebusd docs]) +- Use new DeviceClass and StateClass enums in emoncms ([@epenet] - [#61381]) ([emoncms docs]) +- Use new DeviceClass and StateClass enums in enocean ([@epenet] - [#61387]) ([enocean docs]) +- Use new DeviceClass and StateClass in enphase_envoy ([@epenet] - [#61388]) ([enphase_envoy docs]) +- Use SensorDeviceClass in envirophat ([@epenet] - [#61389]) ([envirophat docs]) +- Use SensorDeviceClass in environment_canada ([@epenet] - [#61390]) ([environment_canada docs]) +- Mill, use native_value ([@Danielhiversen] - [#61382]) ([mill docs]) +- Use new DeviceClass enums in ezviz ([@epenet] - [#61383]) ([ezviz docs]) +- Use new enums in esphome ([@epenet] - [#61391]) ([esphome docs]) +- Optimise state attributes in delijn ([@epenet] - [#61424]) ([delijn docs]) +- Speed up demo lock tests ([@emontnemery] - [#61425]) ([demo docs]) +- Break long lines in discovery_info ([@epenet] - [#61431]) +- Use new DeviceClass enums in flipr ([@epenet] - [#61439]) ([flipr docs]) +- Use new SensorDeviceClass enum in foobot ([@epenet] - [#61442]) ([foobot docs]) +- Use new DeviceClass enums in fibaro ([@epenet] - [#61437]) ([fibaro docs]) +- Use new DeviceClass constants in flo ([@epenet] - [#61440]) ([flo docs]) +- Use new enums in forecast_solar ([@epenet] - [#61443]) ([forecast_solar docs]) +- Use new SensorDeviceClass enum in freebox ([@epenet] - [#61444]) ([freebox docs]) +- Use new enums in fjaraskupan ([@epenet] - [#61438]) ([fjaraskupan docs]) +- Use BinarySensorDeviceClass in ffmpeg ([@epenet] - [#61436]) ([ffmpeg_noise docs]) ([ffmpeg_motion docs]) +- Use new SensorStateClass enum in flunearyou ([@epenet] - [#61441]) ([flunearyou docs]) +- Use new enums in fritzbox ([@epenet] - [#61447]) ([fritzbox docs]) +- Use new enums in fritz ([@epenet] - [#61446]) ([fritz docs]) +- Add media_player platform to Lookin ([@ANMalko] - [#61337]) ([lookin docs]) (new-platform) +- Remove external library discovery call in Sonos ([@jjlawren] - [#61461]) ([sonos docs]) +- Add events and device triggers to LCN ([@alengwenus] - [#58745]) ([lcn docs]) +- Drop nmap_tracker code owner ([@bdraco] - [#61476]) ([nmap_tracker docs]) +- Pickup codeowner for lookin ([@bdraco] - [#61474]) ([lookin docs]) +- Use Platform enum in ZHA ([@dmulcahey] - [#61016]) ([zha docs]) +- Use async_on_unload from config entry in ZHA ([@dmulcahey] - [#61015]) ([zha docs]) +- Clean up state class and device class usage in ZHA ([@dmulcahey] - [#61049]) ([zha docs]) +- Add instant arming for totalconnect ([@austinmroczek] - [#60156]) ([totalconnect docs]) +- Reduce cpu requirements for apple_tv mdns and discovery ([@bdraco] - [#61346]) ([apple_tv docs]) +- Bump pylitterbot to 2021.12.0 ([@natekspencer] - [#61536]) ([litterrobot docs]) +- Refactor ZHA entity matching process ([@Adminiuga] - [#60063]) ([zha docs]) +- Use new enums in gogogate2 ([@epenet] - [#61515]) ([gogogate2 docs]) +- Use relative import within component for nest media source ([@allenporter] - [#61571]) ([nest docs]) +- Update HVAC action handling in ZHA climate devices ([@dmulcahey] - [#61460]) ([zha docs]) +- Fix totalconnect service schema ([@austinmroczek] - [#61595]) ([totalconnect docs]) +- Fix freedompro tests ([@cdce8p] - [#61012]) ([freedompro docs]) +- Use relative imports [L-R] ([@mib1185] - [#61575]) +- Use new SensorDeviceClass enum in gios ([@epenet] - [#61609]) ([gios docs]) +- Use new BinarySensorDeviceClass in eight_sleep ([@epenet] - [#61610]) ([eight_sleep docs]) +- Use new SensorDeviceClass enum in glances ([@epenet] - [#61613]) ([glances docs]) +- Use new enums in goalzero ([@epenet] - [#61518]) ([goalzero docs]) +- Use relative imports [S-Z] ([@mib1185] - [#61576]) +- Bump blinkpy to 0.18.0 ([@funkybunch] - [#61538]) ([blink docs]) +- Use new enums in freedompro ([@epenet] - [#61445]) ([freedompro docs]) +- Use platform enum (8) [Misc] ([@cdce8p] - [#61013]) +- Bump pillow from 8.2.0 to 8.3.2 ([@nohn] - [#61661]) +- Remove duplicated statistics rows ([@emontnemery] - [#61146]) ([recorder docs]) +- Upgrade hangups to 0.4.16 ([@cdce8p] - [#61678]) ([hangouts docs]) +- Add color mode support to zwave light ([@emontnemery] - [#55264]) ([zwave docs]) +- Use SwitchDeviceClass in gree ([@epenet] - [#61656]) ([gree docs]) +- Use SensorDeviceClass in gtfs ([@epenet] - [#61657]) ([gtfs docs]) +- Use new enums in guardian ([@epenet] - [#61660]) ([guardian docs]) +- Use new enums in homekit-controller ([@epenet] - [#61689]) ([homekit_controller docs]) +- Improve balboa tests ([@MartinHjelmare] - [#61691]) ([balboa docs]) +- Fix typo transponder in LCN ([@LEJOUI] - [#61658]) ([lcn docs]) +- Use new enums in growatt_server ([@epenet] - [#61655]) ([growatt_server docs]) +- Use SensorDeviceClass in greeneye-monitor ([@epenet] - [#61653]) ([greeneye_monitor docs]) +- Use new DeviceClass enum in geniushub ([@epenet] - [#61608]) ([geniushub docs]) +- Update sisyphus-control to version 3.1.2 ([@jkeljo] - [#58198]) ([sisyphus docs]) +- Use relative imports [A-H] ([@mib1185] - [#61574]) +- Use BinarySensorDeviceClass in hikvision ([@epenet] - [#61722]) ([hikvision docs]) +- Use _attr_* in hddtemp ([@epenet] - [#61721]) ([hddtemp docs]) +- Use SensorStateClass in hassio ([@epenet] - [#61720]) ([hassio docs]) +- Fix updating apple_tv addresses ([@bdraco] - [#61724]) ([apple_tv docs]) +- Use async_on_unload for Nut update_listener ([@ollo69] - [#61589]) ([nut docs]) +- Add configuration_url to syncthru devices ([@scop] - [#61508]) ([syncthru docs]) +- Remove deprecated yaml config from flume ([@tkdrob] - [#61517]) ([flume docs]) (breaking-change) +- Add support for app launching in Apple TV ([@postlund] - [#61732]) ([apple_tv docs]) +- Use attr* in garages_amsterdam ([@epenet] - [#61605]) ([garages_amsterdam docs]) +- Use new HumidifierDeviceClass enum in generic_hygrostat ([@epenet] - [#61607]) ([generic_hygrostat docs]) +- Use new DeviceClass enums in google-assistant ([@epenet] - [#61611]) ([google_assistant docs]) +- Upgrade vehicle to 0.3.0 ([@frenck] - [#61738]) ([rdw docs]) +- Upgrade sentry-sdk to 1.5.1 ([@frenck] - [#61735]) ([sentry docs]) +- Use _attr_* in danfoss_air ([@epenet] - [#61341]) ([danfoss_air docs]) +- Use _attr_* in ecoal_boiler ([@epenet] - [#61363]) ([ecoal_boiler docs]) +- Fix typo in wolflink strings.sensor.json ([@lunmay] - [#61716]) ([wolflink docs]) +- Typo fixes for Adax in strings.json ([@lunmay] - [#61492]) ([adax docs]) +- Upgrades Garages Amsterdam to v3.0.0 ([@klaasnicolaas] - [#61734]) ([garages_amsterdam docs]) +- Upgrade black to 21.12b0 ([@frenck] - [#61741]) +- Use SensorDeviceClass enum in Luftdaten ([@frenck] - [#61746]) ([luftdaten docs]) +- Remove deprecated YAML configuration from Luftdaten ([@frenck] - [#61748]) ([luftdaten docs]) (breaking-change) +- Use new SwitchDeviceClass enum in home-plus-control ([@epenet] - [#61760]) ([home_plus_control docs]) +- Use new enums in homematic ([@epenet] - [#61765]) ([homematic docs]) +- Use new enums in huisbaasje ([@epenet] - [#61776]) ([huisbaasje docs]) +- Use new SensorDeviceClass enum in homeassistant-triggers ([@epenet] - [#61764]) ([homeassistant docs]) +- Use new enums in homematicip_cloud ([@epenet] - [#61768]) ([homematicip_cloud docs]) +- Use new SensorDeviceClass enum in hvv_departures ([@epenet] - [#61780]) ([hvv_departures docs]) +- Use new enums in huawei-lte ([@epenet] - [#61771]) ([huawei_lte docs]) +- Use new enums in hydrawise ([@epenet] - [#61781]) ([hydrawise docs]) +- Use new enums in hunterdouglas_powerview ([@epenet] - [#61777]) ([hunterdouglas_powerview docs]) +- Use new enums in hue ([@epenet] - [#61772]) ([hue docs]) +- Use SensorDeviceClass enum in htu21d ([@epenet] - [#61770]) ([htu21d docs]) +- Remove deprecated yaml from foscam ([@tkdrob] - [#61761]) ([foscam docs]) (breaking-change) +- Add twinkly DHCP support ([@pvizeli] - [#61434]) ([twinkly docs]) +- Use new DeviceClass enums in iaqualink ([@epenet] - [#61805]) ([iaqualink docs]) +- Use new enums in integration ([@epenet] - [#61803]) ([integration docs]) +- Use new SensorDeviceClass in ihc ([@epenet] - [#61799]) ([ihc docs]) +- Use SensorDeviceClass in incomfort ([@epenet] - [#61800]) ([incomfort docs]) +- Use new BinarySensorDeviceClass in insteon ([@epenet] - [#61801]) ([insteon docs]) +- Use new enums in iotawatt ([@epenet] - [#61802]) ([iotawatt docs]) +- Use SensorDeviceClass in icloud ([@epenet] - [#61804]) ([icloud docs]) +- Use new DeviceClass enums in hive ([@epenet] - [#61758]) ([hive docs]) +- Use new DeviceClass enum in home_connect ([@epenet] - [#61759]) ([home_connect docs]) +- Last reset is no longer deprecated ([@Danielhiversen] - [#61816]) ([sensor docs]) +- Improve warnings when a zone trigger is referencing a none-existing zone ([@emontnemery] - [#61763]) ([zone docs]) +- Use SensorStateClass in iqvia ([@epenet] - [#61823]) ([iqvia docs]) +- Use SensorDeviceClass in ipp ([@epenet] - [#61822]) ([ipp docs]) +- Use SensorDeviceClass in islamic_prayer_times ([@epenet] - [#61824]) ([islamic_prayer_times docs]) +- Use SensorDeviceClass in jewish-calendar ([@epenet] - [#61827]) ([jewish_calendar docs]) +- Revert pillow 8.3.2 ([@MartinHjelmare] - [#61793]) ([qrcode docs]) ([tensorflow docs]) ([proxy docs]) ([seven_segments docs]) ([doods docs]) ([sighthound docs]) ([image docs]) +- Use new CoverDeviceClass in knx ([@epenet] - [#61868]) ([knx docs]) +- Support publishing MQTT messages with raw bytes payloads ([@jbouwh] - [#61090]) ([mqtt docs]) +- Use new BinarySensorDeviceClass in keenetic_ndms2 ([@epenet] - [#61867]) ([keenetic_ndms2 docs]) +- Use new enums in keba ([@epenet] - [#61869]) ([keba docs]) +- Use new enums in kostal_plenticore ([@epenet] - [#61871]) ([kostal_plenticore docs]) +- Tidy up package constraint messages ([@epenet] - [#61866]) +- Use new DeviceClass enums in konnected ([@epenet] - [#61870]) ([konnected docs]) +- Remove deprecated yaml config from enphase envoy ([@tkdrob] - [#61840]) ([enphase_envoy docs]) (breaking-change) +- Use SensorDeviceClass in lacrosse ([@epenet] - [#61879]) ([lacrosse docs]) +- Use new enums in litterrobot ([@epenet] - [#61884]) ([litterrobot docs]) +- Use new DeviceClass enums in lutron_caseta ([@epenet] - [#61887]) ([lutron_caseta docs]) +- Use new enums in lookin ([@epenet] - [#61885]) ([lookin docs]) +- Use BinarySensorDeviceClass in lutron ([@epenet] - [#61886]) ([lutron docs]) +- Use _attr_attribution in meteoclimatic ([@epenet] - [#61898]) ([meteoclimatic docs]) +- Use new SensorDeviceClass in metoffice ([@epenet] - [#61899]) ([metoffice docs]) +- Use new SensorDeviceClass in meteoclimatic ([@epenet] - [#61897]) ([meteoclimatic docs]) +- Use new enums in meteo-france ([@epenet] - [#61896]) ([meteo_france docs]) +- Use new enums in melcloud ([@epenet] - [#61894]) ([melcloud docs]) +- Use new enums in lyric ([@epenet] - [#61888]) ([lyric docs]) +- Use new enums in miflora ([@epenet] - [#61922]) ([miflora docs]) +- Fix typo in template select ([@emontnemery] - [#61919]) ([template docs]) +- Use SensorDeviceClass in mhz19 ([@epenet] - [#61923]) ([mhz19 docs]) +- Use new BinarySensorDeviceClass in minecraft_server ([@epenet] - [#61924]) ([minecraft_server docs]) +- Use new SensorDeviceClass in mitemp-bt ([@epenet] - [#61925]) ([mitemp_bt docs]) +- Use new enums in modern_forms ([@epenet] - [#61930]) ([modern_forms docs]) +- Use new enums in motioneye ([@epenet] - [#61932]) ([motioneye docs]) +- Use new enums in myq ([@epenet] - [#61933]) ([myq docs]) +- Use new enums in mullvad ([@epenet] - [#61934]) ([mullvad docs]) +- Make config entry disabled_by an enum ([@scop] - [#60445]) ([config docs]) ([zwave_js docs]) +- Don't log DB connection string on error ([@balloob] - [#61927]) ([recorder docs]) +- Use new enums in notion ([@epenet] - [#61950]) ([notion docs]) +- Use new enums in nest ([@epenet] - [#61942]) ([nest docs]) +- A few RFLink tests ([@javicalle] - [#58544]) ([rflink docs]) +- Use RegistryEntryDisabler ([@scop] - [#60436]) +- Clean up dirt from recollect_waste yaml ([@tkdrob] - [#61964]) ([recollect_waste docs]) +- Use Enums in zoneminder ([@tkdrob] - [#61975]) ([zoneminder docs]) +- Use Enums in zamg ([@tkdrob] - [#61976]) ([zamg docs]) +- Use new BinarySensorDeviceClass in isy994 ([@epenet] - [#61825]) ([isy994 docs]) +- Use new enums in nexia ([@epenet] - [#61952]) ([nexia docs]) +- Bump pyatv to 0.9.8 ([@postlund] - [#61959]) ([apple_tv docs]) +- Bump actions/upload-artifact from 2.3.0 to 2.3.1 (@dependabot - [#62004]) +- Use enums in wiffi ([@tkdrob] - [#61984]) ([wiffi docs]) +- Use enums in wirelesstag ([@tkdrob] - [#61985]) ([wirelesstag docs]) +- Use enums in wemo ([@tkdrob] - [#61983]) ([wemo docs]) +- Use enums in xbee ([@tkdrob] - [#61982]) ([xbee docs]) +- Use enums in xiaomi_aqara ([@tkdrob] - [#61981]) ([xiaomi_aqara docs]) +- Use enums in withings ([@tkdrob] - [#61987]) ([withings docs]) +- Use enums in wolflink ([@tkdrob] - [#61988]) ([wolflink docs]) +- Use enums in yandex_transport ([@tkdrob] - [#61978]) ([yandex_transport docs]) +- Use enums in velux ([@tkdrob] - [#61991]) ([velux docs]) +- Use enums in youless ([@tkdrob] - [#61977]) ([youless docs]) +- Use enums in vallox ([@tkdrob] - [#61992]) ([vallox docs]) +- Use enums in webostv ([@tkdrob] - [#62000]) ([webostv docs]) +- Use enums in waterfurnace ([@tkdrob] - [#61999]) ([waterfurnace docs]) +- Use enums in waqi ([@tkdrob] - [#61998]) ([waqi docs]) +- Use enums in vilfo ([@tkdrob] - [#61995]) ([vilfo docs]) +- Prevent apple_tv rediscovery from secondary identifiers ([@bdraco] - [#61973]) ([apple_tv docs]) +- Tweak comment for ENERGY sensor device class ([@emontnemery] - [#62006]) ([sensor docs]) +- Use enums in vicare ([@tkdrob] - [#61994]) ([vicare docs]) +- Use new enums in mysensors ([@epenet] - [#61935]) ([mysensors docs]) +- Bump version to 2022.2.0dev0 ([@frenck] - [#62011]) +- Add Tibber estimated hour consumption sensor ([@Danielhiversen] - [#62003]) ([tibber docs]) +- Add hardware version to the device registry ([@bdraco] - [#61650]) +- Use new enums in netgear ([@epenet] - [#61943]) ([netgear docs]) +- Add hardware version support to homekit controller ([@bdraco] - [#61743]) ([homekit_controller docs]) +- Use enums in toon ([@tkdrob] - [#62021]) ([toon docs]) +- Use enums in tractive ([@tkdrob] - [#62024]) ([tractive docs]) +- Handle color temp to RGBWW conversion ([@bdraco] - [#61473]) ([light docs]) +- Use enums in utility_meter ([@tkdrob] - [#62033]) ([utility_meter docs]) +- Use enums in upnp ([@tkdrob] - [#62031]) ([upnp docs]) +- Use enums in updated ([@tkdrob] - [#62030]) ([updater docs]) +- Use enums in unifi ([@tkdrob] - [#62029]) ([unifi docs]) +- Use entity category enums in tuya ([@tkdrob] - [#62028]) ([tuya docs]) +- Use enums in trafikverket_weatherstation ([@tkdrob] - [#62027]) ([trafikverket_weatherstation docs]) +- Use enums in trafikverket_train ([@tkdrob] - [#62026]) ([trafikverket_train docs]) +- Use enums in tradfri ([@tkdrob] - [#62025]) ([tradfri docs]) +- Use enums in tplink ([@tkdrob] - [#62023]) ([tplink docs]) +- Use enums in totalconnect ([@tkdrob] - [#62022]) ([totalconnect docs]) +- Use enums in tolo ([@tkdrob] - [#62020]) ([tolo docs]) +- Implement DataUpdateCoordinator for Fritz ([@chemelli74] - [#60909]) ([fritz docs]) +- Add buttons and deprecate services for Fritz ([@chemelli74] - [#61483]) ([fritz docs]) (breaking-change) +- Fix mfi tests ([@epenet] - [#61904]) ([mfi docs]) +- Use enums in shelly ([@tkdrob] - [#62035]) ([shelly docs]) +- Use enums in ring ([@tkdrob] - [#62041]) ([ring docs]) +- Use enums in uptime ([@tkdrob] - [#62032]) ([uptime docs]) +- Use enums in skybell ([@tkdrob] - [#62053]) ([skybell docs]) +- use enums in skybeacon ([@tkdrob] - [#62052]) ([skybeacon docs]) +- Use enums in sensehat ([@tkdrob] - [#62051]) ([sensehat docs]) +- Use enums in senses ([@tkdrob] - [#62050]) ([sense docs]) +- Use enums in sht31 ([@tkdrob] - [#62036]) ([sht31 docs]) +- Use enums in simplisafe ([@tkdrob] - [#62037]) ([simplisafe docs]) +- Use enums in repetier ([@tkdrob] - [#62038]) ([repetier docs]) +- Use enums in rfxtrx ([@tkdrob] - [#62039]) ([rfxtrx docs]) +- Use enums in ridwell ([@tkdrob] - [#62040]) ([ridwell docs]) +- Use enums in risco ([@tkdrob] - [#62042]) ([risco docs]) +- Use enum in roku ([@tkdrob] - [#62043]) ([roku docs]) +- Use enums in rova ([@tkdrob] - [#62044]) ([rova docs]) +- Use enums in samsung_tv ([@tkdrob] - [#62047]) ([samsungtv docs]) +- Use enums in qnap ([@tkdrob] - [#62055]) ([qnap docs]) +- Use enums philips_js ([@tkdrob] - [#62063]) ([philips_js docs]) +- Use new enums in mqtt ([@epenet] - [#61936]) ([mqtt docs]) +- Use enums in rdw ([@tkdrob] - [#62059]) ([rdw docs]) +- Use new enums in mobile_app ([@epenet] - [#61929]) ([mobile_app docs]) +- Clean up upcloud ([@tkdrob] - [#61971]) ([upcloud docs]) +- Use new enums in nx584 ([@epenet] - [#61948]) ([nx584 docs]) +- Use DeviceClass Enum in concord232 schema ([@epenet] - [#61968]) ([concord232 docs]) +- Use DeviceClass Enum in ness-alarm schema ([@epenet] - [#61969]) ([ness_alarm docs]) +- Use enums for Panasonic Viera ([@tkdrob] - [#62062]) ([panasonic_viera docs]) +- Use enums in ovo_energy ([@tkdrob] - [#62087]) ([ovo_energy docs]) +- Use enums in oasa_telematics ([@tkdrob] - [#62077]) ([oasa_telematics docs]) +- Use enums in picnic ([@tkdrob] - [#62065]) ([picnic docs]) +- Use enums in ping ([@tkdrob] - [#62066]) ([ping docs]) +- Use enums in pluugwise ([@tkdrob] - [#62067]) ([plugwise docs]) +- Use new enums in nws ([@epenet] - [#61947]) ([nws docs]) +- Use new enums in neato ([@epenet] - [#61939]) ([neato docs]) +- Use SensorDeviceClass in mfi ([@epenet] - [#61900]) ([mfi docs]) +- Use enums in plaato ([@tkdrob] - [#62069]) ([plaato docs]) +- Minor refactor of template fan ([@emontnemery] - [#61856]) ([template docs]) +- Use enums in rpi_power ([@tkdrob] - [#62046]) ([rpi_power docs]) +- Minor refactor of template light ([@emontnemery] - [#61857]) ([template docs]) +- Use enums in ozw ([@tkdrob] - [#62088]) ([ozw docs]) +- Minor refactor of template lock ([@emontnemery] - [#61858]) ([template docs]) +- Minor refactor of template number ([@emontnemery] - [#61863]) ([template docs]) +- Use enums in openuv ([@tkdrob] - [#62085]) ([openuv docs]) +- Use enums in recollect_waste ([@tkdrob] - [#62060]) ([recollect_waste docs]) +- Use enums in rainmachine ([@tkdrob] - [#62058]) ([rainmachine docs]) +- Minor refactor of template weather ([@emontnemery] - [#61861]) ([template docs]) +- Minor refactor of template alarm ([@emontnemery] - [#61862]) ([template docs]) +- Use enums in ondilo_ico ([@tkdrob] - [#62081]) ([ondilo_ico docs]) +- Use enums in poolsense ([@tkdrob] - [#62071]) ([poolsense docs]) +- Use enums in octoprint ([@tkdrob] - [#62079]) ([octoprint docs]) +- Minor refactor of template select ([@emontnemery] - [#62091]) ([template docs]) +- Minor refactor of template switch ([@emontnemery] - [#61859]) ([template docs]) +- Use enums in openverse ([@tkdrob] - [#62082]) ([openevse docs]) +- Use enums in venstar ([@tkdrob] - [#61993]) ([venstar docs]) +- Use enums in screenlogic ([@tkdrob] - [#62049]) ([screenlogic docs]) +- Use enums in Powerwall ([@tkdrob] - [#62072]) ([powerwall docs]) +- Add config flow to Azure Event Hub integration ([@eavanvalkenburg] - [#61155]) ([azure_event_hub docs]) (breaking-change) +- Minor refactor of template vacuum ([@emontnemery] - [#61860]) ([template docs]) +- Use DeviceClass Enums in airly tests ([@davet2001] - [#61989]) ([airly docs]) +- Use DeviceClass Enums in abode tests ([@davet2001] - [#61980]) ([abode docs]) +- Use DeviceClass Enums in advantage_air tests ([@davet2001] - [#61986]) ([advantage_air docs]) +- Use DeviceClass Enums in accuweather tests ([@davet2001] - [#61990]) ([accuweather docs]) +- Add Open-Meteo integration (second attempt) ([@frenck] - [#61742]) ([open_meteo docs]) (new-integration) +- Use DeviceClass Enums in brother tests ([@davet2001] - [#62110]) ([brother docs]) +- Use DeviceClass Enums in ambee tests ([@davet2001] - [#62108]) ([ambee docs]) +- Small cleanup of Luftdaten constants ([@frenck] - [#61757]) ([luftdaten docs]) +- Improve tests for template binary sensor ([@emontnemery] - [#62103]) ([template docs]) +- Use new enums in nzbget ([@epenet] - [#61946]) ([nzbget docs]) +- Use DeviceClass Enums in deconz tests ([@davet2001] - [#62114]) ([deconz docs]) +- Use DeviceClass Enums in canary tests ([@davet2001] - [#62113]) ([canary docs]) +- Handle None values in weather entity forecast ([@rianadon] - [#61467]) ([weather docs]) +- Use DeviceClass Enums in elgato tests ([@davet2001] - [#62121]) ([elgato docs]) +- Tweak core add_job and async_add_job docstrings ([@emontnemery] - [#62112]) +- Use DeviceClass Enums in arlo tests ([@davet2001] - [#62095]) ([arlo docs]) +- Use enums in obihai ([@tkdrob] - [#62078]) ([obihai docs]) +- Use enums in opengarage ([@tkdrob] - [#62083]) ([opengarage docs]) +- Use enums in p1_monitor ([@tkdrob] - [#62061]) ([p1_monitor docs]) +- Use enums in pvoutput ([@tkdrob] - [#62073]) ([pvoutput docs]) +- Use enums in openweathermap ([@tkdrob] - [#62086]) ([openweathermap docs]) +- Use enums in Omnilogic ([@tkdrob] - [#62080]) ([omnilogic docs]) +- Use enums in opentherm_gw ([@tkdrob] - [#62084]) ([opentherm_gw docs]) +- Use enums in Point ([@tkdrob] - [#62070]) ([point docs]) +- Use enums in xiaomi_miio ([@tkdrob] - [#61979]) ([xiaomi_miio docs]) +- Use enums in pi_hole ([@tkdrob] - [#62064]) ([pi_hole docs]) +- Use enums in roomba ([@tkdrob] - [#62045]) ([roomba docs]) +- Use enums in rainforest_eagle ([@tkdrob] - [#62057]) ([rainforest_eagle docs]) +- Use new enums in netatmo ([@epenet] - [#61941]) ([netatmo docs]) +- Use new enums in netgear_lte ([@epenet] - [#61955]) ([netgear_lte docs]) +- Use new enums in nextbus ([@epenet] - [#61954]) ([nextbus docs]) +- Use new enums in nissan_leaf ([@epenet] - [#61951]) ([nissan_leaf docs]) +- Use new enums in neurio_energy ([@epenet] - [#61953]) ([neurio_energy docs]) +- Use new enums in nuki ([@epenet] - [#61949]) ([nuki docs]) +- Use new enums in motion_blinds ([@epenet] - [#61931]) ([motion_blinds docs]) +- Use attr** in lightwave ([@epenet] - [#61881]) ([lightwave docs]) +- Use attr** in linux-battery ([@epenet] - [#61883]) ([linux_battery docs]) +- Use _attr_attribution in flipr ([@epenet] - [#61889]) ([flipr docs]) +- Use _attr_attribution in goalzero ([@epenet] - [#61890]) ([goalzero docs]) +- Use attr** in meteoalarm ([@epenet] - [#61895]) ([meteoalarm docs]) +- Use new enums in nanoleaf ([@epenet] - [#61938]) ([nanoleaf docs]) +- Use new enums in nam ([@epenet] - [#61940]) ([nam docs]) +- Use new SensorDeviceClass in juicenet ([@epenet] - [#61828]) ([juicenet docs]) +- Use enums in satel_integra ([@tkdrob] - [#62048]) ([satel_integra docs]) +- Use DeviceClass Enum in KNX schema ([@farmio] - [#61960]) ([knx docs]) +- Use DeviceClass Enums in axis tests ([@davet2001] - [#62096]) ([axis docs]) +- Use enums in rachio ([@tkdrob] - [#62056]) ([rachio docs]) +- Use enums in pvpc_hourly_pricing ([@tkdrob] - [#62076]) ([pvpc_hourly_pricing docs]) +- Use DeviceClass Enums in devolo_home_control tests ([@davet2001] - [#62116]) ([devolo_home_control docs]) +- Use DeviceClass Enums in directv tests ([@davet2001] - [#62118]) ([directv docs]) +- Use DeviceClass Enums in energy tests ([@davet2001] - [#62122]) ([energy docs]) +- Use DeviceClass Enums in efergy tests ([@davet2001] - [#62119]) ([efergy docs]) +- Use EntityCategory Enums in elkm1 ([@davet2001] - [#62123]) ([elkm1 docs]) +- Use DeviceClass Enums in google_assistant tests ([@davet2001] - [#62142]) ([google_assistant docs]) +- Use DeviceClass Enums in goalzero tests ([@davet2001] - [#62136]) ([goalzero docs]) +- Use DeviceClass Enums in blebox tests ([@davet2001] - [#62109]) ([blebox docs]) +- Use DeviceClass Enums in forecast_solar tests ([@davet2001] - [#62132]) ([forecast_solar docs]) +- Use DeviceClass Enums in gios tests ([@davet2001] - [#62135]) ([gios docs]) +- Use DeviceClass Enums in gogogate2 tests ([@davet2001] - [#62137]) ([gogogate2 docs]) +- Use enums in sensor tests ([@tkdrob] - [#62152]) ([sensor docs]) +- Use enums in helpers tests ([@tkdrob] - [#62141]) +- Use enums for testing_config ([@tkdrob] - [#62140]) +- Use enums in unifi tests ([@tkdrob] - [#62151]) ([unifi docs]) +- Fix threading error in qwikswitch ([@emontnemery] - [#62173]) ([qwikswitch docs]) +- Move Solarlog state to entity description ([@Ernst79] - [#62093]) ([solarlog docs]) +- Use new SensorDeviceClass enum in climacell ([@epenet] - [#61362]) ([climacell docs]) +- Fix threading error in demo vacuum ([@emontnemery] - [#62165]) ([demo docs]) +- Use enums in wallbox ([@tkdrob] - [#61997]) ([wallbox docs]) +- Add Tibber peak hour, monthly consumption and monthly cost sensors ([@Danielhiversen] - [#61853]) ([tibber docs]) +- Fix threading error in litejet ([@emontnemery] - [#62185]) ([litejet docs]) +- Fix threading error in recorder tests ([@emontnemery] - [#62187]) ([recorder docs]) +- Update fortios device_tracker ([@kimfrellsen] - [#61970]) ([fortios docs]) (breaking-change) +- Add battery entity for Maxcube devices ([@petslane] - [#58699]) ([maxcube docs]) +- Upgrades P1 Monitor to v1.0.1 ([@klaasnicolaas] - [#62201]) ([p1_monitor docs]) +- Address late review of nina ([@DeerMaximum] - [#61915]) ([nina docs]) +- Use DeviceClass Enums in greeneye_monitor tests ([@davet2001] - [#62143]) ([greeneye_monitor docs]) +- Fix codeowners for tests in hassfest ([@frenck] - [#62204]) +- Use enums in utility_meter tests ([@tkdrob] - [#62190]) ([utility_meter docs]) +- Fix Wemo create task for awaitable ([@esev] - [#62159]) ([wemo docs]) +- Use enums in roku tests ([@tkdrob] - [#62196]) ([roku docs]) +- Use enums in samsungtv tests ([@tkdrob] - [#62195]) ([samsungtv docs]) +- Fix threading error in stream tests ([@bdraco] - [#62221]) ([stream docs]) +- Use new enums in sonos ([@epenet] - [#62202]) ([sonos docs]) +- Remove myself from yeelight codeowners ([@rytilahti] - [#62239]) ([yeelight docs]) +- Add Netgear entity category and configuration url ([@starkillerOG] - [#62260]) ([netgear docs]) +- Add entity category to DSMR ([@starkillerOG] - [#62262]) ([dsmr docs]) +- Motion blinds add entity category ([@starkillerOG] - [#62266]) ([motion_blinds docs]) +- Hyperion add entity category ([@starkillerOG] - [#62268]) ([hyperion docs]) +- Add ATTR_HW_VERSION to homeassistant.const ([@bdraco] - [#62258]) +- Add software version to screenlogic ([@bdraco] - [#62255]) ([screenlogic docs]) +- Use new enums in smarttub ([@epenet] - [#62216]) ([smarttub docs]) +- Use new enums in smart_meter_texas ([@epenet] - [#62210]) ([smart_meter_texas docs]) +- Use enums in statistics tests ([@tkdrob] - [#62191]) ([statistics docs]) +- Use new enums in smappee ([@epenet] - [#62209]) ([smappee docs]) +- Finish using enums in wled ([@tkdrob] - [#62189]) ([wled docs]) +- Add xiaomi miio gateway hw version ([@starkillerOG] - [#62274]) ([xiaomi_miio docs]) +- Update rokuecp to 0.8.5 ([@ctalkington] - [#62285]) ([roku docs]) +- Move Device Class definition to Home Assistant for MusicCast Select Entities ([@micha91] - [#61218]) ([yamaha_musiccast docs]) +- Bump aioridwell to 2021.12.2 ([@bachya] - [#62284]) ([ridwell docs]) +- Use new DeviceClass enums in homekit ([@epenet] - [#61665]) ([homekit docs]) +- Add wemo config_flow test to get 100% coverage ([@esev] - [#62158]) ([wemo docs]) +- Fix hw_version not updating from an entity device_info ([@bdraco] - [#62254]) +- Add network support to flux_led discovery ([@bdraco] - [#61132]) ([flux_led docs]) +- Use DeviceClass Enums in homekit_controller tests ([@davet2001] - [#62219]) ([homekit_controller docs]) +- Add a switch to opt-in to/opt-out of the next Ridwell pickup ([@bachya] - [#62293]) ([ridwell docs]) +- Add hardware version to bond ([@bdraco] - [#62256]) ([bond docs]) +- Add support for enabling/disabling cloud access in flux_led ([@bdraco] - [#61138]) ([flux_led docs]) +- Speed up stream tests by 40-50% with shared data ([@allenporter] - [#62300]) ([stream docs]) +- Add pico remote support to non-pro lutron caseta bridges ([@bdraco] - [#61032]) ([lutron_caseta docs]) +- Persist nest media events to disk backed storage ([@allenporter] - [#61641]) ([nest docs]) +- Align zeroconf matching with ZeroconfServiceInfo ([@bdraco] - [#62133]) ([zeroconf docs]) ([axis docs]) ([doorbird docs]) ([apple_tv docs]) ([samsungtv docs]) ([nam docs]) (breaking-change) +- Cleanup tests for lcn events and device triggers ([@alengwenus] - [#61719]) ([lcn docs]) +- Don't add Fronius entities with unknown state ([@farmio] - [#62282]) ([fronius docs]) +- Use enums in zwave_js ([@tkdrob] - [#62130]) ([zwave_js docs]) +- Add unique ID to config entry in Luftdaten ([@frenck] - [#62176]) ([luftdaten docs]) +- Use DeviceClass Enums in filter tests ([@davet2001] - [#62138]) ([filter docs]) +- Finish using enums in srp_energy ([@tkdrob] - [#62192]) ([srp_energy docs]) +- Change unload for P1 Monitor ([@klaasnicolaas] - [#62213]) ([p1_monitor docs]) +- Use new enums in smarthab ([@epenet] - [#62208]) ([smarthab docs]) +- Cleanup attr** usage in uptime ([@epenet] - [#62212]) ([uptime docs]) +- Use _attr_** in slide ([@epenet] - [#62206]) ([slide docs]) +- Use new enums in saj ([@epenet] - [#62205]) ([saj docs]) +- Use new enums in sleepiq ([@epenet] - [#62203]) ([sleepiq docs]) +- Use _attr_attribution in poolsense ([@epenet] - [#62180]) ([poolsense docs]) +- Use _attr_** in openweathermap ([@epenet] - [#62179]) ([openweathermap docs]) +- Use _attr_attribution in sense ([@epenet] - [#62181]) ([sense docs]) +- Use enums in zwave ([@tkdrob] - [#62131]) ([zwave docs]) +- Remove deprecated yaml config from environment canada ([@tkdrob] - [#61839]) ([environment_canada docs]) (breaking-change) +- Support additional Apple TV device types ([@postlund] - [#61104]) ([apple_tv docs]) +- Add additional guarding to color_rgb_to_rgbww ([@bdraco] - [#62220]) +- Add reboot button to Magic Home/flux_led ([@bdraco] - [#62323]) ([flux_led docs]) +- Move Magic Home/flux_led coordinator to its own module ([@bdraco] - [#62324]) ([flux_led docs]) +- Remove deprecated yaml config from opengarage ([@tkdrob] - [#61961]) ([opengarage docs]) (breaking-change) +- Add switch to enable/disable music mode in Magic Home/flux_led ([@bdraco] - [#62320]) ([flux_led docs]) +- Remove deprecated yaml config from aurora abb ([@tkdrob] - [#62317]) ([aurora_abb_powerone docs]) (breaking-change) +- Use enums for rest tests ([@tkdrob] - [#62197]) ([rest docs]) +- Make core config source an enum ([@scop] - [#61966]) +- Mark camera unavailable when keepalive stream fails ([@allenporter] - [#62294]) ([camera docs]) ([stream docs]) +- Bumped boschshcpy 0.2.19 to 0.2.27 ([@tschamm] - [#62326]) ([bosch_shc docs]) +- Remove deprecated yaml config from Efergy ([@tkdrob] - [#61520]) ([efergy docs]) (breaking-change) +- Use migration helper in Ridwell ([@bachya] - [#62327]) ([ridwell docs]) +- Add homekit discovery to ecobee ([@bdraco] - [#62334]) ([ecobee docs]) +- Use migration helper in RainMachine ([@bachya] - [#62328]) ([rainmachine docs]) +- Simplify nest test patch using new keyword ([@allenporter] - [#62336]) ([nest docs]) +- Add zeroconf discovery to ecobee for non-homekit models ([@bdraco] - [#62335]) ([ecobee docs]) +- Replace Guardian logged errors with HomeAssistantError in service handlers ([@bachya] - [#62342]) ([guardian docs]) +- Remove deprecated yaml config from flux_led ([@tkdrob] - [#61844]) ([flux_led docs]) (breaking-change) +- Replace RainMachine logged errors with HomeAssistantError in service handlers ([@bachya] - [#62350]) ([rainmachine docs]) +- Replace OpenUV logged errors with `HomeAssistantError` in service handlers ([@bachya] - [#62349]) ([openuv docs]) +- Remove deprecated yaml config from enphase_envoy ([@tkdrob] - [#62348]) ([enphase_envoy docs]) (breaking-change) +- Re-add `binary_sensor` attribute for AlarmDecoder that was inadvertently removed ([@ajschmidt8] - [#62351]) ([alarmdecoder docs]) +- Remove deprecated yaml config from broadlink ([@tkdrob] - [#62341]) ([broadlink docs]) (breaking-change) +- Fix typing for wemo ([@esev] - [#62157]) ([wemo docs]) +- Add a camera specific logger to help diagnose stream errors ([@allenporter] - [#61647]) ([camera docs]) ([stream docs]) +- Support Plex resuming and playback offset ([@jjlawren] - [#61468]) ([plex docs]) +- Improve SSDP callback performance ([@bdraco] - [#62359]) ([ssdp docs]) +- Use the Platform enum in wemo ([@esev] - [#62153]) ([wemo docs]) +- Improve evil genius labs error handling ([@balloob] - [#62365]) ([evil_genius_labs docs]) +- Use enums in smartthings ([@tkdrob] - [#62198]) ([smartthings docs]) +- Invalidate CI cache by bumping caching version ([@frenck] - [#62383]) +- Fix typo in Kostal Plenticore integration entity ([@ThomDietrich] - [#62380]) ([kostal_plenticore docs]) +- Replace SimpliSafe logged errors with `HomeAssistantError` in service handlers ([@bachya] - [#62352]) ([simplisafe docs]) +- Add zones support to flux_led ([@bdraco] - [#61072]) ([flux_led docs]) +- Remove deprecated yaml config from co2signal ([@tkdrob] - [#62343]) ([co2signal docs]) (breaking-change) +- Use new enums in sms ([@epenet] - [#62372]) ([sms docs]) +- Remove deprecated yaml config from dlna_dmr ([@tkdrob] - [#62344]) ([dlna_dmr docs]) (breaking-change) +- Use attr** in linode ([@epenet] - [#61882]) ([linode docs]) +- Use new enums in spc ([@epenet] - [#62384]) ([spc docs]) +- Use new enums in soma ([@epenet] - [#62377]) ([soma docs]) +- Use _attr_attribution in synology_dsm ([@epenet] - [#62382]) ([synology_dsm docs]) +- Use new enums in solax ([@epenet] - [#62376]) ([solax docs]) +- Statistics component typing ([@ThomDietrich] - [#60997]) ([statistics docs]) +- Use new enums in solaredge_local ([@epenet] - [#62374]) ([solaredge_local docs]) +- Cleanup stale setup from CO2Signal ([@frenck] - [#62395]) ([co2signal docs]) +- Add input_button ([@frenck] - [#62008]) ([demo docs]) ([default_config docs]) ([input_button docs]) (new-integration) +- Update CODEOWNERS and correct iot class for Konnected ([@heythisisnate] - [#62391]) +- Use new enums in synology_dsm ([@epenet] - [#62398]) ([synology_dsm docs]) +- Use new enums in switcher_kis ([@epenet] - [#62400]) ([switcher_kis docs]) +- Use new enums in syncthru ([@epenet] - [#62399]) ([syncthru docs]) +- Use new enums in systemmonitor ([@epenet] - [#62401]) ([systemmonitor docs]) +- Use new enums in system_bridge ([@epenet] - [#62402]) ([system_bridge docs]) +- Use new enums in speedtestdotnet ([@epenet] - [#62405]) ([speedtestdotnet docs]) +- Use new enums in supla ([@epenet] - [#62406]) ([supla docs]) +- Use new enums in starline ([@epenet] - [#62407]) ([starline docs]) +- Use new enums in switchbot ([@epenet] - [#62404]) ([switchbot docs]) +- Use new enums in subaru ([@epenet] - [#62403]) ([subaru docs]) +- Use attr** in solax ([@epenet] - [#62397]) ([solax docs]) +- Use new enums in spider ([@epenet] - [#62396]) ([spider docs]) +- Use DeviceClass Enums in devolo_home_network tests ([@davet2001] - [#62117]) ([devolo_home_network docs]) +- Use new enums in solaredge ([@epenet] - [#62373]) ([solaredge docs]) +- Use new enums in somfy ([@epenet] - [#62378]) ([somfy docs]) +- Use attr** in somfy-mylink ([@epenet] - [#62381]) ([somfy_mylink docs]) +- Use attr** in smarty ([@epenet] - [#62371]) ([smarty docs]) +- Make device automation type an enum ([@scop] - [#62354]) ([homekit docs]) ([mobile_app docs]) ([device_automation docs]) +- Update "Code Coverage" task to use numprocesses ([@epenet] - [#61449]) +- Refactor kaiterra to use SensorEntityDescription ([@epenet] - [#61865]) ([kaiterra docs]) +- Use DeviceClass Enums in homekit ([@davet2001] - [#62218]) ([homekit docs]) +- Fix Non-thread-safe operation in wemo tests ([@esev] - [#62418]) ([wemo docs]) +- Add config_flow to AndroidTV integration ([@ollo69] - [#54444]) ([androidtv docs]) (breaking-change) +- Use new enums in watttime ([@epenet] - [#62430]) ([watttime docs]) +- Use new enums in verisure ([@epenet] - [#62433]) ([verisure docs]) +- Use new enums in wled ([@epenet] - [#62431]) ([wled docs]) +- Use new enums in tesla_wall_connector ([@epenet] - [#62434]) ([tesla_wall_connector docs]) +- Use new enums in temper ([@epenet] - [#62428]) ([temper docs]) +- Use new enums in ted5000 ([@epenet] - [#62425]) ([ted5000 docs]) +- Use new enums in tasmota ([@epenet] - [#62427]) ([tasmota docs]) +- Use new enums in tellduslive ([@epenet] - [#62426]) ([tellduslive docs]) +- Add reauth flow to Tile ([@bachya] - [#62415]) ([tile docs]) +- Use new enums in tahoma ([@epenet] - [#62424]) ([tahoma docs]) +- Use new enums in tado ([@epenet] - [#62423]) ([tado docs]) +- Use attr** in tellstick sensor ([@epenet] - [#62422]) ([tellstick docs]) +- Use new enums in zwave_js ([@epenet] - [#62432]) ([zwave_js docs]) +- Use DeviceAutomationType in tests/components/[h-l]* ([@scop] - [#62441]) +- Use DeviceAutomationType in tests/components/[a-f]* ([@scop] - [#62440]) +- Use DeviceAutomationType in tests/components/[m-r]* ([@scop] - [#62443]) +- Use new enums in sma ([@epenet] - [#62439]) ([sma docs]) +- Add support for changing Magic Home socket power restore state ([@bdraco] - [#62301]) ([flux_led docs]) +- Cast types in wemo rather than converting ([@esev] - [#62454]) ([wemo docs]) +- Remove deprecated yaml config from nuki ([@tkdrob] - [#62470]) ([nuki docs]) (breaking-change) +- Cleanup stale setup/import from Nuki ([@frenck] - [#62476]) ([nuki docs]) +- Enable PYTHONASYNCIODEBUG in tests ([@emontnemery] - [#62104]) +- Use on_level when turning an Insteon dimmer on ([@MZachmann] - [#62321]) ([insteon docs]) +- Bump docker/login-action from 1.10.0 to 1.12.0 (@dependabot - [#62462]) +- Remove deprecated yaml config from honeywell ([@tkdrob] - [#62469]) ([honeywell docs]) (breaking-change) +- Remove deprecated yaml config from google travel time ([@tkdrob] - [#62468]) ([google_travel_time docs]) (breaking-change) +- Update Solax library to 0.2.9 ([@ppetru] - [#62464]) ([solax docs]) +- Remove deprecated yaml config from philips_js ([@tkdrob] - [#62471]) ([philips_js docs]) (breaking-change) +- Remove legacy migration and yaml from tplink ([@bdraco] - [#62457]) ([tplink docs]) (breaking-change) +- Add slugify as a template filter ([@ZephireNZ] - [#58724]) +- Use DeviceAutomationType in tests/components/[s-z]* ([@scop] - [#62450]) +- Add USB discover for Sonoff zigbee dongle plus ([@OpenMyDog] - [#62171]) ([zha docs]) +- Clean up ssdp flow in dlna_dmr ([@tkdrob] - [#62466]) ([dlna_dmr docs]) +- Add device registry information to Blink entities ([@decompil3d] - [#62449]) ([blink docs]) +- Add set_music_mode service to flux_led for detailed music mode control ([@bdraco] - [#62429]) ([flux_led docs]) +- Support shorthand templates in condition actions ([@emontnemery] - [#61177]) +- Mark removed config schemas as removed ([@frenck] - [#61014]) +- Remove deprecated YAML configuration from Stookalert ([@frenck] - [#61007]) ([stookalert docs]) (breaking-change) +- Deprecate mcp23017 integration (ADR-0019) ([@frenck] - [#62484]) ([mcp23017 docs]) (breaking-change) +- Deprecate pcal9535a integration (ADR-0019) ([@frenck] - [#62487]) ([pcal9535a docs]) (breaking-change) +- Use SensorDeviceClass enum in sensor device automations ([@emontnemery] - [#62480]) ([sensor docs]) +- Assert current state of script condition validation in tests ([@emontnemery] - [#62486]) +- Don't pollute config dir with deleted duplicated statistics ([@emontnemery] - [#62489]) ([recorder docs]) +- Save original + duplicate pairs when deleting duplicated statistics ([@emontnemery] - [#62498]) ([recorder docs]) +- Deprecate Sensirion SHT31 integration (ADR-0019) ([@frenck] - [#62496]) ([sht31 docs]) (breaking-change) +- Deprecate DHT Sensor integration (ADR-0019) ([@frenck] - [#62495]) ([dht docs]) (breaking-change) +- Deprecate BH1750 integration (ADR-0019) ([@frenck] - [#62493]) ([bh1750 docs]) (breaking-change) +- Wrap shorthand template conditions during schema validation ([@emontnemery] - [#62485]) +- Improve debug log when warning about a dip in total_increasing sensor ([@emontnemery] - [#62501]) ([sensor docs]) +- Deprecate pi4ioe5v9xxxx integration (ADR-0019) ([@frenck] - [#62491]) ([pi4ioe5v9xxxx docs]) (breaking-change) +- Add iif (immediate if) template function/filter ([@frenck] - [#61428]) +- Deprecate BeagleBone Black GPIO integration (ADR-0019) ([@frenck] - [#62492]) ([bbb_gpio docs]) (breaking-change) +- Use EntityCategory enum for MusicCast entity types ([@micha91] - [#62303]) ([yamaha_musiccast docs]) +- Use DeviceClass Enums in iotawatt tests ([@davet2001] - [#62512]) ([iotawatt docs]) +- Use DeviceClass Enums in integration tests ([@davet2001] - [#62511]) ([integration docs]) +- Remaining DeviceAutomationType bits ([@scop] - [#62508]) +- Use SensorStateClass Enums in fritzbox tests ([@davet2001] - [#62134]) ([fritzbox docs]) +- Use new enums in nzbget tests ([@davet2001] - [#62524]) ([nzbget docs]) +- Use new enums in nam tests ([@davet2001] - [#62522]) ([nam docs]) +- Use new enums in mysensors tests ([@davet2001] - [#62521]) ([mysensors docs]) +- Use new enums in mqtt tests ([@davet2001] - [#62520]) ([mqtt docs]) +- Fix backwards vol.Coerce order in flux_led ([@bdraco] - [#62509]) ([flux_led docs]) +- Use new enums in mobile_app tests ([@davet2001] - [#62517]) ([mobile_app docs]) +- Implement DataUpdateCoordinator in luftdaten ([@frenck] - [#62313]) ([luftdaten docs]) +- Use enums in tasmota tests ([@tkdrob] - [#62150]) ([tasmota docs]) +- Remove deprecated yaml config from vlc_telnet ([@tkdrob] - [#62542]) ([vlc_telnet docs]) (breaking-change) +- Use platform enums in withings tests ([@tkdrob] - [#62551]) ([withings docs]) +- Update nest mac addresses based on newer generation hardware ([@allenporter] - [#62525]) ([nest docs]) +- Use platform enums in ring tests ([@tkdrob] - [#62565]) ([ring docs]) +- Put access to ffmpeg hass.data behind a method ([@allenporter] - [#62570]) +- Add correct callback annotation in configurator ([@balloob] - [#62569]) ([configurator docs]) +- Use enums for ozw tests ([@davet2001] - [#62547]) ([ozw docs]) +- Use new enums in knx tests ([@davet2001] - [#62513]) ([knx docs]) +- Change Brunt cover device class ([@eavanvalkenburg] - [#62578]) ([brunt docs]) +- Support setting Aqara Hub Volume via homekit_controller ([@Jc2k] - [#62538]) ([homekit_controller docs]) +- Use new enums in litterrobot tests ([@davet2001] - [#62515]) ([litterrobot docs]) +- Use new enums in mfi tests ([@davet2001] - [#62516]) ([mfi docs]) +- Use new enums in modbus tests ([@davet2001] - [#62518]) ([modbus docs]) +- Use new enums in modern_forms tests ([@davet2001] - [#62519]) ([modern_forms docs]) +- Use platform enums in utility_meter tests ([@tkdrob] - [#62553]) ([utility_meter docs]) +- Remove deprecated yaml config from squeezebox ([@tkdrob] - [#62537]) ([squeezebox docs]) (breaking-change) +- Add state class support to Luftdaten ([@frenck] - [#62585]) ([luftdaten docs]) +- Flip behavior for grouped locks ([@emontnemery] - [#62580]) ([lock docs]) ([group docs]) (breaking-change) +- Add strict typing to Luftdaten ([@frenck] - [#62588]) ([luftdaten docs]) +- Allow binary sensor state to be None ([@frenck] - [#60193]) ([binary_sensor docs]) (breaking-change) +- Round imperial values to two decimals in bmw_connected_drive ([@rikroe] - [#62531]) ([bmw_connected_drive docs]) +- Replace charging_time_remaining with charging_end_time in bmw_connected_drive ([@rikroe] - [#60942]) ([bmw_connected_drive docs]) (breaking-change) +- Improve config flow Luftdaten ([@frenck] - [#62589]) ([luftdaten docs]) +- Use platform enums in rest tests ([@tkdrob] - [#62564]) ([rest docs]) +- Use platform enums in vizio tests ([@tkdrob] - [#62555]) ([vizio docs]) +- Use platform enums in plex tests ([@tkdrob] - [#62561]) ([plex docs]) +- Store deleted duplicated statistics in .storage ([@emontnemery] - [#62574]) ([recorder docs]) +- Use new enums in p1_monitor tests ([@davet2001] - [#62548]) ([p1_monitor docs]) +- Use new enums in picnic tests ([@davet2001] - [#62549]) ([picnic docs]) +- Use new enums for prometheus tests ([@davet2001] - [#62550]) ([prometheus docs]) +- Add get_image method to Stream ([@uvjustin] - [#61918]) ([stream docs]) +- Allow adding new devices to an Aqara hub via homekit_controller ([@Jc2k] - [#62600]) ([homekit_controller docs]) +- Bump pysma to 0.6.10 ([@rklomp] - [#62599]) ([sma docs]) +- Extract PVOutput logic into PyPi package ([@frenck] - [#62625]) ([pvoutput docs]) +- Derive mypy python_version from REQUIRED_PYTHON_VER ([@scop] - [#62616]) +- Add secondary codeowner to statistics integration ([@ThomDietrich] - [#62622]) ([statistics docs]) +- Implement config_Flow for Sensibo ([@gjohansson-ST] - [#60900]) ([sensibo docs]) (breaking-change) +- Improve Insteon responsiveness ([@teharris1] - [#62612]) ([insteon docs]) +- Add deprecation warning to switchbot yaml config ([@tkdrob] - [#62583]) ([switchbot docs]) (breaking-change) +- Speed up connecting to legacy flux_led devices ([@bdraco] - [#62614]) ([flux_led docs]) +- Reduce boilerplate code in entry init of rfxtrx ([@elupus] - [#58844]) ([rfxtrx docs]) +- Use relative imports in sensor ([@epenet] - [#62638]) ([sensor docs]) +- Bump async-upnp-client to 0.23.2 ([@StevenLooman] - [#62634]) ([upnp docs]) ([yeelight docs]) ([dlna_dmr docs]) ([ssdp docs]) +- Add input_button support to HomeKit ([@frenck] - [#62590]) ([homekit docs]) +- Bump PyISY to v3.0.1 ([@shbatm] - [#62646]) ([isy994 docs]) +- Add strict typing to PVOutput ([@frenck] - [#62628]) ([pvoutput docs]) +- Dismiss existing discoveries when a HomeKit device is paired ([@bdraco] - [#62632]) ([homekit_controller docs]) +- Add base integration tests to Luftdaten ([@frenck] - [#62594]) ([luftdaten docs]) +- Increase test coverage for google calendar ([@allenporter] - [#62648]) ([google docs]) +- Add input_button support to Alexa ([@frenck] - [#62592]) ([alexa docs]) +- Add input_button support to Google Assistant ([@frenck] - [#62593]) ([google_assistant docs]) +- Azure Event Hub code improvements ([@eavanvalkenburg] - [#62584]) +- Remove unnecessary checks before calling os.makedirs ([@emontnemery] - [#62576]) +- Add sensor device classes for apparent and reactive power ([@emontnemery] - [#62010]) ([sensor docs]) ([template docs]) +- Provide clearer feedback in Coinbase when authentication fails ([@TomBrien] - [#62627]) ([coinbase docs]) +- Correct extra attributes trafikverket_train ([@gjohansson-ST] - [#62636]) ([trafikverket_train docs]) (breaking-change) +- Remove deprecated yaml config from Syncthru ([@tkdrob] - [#62541]) ([syncthru docs]) (breaking-change) +- Update flux_led dhcp matching for older devices ([@bdraco] - [#62577]) ([flux_led docs]) +- Support Tuya cover with operation mach_operate ([@marcuslonnberg] - [#62650]) ([tuya docs]) +- Use SensorDeviceClass in thermoworks_smoke ([@epenet] - [#62637]) ([thermoworks_smoke docs]) +- Add sensor tests to Luftdaten ([@frenck] - [#62663]) ([luftdaten docs]) +- Remove TaHoma integration ([@iMicknl] - [#62607]) ([tahoma docs]) (breaking-change) +- Add subfolder globbing to partial linters ([@epenet] - [#62683]) +- Reject MQTT cover discovery using unsupported tilt_invert_state ([@emontnemery] - [#62680]) ([mqtt docs]) +- Add Overkiz integration (with base + sensor entity) ([@iMicknl] - [#62640]) ([overkiz docs]) (new-integration) +- Add connectsense to homekit_controller ([@ecoen66] - [#62675]) ([homekit_controller docs]) +- Fix pylint plugin which checks relative imports ([@KapJI] - [#62693]) ([zha docs]) +- Add DeviceInfo to Sensibo ([@gjohansson-ST] - [#62668]) ([sensibo docs]) +- Add config flow to version integration ([@ludeeus] - [#54642]) ([version docs]) (breaking-change) +- Use new enums in rdw tests ([@davet2001] - [#62707]) ([rdw docs]) +- Use new enums in smartthings tests ([@davet2001] - [#62708]) ([smartthings docs]) +- Review AndroidTV option flow strings ([@ollo69] - [#62601]) ([androidtv docs]) +- Use new enums in huisbaasje tests ([@davet2001] - [#62714]) ([huisbaasje docs]) +- Use new enums in zwave tests ([@davet2001] - [#62711]) ([zwave docs]) +- Add identify buttons to ZHA devices ([@dmulcahey] - [#61495]) ([zha docs]) +- Add lock entity to Overkiz integration ([@iMicknl] - [#62713]) ([overkiz docs]) (new-platform) +- Add button entity to Overkiz integration ([@iMicknl] - [#62719]) ([overkiz docs]) +- Generic thermostat presets ([@brianegge] - [#56080]) ([generic_thermostat docs]) +- Add missing __init__.py to overkiz tests ([@bdraco] - [#62727]) ([overkiz docs]) +- Add basic type hints to advantage_air ([@epenet] - [#62737]) ([advantage_air docs]) +- Add basic type hints to abode ([@epenet] - [#62730]) ([abode docs]) +- Add basic type hints to ads ([@epenet] - [#62738]) ([ads docs]) +- CI: Use wheel to install base requirements ([@cdce8p] - [#62743]) +- Fix HomeKit sensor update check ([@br3sc4] - [#62705]) ([homekit docs]) +- Upgrade vehicle to 0.3.1 ([@frenck] - [#62747]) ([rdw docs]) +- Use lock in Camera.create_stream ([@uvjustin] - [#62757]) ([camera docs]) ([stream docs]) +- Add number entity to Overkiz integration ([@iMicknl] - [#62732]) ([overkiz docs]) +- Store wemo device sw_version & upnp connections ([@esev] - [#62758]) ([wemo docs]) +- Add lqi and rssi sensors back to ZHA ([@dmulcahey] - [#62716]) ([zha docs]) +- Add zwave_js support for Fortrezz SSA3 ([@raman325] - [#62765]) ([zwave_js docs]) +- Add device info to Luftdaten ([@frenck] - [#62692]) ([luftdaten docs]) +- Bump google-nest-sdm to 1.0.0 ([@allenporter] - [#62783]) ([nest docs]) +- Add unifiprotect integration ([@AngellusMortis] - [#62697]) ([unifiprotect docs]) (new-integration) +- Huawei LTE simplifications ([@scop] - [#62770]) ([huawei_lte docs]) +- Allow generic camera conf without still_image_url ([@uvjustin] - [#62611]) ([generic docs]) +- Bumped boschshcpy 0.2.27 to 0.2.28 ([@tschamm] - [#62778]) ([bosch_shc docs]) +- Add huawei_lte hardware version ([@scop] - [#62773]) ([huawei_lte docs]) +- Cleanup HomeKit names to avoid unknown error when adding ([@bdraco] - [#62831]) ([homekit docs]) +- Use ConfigEntryDisabler enum ([@mib1185] - [#62816]) ([config docs]) +- Remove unused homekit.start service ([@bdraco] - [#62827]) ([homekit docs]) +- Update to pycarwings 2.13 ([@filcole] - [#62821]) ([nissan_leaf docs]) +- Added XML RSS as Content-Type ([@kristjanbjarni] - [#62822]) ([rest docs]) +- Add light entity to Overkiz integration ([@iMicknl] - [#62835]) ([overkiz docs]) (new-platform) +- Followup PR for UniFi Protect integration ([@AngellusMortis] - [#62806]) ([unifiprotect docs]) +- Bump mypy to 0.930 ([@cgtobi] - [#62642]) +- Add basic type hints to ffmpeg ([@epenet] - [#62744]) ([ffmpeg docs]) +- Refactor entity_category str types ([@davet2001] - [#62790]) ([mqtt docs]) ([neato docs]) ([shelly docs]) ([tasmota docs]) +- Address feedback to Overkiz integration ([@iMicknl] - [#62841]) ([overkiz docs]) +- Code improvements Sensibo ([@gjohansson-ST] - [#62810]) ([sensibo docs]) +- Improve Elmax code quality ([@albertogeniola] - [#61273]) ([elmax docs]) +- Set a suggested_area on nest devices based on the Google Home room name ([@allenporter] - [#62871]) ([nest docs]) +- Init template trigger binary sensor to None instead of False ([@amosyuen] - [#62769]) ([template docs]) (breaking-change) +- Update to iaqualink 0.4.1 ([@flz] - [#53745]) ([iaqualink docs]) +- Add configuration flow to PVOutput ([@frenck] - [#62667]) ([pvoutput docs]) (breaking-change) +- Add unique id to DHCP step in Config Flow for Overkiz ([@iMicknl] - [#62847]) ([overkiz docs]) +- Add myself as codeowner for Luftdaten ([@frenck] - [#62888]) ([luftdaten docs]) +- Fix missing power and energy sensors for light switches in bosch_shc ([@tschamm] - [#62802]) ([bosch_shc docs]) +- Slightly improve Open-Meteo configuration flow ([@frenck] - [#62869]) ([open_meteo docs]) +- Add basic support for EntityDescription in PVOutput ([@frenck] - [#62887]) ([pvoutput docs]) +- Add unique ID to PVOutput entities ([@frenck] - [#62890]) ([pvoutput docs]) +- Add setup type hints to sonos, unifi and wake_on_lan ([@epenet] - [#62876]) ([sonos docs]) +- Add type hint to adguard service calls ([@epenet] - [#62893]) ([adguard docs]) +- Ensure service calls are typed [a-d] ([@epenet] - [#62891]) +- Add basic type hints to xiaomi_miio ([@epenet] - [#62889]) ([xiaomi_miio docs]) +- Add scene entity to Overkiz integration ([@iMicknl] - [#62884]) ([overkiz docs]) (new-platform) +- Extract attribute into sensor for PVOutput ([@frenck] - [#62894]) ([pvoutput docs]) (breaking-change) +- Add basic type hints to nissan_leaf ([@filcole] - [#62904]) ([nissan_leaf docs]) +- Add binary sensor entity to Overkiz integration ([@iMicknl] - [#62913]) ([overkiz docs]) (new-platform) +- Use shorthand attributes in the CPU Speed integration ([@frenck] - [#62896]) ([cpuspeed docs]) +- Ensure service calls are typed [o-r] ([@epenet] - [#62920]) +- Ensure service calls are typed [v-z] ([@epenet] - [#62923]) ([zwave docs]) ([velux docs]) ([wake_on_lan docs]) ([webostv docs]) ([vesync docs]) +- Add strict typing to CPU Speed ([@frenck] - [#62924]) ([cpuspeed docs]) +- Ensure service calls are typed [h-i] ([@epenet] - [#62914]) +- Ensure service calls are typed [e-g] ([@epenet] - [#62912]) +- Ensure service calls are typed [s-u] ([@epenet] - [#62922]) +- Update pvo to 0.2.0 ([@frenck] - [#62926]) ([pvoutput docs]) +- Ensure service calls are typed [k-n] ([@epenet] - [#62917]) +- Deprecate Bosch BME680 Environmental Sensor (ADR-0019) ([@frenck] - [#62936]) ([bme680 docs]) (breaking-change) +- Deprecate Bosch BMP280 Environmental Sensor (ADR-0019) ([@frenck] - [#62937]) ([bmp280 docs]) (breaking-change) +- Add reauthentication handling to PVOutput ([@frenck] - [#62932]) ([pvoutput docs]) +- Fix incorrect state class for Ambient PWS rain rate sensor ([@bachya] - [#62946]) ([ambient_station docs]) +- Add basic type hints to homekit_controller ([@epenet] - [#62880]) ([homekit_controller docs]) +- Add myself as codeowner for Whois ([@frenck] - [#62958]) ([whois docs]) +- Convert Vallox integration to config flow ([@slovdahl] - [#62780]) ([vallox docs]) (breaking-change) +- Use Platform constants all over the place 1/3 ([@slovdahl] - [#62952]) +- Add configuration flow to CPU Speed ([@frenck] - [#62929]) ([cpuspeed docs]) (breaking-change) +- Deprecate HTU21D(F) Sensor (ADR-0019) ([@frenck] - [#62956]) ([htu21d docs]) (breaking-change) +- Deprecate Time of Flight (ADR-0019) ([@frenck] - [#62955]) ([tof docs]) (breaking-change) +- Use Platform constants all over the place 2/3 ([@slovdahl] - [#62953]) +- Use Platform constants all over the place 3/3 ([@slovdahl] - [#62954]) +- Add strict typing to Whois ([@frenck] - [#62959]) ([whois docs]) +- Add CO device class to binary_sensor entity model ([@epenet] - [#61962]) ([binary_sensor docs]) +- Deprecate Bosch BME280 Environmental Sensor (ADR-0019) ([@frenck] - [#62934]) ([bme280 docs]) (breaking-change) +- Rename Luftdaten -> Sensor.Community ([@frenck] - [#62865]) ([luftdaten docs]) (breaking-change) +- Add device info to PVOutput ([@frenck] - [#62951]) ([pvoutput docs]) +- Add basic type hints to command_line ([@epenet] - [#62877]) ([command_line docs]) +- Add unique ID to CPU Speed sensor ([@frenck] - [#62961]) ([cpuspeed docs]) +- Remove myself from proxmoxve component codeowners ([@k4ds3] - [#62963]) ([proxmoxve docs]) +- Fix zwave_js ZWaveTiltCover docstring ([@andre-richter] - [#62972]) ([zwave_js docs]) +- Don't throw when a Zigbee device has an unknown ZCL cluster ([@Adminiuga] - [#62964]) ([zha docs]) +- Add UniFi Protect media_player ([@AngellusMortis] - [#62895]) ([unifiprotect docs]) (new-platform) +- Bump google-nest-sdm to 1.1.0 ([@allenporter] - [#62977]) ([nest docs]) +- Add basic type hints to alexa ([@epenet] - [#62878]) ([alexa docs]) +- Reload nest integration when new devices are added ([@allenporter] - [#62976]) ([nest docs]) +- Add type hints to nissan_leaf integration ([@filcole] - [#62967]) ([nissan_leaf docs]) +- Add basic type hints to cast ([@epenet] - [#62746]) ([cast docs]) +- Ensure service calls are typed in homeassistant ([@epenet] - [#62915]) ([homeassistant docs]) +- Add unique id check in wiffi config flow ([@mampfes] - [#60388]) ([wiffi docs]) +- Clean up Tuya loggers ([@frenck] - [#62999]) ([tuya docs]) +- Update ZHA to use apparent power ([@dmulcahey] - [#62990]) ([zha docs]) +- Add unique id to nissanleaf entities ([@filcole] - [#62824]) ([nissan_leaf docs]) +- Fix Hue motion sensor state if sensor is disabled ([@marcelveldt] - [#63000]) ([hue docs]) +- Add setup type hints to plex ([@epenet] - [#62883]) ([plex docs]) +- Allow sending GroupValueResponse telegrams with knx.send service ([@MirkoLenz] - [#62639]) ([knx docs]) +- Detect unsupported system in CPU Speed integration ([@frenck] - [#63012]) ([cpuspeed docs]) +- Update stream errors with additional error information ([@allenporter] - [#62900]) ([stream docs]) +- Update legacy nest config flow tests to use modern best practices ([@allenporter] - [#63019]) ([nest docs]) +- Feedback from previous PR ([@AngellusMortis] - [#63022]) ([unifiprotect docs]) +- Add UniFi Protect button ([@AngellusMortis] - [#63001]) ([unifiprotect docs]) +- Add myself as codeowner for CPU Speed ([@frenck] - [#63034]) ([cpuspeed docs]) +- Ensure service calls are typed [m-z] ([@epenet] - [#63014]) +- Add full test coverage to CPU Speed ([@frenck] - [#63042]) ([cpuspeed docs]) +- Deprecate the Legacy Works with Nest API ([@allenporter] - [#63027]) ([nest docs]) (breaking-change) +- Adds missing strings ([@AngellusMortis] - [#63046]) ([unifiprotect docs]) +- Fixes UniFi Protect reconnect issues ([@AngellusMortis] - [#63047]) ([unifiprotect docs]) +- Fix local_file partial tests ([@epenet] - [#63023]) ([local_file docs]) +- Introduce const file in Whois ([@frenck] - [#63051]) ([whois docs]) +- Catch bluetooth_tracker OSError ([@atmurray] - [#60437]) ([bluetooth_tracker docs]) +- CI: Cache pip wheels ([@cdce8p] - [#62755]) +- Vallox config flow follow-up fixes ([@slovdahl] - [#63032]) ([vallox docs]) +- Bump fritzconnection and remove workarounds ([@chemelli74] - [#63050]) ([fritz docs]) ([fritzbox_callmonitor docs]) +- CI: Fix pip cache restore key ([@cdce8p] - [#63075]) +- Address feedback to Overkiz integration (round 2) ([@iMicknl] - [#63036]) ([overkiz docs]) +- Refresh device_info for Shelly devices ([@chemelli74] - [#62899]) ([shelly docs]) +- Fix unique id for Fritz buttons ([@chemelli74] - [#63072]) ([fritz docs]) +- Bump library to version 1.0.7 ([@bieniu] - [#63078]) ([shelly docs]) +- Ensure service calls are typed [a-j] ([@epenet] - [#63013]) +- Use StrEnum in Tuya constants ([@frenck] - [#63073]) ([tuya docs]) +- Use original PyAv in stream ([@uvjustin] - [#63079]) ([stream docs]) +- Add hw info for Shelly devices ([@chemelli74] - [#62643]) ([shelly docs]) +- Ensure admin service calls are typed ([@epenet] - [#63093]) +- Improve typing in core service registration ([@epenet] - [#63005]) +- Add configuration flow to Whois ([@frenck] - [#63069]) ([whois docs]) (breaking-change) +- Use mesh topology and add 3 more attr for Fritz ([@chemelli74] - [#63049]) ([fritz docs]) +- Bumps pyunifiprotect to 1.4.8 ([@AngellusMortis] - [#63113]) ([unifiprotect docs]) +- Add init type hints [a] ([@epenet] - [#63098]) +- Bump google-nest-sdm to 1.2.0 ([@allenporter] - [#63121]) ([nest docs]) +- Bump pypck to 0.7.12 ([@alengwenus] - [#63119]) ([lcn docs]) +- Add init type hints [e] ([@epenet] - [#63102]) +- Remove deprecated Connection class from octoprint ConfigFlow ([@milanmeu] - [#63117]) ([octoprint docs]) +- Make Sonos alarm `unique_id` unique with multiple households ([@jjlawren] - [#62645]) ([sonos docs]) +- Add color mode support to switch light ([@frenck] - [#63124]) ([switch docs]) +- Cleanup switch light ([@frenck] - [#63127]) ([switch docs]) +- Update Adax-local to 0.1.3 ([@Danielhiversen] - [#63129]) ([adax docs]) +- Enable strict typing for Overkiz integration ([@iMicknl] - [#63108]) ([overkiz docs]) +- Add velbus USB dicovery ([@Cereal2nd] - [#62596]) ([velbus docs]) +- Mill, add HVAC_MODE_OFF for gen 3 heaters ([@Danielhiversen] - [#63134]) ([mill docs]) +- Bump google-nest-sdm to 1.2.1 ([@allenporter] - [#63151]) ([nest docs]) +- Add UniFi Protect light platform ([@AngellusMortis] - [#63137]) ([unifiprotect docs]) (new-platform) +- Implement an rtsp to webrtc registry in camera ([@allenporter] - [#62962]) ([camera docs]) ([nest docs]) ([amcrest docs]) ([doorbird docs]) ([onvif docs]) ([foscam docs]) +- Clean up patching of setup platforms for UniFi Protect integration ([@AngellusMortis] - [#63156]) ([unifiprotect docs]) +- Adax, unique id and title should be string ([@Danielhiversen] - [#63132]) ([adax docs]) +- Bump mill-local to 0.1.1 and add device info ([@Danielhiversen] - [#63141]) ([mill docs]) +- Add entity categories. ([@stegm] - [#63165]) ([kostal_plenticore docs]) +- Mill use walrus operator ([@Danielhiversen] - [#63166]) ([mill docs]) +- Move constants to const file for generic ([@davet2001] - [#63179]) ([generic docs]) +- Keep entity state management within entity ([@allenporter] - [#63183]) ([camera docs]) (breaking-change) (new-integration) +- Improve wiffi config flow handling ([@mampfes] - [#63167]) ([wiffi docs]) +- Add new buttons for Shelly Gas ([@bieniu] - [#63099]) ([shelly docs]) +- Add `rtsptowebrtc` integration ([@allenporter] - [#59660]) ([webrtc docs]) (new-integration) +- Refactor enum zwave js tests ([@davet2001] - [#62712]) ([zwave_js docs]) +- Add UniFi Protect switch platform ([@AngellusMortis] - [#63177]) ([unifiprotect docs]) (new-platform) +- Add init type hints [f-g] ([@epenet] - [#63186]) +- Add init type hints [n-o] ([@epenet] - [#63190]) +- Upgrade flake8-noqa to 1.2.1 ([@cdce8p] - [#63170]) +- Add init type hints [t-u] ([@epenet] - [#63194]) +- Drop use of HomeAssistantType in elmax ([@epenet] - [#63105]) ([elmax docs]) +- Fix management of Fritz repeaters ([@chemelli74] - [#63110]) ([fritz docs]) +- Use DeviceClass Enum in alarmdecoder schema ([@epenet] - [#61967]) ([alarmdecoder docs]) +- Run `gen_requirements_all` script on changes to `setup.py` ([@cdce8p] - [#63171]) +- Add init type hints [d] ([@epenet] - [#63101]) +- Add init type hints [v-z] ([@epenet] - [#63195]) +- Add init type hints [m] ([@epenet] - [#63189]) +- Add init type hints [s] ([@epenet] - [#63193]) +- Add init type hints [h-j] ([@epenet] - [#63187]) +- Add init type hints [k-l] ([@epenet] - [#63188]) +- Add init type hints [p-q] ([@epenet] - [#63191]) +- Add init type hints [r] ([@epenet] - [#63192]) +- Bump dsmr-parser dependency to 0.31 ([@rhpijnacker] - [#63123]) ([dsmr docs]) +- Add init type hints [b-c] ([@epenet] - [#63100]) +- Fix incorrect parameter name/hint in mqtt climate ([@epenet] - [#63106]) ([mqtt docs]) +- Revert nest reloading due to lock up ([@allenporter] - [#63206]) ([nest docs]) +- Drop deprecated CONF_NAMES from onewire ([@epenet] - [#61094]) ([onewire docs]) +- Add type hint to reload_config in homeassistant scene ([@epenet] - [#63094]) ([homeassistant docs]) +- Ensure service calls are typed in todoist ([@epenet] - [#63020]) ([todoist docs]) +- Make ATTR_ENTITY_ID required in local_file service call ([@epenet] - [#63017]) ([local_file docs]) +- Add basic type hints to broadlink ([@epenet] - [#62879]) ([broadlink docs]) +- Introduce const file in Nissan Leaf ([@filcole] - [#63082]) ([nissan_leaf docs]) +- Use more narrow exception catching in `nest` ([@allenporter] - [#63225]) ([nest docs]) +- Bump google-nest-sdm to 1.3.0 ([@allenporter] - [#63224]) ([nest docs]) +- Add Oncue by Kohler integration ([@bdraco] - [#63203]) ([oncue docs]) (new-integration) +- Ensure service calls are typed in remember-the-milk ([@epenet] - [#63018]) ([remember_the_milk docs]) +- Add UniFi Protect number platform ([@AngellusMortis] - [#63220]) ([unifiprotect docs]) +- Add missing schema to dominos order service ([@epenet] - [#63016]) ([dominos docs]) +- Add entity_category to oncue sensors ([@bdraco] - [#63231]) ([oncue docs]) +- Add support for oncue connectivity binary sensor ([@bdraco] - [#63232]) ([oncue docs]) (new-platform) +- Use shorthand attributes in Tuya camera platform ([@frenck] - [#63228]) ([tuya docs]) +- Simplify nest reauth config flow ([@allenporter] - [#63058]) ([nest docs]) +- Update rokuecp to 0.9.0 ([@ctalkington] - [#63234]) ([roku docs]) +- Add link into statistics unit mismatch warning ([@mdegat01] - [#62217]) ([sensor docs]) +- Refactor static attributes to class attrs for UniFi Protect ([@AngellusMortis] - [#63236]) ([unifiprotect docs]) +- Improve tests for generic camera ([@davet2001] - [#63197]) ([generic docs]) +- Run `hassfest` on changes to `.strict-typing` ([@cdce8p] - [#63237]) +- Fix oncue string for already_configured ([@bdraco] - [#63248]) ([oncue docs]) +- Add hardware version to Roku device info ([@ctalkington] - [#63249]) ([roku docs]) +- Add binary_sensor platform to roku ([@ctalkington] - [#63238]) ([roku docs]) (new-platform) +- Add basic type hints to mqtt ([@epenet] - [#62875]) ([mqtt docs]) +- Add mqtt encoding support for publishing ([@jbouwh] - [#62739]) ([mqtt docs]) +- Add type hints to google_assistant ([@epenet] - [#62748]) ([google_assistant docs]) +- Add button platform to template integration ([@raman325] - [#61908]) ([template docs]) +- Improve test coverage of template button ([@emontnemery] - [#63265]) ([template docs]) +- Add turned on or off device trigger to toggle entity ([@emontnemery] - [#61089]) +- Add alarm_control_panel setup type hints ([@epenet] - [#63264]) +- Add binary_sensor setup type hints [h-n] ([@epenet] - [#63269]) +- Add binary_sensor setup type hints [o-r] ([@epenet] - [#63270]) +- Add unique_id configuration variable to command_line integration ([@rautesamtr] - [#58596]) ([command_line docs]) +- Fix relative import issue in device_automation ([@epenet] - [#63274]) ([device_automation docs]) +- Add air_quality setup type hints ([@epenet] - [#63263]) ([demo docs]) ([norway_air docs]) ([opensensemap docs]) ([kaiterra docs]) ([nilu docs]) ([blebox docs]) +- Add init type hints [misc] ([@epenet] - [#63261]) +- Update to pyoctoprintapi 1.7 ([@rfleming71] - [#63254]) ([octoprint docs]) +- Bump caldav version to 0.8.2 ([@chpego] - [#63280]) ([caldav docs]) +- Add climate setup type hints [m-z] ([@epenet] - [#63279]) +- Add binary_sensor setup type hints [a-f] ([@epenet] - [#63268]) +- Add binary_sensor setup type hints [s-z] ([@epenet] - [#63271]) +- Add calendar setup type hints ([@epenet] - [#63272]) ([google docs]) ([demo docs]) ([caldav docs]) ([todoist docs]) +- Add strict typing to `core.py` (4) - Misc ([@cdce8p] - [#63242]) +- Add camera setup type hints ([@epenet] - [#63277]) +- Add climate setup type hints [a-l] ([@epenet] - [#63278]) +- Address late review comments for version integration ([@ludeeus] - [#63283]) ([version docs]) +- Bump async-upnp-client==0.23.3 ([@StevenLooman] - [#63282]) ([upnp docs]) ([yeelight docs]) ([dlna_dmr docs]) ([ssdp docs]) +- Downgrade OctoPrint printer disconnected errors ([@timmo001] - [#63076]) ([octoprint docs]) +- Add eq3btsmart presets on, off, auto and manual mode ([@bvweerd] - [#54586]) ([eq3btsmart docs]) +- Add light setup type hints [a-i] ([@epenet] - [#63291]) +- Add mqtt entity attributes command templates ([@jbouwh] - [#61937]) ([mqtt docs]) +- Add fan setup type hints ([@epenet] - [#63287]) +- Add light setup type hints [l-r] ([@epenet] - [#63292]) +- Add cover setup type hints ([@epenet] - [#63285]) +- Fix MQTT cover not using tilt_command_template ([@jbouwh] - [#63080]) ([mqtt docs]) +- Fix mqtt reloading and rework tests ([@jbouwh] - [#62950]) ([mqtt docs]) +- Add image_processing setup type hints ([@epenet] - [#63290]) +- Add humidifier setup type hints ([@epenet] - [#63289]) ([ecobee docs]) ([demo docs]) ([generic_hygrostat docs]) +- Add device_tracker setup type hints ([@epenet] - [#63286]) ([mobile_app docs]) ([starline docs]) ([mazda docs]) +- Add light setup type hints [s-z] ([@epenet] - [#63293]) +- Add lock setup type hints ([@epenet] - [#63296]) +- Add media_player setup type hints [a-l] ([@epenet] - [#63297]) +- Mqtt rework on value templates ([@jbouwh] - [#62105]) ([mqtt docs]) +- Add MQTT encoding parameter for all subscribed topics ([@jbouwh] - [#62263]) ([mqtt docs]) +- Add media_player setup type hints [m-x] ([@epenet] - [#63298]) +- Add geo_location setup type hints ([@epenet] - [#63288]) ([demo docs]) ([ign_sismologia docs]) ([qld_bushfire docs]) ([geo_json_events docs]) ([usgs_earthquakes_feed docs]) ([geonetnz_quakes docs]) ([gdacs docs]) +- Add setup type hints to all template platforms ([@epenet] - [#63295]) ([template docs]) +- Add setup type hints to all demo platforms ([@epenet] - [#63294]) ([demo docs]) +- Add setup type hints to select, vacuum and water_heater ([@epenet] - [#63300]) ([hive docs]) ([ecovacs docs]) ([harmony docs]) ([econet docs]) ([incomfort docs]) ([vicare docs]) ([atag docs]) ([sharkiq docs]) +- Add weather setup type hints ([@epenet] - [#63301]) ([ecobee docs]) ([environment_canada docs]) ([ipma docs]) ([darksky docs]) ([aemet docs]) ([met_eireann docs]) +- Add switch setup type hints [a-f] ([@epenet] - [#63302]) +- Add switch setup type hints [s-z] ([@epenet] - [#63305]) +- Skip raw encoding test for cover ([@jbouwh] - [#63322]) ([mqtt docs]) +- Fix typo in CPU Speed translation key ([@frenck] - [#63284]) ([cpuspeed docs]) +- Reject MQTT light discovery using unsupported value_template ([@emontnemery] - [#62682]) ([mqtt docs]) (breaking-change) +- Add setup type hints to number, remote and scene ([@epenet] - [#63299]) +- Cleanup handling of unsupported config keys in MQTT fan ([@emontnemery] - [#62681]) ([mqtt docs]) +- Add sensor setup type hints [w-z] ([@epenet] - [#63308]) +- Add sensor setup type hints [s] ([@epenet] - [#63310]) +- Add sensor setup type hints [r] ([@epenet] - [#63312]) +- Add sensor setup type hints [m-n] ([@epenet] - [#63314]) +- Add sensor setup type hints [o-q] ([@epenet] - [#63313]) +- Add sensor setup type hints [i-l] ([@epenet] - [#63315]) +- Add sensor setup type hints [g-h] ([@epenet] - [#63316]) +- Add sensor setup type hints [c-d] ([@epenet] - [#63318]) +- Add sensor setup type hints [a-b] ([@epenet] - [#63319]) +- Add sensor setup type hints [e-f] ([@epenet] - [#63317]) +- Add sensor setup type hints [t-v] ([@epenet] - [#63309]) +- Add basic type hints to acmeda ([@epenet] - [#62736]) ([acmeda docs]) +- Add switch setup type hints [g-m] ([@epenet] - [#63303]) +- Add switch setup type hints [n-r] ([@epenet] - [#63304]) +- Allow mobile app registrations only supporting websocket push ([@balloob] - [#63208]) ([mobile_app docs]) +- Weather units: climacell (1.3/4) ([@rianadon] - [#61472]) ([climacell docs]) +- Add UniFi Protect select platform ([@AngellusMortis] - [#63337]) ([unifiprotect docs]) +- Use enums in smartthings tests ([@tkdrob] - [#62194]) ([smartthings docs]) +- Address late review of #63238 ([@ctalkington] - [#63358]) ([roku docs]) +- Use built-in Jinja min and max filters in templates ([@avee87] - [#60327]) +- Add SensorDeviceClass to statistics component, improve structures ([@ThomDietrich] - [#62629]) ([statistics docs]) +- Remove invalid return values in setup methods [r-z] ([@epenet] - [#63365]) +- Remove invalid return values in setup methods [a-h] ([@epenet] - [#63362]) +- Remove invalid return values in setup methods [i-p] ([@epenet] - [#63363]) +- Bump rtsp_to_webrtc to 0.4.0 ([@allenporter] - [#63359]) ([rtsp_to_webrtc docs]) +- Only rely on device status when adding Tuya entities ([@frenck] - [#63074]) ([tuya docs]) +- Remove deprecated yaml config from waze_travel_time ([@tkdrob] - [#62543]) ([waze_travel_time docs]) (breaking-change) +- Add select entities to ZHA ([@dmulcahey] - [#62718]) ([zha docs]) +- Allow password-less login to jellyfin ([@esev] - [#61646]) ([jellyfin docs]) +- Add configuration_url for ONVIF ([@esev] - [#61526]) ([onvif docs]) +- Add MAC to WLED device ([@balloob] - [#63349]) ([wled docs]) +- Update influxdb dependency to `5.3.1` ([@mdegat01] - [#62228]) ([influxdb docs]) ([sensor docs]) +- Simplify device registry update ([@scop] - [#62868]) +- Make review link exclude PRs with failing tests ([@davet2001] - [#63373]) +- Fix `ensure_list` typing ([@cdce8p] - [#63311]) +- Remove some unused TypeVars ([@cdce8p] - [#63346]) ([energy docs]) +- Add device to Wallbox integration ([@Eernie] - [#63011]) ([wallbox docs]) +- Add support for Pet Feeder (cwwsq) in Tuya ([@vauriga] - [#61359]) ([tuya docs]) +- Add philips.light.hbulb support ([@syssi] - [#62417]) ([xiaomi_miio docs]) +- Remove deprecated yaml config from sma ([@tkdrob] - [#62472]) ([sma docs]) (breaking-change) +- Use entity class attributes for Mazda integration ([@bdr99] - [#59869]) ([mazda docs]) +- Add support for philips js screen state ([@elupus] - [#62775]) ([philips_js docs]) (new-platform) +- Add hardware revision support to homekit ([@bdraco] - [#63336]) ([homekit docs]) +- Add little slack to CodeCov project/config-flows threshold ([@frenck] - [#63379]) +- Cleanup nest config flow ([@allenporter] - [#63351]) ([nest docs]) +- Convert Risco sensor states to timestamps ([@OnFreund] - [#63139]) ([risco docs]) +- Use BinarySensorDeviceClass enum in binary_sensor device automations ([@epenet] - [#62635]) ([binary_sensor docs]) +- Offer local control option when there are multiple zeroconf homekit matches ([@bdraco] - [#62649]) ([zeroconf docs]) +- Implement retry for Netatmo webhook registration ([@cgtobi] - [#62597]) ([netatmo docs]) +- Set nest climate hvac_action to report idle when hvac mode is not off ([@allenporter] - [#62811]) ([nest docs]) +- Drop device_class in wallbox number ([@epenet] - [#62438]) ([wallbox docs]) +- Add counter entities support to Prometheus component ([@rnurgaliyev] - [#62410]) ([prometheus docs]) +- Keep flux_led device time in sync ([@bdraco] - [#63259]) ([flux_led docs]) +- Update PyVicare to 2.15.0 ([@tschnilo] - [#63342]) ([vicare docs]) +- Add support for Add-on discovery in rtsp_to_webrtc ([@allenporter] - [#63211]) ([rtsp_to_webrtc docs]) +- Complete strict typing to Humidifier entity platform ([@frenck] - [#61021]) ([device_automation docs]) ([humidifier docs]) +- Add strict typing to `core.py` (2) - State ([@cdce8p] - [#63240]) +- Start using `ParamSpec` for decorator functions ([@cdce8p] - [#63148]) ([sonos docs]) ([tplink docs]) ([dlna_dmr docs]) ([vlc_telnet docs]) ([zwave_js docs]) ([evil_genius_labs docs]) +- Add Picnic last_order_max_order_time sensor ([@hmmbob] - [#63169]) ([picnic docs]) +- Add support for Sonos microphone binary_sensor ([@jjlawren] - [#63097]) ([sonos docs]) +- Prometheus to support input_number ([@yozik04] - [#58964]) ([prometheus docs]) +- Add strict typing to `core.py` (6) - Implicit reexport ([@cdce8p] - [#63345]) +- Parse Risco event time as local ([@OnFreund] - [#63395]) ([risco docs]) +- Simplify WLED config flow, use device name for config entry ([@frenck] - [#63377]) ([wled docs]) +- Improve test coverage for PVOutput ([@frenck] - [#63048]) ([pvoutput docs]) +- Add unique_id to tellstick devices ([@michaelarnauts] - [#63391]) ([tellstick docs]) +- Add a lock on nest stream URL creation to avoid multiple in flight at once ([@allenporter] - [#63212]) ([nest docs]) +- Add Goodwe solar inverter integration ([@mletenay] - [#58503]) ([goodwe docs]) (new-integration) +- Add setup type hints to august ([@epenet] - [#63388]) ([august docs]) +- Fix Heat Service, bump pyEight to 0.2.0 ([@mezz64] - [#63405]) ([eight_sleep docs]) +- Set the nest configuration title to a user friendly name ([@allenporter] - [#62886]) ([nest docs]) +- Fix type hint in http register_view ([@epenet] - [#63385]) ([http docs]) +- Add additional service to set advanced Hue scene options ([@marcelveldt] - [#63035]) ([hue docs]) +- Deprecate Nanoleaf YAML ([@milanmeu] - [#63404]) ([nanoleaf docs]) (breaking-change) +- Remove groups.yaml from default config ([@emontnemery] - [#63366]) +- Make device tracker entities work better ([@balloob] - [#63328]) ([device_tracker docs]) +- Update holidays to 0.12 ([@frenck] - [#63389]) ([workday docs]) +- Remove deprecated Arduino integration ([@frenck] - [#63406]) ([arduino docs]) (breaking-change) +- Add external Tibber statistics ([@Danielhiversen] - [#62249]) ([tibber docs]) +- Add sensor tests to PVOutput ([@frenck] - [#63400]) ([pvoutput docs]) +- Add setup type hints [h] ([@epenet] - [#63438]) ([homematic docs]) ([hangouts docs]) ([homeworks docs]) ([hikvision docs]) ([hp_ilo docs]) ([haveibeenpwned docs]) +- Add setup type hints [i-k] ([@epenet] - [#63444]) ([ios docs]) ([keyboard_remote docs]) ([ihc docs]) ([idteck_prox docs]) ([itach docs]) ([integration docs]) +- Remove unused group config view ([@emontnemery] - [#63434]) ([config docs]) +- Add setup type hints to history ([@epenet] - [#63441]) ([history docs]) +- Add MAC to Roku device ([@ctalkington] - [#63422]) ([roku docs]) +- Bump influxdb-client dependency to 1.24.0 ([@mdegat01] - [#63397]) +- Fix internet access switch for Fritz Wi-Fi guest devices ([@chemelli74] - [#63407]) ([fritz docs]) +- Add setup type hints [e] ([@epenet] - [#63430]) ([elkm1 docs]) ([entur_public_transport docs]) ([eddystone_temperature docs]) +- Add setup type hints to magicseaweed ([@epenet] - [#63451]) ([magicseaweed docs]) +- Add setup type hints [l] ([@epenet] - [#63450]) +- Add setup type hints [f] ([@epenet] - [#63431]) ([feedreader docs]) ([file docs]) ([fail2ban docs]) ([fints docs]) ([folder docs]) ([filesize docs]) +- Add setup type hints [g] ([@epenet] - [#63432]) ([group docs]) ([gc100 docs]) ([garadget docs]) ([greenwave docs]) ([goodwe docs]) +- Add setup type hints [a] ([@epenet] - [#63424]) ([api docs]) ([asterisk_mbox docs]) ([anel_pwrctrl docs]) ([alpha_vantage docs]) ([arest docs]) ([airtouch4 docs]) +- Upgrade python_opendata_transport to 0.3.0 ([@agners] - [#63409]) ([swiss_public_transport docs]) +- Use imports from `core` ([@cdce8p] - [#63458]) ([modbus docs]) ([tradfri docs]) ([surepetcare docs]) ([aftership docs]) ([homeassistant docs]) +- Use imports from `helpers.typing` ([@cdce8p] - [#63459]) ([mqtt docs]) ([trafikverket_weatherstation docs]) ([sensibo docs]) ([yale_smart_alarm docs]) ([rainforest_eagle docs]) ([iotawatt docs]) ([airthings docs]) +- Import `image_processing` constants from `const` ([@cdce8p] - [#63461]) +- Use SensorDeviceClass in `sensor` and `helpers` packages ([@cdce8p] - [#63452]) ([sensor docs]) +- Fix exception import locations ([@cdce8p] - [#63454]) ([automation docs]) ([tplink docs]) ([samsungtv docs]) ([yale_smart_alarm docs]) ([azure_event_hub docs]) ([nam docs]) +- Add support for curtain device class to google assistant ([@emontnemery] - [#63380]) ([google_assistant docs]) +- Add setup type hints [b] ([@epenet] - [#63427]) ([blinkt docs]) ([balboa docs]) ([bosch_shc docs]) +- Add setup type hints [c-d] ([@epenet] - [#63428]) ([coinbase docs]) ([daikin docs]) ([darksky docs]) ([cups docs]) ([dexcom docs]) ([compensation docs]) +- Add setup type hints [m] ([@epenet] - [#63456]) ([microsoft_face docs]) ([maxcube docs]) ([mqtt_statestream docs]) ([mochad docs]) ([mvglive docs]) ([mcp23017 docs]) ([mazda docs]) +- Remove debug print ([@chemelli74] - [#63460]) +- Remove colinodell as QNAP codeowner ([@colinodell] - [#63474]) ([qnap docs]) +- Improve nest camera failure handling on removal ([@allenporter] - [#63207]) ([nest docs]) +- Support media_player grouping services for Sonos ([@jjlawren] - [#63256]) ([sonos docs]) +- Add setup type hints [o-q] ([@epenet] - [#63465]) ([pilight docs]) ([qwikswitch docs]) ([qnap docs]) ([onkyo docs]) ([pyload docs]) ([pulseaudio_loopback docs]) ([pi4ioe5v9xxxx docs]) ([powerwall docs]) +- Add setup type hints [r] ([@epenet] - [#63472]) ([rpi_pfio docs]) ([roomba docs]) ([raincloud docs]) ([rpi_gpio docs]) ([rest docs]) ([rmvtransport docs]) ([rpi_rf docs]) +- Add setup type hints [n] ([@epenet] - [#63462]) ([nmbs docs]) ([netdata docs]) ([nx584 docs]) ([nederlandse_spoorwegen docs]) ([netio docs]) ([nexia docs]) +- Use const imports [a-e] ([@cdce8p] - [#63467]) +- Use const imports [g-i] ([@cdce8p] - [#63468]) ([input_select docs]) ([group docs]) ([hive docs]) +- Add setup type hints [t-u] ([@epenet] - [#63480]) ([thethingsnetwork docs]) ([tibber docs]) ([uk_transport docs]) ([tank_utility docs]) ([torque docs]) ([tmb docs]) +- Add setup type hints [x-z] ([@epenet] - [#63485]) ([zabbix docs]) ([zoneminder docs]) ([ziggo_mediabox_xl docs]) ([xbee docs]) +- Use correct relative imports [n-z] ([@cdce8p] - [#63471]) +- Use correct relative imports [a-m] ([@cdce8p] - [#63470]) +- Add setup type hints [s] (part 2) ([@epenet] - [#63479]) +- Add setup type hints [s] (part 1) ([@epenet] - [#63476]) ([shopping_list docs]) ([skybell docs]) ([sisyphus docs]) ([satel_integra docs]) ([scrape docs]) ([season docs]) +- Add setup type hints to homeassistant ([@epenet] - [#63439]) ([homeassistant docs]) +- Add link flags for grpc armv7 wheels ([@allenporter] - [#62779]) +- Add unique id to flic buttons ([@tomhennigan] - [#61496]) ([flic docs]) +- Sort google_assistant consts ([@emontnemery] - [#63487]) ([google_assistant docs]) +- Support passing callbacks to start.async_at_start ([@emontnemery] - [#63473]) +- Use const imports [l-z] ([@cdce8p] - [#63469]) +- Add setup type hints [v-w] ([@epenet] - [#63484]) +- Add timeouts to CI jobs ([@cdce8p] - [#63491]) +- Fix 3rd party imports ([@cdce8p] - [#63455]) ([mqtt docs]) ([goalzero docs]) +- Mark PVOutput as platinum on the integration quality scale ([@frenck] - [#63453]) ([pvoutput docs]) +- UniFi Protect test refactoring ([@AngellusMortis] - [#63486]) ([unifiprotect docs]) +- Deprecate Sense HAT (ADR-0019) ([@frenck] - [#63500]) ([sensehat docs]) (breaking-change) +- Deprecate Raspberry Pi RF (ADR-0019) ([@frenck] - [#63501]) ([rpi_rf docs]) (breaking-change) +- Improve cleanup service for Fritz ([@chemelli74] - [#61484]) ([fritz docs]) +- Use Platform enum [emulated_hue] ([@cdce8p] - [#63498]) ([emulated_hue docs]) +- Add configuration url to kostal plenticore ([@stegm] - [#63502]) ([kostal_plenticore docs]) +- Bump google-cloud-pubsub to 2.9.0 ([@allenporter] - [#63493]) ([google_pubsub docs]) +- Enable local fulfillment google assistant ([@LoekSangers] - [#63218]) ([google_assistant docs]) +- Add 'fire_event' command to websocket api ([@niecore] - [#63378]) ([websocket_api docs]) +- Improve server selection for Plex config flows ([@jjlawren] - [#63408]) ([plex docs]) +- Address late review of vicare config flow ([@oischinger] - [#63343]) ([vicare docs]) (breaking-change) +- Bump dsmr-parser dependency to 0.32 ([@rhpijnacker] - [#63436]) ([dsmr docs]) (breaking-change) +- Revert "Bump google-cloud-pubsub to 2.9.0 (to bump grpcio)" ([@frenck] - [#63517]) ([google_pubsub docs]) +- Revert "Add link flags for grpc armv7 wheels" ([@allenporter] - [#63518]) +- Upgrade pynuki to 1.5.2 ([@pree] - [#62866]) ([nuki docs]) +- Add UniFi Protect binary_sensor platform ([@AngellusMortis] - [#63489]) ([unifiprotect docs]) (new-platform) +- Optimise sleep time for nissan leaf servers ([@filcole] - [#62857]) ([nissan_leaf docs]) +- Add button to start leaf charge ([@filcole] - [#62948]) ([nissan_leaf docs]) (breaking-change) +- Deprecate PiFace Digital I/O (PFIO) (ADR-0019) ([@frenck] - [#63506]) ([rpi_pfio docs]) (breaking-change) +- Deprecate Orange Pi GPIO (ADR-0019) ([@frenck] - [#63507]) ([orangepi_gpio docs]) (breaking-change) +- Deprecate MH-Z19 CO2 Sensor (ADR-0019) ([@frenck] - [#63508]) ([mhz19 docs]) (breaking-change) +- Deprecate Enviro pHAT (ADR-0019) ([@frenck] - [#63509]) ([envirophat docs]) (breaking-change) +- Deprecate Blinkt! (ADR-0019) ([@frenck] - [#63510]) ([blinkt docs]) (breaking-change) +- Deprecate pigpio Daemon PWM LED (ADR-0019) ([@frenck] - [#63504]) ([rpi_gpio_pwm docs]) (breaking-change) +- Deprecate Raspberry Pi GPIO (ADR-0019) ([@frenck] - [#63503]) ([rpi_gpio docs]) (breaking-change) +- Deprecate Piglow (ADR-0019) ([@frenck] - [#63505]) ([piglow docs]) (breaking-change) +- Add strict typing to `core.py` (3) - Service ([@cdce8p] - [#63241]) +- Consistently type/coerce climate humidity to be an int ([@bdraco] - [#61456]) ([climate docs]) (breaking-change) +- Share common EntityTestHelpers in wemo tests ([@esev] - [#62455]) ([wemo docs]) +- Add tests that exercise nest dhcp discovery behavior ([@allenporter] - [#62526]) ([nest docs]) +- Add UniFi Protect sensor platform ([@AngellusMortis] - [#63524]) ([unifiprotect docs]) (new-platform) +- Add support for Steamist steam showers ([@bdraco] - [#63251]) ([steamist docs]) (new-integration) +- Add strict typing to core.py (1) - EventBus ([@cdce8p] - [#63239]) ([netatmo docs]) ([met docs]) +- Allow registering a webhook as local only ([@balloob] - [#63516]) ([google_assistant docs]) ([webhook docs]) +- Updated the support of Tuya Circuit Breaker 'dlq' ([@slydiman] - [#63519]) ([tuya docs]) +- Add button entities to bmw_connected_drive ([@rikroe] - [#63136]) ([bmw_connected_drive docs]) (breaking-change) +- Deprecate 1-Wire SysBus (ADR-0019) ([@frenck] - [#63513]) ([onewire docs]) (breaking-change) +- Fritz cleanup: part1 (naming) ([@chemelli74] - [#63535]) ([fritz docs]) +- Bump greeneye_monitor to v3.0.1 ([@jkeljo] - [#63531]) ([greeneye_monitor docs]) +- Add link flags for grpc armv7 wheels (attempt #2) ([@allenporter] - [#63521]) +- Bump google-cloud-pubsub to 2.9.0 (attempt #2) ([@allenporter] - [#63522]) ([google_pubsub docs]) +- Move ReCollect Waste "next pickup" info to its own sensor ([@bachya] - [#62558]) ([recollect_waste docs]) (breaking-change) +- Code improvements to trafikverket_weatherstation ([@gjohansson-ST] - [#62854]) ([trafikverket_weatherstation docs]) +- Update PyTurboJPEG to 1.6.4 ([@frenck] - [#63553]) ([camera docs]) ([stream docs]) +- Revert "Bump google-cloud-pubsub to 2.9.0 (attempt #2) (#63522)" ([@allenporter] - [#63561]) ([google_pubsub docs]) +- Update Numpy to 1.22.0 ([@frenck] - [#63559]) ([opencv docs]) ([tensorflow docs]) ([trend docs]) ([iqvia docs]) ([compensation docs]) +- Fix flux_led sync time ([@cdce8p] - [#63554]) ([flux_led docs]) +- Update requests to 2.27.1 ([@frenck] - [#63552]) +- UniFi Protect test sensor followup ([@AngellusMortis] - [#63563]) ([unifiprotect docs]) +- Use attr** in thermoworks-smoke ([@epenet] - [#62436]) ([thermoworks_smoke docs]) +- Rewrite vultr unittest to pytest ([@epenet] - [#63367]) ([vultr docs]) +- Isolate consts better to where they are used ([@AngellusMortis] - [#63569]) ([unifiprotect docs]) +- Fix cleanup service to just run on loaded config entries in Fritz!Tools ([@mib1185] - [#63570]) ([fritz docs]) +- Fix typing `TrackTemplateResultListener` [helpers.event] ([@cdce8p] - [#63541]) ([websocket_api docs]) +- Pickup code owner for flux_led ([@bdraco] - [#63573]) ([flux_led docs]) +- Fix missing device name with legacy flux_led discovery ([@bdraco] - [#62785]) ([flux_led docs]) +- Improve callable typing [helpers.event] ([@cdce8p] - [#63543]) ([netatmo docs]) ([wemo docs]) ([flux_led docs]) +- Add device configuration entities to flux_led ([@bdraco] - [#62786]) ([flux_led docs]) +- Simplify groups ([@emontnemery] - [#63477]) ([group docs]) +- Revert "Use Platform enum [emulated_hue] (#63498)" ([@cdce8p] - [#63576]) ([emulated_hue docs]) +- Add missing TypeVar in vlc_telnet decorator ([@cdce8p] - [#63587]) ([vlc_telnet docs]) +- Add Kraken configuration_url ([@eifinger] - [#63565]) ([kraken docs]) +- Bump pybotvac version for the neato integration ([@simontegelid] - [#63586]) ([neato docs]) +- Add support for Levoit Core 300S air purifier to VeSync integration ([@RefineryX] - [#62488]) ([vesync docs]) +- Add SensorStateClass to Kraken sensors ([@eifinger] - [#63590]) ([kraken docs]) +- Add state translations and icons to ClimaCell sensors ([@raman325] - [#63526]) ([climacell docs]) +- Fix upnp device not being reinitialized after device changes location ([@StevenLooman] - [#63133]) ([upnp docs]) +- Weather units: Buienradar (1.2/4) ([@rianadon] - [#61470]) ([buienradar docs]) +- Make idle chromecasts appear as idle instead of off ([@emontnemery] - [#61786]) ([cast docs]) +- Tuya Alarm Initial commit ([@leeyuentuen] - [#60080]) ([tuya docs]) (new-platform) (new-integration) +- Add long term statistics to buienradar ([@tedvdb] - [#58917]) ([buienradar docs]) +- Move lock and devicelock attributes into sensors for all AVM Fritz!Smarthome entities ([@mib1185] - [#60426]) ([fritzbox docs]) (breaking-change) +- Auto-setup a few more IHC devices ([@tausen] - [#58806]) ([ihc docs]) +- Add daily energy usage sensor to daikin ([@tofuSCHNITZEL] - [#61617]) ([daikin docs]) +- Bump yalesmartalarmclient to v0.3.7 ([@gjohansson-ST] - [#63596]) ([yale_smart_alarm docs]) +- Fail CI when package init file is missing in component tests ([@frenck] - [#63589]) +- Add setup type hints [a-e] ([@epenet] - [#63597]) ([alarmdecoder docs]) ([evohome docs]) ([asuswrt docs]) ([digitalloggers docs]) ([control4 docs]) +- Add setup type hints [h-i] ([@epenet] - [#63603]) ([homematicip_cloud docs]) ([harmony docs]) ([icloud docs]) ([heos docs]) ([izone docs]) ([iaqualink docs]) ([huisbaasje docs]) +- Add setup type hints [k-m] ([@epenet] - [#63605]) ([lyric docs]) ([meteo_france docs]) ([metoffice docs]) ([melcloud docs]) ([keenetic_ndms2 docs]) ([minecraft_server docs]) ([kostal_plenticore docs]) ([meteoclimatic docs]) +- Add setup type hints [n-r] ([@epenet] - [#63607]) ([ping docs]) ([nmap_tracker docs]) ([nws docs]) ([nsw_rural_fire_service_feed docs]) ([ruckus_unleashed docs]) ([picnic docs]) +- Add setup type hints [s-t] ([@epenet] - [#63613]) ([tado docs]) ([toon docs]) ([tuya docs]) ([twinkly docs]) ([traccar docs]) ([songpal docs]) ([system_bridge docs]) +- Add setup type hints [v-y] ([@epenet] - [#63614]) ([vultr docs]) ([yeelight docs]) ([wilight docs]) ([xbox docs]) +- Add yale_smart_alarm config options flow ([@gjohansson-ST] - [#54097]) ([yale_smart_alarm docs]) +- Delete nest event image fetching and use same APIs as media player ([@allenporter] - [#62789]) ([nest docs]) +- Skip empty test directories in gen_requirements_all ([@mdz] - [#62970]) +- Add strict typing to `core.py` (5) - Task ([@cdce8p] - [#63243]) ([arcam_fmj docs]) +- Add setup type hints [f-g] ([@epenet] - [#63599]) ([feedreader docs]) ([freebox docs]) ([gpslogger docs]) ([geniushub docs]) ([firmata docs]) ([fireservicerota docs]) ([flick_electric docs]) +- Add missing `last_rest` in Tibber ([@Danielhiversen] - [#61914]) ([tibber docs]) +- Case sensitive SQL queries checks ([@dgomes] - [#62752]) ([sql docs]) +- Teach call service script action about entity registry ids ([@emontnemery] - [#61172]) +- Use find_coordinates in google_travel_time ([@eifinger] - [#61423]) ([google_travel_time docs]) +- Use entities instead of devices for nissan leaf ([@filcole] - [#63542]) ([nissan_leaf docs]) +- Add SensorEntityClass support for Environment Canada integration ([@gwww] - [#58615]) ([environment_canada docs]) (breaking-change) +- Add new TRV Beca and proper Presets with new one Temporary Manual ([@jacekk015] - [#60337]) ([zha docs]) +- Give scenes last activated state ([@frenck] - [#62673]) ([scene docs]) ([homeassistant docs]) +- Allow sending webhooks via WS connection ([@balloob] - [#62725]) ([cloud docs]) ([webhook docs]) +- Update youtube_dl to 2021.12.17 ([@frenck] - [#63592]) ([media_extractor docs]) +- Bump pylgnetcast to 0.3.7 ([@Drafteed] - [#63645]) ([lg_netcast docs]) +- Revert "Update Numpy to 1.22.0 (#63559)" ([@frenck] - [#63648]) ([opencv docs]) ([tensorflow docs]) ([trend docs]) ([iqvia docs]) ([compensation docs]) +- Add temp and minutes remaining sensors to steamist ([@bdraco] - [#63653]) ([steamist docs]) (new-platform) +- Add support for managing 2.4G remotes in flux_led ([@bdraco] - [#63646]) ([flux_led docs]) (new-platform) +- Add SenseME integration ([@bdraco] - [#62909]) ([senseme docs]) (new-integration) +- Improve typing for Overkiz integration and address late feedback ([@iMicknl] - [#63483]) ([overkiz docs]) +- Refactor Launch Library to use config flow ([@DurgNomis-drol] - [#62416]) ([launch_library docs]) (breaking-change) +- Bump pylaunches to 1.2.1 ([@DurgNomis-drol] - [#63667]) ([launch_library docs]) +- Bump pysml to 0.0.6 ([@mtdcr] - [#63664]) ([edl21 docs]) +- Update pyTibber to 0.21.7 ([@Danielhiversen] - [#63663]) ([tibber docs]) +- Use device registry in aten_pe ([@mtdcr] - [#61906]) ([aten_pe docs]) +- Handle zwave_js metadata/value updates when the unit changes ([@raman325] - [#63579]) ([zwave_js docs]) +- Deprecate Media Player Classic Home Cinema (ADR-0004) ([@frenck] - [#63598]) ([mpchc docs]) (breaking-change) +- Bump mypy to 0.931 ([@cdce8p] - [#63673]) +- Add types for HassJob [helpers.event] ([@cdce8p] - [#63675]) +- Bump awesomeversion to 22.1.0 ([@ludeeus] - [#63676]) +- Improve typing of Steamist sensors ([@frenck] - [#63674]) ([steamist docs]) +- Minor bugfixes for UniFi Protect ([@AngellusMortis] - [#63475]) ([unifiprotect docs]) +- Fritz cleanup: part2 (triggers for button/service) ([@chemelli74] - [#63564]) ([fritz docs]) +- Move greeneye_monitor constants into their own file ([@jkeljo] - [#63659]) ([greeneye_monitor docs]) +- Fix the unregistration of Capability based MusicCast Entities ([@micha91] - [#63665]) ([yamaha_musiccast docs]) +- Use Platform enum [mysensors] ([@cdce8p] - [#63687]) ([mysensors docs]) +- Add button and deprecate service for Fritz cleanup ([@chemelli74] - [#63692]) ([fritz docs]) +- Fritz: small optimization ([@chemelli74] - [#63693]) ([fritz docs]) +- Replace custom Tuya device classes with StrEnum ([@frenck] - [#63681]) ([tuya docs]) +- Add UniFi Protect camera motion sensors and ThumbnailProxyView ([@AngellusMortis] - [#63696]) ([unifiprotect docs]) +- Use MediaPlayerDeviceClass for UniFi Protect media_player ([@AngellusMortis] - [#63708]) ([unifiprotect docs]) +- Remove package constraint to websockets ([@thecode] - [#63703]) +- Fix ParamSpec Callable return types ([@cdce8p] - [#63701]) ([tplink docs]) ([dlna_dmr docs]) ([vlc_telnet docs]) ([zwave_js docs]) ([evil_genius_labs docs]) +- Explicitely allow Platform enum in discovery helper ([@epenet] - [#63571]) ([amcrest docs]) +- Explicitely allow Platform enum in config_entries ([@epenet] - [#63581]) +- Add binary_sensor platform to SenseME ([@bdraco] - [#63660]) ([senseme docs]) (new-platform) +- Use Platform enum ([@cdce8p] - [#63577]) +- Eliminate redundant code in greeneye_monitor ([@jkeljo] - [#63661]) ([greeneye_monitor docs]) +- Improve multi-device test coverage for greeneye_monitor ([@jkeljo] - [#63657]) ([greeneye_monitor docs]) +- Tibber cost statistics ([@Danielhiversen] - [#63626]) ([tibber docs]) +- Use SensorEntityDescription in Mazda integration ([@bdr99] - [#63423]) ([mazda docs]) +- Additional SenseME cleanups ([@bdraco] - [#63748]) ([senseme docs]) +- Add discovery support to steamist ([@bdraco] - [#63707]) ([steamist docs]) +- Bump pyskyqhub to 0.1.4 ([@RogerSelwyn] - [#63734]) +- Fix climate channel for Shelly ([@chemelli74] - [#63756]) ([shelly docs]) +- Enable strict typing in browser ([@epenet] - [#63760]) ([browser docs]) +- Add switch platform to SenseME ([@bdraco] - [#63719]) ([senseme docs]) (new-platform) +- Refactor EntityDescriptions for UniFi Protect ([@AngellusMortis] - [#63716]) ([unifiprotect docs]) +- Raise if trying to store mocks in storage ([@balloob] - [#63622]) +- Add DeviceInfo to steamist ([@bdraco] - [#63773]) ([steamist docs]) +- Add setup type hints to emby ([@epenet] - [#63784]) ([emby docs]) +- Add setup type hints to aws ([@epenet] - [#63781]) ([aws docs]) +- Adjust migrate_entry in axis ([@epenet] - [#63779]) ([axis docs]) +- Add setup type hints to avion ([@epenet] - [#63778]) ([avion docs]) +- Cleanups for SenseME switch platform ([@bdraco] - [#63774]) ([senseme docs]) +- Bump py synologydsm api to 1.0.5 ([@chpego] - [#63786]) ([synology_dsm docs]) +- Add setup type hints to gpmdp ([@epenet] - [#63787]) ([gpmdp docs]) +- Update MQTT light schema template ([@orcema] - [#62759]) ([mqtt docs]) +- Use Platform enum in load_platform [a-l] ([@epenet] - [#63750]) +- Add setup type hints to hdmi_cec ([@epenet] - [#63788]) ([hdmi_cec docs]) +- Use Platform enum in load_platform [m-z] ([@epenet] - [#63751]) +- Adjust custom data location in hdmi_cec ([@epenet] - [#63791]) ([hdmi_cec docs]) +- Fix incorrect type hint in discovery helper ([@epenet] - [#63789]) ([life360 docs]) +- Enable strict typing for `core.py` ([@cdce8p] - [#63244]) +- Add is_number as a test for use in select, selectattr, reject, and re… ([@Petro31] - [#63732]) +- Add DSMR config options for EasyMeter/Q3D ([@Aeroid] - [#63669]) ([dsmr docs]) +- Drop use of discovery_info in aquostv ([@epenet] - [#63777]) ([aquostv docs]) +- Address late Shelly review ([@chemelli74] - [#63754]) ([shelly docs]) +- Allow self signed certs on octoprint server ([@rfleming71] - [#59213]) ([octoprint docs]) +- Enable Google Assistant state reporting by default ([@emontnemery] - [#63801]) ([cloud docs]) +- Support 4 channels switch ([@sagioto] - [#63724]) ([tuya docs]) +- Update PyTurboJPEG to 1.6.5 ([@frenck] - [#63803]) ([camera docs]) ([stream docs]) +- Add setup type hints to mikrotik ([@epenet] - [#63797]) ([mikrotik docs]) +- Use local constant in netgear_lte config schema ([@epenet] - [#63753]) ([netgear_lte docs]) +- Update sentry-sdk to 1.5.2 ([@frenck] - [#63821]) ([sentry docs]) +- Add setup type hints to workday ([@epenet] - [#63810]) ([workday docs]) +- Add setup type hints to nx584 ([@epenet] - [#63796]) ([nx584 docs]) +- Add strict typing to abode ([@tkdrob] - [#57673]) ([abode docs]) +- Fix the translation strings for Tuya Select ([@dougiteixeira] - [#63353]) ([tuya docs]) +- Add `audio_delay` number entity to Sonos ([@jjlawren] - [#63566]) ([sonos docs]) +- Add setup type hints to supervisord ([@epenet] - [#63807]) ([supervisord docs]) +- Add type hints to async_setup_scanner ([@epenet] - [#63826]) ([volvooncall docs]) ([icloud docs]) ([ping docs]) ([traccar docs]) ([meraki docs]) ([mqtt_json docs]) +- Fix implicit reexport [dt_util] ([@cdce8p] - [#63829]) ([device_tracker docs]) +- Add setup type hints to season ([@epenet] - [#63798]) ([season docs]) +- Add setup type hints to yamaha ([@epenet] - [#63811]) ([yamaha docs]) +- Bump devolo-plc-api to 0.7.1 ([@Shutgun] - [#63834]) ([devolo_home_network docs]) +- Allow None agent in conversation ([@epenet] - [#63761]) ([conversation docs]) ([almond docs]) +- Resolve implicit imports ([@cdce8p] - [#63832]) +- Expose power & energy usage of VeSync outlets as separate sensors ([@decompil3d] - [#61837]) ([vesync docs]) (breaking-change) (new-platform) +- Remove unneeded boolean conversion from senseme ([@frenck] - [#63783]) ([senseme docs]) +- Remove ee brightbox integration ([@epenet] - [#63839]) (breaking-change) +- Add UniFi Protect global services ([@AngellusMortis] - [#63768]) ([unifiprotect docs]) +- Fix incorrect type hint in async_setup_scanner ([@epenet] - [#63833]) ([volvooncall docs]) ([icloud docs]) ([ping docs]) ([traccar docs]) ([meraki docs]) ([mqtt_json docs]) +- Add xiaomi_miio vacuum current cleaning cycle statistics sensor ([@OGKevin] - [#61098]) ([xiaomi_miio docs]) +- Remove deprecated async_get_scanner from netgear ([@epenet] - [#63862]) ([netgear docs]) (breaking-change) +- Fix invalid get_scanner return value in unify_direct ([@epenet] - [#63855]) ([unifi_direct docs]) +- Add type hint to get_scanner in ubus ([@epenet] - [#63856]) ([ubus docs]) +- Add type hints to get_scanner/async_get_scanner ([@epenet] - [#63836]) +- Add HomeWizard Energy integration ([@DCSBL] - [#55812]) ([homewizard_energy docs]) (new-integration) +- Add a stream_id parameter to the WebRTC provider ([@allenporter] - [#63625]) ([camera docs]) ([rtsp_to_webrtc docs]) +- Upgrade hangups to 0.4.17 ([@cdce8p] - [#63871]) ([hangouts docs]) +- Cleanup netgear platform schema ([@epenet] - [#63873]) ([netgear docs]) +- Deprecate iCloud YAML configuration ([@epenet] - [#63875]) ([icloud docs]) (breaking-change) +- Remove deprecated async_get_scanner from nmap_tracker ([@epenet] - [#63863]) ([nmap_tracker docs]) (breaking-change) +- Remove deprecated async_get_scanner from keenetic_ndms2 ([@epenet] - [#63860]) ([keenetic_ndms2 docs]) (breaking-change) +- Remove deprecated async_get_scanner from fritz ([@epenet] - [#63857]) ([fritz docs]) (breaking-change) +- Fix MusicCast select current_option ([@micha91] - [#63668]) ([yamaha_musiccast docs]) +- Remove last_reset from vesync sensor ([@emontnemery] - [#63877]) ([vesync docs]) +- Remove last_reset from vicare sensor ([@emontnemery] - [#63879]) ([vicare docs]) +- Generate supported python versions based on current and next required ([@scop] - [#62618]) +- Fix implicit reexport [helpers.condition] ([@cdce8p] - [#63830]) ([binary_sensor docs]) ([sensor docs]) ([device_automation docs]) +- Add myself as codeowner for LaMetric ([@frenck] - [#63887]) ([lametric docs]) +- Drop Python 3.8 support ([@frenck] - [#63883]) (breaking-change) +- Update wheels builder to 2022.01.0 ([@frenck] - [#63882]) +- Update pyupgrade to v2.31.0 ([@frenck] - [#63888]) +- Add setup type hints to envisalink ([@epenet] - [#63785]) ([envisalink docs]) +- Update Python version used for pylint ([@cdce8p] - [#63895]) ([lupusec docs]) ([azure_event_hub docs]) ([homewizard docs]) +- Drop last_reset attribute for non 'total' sensors ([@emontnemery] - [#63880]) ([sensor docs]) (breaking-change) +- Drop legacy support for sensor sum statistics ([@emontnemery] - [#63884]) ([sensor docs]) +- Update Pillow to 9.0.0 ([@frenck] - [#63894]) +- Fix waqi config parsing ([@epenet] - [#63897]) ([waqi docs]) +- Avoid locking the database for non-SQLite backends ([@agners] - [#63847]) ([recorder docs]) +- Update pyhomematic to 0.1.77 ([@danielperna84] - [#63848]) ([homematic docs]) +- Improve code quality alarm_control_panel in yale_smart_alarm ([@gjohansson-ST] - [#63672]) ([yale_smart_alarm docs]) +- Import persistent notification (part 4) ([@emontnemery] - [#63901]) +- Fix MQTT climate optimistic preset modes ([@jbouwh] - [#63463]) ([mqtt docs]) (breaking-change) +- Always send hvac_mode deprecate send_if_off ([@jbouwh] - [#63814]) ([mqtt docs]) (breaking-change) +- Import persistent notification part 1 ([@emontnemery] - [#63898]) ([websocket_api docs]) +- Bump google-cloud-pubsub to 2.9.0 (attempt #3) ([@allenporter] - [#63911]) ([google_pubsub docs]) +- Import websocket_api (part 2) ([@emontnemery] - [#63906]) ([history docs]) ([config docs]) ([conversation docs]) ([frontend docs]) ([lovelace docs]) ([html5 docs]) ([device_automation docs]) +- Import websocket_api (part 3) ([@emontnemery] - [#63907]) +- Fix incorrect type hint in config_per_platform helper ([@epenet] - [#63890]) ([device_tracker docs]) ([notify docs]) ([mailbox docs]) +- Add type hints to setup_scanner ([@epenet] - [#63825]) ([demo docs]) ([google_maps docs]) ([life360 docs]) ([aprs docs]) ([fleetgo docs]) +- Move list to dict in versasense discovery ([@epenet] - [#63809]) ([versasense docs]) +- Replace hass.helpers: async_get_clientsession() ([@frenck] - [#63910]) +- Warn on`time.sleep` in event loop ([@farmio] - [#63766]) (breaking-change) +- Cleanup variable names in versasense ([@epenet] - [#63914]) ([versasense docs]) +- Import websocket_api (part 1) ([@emontnemery] - [#63905]) ([camera docs]) ([config docs]) ([cloud docs]) ([auth docs]) +- Import persistent notification (part 3) ([@emontnemery] - [#63900]) +- Fix missing full test suite in CI some cases ([@frenck] - [#63912]) +- Implement lock to yale_smart_alarm ([@gjohansson-ST] - [#63643]) ([yale_smart_alarm docs]) (new-platform) +- Update typing (2) [a-i] ([@cdce8p] - [#63923]) +- Update typing (1) ([@cdce8p] - [#63922]) +- Update typing (4) [u-z] ([@cdce8p] - [#63925]) +- Update typing (3) [k-t] ([@cdce8p] - [#63924]) +- Update typing (5) [tests] ([@cdce8p] - [#63926]) +- Use --py39-plus setting [pyupgrade] ([@cdce8p] - [#63927]) +- Add already_configured coverage to oncue ([@bdraco] - [#63919]) ([oncue docs]) +- Replace hass.helpers: async_call_later() ([@frenck] - [#63929]) ([konnected docs]) ([evohome docs]) ([squeezebox docs]) ([sentry docs]) +- Move `disallow-any-generics` to mypy.ini ([@cdce8p] - [#63917]) +- Simplify UniFi Protect service setup/cleanup ([@AngellusMortis] - [#63908]) ([unifiprotect docs]) +- Removes ThumbnailProxyView ([@AngellusMortis] - [#63940]) ([unifiprotect docs]) (breaking-change) +- Fritz: introduce wrapper.py - part 1 (sensor) ([@chemelli74] - [#63682]) ([fritz docs]) +- Improve nest media player clip/image and event handling for multiple events in a short time range ([@allenporter] - [#63149]) ([nest docs]) +- Update typing - collections.abc (1) ([@cdce8p] - [#63933]) +- Update typing - collections.abc (3) ([@cdce8p] - [#63947]) +- Reduce roku poll rate by 5s ([@ctalkington] - [#63952]) ([roku docs]) +- Update rokuecp to 0.10.0 ([@ctalkington] - [#63951]) ([roku docs]) +- Add setup type hints (part 1) ([@epenet] - [#63955]) +- Update typing - collections.abc (2) ([@cdce8p] - [#63934]) +- Add setup type hints (part 2) ([@epenet] - [#63960]) ([group docs]) ([demo docs]) +- Add setup type hints in bluetooth_le_tracker ([@epenet] - [#63828]) ([bluetooth_le_tracker docs]) +- Add setup type hints (part 3) ([@epenet] - [#63961]) ([netgear_lte docs]) ([opentherm_gw docs]) ([hyperion docs]) ([vesync docs]) +- Remove dead code in Environment Canada integration ([@gwww] - [#63946]) ([environment_canada docs]) +- Add strict typing to LaMetric ([@frenck] - [#63891]) ([lametric docs]) +- Add setup type hints to mailbox ([@epenet] - [#63792]) ([mailbox docs]) +- CI: Print python version ([@cdce8p] - [#63968]) +- Enable `deprecated-typing-alias` check [pylint] ([@cdce8p] - [#63935]) +- Improve typing [helpers.entity_registry] ([@cdce8p] - [#63767]) +- Bump brunt to 1.1.1 ([@eavanvalkenburg] - [#63973]) ([brunt docs]) +- Add setup type hints to mailboxes ([@epenet] - [#63975]) ([asterisk_mbox docs]) ([asterisk_cdr docs]) +- Fix typo in tuya select strings ([@milanmeu] - [#63974]) +- Fix discord component using userid as target ([@kezziny] - [#63972]) ([discord docs]) +- Use EntityDescription in launch_library ([@DurgNomis-drol] - [#63685]) ([launch_library docs]) +- Use Platform enum in load_platform [tests] ([@epenet] - [#63904]) ([numato docs]) +- Move DPI Group logic to UniFi switch platform ([@Kane610] - [#58761]) ([unifi docs]) +- Expose WLED configuration URL of discovered device ([@frenck] - [#63983]) ([wled docs]) +- Revert "Weather units: climacell (1.3/4) (#61472)" ([@frenck] - [#63842]) ([climacell docs]) +- Revert "Weather units: Buienradar (1.2/4) (#61470)" ([@frenck] - [#63843]) ([buienradar docs]) +- Update shodan to 1.26.0 ([@frenck] - [#63827]) ([shodan docs]) +- Bump pyunifiprotect version to 1.6.1 for UniFi Protect ([@AngellusMortis] - [#63989]) ([unifiprotect docs]) +- Add Chime Type select for UniFi Protect ([@AngellusMortis] - [#63993]) ([unifiprotect docs]) +- Enable package camera by default for UniFi Protect ([@AngellusMortis] - [#63985]) ([unifiprotect docs]) +- Fix HomeKit reporting/setting colors when white values are present ([@bdraco] - [#63948]) ([homekit docs]) +- Add support for changing the white strip type to flux_led ([@bdraco] - [#63943]) ([flux_led docs]) +- Add light platform to SenseME ([@bdraco] - [#63772]) ([senseme docs]) (new-platform) +- Fix reconnect rather than reauth when both HA and UniFi controller restarts at the same time ([@Kane610] - [#63994]) ([unifi docs]) +- Remove unused pillow 8.2.0 constraint ([@cdce8p] - [#64011]) +- Address late review of VeSync ([@decompil3d] - [#63945]) ([vesync docs]) +- Upgrade async_timeout to 4.0.2 ([@cdce8p] - [#64008]) +- Upgrade yarl to 1.7.2 ([@cdce8p] - [#64009]) +- Simplify coordinator and import OverkizStateType ([@iMicknl] - [#63969]) ([overkiz docs]) +- Add setup type hints to proximity ([@epenet] - [#63990]) ([proximity docs]) +- Set event data as dict in foursquare.checkin event ([@epenet] - [#63982]) ([foursquare docs]) (breaking-change) +- Fix invalid type hint in discovery async_listen ([@epenet] - [#63987]) ([sabnzbd docs]) +- Ensure flux_led is reloaded when the ICtype is changed ([@bdraco] - [#64016]) ([flux_led docs]) +- Add content deeplinking support to roku ([@ctalkington] - [#64010]) ([roku docs]) +- Bump flux_led to 0.28.2 to fix older A3 not being able to setup ([@bdraco] - [#64017]) ([flux_led docs]) +- Improve UniFi Protect Smart Sensor support ([@AngellusMortis] - [#64019]) ([unifiprotect docs]) +- Add setup type hints to rfxtrx ([@epenet] - [#63963]) ([rfxtrx docs]) +- Fix UniFi remove client service if time stamps are not integers ([@Kane610] - [#63998]) ([unifi docs]) +- Import persistent notification (part 2) ([@emontnemery] - [#63899]) +- Import persistent notification (part 5) ([@emontnemery] - [#63902]) +- Implement binary_sensor in yale_smart_alarm ([@gjohansson-ST] - [#63937]) ([yale_smart_alarm docs]) (new-platform) +- Add type hints to media_player (part 1) ([@epenet] - [#64005]) ([media_player docs]) +- Add type hints to media_player (part 2) ([@epenet] - [#64006]) ([sonos docs]) ([plex docs]) ([kodi docs]) ([philips_js docs]) ([squeezebox docs]) +- Use Platform enum in load_platform ([@epenet] - [#63903]) +- Remove constant DEFAULT_CONFIG from alexa tests ([@emontnemery] - [#64031]) ([alexa docs]) +- Update elgato to 3.0.0 ([@frenck] - [#64033]) ([elgato docs]) +- Add setup type hints to group ([@epenet] - [#64002]) ([group docs]) +- Elgato refactoring; add base entity ([@frenck] - [#64034]) ([elgato docs]) +- Remove unused serial number config entry data from Elgato ([@frenck] - [#64035]) ([elgato docs]) +- Simplify Overkiz coordinator (step 2) and address feedback ([@iMicknl] - [#64028]) ([overkiz docs]) +- Upgrade oauth2client to 4.1.3 ([@cdce8p] - [#64044]) ([google docs]) +- Add typing to async_get_handler in demo ([@epenet] - [#64029]) ([demo docs]) +- Update wled to 0.11.0 ([@frenck] - [#64048]) ([wled docs]) +- Add setup type hints to script ([@epenet] - [#64030]) ([script docs]) +- Adjust mailbox type hints ([@epenet] - [#64051]) ([asterisk_mbox docs]) ([asterisk_cdr docs]) +- Fix yamaha discovery ([@epenet] - [#64056]) ([yamaha docs]) +- Pin libcst==0.3.23 ([@frenck] - [#64036]) +- Update featured integrations screenshot in README ([@Hedda] - [#64046]) +- Allow name-only location updates for mobile_app device_tracker ([@zacwest] - [#62243]) ([mobile_app docs]) +- Remove warnings from compensation ([@Petro31] - [#63691]) ([compensation docs]) +- Add support for setting RGB and RGBW values for Twinkly lights ([@RobBie1221] - [#62337]) ([twinkly docs]) +- Keep track of Alexa authorization status ([@emontnemery] - [#63979]) ([alexa docs]) ([cloud docs]) +- Remove Windows workarounds ([@emontnemery] - [#64068]) +- Remove Windows workarounds from wake_on_lan ([@emontnemery] - [#64070]) ([wake_on_lan docs]) +- Remove Windows workarounds from ping ([@emontnemery] - [#64069]) ([ping docs]) +- Remove attributes from vizio state when they don't make sense ([@raman325] - [#64025]) ([vizio docs]) (breaking-change) +- Adjust device_tracker type hints ([@epenet] - [#64054]) ([tomato docs]) ([arris_tg2492lg docs]) +- Don't close HA aiohttp session in Overkiz Config Flow ([@iMicknl] - [#64052]) ([overkiz docs]) +- Run pre-commit script on constraint changes ([@cdce8p] - [#64073]) +- Add gjohansson-ST as codeowner to trafikverket_train ([@gjohansson-ST] - [#64081]) ([trafikverket_train docs]) +- Upgrade vallox-websocket-api to 2.9.0 ([@cdce8p] - [#64055]) ([vallox docs]) +- Enable strict typing for trafikverket_weatherstation ([@gjohansson-ST] - [#64080]) +- Upgrade pyserial-asyncio to 0.6 ([@cdce8p] - [#64041]) ([zha docs]) ([serial docs]) +- Update to goodwe library v0.2.15 ([@mletenay] - [#64089]) ([goodwe docs]) +- Add select entity to Overkiz integration ([@iMicknl] - [#62916]) ([overkiz docs]) +- Fix pre-commit gen_requirements_all files regex ([@cdce8p] - [#64095]) +- Use Platform enum in scaffold templates ([@ludeeus] - [#64091]) +- Address late review of Minor AndroidTV config flow ([@ollo69] - [#64088]) ([androidtv docs]) +- Bump pytradfri to 8.0.1 and fix fan preset mode "Auto" bug ([@ggravlingen] - [#63920]) ([tradfri docs]) +- Add select platform to senseme ([@bdraco] - [#64086]) ([senseme docs]) +- Explicitly allow Mapping type hint in config entry async_update_entry ([@epenet] - [#63986]) ([ps4 docs]) +- Add light platform to LOOKin ([@ANMalko] - [#64076]) ([lookin docs]) (new-platform) +- Add thumbnails to nest media player ([@allenporter] - [#62532]) ([nest docs]) +- Pin python-engineio and python-socketio ([@cdce8p] - [#64074]) +- Ezviz dependancy to 0.2.0.6 ([@RenierM26] - [#64100]) ([ezviz docs]) +- Bump google-nest-sdm to 1.4.0 ([@allenporter] - [#64098]) ([nest docs]) +- Import frontend ([@epenet] - [#64104]) +- Move list to dict in repetier discovery ([@epenet] - [#64001]) ([repetier docs]) +- Move list to dict in supla discovery ([@epenet] - [#63805]) ([supla docs]) +- Rename cloud's AlexaConfig to CloudAlexaConfig ([@emontnemery] - [#64065]) ([cloud docs]) +- Bump aiogithubapi to 22.1.0 ([@ludeeus] - [#64109]) ([github docs]) +- Import webhook ([@epenet] - [#64102]) +- Add type hints to tts ([@epenet] - [#64050]) ([tts docs]) +- Add DeviceInfo to trafikverket_weatherstation ([@gjohansson-ST] - [#64083]) ([trafikverket_weatherstation docs]) +- Cleanup ADS constants and add type hints ([@epenet] - [#63390]) ([ads docs]) +- Import webhook in netatmo ([@epenet] - [#64105]) ([netatmo docs]) +- Deprecate Raspihats (ADR-0019) ([@epenet] - [#64113]) ([raspihats docs]) (breaking-change) +- Bump aprslib to 0.7.0 ([@thecode] - [#64093]) ([aprs docs]) +- Import onboarding ([@epenet] - [#64115]) ([frontend docs]) ([auth docs]) ([onboarding docs]) +- Import cloud ([@epenet] - [#64116]) +- Add setup type hints to raspihats ([@epenet] - [#63988]) ([raspihats docs]) +- Upgrade enturclient to 0.2.3 ([@cdce8p] - [#64121]) ([entur_public_transport docs]) +- Upgrade boto3 to 1.20.24 + aiobotocore to 2.1.0 ([@cdce8p] - [#64045]) ([route53 docs]) ([amazon_polly docs]) ([aws docs]) +- Modernize Elgato tests ([@frenck] - [#64060]) ([elgato docs]) +- Allow browsing favorites in Sonos media browser ([@balloob] - [#64082]) ([sonos docs]) +- Fix initial HomeWizard integration issues ([@DCSBL] - [#63921]) ([homewizard docs]) +- Implement DeviceInfo in smhi ([@gjohansson-ST] - [#64126]) ([smhi docs]) +- Add test cases for Tradfri cover platform ([@ggravlingen] - [#64072]) ([tradfri docs]) +- add @mib1185 as codeowner ([@mib1185] - [#64134]) ([fritz docs]) +- Cleanups in Twinkly code ([@RobBie1221] - [#64139]) ([twinkly docs]) (breaking-change) +- Bump greeclimate to 1.0.2 ([@cmroche] - [#64138]) ([gree docs]) +- Add missing type annotation for launch library ([@DurgNomis-drol] - [#64131]) ([launch_library docs]) +- Add LG webOS Smart TV config flow support ([@thecode] - [#64117]) ([webostv docs]) (breaking-change) +- Guard for timeout errors during wled discovery ([@balloob] - [#64130]) ([wled docs]) +- Add energy and additional sensors to oncue ([@bdraco] - [#64097]) ([oncue docs]) +- Fix package camera snapshot ([@AngellusMortis] - [#64145]) ([unifiprotect docs]) +- Fix media_player power state ([@ANMalko] - [#64136]) ([lookin docs]) +- Code cleanups for lookin ([@bdraco] - [#64106]) ([lookin docs]) +- Add play media URL support to roku ([@ctalkington] - [#64021]) ([roku docs]) +- Use dataclass properties in webostv discovery ([@thecode] - [#64159]) ([webostv docs]) +- Use hass.async_create_task rather than hass.loop.create_task in deconz ([@Kane610] - [#64158]) ([unifi docs]) +- Add test cases for Tradfri fan platform ([@ggravlingen] - [#64135]) ([tradfri docs]) +- Add test cases for Tradfri switch platform ([@ggravlingen] - [#64156]) ([tradfri docs]) +- Add test cases for Tradfri sensor platform ([@ggravlingen] - [#64165]) ([tradfri docs]) +- Fix changed port on Netgear R7000 ([@starkillerOG] - [#64012]) ([netgear docs]) +- Add HomeConnect Refrigerator ([@BraveChicken1] - [#63850]) ([home_connect docs]) +- Set unique id for config entry in smhi ([@gjohansson-ST] - [#63547]) ([smhi docs]) +- Change doorbird relay/IR switch to button ([@flacjacket] - [#63995]) ([doorbird docs]) (breaking-change) +- Add electric vehicle sensors to Mazda integration ([@bdr99] - [#64099]) ([mazda docs]) +- Add TimeCold and TimeWarm programs to HomeConnect dryer ([@Sdahl1234] - [#63330]) ([home_connect docs]) +- Bump google-nest-sdm to 1.5.0 and add nest mp4 clip transcoding to animated gif ([@allenporter] - [#64155]) ([nest docs]) +- Change carbon monoxide device class to CO for deCONZ integration ([@Kane610] - [#64185]) ([deconz docs]) +- Drop aemet isoformat() from timestamps ([@Noltari] - [#62793]) ([aemet docs]) +- Remove myself from CODEOWNERS ([@Noltari] - [#64188]) ([tado docs]) ([ubus docs]) ([aemet docs]) +- Remove unneeded update_before_add from nexia ([@bdraco] - [#64187]) ([nexia docs]) +- Upgrade miflora to 0.7.2 ([@cdce8p] - [#64179]) ([miflora docs]) +- Fix misuse of cast for Shelly Valve ([@chemelli74] - [#64181]) ([shelly docs]) +- Run pre-commit `hassfest` on changes to script files ([@cdce8p] - [#64195]) +- Update iot_class ([@gerard33] - [#64202]) ([dsmr_reader docs]) +- Update nexia climate platform to use newer standards ([@bdraco] - [#64186]) ([nexia docs]) +- Refactor homekit_controller tests to reduce duplication. ([@Jc2k] - [#64198]) +- Move list to dict in iperf3 discovery ([@epenet] - [#64204]) +- Add switch platform to nexia ([@bdraco] - [#64205]) ([nexia docs]) +- Enable strict typing in webostv ([@thecode] - [#64193]) +- Register MAC connection for Elgato devices ([@frenck] - [#64201]) ([elgato docs]) +- Check discovery_info is available and add setup type hints ([@epenet] - [#63782]) ([ebusd docs]) +- Fix core restart due to change in relative imports ([@thecode] - [#64209]) +- Fix bug when starting a RainMachine zone via service call ([@bachya] - [#64213]) ([rainmachine docs]) +- Fix duplicate code in nexia climate platform ([@bdraco] - [#64220]) ([nexia docs]) +- Cleanup code config flow smhi ([@gjohansson-ST] - [#64197]) ([smhi docs]) +- Fix bug with too-long pause durations for RainMachine ([@bachya] - [#64218]) ([rainmachine docs]) +- Add sensor platform to roku ([@ctalkington] - [#64214]) ([roku docs]) (new-platform) +- Fix humidifier state error in HomeKit ([@qqaatw] - [#61432]) ([homekit docs]) +- Defer to camera implementation for non-WebRTC cameras ([@allenporter] - [#63182]) ([nest docs]) +- Bump Glances to 0.3.4 to fix async_timeout passing loop ([@GuyKh] - [#62090]) ([glances docs]) +- Fix tests and add setup type in feedreader ([@epenet] - [#64280]) ([feedreader docs]) +- Fix raspihats callbacks ([@epenet] - [#64122]) ([raspihats docs]) +- WeMo state changes are seen by all coordinator entities ([@esev] - [#64228]) ([wemo docs]) +- Implement entity_descriptions in SIA ([@eavanvalkenburg] - [#63130]) ([sia docs]) +- Add Shelly Gen2 polling for sesnors missing push updates ([@thecode] - [#64171]) ([shelly docs]) +- spelling: components/fritz ([@jsoref] - [#64259]) ([fritz docs]) +- spelling: components/denonavr ([@jsoref] - [#64244]) ([denonavr docs]) +- spelling: components/bond ([@jsoref] - [#64272]) +- spelling: components/fronius ([@jsoref] - [#64274]) ([fronius docs]) +- CI: Add job for `pip check` ([@cdce8p] - [#64058]) +- Bump pyaftership to 21.11.0 ([@ludeeus] - [#64294]) ([aftership docs]) +- Fix comments, improve readability in Cloud ([@emontnemery] - [#64291]) ([cloud docs]) ([google_assistant docs]) +- Fix comments in Alexa ([@emontnemery] - [#64289]) ([alexa docs]) ([cloud docs]) +- Move list to dict in utility-meter discovery ([@epenet] - [#63808]) ([utility_meter docs]) +- Use assignment expression for unload_ok in scaffold templates ([@ludeeus] - [#64286]) +- Bump async-upnp-client to 0.23.4 ([@chishm] - [#64287]) ([upnp docs]) ([yeelight docs]) ([dlna_dmr docs]) ([ssdp docs]) +- spelling: components/elkm1 ([@jsoref] - [#64252]) ([elkm1 docs]) +- Bump pyunifiprotect version to 3.1.1 for UniFi Protect ([@AngellusMortis] - [#64297]) ([unifiprotect docs]) +- spelling: components/azure_event_hub ([@jsoref] - [#64229]) ([azure_event_hub docs]) +- spelling: components/blueprint ([@jsoref] - [#64271]) ([blueprint docs]) +- spelling: components/eafm ([@jsoref] - [#64257]) ([eafm docs]) +- spelling: components/gdacs ([@jsoref] - [#64275]) ([gdacs docs]) +- spelling: components/brother ([@jsoref] - [#64273]) ([brother docs]) +- spelling: components/forecast_solar ([@jsoref] - [#64261]) ([forecast_solar docs]) +- spelling: components/flick_electric ([@jsoref] - [#64262]) ([flick_electric docs]) +- spelling: components/geonetnz_quakes ([@jsoref] - [#64276]) +- spelling: components/demo ([@jsoref] - [#64245]) ([demo docs]) +- spelling: components/accuweather ([@jsoref] - [#64264]) ([accuweather docs]) +- spelling: components/ecovacs ([@jsoref] - [#64253]) ([ecovacs docs]) +- spelling: components/freedompro ([@jsoref] - [#64260]) ([freedompro docs]) +- spelling: components/gogogate2 ([@jsoref] - [#64278]) ([gogogate2 docs]) +- spelling: components/devolo_home_network ([@jsoref] - [#64243]) ([devolo_home_network docs]) +- spelling: components/balboa ([@jsoref] - [#64270]) ([balboa docs]) +- spelling: components/apns ([@jsoref] - [#64269]) ([apns docs]) +- spelling: components/airvisual ([@jsoref] - [#64265]) ([airvisual docs]) +- spelling: components/androidtv ([@jsoref] - [#64267]) +- spelling: components/ecobee ([@jsoref] - [#64255]) ([ecobee docs]) +- spelling: components/emonitor ([@jsoref] - [#64251]) ([emonitor docs]) +- spelling: components/eufy ([@jsoref] - [#64248]) ([eufy docs]) +- spelling: components/fritzbox ([@jsoref] - [#64258]) ([fritzbox docs]) +- spelling: components/climacell ([@jsoref] - [#64240]) ([climacell docs]) +- spelling: components/ambiclimate ([@jsoref] - [#64227]) ([ambiclimate docs]) +- spelling: components/asuswrt ([@jsoref] - [#64233]) ([asuswrt docs]) +- spelling: components/buienradar ([@jsoref] - [#64235]) ([buienradar docs]) +- spelling: components/bmw_connected_drive ([@jsoref] - [#64236]) ([bmw_connected_drive docs]) +- spelling: components/coolmaster ([@jsoref] - [#64237]) ([coolmaster docs]) +- spelling: components/apple_tv ([@jsoref] - [#64234]) ([apple_tv docs]) +- spelling: components/awair ([@jsoref] - [#64230]) ([awair docs]) +- spelling: components/aurora_abb_powerone ([@jsoref] - [#64231]) +- spelling: components/august ([@jsoref] - [#64232]) ([august docs]) +- spelling: components/conversation ([@jsoref] - [#64238]) ([conversation docs]) +- spelling: components/camera ([@jsoref] - [#64242]) ([camera docs]) +- Change value of device_automation constant ([@emontnemery] - [#64296]) +- Add changed states device trigger to media_player entity ([@emontnemery] - [#64304]) ([media_player docs]) +- spelling: components/analytics ([@jsoref] - [#64268]) ([analytics docs]) +- Suppress Alexa state reports when not authorized ([@emontnemery] - [#64064]) ([alexa docs]) ([cloud docs]) +- Add webostv 100% tests cover for triggers ([@thecode] - [#64301]) ([webostv docs]) +- Fix webostv YAML migration failure if the entity is removed ([@thecode] - [#64290]) ([webostv docs]) +- Add switch entity to Overkiz integration ([@iMicknl] - [#64000]) +- Remove Windows workarounds from tests/utils/test_json.py ([@emontnemery] - [#64311]) +- Add Air Quality PPB sensor to deCONZ integration ([@Kane610] - [#64164]) ([deconz docs]) +- Code quality improvements smhi ([@gjohansson-ST] - [#64312]) ([smhi docs]) +- Add additional buttons to Overkiz integration ([@iMicknl] - [#64321]) ([overkiz docs]) +- Address late feedback to Overkiz (move to constants) ([@iMicknl] - [#64324]) ([overkiz docs]) +- Finish deduplicating homekit_controller enumeration tests ([@Jc2k] - [#64306]) ([homekit_controller docs]) +- Add new Binary Sensor description to Overkiz integration ([@iMicknl] - [#64322]) ([overkiz docs]) +- Refactor some sensors and add translations to Overkiz ([@iMicknl] - [#64108]) ([overkiz docs]) +- Cleans up various asserts/type ignores for UniFi Protect ([@AngellusMortis] - [#63824]) ([unifiprotect docs]) +- Add low battery binary sensor to deCONZ integration ([@Kane610] - [#64168]) ([deconz docs]) +- Remove tado from mypy ignored modules ([@epenet] - [#64333]) ([tado docs]) +- spelling: components/airly ([@jsoref] - [#64266]) ([airly docs]) +- Exception handling config flow yale_smart_alarm ([@gjohansson-ST] - [#63623]) ([yale_smart_alarm docs]) +- Add diagnostics integration ([@balloob] - [#64330]) ([default_config docs]) ([diagnostics docs]) (new-integration) +- Add zwave_js support for diagnostics ([@raman325] - [#64336]) ([zwave_js docs]) +- Import tts ([@epenet] - [#64212]) ([tts docs]) ([cast docs]) +- Clean last usages of old config flow handlers decorator ([@frenck] - [#64329]) ([homematicip_cloud docs]) ([hangouts docs]) ([almond docs]) +- Bump google-nest-sdm 1.5.1 ([@allenporter] - [#64334]) ([nest docs]) +- Cleanup nest auth registration, moving out of __init__.py ([@allenporter] - [#63350]) ([nest docs]) +- Enable Alexa state reporting by default ([@emontnemery] - [#63802]) ([cloud docs]) +- Fix media player image url password logged ([@MartinHjelmare] - [#64293]) ([media_player docs]) +- Remove Windows workarounds from frontend ([@emontnemery] - [#64343]) ([frontend docs]) +- Fix webostv media next/previous services ([@thecode] - [#64355]) ([webostv docs]) +- Cleanup mypy ignored modules ([@epenet] - [#64341]) +- Remove integrations from mypy ignored modules ([@epenet] - [#64358]) ([doorbird docs]) ([foscam docs]) ([enphase_envoy docs]) ([fortios docs]) ([flo docs]) +- Remove --daemon and --pid-file option from __main__.py ([@emontnemery] - [#64345]) +- Remove --runner option from __main__.py ([@emontnemery] - [#64347]) +- Bump pypck to 0.7.13 ([@alengwenus] - [#64368]) ([lcn docs]) +- Import configurator ([@epenet] - [#64211]) +- Add discovery support to unifiprotect ([@bdraco] - [#64340]) ([unifiprotect docs]) +- Netgear try all ports ([@starkillerOG] - [#64170]) ([netgear docs]) +- Revamp github integration ([@ludeeus] - [#64190]) ([github docs]) (breaking-change) +- Add two new sensors to Launch Library ([@DurgNomis-drol] - [#64203]) ([launch_library docs]) (breaking-change) +- Add evil genius labs diagnostics ([@balloob] - [#64339]) ([evil_genius_labs docs]) +- Update xknx to 0.19.0 ([@farmio] - [#64379]) ([knx docs]) +- Add diagnostics support to Tuya ([@frenck] - [#64374]) ([tuya docs]) +- Fix unifi discovery, add Dream Machine SE ([@bdraco] - [#64377]) ([unifi docs]) +- Update pre-commit to 2.17.0 ([@frenck] - [#64378]) +- Add daily weather forecasts to Open-Meteo integration ([@frenck] - [#63677]) ([open_meteo docs]) +- Validate operating system is supported ([@emontnemery] - [#64352]) +- Add device registry cleanup to github ([@ludeeus] - [#64380]) ([github docs]) +- Add launch status sensor for launch_library ([@DurgNomis-drol] - [#64382]) ([launch_library docs]) +- Add entity options to entity registry ([@emontnemery] - [#64350]) +- Remove http dependency from system log ([@balloob] - [#64386]) ([system_log docs]) +- Automatically add entry title as name placeholder in reauth ([@frenck] - [#64078]) ([pvoutput docs]) +- Cleanup unifiprotect discovery name ([@bdraco] - [#64389]) ([unifiprotect docs]) +- Bump frontend to 20220118.0 ([@balloob] - [#64388]) ([frontend docs]) +- Bump unifi-discovery to 1.1.0 ([@bdraco] - [#64391]) ([unifiprotect docs]) +- Use unifi direct connect w/ssl verify for unifiprotect when possible ([@bdraco] - [#64395]) ([unifiprotect docs]) +- Fix situation where 'model' can be None (string) in Overkiz ([@iMicknl] - [#64320]) ([overkiz docs]) +- Convert some tests to async and drop usage get_test_home_assistant ([@balloob] - [#64394]) ([microsoft_face docs]) ([camera docs]) ([logbook docs]) ([aprs docs]) +- Add camera play stream support to roku ([@ctalkington] - [#64153]) ([roku docs]) +- Add HomeConnect Freezer ([@BraveChicken1] - [#63851]) ([home_connect docs]) +- Use async_create_task for microsoft_face tests ([@balloob] - [#64409]) ([microsoft_face docs]) +- Bump zwave-js-server-python to 0.34.0 ([@raman325] - [#64407]) ([zwave_js docs]) (breaking-change) +- Add setup type hints (platforms) ([@epenet] - [#64354]) ([zha docs]) ([philips_js docs]) ([denonavr docs]) ([arcam_fmj docs]) +- Unifi protect discovery cleanups ([@bdraco] - [#64413]) ([unifiprotect docs]) +- Remove integrations from mypy ignored modules (part 2) ([@epenet] - [#64367]) +- Use wemo enums in fan entity ([@esev] - [#64397]) ([wemo docs]) +- spelling: components/emulated_hue ([@jsoref] - [#64250]) ([emulated_hue docs]) +- Add launch mission sensor for launch_library ([@DurgNomis-drol] - [#64387]) ([launch_library docs]) +- Add diagnostic information for nest ([@allenporter] - [#64405]) ([nest docs]) +- Clean up Launch Library consts ([@ludeeus] - [#64420]) ([launch_library docs]) +- Make launch library lambdas single line ([@ludeeus] - [#64424]) ([launch_library docs]) +- Remove integrations from mypy ignored modules (part 3) ([@epenet] - [#64414]) ([kodi docs]) ([keenetic_ndms2 docs]) ([litejet docs]) ([kaiterra docs]) ([kulersky docs]) ([motion_blinds docs]) +- Add AQHI sensor for Environment Canada ([@gwww] - [#63644]) ([environment_canada docs]) +- Add diagnostics to the core files ([@epenet] - [#64417]) +- Address late Netgear review comments ([@starkillerOG] - [#64428]) ([netgear docs]) +- Add webostv 100% tests coverage for notify ([@thecode] - [#64412]) ([webostv docs]) +- Convert discovery tests to async ([@balloob] - [#64411]) +- Get rid of name collision in iaqualink tests ([@flz] - [#63642]) ([iaqualink docs]) +- Remove integrations from mypy ignored modules (part 4) ([@epenet] - [#64435]) ([onboarding docs]) ([ness_alarm docs]) ([nuki docs]) ([nws docs]) ([ovo_energy docs]) ([nightscout docs]) +- Add diagnostics to GitHub integration ([@ludeeus] - [#64385]) ([github docs]) +- Fix source ip detection in unifi-discovery ([@bdraco] - [#64419]) ([unifiprotect docs]) +- Add HVAC modes of climate entities to Prometheus exporter ([@rnurgaliyev] - [#62144]) ([prometheus docs]) +- Improved stream url and removed dependency on track numbers ([@Djowie] - [#64079]) ([jellyfin docs]) +- Allow to skip artist level in media hierarchy ([@j-stienstra] - [#64160]) ([jellyfin docs]) +- Move logger to constants ([@iMicknl] - [#64431]) ([overkiz docs]) +- fix: 17track package summary status is not updated when there are no more packages in that summary ([@regevbr] - [#64421]) ([seventeentrack docs]) +- Fix the Android TV volume mute service ([@JeffLIrion] - [#64403]) ([androidtv docs]) +- Bump Lightwave Version - Improved Error Handling ([@ColinRobbins] - [#64452]) ([lightwave docs]) +- Add setup type hints (init) ([@epenet] - [#64351]) +- Signal messenger attachments as bytes support ([@burnsie-la] - [#62311]) ([signal_messenger docs]) +- Catch exceptions when trying to enable Alexa ([@emontnemery] - [#64438]) ([cloud docs]) +- Prevent race when loading cloud config ([@emontnemery] - [#64437]) ([cloud docs]) +- Extract fibaro switch energy attributes into sensors ([@rappenze] - [#63697]) ([fibaro docs]) (breaking-change) +- spelling: components/cast ([@jsoref] - [#64241]) ([cast docs]) +- Clean up AirVisual tests ([@bachya] - [#64402]) ([airvisual docs]) +- Add `restrict_watering` and `unrestrict_watering` services to RainMachine ([@bachya] - [#64219]) ([rainmachine docs]) +- Update shodan to 1.26.1 ([@frenck] - [#64457]) ([shodan docs]) +- Adjust tests for removing github devices ([@ludeeus] - [#64448]) ([github docs]) +- Initial Tuya support for FSD based fans ([@candreacchio] - [#64283]) ([tuya docs]) (new-integration) +- Improve code quality trafikverket_train ([@gjohansson-ST] - [#62677]) ([trafikverket_train docs]) +- Remove ping from mypy ignored modules ([@epenet] - [#64439]) ([ping docs]) +- Add webostv YAML to config flow migration warning ([@thecode] - [#64450]) ([webostv docs]) +- spelling: components/abode ([@jsoref] - [#64263]) ([abode docs]) +- Add diagnostics to KNX ([@farmio] - [#64471]) ([knx docs]) +- Remove somfy from mypy ignore list ([@epenet] - [#64462]) ([somfy docs]) +- Make setup tests async ([@balloob] - [#64456]) +- Add libturbojpeg0 to dev-container ([@mib1185] - [#64466]) +- Add Volumio repeat support ([@m4rkireland] - [#64132]) +- Streamline `hass.data` storage for AirVisual ([@bachya] - [#64476]) ([airvisual docs]) +- Perform some more AirVisual test cleanup ([@bachya] - [#64470]) ([airvisual docs]) +- Address stateless switch feedback in Overkiz integration ([@iMicknl] - [#64430]) ([overkiz docs]) +- Add redacted constant in diagnostics ([@frenck] - [#64473]) ([tuya docs]) ([evil_genius_labs docs]) ([diagnostics docs]) +- Remove verisure from mypy ignore list ([@epenet] - [#64475]) ([verisure docs]) +- Add edl21 sensor state class and device class ([@StephanU] - [#56968]) ([edl21 docs]) +- Small cleanup of Shodan ([@frenck] - [#64467]) ([shodan docs]) +- Use callback for async_cleanup_device_registry ([@ludeeus] - [#64481]) ([github docs]) +- Add diagnostics for the AirVisual integration ([@bachya] - [#64479]) ([airvisual docs]) +- Remove unnecessary AirVisual attribute constants ([@bachya] - [#64483]) ([airvisual docs]) +- Add diagnostics to Overkiz integration ([@iMicknl] - [#64427]) ([overkiz docs]) +- Add diagnostics to Netatmo integration ([@cgtobi] - [#64392]) ([netatmo docs]) +- Clean up Ambient PWS tests ([@bachya] - [#64486]) ([ambient_station docs]) +- Fix attr spelling error in Nest SDM SensorBase ([@iMicknl] - [#64490]) ([nest docs]) +- Add diagnostics to Ambient PWS ([@bachya] - [#64489]) ([ambient_station docs]) ([airvisual docs]) +- Fix incorrect docstring in AirVisual test ([@bachya] - [#64496]) +- Add support for device diagnostics ([@raman325] - [#64344]) ([diagnostics docs]) +- Add explicit branching in AirVisual diagnostics ([@bachya] - [#64493]) ([airvisual docs]) +- Pass device entry to async_get_device_diagnostics instead of device_id ([@raman325] - [#64501]) ([diagnostics docs]) +- Drop slash from media source directories ([@balloob] - [#64499]) ([media_source docs]) +- Add support for checking if an entity is explicitly included in an entity filter ([@bdraco] - [#64463]) +- Remove vera from mypy ignore list ([@epenet] - [#64474]) ([vera docs]) +- Remove sma from mypy ignore list ([@epenet] - [#64510]) ([sma docs]) +- Add entity category support to HomeKit ([@bdraco] - [#64492]) ([homekit docs]) (breaking-change) +- Remove rachio from mypy ignore list ([@epenet] - [#64521]) ([rachio docs]) +- Remove screenlogic from mypy ignore list ([@epenet] - [#64512]) ([screenlogic docs]) +- Strip whitespace in nest cloud project id ([@allenporter] - [#64503]) ([nest docs]) +- Remove ruckus unleashed from mypy ignore list ([@epenet] - [#64513]) ([ruckus_unleashed docs]) +- Fix incorrect preset mode in senseme ([@bdraco] - [#64526]) ([senseme docs]) +- Remove search from mypy ignore list ([@epenet] - [#64507]) ([search docs]) +- Bump unifi-discovery to 1.1.2 to fix exception on missing mac ([@bdraco] - [#64527]) ([unifiprotect docs]) +- Bump aiosenseme to 0.6.1 to fix parser ([@bdraco] - [#64520]) ([senseme docs]) +- Expose UniFi controller configuration url from discovered entry ([@Kane610] - [#64514]) ([unifi docs]) +- Remove sense from mypy ignore list ([@epenet] - [#64508]) ([sense docs]) +- Remove point from mypy ignore list ([@epenet] - [#64524]) ([point docs]) +- Bump aioesphomeapi to 10.7.0 ([@jesserockz] - [#64495]) ([esphome docs]) +- Address late review in screenlogic ([@epenet] - [#64529]) ([screenlogic docs]) +- Fix rtsp-to-webrtc bug in calling client library ([@allenporter] - [#64502]) ([rtsp_to_webrtc docs]) +- Remove pioneer from mypy ignore list ([@epenet] - [#64515]) ([pioneer docs]) +- Remove sharkiq from mypy ignore list ([@epenet] - [#64509]) ([sharkiq docs]) +- Expose Axis device configuration url from discovered entry ([@Kane610] - [#64517]) ([axis docs]) +- Remove plum lightpad from mypy ignore list ([@epenet] - [#64523]) ([plum_lightpad docs]) +- Remove stt from mypy ignore list ([@epenet] - [#64468]) ([stt docs]) +- Remove system_log from mypy ignore list ([@epenet] - [#64469]) ([system_log docs]) +- Remove plaato from mypy ignore list ([@epenet] - [#64516]) ([plaato docs]) +- Add Intellifire Gas Fireplace integration ([@jeeftor] - [#63637]) ([intellifire docs]) (new-integration) +- Remove smartthings from mypy ignore list ([@epenet] - [#64511]) ([smartthings docs]) +- Abort rtsp_to_webrtc config flow on error during add-on discovery ([@allenporter] - [#64500]) ([rtsp_to_webrtc docs]) +- Remove plugwise from mypy ignore list ([@epenet] - [#64525]) ([plugwise docs]) +- Replace whois library in Whois integration ([@frenck] - [#63227]) ([whois docs]) +- Add zwave_js device diagnostics ([@raman325] - [#64504]) +- Import mqtt ([@epenet] - [#64543]) ([owntracks docs]) +- Update pytest-timeout to 2.1.0 ([@frenck] - [#64533]) +- Import webhook in toon ([@epenet] - [#64544]) ([toon docs]) +- Fix braviatv tests doing IO ([@thecode] - [#64549]) ([braviatv docs]) +- Add device diagnostics support to Tuya ([@frenck] - [#64537]) ([tuya docs]) +- Let the new wrapper just extend the `FritzBoxTools` class ([@mib1185] - [#64133]) ([fritz docs]) +- Run scheduled workflows only in the home-assistant organization ([@slovdahl] - [#64085]) +- Import panel_custom ([@epenet] - [#64541]) ([hassio docs]) +- Import camera ([@epenet] - [#64540]) ([google_assistant docs]) ([homekit docs]) ([mobile_app docs]) +- Cleanup logger in sharkiq ([@epenet] - [#64552]) ([sharkiq docs]) +- Expose deCONZ configuration url from discovered entry ([@Kane610] - [#64519]) ([deconz docs]) +- Remove the deprecated discovery_info endpoint ([@ludeeus] - [#64534]) ([api docs]) (breaking-change) +- MQTT Remove unused and not tested code ([@jbouwh] - [#64550]) ([mqtt docs]) +- Address after merge review comments on IntelliFire ([@frenck] - [#64553]) ([intellifire docs]) +- Import auth, hassio and person in onboarding ([@epenet] - [#64542]) ([onboarding docs]) +- Improve code coverage MQTT integration ([@jbouwh] - [#64546]) ([mqtt docs]) +- Address late review in sharkiq config flow ([@epenet] - [#64554]) ([sharkiq docs]) +- Add siren platform to devolo Home Control ([@Shutgun] - [#53400]) ([devolo_home_control docs]) +- Add vicare solar collector and pump information ([@bairnhard] - [#64178]) ([vicare docs]) +- Add dishwasher program to Home Connect Integration ([@jan-loeffler] - [#61237]) ([home_connect docs]) +- Handle missing values in alpha_vantage sensor ([@martin3000] - [#63632]) ([alpha_vantage docs]) +- Tibber diagnostics ([@Danielhiversen] - [#64472]) ([tibber docs]) +- Fix onboarding ([@epenet] - [#64557]) ([onboarding docs]) +- Fix errors when trying to enable Alexa ([@emontnemery] - [#64536]) ([cloud docs]) +- Move CONF_COMMAND_TEMPLATE to .const ([@jbouwh] - [#64558]) ([mqtt docs]) +- Use EntityCategory enum in Overkiz ([@iMicknl] - [#64565]) ([overkiz docs]) +- Convert remaining TTS tests to async ([@balloob] - [#64505]) ([voicerss docs]) ([marytts docs]) ([yandextts docs]) +- Convert remaining image processing tests to async ([@balloob] - [#64506]) ([openalpr_cloud docs]) ([openalpr_local docs]) +- Fix bug for zwave_js diagnostics ([@raman325] - [#64568]) +- Import hassio ([@epenet] - [#64561]) ([http docs]) ([updater docs]) ([hassio docs]) ([ozw docs]) +- Remove default value of async_add_entities in devolo Home Control ([@Shutgun] - [#64574]) ([devolo_home_control docs]) +- Add support for Soma Tilt devices ([@sebfortier2288] - [#49734]) ([soma docs]) +- Fix atag slow tests ([@thecode] - [#64567]) ([atag docs]) +- Remove ring from mypy ignore list ([@epenet] - [#64522]) ([ring docs]) +- Add diagnostics to Renault integration ([@epenet] - [#64531]) ([renault docs]) ([diagnostics docs]) +- Add last_reset for Sense trend sensors ([@kbickar] - [#63490]) ([sense docs]) ([emulated_kasa docs]) +- Implement config flow dnsip ([@gjohansson-ST] - [#62843]) ([dnsip docs]) (breaking-change) +- Add version info to zwave js device diagnostics ([@raman325] - [#64573]) ([zwave_js docs]) +- Convert last media player tests to async ([@balloob] - [#64572]) ([universal docs]) ([blackbird docs]) +- Update wled to 0.12.0 ([@frenck] - [#64580]) ([wled docs]) +- Ignore further ssdp:alive message if connection fails in dlna_dmr ([@chishm] - [#59891]) ([dlna_dmr docs]) +- Add diagnostics support to Sonos ([@jjlawren] - [#64576]) ([sonos docs]) +- Introduce new redact helper ([@balloob] - [#64579]) ([netatmo docs]) ([ambient_station docs]) ([airvisual docs]) ([renault docs]) ([evil_genius_labs docs]) ([diagnostics docs]) +- Mark Switcher as a platinum quality integration ([@thecode] - [#64584]) ([switcher_kis docs]) +- Fix switcher_kis test sleep time patching ([@thecode] - [#64582]) ([switcher_kis docs]) +- Add diagnostics to deCONZ integration ([@Kane610] - [#64585]) ([deconz docs]) +- Add version constraint for google-auth ([@cdce8p] - [#64583]) +- Improve Sonos diagnostics ([@jjlawren] - [#64586]) ([sonos docs]) +- Change webostv iot class to local push ([@thecode] - [#64593]) ([webostv docs]) +- Clean up Flu Near You tests ([@bachya] - [#64575]) ([flunearyou docs]) +- Use return_value in Flu Near You config flow tests ([@bachya] - [#64596]) ([flunearyou docs]) +- Clean up Guardian config flow tests ([@bachya] - [#64598]) +- Clean up IQVIA config flow tests ([@bachya] - [#64601]) ([iqvia docs]) +- Add Aussie Broadband integration ([@nickw444] - [#53552]) ([aussie_broadband docs]) (new-integration) +- Add diagnostics to IQVIA ([@bachya] - [#64602]) ([iqvia docs]) +- Revert "Add version constraint for google-auth (#64583)" ([@allenporter] - [#64605]) +- Add diagnostics to Elexa Guardian ([@bachya] - [#64599]) ([guardian docs]) +- Don't import from integration `.const` ([@bachya] - [#64608]) ([ambient_station docs]) ([airvisual docs]) ([flunearyou docs]) +- Handle WLED devices with CCT channels ([@frenck] - [#64581]) ([wled docs]) +- Bump fiblary3 to 0.1.8 ([@rappenze] - [#64577]) ([fibaro docs]) +- Update Netatmo diagnostics ([@cgtobi] - [#64610]) ([netatmo docs]) +- Add switch platform to HomeWizard Energy ([@DCSBL] - [#64084]) ([homewizard docs]) (new-platform) +- Add ToDoist Assignee option for new task service ([@Lyr3x] - [#63918]) ([todoist docs]) +- Scrape HTML attributes that are not key/val pairs ([@MizterB] - [#58247]) ([scrape docs]) +- Fix incorrect usage of ToggleEntity in switch platforms ([@frenck] - [#64620]) +- Add diagnostics support to TwenteMilieu ([@frenck] - [#64627]) ([twentemilieu docs]) +- Update sentry-dsk to 1.5.3 ([@frenck] - [#64630]) ([sentry docs]) +- Deprecate Apple Push Notification Service (APNS) ([@frenck] - [#64629]) ([apns docs]) (breaking-change) +- Add diagnostics to Brother integration ([@bieniu] - [#64478]) ([brother docs]) +- Attempt to fix flaky upnp test ([@emontnemery] - [#64617]) ([upnp docs]) +- Update hassfest dependency check ([@balloob] - [#64638]) +- Store remote domain in Cloud preferences ([@emontnemery] - [#64532]) ([cloud docs]) +- Attempt to fix flaky nam test ([@emontnemery] - [#64613]) ([nam docs]) +- Add Home Assistant Content user ([@balloob] - [#64337]) ([http docs]) ([websocket_api docs]) ([auth docs]) ([cast docs]) ([media_source docs]) (breaking-change) +- Add DataUpdateCoordinator to Elgato ([@frenck] - [#64642]) ([elgato docs]) +- Add rainforest diagnostics ([@balloob] - [#64647]) ([rainforest_eagle docs]) +- Fix UniFi Protect test warning ([@AngellusMortis] - [#64650]) ([unifiprotect docs]) +- Add note to unifiprotect flow that a local user is required ([@bdraco] - [#64651]) ([unifiprotect docs]) +- Update of the ihcsdk to 2.7.5 ([@dingusdk] - [#64631]) ([ihc docs]) +- Fix flaky upnp test ([@balloob] - [#64656]) ([upnp docs]) +- Add CO2signal diagnostics ([@balloob] - [#64646]) ([co2signal docs]) +- Add diagnostics platform to AVM Fritz!Smarthome ([@mib1185] - [#64657]) ([fritzbox docs]) +- Some tweaks for media source ([@balloob] - [#64641]) ([media_player docs]) ([media_source docs]) +- Add diagnostics to Synology DSM integration ([@mib1185] - [#64480]) ([synology_dsm docs]) +- Feature/voc olinc smart adapter vp3 power measurement ([@beele] - [#64571]) ([homekit_controller docs]) +- Fix tilt-position for HmIPW-DRBL4 ([@danielperna84] - [#64208]) ([homematic docs]) +- Update luftdaten to 0.7.2 ([@frenck] - [#64662]) ([luftdaten docs]) +- Update codespell to 2.1.0 ([@frenck] - [#64661]) ([recorder docs]) ([wemo docs]) +- Allow Sonos to browse and play local media via media browser ([@balloob] - [#64603]) +- Add local media browser to VLC ([@balloob] - [#64655]) ([media_source docs]) ([vlc_telnet docs]) +- Update emoji to 1.6.3 ([@frenck] - [#64663]) ([mobile_app docs]) +- Bump up ZHA dependencies ([@Adminiuga] - [#64676]) ([zha docs]) +- Bump flux_led to fix setting strip order on SK6812RGBW ([@bdraco] - [#64671]) ([flux_led docs]) +- Fix music mode and on with older 0x08 flux_led models ([@bdraco] - [#64672]) ([flux_led docs]) +- rfxtrx: bump to 0.27.1 ([@elupus] - [#64666]) ([rfxtrx docs]) +- Update of the ihcsdk to 2.7.6 ([@dingusdk] - [#64664]) ([ihc docs]) +- bump motionblinds to 0.5.10 ([@starkillerOG] - [#64695]) ([motion_blinds docs]) +- Add diagnostics support to PVOutput ([@frenck] - [#64625]) ([pvoutput docs]) +- Add diagnostics support to Open-Meteo ([@frenck] - [#64645]) ([open_meteo docs]) +- Bump bsblan python lib v0.5.0 ([@liudger] - [#64702]) +- Change ssdp scanning interval to 2 minutes ([@bdraco] - [#64688]) ([ssdp docs]) +- Fix webostv media player ([@thecode] - [#64690]) ([webostv docs]) +- Refactor roku tests ([@ctalkington] - [#64498]) ([roku docs]) +- Add tests for LCN switch platform ([@alengwenus] - [#52590]) ([lcn docs]) +- Remove system info from KNX diagnostic ([@marvin-w] - [#64721]) ([knx docs]) +- Fix small inconsistency in OpenUV data storage ([@bachya] - [#64717]) ([openuv docs]) +- Fix webserver responsiveness where there are a lot of discoveries ([@bdraco] - [#64719]) +- Discard duplicate sonos events ([@jjlawren] - [#64722]) ([sonos docs]) +- Clean up OpenUV config flow tests ([@bachya] - [#64715]) +- Update version requirements for httpcore and anyio ([@uvjustin] - [#64711]) +- Add webostv 100% tests coverage for media player ([@thecode] - [#64723]) ([webostv docs]) +- Add diagnostics platform to Shelly ([@mib1185] - [#64660]) ([shelly docs]) +- Add diagnostics to OpenUV ([@bachya] - [#64716]) ([openuv docs]) +- Motionblinds improvements ([@starkillerOG] - [#64698]) ([motion_blinds docs]) +- Migrate amcrest integration to new async API ([@flacjacket] - [#56294]) ([amcrest docs]) +- Add Device Info to Aussie Broadband ([@Bre77] - [#64673]) ([aussie_broadband docs]) +- Use `_attr_*` properties for Doorbird camera ([@flacjacket] - [#64734]) ([doorbird docs]) +- Make service functions async ([@dingusdk] - [#64705]) ([ihc docs]) +- Update the states of the amcrest camera on every update ([@flacjacket] - [#56284]) ([amcrest docs]) +- Fix MultiDict typing with multidict-6.0.0 ([@bdraco] - [#64733]) +- Add button platform to bond to replace custom services ([@bdraco] - [#64725]) ([bond docs]) (breaking-change) +- Refactor nest test_init_sdm tests to use fixtures with varied config types ([@allenporter] - [#64736]) ([nest docs]) +- Fix flux_led reloading too quickly after an operating mode change ([@bdraco] - [#64591]) ([flux_led docs]) +- Remove system info from deCONZ diagnostics ([@Kane610] - [#64704]) ([deconz docs]) +- Prevent lookin polling when push updates are coming in ([@bdraco] - [#64687]) ([lookin docs]) +- Upgrade rokuecp to 0.11.0 ([@ctalkington] - [#64740]) ([roku docs]) +- Update nest media player device thumbnails ([@allenporter] - [#64738]) ([nest docs]) +- Refactor Tuya DPCode and data type handling ([@frenck] - [#64707]) ([tuya docs]) +- Add diagnostics support to Tailscale ([@frenck] - [#64649]) ([tailscale docs]) +- Add diagnostics support to Sensor.Community ([@frenck] - [#64636]) ([luftdaten docs]) +- Add diagnostics support to Elgato ([@frenck] - [#64652]) ([elgato docs]) +- Add diagnostics to NAM ([@bieniu] - [#64743]) ([nam docs]) +- Add warning when calling deprecated bond services ([@bdraco] - [#64744]) ([bond docs]) +- Improve seperation of lookin udp listener and typing ([@bdraco] - [#64742]) +- Enhancements for diagnostics platform ([@mib1185] - [#64670]) ([diagnostics docs]) +- Clean up Notion config tests ([@bachya] - [#64669]) ([notion docs]) +- Clean up AirVisual config flow tests ([@bachya] - [#64714]) ([airvisual docs]) +- Update pipdeptree to 2.2.1 ([@frenck] - [#64746]) +- Bump tensorflow to be compatible with python3.9 ([@dshokouhi] - [#64732]) ([tensorflow docs]) +- Redact possibly sensitive information in deCONZ diagnostics data ([@Kane610] - [#64754]) ([deconz docs]) +- Allow toggles (switches) state to be None ([@frenck] - [#64621]) (breaking-change) +- Diagnostics extended info adjustment ([@frenck] - [#64752]) ([diagnostics docs]) +- Add command template for MQTT button ([@jbouwh] - [#63838]) ([mqtt docs]) +- Move call_action to AvmWrapper for Fritz ([@chemelli74] - [#64667]) ([fritz docs]) +- Add diagnostics support to UniFi Network integration ([@Kane610] - [#64640]) ([unifi docs]) +- Bump dwdwfsapi to 1.0.5 ([@stephan192] - [#64766]) ([dwd_weather_warnings docs]) +- Add service send command in Tuya Vacuum ([@dougiteixeira] - [#63417]) ([tuya docs]) +- Expose entity device temperature from cluster in ZHA ([@rforro] - [#64189]) ([zha docs]) +- Enable Low Latency HLS (LL-HLS) by default to lower stream latency ([@allenporter] - [#64643]) ([stream docs]) +- Simplify hass data in acmeda ([@tkdrob] - [#62479]) ([acmeda docs]) +- Fix webostv sources import from YAML ([@thecode] - [#64768]) ([webostv docs]) +- Add vicare one-time charge ([@oischinger] - [#64376]) ([vicare docs]) +- Add tests for LCN light platform ([@alengwenus] - [#64741]) ([lcn docs]) +- Fix ESPHome ReconnectLogic to make faster connection when device comes online ([@jesserockz] - [#64697]) ([esphome docs]) +- Clean up RainMachine tests ([@bachya] - [#64785]) +- Add option to select quality of camera snapshots taken from Synology DSM connected cameras ([@mib1185] - [#58306]) ([synology_dsm docs]) +- Use friendly name instead of hostname in Tailscale integration ([@bdr99] - [#64682]) ([tailscale docs]) +- Add HUB_TEST_ACCESSORY_ID const for homekit_controller tests ([@Jc2k] - [#64750]) ([homekit_controller docs]) +- Add diagnostics support to Axis integration ([@Kane610] - [#64637]) ([axis docs]) +- Add diagnostics support for homekit_controller ([@Jc2k] - [#64773]) ([homekit_controller docs]) +- De-duplicate generation of DeviceInfo data in homekit_controller ([@Jc2k] - [#64751]) ([homekit_controller docs]) +- Revert "Don't import from integration `.const` (#64608)" ([@bachya] - [#64793]) ([ambient_station docs]) ([airvisual docs]) ([flunearyou docs]) +- Redact usernames in UniFi diagnostics ([@Kane610] - [#64794]) ([unifi docs]) +- Use whole config entry in deCONZ diagnostics ([@Kane610] - [#64795]) ([deconz docs]) +- Revert fix MultiDict typing with multidict-6.0.0 (#64733) ([@mib1185] - [#64792]) +- Use basic entity attributes in fibaro integration ([@rappenze] - [#64784]) ([fibaro docs]) +- Add support for preset modes to bond fans ([@bdraco] - [#64786]) ([bond docs]) +- Add diagnostics support to roku ([@ctalkington] - [#64729]) ([roku docs]) +- Allow homekit_controller to handle device registry entries for devices with poor serial numbers ([@Jc2k] - [#64749]) ([homekit_controller docs]) +- Bump pysml to 0.0.7 ([@mtdcr] - [#64798]) ([edl21 docs]) +- bump total_connect_client to 2022.1 ([@austinmroczek] - [#64797]) ([totalconnect docs]) +- Add diagnostics support to Verisure ([@frenck] - [#64789]) ([verisure docs]) +- Add diagnostics support to RDW ([@frenck] - [#64787]) +- Add diagnostics support to Stookalert ([@frenck] - [#64747]) ([stookalert docs]) +- Add diagnostics support to CPU Speed ([@frenck] - [#64745]) ([cpuspeed docs]) +- spelling: components/coinbase ([@jsoref] - [#64239]) ([coinbase docs]) +- Update denonavr to version 0.10.10 ([@ol-iver] - [#64805]) ([denonavr docs]) +- Update nest climate and sensor test fixtures ([@allenporter] - [#64800]) ([nest docs]) +- Bump pymazda to 0.3.1 ([@bdr99] - [#64807]) ([mazda docs]) +- Easier identification of devices with homekit_controller ([@Jc2k] - [#64804]) ([homekit_controller docs]) +- Revert "Allow setting entity options with config/entity_registry/update" ([@emontnemery] - [#64693]) +- Start depreciation of custom services in Advantage Air ([@Bre77] - [#58777]) ([advantage_air docs]) (breaking-change) +- Fix unexpected color mode switch in flux_led when brightness is near 0 ([@bdraco] - [#64812]) ([flux_led docs]) +- Bump plexapi to 4.9.0 ([@jjlawren] - [#64818]) ([plex docs]) +- Add webostv 100% tests coverage for init ([@thecode] - [#64801]) ([webostv docs]) +- ESPHome prevent connecting to different hosts when IP reassigned ([@OttoWinter] - [#64559]) ([esphome docs]) +- Update method names reflecting changes in UniFi library ([@Kane610] - [#64817]) ([unifi docs]) +- Tuya: Add support for turning smart heater LEDs on and off ([@alexanv1] - [#64739]) ([tuya docs]) +- Make sensor name consistent with other homekit_controller entity names ([@Jc2k] - [#64821]) ([homekit_controller docs]) +- Bump flux_led to 0.28.11 ([@bdraco] - [#64823]) ([flux_led docs]) +- Add coordinator data to Renault diagnostics ([@epenet] - [#64783]) ([renault docs]) +- Mark webOS TV as a platinum quality integration ([@thecode] - [#64587]) ([webostv docs]) +- Fix DPCode in battery support check for vacuum Tuya ([@dougiteixeira] - [#64806]) ([tuya docs]) +- Bump httpx to 0.21.3 and pin requirements for httpcore, anyio, and h11 ([@uvjustin] - [#64822]) +- Remove source and channel attributes from local version ([@ludeeus] - [#64827]) ([version docs]) (breaking-change) +- Add diagnostics to RainMachine ([@bachya] - [#64788]) ([rainmachine docs]) +- vicare: Fix dynamic unit of measurement ([@oischinger] - [#64782]) ([vicare docs]) +- Add more vicare binary sensors and clean up constants ([@oischinger] - [#64780]) ([vicare docs]) +- Support systems w/o circuits ([@oischinger] - [#64779]) ([vicare docs]) +- vicare: Add support for hybrid devices ([@oischinger] - [#64776]) +- Use shorthand attributes in shelly covers ([@epenet] - [#64829]) ([shelly docs]) +- Increase BleBox timeout ([@maxcanna] - [#64760]) ([blebox docs]) +- Add pylint to pre-commit hooks ([@mib1185] - [#64665]) +- Move autosetup out of init.py ([@dingusdk] - [#64761]) ([ihc docs]) +- Use Etag in GitHub coordinator updates ([@ludeeus] - [#64449]) ([github docs]) +- Add missing voices to Amazon Polly ([@aomann] - [#64708]) +- Add diagnostics to Mazda integration ([@bdr99] - [#64606]) ([mazda docs]) +- Add type hint to RegistryEntry.entity_category ([@epenet] - [#64618]) +- Add long-term battery and discharge sensors for energy panel to kostal_plenticore ([@ngdio] - [#62761]) ([kostal_plenticore docs]) +- Fix import for new AWS aiobotocore lib ([@chemelli74] - [#64769]) +- spelling: components/ezviz ([@jsoref] - [#64247]) ([ezviz docs]) +- Use zeroconf for scanning in apple_tv ([@bdraco] - [#64528]) ([apple_tv docs]) +- Clean up webostv tests ([@thecode] - [#64833]) ([webostv docs]) +- Drop use of deprecated ENTITY_CATEGORIES ([@epenet] - [#64607]) ([alexa docs]) ([cloud docs]) ([google_assistant docs]) ([homekit docs]) +- Add pylint plugin to enforce type hints ([@epenet] - [#64313]) +- Make UniFi bandwidth sensors be about current transfer rather than total transfer ([@Kane610] - [#64701]) ([unifi docs]) +- Only show music files for Cast Audio in media browser ([@balloob] - [#64683]) ([cast docs]) +- Point updates ([@fredrike] - [#64748]) +- Add diagnostics to Nanoleaf ([@ludeeus] - [#64835]) ([nanoleaf docs]) +- Fix error in Tuya diagnostics ([@dougiteixeira] - [#64808]) +- Add Home Connect CookProcessor (Bosch Cookit) ([@noxhirsch] - [#62445]) ([home_connect docs]) +- Bump soco to 0.26.0 ([@jjlawren] - [#64819]) ([sonos docs]) +- Add a reboot button for ONVIF devices ([@esev] - [#61522]) ([onvif docs]) +- UniFi events aren't reliable for device tracker usage, use last_seen instead ([@Kane610] - [#64147]) ([unifi docs]) +- Fix units not being pulled from source sensor ([@rsteckler] - [#63639]) ([integration docs]) +- Add entity description support to WHOIS integration ([@frenck] - [#64619]) ([whois docs]) +- Teach TemplateEntity entity name ([@emontnemery] - [#62175]) ([template docs]) +- Clean up ReCollect Waste config flow tests ([@bachya] - [#64813]) ([recollect_waste docs]) +- Add diagnostics to Notion ([@bachya] - [#64713]) ([notion docs]) +- Add diagnostics to Flu Near You ([@bachya] - [#64597]) ([flunearyou docs]) +- Add diagnostics to ReCollect Waste ([@bachya] - [#64814]) ([recollect_waste docs]) +- Add GPS direction to BMW ConnectedDrive device_tracker ([@rikroe] - [#63744]) ([bmw_connected_drive docs]) +- Render icon and picture templates at setup ([@emontnemery] - [#64838]) ([template docs]) +- Clean up post-merge review comments ([@bachya] - [#64842]) ([flunearyou docs]) ([notion docs]) +- Clarify cloud docstring ([@emontnemery] - [#64841]) ([cloud docs]) +- Allow roku to browse and play local media ([@ctalkington] - [#64799]) ([roku docs]) +- Improve tests for Overkiz config flow ([@iMicknl] - [#64624]) +- Fix bond buttons where an argument is required ([@bdraco] - [#64781]) ([bond docs]) +- Use entity_description in shelly rest sensors ([@epenet] - [#64843]) ([shelly docs]) +- Add additional energy sensors to Eve Energy ([@Jc2k] - [#64826]) ([homekit_controller docs]) +- Cleanup GitHub sensor classes and descriptions ([@ludeeus] - [#64853]) ([github docs]) +- Add data update coordinator to Whois ([@frenck] - [#64846]) ([whois docs]) +- Adjust pylint plugin to enforce platform type hints ([@epenet] - [#64836]) +- Add cover platform to Overkiz integration ([@iMicknl] - [#64564]) ([overkiz docs]) (new-platform) +- Add diagnostics support to Whois ([@frenck] - [#64855]) ([whois docs]) +- Add whois diagnostics to coveragerc ([@ludeeus] - [#64857]) +- Add additional sensors to Whois ([@frenck] - [#64854]) ([whois docs]) +- Bump aioshelly to 1.0.8 ([@thecode] - [#64864]) ([shelly docs]) +- Create tasks to load Amcrest platforms ([@flacjacket] - [#64848]) ([amcrest docs]) +- Address late review in entity registry ([@epenet] - [#64851]) +- Add support for converting to and from mmHg ([@emontnemery] - [#64844]) +- Add diagnostics to Launch Library ([@ludeeus] - [#64871]) ([launch_library docs]) +- Avoid creating bond stop action button when there are no other buttons ([@bdraco] - [#64869]) ([bond docs]) +- Clean up Tile config flow tests ([@bachya] - [#64866]) ([tile docs]) +- Clean up Ridwell config flow tests ([@bachya] - [#64858]) ([ridwell docs]) +- Teach TemplateEntity unique_id ([@emontnemery] - [#64837]) ([template docs]) +- Bump plexapi to 4.9.1 ([@jjlawren] - [#64872]) ([plex docs]) +- Bump version pyunifiprotect to 3.2.0 ([@AngellusMortis] - [#64874]) +- Add basic Doorlock support for UniFi protect ([@AngellusMortis] - [#64877]) ([unifiprotect docs]) +- Bump frontend to 20220124.0 ([@balloob] - [#64878]) ([frontend docs]) +- Adds enabled entity_ids associated with each speaker ([@jjlawren] - [#64876]) +- Remove unused fixture in RainMachine config flow test ([@bachya] - [#64881]) ([rainmachine docs]) +- Add outlets to UniFi switch platform ([@Kane610] - [#64859]) ([unifi docs]) +- Fix Shelly climate entity state ([@bieniu] - [#64756]) ([shelly docs]) +- Bump aiodiscover to 1.4.7 to fix finding the gateway on MacOS ([@bdraco] - [#64893]) ([dhcp docs]) +- Changing the Return to home in Tuya vacuum ([@dougiteixeira] - [#64810]) ([tuya docs]) +- Add binary sensor for Vallox post heater ([@viiru-] - [#59762]) ([vallox docs]) (new-platform) +- Bump rtsp-to-webrtc to 0.5.0 (diagnostics support) ([@allenporter] - [#64889]) ([rtsp_to_webrtc docs]) +- Add init tests for Whois ([@frenck] - [#64862]) ([whois docs]) +- Refactor Tuya Fans ([@frenck] - [#64765]) ([tuya docs]) +- Clean up WattTime config flow tests ([@bachya] - [#64885]) ([watttime docs]) +- Replace Synology DSM services with buttons ([@mib1185] - [#57352]) ([synology_dsm docs]) (breaking-change) (new-platform) +- Add event statistics to Sonos diagnostics ([@jjlawren] - [#64845]) ([sonos docs]) +- Update pylint to 2.12.2 ([@frenck] - [#64896]) +- Fix extra data for AWS sns service ([@chemelli74] - [#64771]) ([aws docs]) +- Include entity_id in Alexa state report error log ([@emontnemery] - [#64898]) ([alexa docs]) +- Add support for DS2760 1-Wire TypeK Thermocouple ([@droberg] - [#63222]) ([onewire docs]) +- Ignore draft releases for GitHub sensor ([@ludeeus] - [#64906]) ([github docs]) +- Use Integration properties for custom integration listing in diagnostics ([@ludeeus] - [#64908]) ([diagnostics docs]) +- Use shorthand attributes in shelly light ([@epenet] - [#64831]) ([shelly docs]) +- Use entity_description in shelly rpc sensors ([@epenet] - [#64895]) ([shelly docs]) +- Add diagnostics to UptimeRobot ([@ludeeus] - [#64905]) ([uptimerobot docs]) +- Add diagnostics for Coinbase ([@TomBrien] - [#64900]) +- Fix duplicate metrics in prometheus ([@alim4r] - [#61355]) ([prometheus docs]) +- Add binary sensor for smoke alarm test state ([@Kane610] - [#64873]) ([deconz docs]) +- Update _TrackStateChangeFiltered entity listener with new entities ([@emontnemery] - [#64909]) ([geo_location docs]) +- Adjust pylint plugin to enforce device_tracker type hints ([@epenet] - [#64903]) +- Bump rflink to 0.0.62 ([@thecode] - [#64911]) ([rflink docs]) +- Add lock support for unifiprotect Doorlock ([@AngellusMortis] - [#64882]) ([unifiprotect docs]) (new-platform) +- Add full test coverage to Whois ([@frenck] - [#64899]) ([whois docs]) +- Add zeroconf to overkiz integration ([@egguy] - [#64907]) ([overkiz docs]) +- Add dhcp discovery to senseme ([@bdraco] - [#64894]) ([senseme docs]) +- Bump home-assistant/wheels to 2021.01 to pick up grpc changes ([@allenporter] - [#64917]) +- Bump ZHA quirks to 0.0.66 ([@dmulcahey] - [#64915]) ([zha docs]) +- Add Elgato hw version to device info ([@frenck] - [#64922]) ([elgato docs]) +- Bump pylaunches to 1.3.0 ([@DurgNomis-drol] - [#64923]) ([launch_library docs]) +- Allow browsing the Spotify media player in Sonos ([@balloob] - [#64921]) ([sonos docs]) ([spotify docs]) +- Add "Recommended" and radio station support to Plex media browser ([@jjlawren] - [#64057]) ([plex docs]) +- Bump pyoverkiz to 1.3.0 in Overkiz integration (fixes auth issues) ([@iMicknl] - [#64937]) ([overkiz docs]) +- Add reauth flow to Overkiz integration ([@iMicknl] - [#64622]) ([overkiz docs]) +- Add WLED hw version to device info ([@frenck] - [#64924]) ([wled docs]) +- Create zone bypass switches for DSC panels ([@ufodone] - [#63200]) ([envisalink docs]) (new-platform) +- Add per-device diagnostics to Sonos ([@jjlawren] - [#64912]) ([sonos docs]) +- Add state class to screenlogic sensors ([@bdraco] - [#64941]) ([screenlogic docs]) +- Add state class to powerwall charge sensor ([@bdraco] - [#64939]) ([powerwall docs]) +- Add state class to hunterdouglas_powerview ([@bdraco] - [#64936]) ([hunterdouglas_powerview docs]) +- Small cleanups to gogogate2 ([@bdraco] - [#64935]) ([gogogate2 docs]) +- Add state class to emonitor sensors ([@bdraco] - [#64934]) ([emonitor docs]) +- Add state class to nexia sensors ([@bdraco] - [#64932]) ([nexia docs]) +- Add state classes to august sensors ([@bdraco] - [#64931]) ([august docs]) +- Catch all exceptions on import component/platform ([@balloob] - [#64930]) +- Add 'compile translations' task to VSCode tasks ([@iMicknl] - [#64933]) +- Decouple initial refreshes in setup for Environment Canada ([@gwww] - [#64946]) ([environment_canada docs]) +- Use local Sonos API for Plex music playback ([@jjlawren] - [#63357]) ([sonos docs]) ([cast docs]) ([plex docs]) +- Add support for TCP tunneling connections to KNX ([@marvin-w] - [#64928]) ([knx docs]) +- Add diagnostics to Tile ([@bachya] - [#64875]) ([tile docs]) +- Add diagnostics to Ridwell ([@bachya] - [#64863]) ([ridwell docs]) +- Expose if HTTP is configured for SSL ([@balloob] - [#64940]) ([cloud docs]) +- Change the name of the vacuum switch voice ([@dougiteixeira] - [#64948]) +- Some media source things ([@balloob] - [#64954]) +- Limit GitHub API calls during setup ([@ludeeus] - [#64956]) ([github docs]) +- Update home-assistant/wheels to 2021.01.2 ([@frenck] - [#64958]) +- Cleanup tests for AWS ([@chemelli74] - [#64943]) ([aws docs]) +- Add unique_id to modbus entities ([@Tathar] - [#64634]) ([modbus docs]) +- Enable `no_implicit_reexport` for core files [mypy] ([@cdce8p] - [#63820]) +- Add solax config flow ([@tokenize47] - [#56620]) ([solax docs]) +- Prevent race when loading cloud config ([@emontnemery] - [#64901]) ([cloud docs]) +- Add backlight controls for Tuya curtain switches ([@frenck] - [#64961]) ([tuya docs]) +- Set entity category on Tuya backlights ([@frenck] - [#64962]) ([tuya docs]) +- Fix send command in vacuum Tuya ([@dougiteixeira] - [#64949]) ([tuya docs]) +- Fix use of implicit re-export in env canada ([@frenck] - [#64964]) ([environment_canada docs]) +- Add next starship launch sensor to launch_library ([@DurgNomis-drol] - [#64929]) ([launch_library docs]) +- Complementing the Tuya Fan (fs) category ([@dougiteixeira] - [#64947]) ([tuya docs]) +- Use entity_description in shelly block sensors ([@epenet] - [#64897]) ([shelly docs]) +- Add starship event sensor ([@DurgNomis-drol] - [#64965]) ([launch_library docs]) +- Correct netatmo startup ([@emontnemery] - [#64970]) ([netatmo docs]) +- Drop owntracks import flow ([@emontnemery] - [#64967]) ([owntracks docs]) +- Add diagnostics to WattTime ([@bachya] - [#64887]) ([watttime docs]) +- Fix custom message for UniFi Protect doorbell select ([@AngellusMortis] - [#64971]) ([unifiprotect docs]) +- Add IntelliFire sensors ([@jeeftor] - [#64600]) ([intellifire docs]) (new-platform) +- Check for empty release array ([@ludeeus] - [#64973]) ([github docs]) +- Add detailed status for UptimeRobot ([@chemelli74] - [#64879]) ([uptimerobot docs]) (new-platform) +- Bump pyoverkiz to 1.3.1 (to fix bugs) ([@iMicknl] - [#64979]) ([overkiz docs]) +- Fix battery sensor in Overkiz integration ([@iMicknl] - [#64980]) ([overkiz docs]) +- Change zone's state to be number of person entities in the zone ([@emontnemery] - [#64910]) ([zone docs]) +- Store new spotify client in hass.data ([@balloob] - [#64984]) ([spotify docs]) +- Only log exception in GitHub when something unexpected raised ([@ludeeus] - [#64974]) ([github docs]) +- Fix Shelly HT invalid value on sensor error ([@thecode] - [#64982]) ([shelly docs]) +- Disable google_assistant local SDK if SSL is enabled ([@emontnemery] - [#64983]) ([google_assistant docs]) +- Fix circles in person integration ([@balloob] - [#64991]) ([zone docs]) +- Update frontend to 20220126.0 ([@bramkragten] - [#64990]) ([frontend docs]) +- Support Plex in Sonos media browser ([@jjlawren] - [#64951]) ([sonos docs]) ([plex docs]) +- Support Plex in Cast media browser ([@jjlawren] - [#64994]) ([cast docs]) +- Fix media classes ([@balloob] - [#64993]) ([sonos docs]) +- Abort webhook flow when not connected to home assistant cloud ([@emontnemery] - [#64963]) +- Fix Plex media class in Cast media browser ([@balloob] - [#64995]) ([cast docs]) +- Make toon fall back to webhooks if cloud is not available ([@emontnemery] - [#64981]) ([toon docs]) +- Abort rachio config entry setup when not connected to cloud ([@emontnemery] - [#64975]) ([rachio docs]) +- Abort plaato flows when not connected to home assistant cloud ([@emontnemery] - [#64969]) ([plaato docs]) +- Abort owntracks config flow when not connected to home assistant cloud ([@emontnemery] - [#64968]) ([owntracks docs]) + + +{% enddetails %} + +[#49734]: https://github.com/home-assistant/core/pull/49734 +[#52590]: https://github.com/home-assistant/core/pull/52590 +[#53400]: https://github.com/home-assistant/core/pull/53400 +[#53552]: https://github.com/home-assistant/core/pull/53552 +[#53745]: https://github.com/home-assistant/core/pull/53745 +[#54097]: https://github.com/home-assistant/core/pull/54097 +[#54444]: https://github.com/home-assistant/core/pull/54444 +[#54586]: https://github.com/home-assistant/core/pull/54586 +[#54642]: https://github.com/home-assistant/core/pull/54642 +[#55264]: https://github.com/home-assistant/core/pull/55264 +[#55812]: https://github.com/home-assistant/core/pull/55812 +[#56080]: https://github.com/home-assistant/core/pull/56080 +[#56284]: https://github.com/home-assistant/core/pull/56284 +[#56294]: https://github.com/home-assistant/core/pull/56294 +[#56299]: https://github.com/home-assistant/core/pull/56299 +[#56620]: https://github.com/home-assistant/core/pull/56620 +[#56647]: https://github.com/home-assistant/core/pull/56647 +[#56968]: https://github.com/home-assistant/core/pull/56968 +[#57352]: https://github.com/home-assistant/core/pull/57352 +[#57673]: https://github.com/home-assistant/core/pull/57673 +[#58198]: https://github.com/home-assistant/core/pull/58198 +[#58247]: https://github.com/home-assistant/core/pull/58247 +[#58306]: https://github.com/home-assistant/core/pull/58306 +[#58503]: https://github.com/home-assistant/core/pull/58503 +[#58544]: https://github.com/home-assistant/core/pull/58544 +[#58596]: https://github.com/home-assistant/core/pull/58596 +[#58615]: https://github.com/home-assistant/core/pull/58615 +[#58665]: https://github.com/home-assistant/core/pull/58665 +[#58699]: https://github.com/home-assistant/core/pull/58699 +[#58724]: https://github.com/home-assistant/core/pull/58724 +[#58745]: https://github.com/home-assistant/core/pull/58745 +[#58761]: https://github.com/home-assistant/core/pull/58761 +[#58777]: https://github.com/home-assistant/core/pull/58777 +[#58806]: https://github.com/home-assistant/core/pull/58806 +[#58837]: https://github.com/home-assistant/core/pull/58837 +[#58844]: https://github.com/home-assistant/core/pull/58844 +[#58917]: https://github.com/home-assistant/core/pull/58917 +[#58964]: https://github.com/home-assistant/core/pull/58964 +[#59205]: https://github.com/home-assistant/core/pull/59205 +[#59213]: https://github.com/home-assistant/core/pull/59213 +[#59309]: https://github.com/home-assistant/core/pull/59309 +[#59321]: https://github.com/home-assistant/core/pull/59321 +[#59341]: https://github.com/home-assistant/core/pull/59341 +[#59660]: https://github.com/home-assistant/core/pull/59660 +[#59762]: https://github.com/home-assistant/core/pull/59762 +[#59781]: https://github.com/home-assistant/core/pull/59781 +[#59869]: https://github.com/home-assistant/core/pull/59869 +[#59891]: https://github.com/home-assistant/core/pull/59891 +[#60019]: https://github.com/home-assistant/core/pull/60019 +[#60063]: https://github.com/home-assistant/core/pull/60063 +[#60080]: https://github.com/home-assistant/core/pull/60080 +[#60156]: https://github.com/home-assistant/core/pull/60156 +[#60193]: https://github.com/home-assistant/core/pull/60193 +[#60327]: https://github.com/home-assistant/core/pull/60327 +[#60337]: https://github.com/home-assistant/core/pull/60337 +[#60379]: https://github.com/home-assistant/core/pull/60379 +[#60388]: https://github.com/home-assistant/core/pull/60388 +[#60414]: https://github.com/home-assistant/core/pull/60414 +[#60426]: https://github.com/home-assistant/core/pull/60426 +[#60436]: https://github.com/home-assistant/core/pull/60436 +[#60437]: https://github.com/home-assistant/core/pull/60437 +[#60445]: https://github.com/home-assistant/core/pull/60445 +[#60451]: https://github.com/home-assistant/core/pull/60451 +[#60645]: https://github.com/home-assistant/core/pull/60645 +[#60682]: https://github.com/home-assistant/core/pull/60682 +[#60900]: https://github.com/home-assistant/core/pull/60900 +[#60909]: https://github.com/home-assistant/core/pull/60909 +[#60933]: https://github.com/home-assistant/core/pull/60933 +[#60935]: https://github.com/home-assistant/core/pull/60935 +[#60936]: https://github.com/home-assistant/core/pull/60936 +[#60937]: https://github.com/home-assistant/core/pull/60937 +[#60940]: https://github.com/home-assistant/core/pull/60940 +[#60942]: https://github.com/home-assistant/core/pull/60942 +[#60943]: https://github.com/home-assistant/core/pull/60943 +[#60944]: https://github.com/home-assistant/core/pull/60944 +[#60948]: https://github.com/home-assistant/core/pull/60948 +[#60951]: https://github.com/home-assistant/core/pull/60951 +[#60956]: https://github.com/home-assistant/core/pull/60956 +[#60975]: https://github.com/home-assistant/core/pull/60975 +[#60993]: https://github.com/home-assistant/core/pull/60993 +[#60997]: https://github.com/home-assistant/core/pull/60997 +[#60999]: https://github.com/home-assistant/core/pull/60999 +[#61004]: https://github.com/home-assistant/core/pull/61004 +[#61006]: https://github.com/home-assistant/core/pull/61006 +[#61007]: https://github.com/home-assistant/core/pull/61007 +[#61008]: https://github.com/home-assistant/core/pull/61008 +[#61009]: https://github.com/home-assistant/core/pull/61009 +[#61012]: https://github.com/home-assistant/core/pull/61012 +[#61013]: https://github.com/home-assistant/core/pull/61013 +[#61014]: https://github.com/home-assistant/core/pull/61014 +[#61015]: https://github.com/home-assistant/core/pull/61015 +[#61016]: https://github.com/home-assistant/core/pull/61016 +[#61017]: https://github.com/home-assistant/core/pull/61017 +[#61021]: https://github.com/home-assistant/core/pull/61021 +[#61032]: https://github.com/home-assistant/core/pull/61032 +[#61049]: https://github.com/home-assistant/core/pull/61049 +[#61065]: https://github.com/home-assistant/core/pull/61065 +[#61068]: https://github.com/home-assistant/core/pull/61068 +[#61072]: https://github.com/home-assistant/core/pull/61072 +[#61078]: https://github.com/home-assistant/core/pull/61078 +[#61089]: https://github.com/home-assistant/core/pull/61089 +[#61090]: https://github.com/home-assistant/core/pull/61090 +[#61094]: https://github.com/home-assistant/core/pull/61094 +[#61098]: https://github.com/home-assistant/core/pull/61098 +[#61100]: https://github.com/home-assistant/core/pull/61100 +[#61104]: https://github.com/home-assistant/core/pull/61104 +[#61107]: https://github.com/home-assistant/core/pull/61107 +[#61109]: https://github.com/home-assistant/core/pull/61109 +[#61130]: https://github.com/home-assistant/core/pull/61130 +[#61132]: https://github.com/home-assistant/core/pull/61132 +[#61137]: https://github.com/home-assistant/core/pull/61137 +[#61138]: https://github.com/home-assistant/core/pull/61138 +[#61141]: https://github.com/home-assistant/core/pull/61141 +[#61146]: https://github.com/home-assistant/core/pull/61146 +[#61149]: https://github.com/home-assistant/core/pull/61149 +[#61153]: https://github.com/home-assistant/core/pull/61153 +[#61155]: https://github.com/home-assistant/core/pull/61155 +[#61157]: https://github.com/home-assistant/core/pull/61157 +[#61161]: https://github.com/home-assistant/core/pull/61161 +[#61167]: https://github.com/home-assistant/core/pull/61167 +[#61168]: https://github.com/home-assistant/core/pull/61168 +[#61170]: https://github.com/home-assistant/core/pull/61170 +[#61172]: https://github.com/home-assistant/core/pull/61172 +[#61177]: https://github.com/home-assistant/core/pull/61177 +[#61179]: https://github.com/home-assistant/core/pull/61179 +[#61187]: https://github.com/home-assistant/core/pull/61187 +[#61192]: https://github.com/home-assistant/core/pull/61192 +[#61198]: https://github.com/home-assistant/core/pull/61198 +[#61200]: https://github.com/home-assistant/core/pull/61200 +[#61215]: https://github.com/home-assistant/core/pull/61215 +[#61218]: https://github.com/home-assistant/core/pull/61218 +[#61222]: https://github.com/home-assistant/core/pull/61222 +[#61231]: https://github.com/home-assistant/core/pull/61231 +[#61237]: https://github.com/home-assistant/core/pull/61237 +[#61242]: https://github.com/home-assistant/core/pull/61242 +[#61243]: https://github.com/home-assistant/core/pull/61243 +[#61244]: https://github.com/home-assistant/core/pull/61244 +[#61245]: https://github.com/home-assistant/core/pull/61245 +[#61246]: https://github.com/home-assistant/core/pull/61246 +[#61247]: https://github.com/home-assistant/core/pull/61247 +[#61248]: https://github.com/home-assistant/core/pull/61248 +[#61249]: https://github.com/home-assistant/core/pull/61249 +[#61250]: https://github.com/home-assistant/core/pull/61250 +[#61255]: https://github.com/home-assistant/core/pull/61255 +[#61256]: https://github.com/home-assistant/core/pull/61256 +[#61258]: https://github.com/home-assistant/core/pull/61258 +[#61259]: https://github.com/home-assistant/core/pull/61259 +[#61260]: https://github.com/home-assistant/core/pull/61260 +[#61261]: https://github.com/home-assistant/core/pull/61261 +[#61262]: https://github.com/home-assistant/core/pull/61262 +[#61263]: https://github.com/home-assistant/core/pull/61263 +[#61264]: https://github.com/home-assistant/core/pull/61264 +[#61265]: https://github.com/home-assistant/core/pull/61265 +[#61266]: https://github.com/home-assistant/core/pull/61266 +[#61268]: https://github.com/home-assistant/core/pull/61268 +[#61270]: https://github.com/home-assistant/core/pull/61270 +[#61271]: https://github.com/home-assistant/core/pull/61271 +[#61272]: https://github.com/home-assistant/core/pull/61272 +[#61273]: https://github.com/home-assistant/core/pull/61273 +[#61274]: https://github.com/home-assistant/core/pull/61274 +[#61275]: https://github.com/home-assistant/core/pull/61275 +[#61276]: https://github.com/home-assistant/core/pull/61276 +[#61278]: https://github.com/home-assistant/core/pull/61278 +[#61279]: https://github.com/home-assistant/core/pull/61279 +[#61280]: https://github.com/home-assistant/core/pull/61280 +[#61281]: https://github.com/home-assistant/core/pull/61281 +[#61282]: https://github.com/home-assistant/core/pull/61282 +[#61284]: https://github.com/home-assistant/core/pull/61284 +[#61285]: https://github.com/home-assistant/core/pull/61285 +[#61288]: https://github.com/home-assistant/core/pull/61288 +[#61289]: https://github.com/home-assistant/core/pull/61289 +[#61290]: https://github.com/home-assistant/core/pull/61290 +[#61291]: https://github.com/home-assistant/core/pull/61291 +[#61292]: https://github.com/home-assistant/core/pull/61292 +[#61294]: https://github.com/home-assistant/core/pull/61294 +[#61295]: https://github.com/home-assistant/core/pull/61295 +[#61309]: https://github.com/home-assistant/core/pull/61309 +[#61313]: https://github.com/home-assistant/core/pull/61313 +[#61314]: https://github.com/home-assistant/core/pull/61314 +[#61315]: https://github.com/home-assistant/core/pull/61315 +[#61316]: https://github.com/home-assistant/core/pull/61316 +[#61318]: https://github.com/home-assistant/core/pull/61318 +[#61319]: https://github.com/home-assistant/core/pull/61319 +[#61320]: https://github.com/home-assistant/core/pull/61320 +[#61321]: https://github.com/home-assistant/core/pull/61321 +[#61322]: https://github.com/home-assistant/core/pull/61322 +[#61323]: https://github.com/home-assistant/core/pull/61323 +[#61324]: https://github.com/home-assistant/core/pull/61324 +[#61325]: https://github.com/home-assistant/core/pull/61325 +[#61326]: https://github.com/home-assistant/core/pull/61326 +[#61327]: https://github.com/home-assistant/core/pull/61327 +[#61328]: https://github.com/home-assistant/core/pull/61328 +[#61329]: https://github.com/home-assistant/core/pull/61329 +[#61330]: https://github.com/home-assistant/core/pull/61330 +[#61331]: https://github.com/home-assistant/core/pull/61331 +[#61332]: https://github.com/home-assistant/core/pull/61332 +[#61333]: https://github.com/home-assistant/core/pull/61333 +[#61334]: https://github.com/home-assistant/core/pull/61334 +[#61335]: https://github.com/home-assistant/core/pull/61335 +[#61337]: https://github.com/home-assistant/core/pull/61337 +[#61339]: https://github.com/home-assistant/core/pull/61339 +[#61340]: https://github.com/home-assistant/core/pull/61340 +[#61341]: https://github.com/home-assistant/core/pull/61341 +[#61342]: https://github.com/home-assistant/core/pull/61342 +[#61343]: https://github.com/home-assistant/core/pull/61343 +[#61344]: https://github.com/home-assistant/core/pull/61344 +[#61345]: https://github.com/home-assistant/core/pull/61345 +[#61346]: https://github.com/home-assistant/core/pull/61346 +[#61348]: https://github.com/home-assistant/core/pull/61348 +[#61349]: https://github.com/home-assistant/core/pull/61349 +[#61350]: https://github.com/home-assistant/core/pull/61350 +[#61351]: https://github.com/home-assistant/core/pull/61351 +[#61352]: https://github.com/home-assistant/core/pull/61352 +[#61353]: https://github.com/home-assistant/core/pull/61353 +[#61354]: https://github.com/home-assistant/core/pull/61354 +[#61355]: https://github.com/home-assistant/core/pull/61355 +[#61357]: https://github.com/home-assistant/core/pull/61357 +[#61359]: https://github.com/home-assistant/core/pull/61359 +[#61361]: https://github.com/home-assistant/core/pull/61361 +[#61362]: https://github.com/home-assistant/core/pull/61362 +[#61363]: https://github.com/home-assistant/core/pull/61363 +[#61371]: https://github.com/home-assistant/core/pull/61371 +[#61372]: https://github.com/home-assistant/core/pull/61372 +[#61374]: https://github.com/home-assistant/core/pull/61374 +[#61375]: https://github.com/home-assistant/core/pull/61375 +[#61376]: https://github.com/home-assistant/core/pull/61376 +[#61377]: https://github.com/home-assistant/core/pull/61377 +[#61378]: https://github.com/home-assistant/core/pull/61378 +[#61379]: https://github.com/home-assistant/core/pull/61379 +[#61380]: https://github.com/home-assistant/core/pull/61380 +[#61381]: https://github.com/home-assistant/core/pull/61381 +[#61382]: https://github.com/home-assistant/core/pull/61382 +[#61383]: https://github.com/home-assistant/core/pull/61383 +[#61385]: https://github.com/home-assistant/core/pull/61385 +[#61386]: https://github.com/home-assistant/core/pull/61386 +[#61387]: https://github.com/home-assistant/core/pull/61387 +[#61388]: https://github.com/home-assistant/core/pull/61388 +[#61389]: https://github.com/home-assistant/core/pull/61389 +[#61390]: https://github.com/home-assistant/core/pull/61390 +[#61391]: https://github.com/home-assistant/core/pull/61391 +[#61400]: https://github.com/home-assistant/core/pull/61400 +[#61423]: https://github.com/home-assistant/core/pull/61423 +[#61424]: https://github.com/home-assistant/core/pull/61424 +[#61425]: https://github.com/home-assistant/core/pull/61425 +[#61428]: https://github.com/home-assistant/core/pull/61428 +[#61431]: https://github.com/home-assistant/core/pull/61431 +[#61432]: https://github.com/home-assistant/core/pull/61432 +[#61434]: https://github.com/home-assistant/core/pull/61434 +[#61436]: https://github.com/home-assistant/core/pull/61436 +[#61437]: https://github.com/home-assistant/core/pull/61437 +[#61438]: https://github.com/home-assistant/core/pull/61438 +[#61439]: https://github.com/home-assistant/core/pull/61439 +[#61440]: https://github.com/home-assistant/core/pull/61440 +[#61441]: https://github.com/home-assistant/core/pull/61441 +[#61442]: https://github.com/home-assistant/core/pull/61442 +[#61443]: https://github.com/home-assistant/core/pull/61443 +[#61444]: https://github.com/home-assistant/core/pull/61444 +[#61445]: https://github.com/home-assistant/core/pull/61445 +[#61446]: https://github.com/home-assistant/core/pull/61446 +[#61447]: https://github.com/home-assistant/core/pull/61447 +[#61449]: https://github.com/home-assistant/core/pull/61449 +[#61456]: https://github.com/home-assistant/core/pull/61456 +[#61460]: https://github.com/home-assistant/core/pull/61460 +[#61461]: https://github.com/home-assistant/core/pull/61461 +[#61467]: https://github.com/home-assistant/core/pull/61467 +[#61468]: https://github.com/home-assistant/core/pull/61468 +[#61470]: https://github.com/home-assistant/core/pull/61470 +[#61472]: https://github.com/home-assistant/core/pull/61472 +[#61473]: https://github.com/home-assistant/core/pull/61473 +[#61474]: https://github.com/home-assistant/core/pull/61474 +[#61476]: https://github.com/home-assistant/core/pull/61476 +[#61483]: https://github.com/home-assistant/core/pull/61483 +[#61484]: https://github.com/home-assistant/core/pull/61484 +[#61492]: https://github.com/home-assistant/core/pull/61492 +[#61495]: https://github.com/home-assistant/core/pull/61495 +[#61496]: https://github.com/home-assistant/core/pull/61496 +[#61508]: https://github.com/home-assistant/core/pull/61508 +[#61515]: https://github.com/home-assistant/core/pull/61515 +[#61517]: https://github.com/home-assistant/core/pull/61517 +[#61518]: https://github.com/home-assistant/core/pull/61518 +[#61520]: https://github.com/home-assistant/core/pull/61520 +[#61522]: https://github.com/home-assistant/core/pull/61522 +[#61526]: https://github.com/home-assistant/core/pull/61526 +[#61536]: https://github.com/home-assistant/core/pull/61536 +[#61538]: https://github.com/home-assistant/core/pull/61538 +[#61571]: https://github.com/home-assistant/core/pull/61571 +[#61574]: https://github.com/home-assistant/core/pull/61574 +[#61575]: https://github.com/home-assistant/core/pull/61575 +[#61576]: https://github.com/home-assistant/core/pull/61576 +[#61589]: https://github.com/home-assistant/core/pull/61589 +[#61595]: https://github.com/home-assistant/core/pull/61595 +[#61605]: https://github.com/home-assistant/core/pull/61605 +[#61607]: https://github.com/home-assistant/core/pull/61607 +[#61608]: https://github.com/home-assistant/core/pull/61608 +[#61609]: https://github.com/home-assistant/core/pull/61609 +[#61610]: https://github.com/home-assistant/core/pull/61610 +[#61611]: https://github.com/home-assistant/core/pull/61611 +[#61613]: https://github.com/home-assistant/core/pull/61613 +[#61617]: https://github.com/home-assistant/core/pull/61617 +[#61641]: https://github.com/home-assistant/core/pull/61641 +[#61646]: https://github.com/home-assistant/core/pull/61646 +[#61647]: https://github.com/home-assistant/core/pull/61647 +[#61650]: https://github.com/home-assistant/core/pull/61650 +[#61653]: https://github.com/home-assistant/core/pull/61653 +[#61655]: https://github.com/home-assistant/core/pull/61655 +[#61656]: https://github.com/home-assistant/core/pull/61656 +[#61657]: https://github.com/home-assistant/core/pull/61657 +[#61658]: https://github.com/home-assistant/core/pull/61658 +[#61660]: https://github.com/home-assistant/core/pull/61660 +[#61661]: https://github.com/home-assistant/core/pull/61661 +[#61665]: https://github.com/home-assistant/core/pull/61665 +[#61678]: https://github.com/home-assistant/core/pull/61678 +[#61689]: https://github.com/home-assistant/core/pull/61689 +[#61691]: https://github.com/home-assistant/core/pull/61691 +[#61716]: https://github.com/home-assistant/core/pull/61716 +[#61719]: https://github.com/home-assistant/core/pull/61719 +[#61720]: https://github.com/home-assistant/core/pull/61720 +[#61721]: https://github.com/home-assistant/core/pull/61721 +[#61722]: https://github.com/home-assistant/core/pull/61722 +[#61724]: https://github.com/home-assistant/core/pull/61724 +[#61732]: https://github.com/home-assistant/core/pull/61732 +[#61734]: https://github.com/home-assistant/core/pull/61734 +[#61735]: https://github.com/home-assistant/core/pull/61735 +[#61738]: https://github.com/home-assistant/core/pull/61738 +[#61741]: https://github.com/home-assistant/core/pull/61741 +[#61742]: https://github.com/home-assistant/core/pull/61742 +[#61743]: https://github.com/home-assistant/core/pull/61743 +[#61746]: https://github.com/home-assistant/core/pull/61746 +[#61748]: https://github.com/home-assistant/core/pull/61748 +[#61757]: https://github.com/home-assistant/core/pull/61757 +[#61758]: https://github.com/home-assistant/core/pull/61758 +[#61759]: https://github.com/home-assistant/core/pull/61759 +[#61760]: https://github.com/home-assistant/core/pull/61760 +[#61761]: https://github.com/home-assistant/core/pull/61761 +[#61763]: https://github.com/home-assistant/core/pull/61763 +[#61764]: https://github.com/home-assistant/core/pull/61764 +[#61765]: https://github.com/home-assistant/core/pull/61765 +[#61768]: https://github.com/home-assistant/core/pull/61768 +[#61770]: https://github.com/home-assistant/core/pull/61770 +[#61771]: https://github.com/home-assistant/core/pull/61771 +[#61772]: https://github.com/home-assistant/core/pull/61772 +[#61776]: https://github.com/home-assistant/core/pull/61776 +[#61777]: https://github.com/home-assistant/core/pull/61777 +[#61780]: https://github.com/home-assistant/core/pull/61780 +[#61781]: https://github.com/home-assistant/core/pull/61781 +[#61786]: https://github.com/home-assistant/core/pull/61786 +[#61793]: https://github.com/home-assistant/core/pull/61793 +[#61799]: https://github.com/home-assistant/core/pull/61799 +[#61800]: https://github.com/home-assistant/core/pull/61800 +[#61801]: https://github.com/home-assistant/core/pull/61801 +[#61802]: https://github.com/home-assistant/core/pull/61802 +[#61803]: https://github.com/home-assistant/core/pull/61803 +[#61804]: https://github.com/home-assistant/core/pull/61804 +[#61805]: https://github.com/home-assistant/core/pull/61805 +[#61816]: https://github.com/home-assistant/core/pull/61816 +[#61822]: https://github.com/home-assistant/core/pull/61822 +[#61823]: https://github.com/home-assistant/core/pull/61823 +[#61824]: https://github.com/home-assistant/core/pull/61824 +[#61825]: https://github.com/home-assistant/core/pull/61825 +[#61827]: https://github.com/home-assistant/core/pull/61827 +[#61828]: https://github.com/home-assistant/core/pull/61828 +[#61837]: https://github.com/home-assistant/core/pull/61837 +[#61839]: https://github.com/home-assistant/core/pull/61839 +[#61840]: https://github.com/home-assistant/core/pull/61840 +[#61844]: https://github.com/home-assistant/core/pull/61844 +[#61853]: https://github.com/home-assistant/core/pull/61853 +[#61856]: https://github.com/home-assistant/core/pull/61856 +[#61857]: https://github.com/home-assistant/core/pull/61857 +[#61858]: https://github.com/home-assistant/core/pull/61858 +[#61859]: https://github.com/home-assistant/core/pull/61859 +[#61860]: https://github.com/home-assistant/core/pull/61860 +[#61861]: https://github.com/home-assistant/core/pull/61861 +[#61862]: https://github.com/home-assistant/core/pull/61862 +[#61863]: https://github.com/home-assistant/core/pull/61863 +[#61865]: https://github.com/home-assistant/core/pull/61865 +[#61866]: https://github.com/home-assistant/core/pull/61866 +[#61867]: https://github.com/home-assistant/core/pull/61867 +[#61868]: https://github.com/home-assistant/core/pull/61868 +[#61869]: https://github.com/home-assistant/core/pull/61869 +[#61870]: https://github.com/home-assistant/core/pull/61870 +[#61871]: https://github.com/home-assistant/core/pull/61871 +[#61879]: https://github.com/home-assistant/core/pull/61879 +[#61881]: https://github.com/home-assistant/core/pull/61881 +[#61882]: https://github.com/home-assistant/core/pull/61882 +[#61883]: https://github.com/home-assistant/core/pull/61883 +[#61884]: https://github.com/home-assistant/core/pull/61884 +[#61885]: https://github.com/home-assistant/core/pull/61885 +[#61886]: https://github.com/home-assistant/core/pull/61886 +[#61887]: https://github.com/home-assistant/core/pull/61887 +[#61888]: https://github.com/home-assistant/core/pull/61888 +[#61889]: https://github.com/home-assistant/core/pull/61889 +[#61890]: https://github.com/home-assistant/core/pull/61890 +[#61894]: https://github.com/home-assistant/core/pull/61894 +[#61895]: https://github.com/home-assistant/core/pull/61895 +[#61896]: https://github.com/home-assistant/core/pull/61896 +[#61897]: https://github.com/home-assistant/core/pull/61897 +[#61898]: https://github.com/home-assistant/core/pull/61898 +[#61899]: https://github.com/home-assistant/core/pull/61899 +[#61900]: https://github.com/home-assistant/core/pull/61900 +[#61904]: https://github.com/home-assistant/core/pull/61904 +[#61906]: https://github.com/home-assistant/core/pull/61906 +[#61908]: https://github.com/home-assistant/core/pull/61908 +[#61914]: https://github.com/home-assistant/core/pull/61914 +[#61915]: https://github.com/home-assistant/core/pull/61915 +[#61918]: https://github.com/home-assistant/core/pull/61918 +[#61919]: https://github.com/home-assistant/core/pull/61919 +[#61922]: https://github.com/home-assistant/core/pull/61922 +[#61923]: https://github.com/home-assistant/core/pull/61923 +[#61924]: https://github.com/home-assistant/core/pull/61924 +[#61925]: https://github.com/home-assistant/core/pull/61925 +[#61927]: https://github.com/home-assistant/core/pull/61927 +[#61929]: https://github.com/home-assistant/core/pull/61929 +[#61930]: https://github.com/home-assistant/core/pull/61930 +[#61931]: https://github.com/home-assistant/core/pull/61931 +[#61932]: https://github.com/home-assistant/core/pull/61932 +[#61933]: https://github.com/home-assistant/core/pull/61933 +[#61934]: https://github.com/home-assistant/core/pull/61934 +[#61935]: https://github.com/home-assistant/core/pull/61935 +[#61936]: https://github.com/home-assistant/core/pull/61936 +[#61937]: https://github.com/home-assistant/core/pull/61937 +[#61938]: https://github.com/home-assistant/core/pull/61938 +[#61939]: https://github.com/home-assistant/core/pull/61939 +[#61940]: https://github.com/home-assistant/core/pull/61940 +[#61941]: https://github.com/home-assistant/core/pull/61941 +[#61942]: https://github.com/home-assistant/core/pull/61942 +[#61943]: https://github.com/home-assistant/core/pull/61943 +[#61946]: https://github.com/home-assistant/core/pull/61946 +[#61947]: https://github.com/home-assistant/core/pull/61947 +[#61948]: https://github.com/home-assistant/core/pull/61948 +[#61949]: https://github.com/home-assistant/core/pull/61949 +[#61950]: https://github.com/home-assistant/core/pull/61950 +[#61951]: https://github.com/home-assistant/core/pull/61951 +[#61952]: https://github.com/home-assistant/core/pull/61952 +[#61953]: https://github.com/home-assistant/core/pull/61953 +[#61954]: https://github.com/home-assistant/core/pull/61954 +[#61955]: https://github.com/home-assistant/core/pull/61955 +[#61959]: https://github.com/home-assistant/core/pull/61959 +[#61960]: https://github.com/home-assistant/core/pull/61960 +[#61961]: https://github.com/home-assistant/core/pull/61961 +[#61962]: https://github.com/home-assistant/core/pull/61962 +[#61964]: https://github.com/home-assistant/core/pull/61964 +[#61966]: https://github.com/home-assistant/core/pull/61966 +[#61967]: https://github.com/home-assistant/core/pull/61967 +[#61968]: https://github.com/home-assistant/core/pull/61968 +[#61969]: https://github.com/home-assistant/core/pull/61969 +[#61970]: https://github.com/home-assistant/core/pull/61970 +[#61971]: https://github.com/home-assistant/core/pull/61971 +[#61973]: https://github.com/home-assistant/core/pull/61973 +[#61975]: https://github.com/home-assistant/core/pull/61975 +[#61976]: https://github.com/home-assistant/core/pull/61976 +[#61977]: https://github.com/home-assistant/core/pull/61977 +[#61978]: https://github.com/home-assistant/core/pull/61978 +[#61979]: https://github.com/home-assistant/core/pull/61979 +[#61980]: https://github.com/home-assistant/core/pull/61980 +[#61981]: https://github.com/home-assistant/core/pull/61981 +[#61982]: https://github.com/home-assistant/core/pull/61982 +[#61983]: https://github.com/home-assistant/core/pull/61983 +[#61984]: https://github.com/home-assistant/core/pull/61984 +[#61985]: https://github.com/home-assistant/core/pull/61985 +[#61986]: https://github.com/home-assistant/core/pull/61986 +[#61987]: https://github.com/home-assistant/core/pull/61987 +[#61988]: https://github.com/home-assistant/core/pull/61988 +[#61989]: https://github.com/home-assistant/core/pull/61989 +[#61990]: https://github.com/home-assistant/core/pull/61990 +[#61991]: https://github.com/home-assistant/core/pull/61991 +[#61992]: https://github.com/home-assistant/core/pull/61992 +[#61993]: https://github.com/home-assistant/core/pull/61993 +[#61994]: https://github.com/home-assistant/core/pull/61994 +[#61995]: https://github.com/home-assistant/core/pull/61995 +[#61997]: https://github.com/home-assistant/core/pull/61997 +[#61998]: https://github.com/home-assistant/core/pull/61998 +[#61999]: https://github.com/home-assistant/core/pull/61999 +[#62000]: https://github.com/home-assistant/core/pull/62000 +[#62003]: https://github.com/home-assistant/core/pull/62003 +[#62004]: https://github.com/home-assistant/core/pull/62004 +[#62006]: https://github.com/home-assistant/core/pull/62006 +[#62008]: https://github.com/home-assistant/core/pull/62008 +[#62010]: https://github.com/home-assistant/core/pull/62010 +[#62011]: https://github.com/home-assistant/core/pull/62011 +[#62020]: https://github.com/home-assistant/core/pull/62020 +[#62021]: https://github.com/home-assistant/core/pull/62021 +[#62022]: https://github.com/home-assistant/core/pull/62022 +[#62023]: https://github.com/home-assistant/core/pull/62023 +[#62024]: https://github.com/home-assistant/core/pull/62024 +[#62025]: https://github.com/home-assistant/core/pull/62025 +[#62026]: https://github.com/home-assistant/core/pull/62026 +[#62027]: https://github.com/home-assistant/core/pull/62027 +[#62028]: https://github.com/home-assistant/core/pull/62028 +[#62029]: https://github.com/home-assistant/core/pull/62029 +[#62030]: https://github.com/home-assistant/core/pull/62030 +[#62031]: https://github.com/home-assistant/core/pull/62031 +[#62032]: https://github.com/home-assistant/core/pull/62032 +[#62033]: https://github.com/home-assistant/core/pull/62033 +[#62035]: https://github.com/home-assistant/core/pull/62035 +[#62036]: https://github.com/home-assistant/core/pull/62036 +[#62037]: https://github.com/home-assistant/core/pull/62037 +[#62038]: https://github.com/home-assistant/core/pull/62038 +[#62039]: https://github.com/home-assistant/core/pull/62039 +[#62040]: https://github.com/home-assistant/core/pull/62040 +[#62041]: https://github.com/home-assistant/core/pull/62041 +[#62042]: https://github.com/home-assistant/core/pull/62042 +[#62043]: https://github.com/home-assistant/core/pull/62043 +[#62044]: https://github.com/home-assistant/core/pull/62044 +[#62045]: https://github.com/home-assistant/core/pull/62045 +[#62046]: https://github.com/home-assistant/core/pull/62046 +[#62047]: https://github.com/home-assistant/core/pull/62047 +[#62048]: https://github.com/home-assistant/core/pull/62048 +[#62049]: https://github.com/home-assistant/core/pull/62049 +[#62050]: https://github.com/home-assistant/core/pull/62050 +[#62051]: https://github.com/home-assistant/core/pull/62051 +[#62052]: https://github.com/home-assistant/core/pull/62052 +[#62053]: https://github.com/home-assistant/core/pull/62053 +[#62055]: https://github.com/home-assistant/core/pull/62055 +[#62056]: https://github.com/home-assistant/core/pull/62056 +[#62057]: https://github.com/home-assistant/core/pull/62057 +[#62058]: https://github.com/home-assistant/core/pull/62058 +[#62059]: https://github.com/home-assistant/core/pull/62059 +[#62060]: https://github.com/home-assistant/core/pull/62060 +[#62061]: https://github.com/home-assistant/core/pull/62061 +[#62062]: https://github.com/home-assistant/core/pull/62062 +[#62063]: https://github.com/home-assistant/core/pull/62063 +[#62064]: https://github.com/home-assistant/core/pull/62064 +[#62065]: https://github.com/home-assistant/core/pull/62065 +[#62066]: https://github.com/home-assistant/core/pull/62066 +[#62067]: https://github.com/home-assistant/core/pull/62067 +[#62069]: https://github.com/home-assistant/core/pull/62069 +[#62070]: https://github.com/home-assistant/core/pull/62070 +[#62071]: https://github.com/home-assistant/core/pull/62071 +[#62072]: https://github.com/home-assistant/core/pull/62072 +[#62073]: https://github.com/home-assistant/core/pull/62073 +[#62076]: https://github.com/home-assistant/core/pull/62076 +[#62077]: https://github.com/home-assistant/core/pull/62077 +[#62078]: https://github.com/home-assistant/core/pull/62078 +[#62079]: https://github.com/home-assistant/core/pull/62079 +[#62080]: https://github.com/home-assistant/core/pull/62080 +[#62081]: https://github.com/home-assistant/core/pull/62081 +[#62082]: https://github.com/home-assistant/core/pull/62082 +[#62083]: https://github.com/home-assistant/core/pull/62083 +[#62084]: https://github.com/home-assistant/core/pull/62084 +[#62085]: https://github.com/home-assistant/core/pull/62085 +[#62086]: https://github.com/home-assistant/core/pull/62086 +[#62087]: https://github.com/home-assistant/core/pull/62087 +[#62088]: https://github.com/home-assistant/core/pull/62088 +[#62090]: https://github.com/home-assistant/core/pull/62090 +[#62091]: https://github.com/home-assistant/core/pull/62091 +[#62093]: https://github.com/home-assistant/core/pull/62093 +[#62095]: https://github.com/home-assistant/core/pull/62095 +[#62096]: https://github.com/home-assistant/core/pull/62096 +[#62103]: https://github.com/home-assistant/core/pull/62103 +[#62104]: https://github.com/home-assistant/core/pull/62104 +[#62105]: https://github.com/home-assistant/core/pull/62105 +[#62108]: https://github.com/home-assistant/core/pull/62108 +[#62109]: https://github.com/home-assistant/core/pull/62109 +[#62110]: https://github.com/home-assistant/core/pull/62110 +[#62112]: https://github.com/home-assistant/core/pull/62112 +[#62113]: https://github.com/home-assistant/core/pull/62113 +[#62114]: https://github.com/home-assistant/core/pull/62114 +[#62116]: https://github.com/home-assistant/core/pull/62116 +[#62117]: https://github.com/home-assistant/core/pull/62117 +[#62118]: https://github.com/home-assistant/core/pull/62118 +[#62119]: https://github.com/home-assistant/core/pull/62119 +[#62121]: https://github.com/home-assistant/core/pull/62121 +[#62122]: https://github.com/home-assistant/core/pull/62122 +[#62123]: https://github.com/home-assistant/core/pull/62123 +[#62130]: https://github.com/home-assistant/core/pull/62130 +[#62131]: https://github.com/home-assistant/core/pull/62131 +[#62132]: https://github.com/home-assistant/core/pull/62132 +[#62133]: https://github.com/home-assistant/core/pull/62133 +[#62134]: https://github.com/home-assistant/core/pull/62134 +[#62135]: https://github.com/home-assistant/core/pull/62135 +[#62136]: https://github.com/home-assistant/core/pull/62136 +[#62137]: https://github.com/home-assistant/core/pull/62137 +[#62138]: https://github.com/home-assistant/core/pull/62138 +[#62140]: https://github.com/home-assistant/core/pull/62140 +[#62141]: https://github.com/home-assistant/core/pull/62141 +[#62142]: https://github.com/home-assistant/core/pull/62142 +[#62143]: https://github.com/home-assistant/core/pull/62143 +[#62144]: https://github.com/home-assistant/core/pull/62144 +[#62150]: https://github.com/home-assistant/core/pull/62150 +[#62151]: https://github.com/home-assistant/core/pull/62151 +[#62152]: https://github.com/home-assistant/core/pull/62152 +[#62153]: https://github.com/home-assistant/core/pull/62153 +[#62157]: https://github.com/home-assistant/core/pull/62157 +[#62158]: https://github.com/home-assistant/core/pull/62158 +[#62159]: https://github.com/home-assistant/core/pull/62159 +[#62165]: https://github.com/home-assistant/core/pull/62165 +[#62171]: https://github.com/home-assistant/core/pull/62171 +[#62173]: https://github.com/home-assistant/core/pull/62173 +[#62175]: https://github.com/home-assistant/core/pull/62175 +[#62176]: https://github.com/home-assistant/core/pull/62176 +[#62179]: https://github.com/home-assistant/core/pull/62179 +[#62180]: https://github.com/home-assistant/core/pull/62180 +[#62181]: https://github.com/home-assistant/core/pull/62181 +[#62185]: https://github.com/home-assistant/core/pull/62185 +[#62187]: https://github.com/home-assistant/core/pull/62187 +[#62189]: https://github.com/home-assistant/core/pull/62189 +[#62190]: https://github.com/home-assistant/core/pull/62190 +[#62191]: https://github.com/home-assistant/core/pull/62191 +[#62192]: https://github.com/home-assistant/core/pull/62192 +[#62194]: https://github.com/home-assistant/core/pull/62194 +[#62195]: https://github.com/home-assistant/core/pull/62195 +[#62196]: https://github.com/home-assistant/core/pull/62196 +[#62197]: https://github.com/home-assistant/core/pull/62197 +[#62198]: https://github.com/home-assistant/core/pull/62198 +[#62201]: https://github.com/home-assistant/core/pull/62201 +[#62202]: https://github.com/home-assistant/core/pull/62202 +[#62203]: https://github.com/home-assistant/core/pull/62203 +[#62204]: https://github.com/home-assistant/core/pull/62204 +[#62205]: https://github.com/home-assistant/core/pull/62205 +[#62206]: https://github.com/home-assistant/core/pull/62206 +[#62208]: https://github.com/home-assistant/core/pull/62208 +[#62209]: https://github.com/home-assistant/core/pull/62209 +[#62210]: https://github.com/home-assistant/core/pull/62210 +[#62212]: https://github.com/home-assistant/core/pull/62212 +[#62213]: https://github.com/home-assistant/core/pull/62213 +[#62216]: https://github.com/home-assistant/core/pull/62216 +[#62217]: https://github.com/home-assistant/core/pull/62217 +[#62218]: https://github.com/home-assistant/core/pull/62218 +[#62219]: https://github.com/home-assistant/core/pull/62219 +[#62220]: https://github.com/home-assistant/core/pull/62220 +[#62221]: https://github.com/home-assistant/core/pull/62221 +[#62228]: https://github.com/home-assistant/core/pull/62228 +[#62239]: https://github.com/home-assistant/core/pull/62239 +[#62243]: https://github.com/home-assistant/core/pull/62243 +[#62249]: https://github.com/home-assistant/core/pull/62249 +[#62254]: https://github.com/home-assistant/core/pull/62254 +[#62255]: https://github.com/home-assistant/core/pull/62255 +[#62256]: https://github.com/home-assistant/core/pull/62256 +[#62258]: https://github.com/home-assistant/core/pull/62258 +[#62260]: https://github.com/home-assistant/core/pull/62260 +[#62262]: https://github.com/home-assistant/core/pull/62262 +[#62263]: https://github.com/home-assistant/core/pull/62263 +[#62266]: https://github.com/home-assistant/core/pull/62266 +[#62268]: https://github.com/home-assistant/core/pull/62268 +[#62274]: https://github.com/home-assistant/core/pull/62274 +[#62282]: https://github.com/home-assistant/core/pull/62282 +[#62284]: https://github.com/home-assistant/core/pull/62284 +[#62285]: https://github.com/home-assistant/core/pull/62285 +[#62293]: https://github.com/home-assistant/core/pull/62293 +[#62294]: https://github.com/home-assistant/core/pull/62294 +[#62300]: https://github.com/home-assistant/core/pull/62300 +[#62301]: https://github.com/home-assistant/core/pull/62301 +[#62303]: https://github.com/home-assistant/core/pull/62303 +[#62311]: https://github.com/home-assistant/core/pull/62311 +[#62313]: https://github.com/home-assistant/core/pull/62313 +[#62317]: https://github.com/home-assistant/core/pull/62317 +[#62320]: https://github.com/home-assistant/core/pull/62320 +[#62321]: https://github.com/home-assistant/core/pull/62321 +[#62323]: https://github.com/home-assistant/core/pull/62323 +[#62324]: https://github.com/home-assistant/core/pull/62324 +[#62326]: https://github.com/home-assistant/core/pull/62326 +[#62327]: https://github.com/home-assistant/core/pull/62327 +[#62328]: https://github.com/home-assistant/core/pull/62328 +[#62334]: https://github.com/home-assistant/core/pull/62334 +[#62335]: https://github.com/home-assistant/core/pull/62335 +[#62336]: https://github.com/home-assistant/core/pull/62336 +[#62337]: https://github.com/home-assistant/core/pull/62337 +[#62341]: https://github.com/home-assistant/core/pull/62341 +[#62342]: https://github.com/home-assistant/core/pull/62342 +[#62343]: https://github.com/home-assistant/core/pull/62343 +[#62344]: https://github.com/home-assistant/core/pull/62344 +[#62348]: https://github.com/home-assistant/core/pull/62348 +[#62349]: https://github.com/home-assistant/core/pull/62349 +[#62350]: https://github.com/home-assistant/core/pull/62350 +[#62351]: https://github.com/home-assistant/core/pull/62351 +[#62352]: https://github.com/home-assistant/core/pull/62352 +[#62354]: https://github.com/home-assistant/core/pull/62354 +[#62359]: https://github.com/home-assistant/core/pull/62359 +[#62365]: https://github.com/home-assistant/core/pull/62365 +[#62371]: https://github.com/home-assistant/core/pull/62371 +[#62372]: https://github.com/home-assistant/core/pull/62372 +[#62373]: https://github.com/home-assistant/core/pull/62373 +[#62374]: https://github.com/home-assistant/core/pull/62374 +[#62376]: https://github.com/home-assistant/core/pull/62376 +[#62377]: https://github.com/home-assistant/core/pull/62377 +[#62378]: https://github.com/home-assistant/core/pull/62378 +[#62380]: https://github.com/home-assistant/core/pull/62380 +[#62381]: https://github.com/home-assistant/core/pull/62381 +[#62382]: https://github.com/home-assistant/core/pull/62382 +[#62383]: https://github.com/home-assistant/core/pull/62383 +[#62384]: https://github.com/home-assistant/core/pull/62384 +[#62391]: https://github.com/home-assistant/core/pull/62391 +[#62395]: https://github.com/home-assistant/core/pull/62395 +[#62396]: https://github.com/home-assistant/core/pull/62396 +[#62397]: https://github.com/home-assistant/core/pull/62397 +[#62398]: https://github.com/home-assistant/core/pull/62398 +[#62399]: https://github.com/home-assistant/core/pull/62399 +[#62400]: https://github.com/home-assistant/core/pull/62400 +[#62401]: https://github.com/home-assistant/core/pull/62401 +[#62402]: https://github.com/home-assistant/core/pull/62402 +[#62403]: https://github.com/home-assistant/core/pull/62403 +[#62404]: https://github.com/home-assistant/core/pull/62404 +[#62405]: https://github.com/home-assistant/core/pull/62405 +[#62406]: https://github.com/home-assistant/core/pull/62406 +[#62407]: https://github.com/home-assistant/core/pull/62407 +[#62410]: https://github.com/home-assistant/core/pull/62410 +[#62415]: https://github.com/home-assistant/core/pull/62415 +[#62416]: https://github.com/home-assistant/core/pull/62416 +[#62417]: https://github.com/home-assistant/core/pull/62417 +[#62418]: https://github.com/home-assistant/core/pull/62418 +[#62422]: https://github.com/home-assistant/core/pull/62422 +[#62423]: https://github.com/home-assistant/core/pull/62423 +[#62424]: https://github.com/home-assistant/core/pull/62424 +[#62425]: https://github.com/home-assistant/core/pull/62425 +[#62426]: https://github.com/home-assistant/core/pull/62426 +[#62427]: https://github.com/home-assistant/core/pull/62427 +[#62428]: https://github.com/home-assistant/core/pull/62428 +[#62429]: https://github.com/home-assistant/core/pull/62429 +[#62430]: https://github.com/home-assistant/core/pull/62430 +[#62431]: https://github.com/home-assistant/core/pull/62431 +[#62432]: https://github.com/home-assistant/core/pull/62432 +[#62433]: https://github.com/home-assistant/core/pull/62433 +[#62434]: https://github.com/home-assistant/core/pull/62434 +[#62436]: https://github.com/home-assistant/core/pull/62436 +[#62438]: https://github.com/home-assistant/core/pull/62438 +[#62439]: https://github.com/home-assistant/core/pull/62439 +[#62440]: https://github.com/home-assistant/core/pull/62440 +[#62441]: https://github.com/home-assistant/core/pull/62441 +[#62443]: https://github.com/home-assistant/core/pull/62443 +[#62445]: https://github.com/home-assistant/core/pull/62445 +[#62449]: https://github.com/home-assistant/core/pull/62449 +[#62450]: https://github.com/home-assistant/core/pull/62450 +[#62454]: https://github.com/home-assistant/core/pull/62454 +[#62455]: https://github.com/home-assistant/core/pull/62455 +[#62457]: https://github.com/home-assistant/core/pull/62457 +[#62462]: https://github.com/home-assistant/core/pull/62462 +[#62464]: https://github.com/home-assistant/core/pull/62464 +[#62466]: https://github.com/home-assistant/core/pull/62466 +[#62468]: https://github.com/home-assistant/core/pull/62468 +[#62469]: https://github.com/home-assistant/core/pull/62469 +[#62470]: https://github.com/home-assistant/core/pull/62470 +[#62471]: https://github.com/home-assistant/core/pull/62471 +[#62472]: https://github.com/home-assistant/core/pull/62472 +[#62476]: https://github.com/home-assistant/core/pull/62476 +[#62479]: https://github.com/home-assistant/core/pull/62479 +[#62480]: https://github.com/home-assistant/core/pull/62480 +[#62484]: https://github.com/home-assistant/core/pull/62484 +[#62485]: https://github.com/home-assistant/core/pull/62485 +[#62486]: https://github.com/home-assistant/core/pull/62486 +[#62487]: https://github.com/home-assistant/core/pull/62487 +[#62488]: https://github.com/home-assistant/core/pull/62488 +[#62489]: https://github.com/home-assistant/core/pull/62489 +[#62491]: https://github.com/home-assistant/core/pull/62491 +[#62492]: https://github.com/home-assistant/core/pull/62492 +[#62493]: https://github.com/home-assistant/core/pull/62493 +[#62495]: https://github.com/home-assistant/core/pull/62495 +[#62496]: https://github.com/home-assistant/core/pull/62496 +[#62498]: https://github.com/home-assistant/core/pull/62498 +[#62501]: https://github.com/home-assistant/core/pull/62501 +[#62508]: https://github.com/home-assistant/core/pull/62508 +[#62509]: https://github.com/home-assistant/core/pull/62509 +[#62511]: https://github.com/home-assistant/core/pull/62511 +[#62512]: https://github.com/home-assistant/core/pull/62512 +[#62513]: https://github.com/home-assistant/core/pull/62513 +[#62515]: https://github.com/home-assistant/core/pull/62515 +[#62516]: https://github.com/home-assistant/core/pull/62516 +[#62517]: https://github.com/home-assistant/core/pull/62517 +[#62518]: https://github.com/home-assistant/core/pull/62518 +[#62519]: https://github.com/home-assistant/core/pull/62519 +[#62520]: https://github.com/home-assistant/core/pull/62520 +[#62521]: https://github.com/home-assistant/core/pull/62521 +[#62522]: https://github.com/home-assistant/core/pull/62522 +[#62524]: https://github.com/home-assistant/core/pull/62524 +[#62525]: https://github.com/home-assistant/core/pull/62525 +[#62526]: https://github.com/home-assistant/core/pull/62526 +[#62531]: https://github.com/home-assistant/core/pull/62531 +[#62532]: https://github.com/home-assistant/core/pull/62532 +[#62537]: https://github.com/home-assistant/core/pull/62537 +[#62538]: https://github.com/home-assistant/core/pull/62538 +[#62541]: https://github.com/home-assistant/core/pull/62541 +[#62542]: https://github.com/home-assistant/core/pull/62542 +[#62543]: https://github.com/home-assistant/core/pull/62543 +[#62547]: https://github.com/home-assistant/core/pull/62547 +[#62548]: https://github.com/home-assistant/core/pull/62548 +[#62549]: https://github.com/home-assistant/core/pull/62549 +[#62550]: https://github.com/home-assistant/core/pull/62550 +[#62551]: https://github.com/home-assistant/core/pull/62551 +[#62553]: https://github.com/home-assistant/core/pull/62553 +[#62555]: https://github.com/home-assistant/core/pull/62555 +[#62558]: https://github.com/home-assistant/core/pull/62558 +[#62561]: https://github.com/home-assistant/core/pull/62561 +[#62564]: https://github.com/home-assistant/core/pull/62564 +[#62565]: https://github.com/home-assistant/core/pull/62565 +[#62569]: https://github.com/home-assistant/core/pull/62569 +[#62570]: https://github.com/home-assistant/core/pull/62570 +[#62574]: https://github.com/home-assistant/core/pull/62574 +[#62576]: https://github.com/home-assistant/core/pull/62576 +[#62577]: https://github.com/home-assistant/core/pull/62577 +[#62578]: https://github.com/home-assistant/core/pull/62578 +[#62580]: https://github.com/home-assistant/core/pull/62580 +[#62583]: https://github.com/home-assistant/core/pull/62583 +[#62584]: https://github.com/home-assistant/core/pull/62584 +[#62585]: https://github.com/home-assistant/core/pull/62585 +[#62588]: https://github.com/home-assistant/core/pull/62588 +[#62589]: https://github.com/home-assistant/core/pull/62589 +[#62590]: https://github.com/home-assistant/core/pull/62590 +[#62592]: https://github.com/home-assistant/core/pull/62592 +[#62593]: https://github.com/home-assistant/core/pull/62593 +[#62594]: https://github.com/home-assistant/core/pull/62594 +[#62596]: https://github.com/home-assistant/core/pull/62596 +[#62597]: https://github.com/home-assistant/core/pull/62597 +[#62599]: https://github.com/home-assistant/core/pull/62599 +[#62600]: https://github.com/home-assistant/core/pull/62600 +[#62601]: https://github.com/home-assistant/core/pull/62601 +[#62607]: https://github.com/home-assistant/core/pull/62607 +[#62611]: https://github.com/home-assistant/core/pull/62611 +[#62612]: https://github.com/home-assistant/core/pull/62612 +[#62614]: https://github.com/home-assistant/core/pull/62614 +[#62616]: https://github.com/home-assistant/core/pull/62616 +[#62618]: https://github.com/home-assistant/core/pull/62618 +[#62622]: https://github.com/home-assistant/core/pull/62622 +[#62625]: https://github.com/home-assistant/core/pull/62625 +[#62627]: https://github.com/home-assistant/core/pull/62627 +[#62628]: https://github.com/home-assistant/core/pull/62628 +[#62629]: https://github.com/home-assistant/core/pull/62629 +[#62632]: https://github.com/home-assistant/core/pull/62632 +[#62634]: https://github.com/home-assistant/core/pull/62634 +[#62635]: https://github.com/home-assistant/core/pull/62635 +[#62636]: https://github.com/home-assistant/core/pull/62636 +[#62637]: https://github.com/home-assistant/core/pull/62637 +[#62638]: https://github.com/home-assistant/core/pull/62638 +[#62639]: https://github.com/home-assistant/core/pull/62639 +[#62640]: https://github.com/home-assistant/core/pull/62640 +[#62642]: https://github.com/home-assistant/core/pull/62642 +[#62643]: https://github.com/home-assistant/core/pull/62643 +[#62645]: https://github.com/home-assistant/core/pull/62645 +[#62646]: https://github.com/home-assistant/core/pull/62646 +[#62648]: https://github.com/home-assistant/core/pull/62648 +[#62649]: https://github.com/home-assistant/core/pull/62649 +[#62650]: https://github.com/home-assistant/core/pull/62650 +[#62663]: https://github.com/home-assistant/core/pull/62663 +[#62667]: https://github.com/home-assistant/core/pull/62667 +[#62668]: https://github.com/home-assistant/core/pull/62668 +[#62673]: https://github.com/home-assistant/core/pull/62673 +[#62675]: https://github.com/home-assistant/core/pull/62675 +[#62677]: https://github.com/home-assistant/core/pull/62677 +[#62680]: https://github.com/home-assistant/core/pull/62680 +[#62681]: https://github.com/home-assistant/core/pull/62681 +[#62682]: https://github.com/home-assistant/core/pull/62682 +[#62683]: https://github.com/home-assistant/core/pull/62683 +[#62692]: https://github.com/home-assistant/core/pull/62692 +[#62693]: https://github.com/home-assistant/core/pull/62693 +[#62697]: https://github.com/home-assistant/core/pull/62697 +[#62705]: https://github.com/home-assistant/core/pull/62705 +[#62707]: https://github.com/home-assistant/core/pull/62707 +[#62708]: https://github.com/home-assistant/core/pull/62708 +[#62711]: https://github.com/home-assistant/core/pull/62711 +[#62712]: https://github.com/home-assistant/core/pull/62712 +[#62713]: https://github.com/home-assistant/core/pull/62713 +[#62714]: https://github.com/home-assistant/core/pull/62714 +[#62716]: https://github.com/home-assistant/core/pull/62716 +[#62718]: https://github.com/home-assistant/core/pull/62718 +[#62719]: https://github.com/home-assistant/core/pull/62719 +[#62725]: https://github.com/home-assistant/core/pull/62725 +[#62727]: https://github.com/home-assistant/core/pull/62727 +[#62730]: https://github.com/home-assistant/core/pull/62730 +[#62732]: https://github.com/home-assistant/core/pull/62732 +[#62736]: https://github.com/home-assistant/core/pull/62736 +[#62737]: https://github.com/home-assistant/core/pull/62737 +[#62738]: https://github.com/home-assistant/core/pull/62738 +[#62739]: https://github.com/home-assistant/core/pull/62739 +[#62743]: https://github.com/home-assistant/core/pull/62743 +[#62744]: https://github.com/home-assistant/core/pull/62744 +[#62746]: https://github.com/home-assistant/core/pull/62746 +[#62747]: https://github.com/home-assistant/core/pull/62747 +[#62748]: https://github.com/home-assistant/core/pull/62748 +[#62752]: https://github.com/home-assistant/core/pull/62752 +[#62755]: https://github.com/home-assistant/core/pull/62755 +[#62757]: https://github.com/home-assistant/core/pull/62757 +[#62758]: https://github.com/home-assistant/core/pull/62758 +[#62759]: https://github.com/home-assistant/core/pull/62759 +[#62761]: https://github.com/home-assistant/core/pull/62761 +[#62765]: https://github.com/home-assistant/core/pull/62765 +[#62769]: https://github.com/home-assistant/core/pull/62769 +[#62770]: https://github.com/home-assistant/core/pull/62770 +[#62773]: https://github.com/home-assistant/core/pull/62773 +[#62775]: https://github.com/home-assistant/core/pull/62775 +[#62778]: https://github.com/home-assistant/core/pull/62778 +[#62779]: https://github.com/home-assistant/core/pull/62779 +[#62780]: https://github.com/home-assistant/core/pull/62780 +[#62783]: https://github.com/home-assistant/core/pull/62783 +[#62785]: https://github.com/home-assistant/core/pull/62785 +[#62786]: https://github.com/home-assistant/core/pull/62786 +[#62789]: https://github.com/home-assistant/core/pull/62789 +[#62790]: https://github.com/home-assistant/core/pull/62790 +[#62793]: https://github.com/home-assistant/core/pull/62793 +[#62802]: https://github.com/home-assistant/core/pull/62802 +[#62806]: https://github.com/home-assistant/core/pull/62806 +[#62810]: https://github.com/home-assistant/core/pull/62810 +[#62811]: https://github.com/home-assistant/core/pull/62811 +[#62816]: https://github.com/home-assistant/core/pull/62816 +[#62821]: https://github.com/home-assistant/core/pull/62821 +[#62822]: https://github.com/home-assistant/core/pull/62822 +[#62824]: https://github.com/home-assistant/core/pull/62824 +[#62827]: https://github.com/home-assistant/core/pull/62827 +[#62831]: https://github.com/home-assistant/core/pull/62831 +[#62835]: https://github.com/home-assistant/core/pull/62835 +[#62841]: https://github.com/home-assistant/core/pull/62841 +[#62843]: https://github.com/home-assistant/core/pull/62843 +[#62847]: https://github.com/home-assistant/core/pull/62847 +[#62854]: https://github.com/home-assistant/core/pull/62854 +[#62857]: https://github.com/home-assistant/core/pull/62857 +[#62865]: https://github.com/home-assistant/core/pull/62865 +[#62866]: https://github.com/home-assistant/core/pull/62866 +[#62868]: https://github.com/home-assistant/core/pull/62868 +[#62869]: https://github.com/home-assistant/core/pull/62869 +[#62871]: https://github.com/home-assistant/core/pull/62871 +[#62875]: https://github.com/home-assistant/core/pull/62875 +[#62876]: https://github.com/home-assistant/core/pull/62876 +[#62877]: https://github.com/home-assistant/core/pull/62877 +[#62878]: https://github.com/home-assistant/core/pull/62878 +[#62879]: https://github.com/home-assistant/core/pull/62879 +[#62880]: https://github.com/home-assistant/core/pull/62880 +[#62883]: https://github.com/home-assistant/core/pull/62883 +[#62884]: https://github.com/home-assistant/core/pull/62884 +[#62886]: https://github.com/home-assistant/core/pull/62886 +[#62887]: https://github.com/home-assistant/core/pull/62887 +[#62888]: https://github.com/home-assistant/core/pull/62888 +[#62889]: https://github.com/home-assistant/core/pull/62889 +[#62890]: https://github.com/home-assistant/core/pull/62890 +[#62891]: https://github.com/home-assistant/core/pull/62891 +[#62893]: https://github.com/home-assistant/core/pull/62893 +[#62894]: https://github.com/home-assistant/core/pull/62894 +[#62895]: https://github.com/home-assistant/core/pull/62895 +[#62896]: https://github.com/home-assistant/core/pull/62896 +[#62899]: https://github.com/home-assistant/core/pull/62899 +[#62900]: https://github.com/home-assistant/core/pull/62900 +[#62904]: https://github.com/home-assistant/core/pull/62904 +[#62909]: https://github.com/home-assistant/core/pull/62909 +[#62912]: https://github.com/home-assistant/core/pull/62912 +[#62913]: https://github.com/home-assistant/core/pull/62913 +[#62914]: https://github.com/home-assistant/core/pull/62914 +[#62915]: https://github.com/home-assistant/core/pull/62915 +[#62916]: https://github.com/home-assistant/core/pull/62916 +[#62917]: https://github.com/home-assistant/core/pull/62917 +[#62920]: https://github.com/home-assistant/core/pull/62920 +[#62922]: https://github.com/home-assistant/core/pull/62922 +[#62923]: https://github.com/home-assistant/core/pull/62923 +[#62924]: https://github.com/home-assistant/core/pull/62924 +[#62926]: https://github.com/home-assistant/core/pull/62926 +[#62929]: https://github.com/home-assistant/core/pull/62929 +[#62932]: https://github.com/home-assistant/core/pull/62932 +[#62934]: https://github.com/home-assistant/core/pull/62934 +[#62936]: https://github.com/home-assistant/core/pull/62936 +[#62937]: https://github.com/home-assistant/core/pull/62937 +[#62946]: https://github.com/home-assistant/core/pull/62946 +[#62948]: https://github.com/home-assistant/core/pull/62948 +[#62950]: https://github.com/home-assistant/core/pull/62950 +[#62951]: https://github.com/home-assistant/core/pull/62951 +[#62952]: https://github.com/home-assistant/core/pull/62952 +[#62953]: https://github.com/home-assistant/core/pull/62953 +[#62954]: https://github.com/home-assistant/core/pull/62954 +[#62955]: https://github.com/home-assistant/core/pull/62955 +[#62956]: https://github.com/home-assistant/core/pull/62956 +[#62958]: https://github.com/home-assistant/core/pull/62958 +[#62959]: https://github.com/home-assistant/core/pull/62959 +[#62961]: https://github.com/home-assistant/core/pull/62961 +[#62962]: https://github.com/home-assistant/core/pull/62962 +[#62963]: https://github.com/home-assistant/core/pull/62963 +[#62964]: https://github.com/home-assistant/core/pull/62964 +[#62967]: https://github.com/home-assistant/core/pull/62967 +[#62970]: https://github.com/home-assistant/core/pull/62970 +[#62972]: https://github.com/home-assistant/core/pull/62972 +[#62976]: https://github.com/home-assistant/core/pull/62976 +[#62977]: https://github.com/home-assistant/core/pull/62977 +[#62990]: https://github.com/home-assistant/core/pull/62990 +[#62999]: https://github.com/home-assistant/core/pull/62999 +[#63000]: https://github.com/home-assistant/core/pull/63000 +[#63001]: https://github.com/home-assistant/core/pull/63001 +[#63005]: https://github.com/home-assistant/core/pull/63005 +[#63011]: https://github.com/home-assistant/core/pull/63011 +[#63012]: https://github.com/home-assistant/core/pull/63012 +[#63013]: https://github.com/home-assistant/core/pull/63013 +[#63014]: https://github.com/home-assistant/core/pull/63014 +[#63016]: https://github.com/home-assistant/core/pull/63016 +[#63017]: https://github.com/home-assistant/core/pull/63017 +[#63018]: https://github.com/home-assistant/core/pull/63018 +[#63019]: https://github.com/home-assistant/core/pull/63019 +[#63020]: https://github.com/home-assistant/core/pull/63020 +[#63022]: https://github.com/home-assistant/core/pull/63022 +[#63023]: https://github.com/home-assistant/core/pull/63023 +[#63027]: https://github.com/home-assistant/core/pull/63027 +[#63032]: https://github.com/home-assistant/core/pull/63032 +[#63034]: https://github.com/home-assistant/core/pull/63034 +[#63035]: https://github.com/home-assistant/core/pull/63035 +[#63036]: https://github.com/home-assistant/core/pull/63036 +[#63042]: https://github.com/home-assistant/core/pull/63042 +[#63046]: https://github.com/home-assistant/core/pull/63046 +[#63047]: https://github.com/home-assistant/core/pull/63047 +[#63048]: https://github.com/home-assistant/core/pull/63048 +[#63049]: https://github.com/home-assistant/core/pull/63049 +[#63050]: https://github.com/home-assistant/core/pull/63050 +[#63051]: https://github.com/home-assistant/core/pull/63051 +[#63058]: https://github.com/home-assistant/core/pull/63058 +[#63069]: https://github.com/home-assistant/core/pull/63069 +[#63072]: https://github.com/home-assistant/core/pull/63072 +[#63073]: https://github.com/home-assistant/core/pull/63073 +[#63074]: https://github.com/home-assistant/core/pull/63074 +[#63075]: https://github.com/home-assistant/core/pull/63075 +[#63076]: https://github.com/home-assistant/core/pull/63076 +[#63078]: https://github.com/home-assistant/core/pull/63078 +[#63079]: https://github.com/home-assistant/core/pull/63079 +[#63080]: https://github.com/home-assistant/core/pull/63080 +[#63082]: https://github.com/home-assistant/core/pull/63082 +[#63093]: https://github.com/home-assistant/core/pull/63093 +[#63094]: https://github.com/home-assistant/core/pull/63094 +[#63097]: https://github.com/home-assistant/core/pull/63097 +[#63098]: https://github.com/home-assistant/core/pull/63098 +[#63099]: https://github.com/home-assistant/core/pull/63099 +[#63100]: https://github.com/home-assistant/core/pull/63100 +[#63101]: https://github.com/home-assistant/core/pull/63101 +[#63102]: https://github.com/home-assistant/core/pull/63102 +[#63105]: https://github.com/home-assistant/core/pull/63105 +[#63106]: https://github.com/home-assistant/core/pull/63106 +[#63108]: https://github.com/home-assistant/core/pull/63108 +[#63110]: https://github.com/home-assistant/core/pull/63110 +[#63113]: https://github.com/home-assistant/core/pull/63113 +[#63117]: https://github.com/home-assistant/core/pull/63117 +[#63119]: https://github.com/home-assistant/core/pull/63119 +[#63121]: https://github.com/home-assistant/core/pull/63121 +[#63123]: https://github.com/home-assistant/core/pull/63123 +[#63124]: https://github.com/home-assistant/core/pull/63124 +[#63127]: https://github.com/home-assistant/core/pull/63127 +[#63129]: https://github.com/home-assistant/core/pull/63129 +[#63130]: https://github.com/home-assistant/core/pull/63130 +[#63132]: https://github.com/home-assistant/core/pull/63132 +[#63133]: https://github.com/home-assistant/core/pull/63133 +[#63134]: https://github.com/home-assistant/core/pull/63134 +[#63136]: https://github.com/home-assistant/core/pull/63136 +[#63137]: https://github.com/home-assistant/core/pull/63137 +[#63139]: https://github.com/home-assistant/core/pull/63139 +[#63141]: https://github.com/home-assistant/core/pull/63141 +[#63148]: https://github.com/home-assistant/core/pull/63148 +[#63149]: https://github.com/home-assistant/core/pull/63149 +[#63151]: https://github.com/home-assistant/core/pull/63151 +[#63156]: https://github.com/home-assistant/core/pull/63156 +[#63165]: https://github.com/home-assistant/core/pull/63165 +[#63166]: https://github.com/home-assistant/core/pull/63166 +[#63167]: https://github.com/home-assistant/core/pull/63167 +[#63169]: https://github.com/home-assistant/core/pull/63169 +[#63170]: https://github.com/home-assistant/core/pull/63170 +[#63171]: https://github.com/home-assistant/core/pull/63171 +[#63177]: https://github.com/home-assistant/core/pull/63177 +[#63179]: https://github.com/home-assistant/core/pull/63179 +[#63182]: https://github.com/home-assistant/core/pull/63182 +[#63183]: https://github.com/home-assistant/core/pull/63183 +[#63186]: https://github.com/home-assistant/core/pull/63186 +[#63187]: https://github.com/home-assistant/core/pull/63187 +[#63188]: https://github.com/home-assistant/core/pull/63188 +[#63189]: https://github.com/home-assistant/core/pull/63189 +[#63190]: https://github.com/home-assistant/core/pull/63190 +[#63191]: https://github.com/home-assistant/core/pull/63191 +[#63192]: https://github.com/home-assistant/core/pull/63192 +[#63193]: https://github.com/home-assistant/core/pull/63193 +[#63194]: https://github.com/home-assistant/core/pull/63194 +[#63195]: https://github.com/home-assistant/core/pull/63195 +[#63197]: https://github.com/home-assistant/core/pull/63197 +[#63200]: https://github.com/home-assistant/core/pull/63200 +[#63203]: https://github.com/home-assistant/core/pull/63203 +[#63206]: https://github.com/home-assistant/core/pull/63206 +[#63207]: https://github.com/home-assistant/core/pull/63207 +[#63208]: https://github.com/home-assistant/core/pull/63208 +[#63211]: https://github.com/home-assistant/core/pull/63211 +[#63212]: https://github.com/home-assistant/core/pull/63212 +[#63218]: https://github.com/home-assistant/core/pull/63218 +[#63220]: https://github.com/home-assistant/core/pull/63220 +[#63222]: https://github.com/home-assistant/core/pull/63222 +[#63224]: https://github.com/home-assistant/core/pull/63224 +[#63225]: https://github.com/home-assistant/core/pull/63225 +[#63227]: https://github.com/home-assistant/core/pull/63227 +[#63228]: https://github.com/home-assistant/core/pull/63228 +[#63231]: https://github.com/home-assistant/core/pull/63231 +[#63232]: https://github.com/home-assistant/core/pull/63232 +[#63234]: https://github.com/home-assistant/core/pull/63234 +[#63236]: https://github.com/home-assistant/core/pull/63236 +[#63237]: https://github.com/home-assistant/core/pull/63237 +[#63238]: https://github.com/home-assistant/core/pull/63238 +[#63239]: https://github.com/home-assistant/core/pull/63239 +[#63240]: https://github.com/home-assistant/core/pull/63240 +[#63241]: https://github.com/home-assistant/core/pull/63241 +[#63242]: https://github.com/home-assistant/core/pull/63242 +[#63243]: https://github.com/home-assistant/core/pull/63243 +[#63244]: https://github.com/home-assistant/core/pull/63244 +[#63248]: https://github.com/home-assistant/core/pull/63248 +[#63249]: https://github.com/home-assistant/core/pull/63249 +[#63251]: https://github.com/home-assistant/core/pull/63251 +[#63254]: https://github.com/home-assistant/core/pull/63254 +[#63256]: https://github.com/home-assistant/core/pull/63256 +[#63259]: https://github.com/home-assistant/core/pull/63259 +[#63261]: https://github.com/home-assistant/core/pull/63261 +[#63263]: https://github.com/home-assistant/core/pull/63263 +[#63264]: https://github.com/home-assistant/core/pull/63264 +[#63265]: https://github.com/home-assistant/core/pull/63265 +[#63268]: https://github.com/home-assistant/core/pull/63268 +[#63269]: https://github.com/home-assistant/core/pull/63269 +[#63270]: https://github.com/home-assistant/core/pull/63270 +[#63271]: https://github.com/home-assistant/core/pull/63271 +[#63272]: https://github.com/home-assistant/core/pull/63272 +[#63274]: https://github.com/home-assistant/core/pull/63274 +[#63277]: https://github.com/home-assistant/core/pull/63277 +[#63278]: https://github.com/home-assistant/core/pull/63278 +[#63279]: https://github.com/home-assistant/core/pull/63279 +[#63280]: https://github.com/home-assistant/core/pull/63280 +[#63282]: https://github.com/home-assistant/core/pull/63282 +[#63283]: https://github.com/home-assistant/core/pull/63283 +[#63284]: https://github.com/home-assistant/core/pull/63284 +[#63285]: https://github.com/home-assistant/core/pull/63285 +[#63286]: https://github.com/home-assistant/core/pull/63286 +[#63287]: https://github.com/home-assistant/core/pull/63287 +[#63288]: https://github.com/home-assistant/core/pull/63288 +[#63289]: https://github.com/home-assistant/core/pull/63289 +[#63290]: https://github.com/home-assistant/core/pull/63290 +[#63291]: https://github.com/home-assistant/core/pull/63291 +[#63292]: https://github.com/home-assistant/core/pull/63292 +[#63293]: https://github.com/home-assistant/core/pull/63293 +[#63294]: https://github.com/home-assistant/core/pull/63294 +[#63295]: https://github.com/home-assistant/core/pull/63295 +[#63296]: https://github.com/home-assistant/core/pull/63296 +[#63297]: https://github.com/home-assistant/core/pull/63297 +[#63298]: https://github.com/home-assistant/core/pull/63298 +[#63299]: https://github.com/home-assistant/core/pull/63299 +[#63300]: https://github.com/home-assistant/core/pull/63300 +[#63301]: https://github.com/home-assistant/core/pull/63301 +[#63302]: https://github.com/home-assistant/core/pull/63302 +[#63303]: https://github.com/home-assistant/core/pull/63303 +[#63304]: https://github.com/home-assistant/core/pull/63304 +[#63305]: https://github.com/home-assistant/core/pull/63305 +[#63308]: https://github.com/home-assistant/core/pull/63308 +[#63309]: https://github.com/home-assistant/core/pull/63309 +[#63310]: https://github.com/home-assistant/core/pull/63310 +[#63311]: https://github.com/home-assistant/core/pull/63311 +[#63312]: https://github.com/home-assistant/core/pull/63312 +[#63313]: https://github.com/home-assistant/core/pull/63313 +[#63314]: https://github.com/home-assistant/core/pull/63314 +[#63315]: https://github.com/home-assistant/core/pull/63315 +[#63316]: https://github.com/home-assistant/core/pull/63316 +[#63317]: https://github.com/home-assistant/core/pull/63317 +[#63318]: https://github.com/home-assistant/core/pull/63318 +[#63319]: https://github.com/home-assistant/core/pull/63319 +[#63322]: https://github.com/home-assistant/core/pull/63322 +[#63328]: https://github.com/home-assistant/core/pull/63328 +[#63330]: https://github.com/home-assistant/core/pull/63330 +[#63336]: https://github.com/home-assistant/core/pull/63336 +[#63337]: https://github.com/home-assistant/core/pull/63337 +[#63342]: https://github.com/home-assistant/core/pull/63342 +[#63343]: https://github.com/home-assistant/core/pull/63343 +[#63345]: https://github.com/home-assistant/core/pull/63345 +[#63346]: https://github.com/home-assistant/core/pull/63346 +[#63349]: https://github.com/home-assistant/core/pull/63349 +[#63350]: https://github.com/home-assistant/core/pull/63350 +[#63351]: https://github.com/home-assistant/core/pull/63351 +[#63353]: https://github.com/home-assistant/core/pull/63353 +[#63357]: https://github.com/home-assistant/core/pull/63357 +[#63358]: https://github.com/home-assistant/core/pull/63358 +[#63359]: https://github.com/home-assistant/core/pull/63359 +[#63362]: https://github.com/home-assistant/core/pull/63362 +[#63363]: https://github.com/home-assistant/core/pull/63363 +[#63365]: https://github.com/home-assistant/core/pull/63365 +[#63366]: https://github.com/home-assistant/core/pull/63366 +[#63367]: https://github.com/home-assistant/core/pull/63367 +[#63373]: https://github.com/home-assistant/core/pull/63373 +[#63377]: https://github.com/home-assistant/core/pull/63377 +[#63378]: https://github.com/home-assistant/core/pull/63378 +[#63379]: https://github.com/home-assistant/core/pull/63379 +[#63380]: https://github.com/home-assistant/core/pull/63380 +[#63385]: https://github.com/home-assistant/core/pull/63385 +[#63388]: https://github.com/home-assistant/core/pull/63388 +[#63389]: https://github.com/home-assistant/core/pull/63389 +[#63390]: https://github.com/home-assistant/core/pull/63390 +[#63391]: https://github.com/home-assistant/core/pull/63391 +[#63395]: https://github.com/home-assistant/core/pull/63395 +[#63397]: https://github.com/home-assistant/core/pull/63397 +[#63400]: https://github.com/home-assistant/core/pull/63400 +[#63404]: https://github.com/home-assistant/core/pull/63404 +[#63405]: https://github.com/home-assistant/core/pull/63405 +[#63406]: https://github.com/home-assistant/core/pull/63406 +[#63407]: https://github.com/home-assistant/core/pull/63407 +[#63408]: https://github.com/home-assistant/core/pull/63408 +[#63409]: https://github.com/home-assistant/core/pull/63409 +[#63417]: https://github.com/home-assistant/core/pull/63417 +[#63422]: https://github.com/home-assistant/core/pull/63422 +[#63423]: https://github.com/home-assistant/core/pull/63423 +[#63424]: https://github.com/home-assistant/core/pull/63424 +[#63427]: https://github.com/home-assistant/core/pull/63427 +[#63428]: https://github.com/home-assistant/core/pull/63428 +[#63430]: https://github.com/home-assistant/core/pull/63430 +[#63431]: https://github.com/home-assistant/core/pull/63431 +[#63432]: https://github.com/home-assistant/core/pull/63432 +[#63434]: https://github.com/home-assistant/core/pull/63434 +[#63436]: https://github.com/home-assistant/core/pull/63436 +[#63438]: https://github.com/home-assistant/core/pull/63438 +[#63439]: https://github.com/home-assistant/core/pull/63439 +[#63441]: https://github.com/home-assistant/core/pull/63441 +[#63444]: https://github.com/home-assistant/core/pull/63444 +[#63450]: https://github.com/home-assistant/core/pull/63450 +[#63451]: https://github.com/home-assistant/core/pull/63451 +[#63452]: https://github.com/home-assistant/core/pull/63452 +[#63453]: https://github.com/home-assistant/core/pull/63453 +[#63454]: https://github.com/home-assistant/core/pull/63454 +[#63455]: https://github.com/home-assistant/core/pull/63455 +[#63456]: https://github.com/home-assistant/core/pull/63456 +[#63458]: https://github.com/home-assistant/core/pull/63458 +[#63459]: https://github.com/home-assistant/core/pull/63459 +[#63460]: https://github.com/home-assistant/core/pull/63460 +[#63461]: https://github.com/home-assistant/core/pull/63461 +[#63462]: https://github.com/home-assistant/core/pull/63462 +[#63463]: https://github.com/home-assistant/core/pull/63463 +[#63465]: https://github.com/home-assistant/core/pull/63465 +[#63467]: https://github.com/home-assistant/core/pull/63467 +[#63468]: https://github.com/home-assistant/core/pull/63468 +[#63469]: https://github.com/home-assistant/core/pull/63469 +[#63470]: https://github.com/home-assistant/core/pull/63470 +[#63471]: https://github.com/home-assistant/core/pull/63471 +[#63472]: https://github.com/home-assistant/core/pull/63472 +[#63473]: https://github.com/home-assistant/core/pull/63473 +[#63474]: https://github.com/home-assistant/core/pull/63474 +[#63475]: https://github.com/home-assistant/core/pull/63475 +[#63476]: https://github.com/home-assistant/core/pull/63476 +[#63477]: https://github.com/home-assistant/core/pull/63477 +[#63479]: https://github.com/home-assistant/core/pull/63479 +[#63480]: https://github.com/home-assistant/core/pull/63480 +[#63483]: https://github.com/home-assistant/core/pull/63483 +[#63484]: https://github.com/home-assistant/core/pull/63484 +[#63485]: https://github.com/home-assistant/core/pull/63485 +[#63486]: https://github.com/home-assistant/core/pull/63486 +[#63487]: https://github.com/home-assistant/core/pull/63487 +[#63489]: https://github.com/home-assistant/core/pull/63489 +[#63490]: https://github.com/home-assistant/core/pull/63490 +[#63491]: https://github.com/home-assistant/core/pull/63491 +[#63493]: https://github.com/home-assistant/core/pull/63493 +[#63498]: https://github.com/home-assistant/core/pull/63498 +[#63500]: https://github.com/home-assistant/core/pull/63500 +[#63501]: https://github.com/home-assistant/core/pull/63501 +[#63502]: https://github.com/home-assistant/core/pull/63502 +[#63503]: https://github.com/home-assistant/core/pull/63503 +[#63504]: https://github.com/home-assistant/core/pull/63504 +[#63505]: https://github.com/home-assistant/core/pull/63505 +[#63506]: https://github.com/home-assistant/core/pull/63506 +[#63507]: https://github.com/home-assistant/core/pull/63507 +[#63508]: https://github.com/home-assistant/core/pull/63508 +[#63509]: https://github.com/home-assistant/core/pull/63509 +[#63510]: https://github.com/home-assistant/core/pull/63510 +[#63513]: https://github.com/home-assistant/core/pull/63513 +[#63516]: https://github.com/home-assistant/core/pull/63516 +[#63517]: https://github.com/home-assistant/core/pull/63517 +[#63518]: https://github.com/home-assistant/core/pull/63518 +[#63519]: https://github.com/home-assistant/core/pull/63519 +[#63521]: https://github.com/home-assistant/core/pull/63521 +[#63522]: https://github.com/home-assistant/core/pull/63522 +[#63524]: https://github.com/home-assistant/core/pull/63524 +[#63526]: https://github.com/home-assistant/core/pull/63526 +[#63531]: https://github.com/home-assistant/core/pull/63531 +[#63535]: https://github.com/home-assistant/core/pull/63535 +[#63541]: https://github.com/home-assistant/core/pull/63541 +[#63542]: https://github.com/home-assistant/core/pull/63542 +[#63543]: https://github.com/home-assistant/core/pull/63543 +[#63547]: https://github.com/home-assistant/core/pull/63547 +[#63552]: https://github.com/home-assistant/core/pull/63552 +[#63553]: https://github.com/home-assistant/core/pull/63553 +[#63554]: https://github.com/home-assistant/core/pull/63554 +[#63559]: https://github.com/home-assistant/core/pull/63559 +[#63561]: https://github.com/home-assistant/core/pull/63561 +[#63563]: https://github.com/home-assistant/core/pull/63563 +[#63564]: https://github.com/home-assistant/core/pull/63564 +[#63565]: https://github.com/home-assistant/core/pull/63565 +[#63566]: https://github.com/home-assistant/core/pull/63566 +[#63569]: https://github.com/home-assistant/core/pull/63569 +[#63570]: https://github.com/home-assistant/core/pull/63570 +[#63571]: https://github.com/home-assistant/core/pull/63571 +[#63573]: https://github.com/home-assistant/core/pull/63573 +[#63576]: https://github.com/home-assistant/core/pull/63576 +[#63577]: https://github.com/home-assistant/core/pull/63577 +[#63579]: https://github.com/home-assistant/core/pull/63579 +[#63581]: https://github.com/home-assistant/core/pull/63581 +[#63586]: https://github.com/home-assistant/core/pull/63586 +[#63587]: https://github.com/home-assistant/core/pull/63587 +[#63589]: https://github.com/home-assistant/core/pull/63589 +[#63590]: https://github.com/home-assistant/core/pull/63590 +[#63592]: https://github.com/home-assistant/core/pull/63592 +[#63596]: https://github.com/home-assistant/core/pull/63596 +[#63597]: https://github.com/home-assistant/core/pull/63597 +[#63598]: https://github.com/home-assistant/core/pull/63598 +[#63599]: https://github.com/home-assistant/core/pull/63599 +[#63603]: https://github.com/home-assistant/core/pull/63603 +[#63605]: https://github.com/home-assistant/core/pull/63605 +[#63607]: https://github.com/home-assistant/core/pull/63607 +[#63613]: https://github.com/home-assistant/core/pull/63613 +[#63614]: https://github.com/home-assistant/core/pull/63614 +[#63622]: https://github.com/home-assistant/core/pull/63622 +[#63623]: https://github.com/home-assistant/core/pull/63623 +[#63625]: https://github.com/home-assistant/core/pull/63625 +[#63626]: https://github.com/home-assistant/core/pull/63626 +[#63632]: https://github.com/home-assistant/core/pull/63632 +[#63637]: https://github.com/home-assistant/core/pull/63637 +[#63639]: https://github.com/home-assistant/core/pull/63639 +[#63642]: https://github.com/home-assistant/core/pull/63642 +[#63643]: https://github.com/home-assistant/core/pull/63643 +[#63644]: https://github.com/home-assistant/core/pull/63644 +[#63645]: https://github.com/home-assistant/core/pull/63645 +[#63646]: https://github.com/home-assistant/core/pull/63646 +[#63648]: https://github.com/home-assistant/core/pull/63648 +[#63653]: https://github.com/home-assistant/core/pull/63653 +[#63657]: https://github.com/home-assistant/core/pull/63657 +[#63659]: https://github.com/home-assistant/core/pull/63659 +[#63660]: https://github.com/home-assistant/core/pull/63660 +[#63661]: https://github.com/home-assistant/core/pull/63661 +[#63663]: https://github.com/home-assistant/core/pull/63663 +[#63664]: https://github.com/home-assistant/core/pull/63664 +[#63665]: https://github.com/home-assistant/core/pull/63665 +[#63667]: https://github.com/home-assistant/core/pull/63667 +[#63668]: https://github.com/home-assistant/core/pull/63668 +[#63669]: https://github.com/home-assistant/core/pull/63669 +[#63672]: https://github.com/home-assistant/core/pull/63672 +[#63673]: https://github.com/home-assistant/core/pull/63673 +[#63674]: https://github.com/home-assistant/core/pull/63674 +[#63675]: https://github.com/home-assistant/core/pull/63675 +[#63676]: https://github.com/home-assistant/core/pull/63676 +[#63677]: https://github.com/home-assistant/core/pull/63677 +[#63681]: https://github.com/home-assistant/core/pull/63681 +[#63682]: https://github.com/home-assistant/core/pull/63682 +[#63685]: https://github.com/home-assistant/core/pull/63685 +[#63687]: https://github.com/home-assistant/core/pull/63687 +[#63691]: https://github.com/home-assistant/core/pull/63691 +[#63692]: https://github.com/home-assistant/core/pull/63692 +[#63693]: https://github.com/home-assistant/core/pull/63693 +[#63696]: https://github.com/home-assistant/core/pull/63696 +[#63697]: https://github.com/home-assistant/core/pull/63697 +[#63701]: https://github.com/home-assistant/core/pull/63701 +[#63703]: https://github.com/home-assistant/core/pull/63703 +[#63707]: https://github.com/home-assistant/core/pull/63707 +[#63708]: https://github.com/home-assistant/core/pull/63708 +[#63716]: https://github.com/home-assistant/core/pull/63716 +[#63719]: https://github.com/home-assistant/core/pull/63719 +[#63724]: https://github.com/home-assistant/core/pull/63724 +[#63732]: https://github.com/home-assistant/core/pull/63732 +[#63734]: https://github.com/home-assistant/core/pull/63734 +[#63744]: https://github.com/home-assistant/core/pull/63744 +[#63748]: https://github.com/home-assistant/core/pull/63748 +[#63750]: https://github.com/home-assistant/core/pull/63750 +[#63751]: https://github.com/home-assistant/core/pull/63751 +[#63753]: https://github.com/home-assistant/core/pull/63753 +[#63754]: https://github.com/home-assistant/core/pull/63754 +[#63756]: https://github.com/home-assistant/core/pull/63756 +[#63760]: https://github.com/home-assistant/core/pull/63760 +[#63761]: https://github.com/home-assistant/core/pull/63761 +[#63766]: https://github.com/home-assistant/core/pull/63766 +[#63767]: https://github.com/home-assistant/core/pull/63767 +[#63768]: https://github.com/home-assistant/core/pull/63768 +[#63772]: https://github.com/home-assistant/core/pull/63772 +[#63773]: https://github.com/home-assistant/core/pull/63773 +[#63774]: https://github.com/home-assistant/core/pull/63774 +[#63777]: https://github.com/home-assistant/core/pull/63777 +[#63778]: https://github.com/home-assistant/core/pull/63778 +[#63779]: https://github.com/home-assistant/core/pull/63779 +[#63781]: https://github.com/home-assistant/core/pull/63781 +[#63782]: https://github.com/home-assistant/core/pull/63782 +[#63783]: https://github.com/home-assistant/core/pull/63783 +[#63784]: https://github.com/home-assistant/core/pull/63784 +[#63785]: https://github.com/home-assistant/core/pull/63785 +[#63786]: https://github.com/home-assistant/core/pull/63786 +[#63787]: https://github.com/home-assistant/core/pull/63787 +[#63788]: https://github.com/home-assistant/core/pull/63788 +[#63789]: https://github.com/home-assistant/core/pull/63789 +[#63791]: https://github.com/home-assistant/core/pull/63791 +[#63792]: https://github.com/home-assistant/core/pull/63792 +[#63796]: https://github.com/home-assistant/core/pull/63796 +[#63797]: https://github.com/home-assistant/core/pull/63797 +[#63798]: https://github.com/home-assistant/core/pull/63798 +[#63801]: https://github.com/home-assistant/core/pull/63801 +[#63802]: https://github.com/home-assistant/core/pull/63802 +[#63803]: https://github.com/home-assistant/core/pull/63803 +[#63805]: https://github.com/home-assistant/core/pull/63805 +[#63807]: https://github.com/home-assistant/core/pull/63807 +[#63808]: https://github.com/home-assistant/core/pull/63808 +[#63809]: https://github.com/home-assistant/core/pull/63809 +[#63810]: https://github.com/home-assistant/core/pull/63810 +[#63811]: https://github.com/home-assistant/core/pull/63811 +[#63814]: https://github.com/home-assistant/core/pull/63814 +[#63820]: https://github.com/home-assistant/core/pull/63820 +[#63821]: https://github.com/home-assistant/core/pull/63821 +[#63824]: https://github.com/home-assistant/core/pull/63824 +[#63825]: https://github.com/home-assistant/core/pull/63825 +[#63826]: https://github.com/home-assistant/core/pull/63826 +[#63827]: https://github.com/home-assistant/core/pull/63827 +[#63828]: https://github.com/home-assistant/core/pull/63828 +[#63829]: https://github.com/home-assistant/core/pull/63829 +[#63830]: https://github.com/home-assistant/core/pull/63830 +[#63832]: https://github.com/home-assistant/core/pull/63832 +[#63833]: https://github.com/home-assistant/core/pull/63833 +[#63834]: https://github.com/home-assistant/core/pull/63834 +[#63836]: https://github.com/home-assistant/core/pull/63836 +[#63838]: https://github.com/home-assistant/core/pull/63838 +[#63839]: https://github.com/home-assistant/core/pull/63839 +[#63842]: https://github.com/home-assistant/core/pull/63842 +[#63843]: https://github.com/home-assistant/core/pull/63843 +[#63847]: https://github.com/home-assistant/core/pull/63847 +[#63848]: https://github.com/home-assistant/core/pull/63848 +[#63850]: https://github.com/home-assistant/core/pull/63850 +[#63851]: https://github.com/home-assistant/core/pull/63851 +[#63855]: https://github.com/home-assistant/core/pull/63855 +[#63856]: https://github.com/home-assistant/core/pull/63856 +[#63857]: https://github.com/home-assistant/core/pull/63857 +[#63860]: https://github.com/home-assistant/core/pull/63860 +[#63862]: https://github.com/home-assistant/core/pull/63862 +[#63863]: https://github.com/home-assistant/core/pull/63863 +[#63871]: https://github.com/home-assistant/core/pull/63871 +[#63873]: https://github.com/home-assistant/core/pull/63873 +[#63875]: https://github.com/home-assistant/core/pull/63875 +[#63877]: https://github.com/home-assistant/core/pull/63877 +[#63879]: https://github.com/home-assistant/core/pull/63879 +[#63880]: https://github.com/home-assistant/core/pull/63880 +[#63882]: https://github.com/home-assistant/core/pull/63882 +[#63883]: https://github.com/home-assistant/core/pull/63883 +[#63884]: https://github.com/home-assistant/core/pull/63884 +[#63887]: https://github.com/home-assistant/core/pull/63887 +[#63888]: https://github.com/home-assistant/core/pull/63888 +[#63890]: https://github.com/home-assistant/core/pull/63890 +[#63891]: https://github.com/home-assistant/core/pull/63891 +[#63894]: https://github.com/home-assistant/core/pull/63894 +[#63895]: https://github.com/home-assistant/core/pull/63895 +[#63897]: https://github.com/home-assistant/core/pull/63897 +[#63898]: https://github.com/home-assistant/core/pull/63898 +[#63899]: https://github.com/home-assistant/core/pull/63899 +[#63900]: https://github.com/home-assistant/core/pull/63900 +[#63901]: https://github.com/home-assistant/core/pull/63901 +[#63902]: https://github.com/home-assistant/core/pull/63902 +[#63903]: https://github.com/home-assistant/core/pull/63903 +[#63904]: https://github.com/home-assistant/core/pull/63904 +[#63905]: https://github.com/home-assistant/core/pull/63905 +[#63906]: https://github.com/home-assistant/core/pull/63906 +[#63907]: https://github.com/home-assistant/core/pull/63907 +[#63908]: https://github.com/home-assistant/core/pull/63908 +[#63910]: https://github.com/home-assistant/core/pull/63910 +[#63911]: https://github.com/home-assistant/core/pull/63911 +[#63912]: https://github.com/home-assistant/core/pull/63912 +[#63914]: https://github.com/home-assistant/core/pull/63914 +[#63917]: https://github.com/home-assistant/core/pull/63917 +[#63918]: https://github.com/home-assistant/core/pull/63918 +[#63919]: https://github.com/home-assistant/core/pull/63919 +[#63920]: https://github.com/home-assistant/core/pull/63920 +[#63921]: https://github.com/home-assistant/core/pull/63921 +[#63922]: https://github.com/home-assistant/core/pull/63922 +[#63923]: https://github.com/home-assistant/core/pull/63923 +[#63924]: https://github.com/home-assistant/core/pull/63924 +[#63925]: https://github.com/home-assistant/core/pull/63925 +[#63926]: https://github.com/home-assistant/core/pull/63926 +[#63927]: https://github.com/home-assistant/core/pull/63927 +[#63929]: https://github.com/home-assistant/core/pull/63929 +[#63933]: https://github.com/home-assistant/core/pull/63933 +[#63934]: https://github.com/home-assistant/core/pull/63934 +[#63935]: https://github.com/home-assistant/core/pull/63935 +[#63937]: https://github.com/home-assistant/core/pull/63937 +[#63940]: https://github.com/home-assistant/core/pull/63940 +[#63943]: https://github.com/home-assistant/core/pull/63943 +[#63945]: https://github.com/home-assistant/core/pull/63945 +[#63946]: https://github.com/home-assistant/core/pull/63946 +[#63947]: https://github.com/home-assistant/core/pull/63947 +[#63948]: https://github.com/home-assistant/core/pull/63948 +[#63951]: https://github.com/home-assistant/core/pull/63951 +[#63952]: https://github.com/home-assistant/core/pull/63952 +[#63955]: https://github.com/home-assistant/core/pull/63955 +[#63960]: https://github.com/home-assistant/core/pull/63960 +[#63961]: https://github.com/home-assistant/core/pull/63961 +[#63963]: https://github.com/home-assistant/core/pull/63963 +[#63968]: https://github.com/home-assistant/core/pull/63968 +[#63969]: https://github.com/home-assistant/core/pull/63969 +[#63972]: https://github.com/home-assistant/core/pull/63972 +[#63973]: https://github.com/home-assistant/core/pull/63973 +[#63974]: https://github.com/home-assistant/core/pull/63974 +[#63975]: https://github.com/home-assistant/core/pull/63975 +[#63979]: https://github.com/home-assistant/core/pull/63979 +[#63982]: https://github.com/home-assistant/core/pull/63982 +[#63983]: https://github.com/home-assistant/core/pull/63983 +[#63985]: https://github.com/home-assistant/core/pull/63985 +[#63986]: https://github.com/home-assistant/core/pull/63986 +[#63987]: https://github.com/home-assistant/core/pull/63987 +[#63988]: https://github.com/home-assistant/core/pull/63988 +[#63989]: https://github.com/home-assistant/core/pull/63989 +[#63990]: https://github.com/home-assistant/core/pull/63990 +[#63993]: https://github.com/home-assistant/core/pull/63993 +[#63994]: https://github.com/home-assistant/core/pull/63994 +[#63995]: https://github.com/home-assistant/core/pull/63995 +[#63998]: https://github.com/home-assistant/core/pull/63998 +[#64000]: https://github.com/home-assistant/core/pull/64000 +[#64001]: https://github.com/home-assistant/core/pull/64001 +[#64002]: https://github.com/home-assistant/core/pull/64002 +[#64005]: https://github.com/home-assistant/core/pull/64005 +[#64006]: https://github.com/home-assistant/core/pull/64006 +[#64008]: https://github.com/home-assistant/core/pull/64008 +[#64009]: https://github.com/home-assistant/core/pull/64009 +[#64010]: https://github.com/home-assistant/core/pull/64010 +[#64011]: https://github.com/home-assistant/core/pull/64011 +[#64012]: https://github.com/home-assistant/core/pull/64012 +[#64016]: https://github.com/home-assistant/core/pull/64016 +[#64017]: https://github.com/home-assistant/core/pull/64017 +[#64019]: https://github.com/home-assistant/core/pull/64019 +[#64021]: https://github.com/home-assistant/core/pull/64021 +[#64025]: https://github.com/home-assistant/core/pull/64025 +[#64028]: https://github.com/home-assistant/core/pull/64028 +[#64029]: https://github.com/home-assistant/core/pull/64029 +[#64030]: https://github.com/home-assistant/core/pull/64030 +[#64031]: https://github.com/home-assistant/core/pull/64031 +[#64033]: https://github.com/home-assistant/core/pull/64033 +[#64034]: https://github.com/home-assistant/core/pull/64034 +[#64035]: https://github.com/home-assistant/core/pull/64035 +[#64036]: https://github.com/home-assistant/core/pull/64036 +[#64041]: https://github.com/home-assistant/core/pull/64041 +[#64044]: https://github.com/home-assistant/core/pull/64044 +[#64045]: https://github.com/home-assistant/core/pull/64045 +[#64046]: https://github.com/home-assistant/core/pull/64046 +[#64048]: https://github.com/home-assistant/core/pull/64048 +[#64050]: https://github.com/home-assistant/core/pull/64050 +[#64051]: https://github.com/home-assistant/core/pull/64051 +[#64052]: https://github.com/home-assistant/core/pull/64052 +[#64054]: https://github.com/home-assistant/core/pull/64054 +[#64055]: https://github.com/home-assistant/core/pull/64055 +[#64056]: https://github.com/home-assistant/core/pull/64056 +[#64057]: https://github.com/home-assistant/core/pull/64057 +[#64058]: https://github.com/home-assistant/core/pull/64058 +[#64060]: https://github.com/home-assistant/core/pull/64060 +[#64064]: https://github.com/home-assistant/core/pull/64064 +[#64065]: https://github.com/home-assistant/core/pull/64065 +[#64068]: https://github.com/home-assistant/core/pull/64068 +[#64069]: https://github.com/home-assistant/core/pull/64069 +[#64070]: https://github.com/home-assistant/core/pull/64070 +[#64072]: https://github.com/home-assistant/core/pull/64072 +[#64073]: https://github.com/home-assistant/core/pull/64073 +[#64074]: https://github.com/home-assistant/core/pull/64074 +[#64076]: https://github.com/home-assistant/core/pull/64076 +[#64078]: https://github.com/home-assistant/core/pull/64078 +[#64079]: https://github.com/home-assistant/core/pull/64079 +[#64080]: https://github.com/home-assistant/core/pull/64080 +[#64081]: https://github.com/home-assistant/core/pull/64081 +[#64082]: https://github.com/home-assistant/core/pull/64082 +[#64083]: https://github.com/home-assistant/core/pull/64083 +[#64084]: https://github.com/home-assistant/core/pull/64084 +[#64085]: https://github.com/home-assistant/core/pull/64085 +[#64086]: https://github.com/home-assistant/core/pull/64086 +[#64088]: https://github.com/home-assistant/core/pull/64088 +[#64089]: https://github.com/home-assistant/core/pull/64089 +[#64091]: https://github.com/home-assistant/core/pull/64091 +[#64093]: https://github.com/home-assistant/core/pull/64093 +[#64095]: https://github.com/home-assistant/core/pull/64095 +[#64097]: https://github.com/home-assistant/core/pull/64097 +[#64098]: https://github.com/home-assistant/core/pull/64098 +[#64099]: https://github.com/home-assistant/core/pull/64099 +[#64100]: https://github.com/home-assistant/core/pull/64100 +[#64102]: https://github.com/home-assistant/core/pull/64102 +[#64104]: https://github.com/home-assistant/core/pull/64104 +[#64105]: https://github.com/home-assistant/core/pull/64105 +[#64106]: https://github.com/home-assistant/core/pull/64106 +[#64108]: https://github.com/home-assistant/core/pull/64108 +[#64109]: https://github.com/home-assistant/core/pull/64109 +[#64113]: https://github.com/home-assistant/core/pull/64113 +[#64115]: https://github.com/home-assistant/core/pull/64115 +[#64116]: https://github.com/home-assistant/core/pull/64116 +[#64117]: https://github.com/home-assistant/core/pull/64117 +[#64121]: https://github.com/home-assistant/core/pull/64121 +[#64122]: https://github.com/home-assistant/core/pull/64122 +[#64126]: https://github.com/home-assistant/core/pull/64126 +[#64130]: https://github.com/home-assistant/core/pull/64130 +[#64131]: https://github.com/home-assistant/core/pull/64131 +[#64132]: https://github.com/home-assistant/core/pull/64132 +[#64133]: https://github.com/home-assistant/core/pull/64133 +[#64134]: https://github.com/home-assistant/core/pull/64134 +[#64135]: https://github.com/home-assistant/core/pull/64135 +[#64136]: https://github.com/home-assistant/core/pull/64136 +[#64138]: https://github.com/home-assistant/core/pull/64138 +[#64139]: https://github.com/home-assistant/core/pull/64139 +[#64145]: https://github.com/home-assistant/core/pull/64145 +[#64147]: https://github.com/home-assistant/core/pull/64147 +[#64153]: https://github.com/home-assistant/core/pull/64153 +[#64155]: https://github.com/home-assistant/core/pull/64155 +[#64156]: https://github.com/home-assistant/core/pull/64156 +[#64158]: https://github.com/home-assistant/core/pull/64158 +[#64159]: https://github.com/home-assistant/core/pull/64159 +[#64160]: https://github.com/home-assistant/core/pull/64160 +[#64164]: https://github.com/home-assistant/core/pull/64164 +[#64165]: https://github.com/home-assistant/core/pull/64165 +[#64168]: https://github.com/home-assistant/core/pull/64168 +[#64170]: https://github.com/home-assistant/core/pull/64170 +[#64171]: https://github.com/home-assistant/core/pull/64171 +[#64178]: https://github.com/home-assistant/core/pull/64178 +[#64179]: https://github.com/home-assistant/core/pull/64179 +[#64181]: https://github.com/home-assistant/core/pull/64181 +[#64185]: https://github.com/home-assistant/core/pull/64185 +[#64186]: https://github.com/home-assistant/core/pull/64186 +[#64187]: https://github.com/home-assistant/core/pull/64187 +[#64188]: https://github.com/home-assistant/core/pull/64188 +[#64189]: https://github.com/home-assistant/core/pull/64189 +[#64190]: https://github.com/home-assistant/core/pull/64190 +[#64193]: https://github.com/home-assistant/core/pull/64193 +[#64195]: https://github.com/home-assistant/core/pull/64195 +[#64197]: https://github.com/home-assistant/core/pull/64197 +[#64198]: https://github.com/home-assistant/core/pull/64198 +[#64201]: https://github.com/home-assistant/core/pull/64201 +[#64202]: https://github.com/home-assistant/core/pull/64202 +[#64203]: https://github.com/home-assistant/core/pull/64203 +[#64204]: https://github.com/home-assistant/core/pull/64204 +[#64205]: https://github.com/home-assistant/core/pull/64205 +[#64208]: https://github.com/home-assistant/core/pull/64208 +[#64209]: https://github.com/home-assistant/core/pull/64209 +[#64211]: https://github.com/home-assistant/core/pull/64211 +[#64212]: https://github.com/home-assistant/core/pull/64212 +[#64213]: https://github.com/home-assistant/core/pull/64213 +[#64214]: https://github.com/home-assistant/core/pull/64214 +[#64218]: https://github.com/home-assistant/core/pull/64218 +[#64219]: https://github.com/home-assistant/core/pull/64219 +[#64220]: https://github.com/home-assistant/core/pull/64220 +[#64227]: https://github.com/home-assistant/core/pull/64227 +[#64228]: https://github.com/home-assistant/core/pull/64228 +[#64229]: https://github.com/home-assistant/core/pull/64229 +[#64230]: https://github.com/home-assistant/core/pull/64230 +[#64231]: https://github.com/home-assistant/core/pull/64231 +[#64232]: https://github.com/home-assistant/core/pull/64232 +[#64233]: https://github.com/home-assistant/core/pull/64233 +[#64234]: https://github.com/home-assistant/core/pull/64234 +[#64235]: https://github.com/home-assistant/core/pull/64235 +[#64236]: https://github.com/home-assistant/core/pull/64236 +[#64237]: https://github.com/home-assistant/core/pull/64237 +[#64238]: https://github.com/home-assistant/core/pull/64238 +[#64239]: https://github.com/home-assistant/core/pull/64239 +[#64240]: https://github.com/home-assistant/core/pull/64240 +[#64241]: https://github.com/home-assistant/core/pull/64241 +[#64242]: https://github.com/home-assistant/core/pull/64242 +[#64243]: https://github.com/home-assistant/core/pull/64243 +[#64244]: https://github.com/home-assistant/core/pull/64244 +[#64245]: https://github.com/home-assistant/core/pull/64245 +[#64247]: https://github.com/home-assistant/core/pull/64247 +[#64248]: https://github.com/home-assistant/core/pull/64248 +[#64250]: https://github.com/home-assistant/core/pull/64250 +[#64251]: https://github.com/home-assistant/core/pull/64251 +[#64252]: https://github.com/home-assistant/core/pull/64252 +[#64253]: https://github.com/home-assistant/core/pull/64253 +[#64255]: https://github.com/home-assistant/core/pull/64255 +[#64257]: https://github.com/home-assistant/core/pull/64257 +[#64258]: https://github.com/home-assistant/core/pull/64258 +[#64259]: https://github.com/home-assistant/core/pull/64259 +[#64260]: https://github.com/home-assistant/core/pull/64260 +[#64261]: https://github.com/home-assistant/core/pull/64261 +[#64262]: https://github.com/home-assistant/core/pull/64262 +[#64263]: https://github.com/home-assistant/core/pull/64263 +[#64264]: https://github.com/home-assistant/core/pull/64264 +[#64265]: https://github.com/home-assistant/core/pull/64265 +[#64266]: https://github.com/home-assistant/core/pull/64266 +[#64267]: https://github.com/home-assistant/core/pull/64267 +[#64268]: https://github.com/home-assistant/core/pull/64268 +[#64269]: https://github.com/home-assistant/core/pull/64269 +[#64270]: https://github.com/home-assistant/core/pull/64270 +[#64271]: https://github.com/home-assistant/core/pull/64271 +[#64272]: https://github.com/home-assistant/core/pull/64272 +[#64273]: https://github.com/home-assistant/core/pull/64273 +[#64274]: https://github.com/home-assistant/core/pull/64274 +[#64275]: https://github.com/home-assistant/core/pull/64275 +[#64276]: https://github.com/home-assistant/core/pull/64276 +[#64278]: https://github.com/home-assistant/core/pull/64278 +[#64280]: https://github.com/home-assistant/core/pull/64280 +[#64283]: https://github.com/home-assistant/core/pull/64283 +[#64286]: https://github.com/home-assistant/core/pull/64286 +[#64287]: https://github.com/home-assistant/core/pull/64287 +[#64289]: https://github.com/home-assistant/core/pull/64289 +[#64290]: https://github.com/home-assistant/core/pull/64290 +[#64291]: https://github.com/home-assistant/core/pull/64291 +[#64293]: https://github.com/home-assistant/core/pull/64293 +[#64294]: https://github.com/home-assistant/core/pull/64294 +[#64296]: https://github.com/home-assistant/core/pull/64296 +[#64297]: https://github.com/home-assistant/core/pull/64297 +[#64301]: https://github.com/home-assistant/core/pull/64301 +[#64304]: https://github.com/home-assistant/core/pull/64304 +[#64306]: https://github.com/home-assistant/core/pull/64306 +[#64311]: https://github.com/home-assistant/core/pull/64311 +[#64312]: https://github.com/home-assistant/core/pull/64312 +[#64313]: https://github.com/home-assistant/core/pull/64313 +[#64320]: https://github.com/home-assistant/core/pull/64320 +[#64321]: https://github.com/home-assistant/core/pull/64321 +[#64322]: https://github.com/home-assistant/core/pull/64322 +[#64324]: https://github.com/home-assistant/core/pull/64324 +[#64329]: https://github.com/home-assistant/core/pull/64329 +[#64330]: https://github.com/home-assistant/core/pull/64330 +[#64333]: https://github.com/home-assistant/core/pull/64333 +[#64334]: https://github.com/home-assistant/core/pull/64334 +[#64336]: https://github.com/home-assistant/core/pull/64336 +[#64337]: https://github.com/home-assistant/core/pull/64337 +[#64339]: https://github.com/home-assistant/core/pull/64339 +[#64340]: https://github.com/home-assistant/core/pull/64340 +[#64341]: https://github.com/home-assistant/core/pull/64341 +[#64343]: https://github.com/home-assistant/core/pull/64343 +[#64344]: https://github.com/home-assistant/core/pull/64344 +[#64345]: https://github.com/home-assistant/core/pull/64345 +[#64347]: https://github.com/home-assistant/core/pull/64347 +[#64350]: https://github.com/home-assistant/core/pull/64350 +[#64351]: https://github.com/home-assistant/core/pull/64351 +[#64352]: https://github.com/home-assistant/core/pull/64352 +[#64354]: https://github.com/home-assistant/core/pull/64354 +[#64355]: https://github.com/home-assistant/core/pull/64355 +[#64358]: https://github.com/home-assistant/core/pull/64358 +[#64367]: https://github.com/home-assistant/core/pull/64367 +[#64368]: https://github.com/home-assistant/core/pull/64368 +[#64374]: https://github.com/home-assistant/core/pull/64374 +[#64376]: https://github.com/home-assistant/core/pull/64376 +[#64377]: https://github.com/home-assistant/core/pull/64377 +[#64378]: https://github.com/home-assistant/core/pull/64378 +[#64379]: https://github.com/home-assistant/core/pull/64379 +[#64380]: https://github.com/home-assistant/core/pull/64380 +[#64382]: https://github.com/home-assistant/core/pull/64382 +[#64385]: https://github.com/home-assistant/core/pull/64385 +[#64386]: https://github.com/home-assistant/core/pull/64386 +[#64387]: https://github.com/home-assistant/core/pull/64387 +[#64388]: https://github.com/home-assistant/core/pull/64388 +[#64389]: https://github.com/home-assistant/core/pull/64389 +[#64391]: https://github.com/home-assistant/core/pull/64391 +[#64392]: https://github.com/home-assistant/core/pull/64392 +[#64394]: https://github.com/home-assistant/core/pull/64394 +[#64395]: https://github.com/home-assistant/core/pull/64395 +[#64397]: https://github.com/home-assistant/core/pull/64397 +[#64402]: https://github.com/home-assistant/core/pull/64402 +[#64403]: https://github.com/home-assistant/core/pull/64403 +[#64405]: https://github.com/home-assistant/core/pull/64405 +[#64407]: https://github.com/home-assistant/core/pull/64407 +[#64409]: https://github.com/home-assistant/core/pull/64409 +[#64411]: https://github.com/home-assistant/core/pull/64411 +[#64412]: https://github.com/home-assistant/core/pull/64412 +[#64413]: https://github.com/home-assistant/core/pull/64413 +[#64414]: https://github.com/home-assistant/core/pull/64414 +[#64417]: https://github.com/home-assistant/core/pull/64417 +[#64419]: https://github.com/home-assistant/core/pull/64419 +[#64420]: https://github.com/home-assistant/core/pull/64420 +[#64421]: https://github.com/home-assistant/core/pull/64421 +[#64424]: https://github.com/home-assistant/core/pull/64424 +[#64427]: https://github.com/home-assistant/core/pull/64427 +[#64428]: https://github.com/home-assistant/core/pull/64428 +[#64430]: https://github.com/home-assistant/core/pull/64430 +[#64431]: https://github.com/home-assistant/core/pull/64431 +[#64435]: https://github.com/home-assistant/core/pull/64435 +[#64437]: https://github.com/home-assistant/core/pull/64437 +[#64438]: https://github.com/home-assistant/core/pull/64438 +[#64439]: https://github.com/home-assistant/core/pull/64439 +[#64448]: https://github.com/home-assistant/core/pull/64448 +[#64449]: https://github.com/home-assistant/core/pull/64449 +[#64450]: https://github.com/home-assistant/core/pull/64450 +[#64452]: https://github.com/home-assistant/core/pull/64452 +[#64456]: https://github.com/home-assistant/core/pull/64456 +[#64457]: https://github.com/home-assistant/core/pull/64457 +[#64462]: https://github.com/home-assistant/core/pull/64462 +[#64463]: https://github.com/home-assistant/core/pull/64463 +[#64466]: https://github.com/home-assistant/core/pull/64466 +[#64467]: https://github.com/home-assistant/core/pull/64467 +[#64468]: https://github.com/home-assistant/core/pull/64468 +[#64469]: https://github.com/home-assistant/core/pull/64469 +[#64470]: https://github.com/home-assistant/core/pull/64470 +[#64471]: https://github.com/home-assistant/core/pull/64471 +[#64472]: https://github.com/home-assistant/core/pull/64472 +[#64473]: https://github.com/home-assistant/core/pull/64473 +[#64474]: https://github.com/home-assistant/core/pull/64474 +[#64475]: https://github.com/home-assistant/core/pull/64475 +[#64476]: https://github.com/home-assistant/core/pull/64476 +[#64478]: https://github.com/home-assistant/core/pull/64478 +[#64479]: https://github.com/home-assistant/core/pull/64479 +[#64480]: https://github.com/home-assistant/core/pull/64480 +[#64481]: https://github.com/home-assistant/core/pull/64481 +[#64483]: https://github.com/home-assistant/core/pull/64483 +[#64486]: https://github.com/home-assistant/core/pull/64486 +[#64489]: https://github.com/home-assistant/core/pull/64489 +[#64490]: https://github.com/home-assistant/core/pull/64490 +[#64492]: https://github.com/home-assistant/core/pull/64492 +[#64493]: https://github.com/home-assistant/core/pull/64493 +[#64495]: https://github.com/home-assistant/core/pull/64495 +[#64496]: https://github.com/home-assistant/core/pull/64496 +[#64498]: https://github.com/home-assistant/core/pull/64498 +[#64499]: https://github.com/home-assistant/core/pull/64499 +[#64500]: https://github.com/home-assistant/core/pull/64500 +[#64501]: https://github.com/home-assistant/core/pull/64501 +[#64502]: https://github.com/home-assistant/core/pull/64502 +[#64503]: https://github.com/home-assistant/core/pull/64503 +[#64504]: https://github.com/home-assistant/core/pull/64504 +[#64505]: https://github.com/home-assistant/core/pull/64505 +[#64506]: https://github.com/home-assistant/core/pull/64506 +[#64507]: https://github.com/home-assistant/core/pull/64507 +[#64508]: https://github.com/home-assistant/core/pull/64508 +[#64509]: https://github.com/home-assistant/core/pull/64509 +[#64510]: https://github.com/home-assistant/core/pull/64510 +[#64511]: https://github.com/home-assistant/core/pull/64511 +[#64512]: https://github.com/home-assistant/core/pull/64512 +[#64513]: https://github.com/home-assistant/core/pull/64513 +[#64514]: https://github.com/home-assistant/core/pull/64514 +[#64515]: https://github.com/home-assistant/core/pull/64515 +[#64516]: https://github.com/home-assistant/core/pull/64516 +[#64517]: https://github.com/home-assistant/core/pull/64517 +[#64519]: https://github.com/home-assistant/core/pull/64519 +[#64520]: https://github.com/home-assistant/core/pull/64520 +[#64521]: https://github.com/home-assistant/core/pull/64521 +[#64522]: https://github.com/home-assistant/core/pull/64522 +[#64523]: https://github.com/home-assistant/core/pull/64523 +[#64524]: https://github.com/home-assistant/core/pull/64524 +[#64525]: https://github.com/home-assistant/core/pull/64525 +[#64526]: https://github.com/home-assistant/core/pull/64526 +[#64527]: https://github.com/home-assistant/core/pull/64527 +[#64528]: https://github.com/home-assistant/core/pull/64528 +[#64529]: https://github.com/home-assistant/core/pull/64529 +[#64531]: https://github.com/home-assistant/core/pull/64531 +[#64532]: https://github.com/home-assistant/core/pull/64532 +[#64533]: https://github.com/home-assistant/core/pull/64533 +[#64534]: https://github.com/home-assistant/core/pull/64534 +[#64536]: https://github.com/home-assistant/core/pull/64536 +[#64537]: https://github.com/home-assistant/core/pull/64537 +[#64540]: https://github.com/home-assistant/core/pull/64540 +[#64541]: https://github.com/home-assistant/core/pull/64541 +[#64542]: https://github.com/home-assistant/core/pull/64542 +[#64543]: https://github.com/home-assistant/core/pull/64543 +[#64544]: https://github.com/home-assistant/core/pull/64544 +[#64546]: https://github.com/home-assistant/core/pull/64546 +[#64549]: https://github.com/home-assistant/core/pull/64549 +[#64550]: https://github.com/home-assistant/core/pull/64550 +[#64552]: https://github.com/home-assistant/core/pull/64552 +[#64553]: https://github.com/home-assistant/core/pull/64553 +[#64554]: https://github.com/home-assistant/core/pull/64554 +[#64557]: https://github.com/home-assistant/core/pull/64557 +[#64558]: https://github.com/home-assistant/core/pull/64558 +[#64559]: https://github.com/home-assistant/core/pull/64559 +[#64561]: https://github.com/home-assistant/core/pull/64561 +[#64564]: https://github.com/home-assistant/core/pull/64564 +[#64565]: https://github.com/home-assistant/core/pull/64565 +[#64567]: https://github.com/home-assistant/core/pull/64567 +[#64568]: https://github.com/home-assistant/core/pull/64568 +[#64571]: https://github.com/home-assistant/core/pull/64571 +[#64572]: https://github.com/home-assistant/core/pull/64572 +[#64573]: https://github.com/home-assistant/core/pull/64573 +[#64574]: https://github.com/home-assistant/core/pull/64574 +[#64575]: https://github.com/home-assistant/core/pull/64575 +[#64576]: https://github.com/home-assistant/core/pull/64576 +[#64577]: https://github.com/home-assistant/core/pull/64577 +[#64579]: https://github.com/home-assistant/core/pull/64579 +[#64580]: https://github.com/home-assistant/core/pull/64580 +[#64581]: https://github.com/home-assistant/core/pull/64581 +[#64582]: https://github.com/home-assistant/core/pull/64582 +[#64583]: https://github.com/home-assistant/core/pull/64583 +[#64584]: https://github.com/home-assistant/core/pull/64584 +[#64585]: https://github.com/home-assistant/core/pull/64585 +[#64586]: https://github.com/home-assistant/core/pull/64586 +[#64587]: https://github.com/home-assistant/core/pull/64587 +[#64591]: https://github.com/home-assistant/core/pull/64591 +[#64593]: https://github.com/home-assistant/core/pull/64593 +[#64596]: https://github.com/home-assistant/core/pull/64596 +[#64597]: https://github.com/home-assistant/core/pull/64597 +[#64598]: https://github.com/home-assistant/core/pull/64598 +[#64599]: https://github.com/home-assistant/core/pull/64599 +[#64600]: https://github.com/home-assistant/core/pull/64600 +[#64601]: https://github.com/home-assistant/core/pull/64601 +[#64602]: https://github.com/home-assistant/core/pull/64602 +[#64603]: https://github.com/home-assistant/core/pull/64603 +[#64605]: https://github.com/home-assistant/core/pull/64605 +[#64606]: https://github.com/home-assistant/core/pull/64606 +[#64607]: https://github.com/home-assistant/core/pull/64607 +[#64608]: https://github.com/home-assistant/core/pull/64608 +[#64610]: https://github.com/home-assistant/core/pull/64610 +[#64613]: https://github.com/home-assistant/core/pull/64613 +[#64617]: https://github.com/home-assistant/core/pull/64617 +[#64618]: https://github.com/home-assistant/core/pull/64618 +[#64619]: https://github.com/home-assistant/core/pull/64619 +[#64620]: https://github.com/home-assistant/core/pull/64620 +[#64621]: https://github.com/home-assistant/core/pull/64621 +[#64622]: https://github.com/home-assistant/core/pull/64622 +[#64624]: https://github.com/home-assistant/core/pull/64624 +[#64625]: https://github.com/home-assistant/core/pull/64625 +[#64627]: https://github.com/home-assistant/core/pull/64627 +[#64629]: https://github.com/home-assistant/core/pull/64629 +[#64630]: https://github.com/home-assistant/core/pull/64630 +[#64631]: https://github.com/home-assistant/core/pull/64631 +[#64634]: https://github.com/home-assistant/core/pull/64634 +[#64636]: https://github.com/home-assistant/core/pull/64636 +[#64637]: https://github.com/home-assistant/core/pull/64637 +[#64638]: https://github.com/home-assistant/core/pull/64638 +[#64640]: https://github.com/home-assistant/core/pull/64640 +[#64641]: https://github.com/home-assistant/core/pull/64641 +[#64642]: https://github.com/home-assistant/core/pull/64642 +[#64643]: https://github.com/home-assistant/core/pull/64643 +[#64645]: https://github.com/home-assistant/core/pull/64645 +[#64646]: https://github.com/home-assistant/core/pull/64646 +[#64647]: https://github.com/home-assistant/core/pull/64647 +[#64649]: https://github.com/home-assistant/core/pull/64649 +[#64650]: https://github.com/home-assistant/core/pull/64650 +[#64651]: https://github.com/home-assistant/core/pull/64651 +[#64652]: https://github.com/home-assistant/core/pull/64652 +[#64655]: https://github.com/home-assistant/core/pull/64655 +[#64656]: https://github.com/home-assistant/core/pull/64656 +[#64657]: https://github.com/home-assistant/core/pull/64657 +[#64660]: https://github.com/home-assistant/core/pull/64660 +[#64661]: https://github.com/home-assistant/core/pull/64661 +[#64662]: https://github.com/home-assistant/core/pull/64662 +[#64663]: https://github.com/home-assistant/core/pull/64663 +[#64664]: https://github.com/home-assistant/core/pull/64664 +[#64665]: https://github.com/home-assistant/core/pull/64665 +[#64666]: https://github.com/home-assistant/core/pull/64666 +[#64667]: https://github.com/home-assistant/core/pull/64667 +[#64669]: https://github.com/home-assistant/core/pull/64669 +[#64670]: https://github.com/home-assistant/core/pull/64670 +[#64671]: https://github.com/home-assistant/core/pull/64671 +[#64672]: https://github.com/home-assistant/core/pull/64672 +[#64673]: https://github.com/home-assistant/core/pull/64673 +[#64676]: https://github.com/home-assistant/core/pull/64676 +[#64682]: https://github.com/home-assistant/core/pull/64682 +[#64683]: https://github.com/home-assistant/core/pull/64683 +[#64687]: https://github.com/home-assistant/core/pull/64687 +[#64688]: https://github.com/home-assistant/core/pull/64688 +[#64690]: https://github.com/home-assistant/core/pull/64690 +[#64693]: https://github.com/home-assistant/core/pull/64693 +[#64695]: https://github.com/home-assistant/core/pull/64695 +[#64697]: https://github.com/home-assistant/core/pull/64697 +[#64698]: https://github.com/home-assistant/core/pull/64698 +[#64701]: https://github.com/home-assistant/core/pull/64701 +[#64702]: https://github.com/home-assistant/core/pull/64702 +[#64704]: https://github.com/home-assistant/core/pull/64704 +[#64705]: https://github.com/home-assistant/core/pull/64705 +[#64707]: https://github.com/home-assistant/core/pull/64707 +[#64708]: https://github.com/home-assistant/core/pull/64708 +[#64711]: https://github.com/home-assistant/core/pull/64711 +[#64713]: https://github.com/home-assistant/core/pull/64713 +[#64714]: https://github.com/home-assistant/core/pull/64714 +[#64715]: https://github.com/home-assistant/core/pull/64715 +[#64716]: https://github.com/home-assistant/core/pull/64716 +[#64717]: https://github.com/home-assistant/core/pull/64717 +[#64719]: https://github.com/home-assistant/core/pull/64719 +[#64721]: https://github.com/home-assistant/core/pull/64721 +[#64722]: https://github.com/home-assistant/core/pull/64722 +[#64723]: https://github.com/home-assistant/core/pull/64723 +[#64725]: https://github.com/home-assistant/core/pull/64725 +[#64729]: https://github.com/home-assistant/core/pull/64729 +[#64732]: https://github.com/home-assistant/core/pull/64732 +[#64733]: https://github.com/home-assistant/core/pull/64733 +[#64734]: https://github.com/home-assistant/core/pull/64734 +[#64736]: https://github.com/home-assistant/core/pull/64736 +[#64738]: https://github.com/home-assistant/core/pull/64738 +[#64739]: https://github.com/home-assistant/core/pull/64739 +[#64740]: https://github.com/home-assistant/core/pull/64740 +[#64741]: https://github.com/home-assistant/core/pull/64741 +[#64742]: https://github.com/home-assistant/core/pull/64742 +[#64743]: https://github.com/home-assistant/core/pull/64743 +[#64744]: https://github.com/home-assistant/core/pull/64744 +[#64745]: https://github.com/home-assistant/core/pull/64745 +[#64746]: https://github.com/home-assistant/core/pull/64746 +[#64747]: https://github.com/home-assistant/core/pull/64747 +[#64748]: https://github.com/home-assistant/core/pull/64748 +[#64749]: https://github.com/home-assistant/core/pull/64749 +[#64750]: https://github.com/home-assistant/core/pull/64750 +[#64751]: https://github.com/home-assistant/core/pull/64751 +[#64752]: https://github.com/home-assistant/core/pull/64752 +[#64754]: https://github.com/home-assistant/core/pull/64754 +[#64756]: https://github.com/home-assistant/core/pull/64756 +[#64760]: https://github.com/home-assistant/core/pull/64760 +[#64761]: https://github.com/home-assistant/core/pull/64761 +[#64765]: https://github.com/home-assistant/core/pull/64765 +[#64766]: https://github.com/home-assistant/core/pull/64766 +[#64768]: https://github.com/home-assistant/core/pull/64768 +[#64769]: https://github.com/home-assistant/core/pull/64769 +[#64771]: https://github.com/home-assistant/core/pull/64771 +[#64773]: https://github.com/home-assistant/core/pull/64773 +[#64776]: https://github.com/home-assistant/core/pull/64776 +[#64779]: https://github.com/home-assistant/core/pull/64779 +[#64780]: https://github.com/home-assistant/core/pull/64780 +[#64781]: https://github.com/home-assistant/core/pull/64781 +[#64782]: https://github.com/home-assistant/core/pull/64782 +[#64783]: https://github.com/home-assistant/core/pull/64783 +[#64784]: https://github.com/home-assistant/core/pull/64784 +[#64785]: https://github.com/home-assistant/core/pull/64785 +[#64786]: https://github.com/home-assistant/core/pull/64786 +[#64787]: https://github.com/home-assistant/core/pull/64787 +[#64788]: https://github.com/home-assistant/core/pull/64788 +[#64789]: https://github.com/home-assistant/core/pull/64789 +[#64792]: https://github.com/home-assistant/core/pull/64792 +[#64793]: https://github.com/home-assistant/core/pull/64793 +[#64794]: https://github.com/home-assistant/core/pull/64794 +[#64795]: https://github.com/home-assistant/core/pull/64795 +[#64797]: https://github.com/home-assistant/core/pull/64797 +[#64798]: https://github.com/home-assistant/core/pull/64798 +[#64799]: https://github.com/home-assistant/core/pull/64799 +[#64800]: https://github.com/home-assistant/core/pull/64800 +[#64801]: https://github.com/home-assistant/core/pull/64801 +[#64804]: https://github.com/home-assistant/core/pull/64804 +[#64805]: https://github.com/home-assistant/core/pull/64805 +[#64806]: https://github.com/home-assistant/core/pull/64806 +[#64807]: https://github.com/home-assistant/core/pull/64807 +[#64808]: https://github.com/home-assistant/core/pull/64808 +[#64810]: https://github.com/home-assistant/core/pull/64810 +[#64812]: https://github.com/home-assistant/core/pull/64812 +[#64813]: https://github.com/home-assistant/core/pull/64813 +[#64814]: https://github.com/home-assistant/core/pull/64814 +[#64817]: https://github.com/home-assistant/core/pull/64817 +[#64818]: https://github.com/home-assistant/core/pull/64818 +[#64819]: https://github.com/home-assistant/core/pull/64819 +[#64821]: https://github.com/home-assistant/core/pull/64821 +[#64822]: https://github.com/home-assistant/core/pull/64822 +[#64823]: https://github.com/home-assistant/core/pull/64823 +[#64826]: https://github.com/home-assistant/core/pull/64826 +[#64827]: https://github.com/home-assistant/core/pull/64827 +[#64829]: https://github.com/home-assistant/core/pull/64829 +[#64831]: https://github.com/home-assistant/core/pull/64831 +[#64833]: https://github.com/home-assistant/core/pull/64833 +[#64835]: https://github.com/home-assistant/core/pull/64835 +[#64836]: https://github.com/home-assistant/core/pull/64836 +[#64837]: https://github.com/home-assistant/core/pull/64837 +[#64838]: https://github.com/home-assistant/core/pull/64838 +[#64841]: https://github.com/home-assistant/core/pull/64841 +[#64842]: https://github.com/home-assistant/core/pull/64842 +[#64843]: https://github.com/home-assistant/core/pull/64843 +[#64844]: https://github.com/home-assistant/core/pull/64844 +[#64845]: https://github.com/home-assistant/core/pull/64845 +[#64846]: https://github.com/home-assistant/core/pull/64846 +[#64848]: https://github.com/home-assistant/core/pull/64848 +[#64851]: https://github.com/home-assistant/core/pull/64851 +[#64853]: https://github.com/home-assistant/core/pull/64853 +[#64854]: https://github.com/home-assistant/core/pull/64854 +[#64855]: https://github.com/home-assistant/core/pull/64855 +[#64857]: https://github.com/home-assistant/core/pull/64857 +[#64858]: https://github.com/home-assistant/core/pull/64858 +[#64859]: https://github.com/home-assistant/core/pull/64859 +[#64862]: https://github.com/home-assistant/core/pull/64862 +[#64863]: https://github.com/home-assistant/core/pull/64863 +[#64864]: https://github.com/home-assistant/core/pull/64864 +[#64866]: https://github.com/home-assistant/core/pull/64866 +[#64869]: https://github.com/home-assistant/core/pull/64869 +[#64871]: https://github.com/home-assistant/core/pull/64871 +[#64872]: https://github.com/home-assistant/core/pull/64872 +[#64873]: https://github.com/home-assistant/core/pull/64873 +[#64874]: https://github.com/home-assistant/core/pull/64874 +[#64875]: https://github.com/home-assistant/core/pull/64875 +[#64876]: https://github.com/home-assistant/core/pull/64876 +[#64877]: https://github.com/home-assistant/core/pull/64877 +[#64878]: https://github.com/home-assistant/core/pull/64878 +[#64879]: https://github.com/home-assistant/core/pull/64879 +[#64881]: https://github.com/home-assistant/core/pull/64881 +[#64882]: https://github.com/home-assistant/core/pull/64882 +[#64885]: https://github.com/home-assistant/core/pull/64885 +[#64887]: https://github.com/home-assistant/core/pull/64887 +[#64889]: https://github.com/home-assistant/core/pull/64889 +[#64893]: https://github.com/home-assistant/core/pull/64893 +[#64894]: https://github.com/home-assistant/core/pull/64894 +[#64895]: https://github.com/home-assistant/core/pull/64895 +[#64896]: https://github.com/home-assistant/core/pull/64896 +[#64897]: https://github.com/home-assistant/core/pull/64897 +[#64898]: https://github.com/home-assistant/core/pull/64898 +[#64899]: https://github.com/home-assistant/core/pull/64899 +[#64900]: https://github.com/home-assistant/core/pull/64900 +[#64901]: https://github.com/home-assistant/core/pull/64901 +[#64903]: https://github.com/home-assistant/core/pull/64903 +[#64905]: https://github.com/home-assistant/core/pull/64905 +[#64906]: https://github.com/home-assistant/core/pull/64906 +[#64907]: https://github.com/home-assistant/core/pull/64907 +[#64908]: https://github.com/home-assistant/core/pull/64908 +[#64909]: https://github.com/home-assistant/core/pull/64909 +[#64910]: https://github.com/home-assistant/core/pull/64910 +[#64911]: https://github.com/home-assistant/core/pull/64911 +[#64912]: https://github.com/home-assistant/core/pull/64912 +[#64915]: https://github.com/home-assistant/core/pull/64915 +[#64917]: https://github.com/home-assistant/core/pull/64917 +[#64921]: https://github.com/home-assistant/core/pull/64921 +[#64922]: https://github.com/home-assistant/core/pull/64922 +[#64923]: https://github.com/home-assistant/core/pull/64923 +[#64924]: https://github.com/home-assistant/core/pull/64924 +[#64928]: https://github.com/home-assistant/core/pull/64928 +[#64929]: https://github.com/home-assistant/core/pull/64929 +[#64930]: https://github.com/home-assistant/core/pull/64930 +[#64931]: https://github.com/home-assistant/core/pull/64931 +[#64932]: https://github.com/home-assistant/core/pull/64932 +[#64933]: https://github.com/home-assistant/core/pull/64933 +[#64934]: https://github.com/home-assistant/core/pull/64934 +[#64935]: https://github.com/home-assistant/core/pull/64935 +[#64936]: https://github.com/home-assistant/core/pull/64936 +[#64937]: https://github.com/home-assistant/core/pull/64937 +[#64939]: https://github.com/home-assistant/core/pull/64939 +[#64940]: https://github.com/home-assistant/core/pull/64940 +[#64941]: https://github.com/home-assistant/core/pull/64941 +[#64943]: https://github.com/home-assistant/core/pull/64943 +[#64946]: https://github.com/home-assistant/core/pull/64946 +[#64947]: https://github.com/home-assistant/core/pull/64947 +[#64948]: https://github.com/home-assistant/core/pull/64948 +[#64949]: https://github.com/home-assistant/core/pull/64949 +[#64951]: https://github.com/home-assistant/core/pull/64951 +[#64954]: https://github.com/home-assistant/core/pull/64954 +[#64956]: https://github.com/home-assistant/core/pull/64956 +[#64958]: https://github.com/home-assistant/core/pull/64958 +[#64961]: https://github.com/home-assistant/core/pull/64961 +[#64962]: https://github.com/home-assistant/core/pull/64962 +[#64963]: https://github.com/home-assistant/core/pull/64963 +[#64964]: https://github.com/home-assistant/core/pull/64964 +[#64965]: https://github.com/home-assistant/core/pull/64965 +[#64967]: https://github.com/home-assistant/core/pull/64967 +[#64968]: https://github.com/home-assistant/core/pull/64968 +[#64969]: https://github.com/home-assistant/core/pull/64969 +[#64970]: https://github.com/home-assistant/core/pull/64970 +[#64971]: https://github.com/home-assistant/core/pull/64971 +[#64973]: https://github.com/home-assistant/core/pull/64973 +[#64974]: https://github.com/home-assistant/core/pull/64974 +[#64975]: https://github.com/home-assistant/core/pull/64975 +[#64979]: https://github.com/home-assistant/core/pull/64979 +[#64980]: https://github.com/home-assistant/core/pull/64980 +[#64981]: https://github.com/home-assistant/core/pull/64981 +[#64982]: https://github.com/home-assistant/core/pull/64982 +[#64983]: https://github.com/home-assistant/core/pull/64983 +[#64984]: https://github.com/home-assistant/core/pull/64984 +[#64990]: https://github.com/home-assistant/core/pull/64990 +[#64991]: https://github.com/home-assistant/core/pull/64991 +[#64993]: https://github.com/home-assistant/core/pull/64993 +[#64994]: https://github.com/home-assistant/core/pull/64994 +[#64995]: https://github.com/home-assistant/core/pull/64995 +[@ANMalko]: https://github.com/ANMalko +[@Adminiuga]: https://github.com/Adminiuga +[@Aeroid]: https://github.com/Aeroid +[@Alex9779]: https://github.com/Alex9779 +[@AngellusMortis]: https://github.com/AngellusMortis +[@BraveChicken1]: https://github.com/BraveChicken1 +[@Bre77]: https://github.com/Bre77 +[@Cereal2nd]: https://github.com/Cereal2nd +[@Chen-IL]: https://github.com/Chen-IL +[@ColinRobbins]: https://github.com/ColinRobbins +[@DCSBL]: https://github.com/DCSBL +[@Danielhiversen]: https://github.com/Danielhiversen +[@DeerMaximum]: https://github.com/DeerMaximum +[@Djowie]: https://github.com/Djowie +[@Drafteed]: https://github.com/Drafteed +[@DurgNomis-drol]: https://github.com/DurgNomis-drol +[@Eernie]: https://github.com/Eernie +[@Ernst79]: https://github.com/Ernst79 +[@GuyKh]: https://github.com/GuyKh +[@Hedda]: https://github.com/Hedda +[@Jc2k]: https://github.com/Jc2k +[@JeffLIrion]: https://github.com/JeffLIrion +[@Kane610]: https://github.com/Kane610 +[@KapJI]: https://github.com/KapJI +[@LEJOUI]: https://github.com/LEJOUI +[@LoekSangers]: https://github.com/LoekSangers +[@Lyr3x]: https://github.com/Lyr3x +[@MZachmann]: https://github.com/MZachmann +[@MartinHjelmare]: https://github.com/MartinHjelmare +[@MirkoLenz]: https://github.com/MirkoLenz +[@MizterB]: https://github.com/MizterB +[@Noltari]: https://github.com/Noltari +[@OGKevin]: https://github.com/OGKevin +[@OnFreund]: https://github.com/OnFreund +[@OpenMyDog]: https://github.com/OpenMyDog +[@OttoWinter]: https://github.com/OttoWinter +[@Petro31]: https://github.com/Petro31 +[@RefineryX]: https://github.com/RefineryX +[@RenierM26]: https://github.com/RenierM26 +[@RobBie1221]: https://github.com/RobBie1221 +[@RogerSelwyn]: https://github.com/RogerSelwyn +[@Sdahl1234]: https://github.com/Sdahl1234 +[@Shutgun]: https://github.com/Shutgun +[@StephanU]: https://github.com/StephanU +[@StevenLooman]: https://github.com/StevenLooman +[@Swamp-Ig]: https://github.com/Swamp-Ig +[@Tathar]: https://github.com/Tathar +[@ThomDietrich]: https://github.com/ThomDietrich +[@TomBrien]: https://github.com/TomBrien +[@ZephireNZ]: https://github.com/ZephireNZ +[@agners]: https://github.com/agners +[@ajschmidt8]: https://github.com/ajschmidt8 +[@albertogeniola]: https://github.com/albertogeniola +[@alengwenus]: https://github.com/alengwenus +[@alexanv1]: https://github.com/alexanv1 +[@alim4r]: https://github.com/alim4r +[@allenporter]: https://github.com/allenporter +[@amosyuen]: https://github.com/amosyuen +[@andre-richter]: https://github.com/andre-richter +[@aomann]: https://github.com/aomann +[@atmurray]: https://github.com/atmurray +[@austinmroczek]: https://github.com/austinmroczek +[@avee87]: https://github.com/avee87 +[@bachya]: https://github.com/bachya +[@bairnhard]: https://github.com/bairnhard +[@balloob]: https://github.com/balloob +[@bdr99]: https://github.com/bdr99 +[@bdraco]: https://github.com/bdraco +[@beele]: https://github.com/beele +[@bieniu]: https://github.com/bieniu +[@br3sc4]: https://github.com/br3sc4 +[@bramkragten]: https://github.com/bramkragten +[@brianegge]: https://github.com/brianegge +[@burnsie-la]: https://github.com/burnsie-la +[@bvweerd]: https://github.com/bvweerd +[@candreacchio]: https://github.com/candreacchio +[@cdce8p]: https://github.com/cdce8p +[@cgarwood]: https://github.com/cgarwood +[@cgtobi]: https://github.com/cgtobi +[@chemelli74]: https://github.com/chemelli74 +[@chishm]: https://github.com/chishm +[@chpego]: https://github.com/chpego +[@cmroche]: https://github.com/cmroche +[@colinodell]: https://github.com/colinodell +[@ctalkington]: https://github.com/ctalkington +[@danielperna84]: https://github.com/danielperna84 +[@davet2001]: https://github.com/davet2001 +[@decompil3d]: https://github.com/decompil3d +[@dgomes]: https://github.com/dgomes +[@dingusdk]: https://github.com/dingusdk +[@dmulcahey]: https://github.com/dmulcahey +[@dougiteixeira]: https://github.com/dougiteixeira +[@droberg]: https://github.com/droberg +[@dshokouhi]: https://github.com/dshokouhi +[@eavanvalkenburg]: https://github.com/eavanvalkenburg +[@ecoen66]: https://github.com/ecoen66 +[@egguy]: https://github.com/egguy +[@eifinger]: https://github.com/eifinger +[@elupus]: https://github.com/elupus +[@emontnemery]: https://github.com/emontnemery +[@epenet]: https://github.com/epenet +[@esev]: https://github.com/esev +[@farmio]: https://github.com/farmio +[@filcole]: https://github.com/filcole +[@flacjacket]: https://github.com/flacjacket +[@flz]: https://github.com/flz +[@fredrike]: https://github.com/fredrike +[@frenck]: https://github.com/frenck +[@funkybunch]: https://github.com/funkybunch +[@garbled1]: https://github.com/garbled1 +[@gerard33]: https://github.com/gerard33 +[@ggravlingen]: https://github.com/ggravlingen +[@gjohansson-ST]: https://github.com/gjohansson-ST +[@gwww]: https://github.com/gwww +[@heythisisnate]: https://github.com/heythisisnate +[@hmmbob]: https://github.com/hmmbob +[@iMicknl]: https://github.com/iMicknl +[@infeeeee]: https://github.com/infeeeee +[@j-stienstra]: https://github.com/j-stienstra +[@jacekk015]: https://github.com/jacekk015 +[@jan-loeffler]: https://github.com/jan-loeffler +[@javicalle]: https://github.com/javicalle +[@jbouwh]: https://github.com/jbouwh +[@jeeftor]: https://github.com/jeeftor +[@jesserockz]: https://github.com/jesserockz +[@jjlawren]: https://github.com/jjlawren +[@jkeljo]: https://github.com/jkeljo +[@jsoref]: https://github.com/jsoref +[@k4ds3]: https://github.com/k4ds3 +[@kbickar]: https://github.com/kbickar +[@kezziny]: https://github.com/kezziny +[@kimfrellsen]: https://github.com/kimfrellsen +[@klaasnicolaas]: https://github.com/klaasnicolaas +[@kristjanbjarni]: https://github.com/kristjanbjarni +[@leeyuentuen]: https://github.com/leeyuentuen +[@liudger]: https://github.com/liudger +[@ludeeus]: https://github.com/ludeeus +[@lunmay]: https://github.com/lunmay +[@m4rkireland]: https://github.com/m4rkireland +[@mampfes]: https://github.com/mampfes +[@marcelveldt]: https://github.com/marcelveldt +[@marcuslonnberg]: https://github.com/marcuslonnberg +[@martin3000]: https://github.com/martin3000 +[@marvin-w]: https://github.com/marvin-w +[@maxcanna]: https://github.com/maxcanna +[@mdegat01]: https://github.com/mdegat01 +[@mdz]: https://github.com/mdz +[@mezz64]: https://github.com/mezz64 +[@mib1185]: https://github.com/mib1185 +[@micha91]: https://github.com/micha91 +[@michaelarnauts]: https://github.com/michaelarnauts +[@milanmeu]: https://github.com/milanmeu +[@mletenay]: https://github.com/mletenay +[@mtdcr]: https://github.com/mtdcr +[@natekspencer]: https://github.com/natekspencer +[@ngdio]: https://github.com/ngdio +[@nickw444]: https://github.com/nickw444 +[@niecore]: https://github.com/niecore +[@nohn]: https://github.com/nohn +[@noxhirsch]: https://github.com/noxhirsch +[@oischinger]: https://github.com/oischinger +[@ol-iver]: https://github.com/ol-iver +[@ollo69]: https://github.com/ollo69 +[@orcema]: https://github.com/orcema +[@petslane]: https://github.com/petslane +[@postlund]: https://github.com/postlund +[@ppetru]: https://github.com/ppetru +[@pree]: https://github.com/pree +[@pvizeli]: https://github.com/pvizeli +[@qqaatw]: https://github.com/qqaatw +[@raman325]: https://github.com/raman325 +[@rappenze]: https://github.com/rappenze +[@rautesamtr]: https://github.com/rautesamtr +[@regevbr]: https://github.com/regevbr +[@rfleming71]: https://github.com/rfleming71 +[@rforro]: https://github.com/rforro +[@rhpijnacker]: https://github.com/rhpijnacker +[@rianadon]: https://github.com/rianadon +[@rikroe]: https://github.com/rikroe +[@rklomp]: https://github.com/rklomp +[@rnurgaliyev]: https://github.com/rnurgaliyev +[@rsteckler]: https://github.com/rsteckler +[@rytilahti]: https://github.com/rytilahti +[@sagioto]: https://github.com/sagioto +[@scop]: https://github.com/scop +[@sebfortier2288]: https://github.com/sebfortier2288 +[@shbatm]: https://github.com/shbatm +[@simontegelid]: https://github.com/simontegelid +[@slovdahl]: https://github.com/slovdahl +[@slydiman]: https://github.com/slydiman +[@starkillerOG]: https://github.com/starkillerOG +[@stegm]: https://github.com/stegm +[@stephan192]: https://github.com/stephan192 +[@syssi]: https://github.com/syssi +[@tausen]: https://github.com/tausen +[@tedvdb]: https://github.com/tedvdb +[@teharris1]: https://github.com/teharris1 +[@thecode]: https://github.com/thecode +[@timmo001]: https://github.com/timmo001 +[@tkdrob]: https://github.com/tkdrob +[@tofuSCHNITZEL]: https://github.com/tofuSCHNITZEL +[@tokenize47]: https://github.com/tokenize47 +[@tomhennigan]: https://github.com/tomhennigan +[@tschamm]: https://github.com/tschamm +[@tschnilo]: https://github.com/tschnilo +[@ufodone]: https://github.com/ufodone +[@uvjustin]: https://github.com/uvjustin +[@vauriga]: https://github.com/vauriga +[@viiru-]: https://github.com/viiru- +[@yozik04]: https://github.com/yozik04 +[@zacwest]: https://github.com/zacwest +[abode docs]: /integrations/abode/ +[accuweather docs]: /integrations/accuweather/ +[acmeda docs]: /integrations/acmeda/ +[adax docs]: /integrations/adax/ +[adguard docs]: /integrations/adguard/ +[ads docs]: /integrations/ads/ +[advantage_air docs]: /integrations/advantage_air/ +[aemet docs]: /integrations/aemet/ +[aftership docs]: /integrations/aftership/ +[airly docs]: /integrations/airly/ +[airnow docs]: /integrations/airnow/ +[airthings docs]: /integrations/airthings/ +[airtouch4 docs]: /integrations/airtouch4/ +[airvisual docs]: /integrations/airvisual/ +[aladdin_connect docs]: /integrations/aladdin_connect/ +[alarmdecoder docs]: /integrations/alarmdecoder/ +[alexa docs]: /integrations/alexa/ +[almond docs]: /integrations/almond/ +[alpha_vantage docs]: /integrations/alpha_vantage/ +[amazon_polly docs]: /integrations/amazon_polly/ +[ambee docs]: /integrations/ambee/ +[amberelectric docs]: /integrations/amberelectric/ +[ambiclimate docs]: /integrations/ambiclimate/ +[ambient_station docs]: /integrations/ambient_station/ +[amcrest docs]: /integrations/amcrest/ +[analytics docs]: /integrations/analytics/ +[android_ip_webcam docs]: /integrations/android_ip_webcam/ +[androidtv docs]: /integrations/androidtv/ +[anel_pwrctrl docs]: /integrations/anel_pwrctrl/ +[apcupsd docs]: /integrations/apcupsd/ +[api docs]: /integrations/api/ +[apns docs]: /integrations/apns/ +[apple_tv docs]: /integrations/apple_tv/ +[aprs docs]: /integrations/aprs/ +[aqualogic docs]: /integrations/aqualogic/ +[aquostv docs]: /integrations/aquostv/ +[arcam_fmj docs]: /integrations/arcam_fmj/ +[arduino docs]: /integrations/arduino/ +[arest docs]: /integrations/arest/ +[arlo docs]: /integrations/arlo/ +[arris_tg2492lg docs]: /integrations/arris_tg2492lg/ +[arwn docs]: /integrations/arwn/ +[aseko_pool_live docs]: /integrations/aseko_pool_live/ +[asterisk_cdr docs]: /integrations/asterisk_cdr/ +[asterisk_mbox docs]: /integrations/asterisk_mbox/ +[asuswrt docs]: /integrations/asuswrt/ +[atag docs]: /integrations/atag/ +[aten_pe docs]: /integrations/aten_pe/ +[atome docs]: /integrations/atome/ +[august docs]: /integrations/august/ +[aurora_abb_powerone docs]: /integrations/aurora_abb_powerone/ +[aussie_broadband docs]: /integrations/aussie_broadband/ +[auth docs]: /integrations/auth/ +[automation docs]: /integrations/automation/ +[avion docs]: /integrations/avion/ +[awair docs]: /integrations/awair/ +[aws docs]: /integrations/aws/ +[axis docs]: /integrations/axis/ +[azure_event_hub docs]: /integrations/azure_event_hub/ +[balboa docs]: /integrations/balboa/ +[bbb_gpio docs]: /integrations/bbb_gpio/ +[bbox docs]: /integrations/bbox/ +[beewi_smartclim docs]: /integrations/beewi_smartclim/ +[bh1750 docs]: /integrations/bh1750/ +[binary_sensor docs]: /integrations/binary_sensor/ +[blackbird docs]: /integrations/blackbird/ +[blebox docs]: /integrations/blebox/ +[blink docs]: /integrations/blink/ +[blinkt docs]: /integrations/blinkt/ +[bloomsky docs]: /integrations/bloomsky/ +[blueprint docs]: /integrations/blueprint/ +[bluetooth_le_tracker docs]: /integrations/bluetooth_le_tracker/ +[bluetooth_tracker docs]: /integrations/bluetooth_tracker/ +[bme280 docs]: /integrations/bme280/ +[bme680 docs]: /integrations/bme680/ +[bmp280 docs]: /integrations/bmp280/ +[bmw_connected_drive docs]: /integrations/bmw_connected_drive/ +[bond docs]: /integrations/bond/ +[bosch_shc docs]: /integrations/bosch_shc/ +[braviatv docs]: /integrations/braviatv/ +[broadlink docs]: /integrations/broadlink/ +[brother docs]: /integrations/brother/ +[browser docs]: /integrations/browser/ +[brunt docs]: /integrations/brunt/ +[buienradar docs]: /integrations/buienradar/ +[caldav docs]: /integrations/caldav/ +[camera docs]: /integrations/camera/ +[canary docs]: /integrations/canary/ +[cast docs]: /integrations/cast/ +[cert_expiry docs]: /integrations/cert_expiry/ +[climacell docs]: /integrations/climacell/ +[climate docs]: /integrations/climate/ +[cloud docs]: /integrations/cloud/ +[co2signal docs]: /integrations/co2signal/ +[coinbase docs]: /integrations/coinbase/ +[comfoconnect docs]: /integrations/comfoconnect/ +[command_line docs]: /integrations/command_line/ +[compensation docs]: /integrations/compensation/ +[concord232 docs]: /integrations/concord232/ +[config docs]: /integrations/config/ +[configurator docs]: /integrations/configurator/ +[control4 docs]: /integrations/control4/ +[conversation docs]: /integrations/conversation/ +[coolmaster docs]: /integrations/coolmaster/ +[cpuspeed docs]: /integrations/cpuspeed/ +[cups docs]: /integrations/cups/ +[daikin docs]: /integrations/daikin/ +[danfoss_air docs]: /integrations/danfoss_air/ +[darksky docs]: /integrations/darksky/ +[deconz docs]: /integrations/deconz/ +[default_config docs]: /integrations/default_config/ +[delijn docs]: /integrations/delijn/ +[demo docs]: /integrations/demo/ +[denonavr docs]: /integrations/denonavr/ +[device_automation docs]: /integrations/device_automation/ +[device_tracker docs]: /integrations/device_tracker/ +[devolo_home_control docs]: /integrations/devolo_home_control/ +[devolo_home_network docs]: /integrations/devolo_home_network/ +[dexcom docs]: /integrations/dexcom/ +[dhcp docs]: /integrations/dhcp/ +[dht docs]: /integrations/dht/ +[diagnostics docs]: /integrations/diagnostics/ +[digital_ocean docs]: /integrations/digital_ocean/ +[digitalloggers docs]: /integrations/digitalloggers/ +[directv docs]: /integrations/directv/ +[discord docs]: /integrations/discord/ +[dlna_dmr docs]: /integrations/dlna_dmr/ +[dnsip docs]: /integrations/dnsip/ +[dominos docs]: /integrations/dominos/ +[doods docs]: /integrations/doods/ +[doorbird docs]: /integrations/doorbird/ +[dsmr docs]: /integrations/dsmr/ +[dsmr_reader docs]: /integrations/dsmr_reader/ +[dte_energy_bridge docs]: /integrations/dte_energy_bridge/ +[dwd_weather_warnings docs]: /integrations/dwd_weather_warnings/ +[dynalite docs]: /integrations/dynalite/ +[eafm docs]: /integrations/eafm/ +[ebusd docs]: /integrations/ebusd/ +[ecoal_boiler docs]: /integrations/ecoal_boiler/ +[ecobee docs]: /integrations/ecobee/ +[econet docs]: /integrations/econet/ +[ecovacs docs]: /integrations/ecovacs/ +[eddystone_temperature docs]: /integrations/eddystone_temperature/ +[edl21 docs]: /integrations/edl21/ +[efergy docs]: /integrations/efergy/ +[egardia docs]: /integrations/egardia/ +[eight_sleep docs]: /integrations/eight_sleep/ +[elgato docs]: /integrations/elgato/ +[eliqonline docs]: /integrations/eliqonline/ +[elkm1 docs]: /integrations/elkm1/ +[elmax docs]: /integrations/elmax/ +[emby docs]: /integrations/emby/ +[emoncms docs]: /integrations/emoncms/ +[emonitor docs]: /integrations/emonitor/ +[emulated_hue docs]: /integrations/emulated_hue/ +[emulated_kasa docs]: /integrations/emulated_kasa/ +[energy docs]: /integrations/energy/ +[enocean docs]: /integrations/enocean/ +[enphase_envoy docs]: /integrations/enphase_envoy/ +[entur_public_transport docs]: /integrations/entur_public_transport/ +[environment_canada docs]: /integrations/environment_canada/ +[envirophat docs]: /integrations/envirophat/ +[envisalink docs]: /integrations/envisalink/ +[eq3btsmart docs]: /integrations/eq3btsmart/ +[esphome docs]: /integrations/esphome/ +[eufy docs]: /integrations/eufy/ +[evil_genius_labs docs]: /integrations/evil_genius_labs/ +[evohome docs]: /integrations/evohome/ +[ezviz docs]: /integrations/ezviz/ +[fail2ban docs]: /integrations/fail2ban/ +[fan docs]: /integrations/fan/ +[feedreader docs]: /integrations/feedreader/ +[ffmpeg docs]: /integrations/ffmpeg/ +[ffmpeg_motion docs]: /integrations/ffmpeg_motion/ +[ffmpeg_noise docs]: /integrations/ffmpeg_noise/ +[fibaro docs]: /integrations/fibaro/ +[file docs]: /integrations/file/ +[filesize docs]: /integrations/filesize/ +[filter docs]: /integrations/filter/ +[fints docs]: /integrations/fints/ +[fireservicerota docs]: /integrations/fireservicerota/ +[firmata docs]: /integrations/firmata/ +[fjaraskupan docs]: /integrations/fjaraskupan/ +[fleetgo docs]: /integrations/fleetgo/ +[flic docs]: /integrations/flic/ +[flick_electric docs]: /integrations/flick_electric/ +[flipr docs]: /integrations/flipr/ +[flo docs]: /integrations/flo/ +[flume docs]: /integrations/flume/ +[flunearyou docs]: /integrations/flunearyou/ +[flux_led docs]: /integrations/flux_led/ +[folder docs]: /integrations/folder/ +[foobot docs]: /integrations/foobot/ +[forecast_solar docs]: /integrations/forecast_solar/ +[fortios docs]: /integrations/fortios/ +[foscam docs]: /integrations/foscam/ +[foursquare docs]: /integrations/foursquare/ +[freebox docs]: /integrations/freebox/ +[freedompro docs]: /integrations/freedompro/ +[fritz docs]: /integrations/fritz/ +[fritzbox docs]: /integrations/fritzbox/ +[fritzbox_callmonitor docs]: /integrations/fritzbox_callmonitor/ +[fronius docs]: /integrations/fronius/ +[frontend docs]: /integrations/frontend/ +[garadget docs]: /integrations/garadget/ +[garages_amsterdam docs]: /integrations/garages_amsterdam/ +[gc100 docs]: /integrations/gc100/ +[gdacs docs]: /integrations/gdacs/ +[generic docs]: /integrations/generic/ +[generic_hygrostat docs]: /integrations/generic_hygrostat/ +[generic_thermostat docs]: /integrations/generic_thermostat/ +[geniushub docs]: /integrations/geniushub/ +[geo_json_events docs]: /integrations/geo_json_events/ +[geo_location docs]: /integrations/geo_location/ +[geonetnz_quakes docs]: /integrations/geonetnz_quakes/ +[gios docs]: /integrations/gios/ +[github docs]: /integrations/github/ +[glances docs]: /integrations/glances/ +[goalzero docs]: /integrations/goalzero/ +[gogogate2 docs]: /integrations/gogogate2/ +[goodwe docs]: /integrations/goodwe/ +[google docs]: /integrations/google/ +[google_assistant docs]: /integrations/google_assistant/ +[google_maps docs]: /integrations/google_maps/ +[google_pubsub docs]: /integrations/google_pubsub/ +[google_travel_time docs]: /integrations/google_travel_time/ +[gpmdp docs]: /integrations/gpmdp/ +[gpslogger docs]: /integrations/gpslogger/ +[gree docs]: /integrations/gree/ +[greeneye_monitor docs]: /integrations/greeneye_monitor/ +[greenwave docs]: /integrations/greenwave/ +[group docs]: /integrations/group/ +[growatt_server docs]: /integrations/growatt_server/ +[gtfs docs]: /integrations/gtfs/ +[guardian docs]: /integrations/guardian/ +[hangouts docs]: /integrations/hangouts/ +[harmony docs]: /integrations/harmony/ +[hassio docs]: /integrations/hassio/ +[haveibeenpwned docs]: /integrations/haveibeenpwned/ +[hddtemp docs]: /integrations/hddtemp/ +[hdmi_cec docs]: /integrations/hdmi_cec/ +[heos docs]: /integrations/heos/ +[hikvision docs]: /integrations/hikvision/ +[history docs]: /integrations/history/ +[hive docs]: /integrations/hive/ +[home_connect docs]: /integrations/home_connect/ +[home_plus_control docs]: /integrations/home_plus_control/ +[homeassistant docs]: /integrations/homeassistant/ +[homekit docs]: /integrations/homekit/ +[homekit_controller docs]: /integrations/homekit_controller/ +[homematic docs]: /integrations/homematic/ +[homematicip_cloud docs]: /integrations/homematicip_cloud/ +[homewizard docs]: /integrations/homewizard/ +[homewizard_energy docs]: /integrations/homewizard_energy/ +[homeworks docs]: /integrations/homeworks/ +[honeywell docs]: /integrations/honeywell/ +[hp_ilo docs]: /integrations/hp_ilo/ +[html5 docs]: /integrations/html5/ +[http docs]: /integrations/http/ +[htu21d docs]: /integrations/htu21d/ +[huawei_lte docs]: /integrations/huawei_lte/ +[hue docs]: /integrations/hue/ +[huisbaasje docs]: /integrations/huisbaasje/ +[humidifier docs]: /integrations/humidifier/ +[hunterdouglas_powerview docs]: /integrations/hunterdouglas_powerview/ +[hvv_departures docs]: /integrations/hvv_departures/ +[hydrawise docs]: /integrations/hydrawise/ +[hyperion docs]: /integrations/hyperion/ +[iaqualink docs]: /integrations/iaqualink/ +[icloud docs]: /integrations/icloud/ +[idteck_prox docs]: /integrations/idteck_prox/ +[ign_sismologia docs]: /integrations/ign_sismologia/ +[ihc docs]: /integrations/ihc/ +[image docs]: /integrations/image/ +[incomfort docs]: /integrations/incomfort/ +[influxdb docs]: /integrations/influxdb/ +[input_button docs]: /integrations/input_button/ +[input_select docs]: /integrations/input_select/ +[insteon docs]: /integrations/insteon/ +[integration docs]: /integrations/integration/ +[intellifire docs]: /integrations/intellifire/ +[ios docs]: /integrations/ios/ +[iotawatt docs]: /integrations/iotawatt/ +[ipma docs]: /integrations/ipma/ +[ipp docs]: /integrations/ipp/ +[iqvia docs]: /integrations/iqvia/ +[islamic_prayer_times docs]: /integrations/islamic_prayer_times/ +[isy994 docs]: /integrations/isy994/ +[itach docs]: /integrations/itach/ +[izone docs]: /integrations/izone/ +[jellyfin docs]: /integrations/jellyfin/ +[jewish_calendar docs]: /integrations/jewish_calendar/ +[juicenet docs]: /integrations/juicenet/ +[kaiterra docs]: /integrations/kaiterra/ +[keba docs]: /integrations/keba/ +[keenetic_ndms2 docs]: /integrations/keenetic_ndms2/ +[keyboard_remote docs]: /integrations/keyboard_remote/ +[knx docs]: /integrations/knx/ +[kodi docs]: /integrations/kodi/ +[konnected docs]: /integrations/konnected/ +[kostal_plenticore docs]: /integrations/kostal_plenticore/ +[kraken docs]: /integrations/kraken/ +[kulersky docs]: /integrations/kulersky/ +[lacrosse docs]: /integrations/lacrosse/ +[lametric docs]: /integrations/lametric/ +[launch_library docs]: /integrations/launch_library/ +[lcn docs]: /integrations/lcn/ +[lg_netcast docs]: /integrations/lg_netcast/ +[life360 docs]: /integrations/life360/ +[light docs]: /integrations/light/ +[lightwave docs]: /integrations/lightwave/ +[linode docs]: /integrations/linode/ +[linux_battery docs]: /integrations/linux_battery/ +[litejet docs]: /integrations/litejet/ +[litterrobot docs]: /integrations/litterrobot/ +[local_file docs]: /integrations/local_file/ +[lock docs]: /integrations/lock/ +[logbook docs]: /integrations/logbook/ +[lookin docs]: /integrations/lookin/ +[lovelace docs]: /integrations/lovelace/ +[luftdaten docs]: /integrations/luftdaten/ +[lupusec docs]: /integrations/lupusec/ +[lutron docs]: /integrations/lutron/ +[lutron_caseta docs]: /integrations/lutron_caseta/ +[lyric docs]: /integrations/lyric/ +[magicseaweed docs]: /integrations/magicseaweed/ +[mailbox docs]: /integrations/mailbox/ +[marytts docs]: /integrations/marytts/ +[maxcube docs]: /integrations/maxcube/ +[mazda docs]: /integrations/mazda/ +[mcp23017 docs]: /integrations/mcp23017/ +[media_extractor docs]: /integrations/media_extractor/ +[media_player docs]: /integrations/media_player/ +[media_source docs]: /integrations/media_source/ +[melcloud docs]: /integrations/melcloud/ +[meraki docs]: /integrations/meraki/ +[met docs]: /integrations/met/ +[met_eireann docs]: /integrations/met_eireann/ +[meteo_france docs]: /integrations/meteo_france/ +[meteoalarm docs]: /integrations/meteoalarm/ +[meteoclimatic docs]: /integrations/meteoclimatic/ +[metoffice docs]: /integrations/metoffice/ +[mfi docs]: /integrations/mfi/ +[mhz19 docs]: /integrations/mhz19/ +[microsoft_face docs]: /integrations/microsoft_face/ +[miflora docs]: /integrations/miflora/ +[mikrotik docs]: /integrations/mikrotik/ +[mill docs]: /integrations/mill/ +[minecraft_server docs]: /integrations/minecraft_server/ +[mitemp_bt docs]: /integrations/mitemp_bt/ +[mobile_app docs]: /integrations/mobile_app/ +[mochad docs]: /integrations/mochad/ +[modbus docs]: /integrations/modbus/ +[modern_forms docs]: /integrations/modern_forms/ +[motion_blinds docs]: /integrations/motion_blinds/ +[motioneye docs]: /integrations/motioneye/ +[mpchc docs]: /integrations/mpchc/ +[mqtt docs]: /integrations/mqtt/ +[mqtt_json docs]: /integrations/mqtt_json/ +[mqtt_statestream docs]: /integrations/mqtt_statestream/ +[mullvad docs]: /integrations/mullvad/ +[mvglive docs]: /integrations/mvglive/ +[myq docs]: /integrations/myq/ +[mysensors docs]: /integrations/mysensors/ +[nam docs]: /integrations/nam/ +[nanoleaf docs]: /integrations/nanoleaf/ +[neato docs]: /integrations/neato/ +[nederlandse_spoorwegen docs]: /integrations/nederlandse_spoorwegen/ +[ness_alarm docs]: /integrations/ness_alarm/ +[nest docs]: /integrations/nest/ +[netatmo docs]: /integrations/netatmo/ +[netdata docs]: /integrations/netdata/ +[netgear docs]: /integrations/netgear/ +[netgear_lte docs]: /integrations/netgear_lte/ +[netio docs]: /integrations/netio/ +[neurio_energy docs]: /integrations/neurio_energy/ +[nexia docs]: /integrations/nexia/ +[nextbus docs]: /integrations/nextbus/ +[nightscout docs]: /integrations/nightscout/ +[nilu docs]: /integrations/nilu/ +[nina docs]: /integrations/nina/ +[nissan_leaf docs]: /integrations/nissan_leaf/ +[nmap_tracker docs]: /integrations/nmap_tracker/ +[nmbs docs]: /integrations/nmbs/ +[norway_air docs]: /integrations/norway_air/ +[notify docs]: /integrations/notify/ +[notion docs]: /integrations/notion/ +[nsw_rural_fire_service_feed docs]: /integrations/nsw_rural_fire_service_feed/ +[nuki docs]: /integrations/nuki/ +[numato docs]: /integrations/numato/ +[number docs]: /integrations/number/ +[nut docs]: /integrations/nut/ +[nws docs]: /integrations/nws/ +[nx584 docs]: /integrations/nx584/ +[nzbget docs]: /integrations/nzbget/ +[oasa_telematics docs]: /integrations/oasa_telematics/ +[obihai docs]: /integrations/obihai/ +[octoprint docs]: /integrations/octoprint/ +[omnilogic docs]: /integrations/omnilogic/ +[onboarding docs]: /integrations/onboarding/ +[oncue docs]: /integrations/oncue/ +[ondilo_ico docs]: /integrations/ondilo_ico/ +[onewire docs]: /integrations/onewire/ +[onkyo docs]: /integrations/onkyo/ +[onvif docs]: /integrations/onvif/ +[open_meteo docs]: /integrations/open_meteo/ +[openalpr_cloud docs]: /integrations/openalpr_cloud/ +[openalpr_local docs]: /integrations/openalpr_local/ +[opencv docs]: /integrations/opencv/ +[openevse docs]: /integrations/openevse/ +[opengarage docs]: /integrations/opengarage/ +[opensensemap docs]: /integrations/opensensemap/ +[opentherm_gw docs]: /integrations/opentherm_gw/ +[openuv docs]: /integrations/openuv/ +[openweathermap docs]: /integrations/openweathermap/ +[orangepi_gpio docs]: /integrations/orangepi_gpio/ +[overkiz docs]: /integrations/overkiz/ +[ovo_energy docs]: /integrations/ovo_energy/ +[owntracks docs]: /integrations/owntracks/ +[ozw docs]: /integrations/ozw/ +[p1_monitor docs]: /integrations/p1_monitor/ +[panasonic_viera docs]: /integrations/panasonic_viera/ +[pcal9535a docs]: /integrations/pcal9535a/ +[philips_js docs]: /integrations/philips_js/ +[pi4ioe5v9xxxx docs]: /integrations/pi4ioe5v9xxxx/ +[pi_hole docs]: /integrations/pi_hole/ +[picnic docs]: /integrations/picnic/ +[piglow docs]: /integrations/piglow/ +[pilight docs]: /integrations/pilight/ +[ping docs]: /integrations/ping/ +[pioneer docs]: /integrations/pioneer/ +[plaato docs]: /integrations/plaato/ +[plex docs]: /integrations/plex/ +[plugwise docs]: /integrations/plugwise/ +[plum_lightpad docs]: /integrations/plum_lightpad/ +[point docs]: /integrations/point/ +[poolsense docs]: /integrations/poolsense/ +[powerwall docs]: /integrations/powerwall/ +[prometheus docs]: /integrations/prometheus/ +[proximity docs]: /integrations/proximity/ +[proxmoxve docs]: /integrations/proxmoxve/ +[proxy docs]: /integrations/proxy/ +[ps4 docs]: /integrations/ps4/ +[pulseaudio_loopback docs]: /integrations/pulseaudio_loopback/ +[pvoutput docs]: /integrations/pvoutput/ +[pvpc_hourly_pricing docs]: /integrations/pvpc_hourly_pricing/ +[pyload docs]: /integrations/pyload/ +[qld_bushfire docs]: /integrations/qld_bushfire/ +[qnap docs]: /integrations/qnap/ +[qrcode docs]: /integrations/qrcode/ +[qwikswitch docs]: /integrations/qwikswitch/ +[rachio docs]: /integrations/rachio/ +[raincloud docs]: /integrations/raincloud/ +[rainforest_eagle docs]: /integrations/rainforest_eagle/ +[rainmachine docs]: /integrations/rainmachine/ +[raspihats docs]: /integrations/raspihats/ +[rdw docs]: /integrations/rdw/ +[recollect_waste docs]: /integrations/recollect_waste/ +[recorder docs]: /integrations/recorder/ +[remember_the_milk docs]: /integrations/remember_the_milk/ +[renault docs]: /integrations/renault/ +[repetier docs]: /integrations/repetier/ +[rest docs]: /integrations/rest/ +[rflink docs]: /integrations/rflink/ +[rfxtrx docs]: /integrations/rfxtrx/ +[ridwell docs]: /integrations/ridwell/ +[ring docs]: /integrations/ring/ +[risco docs]: /integrations/risco/ +[rmvtransport docs]: /integrations/rmvtransport/ +[roku docs]: /integrations/roku/ +[roomba docs]: /integrations/roomba/ +[route53 docs]: /integrations/route53/ +[rova docs]: /integrations/rova/ +[rpi_gpio docs]: /integrations/rpi_gpio/ +[rpi_gpio_pwm docs]: /integrations/rpi_gpio_pwm/ +[rpi_pfio docs]: /integrations/rpi_pfio/ +[rpi_power docs]: /integrations/rpi_power/ +[rpi_rf docs]: /integrations/rpi_rf/ +[rtsp_to_webrtc docs]: /integrations/rtsp_to_webrtc/ +[ruckus_unleashed docs]: /integrations/ruckus_unleashed/ +[sabnzbd docs]: /integrations/sabnzbd/ +[saj docs]: /integrations/saj/ +[samsungtv docs]: /integrations/samsungtv/ +[satel_integra docs]: /integrations/satel_integra/ +[scene docs]: /integrations/scene/ +[scrape docs]: /integrations/scrape/ +[screenlogic docs]: /integrations/screenlogic/ +[script docs]: /integrations/script/ +[search docs]: /integrations/search/ +[season docs]: /integrations/season/ +[sense docs]: /integrations/sense/ +[sensehat docs]: /integrations/sensehat/ +[senseme docs]: /integrations/senseme/ +[sensibo docs]: /integrations/sensibo/ +[sensor docs]: /integrations/sensor/ +[sentry docs]: /integrations/sentry/ +[serial docs]: /integrations/serial/ +[seven_segments docs]: /integrations/seven_segments/ +[seventeentrack docs]: /integrations/seventeentrack/ +[sharkiq docs]: /integrations/sharkiq/ +[shelly docs]: /integrations/shelly/ +[shodan docs]: /integrations/shodan/ +[shopping_list docs]: /integrations/shopping_list/ +[sht31 docs]: /integrations/sht31/ +[sia docs]: /integrations/sia/ +[sighthound docs]: /integrations/sighthound/ +[signal_messenger docs]: /integrations/signal_messenger/ +[simplisafe docs]: /integrations/simplisafe/ +[sisyphus docs]: /integrations/sisyphus/ +[skybeacon docs]: /integrations/skybeacon/ +[skybell docs]: /integrations/skybell/ +[sleepiq docs]: /integrations/sleepiq/ +[slide docs]: /integrations/slide/ +[sma docs]: /integrations/sma/ +[smappee docs]: /integrations/smappee/ +[smart_meter_texas docs]: /integrations/smart_meter_texas/ +[smarthab docs]: /integrations/smarthab/ +[smartthings docs]: /integrations/smartthings/ +[smarttub docs]: /integrations/smarttub/ +[smarty docs]: /integrations/smarty/ +[smhi docs]: /integrations/smhi/ +[sms docs]: /integrations/sms/ +[solaredge docs]: /integrations/solaredge/ +[solaredge_local docs]: /integrations/solaredge_local/ +[solarlog docs]: /integrations/solarlog/ +[solax docs]: /integrations/solax/ +[soma docs]: /integrations/soma/ +[somfy docs]: /integrations/somfy/ +[somfy_mylink docs]: /integrations/somfy_mylink/ +[songpal docs]: /integrations/songpal/ +[sonos docs]: /integrations/sonos/ +[spc docs]: /integrations/spc/ +[speedtestdotnet docs]: /integrations/speedtestdotnet/ +[spider docs]: /integrations/spider/ +[spotify docs]: /integrations/spotify/ +[sql docs]: /integrations/sql/ +[squeezebox docs]: /integrations/squeezebox/ +[srp_energy docs]: /integrations/srp_energy/ +[ssdp docs]: /integrations/ssdp/ +[starline docs]: /integrations/starline/ +[statistics docs]: /integrations/statistics/ +[steamist docs]: /integrations/steamist/ +[stookalert docs]: /integrations/stookalert/ +[stream docs]: /integrations/stream/ +[stt docs]: /integrations/stt/ +[subaru docs]: /integrations/subaru/ +[supervisord docs]: /integrations/supervisord/ +[supla docs]: /integrations/supla/ +[surepetcare docs]: /integrations/surepetcare/ +[swiss_public_transport docs]: /integrations/swiss_public_transport/ +[switch docs]: /integrations/switch/ +[switchbot docs]: /integrations/switchbot/ +[switcher_kis docs]: /integrations/switcher_kis/ +[syncthru docs]: /integrations/syncthru/ +[synology_dsm docs]: /integrations/synology_dsm/ +[system_bridge docs]: /integrations/system_bridge/ +[system_log docs]: /integrations/system_log/ +[systemmonitor docs]: /integrations/systemmonitor/ +[tado docs]: /integrations/tado/ +[tahoma docs]: /integrations/tahoma/ +[tailscale docs]: /integrations/tailscale/ +[tank_utility docs]: /integrations/tank_utility/ +[tasmota docs]: /integrations/tasmota/ +[ted5000 docs]: /integrations/ted5000/ +[tellduslive docs]: /integrations/tellduslive/ +[tellstick docs]: /integrations/tellstick/ +[temper docs]: /integrations/temper/ +[template docs]: /integrations/template/ +[tensorflow docs]: /integrations/tensorflow/ +[tesla_wall_connector docs]: /integrations/tesla_wall_connector/ +[thermoworks_smoke docs]: /integrations/thermoworks_smoke/ +[thethingsnetwork docs]: /integrations/thethingsnetwork/ +[tibber docs]: /integrations/tibber/ +[tile docs]: /integrations/tile/ +[tmb docs]: /integrations/tmb/ +[todoist docs]: /integrations/todoist/ +[tof docs]: /integrations/tof/ +[tolo docs]: /integrations/tolo/ +[tomato docs]: /integrations/tomato/ +[toon docs]: /integrations/toon/ +[torque docs]: /integrations/torque/ +[totalconnect docs]: /integrations/totalconnect/ +[tplink docs]: /integrations/tplink/ +[traccar docs]: /integrations/traccar/ +[tractive docs]: /integrations/tractive/ +[tradfri docs]: /integrations/tradfri/ +[trafikverket_train docs]: /integrations/trafikverket_train/ +[trafikverket_weatherstation docs]: /integrations/trafikverket_weatherstation/ +[trend docs]: /integrations/trend/ +[tts docs]: /integrations/tts/ +[tuya docs]: /integrations/tuya/ +[twentemilieu docs]: /integrations/twentemilieu/ +[twinkly docs]: /integrations/twinkly/ +[ubus docs]: /integrations/ubus/ +[uk_transport docs]: /integrations/uk_transport/ +[unifi docs]: /integrations/unifi/ +[unifi_direct docs]: /integrations/unifi_direct/ +[unifiprotect docs]: /integrations/unifiprotect/ +[universal docs]: /integrations/universal/ +[upcloud docs]: /integrations/upcloud/ +[updater docs]: /integrations/updater/ +[upnp docs]: /integrations/upnp/ +[uptime docs]: /integrations/uptime/ +[uptimerobot docs]: /integrations/uptimerobot/ +[usb docs]: /integrations/usb/ +[usgs_earthquakes_feed docs]: /integrations/usgs_earthquakes_feed/ +[utility_meter docs]: /integrations/utility_meter/ +[vallox docs]: /integrations/vallox/ +[velbus docs]: /integrations/velbus/ +[velux docs]: /integrations/velux/ +[venstar docs]: /integrations/venstar/ +[vera docs]: /integrations/vera/ +[verisure docs]: /integrations/verisure/ +[versasense docs]: /integrations/versasense/ +[version docs]: /integrations/version/ +[vesync docs]: /integrations/vesync/ +[vicare docs]: /integrations/vicare/ +[vilfo docs]: /integrations/vilfo/ +[vizio docs]: /integrations/vizio/ +[vlc_telnet docs]: /integrations/vlc_telnet/ +[voicerss docs]: /integrations/voicerss/ +[volvooncall docs]: /integrations/volvooncall/ +[vultr docs]: /integrations/vultr/ +[wake_on_lan docs]: /integrations/wake_on_lan/ +[wallbox docs]: /integrations/wallbox/ +[waqi docs]: /integrations/waqi/ +[waterfurnace docs]: /integrations/waterfurnace/ +[watttime docs]: /integrations/watttime/ +[waze_travel_time docs]: /integrations/waze_travel_time/ +[weather docs]: /integrations/weather/ +[webhook docs]: /integrations/webhook/ +[webostv docs]: /integrations/webostv/ +[webrtc docs]: /integrations/webrtc/ +[websocket_api docs]: /integrations/websocket_api/ +[wemo docs]: /integrations/wemo/ +[whois docs]: /integrations/whois/ +[wiffi docs]: /integrations/wiffi/ +[wilight docs]: /integrations/wilight/ +[wirelesstag docs]: /integrations/wirelesstag/ +[withings docs]: /integrations/withings/ +[wled docs]: /integrations/wled/ +[wolflink docs]: /integrations/wolflink/ +[workday docs]: /integrations/workday/ +[xbee docs]: /integrations/xbee/ +[xbox docs]: /integrations/xbox/ +[xiaomi_aqara docs]: /integrations/xiaomi_aqara/ +[xiaomi_miio docs]: /integrations/xiaomi_miio/ +[yale_smart_alarm docs]: /integrations/yale_smart_alarm/ +[yamaha docs]: /integrations/yamaha/ +[yamaha_musiccast docs]: /integrations/yamaha_musiccast/ +[yandex_transport docs]: /integrations/yandex_transport/ +[yandextts docs]: /integrations/yandextts/ +[yeelight docs]: /integrations/yeelight/ +[youless docs]: /integrations/youless/ +[zabbix docs]: /integrations/zabbix/ +[zamg docs]: /integrations/zamg/ +[zeroconf docs]: /integrations/zeroconf/ +[zha docs]: /integrations/zha/ +[ziggo_mediabox_xl docs]: /integrations/ziggo_mediabox_xl/ +[zone docs]: /integrations/zone/ +[zoneminder docs]: /integrations/zoneminder/ +[zwave docs]: /integrations/zwave/ +[zwave_js docs]: /integrations/zwave_js/ From 3791277d90d0944e61b2c8581a8956e76cb18a2f Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 26 Jan 2022 20:47:41 +0100 Subject: [PATCH 198/247] 2022.2.0: Add missing language flag to codefenced block --- source/_posts/2022-02-02-release-20222.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_posts/2022-02-02-release-20222.markdown b/source/_posts/2022-02-02-release-20222.markdown index f76d34f20ac..a966970f5c6 100644 --- a/source/_posts/2022-02-02-release-20222.markdown +++ b/source/_posts/2022-02-02-release-20222.markdown @@ -636,7 +636,7 @@ are now deprecated from the `manifest.json` file and should be moved into a `properties` dict. For example: -``` +```diff - {"type":"_airplay._tcp.local.","model":"appletv*"} + {"type":"_airplay._tcp.local.","properties":{"model":"appletv*"}} ``` From 8e20ee64b0a347b3217c5171a21d8dd49ddba0a1 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 26 Jan 2022 12:39:17 -0800 Subject: [PATCH 199/247] Update 2022-02-02-release-20222.markdown --- source/_posts/2022-02-02-release-20222.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_posts/2022-02-02-release-20222.markdown b/source/_posts/2022-02-02-release-20222.markdown index a966970f5c6..f2994d55b62 100644 --- a/source/_posts/2022-02-02-release-20222.markdown +++ b/source/_posts/2022-02-02-release-20222.markdown @@ -87,12 +87,12 @@ Screenshot from GitHub PR, needs to be replaced Sonos, VLC (via Telnet) and Roku now support playing local media. And Sonos can now even browse other supported media. For example, if you have set up the Spotify and Sonos integration, you can now browse your Spotify to -play it on your Sonos devices. +play it on your Sonos devices. Cast also has support for Plex in the media browser. ## Diagnostics for Integration & Device To make debugging and reporting issues easier, both in terms of reporting it, -but also for developers to fix them, we have introduce an new integration: +but also for developers to fix them, we have introduce an new feature: Diagnostics. Diagnostics can be provided by integrations, to allow you to download From 8289fcf38435ad4c3c03b33161da561559716c7b Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 26 Jan 2022 12:40:46 -0800 Subject: [PATCH 200/247] typo --- source/_posts/2022-02-02-release-20222.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_posts/2022-02-02-release-20222.markdown b/source/_posts/2022-02-02-release-20222.markdown index f2994d55b62..51084eb80dd 100644 --- a/source/_posts/2022-02-02-release-20222.markdown +++ b/source/_posts/2022-02-02-release-20222.markdown @@ -484,7 +484,7 @@ the MQTT IO project, and many more. We do not forbid the use of GPIO, but we are merely deprecating and removing built-in integrations, providing GPIO functionality from Core. We welcome custom integrations (existing or new ones) to provide alternatives. However, -for most cases we recommend on using dedicated hardware, like a ESP device, +for most cases we recommend on using dedicated hardware, like an ESP device, instead. The following integrations have been deprecated and will be removed in From 34e5e791d8a0509ba9335168ad5edc45cd9cae5b Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 26 Jan 2022 13:55:32 -0800 Subject: [PATCH 201/247] left -> right --- source/_posts/2022-02-02-release-20222.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_posts/2022-02-02-release-20222.markdown b/source/_posts/2022-02-02-release-20222.markdown index 51084eb80dd..26b70c8c7b1 100644 --- a/source/_posts/2022-02-02-release-20222.markdown +++ b/source/_posts/2022-02-02-release-20222.markdown @@ -214,7 +214,7 @@ Screenshot from Discord, needs to be replaced Screenshot from GitHub PR, needs to be replaced

-- Search in top left of configuration dashboard (needs screenshot) +- Search in top right of configuration dashboard (needs screenshot) - Scenes now have a state, last activated timestamp (like a button entity, last pressed) From 94fb87f56da99a1f0914b8bab36e3d62a3937783 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Thu, 27 Jan 2022 11:49:44 +0100 Subject: [PATCH 202/247] Add missing refreces to github additions (#21349) --- source/_posts/2022-02-02-release-20222.markdown | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/_posts/2022-02-02-release-20222.markdown b/source/_posts/2022-02-02-release-20222.markdown index 26b70c8c7b1..ab65893995f 100644 --- a/source/_posts/2022-02-02-release-20222.markdown +++ b/source/_posts/2022-02-02-release-20222.markdown @@ -398,9 +398,10 @@ This release adds support for long-term statistics to the following integrations - Add state class to nexia sensors ([@bdraco] - [#64932]) ([nexia docs]) - Add state classes to august sensors ([@bdraco] - [#64931]) ([august docs]) - Add edl21 sensor state class and device class ([@StephanU] - [#56968]) ([edl21 docs]) -- - Add state class support to Luftdaten ([@frenck] - [#62585]) ([luftdaten docs]) +- Add state class support to Luftdaten ([@frenck] - [#62585]) ([luftdaten docs]) - Add SensorStateClass to Kraken sensors ([@eifinger] - [#63590]) ([kraken docs]) - Add long term statistics to buienradar ([@tedvdb] - [#58917]) ([buienradar docs]) +- Revamp github integration ([@ludeeus] - [#64190]) ([github docs]) And the following integrations now have entity categories: @@ -412,6 +413,7 @@ And the following integrations now have entity categories: - Motion blinds add entity category ([@starkillerOG] - [#62266]) ([motion_blinds docs]) - Hyperion add entity category ([@starkillerOG] - [#62268]) ([hyperion docs]) - Use entity class attributes for Mazda integration ([@bdr99] - [#59869]) ([mazda docs]) +- Revamp github integration ([@ludeeus] - [#64190]) ([github docs]) ## New Integrations @@ -443,6 +445,7 @@ The following integrations are now available via the Home Assistant UI: - [Android TV][androidtv docs], done by [@ollo69] - [CPU Speed][cpuspeed docs], done by [@frenck] - [DNS IP][dnsip docs], done by [@gjohansson-ST] +- [GitHub][github docs], done by [@ludeeus] - [Launch Library][launch_library docs], done by [@DurgNomis-drol] - [LG webOS Smart TV][webostv docs], done by [@thecode] - [PVOutput][pvoutput docs], done by [@frenck] From d98c2caf9f0352f9009acb7783d6a288a12989b1 Mon Sep 17 00:00:00 2001 From: Allen Porter Date: Fri, 28 Jan 2022 13:26:16 -0800 Subject: [PATCH 203/247] Update link to rtsp_to_webrtc integration in release notes (#21375) --- source/_posts/2022-02-02-release-20222.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_posts/2022-02-02-release-20222.markdown b/source/_posts/2022-02-02-release-20222.markdown index ab65893995f..10cdab553fb 100644 --- a/source/_posts/2022-02-02-release-20222.markdown +++ b/source/_posts/2022-02-02-release-20222.markdown @@ -432,7 +432,7 @@ We welcome the following new integration this release: - [Oncue by Kohler][oncue docs], added by [@bdraco] - [Open-Meteo][open_meteo docs], added by [@frenck] - [Overkiz][overkiz docs], added by [@iMicknl] -- [RTSPtoWebRTC][webrtc docs], added by [@allenporter] +- [RTSPtoWebRTC][rtsp_to_webrtc docs], added by [@allenporter] - [SenseME][senseme docs], added by [@bdraco] - [Steamist][steamist docs], added by [@bdraco] - [UniFi Protect][unifiprotect docs], added by [@AngellusMortis] From 76947e7f7afd55a8bfe5e30479c6c10eee6ba896 Mon Sep 17 00:00:00 2001 From: Marcel van der Veldt Date: Tue, 1 Feb 2022 16:13:08 +0100 Subject: [PATCH 204/247] Update Hue docs (#21339) Co-authored-by: Franck Nijhof --- source/_integrations/hue.markdown | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/source/_integrations/hue.markdown b/source/_integrations/hue.markdown index 95c56b490d5..6c7ea5eedb1 100644 --- a/source/_integrations/hue.markdown +++ b/source/_integrations/hue.markdown @@ -6,12 +6,12 @@ ha_category: - Light ha_iot_class: Local Push featured: true -ha_release: '0.60' +ha_release: "0.60" ha_config_flow: true ha_quality_scale: platinum ha_codeowners: - - '@balloob' - - '@marcelveldt' + - "@balloob" + - "@marcelveldt" ha_domain: hue ha_ssdp: true ha_homekit: true @@ -36,20 +36,41 @@ There is currently support for the following device types within Home Assistant: ## Lights for Hue zones and rooms -The Hue concept is based on Rooms and zones. Although the underlying Hue lights are exposed directly to Home Assistant it might also be useful to interact with the `grouped lights` of the Hue ecosystem, for example to turn all lights in a Hue group on/off at the same time. +The Hue concept is based on Rooms and Zones. Although the underlying Hue lights are exposed directly to Home Assistant it might also be useful to interact with the `grouped lights` of the Hue ecosystem, for example to turn all lights in a Hue group on/off at the same time. Home Assistant creates lights for each Hue zone/room automatically but disables them by default. If you'd like to use those `grouped lights`, you can enable them from Configuration --> Integrations --> Hue --> entities. ## Scenes -In the Hue concept you can create (dynamic) scenes for the lights within rooms and zones. These Hue scenes are automatically imported in Home Assistant and available as scene entities. Creating or editing Hue scenes in Home Assistant is not supported. +In the Hue concept you can create (dynamic) scenes for the lights within rooms and zones. You can create, edit and delete Hue scenes from the (official) Hue app on iOS and Android. Each Zone/Room can have it's own scenes assigned and there is a large library of precreated scenes for specific moods. These Hue scenes are automatically imported in Home Assistant and they're available as `scene entities`. Creating or editing Hue scenes in Home Assistant is not supported. +It is advised to use Hue scenes for controlling multiple lights at once for a smooth experience. If you individually control multiple lights and/or use Home Assistant scenes, each light command will be sent to each light one by one which doesn't give a very good user experience, while using a Hue scene sends commands to all lights at once in an optimized way, resulting in a smooth experience. + +### Service `hue.activate_scene` + +To have more control over Hue scenes we've implemented a secondary, more advanced service to activate a Hue scene and set some properties at the same time, such as the Dynamic mode and/or brightness. + +| Service Data Attribute | Required | Description | +| ---------------------- | -------- | --------------------------------------------------------------------------------------------- | +| `entity_id` | yes | Entity ID of the Hue Scene entity you want to activate. | +| `transition` | no | Transition duration (in seconds) it takes to bring devices to the state defined in the scene. | +| `dynamic` | no | Enable (true) or Disable (false) dynamic mode for the scene. | +| `speed` | no | Set the speed (of the dynamic palette) for this scene. | +| `brightness` | no | Set the brightnes for this scene. | + +You can use this service for example if you'd like to start/stop Dynamic Mode. ## Hue remotes and switches Hue remotes such as the Dimmer Switch are stateless devices, meaning that they do not have a on/off state like regular entities in Home Assistant. Instead, such devices emit the event `hue_event` when a button is pressed. You can test what events come in using the event {% my developer_events title="developer tools in Home Assistant" %} and subscribe to the `hue_event`. Once you know what the event data looks like, you can use this to create automations. +
+ +At the time of writing, there's a limitation on the Hue API that each device can only send one event per second. This means that button events are rate-limited to 1 per second. This is brought to the attention of Signify and it will hopefully be fixed soon. + +
+ ## Support for legacy (V1) Hue bridges Philips/Signify released a new version of their Hue bridge (square shape) and their legacy/V1 bridge (round shape) is now end of life and no longer supported by them. Home Assistant will continue to support the V1 Hue bridge as long as it is technically possible, although with a few limitations: From 7624154b88de5cad5e222e3e0ee4d18c45a24a73 Mon Sep 17 00:00:00 2001 From: Tathar Date: Thu, 27 Jan 2022 11:03:21 +0100 Subject: [PATCH 205/247] three litle bug in modbus doc (#21356) --- source/_integrations/modbus.markdown | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/source/_integrations/modbus.markdown b/source/_integrations/modbus.markdown index f259ac0eb38..64369d6e597 100644 --- a/source/_integrations/modbus.markdown +++ b/source/_integrations/modbus.markdown @@ -483,7 +483,6 @@ modbus: device_class: door input_type: coil address: 117 - device_class: door state_open: 1 state_opening: 2 state_closed: 0 @@ -491,7 +490,7 @@ modbus: status_register: 119 status_register_type: holding - name: "Door2" - address: 117 + address: 118 ``` {% configuration %} @@ -1033,10 +1032,10 @@ switches: required: false default: same as command_off type: integer - unique_id: - description: An ID that uniquely identifies this sensor. If two sensors have the same unique ID, Home Assistant will raise an exception. - required: false - type: string + unique_id: + description: An ID that uniquely identifies this sensor. If two sensors have the same unique ID, Home Assistant will raise an exception. + required: false + type: string {% endconfiguration %} ## Opening an issue From d7db0947de8a7916720dda35c7d89bd244e3b193 Mon Sep 17 00:00:00 2001 From: Simon Hansen <67142049+DurgNomis-drol@users.noreply.github.com> Date: Fri, 28 Jan 2022 10:52:11 +0100 Subject: [PATCH 206/247] Add a note about starship sensors to launchlibrary (#21358) --- source/_integrations/launch_library.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/launch_library.markdown b/source/_integrations/launch_library.markdown index 97494a0b0c7..c1324e9bc5c 100644 --- a/source/_integrations/launch_library.markdown +++ b/source/_integrations/launch_library.markdown @@ -15,7 +15,7 @@ ha_platforms: ha_config_flow: true --- -The `launch_library` sensor will provide you with information about the next planned space launch. +The `launch_library` sensor will provide you with information about the next planned space launch and SpaceX Starship event. {% include integrations/config_flow.md %} From 42f8d7ee600f8a14e269ccb6d580f19cdf155d04 Mon Sep 17 00:00:00 2001 From: Christopher Masto Date: Fri, 28 Jan 2022 14:31:12 -0500 Subject: [PATCH 207/247] Update list of tested devices (#21368) --- source/_integrations/oncue.markdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/_integrations/oncue.markdown b/source/_integrations/oncue.markdown index 79d1feab126..c141cd59653 100644 --- a/source/_integrations/oncue.markdown +++ b/source/_integrations/oncue.markdown @@ -17,8 +17,9 @@ ha_platforms: The Oncue by Kohler integration will allow you to monitor the state of your [Oncue enabled Kohler generator](https://api.kohler.com/oncueplus/#/auth). -## Supported Devices +## Tested Devices +- [24RCL](https://kohlerpower.com/en/residential/generators/product/24rcl) - [38RCLB](https://kohlerpower.com/en/residential/generators/product/38rclb) - [48RCLB](https://kohlerpower.com/en/residential/generators/product/48rclb) - [60RCLA](https://kohlerpower.com/en/residential/generators/product/60rcla) From 286bec8ae6509710270d6fe871e813c4b92bfc24 Mon Sep 17 00:00:00 2001 From: Dave T <17680170+davet2001@users.noreply.github.com> Date: Mon, 31 Jan 2022 10:36:35 +0000 Subject: [PATCH 208/247] Add instructions for SALUS device OTA upgrade (#21384) --- source/_integrations/zha.markdown | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/source/_integrations/zha.markdown b/source/_integrations/zha.markdown index 2ee338b03b2..24e43b93b27 100644 --- a/source/_integrations/zha.markdown +++ b/source/_integrations/zha.markdown @@ -206,7 +206,7 @@ custom_quirks_path: ZHA component has the ability to automatically download and perform OTA (Over-The-Air) firmware updates of Zigbee devices if the OTA firmware provider source URL for updates is available. OTA firmware updating is set to disabled (`false`) in the configuration by default. -Currently, OTA providers for firmware updates are only available for IKEA and LEDVANCE devices. OTA updates for device of other manufactures could also be supported by ZHA dependencies in the future, if these manufacturers publish their firmware publicly. +Online OTA providers for firmware updates are currently only available for IKEA, LEDVANCE and SALUS devices. Support for OTA updates from other manufacturers could be supported in the future, if they publish their firmware images publicly. To enable OTA firmware updates for the ZHA integration you need to add the following configuration to your `configuration.yaml` and restart Home Assistant: @@ -216,10 +216,11 @@ zha: ota: ikea_provider: true # Auto update Trådfri devices ledvance_provider: true # Auto update LEDVANCE devices + salus_provider: true # Auto update SALUS devices #otau_directory: /path/to/your/ota/folder # Utilize .ota files to update everything else ``` -You can choose if the IKEA or LEDVANCE provider should be set to enabled (`true`) or disabled (`false`) individually. After the OTA firmware upgrades are finished, you can set these to `false` again if you do not want ZHA to automatically download and perform OTA firmware upgrades in the future. +You can choose if the IKEA, LEDVANCE or SALUS provider should be set to enabled (`true`) or disabled (`false`) individually. After the OTA firmware upgrades are finished, you can set these to `false` again if you do not want ZHA to automatically download and perform OTA firmware upgrades in the future. Note that the `otau_directory` setting is optional and can be used for any firmware files you have downloaded yourself, for any device type and manufacturer. For example, Philips Hue firmwares manually downloaded from [here](https://github.com/dresden-elektronik/deconz-rest-plugin/wiki/OTA-Image-Types---Firmware-versions) and/or [here](https://github.com/Koenkk/zigbee-OTA/blob/a02a4cb33f7c46b4d2916805bfcad582124ec975/index.json) added to the `otau_directory` can be flashed, although a manual `zha.issue_zigbee_cluster_command` command currently (as of 2021.3.3) must be issued against the IEEE of the Philips Hue device under Developer Tools->Services, e.g.: From b8c19779bc6bd974cd8c984fdfb43cd609704e57 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 31 Jan 2022 04:43:29 -0600 Subject: [PATCH 209/247] Add dhcp discovery to oncue (#21386) --- source/_integrations/oncue.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_integrations/oncue.markdown b/source/_integrations/oncue.markdown index c141cd59653..cebe209b133 100644 --- a/source/_integrations/oncue.markdown +++ b/source/_integrations/oncue.markdown @@ -9,6 +9,7 @@ ha_release: 2022.2 ha_config_flow: true ha_codeowners: - '@bdraco' +ha_dhcp: true ha_domain: oncue ha_platforms: - binary_sensor From 22f8521879c090348f0507fce0b12b67bf841a04 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 1 Feb 2022 18:53:28 +0100 Subject: [PATCH 210/247] 2022.2.0: Update property sync with codebase --- CODEOWNERS | 2 +- source/_integrations/advantage_air.markdown | 1 + source/_integrations/esphome.markdown | 1 + source/_integrations/fritz.markdown | 1 + source/_integrations/homewizard.markdown | 1 + source/_integrations/hue.markdown | 6 +++--- source/_integrations/intellifire.markdown | 1 + source/_integrations/onewire.markdown | 1 + source/_integrations/p1_monitor.markdown | 1 + source/_integrations/rtsp_to_webrtc.markdown | 2 ++ source/_integrations/samsungtv.markdown | 1 + source/_integrations/simplisafe.markdown | 1 + source/_integrations/uptimerobot.markdown | 2 ++ source/_integrations/wled.markdown | 1 + 14 files changed, 18 insertions(+), 4 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index 3e9b003903c..2608aa2e5f9 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -560,7 +560,7 @@ source/_integrations/upc_connect.markdown @pvizeli @fabaff source/_integrations/upcloud.markdown @scop source/_integrations/updater.markdown @home-assistant/core source/_integrations/upnp.markdown @StevenLooman @ehendrix23 -source/_integrations/uptimerobot.markdown @ludeeus +source/_integrations/uptimerobot.markdown @ludeeus @chemelli74 source/_integrations/usb.markdown @bdraco source/_integrations/usgs_earthquakes_feed.markdown @exxamalte source/_integrations/utility_meter.markdown @dgomes diff --git a/source/_integrations/advantage_air.markdown b/source/_integrations/advantage_air.markdown index 10965c54883..32e7072a557 100644 --- a/source/_integrations/advantage_air.markdown +++ b/source/_integrations/advantage_air.markdown @@ -11,6 +11,7 @@ ha_domain: advantage_air ha_quality_scale: platinum ha_platforms: - binary_sensor + - diagnostics - climate - cover - sensor diff --git a/source/_integrations/esphome.markdown b/source/_integrations/esphome.markdown index ac7ac0b9b26..c223d58cd8c 100644 --- a/source/_integrations/esphome.markdown +++ b/source/_integrations/esphome.markdown @@ -16,6 +16,7 @@ ha_platforms: - binary_sensor - camera - button + - diagnostics - climate - cover - fan diff --git a/source/_integrations/fritz.markdown b/source/_integrations/fritz.markdown index 6716a316355..19817a9a5ec 100644 --- a/source/_integrations/fritz.markdown +++ b/source/_integrations/fritz.markdown @@ -17,6 +17,7 @@ ha_iot_class: Local Polling ha_platforms: - binary_sensor - button + - diagnostics - device_tracker - sensor - switch diff --git a/source/_integrations/homewizard.markdown b/source/_integrations/homewizard.markdown index bc333b6a0f2..59606e93107 100644 --- a/source/_integrations/homewizard.markdown +++ b/source/_integrations/homewizard.markdown @@ -10,6 +10,7 @@ ha_domain: homewizard ha_codeowners: - '@DCSBL' ha_platforms: + - diagnostics - sensor - switch ha_zeroconf: true diff --git a/source/_integrations/hue.markdown b/source/_integrations/hue.markdown index 6c7ea5eedb1..bc62d95aac9 100644 --- a/source/_integrations/hue.markdown +++ b/source/_integrations/hue.markdown @@ -6,12 +6,12 @@ ha_category: - Light ha_iot_class: Local Push featured: true -ha_release: "0.60" +ha_release: '0.60' ha_config_flow: true ha_quality_scale: platinum ha_codeowners: - - "@balloob" - - "@marcelveldt" + - '@balloob' + - '@marcelveldt' ha_domain: hue ha_ssdp: true ha_homekit: true diff --git a/source/_integrations/intellifire.markdown b/source/_integrations/intellifire.markdown index 7c622c5c514..e47afd2f78a 100644 --- a/source/_integrations/intellifire.markdown +++ b/source/_integrations/intellifire.markdown @@ -11,6 +11,7 @@ ha_domain: intellifire ha_config_flow: true ha_platforms: - binary_sensor + - sensor --- IntelliFire Wi-Fi fireplace modules provide app-based and Alexa control to various fireplaces. The modules do expose an unencrypted HTTP endpoint on the network that provides status information. This integration will read that URL and create a set of sensors displaying the current fireplace state. diff --git a/source/_integrations/onewire.markdown b/source/_integrations/onewire.markdown index 1310ffcc528..4bb949e95e1 100644 --- a/source/_integrations/onewire.markdown +++ b/source/_integrations/onewire.markdown @@ -12,6 +12,7 @@ ha_codeowners: ha_domain: onewire ha_platforms: - binary_sensor + - diagnostics - sensor - switch --- diff --git a/source/_integrations/p1_monitor.markdown b/source/_integrations/p1_monitor.markdown index 33c94593b0b..4a7dde24c09 100644 --- a/source/_integrations/p1_monitor.markdown +++ b/source/_integrations/p1_monitor.markdown @@ -10,6 +10,7 @@ ha_codeowners: - '@klaasnicolaas' ha_domain: p1_monitor ha_platforms: + - diagnostics - sensor ha_quality_scale: platinum --- diff --git a/source/_integrations/rtsp_to_webrtc.markdown b/source/_integrations/rtsp_to_webrtc.markdown index f150bc94967..fd0411f6c60 100644 --- a/source/_integrations/rtsp_to_webrtc.markdown +++ b/source/_integrations/rtsp_to_webrtc.markdown @@ -9,6 +9,8 @@ ha_iot_class: Local Push ha_codeowners: - '@allenporter' ha_domain: rtsp_to_webrtc +ha_platforms: + - diagnostics --- The RTSPtoWebRTC integration registers with [camera integration](/integration/camera) to provide WebRTC live streams for any RTSP camera. The integration initiates a connection to a [RTSPtoWeb](https://github.com/deepch/RTSPtoWeb) or [RTSPtoWebRTC](https://github.com/deepch/RTSPtoWebRTC) proxy server that converts an RTSP stream to a WebRTC stream. diff --git a/source/_integrations/samsungtv.markdown b/source/_integrations/samsungtv.markdown index 26a36ca4fbd..e9b911bc06b 100644 --- a/source/_integrations/samsungtv.markdown +++ b/source/_integrations/samsungtv.markdown @@ -12,6 +12,7 @@ ha_codeowners: ha_domain: samsungtv ha_ssdp: true ha_platforms: + - diagnostics - media_player ha_zeroconf: true ha_dhcp: true diff --git a/source/_integrations/simplisafe.markdown b/source/_integrations/simplisafe.markdown index 234388d2b4b..436ae0e9032 100644 --- a/source/_integrations/simplisafe.markdown +++ b/source/_integrations/simplisafe.markdown @@ -13,6 +13,7 @@ ha_domain: simplisafe ha_platforms: - alarm_control_panel - binary_sensor + - diagnostics - lock - sensor ha_dhcp: true diff --git a/source/_integrations/uptimerobot.markdown b/source/_integrations/uptimerobot.markdown index 27e22fb54c1..04e2499c6c2 100644 --- a/source/_integrations/uptimerobot.markdown +++ b/source/_integrations/uptimerobot.markdown @@ -7,10 +7,12 @@ ha_release: 0.72 ha_iot_class: Cloud Polling ha_codeowners: - '@ludeeus' + - '@chemelli74' ha_domain: uptimerobot ha_platforms: - binary_sensor - diagnostics + - sensor ha_quality_scale: platinum ha_config_flow: true --- diff --git a/source/_integrations/wled.markdown b/source/_integrations/wled.markdown index f087720bd26..61539811e3c 100644 --- a/source/_integrations/wled.markdown +++ b/source/_integrations/wled.markdown @@ -16,6 +16,7 @@ ha_zeroconf: true ha_platforms: - binary_sensor - button + - diagnostics - light - number - sensor From b398debbbec56c52619484546e242125a3d5cb7d Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 1 Feb 2022 18:56:09 +0100 Subject: [PATCH 211/247] 2022.2.0: Update changelog as of b5 --- .../_posts/2022-02-02-release-20222.markdown | 233 +++++++++++++++++- 1 file changed, 232 insertions(+), 1 deletion(-) diff --git a/source/_posts/2022-02-02-release-20222.markdown b/source/_posts/2022-02-02-release-20222.markdown index 10cdab553fb..38e2bc8c883 100644 --- a/source/_posts/2022-02-02-release-20222.markdown +++ b/source/_posts/2022-02-02-release-20222.markdown @@ -166,6 +166,16 @@ Integrations that have adopted it this release (needs to be writte out nicely) - Add diagnostics to Tile ([@bachya] - [#64875]) ([tile docs]) - Add diagnostics to Ridwell ([@bachya] - [#64863]) ([ridwell docs]) - Add diagnostics to WattTime ([@bachya] - [#64887]) ([watttime docs]) +- Add diagnostics download to ESPHome ([@jesserockz] - [#65008]) ([esphome docs]) (beta fix) +- Add diagnostics support to P1 Monitor ([@klaasnicolaas] - [#65060]) ([p1_monitor docs]) (beta fix) +- Add diagnostics support to onewire ([@epenet] - [#65131]) ([onewire docs]) (beta fix) +- Add diagnostics for rtsp_to_webrtc ([@allenporter] - [#65138]) ([rtsp_to_webrtc docs]) (beta fix) +- Update nest diagnostics ([@allenporter] - [#65141]) ([nest docs]) (beta fix) +- Add diagnostics to Advantage Air ([@Bre77] - [#65006]) ([advantage_air docs]) (beta fix) +- Add HomeWizard diagnostics ([@DCSBL] - [#65297]) ([homewizard docs]) (beta fix) (new-integration) +- Add diagnostics support to WLED ([@frenck] - [#65317]) ([wled docs]) (beta fix) +- Add diagnostics for SamsungTV ([@chemelli74] - [#65342]) ([samsungtv docs]) (beta fix + ## Improved handling of device tracker entities @@ -3694,7 +3704,114 @@ The following integrations are no longer available as of this release: - Abort rachio config entry setup when not connected to cloud ([@emontnemery] - [#64975]) ([rachio docs]) - Abort plaato flows when not connected to home assistant cloud ([@emontnemery] - [#64969]) ([plaato docs]) - Abort owntracks config flow when not connected to home assistant cloud ([@emontnemery] - [#64968]) ([owntracks docs]) - +- Fix MQTT climate action null warnings ([@jbouwh] - [#64658]) (beta fix) +- Update Arris TG2492LG dependency to 1.2.1 ([@vanbalken] - [#64999]) ([arris_tg2492lg docs]) (beta fix) +- Add diagnostics download to ESPHome ([@jesserockz] - [#65008]) ([esphome docs]) (beta fix) +- Handle Tuya sendings strings instead of numeric values ([@frenck] - [#65009]) ([tuya docs]) (beta fix) +- Bump flux_led to fix push updates on newer devices ([@bdraco] - [#65011]) ([flux_led docs]) (beta fix) +- Set ping data to None instead of False ([@ludeeus] - [#65013]) ([ping docs]) (beta fix) +- Bump pymazda to 0.3.2 ([@bdr99] - [#65025]) ([mazda docs]) (beta fix) +- Catch connection reset error ([@balloob] - [#65027]) ([hassio docs]) (beta fix) +- Update rokuecp to 0.12.0 ([@ctalkington] - [#65030]) ([roku docs]) (beta fix) +- Fix Shelly battery powered devices unavailable ([@thecode] - [#65031]) ([shelly docs]) (beta fix) +- Correct zone state ([@emontnemery] - [#65040]) ([device_tracker docs]) ([zone docs]) (beta fix) +- Unset Alexa authorized flag in additional case ([@emontnemery] - [#65044]) ([cloud docs]) (beta fix) +- Add `flow_title` for HomeWizard Energy ([@DCSBL] - [#65047]) ([homewizard docs]) (beta fix) +- Fix typo in entity name for launchlibrary ([@DurgNomis-drol] - [#65048]) ([launch_library docs]) (beta fix) +- Fix notify leaving zone blueprint ([@MartinHjelmare] - [#65056]) ([automation docs]) (beta fix) +- Remove `backports.zoneinfo` dependency ([@cdce8p] - [#65069]) (beta fix) +- Update PyVicare to 2.16.1 ([@oischinger] - [#65073]) ([vicare docs]) (beta fix) +- Guard browsing Spotify if setup failed ([@jjlawren] - [#65074]) ([spotify docs]) (beta fix) +- Bump frontend to 20220127.0 ([@balloob] - [#65075]) ([frontend docs]) (beta fix) +- Update Renault to 0.1.7 ([@epenet] - [#65076]) ([renault docs]) (beta fix) +- Check explicitly for None value in Overkiz integration ([@tetienne] - [#65045]) ([overkiz docs]) (beta fix) +- Better names for energy related homekit_controller sensors ([@Jc2k] - [#65055]) ([homekit_controller docs]) (beta fix) +- Fix Shelly detached switches automation triggers ([@thecode] - [#65059]) ([shelly docs]) (beta fix) +- Add diagnostics support to P1 Monitor ([@klaasnicolaas] - [#65060]) ([p1_monitor docs]) (beta fix) +- Support unpairing homekit accessories from homekit_controller ([@Jc2k] - [#65065]) ([homekit_controller docs]) (beta fix) +- Fix Yale optionsflow ([@gjohansson-ST] - [#65072]) ([yale_smart_alarm docs]) (beta fix) +- Reconnect client service tried to connect even if device didn't exist ([@Kane610] - [#65082]) ([unifi docs]) (beta fix) +- Add support for proxy-selected intent ([@balloob] - [#65094]) ([google_assistant docs]) (beta fix) +- Fix Shelly 1/1PM external temperature sensor unavailable ([@thecode] - [#65096]) ([shelly docs]) (beta fix) +- Downgrade homekit linked humidity sensor error to debug ([@bdraco] - [#65098]) ([homekit docs]) (beta fix) +- Handle vicare I/O in executor ([@oischinger] - [#65105]) ([vicare docs]) (beta fix) +- Fix cast support for browsing local media source ([@emontnemery] - [#65115]) ([cast docs]) (beta fix) +- Goodwe - fix value errors ([@starkillerOG] - [#65121]) ([goodwe docs]) (beta fix) +- Handle FritzInternalError exception for Fritz ([@chemelli74] - [#65124]) ([fritz docs]) (beta fix) +- Add diagnostics support to onewire ([@epenet] - [#65131]) ([onewire docs]) (beta fix) +- Use new withings oauth2 refresh token endpoint ([@nbogojevic] - [#65134]) ([withings docs]) (beta fix) +- Bump google-nest-sdm to 1.6.0 (diagnostics) ([@allenporter] - [#65135]) ([nest docs]) (beta fix) +- Add diagnostics for rtsp_to_webrtc ([@allenporter] - [#65138]) ([rtsp_to_webrtc docs]) (beta fix) +- Move `install_requires` to `setup.cfg` ([@cdce8p] - [#65095]) (beta fix) +- Move version metadata key to setup.cfg ([@cdce8p] - [#65091]) (beta fix) +- Move `project_urls` to `setup.cfg` ([@cdce8p] - [#65129]) (beta fix) +- Update nest diagnostics ([@allenporter] - [#65141]) ([nest docs]) (beta fix) +- Use isolated build environments ([@cdce8p] - [#65145]) (beta fix) +- Fix excepton for SamsungTV getting device info ([@chemelli74] - [#65151]) ([samsungtv docs]) (beta fix) +- Fix status for Fritz device tracker ([@chemelli74] - [#65152]) ([fritz docs]) (beta fix) +- Move remaining keys to `setup.cfg` ([@cdce8p] - [#65154]) (beta fix) +- Fix setting speed of Tuya fan ([@frenck] - [#65155]) ([tuya docs]) (beta fix) +- Add OUI for KL430 tplink light strip to discovery ([@bdraco] - [#65159]) ([tplink docs]) (beta fix) +- Add dhcp discovery to oncue ([@bdraco] - [#65160]) ([oncue docs]) (beta fix) +- Add additional roomba OUIs to DHCP discovery ([@bdraco] - [#65161]) ([roomba docs]) (beta fix) +- Add additional blink OUIs to DHCP discovery ([@bdraco] - [#65162]) ([blink docs]) (beta fix) +- Fix uncaught exception during isy994 dhcp discovery with ignored entry ([@bdraco] - [#65165]) ([isy994 docs]) (beta fix) +- Add tests for KNX diagnostic and expose ([@marvin-w] - [#64938]) ([knx docs]) (beta fix) +- Fix KNX Expose for strings longer than 14 bytes ([@marvin-w] - [#63026]) ([knx docs]) (beta fix) +- Minor refactoring of cast media_player ([@emontnemery] - [#65125]) ([cast docs]) (beta fix) +- Aqara restore door sensor state on start ([@starkillerOG] - [#65128]) ([xiaomi_aqara docs]) (beta fix) +- Clean up SimpliSafe config flow tests ([@bachya] - [#65167]) (beta fix) +- Ensure diagnostics redaction can handle lists of lists ([@bachya] - [#65170]) ([diagnostics docs]) (beta fix) +- Add diagnostics to SimpliSafe ([@bachya] - [#65171]) ([simplisafe docs]) (beta fix) +- Better manage of nested lists ([@Kane610] - [#65176]) ([unifi docs]) (beta fix) +- Fix "internet access" switch for Fritz connected device without known IP address ([@mib1185] - [#65190]) ([fritz docs]) (beta fix) +- Fix webostv configure sources when selected source is missing ([@thecode] - [#65195]) ([webostv docs]) (beta fix) +- Add logic to avoid creating the same scene multiple times ([@Kane610] - [#65207]) ([deconz docs]) (beta fix) +- Add activity statistics to Sonos diagnostics ([@jjlawren] - [#65214]) ([sonos docs]) (beta fix) +- Fix senseme fan lights ([@bdraco] - [#65217]) ([senseme docs]) (beta fix) +- Increase the timeout for flux_led directed discovery ([@bdraco] - [#65222]) ([flux_led docs]) (beta fix) +- Use .json.txt for diagnostics download filetype ([@ludeeus] - [#65236]) (beta fix) +- Fix webostv live TV source missing when configuring sources ([@thecode] - [#65243]) ([webostv docs]) (beta fix) +- Fix powerwall login retry when hitting rate limit ([@bdraco] - [#65245]) ([powerwall docs]) (beta fix) +- Fix flux_led not generating unique ids when discovery fails ([@bdraco] - [#65250]) ([flux_led docs]) (beta fix) +- Fix debugpy blocking the event loop at startup ([@bdraco] - [#65252]) ([debugpy docs]) (beta fix) +- Handle missing attrs in whois results ([@bdraco] - [#65254]) ([whois docs]) (beta fix) +- Simplify whois value_fn ([@bdraco] - [#65265]) ([whois docs]) (beta fix) +- Bump aiowebostv to 0.1.2 ([@thecode] - [#65267]) ([webostv docs]) (beta fix) +- Fix flick_electric auth failures ([@ZephireNZ] - [#65274]) ([flick_electric docs]) (beta fix) +- Update xknx to 0.19.1 ([@farmio] - [#65275]) ([knx docs]) (beta fix) +- Bump python-kasa to 0.4.1 for tplink integration ([@rytilahti] - [#64123]) ([tplink docs]) (beta fix) +- Add diagnostics to Advantage Air ([@Bre77] - [#65006]) ([advantage_air docs]) (beta fix) +- Send notification to alert of Sonos networking issues ([@jjlawren] - [#65084]) ([sonos docs]) (beta fix) +- Add cast platform for extending Google Cast media_player ([@emontnemery] - [#65149]) ([cast docs]) ([plex docs]) (beta fix) +- Tuya fan percentage fix ([@fOmey] - [#65225]) ([tuya docs]) (beta fix) +- Increase august timeout and make failure to sync at startup non-fatal ([@bdraco] - [#65281]) ([august docs]) (beta fix) +- Bump pyatmo to v.6.2.4 ([@cgtobi] - [#65285]) ([netatmo docs]) (beta fix) +- Correct cast media browse filter for audio groups ([@emontnemery] - [#65288]) ([cast docs]) (beta fix) +- Bump pynetgear to 0.9.1 ([@starkillerOG] - [#65290]) ([netgear docs]) (beta fix) +- Bump pyoverkiz to 1.3.2 ([@iMicknl] - [#65293]) ([overkiz docs]) (beta fix) +- Fix HomeWizard unclosed clientsession error when closing Home Assistant ([@DCSBL] - [#65296]) ([homewizard docs]) (beta fix) +- Add HomeWizard diagnostics ([@DCSBL] - [#65297]) ([homewizard docs]) (beta fix) (new-integration) +- Update adguard to 0.5.1 ([@frenck] - [#65305]) ([adguard docs]) (beta fix) +- Update wled to 0.13.0 ([@frenck] - [#65312]) ([wled docs]) (beta fix) +- Fix missing expiration data in Whois information ([@frenck] - [#65313]) ([whois docs]) (beta fix) +- Improve reliability of august setup with recent api changes ([@bdraco] - [#65314]) ([august docs]) (beta fix) +- Bump androidtv to 0.0.61 ([@JeffLIrion] - [#65315]) (beta fix) +- Add diagnostics support to WLED ([@frenck] - [#65317]) ([wled docs]) (beta fix) +- Update tailscale to 0.2.0 ([@frenck] - [#65318]) ([tailscale docs]) (beta fix) +- Ensure PVOutput connection error is logged ([@frenck] - [#65319]) ([pvoutput docs]) (beta fix) +- Bump pyps4-2ndscreen to 1.3.1 ([@pascalwinters] - [#65320]) ([ps4 docs]) (beta fix) +- Alexa to handle brightness and catch exceptions ([@balloob] - [#65322]) ([alexa docs]) (beta fix) +- Fritz tests cleanup ([@chemelli74] - [#65054]) ([fritz docs]) (beta fix) +- Improve debugging and error handling in Fritz!Tools ([@mib1185] - [#65324]) ([fritz docs]) (beta fix) +- Fix guardian being rediscovered via dhcp ([@bdraco] - [#65332]) ([guardian docs]) (beta fix) +- Add diagnostics support to Fritz ([@chemelli74] - [#65334]) ([fritz docs]) (beta fix) +- Prevent unifiprotect from being rediscovered on UDM-PROs ([@bdraco] - [#65335]) ([unifiprotect docs]) (beta fix) +- Bump version tag on async_timeout warning ([@balloob] - [#65339]) (beta fix) +- Bump aiohue to 4.0.1 ([@balloob] - [#65340]) ([hue docs]) (beta fix) +- Bump zeroconf to 0.38.3 ([@bdraco] - [#65341]) ([zeroconf docs]) (beta fix) +- Add diagnostics for SamsungTV ([@chemelli74] - [#65342]) ([samsungtv docs]) (beta fix) +- I zone, you zone, we zoning ([@balloob] - [#65344]) ([zone docs]) (beta fix) {% enddetails %} @@ -4679,6 +4796,7 @@ The following integrations are no longer available as of this release: [#63020]: https://github.com/home-assistant/core/pull/63020 [#63022]: https://github.com/home-assistant/core/pull/63022 [#63023]: https://github.com/home-assistant/core/pull/63023 +[#63026]: https://github.com/home-assistant/core/pull/63026 [#63027]: https://github.com/home-assistant/core/pull/63027 [#63032]: https://github.com/home-assistant/core/pull/63032 [#63034]: https://github.com/home-assistant/core/pull/63034 @@ -5257,6 +5375,7 @@ The following integrations are no longer available as of this release: [#64117]: https://github.com/home-assistant/core/pull/64117 [#64121]: https://github.com/home-assistant/core/pull/64121 [#64122]: https://github.com/home-assistant/core/pull/64122 +[#64123]: https://github.com/home-assistant/core/pull/64123 [#64126]: https://github.com/home-assistant/core/pull/64126 [#64130]: https://github.com/home-assistant/core/pull/64130 [#64131]: https://github.com/home-assistant/core/pull/64131 @@ -5584,6 +5703,7 @@ The following integrations are no longer available as of this release: [#64655]: https://github.com/home-assistant/core/pull/64655 [#64656]: https://github.com/home-assistant/core/pull/64656 [#64657]: https://github.com/home-assistant/core/pull/64657 +[#64658]: https://github.com/home-assistant/core/pull/64658 [#64660]: https://github.com/home-assistant/core/pull/64660 [#64661]: https://github.com/home-assistant/core/pull/64661 [#64662]: https://github.com/home-assistant/core/pull/64662 @@ -5766,6 +5886,7 @@ The following integrations are no longer available as of this release: [#64935]: https://github.com/home-assistant/core/pull/64935 [#64936]: https://github.com/home-assistant/core/pull/64936 [#64937]: https://github.com/home-assistant/core/pull/64937 +[#64938]: https://github.com/home-assistant/core/pull/64938 [#64939]: https://github.com/home-assistant/core/pull/64939 [#64940]: https://github.com/home-assistant/core/pull/64940 [#64941]: https://github.com/home-assistant/core/pull/64941 @@ -5802,6 +5923,110 @@ The following integrations are no longer available as of this release: [#64993]: https://github.com/home-assistant/core/pull/64993 [#64994]: https://github.com/home-assistant/core/pull/64994 [#64995]: https://github.com/home-assistant/core/pull/64995 +[#64999]: https://github.com/home-assistant/core/pull/64999 +[#65006]: https://github.com/home-assistant/core/pull/65006 +[#65008]: https://github.com/home-assistant/core/pull/65008 +[#65009]: https://github.com/home-assistant/core/pull/65009 +[#65011]: https://github.com/home-assistant/core/pull/65011 +[#65013]: https://github.com/home-assistant/core/pull/65013 +[#65025]: https://github.com/home-assistant/core/pull/65025 +[#65027]: https://github.com/home-assistant/core/pull/65027 +[#65030]: https://github.com/home-assistant/core/pull/65030 +[#65031]: https://github.com/home-assistant/core/pull/65031 +[#65040]: https://github.com/home-assistant/core/pull/65040 +[#65044]: https://github.com/home-assistant/core/pull/65044 +[#65045]: https://github.com/home-assistant/core/pull/65045 +[#65047]: https://github.com/home-assistant/core/pull/65047 +[#65048]: https://github.com/home-assistant/core/pull/65048 +[#65054]: https://github.com/home-assistant/core/pull/65054 +[#65055]: https://github.com/home-assistant/core/pull/65055 +[#65056]: https://github.com/home-assistant/core/pull/65056 +[#65059]: https://github.com/home-assistant/core/pull/65059 +[#65060]: https://github.com/home-assistant/core/pull/65060 +[#65065]: https://github.com/home-assistant/core/pull/65065 +[#65069]: https://github.com/home-assistant/core/pull/65069 +[#65072]: https://github.com/home-assistant/core/pull/65072 +[#65073]: https://github.com/home-assistant/core/pull/65073 +[#65074]: https://github.com/home-assistant/core/pull/65074 +[#65075]: https://github.com/home-assistant/core/pull/65075 +[#65076]: https://github.com/home-assistant/core/pull/65076 +[#65082]: https://github.com/home-assistant/core/pull/65082 +[#65084]: https://github.com/home-assistant/core/pull/65084 +[#65091]: https://github.com/home-assistant/core/pull/65091 +[#65094]: https://github.com/home-assistant/core/pull/65094 +[#65095]: https://github.com/home-assistant/core/pull/65095 +[#65096]: https://github.com/home-assistant/core/pull/65096 +[#65098]: https://github.com/home-assistant/core/pull/65098 +[#65105]: https://github.com/home-assistant/core/pull/65105 +[#65115]: https://github.com/home-assistant/core/pull/65115 +[#65121]: https://github.com/home-assistant/core/pull/65121 +[#65124]: https://github.com/home-assistant/core/pull/65124 +[#65125]: https://github.com/home-assistant/core/pull/65125 +[#65128]: https://github.com/home-assistant/core/pull/65128 +[#65129]: https://github.com/home-assistant/core/pull/65129 +[#65131]: https://github.com/home-assistant/core/pull/65131 +[#65134]: https://github.com/home-assistant/core/pull/65134 +[#65135]: https://github.com/home-assistant/core/pull/65135 +[#65138]: https://github.com/home-assistant/core/pull/65138 +[#65141]: https://github.com/home-assistant/core/pull/65141 +[#65145]: https://github.com/home-assistant/core/pull/65145 +[#65149]: https://github.com/home-assistant/core/pull/65149 +[#65151]: https://github.com/home-assistant/core/pull/65151 +[#65152]: https://github.com/home-assistant/core/pull/65152 +[#65154]: https://github.com/home-assistant/core/pull/65154 +[#65155]: https://github.com/home-assistant/core/pull/65155 +[#65159]: https://github.com/home-assistant/core/pull/65159 +[#65160]: https://github.com/home-assistant/core/pull/65160 +[#65161]: https://github.com/home-assistant/core/pull/65161 +[#65162]: https://github.com/home-assistant/core/pull/65162 +[#65165]: https://github.com/home-assistant/core/pull/65165 +[#65167]: https://github.com/home-assistant/core/pull/65167 +[#65170]: https://github.com/home-assistant/core/pull/65170 +[#65171]: https://github.com/home-assistant/core/pull/65171 +[#65176]: https://github.com/home-assistant/core/pull/65176 +[#65190]: https://github.com/home-assistant/core/pull/65190 +[#65195]: https://github.com/home-assistant/core/pull/65195 +[#65207]: https://github.com/home-assistant/core/pull/65207 +[#65214]: https://github.com/home-assistant/core/pull/65214 +[#65217]: https://github.com/home-assistant/core/pull/65217 +[#65222]: https://github.com/home-assistant/core/pull/65222 +[#65225]: https://github.com/home-assistant/core/pull/65225 +[#65236]: https://github.com/home-assistant/core/pull/65236 +[#65243]: https://github.com/home-assistant/core/pull/65243 +[#65245]: https://github.com/home-assistant/core/pull/65245 +[#65250]: https://github.com/home-assistant/core/pull/65250 +[#65252]: https://github.com/home-assistant/core/pull/65252 +[#65254]: https://github.com/home-assistant/core/pull/65254 +[#65265]: https://github.com/home-assistant/core/pull/65265 +[#65267]: https://github.com/home-assistant/core/pull/65267 +[#65274]: https://github.com/home-assistant/core/pull/65274 +[#65275]: https://github.com/home-assistant/core/pull/65275 +[#65281]: https://github.com/home-assistant/core/pull/65281 +[#65285]: https://github.com/home-assistant/core/pull/65285 +[#65288]: https://github.com/home-assistant/core/pull/65288 +[#65290]: https://github.com/home-assistant/core/pull/65290 +[#65293]: https://github.com/home-assistant/core/pull/65293 +[#65296]: https://github.com/home-assistant/core/pull/65296 +[#65297]: https://github.com/home-assistant/core/pull/65297 +[#65305]: https://github.com/home-assistant/core/pull/65305 +[#65312]: https://github.com/home-assistant/core/pull/65312 +[#65313]: https://github.com/home-assistant/core/pull/65313 +[#65314]: https://github.com/home-assistant/core/pull/65314 +[#65315]: https://github.com/home-assistant/core/pull/65315 +[#65317]: https://github.com/home-assistant/core/pull/65317 +[#65318]: https://github.com/home-assistant/core/pull/65318 +[#65319]: https://github.com/home-assistant/core/pull/65319 +[#65320]: https://github.com/home-assistant/core/pull/65320 +[#65322]: https://github.com/home-assistant/core/pull/65322 +[#65324]: https://github.com/home-assistant/core/pull/65324 +[#65332]: https://github.com/home-assistant/core/pull/65332 +[#65334]: https://github.com/home-assistant/core/pull/65334 +[#65335]: https://github.com/home-assistant/core/pull/65335 +[#65339]: https://github.com/home-assistant/core/pull/65339 +[#65340]: https://github.com/home-assistant/core/pull/65340 +[#65341]: https://github.com/home-assistant/core/pull/65341 +[#65342]: https://github.com/home-assistant/core/pull/65342 +[#65344]: https://github.com/home-assistant/core/pull/65344 [@ANMalko]: https://github.com/ANMalko [@Adminiuga]: https://github.com/Adminiuga [@Aeroid]: https://github.com/Aeroid @@ -5904,6 +6129,7 @@ The following integrations are no longer available as of this release: [@emontnemery]: https://github.com/emontnemery [@epenet]: https://github.com/epenet [@esev]: https://github.com/esev +[@fOmey]: https://github.com/fOmey [@farmio]: https://github.com/farmio [@filcole]: https://github.com/filcole [@flacjacket]: https://github.com/flacjacket @@ -5957,6 +6183,7 @@ The following integrations are no longer available as of this release: [@mletenay]: https://github.com/mletenay [@mtdcr]: https://github.com/mtdcr [@natekspencer]: https://github.com/natekspencer +[@nbogojevic]: https://github.com/nbogojevic [@ngdio]: https://github.com/ngdio [@nickw444]: https://github.com/nickw444 [@niecore]: https://github.com/niecore @@ -5966,6 +6193,7 @@ The following integrations are no longer available as of this release: [@ol-iver]: https://github.com/ol-iver [@ollo69]: https://github.com/ollo69 [@orcema]: https://github.com/orcema +[@pascalwinters]: https://github.com/pascalwinters [@petslane]: https://github.com/petslane [@postlund]: https://github.com/postlund [@ppetru]: https://github.com/ppetru @@ -5999,6 +6227,7 @@ The following integrations are no longer available as of this release: [@tausen]: https://github.com/tausen [@tedvdb]: https://github.com/tedvdb [@teharris1]: https://github.com/teharris1 +[@tetienne]: https://github.com/tetienne [@thecode]: https://github.com/thecode [@timmo001]: https://github.com/timmo001 [@tkdrob]: https://github.com/tkdrob @@ -6009,6 +6238,7 @@ The following integrations are no longer available as of this release: [@tschnilo]: https://github.com/tschnilo [@ufodone]: https://github.com/ufodone [@uvjustin]: https://github.com/uvjustin +[@vanbalken]: https://github.com/vanbalken [@vauriga]: https://github.com/vauriga [@viiru-]: https://github.com/viiru- [@yozik04]: https://github.com/yozik04 @@ -6122,6 +6352,7 @@ The following integrations are no longer available as of this release: [daikin docs]: /integrations/daikin/ [danfoss_air docs]: /integrations/danfoss_air/ [darksky docs]: /integrations/darksky/ +[debugpy docs]: /integrations/debugpy/ [deconz docs]: /integrations/deconz/ [default_config docs]: /integrations/default_config/ [delijn docs]: /integrations/delijn/ From a3ce1b479af957ba93f78815fe5c1248600300eb Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 1 Feb 2022 19:07:50 +0100 Subject: [PATCH 212/247] 2022.2.0: Sorted breaking changes --- .../_posts/2022-02-02-release-20222.markdown | 1482 ++++++++--------- 1 file changed, 741 insertions(+), 741 deletions(-) diff --git a/source/_posts/2022-02-02-release-20222.markdown b/source/_posts/2022-02-02-release-20222.markdown index 38e2bc8c883..52bb6c335c8 100644 --- a/source/_posts/2022-02-02-release-20222.markdown +++ b/source/_posts/2022-02-02-release-20222.markdown @@ -453,6 +453,7 @@ We welcome the following new integration this release: The following integrations are now available via the Home Assistant UI: - [Android TV][androidtv docs], done by [@ollo69] +- [Azure Event Hub][azure_event_hub docs], done by[@eavanvalkenburg] - [CPU Speed][cpuspeed docs], done by [@frenck] - [DNS IP][dnsip docs], done by [@gjohansson-ST] - [GitHub][github docs], done by [@ludeeus] @@ -460,6 +461,7 @@ The following integrations are now available via the Home Assistant UI: - [LG webOS Smart TV][webostv docs], done by [@thecode] - [PVOutput][pvoutput docs], done by [@frenck] - [Sensibo][sensibo docs], done by [@gjohansson-ST] +- [SolaX Power][solax docs], done by [@tokenize47] - [Vallox][vallox docs], done by [@slovdahl] - [Version][version docs], done by [@ludeeus] - [Whois][whois docs], done by [@frenck] @@ -478,6 +480,17 @@ Below is a listing of the breaking change for this release, per subject or integration. Click on one of those to read more about the breaking change for that specific item. +{% details "Python 3.8 support dropped" %} + +Python 3.8 support has previously been deprecated and now has been removed. +Home Assistant now requires Python 3.9 to run. + +If you are using Home Assistant OS, Home Assistant Container, or Home Assistant Supervised installation method, you don't have to do anything. In those cases, we all handle this for you. Your system has been using Python 3.9 for quite some time already. + +([@frenck] - [#63883]) + +{% enddetails %} + {% details "GPIO Integrations" %} As of this release, all integration intefacing with GPIO directly, have been @@ -538,7 +551,40 @@ connecting to a remote owfs server is not. {% enddetails %} -{% details "Fan/Humidifer/Light/Remote/Siren/Switch/Vaccuum" %} +{% details "Binary Sensors" %} + +Previously, `binary_sensor` entities could have the state `on`, `off`, and +in case the device was unreachable: `unavailable`. + +However, compared to other entities, it wasn't able to have the `unknown` state, +which has been added this release. + +So, a `binary_sensor` entity can now have the `on`, `off`, `unavailable`, or `unknown` state. + +You might need to adapt your automations or scripts to take this new +`unknown` state into account. + +([@frenck] - [#60193]) ([binary_sensor docs]) + +{% enddetails %} + +{% details "Groups: Locks" %} + +The behavior of grouped locks has been reversed such that "unlocked" is +mapped to `on` and "locked" to off. + +This means that: + +- A group with mixed domains will be considered `on` if any lock included in + the group is unlocked. +- A group of locks will be considered "unlocked" if any lock included in the +- group is unlocked. + +([@emontnemery] - [#62580]) ([lock docs]) ([group docs]) + +{% enddetails %} + +{% details "Fan/Humidifer/Light/Remote/Siren/Switch/Vacuum" %} Previously, toggle-based entities (like `fan`, `light`, `switch`, `remote`, `siren`, `vacuum`, `humidifier`) could have the state `on` or `off`, and in case the device was unreachable: `unavailable`. However, compared to other entities, toggle entities aren't able to have an `unknown` state, this now has changed. @@ -550,149 +596,61 @@ You might need to adapt your automations or scripts to take this new `unknown` s {% enddetails %} -{% details "iOS" %} +{% details "Advantage Air" %} -The Home Assistant iOS/macOS app supports notification actions defined [in the notification itself](https://companion.home-assistant.io/docs/notifications/actionable-notifications/); the old method of defining push categories in the iOS integration is now deprecated and will be removed in the future. +The `advantage_air.set_myzone` service has been depreciated and will be removed +in a future version of Home Assistant. -([@zacwest] - [#61078]) ([ios docs]) +Please use the `select.select_option` service on the MyZone select entity to change this value on supported systems instead. + +([@Bre77] - [#58777]) ([advantage_air docs]) {% enddetails %} -{% details "Flume" %} +{% details "Android TV" %} -The previously deprecated YAML configuration of the Flume integration has been removed. - -Flume is now configured via the UI, any existing YAML configuration has been imported -in previous releases and can now be safely removed from your YAML configuration files. - -([@tkdrob] - [#61517]) ([flume docs]) - -{% enddetails %} - -{% details "Sensor.Community (previously: Luftdaten)" %} - -The Luftdaten integration has been renamed to Sensor.Community; which is -the new name of the Luftdaten project. - -The previously deprecated YAML configuration of this integration -has been removed. - -Sensor.Community is now configured via the UI, any existing YAML configuration -has been imported in previous releases and can now be safely removed from your -YAML configuration files. - -([@frenck] - [#61748] [#62865]) ([luftdaten docs]) - -{% enddetails %} - -{% details "Foscam" %} - -The previously deprecated YAML configuration of the Foscam integration -has been removed. - -Foscam is now configured via the UI, any existing YAML configuration -has been imported in previous releases and can now be safely removed from your -YAML configuration files. - -([@tkdrob] - [#61761]) ([foscam docs]) - -{% enddetails %} - -{% details "Enphase Envoy" %} - -The previously deprecated YAML configuration of the Enphase Envoy integration -has been removed. - -Enphase Envoy is now configured via the UI, any existing YAML configuration -has been imported in previous releases and can now be safely removed from your -YAML configuration files. - -([@tkdrob] - [#61840]) ([enphase_envoy docs]) - -{% enddetails %} - -{% details "Azure Event Hub" %} - -The Azure Event Hub integration migrated to configuration via the -UI. Configuring Azure Event Hub via YAML configuration has been +The Android TV integration migrated to configuration via the +UI. Configuring Android TV via YAML configuration has been deprecated and will be removed in a future Home Assistant release. Your existing YAML configuration is automatically imported on upgrade to this release; and thus can be safely removed from your YAML configuration after upgrading. -([@eavanvalkenburg] - [#61155]) ([azure_event_hub docs]) +- Add config_flow to AndroidTV integration ([@ollo69] - [#54444]) ([androidtv docs]) (breaking-change) {% enddetails %} -{% details "FortiOS" %} +{% details "API" %} -The integration now requires FortiOS 6.4.3 and newer. +The `/api/discovery_info` endpoint was deprecated in 2021.10, and has since only +returned blank values. From this version, the `/api/discovery_info` endpoint has +been removed completly. -([@kimfrellsen] - [#61970]) ([fortios docs]) +([@ludeeus] - [#64534]) ([api docs]) {% enddetails %} -{% details "Zero-configuration networking (zeroconf)" %} +{% details "Apple iCloud" %} -This change is only a concern for custom integration developers. +The Apple iCloud integration migrated to configuration via the +UI in a previous release already. Configuring Apple iCloud via YAML configuration +has now been deprecated and will be removed in a future Home Assistant release. -Currently zeroconf matching only allows matching the `macaddress`, `model`, and `manufacturer` properties along with the `name` from the ZeroconfServiceInfo. +Your existing YAML configuration is already automatically imported; and thus +can be safely removed from your YAML configuration. -Since properties are arbitrarily defined by the zeroconf service, -the list of named properties has grown over time. - -Matching now allows for any arbitrarily defined property. -All property matches must be lowercase, wildcards are supported - -The top level keys `model`, `manufacturer`, and `macaddress` -are now deprecated from the `manifest.json` file and should -be moved into a `properties` dict. - -For example: -```diff -- {"type":"_airplay._tcp.local.","model":"appletv*"} -+ {"type":"_airplay._tcp.local.","properties":{"model":"appletv*"}} -``` - -([@bdraco] - [#62133]) ([zeroconf docs]) +([@epenet] - [#63875]) ([icloud docs]) {% enddetails %} -{% details "Environment Canada" %} +{% details "Apple Push Notification Service (APNS)" %} -The previously deprecated YAML configuration of the Environment Canada -integration has been removed. +The Apple Push Notification Service (APNS) integration has been deprecated and +will be removed in Home Assistant 2022.4. Please note, this does not affect +our mobile companion apps; as they do not use this integration for their +notifications. -Environment Canada is now configured via the UI, any existing YAML configuration -has been imported in previous releases and can now be safely removed from your -YAML configuration files. - -([@tkdrob] - [#61839]) ([environment_canada docs]) - ---- - -The sensors no longer have `Timestamp` as an extra state attribute, instead, -use the new `timestamp` sensor that can be used in automations that track state changes. - -The sensors alert sensors (`advisories`, `endings`, `statements`, `warnings`, and `watches`) state is now a count of the number of active alerts for the sensor type -and the extra state attributes contain the alert text and alert timestamp. - -The attributes are named `alert_` and `alert_time_` where is 1 for alert 1, 2 for alert 2, etc. - -([@gwww] - [#58615]) ([environment_canada docs]) - -{% enddetails %} - -{% details "OpenGarage" %} - -The previously deprecated YAML configuration of the OpenGarage -integration has been removed. - -OpenGarage is now configured via the UI, any existing YAML configuration -has been imported in previous releases and can now be safely removed from your -YAML configuration files. - -- Remove deprecated yaml config from opengarage ([@tkdrob] - [#61961]) ([opengarage docs]) (breaking-change) +([@frenck] - [#64629]) ([apns docs]) {% enddetails %} @@ -709,29 +667,71 @@ removed from your YAML configuration files. {% enddetails %} -{% details "Efergy" %} +{% details "AVM FRITZ!Box Tools" %} -The previously deprecated YAML configuration of the Efergy +The previously deprecated YAML configuration of the AVM FRITZ!Box Tools integration has been removed. -Efergy is now configured via the UI, any existing YAML configuration -has been imported in previous releases and can now be safely removed from your -YAML configuration files. +AVM FRITZ!Box Tools is now configured via the UI, any existing YAML +configurationhas been imported in previous releases and can now be safely +removed from your YAML configuration files. -([@tkdrob] - [#61520]) ([efergy docs]) +[@epenet] - [#63857]) ([fritz docs]) + +---- + +The `reboot` and `reconnect` services are deprecated and will be removed in future release. Please use the newly provided button entities instead. + +([@chemelli74] - [#61483]) ([fritz docs]) {% enddetails %} -{% details "Magic Home" %} +{% details "AVM FRITZ!SmartHome" %} -The previously deprecated YAML configuration of the Magic Home -integration has been removed. +The `lock` and `devicelock` attributes are removed from all entities and now exposed as own sensors. -Magic Home is now configured via the UI, any existing YAML configuration -has been imported in previous releases and can now be safely removed from your -YAML configuration files. +([@mib1185] - [#60426]) ([fritzbox docs]) -([@tkdrob] - [#61844]) ([flux_led docs]) +{% enddetails %} + +{% details "Azure Event Hub" %} + +The Azure Event Hub integration migrated to configuration via the +UI. Configuring Azure Event Hub via YAML configuration has been +deprecated and will be removed in a future Home Assistant release. + +Your existing YAML configuration is automatically imported on upgrade to this +release; and thus can be safely removed from your YAML configuration after upgrading. + +([@eavanvalkenburg] - [#61155]) ([azure_event_hub docs]) + +{% enddetails %} + +{% details "BMW Connected Drive" %} + +The `charging_time_remaining` (in hours) has been replaced with +`charging_end_time` (timestamp) to not clutter the Home Assistant state machine. + +You might need to adapt your automations or scripts for this change. + +([@rikroe] - [#60942]) ([bmw_connected_drive docs]) + +--- + +All ``bmw_connected_drive.*` services are deprecated. +Please use the new button entities with the `button.press` service instead. + +([@rikroe] - [#63136]) ([bmw_connected_drive docs]) + +{% enddetails %} + +{% details "Bond" %} + +The custom `start_increasing_brightness`, `start_decreasing_brightness` and `stop` services are now deprecated and will be removed in a future release. + +Please use the new button entities, that replace those, instead. + +([@bdraco] - [#64725]) ([bond docs]) {% enddetails %} @@ -761,6 +761,19 @@ YAML configuration files. {% enddetails %} +{% details "CPU Speed" %} + +The CPU Speed integration migrated to configuration via the +UI. Configuring CPU Speed via YAML configuration has been +deprecated and will be removed in a future Home Assistant release. + +Your existing YAML configuration is automatically imported on upgrade to this +release; and thus can be safely removed from your YAML configuration after upgrading. + +([@frenck] - [#62929]) ([cpuspeed docs]) + +{% enddetails %} + {% details "DLNA Digital Media Renderer" %} The previously deprecated YAML configuration of the DLNA Digital Media Renderer @@ -774,29 +787,206 @@ removed from your YAML configuration files. {% enddetails %} -{% details "Android TV" %} +{% details "DNS IP" %} -The Android TV integration migrated to configuration via the -UI. Configuring Android TV via YAML configuration has been +The DNS IP integration migrated to configuration via the +UI. Configuring DNS IP via YAML configuration has been deprecated and will be removed in a future Home Assistant release. Your existing YAML configuration is automatically imported on upgrade to this release; and thus can be safely removed from your YAML configuration after upgrading. -- Add config_flow to AndroidTV integration ([@ollo69] - [#54444]) ([androidtv docs]) (breaking-change) +([@gjohansson-ST] - [#62843]) ([dnsip docs]) {% enddetails %} -{% details "Nuki" %} +{% details "DoorBird" %} -The previously deprecated YAML configuration of the Nuki +The relays and IR light switches are removed and replaced with corresponding +buttons entities. Any scripts or automations which reference these switches to +turn them on should change to instead press the button instead. + +([@flacjacket] - [#63995]) ([doorbird docs]) + +{% enddetails %} + +{% details "DSMR" %} + +The `sensor.energy_consumption_total` sensor for DSMR versions 2.2 and 4 has +been removed. Meters with these versions do not provide this data, +so this sensor can be safely removed. You might need to clean up +the orphaned entity in your setup. + +([@rhpijnacker] - [#63436]) ([dsmr docs]) + +{% enddetails %} + +{% details "Efergy" %} + +The previously deprecated YAML configuration of the Efergy integration has been removed. -Nuki is now configured via the UI, any existing YAML +Efergy is now configured via the UI, any existing YAML configuration +has been imported in previous releases and can now be safely removed from your +YAML configuration files. + +([@tkdrob] - [#61520]) ([efergy docs]) + +{% enddetails %} + +{% details "Enphase Envoy" %} + +The previously deprecated YAML configuration of the Enphase Envoy integration +has been removed. + +Enphase Envoy is now configured via the UI, any existing YAML configuration +has been imported in previous releases and can now be safely removed from your +YAML configuration files. + +([@tkdrob] - [#61840]) ([enphase_envoy docs]) + +{% enddetails %} + +{% details "Environment Canada" %} + +The previously deprecated YAML configuration of the Environment Canada +integration has been removed. + +Environment Canada is now configured via the UI, any existing YAML configuration +has been imported in previous releases and can now be safely removed from your +YAML configuration files. + +([@tkdrob] - [#61839]) ([environment_canada docs]) + +--- + +The sensors no longer have `Timestamp` as an extra state attribute, instead, +use the new `timestamp` sensor that can be used in automations that track state changes. + +The sensors alert sensors (`advisories`, `endings`, `statements`, `warnings`, and `watches`) state is now a count of the number of active alerts for the sensor type +and the extra state attributes contain the alert text and alert timestamp. + +The attributes are named `alert_` and `alert_time_` where is 1 for alert 1, 2 for alert 2, etc. + +([@gwww] - [#58615]) ([environment_canada docs]) + +{% enddetails %} + +{% details "Fan" %} + +This is more a breaking change for custom integration developers. + +Now that all core fans are using the new fan entity model, the compatibility shim +has been removed. Custom integrations that have not yet switched to the new +fan model. For more information see: + + + +Preset modes and percentages will continue to be translated back to legacy speeds +until 2022.3 in order to give users a bit more time to update automations. + +([@bdraco] - [#59781]) ([fan docs]) + +{% enddetails %} + +{% details "Fibaro" %} + +The energy values are exposed now as separate sensor entities and therefore the +state attribute `current_energy_kwh` was removed from all other entities. + +If you use the state attribute `current_energy_kwh` you need to change +that to use the new energy sensors instead. + +([@rappenze] - [#63697]) ([fibaro docs]) + +{% enddetails %} + +{% details "Flume" %} + +The previously deprecated YAML configuration of the Flume integration has been removed. + +Flume is now configured via the UI, any existing YAML configuration has been imported +in previous releases and can now be safely removed from your YAML configuration files. + +([@tkdrob] - [#61517]) ([flume docs]) + +{% enddetails %} + +{% details "FortiOS" %} + +The integration now requires FortiOS 6.4.3 and newer. + +([@kimfrellsen] - [#61970]) ([fortios docs]) + +{% enddetails %} + +{% details "Foscam" %} + +The previously deprecated YAML configuration of the Foscam integration +has been removed. + +Foscam is now configured via the UI, any existing YAML configuration +has been imported in previous releases and can now be safely removed from your +YAML configuration files. + +([@tkdrob] - [#61761]) ([foscam docs]) + +{% enddetails %} + +{% details "Foursquare" %} + +The data associated with `foursquare.checkin` event is now available as a +dictionary item with key "text". + +If you use this event in your automation or scripts, you'd need to adjust to +to match this change. + +([@epenet] - [#63982]) ([foursquare docs]) + +{% enddetails %} + +{% details "GitHub" %} + +The YAML configuration for the `github` sensor platform has been removed. + +There was no viable automatic migration of the configuration, so you need to +manually remove the configuration from your configuration file and set it up +again in the integration panel. + +Previously this integration created 1 sensor for each repository, now this +is split out to multiple entities which are mostly disabled by default +(you can enable the entities you want this integration to provide). + +Support for GitHub enterprise has been removed. + +([@ludeeus] - [#64190]) ([github docs]) + +{% enddetails %} + +{% details "Google Maps Travel Time" %} + +The previously deprecated YAML configuration of the Google Maps Travel Time +integration has been removed. + +Google Maps Travel Time is now configured via the UI, any existing YAML configurationhas been imported in previous releases and can now be safely removed from your YAML configuration files. -([@tkdrob] - [#62470]) ([nuki docs]) +([@tkdrob] - [#62468]) ([google_travel_time docs]) + +{% enddetails %} + +{% details "HomeKit" %} + +HomeKit will now automatically exclude entities with an entity category such as +a configuration or diagnostic entity unless they have been explicitly included. + +To explicitly include an entity: + +- YAML: Add the entity to the filter in either the `include_entities` or `include_entity_globs` fields. +- UI: Select the entity in the UI in include mode. If you are using exclude mode, a second bridge can be created in include mode. + +([@bdraco] - [#64492]) ([homekit docs]) {% enddetails %} @@ -814,395 +1004,24 @@ removed from your YAML configuration files. {% enddetails %} -{% details "Google Maps Travel Time" %} +{% details "iOS" %} -The previously deprecated YAML configuration of the Google Maps Travel Time +The Home Assistant iOS/macOS app supports notification actions defined [in the notification itself](https://companion.home-assistant.io/docs/notifications/actionable-notifications/); the old method of defining push categories in the iOS integration is now deprecated and will be removed in the future. + +([@zacwest] - [#61078]) ([ios docs]) + +{% enddetails %} + +{% details "Keenetic NDMS2 Router" %} + +The previously deprecated YAML configuration of the Keenetic NDMS2 Router integration has been removed. -Google Maps Travel Time is now configured via the UI, any existing YAML +Keenetic NDMS2 Router is now configured via the UI, any existing YAML configurationhas been imported in previous releases and can now be safely removed from your YAML configuration files. -([@tkdrob] - [#62468]) ([google_travel_time docs]) - -{% enddetails %} - -{% details "Philips TV" %} - -The previously deprecated YAML configuration of the Philips TV -integration has been removed. - -Philips TV is now configured via the UI, any existing YAML -configurationhas been imported in previous releases and can now be safely -removed from your YAML configuration files. - -([@tkdrob] - [#62471]) ([philips_js docs]) - -{% enddetails %} - -{% details "TP-Link Kasa Smart" %} - -The previously deprecated YAML configuration of the TP-Link Kasa Smart -integration has been removed. - -TP-Link Kasa Smart is now configured via the UI, any existing YAML -configurationhas been imported in previous releases and can now be safely -removed from your YAML configuration files. - -([@bdraco] - [#62457]) ([tplink docs]) - -{% enddetails %} - -{% details "RIVM Stookalert" %} - -The previously deprecated YAML configuration of the Stookalert -integration has been removed. - -Stookalert is now configured via the UI, any existing YAML -configurationhas been imported in previous releases and can now be safely -removed from your YAML configuration files. - -([@frenck] - [#61007]) ([stookalert docs]) - -{% enddetails %} - -{% details "VLC media player Telnet" %} - -The previously deprecated YAML configuration of the VLC media player Telnet -integration has been removed. - -VLC media player Telnet is now configured via the UI, any existing YAML -configurationhas been imported in previous releases and can now be safely -removed from your YAML configuration files. - -([@tkdrob] - [#62542]) ([vlc_telnet docs]) - -{% enddetails %} - -{% details "Logitech Squeezebox" %} - -The previously deprecated YAML configuration of the Logitech Squeezebox -integration has been removed. - -Logitech Squeezebox is now configured via the UI, any existing YAML -configurationhas been imported in previous releases and can now be safely -removed from your YAML configuration files. - -([@tkdrob] - [#62537]) ([squeezebox docs]) - -{% enddetails %} - -{% details "Groups: Locks" %} - -The behavior of grouped locks has been reversed such that "unlocked" is -mapped to `on` and "locked" to off. - -This means that: - -- A group with mixed domains will be considered `on` if any lock included in - the group is unlocked. -- A group of locks will be considered "unlocked" if any lock included in the -- group is unlocked. - -([@emontnemery] - [#62580]) ([lock docs]) ([group docs]) - -{% enddetails %} - -{% details "Binary Sensors" %} - -Previously, `binary_sensor` entities could have the state `on`, `off`, and -in case the device was unreachable: `unavailable`. - -However, compared to other entities, it wasn't able to have the `unknown` state, -which has been added this release. - -So, a `binary_sensor` entity can now have the `on`, `off`, `unavailable`, or `unknown` state. - -You might need to adapt your automations or scripts to take this new -`unknown` state into account. - -([@frenck] - [#60193]) ([binary_sensor docs]) - -{% enddetails %} - -{% details "BMW Connected Drive" %} - -The `charging_time_remaining` (in hours) has been replaced with -`charging_end_time` (timestamp) to not clutter the Home Assistant state machine. - -You might need to adapt your automations or scripts for this change. - -([@rikroe] - [#60942]) ([bmw_connected_drive docs]) - ---- - -All ``bmw_connected_drive.*` services are deprecated. -Please use the new button entities with the `button.press` service instead. - -([@rikroe] - [#63136]) ([bmw_connected_drive docs]) - -{% enddetails %} - -{% details "Sensibo" %} - -The Sensibo integration migrated to configuration via the -UI. Configuring Sensibo via YAML configuration has been -deprecated and will be removed in a future Home Assistant release. - -Your existing YAML configuration is automatically imported on upgrade to this -release; and thus can be safely removed from your YAML configuration after upgrading. - -([@gjohansson-ST] - [#60900]) ([sensibo docs]) - -{% enddetails %} - -{% details "SwitchBot" %} - -The SwitchBot integration migrated to configuration via the -UI in a previous release already. Configuring SwitchBot via YAML configuration -has now been deprecated and will be removed in a future Home Assistant release. - -Your existing YAML configuration is already automatically imported; and thus -can be safely removed from your YAML configuration. - -([@tkdrob] - [#62583]) ([switchbot docs]) - -{% enddetails %} - -{% details "Trafikverket Train" %} - -The planned time, estimated time and and actual time sensor attributes have -been correct to be UTC isoformatted string which is standard in Home Assistant. - -Previously displayed as `2021-12-23T09:07:00` and now correctly set as `2021-12-23T09:07:00+00:00`. - -This may affect templates or automations based on these attributes. - -([@gjohansson-ST] - [#62636]) ([trafikverket_train docs]) - -{% enddetails %} - -{% details "Samsung SyncThru Printer" %} - -The previously deprecated YAML configuration of the Samsung SyncThru Printer -integration has been removed. - -Samsung SyncThru Printer is now configured via the UI, any existing YAML -configurationhas been imported in previous releases and can now be safely -removed from your YAML configuration files. - -([@tkdrob] - [#62541]) ([syncthru docs]) - -{% enddetails %} - -{% details "Version" %} - -The Version integration migrated to configuration via the -UI. Configuring Version via YAML configuration has been -deprecated and will be removed in a future Home Assistant release. - -Your existing YAML configuration is automatically imported on upgrade to this -release; and thus can be safely removed from your YAML configuration after upgrading. - -Additionally, the `source` and `channel` attributes have been removed from -the Version sensor for the local source. - -([@ludeeus] - [#54642] [#64827]) ([version docs]) - -{% enddetails %} - -{% details "Templates: Binary Sensors" %} - -Template trigger binary sensor should start with `unknown` value rather than always starting with `false`/`off`. This matches the template binary sensor behavior -with other sensors. - -([@amosyuen] - [#62769]) ([template docs]) - -{% enddetails %} - -{% details "PVOutput" %} - -The PVOutput integration migrated to configuration via the -UI. Configuring PVOutput via YAML configuration has been -deprecated and will be removed in a future Home Assistant release. - -Your existing YAML configuration is automatically imported on upgrade to this -release; and thus can be safely removed from your YAML configuration after upgrading. - -Additionally, all sensor attributes of the PVOutput sensor, -have been extracted in their own dedicated sensors. - -This applies to the following PVOutput attributes: - -- `energy_generation` -- `power_generation` -- `energy_consumption` -- `power_consumption` -- `efficiency` -- `temperature` -- `voltage` - -If you relied on these in your automation or scripts, you need to adopt those to use the new separate sensors instead. The attributes are currently available, however, deprecated and will be removed in Home Assistant Core 2022.4. - -([@frenck] - [#62667] [#62894]) ([pvoutput docs]) - -{% enddetails %} - -{% details "Vallox" %} - -The Vallox integration migrated to configuration via the -UI. Configuring Vallox via YAML configuration has been -deprecated and will be removed in a future Home Assistant release. - -Your existing YAML configuration is automatically imported on upgrade to this -release; and thus can be safely removed from your YAML configuration after upgrading. - -([@slovdahl] - [#62780]) ([vallox docs]) - -{% enddetails %} - -{% details "CPU Speed" %} - -The CPU Speed integration migrated to configuration via the -UI. Configuring CPU Speed via YAML configuration has been -deprecated and will be removed in a future Home Assistant release. - -Your existing YAML configuration is automatically imported on upgrade to this -release; and thus can be safely removed from your YAML configuration after upgrading. - -([@frenck] - [#62929]) ([cpuspeed docs]) - -{% enddetails %} - -{% details "Nest" %} - -The Legacy "Works With Nest API" is deprecated and support will be removed -in Home Assistant Core 2022.5; See our [documentation for using the Smart Device -Management API](/integrations/nest/) instead. - -([@allenporter] - [#63027]) ([nest docs]) - -{% enddetails %} - -{% details "MQTT" %} - -The MQTT lights no longer support, the previously deprecated, `value_template`;`state_value_template` should be used instead. - -([@emontnemery] - [#62682]) ([mqtt docs]) - ----- - -Previouysly MQTT climate would only publish to `hold_command_topic` or ` away_mode_command_topic` if the new mode is not the same as the current state. - -As of this release MQTT always publishes on both command topics (`hold_command_topic` and ` away_mode_command_topic`) (if defined) which makes it more predictable -what update the MQTT device will receive. - -([@jbouwh] - [#63463]) ([mqtt docs]) - ----- - -The `send_if_off` config parameter of the climate platform, which limits -publishing if the current operation mode is `HVAC_MODE_OFF`, is now -deprecated. - -This will break applications that depend on this feature. - -([@jbouwh] - [#63814]) ([mqtt docs]) - -{% enddetails %} - -{% details "Waze Travel Time" %} - -The previously deprecated YAML configuration of the Waze Travel Time -integration has been removed. - -Waze Travel Time is now configured via the UI, any existing YAML -configurationhas been imported in previous releases and can now be safely -removed from your YAML configuration files. - -([@tkdrob] - [#62543]) ([waze_travel_time docs]) - -{% enddetails %} - -{% details "SMA Solar" %} - -The previously deprecated YAML configuration of the SMA Solar -integration has been removed. - -SMA Solar is now configured via the UI, any existing YAML -configurationhas been imported in previous releases and can now be safely -removed from your YAML configuration files. - -([@tkdrob] - [#62472]) ([sma docs]) - -{% enddetails %} - -{% details "Nanoleaf" %} - -The Nanoleaf integration migrated to configuration via the -UI in a previous release already. Configuring Nanoleaf via YAML configuration -has now been deprecated and will be removed in a future Home Assistant release. - -Your existing YAML configuration is already automatically imported; and thus -can be safely removed from your YAML configuration. - -([@milanmeu] - [#63404]) ([nanoleaf docs]) - -{% enddetails %} - - -{% details "Viessmann ViCare" %} - -The scan interval option has been removed, since the default should be fine -in almost all cases. - -If you really need more fine-grained control you can disable automatic updates -in the system settings for the Viessmann ViCare integration and automate the -polling of the entities with the -[`homeassistant.update_entity`](/docs/scripts/service-calls#homeassistant-services) -service. - -([@oischinger] - [#63343]) ([vicare docs]) - -{% enddetails %} - -{% details "DSMR" %} - -The `sensor.energy_consumption_total` sensor for DSMR versions 2.2 and 4 has -been removed. Meters with these versions do not provide this data, -so this sensor can be safely removed. You might need to clean up -the orphaned entity in your setup. - -([@rhpijnacker] - [#63436]) ([dsmr docs]) - -{% enddetails %} - -{% details "Nissan Leaf" %} - -The service to start a charge has been deprecated; it is replaced with a button. - -Replace the `nissan_leaf.start_charge` service in any existing automations with `button.press` for the new `button.start_NICKNAME_charging` entity. - -The `nissan_leaf.start_charge` service is now deprecated and will be removed -in a future release. - -([@filcole] - [#62948]) ([nissan_leaf docs]) - -{% enddetails %} - -{% details "ReCollect Waste" %} - -ReCollect Waste no longer stories "next pickup" information as attributes of the "current pickup" sensor; instead, both pickups are now their own sensors. - -([@bachya] - [#62558]) ([recollect_waste docs]) - -{% enddetails %} - -{% details "AVM FRITZ!SmartHome" %} - -The `lock` and `devicelock` attributes are removed from all entities and now exposed as own sensors. - -([@mib1185] - [#60426]) ([fritzbox docs]) +([@epenet] - [#63860]) ([keenetic_ndms2 docs]) {% enddetails %} @@ -1234,146 +1053,6 @@ it possible to add some information about the launch window start and end as att {% enddetails %} -{% details "Media Player Classic Home Cinema (MPC-HC)" %} - -The Media Player Classic Home Cinema (MPC-HC) integration has been deprecated -and will be removed in Home Assistant Core 2022.4. - -This integration is removed under [Architectural Decision Record 0004](https://github.com/home-assistant/architecture/blob/master/adr/0004-webscraping.md). - -([@frenck] - [#63598]) ([mpchc docs]) - -{% enddetails %} - -{% details "VeSync" %} - -Previous versions of this integration exposed power and energy usage from -VeSync outlets as state attributes on the `switch` entity itself. This used the deprecated properties: `current_power_w` and `today_energy_kwh`. - -In this version, these two attributes have been removed from the `switch` -entity and split into two new diagnostic sensor entities that are attached to -the same Device. - -Automations and template entities based on the state attribute mechanism should -be updated accordingly. - -([@decompil3d] - [#61837]) ([vesync docs]) - -{% enddetails %} - -{% details "NETGEAR" %} - -The previously deprecated YAML configuration of the NETGEAR -integration has been removed. - -NETGEAR is now configured via the UI, any existing YAML -configurationhas been imported in previous releases and can now be safely -removed from your YAML configuration files. - -([@epenet] - [#63862]) ([netgear docs]) - -{% enddetails %} - -{% details "Apple iCloud" %} - -The Apple iCloud integration migrated to configuration via the -UI in a previous release already. Configuring Apple iCloud via YAML configuration -has now been deprecated and will be removed in a future Home Assistant release. - -Your existing YAML configuration is already automatically imported; and thus -can be safely removed from your YAML configuration. - -([@epenet] - [#63875]) ([icloud docs]) - -{% enddetails %} - -{% details "Nmap Tracker" %} - -The previously deprecated YAML configuration of the Nmap Tracker -integration has been removed. - -Nmap Tracker is now configured via the UI, any existing YAML -configurationhas been imported in previous releases and can now be safely -removed from your YAML configuration files. - -([@epenet] - [#63863]) ([nmap_tracker docs]) - -{% enddetails %} - -{% details "Keenetic NDMS2 Router" %} - -The previously deprecated YAML configuration of the Keenetic NDMS2 Router -integration has been removed. - -Keenetic NDMS2 Router is now configured via the UI, any existing YAML -configurationhas been imported in previous releases and can now be safely -removed from your YAML configuration files. - -([@epenet] - [#63860]) ([keenetic_ndms2 docs]) - -{% enddetails %} - -{% details "AVM FRITZ!Box Tools" %} - -The previously deprecated YAML configuration of the AVM FRITZ!Box Tools -integration has been removed. - -AVM FRITZ!Box Tools is now configured via the UI, any existing YAML -configurationhas been imported in previous releases and can now be safely -removed from your YAML configuration files. - -[@epenet] - [#63857]) ([fritz docs]) - ----- - -The `reboot` and `reconnect` services are deprecated and will be removed in future release. Please use the newly provided button entities instead. - -([@chemelli74] - [#61483]) ([fritz docs]) - -{% enddetails %} - -{% details "Python 3.8 support dropped" %} - -Python 3.8 support has previously been deprecated and now has been removed. -Home Assistant now requires Python 3.9 to run. - -If you are using Home Assistant OS, Home Assistant Container, or Home Assistant Supervised installation method, you don't have to do anything. In those cases, we all handle this for you. Your system has been using Python 3.9 for quite some time already. - -([@frenck] - [#63883]) - -{% enddetails %} - -{% details "Foursquare" %} - -The data associated with `foursquare.checkin` event is now available as a -dictionary item with key "text". - -If you use this event in your automation or scripts, you'd need to adjust to -to match this change. - -([@epenet] - [#63982]) ([foursquare docs]) - -{% enddetails %} - -{% details "VIZIO SmartCast" %} - -If an integrated `vizio` TV supports apps and the source is currently a non-app -input (e.g. HDMI-1), the `app_id` and `app_name` attributes will no longer be in the media player entity's state. - -When the TV is using an app, the `app_name` will still always be visible and the `app_id` will continue to only be shown if the app is not recognized. - -([@raman325] - [#64025]) ([vizio docs]) - -{% enddetails %} - -{% details "Twinkly" %} - -Key `host` is removed from the (extra) state attribute of the light entity. - -([@RobBie1221] - [#64139]) ([twinkly docs]) - -{% enddetails %} - {% details "LG webOS Smart TV" %} The LG webOS Smart TV integration migrated to configuration via the @@ -1403,132 +1082,298 @@ automation: {% enddetails %} -{% details "DoorBird" %} +{% details "Logitech Squeezebox" %} -The relays and IR light switches are removed and replaced with corresponding -buttons entities. Any scripts or automations which reference these switches to -turn them on should change to instead press the button instead. +The previously deprecated YAML configuration of the Logitech Squeezebox +integration has been removed. -([@flacjacket] - [#63995]) ([doorbird docs]) +Logitech Squeezebox is now configured via the UI, any existing YAML +configurationhas been imported in previous releases and can now be safely +removed from your YAML configuration files. + +([@tkdrob] - [#62537]) ([squeezebox docs]) {% enddetails %} -{% details "GitHub" %} +{% details "Magic Home" %} -The YAML configuration for the `github` sensor platform has been removed. +The previously deprecated YAML configuration of the Magic Home +integration has been removed. -There was no viable automatic migration of the configuration, so you need to -manually remove the configuration from your configuration file and set it up -again in the integration panel. +Magic Home is now configured via the UI, any existing YAML configuration +has been imported in previous releases and can now be safely removed from your +YAML configuration files. -Previously this integration created 1 sensor for each repository, now this -is split out to multiple entities which are mostly disabled by default -(you can enable the entities you want this integration to provide). - -Support for GitHub enterprise has been removed. - -([@ludeeus] - [#64190]) ([github docs]) +([@tkdrob] - [#61844]) ([flux_led docs]) {% enddetails %} -{% details "Z-Wave JS" %} +{% details "Media Player Classic Home Cinema (MPC-HC)" %} -Due to a schema change, `zwave-js-server` version 1.14.0 or greater is required. -Ensure you are using the latest version of `zwave-js-server` (or the add-ons -that provides those). +The Media Player Classic Home Cinema (MPC-HC) integration has been deprecated +and will be removed in Home Assistant Core 2022.4. -([@raman325] - [#64407]) ([zwave_js docs]) +This integration is removed under [Architectural Decision Record 0004](https://github.com/home-assistant/architecture/blob/master/adr/0004-webscraping.md). + +([@frenck] - [#63598]) ([mpchc docs]) {% enddetails %} -{% details "Fibaro" %} +{% details "MQTT" %} -The energy values are exposed now as separate sensor entities and therefore the -state attribute `current_energy_kwh` was removed from all other entities. +The MQTT lights no longer support, the previously deprecated, `value_template`;`state_value_template` should be used instead. -If you use the state attribute `current_energy_kwh` you need to change -that to use the new energy sensors instead. +([@emontnemery] - [#62682]) ([mqtt docs]) -([@rappenze] - [#63697]) ([fibaro docs]) +---- + +Previouysly MQTT climate would only publish to `hold_command_topic` or ` away_mode_command_topic` if the new mode is not the same as the current state. + +As of this release MQTT always publishes on both command topics (`hold_command_topic` and ` away_mode_command_topic`) (if defined) which makes it more predictable +what update the MQTT device will receive. + +([@jbouwh] - [#63463]) ([mqtt docs]) + +---- + +The `send_if_off` config parameter of the climate platform, which limits +publishing if the current operation mode is `HVAC_MODE_OFF`, is now +deprecated. + +This will break applications that depend on this feature. + +([@jbouwh] - [#63814]) ([mqtt docs]) {% enddetails %} -{% details "HomeKit" %} +{% details "Nanoleaf" %} -HomeKit will now automatically exclude entities with an entity category such as -a configuration or diagnostic entity unless they have been explicitly included. +The Nanoleaf integration migrated to configuration via the +UI in a previous release already. Configuring Nanoleaf via YAML configuration +has now been deprecated and will be removed in a future Home Assistant release. -To explicitly include an entity: +Your existing YAML configuration is already automatically imported; and thus +can be safely removed from your YAML configuration. -- YAML: Add the entity to the filter in either the `include_entities` or `include_entity_globs` fields. -- UI: Select the entity in the UI in include mode. If you are using exclude mode, a second bridge can be created in include mode. - -([@bdraco] - [#64492]) ([homekit docs]) +([@milanmeu] - [#63404]) ([nanoleaf docs]) {% enddetails %} -{% details "API" %} +{% details "Nest" %} -The `/api/discovery_info` endpoint was deprecated in 2021.10, and has since only -returned blank values. From this version, the `/api/discovery_info` endpoint has -been removed completly. +The Legacy "Works With Nest API" is deprecated and support will be removed +in Home Assistant Core 2022.5; See our [documentation for using the Smart Device +Management API](/integrations/nest/) instead. -([@ludeeus] - [#64534]) ([api docs]) +([@allenporter] - [#63027]) ([nest docs]) {% enddetails %} -{% details "DNS IP" %} +{% details "NETGEAR" %} -The DNS IP integration migrated to configuration via the -UI. Configuring DNS IP via YAML configuration has been +The previously deprecated YAML configuration of the NETGEAR +integration has been removed. + +NETGEAR is now configured via the UI, any existing YAML +configurationhas been imported in previous releases and can now be safely +removed from your YAML configuration files. + +([@epenet] - [#63862]) ([netgear docs]) + +{% enddetails %} + +{% details "Nissan Leaf" %} + +The service to start a charge has been deprecated; it is replaced with a button. + +Replace the `nissan_leaf.start_charge` service in any existing automations with `button.press` for the new `button.start_NICKNAME_charging` entity. + +The `nissan_leaf.start_charge` service is now deprecated and will be removed +in a future release. + +([@filcole] - [#62948]) ([nissan_leaf docs]) + +{% enddetails %} + +{% details "Nmap Tracker" %} + +The previously deprecated YAML configuration of the Nmap Tracker +integration has been removed. + +Nmap Tracker is now configured via the UI, any existing YAML +configurationhas been imported in previous releases and can now be safely +removed from your YAML configuration files. + +([@epenet] - [#63863]) ([nmap_tracker docs]) + +{% enddetails %} + +{% details "Nuki" %} + +The previously deprecated YAML configuration of the Nuki +integration has been removed. + +Nuki is now configured via the UI, any existing YAML +configurationhas been imported in previous releases and can now be safely +removed from your YAML configuration files. + +([@tkdrob] - [#62470]) ([nuki docs]) + +{% enddetails %} + +{% details "OpenGarage" %} + +The previously deprecated YAML configuration of the OpenGarage +integration has been removed. + +OpenGarage is now configured via the UI, any existing YAML configuration +has been imported in previous releases and can now be safely removed from your +YAML configuration files. + +- Remove deprecated yaml config from opengarage ([@tkdrob] - [#61961]) ([opengarage docs]) (breaking-change) + +{% enddetails %} + +{% details "Philips TV" %} + +The previously deprecated YAML configuration of the Philips TV +integration has been removed. + +Philips TV is now configured via the UI, any existing YAML +configurationhas been imported in previous releases and can now be safely +removed from your YAML configuration files. + +([@tkdrob] - [#62471]) ([philips_js docs]) + +{% enddetails %} + +{% details "PVOutput" %} + +The PVOutput integration migrated to configuration via the +UI. Configuring PVOutput via YAML configuration has been deprecated and will be removed in a future Home Assistant release. Your existing YAML configuration is automatically imported on upgrade to this release; and thus can be safely removed from your YAML configuration after upgrading. -([@gjohansson-ST] - [#62843]) ([dnsip docs]) +Additionally, all sensor attributes of the PVOutput sensor, +have been extracted in their own dedicated sensors. + +This applies to the following PVOutput attributes: + +- `energy_generation` +- `power_generation` +- `energy_consumption` +- `power_consumption` +- `efficiency` +- `temperature` +- `voltage` + +If you relied on these in your automation or scripts, you need to adopt those to use the new separate sensors instead. The attributes are currently available, however, deprecated and will be removed in Home Assistant Core 2022.4. + +([@frenck] - [#62667] [#62894]) ([pvoutput docs]) {% enddetails %} -{% details "Apple Push Notification Service (APNS)" %} +{% details "ReCollect Waste" %} -The Apple Push Notification Service (APNS) integration has been deprecated and -will be removed in Home Assistant 2022.4. Please note, this does not affect -our mobile companion apps; as they do not use this integration for their -notifications. +ReCollect Waste no longer stories "next pickup" information as attributes of the "current pickup" sensor; instead, both pickups are now their own sensors. -([@frenck] - [#64629]) ([apns docs]) +([@bachya] - [#62558]) ([recollect_waste docs]) {% enddetails %} -{% details "WebSocket API / Media Source" %} +{% details "RIVM Stookalert" %} -This concerns custom integration developers only. +The previously deprecated YAML configuration of the Stookalert +integration has been removed. -The parameters for `async_sign_path` have changed. Refresh token is now a keyword parameter. If called as part of a HTTP or WebSocket request, the users refresh token will automatically be used. +Stookalert is now configured via the UI, any existing YAML +configurationhas been imported in previous releases and can now be safely +removed from your YAML configuration files. -([@balloob] - [#64337]) +([@frenck] - [#61007]) ([stookalert docs]) {% enddetails %} -{% details "Bond" %} +{% details "Samsung SyncThru Printer" %} -The custom `start_increasing_brightness`, `start_decreasing_brightness` and `stop` services are now deprecated and will be removed in a future release. +The previously deprecated YAML configuration of the Samsung SyncThru Printer +integration has been removed. -Please use the new button entities, that replace those, instead. +Samsung SyncThru Printer is now configured via the UI, any existing YAML +configurationhas been imported in previous releases and can now be safely +removed from your YAML configuration files. -([@bdraco] - [#64725]) ([bond docs]) +([@tkdrob] - [#62541]) ([syncthru docs]) {% enddetails %} -{% details "Advantage Air" %} +{% details "Sensibo" %} -The `advantage_air.set_myzone` service has been depreciated and will be removed -in a future version of Home Assistant. +The Sensibo integration migrated to configuration via the +UI. Configuring Sensibo via YAML configuration has been +deprecated and will be removed in a future Home Assistant release. -Please use the `select.select_option` service on the MyZone select entity to change this value on supported systems instead. +Your existing YAML configuration is automatically imported on upgrade to this +release; and thus can be safely removed from your YAML configuration after upgrading. -([@Bre77] - [#58777]) ([advantage_air docs]) +([@gjohansson-ST] - [#60900]) ([sensibo docs]) + +{% enddetails %} + +{% details "Sensor.Community (previously: Luftdaten)" %} + +The Luftdaten integration has been renamed to Sensor.Community; which is +the new name of the Luftdaten project. + +The previously deprecated YAML configuration of this integration +has been removed. + +Sensor.Community is now configured via the UI, any existing YAML configuration +has been imported in previous releases and can now be safely removed from your +YAML configuration files. + +([@frenck] - [#61748] [#62865]) ([luftdaten docs]) + +{% enddetails %} + +{% details "SMA Solar" %} + +The previously deprecated YAML configuration of the SMA Solar +integration has been removed. + +SMA Solar is now configured via the UI, any existing YAML +configurationhas been imported in previous releases and can now be safely +removed from your YAML configuration files. + +([@tkdrob] - [#62472]) ([sma docs]) + +{% enddetails %} + +{% details "SolaX Power" %} + +The SolaX Power integration migrated to configuration via the +UI. Configuring SolaX Power via YAML configuration has been +deprecated and will be removed in a future Home Assistant release. + +Your existing YAML configuration is automatically imported on upgrade to this +release; and thus can be safely removed from your YAML configuration after upgrading. + +([@tokenize47] - [#56620]) ([solax docs]) + +{% enddetails %} + +{% details "SwitchBot" %} + +The SwitchBot integration migrated to configuration via the +UI in a previous release already. Configuring SwitchBot via YAML configuration +has now been deprecated and will be removed in a future Home Assistant release. + +Your existing YAML configuration is already automatically imported; and thus +can be safely removed from your YAML configuration. + +([@tkdrob] - [#62583]) ([switchbot docs]) {% enddetails %} @@ -1540,20 +1385,153 @@ The `reboot` and `shutdown` services are deprecated and will be removed in futur {% enddetails %} -{% details "Fan" %} +{% details "Templates: Binary Sensors" %} -This is more a breaking change for custom integration developers. +Template trigger binary sensor should start with `unknown` value rather than always starting with `false`/`off`. This matches the template binary sensor behavior +with other sensors. -Now that all core fans are using the new fan entity model, the compatibility shim -has been removed. Custom integrations that have not yet switched to the new -fan model. For more information see: +([@amosyuen] - [#62769]) ([template docs]) - +{% enddetails %} -Preset modes and percentages will continue to be translated back to legacy speeds -until 2022.3 in order to give users a bit more time to update automations. +{% details "TP-Link Kasa Smart" %} -([@bdraco] - [#59781]) ([fan docs]) +The previously deprecated YAML configuration of the TP-Link Kasa Smart +integration has been removed. + +TP-Link Kasa Smart is now configured via the UI, any existing YAML +configurationhas been imported in previous releases and can now be safely +removed from your YAML configuration files. + +([@bdraco] - [#62457]) ([tplink docs]) + +{% enddetails %} + +{% details "Trafikverket Train" %} + +The planned time, estimated time and and actual time sensor attributes have +been correct to be UTC isoformatted string which is standard in Home Assistant. + +Previously displayed as `2021-12-23T09:07:00` and now correctly set as `2021-12-23T09:07:00+00:00`. + +This may affect templates or automations based on these attributes. + +([@gjohansson-ST] - [#62636]) ([trafikverket_train docs]) + +{% enddetails %} + +{% details "Twinkly" %} + +Key `host` is removed from the (extra) state attribute of the light entity. + +([@RobBie1221] - [#64139]) ([twinkly docs]) + +{% enddetails %} + +{% details "Vallox" %} + +The Vallox integration migrated to configuration via the +UI. Configuring Vallox via YAML configuration has been +deprecated and will be removed in a future Home Assistant release. + +Your existing YAML configuration is automatically imported on upgrade to this +release; and thus can be safely removed from your YAML configuration after upgrading. + +([@slovdahl] - [#62780]) ([vallox docs]) + +{% enddetails %} + +{% details "Version" %} + +The Version integration migrated to configuration via the +UI. Configuring Version via YAML configuration has been +deprecated and will be removed in a future Home Assistant release. + +Your existing YAML configuration is automatically imported on upgrade to this +release; and thus can be safely removed from your YAML configuration after upgrading. + +Additionally, the `source` and `channel` attributes have been removed from +the Version sensor for the local source. + +([@ludeeus] - [#54642] [#64827]) ([version docs]) + +{% enddetails %} + +{% details "VeSync" %} + +Previous versions of this integration exposed power and energy usage from +VeSync outlets as state attributes on the `switch` entity itself. This used the deprecated properties: `current_power_w` and `today_energy_kwh`. + +In this version, these two attributes have been removed from the `switch` +entity and split into two new diagnostic sensor entities that are attached to +the same Device. + +Automations and template entities based on the state attribute mechanism should +be updated accordingly. + +([@decompil3d] - [#61837]) ([vesync docs]) + +{% enddetails %} + +{% details "Viessmann ViCare" %} + +The scan interval option has been removed, since the default should be fine +in almost all cases. + +If you really need more fine-grained control you can disable automatic updates +in the system settings for the Viessmann ViCare integration and automate the +polling of the entities with the +[`homeassistant.update_entity`](/docs/scripts/service-calls#homeassistant-services) +service. + +([@oischinger] - [#63343]) ([vicare docs]) + +{% enddetails %} + +{% details "VIZIO SmartCast" %} + +If an integrated `vizio` TV supports apps and the source is currently a non-app +input (e.g. HDMI-1), the `app_id` and `app_name` attributes will no longer be in the media player entity's state. + +When the TV is using an app, the `app_name` will still always be visible and the `app_id` will continue to only be shown if the app is not recognized. + +([@raman325] - [#64025]) ([vizio docs]) + +{% enddetails %} + +{% details "VLC media player Telnet" %} + +The previously deprecated YAML configuration of the VLC media player Telnet +integration has been removed. + +VLC media player Telnet is now configured via the UI, any existing YAML +configurationhas been imported in previous releases and can now be safely +removed from your YAML configuration files. + +([@tkdrob] - [#62542]) ([vlc_telnet docs]) + +{% enddetails %} + +{% details "Waze Travel Time" %} + +The previously deprecated YAML configuration of the Waze Travel Time +integration has been removed. + +Waze Travel Time is now configured via the UI, any existing YAML +configurationhas been imported in previous releases and can now be safely +removed from your YAML configuration files. + +([@tkdrob] - [#62543]) ([waze_travel_time docs]) + +{% enddetails %} + +{% details "WebSocket API / Media Source" %} + +This concerns custom integration developers only. + +The parameters for `async_sign_path` have changed. Refresh token is now a keyword parameter. If called as part of a HTTP or WebSocket request, the users refresh token will automatically be used. + +([@balloob] - [#64337]) {% enddetails %} @@ -1570,17 +1548,39 @@ release; and thus can be safely removed from your YAML configuration after upgra {% enddetails %} +{% details "Z-Wave JS" %} -{% details "SolaX Power" %} +Due to a schema change, `zwave-js-server` version 1.14.0 or greater is required. +Ensure you are using the latest version of `zwave-js-server` (or the add-ons +that provides those). -The SolaX Power integration migrated to configuration via the -UI. Configuring SolaX Power via YAML configuration has been -deprecated and will be removed in a future Home Assistant release. +([@raman325] - [#64407]) ([zwave_js docs]) -Your existing YAML configuration is automatically imported on upgrade to this -release; and thus can be safely removed from your YAML configuration after upgrading. +{% enddetails %} -([@tokenize47] - [#56620]) ([solax docs]) +{% details "Zero-configuration networking (zeroconf)" %} + +This change is only a concern for custom integration developers. + +Currently zeroconf matching only allows matching the `macaddress`, `model`, and `manufacturer` properties along with the `name` from the ZeroconfServiceInfo. + +Since properties are arbitrarily defined by the zeroconf service, +the list of named properties has grown over time. + +Matching now allows for any arbitrarily defined property. +All property matches must be lowercase, wildcards are supported + +The top level keys `model`, `manufacturer`, and `macaddress` +are now deprecated from the `manifest.json` file and should +be moved into a `properties` dict. + +For example: +```diff +- {"type":"_airplay._tcp.local.","model":"appletv*"} ++ {"type":"_airplay._tcp.local.","properties":{"model":"appletv*"}} +``` + +([@bdraco] - [#62133]) ([zeroconf docs]) {% enddetails %} From bfd51569ab2056278fd5683cf15f6c35cf37bd8b Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 1 Feb 2022 19:22:45 +0100 Subject: [PATCH 213/247] 2022.2.0: Zone change has been moved to next release --- source/_posts/2022-02-02-release-20222.markdown | 4 ---- 1 file changed, 4 deletions(-) diff --git a/source/_posts/2022-02-02-release-20222.markdown b/source/_posts/2022-02-02-release-20222.markdown index 52bb6c335c8..60a1db2eadd 100644 --- a/source/_posts/2022-02-02-release-20222.markdown +++ b/source/_posts/2022-02-02-release-20222.markdown @@ -228,10 +228,6 @@ Screenshot from GitHub PR, needs to be replaced - Scenes now have a state, last activated timestamp (like a button entity, last pressed) -- Zones now have a state! Instead of "zoning" they now show the counter of the - number of people entities in the zone. This means you easily automate - when "someone" gets home, or when everybody left home. - ## More Advanced things Short hand condition nation is now supported in conditions actions as well. From 73970d2f40534dd914337a8def92e5d6ecc2c113 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 1 Feb 2022 22:30:51 +0100 Subject: [PATCH 214/247] 2022.2.0: Add social image --- .../_posts/2022-02-02-release-20222.markdown | 4 ++-- source/images/blog/2022-02/social.png | Bin 0 -> 237762 bytes 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 source/images/blog/2022-02/social.png diff --git a/source/_posts/2022-02-02-release-20222.markdown b/source/_posts/2022-02-02-release-20222.markdown index 60a1db2eadd..3e6136678ce 100644 --- a/source/_posts/2022-02-02-release-20222.markdown +++ b/source/_posts/2022-02-02-release-20222.markdown @@ -10,10 +10,10 @@ comments: true categories: - Release-Notes - Core -og_image: /images/blog/2022-2/social.png +og_image: /images/blog/2022-02/social.png --- - + These are the beta release notes for Home Assistant Core 2022.2 (and is thus a work in progress). diff --git a/source/images/blog/2022-02/social.png b/source/images/blog/2022-02/social.png new file mode 100644 index 0000000000000000000000000000000000000000..7a8b53dfbb2479744763e628cdac045059ca8cff GIT binary patch literal 237762 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%0Aoo2lr@=w4cGo@{q0w0H?Q>zIgnl~5pQa%JL=Th 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%0DadoC)<@5C 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

- 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 -cyAa9P99 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

hWGgRe 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 Date: Tue, 1 Feb 2022 22:31:19 +0100 Subject: [PATCH 215/247] 2022.2.0: Add introduction --- .../_posts/2022-02-02-release-20222.markdown | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/source/_posts/2022-02-02-release-20222.markdown b/source/_posts/2022-02-02-release-20222.markdown index 3e6136678ce..88fa9258afc 100644 --- a/source/_posts/2022-02-02-release-20222.markdown +++ b/source/_posts/2022-02-02-release-20222.markdown @@ -36,18 +36,27 @@ Issues introduced in the beta are processed with priority. --- -The release notes are currently a work in progress, and quite a bit has to -be done. So bear with me during this beta, as I try to make some sense of -a release that contains over 2.5K merged contributions! (An absolute record). - -I'm not sure if this is really fitting, it is Februari already... but since +I'm not sure if this is really fitting; it is February already... but since this is the first release of the year, I'm still going to say it: **Happy New Year 🥂** +And, since we have skipped the January release, this release became a big one. +Over 2,500 contributions make this release the largest one we have ever +shipped! Including 15 brand-new integrations and 13 existing integrations, +which are now available to set up via the user interface. + Now don't be scared when you look at the breaking changes section. It is a lot, however, most of those are cleanup of old deprecations or caused by things -moving to the UI. No better way to start a fresh year, by cleaning up 🧹 +moving to the UI. No better way to start a fresh year, than by cleaning up 🧹 + +By the way, in case you've missed it, [@balloob] published a blog post last +week about the focus for Home Assistant in 2022: [Streamlining Experiences](/blog/2022/01/19/streamlining-experiences/). I'm stoked about it, and am really +looking forward to what this year will do for Home Assistant! Go 2022! + +What is your new years' resolution for your smart home this year? + +Enjoy the release! ../Frenck From 4d2b340654d7a69e7c6d5f6f1a6753fc1ec5ea68 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 1 Feb 2022 22:31:42 +0100 Subject: [PATCH 216/247] 2022.2.0: Add Nabu Casa section --- .../_posts/2022-02-02-release-20222.markdown | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/source/_posts/2022-02-02-release-20222.markdown b/source/_posts/2022-02-02-release-20222.markdown index 88fa9258afc..45a6a31d0a4 100644 --- a/source/_posts/2022-02-02-release-20222.markdown +++ b/source/_posts/2022-02-02-release-20222.markdown @@ -81,6 +81,50 @@ Examples use cases of button entities. +## Updates from Nabu Casa + +Before we dive into this release, we have some news and updates from +[Nabu Casa](https://www.nabucasa.com) to share with you. + +### Annual subscriptions now available for the US + +The ability to subscribe to the [Home Assistant Cloud](https://www.nabucasa.com) +was one of the most requested features sinds Nabu Casa was founded and was +announced to become available during the [State of the Open Home](/state-of-the-open-home/) in December. + +As of today, the annual subscriptions to Home Assistant Cloud are available +for the United States. 🎉 + +Additionally, in regions where annual subscriptions are available, you be able +to use Apple Pay and Google Pay now. + +Annual subscriptions will become available in other countries in the coming +months, including local currency support for Canada, Europe and the United Kingdom. + +### Improved infrastructure + +Our new payment system is part of our revamped cloud system that we are rolling +out, and this will bring more improvements the Home Assistant Cloud services. + +We already improved our remove access infrastructure to make sure it's routing +as close to you as possible. Last week we have rolled out improvements +to the infrastructure that has significantly improved the speed of the +Google Assistant and Amazon Alexa integrations. + +### Zack Barett and Mike Degatano join Nabu Casa + +We are also happy to announce [Zack Barett](https://github.com/zsarnett) and +[Mike Degatano](https://github.com/mdegat01) will be joining Nabu Casa to work +on Home Assistant. + +Zack will be helping out on different aspects of Home Assistant, including the +[Home Assistant YouTube channel](https://www.youtube.com/channel/UCbX3YkedQunLt7EQAdVxh7w), and the Home Assistant Frontend. + +Mike is going to be focussing on extending and improving the Home Assistant +Supervisor and the eco system around it (like its internal plugins and add-ons). + +Welcome! We are excited to have you on board! 🎉 + ## New media player bar, local media... The media browser, has been renamed to: "Media". Nice, simple, and clean. From 3558ec706bedee07f1a4efe6ebb0ea8823f70687 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 1 Feb 2022 22:32:07 +0100 Subject: [PATCH 217/247] 2022.2.0: Add Check for updates --- .../_posts/2022-02-02-release-20222.markdown | 26 ++++++++++-------- .../images/blog/2022-02/check-for-updates.png | Bin 0 -> 18740 bytes 2 files changed, 15 insertions(+), 11 deletions(-) create mode 100644 source/images/blog/2022-02/check-for-updates.png diff --git a/source/_posts/2022-02-02-release-20222.markdown b/source/_posts/2022-02-02-release-20222.markdown index 45a6a31d0a4..4977277aeea 100644 --- a/source/_posts/2022-02-02-release-20222.markdown +++ b/source/_posts/2022-02-02-release-20222.markdown @@ -142,23 +142,27 @@ And Sonos can now even browse other supported media. For example, if you have set up the Spotify and Sonos integration, you can now browse your Spotify to play it on your Sonos devices. Cast also has support for Plex in the media browser. -## Diagnostics for Integration & Device +## Check for updates -To make debugging and reporting issues easier, both in terms of reporting it, -but also for developers to fix them, we have introduce an new feature: -Diagnostics. +A common question, directly seen after a Home Assistant Core, Operating System, +or add-on release announcement: "I don't see the update yet? How do I update?" -Diagnostics can be provided by integrations, to allow you to download -information about your integration instance or a device, directly from the -Home Assistant frontend. +Checking for updates is done by your system - every few hours - automatically. +However, at times you want to check for updates, without waiting for +this to happen. + +This made us realize that doing that was scattered and hidden in several places +depending on which part you wanted to check updates for. Therefore, we +have added a nice and simple "Check for updates" button in the main +configuration screen.

-Screenshot from GitHub PR, needs to be replaced -Screenshot from GitHub PR, needs to be replaced +Screenshot showing the new Check for Updates button in the configuration screen +Checking for any update, is now just a single click.

-This data can be extremely helpful in finding the root causes of issues -and getting them fixed. +This feature is currently available for the Home Assistant OS, +and Home Assistant Supervisor installation methods. Integrations that have adopted it this release (needs to be writte out nicely) diff --git a/source/images/blog/2022-02/check-for-updates.png b/source/images/blog/2022-02/check-for-updates.png new file mode 100644 index 0000000000000000000000000000000000000000..60235e6c6c49422a9f776462344c80edc5bbbd9a GIT binary patch literal 18740 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 Mr>mdKI;Vst05;K5x&QzG literal 0 HcmV?d00001 From 697d01073fbff18820e12092495d1e51b6a2185c Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 1 Feb 2022 22:32:32 +0100 Subject: [PATCH 218/247] 2022.2.0: Add diagnostics section --- .../_posts/2022-02-02-release-20222.markdown | 94 +++++------------- source/images/blog/2022-02/diagnostics.png | Bin 0 -> 8627 bytes 2 files changed, 27 insertions(+), 67 deletions(-) create mode 100644 source/images/blog/2022-02/diagnostics.png diff --git a/source/_posts/2022-02-02-release-20222.markdown b/source/_posts/2022-02-02-release-20222.markdown index 4977277aeea..70d7c20df5b 100644 --- a/source/_posts/2022-02-02-release-20222.markdown +++ b/source/_posts/2022-02-02-release-20222.markdown @@ -164,74 +164,34 @@ Checking for any update, is now just a single click. This feature is currently available for the Home Assistant OS, and Home Assistant Supervisor installation methods. -Integrations that have adopted it this release (needs to be writte out nicely) +## Diagnostics for integrations and devices + +To make debugging and reporting issues with integrations or devices easier, +both in terms of reporting it, but also for developers to fix them, we introduce: + +**Diagnostics**. + +Diagnostics can be provided by integrations and allow you to download diagnostic +information, bout an integration or device you have set up, +directly from the Home Assistant UI. + +

+SScreenshot showing the Download Diagnostics button on a Sonos device page +Screenshot of the Download Diagnostics button on the device page +

+ +The above screenshot is from the device page of a Sonos speaker in Home +Assistant. The downloadable diagnostics file can be viewed, as a text file, +and can be used for sharing when reporting an issue in our issue tracker. + +The diagnostics data can be extremely helpful in finding the root causes of +issues and getting them fixed. As a matter of fact, it helped us pin-pointing +and fixing issues during the beta of this release. + +The good news is, that **61**! integrations already added support this new +diagnostics feature in this release, including Z-Wave JS, ESPHome, Sonos, +Tuya, Shelly, WLED, Unifi, Nest, deCONZ, KNX, Roku, Samsung TV, and many more! -- Add diagnostics support to Sonos ([@jjlawren] - [#64576]) ([sonos docs]) -- Add diagnostics support to Tuya ([@frenck] - [#64374]) ([tuya docs]) -- Add diagnostics support to Verisure ([@frenck] - [#64789]) ([verisure docs]) -- Add diagnostics to Launch Library ([@ludeeus] - [#64871]) ([launch_library docs]) -- Add diagnostics support to RDW ([@frenck] - [#64787]) -- Add diagnostics support to Stookalert ([@frenck] - [#64747]) ([stookalert docs]) -- Add diagnostics support to CPU Speed ([@frenck] - [#64745]) ([cpuspeed docs]) -- Add diagnostics support to Whois ([@frenck] - [#64855]) ([whois docs]) -- Add event statistics to Sonos diagnostics ([@jjlawren] - [#64845]) ([sonos docs]) -- Add diagnostics to Notion ([@bachya] - [#64713]) ([notion docs]) -- Add diagnostics to Flu Near You ([@bachya] - [#64597]) ([flunearyou docs]) -- Add diagnostics to ReCollect Waste ([@bachya] - [#64814]) ([recollect_waste docs]) -- Add diagnostics support to Tailscale ([@frenck] - [#64649]) ([tailscale docs]) -- Add diagnostics support to Sensor.Community ([@frenck] - [#64636]) ([luftdaten docs]) -- Add diagnostics support to Elgato ([@frenck] - [#64652]) ([elgato docs]) -- Add diagnostics to NAM ([@bieniu] - [#64743]) ([nam docs]) -- Add diagnostics support to PVOutput ([@frenck] - [#64625]) ([pvoutput docs]) -- Add diagnostics support to Open-Meteo ([@frenck] - [#64645]) ([open_meteo docs]) -- Add diagnostics to Renault integration ([@epenet] - [#64531]) ([renault docs]) ([diagnostics docs]) -- Add rainforest diagnostics ([@balloob] - [#64647]) ([rainforest_eagle docs]) -- Add diagnostics support to TwenteMilieu ([@frenck] - [#64627]) ([twentemilieu docs]) -- Add diagnostics to Brother integration ([@bieniu] - [#64478]) ([brother docs]) -- Add CO2signal diagnostics ([@balloob] - [#64646]) ([co2signal docs]) -- Add diagnostics platform to AVM Fritz!Smarthome ([@mib1185] - [#64657]) ([fritzbox docs]) -- Add diagnostics support to Axis integration ([@Kane610] - [#64637]) ([axis docs]) -- Add diagnostics support for homekit_controller ([@Jc2k] - [#64773]) ([homekit_controller docs]) -- Add diagnostics support to roku ([@ctalkington] - [#64729]) ([roku docs]) -- Add diagnostics platform to Shelly ([@mib1185] - [#64660]) ([shelly docs]) -- Add diagnostics to OpenUV ([@bachya] - [#64716]) ([openuv docs]) -- Add diagnostics support to UniFi Network integration ([@Kane610] - [#64640]) ([unifi docs]) -- Add diagnostics to IQVIA ([@bachya] - [#64602]) ([iqvia docs]) -- Add diagnostics to Elexa Guardian ([@bachya] - [#64599]) ([guardian docs]) -- Add diagnostics integration ([@balloob] - [#64330]) ([default_config docs]) ([diagnostics docs]) (new-integration) -- Add zwave_js support for diagnostics ([@raman325] - [#64336]) ([zwave_js docs]) -- Add diagnostics to RainMachine ([@bachya] - [#64788]) ([rainmachine docs]) -- Add diagnostics to Nanoleaf ([@ludeeus] - [#64835]) ([nanoleaf docs]) -- Add diagnostics to Synology DSM integration ([@mib1185] - [#64480]) ([synology_dsm docs]) -- Add diagnostics to Mazda integration ([@bdr99] - [#64606]) ([mazda docs]) -- Add diagnostics to deCONZ integration ([@Kane610] - [#64585]) ([deconz docs]) -- Tibber diagnostics ([@Danielhiversen] - [#64472]) ([tibber docs]) -- Add evil genius labs diagnostics ([@balloob] - [#64339]) ([evil_genius_labs docs]) -- Add diagnostic information for nest ([@allenporter] - [#64405]) ([nest docs]) -- Add diagnostics to the core files ([@epenet] - [#64417]) -- Fix attr spelling error in Nest SDM SensorBase ([@iMicknl] - [#64490]) ([nest docs]) -- Add diagnostics for the AirVisual integration ([@bachya] - [#64479]) ([airvisual docs]) -- Add diagnostics to KNX ([@farmio] - [#64471]) ([knx docs]) -- Add diagnostics to Overkiz integration ([@iMicknl] - [#64427]) ([overkiz docs]) -- Add zwave_js device diagnostics ([@raman325] - [#64504]) -- Add device diagnostics support to Tuya ([@frenck] - [#64537]) ([tuya docs]) -- Add diagnostics to Netatmo integration ([@cgtobi] - [#64392]) ([netatmo docs]) -- Add diagnostics to Ambient PWS ([@bachya] - [#64489]) ([ambient_station docs]) ([airvisual docs]) -- Add diagnostics to GitHub integration ([@ludeeus] - [#64385]) ([github docs]) -- Add diagnostics to UptimeRobot ([@ludeeus] - [#64905]) ([uptimerobot docs]) -- Add diagnostics for Coinbase ([@TomBrien] - [#64900]) -- Add diagnostics to Tile ([@bachya] - [#64875]) ([tile docs]) -- Add diagnostics to Ridwell ([@bachya] - [#64863]) ([ridwell docs]) -- Add diagnostics to WattTime ([@bachya] - [#64887]) ([watttime docs]) -- Add diagnostics download to ESPHome ([@jesserockz] - [#65008]) ([esphome docs]) (beta fix) -- Add diagnostics support to P1 Monitor ([@klaasnicolaas] - [#65060]) ([p1_monitor docs]) (beta fix) -- Add diagnostics support to onewire ([@epenet] - [#65131]) ([onewire docs]) (beta fix) -- Add diagnostics for rtsp_to_webrtc ([@allenporter] - [#65138]) ([rtsp_to_webrtc docs]) (beta fix) -- Update nest diagnostics ([@allenporter] - [#65141]) ([nest docs]) (beta fix) -- Add diagnostics to Advantage Air ([@Bre77] - [#65006]) ([advantage_air docs]) (beta fix) -- Add HomeWizard diagnostics ([@DCSBL] - [#65297]) ([homewizard docs]) (beta fix) (new-integration) -- Add diagnostics support to WLED ([@frenck] - [#65317]) ([wled docs]) (beta fix) -- Add diagnostics for SamsungTV ([@chemelli74] - [#65342]) ([samsungtv docs]) (beta fix ## Improved handling of device tracker entities diff --git a/source/images/blog/2022-02/diagnostics.png b/source/images/blog/2022-02/diagnostics.png new file mode 100644 index 0000000000000000000000000000000000000000..b72e54a8a9ca5ecae50d4b966ef9f45a26830e7c GIT binary patch literal 8627 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 P!9_`4U9MW@eenMQG8xmw literal 0 HcmV?d00001 From 99484c177af6ee87c7e222e84927d1572ae213a2 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 1 Feb 2022 22:32:56 +0100 Subject: [PATCH 219/247] 2022.2.0: Add reporting issues section --- .../_posts/2022-02-02-release-20222.markdown | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/source/_posts/2022-02-02-release-20222.markdown b/source/_posts/2022-02-02-release-20222.markdown index 70d7c20df5b..0a8aed641d6 100644 --- a/source/_posts/2022-02-02-release-20222.markdown +++ b/source/_posts/2022-02-02-release-20222.markdown @@ -192,7 +192,28 @@ The good news is, that **61**! integrations already added support this new diagnostics feature in this release, including Z-Wave JS, ESPHome, Sonos, Tuya, Shelly, WLED, Unifi, Nest, deCONZ, KNX, Roku, Samsung TV, and many more! +## Finding known integration issues and where to report them +Experiencing an issue with an integration? Want to know if your issue +is already known and reported? Or, maybe you are not sure where our +issue tracker can be found? + +We added a small menu option to each integration, solving just that. + + + +**TODO: Screenshot** + +This button will bring you to our issue tracker, showing all currently known +and open issues for this integration. + +Is your issue not listed? Well, if this integration provides diagnostics, +download those. Next, go back to issue tracker, using the new known issues link, +and click the "New issue" button in the top right corner to report your issue +by filling out the form. ## Improved handling of device tracker entities From e273ac0bc93b6bb38e8ac8092ab485aa608102b2 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 1 Feb 2022 22:33:12 +0100 Subject: [PATCH 220/247] 2022.2.0: Add scenes have state section --- source/_posts/2022-02-02-release-20222.markdown | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/source/_posts/2022-02-02-release-20222.markdown b/source/_posts/2022-02-02-release-20222.markdown index 0a8aed641d6..5e87d6fac76 100644 --- a/source/_posts/2022-02-02-release-20222.markdown +++ b/source/_posts/2022-02-02-release-20222.markdown @@ -228,6 +228,22 @@ will be enabled by default. This keeps our Home Assistant nice and tidy, but also gives you the possibility to enable those extra ones you like to have, yourself. +## Scenes now have a state + +Scenes never had a state, well that is not entirely true, it would always +say: "scening". That is not really helpful with anything. + +To make the state of a scene more useful, it will now have the last timestamp of when the scene was activated. This has a couple of advantages: + +- The timestamp in the state of the scene tells you when the scene was last used. +- You can now see history of when a scene was activated in the logbook, + and who did that. +- You can now automate on a scene being activated. + +The last one is pretty useful as a scene can now be used to trigger even more +actions via automations. For example, you could start playing media or send +a TTS announcement when a scene is used. + ## Streamlining experiences We recently published a blog on our focus for this year: From 23ce5305e377d169fc0d79bba53ec0a2a86b860b Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 1 Feb 2022 22:33:26 +0100 Subject: [PATCH 221/247] 2022.2.0: Cleanup --- source/_posts/2022-02-02-release-20222.markdown | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/source/_posts/2022-02-02-release-20222.markdown b/source/_posts/2022-02-02-release-20222.markdown index 5e87d6fac76..32df2a5e656 100644 --- a/source/_posts/2022-02-02-release-20222.markdown +++ b/source/_posts/2022-02-02-release-20222.markdown @@ -256,21 +256,6 @@ Things done in this release with that focus: go to that device (instead of showing the table with a single device). (Single device links to device page (#11387) @balloob) -- "Check for updates" in configuration screen. This will check - for Core, Operating System & Add-on updates with a single click. - -

-Screenshot from GitHub PR, needs to be replaced -Screenshot from GitHub PR, needs to be replaced -

- -- Finding known issues for an integration in our issue trackers - -

-Screenshot from GitHub PR, needs to be replaced -Screenshot from Discord, needs to be replaced -

- - Visit device/service and documention on discovered items.

From 3c614a13c6118dc0106c9095ae8b2fd624495dc5 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 1 Feb 2022 22:41:03 +0100 Subject: [PATCH 222/247] 2022.2.0: Tweak --- source/_posts/2022-02-02-release-20222.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_posts/2022-02-02-release-20222.markdown b/source/_posts/2022-02-02-release-20222.markdown index 32df2a5e656..83e394debe8 100644 --- a/source/_posts/2022-02-02-release-20222.markdown +++ b/source/_posts/2022-02-02-release-20222.markdown @@ -89,8 +89,8 @@ Before we dive into this release, we have some news and updates from ### Annual subscriptions now available for the US The ability to subscribe to the [Home Assistant Cloud](https://www.nabucasa.com) -was one of the most requested features sinds Nabu Casa was founded and was -announced to become available during the [State of the Open Home](/state-of-the-open-home/) in December. +anually, was one of the most requested features sinds Nabu Casa was founded and has been +announced at the [State of the Open Home](/state-of-the-open-home/) in December. As of today, the annual subscriptions to Home Assistant Cloud are available for the United States. 🎉 From 6ded71113144a6ce86ed7769c5f665acb97f7d59 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 1 Feb 2022 22:44:55 +0100 Subject: [PATCH 223/247] 2022.2.0: Tweaks --- source/_posts/2022-02-02-release-20222.markdown | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/source/_posts/2022-02-02-release-20222.markdown b/source/_posts/2022-02-02-release-20222.markdown index 83e394debe8..2c7b7713dbd 100644 --- a/source/_posts/2022-02-02-release-20222.markdown +++ b/source/_posts/2022-02-02-release-20222.markdown @@ -168,11 +168,10 @@ and Home Assistant Supervisor installation methods. To make debugging and reporting issues with integrations or devices easier, both in terms of reporting it, but also for developers to fix them, we introduce: - **Diagnostics**. Diagnostics can be provided by integrations and allow you to download diagnostic -information, bout an integration or device you have set up, +information, about an integration or device you have set up, directly from the Home Assistant UI.

@@ -180,17 +179,17 @@ directly from the Home Assistant UI. Screenshot of the Download Diagnostics button on the device page

-The above screenshot is from the device page of a Sonos speaker in Home -Assistant. The downloadable diagnostics file can be viewed, as a text file, +The above screenshot is from the device page of a Sonos speaker. The +downloadable diagnostics file can be viewed, as a text file, and can be used for sharing when reporting an issue in our issue tracker. -The diagnostics data can be extremely helpful in finding the root causes of -issues and getting them fixed. As a matter of fact, it helped us pin-pointing +Diagnostics data can be extremely helpful in finding the root causes of +an issue and to get them fixed. As a matter of fact, it helped us pin-pointing and fixing issues during the beta of this release. -The good news is, that **61**! integrations already added support this new -diagnostics feature in this release, including Z-Wave JS, ESPHome, Sonos, -Tuya, Shelly, WLED, Unifi, Nest, deCONZ, KNX, Roku, Samsung TV, and many more! +The good news is that **61**! integrations already added support for this new +diagnostics feature, including Z-Wave JS, ESPHome, Sonos, Shelly, WLED, +Unifi, Nest, deCONZ, KNX, Tuya, Roku, Samsung TV, and many more! ## Finding known integration issues and where to report them From 4f05196014231fcee397a1c2af23d7cedd7a4186 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 1 Feb 2022 23:45:36 +0100 Subject: [PATCH 224/247] 2022.2.0: Tweaks --- source/_posts/2022-02-02-release-20222.markdown | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/source/_posts/2022-02-02-release-20222.markdown b/source/_posts/2022-02-02-release-20222.markdown index 2c7b7713dbd..b1601aed415 100644 --- a/source/_posts/2022-02-02-release-20222.markdown +++ b/source/_posts/2022-02-02-release-20222.markdown @@ -37,7 +37,7 @@ Issues introduced in the beta are processed with priority. --- I'm not sure if this is really fitting; it is February already... but since -this is the first release of the year, I'm still going to say it: +this is the first release of the year, I'm going to say it anyway: **Happy New Year 🥂** @@ -47,12 +47,13 @@ shipped! Including 15 brand-new integrations and 13 existing integrations, which are now available to set up via the user interface. Now don't be scared when you look at the breaking changes section. It is a lot, -however, most of those are cleanup of old deprecations or caused by things +however, most of those are cleanup of old deprecations, or caused by things moving to the UI. No better way to start a fresh year, than by cleaning up 🧹 By the way, in case you've missed it, [@balloob] published a blog post last -week about the focus for Home Assistant in 2022: [Streamlining Experiences](/blog/2022/01/19/streamlining-experiences/). I'm stoked about it, and am really -looking forward to what this year will do for Home Assistant! Go 2022! +week about the focus for Home Assistant in 2022: [Streamlining Experiences](/blog/2022/01/19/streamlining-experiences/). +I'm stoked about it, and am really looking forward to what this year will do +for Home Assistant! Go 2022! What is your new years' resolution for your smart home this year? @@ -106,7 +107,7 @@ months, including local currency support for Canada, Europe and the United Kingd Our new payment system is part of our revamped cloud system that we are rolling out, and this will bring more improvements the Home Assistant Cloud services. -We already improved our remove access infrastructure to make sure it's routing +We already improved our remote access infrastructure to make sure it's routing as close to you as possible. Last week we have rolled out improvements to the infrastructure that has significantly improved the speed of the Google Assistant and Amazon Alexa integrations. From a01ff8e622ede88c9bdcc1742927b15c842ae559 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 1 Feb 2022 16:23:46 -0800 Subject: [PATCH 225/247] Tweaks --- source/_posts/2022-02-02-release-20222.markdown | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/source/_posts/2022-02-02-release-20222.markdown b/source/_posts/2022-02-02-release-20222.markdown index b1601aed415..cc4d0acd532 100644 --- a/source/_posts/2022-02-02-release-20222.markdown +++ b/source/_posts/2022-02-02-release-20222.markdown @@ -87,7 +87,7 @@ Examples use cases of button entities. Before we dive into this release, we have some news and updates from [Nabu Casa](https://www.nabucasa.com) to share with you. -### Annual subscriptions now available for the US +### Annual subscriptions now available for the United States The ability to subscribe to the [Home Assistant Cloud](https://www.nabucasa.com) anually, was one of the most requested features sinds Nabu Casa was founded and has been @@ -96,8 +96,7 @@ announced at the [State of the Open Home](/state-of-the-open-home/) in December. As of today, the annual subscriptions to Home Assistant Cloud are available for the United States. 🎉 -Additionally, in regions where annual subscriptions are available, you be able -to use Apple Pay and Google Pay now. +Additionally, in regions where annual subscriptions are available, Apple Pay and Google Pay will be available as extra options. Annual subscriptions will become available in other countries in the coming months, including local currency support for Canada, Europe and the United Kingdom. @@ -269,7 +268,7 @@ Screenshot from GitHub PR, needs to be replaced ## More Advanced things -Short hand condition nation is now supported in conditions actions as well. +Short hand condition notion is now supported in conditions actions as well. For use in automations and scripts. For example (needs better example): @@ -488,7 +487,7 @@ We welcome the following new integration this release: The following integrations are now available via the Home Assistant UI: - [Android TV][androidtv docs], done by [@ollo69] -- [Azure Event Hub][azure_event_hub docs], done by[@eavanvalkenburg] +- [Azure Event Hub][azure_event_hub docs], done by[@eavanvalkenburg] - [CPU Speed][cpuspeed docs], done by [@frenck] - [DNS IP][dnsip docs], done by [@gjohansson-ST] - [GitHub][github docs], done by [@ludeeus] @@ -1071,7 +1070,7 @@ release; and thus can be safely removed from your YAML configuration after upgra ([@DurgNomis-drol] - [#62416]) ([launch_library docs]) ---- +--- Attributes on the current sensor is changed. Names of these attributes are changed to better describe what information they provide. (Ex. `agency` changed @@ -1219,7 +1218,7 @@ removed from your YAML configuration files. {% details "Nissan Leaf" %} -The service to start a charge has been deprecated; it is replaced with a button. +The service to start a charge has been deprecated; it is replaced with a button. Replace the `nissan_leaf.start_charge` service in any existing automations with `button.press` for the new `button.start_NICKNAME_charging` entity. @@ -1516,7 +1515,7 @@ in almost all cases. If you really need more fine-grained control you can disable automatic updates in the system settings for the Viessmann ViCare integration and automate the polling of the entities with the -[`homeassistant.update_entity`](/docs/scripts/service-calls#homeassistant-services) +[`homeassistant.update_entity`](/docs/scripts/service-calls#homeassistant-services) service. ([@oischinger] - [#63343]) ([vicare docs]) From 8d938438db97b81f1ba44cd3cc0053047677cb1e Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 2 Feb 2022 13:13:38 +0100 Subject: [PATCH 226/247] 2022.2.0: Tweaks --- source/_posts/2022-02-02-release-20222.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_posts/2022-02-02-release-20222.markdown b/source/_posts/2022-02-02-release-20222.markdown index cc4d0acd532..36fab31f7d3 100644 --- a/source/_posts/2022-02-02-release-20222.markdown +++ b/source/_posts/2022-02-02-release-20222.markdown @@ -90,7 +90,7 @@ Before we dive into this release, we have some news and updates from ### Annual subscriptions now available for the United States The ability to subscribe to the [Home Assistant Cloud](https://www.nabucasa.com) -anually, was one of the most requested features sinds Nabu Casa was founded and has been +anually, was one of the most requested features since Nabu Casa was founded and has been announced at the [State of the Open Home](/state-of-the-open-home/) in December. As of today, the annual subscriptions to Home Assistant Cloud are available From fb6730040a2e774c54514415193355aeaf8940a9 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 2 Feb 2022 13:24:56 +0100 Subject: [PATCH 227/247] 2022.2.0: Media section --- .../_posts/2022-02-02-release-20222.markdown | 31 ++++++++++++------ source/images/blog/2022-02/media-bar.png | Bin 0 -> 454572 bytes 2 files changed, 21 insertions(+), 10 deletions(-) create mode 100644 source/images/blog/2022-02/media-bar.png diff --git a/source/_posts/2022-02-02-release-20222.markdown b/source/_posts/2022-02-02-release-20222.markdown index 36fab31f7d3..39a637a5f37 100644 --- a/source/_posts/2022-02-02-release-20222.markdown +++ b/source/_posts/2022-02-02-release-20222.markdown @@ -125,22 +125,33 @@ Supervisor and the eco system around it (like its internal plugins and add-ons). Welcome! We are excited to have you on board! 🎉 -## New media player bar, local media... +## Media improvements -The media browser, has been renamed to: "Media". Nice, simple, and clean. +The media browser has been renamed to: "Media". Nice, simple, and clean. -And it now has an nice media bar in the button to control the media you +And, it now has a nice media bar in the bottom to control the media you are playing:

-Screenshot from GitHub PR, needs to be replaced -Screenshot from GitHub PR, needs to be replaced -

+Screenshot showing media with the new media bar +
-Sonos, VLC (via Telnet) and Roku now support playing local media. -And Sonos can now even browse other supported media. For example, if you have -set up the Spotify and Sonos integration, you can now browse your Spotify to -play it on your Sonos devices. Cast also has support for Plex in the media browser. +The experience of browsing the media has been improved and extended with +new capabilities. An integration can now browse media of supported +sources provided by other integrations. + +For example, if you have set up the Spotify and Sonos integration, you can now +browse your Spotify to play it on your Sonos devices; and Cast now has support +for playing Plex media straight from the browser. + +Sonos, VLC (via Telnet), and Roku added support for playing local media! Combing +this with the VLC add-on can turn your Home Assistant device into a +media player for your local media. In the video below, Zack will demonstrate how +that works: + +
+ +
## Check for updates diff --git a/source/images/blog/2022-02/media-bar.png b/source/images/blog/2022-02/media-bar.png new file mode 100644 index 0000000000000000000000000000000000000000..19c2630c8e391f45f2121cfd3052ac9e75cb3a3a GIT binary patch literal 454572 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
-The experience of browsing the media has been improved and extended with -new capabilities. An integration can now browse media of supported +The experience of browsing the media has been improved and extended with new +capabilities. The URL in your browser will change when browsing media, so you +can now bookmark these pages. An integration can now browse media of supported sources provided by other integrations. For example, if you have set up the Spotify and Sonos integration, you can now @@ -257,28 +251,51 @@ a TTS announcement when a scene activated. Now the scene has a state; it also got logbook entries.

-## Streamlining experiences +## Search in the configuration panel -We recently published a blog on our focus for this year: -[Streamlining experiences](/blog/2022/01/19/streamlining-experiences/). +There is now a search in the top right of the configuration dashboard, which +opens the [Quick Bar](/docs/tools/quick-bar/). This also works on mobile devices. -Things done in this release with that focus: - -- When a integration has a single device or a single service, if you now - click on the "1 device" shown in the integration card, it will directly - go to that device (instead of showing the table with a single device). - (Single device links to device page (#11387) @balloob) - -- Visit device/service and documention on discovered items. +It allows you to access and search for just about anything within +Home Assistant. From accessing add-ons, configuration panels, +and even entities and devices.

-Screenshot from GitHub PR, needs to be replaced -Screenshot from GitHub PR, needs to be replaced -

+Screenshot showing the new search in the configuration screen + -- Search in top right of configuration dashboard (needs screenshot) +Tip: Did you know you can press `c` (for command) and `e` (for entity) on you +keyboard from anywhere in Home Assistant to bring up that same Quick Bar? -## More Advanced things +## Button helper and template + +In the [previous release, we introduced](/blog/2021/12/11/release-202112/#the-button-entity) +the button entity. One of the most asked questions about the button has been: +"How can I create my own button entity?" + +This release introduces the button helper, and those can be created via +the UI and using YAML ( as the `input_button`). + +{% my helpers badge %} + +These button helpers can be used to trigger automations and we have ensured they +work with Alexa, Google Assistant, and HomeKit. + +Additionally, there is now a template entity for buttons available as well. +Here is an example: + +```yaml +# Example configuration.yaml +template: + button: + - name: "Send message" + press: + - service: notify.frenck + data: + message: "My button has been pressed!" +``` + +## Templating enhancements Short hand condition notion is now supported in conditions actions as well. For use in automations and scripts. @@ -522,7 +539,10 @@ but has now been moved into the "Dashboard" menu item. This keeps the configuration of all dashboard in a single place. -([@zsarnett] - [#11386](https://github.com/home-assistant/frontend/pull/11386)) +([@zsarnett] - [#11386]) + +[@zsarnett]: https://github.com/zsarnett +[#11386]: https://github.com/home-assistant/frontend/pull/11386 {% enddetails %} From fd2ba6901b9c3e65dcf12f7dc93b0d7acb784939 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 2 Feb 2022 16:54:01 +0100 Subject: [PATCH 238/247] 2022.2.0: Last pieces --- .../_posts/2022-02-02-release-20222.markdown | 229 ++++++------------ .../blog/2022-02/configuration-search.png | Bin 0 -> 16163 bytes .../images/blog/2022-02/discovered-menu.png | Bin 0 -> 61244 bytes 3 files changed, 78 insertions(+), 151 deletions(-) create mode 100644 source/images/blog/2022-02/configuration-search.png create mode 100644 source/images/blog/2022-02/discovered-menu.png diff --git a/source/_posts/2022-02-02-release-20222.markdown b/source/_posts/2022-02-02-release-20222.markdown index 3f4a2ab1e67..c84f1d1b463 100644 --- a/source/_posts/2022-02-02-release-20222.markdown +++ b/source/_posts/2022-02-02-release-20222.markdown @@ -15,27 +15,6 @@ og_image: /images/blog/2022-02/social.png
-These are the beta release notes for Home Assistant Core 2022.2 (and is thus a -work in progress). - -If you encounter any issues with the beta release, please report them on GitHub: - -- Issues with integrations, automations and such (Core related):
- -- Issues with the frontend/Lovelace:
- -- Issues with the Supervisor:
- -- Issues with the documentation:
- - -Please be sure to include the beta version you are running in the issue -version field (not title), so we can classify your issue correctly. - -Issues introduced in the beta are processed with priority. - ---- - I'm not sure if this is really fitting; it is February already... but since this is the first release of the year, I'm going to say it anyway: @@ -61,12 +40,16 @@ Enjoy the release! ../Frenck -- [New media player bar, local media...](#new-media-player-bar-local-media) -- [Diagnostics for Integration & Device](#diagnostics-for-integration--device) +- [Updates from Nabu Casa](#updates-from-nabu-casa) +- [Media improvements](#media-improvements) +- [Check for updates](#check-for-updates) +- [Diagnostics for integrations and devices](#diagnostics-for-integrations-and-devices) +- [Finding known issues and where to report new ones](#finding-known-issues-and-where-to-report-new-ones) - [Improved handling of device tracker entities](#improved-handling-of-device-tracker-entities) -- [Streamlining experiences](#streamlining-experiences) -- [More Advanced things](#more-advanced-things) -- [Python 3.8 dropped](#python-38-dropped) +- [Scenes now have a state](#scenes-now-have-a-state) +- [Search in the configuration panel](#search-in-the-configuration-panel) +- [Button helper and template](#button-helper-and-template) +- [Templating enhancements](#templating-enhancements) - [Other noteworthy changes](#other-noteworthy-changes) - [New Integrations](#new-integrations) - [Integrations now available to set up from the UI](#integrations-now-available-to-set-up-from-the-ui) @@ -80,7 +63,7 @@ Enjoy the release! Before we dive into this release, we have some news and updates from [Nabu Casa](https://www.nabucasa.com) to share with you. -### Annual subscriptions now available for the United States +### Annual subscriptions now available for the United States The ability to subscribe to the [Home Assistant Cloud](https://www.nabucasa.com) anually, was one of the most requested features since Nabu Casa was founded and has been @@ -94,7 +77,7 @@ Additionally, in regions where annual subscriptions are available, Apple Pay and Annual subscriptions will become available in other countries in the coming months, including local currency support for Canada, Europe and the United Kingdom. -### Improved infrastructure +### Improved infrastructure Our new payment system is part of our revamped cloud system that we are rolling out, and this will bring more improvements the Home Assistant Cloud services. @@ -104,7 +87,7 @@ as close to you as possible. Last week we have rolled out improvements to the infrastructure that has significantly improved the speed of the Google Assistant and Amazon Alexa integrations. -### Zack Barett and Mike Degatano join Nabu Casa +### Zack Barett and Mike Degatano join Nabu Casa We are also happy to announce [Zack Barett](https://github.com/zsarnett) and [Mike Degatano](https://github.com/mdegat01) will be joining Nabu Casa to work @@ -297,10 +280,15 @@ template: ## Templating enhancements -Short hand condition notion is now supported in conditions actions as well. -For use in automations and scripts. +There are a couple of nice enhancements to this release for the more advanced +use cases that stand out. -For example (needs better example): +### Shorthand condition notations in actions + +Shorthand condition notations are pretty helpful and are now supported in +conditions actions; For use in automations and scripts. + +For example: {% raw %} @@ -311,15 +299,14 @@ sequence: {% endraw %} -- Support shorthand templates in condition actions ([@emontnemery] - [#61177]) +### Immediate if (`iif`) +We now have an [immediate if (`iif`)](/docs/configuration/templating/#immediate-if-iif) +template function and filter that can be used as a short alternative version +to an if/else statement. -We now have an [immediate if (`iif`)](/docs/configuration/templating/#immediate-if-iif) template function that can be used: - -Syntax: `iif(condition, if_true, if_false, if_none)` - -Examples: - +These can help shortening a lot of if/else constructs that for example, return +a "Yes" or "No" (or similar) value in templates. Some examples: {% raw %} ```yaml @@ -330,126 +317,66 @@ Examples: {% endraw %} -- Add iif (immediate if) template function/filter ([@frenck] - [#61428]) - -- Add slugify as a template filter ([@ZephireNZ] - [#58724]) -- Add is_number as a test for use in select, selectattr, reject, and re… ([@Petro31] - [#63732]) - ## Other noteworthy changes There is much more juice in this release; here are some of the other noteworthy changes this release: -This list needs to be sorted, reduced and styled. -Interesting PRs found in Core: +- When an integration has a single device, clicking on the "1 device" link will + now navigate to that device directly and skip the addition page with a table + showing 1 item. This makes navigating those cases quicker, thanks [@balloob]! +- There is now a tiny menu on discovered devices and services, which allows + you to visit the device/service and find the documentation that belongs to + this discovered item. -- Enable local fulfillment google assistant ([@LoekSangers] - [#63218]) ([google_assistant docs]) -- Add unique_id to the statistics component ([@ThomDietrich] - [#59205]) ([statistics docs]) -- Add Venstar runtimes and battery sensors ([@garbled1] - [#60414]) ([venstar docs]) -- Update Apple TV integration to support tvOS 15 ([@postlund] - [#58665]) ([apple_tv docs]) -- Add support for app launching in Apple TV ([@postlund] - [#61732]) ([apple_tv docs]) -- Add Yamaha MusicCast Select Entities ([@micha91] - [#60645]) ([yamaha_musiccast docs]) -- Add local access for Adax ([@Danielhiversen] - [#60019]) ([adax docs]) -- Add sensors to Mill local heaters ([@Danielhiversen] - [#61247]) ([mill docs]) -- Add media_player platform to Lookin ([@ANMalko] - [#61337]) ([lookin docs]) (new-platform) -- Add Tibber estimated hour consumption sensor ([@Danielhiversen] - [#62003]) ([tibber docs]) -- Add hardware version to the device registry ([@bdraco] - [#61650]) -- Add hardware version support to homekit controller ([@bdraco] - [#61743]) ([homekit_controller docs]) -- Add Tibber peak hour, monthly consumption and monthly cost sensors ([@Danielhiversen] - [#61853]) ([tibber docs]) -- Add battery entity for Maxcube devices ([@petslane] - [#58699]) ([maxcube docs]) -- Add xiaomi miio gateway hw version ([@starkillerOG] - [#62274]) ([xiaomi_miio docs]) -- Add hardware version to bond ([@bdraco] - [#62256]) ([bond docs]) -- Add reboot button to Magic Home/flux_led ([@bdraco] - [#62323]) ([flux_led docs]) -- Add switch to enable/disable music mode in Magic Home/flux_led ([@bdraco] - [#62320]) ([flux_led docs]) -- Support Plex resuming and playback offset ([@jjlawren] - [#61468]) ([plex docs]) -- Add zones support to flux_led ([@bdraco] - [#61072]) ([flux_led docs]) -- Add support for changing Magic Home socket power restore state ([@bdraco] - [#62301]) ([flux_led docs]) -- Add USB discover for Sonoff zigbee dongle plus ([@OpenMyDog] - [#62171]) ([zha docs]) -- Add set_music_mode service to flux_led for detailed music mode control ([@bdraco] - [#62429]) ([flux_led docs]) -- Add input_button support to HomeKit ([@frenck] - [#62590]) ([homekit docs]) -- Add input_button support to Alexa ([@frenck] - [#62592]) ([alexa docs]) -- Add input_button support to Google Assistant ([@frenck] - [#62593]) ([google_assistant docs]) -- Add connectsense to homekit_controller ([@ecoen66] - [#62675]) ([homekit_controller docs]) -- Add identify buttons to ZHA devices ([@dmulcahey] - [#61495]) ([zha docs]) -- Generic thermostat presets ([@brianegge] - [#56080]) ([generic_thermostat docs]) -- Add new buttons for Shelly Gas ([@bieniu] - [#63099]) ([shelly docs]) -- Add hardware version to Roku device info ([@ctalkington] - [#63249]) ([roku docs]) -- Add unique_id configuration variable to command_line integration ([@rautesamtr] - [#58596]) ([command_line docs]) -- Add mqtt entity attributes command templates ([@jbouwh] - [#61937]) ([mqtt docs]) -- Add support for Pet Feeder (cwwsq) in Tuya ([@vauriga] - [#61359]) ([tuya docs]) -- Add philips.light.hbulb support ([@syssi] - [#62417]) ([xiaomi_miio docs]) -- Add hardware revision support to homekit ([@bdraco] - [#63336]) ([homekit docs]) -- Add support for Sonos microphone binary_sensor ([@jjlawren] - [#63097]) ([sonos docs]) -- Prometheus to support input_number ([@yozik04] - [#58964]) ([prometheus docs]) -- Add Goodwe solar inverter integration ([@mletenay] - [#58503]) ([goodwe docs]) (new-integration) -- Add additional service to set advanced Hue scene options ([@marcelveldt] - [#63035]) ([hue docs]) -- Add support for curtain device class to google assistant ([@emontnemery] - [#63380]) ([google_assistant docs]) -- Updated the support of Tuya Circuit Breaker 'dlq' ([@slydiman] - [#63519]) ([tuya docs]) -- Add support for Levoit Core 300S air purifier to VeSync integration ([@RefineryX] - [#62488]) ([vesync docs]) -- Tuya Alarm Initial commit ([@leeyuentuen] - [#60080]) ([tuya docs]) (new-platform) (new-integration) -- Give scenes last activated state ([@frenck] - [#62673]) ([scene docs]) ([homeassistant docs]) -- Tibber cost statistics ([@Danielhiversen] - [#63626]) ([tibber docs]) -- Add is_number as a test for use in select, selectattr, reject, and re… ([@Petro31] - [#63732]) -- Add DSMR config options for EasyMeter/Q3D ([@Aeroid] - [#63669]) ([dsmr docs]) -- Expose WLED configuration URL of discovered device ([@frenck] - [#63983]) ([wled docs]) -- Add light platform to LOOKin ([@ANMalko] - [#64076]) ([lookin docs]) (new-platform) -- Add HomeConnect Refrigerator ([@BraveChicken1] - [#63850]) ([home_connect docs]) -- Set unique id for config entry in smhi ([@gjohansson-ST] - [#63547]) ([smhi docs]) -- Add electric vehicle sensors to Mazda integration ([@bdr99] - [#64099]) ([mazda docs]) -- Revamp github integration ([@ludeeus] - [#64190]) ([github docs]) (breaking-change) -- Add AQHI sensor for Environment Canada ([@gwww] - [#63644]) ([environment_canada docs]) -- Add HVAC modes of climate entities to Prometheus exporter ([@rnurgaliyev] - [#62144]) ([prometheus docs]) -- Extract fibaro switch energy attributes into sensors ([@rappenze] - [#63697]) ([fibaro docs]) (breaking-change) -- Initial Tuya support for FSD based fans ([@candreacchio] - [#64283]) ([tuya docs]) (new-integration) -- Add Volumio repeat support ([@m4rkireland] - [#64132]) -- Expose deCONZ configuration url from discovered entry ([@Kane610] - [#64519]) ([deconz docs]) -- Add Home Assistant Content user ([@balloob] - [#64337]) ([http docs]) ([websocket_api docs]) ([auth docs]) ([cast docs]) ([media_source docs]) (breaking-change) -- Allow Sonos to browse and play local media via media browser ([@balloob] - [#64603]) -- Add support for Soma Tilt devices ([@sebfortier2288] - [#49734]) ([soma docs]) -- Add siren platform to devolo Home Control ([@Shutgun] - [#53400]) ([devolo_home_control docs]) -- Add dishwasher program to Home Connect Integration ([@jan-loeffler] - [#61237]) ([home_connect docs]) -- Add local media browser to VLC ([@balloob] - [#64655]) ([media_source docs]) ([vlc_telnet docs]) -- Fix webostv media player ([@thecode] - [#64690]) ([webostv docs]) -- Add tests for LCN switch platform ([@alengwenus] - [#52590]) ([lcn docs]) -- Refactor Tuya DPCode and data type handling ([@frenck] - [#64707]) ([tuya docs]) -- Add warning when calling deprecated bond services ([@bdraco] - [#64744]) ([bond docs]) -- Allow toggles (switches) state to be None ([@frenck] - [#64621]) (breaking-change) -- Add command template for MQTT button ([@jbouwh] - [#63838]) ([mqtt docs]) -- Add service send command in Tuya Vacuum ([@dougiteixeira] - [#63417]) ([tuya docs]) -- Expose entity device temperature from cluster in ZHA ([@rforro] - [#64189]) ([zha docs]) -- Enable Low Latency HLS (LL-HLS) by default to lower stream latency ([@allenporter] - [#64643]) ([stream docs]) -- Add option to select quality of camera snapshots taken from Synology DSM connected cameras ([@mib1185] - [#58306]) ([synology_dsm docs]) -- Add support for preset modes to bond fans ([@bdraco] - [#64786]) ([bond docs]) -- Start depreciation of custom services in Advantage Air ([@Bre77] - [#58777]) ([advantage_air docs]) (breaking-change) -- ESPHome prevent connecting to different hosts when IP reassigned ([@OttoWinter] - [#64559]) ([esphome docs]) -- Update method names reflecting changes in UniFi library ([@Kane610] - [#64817]) ([unifi docs]) -- Make sensor name consistent with other homekit_controller entity names ([@Jc2k] - [#64821]) ([homekit_controller docs]) -- Remove source and channel attributes from local version ([@ludeeus] - [#64827]) ([version docs]) (breaking-change) -- Add more vicare binary sensors and clean up constants ([@oischinger] - [#64780]) ([vicare docs]) -- Add missing voices to Amazon Polly ([@aomann] - [#64708]) -- Add Home Connect CookProcessor (Bosch Cookit) ([@noxhirsch] - [#62445]) ([home_connect docs]) -- Add a reboot button for ONVIF devices ([@esev] - [#61522]) ([onvif docs]) -- Allow roku to browse and play local media ([@ctalkington] - [#64799]) ([roku docs]) -- Add additional energy sensors to Eve Energy ([@Jc2k] - [#64826]) ([homekit_controller docs]) -- Refactor Tuya Fans ([@frenck] - [#64765]) ([tuya docs]) -- Allow browsing the Spotify media player in Sonos ([@balloob] - [#64921]) ([sonos docs]) ([spotify docs]) -- Use local Sonos API for Plex music playback ([@jjlawren] - [#63357]) ([sonos docs]) ([cast docs]) ([plex docs]) -- Add unique_id to modbus entities ([@Tathar] - [#64634]) ([modbus docs]) +

+ Screenshot showing the new menu on a discovered item + -From things from the frontend that might be of interest: +- When viewing backups, it will now display the size of each backup in the + table. Thanks, [@ludeeus]! +- Thanks to [@bramkragten], you can now select the period in the options of + the statistics card. +- The Apple TV integration has been updated to support tvOS 15 and can now + launch apps too! Thanks, [@postlund]! +- Thanks to [@bdraco], a device can now also display its hardware version in + Home Assistant. The HomeKit, Xiaomi Miio, Bond, Roku, and WLED integrations + have already adopted this. +- The Google Assistant integration can now be set up to use local + fulfillment, thanks to [@LoekSangers]! Please note that this only applies to + manual setups. This is already handled automatically when using the Home + Assistant Cloud. +- ZHA devices now have identify buttons, so you know which light you are + dealing with, thanks [@dmulcahey]! (Tip: also nice for visual notifications) +- We now enable Low Latency HLS (LL-HLS) by default to lower stream latency, + thanks [@allenporter]! +- Magic Home (also known as FluxLED) had lots of improvements of love from [@bdraco]! +- [@Danielhiversen] added support for local access to Adax and Mill heaters. Nice! +- Tuya now supports Pet Feeders (thanks [@vauriga]), Circuit Breakers (thanks [@slydiman]), + and Alarms (thanks [@leeyuentuen]). Additionally, support for Fans had been improved. +- The generic thermostat integration now supports presets, thanks [@brianegge]! +- Home Connect added support for refrigerators and cook processors, + thanks [@BraveChicken1] and [@noxhirsch] +- [@Shutgun] added support for sirens to devolo Home Control. +- Tibber added sensors for estimated hourly and monthly consumption, costs, and + more! Thanks, [@Danielhiversen]! +- We now have a `slugify` template filter, thanks to [@ZephireNZ]! +- [@Petro31] make `is_number` available as tests in templates. +- Volumio has now repeat, repeat, repeat, ... support. Thanks, [@m4rkireland]! +- [@marcelveldt] added a service to the Hue integration for setting more + advanced scene options. Thanks! +- Sonos now has a binary sensor that can tell you if the microphone is on or off. + Helpful for a notification in case it shouldn't be on or off. Thanks, [@jjlawren]! +- [@sebfortier2288] add support for tilt devices to Soma. Nice! +- Google Assistant now supports the curtain device classes, thanks [@emontnemery]! +- If you are using Synology DSM connected cameras, you can now select the + quality of the snapshots taken. Thanks, [@mib1185]! +- A whole bunch of entities have been added to configure Yamaha MusicCast, + really nice [@micha91]! +- Environment Canada now has an AQHI sensor. Thanks, [@gwww]! -* Allow downloading diagnostics of a config entry (#11345) @balloob -* Reflect media browser panel state in URL (#11317) @balloob -* Ensure disabled device entity names are shown (#11334) @spacegaier -* Allow pressing enter to pick item at the top of the list (#11139) @balloob -* Add period option to statistics card (#10982) @bramkragten -* Add overflow menu to discovered integration item (#11165) @frenck -* use motion-sensor/-off (#11142) @Mariusthvdb -* Single device links to device page (#11387) @balloob -* Add Search Icon to Config Dashboard (#11375) @zsarnett -* Add backup size to backup table (#11365) @ludeeus -* Allow downloading device diagnostics (#11370) @balloob -* Allow tab to show/hide password button for keyboard accessibility (#11416) @steverep +And honestly, this list is far from complete! There is so much this release. +Feel free to check and search the "All Changes" section to find more! This release adds support for long-term statistics to the following integrations: diff --git a/source/images/blog/2022-02/configuration-search.png b/source/images/blog/2022-02/configuration-search.png new file mode 100644 index 0000000000000000000000000000000000000000..cc9f943b98e47d1c87642b43b8d64ac85229ecb8 GIT binary patch literal 16163 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 literal 0 HcmV?d00001 diff --git a/source/images/blog/2022-02/discovered-menu.png b/source/images/blog/2022-02/discovered-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..8a923853e1826c290413bab5805a95816ef2d7b3 GIT binary patch literal 61244 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

    9tNF5L1h7}Jg?~=Q1v%m zKnhTyH-4zHgGMP4<}p9B2JFzuOr(U-;I_tH!;d?kGd~ErME%GGv$mb|n696YHQ~WT z)*ARO!k>`YF4l#C%%MOhuqYOcrcWt*VQXmk5rC{}LK^>Z9hzG@?zp$n2Jkr;b^H_G z|ITp}nrw_sqU~{iIPLem*oBm9*0$w=2UTwNcd3|(E}}E^XUjFaXBKKrm-a9ArULe* zQ0!-Sj~vGZ`x#tGvgDNi+U|gkPvQBd8{fk}mZ{rx2D4dWvcr5epWLAGivb#__&!JY zN{Ut(Li5+4Xwr85-r&9&rTqa_BUC6YyCt!4mV>=j(I4*UWVwE?+mmU|4I}iE?+#@pCniGh zAE7HI0JlYg@d*kP*@F_DEQDmF--;r|b~J;bY1Ja+H*1$d=sWR>A4Fho3ZFKkg=i|F zF+EXk4JVY-KO;aS&R+W^Mf3i?@yh+sT^bFlseY*44|FNA1{e<~Enru8#0aiEVF;YS zSo`C#=$IL&r+yEb(`M_Do-sS|upfhNet9PP{e@4cYbAFs|J-_|_UZGbf`HlVB-EK1 zLAf0IJb^g_8$B&}Rt(KZh{IYB^dr9WiU|e!Jl*cNP=?)9V;Isl?<3>Tq{tcAQ)M8` zV6A$c%cD!QeXGUjBe14qmwYOSO9Hpn$!~ldapxJNs!JjKxdm}MZogg*2yleOznST4 z>d_1Qx5Z-R80bl?{P(cck!R^7GiN%#E?q znRrq867k8eGW@M~pxZ~DZ=s+Hbs~ScAg~cinR2No!~@-Gsr7$qJ!)apr;FU!`5J;f zYFXKg;9Ra&roKMnOtpx|L`mh+9~W>#ym0|F%O9UWZ8pP6%+r!uEOdxeqr7%y2L3<< ziG+b1d>A1kjv3J3skks8EH>Ik?_%p%&wtmaE~DhRbV70p9b7bXnkiN5+vfNK zw}&DYlEUWPcG$4g#1ew~xd*xkj^OFg5KBLd&=cXeUEZV<&^R|55}Qh>01%%X7LvZsf0#cviz9rs624piv2 zdq9Ihr0tm}RF)X5Aw0xRlgb)utHfdcdJ9>5_1nayu=gA~Tj7kAbR$~*WSvkvTyAzW z7wQ$!=}gTAn!G;rx>*ki!)b9de5wa0&`3Uze;s15b08N5c!w221CMiNC5*jk2=oNt z;8g*P(N&H3>%t*G(2IlnOBE^@nobM<+6dM8dH5>m)=xV$kb;5@G|V94wh))Jg!b{` z@3F=IOqcY&R)<2Ah$Dc3K^lCx+|0@U%R%*1ruWrCxh^zjwp#z#hd>DLaMF#4Gr0`4 z=_V9)^L6OX3M05-{KI{^*V&-XZ(9uhgYVG%fqGTj*$^JH*7xlgG4z);_^FtQs>5fJ zS}3q5e|8~!ABUz5n;-b=B-KC(govCwOZT=o1g(_v>$N;WT{<#&Xh09Z{OEjhvaUaq zU)}>X<~X%}^QpoWf`GF#2gSdE#$Qj4M})Sp=_$nQXqGM(PU#*@0PA>#E^yK%c)g5M zO~U6ug(al5$2Jj7C5f^cs%GE~B6X)Sc5A}SbsJ&tpHPig3*33SKkjEx0?q|z!}AEF-Dr%zf(Kzvv$4G>Wx13 zEMQroCLy!TmXey1LO@6ec_aFr`XL~8Zf=eS)v>*)iGY;!_Y-oy06%}gS4T(3nNZO* z#L=Te1bpVe_xq>im6Zl)c_hrgso)$vJ&8xkD=PR*zN+D6G4NU`vbnpt6*mkW956*X zF~7>P`znHBqZ#WQzakE5F6?}uclRE}FP+SDz!i+?$lg3XwZF8rdXi!5DCjS@c%ql_)Ug!DWm zatcg%o6i8_?ClKz9vvN_IC9@TJ+XY5DUSKXt#yC__&m(8?dzsK6LGe+m0!ENTUDG% zlGN7T&Mg?%q0x%mclfD`p;#4pBRy_~%kFIGPMqMu{C{Zrge9Y*@%%Ihl&m*!sps?k~xUT>=dm4|oPv zR#sG0R2`WaC%f0e4gx@6IE?jh0m-{}u96*DZ6IRN{@Yu3%~(le1#~nt+-}$(iHUD_ z2U5K}JRCkNWgmU?23&r=`wHF=@O{*}X(*`AtqKT$i@IEr1nX|z z?Fc${zQ(=qKwWmcJp9G{3=h0>7WRzu;Emj7fZfviAfg`Xtr#S25qay@F#6$;UwwAu>X3u|2GD6IDmG zg4w93HxmOfPR_j3_)ZU=8JU?4=a720>F9QnGA;#aEHbv`kIxga)gzy*ju9s;=rvir zu^D16?;+JY>j#I2djbm$RTuZLT{izoi_+qxk+6cIVMX17FCJJAWAX+f&#ZOr=zV%a zed3gEwB*6^!ZguJlZGDXS*c{v9 zl#P^Ey16_0EAm`&blswKG=Sy885ff=e8z_R&R0o|{EY3??)~xdQc(*AlhedQ;|6o9 zQ`Hny%oFV4xpd)Q!5M`hWKYbmaA6C}SN%$?1>!Y7iuY%|dN5>hWr7mstD344t$;U1 z+QGzE_eLzKtot)`F7@M}4u{C519MZ}{anF|OT>F;Cg`tJVb})NJc#&*DE{k_%v03= z`uu;L*tEy^U#qcTe*U)yJpZHc|D!tTKN|iwH}+`%>)8K)R-dB$SJK$8jxYB2X^ zU+YeLYQBTTV;4HE?EORS_U=S(^K_)B!GK(ZTa&MwObh#)@gMT*`!i0Am5Z#Ywrd!e zqD|=*RTy^#&@f$E6Ui?puj7#Z#__}9( zx>|}hr)vBoU6bY-EA<52C_h$DxkGCcV5dMHdj9dA!av_LTWUxReFuEu3&r#x2M}OPbIbTppMJA0 zL@HGTE&M{50lwBd$OuZ>{D~c$W&CdIgD`Z<{qM&&zQ9>nl~YtOGZXR-FKUvn($ zaTf9LC$)CZm`BxU7kelw&pnCDQx<*ob)w|wMd$txub0F&{KYKxPOnKn{spEEt0WFGUU<~gl4 z6JaX7hcktVgF?bF+AKS@W_3LXv)%GE``>IpAne;62yM&7wX{E3@FFr|Ay~;5j*Z5q zsFU3JII_~?tA5OKF+e8-dcXmCM&(y(Y&ke?+?}cR*|V`5AW`Zn~6#@ z0$lb^eJ?Z(?(sw9*BF~EJX>7pTlbaL9Ii6qESj`$I)Lzphv~!cPg$VB?)^4Jg5_2Z z3M|i0P4YDw2eG>XELPZgrHO0eU`T8*2XPU{Rz&`K;_@RR93mlmafttP`cB=c(~(V2 z(XV%2zv7RZ^5=f{JO%|S{hHiF{N!N3U!9JN0Z>ksUzoLjKeGvDoqn`yGpiROZEW-G z#8{POh0|Rx+|^9HBw|Y%tEPpH85s$#cBEX6?ZAgYw&Ij!!`>|KpzT=9Pi`?>WZ9B^ zTI5dVdz@o)3S_HvubIFSOKVZdcHFsWGr-@iYVy{RUfz|u+YcSw9Wbb707ZgRkozV` zy{jzn3#UnL@!Q5-1F=egkHeZk)c!JRNw{pU8c9?Th!-M}rb3GfV4u>ktHKXPr(_BG z1yMaJUsJZvqZC}fM=y;8GvSqO^zGj0gCOx2a<58QDT1)qo;+$Z2k}QS__9{%`G`8Rt<>8oVl4#r#AH28$09KsQX5OgWRSqzx$* z5EUE7jCNraG%cOH8WeDnJyx^m{oZ#(2*geL=f4ljNhASZqgMV2g`RnifK>ZT<}8Tb zc_Z+~)_&QyC|Hf@M5T>i zh(V5p{GQS3F~}o>&SNg7{r7I@!e{#uw^*1~aDMn&z1h~@8}bdyF7wXsv_I+bB7W>5 z8FK1Op5rO`J$^kvX=W6m2@#0@%Kt0eBK*W(vPq$N7ikB*IS(3Ro7A$nykRn>{sk{N zNya$DFpCGss)XcYq|Ze}!x<-a*kXTow?XbQsE)(U+Y~%v{l1UOHc5LZ$dPrKG101@ ztW1a7eth>ioJ)6s<1^RS(MK0vps1?zI{;u%Pn3cLz>XsK<#$CfZmUxfjDWVb6MROJ zO{WRyTP9p^g_thfJWf26Tmz>*-h!K!%z|=P*1M*U(wXq-218gp($qHv5O!@Y&Wn}P zme!96%m9Jm2hB zo{;fe_PJ7a(4vIA*#J_&GVCFIaX0;46HPFft}I)QYB5Cs7``v#0qe#Yvr1Jwf-o)~ zPV5TZ+hv;du#n0xkyU(A4!-ea4CP(8e|!e_X6)l4E2W^!H5?l1eaIKC_#*BkehAMUAxi+LPNzKc#A-q)zmR}iVpNCz zy+B(p1Gk^ClTo#o8l4KQ@%kq8uz+X1@{e6Nt-(ZbTdCkbMWmai@aaL_>SteLxZkfeU@t1#- z<@j&6K`5Acynj5S2`7rlo#Rp8ndL{961hIzZjh+XzIz3T^%EbJm2G5n5pjLO+f7XF z+8`OQ&+WmM1kGxNRmUW-DxJYJ(+ig+GDw2_^ad2Y6KcPLMf63bz9HvO9%20;gHL@n zu}80K3=0L*X`Ozf|F#-SuKb0010HW@{=GroVmzd}<{#pu@D0B600~75;Zir{HaSO& z)<3Q9BH5igcu2^EwQ=@@EADS?5ZL2Bskl#rC}5*4Lq zkVaA%y1PT^lnzPh2I+?1#n=1uTVMWR&06=Kv(Jv_>~rqf&oPWgvn0j`ZOsrzv>F+d z{Hf+(a&QwCPA5Xn7`tUXk+v?O`BLU510#+xy_4$mmTHX7fR!(l)4ww;mf{lZI}Y9$ zIikS-)ZjYS7D3D4x74`@JY&tBq>;M*^)mTW;rMC~1_; znLey2UwQ|WP%?nZ8Bi<-+XdB_OLQMZe)HnS#HQD1W@t`wN~R<>&&b-;mF@G1Wr>=m zL&TzR_f}E9vv4c2urhRUW$e$yCx625=GcB;$wqWZ>_V*Zwziy58?72)9m-T=F8+? zqT&nlBw{@2yN?>6Ulr1IG{Vncvfj?8$cikPyH`jtYol4y%Jx2|WfcaDEt3aR0xBm>n09v>V8H_ALr#AA zbGw?g#M+V|b%pY@=3cp^aLguIx?z)qGhx#Xx>#yiz3JUfsVwLo+>^YDY`)5cokC|O za+4>nZR3)0UqUH?Lj2VBpv3nPM4(>qh&N>mvy2vNYbYfW?9=5nm5_O{U{4rauCwTu zV%oa62TgX@AAh-wcZZbirR|JBV2;C{U&+9_yXWbVlVs^u(t%kjnlK--i@f&lmXC5@ z32G<(!xUJD?8}X0l}}jwzyworCHqU>Xuf2DqX(v3`4KNe%c$f1oNhXp%k9y6XswiH z4vhkA=GxhcMzF1>vt;I}w+>v$xq-c+dPUM&4JHHAmNqxNAqc8jVcYp--6vY}2C7Kz zD-*GZ0ep40J8-w*tjfciVy)G|CoXv{JXQpp@E8s4)*?nCXSb9HIo7d`P?%l#xi~i( zx50|=hCulo@A+RRO~!LyR);plE`qyKI))EplmqpV3Wa8>895{%t`oWUFN<|T@qWrM zs}L0b5|bxh z%-taIy_AT|tm25#->7k7;b($r5&{y3Nbqv4ad-*AY7mDIb45V;YgiDw;;&g`$^sK4 zx31Bj4}Dh(UGS!HqS>yK;|C2`|N68sw#lwgQw`iK_e1JX(|@H&Oygb5y?9X!w`pF| zuPU>1cD=ny?TNa2ch&nA*!@Mwoqpq$MU0OMjuI&&;ZSWJVnvo9vXD&%rb5LiymM}h zRV>eifmx>yIil?+Z^uxec%K=HGN~Y?^~si`Ny~3(Q#PwW@XN)Bnz8Nl0O6~o8w>ao z;U}zZ2W3(61c5i2p3h#*1>@#pTI59=-A&_6arjbtE62oSZ1SQ+j!Y4ARrjX>c^@gr z94}(;t#I=%Oe`BpwP#iS$jkt_Z^CdA8F#Elf1mosyoM|9%&oQI|$UX?E6n6Skdy?XlY^Q%m2aMGdQ0wEWi~!`HwS{1wJ|fT3_r0x z=yRz{=vz|f$Oir)kgc?&>r1@|hdmv8l`-_6j~J0)RxXEFU9QjAV?jLG(<0&8I}z@0 z2Bw9-2TTi4q8RKd%!&y&UTnOtK3hU5hch^}To zxutHxrojt|59%_O>F&dS$hTq*eq_+2H@p5~FpD78?Rxh3^VGg<3~vb%1qJL$7*lv5 z*`Z(cAzJP2WmM-yAvb@5=RS z&rO#C=vxGG@@z9VL$(7>P%aitBy><5Vk-Aj@FnwJg#by7Rjj#FZsU8OpX=^h_<5l} zm|r<8jhpl}+6gm1y8H3qPSa%fSerdRfAaOtg#bGnr)0HiFSoivA{$1(=Gf%eFly{z z3eByKH2js7f#KqwNfFzv2!fGd42)TNBzO?IPtNsGo#N$!tqNypR!1!It=?!XICi?N z+p+cbEJzaOA@lG~c;~Mkpc6j5OEY|^L}n7c!m1;)gI~Ttbyc)Bq4boy6Ie;03yw%e zt6Cb4N{tE>iTW=kaVb;MZqXf$McU6gdcLD^^K0PZZH#>}XPw08Aoh&~CR^mm_LKtp z;q_g5bLFrDrCj@FBhGKv25Qs)R_M^G0a8m_OXXy_mz5yWgLLLS_tlQ5iTDQkMc)?F z3v|)Ds~mZ)Ja7g9>IX|H&{JMA3ssmm_=RUfY>7S-GDwu#P_?{>c0rdTLFGv1=a9X? z5mXJ96g3=*^4|*?jB4Gs)mP#DOFG@>1BDo5$GVQYnlKeS^snhzPfjoj^T4!jbSQ%% zg5;l7WAe;j$BEWGw{-Noj%Y~bi&IZssH?18Nru)4sVh?@7+1Y7=v$+NJcxsa4!rY1 zLg}aonHP&WF=2t}=umYOZ{yDEya`|K_4fjQM|=jv`0((Mi$L(EM&)myA`__n(Pg_k zOCl3>^lOiu@w5H||4)KPhM;a{SqY^!phC-*T{ubJ--khSfq5rS;rzV0{P-E{pme!R z^7UxMXJu^R|5~m1%j^hS)-=;z*6|!&PtK8ChL@(YDKGB*mGRW!M*|L@r(yz?(zN6B z+sssN?G1`2Y$t0b0_Jf;1@CSd7aqiCLPOcU_$(pI>h>nG#=cNKztrK;0!2W;;47tL z=cdCiNO8BS=b%BTh)j;Kn7-4|VNWYD!^~%8N;-gvkN$H~2i5GXwzw0~ps2$~~caa_3v8D%kf1xUR%M`mi0Sn|$)J?^Dyt;#v- z%7BKUga=oZF8`oVgME@5{hzvVpNy-O*&B#Z^Q?u1i+io)>S*RTZNh7i&VOabxh`IV zx1<0L!EWFzh?4CyPj}r}ZCJ^pH%o`$a7*sm19-N2FNWhBg*+Ydvd6k)iHn;-Fn-Zh zTvL>4+3~roAQuYCcZ3zwE8CVx?w!$J4BoLK9pT5+QEtGj*H?cnHUAJGW= z*dxoq9bN1jp%{u-^#D0BjC~FGX8i&W6s`Q|gR&}&nChtlLhu8mrg_9?(wRr^cDEp> zyRh%c%xSTC)5uK0_BXmrgn<9J+QpUaQ>!uIKo?mfA$-83k}!8dQHVyHahhgG(~W*R z>L@d=2d&X{M_7xeOOr!EotH^dc{dRvZFBjT6Tzjsw)!zC8UC%iM>iLBB4kyJRuotl zE zC`9X)J*Go%1i|?}5fLGGf|c`32^!U+{Y>7-Kg#5_*BJt_!smrmS<779bVr458VYY3spqh=ILarq+Y zSfpJzS*ktnZH{ODj#AZA#-7>xj6_au#N498wN-Yq>e2QuYs%qvTBF~{bD)8T5svax z7y7^9@)~8nT&3l#xk*?ME3LlUm8W*?3lis@T zD7Z?aq2l`<-!E&lP*9@y)dcVb)5j0v0yMY}YRYHPP)MsF932G*2Fy=1$r%n(d8jS0 z`zee{p=mGSw_#>)b?XT^fhI2$0umr1GBQ0hWI7{6n>viXSQg@Y_$cD^%9_fbe=)h= z%-G7U-(E-*KSp`QZl>WYL7K2>mF2|^qj zbn%GIN3+fUS_OunTWMj9@0YtuoNTHcxhzGKI*Vik48tZMFSY5X-hI}#!g^Ow21D_p zv`O*T^*w0X7`+H(;PuV@Dn^sgpIuQ8Rl@W7e1pf?h1XoJo0E=6;t5wAr!sQfJbbw&3)uCCW3l=&vLlj7#p&2+(M z2k9JrZ|pV-{3uhBRwz-j%4e*V9VZs{nj!B!It>@OpMCi>^6_SE3L1f`?0uW1Kg%7b z&gU4bGMNEQtCE|rjNr4`-3!~sUw;+FnwWfkyqKaQa=UUJU3 z`4vg|OR=^ClZk<2CFHo)IXmr~FDeBT1}C?fiBTPP0j zhsNB_TyaTP#@&PIE;7%(o5O08bIzy#>A8d`jxBkg{yn;{=g)E3(I2KaV`+_z*UkIy z_xBM(taXwhG*9Ii(Vq7IZn{rx*?A`Ez|lXtYvKK#As0(BFD)szA=fv{cG0oPVha!6?ng9d>z;8_tvejw4}g^ru9IDjV_Oi|XMv<)PyflXObK zPrQW(Lxd;IC-8w6{OpcAg)_T8eAm$RgW{Zi)jc9U4#>pBHo+OHp*ndGc?2BGWRQDm zUBLjaiPUC~_m~}}gL(_|hdbnbgJyGew>`voR_|`;_wwjWd?r`=5G&RoL7IPA<&f(Y z#Vv)%G0T}~BD?YGxxasbb)%XIUjxP3^Z7i^60uG65L6r)oL*!xY!n}53-g0@k$;6| zbEh+8VOZY+Ka2t-#TaUs;R5#E*D*k7td98J;s0^V5Bx_EMMYBJcd zf_@w9cX(8qd+v@*Bb1!C1}S#W4AC`=yhHDgH5dLE3LBw;=fQ*q}arIFq~l|&?AU0sE|1d;3T?x`Hy|T7A#G;5GR4(3ikYOOI{Mfo(oj~U!jkB}agU4Y7A{;&+ZmuSU z$ESKh?6kYbzF;*!u`j8Ns-B;=FrmEmH&BH6(wmz@w|6$sML#6=VnAdmc1Eahdpp1= zqxj;kQsylc$9EE^T^zL|UM2xsmGw84e1&f_;Um_|#c|dU2|Ml6zn;Daj}5!p(X$6E z>nM`N2>BFXMy68GB=-WdMzt@y=pke{iUyI!;(^diD&D{Usek|kH;7C1+$fw9LUaW` zX(}bDsUX3JXQbyj4;Hk{1a#>eRr)xZu#mYSIevJUk2Mn*q_`A4!Sz5UI*hCA{cE#P z|L%>5HhPiXV{t(={t<)R8S8;K&jn{{cqDGTPrQCum+K2MxXc)DVPGNqUZszfqm50m zH#CUj&vOk#_J=*0+a{k^^K)}^)6;)ZJ0hOs1m%i|X)6joBZx$ig`tSil2@*!)~**! zxi`SOa)X+qK8JSw?Y&b%mUniS=GbYwUbdC;{bd(fs~@=ZtDd*!pjj@enarhBK)nuI z(H0kLq*4LSMERp|AwT9X**K`4QN7(M{}S5WF9bsUia-hJ8vRwsLzFw>^%k~)qDQCJwF5SShq^J7OjQ5rxCYS$AN|!o7H1~}N*nXif~`5`hHK={Wgrg?3fJ5q z8UfGRN=X6$g{yl*%85qcW_OHqpq-B)wUptgjhYi~NDFQl!P_LD8 zDjE={%0FKl@Dk!w)+*U^A%#!5#oh~Przi+Tc7;rVcqcfz{1 z3dX+4C~X2J(bb>ztZ4P$t~mCE5yF?!=Wnt+2Dit+*?|NZpm6Vz0N(jL*pI+@(sCmE z6I-ovio&F^`_5g2d3?e4AtX-z62(jgU87wiaC{soQrO;dn3n;HLP!W2GXhSI!UG>t z(JFN&gZudYjSFqt4w|)o=MOmHX)e~%6i6(Yld6OQtX(K?4&^J+=AE}59dSd_$H@It zOb$aHEC#WzJy~a2T~1}^B2cXN7-*A*T%$AfUQsheW~EqU4VrtjWfIkXWId6x7&IaAt*a&{iuMamEf*=Wo7!Irwg1Xb6DJ z|NKBxa-!uB=!bl&C>mk^^q-vl2DA56o)qv%9G_+dgJP)_TB>BjDI`%tTZmn_=r{1P zG%OjBF;Tz=0*>>^c6*_1J-GD(q9Nrca+lKjCb(P%&)r)kMa zTxSEQ3k|o}$m5W$)a(eR+8GA&;$};rj6wn`Cg41<0FViHPwBz~*<5 zS^;L3qK0spz5c5Njn1v{B`b3CQ!<$gZ3F~#%JK!VHe4jl3?d;WwzRVPA2gB4!>${U zB7Pxm@6Z9@`(T~Y?{M!vurxDnC)j^4tdXb^j8q$vE6E&b-s~4DaI4}JoN*hsny!N( z;(z=m0m;E=(zdKkJjXxS&#`o;8QA?#A1G$zaGu}W=|h4MT|13^LvW(_DVGeUtl^Ku zxS3o}QnHbH#RY?W5?lN{JSz`4HlQkK`!|WV5MxYDGR^G~VCWD7h{OF>M7woUdEv>C z6m9)$i1BnU<=J#3@Ms#JAm~(d;^gE%B;geX&a$8j$09t~yPVU9Q2)iv4BNLs?R%#g zQ^>-o#(P)pbVP`ZXE3BDKyWf^&28LQ!{P zj}q&czz6~e<+#6Blj(mryggsMM&X!=yuN)td~wC`Jp-D&=zpd;VFVH7SKZbt2Ht#jo6!_as$NoAe0|E@)%mAkQOf`ez_>1JT{_1g3phytp&W(cGCwIRso zP-=@6Oux?U#7Lw%ERvt+*c|R2Z?+}|u#5!iw z!#1|^3{1Jd8)O_%i9?jvJknjr;3~KYGBMYgYVA!nkfZOet6SF4ew#73N3yWS*NFX0 zAPq~LGUxtI5j*RKtt7DR-0k^`O(J6&cYzj;*^@&PFVSC){L_40^4K=-BT4n0Xl4e2_3cYA26Gx9Los^m6pRhz?Q zM$0+avygnf!yM#U;O84|<1`bh_6(peZjYW*H?VvY(TQXM#h}8jmrJRk^)Dp(=9_}{$#en zHor49flS)+62K`(r-`@tg@ktgg|fLk3hLhq zUAd_P4`R4VWUO+wB7|z)BH-|~U<2yrdnVFOiJ=cdS))ga-SKb93Zh|xACzU~d9X7vv)8PgdD!sl z=$IgTVz(vcc5o#G-gWR9P{zk;rzj6{!YuH^a2sV-&h{4)3abs~rB>iZYdSeiZY38A zBY9Z-s6fo4Wg+(-EG!HAj)Oc5m)e`8VjA&s^}HOkaTGa_mI4Puq7gsjWMQ-L|JqBI zHm`0u|1G~q3?1?Eb-cW-SFb7KB)6+h3YAelV*;7iMdbwGpRjC6{!P6U^R-$c?yf&u zYRz_0o^Sq$S5&(u-&Jhg;Hq4V(A= zPP5O?{xTsUbiI9151lnTEbAEO4b+%yAJVkl?cF!y9_U&m3Q(g4c(Ynh% zf>QEuS>z&Bdwlp6%>DF8Oh}iU9j9<*xih?#y8_^AlZ(sBq8D@lsMxBGcS>8^`r6vt zvvtro?|~n855xlA$Lpfs5qf%hjxCq#A5hUR64WvfmS-}%m4e*Z?PY@8ikxv>UAcS7 zB~@ONx)v1y!wW&F38(H|y>~7)S*?6*FX7mQD}fkz3qCvSJrkU*H<>P^#v`7K{=w}n z7t2^p%+E*x4w2yLk8EO~1EC%!^eIRQqxLZa6)v~BI- zXyI-_8f5Ce3xCB1$5EMq8ajNlBeTI?oKkg_Hn}gA2e&^h{3_!@l>)Hf>q<#|o}O#* zZ;Xr_T51nAx!hh`U48WU@sd{m`B1u;%22iQiVUlIH;>h?i>s?PF9x94-SR|68x~|r zs@-jj(LQSJHCnT;-als>E^9vizP)89DGNW>Le0iP7X&aAs=U`yQ=>gac@zn3EMHYw zpcd(aCQRKSNNB}>`Z?nujh7M0Iy{Q0kI%PJ1)de}r$NC8RoNT5g z{q_UO)cAi44k}%R|AAdmYr_nWTMH0%uSdlsg7Nn-Rxq}z)nV@cH};zZ(+j*?++h~@ zDZ9NLhsZZ`RGSq2--#~MPTMstwQ}J0ZOpGWPg^AtNKyi`zBe=^Jz^6RGieb6I5K_) zVldIu%RYO_$_kVWE3{n#<$Z8cF0;LvYDT&fposFP3{b%(BNW4=(v@3MQgY%36p`kl zSDiR_o?_$RxO;lS*7u-`et~_G7NZ4uUF0~yHwB-*tp8&&Ov~OFR;!+9AhH2^Q zGPCHGy+I|CTozutcB0)KN)s{I?rZWsUQiWRQ}TX(1Q0$}MRJr@nVXv*%Xo@6-<_}z z_x5h#kh!%1RD}m}AS4pGsQUM?n;MJg5iKokRX(=D`r6uvhWLlIt6PAmN#5vZ>fTi8 zBE_>eF`*061Chmdb+hmF4?%}2 zK0tmI*fNXcw;q=DTLfHDe9DTt^Vwt=?I{!d6dOx8N*|M@B(-Es-G-C~u~8)wgDim-SNK& z{-3nj8%b9B;^bUi=36%Hd$3bB_~he4a9Y9*Jr9pYiR>4XD zDN!6yLM~1I6AM}@h)XR>i4kx*p(CLkH!8i&EDtGP`Sa)dJBgUs*w369ZK^knIoa82 z1F8%Dxm8t!$;{DGs%l1{Ll(ZMiy007e9Yr8W2w8lyDB81%ciG^Cam8VTnGlP>?&NT ztl2m(odT7%)Ma})N}t3Jc=r=9#!4Xuamb=uoZi@e_jUPhXZGDr;=96)#Kttu25Hfo zjm_s9d8)ZRuX00P$033YwT`h&-iBl_RXI4wG{MP=O5~KHBseedvh3RYG=i;kIgFl zwRYcSE#s=tQ*dS`djVBp1-X8fy6E*5DeiiLcAHzQ~OIm z9}osgc}ZtEjSbW}C2wzsd`%@i&4{+Pm2sD%2hIWaJK@fSdoFlm2rVrwMSlV)M@J9q zz>G3*59CcYi+?bz$BLzz)0RYg!hKMqf&Y=K+K<<66#e9# zTXWRxs&%j_Y0$)>w{P&B>DWjCRyMvtv=uv?%H#zfqnMZ1SsN|c$G}lEVRf{*81%Vl zG-Drg%JK3s3Z!Ie<{!9j8%6o*0_idEuZQAx<-UVLWNfc&-Ew-cw<0;lUW}>RR5@*I zPC}>jMdamMNk8DKj59e%OVkXehGqZN~d3F9bnJcdJ}7n&=OC$ zn)h7n97>$XN7gq-O+-B?Lk&H^?Z)&2MBA7-a)z8IgYAuOO)YE&tya^qmXNxZ(47;DWiCYhr3i|I#p!}ZaT;hEb^v^fj|G)v> ztt2B5r(vBqM!QRO-UB!7f~qvxRr{8jq-LLkMs+QLB;;HGL1WzgV0ya)l@1XzTy zU6?*BT3I;le*BXHEojYc10L>Y^p+Ne6!h=`f1!K}sDW8sOA_2mA>D(|fS_Bzbj;G! zB5;h&E+B8lSMUO!iCf^WpY~7>-TVAv_K=8U%;TDE)TI6vV;0Gfedu6r(EDwDi}-6- z$Ssa<$@b25<^u>=GfASkZjZA>lU2Rw)U#285g{lABnA~m2D)}Z+9MNBFwECmh}}E< zX{lvkdU8Av>d~PgJWn{}Xtg&6!1UCQQdfm%BT1UTM~6r#c~(-m<422(dxvHyGuX?>OheQg4WQTRYTDjhT6%4c2ZZc*X6CC3`J{{j z=~xFdKCru0w!gc3hrO0EPSg6s^+v?(UPcmGK8F#wH zof1h>BX=az$5PRgA}7EjN6f2#+g*fZMVY!k;^N|h6jKo#AEM6GTI;|@GzcGmRM)9- zn3p$^=tMRM0u}LE^`&To=NOHi2Ye%cfJl28?D{4JY+s^RDYN}-AJv4-%EXG&%c zq>q|Fs45Sf$o=*iU+dkKop6O8wb%=bCfUt6YDM>qo&qg|GH|QF_oQB6ouKNx_y60C z=%n+tKln&fx(Q#QlLFnirYn@F*jYkLe}!3|Qo6vl76`L*nHWv2Z&2kgP&4-xcui~k z?47#lb-&9-FRU{DyB(tA#@?pM#+tqC17sO>40mT}ZlqQ8A-#~;TcGLKlo;H`e3kdL zj~v*ZHH}_1udc4LH&KiP~xdo8* zL^MXO8XTP&HF}H){DHj%5;NJ8&i77EPSmO})5xTz{{!M{N(4BLM9PGc4ZzeWXhWa= zN>7v8XUfJ?nIfuYHMQkL+fj0i!h5!Q=t~VPVD!Ds<#T5n&yv%LXK$)ZtENu(s)fr} z4rEu{{p}XyjupUyJFApDhE3<&Q8J zyLbh9W!8cD)LH}ffl}x2&nxjNn#|u+{BkLA+&pIhu}4PWp%Fh<*e%+)!E$nR0IJACu9f4=aY-+9_wu$#I}HG z1AxsE{BcgPbL_$ePm^=#V5EY5KoO3zef_=e)lM12xX^J>U_^N0W^`KBtIbK85x%^4 z&l@EZG*Mnxm+1BuSgX!VsC~F^e?dt2If}}2 zT1eZFH6;71m7zwjb{rHPvGA}-F`8HP zP!BlHNZfUN2|tNngk=M<3la1B)`Qk*_tP%nj;=1K4)?;tkW!APuBkhcy1O$Lg5KOw z`N#MMojnA|(Xq|PFC07fW^1{=91U@T3jd$H63B+og4Qt|J66@HmGCNtGv3M%gRB;$+OUU(auK$6_x02ckbNDWsrrE9`1_ip)U{Rw6)2Gs z77L`46BI}v<_AA$OkcLn)m~;k@5-bySh<SXDwg2nSN2mzVUBH?78d1TE8^@ni)8$MH9LI2upmEnc zmtl*WQZc?f7nTll@FwkSft@_BYjB9`xM zuy2}8ucdES1bE*C6;@=^ciUq1FJKT4K(y9 zP=0|X#qtNS>K8-{K53B%1y^_V?ziy%8sAr-BwDC@v|w$%4cFaCd0&u*PfuoQBYa=S zdl+(QM~*y$jvJ3n70M&8eCs=atOOfb@3`mJA2`jJ7V^JrH7r?k9m*`Jyer zT5Al5rLY&>UrD743jWFf&>5zwRiyYf6gfvx9mgLgtW~te?P&Ox$F}&k4rIPj21)ZD zPjZ^R871``cKRzrV$TTAI{O9@-ssY{#LY|exW zA=%b&B;d#kvJ417ju9ZCytI{d~ANhMUE~0XX|%FzAuH3Ul;}UQV1zf`u~A{3;YCyX&UB<0%Re>lcO_t z9d-Kp2HWJN)WSM(by;pwZxFX^OK>9vN+zP;9tO*@3$g%Nek^?X$M!N@*Unz%T^aT9 zl`Q!EXBtN)Dq*;&wWUpp+C-wOV!+lyp#t)sV?As_Vw)QQ(t2lI^+_T)=(J9=p=KGp z%AXAsqjY+I&$wRsUQNbNZVaVCCwM0o-y3@FlrN>V)VJi{+ECmX7}N;$vNId6!?&og z5(Z>jHGLbFj78+k$I$)fPp?m>4xl3A<{Nr;zQ>ZcgY6r9*OtWf-YfH^vpjWm(@Xiv~N9LFG)VUrWUJ3AF?cmV#e$wi;;98I3!pY}d z#j%`*o|8<_?7Y-9h1}T`&-^D=hg=Ws$sy%mC@dxu)f?XPING(i>U?^c5Zs{X_lesh zz7#kI`Q%c}TOk(|HhBev4u-AJr<--A2U93;tx`*2R;E=fxc1`}e9nt`N%f4VX`3f- zMQqRmBaR?97ngsA*=C)ztqo<;vX|w~B~7?cYPHe9Vsm<0VhLvfR(Xr7^DJ5UD8F!m zLbA&BzQ9WJd|U%%^F(C#^y8BW&-Y&Urb+i#(mt0W?F!6r$%gxw=z@>i9_Q}DJ3R8a zFs6mUU+}8atlz#E#{)Jtly1)0v(_(~yE*jE$I)F&n^qRSP~G9FTv-^T$W4hv)y;D2 zYr(3*&5OM9Y|*5wcLB;-*Z0yhaPx(=O;WEPg|w~D4w917{9nWc zShZ5e^PH&O_)?A?c7SvVyjbt9@HS((F!F zVPkH5AlUOjtjRYx-7(klg0nICg$uV^Wap6^lISA>qf=pJmt>=BzIVsdKY#e5&aumA zVJRP1dPNRyjt({(4*4vD1}~}G9h zv(~rHGOZQ^E~xx;mqBDLgXEi}Ex&~q2Lo(F@Ul7*sn+o(tIu?x5s+$?$cT@$i_PCs zH@8`x8c18!bgCe@I9l0rAyH^1j%eHm!DYP{pn$@9yAevaC5m? zn3C%t&H50 z5(59g(ln@+A(ro(-FTl>-LQC#hO=_Rex7Rl{INjf!NvmaBxIeu@wr1RGaTJPQGc~- z{8Z?%ST&}DKR4vl95Y1wM7gn#g4{^H+g1Of9b8o@_C==m*WGi*1avsROj*I_M(yXe zz{Mw@(l!5u2dQ8|e*W#^{q5q=`?JcN9Kc9Y=|kgb0y{m3$ zXvojs0tnFlj^c5|ni96RwVfR--UDBnC{&IY@0aizi{=!gX91YlUo(GfkNo=18lbvz zcXFBrc>YZ8ucjU+JZl~ z(V1QjTU%RS1dH7)0k_mVfQ@J+pih(d_+?Co4%uTlCU(j~?lj{$=lGaqFNwLeO*iQY z{LRf==S(&T7K2vqWejuvb|4{)7HX_h{z&kJLq}cqJI0w?F~8i~6(PCRHu;jz((m|U zCU5Us%B}+<3eM2&yX$*x*w`r!7`h8>=``b9z(LGVv#eXfOBf#MLW?^E2=pb76 zFp#1*m6(X=VVwUwepoH&$&)7`sBM#D-vQ{0sNq~Aa>%`1ot>32?}5SYJ* z?;j~vsu(hnoGsr4CeHIoIE-VF03IUOz#pwm8K&RcsAvV;eN2*R{waxAenr(GE8AI} zxSq?ubA*ePb;q;yI`xw(jkuA~JV1X9+zmDcd~XrEzr^#O)X~ynujg)Y-M|HwY3cV8 zYO|9x8PYAoUUY@GHY6Xrs5f^b7njcHzh8u#+_d%dYyzJw>x3^TfF(Z5)Aq)YmB(}y zRaG4~faUT09s$S|gius0RKo@V%$N$hXv6yfI3VZ#ovBhL#*5q|L9;0Fh3w2sx{FVp z07Br;d8tQJa1qyy1a24`=w5s5?@bq$dqr+y83_M?lfIafmC$+$H8a$3udBbcaJ0V` zvY_Sjge4n+GYTr|qNMCg4?4rV!UFhfdsS94V!AYHkQ-!h4Yc<9~ z^or~8saikAcm14}G(rHH9-Xo$Df(WXjoJ{>Ne9DCOT5Z?GNYz9vi2 zrYtWndt2Xha!yg#aLMg`<%H}vq?|Clg}2_Uaq7zS2g$gIP*G8Rroc~|Sy+2nVrj`A-iHZSzn+F0O{l3D;t48{$< zsUKO0y6$f0c;}pux-45aVlc4~(B1p9hN@`GC%twa+QclLrmBq3GW6f_+%_|nnu{!FCR5i-MYvup`9LOl2^^>!FL{QW;YR zd?6ozd)o2yv!_p^aNy6ir|C2BOQb)#(PqZYxx9aW*By`Fwv57x^0OO@B%-?W2x;nU zGM%({aInEf4xpQxVe!LE7n1Jo?%v+sP92WmmveRHIa68tg0Q#^V#5A)FZKmdc6uRd zx+8`PI>cFN=0^v@Bd3%Kl%2)@iQ=iC=#W3(xut`j6Wisxfoyh%7un7n;aU7dB;6Z=7p7SE-Rz$Jt5hLHq8;b?9oiU-djP|^2uE!v| zouq>SHLZj~^YlEw58uIS4}jxjel=sy8j1*+)qLJJKX24UN2(6tJnrl$UcsC8WIBDe=t5kk~k7|uUgYkhQEN=g1AFDI7~ zBinqDpsFwm`sAVp)Z8!0W`GhYN!blmTwJ)lb-cX=MC!`QzA7%X22kHez~PUJfNS$w z8K#0RzkjDOY=XpuvW=l*;0{-ac!5R9^>VO5p`?N(GQe)B+rY11LF_*`*yoo&|L#l= zkdSB-`y%0lGgYOfsi~`{_j8k(?b%~YfL4%2Qr(Q+Blz>g*KvRDW8liPk99{!M{kZ) zaZ!S!NGVBEdwP0?;0UkbD1}dI1Z>%V{`>(}p)m$ORBjMx2Z>_-R}gRTk{pNNazI)QvJ|jGIhzj@D~Jtd)u%8xH0t3jTOP1NR^zltg?<_ zX*}sff~CbUm$%Nm0 zjRN<^5q|#U9yLEFMn{Jx7g@5Oc24an*h@rSjMa58g>c71s9R@!6xk${@FL<9e*zhu zm$Kz8FJ`?U1+H*|H{nmwJf8x-<(Zlj@=I*s5!x}dqLXYL3J3^Tyoh*Kn%}0bUy&q$ zi5mBgC=1idd=rz)&Cvb9w>J+CS}o=eKtdir6rU&hUHr|+``FIuMKX2uyx6Ewd%RTk zcXVMz1-F_Cm|G(YWMgLbX;4ETbLGgMI4!uQrskQ#)3qxIFK_Pwe?&MUBO`-8F@&{) zHPouPH^`lC6jaI9OcyIl(tXLVg-r{!?JC^SSqw?s zr3Q#cg=U8Jt=HnSa=z7>rpxASbLf*ZrG73bLI3}#`UF$tD>F$(}ZlpW@2jBO6=lm|#EEdi)v*Yf4@9W~VM&UIr z8pSJ!%yG^yE>ilu*AbkPB9R_tJa)cHb5esHg!Li--`Ei(#P zuE9muZh>|c&i7iXFvR`~{Wf0WPC<&_1;5^`jg6_o zo~GKQB4lal%#5~UT)0cALi;t^7<|^1$cY8zE0szg8EkY7**V@j3oz}wMtrQbCjlsU zF1~qd>x0RGbE!|dB|8Zj-@fAo?-N{QpGQ_ya0%{r3%(8Tv#5~EdY6}%x1#336xYH% zB$vs9QAvdVlF!V=AL@(iYqbmP9P3G6K3MMLP-F%D<`EXA1U1=CzFPgD_ZUJ@ z+rf`786Xh+^(&Bm;<|1EkJ^iS1vBgn-g zpJM6Qyu}Iia5*b#%A=9&b>&c13#q0^kHX2`tNK`-%p=6-tB1G=`$!p|B)eom4}|V8 z{*e*B-%?BVV_iCRk|nf{5{3i03j(;z6FpwXj0^8lYna1WDHW|(a6^Mc!9{^@z%u3% z;Vh-O8bvybV(AqO?G*_aA52Xj8;91NbHUnpKW9ED>|(i0t)>J{d#5)r3}2|y8ls4D zuh0Ydp~J4%-}=x|Q8C)kyxCp5o0~tUg2g-4=01ee|wXM=NZn@Y20Jk5hQEFH7b7N|54h~X|Nb&ik{uR5m ziiI4M3ed^PKEqD&l72o^%ryx_38`Q)HIf=+WJimwKr0I5yA(-heqDV}dI<8zxzp(< zN!TL%Pkr=~)DwXxKjA;sDJFc#5d9a5YgzO1NBSaIGPv_bBsr{cOVTy?;M>o}mg<{z z(=}BpufwisjjG~-H3TAr==p=S>Vi1@+nw|6fy9VMA)_+&twAaZDY`(CT>Unbyj&d% zg!~~LN^C1f#${Tm_=}{QknChBo|5Y*P)f?;F$M|Q!6qCIHz)PA6enjYD2&m!#9{CN zVm&NcvFULDQ`u(^L;NKb=vzcY7u}L{Okd?fjYIYmn7`w?I^|Cz-+HX3%#HfeQVt$j z!+Ls7O^g--bOvS4zYbOM-soV!Xl5}2DXV_6nBtZ9NJ29Jd?74SLY;i)<&LLlso_}F z9lj7%dcYZ8_W7&Yt1&CqUVsGZ@#%!OcL1ocT#&~a1I@845!Z?J{+qH zYHgId&qe^^%9Y3tJMc^B$jzPLApNCg*SpT8y$9?p8Xg)-w;P$@JVLMk}$VG zPMIS8*$<;}SlMxy^GamnqGCNMse9b%E4f~X(kgZBT}TWNhcc7p$*NGio-D$HL^!hD zE@ME9^i>{_=@0gq)F)Pcd%^Ybi$)>8`E4^|eSud#1Cs&UF=re*u$VArSv(m2^grfup2Ul+djlClk{fUu*&#K*Z&bZ#j z+cAVpUH*uF@6qJse+8HKKC|lZc!85Fq*uc``rD<=!6~JN zw_Rw~IX~o#Vcqg0;5|LZc065yYBb0?Phj?4d8RIfjpdZa5`O?RSUtPq^Tm6*xvi&C&cP z$LqdgTsiq^)9@4+wdg^eMEi}5?A13Sj?*lrJ(+3h=q2e|yC8ex)0zGk<+Yg`7=z!L zxUzmIOcVDIk_q*8s^kk82pFn}!Z=g#eg7Q%Zt+|B`3`D*G1Rqd$7JW|Y7WxscFeD+5q)cHiiEl@IVYfeRwAQ#A^$g+#{f4dkKG@zTku}GW=KksXG z+Pv!LJdHOHoU#l>{+ML4EH+$w+wf%mArR|Sa1GG%T6aH$6m``SKYoJy?m1f|cBl7h zTc6Iy?MS#z>Veg&rer6Rs&RB)+_j#J@pc@q|yU>*#F$7FddGdFiVrZL)DBt5i; z9q8w_A_Jj{aM%-|i0P#E<9Mv1;o}Cy$6e4LsyGU=7fnfI)$QM%?CKkax8_?^!u(Y5 z%7Z`V+jQt130$IY&$uOX9gA3!S#P<_@%qQ}O50Hsd}4z&P}a>op;wd1VUf+tvYa^) z@jCEw!U^egwlU4V3_MrZz0QhBGq&=ocq&}vy5$rA*d6^~a)*h$;=W+w-f3>jiDvVg ztut>#5vcSfMGTlr&y7oc{KwEVRWr&Jw2$%fQx}k;pDOs1FCMfSKB~bYLNhl}h0$M# z!X$cx;jFq3VG<1jSXE3q{?`A8UCk(jpoAI%Yw%KEH1Gj3e6 zQrB~&_#fI1W3_l+!9)&{zhg9*I-vtB*lDPZKf=-g892Lga*pp%x*jWMr-S6%by@%Pu}!P#>;0ch&Vni& zB7!eKLN9h^gO9D+s_pPW4ijv)#*{+`N8-y<$5uwY6?PLT^(n*0i~imxn#Kz`s9dyy zL=Tfouu!pqSgB?RBlQ{F_no<%}^)Y$Oy z$TEy5C2H?bK*Pb}1>}L>Z8yF!Z+&^O6;6yeYpdZfZB31Rif+8#>1;=S+F861hzv^O z`-uLH=qxpZ<^Buq>o7~Hd6DECJXl`-8TjCUj^W(t^Jt3~7pq)krcbxeGb>Kz#K4MB&@)9}VFMn8O`WN##h_a-Eo##fPmO+5JR<)ck86efF31A`PRn1rzrCnni- z!3KsHwG9U+C&8O1pnJUo5+B;3;hCBE6k}Q0p2J}z8Ob^MsxLw_8|g|xZG06)K}bMQ zMzGO^xleN%11tyNtohB64Z&sQKsSkyZbq--X#;%!Otv)wJJYVyaL2 za_zLhML$LxUcFuUUPIp4>53$WR|7G7HHVIpz@u5|TE3SpaP+0mi0$=Z4yB7`KOw2G zxrW!y8zJ__5K_w+R-jByw^7YOwQ)Y3!cl3_Q})Js$o#uVW&i3#@$EJ4b2+{PX)|vu zcpKM}Od*gn4GoWvM`=4y7<>gPP!GXRN`9*ZnU>_Ml>L?mGV*8xu;p@< z4}6|RV?%r$W2`O}L-Jb5yN8fL|4}VEFdoeR3K@cU70J{BM15pOzSPPuA!)K(xM}GU z53t|LRZ;i$^q^8KE{Z?lFtYRs0BRb?P97c}(bp*=H=By~Q0RW%=dWKk<)k_@fg~|C zFJ#t5p$p!aK;eh$RzW-o)2OP5613^@oK@1}of=c4jD6O4M|TakV<4$b=4#uhM*r%3 z#|YHsIplrGdGV~<9`I7q&OWc}f^RIv7C7Z}9dgMoKiil_?%lO5F!jK>+VTA|_}18f zz{l)!N6kiu3{XQ+SUkVc@){gsg3uGxVYvG>s-+DDg?%AZ*3gKt1wVPhiryf7>A{F5 zxfqTr4#-+b7ekR8hQ^N%j_MT}4CpC2tV>z|?(RVI@J2nHpXH zQ6rvD&^u<)3Q_tA+Iv|lBEBz~_`hLplcimJ_XspB^t=O^0#37Gf~4I(HBABd#^q9$ z0lJ!8$v3`V-soWH(y*_tuVc5N8PTzSnyHX^#A?Tpm6f%krmd~rS3n1$9SfS;yDxAO z6qfJ1%+@--XwcVL50iifeP)9AhL<_W%ggICKx)uQsN>;M`q2+1b#?Uvq@S zueg?CkB?!~MCxA&2nce9#Zd9(pPha-yfuWs0<**XA55+2mVDfhjEjm2SW#4!4rErt z!zX6?@7AK>_B8D^+^4hD;4^Y_veSfF&+Hfi&ADUc`tKj=BNK$ z3jWBb%i{;&b-cOBS9l-iyl<-|t;#JiC%6|Rm$f`D zIGJF<@cnCGm|3jLtcpPJ2%ii(Xrv;{Y$KV~_TZ&$A5xM-L#x%qpmCl%foKl zVSHN8yP8LNuCA`gg+(M`5Ox?gnP)2-Mj-k?sd4AC42(_hYV3y<@-Ut6&G{nclZ)oV|_axa#y(va{l`&p{MF6U#B|N+5X?oPl+$u1E}ol z3Jtxr=N^MU#Hj2OCm1;9tJYbnv>G#;uJ7f=(UG~q)Eb}v0a1MX=zWrwS)SqMul6i1VtyFqS9D=UN_(tJEA&HEfkc-LMH;zW@!`^WcN5T$}S;)6VB zNb%bEXiJAiMhFtV?28k?SYN)(+K~45U18#XS^Foqun=zc=sR7;G<(6w#s-t~U1Zw_ z`(b3(K|0FBeU|U`#7(`W9sTO%XLSmY#TSft@(>2|&(D!JL4k~9iQx(D@H-b+8z#G6 zJx2D+`${`IDF`@VNz1g84o*kq)g!b|KNIAgxy+jZ($A;-zbBN>t?bRM(!4VYtFu<5 zJR(lU>$G=$BNhHwm&v0*5TPibbX>}Oxjw3#PYS~#pdWLzlNU4ZJb%q@=T;{XGi$w_ zqgOND6~f(Rr?YxJz~Q)?U$DvS^~Ac5hmS{7SKpnH;ZuTW{Fk>ralM*y?kcvh%e7XM z%DquPR8XcpSQ6R;M+IR|SSd5aPh(iAvy^vVV18JXY|2vYlHltLrsVh0c z`vB#wjM|p{vqdSpnDpY{en%q9iY1Imm|W#qetp7((rH>#<)`W&*&O+T1I z@k#Cm?wMzHbKtv;p#H2>*-MVPg5<~TY-#DnW{b<;%eMF&{mdl`+jgY@hVNGP_$A(t zjGrd@CrSqe&5@Ny<^zV?%FyEOz1zyzioQ<}RFE8;Lgwr))X|6;F}*a$*9^a)oz<*X zUsXvtIMIm(a!>ho7a0L>*z`~rw~H^kR<-_;NZVTJPJ#(=PWLxP1p`GVFWQE1KAOz; zBgM0gzw6ZSWEB+^OFRHS%K^)n?P7-e0Y&@D-%=t(mO$6av^R@wh-XUer>;HY;Y+=^ zY-=^BDbU#>h$#~?wHs^dtQLeYJJP+m$|uL3y#~8{Vaj#0NjGfS+nwi{F-csBKnbZh2}`^b22j79n#ZK zH2J?B4ABJQP`(GqVjM*<2?!anU--`a;mN~Gt>FXUIwHnGJ1_WmP_&oiVYWdWU@?J$ zSxmai*`0ADc?~lHLk;cz=p9SQww8s5eRrx~Kzrv=WWNn_92!ePD%ab|^xDenPL4pu z%wM_>Az5+X`}r4tX^g+~;E@hOK$zevOODtZ&znXC)p}EfvJ3b*0#()E%ND#+nGZqV zxR32mlJwMs$vxB;D3UJQMzhB{b{)+W-94lx-p&Q1!C=zK>m8ruY}2KAaWJh}A3% zMLgZ?KsrOxGcqzV2vaZmZDrO@%TI}VrITI@4Qj>PzeukT+OsOF=`Y8c z|3FkbS9GPMJL)&`y#L#q&Q0V2Or`i474jiZ;jtA5bx65$id-E3386>PdB!H z@1TrR&0%`e;xdo#i^vr~2%iBk)|N%KHL(R1B5Ehi;<|NTD+ds5eTj2!*c;~NxZcKJ zBrGU^qdwr^Lm9>zPt_xW0dF8IcmBwzaJUNev4kzCc7l;(x$e7#8R6d@?P_g$332#n`)nh&WRy#xw^697f}WXCYU(mM z&3MMiFPr4LQwy^7i1rYnNfJj1ZQj~Bmw?JT&CjQ!f_g(gBSz$wZN=3%0K&XNrO1cy zIb$2^rf_mD+CJ`-_=VZK&F@kzF)uY)MXc9|95&boF8ib%D;;bv_`4ms;LSHR;!g_m#UlLKVKrEX#|pv z1_COHR2@YuHe5%Bt}0R+N>~QDsqL#gF$U?{&z~%*esk0jQ+u*>I;DOoRk5y7xgI?! zDUuV`?a@l5IQ22IzBBFCOH1J$j8zn>)^9f1T5B&G!3*l1wVb7hn$g!A|E522LEW^r z)L&U$QJIr*?Fp5GCw-w5c>%GKt>Fk+w((%1%+o57inBH57_wtF-yw4+Jl8=C@p)C5 z?yNpY76U6RnGJOjsXutNztI(XOA1`2HP;Nak-66ZJ6B+OCidYxVd{$JT#id^m>+}; zj_{9MSYN@O={BWV#?;jbxM@g1q3MtA^C}>NXWSsTKi5|R&jJC4Y&G&r-u%1D>RhY6 zVk^oVBgz6plEU5Zd%qKQmy$PkNQ&1fvkWipcIE;c$R}qy4@Bf%XvNW^Sq1j@8JfQB znT-dad_iB7V@aQm^q72sLiGlRoyLb6|1?Zqc&?M;M$rf)^Q#)kF#pIK4yeT7HuOm#jUMgu~`xTD4xA!p$kK_ zFD<#*cl9HjtWNe+5^yMGrpGM9$n=oH1ju1C_(oL`-}icJ>JRUW=M_4=$lBe&>mB$l zKLPSJ+Mtz=bT=iR4)+m7*O^qi@eSB2+GdOYWbdsYnUE1G8U7>C-5)Uw-U8*BQG6Qz zH=WLYm4iBP@pQK~rGEHcz8!0vtC5sXtR8h1QE;y0o(wboH@QBU%(XUUheuC!b7v|( z+(c#h`n&UT_KH-cT9mW#Z7BJu zpf&5-9MfnigwN5X_i8{Jw_{M(-DAyn`Eu^c*vx&Ya!fnTgm;A1a%EO})Ko_Tmgs1l z-3fQQC4z>Le?ob@sy=Smk}S0-6%TehQYxpq@oU(2Y*e6ii7>IjNF1X z-IuRtmX9Si2(gRYO#T?y(GS(toy?F4Z1ZehqrKlxe6bX;7%&cgIb09CdNtvt^C!G( zcw`oB@@pM1>jsX@wnUw+2DKhVVT@*LwvR-W&S#BGflyseV>gMa1q)C{*( z=5g{?9$04_*rzur+O;85kPL2RwFx>JB%E8J6vZqO@fO!pyRP=Q=@mtJKN8ss|A*S?>9HIf6@?1!Zd7^WvSdN1^2T3QF9j0p#Pw9TsXL zOMJ=E6hhWJtFwI6;pBd%b9{8?xR_p6ZH8n?HD0b;-)Hd)hg>!yx7&2PFDT5f{o>{R zcXm#@#eI6!a*I-~`793LCbjXialVgo2tDf$un)kFRS&O>!nyk3vr&0mzQ5ooW#rR} zccQ!?Hf!FkwizPQx+AF{V#~kGbj<#6a0zdlczYzSnf_ONC|_(0U@yqQR_3Hzsq8Wi zSoznEitW09y;$ss{Wy~+3j+kURX?|fjsH+%nKe;pX)5y!vNXl0dF3DOH4Q&ReS+m> z&09MhTl3;Bh`}i17fkqi)^RWOs^Mu0{(lr_$Wo!xvQ?i5N_kj)0REA0_sm*VFL&!I z2wYP-vyKlPfHN#WDfoF$F(&i|;8u?;%uA88d^zQ+(4yJ*Fdag!EL`uS>6oJ4Fg;4R zcYh|{e`QalDp@tN{!FR)GHiOBZ>#t&Waq^DHYk1R#2eV(D)RJIFoG)>jF9CW$*Dt1 z*(}dZv7?sK@IDSFzj6dHFf1!clE+Ztao~j&Z?-v?M_jb`n*Ijr4}3?B*VRSLz#RSb zDO*pz-Bd(6u=JZ{@jm)8_!pJ;a2%9f287H0aIFY+}@o_B){_iEld-XrH`>O zIee}mQT$8KO^cAr6fPf=_-zm2z<$-M5B{Hp*?tS%n)yv)f<&KES6i@FrLcRZR-|fD z%vT0{AwHBH7rLb za+4LUckJti=fP98XfH;MrHk>#^070RLw?o&xW-l(sa;DJJlxT@iTnr>I+04{2GwRj~dJV14Dq}otjggukhun2xoB9 z{Kj^WaeH|f-$+zmB02m}UG0Jyfz#@X1Bi{4t~Ku$*tTz7!0)uSq=Xku6R2=)M6Fwq z93c+l-S|VYWYB+A_#kZIE__dTcP3uNKsRPP+n)RFa8nIZU}@vz(i^o#DJy+Pifk{) zxX#c}V7=pQrP`0t-Hz~=x)?XC@-shjw-Oo5XB~~)_OrNFZJTzA-+(TF8)X43q;J0r^-*t3ASf^&8*ba^x!I= zj5L;Wnr@pSi#jYgy0z7w8W#4!ts0Q?}V{q{m*ifu2VLVJI_Do6RKb= z7B+H!FKwC|drb?aFq@rfZdjVK(j2qGI2$U35100re9qDpDONDEdEM7LAXs0tx0N5l z@yYzs_GHtz-&3(z_ZtOHiqh5pEXiyLsLAVW%+B)n*ig~nOvEV<+ky^BZC1y3HBh2D zQMk@(%scuHwFKk*{ysR@{5HHCN|As82ZS`jIR6*?=$F4M+a+4ENkdK1;$?n1hvz%D zy6cTip#39X!=m(ne(0P;3^1A--YnUp@3pn-79}r3wpYE_fxrOR^AoST3zE&#)?a?v zO|^orj=<*j`YtF~n+4UB)RK$&tAJ*(=RvU|KAnpn7_ zvg(@ZeGlPlC&@f6+q->o#tX&+uIL0t#kVJ??bx9fsv|+!LAhK6VmSzZR3F|g1k^DD zpd-jZh+cnRzxWb(ba}kGoeNE-9n3b-BfCn56<+jS?2qHVxN?_G7ZmhWCBvjqg^GEk ztdr*=fL}1i56+Msgt#J7iRGeX=t)kWLLG#?Rx!LRfE)mX$zk}@A5#^YmySc@zx8}} z%Emk3y-!D; zyAC)qwO?EoiVLwY!GTZ9MYKufAeP|wV@`$4gyC9v++A#^UQvnfgm)lGbQt#_3lNG} z$T%(BMerRN=0yN7{1)dYifIdPK#n#N{s0vMF!QU1VHGmm*(<)C(5EAOduiLVp4omQ z=XGx|#yMD73o_6%Wux-mmzx5GR>rr9L9Mpm4DJ!C0O%<;IzCk5R-eNcnZ7D@QjuR6Tb5CA8A|hfXVhIb~S_LQ2`1EAK6c>$8U z#JA`&Ov0JyxZ^(ZV~HyFOph;$E3Zx@6Nz_-o(DFcudh)ZGC^U)cC;AJQ)}@>Q_8kq z?E$*VPK4U__7_`$hSpBHmpS_NE(ZWm)Yb{U#W6^SSZ)|-`paPA;Za8;d8rfB1t1gc zA0a>j5T_l@0?ksL8hh?fGq8~i85aFo$L$HPn@dB=6yQdNMxH7&&|j+X`}DDJ8Gvaa zPZ9}$ad})Ea$AhFIS2$lM0sq`l*3G_wNv#jRqR|ESSeyw&EK2hLT<-z`e%MvE*Gqd zb-zz>$o+-l!C~4TAF%t3P3sx@`$mroVb9BqjEt17JB1{Oqbx13&>YsqN9%*VQnu1l zZ(UsYilhJxrJ)b8Vwiy+iV#_VSX58}>WSP6O5mKgF>nj~({QFwhMs6&7~&}GmZ^SP zC7V8baL4smQPr04MKpt@!YJX@13~y;+jW@bo1FTIKx)_E37~nFu4oY7ZEu#J`KMqS z%X8o$NV+|kNL)V>3}^BKI}sr7qds-gG%5V*lc3ollG2{k$OaJyK4B;-a-bfw#5u z0Rp{=R=eH<}OA(oy2~C5wo7oj9n}LdYs&l%bzTMfFJZr4y-N;;0gf>S&XX9mKf* zRUXF=foe+7*&kX;hzD!*~Xl5M7Na^n2kj#;-w>KJ5yny zr=oo>t)r8OHDBk9DO;MwCn`c|;np zzgq?#DVgXD9m_PnMWKAmawdr>PfT_u3KJyZ24Tdw52aDkFcJk_M>Ik7ia863NO=_y z`{)a?^c)#GTdCRwtdS7l4pkAcqt!$~oZkBmTBkqrbBYUom4!^P3`}V(M&UngnPD5arR0Sls-^{nEk@F_2No}tU(+Y zBP};0ZAO`ES6FUAJWj`ejM(6k1z;CWweA3+*_V1hH?Ile_z|j&a$}I$DBRtjrI5ht zUSq!+EHU(Yw9tp&R7thL%`pU$Mpd9!11JI0Pp;Q-$;3punkIZXrGNLl^ZeXJ&IHDz zo@bMVcs$=_VZRdyY-k1~ZxO+A5F~JZ5oqzcxW=fcZeUiiJxEHI%uX>IaNZuRIQc^& z<5#LHhO0eM);54q`WZ2luab@96(#e|)1VHLhMhkKCA?l}FyJBk%4I!U4S&1_mc%En zmC(LYheoYhPL&vb8N(0D2E^MKOT~)xTguuk4kSK4KV8ZFLLDj}4weKQ*ef*w2b=o< z0dQ~BU!hYeQ|a|NnV27uQVL`z+Wdc(?>#Sosi*X?FP1}`cCtwK8^-0!+J=Y8NUT>B zU%RH706>=8q;Vw$x@GbTUFtFX^2089erlWf`dAsF#-~HQlbV1K_3Altok-;w|GxM8 zxrk`|Fr%<)JMm{C4>+WnNGw)BiT7guTreclfb98Kt6!D<&ct%>-vf*N;mP8{dk}E# zfC>NFmdSG{t1=&4yCa*d{Di4}ChF8lliQsAYJ7P1uTTOZhV9bu>$CG!fgwo_sXM?+ z0FJ4w4UNF)V>R^v{tXX)+vQ1Kyf7=C5Zm}iAHX|6GgPwQk}5+5tsfO3E;XUk)rwXc z(7r}L7r)0(Kfs^5-wW7|2K4_{Y5yzq2JLNgG2qAVC&OVFI_Y=^U|j`L*Q#ut$tMb{ zuS1!$=zbJ5FFJlv)L|;f3qwO0E>@TX{rz3 zuhEN?t)LfHJO3BJOiuCzB$xlj1GWa=J|K$b!=3^~q1o`>T%Dt%lJRKjJbIA1a!M*FBhAK*%$ej7FL&(0LigOl^(fUQbMAwqhkq62hcr0CWA153mhl^j+}a2X*xab zKM{?{-2pl8{T_{?AA(IY{rF@v$xI)%`v!8tS(*mPK@!_J2n5d0c4+zxrv)KbmEG?b9JW(s=##X=o_w{7Sf*t(m{gos)?7 z*&p^hta$9T%LpIwc8i9)kM(q)(L#@Tdwz>k{oY|vh^I?p3!s$@mj5pJ-pz6A z_flU1ucE0o+Pg9!Hlg*c)+0To{VM!0{UH)tK}H6%0^%FPuK$w&`BlyOOBAKCkx`^R zX+HQ=4e(`-$~|YzK+8+1iW(|8fREW;g|>Yzw*r`mM&8W)bWwLSEzrMXKA04bn7?({ z^PUz!XOxL%!?}AgNIuE)(+*f};HT#PrQ_4sRpnq~@O+Py_2BHL7kLvqi#5z_^;lIy zeYW4`?Hd26amOX2{h z{L{7=TcSPXceqTJ9A*Q+voBk&WWtQ-r1{^+!&ARkf?Oz@*`N-(_ObjE}_y%8K zsb+zg-kNNzMMU>CQ<;3QXEgn8sg4<8`_HGbFBATcy)V20~04l!*|-pmBWW-YG{2vHA`dxh{LvqOAdH z7Y0BuYK0zLz0;|w)EVawl3{YYiEvqwcS84$6 zsGRgaQNN7Aj>m6;Nc24pZui8tnEdgSp~DJe1qe&6G6~k=y-BezQ4Y7}ji02q!>|dy z$~S&k|5Q55_}W;52%PpWC0{NFXA4dZWo1iOCqwhwKYSS`#wJ^VL1L>Fy8}lj|XR$CGp&z0%`+ zMGku-I-i-b~vr6%C_0k z4M4vy4i>+?Yw&h3at_4YR=Hi?zRQsV1u%6&sXWJo=FfZCo1{Sjcw$>qL((Ap&t2Bt zueyURaVm6X>ZW(EcdDI!nUfIfmN@a0)4&aRFQ>$0JzB>FX9pveeq&Djl!9u#+$Ow{ zI;u1oB0A%=rW}(UNs%@?9>4Le@Ze>qbSbf26k{p5ne(ar<$Zf$)_r^i*n257@QwTN zhUik8fg+RfXKg7r<@x5|xj4u~M`*vrRo1ryTinK2knc3&xdk^2wGWx z#qnnk-S$m6={aW{^(K@(N9dv~_UF-~pDuWNvm!W`7QC+5N+s5alRXYGeV{MKIsiR- z`0M(7IV>*n9pZXG;7{9Yi~5bU5MSEIPo5hjDGDC60V!I6){o$7dZo^iqBGa^B$Bb7 z^>U|NY9Bs1H7(Mmjx6oSV*`28>9~Z^(6XmgijoqbLR1VxnKpYzhv?t?Cuq1UvE|&x zy`tSwJuSv`#l-Ws5r&dDRC!Fx@Q`~khyIGvO+es1%R_9}4|LA(Um zt;s$=sDAhcXCmMWJS_BMdO&90fe`lN+gBoQuiiKDax{hIfO(c)g6a(oUS!Y5kKk9v zlG~D2glT=tOF>+C*nYYrPS}P|W8F`m*x&=F zAsdo*Zo%USo{#9HbZ4dS3b_(FoicU`elM-r+`kpJ3GbQ1KMgS47nX8s?5s=>R|Sw`s2Arc!mq}WY_1`s2y%JsJU;C0Aw+euD)1Vf z3mCNAbUeVcZHJ8=%vscV`8W8s_bPn)Lu&W}$B1vDtjxlBCTcj#NixMY>uKLl@YeZi zqRa37QD4;Tp@=2!d{69wW+?&TLSG2M*D}RQA)6xjvpZ#-E~}Qr%IE$Q!hwacqOLis z{dy9(;e1JQVz5{wXelZIVX>}k#mTdaoH;%t;586p43lOt! z>Sugg{ay2aeiw%<@Rj&WdTR`^{dBvab*zY|@@XwhEaT3f%S8MYcy>!wz`y*X!kXS0 zh!0Yjy!298V?}?axsnW2f4?zw9w@tJPeU|BGstGOmX@>f!u`3rJqX{pI#Sd?Oj`P^ z8jmlvCtAMLUTtjfgecYuU6eUJZDa9^H^6-11Z||y0Fkh2;%y2VcRUdQ(r+fqi>>_P zf`HtwP&*v`*i1a%^3Km!zrUFuvodNu7rW-6wa-EfE(YR+g;}pZi?ga#xR)=_F||Z- zz=a%30xyveSx{kCecYEDYRuPPSE@NE41Ow5rG>Df!NNk^xPS3TQaPe>y4n-JesX2( z$M7v`{NUS9=lU`mx!*o)pXiGfyDisv-597%I+p?PN$F_S=vYeFkf;z=N!FM?NG9Ak zTM7u^*an5KSZ$`IH&rHwse*sRE{5r^XSS(MRUwUtO5H>DC}zlr0}JvHf`W;)`E_IW zvO#%Ln+FKRU$fEK0o^iJBXxTzqxm-S6$;i10&pBZb6!hs5BdR>q9ffTy&3*n?Q+Nm zlaXggO(RlA*mWDquRj`_CFa_aUNU=j0aSS?U}d@uch zPlta8ZJR%Tp0<~F)O>40q)|A`4M=A0o$P(Euncx&otFx7$HT3Vh@@B`iQ;wnq#PK< zVerkc#&{ySA{!FXI$8;h=>ArfVZdf#R|JU|e_b&Bjwnxf1aNb^L`AM9?P^Io(iJN? zyz?&0Kol%QTyUAU48Rn2{{n{zmgSGxP36svNJft}$mS5Ts0Y+Zbbpglf!-aQc#LHt z^!{!W77$s8ZD}U59eo!|dV<3+-R=&G`$))G@HrdeTS!Ugiit)f5AIe`Rs-dt7*6XP zi8@-bQ&^JtX{Bn4U_mpzOdmglB|*GSr_CmQKFc@)`o_ME^E{b+a3vNyX)SDFFI3AL z47m&|zDsYc%%rrizxU`g{^1ZFVP$AUz&niZeo0o={Wn2ZrOpFdIou2MThcObUI_Ae zsP%AqjA*KXTCphP_T|y9(TPawX-TcG%QND26yFi5Pu~Fu<+v1@mNTS|6cAX>kNvc7 zTV4C_KZ#ojuHQ)tMP%_5{PV^04l?yPz>bIijaEtzkdT?AkXZ?D!q3o3xpL#lAv9>?NSoh8(zs8MoomVd- z#1|35mm4s*u{= zsa-xwH+7o!2ihNLpb)1I7?N72;7edRt`%DL?sy%Rb)yk~A z=wGuob)Li5xgBuLOR=U)a%{CGStF6OFc6}h*f|le3~JfkDMnydnH3}yMjxwodI+D} zO0o8ZfA!I%7@++DYy9Q zVM#FBOVso|(7b8VC*QZhy~FA*p6ufsiWZH&BFCNR_2a|84~L!~X*xW9q#!ZXV?vc_ zy=Wmh(_Hx`IryRkV5E4FVMt-y{18|8oO(29{k!{s7SE>{)dYx^Xwdy#o}6?9*7)&Z zFFTO;-i#`W?4~08Kh;Tr`U|G8%n7XDBDn1Dw7*@%pFzl0=D3r}?OBTeh6U%bVRw%k zD#zS(l7B;fz(W=&eW0OgeNuzJ^SkFucG7rYhuFzF92XQC+4P(@Q$GcpvDChBAP;!I>1pgzp~up(NOTJ7m@*{g8O=Y$Vd2&f;- zx)0vieQAyVS~W3EIsYdxh9vZ2hx9~Xr`PrS?!tAu$wd>QJKp>D#Th`&2tx&EuQI>@ zgGvPAp0p33oN3Ojp2Y7$`O9hY0N{`U{`47Efp-7D|Nr0aAAPXN6gD|sV$w@&(uHXW zya6D>1gL=o12I2-r| zVWCp#Jvjvh07HwQ9Z)T`#hDIv3m&-F0l8e<6F z(-q?eF!cblcmoN}&CUJ5nTxiGu@b+M#(9{3&*BG+Jse??0S1QJaOESy)-kmKgeRuF$P6YcC(T;!Ob znD4#Xr905<2ymdNkpkx(wpXX0x&<>;B_-PnHUZkJD*IL0C{ZsZ6Bo)|Q)0`3g+Wl)vm?RaR6SpPmBOizy*6=~K!m z4k+ZdKc}du5y0RFFxahu;~${hWCHAmIC=Mnvd(JQW(23x?##GxSAywNzDFkjNe)10 z)a(TTYW?ehuuuuwfR4@4Y?J1~OykRUhXZQSI6|!eg2CW=f&eHaIC!PY?eY7_=$E>A zPu>RsQfBJ~@Z8FMGf>P2L_^)96u#!Sy5QY+&S zNNGAx6Xs1oxc?E2Lne@bfPe}h_HfQhfZ@#g{ya2#l*2P|VnTfcKLwyix|i}5C5YF> zVf&vmIfz?>o-0&UU;ht}u*bOpKWL%JJK385|9fkX3vgq+qPg1p&Pzt-D=fV&Hne;d zmKYoR?u($n-|sf|x+gQF1|)~`(Z#){yt$M4Xh>m<_1rsG8ha#9aVxkIx?ph6vz`33i;`1)>%z+ny9L(UVA~j zE{|nMfqK^{@dFrma|3oS2pRXHKe}1%dF4d9qAv~IY^Z#47i;L^;<9%y3(Fnw9*oC+ zRn~K4&z}di8!0F#_`G@Zbtf~uz6ikd%8cw>#tdu~7Zr23)?B4%}O5W0<#XgoKLP=y9OH_=d zY+1^hEZIdf$gaGR7-WkqY3xE|*HFZ$RA!7lyvQwWccXR=3Qr>9*&4hlaMHJC`HmqfKq7?VVDVMtwF7%yOXun?1l8dHy~pMq z{>oP3Y;mPuTv7Y(zZ@U8m*-nj$|pX0#Iz7A57TS9o4z@a$z-UM1hr(qNBZ&IxFWLS z$FruUChxgHB_Jh&(}Ed__n&HKa4;GGa!DrD@AOUF{>aM zD6D#D1Xi5k1uhuHm?sDyH0BpL1dVy;_iQ~h+=DfQTXs`e|9kuHoy!!DzjiL`5pOl% zG!aa<5eTRJ@bxy{`yoB6m%6@Y@18YJr8i1%yWszCntmBUTfOkVw#@nuJMCHW%H-@W z`fc<#a%c63DnNY>`SX$mf;+F5hetht3!|3M&}(n@de`hV-j?kcRozpOcJ}t;#&%bY z?Cr_Y7K77mSy3ppp0fra>R=;fQttyC?t%~oyQNR2X@wIM&3YTOUB6##!U@<|l>C+< zyN0sgfs#jpLMKq+ZA7ttVjJ8XP#dHdf_-o@4U}EoZ91)2l2zc%29r9Ne3bX>ThIco z7!YtomW>c-8hv!R{THq=s~1@i&lWqibh*xJ=I!3Op@yO5*}e+xG)|Gz^73o&f?w}! z{ay>v8*fX-t6)d`w*KDF?kkZG-ty+XXN;aQWI)t<$`pGef_MGcenxn$jbXKepQmsklVLfM!K;>skcDIq>1!#z3!g{4722Xm>| zyyofi=g!<0+^D)}d~6$F5s1BrUMB>xt*iCHsig|L&xz3wfl#5~V&Bw{DY-uoiXUnZ zA^&cfDldinlTYVN+Q6UxNrMO}3Q4}dA^ho@bg;MIXSzp{ThYA2$*486H8eC7g7vEz z4aP;L%fGiS>*0Nan&~*B-ww3Se1QL!Tx^iETne_KvnMIyO>ZYN_v`{`jU(ARO zVs|mIw6j_C72F%qBCi3lCTURM@}t#^Z6H(I()5@<(#t7jFUMCGVPw+tXNV-r5WyI8 zfJLs0hoG44*5*tOI;d}e;Mbji0qtSXnVat{eaS)gY^@%q1b^UM;=~$+q+IGS0k0Nr z!mi~7wISLVb~dV5SgH8qNjajO!-nUO7gTXGDA*ZXNv?5~cF@$>_y-Rd{epG6FJ}b7 zsmMwQw(1Z9q@4@Bva_;&M)B;l!ODcl8m;yiomNK+$LbIv`Jj)@;xkP#(|+=_sHpGc zLO({~Q1;Q;5x#$inZ|*ouw*C1;?~tF)ud+Qm1ucKf3;5xl{?1GkPq!`>bS_vz74wy zUC{KeplAjLb5BX(xp)e<6?7>fpAt?RD<{IwU9A3R2d5`*)dU!rw(w7{|7 z$q56zKg>d<9MMXL2)jVP`asvD7CB|B(itkcj@=LBgp2|&su5vr{CV-oG_u+gHb)(k zKW(YAf%Yqd`k?*AlIq&$3AYj~y}T-AjL#vlwY6R|PI1*V-e#-7H8pN*BJ6Cg1GxO_ zxv0}tC>kX@JKNE{!l@I-t5mSyK6RNFo}wPb)u-$|YyNNJJkYrBm`zJ$sfCOk&P|ze z2o6=6dXzq(ilA;BaO^7vD!?;@yvXv42Z4@j;`MK;h$)5S+()5MKp&hsd9sHO9mQqm zxNoQ5>KxFVS7aZgXJGw;$;E*DePg{!@Qo!Ws1Dd#Sn6jOUJ_0T3*P}n;}zhz)I$Jg2tCYbIrjs3!cy z=o!~)SCQGW69b)_k@yMZZWK7^j-Fqb{$y}qvPR^O8Dm2qKw;fbsdmpG&xz_wUfTsv3s|EX)-S5q3B^l2#J~~*NVPZIGYw)eHE=TrO`Y|;NDpT zq}-%(&}R@eh1{rX&e$JgW5NwXn4oZg;uIb(r06u|>DD{>8B$ zf>0@|+UTQ6RAzHn)v6DfSPSW-n;P)Jk6iLmDl_QN|AtS>v|7v)!_yKJeSW?(dnCM0 z&6~n5m0{-=0jQ-}Z(1nrqB7HBF_CBJiy_abu_SudT8GQQ6t zEy?X&Fhg%|@3*~<#iY~Mb0#gUM3GC5dV(4YNqxePb4)AFtc!)bc=bxW{})gmb!U_T z1)+|nW+@tWtP1y`K**mGcnHNauP-aEt*!YA38HZnM#XhAP}(>j6ph7)IChEj_KR=6 z3~SPs#YOj?*Q))nr8x(Ye90NObv+})DiBKn0adfbIY>zAKGvQcK}!FSZUvj7y%}iz zkzlzzG+8o{4#NJSz5u~*Y-}{3=DDN4?STcZ{pP5%J!v99`d;MVMstV0U|`4#(A>Sk zA0s)X7_DDf68etgyUL`0b-Wp92pUSj{AgwESAdEK;KA5^bu0_7JoeUPBt!KM}<>lZDpZhm?!%#HFUXEUl8YB@)tbrd=bqV$}DzCb8XwA+^1$`tnXC zA@PCV$}D6>=G-m=3$s!`pfKr&F50HB5_T!$AQNl0FPL(fN`}juuoqXs9vt*FRUTyV zz_Xv!JpQT)*s&7Sxd4LqWoxs$yDS%$)cA%2l5v zjaB@D-D(zdZ6G&Ld1G2iSYMY2W~|@k{I9EVa{ee#=7#7AEd#}VOQlH6?tg905Bq@7 z_(#t>JQqycmy`?pYvhQaNzNd_ps*P?-LOiga?k!KwXhh&n1eiU?B|F={VogA5liHGg3_eP#FLKD4XMt_i^>oIKHu#_tJlDeN)mF>6~icb~^JJuPOSk7Fc zlCz&E-2(T4WCG4Kye!gDcEU&{2f%M6)u-PD#$N0B8KUKV+Q*sIxiwwLA3#!Kq}C1xW?oX-7~MP8hQ zUlF;Zuxeeq0a7CACMStL6v2Sd@;1{0*B!G*0d+4{7QMw7&h!)m^mgreJq!yHC@}{I zA$zaSGNC8sf^+%pFvdBcO@k2p>lsK!hU65lBQ+Sq{Ce|Kn-OIl`qK8!bp{3oU~t6` z`KFQyeP3E$4H+(1a%eYUt@96`&CE|_TSQrN-kTXXi+@# z7>e-YGp~n964>TrY;3TN@4W;Zu2m6FTu{ms$UNpt!KI9&5A6>n17HLFseTT*^w{ZP zYC4z)av!8>|0n_#miAltmJ-aDg24jcCSxbmCy0^5@`d$1!`KI28pm^beuPZL15;F+ z51LnV@RRSbNjcY+Z44u8H}v_^>8OeiEBRXal2|(Kr7>kQE=%x)_BQqaoqhR_r_jRG z@yWf_4t@7Kg#4whE^b9zR7Ak}Nx{aA>eUWnLe}1k;FdALipDIm3@hUn2c`ju`?{`2 z&CX}`I%7(5$P|Se1Ly*Yk$oEM@+jfj?^$rRq396#DnYHM4tB(KsI#)+TnKYdd2w@^q6jVjWxJIVN(u- z*lU)JKd^>ZNl{nxhOEHmCfs`eKu9~$fe;61N8z9Cp1P(4N|{__(@Ky>h+gt-5eK6y z{6}z7$7b$(yuXAI-Y`t7oL98^MjaK~I^4wv-XeE!eBe|L0Vbzb_qx<(*(l%2w%Hay zN_C#4J{#6X0~qj^q{?M{(-lIhqU>LjSy#QttSYFpN!nEAhSNwXCo1!ANh&ix67Po^ z930d_%N1eTTeW+Z*7amu@`NSIzVQN5%9UDu2u6iA z|G7glX(Xp39}}vaYonf$A1H$)#O|VZhXYNXUt6om83o_%HDdE^0pzeDS@K~K^_f67 zrtMvH)~NH&8hM64StoVqz4wtoE`$eZ z5*1(TcX%jgz>}>msJPocg+@A4aLIQyiIM9BjQ?L$W*DABak%@Y_?%JTkG@8n_el+M z4IXSgDb<#O<8--3WVwlA%mApGWfNdqkz6G6*w|34(I-oqjCy+cqtayPO>^3h z--M2Saakctb_~MztWb<(*5E{6#dO?~GFp>3(1E*vT;Mb#d&u!D{|H0#+q9k3M%iaw zKzc``>?uWPq#0RX7QXW$1~(sqF&AeOLVgawEi5ej{>HSbpKRT7&WEl#FXTC-p6I z@#lH;+Q(9O4T1Ix&?UiOOk_}{7OKUw5W06dcW{Cun%Fda_Z&xRTAGEW<+!%fR@aL5 zszS%t@8@f;O6+Q5k!o32*MS+IwH$Aa@$M)U-y8x-hM6Di~%Av#Ko#f$7K)Ee8uO6#zy6BfZ)>gjqGJyJ{$cm+*RIRpbMLz6wXaU~slcu+^ z5whY>{u!uW+u7OK+}sS{6;7c84I$WxaKs$~C8g(} zZqV(Tq^8^p9VL-HW2#r<*&kf?XJ*wuq4y!;F014N_3z9`l3?(Mm~%%o2V(KAMn=T_ zdy$VT3k0qC43I%bP0&*Ju+s2z%m`gU^u%8EHeO>YQk-o~`3@|9_oBgxtdskOKp@oD z*F#tas1xqY0`tK1^fcxf%TZN3vgLk3`m_7(&c$B0%-JPyLTh)#4HEZb4pl+7P~0S| z%IzEX+hcp2%qrw2HOfEt7wEZT;DPYmH==_#&lsU6t4F&9ig0abG2itS3Q@CpX`Q!! z_ROs$hyK(r>=oSe^skSNjf@#@-%L32-*lvz{<7yNNe;C8lw#|Pcq!?}J1=nM%3~GB zL5&a0TpnWTxISZ{r_@T(5TQy(ETvVyQxYlP*k52jPIItdW>@t2eLBe)T`ysT?C3_y zOJ~#agi(v(sZ7zR`Ml-4-qG>#Q*UA`DlXJ}CnY5%CyI}=9a*TUaV9HR*V?Zq$UA4P zeZO>D5`8!P(4U?<4(1K!UB_|B)AEg!K4;Q2ZgsFD#R_d$gQ9u9v~`l&rssZrb@KhL z|Bxu4i#gZ(kAhLsSeA34Q#8+erwUWE%*mK`kzWtS);;W}hr{^l#T0+O+x463Ddm57 z+&RbUW+ju^X#sJqC@wtt$}8q1Uz^&3g8iQ1C*Pk;@036#RvHbv8cA)$72=bVHz8h1 zxRY?``T<_-NUShJPtxd3c_#j_urOG(Jns!cY>SGIb0p-cv&l62Zr(Wfwm!6>dJvHj zI+j8;=_=}#X|#XPdN|dXUrRJ9^hr3Y^oaUoI4^^^j{K3UBgunB>kWp)p)YOb$S-aF z-&v_1=nC}AE91d81@G}Xiodqa?2(Rswk(aqV#=<`5qT;vyQi?8Gv-rH_kkqaUHm@m zCT0iD9g%U8Ib!O?S$;2#XP&y3G22>@RnWoF{p6!i{al_4o;;W;QBwWgD$&5xt1s}$ zHK>&20~0h6M{Fps&)d5`pUi%mPZqfv{kVJ?Yw=6xPK2OpqLdURU?H1kdrrNkiAPBu?+MD8$s8DKu>yUWvV8>M*~y1%_!Rp2W~j>W^UrHz7M*k3NR zSvrawqdiOadF2vad-r&1!^l+P`&N%zHM9Ixe9MpeHmwHkeN(E6|Hj--RMXLYg`;8uBe@%kA0 zQN)n761ml`Miabisdf)>)*5W9ZJlg|JYjgzu!{TZ)LeJ5VF_NDcji4sz2|45kc^MM!HPXZMj#yx8+<#6~y!n%2GYEo*O1e4CJQN zx9Bgb58$o`#sTr`!MUhnoZZe68mEQx-7A2+VL_$}bn)aZ51mn>#KV2Il40>;6Luzh zw4X;qjt2lCpNTYYVEC@^A731!J=mEv;72o)8lsya@zGW zz9tmEG85K%|9;!7>1w~#L@(RQ`<@mNCNX4Sr&F~=uAp%=%p#7ANeP9@-0WRj?C6m+Ql@i z4Z3kgF0jb{SITnX__me}}Y-yNuNC`9#^&XNf#??{tveV;?>-TTC#Vh=(d9Cm( z;3I#$wecBJOk#QSOUZzU(dnWB56?wiqvpC;%v(A7`{+eq=44?KKA+Fqu_k#yqeFvo z&xw0F#9v}Mgp$ZXlaIRc*+)7eI_hYhzKi>-_NWQE=K%4eL!XRE&F0-KCA!Y9k;=u$ zTGH7J_eC!5_Y;Xa9+Fdj#1(&ATB(-}i~lP7wLQuawS~PTs}7(Gp`wgz`YDo*%cPIt zon4;VZ7F;&dvwcZ>?i~_>384qiL@$ixg1SSveDc{ z<~nbmHT}cI{VhBB?DXF*5=zrQrnOqt#99tVCDi-K;%vo-6*>!(d3I#wpi+x(yk2zj z9)sVPjo-*V9Ee)fs{NbrbRavFz&ZUS=$UA8Hi^adWGVO9i2-_c1L9qWhp&>(U#)io zaPskbPnic>jji2ngZ8{PBO&FVs3$AR=**~Ra?>$)@a-j$U2$h)jwst=!zR36&kla_ zvUVT4MY`(~h`z(~gdNYR!Nc8*pWpYV*TK0qIlMw<(bgdt;ZunxUwW6B^(e@jUi)c` z31ClZS-{}Uv9deK5qy~gvP;0xY> zK#ZWrWzO&^-QZ|Xy&g2RM4aWr0lSlK)6z2JC`1HU?T8@ZRY5m#w|J>zvWLTTJ#X{~ zbH3tYX^!%28QBWo@ay|Zm_BuI*Da2*O{-GbEL+tknMdzyd}3J1n5=ddk^Fx7JMX(b zTk$1I2^9TB_x%wYBm~}cxG37qG^Uqz9Jw2JG<2_X4YQrqp0 zlB$hm8DRn+JzsYmFnarVLR@@W{>c!}fYC+Q>eCFzR8fq~t&RhCMuId^9$?%I}Pk;+P7fQv1K0!QP>9@kjjM43>v>0;3m{fPK8Wz)3BS>|U) z6rWJ=5x6Lwg~{4I#LrF-T#SY?P^%Fwe^HeY(p#^48ph6XDp zv9r@6a>es6LQvFd5j{rBPJjZK;U87~htXq=s| zvS!0^FXEWP;|=xC%)xfwzi-y!9aCzHs}Op@wZ+eKZcYZ^?RLLA?{)%#ppOQEF1!fv z%E1Si%sWb9NB7blJqYlZ!}b69?f?7&U7sLs6%RSxjG1yZObdo@A~e->t`uLo_2B;j Dd=Z1G literal 0 HcmV?d00001 From 866d582af2693dced13837f352a7336dd5a3d671 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 2 Feb 2022 16:55:36 +0100 Subject: [PATCH 239/247] 2022.2.0: Correct post date --- source/_posts/2022-02-02-release-20222.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_posts/2022-02-02-release-20222.markdown b/source/_posts/2022-02-02-release-20222.markdown index c84f1d1b463..9bd5b87acc5 100644 --- a/source/_posts/2022-02-02-release-20222.markdown +++ b/source/_posts/2022-02-02-release-20222.markdown @@ -2,7 +2,7 @@ layout: post title: "2022.2: Beta release notes" description: "The work in progress beta release notes for 2022.2." -date: 2022-01-25 00:00:00 +date: 2022-02-02 00:00:00 date_formatted: "Februari 02, 2022" author: Franck Nijhof author_twitter: frenck From e0aa8cddb86f150455e6f6061c46e6b81cba566b Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 2 Feb 2022 17:24:04 +0100 Subject: [PATCH 240/247] 2022.2.0: Tweaks --- source/_posts/2022-02-02-release-20222.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/_posts/2022-02-02-release-20222.markdown b/source/_posts/2022-02-02-release-20222.markdown index 9bd5b87acc5..1b0d5650038 100644 --- a/source/_posts/2022-02-02-release-20222.markdown +++ b/source/_posts/2022-02-02-release-20222.markdown @@ -65,14 +65,14 @@ Before we dive into this release, we have some news and updates from ### Annual subscriptions now available for the United States -The ability to subscribe to the [Home Assistant Cloud](https://www.nabucasa.com) +The ability to subscribe to [Home Assistant Cloud](https://www.nabucasa.com) anually, was one of the most requested features since Nabu Casa was founded and has been announced at the [State of the Open Home](/state-of-the-open-home/) in December. As of today, the annual subscriptions to Home Assistant Cloud are available for the United States. 🎉 -Additionally, in regions where annual subscriptions are available, Apple Pay and Google Pay will be available as extra options. +Additionally, Apple Pay and Google Pay are now available as extra payment options. Annual subscriptions will become available in other countries in the coming months, including local currency support for Canada, Europe and the United Kingdom. @@ -121,7 +121,7 @@ For example, if you have set up the Spotify and Sonos integration, you can now browse your Spotify to play it on your Sonos devices; and Cast now has support for playing Plex media straight from the browser. -Sonos, VLC (via Telnet), and Roku added support for playing local media! Combing +Sonos, VLC (via Telnet), and Roku added support for playing local media! Combining this with the VLC add-on can turn your Home Assistant device into a media player for your local media. In the video below, Zack will demonstrate how that works: From 7eaa594380b654a80cc037c63379822e4a58f1ef Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 2 Feb 2022 17:40:07 +0100 Subject: [PATCH 241/247] 2022.2.0: Tweaks --- .../_posts/2022-02-02-release-20222.markdown | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/source/_posts/2022-02-02-release-20222.markdown b/source/_posts/2022-02-02-release-20222.markdown index 1b0d5650038..7f9b60610e3 100644 --- a/source/_posts/2022-02-02-release-20222.markdown +++ b/source/_posts/2022-02-02-release-20222.markdown @@ -1,7 +1,7 @@ --- layout: post -title: "2022.2: Beta release notes" -description: "The work in progress beta release notes for 2022.2." +title: "2022.2: Let's start streamlining!" +description: "Starting 2022 with media and device tracker improvements, diagnostics, added states to scenes, and streamlining lots of things!" date: 2022-02-02 00:00:00 date_formatted: "Februari 02, 2022" author: Franck Nijhof @@ -69,22 +69,20 @@ The ability to subscribe to [Home Assistant Cloud](https://www.nabucasa.com) anually, was one of the most requested features since Nabu Casa was founded and has been announced at the [State of the Open Home](/state-of-the-open-home/) in December. -As of today, the annual subscriptions to Home Assistant Cloud are available +As of today, annual subscriptions to Home Assistant Cloud are available for the United States. 🎉 -Additionally, Apple Pay and Google Pay are now available as extra payment options. - -Annual subscriptions will become available in other countries in the coming -months, including local currency support for Canada, Europe and the United Kingdom. +[Read more about the announcement on the Nabu Casa website](https://www.nabucasa.com/more-info/subscriptions-feb-22/) ### Improved infrastructure -Our new payment system is part of our revamped cloud system that we are rolling -out, and this will bring more improvements the Home Assistant Cloud services. +Nabu Casa's new payment system is part of revamped cloud system that they are +rolling out, and this will bring more improvements the Home Assistant Cloud +services. -We already improved our remote access infrastructure to make sure it's routing -as close to you as possible. Last week we have rolled out improvements -to the infrastructure that has significantly improved the speed of the +They already improved our remote access infrastructure to make sure it's routing +as close to you as possible. Last week they rolle rolled out improvements +to the infrastructure that significantly improved the speed of the Google Assistant and Amazon Alexa integrations. ### Zack Barett and Mike Degatano join Nabu Casa @@ -94,12 +92,13 @@ We are also happy to announce [Zack Barett](https://github.com/zsarnett) and on Home Assistant. Zack will be helping out on different aspects of Home Assistant, including the -[Home Assistant YouTube channel](https://www.youtube.com/channel/UCbX3YkedQunLt7EQAdVxh7w), and the Home Assistant Frontend. +[Home Assistant YouTube channel](https://www.youtube.com/channel/UCbX3YkedQunLt7EQAdVxh7w), +and the Home Assistant Frontend. Mike is going to be focussing on extending and improving the Home Assistant Supervisor and the eco system around it (like its internal plugins and add-ons). -Welcome! We are excited to have you on board! 🎉 +Welcome! Excited to have you on board! 🎉 ## Media improvements From 7e623f716ca78cec059125a547028823393ba8ca Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 2 Feb 2022 17:47:10 +0100 Subject: [PATCH 242/247] 2022.2.0: Add note about the moved trigger IDs --- source/_posts/2022-02-02-release-20222.markdown | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/source/_posts/2022-02-02-release-20222.markdown b/source/_posts/2022-02-02-release-20222.markdown index 7f9b60610e3..1bbbe54027c 100644 --- a/source/_posts/2022-02-02-release-20222.markdown +++ b/source/_posts/2022-02-02-release-20222.markdown @@ -332,6 +332,13 @@ noteworthy changes this release: Screenshot showing the new menu on a discovered item +- Editing trigger IDs in automations has moved into the trigger menu, making + the automation editor a little more compact. + +

    + Screenshot showing the moved trigger ID feature + + - When viewing backups, it will now display the size of each backup in the table. Thanks, [@ludeeus]! - Thanks to [@bramkragten], you can now select the period in the options of From 540c73787ff1301b4a1dae3c17e89f46a38076a9 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 2 Feb 2022 17:53:38 +0100 Subject: [PATCH 243/247] 2022.2.0: Add image to support about the moved trigger IDs --- source/images/blog/2022-02/edit-trigger-id.png | Bin 0 -> 31567 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 source/images/blog/2022-02/edit-trigger-id.png diff --git a/source/images/blog/2022-02/edit-trigger-id.png b/source/images/blog/2022-02/edit-trigger-id.png new file mode 100644 index 0000000000000000000000000000000000000000..5acea83266ed744475cf444f461bac7800846ac6 GIT binary patch literal 31567 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

    YzZAE&vj|9W3)$%Zip09QxzA5zJ6a)V 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 T-wI_wI+miWnoOmX>FfUk#^ldI literal 0 HcmV?d00001 From 133c21c7211eb72e4c6b3b5fdd3f8345692757d3 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 2 Feb 2022 10:56:02 -0600 Subject: [PATCH 244/247] Fix merge conflict resolution in flux_led docs (#21436) --- source/_integrations/flux_led.markdown | 113 +++++++++++++++---------- 1 file changed, 66 insertions(+), 47 deletions(-) diff --git a/source/_integrations/flux_led.markdown b/source/_integrations/flux_led.markdown index 781ebcbd375..8baaf95af4f 100644 --- a/source/_integrations/flux_led.markdown +++ b/source/_integrations/flux_led.markdown @@ -52,6 +52,13 @@ Examples of addressable controllers: - [Addressable v3](https://www.amazon.com/gp/product/B09BMBSCRF/) +Examples of addressable controllers with strip: +- [Addressable v1](https://www.amazon.com/gp/product/B07RLF7C86/) +- [Addressable v2](https://www.amazon.com/gp/product/B07B7CQ2ZB/) + +Examples of sockets: +- [MagicLight Smart Plugs](https://www.magiclightbulbs.com/smart-plugs) or [Amazon](https://www.amazon.com/gp/product/B07XNBVVXV/) + These devices have been sold under at least the following brands: - Aislan @@ -132,57 +139,70 @@ This determines the transition between each color. ### Supported Models -The following models have been tested with integration. +The following models have been tested. -| Model | Description | Notes | -| ----- | --------------------------- | ------------------------------- | -| 0x01 | Legacy RGB Controller | Original protocol | -| 0x03 | Legacy CCT Controller | Original protocol | -| 0x04 | UFO Controller RGBW | | -| 0x06 | Controller RGBW | | -| 0x07 | Controller RGBCW | | -| 0x08 | Controller RGB with MIC | | -| 0x0E | Floor Lamp RGBCW | | -| 0x10 | Christmas Light | | -| 0x1A | Christmas Light | | -| 0x1C | Table Light CCT | | -| 0x21 | Bulb Dimmable | | -| 0x25 | Controller RGB/WW/CW | Supports RGB,RGBW,RGBWW,CW,DIM | -| 0x33 | Controller RGB | | -| 0x35 | Bulb RGBCW | | -| 0x41 | Controller Dimmable | | -| 0x44 | Bulb RGBW | | -| 0x52 | Bulb CCT | | -| 0x54 | Downlight RGBW | | -| 0x93 | Switch 1c | | -| 0x94 | Switch 1c Watt | | -| 0x97 | Socket 1c | | -| 0xA1 | Addressable v1 | | -| 0xA2 | Addressable v2 | | -| 0xA3 | Addressable v3 | | +| Model | Description | Microphone | Notes | +| ----- | --------------------------- | ---------- | ------------------------------- | +| 0x01 | Legacy RGB Controller | no | Original protocol | +| 0x03 | Legacy CCT Controller | no | Original protocol | +| 0x04 | UFO Controller RGBW | no | | +| 0x06 | Controller RGBW | no | | +| 0x07 | Controller RGBCW | no | | +| 0x08 | Controller RGB with MIC | yes | | +| 0x09 | Ceiling Light CCT | no | | +| 0x0E | Floor Lamp RGBCW | no | | +| 0x10 | Christmas Light | no | | +| 0x16 | Magnetic Light CCT | no | | +| 0x17 | Magnetic Light Dimmable | no | | +| 0x1A | Christmas Light | no | | +| 0x1C | Table Light CCT | no | | +| 0x1E | Ceiling Light RGBCW | no | | +| 0x21 | Bulb Dimmable | no | | +| 0x25 | Controller RGB/WW/CW | no | Supports RGB, RGBW, RGBWW, CW, DIM | +| 0x33 | Controller RGB | no | | +| 0x35 | Bulb RGBCW | no | | +| 0x41 | Controller Dimmable | no | | +| 0x44 | Bulb RGBW | no | | +| 0x52 | Bulb CCT | no | | +| 0x54 | Downlight RGBW | no | | +| 0x62 | Controller CCT | no | | +| 0x93 | Switch 1 Channel | no | | +| 0x97 | Socket | no | | +| 0xA1 | Addressable v1 | no | Supports UCS1903, SM16703, WS2811, WS2812B, SK6812, INK1003, WS2801, LB1914 | +| 0xA2 | Addressable v2 | yes | Supports UCS1903, SM16703, WS2811, WS2811B, SK6812, INK1003, WS2801, WS2815, APA102, TM1914, UCS2904B | +| 0xA3 | Addressable v3 | yes | Supports WS2812B, SM16703, SM16704, WS2811, UCS1903, SK6812, SK6812RGBW, INK1003, UCS2904B | +| 0xA4 | Addressable v4 | no | Supports WS2812B, SM16703, SM16704, WS2811, UCS1903, SK6812, SK6812RGBW, INK1003, UCS2904B | +| 0xA6 | Addressable v6 | yes | Supports WS2812B, SM16703, SM16704, WS2811, UCS1903, SK6812, SK6812RGBW, INK1003, UCS2904B | +| 0xA7 | Addressable v7 | yes | Supports WS2812B, SM16703, SM16704, WS2811, UCS1903, SK6812, SK6812RGBW, INK1003, UCS2904B | +| 0xE1 | Ceiling Light CCT | no | | +| 0xE2 | Ceiling Light Assist | no | Auxiliary Switch not supported | + +### Untested Models + +The following models have not been tested but may work. + +| Model | Description | Microphone | Notes | +| ----- | --------------------------- | ---------- | ------------------------------- | +| 0x02 | Legacy Dimmable Controller | no | Original protocol, discontinued | ### Unsupported Models -The following models have not been tested with integration but may work. +The following models are confirmed to be unsupported. -| Model | Description | Notes | -| ----- | --------------------------- | ------------------------------- | -| 0x02 | Legacy Dimmable Controller | Original protocol | -| 0x09 | Ceiling Light CCT | | -| 0x16 | Magnetic Light CCT | | -| 0x17 | Magnetic Light Dimmable | | -| 0x19 | Socket 2 USB | | -| 0x18 | Plant Light | | -| 0x1B | Spray Light | | -| 0x1E | Ceiling Light RGBCW | Probably works & same as 0x35 | -| 0x62 | Controller CCT | May be discontinued | -| 0x95 | Switch 2c | | -| 0x96 | Switch 4c | | -| 0xD1 | Digital Light | | -| 0xE1 | Ceiling Light | | -| 0xE2 | Ceiling Light Assist | | -| 0xA4 | Addressable v4 | Probably works & same as 0xA3 | -| 0xA6 | Addressable v6 | Probably works & same as 0xA3 | +| Model | Description | Microphone | Notes | +| ----- | --------------------------- | ---------- | ------------------------------- | +| 0x18 | Plant Grow Light | no | | +| 0x19 | Socket with 2 USB | no | | +| 0x1B | Aroma Fragrance Lamp | no | | +| 0x1D | Fill Light | no | | +| 0x94 | Switch 1c Watt | no | | +| 0x95 | Switch 2 Channel | no | | +| 0x96 | Switch 4 Channel | no | | +| 0xD1 | Digital Time Lamp | no | | + +### Troubleshooting + +If a strip controller device will not stay on wifi or goes offline during adjusting colors and effects, upgrading to a power supply with a higher amperage usually resolves any stability issues. ### Effects @@ -250,7 +270,6 @@ data: speed_pct: 80 ``` - ### Set Music Mode - Service `flux_led.set_music_mode` The RGB with MIC (0x08), Addressable v2 (0xA2), and Addressable v3 (0xA3) models have a built-in microphone that have multiple music mode settings. From bc9b038819995f057501ca7dfe795bf0e4a82762 Mon Sep 17 00:00:00 2001 From: Zac West <74188+zacwest@users.noreply.github.com> Date: Wed, 2 Feb 2022 09:00:51 -0800 Subject: [PATCH 245/247] 2022.2.0: Removal version for iOS categories (#21437) --- source/_posts/2022-02-02-release-20222.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_posts/2022-02-02-release-20222.markdown b/source/_posts/2022-02-02-release-20222.markdown index 1bbbe54027c..9e39e0e5072 100644 --- a/source/_posts/2022-02-02-release-20222.markdown +++ b/source/_posts/2022-02-02-release-20222.markdown @@ -1005,7 +1005,7 @@ removed from your YAML configuration files. {% details "iOS" %} -The Home Assistant iOS/macOS app supports notification actions defined [in the notification itself](https://companion.home-assistant.io/docs/notifications/actionable-notifications/); the old method of defining push categories in the iOS integration is now deprecated and will be removed in the future. +The Home Assistant iOS/macOS app supports notification actions defined [in the notification itself](https://companion.home-assistant.io/docs/notifications/actionable-notifications/); the old method of defining push categories in the iOS integration is now deprecated and will be removed in 2022.4. ([@zacwest] - [#61078]) ([ios docs]) From 91f6dd5055b6337a5b640497497b3a8c821d1831 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 2 Feb 2022 18:56:54 +0100 Subject: [PATCH 246/247] 2022.2.0: Process review comments --- .../_posts/2022-02-02-release-20222.markdown | 91 ++++++++++--------- 1 file changed, 47 insertions(+), 44 deletions(-) diff --git a/source/_posts/2022-02-02-release-20222.markdown b/source/_posts/2022-02-02-release-20222.markdown index 9e39e0e5072..d45996cb924 100644 --- a/source/_posts/2022-02-02-release-20222.markdown +++ b/source/_posts/2022-02-02-release-20222.markdown @@ -77,11 +77,11 @@ for the United States. 🎉 ### Improved infrastructure Nabu Casa's new payment system is part of revamped cloud system that they are -rolling out, and this will bring more improvements the Home Assistant Cloud +rolling out, and this will bring more improvements to the Home Assistant Cloud services. They already improved our remote access infrastructure to make sure it's routing -as close to you as possible. Last week they rolle rolled out improvements +as close to you as possible. Last week they rolled out improvements to the infrastructure that significantly improved the speed of the Google Assistant and Amazon Alexa integrations. @@ -95,7 +95,7 @@ Zack will be helping out on different aspects of Home Assistant, including the [Home Assistant YouTube channel](https://www.youtube.com/channel/UCbX3YkedQunLt7EQAdVxh7w), and the Home Assistant Frontend. -Mike is going to be focussing on extending and improving the Home Assistant +Mike is going to be focusing on extending and improving the Home Assistant Supervisor and the eco system around it (like its internal plugins and add-ons). Welcome! Excited to have you on board! 🎉 @@ -359,7 +359,7 @@ noteworthy changes this release: - Magic Home (also known as FluxLED) had lots of improvements of love from [@bdraco]! - [@Danielhiversen] added support for local access to Adax and Mill heaters. Nice! - Tuya now supports Pet Feeders (thanks [@vauriga]), Circuit Breakers (thanks [@slydiman]), - and Alarms (thanks [@leeyuentuen]). Additionally, support for Fans had been improved. + and Alarms (thanks [@leeyuentuen]). Additionally, support for Fans has been improved. - The generic thermostat integration now supports presets, thanks [@brianegge]! - Home Connect added support for refrigerators and cook processors, thanks [@BraveChicken1] and [@noxhirsch] @@ -411,7 +411,7 @@ And the following integrations now have entity categories: ## New Integrations -We welcome the following new integration this release: +We welcome the following new integrations this release: - [`input_button`][input_button docs], added by [@frenck] - [Aseko Pool Live][aseko_pool_live docs], added by [@milanmeu] @@ -470,7 +470,7 @@ The configuration of the Energy Dashboard has moved. Previously this was found as a menu item in the configuration screen, but has now been moved into the "Dashboard" menu item. -This keeps the configuration of all dashboard in a single place. +This keeps the configuration of all dashboards in a single place. ([@zsarnett] - [#11386]) @@ -484,7 +484,10 @@ This keeps the configuration of all dashboard in a single place. Python 3.8 support has previously been deprecated and now has been removed. Home Assistant now requires Python 3.9 to run. -If you are using Home Assistant OS, Home Assistant Container, or Home Assistant Supervised installation method, you don't have to do anything. In those cases, we all handle this for you. Your system has been using Python 3.9 for quite some time already. +If you are using Home Assistant OS, Home Assistant Container, or Home Assistant +Supervised installation method, you don't have to do anything. In those cases, +we handle this all for you. Your system has been using Python 3.9 for quite +some time already. ([@frenck] - [#63883]) @@ -492,15 +495,15 @@ If you are using Home Assistant OS, Home Assistant Container, or Home Assistant {% details "GPIO Integrations" %} -As of this release, all integration intefacing with GPIO directly, have been +As of this release, all integrations interfacing with GPIO directly, have been deprecated. There are multiple reasons for this, which includes a general low usage of -these integrations. For most Home Assistant installation, GPIO isn't easily -usable and more often the integrations are unmainted. +these integrations. For most Home Assistant installations, GPIO isn't easily +usable and more often the integrations are unmaintained. More information can be found in -[Architectural Decission Record 0019](https://github.com/home-assistant/architecture/blob/master/adr/0019-GPIO.md). +[Architectural Decision Record 0019](https://github.com/home-assistant/architecture/blob/master/adr/0019-GPIO.md). Additionally, there are many projects around that handle these purposes of GPIO better than Home Assistant. For example, our sister project ESPHome, or @@ -585,9 +588,9 @@ This means that: {% details "Fan/Humidifer/Light/Remote/Siren/Switch/Vacuum" %} -Previously, toggle-based entities (like `fan`, `light`, `switch`, `remote`, `siren`, `vacuum`, `humidifier`) could have the state `on` or `off`, and in case the device was unreachable: `unavailable`. However, compared to other entities, toggle entities aren't able to have an `unknown` state, this now has changed. +Previously, toggle-based entities (like `fan`, `light`, `switch`, `remote`, `siren`, `vacuum`, `humidifier`) could have the state `on` or `off`, and in case the device was unreachable: `unavailable`. However, compared to other entities, toggle entities weren't able to have an `unknown` state, this now has changed. -As of now, toggle-based entities can now have the `on`, `off`, `unavailable`, or `unknown` state. +As of now, toggle-based entities can have the `on`, `off`, `unavailable`, or `unknown` state. You might need to adapt your automations or scripts to take this new `unknown` state into account. @@ -597,7 +600,7 @@ You might need to adapt your automations or scripts to take this new `unknown` s {% details "Advantage Air" %} -The `advantage_air.set_myzone` service has been depreciated and will be removed +The `advantage_air.set_myzone` service has been deprecated and will be removed in a future version of Home Assistant. Please use the `select.select_option` service on the MyZone select entity to change this value on supported systems instead. @@ -623,7 +626,7 @@ release; and thus can be safely removed from your YAML configuration after upgra The `/api/discovery_info` endpoint was deprecated in 2021.10, and has since only returned blank values. From this version, the `/api/discovery_info` endpoint has -been removed completly. +been removed completely. ([@ludeeus] - [#64534]) ([api docs]) @@ -672,7 +675,7 @@ The previously deprecated YAML configuration of the AVM FRITZ!Box Tools integration has been removed. AVM FRITZ!Box Tools is now configured via the UI, any existing YAML -configurationhas been imported in previous releases and can now be safely +configuration has been imported in previous releases and can now be safely removed from your YAML configuration files. [@epenet] - [#63857]) ([fritz docs]) @@ -779,7 +782,7 @@ The previously deprecated YAML configuration of the DLNA Digital Media Renderer integration has been removed. DLNA Digital Media Renderer is now configured via the UI, any existing YAML -configurationhas been imported in previous releases and can now be safely +configuration has been imported in previous releases and can now be safely removed from your YAML configuration files. ([@tkdrob] - [#62344]) ([dlna_dmr docs]) @@ -862,7 +865,7 @@ YAML configuration files. The sensors no longer have `Timestamp` as an extra state attribute, instead, use the new `timestamp` sensor that can be used in automations that track state changes. -The sensors alert sensors (`advisories`, `endings`, `statements`, `warnings`, and `watches`) state is now a count of the number of active alerts for the sensor type +The alert sensors (`advisories`, `endings`, `statements`, `warnings`, and `watches`) state is now a count of the number of active alerts for the sensor type and the extra state attributes contain the alert text and alert timestamp. The attributes are named `alert_` and `alert_time_` where is 1 for alert 1, 2 for alert 2, etc. @@ -877,7 +880,7 @@ This is more a breaking change for custom integration developers. Now that all core fans are using the new fan entity model, the compatibility shim has been removed. Custom integrations that have not yet switched to the new -fan model. For more information see: +fan model may be affected. For more information see: @@ -938,7 +941,7 @@ The data associated with `foursquare.checkin` event is now available as a dictionary item with key "text". If you use this event in your automation or scripts, you'd need to adjust to -to match this change. +match this change. ([@epenet] - [#63982]) ([foursquare docs]) @@ -968,7 +971,7 @@ The previously deprecated YAML configuration of the Google Maps Travel Time integration has been removed. Google Maps Travel Time is now configured via the UI, any existing YAML -configurationhas been imported in previous releases and can now be safely +configuration has been imported in previous releases and can now be safely removed from your YAML configuration files. ([@tkdrob] - [#62468]) ([google_travel_time docs]) @@ -995,7 +998,7 @@ The previously deprecated YAML configuration of the Honeywell Total Connect Comf integration has been removed. Honeywell Total Connect Comfort is now configured via the UI, any existing YAML -configurationhas been imported in previous releases and can now be safely +configuration has been imported in previous releases and can now be safely removed from your YAML configuration files. @@ -1017,7 +1020,7 @@ The previously deprecated YAML configuration of the Keenetic NDMS2 Router integration has been removed. Keenetic NDMS2 Router is now configured via the UI, any existing YAML -configurationhas been imported in previous releases and can now be safely +configuration has been imported in previous releases and can now be safely removed from your YAML configuration files. ([@epenet] - [#63860]) ([keenetic_ndms2 docs]) @@ -1026,7 +1029,7 @@ removed from your YAML configuration files. {% details "Launch Library" %} -The Launch Libraryintegration migrated to configuration via the +The Launch Library integration migrated to configuration via the UI. Configuring Launch Library via YAML configuration has been deprecated and will be removed in a future Home Assistant release. @@ -1042,10 +1045,10 @@ changed to better describe what information they provide. (Ex. `agency` changed name to `provider` as this is the more correct terminology.) New attributes are added to give more information about where it takes place. -The `stream` attribute ios moved to the new sensor, and changed it's name to `stream_live` as it represent if the stream is live and not if a stream is +The `stream` attribute ios moved to the new sensor, and changed its name to `stream_live` as it represents if the stream is live and not if a stream is available. -And finally, the attribute `launch_time` moved into it's own sensor. This made +And finally, the attribute `launch_time` moved into its own sensor. This made it possible to add some information about the launch window start and end as attributes for the new sensor. This sensor will also contain the `stream_live` attribute. ([@DurgNomis-drol] - [#64203]) ([launch_library docs]) @@ -1062,7 +1065,7 @@ Your existing YAML configuration is automatically imported on upgrade to this release; and thus can be safely removed from your YAML configuration after upgrading. The [turn on action](/integrations/webostv/#turn-on-action) for turning on the -TV via `WakeOnLan` or `HDMI-CEC` was using a service call via YAML, the turn on action is changed to use a custom automation trigger `webostv.turn_on` or a device trigger automation that can be setup from the UI. +TV via `WakeOnLan` or `HDMI-CEC` was using a service call via YAML, and the turn on action is changed to use a custom automation trigger `webostv.turn_on` or a device trigger automation that can be setup from the UI. **Example trigger automation:** @@ -1087,7 +1090,7 @@ The previously deprecated YAML configuration of the Logitech Squeezebox integration has been removed. Logitech Squeezebox is now configured via the UI, any existing YAML -configurationhas been imported in previous releases and can now be safely +configuration has been imported in previous releases and can now be safely removed from your YAML configuration files. ([@tkdrob] - [#62537]) ([squeezebox docs]) @@ -1174,7 +1177,7 @@ The previously deprecated YAML configuration of the NETGEAR integration has been removed. NETGEAR is now configured via the UI, any existing YAML -configurationhas been imported in previous releases and can now be safely +configuration has been imported in previous releases and can now be safely removed from your YAML configuration files. ([@epenet] - [#63862]) ([netgear docs]) @@ -1200,7 +1203,7 @@ The previously deprecated YAML configuration of the Nmap Tracker integration has been removed. Nmap Tracker is now configured via the UI, any existing YAML -configurationhas been imported in previous releases and can now be safely +configuration has been imported in previous releases and can now be safely removed from your YAML configuration files. ([@epenet] - [#63863]) ([nmap_tracker docs]) @@ -1213,7 +1216,7 @@ The previously deprecated YAML configuration of the Nuki integration has been removed. Nuki is now configured via the UI, any existing YAML -configurationhas been imported in previous releases and can now be safely +configuration has been imported in previous releases and can now be safely removed from your YAML configuration files. ([@tkdrob] - [#62470]) ([nuki docs]) @@ -1239,7 +1242,7 @@ The previously deprecated YAML configuration of the Philips TV integration has been removed. Philips TV is now configured via the UI, any existing YAML -configurationhas been imported in previous releases and can now be safely +configuration has been imported in previous releases and can now be safely removed from your YAML configuration files. ([@tkdrob] - [#62471]) ([philips_js docs]) @@ -1268,7 +1271,7 @@ This applies to the following PVOutput attributes: - `temperature` - `voltage` -If you relied on these in your automation or scripts, you need to adopt those to use the new separate sensors instead. The attributes are currently available, however, deprecated and will be removed in Home Assistant Core 2022.4. +If you relied on these in your automation or scripts, you need to adapt those to use the new separate sensors instead. The attributes are currently available, however, deprecated and will be removed in Home Assistant Core 2022.4. ([@frenck] - [#62667] [#62894]) ([pvoutput docs]) @@ -1288,7 +1291,7 @@ The previously deprecated YAML configuration of the Stookalert integration has been removed. Stookalert is now configured via the UI, any existing YAML -configurationhas been imported in previous releases and can now be safely +configuration has been imported in previous releases and can now be safely removed from your YAML configuration files. ([@frenck] - [#61007]) ([stookalert docs]) @@ -1301,7 +1304,7 @@ The previously deprecated YAML configuration of the Samsung SyncThru Printer integration has been removed. Samsung SyncThru Printer is now configured via the UI, any existing YAML -configurationhas been imported in previous releases and can now be safely +configuration has been imported in previous releases and can now be safely removed from your YAML configuration files. ([@tkdrob] - [#62541]) ([syncthru docs]) @@ -1343,7 +1346,7 @@ The previously deprecated YAML configuration of the SMA Solar integration has been removed. SMA Solar is now configured via the UI, any existing YAML -configurationhas been imported in previous releases and can now be safely +configuration has been imported in previous releases and can now be safely removed from your YAML configuration files. ([@tkdrob] - [#62472]) ([sma docs]) @@ -1378,7 +1381,7 @@ can be safely removed from your YAML configuration. {% details "Synology DSM" %} -The `reboot` and `shutdown` services are deprecated and will be removed in future release. Please use the new button entities instead. +The `reboot` and `shutdown` services are deprecated and will be removed in a future release. Please use the new button entities instead. ([@mib1185] - [#57352]) ([synology_dsm docs]) (breaking-change) @@ -1399,7 +1402,7 @@ The previously deprecated YAML configuration of the TP-Link Kasa Smart integration has been removed. TP-Link Kasa Smart is now configured via the UI, any existing YAML -configurationhas been imported in previous releases and can now be safely +configuration has been imported in previous releases and can now be safely removed from your YAML configuration files. ([@bdraco] - [#62457]) ([tplink docs]) @@ -1408,8 +1411,8 @@ removed from your YAML configuration files. {% details "Trafikverket Train" %} -The planned time, estimated time and and actual time sensor attributes have -been correct to be UTC isoformatted string which is standard in Home Assistant. +The planned time, estimated time and actual time sensor attributes have +been corrected to be UTC isoformatted strings which is standard in Home Assistant. Previously displayed as `2021-12-23T09:07:00` and now correctly set as `2021-12-23T09:07:00+00:00`. @@ -1504,7 +1507,7 @@ The previously deprecated YAML configuration of the VLC media player Telnet integration has been removed. VLC media player Telnet is now configured via the UI, any existing YAML -configurationhas been imported in previous releases and can now be safely +configuration has been imported in previous releases and can now be safely removed from your YAML configuration files. ([@tkdrob] - [#62542]) ([vlc_telnet docs]) @@ -1517,7 +1520,7 @@ The previously deprecated YAML configuration of the Waze Travel Time integration has been removed. Waze Travel Time is now configured via the UI, any existing YAML -configurationhas been imported in previous releases and can now be safely +configuration has been imported in previous releases and can now be safely removed from your YAML configuration files. ([@tkdrob] - [#62543]) ([waze_travel_time docs]) @@ -1551,7 +1554,7 @@ release; and thus can be safely removed from your YAML configuration after upgra Due to a schema change, `zwave-js-server` version 1.14.0 or greater is required. Ensure you are using the latest version of `zwave-js-server` (or the add-ons -that provides those). +that provide those). ([@raman325] - [#64407]) ([zwave_js docs]) @@ -1592,7 +1595,7 @@ The following integrations are no longer available as of this release: ([@iMicknl] - [#62607]) - **Arduino** the now long time deprecated integration has been removed. ([@frenck] - [#63406]) -- **EE Bright Box** has been broken en disabled for over a year now. +- **EE Bright Box** has been broken and disabled for over a year now. It has now been removed. ([@epenet] - [#63839]) ## All changes From 97bae109ad6317515bbaecb6c5b91729ff3e60bc Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 2 Feb 2022 18:59:51 +0100 Subject: [PATCH 247/247] 2022.2.0: Update changelog --- .../_posts/2022-02-02-release-20222.markdown | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/source/_posts/2022-02-02-release-20222.markdown b/source/_posts/2022-02-02-release-20222.markdown index d45996cb924..44d0d93cf7f 100644 --- a/source/_posts/2022-02-02-release-20222.markdown +++ b/source/_posts/2022-02-02-release-20222.markdown @@ -3814,6 +3814,29 @@ The following integrations are no longer available as of this release: - Bump zeroconf to 0.38.3 ([@bdraco] - [#65341]) ([zeroconf docs]) (beta fix) - Add diagnostics for SamsungTV ([@chemelli74] - [#65342]) ([samsungtv docs]) (beta fix) - I zone, you zone, we zoning ([@balloob] - [#65344]) ([zone docs]) (beta fix) +- Fix MotionEye config flow ([@ZuluWhiskey] - [#64360]) ([motioneye docs]) (beta fix) +- Fix honeywell hold mode ([@schreyack] - [#65327]) ([honeywell docs]) (beta fix) +- Simplify unifi cleanup logic ([@balloob] - [#65345]) ([unifi docs]) (beta fix) +- Improve CastProtocol ([@emontnemery] - [#65357]) ([cast docs]) ([plex docs]) (beta fix) +- Fix options for dnsip ([@gjohansson-ST] - [#65369]) ([dnsip docs]) (beta fix) +- Allow removing keys from automation ([@bramkragten] - [#65374]) ([config docs]) (beta fix) +- Fix wan_access switch for disconnected devices in Fritz!Tools ([@mib1185] - [#65378]) ([fritz docs]) (beta fix) +- Redact host address in UniFi diagnostics ([@Kane610] - [#65379]) ([unifi docs]) (beta fix) +- Bump frontend to 20220201.0 ([@balloob] - [#65380]) ([frontend docs]) (beta fix) +- Report unmet dependencies for failing config flows ([@emontnemery] - [#65061]) (beta fix) +- Fix MQTT expire_after effects after reloading ([@jbouwh] - [#65359]) ([mqtt docs]) (beta fix) +- Handle brightness being None for senseme ([@bdraco] - [#65372]) ([senseme docs]) (beta fix) +- Detect battery-operated Sonos devices going offline ([@jjlawren] - [#65382]) ([sonos docs]) (beta fix) +- Fix disconnect bug in Apple TV integration ([@postlund] - [#65385]) ([apple_tv docs]) (beta fix) +- Sort Apple TV app list by name ([@postlund] - [#65386]) ([apple_tv docs]) (beta fix) +- Fix Sonos diagnostics with offline device ([@jjlawren] - [#65393]) ([sonos docs]) (beta fix) +- Bump lutron_caseta to 0.13.1 to fix setup when no button devices are present ([@bdraco] - [#65400]) ([lutron_caseta docs]) (beta fix) +- Ensure unifiprotect discovery can be ignored ([@bdraco] - [#65406]) ([unifiprotect docs]) (beta fix) +- Bump aladdin_connect to 0.4 to fix integration for some users due to API changes ([@shoejosh] - [#65407]) ([aladdin_connect docs]) (beta fix) +- Don't warn on time.sleep injected by the debugger ([@emontnemery] - [#65420]) (beta fix) +- Bump velbus-aio to 2022.2.1 ([@Cereal2nd] - [#65422]) ([velbus docs]) (beta fix) +- Stringify MQTT payload in mqtt/debug/info WS response ([@emontnemery] - [#65429]) ([mqtt docs]) (beta fix) +- Update frontend to 20220202.0 ([@bramkragten] - [#65432]) ([frontend docs]) (beta fix) {% enddetails %} @@ -5515,6 +5538,7 @@ The following integrations are no longer available as of this release: [#64354]: https://github.com/home-assistant/core/pull/64354 [#64355]: https://github.com/home-assistant/core/pull/64355 [#64358]: https://github.com/home-assistant/core/pull/64358 +[#64360]: https://github.com/home-assistant/core/pull/64360 [#64367]: https://github.com/home-assistant/core/pull/64367 [#64368]: https://github.com/home-assistant/core/pull/64368 [#64374]: https://github.com/home-assistant/core/pull/64374 @@ -5945,6 +5969,7 @@ The following integrations are no longer available as of this release: [#65056]: https://github.com/home-assistant/core/pull/65056 [#65059]: https://github.com/home-assistant/core/pull/65059 [#65060]: https://github.com/home-assistant/core/pull/65060 +[#65061]: https://github.com/home-assistant/core/pull/65061 [#65065]: https://github.com/home-assistant/core/pull/65065 [#65069]: https://github.com/home-assistant/core/pull/65069 [#65072]: https://github.com/home-assistant/core/pull/65072 @@ -6021,6 +6046,7 @@ The following integrations are no longer available as of this release: [#65320]: https://github.com/home-assistant/core/pull/65320 [#65322]: https://github.com/home-assistant/core/pull/65322 [#65324]: https://github.com/home-assistant/core/pull/65324 +[#65327]: https://github.com/home-assistant/core/pull/65327 [#65332]: https://github.com/home-assistant/core/pull/65332 [#65334]: https://github.com/home-assistant/core/pull/65334 [#65335]: https://github.com/home-assistant/core/pull/65335 @@ -6029,6 +6055,26 @@ The following integrations are no longer available as of this release: [#65341]: https://github.com/home-assistant/core/pull/65341 [#65342]: https://github.com/home-assistant/core/pull/65342 [#65344]: https://github.com/home-assistant/core/pull/65344 +[#65345]: https://github.com/home-assistant/core/pull/65345 +[#65357]: https://github.com/home-assistant/core/pull/65357 +[#65359]: https://github.com/home-assistant/core/pull/65359 +[#65369]: https://github.com/home-assistant/core/pull/65369 +[#65372]: https://github.com/home-assistant/core/pull/65372 +[#65374]: https://github.com/home-assistant/core/pull/65374 +[#65378]: https://github.com/home-assistant/core/pull/65378 +[#65379]: https://github.com/home-assistant/core/pull/65379 +[#65380]: https://github.com/home-assistant/core/pull/65380 +[#65382]: https://github.com/home-assistant/core/pull/65382 +[#65385]: https://github.com/home-assistant/core/pull/65385 +[#65386]: https://github.com/home-assistant/core/pull/65386 +[#65393]: https://github.com/home-assistant/core/pull/65393 +[#65400]: https://github.com/home-assistant/core/pull/65400 +[#65406]: https://github.com/home-assistant/core/pull/65406 +[#65407]: https://github.com/home-assistant/core/pull/65407 +[#65420]: https://github.com/home-assistant/core/pull/65420 +[#65422]: https://github.com/home-assistant/core/pull/65422 +[#65429]: https://github.com/home-assistant/core/pull/65429 +[#65432]: https://github.com/home-assistant/core/pull/65432 [@ANMalko]: https://github.com/ANMalko [@Adminiuga]: https://github.com/Adminiuga [@Aeroid]: https://github.com/Aeroid @@ -6079,6 +6125,7 @@ The following integrations are no longer available as of this release: [@ThomDietrich]: https://github.com/ThomDietrich [@TomBrien]: https://github.com/TomBrien [@ZephireNZ]: https://github.com/ZephireNZ +[@ZuluWhiskey]: https://github.com/ZuluWhiskey [@agners]: https://github.com/agners [@ajschmidt8]: https://github.com/ajschmidt8 [@albertogeniola]: https://github.com/albertogeniola @@ -6216,9 +6263,11 @@ The following integrations are no longer available as of this release: [@rsteckler]: https://github.com/rsteckler [@rytilahti]: https://github.com/rytilahti [@sagioto]: https://github.com/sagioto +[@schreyack]: https://github.com/schreyack [@scop]: https://github.com/scop [@sebfortier2288]: https://github.com/sebfortier2288 [@shbatm]: https://github.com/shbatm +[@shoejosh]: https://github.com/shoejosh [@simontegelid]: https://github.com/simontegelid [@slovdahl]: https://github.com/slovdahl [@slydiman]: https://github.com/slydiman