Merge branch 'current' into next

This commit is contained in:
Franck Nijhof 2020-03-31 20:55:24 +02:00
commit e0dc3af80b
No known key found for this signature in database
GPG Key ID: D62583BA8AB11CA3
25 changed files with 202 additions and 107 deletions

137
package-lock.json generated
View File

@ -2098,46 +2098,103 @@
}
},
"remark-lint": {
"version": "6.0.6",
"resolved": "https://registry.npmjs.org/remark-lint/-/remark-lint-6.0.6.tgz",
"integrity": "sha512-JBY6zz5fYQFN724Vq6VeiHwhyjVIlrww/dE1+hWGcDyUuz7YNCqwZKwBdQGDvslICkzHw/wEExNEb8D4PNiLlA==",
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/remark-lint/-/remark-lint-7.0.0.tgz",
"integrity": "sha512-OLrWPYy0MUcGLa/2rjuy1kQILTRRK+JiRtyUzqe4XRoHboGuvFDcy/W2e7sq5hu/0xmD+Eh7cEa1Coiqp7LeaA==",
"dev": true,
"requires": {
"remark-message-control": "^4.0.0"
"remark-message-control": "^6.0.0"
}
},
"remark-lint-fenced-code-flag": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/remark-lint-fenced-code-flag/-/remark-lint-fenced-code-flag-1.0.4.tgz",
"integrity": "sha512-bkQvlEYco6ZzdzvGPrY7DBsqSq/2mZEmdhpn0KdMEZ9kcKJP4unQdVQys04SKnf9QISqQ446VnQj5Q4E3HMSkQ==",
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/remark-lint-fenced-code-flag/-/remark-lint-fenced-code-flag-2.0.0.tgz",
"integrity": "sha512-SyQ31cdQlbsS+eBw2DUxkuzNwGIGlWnnCLyHLz3D1nxtZBVUaUOnIAturSA3PsguIrnxH4qD2JYCTp5aPbZhzQ==",
"dev": true,
"requires": {
"unified-lint-rule": "^1.0.0",
"unist-util-generated": "^1.1.0",
"unist-util-position": "^3.0.0",
"unist-util-visit": "^1.1.1"
"unist-util-visit": "^2.0.0"
},
"dependencies": {
"unist-util-is": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.2.tgz",
"integrity": "sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ==",
"dev": true
},
"unist-util-visit": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.2.tgz",
"integrity": "sha512-HoHNhGnKj6y+Sq+7ASo2zpVdfdRifhTgX2KTU3B/sO/TTlZchp7E3S4vjRzDJ7L60KmrCPsQkVK3lEF3cz36XQ==",
"dev": true,
"requires": {
"@types/unist": "^2.0.0",
"unist-util-is": "^4.0.0",
"unist-util-visit-parents": "^3.0.0"
}
},
"unist-util-visit-parents": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.0.2.tgz",
"integrity": "sha512-yJEfuZtzFpQmg1OSCyS9M5NJRrln/9FbYosH3iW0MG402QbdbaB8ZESwUv9RO6nRfLAKvWcMxCwdLWOov36x/g==",
"dev": true,
"requires": {
"@types/unist": "^2.0.0",
"unist-util-is": "^4.0.0"
}
}
}
},
"remark-lint-no-shell-dollars": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/remark-lint-no-shell-dollars/-/remark-lint-no-shell-dollars-1.0.4.tgz",
"integrity": "sha512-YXFj8FUVTKkVvoAbFY3zv1Ol7Kj1i+qdze3pXSgRG61y1LpfL8/HpnvFrseMbBmNw6o4WpjTo7GoArngJ1sCeg==",
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/remark-lint-no-shell-dollars/-/remark-lint-no-shell-dollars-2.0.0.tgz",
"integrity": "sha512-1uEM0kSGlV6UY7w3PdIeIf/USFFvVuU1352myQdaiw/Wof7+uVXznFFCPnhJDTVlPN4vrgwFnLb32UwXrjkrQw==",
"dev": true,
"requires": {
"unified-lint-rule": "^1.0.0",
"unist-util-generated": "^1.1.0",
"unist-util-visit": "^1.1.1"
"unist-util-visit": "^2.0.0"
},
"dependencies": {
"unist-util-is": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.2.tgz",
"integrity": "sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ==",
"dev": true
},
"unist-util-visit": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.2.tgz",
"integrity": "sha512-HoHNhGnKj6y+Sq+7ASo2zpVdfdRifhTgX2KTU3B/sO/TTlZchp7E3S4vjRzDJ7L60KmrCPsQkVK3lEF3cz36XQ==",
"dev": true,
"requires": {
"@types/unist": "^2.0.0",
"unist-util-is": "^4.0.0",
"unist-util-visit-parents": "^3.0.0"
}
},
"unist-util-visit-parents": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.0.2.tgz",
"integrity": "sha512-yJEfuZtzFpQmg1OSCyS9M5NJRrln/9FbYosH3iW0MG402QbdbaB8ZESwUv9RO6nRfLAKvWcMxCwdLWOov36x/g==",
"dev": true,
"requires": {
"@types/unist": "^2.0.0",
"unist-util-is": "^4.0.0"
}
}
}
},
"remark-message-control": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/remark-message-control/-/remark-message-control-4.2.0.tgz",
"integrity": "sha512-WXH2t5ljTyhsXlK1zPBLF3iPHbXl58R94phPMreS1xcHWBZJt6Oiu8RtNjy1poZFb3PqKnbYLJeR/CWcZ1bTFw==",
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/remark-message-control/-/remark-message-control-6.0.0.tgz",
"integrity": "sha512-k9bt7BYc3G7YBdmeAhvd3VavrPa/XlKWR3CyHjr4sLO9xJyly8WHHT3Sp+8HPR8lEUv+/sZaffL7IjMLV0f6BA==",
"dev": true,
"requires": {
"mdast-comment-marker": "^1.0.0",
"unified-message-control": "^1.0.0",
"xtend": "^4.0.1"
"unified-message-control": "^3.0.0"
}
},
"remark-parse": {
@ -2812,14 +2869,48 @@
}
},
"unified-message-control": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/unified-message-control/-/unified-message-control-1.0.4.tgz",
"integrity": "sha512-e1dEtN4Z/TvLn/qHm+xeZpzqhJTtfZusFErk336kkZVpqrJYiV9ptxq+SbRPFMlN0OkjDYHmVJ929KYjsMTo3g==",
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/unified-message-control/-/unified-message-control-3.0.1.tgz",
"integrity": "sha512-K2Kvvp1DBzeuxYLLsumZh/gDWUTl4e2z/P3VReFirC78cfHKtQifbhnfRrSBtKtd1Uc6cvYTW0/SZIUaMAEcTg==",
"dev": true,
"requires": {
"trim": "0.0.1",
"unist-util-visit": "^1.0.0",
"vfile-location": "^2.0.0"
"unist-util-visit": "^2.0.0",
"vfile-location": "^3.0.0"
},
"dependencies": {
"unist-util-is": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.2.tgz",
"integrity": "sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ==",
"dev": true
},
"unist-util-visit": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.2.tgz",
"integrity": "sha512-HoHNhGnKj6y+Sq+7ASo2zpVdfdRifhTgX2KTU3B/sO/TTlZchp7E3S4vjRzDJ7L60KmrCPsQkVK3lEF3cz36XQ==",
"dev": true,
"requires": {
"@types/unist": "^2.0.0",
"unist-util-is": "^4.0.0",
"unist-util-visit-parents": "^3.0.0"
}
},
"unist-util-visit-parents": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.0.2.tgz",
"integrity": "sha512-yJEfuZtzFpQmg1OSCyS9M5NJRrln/9FbYosH3iW0MG402QbdbaB8ZESwUv9RO6nRfLAKvWcMxCwdLWOov36x/g==",
"dev": true,
"requires": {
"@types/unist": "^2.0.0",
"unist-util-is": "^4.0.0"
}
},
"vfile-location": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.0.1.tgz",
"integrity": "sha512-yYBO06eeN/Ki6Kh1QAkgzYpWT1d3Qln+ZCtSbJqFExPl1S3y2qqotJQXoh6qEvl/jDlgpUJolBn3PItVnnZRqQ==",
"dev": true
}
}
},
"unique-concat": {

View File

@ -6,9 +6,9 @@
"devDependencies": {
"remark-cli": "^8.0.0",
"remark-frontmatter": "^1.3.3",
"remark-lint": "^6.0.6",
"remark-lint-fenced-code-flag": "^1.0.4",
"remark-lint-no-shell-dollars": "^1.0.4",
"remark-lint": "^7.0.0",
"remark-lint-fenced-code-flag": "^2.0.0",
"remark-lint-no-shell-dollars": "^2.0.0",
"remark-stringify": "^8.0.0",
"textlint": "^11.6.3",
"textlint-rule-common-misspellings": "^1.0.1",

View File

@ -32,7 +32,7 @@ If you run into trouble while configuring Home Assistant, have a look at the [co
## Reloading changes
You will have to restart Home Assistant for most changes to `configuration.yaml` to take effect.
You can load changes to [automations](/docs/automation/), [core (customize)](/docs/configuration/customizing-devices/), [groups](/integrations/group/), and [scripts](/integrations/script/) without restarting.
You can load changes to [automations](/docs/automation/), [core (customize)](/docs/configuration/customizing-devices/), [groups](/integrations/group/), [input_booleans](/integrations/input_boolean/), [input_datetimes](/integrations/input_datetime/), [input_numbers](/integrations/input_number/), [input_selects](/integrations/input_select/), [input_texts](/integrations/input_text/), [persons](/integrations/person/), [scenes](/integrations/scene/), [scripts](/integrations/script/), [timers](/integrations/timer/), and [zones](/integrations/zone/) without restarting.
<div class='note warning'>

View File

@ -1,7 +1,6 @@
---
title: ASUSWRT
description: Instructions on how to integrate ASUSWRT into Home Assistant.
logo: asus.png
ha_category:
- Hub
- Presence Detection

View File

@ -1,7 +1,6 @@
---
title: August
description: Instructions on how to integrate your August devices into Home Assistant.
logo: august.png
ha_category:
- Doorbell
- Binary Sensor
@ -101,7 +100,7 @@ If you have an August Keypad, once you have enabled the August component, you sh
### Presence Detection with Lock Operation
Using the lock operation sensors, you can detect when a user operates a lock and is physically present (not remote). The below example will trigger when the user named “John Doe” in August locks or unlocks the door from the keypad (if present), via Bluetooth from their phone, or by auto-unlock. The state of the sensor will be the name of the party operating the lock as returned by August.
Using the lock operation sensors, you can detect when a user operates a lock and is physically present (not remote). The below automation example (added to `automations.yaml`) will trigger when the user named “John Doe” in August locks or unlocks the door from the keypad (if present), via Bluetooth from their phone, or by auto-unlock. The state of the sensor will be the name of the party operating the lock as returned by August.
{% raw %}

View File

@ -1,7 +1,6 @@
---
title: Brother Printer
description: Instructions on how to integrate a Brother printer into Home Assistant.
logo: brother.png
ha_category:
- System Monitor
ha_release: 0.104

View File

@ -1,7 +1,6 @@
---
title: CoolMasterNet
description: Instructions on how to integrate CoolMasterNet within Home Assistant.
logo: coolautomation.png
ha_category:
- Climate
ha_release: 0.88

View File

@ -1,7 +1,6 @@
---
title: DoorBird
description: Instructions on how to integrate your DoorBird video doorbell with Home Assistant.
logo: doorbird.png
ha_category:
- Doorbell
- Camera

View File

@ -1,7 +1,6 @@
---
title: Philips Dynalite
description: Instructions on setting up Philips Dynalite within Home Assistant.
logo: dynalite.png
ha_category:
- Hub
- Light

View File

@ -1,7 +1,6 @@
---
title: Environment Canada
description: Weather data from Environment Canada.
logo: environment_canada.png
ha_category:
- Weather
- Sensor

View File

@ -60,6 +60,7 @@ Supported devices:
Tested devices:
- Epson WF2660
- Epson WF3540
- Epson WF3620
- Epson WF3640

View File

@ -135,7 +135,3 @@ gdacs:
latitude: -41.2
longitude: 174.7
```
## Locations NOT supported:
- Ireland

View File

@ -1,7 +1,6 @@
---
title: Growatt
description: Instructions on how to integrate your Growatt server solar inverter within Home Assistant.
logo: growatt.png
ha_category:
- Sensor
- Energy

View File

@ -47,17 +47,15 @@ A connection to a single device enables control for all devices on the network.
Use the sign-in service to sign the connected controller into a HEOS account so that it can retrieve and play HEOS favorites and playlists. An error message is logged if sign-in is unsuccessful. Example service data payload:
```json
{
"username": "example@example.com",
"password": "password"
}
```yaml
username: "example@example.com"
password: "password"
```
| Attribute | Description
| ---------------------- | ---------------------------------------------------------|
| `username` | The username or email of the HEOS account. [Required]
| `password` | The password of the HEOS account. [Required]
| Service data attribute | Optional | Description |
| ---------------------- | -------- | ----------- |
| `username` | no | The username or email of the HEOS account.
| `password` | no | The password of the HEOS account.
### Service `heos.sign_out`
@ -69,73 +67,65 @@ Use the sign-out service to sign the connected controller out of a HEOS account.
You can play a HEOS favorite by number or name with the `media_player.play_media` service. Example service data payload:
```json
{
"entity_id": "media_player.office",
"media_content_type": "favorite",
"media_content_id": "1"
}
```yaml
entity_id: media_player.office
media_content_type: "favorite"
media_content_id: "1"
```
| Attribute | Description
| ---------------------- | ---------------------------------------------------------|
| `entity_id` | `entity_id` of the player
| `media_content_type` | Set to the value `favorite`
| `media_content_id` | The nubmer (i.e., `1`) or name (i.e., `Thumbprint Radio`) of the HEOS favorite
| Service data attribute | Optional | Description |
| ---------------------- | -------- | ----------- |
| `entity_id` | yes | `entity_id` of the player(s)
| `media_content_type` | no | Set to the value `favorite`
| `media_content_id` | no | (i.e., `1`) or name (i.e., `Thumbprint Radio`) of the HEOS favorite
#### Play Playlist
You can play a HEOS playlist with the `media_player.play_media` service. Example service data payload:
```json
{
"entity_id": "media_player.office",
"media_content_type": "playlist",
"media_content_id": "Awesome Music"
}
```yaml
entity_id: media_player.office
media_content_type: "playlist"
media_content_id: "Awesome Music"
```
| Attribute | Description
| ---------------------- | ---------------------------------------------------------|
| `entity_id` | `entity_id` of the player
| `media_content_type` | Set to the value `playlist`
| `media_content_id` | The name of the HEOS playlist
| Service data attribute | Optional | Description |
| ---------------------- | -------- | ----------- |
| `entity_id` | yes | `entity_id` of the player(s)
| `media_content_type` | no | Set to the value `playlist`
| `media_content_id` | no | The name of the HEOS playlist
#### Play Quick Select
You can play a HEOS Quick Select by nubmer or name with the `media_player.play_media` service. Example service data payload:
```json
{
"entity_id": "media_player.office",
"media_content_type": "quick_select",
"media_content_id": "1"
}
```yaml
entity_id: media_player.office
media_content_type: "quick_select"
media_content_id": "1"
```
| Attribute | Description
| ---------------------- | ---------------------------------------------------------|
| `entity_id` | `entity_id` of the player
| `media_content_type` | Set to the value `quick_select`
| `media_content_id` | The quick select number (i.e., `1`) or name (i.e., `Quick Select 1`)
| Service data attribute | Optional | Description |
| ---------------------- | -------- | ----------- |
| `entity_id` | yes | `entity_id` of the player(s)
| `media_content_type` | no | Set to the value `quick_select`
| `media_content_id` | no | The quick select number (i.e., `1`) or name (i.e., `Quick Select 1`)
#### Play URL
You can play a URL through a HEOS media player using the `media_player.play_media` service. The HEOS player must be able to reach the URL. Example service data payload:
```json
{
"entity_id": "media_player.office",
"media_content_type": "url",
"media_content_id": "http://path.to/stream.mp3"
}
```yaml
entity_id: media_player.office
media_content_type: "url"
media_content_id: "http://path.to/stream.mp3"
```
| Attribute | Description
| ---------------------- | ---------------------------------------------------------|
| `entity_id` | `entity_id` of the player to play the URL
| `media_content_type` | Set to the value `url`
| `media_content_id` | The full URL to the stream
| Service data attribute | Optional | Description |
| ---------------------- | -------- | ----------- |
| `entity_id` | yes | `entity_id` of the player(s) to play the URL
| `media_content_type` | no | Set to the value `url`
| `media_content_id` | no | The full URL to the stream
## Notes

View File

@ -1,7 +1,6 @@
---
title: LCN
description: Instructions on how to integrate LCN components with Home Assistant.
logo: lcn.png
ha_category:
- Hub
- Binary Sensor

View File

@ -1,7 +1,6 @@
---
title: Lutron
description: Instructions on how to use Lutron devices with Home Assistant.
logo: lutron.png
ha_category:
- Hub
- Cover

View File

@ -1,7 +1,6 @@
---
title: Norwegian Institute for Air Research (NILU)
description: Instructions on how to integrate air pollution data from NILU within Home Assistant.
logo: nilu_logo.png
ha_category:
- Health
ha_iot_class: Cloud Polling

View File

@ -1,7 +1,6 @@
---
title: RMV
description: Instructions on how to integrate Rhein-Main public transport departure times into Home Assistant.
logo: RMV.png
ha_category:
- Transport
ha_release: 0.76

View File

@ -1,7 +1,6 @@
---
title: Solar-Log
description: Instructions on how to integrate Solar-Log sensors within Home Assistant.
logo: solar-log.png
ha_category: Sensor
ha_release: 0.101
ha_iot_class: Local Polling

View File

@ -23,6 +23,32 @@ Each item in the list of devices is a 24 character string. These values can be f
The device item value is the last segment of the URL path, e.g., the URL
[https://app.tankutility.com/#/reports/000000000000000000000000](https://app.tankutility.com/#/reports/000000000000000000000000) would indicate `000000000000000000000000` as a device value.
### Using TankUtility API to Obtain Device ID
1. Obtain your personal token:
```bash
curl --user <my_username>:<my_password> https://data.tankutility.com/api/getToken`
```
The JSON response structure should resemble:
```json
{"token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE0MzgyMjQwODE0NjIsInYiOjAsImQiOnsidWleejoic2ltcGxlbG9naW46MzM1In0sImlhdCI6wwDIyMzk5NX0.kbYzxRtbGB2ke3IBgQTVMNQprHOWJZFgQQnPK6Wyas4"}
```
2. Receive the list of devices you have in your account:
```bash
curl https://data.tankutility.com/api/devices?token=<my_personal_token>
```
The JSON response structure should resemble:
```json
{"devices":["54df6a066667531535371367","54ff69057492666782350667"]}
```
## Configuration
To enable the component, add the following lines to your `configuration.yaml` file:

View File

@ -1,7 +1,6 @@
---
title: Tankerkoenig
description: Instructions on how to integrate Tankerkoenig sensors within Home Assistant.
logo: tankerkoenig.png
ha_category:
- Energy
- Sensor

View File

@ -298,7 +298,7 @@ sensor:
{% if is_state('device_tracker.my_device_nmap','home') %}
{{ state_attr('zone.home','latitude') }}
{% else %}
state_attr('device_tracker.my_device_gps','latitude')
{{ state_attr('device_tracker.my_device_gps','latitude') }}
{% endif %}
longitude: >-
{% if is_state('device_tracker.my_device_nmap','home') %}

View File

@ -1,7 +1,6 @@
---
title: Todoist
description: Instructions on how to integrate Todoist into Home Assistant.
logo: todoist.png
ha_category:
- Calendar
ha_iot_class: Cloud Polling

View File

@ -1,7 +1,7 @@
---
title: "Dark Sky"
description: "Instructions on how to integrate Dark Sky within Home Assistant."
featured: true
featured: false
logo: dark_sky.png
ha_category:
- Weather
@ -14,7 +14,13 @@ The `darksky` platform uses the [Dark Sky](https://darksky.net/) web service as
## Configuration
You need an API key which is free but requires [registration](https://darksky.net/dev/register). The free tier allows up to 1000 calls per day, this platform updates at most every 3 minutes, using up to 480 of those calls.
<div class='note warning'>
On March 31, 2020 Dark Sky was [acquired by Apple](https://blog.darksky.net/dark-sky-has-a-new-home/) and is no longer allowing new API registrations. The Dark Sky API will continue to function for existing users through the end of 2021, but it is no longer possible to obtain an API key for new users.
</div>
The free tier allows up to 1000 calls per day, this platform updates at most every 3 minutes, using up to 480 of those calls.
<div class='note warning'>

View File

@ -152,13 +152,13 @@ curl -fsSL get.docker.com | sh
The following script will then install Home Assistant on a variety of operating systems and machine types.
```bash
curl -sL "https://raw.githubusercontent.com/home-assistant/hassio-installer/master/hassio_install.sh" | bash -s
curl -sL "https://raw.githubusercontent.com/home-assistant/supervised-installer/master/installer.sh" | bash -s
```
Some installation types require flags to identify the computer type, for example, when using a Raspberry Pi 4, the flag `-- -m raspberrypi4` is required. The install script would then look like this:
```bash
curl -sL "https://raw.githubusercontent.com/home-assistant/hassio-installer/master/hassio_install.sh" | bash -s -- -m raspberrypi4
curl -sL "https://raw.githubusercontent.com/home-assistant/supervised-installer/master/installer.sh" | bash -s -- -m raspberrypi4
```
#### Other machine types
@ -179,7 +179,7 @@ curl -sL "https://raw.githubusercontent.com/home-assistant/hassio-installer/mast
- `qemux86`
- `qemux86-64`
See the [hassio-installer](https://github.com/home-assistant/hassio-installer) GitHub page for an up-to-date listing of supported machine types.
See the [installer](https://github.com/home-assistant/supervised-installer) GitHub page for an up-to-date listing of supported machine types.
If you can not find your machine type in the list, you should pick the `qemu` release. i.e., `qemux86-64` for a normal 64-bit Linux distribution, or `qemuarm-64` for most modern ARM-based target like Raspberry Pi clones, or TV boxes.
@ -201,7 +201,7 @@ If you can not find your machine type in the list, you should pick the `qemu` re
[vmdk]: https://github.com/home-assistant/operating-system/releases/download/3.12/hassos_ova-3.12.vmdk.gz
[vhdx]: https://github.com/home-assistant/operating-system/releases/download/3.12/hassos_ova-3.12.vhdx.gz
[vdi]: https://github.com/home-assistant/operating-system/releases/download/3.12/hassos_ova-3.12.vdi.gz
[linux]: https://github.com/home-assistant/hassio-installer
[linux]: https://github.com/home-assistant/supervised-installer
[local]: http://homeassistant.local:8123
[samba]: /addons/samba/
[ssh]: /addons/ssh/