mirror of
https://github.com/home-assistant/core.git
synced 2026-03-03 14:26:59 +01:00
Compare commits
146 Commits
rc
...
config-yam
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2f37a58798 | ||
|
|
e124829364 | ||
|
|
87b83dcc1b | ||
|
|
be9b47539d | ||
|
|
be6ddc314c | ||
|
|
c6f8a7b7e4 | ||
|
|
53da5612e9 | ||
|
|
6cc56b76f9 | ||
|
|
03cb65d555 | ||
|
|
73dd024933 | ||
|
|
1c8c92bf8f | ||
|
|
7e041a6759 | ||
|
|
ee05f14530 | ||
|
|
f0ba5178b7 | ||
|
|
df51ac932b | ||
|
|
e96b5f2eb1 | ||
|
|
4e59c89327 | ||
|
|
15676021a9 | ||
|
|
d3197a0d1e | ||
|
|
35692b335c | ||
|
|
cc5c810501 | ||
|
|
f2681f2dc8 | ||
|
|
fe0a22c790 | ||
|
|
186ab50458 | ||
|
|
b524c40176 | ||
|
|
642864959a | ||
|
|
7ef6c34149 | ||
|
|
5b32e42b8c | ||
|
|
1be8b8e525 | ||
|
|
3fae15c430 | ||
|
|
c7e78568d0 | ||
|
|
492b542136 | ||
|
|
0f4852d8c2 | ||
|
|
737c0c1823 | ||
|
|
5fadcb01e9 | ||
|
|
2b4f46a739 | ||
|
|
44fe37da1f | ||
|
|
abd4e89577 | ||
|
|
033798835a | ||
|
|
83c77957c1 | ||
|
|
b1bc1dc102 | ||
|
|
40b8a2c380 | ||
|
|
fb23a6fbf8 | ||
|
|
faad3de02c | ||
|
|
5f30f532e5 | ||
|
|
667e8c4d38 | ||
|
|
74240ecd26 | ||
|
|
c81ee53265 | ||
|
|
8835f1d5e6 | ||
|
|
2ca84182d8 | ||
|
|
3f0d1bc071 | ||
|
|
350f462bdf | ||
|
|
2f98e68ed8 | ||
|
|
5b7fac94e5 | ||
|
|
c32ce3da5c | ||
|
|
0e1d1fbaed | ||
|
|
57d7f364f4 | ||
|
|
7cc5777b47 | ||
|
|
5e3f23b6a2 | ||
|
|
6873a40407 | ||
|
|
ddaa2fb293 | ||
|
|
53b6223459 | ||
|
|
7329cfb927 | ||
|
|
44b80dde0c | ||
|
|
8c125e4e4f | ||
|
|
227a258382 | ||
|
|
addc2a6766 | ||
|
|
97bcea9727 | ||
|
|
4f05c807b0 | ||
|
|
177a918c26 | ||
|
|
9705770c6c | ||
|
|
7309351165 | ||
|
|
d0401de70d | ||
|
|
6b89359a73 | ||
|
|
b31bafab99 | ||
|
|
84c556bb63 | ||
|
|
225ea02d9a | ||
|
|
ebd1cc994c | ||
|
|
9ec22ba158 | ||
|
|
2ff85d2134 | ||
|
|
3eb7f04510 | ||
|
|
54613ac8d9 | ||
|
|
044522a8ab | ||
|
|
19bf41496a | ||
|
|
a7efba098d | ||
|
|
042ad3b759 | ||
|
|
4270e4c793 | ||
|
|
cb11c22e76 | ||
|
|
c6e23fec93 | ||
|
|
553cecb397 | ||
|
|
bb7d5897d1 | ||
|
|
3e050ebe59 | ||
|
|
856a9e695a | ||
|
|
1944a8bd3a | ||
|
|
3f11af8084 | ||
|
|
46a87cd9dd | ||
|
|
f8a657cf01 | ||
|
|
75ed7b2fa2 | ||
|
|
e63e54820c | ||
|
|
37d2c946e8 | ||
|
|
e8a35ea69d | ||
|
|
28b950c64a | ||
|
|
e7cf6cbe72 | ||
|
|
5ad71453b8 | ||
|
|
ab9c8093c3 | ||
|
|
51acdeb563 | ||
|
|
bf60d57cc2 | ||
|
|
d94f15b985 | ||
|
|
8a621e6570 | ||
|
|
dd44b15b7b | ||
|
|
23ec28bbbf | ||
|
|
7a6a479b53 | ||
|
|
f9ffaad7f1 | ||
|
|
d4aa52ecc3 | ||
|
|
1b5eea5fae | ||
|
|
39dce8eb31 | ||
|
|
b651e62c7f | ||
|
|
1e807dc9da | ||
|
|
cba69e7e69 | ||
|
|
802a7aafec | ||
|
|
db5e7b3e3b | ||
|
|
75798bfb5e | ||
|
|
06a25de0d5 | ||
|
|
892da4a03e | ||
|
|
91e8e3da7a | ||
|
|
144b8768a1 | ||
|
|
cb6d86f86d | ||
|
|
422007577e | ||
|
|
7c2904bf48 | ||
|
|
3240fd7fc8 | ||
|
|
7dc2dff4e7 | ||
|
|
7e8de9bb9c | ||
|
|
9eff12605c | ||
|
|
784ac85759 | ||
|
|
31f7961437 | ||
|
|
eaae64fa12 | ||
|
|
88b276f3a4 | ||
|
|
f5c996e243 | ||
|
|
4863df00a1 | ||
|
|
9fadfecf14 | ||
|
|
dae7f73f53 | ||
|
|
c46d0382c3 | ||
|
|
c21e9cb24c | ||
|
|
928732af40 | ||
|
|
51dc6d7c26 | ||
|
|
02972579aa |
@@ -34,6 +34,7 @@ base_platforms: &base_platforms
|
||||
- homeassistant/components/humidifier/**
|
||||
- homeassistant/components/image/**
|
||||
- homeassistant/components/image_processing/**
|
||||
- homeassistant/components/infrared/**
|
||||
- homeassistant/components/lawn_mower/**
|
||||
- homeassistant/components/light/**
|
||||
- homeassistant/components/lock/**
|
||||
|
||||
4
.github/workflows/ci.yaml
vendored
4
.github/workflows/ci.yaml
vendored
@@ -40,7 +40,7 @@ env:
|
||||
CACHE_VERSION: 3
|
||||
UV_CACHE_VERSION: 1
|
||||
MYPY_CACHE_VERSION: 1
|
||||
HA_SHORT_VERSION: "2026.3"
|
||||
HA_SHORT_VERSION: "2026.4"
|
||||
DEFAULT_PYTHON: "3.14.2"
|
||||
ALL_PYTHON_VERSIONS: "['3.14.2']"
|
||||
# 10.3 is the oldest supported version
|
||||
@@ -605,7 +605,7 @@ jobs:
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Dependency review
|
||||
uses: actions/dependency-review-action@3c4e3dcb1aa7874d2c16be7d79418e9b7efd6261 # v4.8.2
|
||||
uses: actions/dependency-review-action@05fe4576374b728f0c523d6a13d64c25081e0803 # v4.8.3
|
||||
with:
|
||||
license-check: false # We use our own license audit checks
|
||||
|
||||
|
||||
@@ -289,6 +289,7 @@ homeassistant.components.imgw_pib.*
|
||||
homeassistant.components.immich.*
|
||||
homeassistant.components.incomfort.*
|
||||
homeassistant.components.inels.*
|
||||
homeassistant.components.infrared.*
|
||||
homeassistant.components.input_button.*
|
||||
homeassistant.components.input_select.*
|
||||
homeassistant.components.input_text.*
|
||||
@@ -544,6 +545,7 @@ homeassistant.components.tcp.*
|
||||
homeassistant.components.technove.*
|
||||
homeassistant.components.tedee.*
|
||||
homeassistant.components.telegram_bot.*
|
||||
homeassistant.components.teslemetry.*
|
||||
homeassistant.components.text.*
|
||||
homeassistant.components.thethingsnetwork.*
|
||||
homeassistant.components.threshold.*
|
||||
|
||||
8
CODEOWNERS
generated
8
CODEOWNERS
generated
@@ -401,8 +401,6 @@ build.json @home-assistant/supervisor
|
||||
/tests/components/dsmr_reader/ @sorted-bits @glodenox @erwindouna
|
||||
/homeassistant/components/duckdns/ @tr4nt0r
|
||||
/tests/components/duckdns/ @tr4nt0r
|
||||
/homeassistant/components/duke_energy/ @hunterjm
|
||||
/tests/components/duke_energy/ @hunterjm
|
||||
/homeassistant/components/duotecno/ @cereal2nd
|
||||
/tests/components/duotecno/ @cereal2nd
|
||||
/homeassistant/components/dwd_weather_warnings/ @runningman84 @stephan192
|
||||
@@ -794,6 +792,8 @@ build.json @home-assistant/supervisor
|
||||
/tests/components/inels/ @epdevlab
|
||||
/homeassistant/components/influxdb/ @mdegat01 @Robbie1221
|
||||
/tests/components/influxdb/ @mdegat01 @Robbie1221
|
||||
/homeassistant/components/infrared/ @home-assistant/core
|
||||
/tests/components/infrared/ @home-assistant/core
|
||||
/homeassistant/components/inkbird/ @bdraco
|
||||
/tests/components/inkbird/ @bdraco
|
||||
/homeassistant/components/input_boolean/ @home-assistant/core
|
||||
@@ -1899,8 +1899,8 @@ build.json @home-assistant/supervisor
|
||||
/tests/components/withings/ @joostlek
|
||||
/homeassistant/components/wiz/ @sbidy @arturpragacz
|
||||
/tests/components/wiz/ @sbidy @arturpragacz
|
||||
/homeassistant/components/wled/ @frenck
|
||||
/tests/components/wled/ @frenck
|
||||
/homeassistant/components/wled/ @frenck @mik-laj
|
||||
/tests/components/wled/ @frenck @mik-laj
|
||||
/homeassistant/components/wmspro/ @mback2k
|
||||
/tests/components/wmspro/ @mback2k
|
||||
/homeassistant/components/wolflink/ @adamkrol93 @mtielen
|
||||
|
||||
126
CREATE_CONFIG_YAML.md
Normal file
126
CREATE_CONFIG_YAML.md
Normal file
@@ -0,0 +1,126 @@
|
||||
# Create `config.yaml` For Config Flows
|
||||
|
||||
## Goal
|
||||
Document the persisted config entry and subentry payloads in each integration's `config.yaml` under `config_entry`, using selector-based field metadata that is consistent with Home Assistant selectors.
|
||||
|
||||
The output must describe what is **actually stored** in config entries (`data`, `options`, and `subentries`), not just what is shown in forms.
|
||||
|
||||
## Required Files Per Integration
|
||||
For each integration with `"config_flow": true` in `manifest.json`, inspect:
|
||||
|
||||
1. `config_flow.py`
|
||||
2. `__init__.py` (for migration and runtime usage confirmation)
|
||||
3. `const.py` (for `CONF_*`, version constants, and aliases)
|
||||
4. `strings.json` / translations only as fallback for field names not inferable from code
|
||||
5. Existing `config.yaml` (target file)
|
||||
|
||||
## Version Rules
|
||||
1. Default version is `major: 1`, `minor: 1` when no explicit version is defined.
|
||||
2. Read `VERSION` and `MINOR_VERSION` from the config flow class.
|
||||
3. If the class uses constants (for example `CONFIG_FLOW_VERSION`), resolve them from `const.py`.
|
||||
4. Document all known config-entry versions when code clearly supports multiple versions:
|
||||
- Current version from config flow class.
|
||||
- Historical versions from explicit migration branches (for example `async_migrate_entry` checks in `__init__.py`).
|
||||
5. Apply the same version logic to subentries (default `1.1` when unspecified).
|
||||
|
||||
## Storage Target Rules (Critical)
|
||||
Always determine where values are persisted:
|
||||
|
||||
1. `ConfigFlow.async_create_entry(data=...)` -> persisted in config entry `data`.
|
||||
2. `ConfigFlow.async_create_entry(..., options=...)` -> persisted in config entry `options`.
|
||||
3. `OptionsFlow.async_create_entry(data=...)` -> persisted in config entry `options`.
|
||||
4. `SchemaConfigFlowHandler` (default implementation):
|
||||
- Config flow values are stored in `options`.
|
||||
- Config entry `data` is empty.
|
||||
- Exception: class overrides `async_create_entry` (then follow override).
|
||||
5. `async_update_reload_and_abort(..., data=..., options=...)` updates existing entry payloads and must align with documented fields.
|
||||
|
||||
## Form-To-Storage Mapping Rules
|
||||
When `user_input` is stored directly, form schema must be mirrored in `config.yaml`.
|
||||
|
||||
### Config Flow
|
||||
If step logic returns `async_create_entry(data=user_input)`:
|
||||
1. Find the matching `async_show_form(..., data_schema=...)` for that step.
|
||||
2. Extract all schema keys.
|
||||
3. Add those keys to `config_entry.versions[*].data.fields`.
|
||||
|
||||
### Options Flow
|
||||
If options step returns `async_create_entry(data=user_input)`:
|
||||
1. Extract step schema keys.
|
||||
2. Add those keys to `config_entry.versions[*].options.fields`.
|
||||
|
||||
### Dict Payloads
|
||||
If `async_create_entry(data={...})` (or via a local dict variable/function that clearly returns a dict):
|
||||
1. Extract literal keys.
|
||||
2. Add keys to the relevant persisted section (`data` or `options`).
|
||||
|
||||
## Helper Flow Rules
|
||||
### `register_discovery_flow(...)`
|
||||
Creates entry with `data={}` by default. Keep data empty unless integration overrides flow behavior elsewhere.
|
||||
|
||||
### `register_webhook_flow(...)`
|
||||
Creates entry with:
|
||||
1. `webhook_id`
|
||||
2. `cloudhook`
|
||||
|
||||
These must be documented in `config_entry.versions[*].data.fields`.
|
||||
|
||||
### `AbstractOAuth2FlowHandler`
|
||||
Default OAuth payload includes:
|
||||
1. `auth_implementation`
|
||||
2. `token`
|
||||
|
||||
If integration overrides `async_oauth_create_entry` and adds additional stored keys, include those too.
|
||||
|
||||
## Subentry Rules
|
||||
1. Find `async_get_supported_subentry_types(...)` mapping and subentry flow classes (`ConfigSubentryFlow`).
|
||||
2. For each `subentry_type`, document under:
|
||||
- `config_entry.subentries.<subentry_type>.versions`
|
||||
3. Extract persisted subentry payload keys from:
|
||||
- `async_create_entry(data=...)` in subentry flow
|
||||
- direct subentry update calls with explicit data payloads
|
||||
4. Apply required/default/selector extraction exactly as for main config/option flows.
|
||||
|
||||
## Field Metadata Rules
|
||||
Each field entry should include:
|
||||
1. `required` (true/false)
|
||||
2. `selector` (valid HA selector structure)
|
||||
3. Optional `default` and `example` when directly known from code
|
||||
|
||||
### Required Flag
|
||||
1. `vol.Required(...)` -> `required: true`
|
||||
2. `vol.Optional(...)` -> `required: false`
|
||||
3. Literal dict payloads without schema context -> `required: true` unless clearly optional in code path
|
||||
|
||||
### Selector Mapping
|
||||
Use explicit selector calls when present (for example `TextSelector`, `NumberSelector`, `BooleanSelector`, `LocationSelector`, `SelectSelector`, etc).
|
||||
|
||||
If schema uses plain validators:
|
||||
1. `bool` / `cv.boolean` -> `selector: { boolean: {} }`
|
||||
2. numeric validators -> `selector: { number: {} }`
|
||||
3. `vol.In(...)` / constrained choices -> `selector: { select: {} }`
|
||||
4. unknown / string-like -> `selector: { text: {} }`
|
||||
5. structured blobs (for example OAuth `token`) -> `selector: { object: {} }`
|
||||
|
||||
## Validation Checklist (Per Integration)
|
||||
1. `config.yaml` exists when `manifest.json` has `config_flow: true`.
|
||||
2. `config_entry.versions` contains correct version entries.
|
||||
3. Documented fields exactly match persisted payloads (`data` vs `options`).
|
||||
4. `required` and selector format are valid.
|
||||
5. `subentries` are documented when supported.
|
||||
6. No placeholder empty blocks where code stores actual fields.
|
||||
|
||||
## Final QA Commands
|
||||
Run after updates:
|
||||
|
||||
```bash
|
||||
python -m script.hassfest -p config_entry --action validate
|
||||
ruff check script/hassfest/config_entry.py
|
||||
```
|
||||
|
||||
## High-Risk Pitfalls
|
||||
1. Assuming fields in forms are always stored in `data` (wrong for `SchemaConfigFlowHandler`).
|
||||
2. Missing fields when `data=user_input` is used with a non-empty schema.
|
||||
3. Skipping helper flows (`register_webhook_flow`, OAuth2 base handler behavior).
|
||||
4. Ignoring options/subentry flows that store separate payloads.
|
||||
5. Using placeholders instead of integration-specific field definitions.
|
||||
@@ -10,6 +10,7 @@ coverage:
|
||||
target: auto
|
||||
threshold: 1
|
||||
paths:
|
||||
- homeassistant/components/*/backup.py
|
||||
- homeassistant/components/*/config_flow.py
|
||||
- homeassistant/components/*/device_action.py
|
||||
- homeassistant/components/*/device_condition.py
|
||||
@@ -28,6 +29,7 @@ coverage:
|
||||
target: 100
|
||||
threshold: 0
|
||||
paths:
|
||||
- homeassistant/components/*/backup.py
|
||||
- homeassistant/components/*/config_flow.py
|
||||
- homeassistant/components/*/device_action.py
|
||||
- homeassistant/components/*/device_condition.py
|
||||
|
||||
14
homeassistant/components/abode/config.yaml
Normal file
14
homeassistant/components/abode/config.yaml
Normal file
@@ -0,0 +1,14 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
polling:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
@@ -12,10 +12,6 @@ from homeassistant.helpers.dispatcher import dispatcher_send
|
||||
|
||||
from .const import DOMAIN, DOMAIN_DATA, LOGGER
|
||||
|
||||
SERVICE_SETTINGS = "change_setting"
|
||||
SERVICE_CAPTURE_IMAGE = "capture_image"
|
||||
SERVICE_TRIGGER_AUTOMATION = "trigger_automation"
|
||||
|
||||
ATTR_SETTING = "setting"
|
||||
ATTR_VALUE = "value"
|
||||
|
||||
@@ -75,16 +71,13 @@ def async_setup_services(hass: HomeAssistant) -> None:
|
||||
"""Home Assistant services."""
|
||||
|
||||
hass.services.async_register(
|
||||
DOMAIN, SERVICE_SETTINGS, _change_setting, schema=CHANGE_SETTING_SCHEMA
|
||||
DOMAIN, "change_setting", _change_setting, schema=CHANGE_SETTING_SCHEMA
|
||||
)
|
||||
|
||||
hass.services.async_register(
|
||||
DOMAIN, SERVICE_CAPTURE_IMAGE, _capture_image, schema=CAPTURE_IMAGE_SCHEMA
|
||||
DOMAIN, "capture_image", _capture_image, schema=CAPTURE_IMAGE_SCHEMA
|
||||
)
|
||||
|
||||
hass.services.async_register(
|
||||
DOMAIN,
|
||||
SERVICE_TRIGGER_AUTOMATION,
|
||||
_trigger_automation,
|
||||
schema=AUTOMATION_SCHEMA,
|
||||
DOMAIN, "trigger_automation", _trigger_automation, schema=AUTOMATION_SCHEMA
|
||||
)
|
||||
|
||||
14
homeassistant/components/acaia/config.yaml
Normal file
14
homeassistant/components/acaia/config.yaml
Normal file
@@ -0,0 +1,14 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
is_new_style_scale:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
26
homeassistant/components/accuweather/config.yaml
Normal file
26
homeassistant/components/accuweather/config.yaml
Normal file
@@ -0,0 +1,26 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
api_key:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
latitude:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
longitude:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
name:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
@@ -7,5 +7,5 @@
|
||||
"integration_type": "service",
|
||||
"iot_class": "cloud_polling",
|
||||
"loggers": ["accuweather"],
|
||||
"requirements": ["accuweather==5.0.0"]
|
||||
"requirements": ["accuweather==5.1.0"]
|
||||
}
|
||||
|
||||
@@ -30,6 +30,8 @@ async def system_health_info(hass: HomeAssistant) -> dict[str, Any]:
|
||||
)
|
||||
|
||||
return {
|
||||
"can_reach_server": system_health.async_check_can_reach_url(hass, ENDPOINT),
|
||||
"can_reach_server": system_health.async_check_can_reach_url(
|
||||
hass, str(ENDPOINT)
|
||||
),
|
||||
"remaining_requests": remaining_requests,
|
||||
}
|
||||
|
||||
14
homeassistant/components/acmeda/config.yaml
Normal file
14
homeassistant/components/acmeda/config.yaml
Normal file
@@ -0,0 +1,14 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
id:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
14
homeassistant/components/actron_air/config.yaml
Normal file
14
homeassistant/components/actron_air/config.yaml
Normal file
@@ -0,0 +1,14 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
api_token:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
18
homeassistant/components/adax/config.yaml
Normal file
18
homeassistant/components/adax/config.yaml
Normal file
@@ -0,0 +1,18 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 2
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
connection_type:
|
||||
required: true
|
||||
selector:
|
||||
select:
|
||||
options:
|
||||
- Cloud
|
||||
- Local
|
||||
default: Cloud
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
34
homeassistant/components/adguard/config.yaml
Normal file
34
homeassistant/components/adguard/config.yaml
Normal file
@@ -0,0 +1,34 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
host:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
password:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
port:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
ssl:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
username:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
verify_ssl:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
18
homeassistant/components/advantage_air/config.yaml
Normal file
18
homeassistant/components/advantage_air/config.yaml
Normal file
@@ -0,0 +1,18 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
ip_address:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
port:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
@@ -10,8 +10,6 @@ from homeassistant.helpers import config_validation as cv, service
|
||||
|
||||
from .const import DOMAIN
|
||||
|
||||
ADVANTAGE_AIR_SERVICE_SET_TIME_TO = "set_time_to"
|
||||
|
||||
|
||||
@callback
|
||||
def async_setup_services(hass: HomeAssistant) -> None:
|
||||
@@ -20,7 +18,7 @@ def async_setup_services(hass: HomeAssistant) -> None:
|
||||
service.async_register_platform_entity_service(
|
||||
hass,
|
||||
DOMAIN,
|
||||
ADVANTAGE_AIR_SERVICE_SET_TIME_TO,
|
||||
"set_time_to",
|
||||
entity_domain=SENSOR_DOMAIN,
|
||||
schema={vol.Required("minutes"): cv.positive_int},
|
||||
func="set_time_to",
|
||||
|
||||
34
homeassistant/components/aemet/config.yaml
Normal file
34
homeassistant/components/aemet/config.yaml
Normal file
@@ -0,0 +1,34 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
api_key:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
latitude:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
longitude:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
name:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields:
|
||||
radar_updates:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
station_updates:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
subentries: {}
|
||||
14
homeassistant/components/aftership/config.yaml
Normal file
14
homeassistant/components/aftership/config.yaml
Normal file
@@ -0,0 +1,14 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
api_key:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
14
homeassistant/components/agent_dvr/config.yaml
Normal file
14
homeassistant/components/agent_dvr/config.yaml
Normal file
@@ -0,0 +1,14 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
server_url:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
@@ -8,18 +8,12 @@ from homeassistant.helpers import service
|
||||
|
||||
from .const import DOMAIN
|
||||
|
||||
_DEV_EN_ALT = "enable_alerts"
|
||||
_DEV_DS_ALT = "disable_alerts"
|
||||
_DEV_EN_REC = "start_recording"
|
||||
_DEV_DS_REC = "stop_recording"
|
||||
_DEV_SNAP = "snapshot"
|
||||
|
||||
CAMERA_SERVICES = {
|
||||
_DEV_EN_ALT: "async_enable_alerts",
|
||||
_DEV_DS_ALT: "async_disable_alerts",
|
||||
_DEV_EN_REC: "async_start_recording",
|
||||
_DEV_DS_REC: "async_stop_recording",
|
||||
_DEV_SNAP: "async_snapshot",
|
||||
"enable_alerts": "async_enable_alerts",
|
||||
"disable_alerts": "async_disable_alerts",
|
||||
"start_recording": "async_start_recording",
|
||||
"stop_recording": "async_stop_recording",
|
||||
"snapshot": "async_snapshot",
|
||||
}
|
||||
|
||||
|
||||
|
||||
14
homeassistant/components/airgradient/config.yaml
Normal file
14
homeassistant/components/airgradient/config.yaml
Normal file
@@ -0,0 +1,14 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
host:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
26
homeassistant/components/airly/config.yaml
Normal file
26
homeassistant/components/airly/config.yaml
Normal file
@@ -0,0 +1,26 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
api_key:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
latitude:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
longitude:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
name:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
30
homeassistant/components/airnow/config.yaml
Normal file
30
homeassistant/components/airnow/config.yaml
Normal file
@@ -0,0 +1,30 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 2
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
api_key:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
latitude:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
longitude:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
radius:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields:
|
||||
radius:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
subentries: {}
|
||||
22
homeassistant/components/airobot/config.yaml
Normal file
22
homeassistant/components/airobot/config.yaml
Normal file
@@ -0,0 +1,22 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
host:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
password:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
username:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
@@ -93,7 +93,6 @@ class AirobotNumber(AirobotEntity, NumberEntity):
|
||||
raise ServiceValidationError(
|
||||
translation_domain=DOMAIN,
|
||||
translation_key="set_value_failed",
|
||||
translation_placeholders={"error": str(err)},
|
||||
) from err
|
||||
else:
|
||||
await self.coordinator.async_request_refresh()
|
||||
|
||||
@@ -112,7 +112,7 @@
|
||||
"message": "Failed to set temperature to {temperature}."
|
||||
},
|
||||
"set_value_failed": {
|
||||
"message": "Failed to set value: {error}"
|
||||
"message": "Failed to set value."
|
||||
},
|
||||
"switch_turn_off_failed": {
|
||||
"message": "Failed to turn off {switch}."
|
||||
|
||||
19
homeassistant/components/airos/config.yaml
Normal file
19
homeassistant/components/airos/config.yaml
Normal file
@@ -0,0 +1,19 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 2
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
advanced_settings:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
mac_address:
|
||||
required: true
|
||||
selector:
|
||||
select:
|
||||
options: []
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
18
homeassistant/components/airpatrol/config.yaml
Normal file
18
homeassistant/components/airpatrol/config.yaml
Normal file
@@ -0,0 +1,18 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
email:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
password:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
26
homeassistant/components/airq/config.yaml
Normal file
26
homeassistant/components/airq/config.yaml
Normal file
@@ -0,0 +1,26 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
ip_address:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
password:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields:
|
||||
clip_negatives:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
return_average:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
subentries: {}
|
||||
18
homeassistant/components/airthings/config.yaml
Normal file
18
homeassistant/components/airthings/config.yaml
Normal file
@@ -0,0 +1,18 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
secret:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
id:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
14
homeassistant/components/airthings_ble/config.yaml
Normal file
14
homeassistant/components/airthings_ble/config.yaml
Normal file
@@ -0,0 +1,14 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
device_model:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
14
homeassistant/components/airtouch4/config.yaml
Normal file
14
homeassistant/components/airtouch4/config.yaml
Normal file
@@ -0,0 +1,14 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
host:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
14
homeassistant/components/airtouch5/config.yaml
Normal file
14
homeassistant/components/airtouch5/config.yaml
Normal file
@@ -0,0 +1,14 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
host:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
18
homeassistant/components/airvisual/config.yaml
Normal file
18
homeassistant/components/airvisual/config.yaml
Normal file
@@ -0,0 +1,18 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 3
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
integration_type:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields:
|
||||
show_on_map:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
subentries: {}
|
||||
18
homeassistant/components/airvisual_pro/config.yaml
Normal file
18
homeassistant/components/airvisual_pro/config.yaml
Normal file
@@ -0,0 +1,18 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
ip_address:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
password:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
22
homeassistant/components/airzone/config.yaml
Normal file
22
homeassistant/components/airzone/config.yaml
Normal file
@@ -0,0 +1,22 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 2
|
||||
data:
|
||||
fields:
|
||||
host:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
id:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
port:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
22
homeassistant/components/airzone_cloud/config.yaml
Normal file
22
homeassistant/components/airzone_cloud/config.yaml
Normal file
@@ -0,0 +1,22 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
id:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
password:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
username:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
18
homeassistant/components/aladdin_connect/config.yaml
Normal file
18
homeassistant/components/aladdin_connect/config.yaml
Normal file
@@ -0,0 +1,18 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 2
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
auth_implementation:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
token:
|
||||
required: true
|
||||
selector:
|
||||
object: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
32
homeassistant/components/aladdin_connect/diagnostics.py
Normal file
32
homeassistant/components/aladdin_connect/diagnostics.py
Normal file
@@ -0,0 +1,32 @@
|
||||
"""Diagnostics support for Aladdin Connect."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import Any
|
||||
|
||||
from homeassistant.components.diagnostics import async_redact_data
|
||||
from homeassistant.core import HomeAssistant
|
||||
|
||||
from .coordinator import AladdinConnectConfigEntry
|
||||
|
||||
TO_REDACT = {"access_token", "refresh_token"}
|
||||
|
||||
|
||||
async def async_get_config_entry_diagnostics(
|
||||
hass: HomeAssistant, config_entry: AladdinConnectConfigEntry
|
||||
) -> dict[str, Any]:
|
||||
"""Return diagnostics for a config entry."""
|
||||
return {
|
||||
"config_entry": async_redact_data(config_entry.as_dict(), TO_REDACT),
|
||||
"doors": {
|
||||
uid: {
|
||||
"device_id": coordinator.data.device_id,
|
||||
"door_number": coordinator.data.door_number,
|
||||
"name": coordinator.data.name,
|
||||
"status": coordinator.data.status,
|
||||
"link_status": coordinator.data.link_status,
|
||||
"battery_level": coordinator.data.battery_level,
|
||||
}
|
||||
for uid, coordinator in config_entry.runtime_data.items()
|
||||
},
|
||||
}
|
||||
@@ -45,7 +45,7 @@ rules:
|
||||
|
||||
# Gold
|
||||
devices: done
|
||||
diagnostics: todo
|
||||
diagnostics: done
|
||||
discovery: done
|
||||
discovery-update-info:
|
||||
status: exempt
|
||||
|
||||
29
homeassistant/components/alarmdecoder/config.yaml
Normal file
29
homeassistant/components/alarmdecoder/config.yaml
Normal file
@@ -0,0 +1,29 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
device_baudrate:
|
||||
required: true
|
||||
selector:
|
||||
number:
|
||||
mode: box
|
||||
default: 115200
|
||||
device_path:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
default: /dev/ttyUSB0
|
||||
options:
|
||||
fields:
|
||||
arm_options:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
zone_options:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
subentries: {}
|
||||
@@ -13,9 +13,6 @@ from homeassistant.helpers import config_validation as cv, service
|
||||
|
||||
from .const import DOMAIN
|
||||
|
||||
SERVICE_ALARM_TOGGLE_CHIME = "alarm_toggle_chime"
|
||||
|
||||
SERVICE_ALARM_KEYPRESS = "alarm_keypress"
|
||||
ATTR_KEYPRESS = "keypress"
|
||||
|
||||
|
||||
@@ -26,7 +23,7 @@ def async_setup_services(hass: HomeAssistant) -> None:
|
||||
service.async_register_platform_entity_service(
|
||||
hass,
|
||||
DOMAIN,
|
||||
SERVICE_ALARM_TOGGLE_CHIME,
|
||||
"alarm_toggle_chime",
|
||||
entity_domain=ALARM_CONTROL_PANEL_DOMAIN,
|
||||
schema={
|
||||
vol.Required(ATTR_CODE): cv.string,
|
||||
@@ -37,7 +34,7 @@ def async_setup_services(hass: HomeAssistant) -> None:
|
||||
service.async_register_platform_entity_service(
|
||||
hass,
|
||||
DOMAIN,
|
||||
SERVICE_ALARM_KEYPRESS,
|
||||
"alarm_keypress",
|
||||
entity_domain=ALARM_CONTROL_PANEL_DOMAIN,
|
||||
schema={
|
||||
vol.Required(ATTR_KEYPRESS): cv.string,
|
||||
|
||||
14
homeassistant/components/alexa_devices/config.yaml
Normal file
14
homeassistant/components/alexa_devices/config.yaml
Normal file
@@ -0,0 +1,14 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 3
|
||||
data:
|
||||
fields:
|
||||
login_data:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
@@ -16,9 +16,6 @@ from .coordinator import AmazonConfigEntry
|
||||
ATTR_TEXT_COMMAND = "text_command"
|
||||
ATTR_SOUND = "sound"
|
||||
ATTR_INFO_SKILL = "info_skill"
|
||||
SERVICE_TEXT_COMMAND = "send_text_command"
|
||||
SERVICE_SOUND_NOTIFICATION = "send_sound"
|
||||
SERVICE_INFO_SKILL = "send_info_skill"
|
||||
|
||||
SCHEMA_SOUND_SERVICE = vol.Schema(
|
||||
{
|
||||
@@ -128,17 +125,17 @@ def async_setup_services(hass: HomeAssistant) -> None:
|
||||
"""Set up the services for the Amazon Devices integration."""
|
||||
for service_name, method, schema in (
|
||||
(
|
||||
SERVICE_SOUND_NOTIFICATION,
|
||||
"send_sound",
|
||||
async_send_sound_notification,
|
||||
SCHEMA_SOUND_SERVICE,
|
||||
),
|
||||
(
|
||||
SERVICE_TEXT_COMMAND,
|
||||
"send_text_command",
|
||||
async_send_text_command,
|
||||
SCHEMA_CUSTOM_COMMAND,
|
||||
),
|
||||
(
|
||||
SERVICE_INFO_SKILL,
|
||||
"send_info_skill",
|
||||
async_send_info_skill,
|
||||
SCHEMA_INFO_SKILL,
|
||||
),
|
||||
|
||||
14
homeassistant/components/altruist/config.yaml
Normal file
14
homeassistant/components/altruist/config.yaml
Normal file
@@ -0,0 +1,14 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
host:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
16
homeassistant/components/amberelectric/config.yaml
Normal file
16
homeassistant/components/amberelectric/config.yaml
Normal file
@@ -0,0 +1,16 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
site_id:
|
||||
required: true
|
||||
selector:
|
||||
select:
|
||||
mode: dropdown
|
||||
options: []
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
@@ -16,8 +16,6 @@ ATTRIBUTION = "Data provided by Amber Electric"
|
||||
LOGGER = logging.getLogger(__package__)
|
||||
PLATFORMS = [Platform.BINARY_SENSOR, Platform.SENSOR]
|
||||
|
||||
SERVICE_GET_FORECASTS = "get_forecasts"
|
||||
|
||||
GENERAL_CHANNEL = "general"
|
||||
CONTROLLED_LOAD_CHANNEL = "controlled_load"
|
||||
FEED_IN_CHANNEL = "feed_in"
|
||||
|
||||
@@ -22,7 +22,6 @@ from .const import (
|
||||
DOMAIN,
|
||||
FEED_IN_CHANNEL,
|
||||
GENERAL_CHANNEL,
|
||||
SERVICE_GET_FORECASTS,
|
||||
)
|
||||
from .coordinator import AmberConfigEntry
|
||||
from .helpers import format_cents_to_dollars, normalize_descriptor
|
||||
@@ -101,7 +100,7 @@ def async_setup_services(hass: HomeAssistant) -> None:
|
||||
|
||||
hass.services.async_register(
|
||||
DOMAIN,
|
||||
SERVICE_GET_FORECASTS,
|
||||
"get_forecasts",
|
||||
handle_get_forecasts,
|
||||
GET_FORECASTS_SCHEMA,
|
||||
supports_response=SupportsResponse.ONLY,
|
||||
|
||||
17
homeassistant/components/ambient_network/config.yaml
Normal file
17
homeassistant/components/ambient_network/config.yaml
Normal file
@@ -0,0 +1,17 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
station:
|
||||
required: true
|
||||
selector:
|
||||
select:
|
||||
multiple: false
|
||||
sort: true
|
||||
options: []
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
18
homeassistant/components/ambient_station/config.yaml
Normal file
18
homeassistant/components/ambient_station/config.yaml
Normal file
@@ -0,0 +1,18 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 2
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
api_key:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
app_key:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
@@ -49,18 +49,6 @@ SCAN_INTERVAL = timedelta(seconds=15)
|
||||
|
||||
STREAM_SOURCE_LIST = ["snapshot", "mjpeg", "rtsp"]
|
||||
|
||||
_SRV_EN_REC = "enable_recording"
|
||||
_SRV_DS_REC = "disable_recording"
|
||||
_SRV_EN_AUD = "enable_audio"
|
||||
_SRV_DS_AUD = "disable_audio"
|
||||
_SRV_EN_MOT_REC = "enable_motion_recording"
|
||||
_SRV_DS_MOT_REC = "disable_motion_recording"
|
||||
_SRV_GOTO = "goto_preset"
|
||||
_SRV_CBW = "set_color_bw"
|
||||
_SRV_TOUR_ON = "start_tour"
|
||||
_SRV_TOUR_OFF = "stop_tour"
|
||||
|
||||
_SRV_PTZ_CTRL = "ptz_control"
|
||||
_ATTR_PTZ_TT = "travel_time"
|
||||
_ATTR_PTZ_MOV = "movement"
|
||||
_MOV = [
|
||||
@@ -103,17 +91,17 @@ _SRV_PTZ_SCHEMA = _SRV_SCHEMA.extend(
|
||||
)
|
||||
|
||||
CAMERA_SERVICES = {
|
||||
_SRV_EN_REC: (_SRV_SCHEMA, "async_enable_recording", ()),
|
||||
_SRV_DS_REC: (_SRV_SCHEMA, "async_disable_recording", ()),
|
||||
_SRV_EN_AUD: (_SRV_SCHEMA, "async_enable_audio", ()),
|
||||
_SRV_DS_AUD: (_SRV_SCHEMA, "async_disable_audio", ()),
|
||||
_SRV_EN_MOT_REC: (_SRV_SCHEMA, "async_enable_motion_recording", ()),
|
||||
_SRV_DS_MOT_REC: (_SRV_SCHEMA, "async_disable_motion_recording", ()),
|
||||
_SRV_GOTO: (_SRV_GOTO_SCHEMA, "async_goto_preset", (_ATTR_PRESET,)),
|
||||
_SRV_CBW: (_SRV_CBW_SCHEMA, "async_set_color_bw", (_ATTR_COLOR_BW,)),
|
||||
_SRV_TOUR_ON: (_SRV_SCHEMA, "async_start_tour", ()),
|
||||
_SRV_TOUR_OFF: (_SRV_SCHEMA, "async_stop_tour", ()),
|
||||
_SRV_PTZ_CTRL: (
|
||||
"enable_recording": (_SRV_SCHEMA, "async_enable_recording", ()),
|
||||
"disable_recording": (_SRV_SCHEMA, "async_disable_recording", ()),
|
||||
"enable_audio": (_SRV_SCHEMA, "async_enable_audio", ()),
|
||||
"disable_audio": (_SRV_SCHEMA, "async_disable_audio", ()),
|
||||
"enable_motion_recording": (_SRV_SCHEMA, "async_enable_motion_recording", ()),
|
||||
"disable_motion_recording": (_SRV_SCHEMA, "async_disable_motion_recording", ()),
|
||||
"goto_preset": (_SRV_GOTO_SCHEMA, "async_goto_preset", (_ATTR_PRESET,)),
|
||||
"set_color_bw": (_SRV_CBW_SCHEMA, "async_set_color_bw", (_ATTR_COLOR_BW,)),
|
||||
"start_tour": (_SRV_SCHEMA, "async_start_tour", ()),
|
||||
"stop_tour": (_SRV_SCHEMA, "async_stop_tour", ()),
|
||||
"ptz_control": (
|
||||
_SRV_PTZ_SCHEMA,
|
||||
"async_ptz_control",
|
||||
(_ATTR_PTZ_MOV, _ATTR_PTZ_TT),
|
||||
|
||||
34
homeassistant/components/analytics_insights/config.yaml
Normal file
34
homeassistant/components/analytics_insights/config.yaml
Normal file
@@ -0,0 +1,34 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 2
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
tracked_apps:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
tracked_custom_integrations:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
tracked_integrations:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields:
|
||||
tracked_apps:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
tracked_custom_integrations:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
tracked_integrations:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
subentries: {}
|
||||
26
homeassistant/components/android_ip_webcam/config.yaml
Normal file
26
homeassistant/components/android_ip_webcam/config.yaml
Normal file
@@ -0,0 +1,26 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
host:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
password:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
port:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
username:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
77
homeassistant/components/androidtv/config.yaml
Normal file
77
homeassistant/components/androidtv/config.yaml
Normal file
@@ -0,0 +1,77 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 2
|
||||
data:
|
||||
fields:
|
||||
adb_server_ip:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
adb_server_port:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
adbkey:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
device_class:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
host:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
port:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields:
|
||||
app_delete:
|
||||
required: false
|
||||
selector:
|
||||
boolean: {}
|
||||
default: false
|
||||
apps:
|
||||
required: false
|
||||
selector:
|
||||
select:
|
||||
mode: dropdown
|
||||
options: []
|
||||
exclude_unnamed_apps:
|
||||
required: false
|
||||
selector:
|
||||
boolean: {}
|
||||
get_sources:
|
||||
required: false
|
||||
selector:
|
||||
boolean: {}
|
||||
rule_delete:
|
||||
required: false
|
||||
selector:
|
||||
boolean: {}
|
||||
default: false
|
||||
screencap_interval:
|
||||
required: true
|
||||
selector:
|
||||
number:
|
||||
mode: box
|
||||
state_detection_rules:
|
||||
required: false
|
||||
selector:
|
||||
select:
|
||||
mode: dropdown
|
||||
options: []
|
||||
turn_off_command:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
turn_on_command:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
subentries: {}
|
||||
@@ -36,7 +36,7 @@ from .const import (
|
||||
SIGNAL_CONFIG_ENTITY,
|
||||
)
|
||||
from .entity import AndroidTVEntity, adb_decorator
|
||||
from .services import ATTR_ADB_RESPONSE, ATTR_HDMI_INPUT, SERVICE_LEARN_SENDEVENT
|
||||
from .services import ATTR_ADB_RESPONSE, ATTR_HDMI_INPUT
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
@@ -271,7 +271,7 @@ class ADBDevice(AndroidTVEntity, MediaPlayerEntity):
|
||||
self.async_write_ha_state()
|
||||
|
||||
msg = (
|
||||
f"Output from service '{SERVICE_LEARN_SENDEVENT}' from"
|
||||
f"Output from service 'learn_sendevent' from"
|
||||
f" {self.entity_id}: '{output}'"
|
||||
)
|
||||
persistent_notification.async_create(
|
||||
|
||||
@@ -16,11 +16,6 @@ ATTR_DEVICE_PATH = "device_path"
|
||||
ATTR_HDMI_INPUT = "hdmi_input"
|
||||
ATTR_LOCAL_PATH = "local_path"
|
||||
|
||||
SERVICE_ADB_COMMAND = "adb_command"
|
||||
SERVICE_DOWNLOAD = "download"
|
||||
SERVICE_LEARN_SENDEVENT = "learn_sendevent"
|
||||
SERVICE_UPLOAD = "upload"
|
||||
|
||||
|
||||
@callback
|
||||
def async_setup_services(hass: HomeAssistant) -> None:
|
||||
@@ -29,7 +24,7 @@ def async_setup_services(hass: HomeAssistant) -> None:
|
||||
service.async_register_platform_entity_service(
|
||||
hass,
|
||||
DOMAIN,
|
||||
SERVICE_ADB_COMMAND,
|
||||
"adb_command",
|
||||
entity_domain=MEDIA_PLAYER_DOMAIN,
|
||||
schema={vol.Required(ATTR_COMMAND): cv.string},
|
||||
func="adb_command",
|
||||
@@ -37,7 +32,7 @@ def async_setup_services(hass: HomeAssistant) -> None:
|
||||
service.async_register_platform_entity_service(
|
||||
hass,
|
||||
DOMAIN,
|
||||
SERVICE_LEARN_SENDEVENT,
|
||||
"learn_sendevent",
|
||||
entity_domain=MEDIA_PLAYER_DOMAIN,
|
||||
schema=None,
|
||||
func="learn_sendevent",
|
||||
@@ -45,7 +40,7 @@ def async_setup_services(hass: HomeAssistant) -> None:
|
||||
service.async_register_platform_entity_service(
|
||||
hass,
|
||||
DOMAIN,
|
||||
SERVICE_DOWNLOAD,
|
||||
"download",
|
||||
entity_domain=MEDIA_PLAYER_DOMAIN,
|
||||
schema={
|
||||
vol.Required(ATTR_DEVICE_PATH): cv.string,
|
||||
@@ -56,7 +51,7 @@ def async_setup_services(hass: HomeAssistant) -> None:
|
||||
service.async_register_platform_entity_service(
|
||||
hass,
|
||||
DOMAIN,
|
||||
SERVICE_UPLOAD,
|
||||
"upload",
|
||||
entity_domain=MEDIA_PLAYER_DOMAIN,
|
||||
schema={
|
||||
vol.Required(ATTR_DEVICE_PATH): cv.string,
|
||||
|
||||
38
homeassistant/components/androidtv_remote/config.yaml
Normal file
38
homeassistant/components/androidtv_remote/config.yaml
Normal file
@@ -0,0 +1,38 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
pin:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields:
|
||||
app_delete:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
app_icon:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
app_id:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
app_name:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
apps:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
enable_ime:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
subentries: {}
|
||||
16
homeassistant/components/anglian_water/config.yaml
Normal file
16
homeassistant/components/anglian_water/config.yaml
Normal file
@@ -0,0 +1,16 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
account_number:
|
||||
required: true
|
||||
selector:
|
||||
select:
|
||||
multiple: false
|
||||
options: []
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
18
homeassistant/components/anova/config.yaml
Normal file
18
homeassistant/components/anova/config.yaml
Normal file
@@ -0,0 +1,18 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 2
|
||||
data:
|
||||
fields:
|
||||
password:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
username:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
18
homeassistant/components/anthemav/config.yaml
Normal file
18
homeassistant/components/anthemav/config.yaml
Normal file
@@ -0,0 +1,18 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
host:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
port:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
68
homeassistant/components/anthropic/config.yaml
Normal file
68
homeassistant/components/anthropic/config.yaml
Normal file
@@ -0,0 +1,68 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 2
|
||||
minor: 3
|
||||
data:
|
||||
fields:
|
||||
api_key:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries:
|
||||
ai_task_data:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
chat_model:
|
||||
required: false
|
||||
selector:
|
||||
select:
|
||||
custom_value: true
|
||||
options: []
|
||||
max_tokens:
|
||||
required: false
|
||||
selector:
|
||||
number:
|
||||
mode: box
|
||||
temperature:
|
||||
required: false
|
||||
selector:
|
||||
number:
|
||||
min: 0
|
||||
max: 1
|
||||
step: 0.05
|
||||
options:
|
||||
fields: {}
|
||||
conversation:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
chat_model:
|
||||
required: false
|
||||
selector:
|
||||
select:
|
||||
custom_value: true
|
||||
options: []
|
||||
max_tokens:
|
||||
required: false
|
||||
selector:
|
||||
number:
|
||||
mode: box
|
||||
temperature:
|
||||
required: false
|
||||
selector:
|
||||
number:
|
||||
min: 0
|
||||
max: 1
|
||||
step: 0.05
|
||||
options:
|
||||
fields: {}
|
||||
@@ -400,8 +400,8 @@ def _convert_content(
|
||||
# If there is only one text block, simplify the content to a string
|
||||
messages[-1]["content"] = messages[-1]["content"][0]["text"]
|
||||
else:
|
||||
# Note: We don't pass SystemContent here as its passed to the API as the prompt
|
||||
raise TypeError(f"Unexpected content type: {type(content)}")
|
||||
# Note: We don't pass SystemContent here as it's passed to the API as the prompt
|
||||
raise HomeAssistantError("Unexpected content type in chat log")
|
||||
|
||||
return messages, container_id
|
||||
|
||||
@@ -442,8 +442,8 @@ async def _transform_stream( # noqa: C901 - This is complex, but better to have
|
||||
|
||||
Each message could contain multiple blocks of the same type.
|
||||
"""
|
||||
if stream is None:
|
||||
raise TypeError("Expected a stream of messages")
|
||||
if stream is None or not hasattr(stream, "__aiter__"):
|
||||
raise HomeAssistantError("Expected a stream of messages")
|
||||
|
||||
current_tool_block: ToolUseBlockParam | ServerToolUseBlockParam | None = None
|
||||
current_tool_args: str
|
||||
@@ -456,8 +456,6 @@ async def _transform_stream( # noqa: C901 - This is complex, but better to have
|
||||
LOGGER.debug("Received response: %s", response)
|
||||
|
||||
if isinstance(response, RawMessageStartEvent):
|
||||
if response.message.role != "assistant":
|
||||
raise ValueError("Unexpected message role")
|
||||
input_usage = response.message.usage
|
||||
first_block = True
|
||||
elif isinstance(response, RawContentBlockStartEvent):
|
||||
@@ -666,7 +664,7 @@ class AnthropicBaseLLMEntity(Entity):
|
||||
|
||||
system = chat_log.content[0]
|
||||
if not isinstance(system, conversation.SystemContent):
|
||||
raise TypeError("First message must be a system message")
|
||||
raise HomeAssistantError("First message must be a system message")
|
||||
|
||||
# System prompt with caching enabled
|
||||
system_prompt: list[TextBlockParam] = [
|
||||
@@ -858,6 +856,11 @@ class AnthropicBaseLLMEntity(Entity):
|
||||
]
|
||||
)
|
||||
messages.extend(new_messages)
|
||||
except anthropic.AuthenticationError as err:
|
||||
self.entry.async_start_reauth(self.hass)
|
||||
raise HomeAssistantError(
|
||||
"Authentication error with Anthropic API, reauthentication required"
|
||||
) from err
|
||||
except anthropic.AnthropicError as err:
|
||||
raise HomeAssistantError(
|
||||
f"Sorry, I had a problem talking to Anthropic: {err}"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"domain": "anthropic",
|
||||
"name": "Anthropic Conversation",
|
||||
"name": "Anthropic",
|
||||
"after_dependencies": ["assist_pipeline", "intent"],
|
||||
"codeowners": ["@Shulyaka"],
|
||||
"config_flow": true,
|
||||
|
||||
@@ -31,10 +31,7 @@ rules:
|
||||
test-before-setup: done
|
||||
unique-config-entry: done
|
||||
# Silver
|
||||
action-exceptions:
|
||||
status: todo
|
||||
comment: |
|
||||
Reevaluate exceptions for entity services.
|
||||
action-exceptions: done
|
||||
config-entry-unloading: done
|
||||
docs-configuration-parameters: done
|
||||
docs-installation-parameters: done
|
||||
|
||||
18
homeassistant/components/aosmith/config.yaml
Normal file
18
homeassistant/components/aosmith/config.yaml
Normal file
@@ -0,0 +1,18 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
email:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
password:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
18
homeassistant/components/apcupsd/config.yaml
Normal file
18
homeassistant/components/apcupsd/config.yaml
Normal file
@@ -0,0 +1,18 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
host:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
port:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
18
homeassistant/components/apple_tv/config.yaml
Normal file
18
homeassistant/components/apple_tv/config.yaml
Normal file
@@ -0,0 +1,18 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
device_input:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields:
|
||||
start_off:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
subentries: {}
|
||||
18
homeassistant/components/aprilaire/config.yaml
Normal file
18
homeassistant/components/aprilaire/config.yaml
Normal file
@@ -0,0 +1,18 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
host:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
port:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
18
homeassistant/components/apsystems/config.yaml
Normal file
18
homeassistant/components/apsystems/config.yaml
Normal file
@@ -0,0 +1,18 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
ip_address:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
port:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
23
homeassistant/components/aquacell/config.yaml
Normal file
23
homeassistant/components/aquacell/config.yaml
Normal file
@@ -0,0 +1,23 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
brand:
|
||||
required: true
|
||||
selector:
|
||||
select:
|
||||
options: []
|
||||
refresh_token:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
refresh_token_creation_time:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
@@ -117,6 +117,7 @@ class SharpAquosTVDevice(MediaPlayerEntity):
|
||||
| MediaPlayerEntityFeature.VOLUME_SET
|
||||
| MediaPlayerEntityFeature.PLAY
|
||||
)
|
||||
_attr_volume_step = 2 / 60
|
||||
|
||||
def __init__(
|
||||
self, name: str, remote: sharp_aquos_rc.TV, power_on_enabled: bool = False
|
||||
@@ -161,22 +162,6 @@ class SharpAquosTVDevice(MediaPlayerEntity):
|
||||
"""Turn off tvplayer."""
|
||||
self._remote.power(0)
|
||||
|
||||
@_retry
|
||||
def volume_up(self) -> None:
|
||||
"""Volume up the media player."""
|
||||
if self.volume_level is None:
|
||||
_LOGGER.debug("Unknown volume in volume_up")
|
||||
return
|
||||
self._remote.volume(int(self.volume_level * 60) + 2)
|
||||
|
||||
@_retry
|
||||
def volume_down(self) -> None:
|
||||
"""Volume down media player."""
|
||||
if self.volume_level is None:
|
||||
_LOGGER.debug("Unknown volume in volume_down")
|
||||
return
|
||||
self._remote.volume(int(self.volume_level * 60) - 2)
|
||||
|
||||
@_retry
|
||||
def set_volume_level(self, volume: float) -> None:
|
||||
"""Set Volume media player."""
|
||||
|
||||
14
homeassistant/components/aranet/config.yaml
Normal file
14
homeassistant/components/aranet/config.yaml
Normal file
@@ -0,0 +1,14 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
address:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
18
homeassistant/components/arcam_fmj/config.yaml
Normal file
18
homeassistant/components/arcam_fmj/config.yaml
Normal file
@@ -0,0 +1,18 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
host:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
port:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
18
homeassistant/components/arve/config.yaml
Normal file
18
homeassistant/components/arve/config.yaml
Normal file
@@ -0,0 +1,18 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 2
|
||||
data:
|
||||
fields:
|
||||
access_token:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
client_secret:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
18
homeassistant/components/aseko_pool_live/config.yaml
Normal file
18
homeassistant/components/aseko_pool_live/config.yaml
Normal file
@@ -0,0 +1,18 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 2
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
email:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
password:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
58
homeassistant/components/asuswrt/config.yaml
Normal file
58
homeassistant/components/asuswrt/config.yaml
Normal file
@@ -0,0 +1,58 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
host:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
mode:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
password:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
port:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
protocol:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
ssh_key:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
username:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields:
|
||||
consider_home:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
dnsmasq:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
interface:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
require_ip:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
track_unknown:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
subentries: {}
|
||||
18
homeassistant/components/atag/config.yaml
Normal file
18
homeassistant/components/atag/config.yaml
Normal file
@@ -0,0 +1,18 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
host:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
port:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
14
homeassistant/components/august/config.yaml
Normal file
14
homeassistant/components/august/config.yaml
Normal file
@@ -0,0 +1,14 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
implementation:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
26
homeassistant/components/aurora/config.yaml
Normal file
26
homeassistant/components/aurora/config.yaml
Normal file
@@ -0,0 +1,26 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
latitude:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
longitude:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
name:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields:
|
||||
forecast_threshold:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
subentries: {}
|
||||
18
homeassistant/components/aurora_abb_powerone/config.yaml
Normal file
18
homeassistant/components/aurora_abb_powerone/config.yaml
Normal file
@@ -0,0 +1,18 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
address:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
port:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
26
homeassistant/components/aussie_broadband/config.yaml
Normal file
26
homeassistant/components/aussie_broadband/config.yaml
Normal file
@@ -0,0 +1,26 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
password:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
services:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
username:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields:
|
||||
services:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
subentries: {}
|
||||
18
homeassistant/components/autarco/config.yaml
Normal file
18
homeassistant/components/autarco/config.yaml
Normal file
@@ -0,0 +1,18 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
email:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
password:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
26
homeassistant/components/awair/config.yaml
Normal file
26
homeassistant/components/awair/config.yaml
Normal file
@@ -0,0 +1,26 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
access_token:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
device:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
email:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
host:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
@@ -19,7 +19,7 @@ from homeassistant.components.backup import (
|
||||
from homeassistant.core import HomeAssistant, callback
|
||||
|
||||
from . import S3ConfigEntry
|
||||
from .const import CONF_BUCKET, DATA_BACKUP_AGENT_LISTENERS, DOMAIN
|
||||
from .const import CONF_BUCKET, CONF_PREFIX, DATA_BACKUP_AGENT_LISTENERS, DOMAIN
|
||||
from .helpers import async_list_backups_from_s3
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
@@ -100,6 +100,13 @@ class S3BackupAgent(BackupAgent):
|
||||
self.unique_id = entry.entry_id
|
||||
self._backup_cache: dict[str, AgentBackup] = {}
|
||||
self._cache_expiration = time()
|
||||
self._prefix: str = entry.data.get(CONF_PREFIX, "")
|
||||
|
||||
def _with_prefix(self, key: str) -> str:
|
||||
"""Add prefix to a key if configured."""
|
||||
if not self._prefix:
|
||||
return key
|
||||
return f"{self._prefix}/{key}"
|
||||
|
||||
@handle_boto_errors
|
||||
async def async_download_backup(
|
||||
@@ -115,7 +122,9 @@ class S3BackupAgent(BackupAgent):
|
||||
backup = await self._find_backup_by_id(backup_id)
|
||||
tar_filename, _ = suggested_filenames(backup)
|
||||
|
||||
response = await self._client.get_object(Bucket=self._bucket, Key=tar_filename)
|
||||
response = await self._client.get_object(
|
||||
Bucket=self._bucket, Key=self._with_prefix(tar_filename)
|
||||
)
|
||||
return response["Body"].iter_chunks()
|
||||
|
||||
async def async_upload_backup(
|
||||
@@ -142,7 +151,7 @@ class S3BackupAgent(BackupAgent):
|
||||
metadata_content = json.dumps(backup.as_dict())
|
||||
await self._client.put_object(
|
||||
Bucket=self._bucket,
|
||||
Key=metadata_filename,
|
||||
Key=self._with_prefix(metadata_filename),
|
||||
Body=metadata_content,
|
||||
)
|
||||
except BotoCoreError as err:
|
||||
@@ -169,7 +178,7 @@ class S3BackupAgent(BackupAgent):
|
||||
|
||||
await self._client.put_object(
|
||||
Bucket=self._bucket,
|
||||
Key=tar_filename,
|
||||
Key=self._with_prefix(tar_filename),
|
||||
Body=bytes(file_data),
|
||||
)
|
||||
|
||||
@@ -186,7 +195,7 @@ class S3BackupAgent(BackupAgent):
|
||||
_LOGGER.debug("Starting multipart upload for %s", tar_filename)
|
||||
multipart_upload = await self._client.create_multipart_upload(
|
||||
Bucket=self._bucket,
|
||||
Key=tar_filename,
|
||||
Key=self._with_prefix(tar_filename),
|
||||
)
|
||||
upload_id = multipart_upload["UploadId"]
|
||||
try:
|
||||
@@ -216,7 +225,7 @@ class S3BackupAgent(BackupAgent):
|
||||
)
|
||||
part = await cast(Any, self._client).upload_part(
|
||||
Bucket=self._bucket,
|
||||
Key=tar_filename,
|
||||
Key=self._with_prefix(tar_filename),
|
||||
PartNumber=part_number,
|
||||
UploadId=upload_id,
|
||||
Body=part_data.tobytes(),
|
||||
@@ -244,7 +253,7 @@ class S3BackupAgent(BackupAgent):
|
||||
)
|
||||
part = await cast(Any, self._client).upload_part(
|
||||
Bucket=self._bucket,
|
||||
Key=tar_filename,
|
||||
Key=self._with_prefix(tar_filename),
|
||||
PartNumber=part_number,
|
||||
UploadId=upload_id,
|
||||
Body=remaining_data.tobytes(),
|
||||
@@ -253,7 +262,7 @@ class S3BackupAgent(BackupAgent):
|
||||
|
||||
await cast(Any, self._client).complete_multipart_upload(
|
||||
Bucket=self._bucket,
|
||||
Key=tar_filename,
|
||||
Key=self._with_prefix(tar_filename),
|
||||
UploadId=upload_id,
|
||||
MultipartUpload={"Parts": parts},
|
||||
)
|
||||
@@ -262,7 +271,7 @@ class S3BackupAgent(BackupAgent):
|
||||
try:
|
||||
await self._client.abort_multipart_upload(
|
||||
Bucket=self._bucket,
|
||||
Key=tar_filename,
|
||||
Key=self._with_prefix(tar_filename),
|
||||
UploadId=upload_id,
|
||||
)
|
||||
except BotoCoreError:
|
||||
@@ -283,8 +292,12 @@ class S3BackupAgent(BackupAgent):
|
||||
tar_filename, metadata_filename = suggested_filenames(backup)
|
||||
|
||||
# Delete both the backup file and its metadata file
|
||||
await self._client.delete_object(Bucket=self._bucket, Key=tar_filename)
|
||||
await self._client.delete_object(Bucket=self._bucket, Key=metadata_filename)
|
||||
await self._client.delete_object(
|
||||
Bucket=self._bucket, Key=self._with_prefix(tar_filename)
|
||||
)
|
||||
await self._client.delete_object(
|
||||
Bucket=self._bucket, Key=self._with_prefix(metadata_filename)
|
||||
)
|
||||
|
||||
# Reset cache after successful deletion
|
||||
self._cache_expiration = time()
|
||||
@@ -317,7 +330,9 @@ class S3BackupAgent(BackupAgent):
|
||||
if time() <= self._cache_expiration:
|
||||
return self._backup_cache
|
||||
|
||||
backups_list = await async_list_backups_from_s3(self._client, self._bucket)
|
||||
backups_list = await async_list_backups_from_s3(
|
||||
self._client, self._bucket, self._prefix
|
||||
)
|
||||
self._backup_cache = {b.backup_id: b for b in backups_list}
|
||||
self._cache_expiration = time() + CACHE_TTL
|
||||
|
||||
|
||||
31
homeassistant/components/aws_s3/config.yaml
Normal file
31
homeassistant/components/aws_s3/config.yaml
Normal file
@@ -0,0 +1,31 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
access_key_id:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
bucket:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
endpoint_url:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
prefix:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
default: ""
|
||||
secret_access_key:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
@@ -22,6 +22,7 @@ from .const import (
|
||||
CONF_ACCESS_KEY_ID,
|
||||
CONF_BUCKET,
|
||||
CONF_ENDPOINT_URL,
|
||||
CONF_PREFIX,
|
||||
CONF_SECRET_ACCESS_KEY,
|
||||
DEFAULT_ENDPOINT_URL,
|
||||
DESCRIPTION_AWS_S3_DOCS_URL,
|
||||
@@ -39,6 +40,7 @@ STEP_USER_DATA_SCHEMA = vol.Schema(
|
||||
vol.Required(CONF_ENDPOINT_URL, default=DEFAULT_ENDPOINT_URL): TextSelector(
|
||||
config=TextSelectorConfig(type=TextSelectorType.URL)
|
||||
),
|
||||
vol.Optional(CONF_PREFIX, default=""): cv.string,
|
||||
}
|
||||
)
|
||||
|
||||
@@ -53,12 +55,17 @@ class S3ConfigFlow(ConfigFlow, domain=DOMAIN):
|
||||
errors: dict[str, str] = {}
|
||||
|
||||
if user_input is not None:
|
||||
self._async_abort_entries_match(
|
||||
{
|
||||
CONF_BUCKET: user_input[CONF_BUCKET],
|
||||
CONF_ENDPOINT_URL: user_input[CONF_ENDPOINT_URL],
|
||||
}
|
||||
)
|
||||
normalized_prefix = user_input.get(CONF_PREFIX, "").strip("/")
|
||||
# Check for existing entries, treating missing prefix as empty
|
||||
for entry in self._async_current_entries(include_ignore=False):
|
||||
entry_prefix = (entry.data.get(CONF_PREFIX) or "").strip("/")
|
||||
if (
|
||||
entry.data.get(CONF_BUCKET) == user_input[CONF_BUCKET]
|
||||
and entry.data.get(CONF_ENDPOINT_URL)
|
||||
== user_input[CONF_ENDPOINT_URL]
|
||||
and entry_prefix == normalized_prefix
|
||||
):
|
||||
return self.async_abort(reason="already_configured")
|
||||
|
||||
hostname = urlparse(user_input[CONF_ENDPOINT_URL]).hostname
|
||||
if not hostname or not hostname.endswith(AWS_DOMAIN):
|
||||
@@ -83,9 +90,18 @@ class S3ConfigFlow(ConfigFlow, domain=DOMAIN):
|
||||
except ConnectionError:
|
||||
errors[CONF_ENDPOINT_URL] = "cannot_connect"
|
||||
else:
|
||||
return self.async_create_entry(
|
||||
title=user_input[CONF_BUCKET], data=user_input
|
||||
)
|
||||
data = dict(user_input)
|
||||
if not normalized_prefix:
|
||||
# Do not persist empty optional values
|
||||
data.pop(CONF_PREFIX, None)
|
||||
else:
|
||||
data[CONF_PREFIX] = normalized_prefix
|
||||
|
||||
title = user_input[CONF_BUCKET]
|
||||
if normalized_prefix:
|
||||
title = f"{title} - {normalized_prefix}"
|
||||
|
||||
return self.async_create_entry(title=title, data=data)
|
||||
|
||||
return self.async_show_form(
|
||||
step_id="user",
|
||||
|
||||
@@ -11,6 +11,7 @@ CONF_ACCESS_KEY_ID = "access_key_id"
|
||||
CONF_SECRET_ACCESS_KEY = "secret_access_key"
|
||||
CONF_ENDPOINT_URL = "endpoint_url"
|
||||
CONF_BUCKET = "bucket"
|
||||
CONF_PREFIX = "prefix"
|
||||
|
||||
AWS_DOMAIN = "amazonaws.com"
|
||||
DEFAULT_ENDPOINT_URL = f"https://s3.eu-central-1.{AWS_DOMAIN}/"
|
||||
|
||||
@@ -13,7 +13,7 @@ from homeassistant.config_entries import ConfigEntry
|
||||
from homeassistant.core import HomeAssistant
|
||||
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
|
||||
|
||||
from .const import CONF_BUCKET, DOMAIN
|
||||
from .const import CONF_BUCKET, CONF_PREFIX, DOMAIN
|
||||
from .helpers import async_list_backups_from_s3
|
||||
|
||||
SCAN_INTERVAL = timedelta(hours=6)
|
||||
@@ -53,11 +53,14 @@ class S3DataUpdateCoordinator(DataUpdateCoordinator[SensorData]):
|
||||
)
|
||||
self.client = client
|
||||
self._bucket: str = entry.data[CONF_BUCKET]
|
||||
self._prefix: str = entry.data.get(CONF_PREFIX, "")
|
||||
|
||||
async def _async_update_data(self) -> SensorData:
|
||||
"""Fetch data from AWS S3."""
|
||||
try:
|
||||
backups = await async_list_backups_from_s3(self.client, self._bucket)
|
||||
backups = await async_list_backups_from_s3(
|
||||
self.client, self._bucket, self._prefix
|
||||
)
|
||||
except BotoCoreError as error:
|
||||
raise UpdateFailed(
|
||||
translation_domain=DOMAIN,
|
||||
|
||||
55
homeassistant/components/aws_s3/diagnostics.py
Normal file
55
homeassistant/components/aws_s3/diagnostics.py
Normal file
@@ -0,0 +1,55 @@
|
||||
"""Diagnostics support for AWS S3."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import dataclasses
|
||||
from typing import Any
|
||||
|
||||
from homeassistant.components.backup import (
|
||||
DATA_MANAGER as BACKUP_DATA_MANAGER,
|
||||
BackupManager,
|
||||
)
|
||||
from homeassistant.components.diagnostics import async_redact_data
|
||||
from homeassistant.core import HomeAssistant
|
||||
|
||||
from .const import (
|
||||
CONF_ACCESS_KEY_ID,
|
||||
CONF_BUCKET,
|
||||
CONF_PREFIX,
|
||||
CONF_SECRET_ACCESS_KEY,
|
||||
DOMAIN,
|
||||
)
|
||||
from .coordinator import S3ConfigEntry
|
||||
from .helpers import async_list_backups_from_s3
|
||||
|
||||
TO_REDACT = (CONF_ACCESS_KEY_ID, CONF_SECRET_ACCESS_KEY)
|
||||
|
||||
|
||||
async def async_get_config_entry_diagnostics(
|
||||
hass: HomeAssistant,
|
||||
entry: S3ConfigEntry,
|
||||
) -> dict[str, Any]:
|
||||
"""Return diagnostics for a config entry."""
|
||||
coordinator = entry.runtime_data
|
||||
backup_manager: BackupManager = hass.data[BACKUP_DATA_MANAGER]
|
||||
backups = await async_list_backups_from_s3(
|
||||
coordinator.client,
|
||||
bucket=entry.data[CONF_BUCKET],
|
||||
prefix=entry.data.get(CONF_PREFIX, ""),
|
||||
)
|
||||
|
||||
data = {
|
||||
"coordinator_data": dataclasses.asdict(coordinator.data),
|
||||
"config": {
|
||||
**entry.data,
|
||||
**entry.options,
|
||||
},
|
||||
"backup_agents": [
|
||||
{"name": agent.name}
|
||||
for agent in backup_manager.backup_agents.values()
|
||||
if agent.domain == DOMAIN
|
||||
],
|
||||
"backup": [backup.as_dict() for backup in backups],
|
||||
}
|
||||
|
||||
return async_redact_data(data, TO_REDACT)
|
||||
@@ -17,11 +17,17 @@ _LOGGER = logging.getLogger(__name__)
|
||||
async def async_list_backups_from_s3(
|
||||
client: S3Client,
|
||||
bucket: str,
|
||||
prefix: str,
|
||||
) -> list[AgentBackup]:
|
||||
"""List backups from an S3 bucket by reading metadata files."""
|
||||
paginator = client.get_paginator("list_objects_v2")
|
||||
metadata_files: list[dict[str, Any]] = []
|
||||
async for page in paginator.paginate(Bucket=bucket):
|
||||
|
||||
list_kwargs: dict[str, Any] = {"Bucket": bucket}
|
||||
if prefix:
|
||||
list_kwargs["Prefix"] = prefix + "/"
|
||||
|
||||
async for page in paginator.paginate(**list_kwargs):
|
||||
metadata_files.extend(
|
||||
obj
|
||||
for obj in page.get("Contents", [])
|
||||
|
||||
@@ -23,7 +23,9 @@ rules:
|
||||
runtime-data: done
|
||||
test-before-configure: done
|
||||
test-before-setup: done
|
||||
unique-config-entry: done
|
||||
unique-config-entry:
|
||||
status: exempt
|
||||
comment: Hassfest does not recognize the duplicate prevention logic. Duplicate entries are prevented by checking bucket, endpoint URL, and prefix in the config flow.
|
||||
|
||||
# Silver
|
||||
action-exceptions:
|
||||
@@ -36,14 +38,14 @@ rules:
|
||||
docs-installation-parameters: done
|
||||
entity-unavailable: done
|
||||
integration-owner: done
|
||||
log-when-unavailable: todo
|
||||
log-when-unavailable: done
|
||||
parallel-updates: done
|
||||
reauthentication-flow: todo
|
||||
test-coverage: done
|
||||
|
||||
# Gold
|
||||
devices: done
|
||||
diagnostics: todo
|
||||
diagnostics: done
|
||||
discovery-update-info:
|
||||
status: exempt
|
||||
comment: S3 is a cloud service that is not discovered on the network.
|
||||
|
||||
@@ -15,12 +15,14 @@
|
||||
"access_key_id": "Access key ID",
|
||||
"bucket": "Bucket name",
|
||||
"endpoint_url": "Endpoint URL",
|
||||
"prefix": "Prefix",
|
||||
"secret_access_key": "Secret access key"
|
||||
},
|
||||
"data_description": {
|
||||
"access_key_id": "Access key ID to connect to AWS S3 API",
|
||||
"bucket": "Bucket must already exist and be writable by the provided credentials.",
|
||||
"endpoint_url": "Endpoint URL provided to [Boto3 Session]({boto3_docs_url}). Region-specific [AWS S3 endpoints]({aws_s3_docs_url}) are available in their docs.",
|
||||
"prefix": "Folder or prefix to store backups in, for example `backups`",
|
||||
"secret_access_key": "Secret access key to connect to AWS S3 API"
|
||||
},
|
||||
"title": "Add AWS S3 bucket"
|
||||
|
||||
34
homeassistant/components/axis/config.yaml
Normal file
34
homeassistant/components/axis/config.yaml
Normal file
@@ -0,0 +1,34 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 3
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
host:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
password:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
port:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
protocol:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
username:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields:
|
||||
stream_profile:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
subentries: {}
|
||||
39
homeassistant/components/azure_data_explorer/config.yaml
Normal file
39
homeassistant/components/azure_data_explorer/config.yaml
Normal file
@@ -0,0 +1,39 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
authority_id:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
client_id:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
client_secret:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
cluster_ingest_uri:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
database:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
table:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
use_queued_ingestion:
|
||||
required: true
|
||||
selector:
|
||||
boolean: {}
|
||||
default: false
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
22
homeassistant/components/azure_devops/config.yaml
Normal file
22
homeassistant/components/azure_devops/config.yaml
Normal file
@@ -0,0 +1,22 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
organization:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
personal_access_token:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
project:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
39
homeassistant/components/azure_event_hub/config.yaml
Normal file
39
homeassistant/components/azure_event_hub/config.yaml
Normal file
@@ -0,0 +1,39 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
event_hub_connection_string:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
event_hub_instance_name:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
event_hub_namespace:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
event_hub_sas_key:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
event_hub_sas_policy:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
use_connection_string:
|
||||
required: false
|
||||
selector:
|
||||
boolean: {}
|
||||
default: false
|
||||
options:
|
||||
fields:
|
||||
send_interval:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
subentries: {}
|
||||
22
homeassistant/components/azure_storage/config.yaml
Normal file
22
homeassistant/components/azure_storage/config.yaml
Normal file
@@ -0,0 +1,22 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
account_name:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
container_name:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
storage_account_key:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
26
homeassistant/components/backblaze_b2/config.yaml
Normal file
26
homeassistant/components/backblaze_b2/config.yaml
Normal file
@@ -0,0 +1,26 @@
|
||||
config_entry:
|
||||
versions:
|
||||
- version:
|
||||
major: 1
|
||||
minor: 1
|
||||
data:
|
||||
fields:
|
||||
application_key:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
key_id:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
bucket:
|
||||
required: true
|
||||
selector:
|
||||
text: {}
|
||||
prefix:
|
||||
required: false
|
||||
selector:
|
||||
text: {}
|
||||
options:
|
||||
fields: {}
|
||||
subentries: {}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user