From 562212bb5e7f50f2ba56d457b7da087c69f1dbfe Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 22 Aug 2021 14:20:40 -0500 Subject: [PATCH] Add support for bridge accessory unavailability (#52207) Co-authored-by: Jc2k --- .../components/homekit_controller/__init__.py | 2 +- .../homekit_controller/test_sensor.py | 28 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/homekit_controller/__init__.py b/homeassistant/components/homekit_controller/__init__.py index c14cfbb8a7e..f7c98c66708 100644 --- a/homeassistant/components/homekit_controller/__init__.py +++ b/homeassistant/components/homekit_controller/__init__.py @@ -142,7 +142,7 @@ class HomeKitEntity(Entity): @property def available(self) -> bool: """Return True if entity is available.""" - return self._accessory.available + return self._accessory.available and self.service.available @property def device_info(self): diff --git a/tests/components/homekit_controller/test_sensor.py b/tests/components/homekit_controller/test_sensor.py index 604c83e54f7..f96569551d8 100644 --- a/tests/components/homekit_controller/test_sensor.py +++ b/tests/components/homekit_controller/test_sensor.py @@ -1,6 +1,7 @@ """Basic checks for HomeKit sensor.""" from aiohomekit.model.characteristics import CharacteristicsTypes from aiohomekit.model.services import ServicesTypes +from aiohomekit.protocol.statuscodes import HapStatusCode from homeassistant.const import ( DEVICE_CLASS_BATTERY, @@ -236,3 +237,30 @@ async def test_switch_with_sensor(hass, utcnow): realtime_energy.value = 50 state = await energy_helper.poll_and_get_state() assert state.state == "50" + + +async def test_sensor_unavailable(hass, utcnow): + """Test a sensor becoming unavailable.""" + helper = await setup_test_component(hass, create_switch_with_sensor) + + # Find the energy sensor and mark it as offline + outlet = helper.accessory.services.first(service_type=ServicesTypes.OUTLET) + realtime_energy = outlet[CharacteristicsTypes.Vendor.KOOGEEK_REALTIME_ENERGY] + realtime_energy.status = HapStatusCode.UNABLE_TO_COMMUNICATE + + # Helper will be for the primary entity, which is the outlet. Make a helper for the sensor. + energy_helper = Helper( + hass, + "sensor.testdevice_real_time_energy", + helper.pairing, + helper.accessory, + helper.config_entry, + ) + + # Outlet has non-responsive characteristics so should be unavailable + state = await helper.poll_and_get_state() + assert state.state == "unavailable" + + # Energy sensor has non-responsive characteristics so should be unavailable + state = await energy_helper.poll_and_get_state() + assert state.state == "unavailable"