From 7e317bed3e51a0c9d6581b7008639c1f522b8b73 Mon Sep 17 00:00:00 2001 From: Matt Zimmerman Date: Thu, 7 Apr 2022 20:34:00 -0700 Subject: [PATCH] [powerwall] Skip backup reserve sensor if data is unavailable (#69637) --- .../components/powerwall/__init__.py | 7 ++++- homeassistant/components/powerwall/models.py | 2 +- homeassistant/components/powerwall/sensor.py | 8 ++++-- tests/components/powerwall/test_sensor.py | 27 ++++++++++++++++++- 4 files changed, 39 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/powerwall/__init__.py b/homeassistant/components/powerwall/__init__.py index d2850330b7ab5c..6537ea249c19d7 100644 --- a/homeassistant/components/powerwall/__init__.py +++ b/homeassistant/components/powerwall/__init__.py @@ -223,13 +223,18 @@ def call_base_info(power_wall: Powerwall, host: str) -> PowerwallBaseInfo: def _fetch_powerwall_data(power_wall: Powerwall) -> PowerwallData: """Process and update powerwall data.""" + try: + backup_reserve = power_wall.get_backup_reserve_percentage() + except MissingAttributeError: + backup_reserve = None + return PowerwallData( charge=power_wall.get_charge(), site_master=power_wall.get_sitemaster(), meters=power_wall.get_meters(), grid_services_active=power_wall.is_grid_services_active(), grid_status=power_wall.get_grid_status(), - backup_reserve=power_wall.get_backup_reserve_percentage(), + backup_reserve=backup_reserve, ) diff --git a/homeassistant/components/powerwall/models.py b/homeassistant/components/powerwall/models.py index cb9b84be16a026..6f8ccb98459d4b 100644 --- a/homeassistant/components/powerwall/models.py +++ b/homeassistant/components/powerwall/models.py @@ -38,7 +38,7 @@ class PowerwallData: meters: MetersAggregates grid_services_active: bool grid_status: GridStatus - backup_reserve: float + backup_reserve: float | None class PowerwallRuntimeData(TypedDict): diff --git a/homeassistant/components/powerwall/sensor.py b/homeassistant/components/powerwall/sensor.py index 9e66c61a2bb7ca..573dcab6bccadf 100644 --- a/homeassistant/components/powerwall/sensor.py +++ b/homeassistant/components/powerwall/sensor.py @@ -117,9 +117,11 @@ async def async_setup_entry( data: PowerwallData = coordinator.data entities: list[PowerWallEntity] = [ PowerWallChargeSensor(powerwall_data), - PowerWallBackupReserveSensor(powerwall_data), ] + if data.backup_reserve is not None: + entities.append(PowerWallBackupReserveSensor(powerwall_data)) + for meter in data.meters.meters: entities.append(PowerWallExportSensor(powerwall_data, meter)) entities.append(PowerWallImportSensor(powerwall_data, meter)) @@ -190,8 +192,10 @@ def unique_id(self) -> str: return f"{self.base_unique_id}_backup_reserve" @property - def native_value(self) -> int: + def native_value(self) -> int | None: """Get the current value in percentage.""" + if self.data.backup_reserve is None: + return None return round(self.data.backup_reserve) diff --git a/tests/components/powerwall/test_sensor.py b/tests/components/powerwall/test_sensor.py index c40d88fb252477..f904f587ed3b2c 100644 --- a/tests/components/powerwall/test_sensor.py +++ b/tests/components/powerwall/test_sensor.py @@ -1,5 +1,7 @@ """The sensor tests for the powerwall platform.""" -from unittest.mock import patch +from unittest.mock import Mock, patch + +from tesla_powerwall.error import MissingAttributeError from homeassistant.components.powerwall.const import DOMAIN from homeassistant.components.sensor import ATTR_STATE_CLASS @@ -112,3 +114,26 @@ async def test_sensors(hass, entity_registry_enabled_by_default): # HA changes the implementation and a new one appears for key, value in expected_attributes.items(): assert state.attributes[key] == value + + +async def test_sensor_backup_reserve_unavailable(hass): + """Confirm that backup reserve sensor is not added if data is unavailable from the device.""" + + mock_powerwall = await _mock_powerwall_with_fixtures(hass) + mock_powerwall.get_backup_reserve_percentage = Mock( + side_effect=MissingAttributeError(Mock(), "backup_reserve_percent", "operation") + ) + + config_entry = MockConfigEntry(domain=DOMAIN, data={CONF_IP_ADDRESS: "1.2.3.4"}) + config_entry.add_to_hass(hass) + with patch( + "homeassistant.components.powerwall.config_flow.Powerwall", + return_value=mock_powerwall, + ), patch( + "homeassistant.components.powerwall.Powerwall", return_value=mock_powerwall + ): + assert await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() + + state = hass.states.get("sensor.powerwall_backup_reserve") + assert state is None