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.

Files changed (214) hide show
  1. homeassistant/components/accuweather/manifest.json +1 -1
  2. homeassistant/components/accuweather/translations/ga.json +16 -1
  3. homeassistant/components/airos/__init__.py +37 -2
  4. homeassistant/components/airos/config_flow.py +24 -3
  5. homeassistant/components/airos/const.py +5 -0
  6. homeassistant/components/airos/entity.py +8 -3
  7. homeassistant/components/airos/strings.json +12 -0
  8. homeassistant/components/airos/translations/de.json +12 -0
  9. homeassistant/components/airos/translations/en-GB.json +12 -0
  10. homeassistant/components/airos/translations/en.json +12 -0
  11. homeassistant/components/airzone/translations/es.json +10 -0
  12. homeassistant/components/airzone/translations/et.json +10 -0
  13. homeassistant/components/airzone/translations/ga.json +10 -0
  14. homeassistant/components/airzone/translations/pt.json +10 -0
  15. homeassistant/components/alexa_devices/binary_sensor.py +36 -38
  16. homeassistant/components/alexa_devices/config_flow.py +2 -2
  17. homeassistant/components/alexa_devices/coordinator.py +1 -1
  18. homeassistant/components/alexa_devices/diagnostics.py +1 -3
  19. homeassistant/components/alexa_devices/icons.json +0 -40
  20. homeassistant/components/alexa_devices/manifest.json +1 -1
  21. homeassistant/components/alexa_devices/sensor.py +13 -0
  22. homeassistant/components/alexa_devices/strings.json +0 -20
  23. homeassistant/components/alexa_devices/switch.py +27 -7
  24. homeassistant/components/alexa_devices/translations/bg.json +0 -13
  25. homeassistant/components/alexa_devices/translations/cs.json +0 -20
  26. homeassistant/components/alexa_devices/translations/de.json +0 -20
  27. homeassistant/components/alexa_devices/translations/el.json +0 -20
  28. homeassistant/components/alexa_devices/translations/en-GB.json +0 -20
  29. homeassistant/components/alexa_devices/translations/en.json +0 -20
  30. homeassistant/components/alexa_devices/translations/es.json +0 -20
  31. homeassistant/components/alexa_devices/translations/et.json +0 -20
  32. homeassistant/components/alexa_devices/translations/ga.json +0 -20
  33. homeassistant/components/alexa_devices/translations/he.json +0 -7
  34. homeassistant/components/alexa_devices/translations/hu.json +0 -20
  35. homeassistant/components/alexa_devices/translations/it.json +0 -20
  36. homeassistant/components/alexa_devices/translations/ja.json +0 -19
  37. homeassistant/components/alexa_devices/translations/lt.json +0 -20
  38. homeassistant/components/alexa_devices/translations/mk.json +0 -14
  39. homeassistant/components/alexa_devices/translations/nl.json +0 -20
  40. homeassistant/components/alexa_devices/translations/pl.json +0 -5
  41. homeassistant/components/alexa_devices/translations/pt.json +0 -20
  42. homeassistant/components/alexa_devices/translations/ru.json +0 -5
  43. homeassistant/components/alexa_devices/translations/sk.json +0 -20
  44. homeassistant/components/alexa_devices/translations/sv.json +0 -20
  45. homeassistant/components/alexa_devices/translations/tr.json +0 -5
  46. homeassistant/components/alexa_devices/translations/zh-Hans.json +0 -20
  47. homeassistant/components/alexa_devices/translations/zh-Hant.json +0 -20
  48. homeassistant/components/alexa_devices/utils.py +24 -1
  49. homeassistant/components/assist_pipeline/pipeline.py +43 -18
  50. homeassistant/components/assist_pipeline/translations/nl.json +1 -0
  51. homeassistant/components/assist_pipeline/translations/sv.json +1 -0
  52. homeassistant/components/blue_current/translations/es.json +44 -0
  53. homeassistant/components/blue_current/translations/et.json +44 -0
  54. homeassistant/components/blue_current/translations/ga.json +44 -0
  55. homeassistant/components/blue_current/translations/pt.json +44 -0
  56. homeassistant/components/cloud/translations/sk.json +1 -1
  57. homeassistant/components/comelit/config_flow.py +8 -4
  58. homeassistant/components/cync/translations/es.json +32 -0
  59. homeassistant/components/cync/translations/et.json +32 -0
  60. homeassistant/components/cync/translations/ga.json +32 -0
  61. homeassistant/components/cync/translations/pt.json +32 -0
  62. homeassistant/components/cync/translations/ru.json +32 -0
  63. homeassistant/components/ecovacs/translations/es.json +7 -1
  64. homeassistant/components/ecovacs/translations/et.json +7 -1
  65. homeassistant/components/ecovacs/translations/ga.json +6 -1
  66. homeassistant/components/ecovacs/translations/pt.json +4 -0
  67. homeassistant/components/ecovacs/translations/ru.json +4 -0
  68. homeassistant/components/edl21/translations/de.json +1 -1
  69. homeassistant/components/ekeybionyx/translations/es.json +66 -0
  70. homeassistant/components/ekeybionyx/translations/et.json +66 -0
  71. homeassistant/components/ekeybionyx/translations/ga.json +66 -0
  72. homeassistant/components/ekeybionyx/translations/pt.json +66 -0
  73. homeassistant/components/elvia/translations/de.json +3 -3
  74. homeassistant/components/esphome/manager.py +1 -1
  75. homeassistant/components/esphome/manifest.json +1 -1
  76. homeassistant/components/esphome/translations/nl.json +1 -1
  77. homeassistant/components/esphome/translations/sv.json +1 -1
  78. homeassistant/components/ezviz/entity.py +12 -6
  79. homeassistant/components/file/translations/es.json +31 -0
  80. homeassistant/components/file/translations/et.json +31 -0
  81. homeassistant/components/file/translations/ga.json +31 -0
  82. homeassistant/components/file/translations/pt.json +31 -0
  83. homeassistant/components/file/translations/ru.json +31 -0
  84. homeassistant/components/frontend/manifest.json +1 -1
  85. homeassistant/components/geniushub/entity.py +4 -4
  86. homeassistant/components/google_generative_ai_conversation/translations/ga.json +6 -0
  87. homeassistant/components/habitica/translations/ga.json +24 -0
  88. homeassistant/components/hassio/translations/es.json +4 -0
  89. homeassistant/components/hassio/translations/et.json +4 -0
  90. homeassistant/components/hassio/translations/ga.json +4 -0
  91. homeassistant/components/hassio/translations/pt.json +4 -0
  92. homeassistant/components/hassio/translations/ru.json +4 -0
  93. homeassistant/components/here_travel_time/translations/es.json +6 -0
  94. homeassistant/components/here_travel_time/translations/et.json +6 -0
  95. homeassistant/components/here_travel_time/translations/ga.json +6 -0
  96. homeassistant/components/here_travel_time/translations/pt.json +6 -0
  97. homeassistant/components/irm_kmi/translations/ga.json +50 -0
  98. homeassistant/components/lamarzocco/__init__.py +1 -1
  99. homeassistant/components/lamarzocco/coordinator.py +10 -2
  100. homeassistant/components/lamarzocco/manifest.json +1 -1
  101. homeassistant/components/letpot/translations/es.json +10 -0
  102. homeassistant/components/letpot/translations/et.json +10 -0
  103. homeassistant/components/letpot/translations/ga.json +9 -0
  104. homeassistant/components/letpot/translations/pt.json +10 -0
  105. homeassistant/components/lg_thinq/translations/ga.json +9 -0
  106. homeassistant/components/logbook/translations/es.json +6 -1
  107. homeassistant/components/logbook/translations/et.json +6 -1
  108. homeassistant/components/logbook/translations/pl.json +3 -1
  109. homeassistant/components/logbook/translations/pt.json +6 -1
  110. homeassistant/components/logbook/translations/ru.json +6 -1
  111. homeassistant/components/mastodon/translations/ga.json +4 -0
  112. homeassistant/components/matter/translations/es.json +3 -0
  113. homeassistant/components/matter/translations/et.json +3 -0
  114. homeassistant/components/matter/translations/ga.json +3 -0
  115. homeassistant/components/matter/translations/pt.json +3 -0
  116. homeassistant/components/matter/translations/ru.json +3 -0
  117. homeassistant/components/miele/translations/ga.json +1 -0
  118. homeassistant/components/mqtt/translations/es.json +19 -0
  119. homeassistant/components/mqtt/translations/et.json +19 -0
  120. homeassistant/components/mqtt/translations/ga.json +26 -1
  121. homeassistant/components/mqtt/translations/pt.json +19 -0
  122. homeassistant/components/mqtt/translations/ru.json +19 -0
  123. homeassistant/components/mvglive/manifest.json +2 -4
  124. homeassistant/components/mvglive/sensor.py +116 -86
  125. homeassistant/components/nina/strings.json +2 -2
  126. homeassistant/components/nina/translations/ca.json +0 -2
  127. homeassistant/components/nina/translations/cs.json +0 -2
  128. homeassistant/components/nina/translations/de.json +3 -3
  129. homeassistant/components/nina/translations/el.json +0 -1
  130. homeassistant/components/nina/translations/en-GB.json +3 -3
  131. homeassistant/components/nina/translations/en.json +3 -3
  132. homeassistant/components/nina/translations/es.json +0 -2
  133. homeassistant/components/nina/translations/et.json +0 -2
  134. homeassistant/components/nina/translations/fi.json +0 -2
  135. homeassistant/components/nina/translations/ga.json +0 -2
  136. homeassistant/components/nina/translations/hu.json +0 -2
  137. homeassistant/components/nina/translations/id.json +0 -1
  138. homeassistant/components/nina/translations/it.json +0 -2
  139. homeassistant/components/nina/translations/ja.json +0 -2
  140. homeassistant/components/nina/translations/ko.json +0 -2
  141. homeassistant/components/nina/translations/lt.json +0 -2
  142. homeassistant/components/nina/translations/nl.json +0 -2
  143. homeassistant/components/nina/translations/pt-BR.json +0 -1
  144. homeassistant/components/nina/translations/pt.json +0 -2
  145. homeassistant/components/nina/translations/ro.json +0 -1
  146. homeassistant/components/nina/translations/ru.json +0 -2
  147. homeassistant/components/nina/translations/sk.json +0 -2
  148. homeassistant/components/nina/translations/sv.json +0 -2
  149. homeassistant/components/nina/translations/tr.json +0 -2
  150. homeassistant/components/nina/translations/uk.json +0 -1
  151. homeassistant/components/nina/translations/zh-Hans.json +0 -2
  152. homeassistant/components/nina/translations/zh-Hant.json +0 -2
  153. homeassistant/components/nordpool/translations/ga.json +6 -0
  154. homeassistant/components/pooldose/translations/ga.json +8 -1
  155. homeassistant/components/portainer/__init__.py +4 -3
  156. homeassistant/components/portainer/config_flow.py +3 -2
  157. homeassistant/components/portainer/strings.json +4 -2
  158. homeassistant/components/portainer/translations/de.json +4 -2
  159. homeassistant/components/portainer/translations/en-GB.json +4 -2
  160. homeassistant/components/portainer/translations/en.json +4 -2
  161. homeassistant/components/profiler/translations/es.json +4 -0
  162. homeassistant/components/profiler/translations/et.json +4 -0
  163. homeassistant/components/profiler/translations/ga.json +4 -0
  164. homeassistant/components/profiler/translations/pt.json +4 -0
  165. homeassistant/components/route_b_smart_meter/translations/es.json +42 -0
  166. homeassistant/components/route_b_smart_meter/translations/et.json +42 -0
  167. homeassistant/components/route_b_smart_meter/translations/ga.json +42 -0
  168. homeassistant/components/route_b_smart_meter/translations/pt.json +42 -0
  169. homeassistant/components/russound_rio/manifest.json +1 -1
  170. homeassistant/components/satel_integra/translations/et.json +1 -0
  171. homeassistant/components/shelly/translations/pl.json +4 -0
  172. homeassistant/components/smartthings/manifest.json +1 -1
  173. homeassistant/components/smartthings/translations/es.json +21 -0
  174. homeassistant/components/smartthings/translations/et.json +21 -0
  175. homeassistant/components/smartthings/translations/ga.json +15 -0
  176. homeassistant/components/smartthings/translations/pt.json +21 -0
  177. homeassistant/components/thread/config_flow.py +11 -3
  178. homeassistant/components/thread/manifest.json +1 -0
  179. homeassistant/components/tolo/translations/es.json +2 -1
  180. homeassistant/components/tolo/translations/ga.json +2 -1
  181. homeassistant/components/tuya/translations/es.json +9 -0
  182. homeassistant/components/tuya/translations/et.json +9 -0
  183. homeassistant/components/tuya/translations/ga.json +9 -0
  184. homeassistant/components/tuya/translations/pt.json +9 -0
  185. homeassistant/components/usage_prediction/translations/et.json +3 -0
  186. homeassistant/components/valve/translations/pl.json +2 -1
  187. homeassistant/components/vesync/fan.py +3 -1
  188. homeassistant/components/voip/translations/nl.json +1 -1
  189. homeassistant/components/voip/translations/sv.json +1 -1
  190. homeassistant/components/volvooncall/translations/ga.json +18 -1
  191. homeassistant/components/wyoming/translations/nl.json +1 -1
  192. homeassistant/components/wyoming/translations/sv.json +1 -1
  193. homeassistant/components/zha/config_flow.py +37 -21
  194. homeassistant/components/zha/manifest.json +1 -1
  195. homeassistant/components/zha/translations/es.json +81 -3
  196. homeassistant/components/zha/translations/et.json +78 -0
  197. homeassistant/components/zha/translations/ga.json +74 -0
  198. homeassistant/components/zha/translations/pt.json +80 -2
  199. homeassistant/components/zha/translations/ru.json +8 -2
  200. homeassistant/components/zwave_js/config_flow.py +30 -11
  201. homeassistant/components/zwave_js/translations/es.json +1 -0
  202. homeassistant/components/zwave_js/translations/et.json +1 -0
  203. homeassistant/components/zwave_js/translations/ga.json +1 -0
  204. homeassistant/components/zwave_js/translations/pt.json +1 -0
  205. homeassistant/const.py +1 -1
  206. homeassistant/generated/integrations.json +2 -1
  207. homeassistant/package_constraints.txt +1 -1
  208. {homeassistant-2025.10.0b1.dist-info → homeassistant-2025.10.0b4.dist-info}/METADATA +1 -1
  209. {homeassistant-2025.10.0b1.dist-info → homeassistant-2025.10.0b4.dist-info}/RECORD +214 -199
  210. {homeassistant-2025.10.0b1.dist-info → homeassistant-2025.10.0b4.dist-info}/WHEEL +0 -0
  211. {homeassistant-2025.10.0b1.dist-info → homeassistant-2025.10.0b4.dist-info}/entry_points.txt +0 -0
  212. {homeassistant-2025.10.0b1.dist-info → homeassistant-2025.10.0b4.dist-info}/licenses/LICENSE.md +0 -0
  213. {homeassistant-2025.10.0b1.dist-info → homeassistant-2025.10.0b4.dist-info}/licenses/homeassistant/backports/LICENSE.Python +0 -0
  214. {homeassistant-2025.10.0b1.dist-info → homeassistant-2025.10.0b4.dist-info}/top_level.txt +0 -0
