Skip to content

Commit e2b46be

Browse files
authored
fix: restore Echo-connected devices (#2958)
Fixes #2956, #2952, #2948, #2945, #2931, #2946
1 parent fdc3a22 commit e2b46be

File tree

5 files changed

+312
-46
lines changed

5 files changed

+312
-46
lines changed

custom_components/alexa_media/__init__.py

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,9 @@ async def async_update_data() -> Optional[AlexaEntityData]:
433433
].values()
434434
auth_info = hass.data[DATA_ALEXAMEDIA]["accounts"][email].get("auth_info")
435435
new_devices = hass.data[DATA_ALEXAMEDIA]["accounts"][email]["new_devices"]
436-
should_get_network = False # get_network_details is deprecated
436+
should_get_network = hass.data[DATA_ALEXAMEDIA]["accounts"][email][
437+
"should_get_network"
438+
]
437439
extended_entity_discovery = hass.data[DATA_ALEXAMEDIA]["accounts"][email][
438440
"options"
439441
].get(CONF_EXTENDED_ENTITY_DISCOVERY)
@@ -484,6 +486,9 @@ async def async_update_data() -> Optional[AlexaEntityData]:
484486
if entities_to_monitor:
485487
tasks.append(get_entity_data(login_obj, list(entities_to_monitor)))
486488

489+
if should_get_network:
490+
tasks.append(AlexaAPI.get_network_details(login_obj))
491+
487492
try:
488493
# Note: asyncio.TimeoutError and aiohttp.ClientError are already
489494
# handled by the data update coordinator.
@@ -496,7 +501,34 @@ async def async_update_data() -> Optional[AlexaEntityData]:
496501
*optional_task_results,
497502
) = await asyncio.gather(*tasks)
498503

499-
if entities_to_monitor:
504+
if should_get_network:
505+
_LOGGER.debug(
506+
"Alexa entities have been loaded. Prepared for discovery."
507+
)
508+
api_devices = optional_task_results.pop()
509+
if not api_devices:
510+
_LOGGER.warning(
511+
"%s: Alexa API returned an unexpected response while getting connected devices.",
512+
hide_email(email),
513+
)
514+
alexa_entities = parse_alexa_entities(api_devices)
515+
hass.data[DATA_ALEXAMEDIA]["accounts"][email]["devices"].update(
516+
alexa_entities
517+
)
518+
hass.data[DATA_ALEXAMEDIA]["accounts"][email][
519+
"should_get_network"
520+
] = False
521+
522+
# First run is a special case. Get the state of all entities(including disabled)
523+
# This ensures all entities have state during startup without needing to request coordinator refresh
524+
for type_of_entity, entities in alexa_entities.items():
525+
if type_of_entity == "guard" or extended_entity_discovery:
526+
for entity in entities:
527+
entities_to_monitor.add(entity.get("id"))
528+
entity_state = await get_entity_data(
529+
login_obj, list(entities_to_monitor)
530+
)
531+
elif entities_to_monitor:
500532
entity_state = optional_task_results.pop()
501533

502534
if new_devices:

custom_components/alexa_media/alexa_entity.py

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -263,20 +263,19 @@ def parse_alexa_entities(network_details: Optional[dict[str, Any]]) -> AlexaEnti
263263
air_quality_sensors = []
264264
contact_sensors = []
265265
switches = []
266-
location_details = (
267-
(network_details or {}).get("locationDetails", {}).get("locationDetails", {})
268-
)
269266

270-
appliances = {}
271-
for location in location_details.values():
272-
amazon_bridge_details = location["amazonBridgeDetails"]["amazonBridgeDetails"]
273-
for bridge in amazon_bridge_details.values():
274-
appliance_details = bridge["applianceDetails"]["applianceDetails"]
275-
for appliance in appliance_details.values():
276-
appliances[appliance["applianceId"]] = appliance
267+
if not network_details:
268+
return {
269+
"light": lights,
270+
"guard": guards,
271+
"temperature": temperature_sensors,
272+
"air_quality": air_quality_sensors,
273+
"binary_sensor": contact_sensors,
274+
"smart_switch": switches,
275+
}
277276

278-
for appliance in appliances.values():
279-
device_bridge = get_device_bridge(appliance, appliances)
277+
for appliance in network_details:
278+
device_bridge = get_device_bridge(appliance, network_details)
280279
if is_known_ha_bridge(device_bridge):
281280
_LOGGER.debug("Found Home Assistant bridge, skipping %s", appliance)
282281
continue
@@ -518,7 +517,7 @@ def is_cap_state_still_acceptable(
518517
if formatted_time_of_sample:
519518
try:
520519
time_of_sample = datetime.strptime(
521-
formatted_time_of_sample, "%Y-%m-%dT%H:%M:%S.%f%z"
520+
formatted_time_of_sample, "%Y-%m-%dT%H:%M:%S%z"
522521
)
523522
return time_of_sample >= since
524523
except ValueError:

custom_components/alexa_media/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@
88
"iot_class": "cloud_polling",
99
"issue_tracker": "https://github.com/alandtse/alexa_media_player/issues",
1010
"loggers": ["alexapy", "authcaptureproxy"],
11-
"requirements": ["alexapy==1.29.5", "packaging>=20.3", "wrapt>=1.14.0"],
11+
"requirements": ["alexapy==1.29.7", "packaging>=20.3", "wrapt>=1.14.0"],
1212
"version": "5.7.3"
1313
}

0 commit comments

Comments
 (0)