mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 13:17:32 +00:00
Fix cpu percentage in System Monitor (#110268)
* Fix cpu percentage in System Monitor * Tests
This commit is contained in:
parent
326da81656
commit
7ce1ba9304
@ -1,4 +1,5 @@
|
|||||||
"""DataUpdateCoordinators for the System monitor integration."""
|
"""DataUpdateCoordinators for the System monitor integration."""
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from abc import abstractmethod
|
from abc import abstractmethod
|
||||||
@ -43,7 +44,8 @@ dataT = TypeVar(
|
|||||||
| sswap
|
| sswap
|
||||||
| VirtualMemory
|
| VirtualMemory
|
||||||
| tuple[float, float, float]
|
| tuple[float, float, float]
|
||||||
| sdiskusage,
|
| sdiskusage
|
||||||
|
| None,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -130,12 +132,15 @@ class SystemMonitorLoadCoordinator(MonitorCoordinator[tuple[float, float, float]
|
|||||||
return os.getloadavg()
|
return os.getloadavg()
|
||||||
|
|
||||||
|
|
||||||
class SystemMonitorProcessorCoordinator(MonitorCoordinator[float]):
|
class SystemMonitorProcessorCoordinator(MonitorCoordinator[float | None]):
|
||||||
"""A System monitor Processor Data Update Coordinator."""
|
"""A System monitor Processor Data Update Coordinator."""
|
||||||
|
|
||||||
def update_data(self) -> float:
|
def update_data(self) -> float | None:
|
||||||
"""Fetch data."""
|
"""Fetch data."""
|
||||||
return psutil.cpu_percent(interval=None)
|
cpu_percent = psutil.cpu_percent(interval=None)
|
||||||
|
if cpu_percent > 0.0:
|
||||||
|
return cpu_percent
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
class SystemMonitorBootTimeCoordinator(MonitorCoordinator[datetime]):
|
class SystemMonitorBootTimeCoordinator(MonitorCoordinator[datetime]):
|
||||||
|
@ -346,7 +346,9 @@ SENSOR_TYPES: dict[str, SysMonitorSensorEntityDescription[Any]] = {
|
|||||||
native_unit_of_measurement=PERCENTAGE,
|
native_unit_of_measurement=PERCENTAGE,
|
||||||
icon=get_cpu_icon(),
|
icon=get_cpu_icon(),
|
||||||
state_class=SensorStateClass.MEASUREMENT,
|
state_class=SensorStateClass.MEASUREMENT,
|
||||||
value_fn=lambda entity: round(entity.coordinator.data),
|
value_fn=lambda entity: (
|
||||||
|
round(entity.coordinator.data) if entity.coordinator.data else None
|
||||||
|
),
|
||||||
),
|
),
|
||||||
"processor_temperature": SysMonitorSensorEntityDescription[
|
"processor_temperature": SysMonitorSensorEntityDescription[
|
||||||
dict[str, list[shwtemp]]
|
dict[str, list[shwtemp]]
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
"""Test System Monitor sensor."""
|
"""Test System Monitor sensor."""
|
||||||
|
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
import socket
|
import socket
|
||||||
from unittest.mock import Mock, patch
|
from unittest.mock import Mock, patch
|
||||||
@ -529,3 +530,37 @@ async def test_exception_handling_disk_sensor(
|
|||||||
assert disk_sensor is not None
|
assert disk_sensor is not None
|
||||||
assert disk_sensor.state == "70.0"
|
assert disk_sensor.state == "70.0"
|
||||||
assert disk_sensor.attributes["unit_of_measurement"] == "%"
|
assert disk_sensor.attributes["unit_of_measurement"] == "%"
|
||||||
|
|
||||||
|
|
||||||
|
async def test_cpu_percentage_is_zero_returns_unknown(
|
||||||
|
hass: HomeAssistant,
|
||||||
|
entity_registry_enabled_by_default: None,
|
||||||
|
mock_psutil: Mock,
|
||||||
|
mock_added_config_entry: ConfigEntry,
|
||||||
|
caplog: pytest.LogCaptureFixture,
|
||||||
|
freezer: FrozenDateTimeFactory,
|
||||||
|
) -> None:
|
||||||
|
"""Test the sensor."""
|
||||||
|
cpu_sensor = hass.states.get("sensor.system_monitor_processor_use")
|
||||||
|
assert cpu_sensor is not None
|
||||||
|
assert cpu_sensor.state == "10"
|
||||||
|
|
||||||
|
mock_psutil.cpu_percent.return_value = 0.0
|
||||||
|
|
||||||
|
freezer.tick(timedelta(minutes=1))
|
||||||
|
async_fire_time_changed(hass)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
cpu_sensor = hass.states.get("sensor.system_monitor_processor_use")
|
||||||
|
assert cpu_sensor is not None
|
||||||
|
assert cpu_sensor.state == STATE_UNKNOWN
|
||||||
|
|
||||||
|
mock_psutil.cpu_percent.return_value = 15.0
|
||||||
|
|
||||||
|
freezer.tick(timedelta(minutes=1))
|
||||||
|
async_fire_time_changed(hass)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
cpu_sensor = hass.states.get("sensor.system_monitor_processor_use")
|
||||||
|
assert cpu_sensor is not None
|
||||||
|
assert cpu_sensor.state == "15"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user