homeassistant 2025.10.0b1__py3-none-any.whl → 2025.10.0b4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of homeassistant might be problematic. Click here for more details.
- homeassistant/components/accuweather/manifest.json +1 -1
- homeassistant/components/accuweather/translations/ga.json +16 -1
- homeassistant/components/airos/__init__.py +37 -2
- homeassistant/components/airos/config_flow.py +24 -3
- homeassistant/components/airos/const.py +5 -0
- homeassistant/components/airos/entity.py +8 -3
- homeassistant/components/airos/strings.json +12 -0
- homeassistant/components/airos/translations/de.json +12 -0
- homeassistant/components/airos/translations/en-GB.json +12 -0
- homeassistant/components/airos/translations/en.json +12 -0
- homeassistant/components/airzone/translations/es.json +10 -0
- homeassistant/components/airzone/translations/et.json +10 -0
- homeassistant/components/airzone/translations/ga.json +10 -0
- homeassistant/components/airzone/translations/pt.json +10 -0
- homeassistant/components/alexa_devices/binary_sensor.py +36 -38
- homeassistant/components/alexa_devices/config_flow.py +2 -2
- homeassistant/components/alexa_devices/coordinator.py +1 -1
- homeassistant/components/alexa_devices/diagnostics.py +1 -3
- homeassistant/components/alexa_devices/icons.json +0 -40
- homeassistant/components/alexa_devices/manifest.json +1 -1
- homeassistant/components/alexa_devices/sensor.py +13 -0
- homeassistant/components/alexa_devices/strings.json +0 -20
- homeassistant/components/alexa_devices/switch.py +27 -7
- homeassistant/components/alexa_devices/translations/bg.json +0 -13
- homeassistant/components/alexa_devices/translations/cs.json +0 -20
- homeassistant/components/alexa_devices/translations/de.json +0 -20
- homeassistant/components/alexa_devices/translations/el.json +0 -20
- homeassistant/components/alexa_devices/translations/en-GB.json +0 -20
- homeassistant/components/alexa_devices/translations/en.json +0 -20
- homeassistant/components/alexa_devices/translations/es.json +0 -20
- homeassistant/components/alexa_devices/translations/et.json +0 -20
- homeassistant/components/alexa_devices/translations/ga.json +0 -20
- homeassistant/components/alexa_devices/translations/he.json +0 -7
- homeassistant/components/alexa_devices/translations/hu.json +0 -20
- homeassistant/components/alexa_devices/translations/it.json +0 -20
- homeassistant/components/alexa_devices/translations/ja.json +0 -19
- homeassistant/components/alexa_devices/translations/lt.json +0 -20
- homeassistant/components/alexa_devices/translations/mk.json +0 -14
- homeassistant/components/alexa_devices/translations/nl.json +0 -20
- homeassistant/components/alexa_devices/translations/pl.json +0 -5
- homeassistant/components/alexa_devices/translations/pt.json +0 -20
- homeassistant/components/alexa_devices/translations/ru.json +0 -5
- homeassistant/components/alexa_devices/translations/sk.json +0 -20
- homeassistant/components/alexa_devices/translations/sv.json +0 -20
- homeassistant/components/alexa_devices/translations/tr.json +0 -5
- homeassistant/components/alexa_devices/translations/zh-Hans.json +0 -20
- homeassistant/components/alexa_devices/translations/zh-Hant.json +0 -20
- homeassistant/components/alexa_devices/utils.py +24 -1
- homeassistant/components/assist_pipeline/pipeline.py +43 -18
- homeassistant/components/assist_pipeline/translations/nl.json +1 -0
- homeassistant/components/assist_pipeline/translations/sv.json +1 -0
- homeassistant/components/blue_current/translations/es.json +44 -0
- homeassistant/components/blue_current/translations/et.json +44 -0
- homeassistant/components/blue_current/translations/ga.json +44 -0
- homeassistant/components/blue_current/translations/pt.json +44 -0
- homeassistant/components/cloud/translations/sk.json +1 -1
- homeassistant/components/comelit/config_flow.py +8 -4
- homeassistant/components/cync/translations/es.json +32 -0
- homeassistant/components/cync/translations/et.json +32 -0
- homeassistant/components/cync/translations/ga.json +32 -0
- homeassistant/components/cync/translations/pt.json +32 -0
- homeassistant/components/cync/translations/ru.json +32 -0
- homeassistant/components/ecovacs/translations/es.json +7 -1
- homeassistant/components/ecovacs/translations/et.json +7 -1
- homeassistant/components/ecovacs/translations/ga.json +6 -1
- homeassistant/components/ecovacs/translations/pt.json +4 -0
- homeassistant/components/ecovacs/translations/ru.json +4 -0
- homeassistant/components/edl21/translations/de.json +1 -1
- homeassistant/components/ekeybionyx/translations/es.json +66 -0
- homeassistant/components/ekeybionyx/translations/et.json +66 -0
- homeassistant/components/ekeybionyx/translations/ga.json +66 -0
- homeassistant/components/ekeybionyx/translations/pt.json +66 -0
- homeassistant/components/elvia/translations/de.json +3 -3
- homeassistant/components/esphome/manager.py +1 -1
- homeassistant/components/esphome/manifest.json +1 -1
- homeassistant/components/esphome/translations/nl.json +1 -1
- homeassistant/components/esphome/translations/sv.json +1 -1
- homeassistant/components/ezviz/entity.py +12 -6
- homeassistant/components/file/translations/es.json +31 -0
- homeassistant/components/file/translations/et.json +31 -0
- homeassistant/components/file/translations/ga.json +31 -0
- homeassistant/components/file/translations/pt.json +31 -0
- homeassistant/components/file/translations/ru.json +31 -0
- homeassistant/components/frontend/manifest.json +1 -1
- homeassistant/components/geniushub/entity.py +4 -4
- homeassistant/components/google_generative_ai_conversation/translations/ga.json +6 -0
- homeassistant/components/habitica/translations/ga.json +24 -0
- homeassistant/components/hassio/translations/es.json +4 -0
- homeassistant/components/hassio/translations/et.json +4 -0
- homeassistant/components/hassio/translations/ga.json +4 -0
- homeassistant/components/hassio/translations/pt.json +4 -0
- homeassistant/components/hassio/translations/ru.json +4 -0
- homeassistant/components/here_travel_time/translations/es.json +6 -0
- homeassistant/components/here_travel_time/translations/et.json +6 -0
- homeassistant/components/here_travel_time/translations/ga.json +6 -0
- homeassistant/components/here_travel_time/translations/pt.json +6 -0
- homeassistant/components/irm_kmi/translations/ga.json +50 -0
- homeassistant/components/lamarzocco/__init__.py +1 -1
- homeassistant/components/lamarzocco/coordinator.py +10 -2
- homeassistant/components/lamarzocco/manifest.json +1 -1
- homeassistant/components/letpot/translations/es.json +10 -0
- homeassistant/components/letpot/translations/et.json +10 -0
- homeassistant/components/letpot/translations/ga.json +9 -0
- homeassistant/components/letpot/translations/pt.json +10 -0
- homeassistant/components/lg_thinq/translations/ga.json +9 -0
- homeassistant/components/logbook/translations/es.json +6 -1
- homeassistant/components/logbook/translations/et.json +6 -1
- homeassistant/components/logbook/translations/pl.json +3 -1
- homeassistant/components/logbook/translations/pt.json +6 -1
- homeassistant/components/logbook/translations/ru.json +6 -1
- homeassistant/components/mastodon/translations/ga.json +4 -0
- homeassistant/components/matter/translations/es.json +3 -0
- homeassistant/components/matter/translations/et.json +3 -0
- homeassistant/components/matter/translations/ga.json +3 -0
- homeassistant/components/matter/translations/pt.json +3 -0
- homeassistant/components/matter/translations/ru.json +3 -0
- homeassistant/components/miele/translations/ga.json +1 -0
- homeassistant/components/mqtt/translations/es.json +19 -0
- homeassistant/components/mqtt/translations/et.json +19 -0
- homeassistant/components/mqtt/translations/ga.json +26 -1
- homeassistant/components/mqtt/translations/pt.json +19 -0
- homeassistant/components/mqtt/translations/ru.json +19 -0
- homeassistant/components/mvglive/manifest.json +2 -4
- homeassistant/components/mvglive/sensor.py +116 -86
- homeassistant/components/nina/strings.json +2 -2
- homeassistant/components/nina/translations/ca.json +0 -2
- homeassistant/components/nina/translations/cs.json +0 -2
- homeassistant/components/nina/translations/de.json +3 -3
- homeassistant/components/nina/translations/el.json +0 -1
- homeassistant/components/nina/translations/en-GB.json +3 -3
- homeassistant/components/nina/translations/en.json +3 -3
- homeassistant/components/nina/translations/es.json +0 -2
- homeassistant/components/nina/translations/et.json +0 -2
- homeassistant/components/nina/translations/fi.json +0 -2
- homeassistant/components/nina/translations/ga.json +0 -2
- homeassistant/components/nina/translations/hu.json +0 -2
- homeassistant/components/nina/translations/id.json +0 -1
- homeassistant/components/nina/translations/it.json +0 -2
- homeassistant/components/nina/translations/ja.json +0 -2
- homeassistant/components/nina/translations/ko.json +0 -2
- homeassistant/components/nina/translations/lt.json +0 -2
- homeassistant/components/nina/translations/nl.json +0 -2
- homeassistant/components/nina/translations/pt-BR.json +0 -1
- homeassistant/components/nina/translations/pt.json +0 -2
- homeassistant/components/nina/translations/ro.json +0 -1
- homeassistant/components/nina/translations/ru.json +0 -2
- homeassistant/components/nina/translations/sk.json +0 -2
- homeassistant/components/nina/translations/sv.json +0 -2
- homeassistant/components/nina/translations/tr.json +0 -2
- homeassistant/components/nina/translations/uk.json +0 -1
- homeassistant/components/nina/translations/zh-Hans.json +0 -2
- homeassistant/components/nina/translations/zh-Hant.json +0 -2
- homeassistant/components/nordpool/translations/ga.json +6 -0
- homeassistant/components/pooldose/translations/ga.json +8 -1
- homeassistant/components/portainer/__init__.py +4 -3
- homeassistant/components/portainer/config_flow.py +3 -2
- homeassistant/components/portainer/strings.json +4 -2
- homeassistant/components/portainer/translations/de.json +4 -2
- homeassistant/components/portainer/translations/en-GB.json +4 -2
- homeassistant/components/portainer/translations/en.json +4 -2
- homeassistant/components/profiler/translations/es.json +4 -0
- homeassistant/components/profiler/translations/et.json +4 -0
- homeassistant/components/profiler/translations/ga.json +4 -0
- homeassistant/components/profiler/translations/pt.json +4 -0
- homeassistant/components/route_b_smart_meter/translations/es.json +42 -0
- homeassistant/components/route_b_smart_meter/translations/et.json +42 -0
- homeassistant/components/route_b_smart_meter/translations/ga.json +42 -0
- homeassistant/components/route_b_smart_meter/translations/pt.json +42 -0
- homeassistant/components/russound_rio/manifest.json +1 -1
- homeassistant/components/satel_integra/translations/et.json +1 -0
- homeassistant/components/shelly/translations/pl.json +4 -0
- homeassistant/components/smartthings/manifest.json +1 -1
- homeassistant/components/smartthings/translations/es.json +21 -0
- homeassistant/components/smartthings/translations/et.json +21 -0
- homeassistant/components/smartthings/translations/ga.json +15 -0
- homeassistant/components/smartthings/translations/pt.json +21 -0
- homeassistant/components/thread/config_flow.py +11 -3
- homeassistant/components/thread/manifest.json +1 -0
- homeassistant/components/tolo/translations/es.json +2 -1
- homeassistant/components/tolo/translations/ga.json +2 -1
- homeassistant/components/tuya/translations/es.json +9 -0
- homeassistant/components/tuya/translations/et.json +9 -0
- homeassistant/components/tuya/translations/ga.json +9 -0
- homeassistant/components/tuya/translations/pt.json +9 -0
- homeassistant/components/usage_prediction/translations/et.json +3 -0
- homeassistant/components/valve/translations/pl.json +2 -1
- homeassistant/components/vesync/fan.py +3 -1
- homeassistant/components/voip/translations/nl.json +1 -1
- homeassistant/components/voip/translations/sv.json +1 -1
- homeassistant/components/volvooncall/translations/ga.json +18 -1
- homeassistant/components/wyoming/translations/nl.json +1 -1
- homeassistant/components/wyoming/translations/sv.json +1 -1
- homeassistant/components/zha/config_flow.py +37 -21
- homeassistant/components/zha/manifest.json +1 -1
- homeassistant/components/zha/translations/es.json +81 -3
- homeassistant/components/zha/translations/et.json +78 -0
- homeassistant/components/zha/translations/ga.json +74 -0
- homeassistant/components/zha/translations/pt.json +80 -2
- homeassistant/components/zha/translations/ru.json +8 -2
- homeassistant/components/zwave_js/config_flow.py +30 -11
- homeassistant/components/zwave_js/translations/es.json +1 -0
- homeassistant/components/zwave_js/translations/et.json +1 -0
- homeassistant/components/zwave_js/translations/ga.json +1 -0
- homeassistant/components/zwave_js/translations/pt.json +1 -0
- homeassistant/const.py +1 -1
- homeassistant/generated/integrations.json +2 -1
- homeassistant/package_constraints.txt +1 -1
- {homeassistant-2025.10.0b1.dist-info → homeassistant-2025.10.0b4.dist-info}/METADATA +1 -1
- {homeassistant-2025.10.0b1.dist-info → homeassistant-2025.10.0b4.dist-info}/RECORD +214 -199
- {homeassistant-2025.10.0b1.dist-info → homeassistant-2025.10.0b4.dist-info}/WHEEL +0 -0
- {homeassistant-2025.10.0b1.dist-info → homeassistant-2025.10.0b4.dist-info}/entry_points.txt +0 -0
- {homeassistant-2025.10.0b1.dist-info → homeassistant-2025.10.0b4.dist-info}/licenses/LICENSE.md +0 -0
- {homeassistant-2025.10.0b1.dist-info → homeassistant-2025.10.0b4.dist-info}/licenses/homeassistant/backports/LICENSE.Python +0 -0
- {homeassistant-2025.10.0b1.dist-info → homeassistant-2025.10.0b4.dist-info}/top_level.txt +0 -0
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"config": {
|
|
3
3
|
"abort": {
|
|
4
|
-
"already_configured": "T\u00e1 an su\u00edomh cumraithe cheana f\u00e9in"
|
|
4
|
+
"already_configured": "T\u00e1 an su\u00edomh cumraithe cheana f\u00e9in",
|
|
5
|
+
"reauth_successful": "D'\u00e9irigh leis an athfh\u00edordheimhni\u00fa"
|
|
5
6
|
},
|
|
6
7
|
"create_entry": {
|
|
7
8
|
"default": "N\u00ed bh\u00edonn roinnt braiteoir\u00ed cumasaithe de r\u00e9ir r\u00e9amhshocraithe. Is f\u00e9idir leat iad a chumas\u00fa sa chl\u00e1rlann eintiteas tar \u00e9is chumra\u00edocht an chomhth\u00e1thaithe."
|
|
@@ -12,12 +13,23 @@
|
|
|
12
13
|
"requests_exceeded": "T\u00e1 an l\u00edon ceadaithe iarratas chuig API AccuWeather s\u00e1raithe. Caithfidh t\u00fa fanacht n\u00f3 eochair an API a athr\u00fa."
|
|
13
14
|
},
|
|
14
15
|
"step": {
|
|
16
|
+
"reauth_confirm": {
|
|
17
|
+
"data": {
|
|
18
|
+
"api_key": "Eochair API"
|
|
19
|
+
},
|
|
20
|
+
"data_description": {
|
|
21
|
+
"api_key": "Eochair API ginte i dtairseach AccuWeather APIs."
|
|
22
|
+
}
|
|
23
|
+
},
|
|
15
24
|
"user": {
|
|
16
25
|
"data": {
|
|
17
26
|
"api_key": "Eochair API",
|
|
18
27
|
"latitude": "Domhanleithead",
|
|
19
28
|
"longitude": "Domhanfhad",
|
|
20
29
|
"name": "Ainm"
|
|
30
|
+
},
|
|
31
|
+
"data_description": {
|
|
32
|
+
"api_key": "Eochair API ginte i dtairseach AccuWeather APIs."
|
|
21
33
|
}
|
|
22
34
|
}
|
|
23
35
|
}
|
|
@@ -239,6 +251,9 @@
|
|
|
239
251
|
}
|
|
240
252
|
},
|
|
241
253
|
"exceptions": {
|
|
254
|
+
"auth_error": {
|
|
255
|
+
"message": "Theip ar fh\u00edordheimhni\u00fa do {entry}, nuashonraigh d'eochair API le do thoil"
|
|
256
|
+
},
|
|
242
257
|
"current_conditions_update_error": {
|
|
243
258
|
"message": "Tharla earr\u00e1id agus sonra\u00ed reatha aimsire \u00e1 n-aisghabh\u00e1il \u00f3 AccuWeather API: {error}"
|
|
244
259
|
},
|
|
@@ -4,10 +4,18 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
from airos.airos8 import AirOS8
|
|
6
6
|
|
|
7
|
-
from homeassistant.const import
|
|
7
|
+
from homeassistant.const import (
|
|
8
|
+
CONF_HOST,
|
|
9
|
+
CONF_PASSWORD,
|
|
10
|
+
CONF_SSL,
|
|
11
|
+
CONF_USERNAME,
|
|
12
|
+
CONF_VERIFY_SSL,
|
|
13
|
+
Platform,
|
|
14
|
+
)
|
|
8
15
|
from homeassistant.core import HomeAssistant
|
|
9
16
|
from homeassistant.helpers.aiohttp_client import async_get_clientsession
|
|
10
17
|
|
|
18
|
+
from .const import DEFAULT_SSL, DEFAULT_VERIFY_SSL, SECTION_ADVANCED_SETTINGS
|
|
11
19
|
from .coordinator import AirOSConfigEntry, AirOSDataUpdateCoordinator
|
|
12
20
|
|
|
13
21
|
_PLATFORMS: list[Platform] = [
|
|
@@ -21,13 +29,16 @@ async def async_setup_entry(hass: HomeAssistant, entry: AirOSConfigEntry) -> boo
|
|
|
21
29
|
|
|
22
30
|
# By default airOS 8 comes with self-signed SSL certificates,
|
|
23
31
|
# with no option in the web UI to change or upload a custom certificate.
|
|
24
|
-
session = async_get_clientsession(
|
|
32
|
+
session = async_get_clientsession(
|
|
33
|
+
hass, verify_ssl=entry.data[SECTION_ADVANCED_SETTINGS][CONF_VERIFY_SSL]
|
|
34
|
+
)
|
|
25
35
|
|
|
26
36
|
airos_device = AirOS8(
|
|
27
37
|
host=entry.data[CONF_HOST],
|
|
28
38
|
username=entry.data[CONF_USERNAME],
|
|
29
39
|
password=entry.data[CONF_PASSWORD],
|
|
30
40
|
session=session,
|
|
41
|
+
use_ssl=entry.data[SECTION_ADVANCED_SETTINGS][CONF_SSL],
|
|
31
42
|
)
|
|
32
43
|
|
|
33
44
|
coordinator = AirOSDataUpdateCoordinator(hass, entry, airos_device)
|
|
@@ -40,6 +51,30 @@ async def async_setup_entry(hass: HomeAssistant, entry: AirOSConfigEntry) -> boo
|
|
|
40
51
|
return True
|
|
41
52
|
|
|
42
53
|
|
|
54
|
+
async def async_migrate_entry(hass: HomeAssistant, entry: AirOSConfigEntry) -> bool:
|
|
55
|
+
"""Migrate old config entry."""
|
|
56
|
+
|
|
57
|
+
if entry.version > 1:
|
|
58
|
+
# This means the user has downgraded from a future version
|
|
59
|
+
return False
|
|
60
|
+
|
|
61
|
+
if entry.version == 1 and entry.minor_version == 1:
|
|
62
|
+
new_data = {**entry.data}
|
|
63
|
+
advanced_data = {
|
|
64
|
+
CONF_SSL: DEFAULT_SSL,
|
|
65
|
+
CONF_VERIFY_SSL: DEFAULT_VERIFY_SSL,
|
|
66
|
+
}
|
|
67
|
+
new_data[SECTION_ADVANCED_SETTINGS] = advanced_data
|
|
68
|
+
|
|
69
|
+
hass.config_entries.async_update_entry(
|
|
70
|
+
entry,
|
|
71
|
+
data=new_data,
|
|
72
|
+
minor_version=2,
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
return True
|
|
76
|
+
|
|
77
|
+
|
|
43
78
|
async def async_unload_entry(hass: HomeAssistant, entry: AirOSConfigEntry) -> bool:
|
|
44
79
|
"""Unload a config entry."""
|
|
45
80
|
return await hass.config_entries.async_unload_platforms(entry, _PLATFORMS)
|
|
@@ -15,10 +15,17 @@ from airos.exceptions import (
|
|
|
15
15
|
import voluptuous as vol
|
|
16
16
|
|
|
17
17
|
from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
|
|
18
|
-
from homeassistant.const import
|
|
18
|
+
from homeassistant.const import (
|
|
19
|
+
CONF_HOST,
|
|
20
|
+
CONF_PASSWORD,
|
|
21
|
+
CONF_SSL,
|
|
22
|
+
CONF_USERNAME,
|
|
23
|
+
CONF_VERIFY_SSL,
|
|
24
|
+
)
|
|
25
|
+
from homeassistant.data_entry_flow import section
|
|
19
26
|
from homeassistant.helpers.aiohttp_client import async_get_clientsession
|
|
20
27
|
|
|
21
|
-
from .const import DOMAIN
|
|
28
|
+
from .const import DEFAULT_SSL, DEFAULT_VERIFY_SSL, DOMAIN, SECTION_ADVANCED_SETTINGS
|
|
22
29
|
from .coordinator import AirOS8
|
|
23
30
|
|
|
24
31
|
_LOGGER = logging.getLogger(__name__)
|
|
@@ -28,6 +35,15 @@ STEP_USER_DATA_SCHEMA = vol.Schema(
|
|
|
28
35
|
vol.Required(CONF_HOST): str,
|
|
29
36
|
vol.Required(CONF_USERNAME, default="ubnt"): str,
|
|
30
37
|
vol.Required(CONF_PASSWORD): str,
|
|
38
|
+
vol.Required(SECTION_ADVANCED_SETTINGS): section(
|
|
39
|
+
vol.Schema(
|
|
40
|
+
{
|
|
41
|
+
vol.Required(CONF_SSL, default=DEFAULT_SSL): bool,
|
|
42
|
+
vol.Required(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): bool,
|
|
43
|
+
}
|
|
44
|
+
),
|
|
45
|
+
{"collapsed": True},
|
|
46
|
+
),
|
|
31
47
|
}
|
|
32
48
|
)
|
|
33
49
|
|
|
@@ -36,6 +52,7 @@ class AirOSConfigFlow(ConfigFlow, domain=DOMAIN):
|
|
|
36
52
|
"""Handle a config flow for Ubiquiti airOS."""
|
|
37
53
|
|
|
38
54
|
VERSION = 1
|
|
55
|
+
MINOR_VERSION = 2
|
|
39
56
|
|
|
40
57
|
async def async_step_user(
|
|
41
58
|
self,
|
|
@@ -46,13 +63,17 @@ class AirOSConfigFlow(ConfigFlow, domain=DOMAIN):
|
|
|
46
63
|
if user_input is not None:
|
|
47
64
|
# By default airOS 8 comes with self-signed SSL certificates,
|
|
48
65
|
# with no option in the web UI to change or upload a custom certificate.
|
|
49
|
-
session = async_get_clientsession(
|
|
66
|
+
session = async_get_clientsession(
|
|
67
|
+
self.hass,
|
|
68
|
+
verify_ssl=user_input[SECTION_ADVANCED_SETTINGS][CONF_VERIFY_SSL],
|
|
69
|
+
)
|
|
50
70
|
|
|
51
71
|
airos_device = AirOS8(
|
|
52
72
|
host=user_input[CONF_HOST],
|
|
53
73
|
username=user_input[CONF_USERNAME],
|
|
54
74
|
password=user_input[CONF_PASSWORD],
|
|
55
75
|
session=session,
|
|
76
|
+
use_ssl=user_input[SECTION_ADVANCED_SETTINGS][CONF_SSL],
|
|
56
77
|
)
|
|
57
78
|
try:
|
|
58
79
|
await airos_device.login()
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
from homeassistant.const import CONF_HOST
|
|
5
|
+
from homeassistant.const import CONF_HOST, CONF_SSL
|
|
6
6
|
from homeassistant.helpers.device_registry import CONNECTION_NETWORK_MAC, DeviceInfo
|
|
7
7
|
from homeassistant.helpers.update_coordinator import CoordinatorEntity
|
|
8
8
|
|
|
9
|
-
from .const import DOMAIN, MANUFACTURER
|
|
9
|
+
from .const import DOMAIN, MANUFACTURER, SECTION_ADVANCED_SETTINGS
|
|
10
10
|
from .coordinator import AirOSDataUpdateCoordinator
|
|
11
11
|
|
|
12
12
|
|
|
@@ -20,9 +20,14 @@ class AirOSEntity(CoordinatorEntity[AirOSDataUpdateCoordinator]):
|
|
|
20
20
|
super().__init__(coordinator)
|
|
21
21
|
|
|
22
22
|
airos_data = self.coordinator.data
|
|
23
|
+
url_schema = (
|
|
24
|
+
"https"
|
|
25
|
+
if coordinator.config_entry.data[SECTION_ADVANCED_SETTINGS][CONF_SSL]
|
|
26
|
+
else "http"
|
|
27
|
+
)
|
|
23
28
|
|
|
24
29
|
configuration_url: str | None = (
|
|
25
|
-
f"
|
|
30
|
+
f"{url_schema}://{coordinator.config_entry.data[CONF_HOST]}"
|
|
26
31
|
)
|
|
27
32
|
|
|
28
33
|
self._attr_device_info = DeviceInfo(
|
|
@@ -12,6 +12,18 @@
|
|
|
12
12
|
"host": "IP address or hostname of the airOS device",
|
|
13
13
|
"username": "Administrator username for the airOS device, normally 'ubnt'",
|
|
14
14
|
"password": "Password configured through the UISP app or web interface"
|
|
15
|
+
},
|
|
16
|
+
"sections": {
|
|
17
|
+
"advanced_settings": {
|
|
18
|
+
"data": {
|
|
19
|
+
"ssl": "Use HTTPS",
|
|
20
|
+
"verify_ssl": "[%key:common::config_flow::data::verify_ssl%]"
|
|
21
|
+
},
|
|
22
|
+
"data_description": {
|
|
23
|
+
"ssl": "Whether the connection should be encrypted (required for most devices)",
|
|
24
|
+
"verify_ssl": "Whether the certificate should be verified when using HTTPS. This should be off for self-signed certificates"
|
|
25
|
+
}
|
|
26
|
+
}
|
|
15
27
|
}
|
|
16
28
|
}
|
|
17
29
|
},
|
|
@@ -21,6 +21,18 @@
|
|
|
21
21
|
"host": "IP-Adresse oder Hostname des airOS-Ger\u00e4ts",
|
|
22
22
|
"password": "\u00dcber die UISP-App oder Weboberfl\u00e4che konfiguriertes Passwort",
|
|
23
23
|
"username": "Administrator-Benutzername f\u00fcr das airOS-Ger\u00e4t, normalerweise \u201eubnt\u201c"
|
|
24
|
+
},
|
|
25
|
+
"sections": {
|
|
26
|
+
"advanced_settings": {
|
|
27
|
+
"data": {
|
|
28
|
+
"ssl": "HTTPS verwenden",
|
|
29
|
+
"verify_ssl": "SSL-Zertifikat \u00fcberpr\u00fcfen"
|
|
30
|
+
},
|
|
31
|
+
"data_description": {
|
|
32
|
+
"ssl": "Ob die Verbindung verschl\u00fcsselt werden soll (f\u00fcr die meisten Ger\u00e4te erforderlich)",
|
|
33
|
+
"verify_ssl": "Ob das Zertifikat bei Verwendung von HTTPS \u00fcberpr\u00fcft werden soll. Bei selbstsignierten Zertifikaten sollte dies deaktiviert sein."
|
|
34
|
+
}
|
|
35
|
+
}
|
|
24
36
|
}
|
|
25
37
|
}
|
|
26
38
|
}
|
|
@@ -21,6 +21,18 @@
|
|
|
21
21
|
"host": "IP address or hostname of the airOS device",
|
|
22
22
|
"password": "Password configured through the UISP app or web interface",
|
|
23
23
|
"username": "Administrator username for the airOS device, normally 'ubnt'"
|
|
24
|
+
},
|
|
25
|
+
"sections": {
|
|
26
|
+
"advanced_settings": {
|
|
27
|
+
"data": {
|
|
28
|
+
"ssl": "Use HTTPS",
|
|
29
|
+
"verify_ssl": "Verify SSL certificate"
|
|
30
|
+
},
|
|
31
|
+
"data_description": {
|
|
32
|
+
"ssl": "Whether the connection should be encrypted (required for most devices)",
|
|
33
|
+
"verify_ssl": "Whether the certificate should be verified when using HTTPS. This should be off for self-signed certificates"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
24
36
|
}
|
|
25
37
|
}
|
|
26
38
|
}
|
|
@@ -21,6 +21,18 @@
|
|
|
21
21
|
"host": "IP address or hostname of the airOS device",
|
|
22
22
|
"password": "Password configured through the UISP app or web interface",
|
|
23
23
|
"username": "Administrator username for the airOS device, normally 'ubnt'"
|
|
24
|
+
},
|
|
25
|
+
"sections": {
|
|
26
|
+
"advanced_settings": {
|
|
27
|
+
"data": {
|
|
28
|
+
"ssl": "Use HTTPS",
|
|
29
|
+
"verify_ssl": "Verify SSL certificate"
|
|
30
|
+
},
|
|
31
|
+
"data_description": {
|
|
32
|
+
"ssl": "Whether the connection should be encrypted (required for most devices)",
|
|
33
|
+
"verify_ssl": "Whether the certificate should be verified when using HTTPS. This should be off for self-signed certificates"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
24
36
|
}
|
|
25
37
|
}
|
|
26
38
|
}
|
|
@@ -63,6 +63,16 @@
|
|
|
63
63
|
"stop": "Parada"
|
|
64
64
|
}
|
|
65
65
|
},
|
|
66
|
+
"q_adapt": {
|
|
67
|
+
"name": "Q-Adapt",
|
|
68
|
+
"state": {
|
|
69
|
+
"maximum": "M\u00e1ximo",
|
|
70
|
+
"minimum": "M\u00ednimo",
|
|
71
|
+
"power": "Energ\u00eda",
|
|
72
|
+
"silence": "Silencio",
|
|
73
|
+
"standard": "Est\u00e1ndar"
|
|
74
|
+
}
|
|
75
|
+
},
|
|
66
76
|
"sleep_times": {
|
|
67
77
|
"name": "Dormir",
|
|
68
78
|
"state": {
|
|
@@ -63,6 +63,16 @@
|
|
|
63
63
|
"stop": "Peata"
|
|
64
64
|
}
|
|
65
65
|
},
|
|
66
|
+
"q_adapt": {
|
|
67
|
+
"name": "Q-Adapt",
|
|
68
|
+
"state": {
|
|
69
|
+
"maximum": "Maksimaalne",
|
|
70
|
+
"minimum": "Minimaalne",
|
|
71
|
+
"power": "V\u00f5imas",
|
|
72
|
+
"silence": "Vaikne",
|
|
73
|
+
"standard": "Tavaline"
|
|
74
|
+
}
|
|
75
|
+
},
|
|
66
76
|
"sleep_times": {
|
|
67
77
|
"name": "Unere\u017eiim",
|
|
68
78
|
"state": {
|
|
@@ -63,6 +63,16 @@
|
|
|
63
63
|
"stop": "Stad"
|
|
64
64
|
}
|
|
65
65
|
},
|
|
66
|
+
"q_adapt": {
|
|
67
|
+
"name": "Q-Adapt",
|
|
68
|
+
"state": {
|
|
69
|
+
"maximum": "Uasmh\u00e9id",
|
|
70
|
+
"minimum": "\u00cdosmh\u00e9id",
|
|
71
|
+
"power": "Cumhacht",
|
|
72
|
+
"silence": "Ci\u00fanas",
|
|
73
|
+
"standard": "Caighde\u00e1nach"
|
|
74
|
+
}
|
|
75
|
+
},
|
|
66
76
|
"sleep_times": {
|
|
67
77
|
"name": "Codladh",
|
|
68
78
|
"state": {
|
|
@@ -63,6 +63,16 @@
|
|
|
63
63
|
"stop": "Parar"
|
|
64
64
|
}
|
|
65
65
|
},
|
|
66
|
+
"q_adapt": {
|
|
67
|
+
"name": "Q-Adapt",
|
|
68
|
+
"state": {
|
|
69
|
+
"maximum": "M\u00e1ximo",
|
|
70
|
+
"minimum": "M\u00ednimo",
|
|
71
|
+
"power": "Energia",
|
|
72
|
+
"silence": "Sil\u00eancio",
|
|
73
|
+
"standard": "Padr\u00e3o"
|
|
74
|
+
}
|
|
75
|
+
},
|
|
66
76
|
"sleep_times": {
|
|
67
77
|
"name": "Dormir",
|
|
68
78
|
"state": {
|
|
@@ -10,6 +10,7 @@ from aioamazondevices.api import AmazonDevice
|
|
|
10
10
|
from aioamazondevices.const import SENSOR_STATE_OFF
|
|
11
11
|
|
|
12
12
|
from homeassistant.components.binary_sensor import (
|
|
13
|
+
DOMAIN as BINARY_SENSOR_DOMAIN,
|
|
13
14
|
BinarySensorDeviceClass,
|
|
14
15
|
BinarySensorEntity,
|
|
15
16
|
BinarySensorEntityDescription,
|
|
@@ -20,6 +21,7 @@ from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
|
|
|
20
21
|
|
|
21
22
|
from .coordinator import AmazonConfigEntry
|
|
22
23
|
from .entity import AmazonEntity
|
|
24
|
+
from .utils import async_update_unique_id
|
|
23
25
|
|
|
24
26
|
# Coordinator is used to centralize the data updates
|
|
25
27
|
PARALLEL_UPDATES = 0
|
|
@@ -31,6 +33,7 @@ class AmazonBinarySensorEntityDescription(BinarySensorEntityDescription):
|
|
|
31
33
|
|
|
32
34
|
is_on_fn: Callable[[AmazonDevice, str], bool]
|
|
33
35
|
is_supported: Callable[[AmazonDevice, str], bool] = lambda device, key: True
|
|
36
|
+
is_available_fn: Callable[[AmazonDevice, str], bool] = lambda device, key: True
|
|
34
37
|
|
|
35
38
|
|
|
36
39
|
BINARY_SENSORS: Final = (
|
|
@@ -41,46 +44,15 @@ BINARY_SENSORS: Final = (
|
|
|
41
44
|
is_on_fn=lambda device, _: device.online,
|
|
42
45
|
),
|
|
43
46
|
AmazonBinarySensorEntityDescription(
|
|
44
|
-
key="
|
|
45
|
-
entity_category=EntityCategory.DIAGNOSTIC,
|
|
46
|
-
translation_key="bluetooth",
|
|
47
|
-
is_on_fn=lambda device, _: device.bluetooth_state,
|
|
48
|
-
),
|
|
49
|
-
AmazonBinarySensorEntityDescription(
|
|
50
|
-
key="babyCryDetectionState",
|
|
51
|
-
translation_key="baby_cry_detection",
|
|
52
|
-
is_on_fn=lambda device, key: (device.sensors[key].value != SENSOR_STATE_OFF),
|
|
53
|
-
is_supported=lambda device, key: device.sensors.get(key) is not None,
|
|
54
|
-
),
|
|
55
|
-
AmazonBinarySensorEntityDescription(
|
|
56
|
-
key="beepingApplianceDetectionState",
|
|
57
|
-
translation_key="beeping_appliance_detection",
|
|
58
|
-
is_on_fn=lambda device, key: (device.sensors[key].value != SENSOR_STATE_OFF),
|
|
59
|
-
is_supported=lambda device, key: device.sensors.get(key) is not None,
|
|
60
|
-
),
|
|
61
|
-
AmazonBinarySensorEntityDescription(
|
|
62
|
-
key="coughDetectionState",
|
|
63
|
-
translation_key="cough_detection",
|
|
64
|
-
is_on_fn=lambda device, key: (device.sensors[key].value != SENSOR_STATE_OFF),
|
|
65
|
-
is_supported=lambda device, key: device.sensors.get(key) is not None,
|
|
66
|
-
),
|
|
67
|
-
AmazonBinarySensorEntityDescription(
|
|
68
|
-
key="dogBarkDetectionState",
|
|
69
|
-
translation_key="dog_bark_detection",
|
|
70
|
-
is_on_fn=lambda device, key: (device.sensors[key].value != SENSOR_STATE_OFF),
|
|
71
|
-
is_supported=lambda device, key: device.sensors.get(key) is not None,
|
|
72
|
-
),
|
|
73
|
-
AmazonBinarySensorEntityDescription(
|
|
74
|
-
key="humanPresenceDetectionState",
|
|
47
|
+
key="detectionState",
|
|
75
48
|
device_class=BinarySensorDeviceClass.MOTION,
|
|
76
|
-
is_on_fn=lambda device, key: (
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
AmazonBinarySensorEntityDescription(
|
|
80
|
-
key="waterSoundsDetectionState",
|
|
81
|
-
translation_key="water_sounds_detection",
|
|
82
|
-
is_on_fn=lambda device, key: (device.sensors[key].value != SENSOR_STATE_OFF),
|
|
49
|
+
is_on_fn=lambda device, key: bool(
|
|
50
|
+
device.sensors[key].value != SENSOR_STATE_OFF
|
|
51
|
+
),
|
|
83
52
|
is_supported=lambda device, key: device.sensors.get(key) is not None,
|
|
53
|
+
is_available_fn=lambda device, key: (
|
|
54
|
+
device.online and device.sensors[key].error is False
|
|
55
|
+
),
|
|
84
56
|
),
|
|
85
57
|
)
|
|
86
58
|
|
|
@@ -94,6 +66,22 @@ async def async_setup_entry(
|
|
|
94
66
|
|
|
95
67
|
coordinator = entry.runtime_data
|
|
96
68
|
|
|
69
|
+
# Replace unique id for "detectionState" binary sensor
|
|
70
|
+
await async_update_unique_id(
|
|
71
|
+
hass,
|
|
72
|
+
coordinator,
|
|
73
|
+
BINARY_SENSOR_DOMAIN,
|
|
74
|
+
"humanPresenceDetectionState",
|
|
75
|
+
"detectionState",
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
async_add_entities(
|
|
79
|
+
AmazonBinarySensorEntity(coordinator, serial_num, sensor_desc)
|
|
80
|
+
for sensor_desc in BINARY_SENSORS
|
|
81
|
+
for serial_num in coordinator.data
|
|
82
|
+
if sensor_desc.is_supported(coordinator.data[serial_num], sensor_desc.key)
|
|
83
|
+
)
|
|
84
|
+
|
|
97
85
|
known_devices: set[str] = set()
|
|
98
86
|
|
|
99
87
|
def _check_device() -> None:
|
|
@@ -125,3 +113,13 @@ class AmazonBinarySensorEntity(AmazonEntity, BinarySensorEntity):
|
|
|
125
113
|
return self.entity_description.is_on_fn(
|
|
126
114
|
self.device, self.entity_description.key
|
|
127
115
|
)
|
|
116
|
+
|
|
117
|
+
@property
|
|
118
|
+
def available(self) -> bool:
|
|
119
|
+
"""Return if entity is available."""
|
|
120
|
+
return (
|
|
121
|
+
self.entity_description.is_available_fn(
|
|
122
|
+
self.device, self.entity_description.key
|
|
123
|
+
)
|
|
124
|
+
and super().available
|
|
125
|
+
)
|
|
@@ -64,7 +64,7 @@ class AmazonDevicesConfigFlow(ConfigFlow, domain=DOMAIN):
|
|
|
64
64
|
data = await validate_input(self.hass, user_input)
|
|
65
65
|
except CannotConnect:
|
|
66
66
|
errors["base"] = "cannot_connect"
|
|
67
|
-
except
|
|
67
|
+
except CannotAuthenticate:
|
|
68
68
|
errors["base"] = "invalid_auth"
|
|
69
69
|
except CannotRetrieveData:
|
|
70
70
|
errors["base"] = "cannot_retrieve_data"
|
|
@@ -112,7 +112,7 @@ class AmazonDevicesConfigFlow(ConfigFlow, domain=DOMAIN):
|
|
|
112
112
|
)
|
|
113
113
|
except CannotConnect:
|
|
114
114
|
errors["base"] = "cannot_connect"
|
|
115
|
-
except
|
|
115
|
+
except CannotAuthenticate:
|
|
116
116
|
errors["base"] = "invalid_auth"
|
|
117
117
|
except CannotRetrieveData:
|
|
118
118
|
errors["base"] = "cannot_retrieve_data"
|
|
@@ -68,7 +68,7 @@ class AmazonDevicesCoordinator(DataUpdateCoordinator[dict[str, AmazonDevice]]):
|
|
|
68
68
|
translation_key="cannot_retrieve_data_with_error",
|
|
69
69
|
translation_placeholders={"error": repr(err)},
|
|
70
70
|
) from err
|
|
71
|
-
except
|
|
71
|
+
except CannotAuthenticate as err:
|
|
72
72
|
raise ConfigEntryAuthFailed(
|
|
73
73
|
translation_domain=DOMAIN,
|
|
74
74
|
translation_key="invalid_auth",
|
|
@@ -60,7 +60,5 @@ def build_device_data(device: AmazonDevice) -> dict[str, Any]:
|
|
|
60
60
|
"online": device.online,
|
|
61
61
|
"serial number": device.serial_number,
|
|
62
62
|
"software version": device.software_version,
|
|
63
|
-
"
|
|
64
|
-
"response style": device.response_style,
|
|
65
|
-
"bluetooth state": device.bluetooth_state,
|
|
63
|
+
"sensors": device.sensors,
|
|
66
64
|
}
|
|
@@ -1,44 +1,4 @@
|
|
|
1
1
|
{
|
|
2
|
-
"entity": {
|
|
3
|
-
"binary_sensor": {
|
|
4
|
-
"bluetooth": {
|
|
5
|
-
"default": "mdi:bluetooth-off",
|
|
6
|
-
"state": {
|
|
7
|
-
"on": "mdi:bluetooth"
|
|
8
|
-
}
|
|
9
|
-
},
|
|
10
|
-
"baby_cry_detection": {
|
|
11
|
-
"default": "mdi:account-voice-off",
|
|
12
|
-
"state": {
|
|
13
|
-
"on": "mdi:account-voice"
|
|
14
|
-
}
|
|
15
|
-
},
|
|
16
|
-
"beeping_appliance_detection": {
|
|
17
|
-
"default": "mdi:bell-off",
|
|
18
|
-
"state": {
|
|
19
|
-
"on": "mdi:bell-ring"
|
|
20
|
-
}
|
|
21
|
-
},
|
|
22
|
-
"cough_detection": {
|
|
23
|
-
"default": "mdi:blur-off",
|
|
24
|
-
"state": {
|
|
25
|
-
"on": "mdi:blur"
|
|
26
|
-
}
|
|
27
|
-
},
|
|
28
|
-
"dog_bark_detection": {
|
|
29
|
-
"default": "mdi:dog-side-off",
|
|
30
|
-
"state": {
|
|
31
|
-
"on": "mdi:dog-side"
|
|
32
|
-
}
|
|
33
|
-
},
|
|
34
|
-
"water_sounds_detection": {
|
|
35
|
-
"default": "mdi:water-pump-off",
|
|
36
|
-
"state": {
|
|
37
|
-
"on": "mdi:water-pump"
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
},
|
|
42
2
|
"services": {
|
|
43
3
|
"send_sound": {
|
|
44
4
|
"service": "mdi:cast-audio"
|
|
@@ -31,6 +31,9 @@ class AmazonSensorEntityDescription(SensorEntityDescription):
|
|
|
31
31
|
"""Amazon Devices sensor entity description."""
|
|
32
32
|
|
|
33
33
|
native_unit_of_measurement_fn: Callable[[AmazonDevice, str], str] | None = None
|
|
34
|
+
is_available_fn: Callable[[AmazonDevice, str], bool] = lambda device, key: (
|
|
35
|
+
device.online and device.sensors[key].error is False
|
|
36
|
+
)
|
|
34
37
|
|
|
35
38
|
|
|
36
39
|
SENSORS: Final = (
|
|
@@ -99,3 +102,13 @@ class AmazonSensorEntity(AmazonEntity, SensorEntity):
|
|
|
99
102
|
def native_value(self) -> StateType:
|
|
100
103
|
"""Return the state of the sensor."""
|
|
101
104
|
return self.device.sensors[self.entity_description.key].value
|
|
105
|
+
|
|
106
|
+
@property
|
|
107
|
+
def available(self) -> bool:
|
|
108
|
+
"""Return if entity is available."""
|
|
109
|
+
return (
|
|
110
|
+
self.entity_description.is_available_fn(
|
|
111
|
+
self.device, self.entity_description.key
|
|
112
|
+
)
|
|
113
|
+
and super().available
|
|
114
|
+
)
|
|
@@ -58,26 +58,6 @@
|
|
|
58
58
|
}
|
|
59
59
|
},
|
|
60
60
|
"entity": {
|
|
61
|
-
"binary_sensor": {
|
|
62
|
-
"bluetooth": {
|
|
63
|
-
"name": "Bluetooth"
|
|
64
|
-
},
|
|
65
|
-
"baby_cry_detection": {
|
|
66
|
-
"name": "Baby crying"
|
|
67
|
-
},
|
|
68
|
-
"beeping_appliance_detection": {
|
|
69
|
-
"name": "Beeping appliance"
|
|
70
|
-
},
|
|
71
|
-
"cough_detection": {
|
|
72
|
-
"name": "Coughing"
|
|
73
|
-
},
|
|
74
|
-
"dog_bark_detection": {
|
|
75
|
-
"name": "Dog barking"
|
|
76
|
-
},
|
|
77
|
-
"water_sounds_detection": {
|
|
78
|
-
"name": "Water sounds"
|
|
79
|
-
}
|
|
80
|
-
},
|
|
81
61
|
"notify": {
|
|
82
62
|
"speak": {
|
|
83
63
|
"name": "Speak"
|