From 1cc8cf46977d856e688d83e285ea73e239de9012 Mon Sep 17 00:00:00 2001 From: seanauff Date: Mon, 27 Jul 2020 01:49:26 -0400 Subject: [PATCH 01/40] fix typo in mg/dL unit (#14088) --- source/_integrations/dexcom.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/dexcom.markdown b/source/_integrations/dexcom.markdown index fac49d00d44..6771e3db619 100644 --- a/source/_integrations/dexcom.markdown +++ b/source/_integrations/dexcom.markdown @@ -29,7 +29,7 @@ There are two Dexcom Share servers, `US` for United States customers, and `OUS` #### Unit of measurement -The integrations allows both `md/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** >> **Integrations** in the UI, and click `OPTIONS`. ### Sensor From a69fbc07334ed71864b528f933e797e77c3b3a4e Mon Sep 17 00:00:00 2001 From: Elias Hunt Date: Mon, 27 Jul 2020 01:52:28 -0400 Subject: [PATCH 02/40] Update discovery.markdown (#14087) Noted MQTT Discovery support by WyzeSense2MQTT project --- source/_docs/mqtt/discovery.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_docs/mqtt/discovery.markdown b/source/_docs/mqtt/discovery.markdown index 6e6df14030b..442a6d82579 100644 --- a/source/_docs/mqtt/discovery.markdown +++ b/source/_docs/mqtt/discovery.markdown @@ -271,6 +271,7 @@ The following software has built-in support for MQTT discovery: - [Zigbee2mqtt](https://github.com/koenkk/zigbee2mqtt) - [Zwave2Mqtt](https://github.com/OpenZWave/Zwave2Mqtt) (starting with 2.0.1) - [IOTLink](https://iotlink.gitlab.io) (starting with 2.0.0) +- [WyzeSense2MQTT](https://github.com/raetha/wyzesense2mqtt) ## Examples From a31f0cc4e7fb384c0912f2f7865df7bb2b1e963b Mon Sep 17 00:00:00 2001 From: Joakim Plate Date: Mon, 27 Jul 2020 07:54:38 +0200 Subject: [PATCH 03/40] Attempt to update documentation about how to setup lights vs switches (#14082) --- source/_integrations/rfxtrx.markdown | 88 ++++++++++++++++++++-------- 1 file changed, 64 insertions(+), 24 deletions(-) diff --git a/source/_integrations/rfxtrx.markdown b/source/_integrations/rfxtrx.markdown index 4f79946bc66..03496ba1a1f 100644 --- a/source/_integrations/rfxtrx.markdown +++ b/source/_integrations/rfxtrx.markdown @@ -235,34 +235,30 @@ The [RFXtrx433e](http://www.rfxcom.com/RFXtrx433E-USB-43392MHz-Transceiver/en) i The `rfxtrx` platform support lights that communicate in the frequency range of 433.92 MHz. +Make sure you trigger a dimming command to get switches detected as lights otherwise, they will show up as switches. + +#### Convert switch event to dimming event + +To convert a standard switch to a light, use the [Light Switch](integrations/light.switch/) component. + +To convert a switch to a dimmable light, make sure the event contain a dimming command. You can usually convert a command by changing one byte. + +*ARC:*
+0b11000248bc0cfe09 **01** 0f70
+0b11000248bc0cfe09 **02** 0f70 + +*LightwaveRF:*
+0a14000101f20302 **01** 0080
+0a14000101f20302 **10** 0080 + +*Waveman:*
+710030e4102 **01** 50
+710030e4102 **02** 50 + ### Switches The `rfxtrx` platform support switches that communicate in the frequency range of 433.92 MHz. -#### Generate codes - -If you need to generate codes for devices, you can use a template (useful for example for COCO switches). - -- Go to home-assistant-IP:8123/dev-template -- Use this code to generate a code: - -{% raw %} - -```yaml -# for switches -0b11000{{ range(100,700) | random | int }}bc0cfe0{{ range(0,10) | random | int }}010f70 - -# for dimmers change 010f70 to 020f70 e.g. -0b11000{{ range(100,700) | random | int }}bc0cfe0{{ range(0,10) | random | int }}020f70 -``` - -{% endraw %} - -- Use this code to add a new device in your `configuration.yaml`. -- Launch your Home Assistant and go to the website. -- Enable learning mode on your switch (i.e., push learn button or plug it in a wall socket) -- Toggle your new device in the Home Assistant interface - ### Sensors The `rfxtrx` platform support sensors that communicate in the frequency range of 433.92 MHz. @@ -486,3 +482,47 @@ action: data: event: 0b1111e003af16aa10000060 ``` + + +## Generate codes + +If you need to generate codes for switches and lights, you can use a template (useful for example COCO switches). + +- Go to home-assistant-IP:8123/dev-template +- Use the follwing codes to generate an event: + +*Switch: ARC* + +{% raw %} + +```yaml +0b11000{{ range(100,700) | random | int }}bc0cfe0{{ range(0,10) | random | int }}010f70 +``` + +{% endraw %} + +*Light: ARC* + +{% raw %} + +```yaml +0b11000{{ range(100,700) | random | int }}bc0cfe0{{ range(0,10) | random | int }}020f70 +``` + +{% endraw %} + + +*Light: Lightwave RF* +{% raw %} + +```yaml +0a14000{{ range(100,700) | random | int }}bc0cf{{ range(0,10) | random | int }}100f70 +``` + +{% endraw %} + + +- Use this code to add a new switch in your `configuration.yaml`. +- Launch your Home Assistant and go to the website. +- Enable learning mode on your switch (i.e., push learn button or plug it in a wall socket) +- Toggle your new switch in the Home Assistant interface From f6d106d535324769ca1f155ad496fa9812225479 Mon Sep 17 00:00:00 2001 From: Daniel Shokouhi Date: Sun, 26 Jul 2020 22:55:43 -0700 Subject: [PATCH 04/40] Amcrest features need to be enabled in order for them to work properly. (#14079) --- source/_integrations/amcrest.markdown | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/_integrations/amcrest.markdown b/source/_integrations/amcrest.markdown index 3ae14560ee1..475808872c8 100644 --- a/source/_integrations/amcrest.markdown +++ b/source/_integrations/amcrest.markdown @@ -106,13 +106,13 @@ binary_sensors: default: None keys: audio_detected: - description: "Return `on` when audio is detected, `off` when not. Uses streaming method (see [below](#streaming-vs-polled-binary-sensors))." + description: "Return `on` when audio is detected, `off` when not. In order to use this feature you must enable it in your cameras interface under Settings > Events > Audio Detection. Uses streaming method (see [below](#streaming-vs-polled-binary-sensors))." audio_detected_polled: - description: "Return `on` when audio is detected, `off` when not. Uses polled method (see [below](#streaming-vs-polled-binary-sensors))." + description: "Return `on` when audio is detected, `off` when not. In order to use this feature you must enable it in your cameras interface under Settings > Events > Audio Detection. Uses polled method (see [below](#streaming-vs-polled-binary-sensors))." motion_detected: - description: "Return `on` when a motion is detected, `off` when not. Uses streaming method (see [below](#streaming-vs-polled-binary-sensors))." + description: "Return `on` when a motion is detected, `off` when not. Motion detection is enabled by default for most cameras, if this functionality is not working check that it is enabled in Settings > Events > Video Detection. Uses streaming method (see [below](#streaming-vs-polled-binary-sensors))." motion_detected_polled: - description: "Return `on` when a motion is detected, `off` when not. Uses polled method (see [below](#streaming-vs-polled-binary-sensors))." + description: "Return `on` when a motion is detected, `off` when not. Motion detection is enabled by default for most cameras, if this functionality is not working check that it is enabled in Settings > Events > Video Detection. Uses polled method (see [below](#streaming-vs-polled-binary-sensors))." online: description: "Return `on` when camera is available (i.e., responding to commands), `off` when not." sensors: From 59055ba543859707edba346b9c438b276e464917 Mon Sep 17 00:00:00 2001 From: SNoof85 Date: Tue, 28 Jul 2020 09:12:38 +0200 Subject: [PATCH 05/40] Adding new supported Freebox router (#14097) * Adding new supported router * Typo --- source/_integrations/freebox.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_integrations/freebox.markdown b/source/_integrations/freebox.markdown index e12e7e4f2a5..36b3a293fa4 100644 --- a/source/_integrations/freebox.markdown +++ b/source/_integrations/freebox.markdown @@ -79,6 +79,7 @@ To make the Wi-Fi switch and the reboot service working you will have to add "Mo Only the routers with Freebox OS are supported: +* Freebox V8 also known as Freebox Pop * Freebox V7 also known as Freebox Delta * Freebox V6 also known as Freebox Revolution * Freebox mini 4k From ffa51dd4efa0efcf5988e52ab6fc85e8ba670e07 Mon Sep 17 00:00:00 2001 From: Chris <31055115+darthsebulba04@users.noreply.github.com> Date: Tue, 28 Jul 2020 06:50:14 -0400 Subject: [PATCH 06/40] Update foscam_away_mode_PTZ.markdown (#14096) Updates curl commands to work with newer cameras and in HASSIO environment. --- source/_cookbook/foscam_away_mode_PTZ.markdown | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/_cookbook/foscam_away_mode_PTZ.markdown b/source/_cookbook/foscam_away_mode_PTZ.markdown index c5460a41cb9..400e08573c6 100644 --- a/source/_cookbook/foscam_away_mode_PTZ.markdown +++ b/source/_cookbook/foscam_away_mode_PTZ.markdown @@ -19,9 +19,9 @@ switch: switches: #Switch for Foscam Motion Detection foscam_motion: - command_on: 'curl -k "https://ipaddress:443/cgi-bin/CGIProxy.fcgi?cmd=setMotionDetectConfig&isEnable=1&usr=admin&pwd=password"' - command_off: 'curl -k "https://ipaddress:443/cgi-bin/CGIProxy.fcgi?cmd=setMotionDetectConfig&isEnable=0&usr=admin&pwd=password"' - command_state: 'curl -k --silent "https://ipaddress:443/cgi-bin/CGIProxy.fcgi?cmd=getMotionDetectConfig&usr=admin&pwd=password" | grep -oP "(?<=isEnable>).*?(?=)"' + command_on: 'curl -k --tls-max 1.2 "https://ipaddress:443/cgi-bin/CGIProxy.fcgi?cmd=setMotionDetectConfig&isEnable=1&usr=admin&pwd=password"' + command_off: 'curl -k --tls-max 1.2 "https://ipaddress:443/cgi-bin/CGIProxy.fcgi?cmd=setMotionDetectConfig&isEnable=0&usr=admin&pwd=password"' + command_state: 'curl -k --silent --tls-max 1.2 "https://ipaddress:443/cgi-bin/CGIProxy.fcgi?cmd=getMotionDetectConfig&usr=admin&pwd=password" | grep "isEnable" | cut -b 15' value_template: '{% raw %}{{ value == "1" }}{% endraw %}' ``` @@ -30,9 +30,9 @@ The service `shell_command.foscam_turn_off` sets the camera to point down and aw ```yaml shell_command: #Created a preset point in Foscam Web Interface named Off which essentially points the camera down and away - foscam_turn_off: 'curl -k "https://ipaddress:443/cgi-bin/CGIProxy.fcgi?cmd=ptzGotoPresetPoint&name=Off&usr=admin&pwd=password"' + foscam_turn_off: 'curl -k --tls-max 1.2 "https://ipaddress:443/cgi-bin/CGIProxy.fcgi?cmd=ptzGotoPresetPoint&name=Off&usr=admin&pwd=password"' #Created a preset point in Foscam Web Interface named Main which points in the direction I would like to record - foscam_turn_on: 'curl -k "https://ipaddress:443/cgi-bin/CGIProxy.fcgi?cmd=ptzGotoPresetPoint&name=Main&usr=admin&pwd=password"' + foscam_turn_on: 'curl -k --tls-max 1.2 "https://ipaddress:443/cgi-bin/CGIProxy.fcgi?cmd=ptzGotoPresetPoint&name=Main&usr=admin&pwd=password"' ``` The `script.foscam_off` and `script.foscam_on` can be used to set the motion detection appropriately, and then move the camera. These scripts can be called as part of an automation with `device_tracker` triggers to set `home` and `not_home` modes for your Foscam and disable motion detection recording while `home`. From fcb1f4c0a03b6f58e5f922b72da0d4854e71d464 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Jul 2020 12:50:39 +0200 Subject: [PATCH 07/40] Bump textlint from 11.6.3 to 11.7.6 (#14095) Bumps [textlint](https://github.com/textlint/textlint) from 11.6.3 to 11.7.6. - [Release notes](https://github.com/textlint/textlint/releases) - [Commits](https://github.com/textlint/textlint/compare/textlint@11.6.3...textlint@11.7.6) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 434 +++++++++++++++++++++++++--------------------- package.json | 2 +- 2 files changed, 238 insertions(+), 198 deletions(-) diff --git a/package-lock.json b/package-lock.json index cb3851d676c..65551325e07 100644 --- a/package-lock.json +++ b/package-lock.json @@ -104,40 +104,56 @@ "dev": true }, "@textlint/ast-tester": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@textlint/ast-tester/-/ast-tester-2.1.6.tgz", - "integrity": "sha512-i+UrSKZXs561g8LXsCBkgpNYkgBS3T3Pif2/+DraZmSKpQ2r2D1yCOdH82IGPWWpQ/GMSg6Z0qpLJpjnYz+bpg==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@textlint/ast-tester/-/ast-tester-2.2.4.tgz", + "integrity": "sha512-676xpY3/+Xa+tPaiUPaD4sl//+p3xsnSPYLrQjSmHWXX78F3MwAWd/Lek+SCn4wwvf1tCIx0SPtjfOCa6ru8qw==", "dev": true, "requires": { - "@textlint/ast-node-types": "^4.2.5" + "@textlint/ast-node-types": "^4.3.4" + }, + "dependencies": { + "@textlint/ast-node-types": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-4.3.4.tgz", + "integrity": "sha512-Grq+vJuNH7HCa278eFeiqJvowrD+onMCoG2ctLyoN+fXYIQGIr1/8fo8AcIg+VM16Kga+N6Y1UWNOWPd8j1nFg==", + "dev": true + } } }, "@textlint/ast-traverse": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@textlint/ast-traverse/-/ast-traverse-2.1.7.tgz", - "integrity": "sha512-73Nw0R4TaskPmF36Hop1DZ8AbH339WrGiLQjzbOLaXHaBHQ4hdNw28UMlw4glfPZb7/zvxPcJRtg9AB8F3ZW0g==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@textlint/ast-traverse/-/ast-traverse-2.2.5.tgz", + "integrity": "sha512-YduGVn7iaUYOfo7TwHO4b0K/qQpj61Ol/M884ck3vetNd0zBxpHO3GpQKW87SZGGtlsBa9v5Suz/yypnlPo3Og==", "dev": true, "requires": { - "@textlint/ast-node-types": "^4.2.5" + "@textlint/ast-node-types": "^4.3.4" + }, + "dependencies": { + "@textlint/ast-node-types": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-4.3.4.tgz", + "integrity": "sha512-Grq+vJuNH7HCa278eFeiqJvowrD+onMCoG2ctLyoN+fXYIQGIr1/8fo8AcIg+VM16Kga+N6Y1UWNOWPd8j1nFg==", + "dev": true + } } }, "@textlint/feature-flag": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@textlint/feature-flag/-/feature-flag-3.1.6.tgz", - "integrity": "sha512-R2s027/WG3zhCMHZG79OhRFmkSL2ghwvFYg/W+2VUva5aYC8i9yeuwRyWt7m83tP1qlI+bq7j3S04fyn6yNheg==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@textlint/feature-flag/-/feature-flag-3.2.4.tgz", + "integrity": "sha512-ABhbZ5rfkwa/kTBFxVmeMzE1flcnUjLJ5LTZvOaxH/pElfLLN1J4FEmAZTRCvXGAB498II6nkM2CqcikbKzh6A==", "dev": true, "requires": { "map-like": "^2.0.0" } }, "@textlint/fixer-formatter": { - "version": "3.1.13", - "resolved": "https://registry.npmjs.org/@textlint/fixer-formatter/-/fixer-formatter-3.1.13.tgz", - "integrity": "sha512-FXqAJZ+5fLsOZjvFmn1JhCer8gQI4ZQk3R45bXizRJm6DASByPAGGh/MAQxxHSGeR5wR8miO/koxA2BrS8OhAw==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@textlint/fixer-formatter/-/fixer-formatter-3.2.5.tgz", + "integrity": "sha512-fh6XiLbX9WF8+79g20qb1I85k/Yc9+h7LRccmaLzTBjVQDNYxX5BtfvGsY0Vf5tBZKT2xFZH4eSLH/EWoL3weg==", "dev": true, "requires": { - "@textlint/module-interop": "^1.0.2", - "@textlint/types": "^1.3.1", + "@textlint/module-interop": "^1.1.4", + "@textlint/types": "^1.4.5", "chalk": "^1.1.3", "debug": "^4.1.1", "diff": "^4.0.1", @@ -148,6 +164,21 @@ "try-resolve": "^1.0.1" }, "dependencies": { + "@textlint/ast-node-types": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-4.3.4.tgz", + "integrity": "sha512-Grq+vJuNH7HCa278eFeiqJvowrD+onMCoG2ctLyoN+fXYIQGIr1/8fo8AcIg+VM16Kga+N6Y1UWNOWPd8j1nFg==", + "dev": true + }, + "@textlint/types": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@textlint/types/-/types-1.4.5.tgz", + "integrity": "sha512-7pA1rdiw1jsDNGwxupMC6fPlRNAHY6fKZ3s+jAY53o6RroOSR+5qO0sAjJ26lsSOhveH8imZzyyD08dk58IVJQ==", + "dev": true, + "requires": { + "@textlint/ast-node-types": "^4.3.4" + } + }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -215,23 +246,6 @@ } } }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - } - } - }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", @@ -241,33 +255,50 @@ } }, "@textlint/kernel": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@textlint/kernel/-/kernel-3.2.1.tgz", - "integrity": "sha512-gMCgP/tAjCX8dGqgu7nhUwaDC/TzDKeRZb9qa50nqbnILRasKplj3lOWn2osZdkScVZPLQp+al1pDh9pU4D+Dw==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/@textlint/kernel/-/kernel-3.3.6.tgz", + "integrity": "sha512-M2ciQDAo5W6rpRADzGnMXyxhvJ+lnqYG9iHrqmfDQ2MA0VcolWuA37H67/UstqTs3NYaGC7RZkq9FAV//pl30w==", "dev": true, "requires": { - "@textlint/ast-node-types": "^4.2.5", - "@textlint/ast-tester": "^2.1.6", - "@textlint/ast-traverse": "^2.1.7", - "@textlint/feature-flag": "^3.1.6", - "@textlint/types": "^1.3.1", - "@textlint/utils": "^1.0.3", + "@textlint/ast-node-types": "^4.3.4", + "@textlint/ast-tester": "^2.2.4", + "@textlint/ast-traverse": "^2.2.5", + "@textlint/feature-flag": "^3.2.4", + "@textlint/types": "^1.4.5", + "@textlint/utils": "^1.1.4", "debug": "^4.1.1", - "deep-equal": "^1.1.0", + "deep-equal": "^1.1.1", "map-like": "^2.0.0", "structured-source": "^3.0.2" + }, + "dependencies": { + "@textlint/ast-node-types": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-4.3.4.tgz", + "integrity": "sha512-Grq+vJuNH7HCa278eFeiqJvowrD+onMCoG2ctLyoN+fXYIQGIr1/8fo8AcIg+VM16Kga+N6Y1UWNOWPd8j1nFg==", + "dev": true + }, + "@textlint/types": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@textlint/types/-/types-1.4.5.tgz", + "integrity": "sha512-7pA1rdiw1jsDNGwxupMC6fPlRNAHY6fKZ3s+jAY53o6RroOSR+5qO0sAjJ26lsSOhveH8imZzyyD08dk58IVJQ==", + "dev": true, + "requires": { + "@textlint/ast-node-types": "^4.3.4" + } + } } }, "@textlint/linter-formatter": { - "version": "3.1.12", - "resolved": "https://registry.npmjs.org/@textlint/linter-formatter/-/linter-formatter-3.1.12.tgz", - "integrity": "sha512-OEP4pklu01MEgBJrftD9vwe3HFx+jhiEe1JFIgf7GZ4a0fSer5vQWXBo5wHW6WtZtSa+iLBsLC3mI5VMeshzdA==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@textlint/linter-formatter/-/linter-formatter-3.2.5.tgz", + "integrity": "sha512-oy5RcBWrC2d7r0Mjw/FBH8cvQuOaCB5PeOPG0Pp44Yr5JbIGLXfh84umHQOTCmxfRxw3ccnUfA9wjbxuL8rWOQ==", "dev": true, "requires": { "@azu/format-text": "^1.0.1", "@azu/style-format": "^1.0.0", - "@textlint/module-interop": "^1.0.2", - "@textlint/types": "^1.3.1", + "@textlint/module-interop": "^1.1.4", + "@textlint/types": "^1.4.5", "chalk": "^1.0.0", "concat-stream": "^1.5.1", "debug": "^4.1.1", @@ -276,7 +307,6 @@ "optionator": "^0.8.1", "pluralize": "^2.0.0", "string-width": "^1.0.1", - "string.prototype.padstart": "^3.0.0", "strip-ansi": "^6.0.0", "table": "^3.7.8", "text-table": "^0.2.0", @@ -284,6 +314,21 @@ "xml-escape": "^1.0.0" }, "dependencies": { + "@textlint/ast-node-types": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-4.3.4.tgz", + "integrity": "sha512-Grq+vJuNH7HCa278eFeiqJvowrD+onMCoG2ctLyoN+fXYIQGIr1/8fo8AcIg+VM16Kga+N6Y1UWNOWPd8j1nFg==", + "dev": true + }, + "@textlint/types": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@textlint/types/-/types-1.4.5.tgz", + "integrity": "sha512-7pA1rdiw1jsDNGwxupMC6fPlRNAHY6fKZ3s+jAY53o6RroOSR+5qO0sAjJ26lsSOhveH8imZzyyD08dk58IVJQ==", + "dev": true, + "requires": { + "@textlint/ast-node-types": "^4.3.4" + } + }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -387,23 +432,6 @@ "safe-buffer": "~5.1.0" } }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - } - } - }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", @@ -413,12 +441,12 @@ } }, "@textlint/markdown-to-ast": { - "version": "6.1.7", - "resolved": "https://registry.npmjs.org/@textlint/markdown-to-ast/-/markdown-to-ast-6.1.7.tgz", - "integrity": "sha512-B0QtokeQR4a9+4q0NQr8T9l7A1fFihTN5Ze57tVgqW+3ymzXEouh8DvPHeNQ4T6jEkAThvdjk95mxAMpGRJ79w==", + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/@textlint/markdown-to-ast/-/markdown-to-ast-6.2.5.tgz", + "integrity": "sha512-9vlQbylGjnnRGev3yt9ntNy6I9FQH3p+MkbijybKnwobK/msoAX9sThDHOMbGM24PsUHxcDjktDlj2vHN/pwDA==", "dev": true, "requires": { - "@textlint/ast-node-types": "^4.2.5", + "@textlint/ast-node-types": "^4.3.4", "debug": "^4.1.1", "remark-frontmatter": "^1.2.0", "remark-parse": "^5.0.0", @@ -427,6 +455,12 @@ "unified": "^6.1.6" }, "dependencies": { + "@textlint/ast-node-types": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-4.3.4.tgz", + "integrity": "sha512-Grq+vJuNH7HCa278eFeiqJvowrD+onMCoG2ctLyoN+fXYIQGIr1/8fo8AcIg+VM16Kga+N6Y1UWNOWPd8j1nFg==", + "dev": true + }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", @@ -516,36 +550,44 @@ } }, "@textlint/module-interop": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@textlint/module-interop/-/module-interop-1.0.2.tgz", - "integrity": "sha512-qQ6dqlg4SYywCywimIbkveQZu1MG6ugf6fcJuWDi3D51FbdkSRsMrPusJ1YoW6Y3XBp0ww9fJjXWtlUStGeQsw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@textlint/module-interop/-/module-interop-1.1.4.tgz", + "integrity": "sha512-9M3kYG5nBoD2lhp05sqi6fieNU6rBcf+A8Trp+4d8o5uJ4RRsWeRtAQMWM7Tv15onqIITRq7fm3la7xovVB9KA==", "dev": true }, "@textlint/text-to-ast": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@textlint/text-to-ast/-/text-to-ast-3.1.7.tgz", - "integrity": "sha512-CBAEQmiEa2G/wonlLr1HgUtXfTSas6OGGvYGRIRMJweNh5Ilhbz2nM2/9XQMfLQbdn5pGYrAAAQRB2+/9fZ31A==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@textlint/text-to-ast/-/text-to-ast-3.2.4.tgz", + "integrity": "sha512-uIiNg52OdQ3Fn8aOYaV7BLW2QakNsmf4doypIwrW4q+gHYQ3jxdPHHkq6RxuYoO112vO40M3zmAoEZmM1qmPhw==", "dev": true, "requires": { - "@textlint/ast-node-types": "^4.2.5" + "@textlint/ast-node-types": "^4.3.4" + }, + "dependencies": { + "@textlint/ast-node-types": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-4.3.4.tgz", + "integrity": "sha512-Grq+vJuNH7HCa278eFeiqJvowrD+onMCoG2ctLyoN+fXYIQGIr1/8fo8AcIg+VM16Kga+N6Y1UWNOWPd8j1nFg==", + "dev": true + } } }, "@textlint/textlint-plugin-markdown": { - "version": "5.1.12", - "resolved": "https://registry.npmjs.org/@textlint/textlint-plugin-markdown/-/textlint-plugin-markdown-5.1.12.tgz", - "integrity": "sha512-CJWWTaomR22hQD3ogrZujMH1pNN7DqZadmx9CJXxgKwpI/cuD5d2kClwXO3MeLFckJr5HRso7SFN5ebqKu1ycw==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@textlint/textlint-plugin-markdown/-/textlint-plugin-markdown-5.2.6.tgz", + "integrity": "sha512-S65wy2npaBLT7pwPPlrN9Pw40hOJsxiW+T6peMJOFEMLRem5qlCIlT+02Wlf0Rrtr6/gKDckpphTUiZT1+xRnQ==", "dev": true, "requires": { - "@textlint/markdown-to-ast": "^6.1.7" + "@textlint/markdown-to-ast": "^6.2.5" } }, "@textlint/textlint-plugin-text": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@textlint/textlint-plugin-text/-/textlint-plugin-text-4.1.13.tgz", - "integrity": "sha512-KQfSYNDt8HSX8ZL/r86N8OrAuQ9LEuevAtGomtfkw0h7Ed/pUfmuYXjht8wYRdysYBa4JyjrXcmqzRAUdkWrag==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@textlint/textlint-plugin-text/-/textlint-plugin-text-4.2.6.tgz", + "integrity": "sha512-KCgb5GVjoEDIi37UpQN6kFciiouyATNYrj/JufCeLNJEcVcxSm12EoFRKjpXpXmTOVqZUyGnIDU797z1usAZDw==", "dev": true, "requires": { - "@textlint/text-to-ast": "^3.1.7" + "@textlint/text-to-ast": "^3.2.4" } }, "@textlint/types": { @@ -558,9 +600,9 @@ } }, "@textlint/utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@textlint/utils/-/utils-1.0.3.tgz", - "integrity": "sha512-6oGaBKXYpg5Ooph5p32OFdp1dXDUC1z5mpHg2gmQbx6QZjmP4QX+ygBQdNoCq15d1w88+We6koJl0n0WXjItYw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@textlint/utils/-/utils-1.1.4.tgz", + "integrity": "sha512-KmU+kGi7vG5toUhNdLHHPxyVN1mNGcjMVe1tNDEXT1wU/3oqA96bunElrROWHYw5iNt1QVRaIAtNeMVyzyAdVA==", "dev": true }, "@types/color-name": { @@ -874,22 +916,22 @@ } }, "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", "object-inspect": "^1.7.0", "object-keys": "^1.1.1", "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" } }, "es-to-primitive": { @@ -990,9 +1032,9 @@ } }, "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, "format": { @@ -1050,9 +1092,9 @@ } }, "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, "has": { @@ -1094,9 +1136,9 @@ "dev": true }, "hosted-git-info": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", - "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", "dev": true }, "ignore": { @@ -1177,9 +1219,9 @@ "dev": true }, "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", "dev": true }, "is-date-object": { @@ -1246,12 +1288,12 @@ "dev": true }, "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", "dev": true, "requires": { - "has": "^1.0.3" + "has-symbols": "^1.0.1" } }, "is-symbol": { @@ -1416,17 +1458,6 @@ "pify": "^2.0.0", "pinkie-promise": "^2.0.0", "strip-bom": "^2.0.0" - }, - "dependencies": { - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - } } }, "load-plugin": { @@ -1663,16 +1694,20 @@ "dev": true }, "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", "dev": true }, "object-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", - "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", + "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } }, "object-keys": { "version": "1.1.1", @@ -1754,13 +1789,12 @@ } }, "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "error-ex": "^1.2.0" } }, "path-exists": { @@ -1853,17 +1887,6 @@ "js-yaml": "^3.12.0", "json5": "^2.1.1", "require-from-string": "^2.0.2" - }, - "dependencies": { - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } } }, "read-pkg": { @@ -1899,6 +1922,16 @@ "strip-bom": "^3.0.0" } }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, "path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", @@ -2233,9 +2266,9 @@ "dev": true }, "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -2281,9 +2314,9 @@ "dev": true }, "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -2291,15 +2324,15 @@ } }, "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true }, "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "requires": { "spdx-exceptions": "^2.1.0", @@ -2335,34 +2368,24 @@ "strip-ansi": "^6.0.0" } }, - "string.prototype.padstart": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string.prototype.padstart/-/string.prototype.padstart-3.1.0.tgz", - "integrity": "sha512-envqZvUp2JItI+OeQ5UAh1ihbAV5G/2bixTojvlIa090GGqF+NQRxbWb2nv9fTGrZABv6+pE6jXoAZhhS2k4Hw==", + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", "dev": true, "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" + "es-abstract": "^1.17.5" } }, - "string.prototype.trimleft": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", - "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", "dev": true, "requires": { "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string.prototype.trimright": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", - "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" + "es-abstract": "^1.17.5" } }, "string_decoder": { @@ -2527,22 +2550,22 @@ "dev": true }, "textlint": { - "version": "11.6.3", - "resolved": "https://registry.npmjs.org/textlint/-/textlint-11.6.3.tgz", - "integrity": "sha512-tTLLgB49zkJgq6GYDJOT6F31kHLulFjzovCHpN6ycv8d/aPcYl9vv7f/luR33YBQZdnGLtn+j8+G4GJAZ6Uz6w==", + "version": "11.7.6", + "resolved": "https://registry.npmjs.org/textlint/-/textlint-11.7.6.tgz", + "integrity": "sha512-o9nhbylWjOErba1gq2bMoJzughp9JK2VbENR+NCiMsNNEiaJ1P8jbnrL3ES86D6e0QMxziR79w5l7VmmdmLjCw==", "dev": true, "requires": { - "@textlint/ast-node-types": "^4.2.5", - "@textlint/ast-traverse": "^2.1.7", - "@textlint/feature-flag": "^3.1.6", - "@textlint/fixer-formatter": "^3.1.13", - "@textlint/kernel": "^3.2.1", - "@textlint/linter-formatter": "^3.1.12", - "@textlint/module-interop": "^1.0.2", - "@textlint/textlint-plugin-markdown": "^5.1.12", - "@textlint/textlint-plugin-text": "^4.1.13", - "@textlint/types": "^1.3.1", - "@textlint/utils": "^1.0.3", + "@textlint/ast-node-types": "^4.3.4", + "@textlint/ast-traverse": "^2.2.5", + "@textlint/feature-flag": "^3.2.4", + "@textlint/fixer-formatter": "^3.2.5", + "@textlint/kernel": "^3.3.6", + "@textlint/linter-formatter": "^3.2.5", + "@textlint/module-interop": "^1.1.4", + "@textlint/textlint-plugin-markdown": "^5.2.6", + "@textlint/textlint-plugin-text": "^4.2.6", + "@textlint/types": "^1.4.5", + "@textlint/utils": "^1.1.4", "debug": "^4.1.1", "deep-equal": "^1.1.0", "file-entry-cache": "^5.0.1", @@ -2561,6 +2584,23 @@ "structured-source": "^3.0.2", "try-resolve": "^1.0.1", "unique-concat": "^0.2.2" + }, + "dependencies": { + "@textlint/ast-node-types": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-4.3.4.tgz", + "integrity": "sha512-Grq+vJuNH7HCa278eFeiqJvowrD+onMCoG2ctLyoN+fXYIQGIr1/8fo8AcIg+VM16Kga+N6Y1UWNOWPd8j1nFg==", + "dev": true + }, + "@textlint/types": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@textlint/types/-/types-1.4.5.tgz", + "integrity": "sha512-7pA1rdiw1jsDNGwxupMC6fPlRNAHY6fKZ3s+jAY53o6RroOSR+5qO0sAjJ26lsSOhveH8imZzyyD08dk58IVJQ==", + "dev": true, + "requires": { + "@textlint/ast-node-types": "^4.3.4" + } + } } }, "textlint-rule-common-misspellings": { @@ -2844,9 +2884,9 @@ "dev": true }, "unist-util-remove-position": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.3.tgz", - "integrity": "sha512-CtszTlOjP2sBGYc2zcKA/CvNdTdEs3ozbiJ63IPBxh8iZg42SCCb8m04f8z2+V1aSk5a7BxbZKEdoDjadmBkWA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz", + "integrity": "sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==", "dev": true, "requires": { "unist-util-visit": "^1.1.0" @@ -2909,9 +2949,9 @@ } }, "vfile-location": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.5.tgz", - "integrity": "sha512-Pa1ey0OzYBkLPxPZI3d9E+S4BmvfVwNAAXrrqGbwTVXWaX2p9kM1zZ+n35UtVM06shmWKH4RPRN8KI80qE3wNQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", + "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==", "dev": true }, "vfile-message": { diff --git a/package.json b/package.json index d1c076c3c3f..b0cf74e440d 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "remark-lint-fenced-code-flag": "^2.0.1", "remark-lint-no-shell-dollars": "^2.0.2", "remark-stringify": "^8.1.1", - "textlint": "^11.6.3", + "textlint": "^11.7.6", "textlint-rule-common-misspellings": "^1.0.1", "textlint-rule-terminology": "^2.1.4" }, From ee0c154fa1d06400aeab54084ef44c86c80ef12c Mon Sep 17 00:00:00 2001 From: Jenny Date: Tue, 28 Jul 2020 12:26:26 +0100 Subject: [PATCH 08/40] Update aftership documentation (#14094) Co-authored-by: Franck Nijhof --- source/_integrations/aftership.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/aftership.markdown b/source/_integrations/aftership.markdown index 7f1a7942356..26e950221a2 100644 --- a/source/_integrations/aftership.markdown +++ b/source/_integrations/aftership.markdown @@ -8,7 +8,7 @@ ha_iot_class: Cloud Polling ha_domain: aftership --- -The `aftership` platform allows one to track deliveries by [AfterShip](https://www.aftership.com), a service that supports 490+ couriers worldwide. It is free to use up to 100 tracked packages per month, after that there is a fee. +The `aftership` platform allows one to track deliveries by [AfterShip](https://www.aftership.com), a service that supports 490+ couriers worldwide. There is a 'Forever Free' tier which allows tracking of up to 50 packages per month. There are various paid-for tiers after that. The sensor value shows the number of packages that are not in `Delivered` state. As attributes are the number of packages per status. From 94c2dd513d0900328ef29a9be08e96905b6d16c3 Mon Sep 17 00:00:00 2001 From: Tom Brien Date: Tue, 28 Jul 2020 18:14:29 +0100 Subject: [PATCH 09/40] iOS app migration blog post (#14101) * Draft iOS app migration blog post * Minor wording change --- .../2020-07-28-ios-app-migration.markdown | 31 ++++++++++++++++++ .../social-update.png | Bin 0 -> 58396 bytes 2 files changed, 31 insertions(+) create mode 100644 source/_posts/2020-07-28-ios-app-migration.markdown create mode 100644 source/images/blog/2020-07-28-ios-app-migration/social-update.png diff --git a/source/_posts/2020-07-28-ios-app-migration.markdown b/source/_posts/2020-07-28-ios-app-migration.markdown new file mode 100644 index 00000000000..caf1f90f5f6 --- /dev/null +++ b/source/_posts/2020-07-28-ios-app-migration.markdown @@ -0,0 +1,31 @@ +--- +title: "Migrating the iOS Companion App to Nabu Casa" +description: "Overview of why we are changing the app's author and what you need to do" +date: 2020-07-28 00:00:00 +date_formatted: "July 28, 2020" +comments: false +author: Robbie Trencheny +author_twitter: robbie +categories: Announcements +og_image: /images/blog/2020-07-28-ios-app-migration/social-update.png +--- + +Hi there, your friend and pal, Robbie the iOS developer here with an important update about a change to the Home Assistant Companion App for iOS and a few steps you, the user, will need to take. + +## What's changing? + +Recently, I transferred the Home Assistant app from my personal Apple Developer account to a new Apple Developer account owned by Nabu Casa, Inc. Why? Because Apple has silly limits on individual accounts that have made collaboration with others near impossible for the entire lifespan of the app (please don’t tell Tim or Craig I called their limits silly). This meant that during times when my work or personal life have been very busy, app updates have been far less frequent than I wanted. These limits also make it such that, if I were to be hit by a bus tomorrow, the app couldn't be easily updated on the App Store by others. The business account does not have these limits. Anyone on the account can update the app anytime without relying on me, Robbie, to push buttons. This will make collaboration easier and ensure the app will be available forever and ever, long after I’m gone. + +## Why Nabu Casa? + +Why did we transfer it to Nabu Casa, Inc.? Why not Home Assistant, Inc.? The short answer is there is no Home Assistant, Inc. Apple requires that business accounts are owned by… businesses. Real businesses. Which Home Assistant is not. Nabu Casa was the best option. To be very clear, Nabu Casa does not own the app now. The copyright and license has not changed. It’s still entirely open source. I am not stopping my work on the app, neither are others. Nabu Casa is simply the account under which the app is published. The same rock solid privacy guarantees apply just as before. The only change visible to you will be the name shown as the author in the App Store (Nabu Casa, Inc instead of Robert Trencheny). + +## What do you need to do? + +Right now, we are waiting for Apple to approve the entitlement to send [Critical Notifications](https://companion.home-assistant.io/docs/notifications/critical-notifications) for the new account. When that is done we will release an update (version 2020.5) from the new business account. Due to Apple limits, after updating you are going to need to re-authenticate one time to continue using the app. After that (assuming everything works) you are all done and the app will keep functioning as normal. No integration changes, no push notification changes, your actions are still there, etc etc. Remember that depending on your device settings, this update may well happen automatically, that's why we're telling you all about this in advance. + +## When is this happening? + +We're not quite sure about this sadly, currently we don't expect it to be before August 10th. As I mentioned, we are waiting for the new business account to be granted the critical notification entitlement. The time frame for this is entirely governed by Apple and beyond our control. We will be sure to keep you updated via [Twitter](https://twitter.com/home_assistant) and [Facebook](https://www.facebook.com/homeassistantio) so make sure you follow us! The current version of the app will also send a push notification closer to the time. We are currently working with our awesome team of translators to get this translated along with the in-app instructions that will be included in the 2020.5 update. + +Thanks as always for being a Home Assistant Companion user. Please leave a review if you appreciate the app, it’s the fuel that keeps the fire burning. \ No newline at end of file diff --git a/source/images/blog/2020-07-28-ios-app-migration/social-update.png b/source/images/blog/2020-07-28-ios-app-migration/social-update.png new file mode 100644 index 0000000000000000000000000000000000000000..45c42beba7c2dfe6e55daef2e5b77696ca1ea9aa GIT binary patch literal 58396 zcmd?R2T)Vp`Y(()C`b_zP!Zta;StG5KYWUZ zcd-Bu@4O@EJaFeT;|d}03*TB=!wwIRkPP?l99~QuB{2BAsfxP2y1bmQKGKo{VSv;# z`cU$0E#NOvMiYB`Yhg}KCnqNkCm09P)|iu9NJxm2i-(hk2MUaU+PPTSBb=dD zc1(X}cxY&+Z)<98Z;G^Hz|DxzLps=tG6IzT-h!p|U(;IIov{gE7^gGBnvGw1AR_I3qwmoD|3vzt;Gd zv{+jHwS=AhBS&BxXAJq5qwQ2&tPMGz8rmTpZ1oKvIRa!d{n?G3{Zqq#@bkZT9T@)C z%l4*5|K?rXlYiQjp|k0~8H#)I*HCL=30p&iJj8{4@C&_@zs=JCsSnKY5ApFr4#0tn@7N>8<}eSN$aohJP~HzX^yDM>Hqy2>C60&VQpF|G53fWF7#aH_Um8~M(F=GN`0JLHZ)*l_mFmVDA6Cjvd1Be`XMjo5#oi#?24q<>Tgq3cz>;p?ZLqg$fzK z3}FI-27E9W?;i&Lok4$&Dc~^U75sBd{lDbW8O{182rFYlAk5?Z-`I~K%*fD?S04uD z*W*G!dG&aCphA2`f>0hVUKqEL06z~*Na%ms&p#cz|L6Ck{~z_>KZqWu9e=6Hzvr8Q zp{?oPG~w^s_7@2Zzx3|^oAv&q-u-tm!*2onE4}+aC#PRt^tadH{9hf?Sq$@=nUXj& z{S~VU|0~z?-)bTdyb1#`(0_=E{u`f*(`(#p$p77_=&!@%Z~4g|M-C)CxQ~BjTfiTG zeU|qgD;ldNf*5$_f z=}qHfJ;;NXB46Ck?aF^5mtT=i&i$%npjB!b@XpXB=WSE^U0HuxjnePq3sx&8Z$8{o z>W3>`m+?!vMI^ed+X ze)K~Uzuf-w2MF^2gHQKC=gxNdKYc1F;z~ZAs>cM4t&EM0sUWOY9wVlcg8RxaEA&QA66eIoik>=Hn!W_AJ;eUP1q+W^tV9-^H%M{4tkDOR-(Pcsh?p; zMG=C@Q2}FXTfCQGpp1Y9!$J3190Musw%wX}tv%|y6z56nx502c1~jle2pW9;Ni+qA zTo)T!ZRh*txRmbgG_uaysdcUtB%=Qq!zC_nldBSATiZp!MiiG8D$#qgBsG}ABVbo# z4&#g3L|L{9Yp3m^Y+Xoy0x*KW%12APz$==Dd*aKC|({FP80xD z{WmC(?o0g9(eYaD8CP3G1aix|un1n}i+@`QucZD9w>k61thslu=fRid!RE=X9}gtp zcqMq{W&qc4Tz$e$Qx{b>#-uBL+;ZL0rM0qjV5>~NWKdb*~Nb~j< zpE=&fHkr>peeu^4twdtTobjCN(_7FB|FmHHNT5}8{PP}KD%qov(&mlB{8R|!r6!&> zAI@L_#d^cj^rNseLEN!((yAm9Qe#a>gn#ZIEHu$az(w5jmcEx|=vHc$=X99tPn>MU z-f16i?x=OqH(EG8BGKturH9ok=YE1^x$j{5IXUF&4wNQixXq7@%IsivfIdVbyW;i= zHrgu|>k@fm`mq(9sh;z4!5rtFM=mQDH6kCY_nubqiJ~?K<*;V2;%3$hU&Y6Tn;wtm z&t2x2?;4LvURJI3u)iag-nP3bH&=7yq}yhh?dRyGhEW`+wJ%t{93QgWYq{)R?9>l3 zD-(G)a)B))L0nwE;hp13MD8tO+M(#>OH@X@!~Dcc!(}n|8ea^g2<5pWdIhnAn7u3B zPF6P($>&_FF~z6%6Vo!Zr=FJ6Q53T&*1k=hctEkPUA`sOx4rt28-;b9{N}W+D=u1M zaNieDQ=FPD1p7>nL@LS|ir<>aAuPP(ZbH1-=Cpm-7{xYdUk{}gb~XBOvCi`z_oJf9 zqre5RKANd-gni4}3R@##R2}}(pS~&*`z_Sf!D@cw--OApn^0j!cItCB=z0T}q>%EQ zK`UmJsG`C0iRh5I+#A~s0=Y!^o;!IHZ?WpysD;_A$h;fc+8;y`cT1v;J1gjlNyh~a zR~3s+-_WH#r@Jn`R2R6Qanr0n6+DcGhEj>-$SL`xPC(eRA;aE*v;d`e&~HMPmfAI zC3oY6iF-SeoxQ`K2YfuRo%UMw4Ww|jjppo%Y@ZoAs{N^ZNCcy6nc0Epa_eVgjqrMa z*T7A8qrn5Sq;L7RtQI*A@2ka_^wJ1y>m)oUY$!$QfDlibDEUj0!d{SsSBc_Zh}_QZ ztwh456@Tg@<*8j-U@|A`&-4Hv09aopCuB@Wui8c5XL(3x$u@ySsY#59nWd;2N>}qv zZ33~?(%M&rD)M2ut+ZyhIoKWnQLGm^w!b89G%OLre!8ARntWKyl%)Zu!HAEBg?oI} z3Be>s9yjldaAhXe==`i~1N;x$L^EIiTJ0x7#LFg1x{@TRV`};$(WRZEmA7hkD{$#8 zqkRG2#-Lrkf$>^C(Zg>t7jXU>@Kebb#GOSW6DNBF45trG8eMY-3nfNpE{-Ih|qw6_1Gi&gpt&2iN#Dn`ZSIyS9QCtZ2werDn0{-+uwBGH=khw%THA4!p**#FsxT zrtWr8kKeRL{P5!Js(KP|a?n8y>q<=YSeU&{C2Q~SIMUCm_=5iBaaT_5s9JSyri1uc z*q!m~5>?1RIOQJq<-8l1TSdFt`~5O|dtqS(PW|f9C#y0^Y~sf($7}~z$b%6pk88hB zL)_+8O`CK%GV;k2T$!Zm{P>AI3d`7g4{EumvoiuBSGJDuKS_ExRt>WY;Z7wyJTqO8 z7THJ^N&NI}V84n2{s4h6bV_8yjSPucAiF>cavQM0Sson6L! zA9!s8#2c!S+HguA{SQqF`^WF&m-#pMTC=hUP7|yh9@Ekrrjdx^dmfZ7$fyfs_T7wK zXZhJR5j}Seeqg9}peSBi5|&KsaWIAAb+`Qi-8DjW$s_To+*})=80e|XE zwmtlln!YR4rs9DAVD@0ayffmF=T3)OI;D33>VDmUDIw))($CV;a~*67x^`kmwxYs^ zgA)}(cApJdRAc;)O%ei?V?=Ke`%Nq4AC(-f^uX34kUjU-$upwKR@a*H5l+PSY+i2Gt-Ljj+vI1`II zAL&$cjo(EX1&<6?gcG!9s*LZQEGta7Xcd|e-L9F=QR?c->p&ONURo`3S77zn!%~qa z#{SGt*C%<@>#I9~E^B*uPPmsh9C0F<0tC@$ojE<0MH`JV^a^dmnqK4~K*2-#r9E}dQ z)Nem}AH;MQJ#$qc-Zrye*`$>-M7MH@ODWX3>U3;>k$@0W*QA8s_oJ`+y~BQ1Z#t64 zB9kp`G=RqF!(2MlX0;Gnxs#A?=EXw8<}w+#Ff0;W9ut^HU7RP*yH!*j;1>M-*?l0M zab&q!8=XGQ7XP%Cgdl_0*JYv{&2`kYP@*|J^s{GPH##Qg?#=GiQkTiWz)G;@>u7&| z>AQ5@$nQM6i|5Y&V(QtI}o^@r+0-wI~&E{U>&dFL5w(t+1@!`n=F| zS)(7HlW$5QBC=~B@{#%9HAk!btM@N_U&mzls#_UZeUfDn)7KK(&s7sVv>XS*?-ufVeUJMOc<*chNVUJ%btdPOiPwd?Dt%b?b_YHHBc?#pR+>vouYe+veAQ zIsN;f)H~==UkB9chMj;>%yc_yRNNvyKhnRD*BUgLyZAlf`e;2rYVq~feCq84XSiQH z6Y+LJP3jt}B71KoB7oOp{%S^}+wA)W{QXfsYlm#lBMSxh^ut`WTwS<-b9oq6=ZY0) z+2|$Pb%G}2`d`lFL?5F9T?r2}fsLxiCY7@CqM)DX%jF948PH9fg^SCL58~NV{-Kp{ zROI=shUZKP?K`wZ;o9VvqZB~{Y8VYY`E9;o;jKG%p4jZtpRuDX0$8q8ib;{f7qZ%| zzDroQ(ZQ~1dd2dDpc1y+&ikictig9t<@aW}&ds`S+a_9)v(N@fD`j%6Q%8a&rzk~L z12TTJf1f!1G~tJxxNW7(Jx^92l5Qjt7FT7~Rjj6Q>)e^4yuDsOpulp&V?R%g?6?%& zkl$W3MCcE9b~h^xuZr!fQgFYXfAgc^!b;$9<*Vb?j{Wt=W?1hxiMtGryPTyA$q|W` z{=Tz6ikmb|RhpmQJ+#M0m$_JNcSuy$jB%{HEJ&MS)oxN>MDw>FHnO1K3Q8&tFj`WN za=LC5p9bfmw?qVt)zP8H?r}ARL-{{CB!I&O5AUbK=X$ISI~p5G+YvhG{9WazUlB38 zTq)uFT_J+WPj*L|Yr`e`8OUwqf>f#O#=BVJor#j%VIjNmuxm*(9@sU@T{NpXhN6`C zrg)g8|M70vU`yr;^TUtb@rLv&t1@%S$=`LrD-_MI3Ab?;%N*RJT+%#3@KAI|GWgi& zNJ~p^sbegs60Fl>JUr1Px-Y3PyZJ|mB@AdR`ep>dO87+5XyoRbE1Ih?_(9$P9py?_ z+z6D0a(XurIXuW-=^AUr`EGNkPe=a2ihE;%3rhH^fKgFc4z?{_H0;pbq;2|min$?8 zH>#UPBxWNaXgu|DM@GjRLB*)uAXyNTO`urzqjoQb(~&?k=0PQphQG8{L4L4@7R2|) zA9ZI#A2$%Mx2<=$(rwF(R>P|~D%>TV2V-9jE0+p1&3w`^kRG9+eLnDLB0UVhYs5dG z(6}q&larm;KH?VDwGm?nfA-Xs*(()~+jL5FxLfYL*8$JD>yy??)94dretVix65|h- zeq3Sj^7Pxpyv3LH?8dveyc!SBff+6CJic@fbC~nxu+K!XC3PYN2wufu@CPg3`er{~ zdMxK|10Cq;zE>juRiCXS0iK{rih&-$P-Z)70c>R1w}3GeUy|f+;%kWDJ4jN`RhmF| zuW8ab{3ud%53F7Y{94<+X+u)@v3;16=J49xvK(nGLZ(^cxrjTv44)=e?#y0kJKC1< zy-bH3k6M(zeCmc%f$@_`aY;~eBHYAtCv_e$4ItvS7LszCtmi%6A|!}u$^<1JmkkN% zZZ4J$Wtm^9Fa(Cc)<+{=Zt<%Y*=?3O1ROV~ zgp}@*!Ho6gy+Aex6vk=J)NKId(i1T6}k0;Jg9o&86H-jb<{#IkG3u<-%YQ@ z;tI$7>Eet^WL?`R&XbmTMgdaC&5WzvbhAO+#s(QqN|sMbzzcNNQQUXs?t`AUOVbq% zJRq8pV7rsKIT2xPa=x?NpXbI<-l&l?Nt{9KBw)Xt&r+KvVK6Q2+PxyDbdtoVtz4{( z;BL?^mSlUML>oG2gt?-daL`h**pAu zJl3k+8yTM7yaqQ(=p3v7i&-oOIKQgm1DU?0AUAKNp@glZCEsx)aGF7{z3!5y)Ny)) zKUw=};v`x0^i}2~E%@P3WX99TZR{??5(h1zsajW8ATS>K5=mY09fR6G)Q#D)FVV`xcBGDq zqvt1#ONPaA=z*e4)95du06|=TB$${vxiz+5d86LJtFoqfiGbws z!-S$op&lERY`#ZM8cgmQMo&+A`d7B+YoH-F-??vNup|TfyYc{|?1g<{MG4}!fC>^| z^Dn`YfCzTD&|se@AV7M@NT2U9Aft^@k;rQMfv`sf*n!d&zbqrosc*Iq{ABmDeX3+! zJ<|6Snv|he-6q`1k0oqRj+F?hMkNu0i2_o8XSZvca7k-5g>~yK^b;kJ`?G@=`}Y%x zxHu|3+e6j@MtydGY^gVLd)+(*KgiVsi!!z=sYHsgRbFvEsd*NF{lIUV_BdX3#H+2$ zSn@~LDUfUCCni)1m}5dH+4}}`uUS&T!`)@KHXyapQ+$#uy@85<{;(B z{>f!2P2s<4H-Mvb~q?jnFVZ5`us$n32&kJT1rL=<4|>(u6A=%PISyCUdHkxmk0%BK0D(= z!ctHBiLP$K$8NsKl^wWpbvhQx3}0y2-&KHm2rD{FwPbq_+)NMv;k*Yfxq}4yfY(0V z{tiT`6WF6Kk-5UIj}pDXl`(JK7STI2IxwT^gmpRz~|u zijm3J;EG*!Qf58kQ%@fHoJ`#w^nm_-Vh%d%z4(qDpYl86pTghVbI%2Q1|QRR;T7vk z7h0}ebsO%pA6(Y^IO>~={~AcZ&3O<)qoTKu`7%@y`_UD(Nlx!cij`t|y= zLfgs4RNpZC@_e`yh6uu(H!}FyZU2K}T}>gqI-4Sp8vEdA=lxa^2i3}*o2Pdq;%M)L zD(+9-%l9y#Ef#k*7rtkl&X*j&-~2`9;(Ctsik69Y=_&JirRKs>R|J-jNCfGy3JOVOe6FpMg1iO(LPV0K4dxJ)irwgvrOGnfso-F zmbLlb<~?(T?>*Wajh`pRSZ0R16BdED5aWfdKL9!nk46&|G}t0@JO4APW5cl z#og|5i7vb^De`3R{IjmZ`BNP6GQM-syK9kQb4TR>$CwvTYC#(b8#sh@ErYkzBmV5P! zW}pg$FhEf?dutI_Z^@u42o&U-5|p}XajwTm(`SvUqP1nRl9WCGh!wR9_ytCBH^ zmWl+&D?o&7lxP%FvxtvSWcDc3Bx(Vo*r8SWaD9vdwD>4TJpc3`!exOJ?|w+p^-Xy8 zvDm3ARk3cP`Xb!qRbF{b!Q_Y>(I8bCBATS~4e`xAqS56*WX&Dk@v{8bC3O zdnQdVoDd~NyX6s9LdonlWzngV$25nU-qEc!k6){Ee4hC+NR;ZdIXaF4C1}uQF6w9{ zTzS~&a40oPS))vd;#daiap;XpqbWd5|Mw{{Ne9r=s;oC!Ai-RxfbI@BYa}Go!^=_q1y}HOk262(eDqi@up0iMq+2UG zeW&>Xq=nBoQ?XsY|Nl_)_2L}0DTJE=zFrYx{&iXu>f)kzjrSVf)j>vYh zQq9oVe0=qBmOymT4SGQ#Ly{NR517BUzxgq@>3G^$)rrsMHWK-v=e(zCd*mieY-E&5} zeQbLtY2tbN4h5x1`Wo`#-1+jYXUqcaI=d6M+IiBA`}``cWo?73ely}LcLZfg&D4I$ zR?ShkGVyb>+8u(}Pl6n@cRgK~?*9`7U%fa*+Q|uu)^6+x^IISNJF9Hk5Fpb^bI* zj>+It6P+T}6KRVLBopm28RSsKMXV-qTE0W?l>Yd)uNSBrv&x_bHxt6cnfq{l&= zqSt9!_8`O_>k1i``jVQj;VWfjl(&@9aXAB3I>YR5bH~=B$=v=?qA4kg7Dy?8s29j* zSWXr{cvY>@ss^>ti_C9?*14gK3^h+Sc0+Dbh|^LGY!_i~P~^30KT-jSR-W~o4%pD2 z${nW~UZ*O>?PnIa5AOs{eu>Oj5nYf?q;KUIe+7P)5S|b>PtfZfN{Ib&+WTI#Cs=Hn zeuMLgJv#j(wuNP1y&&W@i-J699eaV=@)ZY^M0GFC!KWcx+vmKF!IVg0)vctCqiK8! z3Q-_ObvX1rrIfX2p{;zFIdrfjXEsFR|E8ly*Q3+@)2&K@5Z!hyE5(u32DbE-WNEdo z#5V-VQh(Zcr|5#~gu;9wO5N)fui9MRRt9%$PU#g1h$lpIIxV<(hh2ueuYHXXa?+nO z&&YTPzkxw6=+-)p?`P}mXWpmYG7c5rN#B8o`ay4YU+|p#>C+iglny{(L+@O%I6 z$IO>Hg*L=JfAw zlW^YL)>sbt5mSpAQ@1m28YEf5T-{$p{XOjZ7Dx^Yzg&z1Ovyu?LCUeChy#=1CyN9LSO*Jw{qf)_3%d#cwt#~uNNCbSp)eIwFs2H_Wat zqH0U3R40C>WhyO~5&BOwJl%r0D9yHKeoTbXldp9Yc7!sZt@h``l#vrEG26W}b1ee4 z9_fA&^UK(3v8P`*?ty7g@uz()x66JcxNzz|Nr>(<1WqTRA8C&fqXL{(r(B7idh3~+ zJ?|GfD=ck3@#K=!Mn;NZ#@fe#l25+1YoF7EEHThR#~*s_UkrA2|8r!hg4#6qy4#dF zpF_)IU_kM*k#m+Ln7ipc1KKt;tS?8+4z?Sc5G~@Ky8)EjkJP?gBN1^3(s!%)Tu-hQ zaXJ<5Xd<67|fcBBz54n&Vti?~`y?Bb%bSyFlN|QN|{QcLK>8JBc zt;M*kL>y&&FynivlEz-C-R|+h_D- z1pF^0=20b%u(%S}<#%*Xh}&7YZihat>N(WCBlbh_IeRyS!m$x`krU10N3p}Ll6uaG zj=q*f(zYY!=f&DNoga>rds6G`xkKpdbaa2UK7Ip4{x65a{7>+eU$B7x0_O66|2SMZ z?)L>(r{<*@8VMWmf8gHmrq;53SQN3+MsVaY#%(dzMCcQq***ie1 zB>i?CaO~u!9wf_5uSGr-5;P6veMiIJ$jxvz23()nlhDr}v@msT0c6VTF4KhPbLs3E zoRXA$Ow8!k$0Tn{eMymGAbI?CL9RkOYdj{LVKii;HZZG~EX<2e|7#=mL(ukeePOFI-d+WW7>n55VGPmpqs;fOEqhL5ZlEhqc`75fLa@s zt9bsb@w~PN=4j>X6>nrM&p^cI=!`xHBd7|hx!31iQvtbmIV(_ z%X?nhT)59`s%UmPzcc3RV@^`+Db4D+Z$(!miic-2A*∨tzD`re|=BxrZTIMgV)E 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

ICUvv_Ut*456i;j` zebmUk-~Psr&)+56C#XB^IJ>eh>G0fT53}38$Ugq6*H~8OyC8UHc**kS@7R z`OhBtrvGjqy(T|5?#o`0pNY@6&(r?N++k88Yu)#+=%Vn`_fi+$)QX6!ZvD5Bq3q>@CBP%S z^AA*{@`~!6HYm5f+3gY!GhWGLDsV$e`SPu5jS(_`H#=POyyPbNI&_<=$**m|BkqCM zs_2v-2cG;A3cSB-qtS&f$GQI;ix(Z+y1{($ckS(qlGxh!;fWLQIQH4q z&pT!HSA{6_nw+o|JEf69JS?1%isD*9)%bP+*)~JUS|^DlSxyawVs(E4Xk(64gqJ% t6M?&h+>#FOzH93It^_iu%OK$Q?|;XgDxb%0M|(iJJzf1=);T3K0RT-2XgdG^ literal 0 HcmV?d00001 From 163ab3066ebc9d12c07d2e65affb6f9e577dc2ec Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 28 Jul 2020 19:52:41 +0200 Subject: [PATCH 10/40] 0.113.2 (#14103) --- _config.yml | 4 +- source/_posts/2020-07-01-release-113.markdown | 66 +++++++++++++++++++ 2 files changed, 68 insertions(+), 2 deletions(-) diff --git a/_config.yml b/_config.yml index 34e23909ddd..ba7730096d8 100644 --- a/_config.yml +++ b/_config.yml @@ -101,8 +101,8 @@ social: # Home Assistant release details current_major_version: 0 current_minor_version: 113 -current_patch_version: 1 -date_released: 2020-07-24 +current_patch_version: 2 +date_released: 2020-07-28 # 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/2020-07-01-release-113.markdown b/source/_posts/2020-07-01-release-113.markdown index 88ce02f413f..9ebc45e329f 100644 --- a/source/_posts/2020-07-01-release-113.markdown +++ b/source/_posts/2020-07-01-release-113.markdown @@ -824,6 +824,72 @@ In general, all variables that start with `paper` will be removed at some point. [toon docs]: /integrations/toon/ [xbox_live docs]: /integrations/xbox_live/ +## Release 0.113.2 - July 28 + +- Bump netdisco to 2.8.1 ([@bdraco] - [#38173]) ([discovery docs]) +- Stop automation runs when turned off or reloaded ([@pnbruckner] - [#38174]) ([automation docs]) +- Bump tesla-powerwall to 0.2.12 to handle powerwall firmware 1.48+ ([@bdraco] - [#38180]) ([powerwall docs]) +- Ignore harmony hubs ips that are already configured during ssdp discovery ([@bdraco] - [#38181]) ([harmony docs]) +- Make rfxtrx RfyDevices have sun automation switches ([@elupus] - [#38210]) ([rfxtrx docs]) +- Fix detection of zones 2 and 3 in Onkyo/Pioneer amplifiers ([@vdkeybus] - [#38234]) ([onkyo docs]) +- Fix repeat action when variables present ([@pnbruckner] - [#38237]) ([script docs]) +- Fix parallel script containing repeat or choose action with max_runs > 10 ([@pnbruckner] - [#38243]) ([automation docs]) ([script docs]) +- Fix Skybell useragent ([@MisterWil] - [#38245]) ([skybell docs]) +- Improve setup retry logic to handle inconsistent powerview hub availability ([@bdraco] - [#38249]) ([hunterdouglas_powerview docs]) +- Don't set up callbacks until entity is created. ([@pavoni] - [#38251]) ([vera docs]) +- Prevent onvif from blocking startup ([@bdraco] - [#38256]) ([onvif docs]) +- Fix #38289 issue with xboxapi lib ([@marciogranzotto] - [#38293]) ([xbox_live docs]) +- Bump python-miio to 0.5.3 ([@rytilahti] - [#38300]) ([xiaomi_miio docs]) +- Prevent speedtest from blocking startup or causing other intergations to fail setup ([@bdraco] - [#38305]) ([speedtestdotnet docs]) +- Fix issue with certain Samsung TVs repeatedly showing auth dialog ([@kylehendricks] - [#38308]) ([samsungtv docs]) +- Add debug logging for when a chain of tasks blocks startup ([@bdraco] - [#38311]) +- Remove AdGuard version check ([@frenck] - [#38326]) ([adguard docs]) + +[#38173]: https://github.com/home-assistant/core/pull/38173 +[#38174]: https://github.com/home-assistant/core/pull/38174 +[#38180]: https://github.com/home-assistant/core/pull/38180 +[#38181]: https://github.com/home-assistant/core/pull/38181 +[#38210]: https://github.com/home-assistant/core/pull/38210 +[#38234]: https://github.com/home-assistant/core/pull/38234 +[#38237]: https://github.com/home-assistant/core/pull/38237 +[#38243]: https://github.com/home-assistant/core/pull/38243 +[#38245]: https://github.com/home-assistant/core/pull/38245 +[#38249]: https://github.com/home-assistant/core/pull/38249 +[#38251]: https://github.com/home-assistant/core/pull/38251 +[#38256]: https://github.com/home-assistant/core/pull/38256 +[#38293]: https://github.com/home-assistant/core/pull/38293 +[#38300]: https://github.com/home-assistant/core/pull/38300 +[#38305]: https://github.com/home-assistant/core/pull/38305 +[#38308]: https://github.com/home-assistant/core/pull/38308 +[#38311]: https://github.com/home-assistant/core/pull/38311 +[#38326]: https://github.com/home-assistant/core/pull/38326 +[@MisterWil]: https://github.com/MisterWil +[@bdraco]: https://github.com/bdraco +[@elupus]: https://github.com/elupus +[@frenck]: https://github.com/frenck +[@kylehendricks]: https://github.com/kylehendricks +[@marciogranzotto]: https://github.com/marciogranzotto +[@pavoni]: https://github.com/pavoni +[@pnbruckner]: https://github.com/pnbruckner +[@rytilahti]: https://github.com/rytilahti +[@vdkeybus]: https://github.com/vdkeybus +[adguard docs]: /integrations/adguard/ +[automation docs]: /integrations/automation/ +[discovery docs]: /integrations/discovery/ +[harmony docs]: /integrations/harmony/ +[hunterdouglas_powerview docs]: /integrations/hunterdouglas_powerview/ +[onkyo docs]: /integrations/onkyo/ +[onvif docs]: /integrations/onvif/ +[powerwall docs]: /integrations/powerwall/ +[rfxtrx docs]: /integrations/rfxtrx/ +[samsungtv docs]: /integrations/samsungtv/ +[script docs]: /integrations/script/ +[skybell docs]: /integrations/skybell/ +[speedtestdotnet docs]: /integrations/speedtestdotnet/ +[vera docs]: /integrations/vera/ +[xbox_live docs]: /integrations/xbox_live/ +[xiaomi_miio docs]: /integrations/xiaomi_miio/ + ## All changes

From df6b9e692adfb2006cd9149fd3bd1c822c9a5868 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 28 Jul 2020 20:32:15 +0200 Subject: [PATCH 11/40] 0.113.2, revert 1 PR (#14104) --- source/_posts/2020-07-01-release-113.markdown | 3 --- 1 file changed, 3 deletions(-) diff --git a/source/_posts/2020-07-01-release-113.markdown b/source/_posts/2020-07-01-release-113.markdown index 9ebc45e329f..a1f3813ebff 100644 --- a/source/_posts/2020-07-01-release-113.markdown +++ b/source/_posts/2020-07-01-release-113.markdown @@ -830,7 +830,6 @@ In general, all variables that start with `paper` will be removed at some point. - Stop automation runs when turned off or reloaded ([@pnbruckner] - [#38174]) ([automation docs]) - Bump tesla-powerwall to 0.2.12 to handle powerwall firmware 1.48+ ([@bdraco] - [#38180]) ([powerwall docs]) - Ignore harmony hubs ips that are already configured during ssdp discovery ([@bdraco] - [#38181]) ([harmony docs]) -- Make rfxtrx RfyDevices have sun automation switches ([@elupus] - [#38210]) ([rfxtrx docs]) - Fix detection of zones 2 and 3 in Onkyo/Pioneer amplifiers ([@vdkeybus] - [#38234]) ([onkyo docs]) - Fix repeat action when variables present ([@pnbruckner] - [#38237]) ([script docs]) - Fix parallel script containing repeat or choose action with max_runs > 10 ([@pnbruckner] - [#38243]) ([automation docs]) ([script docs]) @@ -849,7 +848,6 @@ In general, all variables that start with `paper` will be removed at some point. [#38174]: https://github.com/home-assistant/core/pull/38174 [#38180]: https://github.com/home-assistant/core/pull/38180 [#38181]: https://github.com/home-assistant/core/pull/38181 -[#38210]: https://github.com/home-assistant/core/pull/38210 [#38234]: https://github.com/home-assistant/core/pull/38234 [#38237]: https://github.com/home-assistant/core/pull/38237 [#38243]: https://github.com/home-assistant/core/pull/38243 @@ -865,7 +863,6 @@ In general, all variables that start with `paper` will be removed at some point. [#38326]: https://github.com/home-assistant/core/pull/38326 [@MisterWil]: https://github.com/MisterWil [@bdraco]: https://github.com/bdraco -[@elupus]: https://github.com/elupus [@frenck]: https://github.com/frenck [@kylehendricks]: https://github.com/kylehendricks [@marciogranzotto]: https://github.com/marciogranzotto From 9fbf2f60202fe9a83871e157526350b11421236e Mon Sep 17 00:00:00 2001 From: Sicco van Sas Date: Tue, 28 Jul 2020 21:26:52 +0200 Subject: [PATCH 12/40] Add confirmed working model (#14106) --- source/_integrations/panasonic_viera.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_integrations/panasonic_viera.markdown b/source/_integrations/panasonic_viera.markdown index 22f62fe6c96..80b8e82dee8 100644 --- a/source/_integrations/panasonic_viera.markdown +++ b/source/_integrations/panasonic_viera.markdown @@ -102,6 +102,7 @@ script: - TC-P65VT30 - TX-32AS520E - TX-32DSX609 +- TX-40CXE720 - TX-40DX600 - TX-40DX700B - TX-49DX650B From 2252238135a6a1b5df7caeba29b88eb6fde2f3ac Mon Sep 17 00:00:00 2001 From: Phil Bruckner Date: Tue, 28 Jul 2020 14:57:39 -0500 Subject: [PATCH 13/40] Update "Dim (and brighten) lights via a remote" cookbook example (#14107) --- .../dim_and_brighten_lights.markdown | 162 ++++++++---------- 1 file changed, 71 insertions(+), 91 deletions(-) diff --git a/source/_cookbook/dim_and_brighten_lights.markdown b/source/_cookbook/dim_and_brighten_lights.markdown index c6d0fa9e6f3..4abbf864ef5 100644 --- a/source/_cookbook/dim_and_brighten_lights.markdown +++ b/source/_cookbook/dim_and_brighten_lights.markdown @@ -6,7 +6,9 @@ ha_category: Automation Examples This requires both a dimmable light, and a Z-Wave remote control that sends one scene when a button is held, and another when released. This ensures that the scripts (which follow) are stopped, avoiding the risks of a script that never ends. -In the following automation, replace `zwave.YOUR_REMOTE` with the actual entity ID of your controller. For the controller this was written for scene ID 13 was sent when the up button was held, and 15 when released. Similarly, scene 14 when the down button was held, and 16 when released. You'll need to use the scene IDs that are sent by your remote if different. +In the following automations, replace `zwave.YOUR_REMOTE` with the actual entity ID of your controller, and `light.YOUR_LIGHT` with the actual entity ID of your light. + +For the controller this was written for scene ID 13 was sent when the up button was held, and 15 when released. Similarly, scene 14 when the down button was held, and 16 when released. You'll need to use the scene IDs that are sent by your remote if different. ```yaml automation: @@ -21,24 +23,11 @@ automation: entity_id: zwave.YOUR_REMOTE action: - service: script.turn_on + entity_id: script.ramp_light data: - entity_id: script.light_bright - - - alias: 'Stop the bright just there' - initial_state: 'on' - trigger: - - platform: event - event_type: zwave.scene_activated - event_data: - scene_id: 15 - entity_id: zwave.YOUR_REMOTE - action: - - service: script.turn_off - data: - entity_id: script.light_bright - - service: script.turn_off - data: - entity_id: script.light_bright_pause + variables: + direction: up + light: light.YOUR_LIGHT - alias: 'Make the lights go dim' initial_state: 'on' @@ -50,12 +39,20 @@ automation: entity_id: zwave.YOUR_REMOTE action: - service: script.turn_on + entity_id: script.ramp_light data: - entity_id: script.light_dim + variables: + direction: down + light: light.YOUR_LIGHT - - alias: 'Stop the dim just there' + - alias: 'Stop the light just there' initial_state: 'on' trigger: + - platform: event + event_type: zwave.scene_activated + event_data: + scene_id: 15 + entity_id: zwave.YOUR_REMOTE - platform: event event_type: zwave.scene_activated event_data: @@ -63,16 +60,15 @@ automation: entity_id: zwave.YOUR_REMOTE action: - service: script.turn_off - data: - entity_id: script.light_dim - - service: script.turn_off - data: - entity_id: script.light_dim_pause + entity_id: script.ramp_light ``` -There are 2 variables that control the speed of the change for the scripts below. The first is the `step`, small steps create a smooth transition. The second is the delay, larger delays will create a slower transition. +There are two variables that control the speed of the change for the script below. The first is the step -- small steps create a smooth transition. The second is the delay -- larger delays will create a slower transition. +Please note that some lights do not update their new brightness attribute very quickly, so make sure to use a large enough delay for your particular light. -To allow flexibility, an [Input Number](/integrations/input_number/) is used for the step (at the time of writing this, it's not possible to template the delay when the delay uses milliseconds). Two additional [Input Numbers](/integrations/input_number/) are used to set the minimum and maximum brightness, so that it's easy to tune that (or manage it through an automation). +There are two other variables that control the minimum and maximum brightness levels at which to stop the script. + +To allow flexibility all four variables are controlled by [Input Number](/integrations/input_number/) entities so that it's easy to tune (or manage through an automation). ```yaml input_number: @@ -89,79 +85,63 @@ input_number: min: 1 max: 255 step: 1 - + light_maximum: name: 'No brighter than this' initial: 255 min: 50 max: 255 step: 1 + + light_delay_ms: + name: 'Step the lights this often (ms)' + initial: 500 + min: 100 + max: 5000 + step: 100 ``` -Now the scripts. There are 2 pairs of scripts. The first steps the light brighter to the maximum and the second provides the delay. These call each other until both are stopped. The second pair does the same for dimming. +Now the script. +{% raw %} ```yaml -# Replace YOURLIGHT with the actual light entity script: - light_bright: - sequence: - - service: light.turn_on - data_template: - entity_id: light.YOUR_LIGHT - brightness: >- - {% raw %}{% set current = state_attr('light.YOUR_LIGHT', 'brightness')|default(0)|int %} - {% set step = states('input_number.light_step')|int %} - {% set next = current + step %} - {% if next > states('input_number.light_maximum')|int %} - {% set next = states('input_number.light_maximum')|int %} - {% endif %} - {{ next }}{% endraw %} - - - service_template: > - {% raw %}{% if state_attr('light.YOUR_LIGHT', 'brightness')|default(0)|int < states('input_number.light_maximum')|int %} - script.turn_on - {% else %} - script.turn_off - {% endif %}{% endraw %} - data: - entity_id: script.light_bright_pause - - light_bright_pause: - sequence: - - delay: - milliseconds: 1 - - service: script.turn_on - data: - entity_id: script.light_bright - - light_dim: - sequence: - - service: light.turn_on - data_template: - entity_id: light.YOUR_LIGHT - brightness: >- - {% raw %}{% set current = state_attr('light.YOUR_LIGHT', 'brightness')|default(0)|int %} - {% set step = states('input_number.light_step')|int %} - {% set next = current - step %} - {% if next < states('input_number.light_minimum')|int %} - {% set next = states('input_number.light_minimum')|int %} - {% endif %} - {{ next }}{% endraw %} - - - service_template: > - {% raw %}{% if state_attr('light.YOUR_LIGHT', 'brightness')|default(0)|int > states('input_number.light_minimum')|int %} - script.turn_on - {% else %} - script.turn_off - {% endif %}{% endraw %} - data: - entity_id: script.light_dim_pause - - light_dim_pause: - sequence: - - delay: - milliseconds: 1 - - service: script.turn_on - data: - entity_id: script.light_dim + ramp_light: + alias: Ramp Light Brightness + description: Ramp light brightness up or down + fields: + direction: + description: "Direction to change brightness: up or down" + example: up + light: + description: Light entity_id + example: light.family_room_lamp + mode: restart + sequence: + - repeat: + while: + - condition: template + value_template: > + {% set br = state_attr(light, 'brightness')|int(0) %} + {% set mn = states('input_number.light_minimum')|int %} + {% set mx = states('input_number.light_maximum')|int %} + {{ direction == 'up' and br < mx or + direction == 'down' and br > mn }} + sequence: + - service: light.turn_on + data_template: + entity_id: "{{ light }}" + brightness: > + {% set br = state_attr(light, 'brightness')|int(0) %} + {% set mn = states('input_number.light_minimum')|int %} + {% set mx = states('input_number.light_maximum')|int %} + {% set st = states('input_number.light_step')|int %} + {% if direction == 'up' %} + {{ [br + st, mx]|min }} + {% else %} + {{ [br - st, mn]|max }} + {% endif %} + - delay: + milliseconds: "{{ states('input_number.light_delay_ms')|int }}" ``` +{% endraw %} From aec53327453f8b35ac22ac57d6fa2278d89de75a Mon Sep 17 00:00:00 2001 From: Tom Brien Date: Wed, 29 Jul 2020 10:24:23 +0100 Subject: [PATCH 14/40] Update iOS app blog post to clarify no charges (#14108) --- source/_posts/2020-07-28-ios-app-migration.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/_posts/2020-07-28-ios-app-migration.markdown b/source/_posts/2020-07-28-ios-app-migration.markdown index caf1f90f5f6..03cb777aabb 100644 --- a/source/_posts/2020-07-28-ios-app-migration.markdown +++ b/source/_posts/2020-07-28-ios-app-migration.markdown @@ -20,6 +20,10 @@ Recently, I transferred the Home Assistant app from my personal Apple Developer Why did we transfer it to Nabu Casa, Inc.? Why not Home Assistant, Inc.? The short answer is there is no Home Assistant, Inc. Apple requires that business accounts are owned by… businesses. Real businesses. Which Home Assistant is not. Nabu Casa was the best option. To be very clear, Nabu Casa does not own the app now. The copyright and license has not changed. It’s still entirely open source. I am not stopping my work on the app, neither are others. Nabu Casa is simply the account under which the app is published. The same rock solid privacy guarantees apply just as before. The only change visible to you will be the name shown as the author in the App Store (Nabu Casa, Inc instead of Robert Trencheny). +## Does this mean there will be a charge for the app? + +No. + ## What do you need to do? Right now, we are waiting for Apple to approve the entitlement to send [Critical Notifications](https://companion.home-assistant.io/docs/notifications/critical-notifications) for the new account. When that is done we will release an update (version 2020.5) from the new business account. Due to Apple limits, after updating you are going to need to re-authenticate one time to continue using the app. After that (assuming everything works) you are all done and the app will keep functioning as normal. No integration changes, no push notification changes, your actions are still there, etc etc. Remember that depending on your device settings, this update may well happen automatically, that's why we're telling you all about this in advance. From 957db1edc5ad5cbbe95771cbcd0b1a99476d176b Mon Sep 17 00:00:00 2001 From: zinxes <68922232+zinxes@users.noreply.github.com> Date: Wed, 29 Jul 2020 21:09:28 +0200 Subject: [PATCH 15/40] Update rfxtrx.markdown (#14105) --- source/_integrations/rfxtrx.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_integrations/rfxtrx.markdown b/source/_integrations/rfxtrx.markdown index 03496ba1a1f..6c1d29212bf 100644 --- a/source/_integrations/rfxtrx.markdown +++ b/source/_integrations/rfxtrx.markdown @@ -469,7 +469,7 @@ automation: ## Services -- `rftrx.send`: Send a custom event using the RFXtrx device. +- `rfxtrx.send`: Send a custom event using the RFXtrx device. #### Service: Send @@ -478,7 +478,7 @@ Simulate a button being pressed: ```yaml ... action: - service: rftrx.send + service: rfxtrx.send data: event: 0b1111e003af16aa10000060 ``` From bba716f340d310fd6bf02a27ad437b25d06f611c Mon Sep 17 00:00:00 2001 From: R Huish <5207490+genestealer@users.noreply.github.com> Date: Wed, 29 Jul 2020 22:34:28 +0100 Subject: [PATCH 16/40] Update google_assistant.markdown - Fixed "Share an Action" steps (#14110) Updated inaccurate "Share an Action" steps, updated to match google's instructions https://developers.google.com/assistant/smarthome/develop/testing#share-action --- source/_integrations/google_assistant.markdown | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/source/_integrations/google_assistant.markdown b/source/_integrations/google_assistant.markdown index 30d872c27d9..1f4f5ed1604 100644 --- a/source/_integrations/google_assistant.markdown +++ b/source/_integrations/google_assistant.markdown @@ -60,9 +60,13 @@ If you've added Home Assistant to your phone's home screen, you have to first re 1. If you want to allow other household users to control the devices: - 1. Go to the settings for the project you created in the [Actions on Google console](https://console.actions.google.com/). - 2. Click `Test -> Simulator`, then click `Share` icon in the right top corner. Follow the on-screen instruction: - 1. Add team members: Got to `Settings -> Permission`, click `Add`, type the new user's e-mail address and choose `Project -> Viewer` role. + 1. Open the project you created in the [Actions on Google console](https://console.actions.google.com/). + 2. Click `Test` on the top of the page, then click `Simulator` located to the page left, then click the three little dots (more) icon in the upper right corner of the console. + 3. Click Manage user access. This redirects you to the Google Cloud Platform IAM permissions page. + 4. Click ADD at the top of the page. + 1. Enter the email address of the user you want to add. + 2. Click Select a role and choose Project < Viewer. + 3. Click SAVE 2. Copy and share the link with the new user. 3. When the new user opens the link with their own Google account, it will enable your draft test app under their account. 3. Have the new user go to their `Google Assistant` app to add `[test] your app name` to their account. From 2cbc32aec4abc42bc9ea8a886a88c4dc389c4687 Mon Sep 17 00:00:00 2001 From: Jan Keith Darunday Date: Fri, 31 Jul 2020 03:33:20 +0800 Subject: [PATCH 17/40] Add RU7300 to list of supported models (#14118) --- source/_integrations/samsungtv.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_integrations/samsungtv.markdown b/source/_integrations/samsungtv.markdown index 003cc26f6d2..ce550c566d3 100644 --- a/source/_integrations/samsungtv.markdown +++ b/source/_integrations/samsungtv.markdown @@ -130,6 +130,7 @@ For example: for model `UN55NU7100`, the `UN55` would mean it's an LED, North Am - RU7100 - RU7170 - RU7172 +- RU7300 (on works with WOL) - RU7475 - Q90RATXZT - QA55Q7FAM From fdd3236500d0595ea87c4bdf608076f4322aba1e Mon Sep 17 00:00:00 2001 From: MeIchthys <10717998+meichthys@users.noreply.github.com> Date: Thu, 30 Jul 2020 15:49:33 -0400 Subject: [PATCH 18/40] Minor gramatical fix (#14113) --- source/_integrations/coronavirus.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_integrations/coronavirus.markdown b/source/_integrations/coronavirus.markdown index 52568b0a9c8..77f347da248 100644 --- a/source/_integrations/coronavirus.markdown +++ b/source/_integrations/coronavirus.markdown @@ -31,8 +31,8 @@ This integration can be configured via the Home Assistant frontend. - Go to **Configuration** -> **Integrations**. - Click on the `+` in the bottom right corner to add a new integration. -- Search and select the **Coronavirus** integration form the list. -- Follow the instruction on screen to add the sensors. Either choose for adding +- Search and select the **Coronavirus** integration from the list. +- Follow the instruction on screen to add the sensors. Either choose to add world-wide sensors, or a specific set of sensors for your country. If you want to track both world-wide and one or more countries at the same time, From 5cc28f19039a30904df1779fc74cc695703eeb4c Mon Sep 17 00:00:00 2001 From: Hedda Date: Fri, 31 Jul 2020 22:11:59 +0200 Subject: [PATCH 19/40] Update zha.markdown to mention ITEAD Sonoff ZBBridge with Tasmota (#14124) Update zha.markdown to mention support for ITEAD Sonoff ZBBridge if flashed with Tasmota and EmberZNet 6.5.x.x https://www.digiblur.com/2020/07/how-to-use-sonoff-zigbee-bridge-with.html --- source/_integrations/zha.markdown | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/_integrations/zha.markdown b/source/_integrations/zha.markdown index d741f935de0..690a515773a 100644 --- a/source/_integrations/zha.markdown +++ b/source/_integrations/zha.markdown @@ -55,6 +55,7 @@ ZHA integration uses a hardware independent Zigbee stack implementation with mod - [RaspBee II (a.k.a. RaspBee 2) Raspberry Pi Shield from dresden elektronik](https://www.dresden-elektronik.com/product/raspbee-II.html) - [RaspBee Raspberry Pi Shield from dresden elektronik](https://phoscon.de/raspbee) - EmberZNet based radios using the EZSP protocol (via the [bellows](https://github.com/zigpy/bellows) library for zigpy) + - [ITEAD Sonoff ZBBridge](https://www.itead.cc/smart-home/sonoff-zbbridge.html) (Note! This first have to be flashed with [Tasmota firmware and EmberZNet 6.5.x.x](https://www.digiblur.com/2020/07/how-to-use-sonoff-zigbee-bridge-with.html)) - [Nortek GoControl QuickStick Combo Model HUSBZB-1 (Z-Wave & Zigbee USB Adapter)](https://www.nortekcontrol.com/products/2gig/husbzb-1-gocontrol-quickstick-combo/) - [Elelabs Zigbee USB Adapter](https://elelabs.com/products/elelabs_usb_adapter.html) - [Elelabs Zigbee Raspberry Pi Shield](https://elelabs.com/products/elelabs_zigbee_shield.html) @@ -120,11 +121,12 @@ eg `/dev/serial/by-id/usb-Silicon_Labs_HubZ_Smart_Home_Controller_C0F003D3-if01- Press `Submit` The success dialog will appear or an error will be displayed in the popup. An error is likely if Home Assistant can't access the USB device or your device is not up to date. Refer to [Troubleshooting](#troubleshooting) below for more information. -If you are use ZiGate, you have to use some special usb_path configuration: +If you are use ZiGate or Sonoff ZBBridge you have to use some special usb_path configuration: - ZiGate USB TTL or DIN: `/dev/ttyUSB0` or `auto` to auto discover the zigate - PiZigate : `pizigate:/dev/serial0` - Wifi Zigate : `socket://[IP]:[PORT]` for example `socket://192.168.1.10:9999` +- Sonoff ZBBridge : `socket://[IP]:[PORT]` for example `socket://192.168.1.11:8888` {% configuration %} database_path: From ccc2c298aabe4262478cd4769debc91da9f7a6f4 Mon Sep 17 00:00:00 2001 From: Stefan Lehmann Date: Fri, 31 Jul 2020 22:18:29 +0200 Subject: [PATCH 20/40] Fix in ads component documentation (#14120) --- source/_integrations/ads.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/ads.markdown b/source/_integrations/ads.markdown index de369c735ac..62d486cad44 100644 --- a/source/_integrations/ads.markdown +++ b/source/_integrations/ads.markdown @@ -140,7 +140,7 @@ sensor: - platform: ads adsvar: GVL.temperature unit_of_measurement: '°C' - adstype: integer + adstype: int ``` {% configuration %} From 2676956b16f454e3392316fd51cba0f5fe553f72 Mon Sep 17 00:00:00 2001 From: Tony Carmichael <1105554+aicarmic@users.noreply.github.com> Date: Fri, 31 Jul 2020 14:19:24 -0600 Subject: [PATCH 21/40] Update smartthings.markdown (#14119) Minor edits to match the layout and sequence of the smartthings tokens setup flow --- source/_integrations/smartthings.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/_integrations/smartthings.markdown b/source/_integrations/smartthings.markdown index aa1be156723..61fc5e86c42 100644 --- a/source/_integrations/smartthings.markdown +++ b/source/_integrations/smartthings.markdown @@ -40,11 +40,11 @@ The PAT is used to create a Home Assistant SmartApp in your SmartThings account 1. Log into the [personal access tokens page](https://account.smartthings.com/tokens) and click '[Generate new token](https://account.smartthings.com/tokens/new)' 1. Enter a token name (can be whatever you want), for example, 'Home Assistant' and select the following authorized scopes: - Devices (all) - - Installed Apps (all) - - Locations (all) + - Installed Applications (all) - Apps (all) - - Schedules (all) + - Locations (all) - Scenes (all) + - Schedules (all) 1. Click 'Generate token'. When the token is displayed copy and save it somewhere safe (such as your keystore) as you will not be able to retrieve it again. ### Webhook From bbe1ce8e6c002512968748201f9456778c501bac Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sat, 1 Aug 2020 15:37:41 +0200 Subject: [PATCH 22/40] Release 113.3 (#14127) --- _config.yml | 4 +- source/_posts/2020-07-01-release-113.markdown | 159 ++++++++++++------ 2 files changed, 109 insertions(+), 54 deletions(-) diff --git a/_config.yml b/_config.yml index ba7730096d8..dbd4d2013af 100644 --- a/_config.yml +++ b/_config.yml @@ -101,8 +101,8 @@ social: # Home Assistant release details current_major_version: 0 current_minor_version: 113 -current_patch_version: 2 -date_released: 2020-07-28 +current_patch_version: 3 +date_released: 2020-08-01 # 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/2020-07-01-release-113.markdown b/source/_posts/2020-07-01-release-113.markdown index a1f3813ebff..61097dbb990 100644 --- a/source/_posts/2020-07-01-release-113.markdown +++ b/source/_posts/2020-07-01-release-113.markdown @@ -234,20 +234,20 @@ automation: - binary_sensor.button3 action: - choose: - - conditions: - - condition: state - entity_id: binary_sensor.button1 - state: "on" - sequence: - - service: light.turn_on - entity_id: light.bulb - - conditions: - - condition: state - entity_id: binary_sensor.button2 - state: "on" - sequence: - - service: light.turn_off - entity_id: light.bulb + - conditions: + - condition: state + entity_id: binary_sensor.button1 + state: "on" + sequence: + - service: light.turn_on + entity_id: light.bulb + - conditions: + - condition: state + entity_id: binary_sensor.button2 + state: "on" + sequence: + - service: light.turn_off + entity_id: light.bulb default: - service: notify.frenck data: @@ -283,10 +283,10 @@ script: repeat: count: 10 sequence: - - service: light.toggle - entity_id: light.bulb - - delay: - milliseconds: 500 + - service: light.toggle + entity_id: light.bulb + - delay: + milliseconds: 500 ``` ### Automations & Scripts: Bonus! Cool down @@ -674,12 +674,12 @@ instead of being delayed until the activity is finished setting up. Xiaomi Miio

- Fan and remote components now have unique LED strings. - If you had previously set your automation calls from - "**fan**_set_led_on/off" to "**remote**_set_led_on/off", - you will now need to set those back to "fan". +Fan and remote components now have unique LED strings. +If you had previously set your automation calls from +"**fan**\_set_led_on/off" to "**remote**\_set_led_on/off", +you will now need to set those back to "fan". - ([@alexhardwicke] - [#37605]) ([xiaomi_miio docs]) +([@alexhardwicke] - [#37605]) ([xiaomi_miio docs])

@@ -691,6 +691,7 @@ instead of being delayed until the activity is finished setting up. Syncthru configuration is now done through the integrations UI page. ([@scop] - [#36690]) ([discovery docs]) ([syncthru docs]) +

@@ -718,7 +719,7 @@ the Slack integration documentation. - The events signalled from entity id's are removed in favor of events from an integration level. - The events format has changed. -([@elupus] - [#37742] [#37565]) ([rfxtrx docs]) +([@elupus] - [#37742][#37565]) ([rfxtrx docs])

@@ -747,8 +748,8 @@ component instead of JavaScript. That's why we have always supported importing extra HTML in the frontend and custom panels. This has been deprecated and superseded by ES modules since some time and has - no support anymore in browsers. We have a polyfill in place to still support - this, but we are going to remove this. +no support anymore in browsers. We have a polyfill in place to still support +this, but we are going to remove this. In version 0.115 we will remove the ability to import HTML, you can use ES modules as a replacement. @@ -802,16 +803,16 @@ In general, all variables that start with `paper` will be removed at some point. [#38149]: https://github.com/home-assistant/core/pull/38149 [#38159]: https://github.com/home-assistant/core/pull/38159 [#38163]: https://github.com/home-assistant/core/pull/38163 -[@DubhAd]: https://github.com/DubhAd -[@JeffLIrion]: https://github.com/JeffLIrion -[@RobBie1221]: https://github.com/RobBie1221 +[@dubhad]: https://github.com/DubhAd +[@jefflirion]: https://github.com/JeffLIrion +[@robbie1221]: https://github.com/RobBie1221 [@andrewsayre]: https://github.com/andrewsayre [@bachya]: https://github.com/bachya [@balloob]: https://github.com/balloob [@bdraco]: https://github.com/bdraco [@frenck]: https://github.com/frenck [@ludeeus]: https://github.com/ludeeus -[@mKeRix]: https://github.com/mKeRix +[@mkerix]: https://github.com/mKeRix [@pnbruckner]: https://github.com/pnbruckner [@pschmitt]: https://github.com/pschmitt [androidtv docs]: /integrations/androidtv/ @@ -861,7 +862,7 @@ In general, all variables that start with `paper` will be removed at some point. [#38308]: https://github.com/home-assistant/core/pull/38308 [#38311]: https://github.com/home-assistant/core/pull/38311 [#38326]: https://github.com/home-assistant/core/pull/38326 -[@MisterWil]: https://github.com/MisterWil +[@misterwil]: https://github.com/MisterWil [@bdraco]: https://github.com/bdraco [@frenck]: https://github.com/frenck [@kylehendricks]: https://github.com/kylehendricks @@ -887,6 +888,60 @@ In general, all variables that start with `paper` will be removed at some point. [xbox_live docs]: /integrations/xbox_live/ [xiaomi_miio docs]: /integrations/xiaomi_miio/ +## Release 0.113.3 - August 1 + +- Add Abode camera on and off support ([@shred86] - [#35164]) ([abode docs]) +- Fix songpal already configured check in config flow ([@shenxn] - [#37813]) ([songpal docs]) +- Prevent kodi from blocking startup ([@bdraco] - [#38257]) ([kodi docs]) +- Ignore remote Plex clients during plex.tv lookup ([@jjlawren] - [#38327]) ([plex docs]) +- Bump androidtv to 0.0.47 and adb-shell to 0.2.1 ([@JeffLIrion] - [#38344]) ([androidtv docs]) +- Bump pychromecast to 7.2.0 ([@emontnemery] - [#38351]) ([cast docs]) +- Update aioharmony to 0.2.6 ([@ehendrix23] - [#38360]) ([harmony docs]) +- Avoid error with ignored harmony config entries ([@bdraco] - [#38367]) ([harmony docs]) +- Prevent nut config flow error when checking ignored entries ([@bdraco] - [#38372]) ([nut docs]) +- Ensure Toon webhook ID isn't registered on re-registration ([@frenck] - [#38376]) ([toon docs]) +- Fix rmvtransport breaking when destinations don't match ([@cgtobi] - [#38401]) ([rmvtransport docs]) +- Fix ads integration after 0.113 ([@stlehmann] - [#38402]) ([ads docs]) +- Pin yarl dependency to 1.4.2 as core dependency ([@frenck] - [#38428]) +- Fix double encoding issue in google_translate TTS ([@frenck] - [#38429]) ([google_translate docs]) + +[#35164]: https://github.com/home-assistant/core/pull/35164 +[#37813]: https://github.com/home-assistant/core/pull/37813 +[#38257]: https://github.com/home-assistant/core/pull/38257 +[#38327]: https://github.com/home-assistant/core/pull/38327 +[#38344]: https://github.com/home-assistant/core/pull/38344 +[#38351]: https://github.com/home-assistant/core/pull/38351 +[#38360]: https://github.com/home-assistant/core/pull/38360 +[#38367]: https://github.com/home-assistant/core/pull/38367 +[#38372]: https://github.com/home-assistant/core/pull/38372 +[#38376]: https://github.com/home-assistant/core/pull/38376 +[#38401]: https://github.com/home-assistant/core/pull/38401 +[#38402]: https://github.com/home-assistant/core/pull/38402 +[#38428]: https://github.com/home-assistant/core/pull/38428 +[#38429]: https://github.com/home-assistant/core/pull/38429 +[@jefflirion]: https://github.com/JeffLIrion +[@bdraco]: https://github.com/bdraco +[@cgtobi]: https://github.com/cgtobi +[@ehendrix23]: https://github.com/ehendrix23 +[@emontnemery]: https://github.com/emontnemery +[@frenck]: https://github.com/frenck +[@jjlawren]: https://github.com/jjlawren +[@shenxn]: https://github.com/shenxn +[@shred86]: https://github.com/shred86 +[@stlehmann]: https://github.com/stlehmann +[abode docs]: /integrations/abode/ +[ads docs]: /integrations/ads/ +[androidtv docs]: /integrations/androidtv/ +[cast docs]: /integrations/cast/ +[google_translate docs]: /integrations/google_translate/ +[harmony docs]: /integrations/harmony/ +[kodi docs]: /integrations/kodi/ +[nut docs]: /integrations/nut/ +[plex docs]: /integrations/plex/ +[rmvtransport docs]: /integrations/rmvtransport/ +[songpal docs]: /integrations/songpal/ +[toon docs]: /integrations/toon/ + ## All changes
@@ -1526,26 +1581,26 @@ In general, all variables that start with `paper` will be removed at some point. [#38043]: https://github.com/home-assistant/core/pull/38043 [#38049]: https://github.com/home-assistant/core/pull/38049 [#38057]: https://github.com/home-assistant/core/pull/38057 -[@2Fake]: https://github.com/2Fake -[@Adminiuga]: https://github.com/Adminiuga -[@CoMPaTech]: https://github.com/CoMPaTech -[@DarkFox]: https://github.com/DarkFox -[@GMTA]: https://github.com/GMTA -[@Harryjholmes]: https://github.com/Harryjholmes -[@InduPrakash]: https://github.com/InduPrakash -[@Jc2k]: https://github.com/Jc2k -[@JeffLIrion]: https://github.com/JeffLIrion -[@Kdemontf]: https://github.com/Kdemontf -[@MartinHjelmare]: https://github.com/MartinHjelmare -[@MatthewFlamm]: https://github.com/MatthewFlamm -[@Michsior14]: https://github.com/Michsior14 -[@PaulAnnekov]: https://github.com/PaulAnnekov -[@Quentame]: https://github.com/Quentame -[@RogerSelwyn]: https://github.com/RogerSelwyn -[@SeraphimSerapis]: https://github.com/SeraphimSerapis -[@Shulyaka]: https://github.com/Shulyaka -[@SukramJ]: https://github.com/SukramJ -[@TheLastGimbus]: https://github.com/TheLastGimbus +[@2fake]: https://github.com/2Fake +[@adminiuga]: https://github.com/Adminiuga +[@compatech]: https://github.com/CoMPaTech +[@darkfox]: https://github.com/DarkFox +[@gmta]: https://github.com/GMTA +[@harryjholmes]: https://github.com/Harryjholmes +[@induprakash]: https://github.com/InduPrakash +[@jc2k]: https://github.com/Jc2k +[@jefflirion]: https://github.com/JeffLIrion +[@kdemontf]: https://github.com/Kdemontf +[@martinhjelmare]: https://github.com/MartinHjelmare +[@matthewflamm]: https://github.com/MatthewFlamm +[@michsior14]: https://github.com/Michsior14 +[@paulannekov]: https://github.com/PaulAnnekov +[@quentame]: https://github.com/Quentame +[@rogerselwyn]: https://github.com/RogerSelwyn +[@seraphimserapis]: https://github.com/SeraphimSerapis +[@shulyaka]: https://github.com/Shulyaka +[@sukramj]: https://github.com/SukramJ +[@thelastgimbus]: https://github.com/TheLastGimbus [@aaliddell]: https://github.com/aaliddell [@abmantis]: https://github.com/abmantis [@ajschmidt8]: https://github.com/ajschmidt8 @@ -1612,7 +1667,7 @@ In general, all variables that start with `paper` will be removed at some point. [@shenxn]: https://github.com/shenxn [@shermdog]: https://github.com/shermdog [@smugleafdev]: https://github.com/smugleafdev -[@starkillerOG]: https://github.com/starkillerOG +[@starkillerog]: https://github.com/starkillerOG [@teharris1]: https://github.com/teharris1 [@timmo001]: https://github.com/timmo001 [@timvancann]: https://github.com/timvancann From c15cd3742bdecb317fac2c6a9096ef2a273f892c Mon Sep 17 00:00:00 2001 From: Zac West <74188+zacwest@users.noreply.github.com> Date: Sat, 1 Aug 2020 20:17:31 -0700 Subject: [PATCH 23/40] [iOS] Add new team ID to apple-app-site-association (#14136) * Add new team ID to apple-app-site-association This adds the new team ID (`QMQYCKL255`) and potentially `/nfc/*` for home-assistant/android#689 related unified path handling, which since it requires an app change will only apply to the new team. * Add to old team ID as well --- source/.well-known/apple-app-site-association | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/source/.well-known/apple-app-site-association b/source/.well-known/apple-app-site-association index 0ae5d0cf17a..4f12d368fb6 100644 --- a/source/.well-known/apple-app-site-association +++ b/source/.well-known/apple-app-site-association @@ -5,19 +5,43 @@ { "appID": "UTQFCBPQRF.io.robbie.HomeAssistant.dev", "paths": [ - "/ios/*" + "/ios/*", + "/nfc/*" ] }, { "appID": "UTQFCBPQRF.io.robbie.HomeAssistant.beta", "paths": [ - "/ios/*" + "/ios/*", + "/nfc/*" ] }, { "appID": "UTQFCBPQRF.io.robbie.HomeAssistant", "paths": [ - "/ios/*" + "/ios/*", + "/nfc/*" + ] + }, + { + "appID": "QMQYCKL255.io.robbie.HomeAssistant.dev", + "paths": [ + "/ios/*", + "/nfc/*" + ] + }, + { + "appID": "QMQYCKL255.io.robbie.HomeAssistant.beta", + "paths": [ + "/ios/*", + "/nfc/*" + ] + }, + { + "appID": "QMQYCKL255.io.robbie.HomeAssistant", + "paths": [ + "/ios/*", + "/nfc/*" ] } ] From de08d501919820c5209ee163bcecff0ce2455a79 Mon Sep 17 00:00:00 2001 From: gwhiteCL Date: Mon, 3 Aug 2020 02:40:59 -0600 Subject: [PATCH 24/40] Better first sentence for HomeKit.markdown (#14143) --- source/_integrations/homekit.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/homekit.markdown b/source/_integrations/homekit.markdown index d249a7043bb..414c7ccd649 100644 --- a/source/_integrations/homekit.markdown +++ b/source/_integrations/homekit.markdown @@ -11,7 +11,7 @@ ha_codeowners: - '@bdraco' --- -The HomeKit Bridge integration allows you to forward entities from Home Assistant to Apple HomeKit, so they can be controlled from Apple's Home app and Siri. Please make sure that you have read the [considerations](#considerations) listed below to save you some trouble later. However if you do encounter issues, check out the [troubleshooting](#troubleshooting) section. +The HomeKit Bridge integration allows you to make your Home Assistant entities available in Apple HomeKit, so they can be controlled from Apple's Home app and Siri. Please make sure that you have read the [considerations](#considerations) listed below to save you some trouble later. However if you do encounter issues, check out the [troubleshooting](#troubleshooting) section.
From 6c4138564e377f71131eb1683732646809362fa6 Mon Sep 17 00:00:00 2001 From: Ray Cielencki Date: Mon, 3 Aug 2020 05:51:06 -0400 Subject: [PATCH 25/40] Workday: update docs to call out using province option for states, too (#14138) --- source/_integrations/workday.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/workday.markdown b/source/_integrations/workday.markdown index a1db0001d47..2d88dc544f9 100644 --- a/source/_integrations/workday.markdown +++ b/source/_integrations/workday.markdown @@ -40,7 +40,7 @@ country: required: true type: string province: - description: Province code according to [holidays](https://pypi.org/project/holidays/) notation. + description: Province/State code according to [holidays](https://pypi.org/project/holidays/) notation. required: false type: string workdays: From 4adac88a8c32fcbc7cfe84e961928f90f98c3fb8 Mon Sep 17 00:00:00 2001 From: R Huish <5207490+genestealer@users.noreply.github.com> Date: Mon, 3 Aug 2020 10:59:00 +0100 Subject: [PATCH 26/40] Update google_assistant.markdown - Account linking updated (#14111) --- .../_integrations/google_assistant.markdown | 45 ++++++++++--------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/source/_integrations/google_assistant.markdown b/source/_integrations/google_assistant.markdown index 1f4f5ed1604..cf6f8df96a0 100644 --- a/source/_integrations/google_assistant.markdown +++ b/source/_integrations/google_assistant.markdown @@ -31,20 +31,25 @@ To use Google Assistant, your Home Assistant configuration has to be [externally You will need to create a service account [Create Service account key](https://console.cloud.google.com/apis/credentials/serviceaccountkey) which allows you to update devices without unlinking and relinking an account (see [below](#troubleshooting-the-request_sync-service)). If you don't provide the service account, the `google_assistant.request_sync` service is not exposed. It is recommended to set up this configuration key as it also allows the usage of the following command, "Ok Google, sync my devices". Once you have set up this component, you will need to call this service (or command) each time you add a new device in Home Assistant that you wish to control via the Google Assistant integration. See Step 2 after the note for more details. 1. Create a new project in the [Actions on Google console](https://console.actions.google.com/). - 1. Add/Import a project and give it a name. - 2. Click on the `Smart Home` card, select the `Smart home` recommendation. - 3. Click `Build your Action`, select `Add Action(s)`. Add your Home Assistant URL: `https://[YOUR HOME ASSISTANT URL:PORT]/api/google_assistant` in the `Fulfillment URL` box, replace the `[YOUR HOME ASSISTANT URL:PORT]` with the domain / IP address and the port under which your Home Assistant is reachable. - 4. Click `Save`. Then click on `Overview`, which will lead you back to the app details screen. -2. `Account linking` is required for your app to interact with Home Assistant. Set this up under the `Quick Setup` section. - 1. Leave it at the default `No, I only want to allow account creation on my website` and select `Next`. - 2. For the `Linking type` select `OAuth` and `Authorization Code`. Click `Next` - 3. Client ID: `https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID`. - 4. Client Secret: Anything you like, Home Assistant doesn't need this field. - 5. Authorization URL (replace with your actual URL): `https://[YOUR HOME ASSISTANT URL:PORT]/auth/authorize`. - 6. Token URL (replace with your actual URL): `https://[YOUR HOME ASSISTANT URL:PORT]/auth/token`. Click `Next` - 7. Configure your client: Type `email` and click `Add scope`, then type `name` and click `Add scope` again. - 8. Do **NOT** check `Google to transmit clientID and secret via HTTP basic auth header`. Click `Next` - 9. Testing instructions: Enter anything. It doesn't matter since you won't submit this app. Click `Save` + 1. Click `New Project` and give your project a name. + 2. Click on the `Smart Home` card, then click the `Start Building` button. + 3. Click `Build your Action`, then click `Add Action(s)`. + 4. Add your Home Assistant URL: `https://[YOUR HOME ASSISTANT URL:PORT]/api/google_assistant` in the `Fulfillment URL` box, replace the `[YOUR HOME ASSISTANT URL:PORT]` with the domain / IP address and the port under which your Home Assistant is reachable. + 5. Click `Save`. + 6. Click on the `Overview` tab, which will lead you back to the app details screen. +2. `Account linking` is required for your app to interact with Home Assistant. + 1. Set this up by clicking on `Setup account linking` under the `Quick Setup` section of the `Overview` page. + 2. If asked, leave options as they default `No, I only want to allow account creation on my website` and select `Next`. + 3. Then if asked, for the `Linking type` select `OAuth` and `Authorization Code`. Click `Next` + 4. Enter the following: + 1. Client ID: `https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID`. (Find your YOUR_PROJECT_ID by clicking on the three little dots (more) icon in the upper right corner of the console, selecting `Project settings`, your Project ID will be listed on the `GENERAL` tab of the `Settings` page.) + 2. Client Secret: Anything you like, Home Assistant doesn't need this field. + 3. Authorization URL (replace with your actual URL): `https://[YOUR HOME ASSISTANT URL:PORT]/auth/authorize`. + 4. Token URL (replace with your actual URL): `https://[YOUR HOME ASSISTANT URL:PORT]/auth/token`. + Click `Next`, then `Next` again. + 5. In the `Configure your client` `Scopes` textbox, type `email` and click `Add scope`, then type `name` and click `Add scope` again. + 6. Do **NOT** check `Google to transmit clientID and secret via HTTP basic auth header`. + 7. Click `Next`, then click `Save` Screenshot: Account linking @@ -64,11 +69,11 @@ If you've added Home Assistant to your phone's home screen, you have to first re 2. Click `Test` on the top of the page, then click `Simulator` located to the page left, then click the three little dots (more) icon in the upper right corner of the console. 3. Click Manage user access. This redirects you to the Google Cloud Platform IAM permissions page. 4. Click ADD at the top of the page. - 1. Enter the email address of the user you want to add. - 2. Click Select a role and choose Project < Viewer. - 3. Click SAVE - 2. Copy and share the link with the new user. - 3. When the new user opens the link with their own Google account, it will enable your draft test app under their account. + 1. Enter the email address of the user you want to add. + 2. Click Select a role and choose Project < Viewer. + 3. Click SAVE + 2. Copy and share the link with the new user. + 3. When the new user opens the link with their own Google account, it will enable your draft test app under their account. 3. Have the new user go to their `Google Assistant` app to add `[test] your app name` to their account. 2. If you want to support actively reporting of state to Google's server (configuration option `report_state`) and support `google_assistant.request_sync`, you need to generate a service account. 1. In the GCP Console, go to the [Create Service account key](https://console.cloud.google.com/apis/credentials/serviceaccountkey) page. @@ -123,7 +128,7 @@ api_key: type: string service_account: description: Service account information. You can use an include statement with your downloaded JSON file, enter data here directly or use secrets file to populate. - required: false + required: true type: map keys: private_key: From 39f943516fa857a84fb39fb2af140346eb29ec59 Mon Sep 17 00:00:00 2001 From: Andrew Fahrenholtz Date: Mon, 3 Aug 2020 05:00:29 -0500 Subject: [PATCH 27/40] MQTT Grammar (#14137) --- source/_docs/mqtt/broker.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_docs/mqtt/broker.markdown b/source/_docs/mqtt/broker.markdown index a1c036ae62f..dbad384bbf6 100644 --- a/source/_docs/mqtt/broker.markdown +++ b/source/_docs/mqtt/broker.markdown @@ -8,7 +8,7 @@ The MQTT integration needs you to run an MQTT broker for Home Assistant to conne ### Run your own -This is the most private option, is running your own MQTT broker. +The most private option is running your own MQTT broker. The recommended setup method is to use the [Mosquitto MQTT broker add-on](https://github.com/home-assistant/hassio-addons/blob/master/mosquitto/DOCS.md). From 7dc04fd1f9ea9380c6fcb060a95f9718083e2725 Mon Sep 17 00:00:00 2001 From: Andrew Fahrenholtz Date: Mon, 3 Aug 2020 05:08:41 -0500 Subject: [PATCH 28/40] Honeywell Grammar (#14135) --- source/_integrations/honeywell.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/honeywell.markdown b/source/_integrations/honeywell.markdown index 5db9e010319..5832940612e 100644 --- a/source/_integrations/honeywell.markdown +++ b/source/_integrations/honeywell.markdown @@ -14,7 +14,7 @@ The `honeywell` climate platform integrates Home Assistant with _US-based_ [Hone It uses the [somecomfort](https://github.com/kk7ds/somecomfort) client library. It does not support the home security functionality of TCC. -If your system is compatible with this integration, then you will be able access your it via [https://mytotalconnectcomfort.com/portal/](https://mytotalconnectcomfort.com/portal/) (note the `/portal/`). +If your system is compatible with this integration, then you will be able access it via [https://mytotalconnectcomfort.com/portal/](https://mytotalconnectcomfort.com/portal/) (note the `/portal/`). ## Configuration From b7e10a7f2ebac291dc29a6805b815ac40e04128e Mon Sep 17 00:00:00 2001 From: Denix Date: Mon, 3 Aug 2020 12:10:10 +0200 Subject: [PATCH 29/40] add link to nexttracks android fork of owntracks (#14117) Co-authored-by: Franck Nijhof --- source/_integrations/owntracks.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/_integrations/owntracks.markdown b/source/_integrations/owntracks.markdown index 697a7708399..dcacab1c88c 100644 --- a/source/_integrations/owntracks.markdown +++ b/source/_integrations/owntracks.markdown @@ -8,7 +8,7 @@ ha_config_flow: true ha_domain: owntracks --- -[OwnTracks](https://owntracks.org/) is a free and open source application for iOS and Android that allow you to track your location and send it directly to Home Assistant. It can be set up via the integrations panel in the configuration screen. +[OwnTracks](https://owntracks.org/) (and its Android fork [NextTracks](https://codeberg.org/nexttracks/android)) is a free and open source application for iOS and Android that allow you to track your location and send it directly to Home Assistant. It can be set up via the integrations panel in the configuration screen. By default the integration will listen for incoming messages from OwnTracks via HTTP. It will also listen for MQTT messages if Home Assistant is configured to use MQTT. When a location is submitted via HTTP, Home Assistant will return all [Persons](/integrations/person/)' last known locations and they will be displayed within the OwnTracks app. @@ -22,9 +22,9 @@ To configure OwnTracks, you must set it up via the integrations panel in the con ### Configuring the app - Android -[Install the OwnTracks application for Android.](https://play.google.com/store/apps/details?id=org.owntracks.android) +Install [OwnTracks](https://play.google.com/store/apps/details?id=org.owntracks.android) or [NextTracks](https://codeberg.org/nexttracks/android/releases) (Soon available from [F-Droid](https://gitlab.com/fdroid/fdroiddata/-/merge_requests/6831)) application for Android. -In the OwnTracks app, open sidebar and click on preferences, then on connection. Change the following settings: +In the app, open the sidebar and click on preferences, then on the connection. Change the following settings: - Mode: Private HTTP - Host: `` From 39fbc7e703d073c92f0aaa9e19c27ae20a8595f5 Mon Sep 17 00:00:00 2001 From: Jakob Ruhe Date: Mon, 3 Aug 2020 12:11:42 +0200 Subject: [PATCH 30/40] Fix broken link in rfxtrx.markdown (#14133) --- source/_integrations/rfxtrx.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/rfxtrx.markdown b/source/_integrations/rfxtrx.markdown index 6c1d29212bf..0e1d151b4f1 100644 --- a/source/_integrations/rfxtrx.markdown +++ b/source/_integrations/rfxtrx.markdown @@ -239,7 +239,7 @@ Make sure you trigger a dimming command to get switches detected as lights other #### Convert switch event to dimming event -To convert a standard switch to a light, use the [Light Switch](integrations/light.switch/) component. +To convert a standard switch to a light, use the [Light Switch](/integrations/light.switch/) component. To convert a switch to a dimmable light, make sure the event contain a dimming command. You can usually convert a command by changing one byte. From 9dcdb67919762225075108287a27a71f93a58a5f Mon Sep 17 00:00:00 2001 From: GoSpursGoNL Date: Mon, 3 Aug 2020 12:25:59 +0200 Subject: [PATCH 31/40] Update dsmr.markdown (#14129) --- source/_integrations/dsmr.markdown | 1 - 1 file changed, 1 deletion(-) diff --git a/source/_integrations/dsmr.markdown b/source/_integrations/dsmr.markdown index 2f0a52bc262..a0f5b437c16 100644 --- a/source/_integrations/dsmr.markdown +++ b/source/_integrations/dsmr.markdown @@ -35,7 +35,6 @@ USB serial converters: - Cheap (Banggood/ebay) Generic PL2303 - - -- - Serial to network proxies: From 9bd1990fd1b6aede70dd2d3cf991a148ed15a929 Mon Sep 17 00:00:00 2001 From: dnguyen800 <25126347+dnguyen800@users.noreply.github.com> Date: Mon, 3 Aug 2020 03:28:25 -0700 Subject: [PATCH 32/40] change 'image' config variable to required (#14128) Hi, I'm running HA 0.113.2 and tried adding a picture-elements card without an image define, but looks like the 'image' variable is required. I'm updating the documentation to reflect this. --- source/_lovelace/picture-elements.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_lovelace/picture-elements.markdown b/source/_lovelace/picture-elements.markdown index 5f6b98b375e..c077156a0eb 100644 --- a/source/_lovelace/picture-elements.markdown +++ b/source/_lovelace/picture-elements.markdown @@ -19,7 +19,7 @@ type: description: picture-elements type: string image: - required: false + required: true description: The URL of an image.
To use a locally hosted image, see [Hosting](/integrations/http#hosting-files). type: string camera_image: From 2e3293b8aaf30858b88e2ae7ee04eeec7b511d4b Mon Sep 17 00:00:00 2001 From: mikemc35 <31638843+mikemc35@users.noreply.github.com> Date: Mon, 3 Aug 2020 03:42:04 -0700 Subject: [PATCH 33/40] Update vacuum.xiaomi_miio.markdown (#14126) Added some addition explanation to how zones are formed via x- and y-axis coordinates, which was a little confusing for me at first. --- source/_integrations/vacuum.xiaomi_miio.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/vacuum.xiaomi_miio.markdown b/source/_integrations/vacuum.xiaomi_miio.markdown index cd6f06ca7f8..a454b0ef097 100644 --- a/source/_integrations/vacuum.xiaomi_miio.markdown +++ b/source/_integrations/vacuum.xiaomi_miio.markdown @@ -108,7 +108,7 @@ Start the cleaning operation in the areas selected for the number of repeats ind | Service data attribute | Optional | Description | |---------------------------|----------|-------------------------------------------------------| | `entity_id` | no | Only act on a specific robot | -| `zone` | no | List of zones. Each zone is an array of 4 integer value. Example: [[23510,25311,25110,26361]] | +| `zone` | no | List of zones. Each zone is an array of four integer values. These values represent two sets of x- and y-axis coordinates that describe the beginning and ending points of a square or rectangle cleaning zone. For example, `[[23510,25311,25110,26361]]` creates a box that starts in one corner at the 23510, 25311 (x- and y-axis) coordinates and then is expanded diagonally to the 25110, 26361 coordinates to create a rectangular cleaning zone. | | `repeats` | no | Number of cleaning repeats for each zone between 1 and 3. | Example of `xiaomi_miio.vacuum_clean_zone` use: From 7933580f57937df567a411a63c4bae9d3cd74646 Mon Sep 17 00:00:00 2001 From: Chris Romp Date: Mon, 3 Aug 2020 03:45:12 -0700 Subject: [PATCH 34/40] Fix weather-forecast.markdown (#14112) Fix for `secondary_info_attribute` type (was: `boolean`, now: `string`). See also: https://github.com/home-assistant/frontend/blob/dev/src/panels/lovelace/cards/hui-weather-forecast-card.ts#L213 --- source/_lovelace/weather-forecast.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_lovelace/weather-forecast.markdown b/source/_lovelace/weather-forecast.markdown index e5dac5a4462..f8f47cb37db 100644 --- a/source/_lovelace/weather-forecast.markdown +++ b/source/_lovelace/weather-forecast.markdown @@ -63,7 +63,7 @@ show_forecast: secondary_info_attribute: required: false description: Which attribute to display under the temperature. - type: boolean + type: string default: Defaults to `extrema` if available, if not available then `precipitation` and if precipitation isn't available then `humidity`. theme: required: false From 4b597ca857bcf58402b9d831cdc9bd7ac5ae6efe Mon Sep 17 00:00:00 2001 From: cogneato Date: Mon, 3 Aug 2020 07:39:07 -0600 Subject: [PATCH 35/40] Add HassOS FAQ (#13927) Co-authored-by: Sean Mooney Co-authored-by: Franck Nijhof --- .../_includes/asides/hassio_navigation.html | 13 +++-- source/hassio/hassos_faq.markdown | 58 +++++++++++++++++++ 2 files changed, 66 insertions(+), 5 deletions(-) create mode 100644 source/hassio/hassos_faq.markdown diff --git a/source/_includes/asides/hassio_navigation.html b/source/_includes/asides/hassio_navigation.html index c30771e6e65..dd294ffeaf5 100644 --- a/source/_includes/asides/hassio_navigation.html +++ b/source/_includes/asides/hassio_navigation.html @@ -1,17 +1,18 @@
-
diff --git a/source/hassio/hassos_faq.markdown b/source/hassio/hassos_faq.markdown new file mode 100644 index 00000000000..22a91ea8e17 --- /dev/null +++ b/source/hassio/hassos_faq.markdown @@ -0,0 +1,58 @@ +--- +title: "Home Assistant OS FAQ" +description: "Frequently Asked Questions for Home Assistant OS" +--- +## Is USB Boot for the Pi4 supported? Is the Pi4 with 8GB RAM supported? + +The bootloader for Home Assistant OS (uboot) does not yet support Pi4 booting from USB. Support is likely a month or two away as of July 2020. + +The Pi4, with 8GB RAM, is similarly waiting for support from upstream. + +## How do I run a specific version of Home Assistant? + +For this you would need to install the [Terminal & SSH add-on][ssh] or use the console +that is available on your device by connecting a keyboard and screen. + +To install the Terminal & SSH add-on, choose **Supervisor**, which is located in the sidebar and then the add-on store. If you don't see it, enable "Advanced Mode" from your profile page. + +Use the web-based terminal or SSH to your Home Assistant system, or connect to the console, and run: + +```bash +ha core update --version=0.XX.X +``` + +Replace 0.XX.X with the version you want. e.g., `0.111.2` + +You can also use a similar command for the operating system: + +```bash +ha os update --version 4.11 +``` + +## Do I need to leave the USB stick connected for Wi-Fi? + +No. The USB "CONFIG" stick is only used to import a network profile to `/etc/NetworkManager/system-connections/` and can be removed. + +## 404 Client Error: Not Found ("no such image: homeassistant/...) + +This error indicates the image, whether for updating to Home Assistant or installing or updating an add-on, was not able to be pulled to your system. This is usually a situation where there is not enough space for the image to be downloaded. The first thing to check for is the available space on your system. + +Please note, if you are running the operating system as a virtual machine; the default VM image is only about 6GB. Many VM users run into this as they have not allocated enough storage. 32 GB is the minimum recommended size. + +You'll need to explore your own system to determine where space has gone. +Using `df -h` in the SSH add-on console to you can quickly check to see if you have space available. + +If there is plenty of space available then you might check to see if you are having network issues that are preventing images being downloaded. + +## Why does the start button for an add-on flash red when I click it? + +If you are looking for more information about add-ons, which won't start or install, navigate to Supervisor > System in the UI and check the logs. + +The logs on this page are the same you would see using `ha logs` in the custom CLI. + +## I'm trying to find my files on the host or SD card. Where are they? + +On a Home Assistant OS install, your files are on the data partition within `/mnt/data/supervisor/`. +On the SD itself, this is an EXT4 partition labeled `hassos-data` + +On a Supervised install, they are in `/usr/share/hassio/`. From 9932cd75a9d42817385fb82ef5d05f7c9b33e38c Mon Sep 17 00:00:00 2001 From: lewei50 Date: Mon, 3 Aug 2020 21:55:06 +0800 Subject: [PATCH 36/40] Add demo link. (#13667) Co-authored-by: Zack Arnett Co-authored-by: Franck Nijhof Co-authored-by: Franck Nijhof --- source/_integrations/iammeter.markdown | 6 ++++++ source/images/integrations/iammeter/demo.jpg | Bin 0 -> 194012 bytes 2 files changed, 6 insertions(+) create mode 100644 source/images/integrations/iammeter/demo.jpg diff --git a/source/_integrations/iammeter.markdown b/source/_integrations/iammeter.markdown index 1b915a5b2e0..587208b4e5f 100644 --- a/source/_integrations/iammeter.markdown +++ b/source/_integrations/iammeter.markdown @@ -13,6 +13,12 @@ ha_codeowners: `iammeter` provides real-time readings of single-phase (WEM3080, WEM3162) and three-phase (WEM3080T) meters from [IAMMETER](https://www.iammeter.com) over Wi-Fi. +Example Lovelace Dashboard: + +

+ +

+ ## Configuration To use this sensor in your installation, add the following to your `configuration.yaml` file: diff --git a/source/images/integrations/iammeter/demo.jpg b/source/images/integrations/iammeter/demo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..57eede1761a8a80072abcf181281ad9d7fd67ddd GIT binary patch literal 194012 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%0D)7DtOt0`hA)b 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 z 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 literal 0 HcmV?d00001 From 210025257ff19b0f0f95b568db320f31a37c45f3 Mon Sep 17 00:00:00 2001 From: Cooper Dale Date: Mon, 3 Aug 2020 17:48:05 +0200 Subject: [PATCH 37/40] filename has to have .name in variable (#14145) if it is only entity_id = /tmp/snapshot_ which is wrong, however entity_id.name is nice /tmp/snapshot_m5_cam_i --- source/_integrations/camera.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/_integrations/camera.markdown b/source/_integrations/camera.markdown index 12125318bfc..2fd093ffb90 100644 --- a/source/_integrations/camera.markdown +++ b/source/_integrations/camera.markdown @@ -73,7 +73,7 @@ Both `duration` and `lookback` options are suggestions, but should be consistent | Service data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | no | Name(s) of entities to create a snapshot from, e.g., `camera.living_room_camera`. | -| `filename` | no | Template of a file name. Variable is `entity_id`, e.g., {% raw %}`/tmp/{{ entity_id }}.mp4`{% endraw %}. | +| `filename` | no | Template of a file name. Variable is `entity_id`, e.g., {% raw %}`/tmp/{{ entity_id.name }}.mp4`{% endraw %}. | | `duration` | yes | Target recording length (in seconds). Default: 30 | | `lookback` | yes | Target lookback period (in seconds) to include in addition to duration. Only available if there is currently an active HLS stream. Default: 0 | @@ -87,7 +87,7 @@ action: service: camera.record data_template: entity_id: camera.yourcamera - filename: '/tmp/{{ entity_id }}_{{ now().strftime("%Y%m%d-%H%M%S") }}.mp4' + filename: '/tmp/{{ entity_id.name }}_{{ now().strftime("%Y%m%d-%H%M%S") }}.mp4' ``` {% endraw %} @@ -98,7 +98,7 @@ Take a snapshot from a camera. | Service data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | no | Name(s) of entities to create a snapshot from, e.g., `camera.living_room_camera`. | -| `filename` | no | Template of a file name. Variable is `entity_id`, e.g., {% raw %}`/tmp/snapshot_{{ entity_id }}`{% endraw %}. | +| `filename` | no | Template of a file name. Variable is `entity_id`, e.g., {% raw %}`/tmp/snapshot_{{ entity_id.name }}`{% endraw %}. | The path part of `filename` must be an entry in the `allowlist_external_dirs` in your [`homeassistant:`](/docs/configuration/basic/) section of your `configuration.yaml` file. From fff499fc3a8f82ae6529263e1b0ec17648a28646 Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Mon, 3 Aug 2020 19:29:40 +0200 Subject: [PATCH 38/40] Update Xiaomi Miio documentation (#14031) Co-authored-by: Franck Nijhof --- .../air_quality.xiaomi_miio.markdown | 50 - .../alarm_control_panel.xiaomi_miio.markdown | 38 - source/_integrations/fan.xiaomi_miio.markdown | 542 ------ .../_integrations/light.xiaomi_miio.markdown | 199 -- .../_integrations/remote.xiaomi_miio.markdown | 190 -- .../_integrations/sensor.xiaomi_miio.markdown | 50 - .../_integrations/switch.xiaomi_miio.markdown | 123 -- .../_integrations/vacuum.xiaomi_miio.markdown | 480 ----- source/_integrations/xiaomi_miio.markdown | 1725 ++++++++++++++++- source/_redirects | 8 + 10 files changed, 1729 insertions(+), 1676 deletions(-) delete mode 100644 source/_integrations/air_quality.xiaomi_miio.markdown delete mode 100644 source/_integrations/alarm_control_panel.xiaomi_miio.markdown delete mode 100644 source/_integrations/fan.xiaomi_miio.markdown delete mode 100644 source/_integrations/light.xiaomi_miio.markdown delete mode 100644 source/_integrations/remote.xiaomi_miio.markdown delete mode 100644 source/_integrations/sensor.xiaomi_miio.markdown delete mode 100644 source/_integrations/switch.xiaomi_miio.markdown delete mode 100644 source/_integrations/vacuum.xiaomi_miio.markdown diff --git a/source/_integrations/air_quality.xiaomi_miio.markdown b/source/_integrations/air_quality.xiaomi_miio.markdown deleted file mode 100644 index 270d0841153..00000000000 --- a/source/_integrations/air_quality.xiaomi_miio.markdown +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: "Xiaomi Air Quality Monitor" -description: "Instructions how to integrate your Xiaomi Mi Air Quality Monitor within Home Assistant." -ha_category: - - Health -ha_iot_class: Local Polling -ha_release: 0.102 -ha_domain: xiaomi_miio ---- - -The `xiaomi_miio` sensor platform is observing your Xiaomi Mi Air Quality Monitor and reporting the air quality values. - -Currently, the supported features are: - -- Particulate matter 2.5 -- Attributes - - carbon_dioxide_equivalent - - total_volatile_organic_compounds - - temperature - - humidity - -Please follow the instructions on [Retrieving the Access Token](/integrations/vacuum.xiaomi_miio/#retrieving-the-access-token) to get the API token. - -## Configuration - -To add a Xiaomi Mi Air Quality Monitor to your installation, add the following to your `configuration.yaml` file: - -```yaml -# Example configuration.yaml entry -air_quality: - - platform: xiaomi_miio - host: IP_ADDRESS - token: YOUR_TOKEN -``` - -{% configuration %} -host: - description: The IP address of your miio device. - required: true - type: string -token: - description: The API token of your miio device. - required: true - type: string -name: - description: The name of your miio device. - required: false - type: string - default: Xiaomi Miio Air Quality Monitor -{% endconfiguration %} diff --git a/source/_integrations/alarm_control_panel.xiaomi_miio.markdown b/source/_integrations/alarm_control_panel.xiaomi_miio.markdown deleted file mode 100644 index 88bcc54dece..00000000000 --- a/source/_integrations/alarm_control_panel.xiaomi_miio.markdown +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: "Xiaomi Gateway Alarm" -description: "Instructions on how to integrate your Xiaomi Gateway Alarm within Home Assistant." -ha_category: - - Alarm -ha_iot_class: Local Polling -ha_release: '0.110' -ha_domain: xiaomi_miio ---- - -The `xiaomi_miio` alarm_control_panel platform allows you to control the state of your Xiaomi Gateway Alarm. - -Please follow the instructions on [Retrieving the Access Token](/integrations/vacuum.xiaomi_miio/#retrieving-the-access-token) to get the API token to use during configuration. - -## Features - -- Turn on/off Alarm -- See the status of Alarm (armed_away, disarmed, arming) - -## Configuration - -To set up the Xiaomi gateway, click Configuration in the sidebar, then click Integrations and then click the + icon in the lower right and find xiaomi_miio. Select the option "Connect to a Xiaomi Gateway" and click submit. You will then be presented with a form in which you will need to fill in the "IP address" and 32 characters "token". Optionally, you can specify a different name for the gateway. After you click submit, you will have the opportunity to select the area that your devices are located. - -{% configuration %} -host: - description: The IP address of your Xiaomi gateway. - required: true - type: string -token: - description: The API token of your Xiaomi gateway. - required: true - type: string -name: - description: The name of your Xiaomi gateway. - required: false - type: string - default: Xiaomi Gateway -{% endconfiguration %} diff --git a/source/_integrations/fan.xiaomi_miio.markdown b/source/_integrations/fan.xiaomi_miio.markdown deleted file mode 100644 index 67a6fea4c84..00000000000 --- a/source/_integrations/fan.xiaomi_miio.markdown +++ /dev/null @@ -1,542 +0,0 @@ ---- -title: "Xiaomi Air Purifier" -description: "Instructions on how to integrate your Xiaomi Air Purifier and Xiaomi Air Humidifier within Home Assistant." -ha_category: - - Fan -ha_iot_class: Local Polling -ha_release: 0.57 -ha_domain: xiaomi_miio ---- - -The `xiaomi_miio` fan platform allows you to control the Xiaomi Air Purifier, Air Humidifier and Air Fresh. - -Supported devices: - -| Name | Model | Model no. | -| ---------------------- | ---------------------- | --------- | -| Air Purifier | zhimi.airpurifier.v1 | | -| Air Purifier 2 | zhimi.airpurifier.v2 | FJY4006CN | -| Air Purifier V3 | zhimi.airpurifier.v3 | | -| Air Purifier V5 | zhimi.airpurifier.v5 | | -| Air Purifier Pro | zhimi.airpurifier.v6 | | -| Air Purifier Pro V7 | zhimi.airpurifier.v7 | | -| Air Purifier 2 (mini) | zhimi.airpurifier.m1 | | -| Air Purifier (mini) | zhimi.airpurifier.m2 | | -| Air Purifier MA1 | zhimi.airpurifier.ma1 | | -| Air Purifier 2S | zhimi.airpurifier.ma2 | | -| Air Purifier 2S | zhimi.airpurifier.mc1 | | -| Air Purifier Super | zhimi.airpurifier.sa1 | | -| Air Purifier Super 2 | zhimi.airpurifier.sa2 | | -| Air Purifier 3 (2019) | zhimi.airpurifier.ma4 | | -| Air Purifier 3H (2019) | zhimi.airpurifier.mb3 | | -| Air Humidifier | zhimi.humidifier.v1 | | -| Air Humidifier CA1 | zhimi.humidifier.ca1 | | -| Air Humidifier CB1 | zhimi.humidifier.cb1 | | -| Air Fresh VA2 | zhimi.airfresh.va2 | | - - -## Features - -### Air Purifier 2 et al. - -- Power (on, off) -- Operation modes (auto, silent, favorite, idle) -- Buzzer (on, off) -- Child lock (on, off) -- LED (on, off), LED brightness (bright, dim, off) -- Favorite Level (0...16) -- Attributes - - `model` - - `temperature` - - `humidity` - - `aqi` - - `mode` - - `filter_hours_used` - - `filter_life_remaining` - - `favorite_level` - - `child_lock` - - `led` - - `motor_speed` - - `average_aqi` - - `purify_volume` - - `learn_mode` - - `sleep_time` - - `sleep_mode_learn_count` - - `extra_features` - - `turbo_mode_supported` - - `auto_detect` - - `use_time` - - `button_pressed` - - `buzzer` - - `led_brightness` - - `sleep_mode` - -### Air Purifier Pro (zhimi.airpurifier.v6) - -- Power (on, off) -- Operation modes (auto, silent, favorite) -- Child lock (on, off) -- LED (on, off) -- Favorite Level (0...16) -- Attributes - - `model` - - `temperature` - - `humidity` - - `aqi` - - `mode` - - `filter_hours_used` - - `filter_life_remaining` - - `favorite_level` - - `child_lock` - - `led` - - `motor_speed` - - `average_aqi` - - `purify_volume` - - `learn_mode` - - `sleep_time` - - `sleep_mode_learn_count` - - `extra_features` - - `turbo_mode_supported` - - `auto_detect` - - `use_time` - - `button_pressed` - - `filter_rfid_product_id` - - `filter_rfid_tag` - - `filter_type` - - `illuminance` - - `motor2_speed` - - `volume` - -### Air Purifier Pro V7 (zhimi.airpurifier.v7) - -- Power (on, off) -- Operation modes (auto, silent, favorite) -- Child lock (on, off) -- LED (on, off) -- Favorite Level (0...16) -- Attributes - - `model` - - `temperature` - - `humidity` - - `aqi` - - `mode` - - `filter_hours_used` - - `filter_life_remaining` - - `favorite_level` - - `child_lock` - - `led` - - `motor_speed` - - `average_aqi` - - `learn_mode` - - `extra_features` - - `turbo_mode_supported` - - `button_pressed` - - `filter_rfid_product_id` - - `filter_rfid_tag` - - `filter_type` - - `illuminance` - - `motor2_speed` - - `volume` - -### Air Purifier 2S (zhimi.airpurifier.mc1) - -- Power (on, off) -- Operation modes (auto, silent, favorite) -- Buzzer (on, off) -- Child lock (on, off) -- LED (on, off) -- Favorite Level (0...16) -- Attributes - - `model` - - `temperature` - - `humidity` - - `aqi` - - `mode` - - `filter_hours_used` - - `filter_life_remaining` - - `favorite_level` - - `child_lock` - - `led` - - `motor_speed` - - `average_aqi` - - `learn_mode` - - `extra_features` - - `turbo_mode_supported` - - `button_pressed` - - `filter_rfid_product_id` - - `filter_rfid_tag` - - `filter_type` - - `illuminance` - - `buzzer` - -### Air Purifier 3/3H (2019) (zhimi.airpurifier.ma4/zhimi.airpurifier.mb3) - -This model uses newer MiOT communication protocol. - -- Power (on, off) -- Operation modes (auto, silent, favorite, fan) -- Buzzer (on, off) -- Child lock (on, off) -- LED (on, off) -- Favorite Level (0...16) -- Fan Level (1...3) -- Attributes - - `model` - - `temperature` - - `humidity` - - `aqi` - - `mode` - - `filter_hours_used` - - `filter_life_remaining` - - `favorite_level` - - `child_lock` - - `led` - - `motor_speed` - - `average_aqi` - - `purify_volume` - - `use_time` - - `buzzer` - - `led_brightness` - - `filter_rfid_product_id` - - `filter_rfid_tag` - - `filter_type` - - `fan_level` - -### Air Purifier V3 (zhimi.airpurifier.v3) - -- Power (on, off) -- Operation modes (auto, silent, favorite, idle, medium, high, strong) -- Child lock (on, off) -- LED (on, off) -- Attributes - - `model` - - `aqi` - - `mode` - - `led` - - `buzzer` - - `child_lock` - - `illuminance` - - `filter_hours_used` - - `filter_life_remaining` - - `motor_speed` - - `average_aqi` - - `volume` - - `motor2_speed` - - `filter_rfid_product_id` - - `filter_rfid_tag` - - `filter_type` - - `purify_volume` - - `learn_mode` - - `sleep_time` - - `sleep_mode_learn_count` - - `extra_features` - - `auto_detect` - - `use_time` - - `button_pressed` - -### Air Humidifier (zhimi.humidifier.v1) - -- On, Off -- Operation modes (silent, medium, high, strong) -- Buzzer (on, off) -- Child lock (on, off) -- LED (on, off), LED brightness (bright, dim, off) -- Target humidity (30, 40, 50, 60, 70, 80) -- Attributes - - `model` - - `temperature` - - `humidity` - - `mode` - - `buzzer` - - `child_lock` - - `trans_level` - - `target_humidity` - - `led_brightness` - - `button_pressed` - - `use_time` - - `hardware_version` - -### Air Humidifier CA (zhimi.humidifier.ca1) - -- On, Off -- Operation modes (silent, medium, high, auto) -- Buzzer (on, off) -- Child lock (on, off) -- LED (on, off), LED brightness (bright, dim, off) -- Target humidity (30, 40, 50, 60, 70, 80) -- Dry mode (on, off) -- Attributes - - `model` - - `temperature` - - `humidity` - - `mode` - - `buzzer` - - `child_lock` - - `trans_level` - - `target_humidity` - - `led_brightness` - - `button_pressed` - - `use_time` - - `hardware_version` - - `motor_speed` - - `depth` - - `dry` - -### Air Humidifier CB (zhimi.humidifier.cb1) - -- On, Off -- Operation modes (silent, medium, high, auto) -- Buzzer (on, off) -- Child lock (on, off) -- LED (on, off), LED brightness (bright, dim, off) -- Target humidity (30, 40, 50, 60, 70, 80) -- Dry mode (on, off) -- Attributes - - `speed` - - `speed_list` - - `model` - - `temperature` - - `humidity` - - `mode` - - `buzzer` - - `child_lock` - - `target_humidity` - - `led_brightness` - - `use_time` - - `hardware_version` - - `motor_speed` - - `depth` - - `dry` - - `supported_features` - -### Air Fresh VA2 - -* Power (on, off) -* Operation modes (auto, silent, interval, low, middle, strong) -* Buzzer (on, off) -* Child lock (on, off) -* LED (on, off), LED brightness (bright, dim, off) -* Attributes - - `model` - - `aqi` - - `average_aqi` - - `temperature` - - `humidity` - - `co2` - - `mode` - - `led` - - `led_brightness` - - `buzzer` - - `child_lock` - - `filter_life_remaining` - - `filter_hours_used` - - `use_time` - - `motor_speed` - - `extra_features` - -Please follow the instructions on [Retrieving the Access Token](/integrations/vacuum.xiaomi_miio/#retrieving-the-access-token) to get the API token to use in the `configuration.yaml` file. - -To add a Xiaomi Air Purifier to your installation, add the following to your `configuration.yaml` file: - -```yaml -fan: -# Example configuration.yaml entry - - platform: xiaomi_miio - host: 192.168.130.66 - token: YOUR_TOKEN -``` - -{% configuration %} -host: - description: The IP address of your miio fan. - required: true - type: string -token: - description: The API token of your miio fan. - required: true - type: string -name: - description: The name of your miio fan. - required: false - type: string - default: Xiaomi Air Purifier -model: - description: The model of your miio fan. See the table above for valid values (f.e. `zhimi.airpurifier.v2`). This setting can be used to bypass the device model detection and is recommended if your device isn't always available. - required: false - type: string -{% endconfiguration %} - -## Platform Services - -### Service `fan.set_speed` - -Set the fan speed/operation mode. - -| Service data attribute | Optional | Description | -|---------------------------|----------|---------------------------------------------------------------------| -| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | -| `speed` | no | Fan speed. Valid values are 'Auto', 'Silent', 'Favorite' and 'Idle' | - -### Service `xiaomi_miio.fan_set_buzzer_on` (Air Purifier Pro excluded) - -Turn the buzzer on. - -| Service data attribute | Optional | Description | -|---------------------------|----------|---------------------------------------------------------| -| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | - -### Service `xiaomi_miio.fan_set_buzzer_off` (Air Purifier Pro excluded) - -Turn the buzzer off. - -| Service data attribute | Optional | Description | -|---------------------------|----------|---------------------------------------------------------| -| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | - -### Service `xiaomi_miio.fan_set_led_on` (Air Purifiers only) - -Turn the LED on. - -| Service data attribute | Optional | Description | -|---------------------------|----------|---------------------------------------------------------| -| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | - -### Service `xiaomi_miio.fan_set_led_off` (Air Purifiers only) - -Turn the LED off. - -| Service data attribute | Optional | Description | -|---------------------------|----------|---------------------------------------------------------| -| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | - -### Service `xiaomi_miio.fan_set_child_lock_on` - -Turn the child lock on. - -| Service data attribute | Optional | Description | -|---------------------------|----------|---------------------------------------------------------| -| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | - -### Service `xiaomi_miio.fan_set_child_lock_off` - -Turn the child lock off. - -| Service data attribute | Optional | Description | -|---------------------------|----------|---------------------------------------------------------| -| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | - -### Service `xiaomi_miio.fan_set_led_brightness` (Air Purifier 2S and Air Purifier Pro excluded) - -Set the LED brightness. Supported values are 0 (Bright), 1 (Dim), 2 (Off). - -| Service data attribute | Optional | Description | -|---------------------------|----------|---------------------------------------------------------| -| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | -| `brightness` | no | Brightness, between 0 and 2. | - -### Service `xiaomi_miio.fan_set_favorite_level` (Air Purifiers only) - -Set the favorite level of the operation mode "favorite". - -| Service data attribute | Optional | Description | -|---------------------------|----------|---------------------------------------------------------| -| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | -| `level` | no | Level, between 0 and 16. | - -### Service `xiaomi_miio.fan_set_fan_level` (Air Purifiers only) - -Set the fan level for "fan" operation mode. - -| Service data attribute | Optional | Description | -|---------------------------|----------|---------------------------------------------------------| -| `entity_id` | no | Only act on a specific Xiaomi MiOT fan entity. | -| `level` | no | Level, between 1 and 3. | - -### Service `xiaomi_miio.fan_set_auto_detect_on` (Air Purifier 2S and Air Purifier Pro only) - -Turn the auto detect on. - -| Service data attribute | Optional | Description | -|---------------------------|----------|---------------------------------------------------------| -| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | - -### Service `xiaomi_miio.fan_set_auto_detect_off` (Air Purifier 2S and Air Purifier Pro only) - -Turn the auto detect off. - -| Service data attribute | Optional | Description | -|---------------------------|----------|---------------------------------------------------------| -| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | - -### Service `xiaomi_miio.fan_set_learn_mode_on` (Air Purifier 2 only) - -Turn the learn mode on. - -| Service data attribute | Optional | Description | -|---------------------------|----------|---------------------------------------------------------| -| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | - -### Service `xiaomi_miio.fan_set_learn_mode_off` (Air Purifier 2 only) - -Turn the learn mode off. - -| Service data attribute | Optional | Description | -|---------------------------|----------|---------------------------------------------------------| -| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | - -### Service `xiaomi_miio.fan_set_volume` (Air Purifier Pro only) - -Set the sound volume. - -| Service data attribute | Optional | Description | -|---------------------------|----------|---------------------------------------------------------| -| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | -| `volume` | no | Volume, between 0 and 100. | - -### Service `xiaomi_miio.fan_reset_filter` (Air Purifier 2 only) - -Reset the filter lifetime and usage. - -| Service data attribute | Optional | Description | -|---------------------------|----------|---------------------------------------------------------| -| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | - -### Service `xiaomi_miio.fan_set_extra_features` (Air Purifier only) - -Set the extra features. - -| Service data attribute | Optional | Description | -|---------------------------|----------|---------------------------------------------------------| -| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | -| `features` | no | Integer, known values are 0 and 1. | - -### Service `xiaomi_miio.fan_set_target_humidity` (Air Humidifier only) - -Set the target humidity. - -| Service data attribute | Optional | Description | -|---------------------------|----------|-----------------------------------------------------------------| -| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | -| `humidity` | no | Target humidity. Allowed values are 30, 40, 50, 60, 70 and 80 | - -### Service `fan.xiaomi_miio_set_dry_on` (Air Humidifier CA and CB) - -Turn the dry mode on. - -| Service data attribute | Optional | Description | -|---------------------------|----------|---------------------------------------------------------| -| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | - -### Service `fan.xiaomi_miio_set_dry_off` (Air Humidifier CA and CB) - -Turn the dry mode off. - -| Service data attribute | Optional | Description | -|---------------------------|----------|---------------------------------------------------------| -| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | - -## Troubleshooting `Unable to find device` error messages - -Check if the device is in the same subnet as the Home Assistant instance. Otherwise, you should configure your router/firewall to put this device in the same VLAN as the Home Assistant instance. - -If it's not possible to use VLANs for some reason, your last resort may be using NAT translation, between the IPs. diff --git a/source/_integrations/light.xiaomi_miio.markdown b/source/_integrations/light.xiaomi_miio.markdown deleted file mode 100644 index 833d6dceb5f..00000000000 --- a/source/_integrations/light.xiaomi_miio.markdown +++ /dev/null @@ -1,199 +0,0 @@ ---- -title: "Xiaomi Philips Light" -description: "Instructions on how to integrate your Xiaomi Philips Lights within Home Assistant." -ha_category: - - Light -ha_iot_class: Local Polling -ha_release: 0.53 -ha_domain: xiaomi_miio ---- - -The `xiaomi_miio` platform allows you to control the state of your Xiaomi Philips LED Ball Lamp, Xiaomi Philips Zhirui LED Bulb E14 Candle Lamp, Xiaomi Philips Zhirui Downlight, Xiaomi Philips LED Ceiling Lamp, Xiaomi Philips Eyecare Lamp 2, Xiaomi Philips Moonlight Bedside Lamp and Philips Zhirui Desk Lamp. - -## Features - -### Philips LED Ball Lamp, Philips Zhirui LED Candle Lamp and Philips Zhirui Downlight - -Supported models: `philips.light.bulb`, `philips.light.candle`, `philips.light.candle2`, `philips.light.downlight` - -* Power (on, off) -* Brightness -* Color temperature (175...333 mireds) -* Scene (1, 2, 3, 4) -* Delayed turn off (Resolution in seconds) -* Attributes - - model - - scene - - delayed_turn_off - -### Philips LED Ceiling Lamp - -Supported models: `philips.light.ceiling`, `philips.light.zyceiling` - -* Power (on, off) -* Brightness -* Color temperature (175...370 mireds) -* Scene (1, 2, 3, 4) -* Night light mode (on, off) -* Delayed turn off (Resolution in seconds) -* Attributes - - model - - scene - - delayed_turn_off - - night_light_mode - - automatic_color_temperature - -### Philips Eyecare Smart Lamp 2 - -Supported models: `philips.light.sread1` - -* Eyecare light (on, off) -* Ambient light (on, off) -* Brightness (of each light) -* Scene (1, 2, 3, 4) -* Night light mode (on, off) -* Delayed turn off (Resolution in seconds) -* Eye fatigue reminder / notification (on, off) -* Eyecare mode (on, off) -* Attributes - - model - - scene - - delayed_turn_off - - night_light_mode - - reminder - - eyecare_mode - -### Philips Zhirui Desk Lamp - -Supported models: `philips.light.mono1` - -* Power (on, off) -* Brightness -* Scene (1, 2, 3, 4) -* Delayed turn off (Resolution in seconds) -* Attributes - - model - - scene - - delayed_turn_off - -### Philips Moonlight Bedside Lamp - -Supported models: `philips.light.moonlight` - -* Power (on, off) -* Brightness -* Color -* Color temperature (153...588 mireds) -* Scene (1, 2, 3, 4, 5, 6) -* Attributes - - model - - scene - - sleep_assistant - - sleep_off_time - - total_assistant_sleep_time - - brand_sleep - - brand - - - -Please follow the instructions on [Retrieving the Access Token](/integrations/vacuum.xiaomi_miio/#retrieving-the-access-token) to get the API token to use in the `configuration.yaml` file. - -To add a Xiaomi Philips Light to your installation, add the following to your `configuration.yaml` file: - -```yaml -# Example configuration.yaml entries -light: - - platform: xiaomi_miio - name: Xiaomi Philips Smart LED Ball - host: 192.168.130.67 - token: YOUR_TOKEN - model: philips.light.bulb -``` - -{% configuration %} -host: - description: The IP address of your miio light. - required: true - type: string -token: - description: The API token of your miio light. - required: true - type: string -name: - description: The name of your miio light. - required: false - type: string - default: Xiaomi Philips Light -model: - description: The model of your light. Valid values are `philips.light.sread1`, `philips.light.ceiling`, `philips.light.zyceiling`, `philips.light.moonlight`, `philips.light.bulb`, `philips.light.candle`, `philips.light.candle2`, `philips.light.mono1` and `philips.light.downlight`. This setting can be used to bypass the device model detection and is recommended if your device isn't always available. - required: false - type: string -{% endconfiguration %} - -## Platform Services - -### Service `xiaomi_miio.light_set_scene` - -Set one of the 4 available fixed scenes. - -| Service data attribute | Optional | Description | -|---------------------------|----------|-------------------------------------------------------| -| `entity_id` | no | Only act on a specific Xiaomi miIO light entity. | -| `scene` | no | Scene, between 1 and 4. | - -### Service `xiaomi_miio.light_set_delayed_turn_off` - -Delayed turn off. - -| Service data attribute | Optional | Description | -|---------------------------|----------|-------------------------------------------------------| -| `entity_id` | no | Only act on a specific Xiaomi miIO light entity. | -| `time_period` | no | Time period for the delayed turn off. | - -### Service `xiaomi_miio.light_reminder_on` (Eyecare Smart Lamp 2 only) - -Enable the eye fatigue reminder/notification. - -| Service data attribute | Optional | Description | -|---------------------------|----------|-------------------------------------------------------| -| `entity_id` | no | Only act on a specific Xiaomi miIO light entity. | - -### Service `xiaomi_miio.light_reminder_off` (Eyecare Smart Lamp 2 only) - -Disable the eye fatigue reminder/notification. - -| Service data attribute | Optional | Description | -|---------------------------|----------|-------------------------------------------------------| -| `entity_id` | no | Only act on a specific Xiaomi miIO light entity. | - -### Service `xiaomi_miio.light_night_light_mode_on` (Eyecare Smart Lamp 2 only) - -Turn the smart night light mode on. - -| Service data attribute | Optional | Description | -|---------------------------|----------|-------------------------------------------------------| -| `entity_id` | no | Only act on a specific Xiaomi miIO light entity. | - -### Service `xiaomi_miio.light_night_light_mode_off` (Eyecare Smart Lamp 2 only) - -Turn the smart night light mode off. - -| Service data attribute | Optional | Description | -|---------------------------|----------|-------------------------------------------------------| -| `entity_id` | no | Only act on a specific Xiaomi miIO light entity. | - -### Service `xiaomi_miio.light_eyecare_mode_on` (Eyecare Smart Lamp 2 only) - -Turn the eyecare mode on. - -| Service data attribute | Optional | Description | -|---------------------------|----------|-------------------------------------------------------| -| `entity_id` | no | Only act on a specific Xiaomi miIO light entity. | - -### Service `xiaomi_miio.light_eyecare_mode_off` (Eyecare Smart Lamp 2 only) - -Turn the eyecare mode off. - -| Service data attribute | Optional | Description | -|---------------------------|----------|-------------------------------------------------------| -| `entity_id` | no | Only act on a specific Xiaomi miIO light entity. | diff --git a/source/_integrations/remote.xiaomi_miio.markdown b/source/_integrations/remote.xiaomi_miio.markdown deleted file mode 100644 index 572750223e2..00000000000 --- a/source/_integrations/remote.xiaomi_miio.markdown +++ /dev/null @@ -1,190 +0,0 @@ ---- -title: "Xiaomi IR Remote" -description: "Instructions for how to integrate the Xiaomi IR Remote within Home Assistant." -ha_category: - - Remote -ha_release: 0.63 -ha_iot_class: Local Polling -ha_domain: xiaomi_miio ---- - -The `xiaomi miio` remote platform allows you to send IR commands from your Xiaomi IR Remote (ChuangmiIr). - -## Setup - -Please follow the instructions on [Retrieving the Access Token](/integrations/vacuum.xiaomi_miio/#retrieving-the-access-token) to get the API token to use in the `configuration.yaml` file. - -## Configuring the Platform - -To add a Xiaomi IR Remote to your installation, add the following to your `configuration.yaml` file: -```yaml -remote: - - platform: xiaomi_miio - host: 192.168.42.42 - token: YOUR_TOKEN -``` - -{% configuration %} -host: - description: The IP of your remote. - required: true - type: string -token: - description: The API token of your remote. - required: true - type: string -name: - description: The name of your remote. - required: false - type: string -slot: - description: The slot used to save learned command. - required: false - type: integer - default: 1 -timeout: - description: Timeout for learning a new command. - required: false - type: integer - default: 30 -commands: - description: A list of commands - required: false - type: map - keys: - command: - description: A list of commands as [raw (learned command)](/integrations/remote.xiaomi_miio/#raw) or [pronto hex code](/integrations/remote.xiaomi_miio/#pronto-hex-code). - required: true - type: list - -{% endconfiguration %} - -## Full Configuration - -```yaml -remote: - - platform: xiaomi_miio - name: "bathroom remote" - host: 192.168.42.42 - token: YOUR_TOKEN - slot: 1 - timeout: 30 - commands: - activate_towel_heater: - command: - - raw:base64:[optional_frequency] - read_bad_poem: - command: - - raw:base64:[optional_frequency] - - pronto:pronto_hex:[optional_repeat] -``` - -## Add command as entity button in Lovelace UI - -```yaml -type: entity-button -tap_action: - action: call-service - service: remote.send_command - service_data: - command: activate_towel_heater - entity_id: remote.xiaomi_miio_ir -hold_action: - action: more-info -show_icon: true -show_name: true -entity: remote.xiaomi_miio_ir -icon: 'mdi:radiator' -name: Activate Towel Heater -``` - -## Use named commands to create UI buttons - -```yaml -script: - towel_heater: - sequence: - - service: remote.send_command - entity_id: 'remote.bathroom_remote' - data: - command: - - 'activate_towel_heater' - please_cover_your_ears: - sequence: - - service: remote.send_command - entity_id: 'remote.bathroom_remote' - data: - command: - - 'read_bad_poem' -``` - -## Command Types - -The Xiaomi IR Remote Platform currently supports two different formats for IR codes. - -### Raw - -A raw command is a command learned from [`xiaomi_miio.remote_learn_command`](/integrations/remote.xiaomi_miio/#xiaomi_miioremote_learn_command). - -A raw command is defined as in the following example: - -```bash -raw:Z6UFANEAAAAjAQAAAwkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQIAE= -``` - -with an optional last parameter of frequency: - -```bash -raw:Z6UFANEAAAAjAQAAAwkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQIAE=:38400 -``` - -### Pronto Hex Code - -A pronto hex code is a hex code often supplied by the device manufacturer. - -A pronto hex code is defined as in the following example: - -```bash -pronto:0000 006C 0022 0002 015B 00AD 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0041 0016 0041 0016 0041 0016 0041 0016 0041 0016 0041 0016 0041 0016 0016 0016 0016 0016 0041 0016 0016 0016 0041 0016 0016 0016 0016 0016 0016 0016 0016 0016 0041 0016 0016 0016 0041 0016 0016 0016 0041 0016 0041 0016 0041 0016 0041 0016 0623 015B 0057 0016 0E6E -``` - -with an optional last parameter of repeats (required by some devices): - -```bash -pronto:0000 006C 0022 0002 015B 00AD 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0041 0016 0041 0016 0041 0016 0041 0016 0041 0016 0041 0016 0041 0016 0016 0016 0016 0016 0041 0016 0016 0016 0041 0016 0016 0016 0016 0016 0016 0016 0016 0016 0041 0016 0016 0016 0041 0016 0016 0016 0041 0016 0041 0016 0041 0016 0041 0016 0623 015B 0057 0016 0E6E:2 -``` - -Note there are at least 4 versions of the Xiaomi IR Remote (ChuangmiIr) which can be recognized by their default hostname: - -* `chuangmi.ir.v2` -* `chuangmi.remote.h102a03` -* `chuangmi.remote.v2` -* `chuangmi.remote.h102c01` - -For now, pronto hex codes only work on the first version (`chuangmi.ir.v2`). - -## Platform Services - -The Xiaomi IR Remote Platform registers four services. - -### `remote.send_command` - -Allows sending either named commands using an identifier or sending commands as one of the two types defined in [Command Types](/integrations/remote.xiaomi_miio/#command-types). - -### `xiaomi_miio.remote_learn_command` - -Used to learn new commands. - -Use the entity_id of the Xiaomi IR Remote to start a learning process. - -`slot` and `timeout` can be specified, but multiple commands learned to the same slot can still be sent using [`remote.send_command`](/integrations/remote.xiaomi_miio/#remotesend_command) even if they are overwritten. - -After learning the command the base64 string can be found as a notification in Overview, the string can be copied by left clicking on the string and choose the copy option. - -### `xiaomi_miio.remote_set_led_on` - -Used to turn remote's blue LED on. - -### `xiaomi_miio.remote_set_led_off` - -Used to turn remote's blue LED off. diff --git a/source/_integrations/sensor.xiaomi_miio.markdown b/source/_integrations/sensor.xiaomi_miio.markdown deleted file mode 100644 index a432e741605..00000000000 --- a/source/_integrations/sensor.xiaomi_miio.markdown +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: "Xiaomi Air Quality Index Monitor" -description: "Instructions how to integrate your Xiaomi Mi Air Quality Index Monitor within Home Assistant." -ha_category: - - Health -ha_iot_class: Local Polling -ha_release: 0.66 -ha_domain: xiaomi_miio ---- - -The `xiaomi_miio` sensor platform is observing your Xiaomi Mi Air Quality Monitor (PM2.5) and reporting the air quality index. - -Currently, the supported features are: - -- Air Quality Index (AQI) -- Attributes - - power - - charging - - battery - - time_stat - -Please follow the instructions on [Retrieving the Access Token](/integrations/vacuum.xiaomi_miio/#retrieving-the-access-token) to get the API token. - -## Configuration - -To add a Xiaomi Mi Air Quality Monitor to your installation, add the following to your `configuration.yaml` file: - -```yaml -# Example configuration.yaml entry -sensor: - - platform: xiaomi_miio - host: IP_ADDRESS - token: YOUR_TOKEN -``` - -{% configuration %} -host: - description: The IP address of your miio device. - required: true - type: string -token: - description: The API token of your miio device. - required: true - type: string -name: - description: The name of your miio device. - required: false - type: string - default: Xiaomi Miio Sensor -{% endconfiguration %} diff --git a/source/_integrations/switch.xiaomi_miio.markdown b/source/_integrations/switch.xiaomi_miio.markdown deleted file mode 100644 index 62d6f10d974..00000000000 --- a/source/_integrations/switch.xiaomi_miio.markdown +++ /dev/null @@ -1,123 +0,0 @@ ---- -title: "Xiaomi Smart WiFi Socket and Smart Power Strip" -description: "Instructions on how to integrate your Xiaomi Smart WiFi Socket aka Plug or Xiaomi Smart Power Strip within Home Assistant." -ha_category: - - Switch -ha_iot_class: Local Polling -ha_release: 0.56 -ha_domain: xiaomi_miio ---- - -The `xiaomi_miio` switch platform allows you to control the state of your Xiaomi Smart WiFi Socket aka Plug, Xiaomi Smart Power Strip and Xiaomi Chuangmi Plug V1. - -Please follow the instructions on [Retrieving the Access Token](/integrations/vacuum.xiaomi_miio/#retrieving-the-access-token) to get the API token to use in the `configuration.yaml` file. - -## Features - -### Xiaomi Smart WiFi Socket - -Supported models: `chuangmi.plug.m1`, `chuangmi.plug.m3`, `chuangmi.plug.v2`, `chuangmi.plug.hmi205` - -- Power (on, off) -- Attributes - - Temperature - -### Xiaomi Chuangmi Plug V1 - -Supported models: `chuangmi.plug.v1`, `chuangmi.plug.v3` - -- Power (on, off) -- USB (on, off) -- Attributes - - Temperature - -### Xiaomi Smart Power Strip - -Supported models: `qmi.powerstrip.v1`, `zimi.powerstrip.v2` - -- Power (on, off) -- Wifi LED (on, off) -- Power Price (0...999) -- Power Mode (green, normal) (Power Strip V1 only) -- Attributes - - Temperature - - Current - - Load power - - Wifi LED - - Mode (Power Strip V1 only) - -### Xiaomi Air Conditioning Companion V3 - -Supported models: `lumi.acpartner.v3` (the socket of the `acpartner.v1` and `v2` isn't switchable!) - -* Power (on, off) -* Attributes - - Load power - -## Configuration - -To add a plug to your installation, add the following to your `configuration.yaml` file: - -```yaml -# Example configuration.yaml entries -switch: - - platform: xiaomi_miio - host: MIIO_IP_ADDRESS - token: YOUR_TOKEN -``` - -{% configuration %} -host: - description: The IP address of your miio device. - required: true - type: string -token: - description: The API token of your miio device. - required: true - type: string -name: - description: The name of your miio device. - required: false - type: string - default: Xiaomi Miio Switch -model: - description: The model of your miio device. Valid values are `chuangmi.plug.v1`, `qmi.powerstrip.v1`, `zimi.powerstrip.v2`, `chuangmi.plug.m1`, `chuangmi.plug.m3`, `chuangmi.plug.v2`, `chuangmi.plug.v3` and `chuangmi.plug.hmi205`. This setting can be used to bypass the device model detection and is recommended if your device isn't always available. - required: false - type: string -{% endconfiguration %} - -## Platform Services - -### Service `xiaomi_miio.switch_set_wifi_led_on` (Power Strip only) - -Turn the wifi LED on. - -| Service data attribute | Optional | Description | -|---------------------------|----------|---------------------------------------------------------| -| `entity_id` | no | Only act on a specific Xiaomi miIO switch entity. | - -### Service `xiaomi_miio.switch_set_wifi_led_off` (Power Strip only) - -Turn the wifi LED off. - -| Service data attribute | Optional | Description | -|---------------------------|----------|---------------------------------------------------------| -| `entity_id` | no | Only act on a specific Xiaomi miIO switch entity. | - -### Service `xiaomi_miio.switch_set_power_price` (Power Strip) - -Set the power price. - -| Service data attribute | Optional | Description | -|---------------------------|----------|---------------------------------------------------------| -| `entity_id` | no | Only act on a specific Xiaomi miIO switch entity. | -| `price` | no | Power price, between 0 and 999. | - -### Service `xiaomi_miio.switch_set_power_mode` (Power Strip V1 only) - -Set the power mode. - -| Service data attribute | Optional | Description | -|---------------------------|----------|---------------------------------------------------------------| -| `entity_id` | no | Only act on a specific Xiaomi miIO switch entity. | -| `mode` | no | Power mode, valid values are 'normal' and 'green' | diff --git a/source/_integrations/vacuum.xiaomi_miio.markdown b/source/_integrations/vacuum.xiaomi_miio.markdown deleted file mode 100644 index a454b0ef097..00000000000 --- a/source/_integrations/vacuum.xiaomi_miio.markdown +++ /dev/null @@ -1,480 +0,0 @@ ---- -title: "Xiaomi Mi Robot Vacuum" -description: "Instructions on how to integrate your Xiaomi Mi Robot Vacuum within Home Assistant." -ha_category: - - Vacuum -ha_release: 0.51 -ha_iot_class: Local Polling -ha_domain: xiaomi_miio ---- - -The `xiaomi_miio` vacuum platform allows you to control the state of your [Xiaomi Mi Robot Vacuum](https://www.mi.com/roomrobot/). - -Currently supported services are: - -- `start` -- `pause` -- `stop` -- `return_to_base` -- `locate` -- `clean_spot` -- `set_fan_speed` - Fan speeds: `Silent`, `Standard`, `Medium`, `Turbo` and `Gentle` (exclusively for mopping). -- `remote_control_*` (of your robot) -- `xiaomi_clean_zone` - -## Configuration - -Please follow [Retrieving the Access Token](/integrations/vacuum.xiaomi_miio/#retrieving-the-access-token) to retrieve the API token used in -`configuration.yaml`. - -To add a vacuum to your installation, add the following to `configuration.yaml`: - -```yaml -vacuum: - - platform: xiaomi_miio - host: 192.168.1.2 - token: YOUR_TOKEN -``` - -{% configuration %} -host: - description: The IP address of your robot. - required: true - type: string -token: - description: The API token of your robot. - required: true - type: string -name: - description: The name of your robot. - required: false - type: string - default: Xiaomi Vacuum cleaner -{% endconfiguration %} - -## Platform Services - -In addition to all of the services provided by the `vacuum` integration (`start`, `pause`, `stop`, `return_to_base`, `locate`, `set_fan_speed` and `send_command`), the `xiaomi_miio` platform introduces specific services to access the remote control mode of the robot. These are: - -- `xiaomi_miio.vacuum_remote_control_start` -- `xiaomi_miio.vacuum_remote_control_stop` -- `xiaomi_miio.vacuum_remote_control_move` -- `xiaomi_miio.vacuum_remote_control_move_step` -- `xiaomi_miio.vacuum_clean_zone` - -### Service `xiaomi_miio.vacuum_remote_control_start` - -Start the remote control mode of the robot. You can then move it with `remote_control_move`; when done, call `remote_control_stop`. - -| Service data attribute | Optional | Description | -|---------------------------|----------|---------------------------------------------------| -| `entity_id` | no | Only act on a specific robot | - -### Service `xiaomi_miio.vacuum_remote_control_stop` - -Exit the remote control mode of the robot. - -| Service data attribute | Optional | Description | -|---------------------------|----------|---------------------------------------------------| -| `entity_id` | no | Only act on a specific robot | - -### Service `xiaomi_miio.vacuum_remote_control_move` - -Remote control the robot. Please ensure you first set it in remote control mode with `remote_control_start`. - -| Service data attribute | Optional | Description | -|---------------------------|----------|-----------------------------------------------------------| -| `entity_id` | no | Only act on a specific robot | -| `velocity` | no | Speed: between -0.29 and 0.29 | -| `rotation` | no | Rotation: between -179 degrees and 179 degrees | -| `duration` | no | The number of milliseconds that the robot should move for | - -### Service `xiaomi_miio.vacuum_remote_control_move_step` - -Enter remote control mode, make one move, stop, and exit remote control mode. - -| Service data attribute | Optional | Description | -|---------------------------|----------|-----------------------------------------------------------| -| `entity_id` | no | Only act on a specific robot | -| `velocity` | no | Speed: between -0.29 and 0.29 | -| `rotation` | no | Rotation: between -179 degrees and 179 degrees | -| `duration` | no | The number of milliseconds that the robot should move for | - -### Service `xiaomi_miio.vacuum_clean_zone` - -Start the cleaning operation in the areas selected for the number of repeats indicated. - -| Service data attribute | Optional | Description | -|---------------------------|----------|-------------------------------------------------------| -| `entity_id` | no | Only act on a specific robot | -| `zone` | no | List of zones. Each zone is an array of four integer values. These values represent two sets of x- and y-axis coordinates that describe the beginning and ending points of a square or rectangle cleaning zone. For example, `[[23510,25311,25110,26361]]` creates a box that starts in one corner at the 23510, 25311 (x- and y-axis) coordinates and then is expanded diagonally to the 25110, 26361 coordinates to create a rectangular cleaning zone. | -| `repeats` | no | Number of cleaning repeats for each zone between 1 and 3. | - -Example of `xiaomi_miio.vacuum_clean_zone` use: - -Inline array: -{% raw %} - -```yaml -automation: - - alias: Test vacuum zone3 - trigger: - - event: start - platform: homeassistant - condition: [] - action: - - service: xiaomi_miio.vacuum_clean_zone - data_template: - entity_id: vacuum.xiaomi_vacuum - repeats: '{{states('input_number.vacuum_passes')|int}}' - zone: [[30914,26007,35514,28807], [20232,22496,26032,26496]] -``` - -{% endraw %} - -Array with inline zone: -{% raw %} - -```yaml -automation: - - alias: Test vacuum zone3 - trigger: - - event: start - platform: homeassistant - condition: [] - action: - - service: xiaomi_miio.vacuum_clean_zone - data_template: - entity_id: vacuum.xiaomi_vacuum - repeats: '{{states('input_number.vacuum_passes')|int}}' - zone: - - [30914,26007,35514,28807] - - [20232,22496,26032,26496] -``` - -{% endraw %} - -Array mode: - -```yaml -automation: - - alias: Test vacuum zone3 - trigger: - - event: start - platform: homeassistant - condition: [] - action: - - service: xiaomi_miio.vacuum_clean_zone - data: - entity_id: vacuum.xiaomi_vacuum - repeats: 1 - zone: - - - 30914 - - 26007 - - 35514 - - 28807 - - - 20232 - - 22496 - - 26032 - - 26496 -``` - -### Service `xiaomi_miio.vacuum_goto` - -Go the specified coordinates - -| Service data attribute | Optional | Description | -|---------------------------|----------|-------------------------------------------------------| -| `entity_id` | no | Only act on a specific robot | -| `x_coord` | no | X-coordinate, integer value. The dock is located at x-coordinate 25500. | -| `y_coord` | no | Y-coordinate, integer value. The dock is located at y-coordinate 25500. | - -### Service `xiaomi_miio.vacuum_clean_segment` - -Clean the specified segment/room. A room is identified by a number. Instructions on how to find the valid room numbers and determine what rooms they map to, read the section [Retrieving room numbers](#retrieving-room-numbers). - -| Service data attribute | Optional | Description | -|---------------------------|----------|-------------------------------------------------------| -| `entity_id` | no | Only act on a specific robot | -| `segments` | no | List of segment numbers or one single segment number. | - -Example of `xiaomi_miio.vacuum_clean_segment` use: - -Multiple segments: -```yaml -automation: - - alias: Vaccum kitchen and living room - trigger: - - event: start - platform: homeassistant - condition: [] - action: - - service: xiaomi_miio.vacuum_clean_segment - data: - entity_id: vacuum.xiaomi_vacuum - segments: [1,2] -``` - -Single segment: -```yaml -automation: - - alias: Vacuum kitchen - trigger: - - event: start - platform: homeassistant - condition: [] - action: - - service: xiaomi_miio.vacuum_clean_segment - data: - entity_id: vacuum.xiaomi_vacuum - segments: 1 -``` - -## Attributes - -In addition to [all of the attributes provided by the `vacuum` component](/integrations/vacuum/#attributes), -(`battery_icon`, `cleaned_area`, `fan_speed`, `fan_speed_list`, and `params`), the `xiaomi` platform introduces specific attributes. These are: - -- `cleaning_time` -- `do_not_disturb` -- `main_brush_left` -- `side_brush_left` -- `filter_left` -- `sensor_dirty_left` -- `cleaning_count` -- `total_cleaned_area` -- `total_cleaning_time` -- `clean_start` -- `clean_end` - -The following table shows the units of measurement for each attribute: - -| Attribute | Unit of measurement | Description | -|---------------------------|---------------------|----------------------------------------------------------------| -| `do_not_disturb` | | DND mode on / off | -| `cleaning_time` | minutes | Last / actual cleaning time in minutes | -| `cleaned_area` | square meter | Last / actual cleaned area in square meters | -| `main_brush_left` | hours | Hours left until a change of the main brush is needed | -| `side_brush_left` | hours | Hours left until a change of the side brush is needed | -| `filter_left` | hours | Hours left until a change of the filter is needed | -| `sensor_dirty_left` | hours | Hours left until the wall and cliff sensors should be cleaned | -| `cleaning_count` | | Number of total cleaning cycles | -| `total_cleaned_area` | square meter | Total cleaned area in square meters | -| `total_cleaning_time` | minutes | Total cleaning time in minutes | -| `clean_start` | datetime | The last date/time the vacuum started cleaning (offset naive) | -| `clean_end` | datetime | The last date/time the vacuum finished cleaning (offset naive) | - -## Retrieving the Access Token - -### Xiaomi Home app (Xiaomi Aqara Gateway, Android & iOS) - -1. Install the Xiaomi Home app. -2. Sign In/make an account. -3. Make sure you set your region to: Mainland China (Seems to be the longest line with Chines characters) under settings -> Region (language can later be set on English). -4. Select your Gateway in Xiaomi Home app. -5. Then the 3 dots at the top right of the screen. -6. Then click on about. -7. Tap the version number (Plug-in version 2.77.1 as of January 2020, iOS has a white space instead of version number) at the bottom of the screen repeatedly. -8. You should now see 2 extra options listed in English (iOS still in Chinese), this means you enabled developer mode. [if not, try all steps again!]. -9. Android: under "Hub info" there is quite some text in JSON format, this includes the "token" that you need. -iOS: Most options are still in Chinese, you need the fourth item from the top. - -Note: If you have multiple devices needing a token, e.g., Xiaomi Mi Robot Vacuum and a Xiaomi IR Remote, the above method may not work. The Xiaomi Home app will display a token, though it isn't the correct one. The alternative method using "Mi Home v5.4.49" will provide the correct token. - -### Alternative methods - -

- -### Android (not rooted) - -> If using an Android device to retrieve the Access Token only `v5.4.49` of Mi Home is confirmed working (December 2019). - -1. To begin, set up your Robovac with the latest version of Mi Home on your primary Android device as you normally would. -2. If your Robovac is already set up, you must reset its WiFi settings for it to get a new token. -3. Using `v5.4.49` of Mi Home locate a text file under the `Smarthome/logs` folder where the 32 character token is stored. -4. There will likely be several text files in this directory, search all of them for the word 'token' and you should find it there. Be advised that the latest version of Mi Home does not store the token in clear text. - -### Linux and Rooted Android - -1. To begin, set up your Robovac with the latest version of Mi Home on your primary Android device as you normally would. -2. Ensure successful operation using the latest Mi Home app and give the Vacuum a static IP in your router or however you do that on your LAN. -3. Install version `v5.4.54` of Mi Home on your rooted Android device and login (you can't have two version of Mi Home installed at the same time). -4. Ensure you are using the same server every time -5. Ensure successful operation using 5.4.54 (locate is a nice simple test) -6. Using adb we will now extract the token from the rooted phone -7. Use adb shell to connect to your device and become root (if using Magisck root do `adb shell -> su -> whoami` to ensure root access. -8. Then run grep -R '"token"' /data/data/com.xiaomi.smarthome and grab the token - -### iOS - -1. Configure the robot with the Mi Home app. Make sure to select the correct region, as Xiaomi uses different product names for different geographical areas. Note that the new RoboRock app is currently not supported for this method. -2. Using iTunes, create an unencrypted backup of your iPhone. Since macOS 10.15 there is no iTunes app. Use Finder instead - after connecting your iOS device you should see it in left menu of Finder window. -3. Install [iBackup Viewer](https://www.imactools.com/iphonebackupviewer/), open it, and open your backup. -4. Open the "Raw Data" module. -5. Navigate to `com.xiaomi.mihome`. -6. Search for a file that looks like this: `123456789_mihome.sqlite` (Note: `_mihome.sqlite` is *not* the correct file. Most likely, you will find this file in the `Documents` folder.) -7. Save this file to your filesystem. -8. Install [DB Browser for SQLite](https://sqlitebrowser.org/). -9. Open DB Browser and load the `.sqlite` file you saved from your backup. -10. Click on the `Execute SQL` tab. -11. Input and run this query (use appropriate SELECT query for your device i.e. Vacuum, Powerstrip or Plug): - - ```sql - -- Execute to retrieve token for Vacuum - SELECT ZTOKEN FROM ZDEVICE WHERE ZMODEL LIKE "%vacuum%" - - -- Execute to retrieve token for Smart Powerstrip - SELECT ZTOKEN FROM ZDEVICE WHERE ZMODEL LIKE "%powerstrip%" - - -- Execute to retrieve token for Smart Plug - SELECT ZTOKEN FROM ZDEVICE WHERE ZMODEL LIKE "%plug%" - - ``` - -12. Copy the returned 96-digit hexadecimal string to your clipboard. -13. Open `Terminal` and execute this command: - - ```bash - echo '0: ' | xxd -r -p | openssl enc -d -aes-128-ecb -nopad -nosalt -K 00000000000000000000000000000000 - ``` - -14. Use the resulting 32-digit string as your token. (On your mac in front of the terminal session) - -### Bluestacks - -1. Configure the robot with the Mi-Home app. Make sure to select the correct region, as Xiaomi uses different product names for different geographical areas. Note that the new RoboRock app is currently not supported for this method. -2. Install [BlueStacks](https://www.bluestacks.com). -3. Set up [Mi Home version 5.4.49](https://www.apkmirror.com/apk/xiaomi-inc/mihome/mihome-5-4-49-release/) in BlueStacks and login to synchronize devices. -4. Open Filemanager in the `More Apps` menu. -5. Use `Explore` on the left and navigate to `sdcard/SmartHome/logs/plug_DeviceManager`. -6. Click on `Export to Windows` in the lower left corner and select any or all files to export to you local disk. -7. Search for `"token":""`. - -### Miio command line tool - -Use of Miio should be done before the Vacuum is connected to Mi Home. If you already connected to the app you will need to delete it and then join the ad-hoc Wi-Fi network the Vacuum creates. If the vacuum is already paired it's likely this method will only return `???` as your token. - -You can install the command line tool using the following command: - -```bash -npm install -g miio -``` - -Discovering devices on the current network: - -```bash -miio discover -``` - -This will list devices that are connected to the same network as your computer. Let it run for a while so it has a chance to reach all devices, as it might take a minute or two for all devices to answer. - -The commands outputs each device on this format: - -```text -Device ID: 48765421 -Model info: zhimi.airpurifier.m1 -Address: 192.168.100.9 -Token: token-as-hex-here via auto-token -Support: At least basic -``` - -The information output is: - -- `Device ID` - The unique identifier of the device, does not change if the device is reset. -- `Model ID`- The model id if it could be determined, this indicates what type of device it is. -- `Address` - The IP that the device has on the network. -- `Token` - The token of the device or `???` if it could not be automatically determined. - - -## Example on how to clean a specific room - -Example script using [`vacuum.send_command`](/integrations/vacuum/) to clean a specific room: - -```yaml -vacuum_kitchen: - alias: "Clean the kitchen" - sequence: - - service: vacuum.send_command - data: - entity_id: vacuum.xiaomi_vacuum_cleaner - command: app_segment_clean - params: [18] -``` - -Where params specify room numbers, for multiple rooms, params can be specified like `[17,18]`. Instructions on how to find the valid room numbers and determine what rooms they map to, read the section [Retrieving room numbers](#retrieving-room-numbers). - -## Example on how to reset maintenance hours (brushes, filter, sensors) - -The vacuum entity stores attribute values for when brushes, filters and sensors need to be -cleaned or replaced (`main_brush_left`, `side_brush_left`, `filter_left` and -`sensor_dirty_left`). The values are measured in hours. Once the parts are cleaned -or replaced you can then reset those values on the vacuum. Here is an example script using -[`vacuum.send_command`](/integrations/vacuum/) to reset the hours for the main brush: - -```yaml -reset_main_brush_left: - alias: "Reset hours for main brush replacement" - sequence: - - service: vacuum.send_Command - data: - entity_id: vacuum.xiaomi_vacuum_cleaner - command: reset_consumable - params: ['main_brush_work_time'] -``` - -Allowed `params` for the `reset_consumable` command: -* `['main_brush_work_time']` -* `['side_brush_work_time']` -* `['filter_work_time']` -* `['sensor_dirty_time']` - -## Retrieving Zoned Cleaning Coordinates - -### Using FloleVac (Android) - -1. Download [FloleVac](https://play.google.com/store/apps/details?id=de.flole.xiaomi) -2. Login with your Xiaomi credentials -3. Open Map (make sure you're on the same network as your vacuum cleaner) -4. Select "Zone cleanup" and draw a box around the zone you'd like to clean -5. Long press "Cleanup" and the zone coordinates will be copied to your clipboard - -### Using RoboRock Control Center (requires Valetudo firmware) - -[RRCC](https://github.com/LazyT/rrcc) supports both rooted and non-rooted Vacuums and acts as a mostly fully featured replacement for Mi Home that works locally without the cloud. If you have installed the rooted firmware [Valetudo](https://github.com/Hypfer/Valetudo) you are able to SSH into your Vacuum and enable MQTT plus use map functions with no cloud requirement. - -Using the map editor you are able to acquire the co-ordinates required for zoned clean up. Here is an example script for zoned clean up: - -```yaml -vacuum_kitchen: - alias: "vacuum kitchen" - sequence: - - service: vacuum.send_command - data: - entity_id: 'vacuum.xiaomi_vacuum_cleaner' - command: app_zoned_clean - params: [[23084,26282,27628,29727,1]] -``` - -## Retrieving Room numbers - -Valid room numbers can be retrieved using miio command-line tool: - -```bash -miio protocol call get_room_mapping -``` - -It will only give room numbers and not the room names. To mat the room numbers to your actual rooms, one can just test the clean_segment service with a number and see which room it cleans. The Xiaomi Home App will highlight the room after issuing the request, which makes the process rather convenient. - -It seems to be the case that Numbers 1..15 are used to number the intitial segmentation done by the vacuum cleaner itself. Numbers 16 and upwards numbers rooms from the users manual editing. diff --git a/source/_integrations/xiaomi_miio.markdown b/source/_integrations/xiaomi_miio.markdown index 42564373e97..6ccc20423c1 100644 --- a/source/_integrations/xiaomi_miio.markdown +++ b/source/_integrations/xiaomi_miio.markdown @@ -1,10 +1,17 @@ --- -title: Xiaomi Miio -description: Instructions how to integrate your Xiaomi Mi WiFi Repeater 2 within Home Assistant. +title: "Xiaomi Miio" +description: "Instructions on how to integrate Xiaomi devices using the Xiaomi Miio integration within Home Assistant." ha_category: + - Hub + - Fan + - Alarm - Presence Detection + - Remote + - Health + - Vacuum + - Light ha_iot_class: Local Polling -ha_release: 0.67 +ha_release: 0.51 ha_codeowners: - '@rytilahti' - '@syssi' @@ -12,9 +19,268 @@ ha_domain: xiaomi_miio ha_config_flow: true --- +The `xiaomi_miio` integration supports the following devices: + +- [Xiaomi Gateway](#xiaomi-gateway) +- [Xiaomi device tracker (Xiaomi Mi WiFi Repeater 2)](#xiaomi-device-tracker-xiaomi-mi-wifi-repeater-2)) +- [Xiaomi Air Purifier](#xiaomi-air-purifier) +- [Xiaomi Air Quality Index Monitor](#xiaomi-air-quality-index-monitor) +- [Xiaomi Mi Air Quality Monitor](#xiaomi-mi-air-quality-monitor) +- [Xiaomi IR Remote](#xiaomi-ir-remote) +- [Xiaomi Mi Robot Vacuum](#xiaomi-mi-robot-vacuum) +- [Xiaomi Philips Light](#xiaomi-philips-light) +- [Xiaomi Smart WiFi Socket and Smart Power Strip](#xiaomi-smart-wifi-socket-and-smart-power-strip) + +For many of these devices you need a acces token, the first section will describe how to obtain that acces token. + +## Retrieving the Access Token + +### Xiaomi Home app (Xiaomi Aqara Gateway, Android & iOS) + +1. Install the Xiaomi Home app. +2. Sign In/make an account. +3. Make sure you set your region to: Mainland China (Seems to be the longest line with Chines characters) under settings -> Region (language can later be set on English). +4. Select your Gateway in Xiaomi Home app. +5. Then the 3 dots at the top right of the screen. +6. Then click on about. +7. Tap the version number (Plug-in version 2.77.1 as of January 2020, iOS has a white space instead of version number) at the bottom of the screen repeatedly. +8. You should now see 2 extra options listed in English (iOS still in Chinese), this means you enabled developer mode. [if not, try all steps again!]. +9. Android: under "Hub info" there is quite some text in JSON format, this includes the "token" that you need. +iOS: Most options are still in Chinese, you need the fourth item from the top. + +Note: If you have multiple devices needing a token, e.g., Xiaomi Mi Robot Vacuum and a Xiaomi IR Remote, the above method may not work. The Xiaomi Home app will display a token, though it isn't the correct one. The alternative method using "Mi Home v5.4.49" will provide the correct token. + +### Alternative methods + +
+ +If using an Android device to retrieve the Access Token only `v5.4.49` of Mi Home is confirmed working (December 2019). Use `v5.4.49` of Mi Home locate a text file under the `Smarthome/logs` folder where the 32 character token is stored. There will likely be several text files in this directory, search all of them for the word 'token' and you should find it there. Be advised that the latest version of Mi Home does not store the token in clear text. +

+The iPhone app still stores the token in the SQLite db as of `v4.23.4` (Nov 17, 2019). +

+After resetting the Wi-Fi settings of the Xiaomi robot vacuum, a new Access Token will be generated and therefore these instructions need to be followed again. +

+These instructions are written for the Mi Home app - not for the new RoboRock app. +

+This token (32 hexadecimal characters) is required for the Xiaomi Mi Robot Vacuum, Mi Robot 2 (Roborock) Vacuum, Xiaomi Philips Lights and Xiaomi IR Remote. The Xiaomi Gateway uses another security method and requires a `key` (16 alphanumeric chars), which can be obtained easily via a hidden menu item at the Mi-Home app or using the `miio` command line tool. +
+ +### Android (not rooted) + +> If using an Android device to retrieve the Access Token only `v5.4.49` of Mi Home is confirmed working (December 2019). + +1. To begin, set up your Robovac with the latest version of Mi Home on your primary Android device as you normally would. +2. If your Robovac is already set up, you must reset its WiFi settings for it to get a new token. +3. Using `v5.4.49` of Mi Home locate a text file under the `Smarthome/logs` folder where the 32 character token is stored. +4. There will likely be several text files in this directory, search all of them for the word 'token' and you should find it there. Be advised that the latest version of Mi Home does not store the token in clear text. + +### Linux and Rooted Android + +1. To begin, set up your Robovac with the latest version of Mi Home on your primary Android device as you normally would. +2. Ensure successful operation using the latest Mi Home app and give the Vacuum a static IP in your router or however you do that on your LAN. +3. Install version `v5.4.54` of Mi Home on your rooted Android device and login (you can't have two version of Mi Home installed at the same time). +4. Ensure you are using the same server every time +5. Ensure successful operation using 5.4.54 (locate is a nice simple test) +6. Using adb we will now extract the token from the rooted phone +7. Use adb shell to connect to your device and become root (if using Magisck root do `adb shell -> su -> whoami` to ensure root access. +8. Then run grep -R '"token"' /data/data/com.xiaomi.smarthome and grab the token + +### iOS + +1. Configure the robot with the Mi Home app. Make sure to select the correct region, as Xiaomi uses different product names for different geographical areas. Note that the new RoboRock app is currently not supported for this method. +2. Using iTunes, create an unencrypted backup of your iPhone. Since macOS 10.15 there is no iTunes app. Use Finder instead - after connecting your iOS device you should see it in left menu of Finder window. +3. Install [iBackup Viewer](https://www.imactools.com/iphonebackupviewer/), open it, and open your backup. +4. Open the "Raw Data" module. +5. Navigate to `com.xiaomi.mihome`. +6. Search for a file that looks like this: `123456789_mihome.sqlite` (Note: `_mihome.sqlite` is *not* the correct file. Most likely, you will find this file in the `Documents` folder.) +7. Save this file to your filesystem. +8. Install [DB Browser for SQLite](https://sqlitebrowser.org/). +9. Open DB Browser and load the `.sqlite` file you saved from your backup. +10. Click on the `Execute SQL` tab. +11. Input and run this query (use appropriate SELECT query for your device i.e. Vacuum, Powerstrip or Plug): + + ```sql + -- Execute to retrieve token for Vacuum + SELECT ZTOKEN FROM ZDEVICE WHERE ZMODEL LIKE "%vacuum%" + + -- Execute to retrieve token for Smart Powerstrip + SELECT ZTOKEN FROM ZDEVICE WHERE ZMODEL LIKE "%powerstrip%" + + -- Execute to retrieve token for Smart Plug + SELECT ZTOKEN FROM ZDEVICE WHERE ZMODEL LIKE "%plug%" + ``` + +12. Copy the returned 96-digit hexadecimal string to your clipboard. +13. Open `Terminal` and execute this command: + + ```bash + echo '0: ' | xxd -r -p | openssl enc -d -aes-128-ecb -nopad -nosalt -K 00000000000000000000000000000000 + ``` + +14. Use the resulting 32-digit string as your token. (On your mac in front of the terminal session) + +### Bluestacks + +1. Configure the robot with the Mi-Home app. Make sure to select the correct region, as Xiaomi uses different product names for different geographical areas. Note that the new RoboRock app is currently not supported for this method. +2. Install [BlueStacks](https://www.bluestacks.com). +3. Set up [Mi Home version 5.4.49](https://www.apkmirror.com/apk/xiaomi-inc/mihome/mihome-5-4-49-release/) in BlueStacks and login to synchronize devices. +4. Open Filemanager in the `More Apps` menu. +5. Use `Explore` on the left and navigate to `sdcard/SmartHome/logs/plug_DeviceManager`. +6. Click on `Export to Windows` in the lower left corner and select any or all files to export to you local disk. +7. Search for `"token":""`. + +### Miio command line tool + +Use of Miio should be done before the Vacuum is connected to Mi Home. If you already connected to the app you will need to delete it and then join the ad-hoc Wi-Fi network the Vacuum creates. If the vacuum is already paired it's likely this method will only return `???` as your token. + +You can install the command line tool using the following command: + +```bash +npm install -g miio +``` + +Discovering devices on the current network: + +```bash +miio discover +``` + +This will list devices that are connected to the same network as your computer. Let it run for a while so it has a chance to reach all devices, as it might take a minute or two for all devices to answer. + +The commands outputs each device on this format: + +```text +Device ID: 48765421 +Model info: zhimi.airpurifier.m1 +Address: 192.168.100.9 +Token: token-as-hex-here via auto-token +Support: At least basic +``` + +The information output is: + +- `Device ID` - The unique identifier of the device, does not change if the device is reset. +- `Model ID`- The model id if it could be determined, this indicates what type of device it is. +- `Address` - The IP that the device has on the network. +- `Token` - The token of the device or `???` if it could not be automatically determined. + +## Xiaomi Gateway + +The `xiaomi_miio` gateway integration allows you to control the gateway and its connected subdevices. + +Please follow the instructions on [Retrieving the Access Token](/integrations/xiaomi_miio/#retrieving-the-access-token) to get the API token to use during configuration flow setup. + +### Configuration flow setup + +To set up the Xiaomi gateway, click Configuration in the sidebar, then click Integrations and then click the + icon in the lower right and find xiaomi_miio. Select the option "Connect to a Xiaomi Gateway" and click submit. You will then be presented with a form in which you will need to fill in the "IP address" and 32 characters "token". Optionally, you can specify a different name for the gateway. After you click submit, you will have the opportunity to select the area that your devices are located. + +{% configuration %} +host: + description: The IP address of your Xiaomi gateway. + required: true + type: string +token: + description: The API token of your Xiaomi gateway [Retrieving the Access Token](/integrations/xiaomi_miio/#retrieving-the-access-token). + required: true + type: string +name: + description: The name of your Xiaomi gateway. + required: false + type: string + default: Xiaomi Gateway +{% endconfiguration %} + +### Supported Xiaomi gateway models: + +| Gateway name | Zigbee id | model | supported | +| ------------------ | ------------------- | ------------ |------------------------------------------ | +| Chinese version | lumi.gateway.v3 | DGNWG02LM | yes | +| European version | lumi.gateway.mieu01 | ZHWG11LM-763 | only gateway features (no subdevices yet) | +| Aqara hub | lumi.gateway.aqhm01 | ZHWG11LM | untested | +| Mijia Zigbee 3.0 | lumi.gateway.mgl03 | ZNDMWG03LM | untested | +| Aqara AC Companion | lumi.acpartner.v1 | KTBL01LM | untested | +| Mi AC Companion | lumi.acpartner.v2 | KTBL02LM | untested | +| Aqara AC Companion | lumi.acpartner.v3 | KTBL11LM | yes | + +### Gateway Features + +- Gateway alarm control (Turn on/off; see status `armed_away`, `disarmed`, `arming`) + +Not yet implemented features (but possible): + +- Gateway light control +- Gateway light sensor readout +- Gateway internet radio (only chinese stations) + +### Supported subdevices + +These subdevices are fully implemented in HomeAssistant: + +| Subdevice name | Zigbee id | model | features | +| -------------------------------- | ----------------------- | --------------- | ------------------------------------------------ | +| Weather sensor | lumi.sensor_ht | WSDCGQ01LM | readout `temperature` and `humidity` | +| Weather sensor | lumi.weather.v1 | WSDCGQ11LM | readout `temperature`, `humidity` and `pressure` | + +### Recognized subdevices (not yet implemented) + +These subdevices are recognized by the python-miio code but are still being worked on (not yet implemented). + +| Subdevice name | Zigbee id | model | +| -------------------------------- | ----------------------- | --------------- | +| Button | lumi.sensor_switch | WXKG01LM | +| Button | lumi.sensor_switch.aq2 | WXKG11LM 2015 | +| Button | lumi.sensor_switch.aq3 | WXKG12LM | +| Button | lumi.remote.b1acn01 | WXKG11LM 2018 | +| Cube | lumi.sensor_cube.v1 | MFKZQ01LM | +| Cube | lumi.sensor_cube.aqgl01 | MFKZQ01LM | +| Motion sensor | lumi.sensor_motion | RTCGQ01LM | +| Motion sensor | lumi.sensor_motion.aq2 | RTCGQ11LM | +| Door sensor | lumi.sensor_magnet | MCCGQ01LM | +| Door sensor | lumi.sensor_magnet.aq2 | MCCGQ11LM | +| Vibration sensor | lumi.vibration.aq1 | DJT11LM | +| Honeywell smoke detector | lumi.sensor_smoke | JTYJ-GD-01LM/BW | +| Honeywell natural gas detector | lumi.sensor_natgas | JTQJ-BF-01LM/BW | +| Water leak sensor | lumi.sensor_wleak.aq1 | SJCGQ11LM | +| Remote switch single | lumi.sensor_86sw1.v1 | WXKG03LM 2016 | +| Remote switch single | lumi.remote.b186acn01 | WXKG03LM 2018 | +| D1 remote switch single | lumi.remote.b186acn02 | WXKG06LM | +| Remote switch double | lumi.sensor_86sw2.v1 | WXKG02LM 2016 | +| Remote switch double | lumi.remote.b286acn01 | WXKG02LM 2018 | +| D1 remote switch double | lumi.remote.b286acn02 | WXKG07LM | +| Wall switch single | lumi.ctrl_ln1 | QBKG11LM | +| Wall switch single | lumi.ctrl_ln1.aq1 | QBKG11LM | +| Wall switch no neutral | lumi.ctrl_neutral1.v1 | QBKG04LM | +| Wall switch double | lumi.ctrl_ln2 | QBKG12LM | +| Wall switch double | lumi.ctrl_ln2.aq1 | QBKG12LM | +| Wall switch double no neutral | lumi.ctrl_neutral2 | QBKG03LM | +| D1 wall switch triple | lumi.switch.n3acn3 | QBKG26LM | +| D1 wall switch triple no neutral | lumi.switch.l3acn3 | QBKG25LM | +| Wall outlet | lumi.ctrl_86plug.v1 | QBCZ11LM | +| Wall outlet | lumi.ctrl_86plug.aq1 | QBCZ11LM | +| Plug | lumi.plug | ZNCZ02LM | +| Relay | lumi.relay.c2acn01 | LLKZMK11LM | +| Curtain | lumi.curtain | ZNCLDJ11LM | +| Curtain | lumi.curtain.aq2 | ZNGZDJ11LM | +| Curtain B1 | lumi.curtain.hagl04 | ZNCLDJ12LM | +| Door lock S1 | lumi.lock.aq1 | ZNMS11LM | +| Door lock S2 | lumi.lock.acn02 | ZNMS12LM | +| Door lock S2 pro | lumi.lock.acn03 | ZNMS13LM | +| Vima cylinder lock | lumi.lock.v1 | A6121 | +| Smart bulb E27 | lumi.light.aqcn02 | ZNLDP12LM | +| IKEA smart bulb E27 white | ikea.light.led1545g12 | LED1545G12 | +| IKEA smart bulb E27 white | ikea.light.led1546g12 | LED1546G12 | +| IKEA smart bulb E12 white | ikea.light.led1536g5 | LED1536G5 | +| IKEA smart bulb GU10 white | ikea.light.led1537r6 | LED1537R6 | +| IKEA smart bulb E27 white | ikea.light.led1623g12 | LED1623G12 | +| IKEA smart bulb GU10 white | ikea.light.led1650r5 | LED1650R5 | +| IKEA smart bulb E12 white | ikea.light.led1649c5 | LED1649C5 | +| Thermostat S2 | lumi.airrtc.tcpecn02 | KTWKQ03ES | + +## Xiaomi device tracker (Xiaomi Mi WiFi Repeater 2) + The `xiaomi_miio` device tracker platform is observing your Xiaomi Mi WiFi Repeater 2 and reporting all associated WiFi clients. -Please follow the instructions on [Retrieving the Access Token](/integrations/vacuum.xiaomi_miio/#retrieving-the-access-token) to get the API token. +Please follow the instructions on [Retrieving the Access Token](/integrations/xiaomi_miio/#retrieving-the-access-token) to get the API token. To add a Xiaomi Mi WiFi Repeater device tracker to your installation, add the following to your `configuration.yaml` file: @@ -35,3 +301,1454 @@ token: required: true type: string {% endconfiguration %} + +## Xiaomi Air Purifier + +The `xiaomi_miio` fan platform allows you to control the Xiaomi Air Purifier, Air Humidifier and Air Fresh. + +Supported devices: + +| Name | Model | Model no. | +| ---------------------- | ---------------------- | --------- | +| Air Purifier | zhimi.airpurifier.v1 | | +| Air Purifier 2 | zhimi.airpurifier.v2 | FJY4006CN | +| Air Purifier V3 | zhimi.airpurifier.v3 | | +| Air Purifier V5 | zhimi.airpurifier.v5 | | +| Air Purifier Pro | zhimi.airpurifier.v6 | | +| Air Purifier Pro V7 | zhimi.airpurifier.v7 | | +| Air Purifier 2 (mini) | zhimi.airpurifier.m1 | | +| Air Purifier (mini) | zhimi.airpurifier.m2 | | +| Air Purifier MA1 | zhimi.airpurifier.ma1 | | +| Air Purifier 2S | zhimi.airpurifier.ma2 | | +| Air Purifier 2S | zhimi.airpurifier.mc1 | | +| Air Purifier Super | zhimi.airpurifier.sa1 | | +| Air Purifier Super 2 | zhimi.airpurifier.sa2 | | +| Air Purifier 3 (2019) | zhimi.airpurifier.ma4 | | +| Air Purifier 3H (2019) | zhimi.airpurifier.mb3 | | +| Air Humidifier | zhimi.humidifier.v1 | | +| Air Humidifier CA1 | zhimi.humidifier.ca1 | | +| Air Humidifier CB1 | zhimi.humidifier.cb1 | | +| Air Fresh VA2 | zhimi.airfresh.va2 | | + +### Features + +### Air Purifier 2 et al. + +- Power (on, off) +- Operation modes (auto, silent, favorite, idle) +- Buzzer (on, off) +- Child lock (on, off) +- LED (on, off), LED brightness (bright, dim, off) +- Favorite Level (0...16) +- Attributes + - `model` + - `temperature` + - `humidity` + - `aqi` + - `mode` + - `filter_hours_used` + - `filter_life_remaining` + - `favorite_level` + - `child_lock` + - `led` + - `motor_speed` + - `average_aqi` + - `purify_volume` + - `learn_mode` + - `sleep_time` + - `sleep_mode_learn_count` + - `extra_features` + - `turbo_mode_supported` + - `auto_detect` + - `use_time` + - `button_pressed` + - `buzzer` + - `led_brightness` + - `sleep_mode` + +### Air Purifier Pro (zhimi.airpurifier.v6) + +- Power (on, off) +- Operation modes (auto, silent, favorite) +- Child lock (on, off) +- LED (on, off) +- Favorite Level (0...16) +- Attributes + - `model` + - `temperature` + - `humidity` + - `aqi` + - `mode` + - `filter_hours_used` + - `filter_life_remaining` + - `favorite_level` + - `child_lock` + - `led` + - `motor_speed` + - `average_aqi` + - `purify_volume` + - `learn_mode` + - `sleep_time` + - `sleep_mode_learn_count` + - `extra_features` + - `turbo_mode_supported` + - `auto_detect` + - `use_time` + - `button_pressed` + - `filter_rfid_product_id` + - `filter_rfid_tag` + - `filter_type` + - `illuminance` + - `motor2_speed` + - `volume` + +### Air Purifier Pro V7 (zhimi.airpurifier.v7) + +- Power (on, off) +- Operation modes (auto, silent, favorite) +- Child lock (on, off) +- LED (on, off) +- Favorite Level (0...16) +- Attributes + - `model` + - `temperature` + - `humidity` + - `aqi` + - `mode` + - `filter_hours_used` + - `filter_life_remaining` + - `favorite_level` + - `child_lock` + - `led` + - `motor_speed` + - `average_aqi` + - `learn_mode` + - `extra_features` + - `turbo_mode_supported` + - `button_pressed` + - `filter_rfid_product_id` + - `filter_rfid_tag` + - `filter_type` + - `illuminance` + - `motor2_speed` + - `volume` + +### Air Purifier 2S (zhimi.airpurifier.mc1) + +- Power (on, off) +- Operation modes (auto, silent, favorite) +- Buzzer (on, off) +- Child lock (on, off) +- LED (on, off) +- Favorite Level (0...16) +- Attributes + - `model` + - `temperature` + - `humidity` + - `aqi` + - `mode` + - `filter_hours_used` + - `filter_life_remaining` + - `favorite_level` + - `child_lock` + - `led` + - `motor_speed` + - `average_aqi` + - `learn_mode` + - `extra_features` + - `turbo_mode_supported` + - `button_pressed` + - `filter_rfid_product_id` + - `filter_rfid_tag` + - `filter_type` + - `illuminance` + - `buzzer` + +### Air Purifier 3/3H (2019) (zhimi.airpurifier.ma4/zhimi.airpurifier.mb3) + +This model uses newer MiOT communication protocol. + +- Power (on, off) +- Operation modes (auto, silent, favorite, fan) +- Buzzer (on, off) +- Child lock (on, off) +- LED (on, off) +- Favorite Level (0...16) +- Fan Level (1...3) +- Attributes + - `model` + - `temperature` + - `humidity` + - `aqi` + - `mode` + - `filter_hours_used` + - `filter_life_remaining` + - `favorite_level` + - `child_lock` + - `led` + - `motor_speed` + - `average_aqi` + - `purify_volume` + - `use_time` + - `buzzer` + - `led_brightness` + - `filter_rfid_product_id` + - `filter_rfid_tag` + - `filter_type` + - `fan_level` + +### Air Purifier V3 (zhimi.airpurifier.v3) + +- Power (on, off) +- Operation modes (auto, silent, favorite, idle, medium, high, strong) +- Child lock (on, off) +- LED (on, off) +- Attributes + - `model` + - `aqi` + - `mode` + - `led` + - `buzzer` + - `child_lock` + - `illuminance` + - `filter_hours_used` + - `filter_life_remaining` + - `motor_speed` + - `average_aqi` + - `volume` + - `motor2_speed` + - `filter_rfid_product_id` + - `filter_rfid_tag` + - `filter_type` + - `purify_volume` + - `learn_mode` + - `sleep_time` + - `sleep_mode_learn_count` + - `extra_features` + - `auto_detect` + - `use_time` + - `button_pressed` + +### Air Humidifier (zhimi.humidifier.v1) + +- On, Off +- Operation modes (silent, medium, high, strong) +- Buzzer (on, off) +- Child lock (on, off) +- LED (on, off), LED brightness (bright, dim, off) +- Target humidity (30, 40, 50, 60, 70, 80) +- Attributes + - `model` + - `temperature` + - `humidity` + - `mode` + - `buzzer` + - `child_lock` + - `trans_level` + - `target_humidity` + - `led_brightness` + - `button_pressed` + - `use_time` + - `hardware_version` + +### Air Humidifier CA (zhimi.humidifier.ca1) + +- On, Off +- Operation modes (silent, medium, high, auto) +- Buzzer (on, off) +- Child lock (on, off) +- LED (on, off), LED brightness (bright, dim, off) +- Target humidity (30, 40, 50, 60, 70, 80) +- Dry mode (on, off) +- Attributes + - `model` + - `temperature` + - `humidity` + - `mode` + - `buzzer` + - `child_lock` + - `trans_level` + - `target_humidity` + - `led_brightness` + - `button_pressed` + - `use_time` + - `hardware_version` + - `motor_speed` + - `depth` + - `dry` + +### Air Humidifier CB (zhimi.humidifier.cb1) + +- On, Off +- Operation modes (silent, medium, high, auto) +- Buzzer (on, off) +- Child lock (on, off) +- LED (on, off), LED brightness (bright, dim, off) +- Target humidity (30, 40, 50, 60, 70, 80) +- Dry mode (on, off) +- Attributes + - `speed` + - `speed_list` + - `model` + - `temperature` + - `humidity` + - `mode` + - `buzzer` + - `child_lock` + - `target_humidity` + - `led_brightness` + - `use_time` + - `hardware_version` + - `motor_speed` + - `depth` + - `dry` + - `supported_features` + +### Air Fresh VA2 + +- Power (on, off) +- Operation modes (auto, silent, interval, low, middle, strong) +- Buzzer (on, off) +- Child lock (on, off) +- LED (on, off), LED brightness (bright, dim, off) +- Attributes + - `model` + - `aqi` + - `average_aqi` + - `temperature` + - `humidity` + - `co2` + - `mode` + - `led` + - `led_brightness` + - `buzzer` + - `child_lock` + - `filter_life_remaining` + - `filter_hours_used` + - `use_time` + - `motor_speed` + - `extra_features` + +Please follow the instructions on [Retrieving the Access Token](/integrations/xiaomi_miio/#retrieving-the-access-token) to get the API token to use in the `configuration.yaml` file. + +To add a Xiaomi Air Purifier to your installation, add the following to your `configuration.yaml` file: + +```yaml +fan: +# Example configuration.yaml entry + - platform: xiaomi_miio + host: 192.168.130.66 + token: YOUR_TOKEN +``` + +{% configuration %} +host: + description: The IP address of your miio fan. + required: true + type: string +token: + description: The API token of your miio fan. + required: true + type: string +name: + description: The name of your miio fan. + required: false + type: string + default: Xiaomi Air Purifier +model: + description: The model of your miio fan. See the table above for valid values (f.e. `zhimi.airpurifier.v2`). This setting can be used to bypass the device model detection and is recommended if your device isn't always available. + required: false + type: string +{% endconfiguration %} + +### Platform Services + +### Service `fan.set_speed` + +Set the fan speed/operation mode. + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------------------------| +| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | +| `speed` | no | Fan speed. Valid values are 'Auto', 'Silent', 'Favorite' and 'Idle' | + +### Service `xiaomi_miio.fan_set_buzzer_on` (Air Purifier Pro excluded) + +Turn the buzzer on. + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------------| +| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | + +### Service `xiaomi_miio.fan_set_buzzer_off` (Air Purifier Pro excluded) + +Turn the buzzer off. + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------------| +| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | + +### Service `xiaomi_miio.fan_set_led_on` (Air Purifiers only) + +Turn the LED on. + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------------| +| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | + +### Service `xiaomi_miio.fan_set_led_off` (Air Purifiers only) + +Turn the LED off. + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------------| +| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | + +### Service `xiaomi_miio.fan_set_child_lock_on` + +Turn the child lock on. + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------------| +| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | + +### Service `xiaomi_miio.fan_set_child_lock_off` + +Turn the child lock off. + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------------| +| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | + +### Service `xiaomi_miio.fan_set_led_brightness` (Air Purifier 2S and Air Purifier Pro excluded) + +Set the LED brightness. Supported values are 0 (Bright), 1 (Dim), 2 (Off). + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------------| +| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | +| `brightness` | no | Brightness, between 0 and 2. | + +### Service `xiaomi_miio.fan_set_favorite_level` (Air Purifiers only) + +Set the favorite level of the operation mode "favorite". + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------------| +| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | +| `level` | no | Level, between 0 and 16. | + +### Service `xiaomi_miio.fan_set_fan_level` (Air Purifiers only) + +Set the fan level for "fan" operation mode. + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------------| +| `entity_id` | no | Only act on a specific Xiaomi MiOT fan entity. | +| `level` | no | Level, between 1 and 3. | + +### Service `xiaomi_miio.fan_set_auto_detect_on` (Air Purifier 2S and Air Purifier Pro only) + +Turn the auto detect on. + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------------| +| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | + +### Service `xiaomi_miio.fan_set_auto_detect_off` (Air Purifier 2S and Air Purifier Pro only) + +Turn the auto detect off. + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------------| +| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | + +### Service `xiaomi_miio.fan_set_learn_mode_on` (Air Purifier 2 only) + +Turn the learn mode on. + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------------| +| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | + +### Service `xiaomi_miio.fan_set_learn_mode_off` (Air Purifier 2 only) + +Turn the learn mode off. + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------------| +| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | + +### Service `xiaomi_miio.fan_set_volume` (Air Purifier Pro only) + +Set the sound volume. + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------------| +| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | +| `volume` | no | Volume, between 0 and 100. | + +### Service `xiaomi_miio.fan_reset_filter` (Air Purifier 2 only) + +Reset the filter lifetime and usage. + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------------| +| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | + +### Service `xiaomi_miio.fan_set_extra_features` (Air Purifier only) + +Set the extra features. + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------------| +| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | +| `features` | no | Integer, known values are 0 and 1. | + +### Service `xiaomi_miio.fan_set_target_humidity` (Air Humidifier only) + +Set the target humidity. + +| Service data attribute | Optional | Description | +|---------------------------|----------|-----------------------------------------------------------------| +| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | +| `humidity` | no | Target humidity. Allowed values are 30, 40, 50, 60, 70 and 80 | + +### Service `fan.xiaomi_miio_set_dry_on` (Air Humidifier CA and CB) + +Turn the dry mode on. + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------------| +| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | + +### Service `fan.xiaomi_miio_set_dry_off` (Air Humidifier CA and CB) + +Turn the dry mode off. + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------------| +| `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | + +### Troubleshooting `Unable to find device` error messages + +Check if the device is in the same subnet as the Home Assistant instance. Otherwise, you should configure your router/firewall to put this device in the same VLAN as the Home Assistant instance. + +If it's not possible to use VLANs for some reason, your last resort may be using NAT translation, between the IPs. + +## Xiaomi Air Quality Index Monitor + +The `xiaomi_miio` sensor platform is observing your Xiaomi Mi Air Quality Monitor (PM2.5) and reporting the air quality index. + +Currently, the supported features are: + +- Air Quality Index (AQI) +- Attributes + - power + - charging + - battery + - time_stat + +Please follow the instructions on [Retrieving the Access Token](/integrations/xiaomi_miio/#retrieving-the-access-token) to get the API token. + +### Configuration + +To add a Xiaomi Mi Air Quality Monitor to your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +sensor: + - platform: xiaomi_miio + host: IP_ADDRESS + token: YOUR_TOKEN +``` + +{% configuration %} +host: + description: The IP address of your miio device. + required: true + type: string +token: + description: The API token of your miio device. + required: true + type: string +name: + description: The name of your miio device. + required: false + type: string + default: Xiaomi Miio Sensor +{% endconfiguration %} + +## Xiaomi Mi Air Quality Monitor + +The `xiaomi_miio` sensor platform is observing your Xiaomi Mi Air Quality Monitor and reporting the air quality values. + +Currently, the supported features are: + +- Particulate matter 2.5 +- Attributes + - carbon_dioxide_equivalent + - total_volatile_organic_compounds + - temperature + - humidity + +Please follow the instructions on [Retrieving the Access Token](/integrations/xiaomi_miio/#retrieving-the-access-token) to get the API token. + +### Configuration + +To add a Xiaomi Mi Air Quality Monitor to your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +air_quality: + - platform: xiaomi_miio + host: IP_ADDRESS + token: YOUR_TOKEN +``` + +{% configuration %} +host: + description: The IP address of your miio device. + required: true + type: string +token: + description: The API token of your miio device. + required: true + type: string +name: + description: The name of your miio device. + required: false + type: string + default: Xiaomi Miio Air Quality Monitor +{% endconfiguration %} + +## Xiaomi IR Remote + +The `xiaomi miio` remote platform allows you to send IR commands from your Xiaomi IR Remote (ChuangmiIr). + +### Setup + +Please follow the instructions on [Retrieving the Access Token](/integrations/xiaomi_miio/#retrieving-the-access-token) to get the API token to use in the `configuration.yaml` file. + +### Configuring the Platform + +To add a Xiaomi IR Remote to your installation, add the following to your `configuration.yaml` file: + +```yaml +remote: + - platform: xiaomi_miio + host: 192.168.42.42 + token: YOUR_TOKEN +``` + +{% configuration %} +host: + description: The IP of your remote. + required: true + type: string +token: + description: The API token of your remote. + required: true + type: string +name: + description: The name of your remote. + required: false + type: string +slot: + description: The slot used to save learned command. + required: false + type: integer + default: 1 +timeout: + description: Timeout for learning a new command. + required: false + type: integer + default: 30 +commands: + description: A list of commands + required: false + type: map + keys: + command: + description: A list of commands as [raw (learned command)](/integrations/xiaomi_miio/#raw) or [pronto hex code](/integrations/xiaomi_miio/#pronto-hex-code). + required: true + type: list +{% endconfiguration %} + +### Full Configuration + +```yaml +remote: + - platform: xiaomi_miio + name: "bathroom remote" + host: 192.168.42.42 + token: YOUR_TOKEN + slot: 1 + timeout: 30 + commands: + activate_towel_heater: + command: + - raw:base64:[optional_frequency] + read_bad_poem: + command: + - raw:base64:[optional_frequency] + - pronto:pronto_hex:[optional_repeat] +``` + +### Add command as entity button in Lovelace UI + +```yaml +type: entity-button +tap_action: + action: call-service + service: remote.send_command + service_data: + command: activate_towel_heater + entity_id: remote.xiaomi_miio_ir +hold_action: + action: more-info +show_icon: true +show_name: true +entity: remote.xiaomi_miio_ir +icon: 'mdi:radiator' +name: Activate Towel Heater +``` + +### Use named commands to create UI buttons + +```yaml +script: + towel_heater: + sequence: + - service: remote.send_command + entity_id: 'remote.bathroom_remote' + data: + command: + - 'activate_towel_heater' + please_cover_your_ears: + sequence: + - service: remote.send_command + entity_id: 'remote.bathroom_remote' + data: + command: + - 'read_bad_poem' +``` + +### Command Types + +The Xiaomi IR Remote Platform currently supports two different formats for IR codes. + +### Raw + +A raw command is a command learned from [`xiaomi_miio.remote_learn_command`](/integrations/xiaomi_miio/#xiaomi_miioremote_learn_command). + +A raw command is defined as in the following example: + +```bash +raw:Z6UFANEAAAAjAQAAAwkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQIAE= +``` + +with an optional last parameter of frequency: + +```bash +raw:Z6UFANEAAAAjAQAAAwkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQIAE=:38400 +``` + +### Pronto Hex Code + +A pronto hex code is a hex code often supplied by the device manufacturer. + +A pronto hex code is defined as in the following example: + +```bash +pronto:0000 006C 0022 0002 015B 00AD 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0041 0016 0041 0016 0041 0016 0041 0016 0041 0016 0041 0016 0041 0016 0016 0016 0016 0016 0041 0016 0016 0016 0041 0016 0016 0016 0016 0016 0016 0016 0016 0016 0041 0016 0016 0016 0041 0016 0016 0016 0041 0016 0041 0016 0041 0016 0041 0016 0623 015B 0057 0016 0E6E +``` + +with an optional last parameter of repeats (required by some devices): + +```bash +pronto:0000 006C 0022 0002 015B 00AD 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0016 0041 0016 0041 0016 0041 0016 0041 0016 0041 0016 0041 0016 0041 0016 0016 0016 0016 0016 0041 0016 0016 0016 0041 0016 0016 0016 0016 0016 0016 0016 0016 0016 0041 0016 0016 0016 0041 0016 0016 0016 0041 0016 0041 0016 0041 0016 0041 0016 0623 015B 0057 0016 0E6E:2 +``` + +Note there are at least 4 versions of the Xiaomi IR Remote (ChuangmiIr) which can be recognized by their default hostname: + +- `chuangmi.ir.v2` +- `chuangmi.remote.h102a03` +- `chuangmi.remote.v2` +- `chuangmi.remote.h102c01` + +For now, pronto hex codes only work on the first version (`chuangmi.ir.v2`). + +### Platform Services + +The Xiaomi IR Remote Platform registers four services. + +### `remote.send_command` + +Allows sending either named commands using an identifier or sending commands as one of the two types defined in [Command Types](/integrations/xiaomi_miio/#command-types). + +### `xiaomi_miio.remote_learn_command` + +Used to learn new commands. + +Use the entity_id of the Xiaomi IR Remote to start a learning process. + +`slot` and `timeout` can be specified, but multiple commands learned to the same slot can still be sent using [`remote.send_command`](/integrations/xiaomi_miio/#remotesend_command) even if they are overwritten. + +After learning the command the base64 string can be found as a notification in Overview, the string can be copied by left clicking on the string and choose the copy option. + +### `xiaomi_miio.remote_set_led_on` + +Used to turn remote's blue LED on. + +### `xiaomi_miio.remote_set_led_off` + +Used to turn remote's blue LED off. + +## Xiaomi Mi Robot Vacuum + +The `xiaomi_miio` vacuum platform allows you to control the state of your [Xiaomi Mi Robot Vacuum](https://www.mi.com/roomrobot/). + +Currently supported services are: + +- `start` +- `pause` +- `stop` +- `return_to_base` +- `locate` +- `clean_spot` +- `set_fan_speed` + Fan speeds: `Silent`, `Standard`, `Medium`, `Turbo` and `Gentle` (exclusively for mopping). +- `remote_control_*` (of your robot) +- `xiaomi_clean_zone` + +### Configuration + +Please follow [Retrieving the Access Token](/integrations/xiaomi_miio/#retrieving-the-access-token) to retrieve the API token used in +`configuration.yaml`. + +To add a vacuum to your installation, add the following to `configuration.yaml`: + +```yaml +vacuum: + - platform: xiaomi_miio + host: 192.168.1.2 + token: YOUR_TOKEN +``` + +{% configuration %} +host: + description: The IP address of your robot. + required: true + type: string +token: + description: The API token of your robot. + required: true + type: string +name: + description: The name of your robot. + required: false + type: string + default: Xiaomi Vacuum cleaner +{% endconfiguration %} + +### Platform Services + +In addition to all of the services provided by the `vacuum` integration (`start`, `pause`, `stop`, `return_to_base`, `locate`, `set_fan_speed` and `send_command`), the `xiaomi_miio` platform introduces specific services to access the remote control mode of the robot. These are: + +- `xiaomi_miio.vacuum_remote_control_start` +- `xiaomi_miio.vacuum_remote_control_stop` +- `xiaomi_miio.vacuum_remote_control_move` +- `xiaomi_miio.vacuum_remote_control_move_step` +- `xiaomi_miio.vacuum_clean_zone` + +### Service `xiaomi_miio.vacuum_remote_control_start` + +Start the remote control mode of the robot. You can then move it with `remote_control_move`; when done, call `remote_control_stop`. + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------| +| `entity_id` | no | Only act on a specific robot | + +### Service `xiaomi_miio.vacuum_remote_control_stop` + +Exit the remote control mode of the robot. + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------| +| `entity_id` | no | Only act on a specific robot | + +### Service `xiaomi_miio.vacuum_remote_control_move` + +Remote control the robot. Please ensure you first set it in remote control mode with `remote_control_start`. + +| Service data attribute | Optional | Description | +|---------------------------|----------|-----------------------------------------------------------| +| `entity_id` | no | Only act on a specific robot | +| `velocity` | no | Speed: between -0.29 and 0.29 | +| `rotation` | no | Rotation: between -179 degrees and 179 degrees | +| `duration` | no | The number of milliseconds that the robot should move for | + +### Service `xiaomi_miio.vacuum_remote_control_move_step` + +Enter remote control mode, make one move, stop, and exit remote control mode. + +| Service data attribute | Optional | Description | +|---------------------------|----------|-----------------------------------------------------------| +| `entity_id` | no | Only act on a specific robot | +| `velocity` | no | Speed: between -0.29 and 0.29 | +| `rotation` | no | Rotation: between -179 degrees and 179 degrees | +| `duration` | no | The number of milliseconds that the robot should move for | + +### Service `xiaomi_miio.vacuum_clean_zone` + +Start the cleaning operation in the areas selected for the number of repeats indicated. + +| Service data attribute | Optional | Description | +|---------------------------|----------|-------------------------------------------------------| +| `entity_id` | no | Only act on a specific robot | +| `zone` | no | List of zones. Each zone is an array of four integer values. These values represent two sets of x- and y-axis coordinates that describe the beginning and ending points of a square or rectangle cleaning zone. For example, `[[23510,25311,25110,26361]]` creates a box that starts in one corner at the 23510, 25311 (x- and y-axis) coordinates and then is expanded diagonally to the 25110, 26361 coordinates to create a rectangular cleaning zone. | +| `repeats` | no | Number of cleaning repeats for each zone between 1 and 3. | + +Example of `xiaomi_miio.vacuum_clean_zone` use: + +Inline array: +{% raw %} + +```yaml +automation: + - alias: Test vacuum zone3 + trigger: + - event: start + platform: homeassistant + condition: [] + action: + - service: xiaomi_miio.vacuum_clean_zone + data_template: + entity_id: vacuum.xiaomi_vacuum + repeats: '{{states('input_number.vacuum_passes')|int}}' + zone: [[30914,26007,35514,28807], [20232,22496,26032,26496]] +``` + +{% endraw %} + +Array with inline zone: +{% raw %} + +```yaml +automation: + - alias: Test vacuum zone3 + trigger: + - event: start + platform: homeassistant + condition: [] + action: + - service: xiaomi_miio.vacuum_clean_zone + data_template: + entity_id: vacuum.xiaomi_vacuum + repeats: '{{states('input_number.vacuum_passes')|int}}' + zone: + - [30914,26007,35514,28807] + - [20232,22496,26032,26496] +``` + +{% endraw %} + +Array mode: + +```yaml +automation: + - alias: Test vacuum zone3 + trigger: + - event: start + platform: homeassistant + condition: [] + action: + - service: xiaomi_miio.vacuum_clean_zone + data: + entity_id: vacuum.xiaomi_vacuum + repeats: 1 + zone: + - - 30914 + - 26007 + - 35514 + - 28807 + - - 20232 + - 22496 + - 26032 + - 26496 +``` + +### Service `xiaomi_miio.vacuum_goto` + +Go the specified coordinates + +| Service data attribute | Optional | Description | +|---------------------------|----------|-------------------------------------------------------| +| `entity_id` | no | Only act on a specific robot | +| `x_coord` | no | X-coordinate, integer value. The dock is located at x-coordinate 25500. | +| `y_coord` | no | Y-coordinate, integer value. The dock is located at y-coordinate 25500. | + +### Service `xiaomi_miio.vacuum_clean_segment` + +Clean the specified segment/room. A room is identified by a number. Instructions on how to find the valid room numbers and determine what rooms they map to, read the section [Retrieving room numbers](#retrieving-room-numbers). + +| Service data attribute | Optional | Description | +|---------------------------|----------|-------------------------------------------------------| +| `entity_id` | no | Only act on a specific robot | +| `segments` | no | List of segment numbers or one single segment number. | + +Example of `xiaomi_miio.vacuum_clean_segment` use: + +Multiple segments: +```yaml +automation: + - alias: Vaccum kitchen and living room + trigger: + - event: start + platform: homeassistant + condition: [] + action: + - service: xiaomi_miio.vacuum_clean_segment + data: + entity_id: vacuum.xiaomi_vacuum + segments: [1,2] +``` + +Single segment: + +```yaml +automation: + - alias: Vacuum kitchen + trigger: + - event: start + platform: homeassistant + condition: [] + action: + - service: xiaomi_miio.vacuum_clean_segment + data: + entity_id: vacuum.xiaomi_vacuum + segments: 1 +``` + +### Attributes + +In addition to [all of the attributes provided by the `vacuum` component](/integrations/vacuum/#attributes), +(`battery_icon`, `cleaned_area`, `fan_speed`, `fan_speed_list`, and `params`), the `xiaomi` platform introduces specific attributes. These are: + +- `cleaning_time` +- `do_not_disturb` +- `main_brush_left` +- `side_brush_left` +- `filter_left` +- `sensor_dirty_left` +- `cleaning_count` +- `total_cleaned_area` +- `total_cleaning_time` +- `clean_start` +- `clean_end` + +The following table shows the units of measurement for each attribute: + +| Attribute | Unit of measurement | Description | +|---------------------------|---------------------|----------------------------------------------------------------| +| `do_not_disturb` | | DND mode on / off | +| `cleaning_time` | minutes | Last / actual cleaning time in minutes | +| `cleaned_area` | square meter | Last / actual cleaned area in square meters | +| `main_brush_left` | hours | Hours left until a change of the main brush is needed | +| `side_brush_left` | hours | Hours left until a change of the side brush is needed | +| `filter_left` | hours | Hours left until a change of the filter is needed | +| `sensor_dirty_left` | hours | Hours left until the wall and cliff sensors should be cleaned | +| `cleaning_count` | | Number of total cleaning cycles | +| `total_cleaned_area` | square meter | Total cleaned area in square meters | +| `total_cleaning_time` | minutes | Total cleaning time in minutes | +| `clean_start` | datetime | The last date/time the vacuum started cleaning (offset naive) | +| `clean_end` | datetime | The last date/time the vacuum finished cleaning (offset naive) | + +### Example on how to clean a specific room + +Example script using [`vacuum.send_command`](/integrations/vacuum/) to clean a specific room: + +```yaml +vacuum_kitchen: + alias: "Clean the kitchen" + sequence: + - service: vacuum.send_command + data: + entity_id: vacuum.xiaomi_vacuum_cleaner + command: app_segment_clean + params: [18] +``` + +Where params specify room numbers, for multiple rooms, params can be specified like `[17,18]`. Instructions on how to find the valid room numbers and determine what rooms they map to, read the section [Retrieving room numbers](#retrieving-room-numbers). + +### Example on how to reset maintenance hours (brushes, filter, sensors) + +The vacuum entity stores attribute values for when brushes, filters and sensors need to be +cleaned or replaced (`main_brush_left`, `side_brush_left`, `filter_left` and +`sensor_dirty_left`). The values are measured in hours. Once the parts are cleaned +or replaced you can then reset those values on the vacuum. Here is an example script using +[`vacuum.send_command`](/integrations/vacuum/) to reset the hours for the main brush: + +```yaml +reset_main_brush_left: + alias: "Reset hours for main brush replacement" + sequence: + - service: vacuum.send_Command + data: + entity_id: vacuum.xiaomi_vacuum_cleaner + command: reset_consumable + params: ['main_brush_work_time'] +``` + +Allowed `params` for the `reset_consumable` command: + +- `['main_brush_work_time']` +- `['side_brush_work_time']` +- `['filter_work_time']` +- `['sensor_dirty_time']` + +### Retrieving Zoned Cleaning Coordinates + +### Using FloleVac (Android) + +1. Download [FloleVac](https://play.google.com/store/apps/details?id=de.flole.xiaomi) +2. Login with your Xiaomi credentials +3. Open Map (make sure you're on the same network as your vacuum cleaner) +4. Select "Zone cleanup" and draw a box around the zone you'd like to clean +5. Long press "Cleanup" and the zone coordinates will be copied to your clipboard + +### Using RoboRock Control Center (requires Valetudo firmware) + +[RRCC](https://github.com/LazyT/rrcc) supports both rooted and non-rooted Vacuums and acts as a mostly fully featured replacement for Mi Home that works locally without the cloud. If you have installed the rooted firmware [Valetudo](https://github.com/Hypfer/Valetudo) you are able to SSH into your Vacuum and enable MQTT plus use map functions with no cloud requirement. + +Using the map editor you are able to acquire the co-ordinates required for zoned clean up. Here is an example script for zoned clean up: + +```yaml +vacuum_kitchen: + alias: "vacuum kitchen" + sequence: + - service: vacuum.send_command + data: + entity_id: 'vacuum.xiaomi_vacuum_cleaner' + command: app_zoned_clean + params: [[23084,26282,27628,29727,1]] +``` + +### Retrieving Room numbers + +Valid room numbers can be retrieved using miio command-line tool: + +```bash +miio protocol call get_room_mapping +``` + +It will only give room numbers and not the room names. To mat the room numbers to your actual rooms, one can just test the clean_segment service with a number and see which room it cleans. The Xiaomi Home App will highlight the room after issuing the request, which makes the process rather convenient. + +It seems to be the case that Numbers 1..15 are used to number the intitial segmentation done by the vacuum cleaner itself. Numbers 16 and upwards numbers rooms from the users manual editing. + +## Xiaomi Philips Light + +The `xiaomi_miio` platform allows you to control the state of your Xiaomi Philips LED Ball Lamp, Xiaomi Philips Zhirui LED Bulb E14 Candle Lamp, Xiaomi Philips Zhirui Downlight, Xiaomi Philips LED Ceiling Lamp, Xiaomi Philips Eyecare Lamp 2, Xiaomi Philips Moonlight Bedside Lamp and Philips Zhirui Desk Lamp. + +### Features + +### Philips LED Ball Lamp, Philips Zhirui LED Candle Lamp and Philips Zhirui Downlight + +Supported models: `philips.light.bulb`, `philips.light.candle`, `philips.light.candle2`, `philips.light.downlight` + +- Power (on, off) +- Brightness +- Color temperature (175...333 mireds) +- Scene (1, 2, 3, 4) +- Delayed turn off (Resolution in seconds) +- Attributes + - model + - scene + - delayed_turn_off + +### Philips LED Ceiling Lamp + +Supported models: `philips.light.ceiling`, `philips.light.zyceiling` + +- Power (on, off) +- Brightness +- Color temperature (175...370 mireds) +- Scene (1, 2, 3, 4) +- Night light mode (on, off) +- Delayed turn off (Resolution in seconds) +- Attributes + - model + - scene + - delayed_turn_off + - night_light_mode + - automatic_color_temperature + +### Philips Eyecare Smart Lamp 2 + +Supported models: `philips.light.sread1` + +- Eyecare light (on, off) +- Ambient light (on, off) +- Brightness (of each light) +- Scene (1, 2, 3, 4) +- Night light mode (on, off) +- Delayed turn off (Resolution in seconds) +- Eye fatigue reminder / notification (on, off) +- Eyecare mode (on, off) +- Attributes + - model + - scene + - delayed_turn_off + - night_light_mode + - reminder + - eyecare_mode + +### Philips Zhirui Desk Lamp + +Supported models: `philips.light.mono1` + +- Power (on, off) +- Brightness +- Scene (1, 2, 3, 4) +- Delayed turn off (Resolution in seconds) +- Attributes + - model + - scene + - delayed_turn_off + +### Philips Moonlight Bedside Lamp + +Supported models: `philips.light.moonlight` + +- Power (on, off) +- Brightness +- Color +- Color temperature (153...588 mireds) +- Scene (1, 2, 3, 4, 5, 6) +- Attributes + - model + - scene + - sleep_assistant + - sleep_off_time + - total_assistant_sleep_time + - brand_sleep + - brand + +Please follow the instructions on [Retrieving the Access Token](/integrations/xiaomi_miio/#retrieving-the-access-token) to get the API token to use in the `configuration.yaml` file. + +To add a Xiaomi Philips Light to your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entries +light: + - platform: xiaomi_miio + name: Xiaomi Philips Smart LED Ball + host: 192.168.130.67 + token: YOUR_TOKEN + model: philips.light.bulb +``` + +{% configuration %} +host: + description: The IP address of your miio light. + required: true + type: string +token: + description: The API token of your miio light. + required: true + type: string +name: + description: The name of your miio light. + required: false + type: string + default: Xiaomi Philips Light +model: + description: The model of your light. Valid values are `philips.light.sread1`, `philips.light.ceiling`, `philips.light.zyceiling`, `philips.light.moonlight`, `philips.light.bulb`, `philips.light.candle`, `philips.light.candle2`, `philips.light.mono1` and `philips.light.downlight`. This setting can be used to bypass the device model detection and is recommended if your device isn't always available. + required: false + type: string +{% endconfiguration %} + +### Platform Services + +### Service `xiaomi_miio.light_set_scene` + +Set one of the 4 available fixed scenes. + +| Service data attribute | Optional | Description | +|---------------------------|----------|-------------------------------------------------------| +| `entity_id` | no | Only act on a specific Xiaomi miIO light entity. | +| `scene` | no | Scene, between 1 and 4. | + +### Service `xiaomi_miio.light_set_delayed_turn_off` + +Delayed turn off. + +| Service data attribute | Optional | Description | +|---------------------------|----------|-------------------------------------------------------| +| `entity_id` | no | Only act on a specific Xiaomi miIO light entity. | +| `time_period` | no | Time period for the delayed turn off. | + +### Service `xiaomi_miio.light_reminder_on` (Eyecare Smart Lamp 2 only) + +Enable the eye fatigue reminder/notification. + +| Service data attribute | Optional | Description | +|---------------------------|----------|-------------------------------------------------------| +| `entity_id` | no | Only act on a specific Xiaomi miIO light entity. | + +### Service `xiaomi_miio.light_reminder_off` (Eyecare Smart Lamp 2 only) + +Disable the eye fatigue reminder/notification. + +| Service data attribute | Optional | Description | +|---------------------------|----------|-------------------------------------------------------| +| `entity_id` | no | Only act on a specific Xiaomi miIO light entity. | + +### Service `xiaomi_miio.light_night_light_mode_on` (Eyecare Smart Lamp 2 only) + +Turn the smart night light mode on. + +| Service data attribute | Optional | Description | +|---------------------------|----------|-------------------------------------------------------| +| `entity_id` | no | Only act on a specific Xiaomi miIO light entity. | + +### Service `xiaomi_miio.light_night_light_mode_off` (Eyecare Smart Lamp 2 only) + +Turn the smart night light mode off. + +| Service data attribute | Optional | Description | +|---------------------------|----------|-------------------------------------------------------| +| `entity_id` | no | Only act on a specific Xiaomi miIO light entity. | + +### Service `xiaomi_miio.light_eyecare_mode_on` (Eyecare Smart Lamp 2 only) + +Turn the eyecare mode on. + +| Service data attribute | Optional | Description | +|---------------------------|----------|-------------------------------------------------------| +| `entity_id` | no | Only act on a specific Xiaomi miIO light entity. | + +### Service `xiaomi_miio.light_eyecare_mode_off` (Eyecare Smart Lamp 2 only) + +Turn the eyecare mode off. + +| Service data attribute | Optional | Description | +|---------------------------|----------|-------------------------------------------------------| +| `entity_id` | no | Only act on a specific Xiaomi miIO light entity. | + +## Xiaomi Smart WiFi Socket and Smart Power Strip + +The `xiaomi_miio` switch platform allows you to control the state of your Xiaomi Smart WiFi Socket aka Plug, Xiaomi Smart Power Strip and Xiaomi Chuangmi Plug V1. + +Please follow the instructions on [Retrieving the Access Token](/integrations/xiaomi_miio/#retrieving-the-access-token) to get the API token to use in the `configuration.yaml` file. + +### Features + +### Xiaomi Smart WiFi Socket + +Supported models: `chuangmi.plug.m1`, `chuangmi.plug.m3`, `chuangmi.plug.v2`, `chuangmi.plug.hmi205` + +- Power (on, off) +- Attributes + - Temperature + +### Xiaomi Chuangmi Plug V1 + +Supported models: `chuangmi.plug.v1`, `chuangmi.plug.v3` + +- Power (on, off) +- USB (on, off) +- Attributes + - Temperature + +### Xiaomi Smart Power Strip + +Supported models: `qmi.powerstrip.v1`, `zimi.powerstrip.v2` + +- Power (on, off) +- Wifi LED (on, off) +- Power Price (0...999) +- Power Mode (green, normal) (Power Strip V1 only) +- Attributes + - Temperature + - Current + - Load power + - Wifi LED + - Mode (Power Strip V1 only) + +### Xiaomi Air Conditioning Companion V3 + +Supported models: `lumi.acpartner.v3` (the socket of the `acpartner.v1` and `v2` isn't switchable!) + +- Power (on, off) +- Attributes + - Load power + +### Configuration + +To add a plug to your installation, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entries +switch: + - platform: xiaomi_miio + host: MIIO_IP_ADDRESS + token: YOUR_TOKEN +``` + +{% configuration %} +host: + description: The IP address of your miio device. + required: true + type: string +token: + description: The API token of your miio device. + required: true + type: string +name: + description: The name of your miio device. + required: false + type: string + default: Xiaomi Miio Switch +model: + description: The model of your miio device. Valid values are `chuangmi.plug.v1`, `qmi.powerstrip.v1`, `zimi.powerstrip.v2`, `chuangmi.plug.m1`, `chuangmi.plug.m3`, `chuangmi.plug.v2`, `chuangmi.plug.v3` and `chuangmi.plug.hmi205`. This setting can be used to bypass the device model detection and is recommended if your device isn't always available. + required: false + type: string +{% endconfiguration %} + +### Platform Services + +### Service `xiaomi_miio.switch_set_wifi_led_on` (Power Strip only) + +Turn the wifi LED on. + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------------| +| `entity_id` | no | Only act on a specific Xiaomi miIO switch entity. | + +### Service `xiaomi_miio.switch_set_wifi_led_off` (Power Strip only) + +Turn the wifi LED off. + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------------| +| `entity_id` | no | Only act on a specific Xiaomi miIO switch entity. | + +### Service `xiaomi_miio.switch_set_power_price` (Power Strip) + +Set the power price. + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------------| +| `entity_id` | no | Only act on a specific Xiaomi miIO switch entity. | +| `price` | no | Power price, between 0 and 999. | + +### Service `xiaomi_miio.switch_set_power_mode` (Power Strip V1 only) + +Set the power mode. + +| Service data attribute | Optional | Description | +|---------------------------|----------|---------------------------------------------------------------| +| `entity_id` | no | Only act on a specific Xiaomi miIO switch entity. | +| `mode` | no | Power mode, valid values are 'normal' and 'green' | diff --git a/source/_redirects b/source/_redirects index 3b39ced36ad..5d08a0027c5 100644 --- a/source/_redirects +++ b/source/_redirects @@ -1080,6 +1080,14 @@ /components/weather.smhi /integrations/smhi /components/weather.zamg /integrations/zamg#weather /components/xiaomi /integrations/xiaomi_aqara +/integrations/air_quality.xiaomi_miio /integrations/xiaomi_miio +/integrations/alarm_control_panel.xiaomi_miio /integrations/xiaomi_miio +/integrations/fan.xiaomi_miio /integrations/xiaomi_miio +/integrations/light.xiaomi_miio /integrations/xiaomi_miio +/integrations/remote.xiaomi_miio /integrations/xiaomi_miio +/integrations/sensor.xiaomi_miio /integrations/xiaomi_miio +/integrations/switch.xiaomi_miio /integrations/xiaomi_miio +/integrations/vacuum.xiaomi_miio /integrations/xiaomi_miio # Renaming components to integrations /components /integrations From 9d0ee2c496ac20923bca7733c324ea50a66af206 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Mon, 3 Aug 2020 21:13:37 +0200 Subject: [PATCH 39/40] Correct docs for disabling MQTT birth message (#14146) --- source/_docs/mqtt/birth_will.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_docs/mqtt/birth_will.markdown b/source/_docs/mqtt/birth_will.markdown index 4c190c13c14..c4cc9b5d939 100644 --- a/source/_docs/mqtt/birth_will.markdown +++ b/source/_docs/mqtt/birth_will.markdown @@ -23,12 +23,12 @@ mqtt: {% configuration %} birth_message: - description: Birth Message. + description: Birth Message. Set to the empty dict, `{}`, to disable publishing a birth message. required: false type: list keys: topic: - description: The MQTT topic to publish the message. Set to the empty dict, `{}`, to disable publishing a birth message. + description: The MQTT topic to publish the message. required: false default: homeassistant/status type: string From 6b64bd200f0f08305c41fbc11581eadb323e2a53 Mon Sep 17 00:00:00 2001 From: Rafi Wiener Date: Tue, 4 Aug 2020 00:48:54 +0300 Subject: [PATCH 40/40] fix yaml for input_number use in delay (#14147) --- source/_integrations/input_number.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/input_number.markdown b/source/_integrations/input_number.markdown index a6d80d36aaf..012982cc7b7 100644 --- a/source/_integrations/input_number.markdown +++ b/source/_integrations/input_number.markdown @@ -242,7 +242,7 @@ automation: entity_id: switch.something to: 'on' action: - - delay: '00:{{ states('input_number.minutes') | int }}:{{ states('input_number.seconds') | int }}' + - delay: "00:{{ states('input_number.minutes') | int }}:{{ states('input_number.seconds') | int }}" - service: switch.turn_off entity_id: switch.something ```