diff --git a/homeassistant/components/proxmoxve/sensor.py b/homeassistant/components/proxmoxve/sensor.py index 348a9ea8bbb0d7..23c61f75411b93 100644 --- a/homeassistant/components/proxmoxve/sensor.py +++ b/homeassistant/components/proxmoxve/sensor.py @@ -2,7 +2,7 @@ from collections.abc import Callable from dataclasses import dataclass -from datetime import datetime +from datetime import datetime, timedelta from typing import Any from homeassistant.components.sensor import ( @@ -40,14 +40,14 @@ class ProxmoxNodeSensorEntityDescription(SensorEntityDescription): class ProxmoxVMSensorEntityDescription(SensorEntityDescription): """Class to hold Proxmox VM sensor description.""" - value_fn: Callable[[dict[str, Any]], StateType] + value_fn: Callable[[dict[str, Any]], StateType | datetime] @dataclass(frozen=True, kw_only=True) class ProxmoxContainerSensorEntityDescription(SensorEntityDescription): """Class to hold Proxmox container sensor description.""" - value_fn: Callable[[dict[str, Any]], StateType] + value_fn: Callable[[dict[str, Any]], StateType | datetime] @dataclass(frozen=True, kw_only=True) @@ -128,12 +128,15 @@ class ProxmoxStorageSensorEntityDescription(SensorEntityDescription): ProxmoxNodeSensorEntityDescription( key="node_uptime", translation_key="node_uptime", - value_fn=lambda data: data.node["uptime"], - device_class=SensorDeviceClass.DURATION, - native_unit_of_measurement=UnitOfTime.SECONDS, - suggested_unit_of_measurement=UnitOfTime.HOURS, + value_fn=( + lambda data: ( + (dt_util.utcnow() - timedelta(seconds=data.node["uptime"])) + if data.node["uptime"] is not None + else None + ) + ), + device_class=SensorDeviceClass.UPTIME, entity_category=EntityCategory.DIAGNOSTIC, - state_class=SensorStateClass.MEASUREMENT, ), ProxmoxNodeSensorEntityDescription( key="node_status", @@ -218,12 +221,15 @@ class ProxmoxStorageSensorEntityDescription(SensorEntityDescription): ProxmoxVMSensorEntityDescription( key="vm_uptime", translation_key="vm_uptime", - value_fn=lambda data: data["uptime"], - device_class=SensorDeviceClass.DURATION, - native_unit_of_measurement=UnitOfTime.SECONDS, - suggested_unit_of_measurement=UnitOfTime.HOURS, + value_fn=( + lambda data: ( + (dt_util.utcnow() - timedelta(seconds=data["uptime"])) + if data["uptime"] is not None + else None + ) + ), + device_class=SensorDeviceClass.UPTIME, entity_category=EntityCategory.DIAGNOSTIC, - state_class=SensorStateClass.MEASUREMENT, ), ProxmoxVMSensorEntityDescription( key="vm_disk", @@ -327,12 +333,15 @@ class ProxmoxStorageSensorEntityDescription(SensorEntityDescription): ProxmoxContainerSensorEntityDescription( key="container_uptime", translation_key="container_uptime", - value_fn=lambda data: data["uptime"], - device_class=SensorDeviceClass.DURATION, - native_unit_of_measurement=UnitOfTime.SECONDS, - suggested_unit_of_measurement=UnitOfTime.HOURS, + value_fn=( + lambda data: ( + (dt_util.utcnow() - timedelta(seconds=data["uptime"])) + if data["uptime"] is not None + else None + ) + ), + device_class=SensorDeviceClass.UPTIME, entity_category=EntityCategory.DIAGNOSTIC, - state_class=SensorStateClass.MEASUREMENT, ), ProxmoxContainerSensorEntityDescription( key="container_disk", @@ -539,7 +548,7 @@ class ProxmoxVMSensor(ProxmoxVMEntity, SensorEntity): entity_description: ProxmoxVMSensorEntityDescription @property - def native_value(self) -> StateType: + def native_value(self) -> StateType | datetime: """Return the native value of the sensor.""" return self.entity_description.value_fn(self.vm_data) @@ -550,7 +559,7 @@ class ProxmoxContainerSensor(ProxmoxContainerEntity, SensorEntity): entity_description: ProxmoxContainerSensorEntityDescription @property - def native_value(self) -> StateType: + def native_value(self) -> StateType | datetime: """Return the native value of the sensor.""" return self.entity_description.value_fn(self.container_data) diff --git a/tests/components/proxmoxve/snapshots/test_sensor.ambr b/tests/components/proxmoxve/snapshots/test_sensor.ambr index fbb94bac9be818..78cd3abccab1f6 100644 --- a/tests/components/proxmoxve/snapshots/test_sensor.ambr +++ b/tests/components/proxmoxve/snapshots/test_sensor.ambr @@ -597,9 +597,7 @@ None, ]), 'area_id': None, - 'capabilities': dict({ - 'state_class': , - }), + 'capabilities': None, 'config_entry_id': , 'config_subentry_id': , 'device_class': None, @@ -617,14 +615,8 @@ 'name': None, 'object_id_base': 'Uptime', 'options': dict({ - 'sensor': dict({ - 'suggested_display_precision': 2, - }), - 'sensor.private': dict({ - 'suggested_unit_of_measurement': , - }), }), - 'original_device_class': , + 'original_device_class': , 'original_icon': None, 'original_name': 'Uptime', 'platform': 'proxmoxve', @@ -633,23 +625,21 @@ 'supported_features': 0, 'translation_key': 'container_uptime', 'unique_id': '1234_201_container_uptime', - 'unit_of_measurement': , + 'unit_of_measurement': None, }) # --- # name: test_all_entities[sensor.ct_backup_uptime-state] StateSnapshot({ 'attributes': ReadOnlyDict({ - 'device_class': 'duration', + 'device_class': 'uptime', 'friendly_name': 'ct-backup Uptime', - 'state_class': , - 'unit_of_measurement': , }), 'context': , 'entity_id': 'sensor.ct_backup_uptime', 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '12.0', + 'state': '2026-05-03T00:00:00+00:00', }) # --- # name: test_all_entities[sensor.ct_nginx_cpu_usage-entry] @@ -1250,9 +1240,7 @@ None, ]), 'area_id': None, - 'capabilities': dict({ - 'state_class': , - }), + 'capabilities': None, 'config_entry_id': , 'config_subentry_id': , 'device_class': None, @@ -1270,14 +1258,8 @@ 'name': None, 'object_id_base': 'Uptime', 'options': dict({ - 'sensor': dict({ - 'suggested_display_precision': 2, - }), - 'sensor.private': dict({ - 'suggested_unit_of_measurement': , - }), }), - 'original_device_class': , + 'original_device_class': , 'original_icon': None, 'original_name': 'Uptime', 'platform': 'proxmoxve', @@ -1286,23 +1268,21 @@ 'supported_features': 0, 'translation_key': 'container_uptime', 'unique_id': '1234_200_container_uptime', - 'unit_of_measurement': , + 'unit_of_measurement': None, }) # --- # name: test_all_entities[sensor.ct_nginx_uptime-state] StateSnapshot({ 'attributes': ReadOnlyDict({ - 'device_class': 'duration', + 'device_class': 'uptime', 'friendly_name': 'ct-nginx Uptime', - 'state_class': , - 'unit_of_measurement': , }), 'context': , 'entity_id': 'sensor.ct_nginx_uptime', 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '12.0', + 'state': '2026-05-03T00:00:00+00:00', }) # --- # name: test_all_entities[sensor.pve1_backup_duration-entry] @@ -1891,9 +1871,7 @@ None, ]), 'area_id': None, - 'capabilities': dict({ - 'state_class': , - }), + 'capabilities': None, 'config_entry_id': , 'config_subentry_id': , 'device_class': None, @@ -1911,14 +1889,8 @@ 'name': None, 'object_id_base': 'Uptime', 'options': dict({ - 'sensor': dict({ - 'suggested_display_precision': 2, - }), - 'sensor.private': dict({ - 'suggested_unit_of_measurement': , - }), }), - 'original_device_class': , + 'original_device_class': , 'original_icon': None, 'original_name': 'Uptime', 'platform': 'proxmoxve', @@ -1927,23 +1899,21 @@ 'supported_features': 0, 'translation_key': 'node_uptime', 'unique_id': '1234_node/pve1_node_uptime', - 'unit_of_measurement': , + 'unit_of_measurement': None, }) # --- # name: test_all_entities[sensor.pve1_uptime-state] StateSnapshot({ 'attributes': ReadOnlyDict({ - 'device_class': 'duration', + 'device_class': 'uptime', 'friendly_name': 'pve1 Uptime', - 'state_class': , - 'unit_of_measurement': , }), 'context': , 'entity_id': 'sensor.pve1_uptime', 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '24.0', + 'state': '2026-05-02T12:00:00+00:00', }) # --- # name: test_all_entities[sensor.storage_local_available_storage-entry] @@ -3018,9 +2988,7 @@ None, ]), 'area_id': None, - 'capabilities': dict({ - 'state_class': , - }), + 'capabilities': None, 'config_entry_id': , 'config_subentry_id': , 'device_class': None, @@ -3038,14 +3006,8 @@ 'name': None, 'object_id_base': 'Uptime', 'options': dict({ - 'sensor': dict({ - 'suggested_display_precision': 2, - }), - 'sensor.private': dict({ - 'suggested_unit_of_measurement': , - }), }), - 'original_device_class': , + 'original_device_class': , 'original_icon': None, 'original_name': 'Uptime', 'platform': 'proxmoxve', @@ -3054,23 +3016,21 @@ 'supported_features': 0, 'translation_key': 'vm_uptime', 'unique_id': '1234_101_vm_uptime', - 'unit_of_measurement': , + 'unit_of_measurement': None, }) # --- # name: test_all_entities[sensor.vm_db_uptime-state] StateSnapshot({ 'attributes': ReadOnlyDict({ - 'device_class': 'duration', + 'device_class': 'uptime', 'friendly_name': 'vm-db Uptime', - 'state_class': , - 'unit_of_measurement': , }), 'context': , 'entity_id': 'sensor.vm_db_uptime', 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '24.0', + 'state': '2026-05-02T12:00:00+00:00', }) # --- # name: test_all_entities[sensor.vm_web_cpu_usage-entry] @@ -3671,9 +3631,7 @@ None, ]), 'area_id': None, - 'capabilities': dict({ - 'state_class': , - }), + 'capabilities': None, 'config_entry_id': , 'config_subentry_id': , 'device_class': None, @@ -3691,14 +3649,8 @@ 'name': None, 'object_id_base': 'Uptime', 'options': dict({ - 'sensor': dict({ - 'suggested_display_precision': 2, - }), - 'sensor.private': dict({ - 'suggested_unit_of_measurement': , - }), }), - 'original_device_class': , + 'original_device_class': , 'original_icon': None, 'original_name': 'Uptime', 'platform': 'proxmoxve', @@ -3707,22 +3659,20 @@ 'supported_features': 0, 'translation_key': 'vm_uptime', 'unique_id': '1234_100_vm_uptime', - 'unit_of_measurement': , + 'unit_of_measurement': None, }) # --- # name: test_all_entities[sensor.vm_web_uptime-state] StateSnapshot({ 'attributes': ReadOnlyDict({ - 'device_class': 'duration', + 'device_class': 'uptime', 'friendly_name': 'vm-web Uptime', - 'state_class': , - 'unit_of_measurement': , }), 'context': , 'entity_id': 'sensor.vm_web_uptime', 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '24.0', + 'state': '2026-05-02T12:00:00+00:00', }) # --- diff --git a/tests/components/proxmoxve/test_sensor.py b/tests/components/proxmoxve/test_sensor.py index f4fc55cb97e5b1..78a3dc99a21d3b 100644 --- a/tests/components/proxmoxve/test_sensor.py +++ b/tests/components/proxmoxve/test_sensor.py @@ -23,6 +23,7 @@ def enable_all_entities(entity_registry_enabled_by_default: None) -> None: """Make sure all entities are enabled.""" +@pytest.mark.freeze_time("2026-05-03T12:00:00+00:00") async def test_all_entities( hass: HomeAssistant, snapshot: SnapshotAssertion,