Merge branch 'current' into next

This commit is contained in:
Franck Nijhof 2021-03-25 10:50:21 +01:00
commit 23c87cc35e
No known key found for this signature in database
GPG Key ID: D62583BA8AB11CA3
21 changed files with 261 additions and 211 deletions

View File

@ -66,7 +66,7 @@ GEM
kramdown-parser-gfm (1.1.0)
kramdown (~> 2.0)
liquid (4.0.3)
listen (3.4.1)
listen (3.5.0)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
mercenary (0.4.0)

160
package-lock.json generated
View File

@ -104,9 +104,9 @@
"dev": true
},
"@textlint/ast-tester": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/@textlint/ast-tester/-/ast-tester-2.3.3.tgz",
"integrity": "sha512-FNV4B0+kbvVuxvKEEf3NdPtArile940wtJeQx6flw6SLabEYDP+ZVwg7FVO17zopyIsOPmT4yPOJbt93BnDHng==",
"version": "2.3.4",
"resolved": "https://registry.npmjs.org/@textlint/ast-tester/-/ast-tester-2.3.4.tgz",
"integrity": "sha512-2gIsnJ1Dmr5jjF+u/vusNRqk2bJi0WwwbjP9WV/op51DhDTi7BUNjVSiZtcP9NVxidvs51XNEg+EMTRoKP3Msg==",
"dev": true,
"requires": {
"@textlint/ast-node-types": "^4.4.2"
@ -121,9 +121,9 @@
}
},
"@textlint/ast-traverse": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/@textlint/ast-traverse/-/ast-traverse-2.3.3.tgz",
"integrity": "sha512-L+iVejKaethlUKvFyQtBs373GAA5LJCkraAdbL6F6cOiCviKqpFf9HQmdCQAyYOGrjs30LgpsOLsZACgBJ7uOg==",
"version": "2.3.4",
"resolved": "https://registry.npmjs.org/@textlint/ast-traverse/-/ast-traverse-2.3.4.tgz",
"integrity": "sha512-NcjPXCvP8r4D2/azeQhwjPvh2+099I9RRBUrg6IpMfTW4IUUJb4BwZOPgjW+XRIVc71Dhgm82VSIagDL90FYcg==",
"dev": true,
"requires": {
"@textlint/ast-node-types": "^4.4.2"
@ -138,22 +138,22 @@
}
},
"@textlint/feature-flag": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/@textlint/feature-flag/-/feature-flag-3.3.3.tgz",
"integrity": "sha512-YLbKeckvIu4a+IZv/nHW+BGyYZBdCSJxtKyEp8HTfKam8AC26bdU0ryzO7xmmHN0FdPNwAn67AfZTWssKcWUVg==",
"version": "3.3.4",
"resolved": "https://registry.npmjs.org/@textlint/feature-flag/-/feature-flag-3.3.4.tgz",
"integrity": "sha512-ULAqdD2y1sPAhbkaMjS2fltrZYCNQGsNDv/NQWFsCmDpQ1R8kxoUaTiXpebTM+nVuyvU5GfdkxhHyMarPIjmYw==",
"dev": true,
"requires": {
"map-like": "^2.0.0"
}
},
"@textlint/fixer-formatter": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/@textlint/fixer-formatter/-/fixer-formatter-3.3.3.tgz",
"integrity": "sha512-4UF1mNFQHB5iDFNFBSK3ss8c5NiAgGxLXijATXJ3SSjhiTb3sQSX3RcB1wMwI0/gcizRm3r5j16Kelv8IOrbzA==",
"version": "3.3.4",
"resolved": "https://registry.npmjs.org/@textlint/fixer-formatter/-/fixer-formatter-3.3.4.tgz",
"integrity": "sha512-H4i+N+uN7EiI5vRnfRIccFc5yekNHnO8795fiOK2TZPb6SzY3iwLOGZ2rDKvgu7ZKdyGW945w3T0elUF3Fkr5A==",
"dev": true,
"requires": {
"@textlint/module-interop": "^1.2.3",
"@textlint/types": "^1.5.3",
"@textlint/module-interop": "^1.2.4",
"@textlint/types": "^1.5.4",
"chalk": "^1.1.3",
"debug": "^4.3.1",
"diff": "^4.0.2",
@ -171,9 +171,9 @@
"dev": true
},
"@textlint/types": {
"version": "1.5.3",
"resolved": "https://registry.npmjs.org/@textlint/types/-/types-1.5.3.tgz",
"integrity": "sha512-xWyqdZrBUs66f8hKm3QZO2NEa6mqZAL0nTSBKu2U2Ob9R5r81N/WPvvz5mEqPVPRZrf0hi/lNerFzEIZH4YgnQ==",
"version": "1.5.4",
"resolved": "https://registry.npmjs.org/@textlint/types/-/types-1.5.4.tgz",
"integrity": "sha512-bhSrOjW8AFSa/xf6lYZ2akE0j+4O/WEAA2S/R8RrjNMkA5Az2j57mxPNpqMhEeyHDkpzN/coIlqUwgYvcJHv1A==",
"dev": true,
"requires": {
"@textlint/ast-node-types": "^4.4.2"
@ -264,18 +264,18 @@
}
},
"@textlint/kernel": {
"version": "3.4.3",
"resolved": "https://registry.npmjs.org/@textlint/kernel/-/kernel-3.4.3.tgz",
"integrity": "sha512-kQUjkVC6kXVuTxVqhPuxgjEaONDH1hliRgi5tMyxGDD3c3IOJVeatutL9vqpbAMgJL7blyTaWSdOJdsqZfCW3g==",
"version": "3.4.4",
"resolved": "https://registry.npmjs.org/@textlint/kernel/-/kernel-3.4.4.tgz",
"integrity": "sha512-ro9TPnE16C6gtKkY3aOjTs8ZfzAxdXLCV9JD4BuV5P+xBiiu9NdiE2Hwm3LyEGQjMxaKnXjbm/DTCAxA4gz0Dg==",
"dev": true,
"requires": {
"@textlint/ast-node-types": "^4.4.2",
"@textlint/ast-tester": "^2.3.3",
"@textlint/ast-traverse": "^2.3.3",
"@textlint/feature-flag": "^3.3.3",
"@textlint/source-code-fixer": "^3.4.3",
"@textlint/types": "^1.5.3",
"@textlint/utils": "^1.2.3",
"@textlint/ast-tester": "^2.3.4",
"@textlint/ast-traverse": "^2.3.4",
"@textlint/feature-flag": "^3.3.4",
"@textlint/source-code-fixer": "^3.4.4",
"@textlint/types": "^1.5.4",
"@textlint/utils": "^1.2.4",
"debug": "^4.3.1",
"deep-equal": "^1.1.1",
"map-like": "^2.0.0",
@ -289,9 +289,9 @@
"dev": true
},
"@textlint/types": {
"version": "1.5.3",
"resolved": "https://registry.npmjs.org/@textlint/types/-/types-1.5.3.tgz",
"integrity": "sha512-xWyqdZrBUs66f8hKm3QZO2NEa6mqZAL0nTSBKu2U2Ob9R5r81N/WPvvz5mEqPVPRZrf0hi/lNerFzEIZH4YgnQ==",
"version": "1.5.4",
"resolved": "https://registry.npmjs.org/@textlint/types/-/types-1.5.4.tgz",
"integrity": "sha512-bhSrOjW8AFSa/xf6lYZ2akE0j+4O/WEAA2S/R8RrjNMkA5Az2j57mxPNpqMhEeyHDkpzN/coIlqUwgYvcJHv1A==",
"dev": true,
"requires": {
"@textlint/ast-node-types": "^4.4.2"
@ -309,15 +309,15 @@
}
},
"@textlint/linter-formatter": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/@textlint/linter-formatter/-/linter-formatter-3.3.3.tgz",
"integrity": "sha512-njm1VwfG1lVuc9TnzSecNaghRtIAdQVXULc1wHlBoingT/w+bz/SgPvw3eec/rUfzde6ms3O4dFAG3zPNdRoIQ==",
"version": "3.3.4",
"resolved": "https://registry.npmjs.org/@textlint/linter-formatter/-/linter-formatter-3.3.4.tgz",
"integrity": "sha512-k1lyvR+w7ctwr5dWhMVRTKk19GH99BAO2dLk8ZS0ZcYyKqKAKu6Iyb1cWEg/u3dT3KFbWwoegnAelfz5828SHQ==",
"dev": true,
"requires": {
"@azu/format-text": "^1.0.1",
"@azu/style-format": "^1.0.0",
"@textlint/module-interop": "^1.2.3",
"@textlint/types": "^1.5.3",
"@textlint/module-interop": "^1.2.4",
"@textlint/types": "^1.5.4",
"chalk": "^1.1.3",
"concat-stream": "^1.6.2",
"debug": "^4.3.1",
@ -340,9 +340,9 @@
"dev": true
},
"@textlint/types": {
"version": "1.5.3",
"resolved": "https://registry.npmjs.org/@textlint/types/-/types-1.5.3.tgz",
"integrity": "sha512-xWyqdZrBUs66f8hKm3QZO2NEa6mqZAL0nTSBKu2U2Ob9R5r81N/WPvvz5mEqPVPRZrf0hi/lNerFzEIZH4YgnQ==",
"version": "1.5.4",
"resolved": "https://registry.npmjs.org/@textlint/types/-/types-1.5.4.tgz",
"integrity": "sha512-bhSrOjW8AFSa/xf6lYZ2akE0j+4O/WEAA2S/R8RrjNMkA5Az2j57mxPNpqMhEeyHDkpzN/coIlqUwgYvcJHv1A==",
"dev": true,
"requires": {
"@textlint/ast-node-types": "^4.4.2"
@ -479,9 +479,9 @@
}
},
"@textlint/markdown-to-ast": {
"version": "6.3.3",
"resolved": "https://registry.npmjs.org/@textlint/markdown-to-ast/-/markdown-to-ast-6.3.3.tgz",
"integrity": "sha512-CG8igvwlmcHb/d2zXDXchXgqofnDsxQDYOMpsk4zv1EN8PL5ycijQgmKJ0yB0ZxFduv0AR22rnJvPtB4ymzCyQ==",
"version": "6.3.4",
"resolved": "https://registry.npmjs.org/@textlint/markdown-to-ast/-/markdown-to-ast-6.3.4.tgz",
"integrity": "sha512-LLScbDRXov1l4U4OCLJ5clu9eWNonBG+rhuArwYAHpf0hwIoNoETfAQvrNtXZG/NZ96fdWv4PLtaN6dA4ldRdQ==",
"dev": true,
"requires": {
"@textlint/ast-node-types": "^4.4.2",
@ -597,18 +597,18 @@
}
},
"@textlint/module-interop": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@textlint/module-interop/-/module-interop-1.2.3.tgz",
"integrity": "sha512-BHpF/NSOWZIBJVvwe1Aww9k7lh04lr8xrFpoDfmdp3QolrAakdd5xTso2U1kJpWeZatQgh4naSI2X7IUEM2b2Q==",
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@textlint/module-interop/-/module-interop-1.2.4.tgz",
"integrity": "sha512-/wUKvDbBEujrhpcuD7Et4Mcicm3SG2oAe/tyMruLxSJ86umGxd34dEcHRON8fJzou9qyt0gFoczcypd4k3hJow==",
"dev": true
},
"@textlint/source-code-fixer": {
"version": "3.4.3",
"resolved": "https://registry.npmjs.org/@textlint/source-code-fixer/-/source-code-fixer-3.4.3.tgz",
"integrity": "sha512-jXuVMICfnTkg8GKPpuL2gLgUt2IicgKIOAQHw8BN9vGRstdPDth37Qc9iIjM6b68TPbRnDLb7GCENdXYEQKpcg==",
"version": "3.4.4",
"resolved": "https://registry.npmjs.org/@textlint/source-code-fixer/-/source-code-fixer-3.4.4.tgz",
"integrity": "sha512-GDHVin2EJ9PGJ33VMGlqtPcvUlY+pkTbaWs4jWv8oBaEK8UUBzS5ZpEc4xi7Xp5vIXnVsCSLKNC6bgvR9X/AoQ==",
"dev": true,
"requires": {
"@textlint/types": "^1.5.3",
"@textlint/types": "^1.5.4",
"debug": "^4.3.1"
},
"dependencies": {
@ -619,9 +619,9 @@
"dev": true
},
"@textlint/types": {
"version": "1.5.3",
"resolved": "https://registry.npmjs.org/@textlint/types/-/types-1.5.3.tgz",
"integrity": "sha512-xWyqdZrBUs66f8hKm3QZO2NEa6mqZAL0nTSBKu2U2Ob9R5r81N/WPvvz5mEqPVPRZrf0hi/lNerFzEIZH4YgnQ==",
"version": "1.5.4",
"resolved": "https://registry.npmjs.org/@textlint/types/-/types-1.5.4.tgz",
"integrity": "sha512-bhSrOjW8AFSa/xf6lYZ2akE0j+4O/WEAA2S/R8RrjNMkA5Az2j57mxPNpqMhEeyHDkpzN/coIlqUwgYvcJHv1A==",
"dev": true,
"requires": {
"@textlint/ast-node-types": "^4.4.2"
@ -639,9 +639,9 @@
}
},
"@textlint/text-to-ast": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/@textlint/text-to-ast/-/text-to-ast-3.3.3.tgz",
"integrity": "sha512-Y1hRnI+PoCbomQZtnog31DCUgz/diW4X72F7x/bn/VkUg6xq55GAsn2OB4qWvduQMrA+71lOfBMK3tcGJ8Q4Mg==",
"version": "3.3.4",
"resolved": "https://registry.npmjs.org/@textlint/text-to-ast/-/text-to-ast-3.3.4.tgz",
"integrity": "sha512-oDwGNQCAo7ROnHqaksPEogf8fxXGU3Z61C6NEv0n9vEWEkUX9oUVX4c9kh5UieZL5nN/xIdzVc3TrXywkkOK3g==",
"dev": true,
"requires": {
"@textlint/ast-node-types": "^4.4.2"
@ -656,21 +656,21 @@
}
},
"@textlint/textlint-plugin-markdown": {
"version": "5.3.3",
"resolved": "https://registry.npmjs.org/@textlint/textlint-plugin-markdown/-/textlint-plugin-markdown-5.3.3.tgz",
"integrity": "sha512-AnScn1Qt7NMw3K0wNUtJYyGYr6DLe/wsnQbtLd3xjS+6Ky8C+6Ohd+ms1DKH0vRztc8huM/wmV7n5Bx+1qBevA==",
"version": "5.3.4",
"resolved": "https://registry.npmjs.org/@textlint/textlint-plugin-markdown/-/textlint-plugin-markdown-5.3.4.tgz",
"integrity": "sha512-g8KKuwhzzlRjvKrpq3SbGc+JJMAJoy5Xp0Ibvq7QKgNVxwN/f5WtmrJc8CdgFG7++jgtkDPlofz0c9xG63xKwQ==",
"dev": true,
"requires": {
"@textlint/markdown-to-ast": "^6.3.3"
"@textlint/markdown-to-ast": "^6.3.4"
}
},
"@textlint/textlint-plugin-text": {
"version": "4.3.3",
"resolved": "https://registry.npmjs.org/@textlint/textlint-plugin-text/-/textlint-plugin-text-4.3.3.tgz",
"integrity": "sha512-NKbCbiSYA8mdg74HR+GQDO9q7RRHimnQ88YL0vBtP2oq2x1HZccq0mHlw6dlL775YardBAoHu/qxyJbkxSXBgw==",
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/@textlint/textlint-plugin-text/-/textlint-plugin-text-4.3.4.tgz",
"integrity": "sha512-ZtctKFR8V9mIZAMibS97xPWlt2lViizIRAy4oDaKCnxAwJ0uAjxm/OlHHdaFwNydGaEDtN60mcmarDqOOAZIiA==",
"dev": true,
"requires": {
"@textlint/text-to-ast": "^3.3.3"
"@textlint/text-to-ast": "^3.3.4"
}
},
"@textlint/types": {
@ -683,9 +683,9 @@
}
},
"@textlint/utils": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@textlint/utils/-/utils-1.2.3.tgz",
"integrity": "sha512-jN0pbdOJkIAuqyBqsDvk3FYP6BF+YLMlVzE8xbjDhpw7dpr36iEGKGIuRQJZ0+8nq3CPY7W0EcK6o63QoPuPvQ==",
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@textlint/utils/-/utils-1.2.4.tgz",
"integrity": "sha512-FREWc8n6bJFsKehtUlHPtbqnXULWhdnlazqWiHMjiBtcxUfD+1kY3P7PNGbChdzeZGmwBkgFQyGkok8bAGnZOw==",
"dev": true
},
"@types/mdast": {
@ -2534,22 +2534,22 @@
"dev": true
},
"textlint": {
"version": "11.8.3",
"resolved": "https://registry.npmjs.org/textlint/-/textlint-11.8.3.tgz",
"integrity": "sha512-UrknrF3Sgkksq9aI3Y0gs4FBRgAy2oaonAhLOufWs7kA0ulmj3FVYGPA5UPVEKQHUWbnuOaqDteLDs+/9hRc9g==",
"version": "11.9.0",
"resolved": "https://registry.npmjs.org/textlint/-/textlint-11.9.0.tgz",
"integrity": "sha512-a9ZCfCOcOTNxEQsRbYBDFNu8m5cjJC+znnXCBommGSdP0W+9QmwZnkralwpxrVhRgWvLz+QyuDXtLBZcqfDmHg==",
"dev": true,
"requires": {
"@textlint/ast-node-types": "^4.4.2",
"@textlint/ast-traverse": "^2.3.3",
"@textlint/feature-flag": "^3.3.3",
"@textlint/fixer-formatter": "^3.3.3",
"@textlint/kernel": "^3.4.3",
"@textlint/linter-formatter": "^3.3.3",
"@textlint/module-interop": "^1.2.3",
"@textlint/textlint-plugin-markdown": "^5.3.3",
"@textlint/textlint-plugin-text": "^4.3.3",
"@textlint/types": "^1.5.3",
"@textlint/utils": "^1.2.3",
"@textlint/ast-traverse": "^2.3.4",
"@textlint/feature-flag": "^3.3.4",
"@textlint/fixer-formatter": "^3.3.4",
"@textlint/kernel": "^3.4.4",
"@textlint/linter-formatter": "^3.3.4",
"@textlint/module-interop": "^1.2.4",
"@textlint/textlint-plugin-markdown": "^5.3.4",
"@textlint/textlint-plugin-text": "^4.3.4",
"@textlint/types": "^1.5.4",
"@textlint/utils": "^1.2.4",
"debug": "^4.3.1",
"deep-equal": "^1.1.1",
"file-entry-cache": "^5.0.1",
@ -2577,9 +2577,9 @@
"dev": true
},
"@textlint/types": {
"version": "1.5.3",
"resolved": "https://registry.npmjs.org/@textlint/types/-/types-1.5.3.tgz",
"integrity": "sha512-xWyqdZrBUs66f8hKm3QZO2NEa6mqZAL0nTSBKu2U2Ob9R5r81N/WPvvz5mEqPVPRZrf0hi/lNerFzEIZH4YgnQ==",
"version": "1.5.4",
"resolved": "https://registry.npmjs.org/@textlint/types/-/types-1.5.4.tgz",
"integrity": "sha512-bhSrOjW8AFSa/xf6lYZ2akE0j+4O/WEAA2S/R8RrjNMkA5Az2j57mxPNpqMhEeyHDkpzN/coIlqUwgYvcJHv1A==",
"dev": true,
"requires": {
"@textlint/ast-node-types": "^4.4.2"

View File

@ -10,7 +10,7 @@
"remark-lint-fenced-code-flag": "^2.0.1",
"remark-lint-no-shell-dollars": "^2.0.2",
"remark-stringify": "^9.0.1",
"textlint": "^11.8.3",
"textlint": "^11.9.0",
"textlint-rule-common-misspellings": "^1.0.1",
"textlint-rule-terminology": "^2.1.5"
},

View File

@ -31,3 +31,7 @@ message: Sensor value greater than 10
Automation created or edited via the user interface, are activated immediately
after save the automation.
## Troubleshooting missing automations
When you're creating automations using the GUI and they don't appear in the UI, make sure that you add back `automation: !include automations.yaml` from the default configuration to your `configuration.yaml`.

View File

@ -1,23 +1,24 @@
## Enable I2C
Home Assistant using the Home Assistant Operating System is a managed environment, which means you can't use existing methods to enable the I2C bus on a Raspberry Pi.
Home Assistant using the Home Assistant Operating System which is a managed environment, which means you can't use existing methods to enable the I2C bus on a Raspberry Pi. In order to use I2C devices you will have to
- Enable I2C for the Home Assistant Operating System
- Setup I2C devices e.g. sensors
### Step by step instructions
### Enable I2C with an SD card reader
#### Access the boot partition
You will need:
- SD card reader
- SD card with Home Assistant Operating System flashed on it
#### Step 1 - Access the Home Assistant Operating System boot partition
Shutdown/turn-off your Home Assistant installation and unplug the SD card.
Plug the SD card into an SD card reader and find a drive/file system named
`hassos-boot`. The file system might be shown/mounted automatically. If not,
use your operating systems disk management utility to find the SD card reader
and make sure the first partition is available.
#### Step 2 - Add files to enable I2C
#### Add files to enable I2C
- In the root of the `hassos-boot` partition, add a new folder called `CONFIG`.
- In the `CONFIG` folder, add another new folder called `modules`.
@ -32,7 +33,7 @@ and make sure the first partition is available.
dtparam=i2c_arm=on
```
#### Step 3 - Start with the new configuration
#### Start with the new OS configuration
- Insert the SD card back into your Raspberry Pi.
- On startup, the `hassos-config.service` will automatically pickup the new
@ -40,9 +41,7 @@ and make sure the first partition is available.
- Another reboot might be necessary to make sure the just imported `rpi-i2c.conf` is
present at boot time.
The I2C devices should now be present under /dev.
### From Home Assistant Operating System Terminal
### Enable I2C via Home Assistant Operating System Terminal
Alternatively, by attaching a keyboard and screen to your device, you can access the physical terminal to the Home Assistant Operating System.
@ -62,3 +61,9 @@ You can enable i2c via this terminal:
sync
reboot
```
### Troubleshooting
After rebooting the host there should be `i2c-0` and similar device files in `/dev`. If such device files are missing, enabling I2C failed for some reason. You can check the status of I2C kernel modules by using `lsmod | grep i2c` in the terminal. If they are loaded, you should find at least the entry `i2c_dev`. Active usage of the modules is indicated by a number, e.g. `i2c_dev 20480 2` would indicate two active I2C device files.
An active I2C can also be check with a multi meter showing 3.3 V on the I2C pins GPIO2 and GPIO3.

View File

@ -80,7 +80,7 @@ The next time you run or restart Home Assistant, you should find a new notificat
## Calendar Configuration
Editing the `google_calendars.yaml` file.
With every restart all calendars of the configured Google account will get pulled and added to the `google_calendars.yaml` and preconfigured as a single entity. By setting the 'track' variable to `true` the calendar will get monitored for new events which can be used for automations and its content is shown on the 'Calendar' dashboard (mind 'max_results' is set to 5 by default).
A basic entry for a single calendar looks like:
@ -90,19 +90,38 @@ A basic entry for a single calendar looks like:
- device_id: test_everything
name: Give me everything
track: true
max_results: 10
```
From this, we will get a binary sensor `calendar.test_everything` triggered by any event on the calendar and will show the next 10 events on the 'Calendar' dashboard.
A bit more elaborate configuration:
```yaml
- cal_id: "*****@group.calendar.google.com"
entities:
- device_id: test_unimportant
name: UnImportant Stuff
track: true
search: "#UnImportant"
- device_id: test_important
name: Important Stuff
track: true
search: "#Important"
offset: "!!"
- device_id: test_unimportant
name: UnImportant Stuff
track: true
search: "#UnImportant"
```
From this we will end up with the binary sensors `calendar.test_unimportant` and `calendar.test_important` which will toggle themselves on/off based on events on the same calendar that match the search value set for each.
`calendar.test_unimportant` will toggle for events whose title contain '#UnImportant'
`calendar.test_important` will toggle for events whose title contain '#Important'. By using the offset variable an event title containing "#Important !!-10" will toggle the sensor 10 minutes before the event starts.
<div class='note warning'>
If you use a `#` sign for `search` then wrap the whole search term in quotes.
Otherwise everything following the hash sign would be considered a YAML comment.
</div>
{% configuration %}
cal_id:
description: The Google *generated* unique id for this calendar.
@ -153,21 +172,7 @@ entities:
default: 5
{% endconfiguration %}
From this we will end up with the binary sensors `calendar.test_unimportant` and
`calendar.test_important` which will toggle themselves on/off based on events on
the same calendar that match the search value set for each.
You'll also have a sensor `calendar.test_everything` that will
not filter events out and always show the next event available.
But what if you only wanted it to toggle based on all events?
Just leave out the *search* parameter.
<div class='note warning'>
If you use a `#` sign for `search` then wrap the whole search term in quotes.
Otherwise everything following the hash sign would be considered a YAML comment.
</div>
### Sensor attributes

View File

@ -180,6 +180,18 @@ Here, last Monday is _today_ as a timestamp, minus 86400 times the current weekd
{% endraw %}
**Next 4 pm**: 24 hours, from the last 4 pm till the next 4 pm. If it hasn't been 4 pm today, that would be 4 pm yesterday until 4 pm today. If it is already past 4 pm today, it will be 4 pm today until 4 pm tomorrow. When changing the start time, then add or subtract to the 8-hour buffer to match the next midnight.
{% raw %}
```yaml
end: "{{ (now().replace(minute=0,second=0) + timedelta(hours=8)).replace(hour=16) }}"
duration:
hours: 24
```
{% endraw %}
**Last 30 days**: ends today at 00:00, lasts 30 days. Easy one.
{% raw %}

View File

@ -516,8 +516,7 @@ The example configuration entry below create two request to your local InfluxDB
sensor:
platform: influxdb
host: localhost
username: home-assistant
username: home-assistant
password: password
queries:
- name: last value of foo

View File

@ -68,14 +68,13 @@ In order to make use of the various platforms that KNX offers you will need to a
```yaml
knx:
binary_sensor: !include knx_binary_sensor.yaml
switch: !include knx_switch.yaml
# configure platforms directly in configuration.yaml
binary_sensor:
- name: "My first binary sensor"
state_address: "1/2/3"
# etc...
# or outsource platform configuration to separate files
sensor: !include knx_sensor.yaml
cover: !include knx_cover.yaml
light: !include knx_light.yaml
climate: !include knx_climate.yaml
notify: !include knx_notify.yaml
scene: !include knx_scene.yaml
```
Please see the dedicated platform sections below about how to configure them correctly.
@ -143,6 +142,7 @@ Explicit connection via KNX/IP routing. This requires multicast communication to
```yaml
knx:
routing:
```
{% configuration %}
@ -284,27 +284,27 @@ KNX integration is able to expose entity states or attributes to KNX bus. The in
# Example configuration.yaml entry
knx:
expose:
- type: "temperature"
entity_id: "sensor.owm_temperature"
- type: temperature
entity_id: sensor.owm_temperature
address: "0/0/2"
- type: "string"
- type: string
address: "0/6/4"
entity_id: "sensor.owm_weather"
- type: "binary"
entity_id: "binary_sensor.kitchen_window"
entity_id: sensor.owm_weather
- type: binary
entity_id: binary_sensor.kitchen_window
address: "0/6/5"
- type: "binary"
entity_id: "light.office"
- type: binary
entity_id: light.office
address: "0/3/0"
default: false
- type: "percentU8"
entity_id: "light.office"
attribute: "brightness"
- type: percentU8
entity_id: light.office
attribute: brightness
default: 0
address: "0/3/1"
- type: "time"
- type: time
address: "0/0/1"
- type: "datetime"
- type: datetime
address: "0/0/23"
```
@ -344,7 +344,7 @@ Binary sensors are read-only. To write to the KNX bus configure an exposure [KNX
```yaml
knx:
binary_sensor:
- name: sensor1
- name: "Sensor 1"
state_address: "6/0/2"
```
@ -398,7 +398,7 @@ Let's pretend you have a binary sensor with the name `Livingroom.Switch` and you
automation:
- trigger:
platform: numeric_state
entity_id: binary_sensor.Livingroom_Switch
entity_id: binary_sensor.livingroom_switch
attribute: counter
above: 0
below: 2
@ -411,7 +411,7 @@ automation:
service: light.turn_on
- trigger:
platform: numeric_state
entity_id: binary_sensor.Livingroom_Switch
entity_id: binary_sensor.livingroom_switch
attribute: counter
above: 1
below: 3
@ -457,7 +457,7 @@ To use your KNX thermostats in your installation, add the following lines to you
# Example configuration.yaml entry
knx:
climate:
- name: HASS-Kitchen.Temperature
- name: "Kitchen"
temperature_address: "5/1/1"
setpoint_shift_address: "5/1/2"
setpoint_shift_state_address: "5/1/3"
@ -472,7 +472,7 @@ Alternatively, if your device has dedicated binary group addresses for frost/nig
# Example configuration.yaml entry
knx:
climate:
- name: HASS-Kitchen.Temperature
- name: "Kitchen"
temperature_address: "5/1/1"
setpoint_shift_address: "5/1/2"
setpoint_shift_state_address: "5/1/3"
@ -490,7 +490,7 @@ attributes of the climate device to avoid issues with exceeding valid temperatur
# Example configuration.yaml entry
knx:
climate:
- name: HASS-Kitchen.Temperature
- name: "Kitchen"
temperature_address: "5/1/2"
target_temperature_address: "5/1/4"
target_temperature_state_address: "5/1/1"
@ -514,7 +514,7 @@ Example:
# Example configuration.yaml entry
knx:
climate:
- name: HASS-Kitchen.Temperature
- name: "Kitchen"
temperature_address: "5/1/1"
setpoint_shift_address: "5/1/2"
setpoint_shift_state_address: "5/1/3"
@ -689,7 +689,7 @@ To use your KNX covers in your installation, add the following lines to your top
# Example configuration.yaml entry
knx:
cover:
- name: "Kitchen.Shutter"
- name: "Kitchen shutter"
move_long_address: "3/0/0"
move_short_address: "3/0/1"
stop_address: "3/0/4"
@ -772,7 +772,7 @@ To use your KNX fan in your installation, add the following lines to your top le
# Example configuration.yaml entry
knx:
fan:
- name: "ceiling fan"
- name: "Ceiling fan"
address: "9/0/1"
state_address: "9/0/2"
```
@ -819,7 +819,7 @@ To use your KNX light in your installation, add the following lines to your top
# Example configuration.yaml entry
knx:
light:
- name: "kitchen"
- name: "Kitchen"
address: "1/0/9"
```
@ -937,14 +937,14 @@ For switching/light actuators that are only controlled by a single group address
knx:
light:
# dimmable light
- name: Bedroom-Light-1
- name: "Bedroom Light 1"
address: "1/0/9"
state_address: "1/1/9"
brightness_address: "1/2/9"
brightness_state_address: "1/3/9"
#
# RGB light
- name: Bathroom-Light-1
- name: "Bathroom Light 1"
address: "1/0/9"
state_address: "1/1/9"
brightness_address: "1/2/9"
@ -953,7 +953,7 @@ knx:
color_state_address: "1/5/9"
#
# tunable white light
- name: Office-Light-1
- name: "Office Light 1"
address: "1/0/21"
state_address: "1/1/21"
brightness_address: "1/2/21"
@ -965,7 +965,7 @@ knx:
max_kelvin: 6200
#
# actuator without dedicated state communication object
- name: Cellar-Light-1
- name: "Cellar Light 1"
address: "1/0/5"
state_address: "1/0/5"
```
@ -977,7 +977,7 @@ The KNX notify platform allows you to send notifications to [KNX](https://www.kn
```yaml
knx:
notify:
- name: Alarm
- name: "Alarm"
address: "5/1/10"
```
@ -1000,7 +1000,7 @@ The KNX scenes platform allows you to trigger [KNX](https://www.knx.org/) scenes
# Example configuration.yaml entry
knx:
scene:
- name: Romantic
- name: "Romantic"
address: 8/8/8
scene_number: 23
```
@ -1030,9 +1030,9 @@ Sensors are read-only. To write to the KNX bus configure an exposure [KNX Integr
# Example configuration.yaml entry
knx:
sensor:
- name: Heating.Valve1
- name: "Heating Valve 1"
state_address: "2/0/0"
type: "percent"
type: percent
```
In order to actively read the sensor data from the bus every 30 minutes you can add the following lines to your `configuration.yaml`:
@ -1041,9 +1041,9 @@ In order to actively read the sensor data from the bus every 30 minutes you can
# Example configuration.yaml entry
knx:
sensor:
- name: Heating.Valve1
- name: "Heating Valve 1"
state_address: "2/0/0"
type: "percent"
type: percent
sync_state: every 30
```
@ -1076,14 +1076,18 @@ always_callback:
| KNX DPT | type | size in byte | range | unit |
|--------:|-------------------------------|-------------:|:--------------------------:|----------------|
| 5 | 1byte_unsigned | 1 | 0 ... 255 | |
| 5.001 | percent | 1 | 0 ... 100 | % |
| 5.003 | angle | 1 | 0 ... 360 | ° |
| 5.004 | percentU8 | 1 | 0 ... 255 | % |
| 5.010 | pulse | 1 | 0 ... 255 | |
| 5.010 | 1byte_unsigned | 1 | 0 ... 255 | |
| 5.005 | decimal_factor | 1 | 0 ... 255 | |
| 5.006 | tariff | 1 | 0 ... 254 | |
| 5.010 | pulse | 1 | 0 ... 255 | counter pulses |
| 6 | 1byte_signed | 1 | -128 ... 127 | |
| 6.001 | percentV8 | 1 | -128 ... 127 | % |
| 6.010 | counter_pulses | 1 | -128 ... 127 | counter pulses |
| 7.001 | 2byte_unsigned | 2 | 0 ... 65535 | pulses |
| 7 | 2byte_unsigned | 2 | 0 ... 65535 | |
| 7.001 | pulse_2byte | 2 | 0 ... 65535 | pulses |
| 7.002 | time_period_msec | 2 | 0 ... 65535 | ms |
| 7.003 | time_period_10msec | 2 | 0 ... 65535 | ms |
| 7.004 | time_period_100msec | 2 | 0 ... 65535 | ms |
@ -1094,14 +1098,17 @@ always_callback:
| 7.012 | current | 2 | 0 ... 65535 | mA |
| 7.013 | brightness | 2 | 0 ... 65535 | lx |
| 7.600 | color_temperature | 2 | 0 ... 65535 | K |
| 8.001 | 2byte_signed | 2 | -32768 ... 32767 | pulses |
| 8 | 2byte_signed | 2 | -32768 ... 32767 | |
| 8.001 | pulse_2byte_signed | 2 | -32768 ... 32767 | pulses |
| 8.002 | delta_time_ms | 2 | -32768 ... 32767 | ms |
| 8.003 | delta_time_10ms | 2 | -32768 ... 32767 | ms |
| 8.004 | delta_time_100ms | 2 | -32768 ... 32767 | ms |
| 8.005 | delta_time_sec | 2 | -32768 ... 32767 | s |
| 8.006 | delta_time_min | 2 | -32768 ... 32767 | min |
| 8.007 | delta_time_hrs | 2 | -32768 ... 32767 | h |
| 8.010 | percentV16 | 2 | -32768 ... 32767 | % |
| 8.011 | rotation_angle | 2 | -32768 ... 32767 | ° |
| 9.* | enthalpy | 2 | -671088.64 ... 670760.96 | H |
| 9 | 2byte_float | 2 | -671088.64 ... 670760.96 | |
| 9.001 | temperature | 2 | -273 ... 670760 | °C |
| 9.002 | temperature_difference_2byte | 2 | -670760 ... 670760 | K |
| 9.003 | temperature_a | 2 | -670760 ... 670760 | K/h |
@ -1113,6 +1120,7 @@ always_callback:
| 9.010 | time_1 | 2 | -670760 ... 670760 | s |
| 9.011 | time_2 | 2 | -670760 ... 670760 | ms |
| 9.020 | voltage | 2 | -671088.64 ... 670760.96 | mV |
| 9.021 | curr | 2 | -671088.64 ... 670760.96 | mA |
| 9.022 | power_density | 2 | -671088.64 ... 670760.96 | W/m² |
| 9.023 | kelvin_per_percent | 2 | -671088.64 ... 670760.96 | K/% |
| 9.024 | power_2byte | 2 | -671088.64 ... 670760.96 | kW |
@ -1120,8 +1128,12 @@ always_callback:
| 9.026 | rain_amount | 2 | -671088.64 ... 670760.96 | l/m² |
| 9.027 | temperature_f | 2 | -459.6 ... 670760 | °F |
| 9.028 | wind_speed_kmh | 2 | 0 ... 670760 | km/h |
| 12.*** | 4byte_unsigned | 4 | 0 ... 4294967295 | |
| 13.*** | 4byte_signed | 4 | -2147483648 ... 2147483647 | |
| 9.? | enthalpy | 2 | -671088.64 ... 670760.96 | H |
| 12 | 4byte_unsigned | 4 | 0 ... 4294967295 | |
| 12.1200 | volume_liquid_litre | 4 | 0 ... 4294967295 | l |
| 12.1201 | volume_m3 | 4 | 0 ... 4294967295 | m³ |
| 13 | 4byte_signed | 4 | -2147483648 ... 2147483647 | |
| 13.001 | pulse_4byte | 4 | -2147483648 ... 2147483647 | pulses |
| 13.002 | flow_rate_m3h | 4 | -2147483648 ... 2147483647 | m³/h |
| 13.010 | active_energy | 4 | -2147483648 ... 2147483647 | Wh |
| 13.011 | apparant_energy | 4 | -2147483648 ... 2147483647 | VAh |
@ -1130,8 +1142,8 @@ always_callback:
| 13.014 | apparant_energy_kvah | 4 | -2147483648 ... 2147483647 | kVAh |
| 13.015 | reactive_energy_kvarh | 4 | -2147483648 ... 2147483647 | kVARh |
| 13.100 | long_delta_timesec | 4 | -2147483648 ... 2147483647 | s |
| 14 | 4byte_float | 4 | | |
| 14.000 | acceleration | 4 | | m/s² |
| 14.*** | 4byte_float | 4 | | |
| 14.001 | acceleration_angular | 4 | | rad/s² |
| 14.002 | activation_energy | 4 | | J/mol |
| 14.003 | activity | 4 | | s⁻¹ |
@ -1220,14 +1232,14 @@ always_callback:
# Example configuration.yaml entry
knx:
sensor:
- name: Heating.Valve1
- name: "Heating Valve 1"
state_address: "2/0/0"
sync_state: init
type: "percent"
- name: Kitchen.Temperature
type: percent
- name: "Kitchen Temperature"
state_address: "6/2/1"
sync_state: every 60
type: "temperature"
type: temperature
```
## Switch
@ -1237,7 +1249,7 @@ The KNX switch platform is used as an interface to switching actuators.
```yaml
knx:
switch:
- name: Kitchen.Coffee
- name: "Kitchen coffee maker"
address: "1/1/6"
```
@ -1275,7 +1287,7 @@ To use your KNX weather station in your installation, add the following lines to
# Example configuration.yaml entry
knx:
weather:
- name: "home"
- name: "Home"
address_temperature: "7/0/0"
address_brightness_south: "7/0/1"
address_brightness_west: "7/0/2"

View File

@ -178,7 +178,7 @@ switch:
{% configuration %}
host:
description: "The IP address of your myStrom switch, e.g., `http://192.168.1.32`."
description: "The IP address of your myStrom switch, e.g., `192.168.1.32`."
required: true
type: string
name:

View File

@ -39,7 +39,7 @@ hass.bus.fire(name, {"wow": "from a Python script!"})
```
- Start Home Assistant
- Call service `python_script.hello_world` with parameters
- Call your new {% my developer_call_service service="python_script.hello_world" %} service (with parameters) from the {% my developer_services %}.
```yaml
name: you

View File

@ -26,7 +26,9 @@ The `roomba` integration allows you to control your [iRobot Roomba](https://www.
</p>
<div class='note'>
This platform has been tested and is confirmed to be working with the iRobot Roomba s9+, Roomba 980, Roomba 960, Roomba 890, and Braava jet m6 models, but should also work fine with any Wi-Fi enabled Roomba or Braava like the 690.
This integration has been tested and confirmed to be working with the iRobot Roomba s9+, Roomba 980, Roomba 960, Roomba 890, and Braava jet m6 models, but should also work fine with any Wi-Fi enabled Roomba or Braava like the 690. For auto-discovery, you will need to initiate a Roomba reboot. For example, by holding the clean button for up to 20 seconds on an i7 or 980. [More information about rebooting your robot](https://homesupport.irobot.com/app/answers/detail/a_id/9087/~/rebooting-or-resetting-your-robot).
</div>
{% include integrations/config_flow.md %}

View File

@ -9,13 +9,13 @@ ha_domain: sensor
ha_iot_class:
---
Sensors are gathering information about states and conditions.
Sensors are a basic platform component in Home Assistant. They monitor the states and conditions of a variety of entities. An entity can be many things. This can include a physical device like a motion sensor that reports the battery level, a web service that retrieves the weather temperature, a built-in function that calculates the sun's elevation relative to your GPS position, or even a custom sensor you may have created to report the free space on your laptop. These are all *things* reporting different types of information.
Home Assistant currently supports a wide range of sensors. They are able to display information which are provides by Home Assistant directly, are gathered from web services, and, of course, physical devices.
Some of these sensors are built-in to Home Assistant, some are created automatically when you add an integration (see this [list](/integrations/#sensor)), and some can be created manually. The [Statistics](/integrations/statistics) and [Template](/integrations/template) sensors are two examples of the last case.
## Device Class
The way these sensors are displayed in the frontend can be modified in the [customize section](/docs/configuration/customizing-devices/). The following device classes are supported for sensors:
The type of data a sensor returns impacts how it is displayed in the frontend. This is controlled by the sensor's device class designation. Built-in sensors and many created from an integration will have this designation predefined. Those can be modified in the [customize section](/docs/configuration/customizing-devices/). When manually creating a new sensor the device class may be optionally assigned. A full list of available sensor device classes is below:
- **None**: Generic sensor. This is the default and doesn't need to be set.
- **battery**: Percentage of battery that is left.

View File

@ -1,29 +0,0 @@
---
title: "Websocket Connections Sensor"
description: "Instructions on how to count connected clients within Home Assistant."
logo: home-assistant.png
ha_category:
- Utility
- Sensor
ha_release: 0.33
ha_iot_class: Local Push
ha_quality_scale: internal
ha_domain: websocket_api
---
The `websocket_api` sensor platform shows how many clients are connected to the stream API.
## Configuration
To add the connected clients to your installation, add the following to your `configuration.yaml` file:
```yaml
# Example configuration.yaml entry
sensor:
- platform: websocket_api
```
### Note
This replaces the previous `api_streams` sensor.
The default sensor name is `connected_clients`.

View File

@ -28,6 +28,12 @@ ha_platforms:
Integrate [Shelly devices](https://shelly.cloud) into Home Assistant.
## Shelly device configuration
Shelly devices use the `CoIoT` protocol to communicate with integration. For Shelly firmware 1.10.0 or newer, `CoIoT` must be enabled in the device settings. Navigate to the local IP address of your Shelly device, **Internet & Security** >> **ADVANCED - DEVELOPER SETTINGS** and check the box **Enable CoIoT**.
We recommend using `unicast` for communication. To enable this, enter the local IP address of the Home Assistant server and port `5683` into the **CoIoT peer** field and push **SAVE** button. This is mandatory for Shelly Motion with firmware 1.1.0 or newer. After changing the **CoIoT peer**, the Shelly device needs to be manually restarted.
<div class="note">
Integration is communicating directly with the device; cloud connection is not needed.
</div>

View File

@ -139,6 +139,38 @@ switch:
{% endraw %}
### Multiple actions for turn_on or turn_off
This example shows multiple service calls for turn_on and turn_off.
{% raw %}
```yaml
switch:
- platform: template
switches:
copy:
value_template: "{{ is_state('switch.source', 'on') }}"
turn_on:
- service: switch.turn_on
target:
entity_id: switch.target
- service: light.turn_on
target:
entity_id: light.target
data:
brightness_pct: 40
turn_off:
- service: switch.turn_off
target:
entity_id: switch.target
- service: light.turn_off
target:
entity_id: light.target
```
{% endraw %}
### Sensor and Two Switches
This example shows a switch that takes its state from a sensor, and uses two

View File

@ -23,7 +23,7 @@ sensor:
- platform: systemmonitor
resources:
- type: disk_use_percent
arg: /home
arg: /config
- type: memory_free
```

View File

@ -69,7 +69,3 @@ forecast_template:
required: false
type: template
{% endconfiguration %}
## Considerations
If you are using the state of a integration that takes extra time to load, the Template Weather may get an `unknown` state during startup. This results in error messages in your log file until that integration has completed loading. If you use `is_state()` function in your template, you can avoid this situation.

View File

@ -26,10 +26,12 @@ For details to use the WebSocket API, please refer to the [WebSocket API documen
## Track current connections
The websocket API provides a sensor that will keep track of the number of current connected clients. You can add it by adding the following to your configuration:
The WebSocket API provides a sensor that will keep track of the number of currently connected clients. You can add it by adding the following to your configuration:
```yaml
# Example configuration.yaml entry
sensor:
platform: websocket_api
- platform: websocket_api
```
This will create a sensor called `sensor.connected_clients` whose value is the total number of connected clients.

View File

@ -77,6 +77,7 @@ Some other Zigbee coordinator hardware may not support a firmware that is capabl
- Texas Instruments based radios with Z-Stack 3.x.x (via the [zigpy-znp](https://github.com/zha-ng/zigpy-znp) library for zigpy)
- [CC2652P/CC2652R/CC2652RB USB stick or dev board hardware flashed with Z-Stack 3.x.x coordinator firmware](https://www.zigbee2mqtt.io/information/supported_adapters)
- [CC1352P/CC1352R USB stick or dev board hardware flashed with Z-Stack 3.x.x coordinator firmware](https://www.zigbee2mqtt.io/information/supported_adapters)
- [CC2538 USB stick or dev board hardware flashed with Z-Stack 3.x.x coordinator firmware](https://www.zigbee2mqtt.io/information/supported_adapters)
- Digi XBee Zigbee based radios (via the [zigpy-xbee](https://github.com/zigpy/zigpy-xbee) library for zigpy)
- [Digi XBee Series 3 (xbee3-24)](https://www.digi.com/products/embedded-systems/digi-xbee/rf-modules/2-4-ghz-rf-modules/xbee3-zigbee-3) and [Digi XBee Series S2C](https://www.digi.com/products/embedded-systems/digi-xbee/rf-modules/2-4-ghz-rf-modules/xbee-zigbee) modules
- Note! While not a must, [it is recommend to upgrade XBee Series 3 and S2C to newest firmware firmware using XCTU](https://www.digi.com/resources/documentation/Digidocs/90002002/Default.htm#Tasks/t_load_zb_firmware.htm)
@ -87,6 +88,8 @@ Some other Zigbee coordinator hardware may not support a firmware that is capabl
- [PiZiGate](https://zigate.fr/produit/pizigate-v1-0/)
- [Wifi ZiGate](https://zigate.fr/produit/zigate-pack-wifi-v1-3/)
#### Warning about Wi-Fi-based Zigbee-to-Serial bridges/gateways
<div class="note warning">
The **EZSP** protocol requires a stable connection to the serial port. With _ITEAD Sonoff ZBBridge_ connecting over the WiFi network

View File

@ -635,8 +635,8 @@
/components/sensor.amcrest /integrations/amcrest
/components/sensor.android_ip_webcam /integrations/android_ip_webcam#sensor
/components/sensor.apcupsd /integrations/apcupsd#sensor
/components/sensor.api_stream /integrations/sensor.websocket_api
/components/sensor.api_streams /integrations/sensor.websocket_api
/components/sensor.api_stream /integrations/websocket_api
/components/sensor.api_streams /integrations/websocket_api
/components/sensor.aqualogic /integrations/aqualogic#sensor
/components/sensor.arduino /integrations/arduino#sensor
/components/sensor.arest /integrations/arest#sensor
@ -1076,6 +1076,7 @@
/integrations/fan.xiaomi_miio /integrations/xiaomi_miio
/integrations/light.xiaomi_miio /integrations/xiaomi_miio
/integrations/remote.xiaomi_miio /integrations/xiaomi_miio
/integrations/sensor.websocket_api /integrations/websocket_api
/integrations/sensor.xiaomi_miio /integrations/xiaomi_miio
/integrations/switch.xiaomi_miio /integrations/xiaomi_miio
/integrations/vacuum.xiaomi_miio /integrations/xiaomi_miio