diff --git a/homeassistant/components/systemmonitor/coordinator.py b/homeassistant/components/systemmonitor/coordinator.py index ed08d6ed151..670217b570b 100644 --- a/homeassistant/components/systemmonitor/coordinator.py +++ b/homeassistant/components/systemmonitor/coordinator.py @@ -284,6 +284,8 @@ class SystemMonitorCoordinator(TimestampDataUpdateCoordinator[SensorData]): try: battery = self._psutil.sensors_battery() _LOGGER.debug("battery: %s", battery) + except (FileNotFoundError, PermissionError) as err: + _LOGGER.debug("OS error when accessing battery sensors: %s", err) except (AttributeError, FileNotFoundError): _LOGGER.debug("OS does not provide battery sensors") diff --git a/tests/components/systemmonitor/test_sensor.py b/tests/components/systemmonitor/test_sensor.py index 7643d24770b..575cb5fa3bd 100644 --- a/tests/components/systemmonitor/test_sensor.py +++ b/tests/components/systemmonitor/test_sensor.py @@ -389,6 +389,44 @@ async def test_exception_handling_disk_sensor( assert disk_sensor.attributes["unit_of_measurement"] == "%" +@pytest.mark.usefixtures("entity_registry_enabled_by_default") +@pytest.mark.freeze_time("2024-02-24 15:00:00", tz_offset=0) +@pytest.mark.parametrize("exception_class", [FileNotFoundError, PermissionError]) +async def test_exception_handling_battery_sensor( + hass: HomeAssistant, + mock_psutil: Mock, + mock_os: Mock, + freezer: FrozenDateTimeFactory, + mock_config_entry: MockConfigEntry, + caplog: pytest.LogCaptureFixture, + exception_class: type[Exception], +) -> None: + """Test the battery failures.""" + mock_psutil.sensors_battery.side_effect = exception_class( + "[Errno 2] No such file or directory: '/sys/class/power_supply'" + ) + mock_config_entry.add_to_hass(hass) + assert await hass.config_entries.async_setup(mock_config_entry.entry_id) + await hass.async_block_till_done() + + assert (temp_entity := hass.states.get("sensor.system_monitor_battery")) + assert temp_entity.state == STATE_UNAVAILABLE + assert (temp_entity := hass.states.get("sensor.system_monitor_battery_empty")) + assert temp_entity.state == STATE_UNAVAILABLE + + assert "OS error when accessing battery sensors" in caplog.text + + mock_psutil.sensors_battery.side_effect = None + freezer.tick(timedelta(minutes=1)) + async_fire_time_changed(hass) + await hass.async_block_till_done(wait_background_tasks=True) + + assert (temp_entity := hass.states.get("sensor.system_monitor_battery")) + assert temp_entity.state == "93" + assert (temp_entity := hass.states.get("sensor.system_monitor_battery_empty")) + assert temp_entity.state == "2024-02-24T19:38:00+00:00" + + @pytest.mark.usefixtures("entity_registry_enabled_by_default") async def test_cpu_percentage_is_zero_returns_unknown( hass: HomeAssistant,