@@ -7,5 +7,5 @@
7
7
  "integration_type": "service",
8
8
  "iot_class": "cloud_polling",
9
9
  "loggers": ["accuweather"],
10
- "requirements": ["accuweather==4.2.1"]
10
+ "requirements": ["accuweather==4.2.2"]
11
11
  }
@@ -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 CONF_HOST, CONF_PASSWORD, CONF_USERNAME, Platform
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(hass, verify_ssl=False)
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 CONF_HOST, CONF_PASSWORD, CONF_USERNAME
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(self.hass, verify_ssl=False)
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()
@@ -7,3 +7,8 @@ DOMAIN = "airos"
7
7
  SCAN_INTERVAL = timedelta(minutes=1)
8
8
 
9
9
  MANUFACTURER = "Ubiquiti"
10
+
11
+ DEFAULT_VERIFY_SSL = False
12
+ DEFAULT_SSL = True
13
+
14
+ SECTION_ADVANCED_SETTINGS = "advanced_settings"
@@ -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"https://{coordinator.config_entry.data[CONF_HOST]}"
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="bluetooth",
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: (device.sensors[key].value != SENSOR_STATE_OFF),
77
- is_supported=lambda device, key: device.sensors.get(key) is not None,
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 (CannotAuthenticate, TypeError):
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 (CannotAuthenticate, TypeError):
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 (CannotAuthenticate, TypeError) as err:
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
- "do not disturb": device.do_not_disturb,
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"
@@ -8,5 +8,5 @@
8
8
  "iot_class": "cloud_polling",
9
9
  "loggers": ["aioamazondevices"],
10
10
  "quality_scale": "platinum",
11
- "requirements": ["aioamazondevices==6.0.0"]
11
+ "requirements": ["aioamazondevices==6.2.6"]
12
12
  }
@@ -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"