From ae1bedd94a3a320784149ece2f46420fbc1eddc9 Mon Sep 17 00:00:00 2001 From: Manu <4445816+tr4nt0r@users.noreply.github.com> Date: Wed, 11 Feb 2026 22:09:21 +0100 Subject: [PATCH] Add uptime ratio and avg. response time sensors to Uptime Kuma (#162785) --- .../components/uptime_kuma/icons.json | 18 + .../components/uptime_kuma/sensor.py | 78 +- .../components/uptime_kuma/strings.json | 18 + tests/components/uptime_kuma/conftest.py | 24 +- .../snapshots/test_diagnostics.ambr | 30 +- .../uptime_kuma/snapshots/test_sensor.ambr | 990 ++++++++++++++++++ 6 files changed, 1139 insertions(+), 19 deletions(-) diff --git a/homeassistant/components/uptime_kuma/icons.json b/homeassistant/components/uptime_kuma/icons.json index 982149b91e1..9dd3a34f9d7 100644 --- a/homeassistant/components/uptime_kuma/icons.json +++ b/homeassistant/components/uptime_kuma/icons.json @@ -1,6 +1,15 @@ { "entity": { "sensor": { + "avg_response_time_1d": { + "default": "mdi:timeline-clock-outline" + }, + "avg_response_time_30d": { + "default": "mdi:timeline-clock-outline" + }, + "avg_response_time_365d": { + "default": "mdi:timeline-clock-outline" + }, "cert_days_remaining": { "default": "mdi:certificate" }, @@ -24,6 +33,15 @@ "type": { "default": "mdi:protocol" }, + "uptime_1d": { + "default": "mdi:history" + }, + "uptime_30d": { + "default": "mdi:history" + }, + "uptime_365d": { + "default": "mdi:history" + }, "url": { "default": "mdi:web" } diff --git a/homeassistant/components/uptime_kuma/sensor.py b/homeassistant/components/uptime_kuma/sensor.py index b499c67da16..6c183cde872 100644 --- a/homeassistant/components/uptime_kuma/sensor.py +++ b/homeassistant/components/uptime_kuma/sensor.py @@ -14,7 +14,7 @@ from homeassistant.components.sensor import ( SensorEntity, SensorEntityDescription, ) -from homeassistant.const import CONF_URL, EntityCategory, UnitOfTime +from homeassistant.const import CONF_URL, PERCENTAGE, EntityCategory, UnitOfTime from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback @@ -37,6 +37,12 @@ class UptimeKumaSensor(StrEnum): URL = "url" HOSTNAME = "hostname" PORT = "port" + UPTIME_RATIO_1D = "uptime_1d" + UPTIME_RATIO_30D = "uptime_30d" + UPTIME_RATIO_365D = "uptime_365d" + AVG_RESPONSE_TIME_1D = "avg_response_time_1d" + AVG_RESPONSE_TIME_30D = "avg_response_time_30d" + AVG_RESPONSE_TIME_365D = "avg_response_time_365d" @dataclass(kw_only=True, frozen=True) @@ -104,6 +110,76 @@ SENSOR_DESCRIPTIONS: tuple[UptimeKumaSensorEntityDescription, ...] = ( value_fn=lambda m: m.monitor_port, create_entity=lambda t: t in HAS_PORT, ), + UptimeKumaSensorEntityDescription( + key=UptimeKumaSensor.PORT, + translation_key=UptimeKumaSensor.PORT, + entity_category=EntityCategory.DIAGNOSTIC, + value_fn=lambda m: m.monitor_port, + create_entity=lambda t: t in HAS_PORT, + ), + UptimeKumaSensorEntityDescription( + key=UptimeKumaSensor.UPTIME_RATIO_1D, + translation_key=UptimeKumaSensor.UPTIME_RATIO_1D, + value_fn=lambda m: ( + m.monitor_uptime_ratio_1d * 100 + if m.monitor_uptime_ratio_1d is not None + else None + ), + native_unit_of_measurement=PERCENTAGE, + suggested_display_precision=2, + create_entity=lambda t: True, + ), + UptimeKumaSensorEntityDescription( + key=UptimeKumaSensor.UPTIME_RATIO_30D, + translation_key=UptimeKumaSensor.UPTIME_RATIO_30D, + value_fn=lambda m: ( + m.monitor_uptime_ratio_30d * 100 + if m.monitor_uptime_ratio_30d is not None + else None + ), + native_unit_of_measurement=PERCENTAGE, + suggested_display_precision=2, + create_entity=lambda t: True, + ), + UptimeKumaSensorEntityDescription( + key=UptimeKumaSensor.UPTIME_RATIO_365D, + translation_key=UptimeKumaSensor.UPTIME_RATIO_365D, + value_fn=lambda m: ( + m.monitor_uptime_ratio_365d * 100 + if m.monitor_uptime_ratio_365d is not None + else None + ), + native_unit_of_measurement=PERCENTAGE, + suggested_display_precision=2, + create_entity=lambda t: True, + ), + UptimeKumaSensorEntityDescription( + key=UptimeKumaSensor.AVG_RESPONSE_TIME_1D, + translation_key=UptimeKumaSensor.AVG_RESPONSE_TIME_1D, + value_fn=lambda m: m.monitor_response_time_seconds_1d, + device_class=SensorDeviceClass.DURATION, + native_unit_of_measurement=UnitOfTime.SECONDS, + suggested_unit_of_measurement=UnitOfTime.MILLISECONDS, + create_entity=lambda t: True, + ), + UptimeKumaSensorEntityDescription( + key=UptimeKumaSensor.AVG_RESPONSE_TIME_30D, + translation_key=UptimeKumaSensor.AVG_RESPONSE_TIME_30D, + value_fn=lambda m: m.monitor_response_time_seconds_30d, + device_class=SensorDeviceClass.DURATION, + native_unit_of_measurement=UnitOfTime.SECONDS, + suggested_unit_of_measurement=UnitOfTime.MILLISECONDS, + create_entity=lambda t: True, + ), + UptimeKumaSensorEntityDescription( + key=UptimeKumaSensor.AVG_RESPONSE_TIME_365D, + translation_key=UptimeKumaSensor.AVG_RESPONSE_TIME_365D, + value_fn=lambda m: m.monitor_response_time_seconds_365d, + device_class=SensorDeviceClass.DURATION, + native_unit_of_measurement=UnitOfTime.SECONDS, + suggested_unit_of_measurement=UnitOfTime.MILLISECONDS, + create_entity=lambda t: True, + ), ) diff --git a/homeassistant/components/uptime_kuma/strings.json b/homeassistant/components/uptime_kuma/strings.json index 20947a1818e..e4c7f000fa4 100644 --- a/homeassistant/components/uptime_kuma/strings.json +++ b/homeassistant/components/uptime_kuma/strings.json @@ -61,6 +61,15 @@ }, "entity": { "sensor": { + "avg_response_time_1d": { + "name": "Response time Ø (1 day)" + }, + "avg_response_time_30d": { + "name": "Response time Ø (30 days)" + }, + "avg_response_time_365d": { + "name": "Response time Ø (365 days)" + }, "cert_days_remaining": { "name": "Certificate expiry" }, @@ -117,6 +126,15 @@ "websocket_upgrade": "WebSocket-Upgrade" } }, + "uptime_1d": { + "name": "Uptime (1 day)" + }, + "uptime_30d": { + "name": "Uptime (30 days)" + }, + "uptime_365d": { + "name": "Uptime (365 days)" + }, "url": { "name": "Monitored URL" } diff --git a/tests/components/uptime_kuma/conftest.py b/tests/components/uptime_kuma/conftest.py index a092c2e85ba..9c388ce2c25 100644 --- a/tests/components/uptime_kuma/conftest.py +++ b/tests/components/uptime_kuma/conftest.py @@ -56,7 +56,7 @@ def mock_pythonkuma() -> Generator[AsyncMock]: monitor_1 = UptimeKumaMonitor( monitor_id=1, monitor_cert_days_remaining=90, - monitor_cert_is_valid=1, + monitor_cert_is_valid=True, monitor_hostname=None, monitor_name="Monitor 1", monitor_port=None, @@ -64,11 +64,17 @@ def mock_pythonkuma() -> Generator[AsyncMock]: monitor_status=MonitorStatus.UP, monitor_type=MonitorType.HTTP, monitor_url="https://example.org", + monitor_uptime_ratio_1d=1, + monitor_uptime_ratio_30d=0.9993369956431142, + monitor_uptime_ratio_365d=0.9941977428851816, + monitor_response_time_seconds_1d=0.10920649819494585, + monitor_response_time_seconds_30d=0.0993296843901052, + monitor_response_time_seconds_365d=0.1043971646081903, ) monitor_2 = UptimeKumaMonitor( monitor_id=2, monitor_cert_days_remaining=0, - monitor_cert_is_valid=0, + monitor_cert_is_valid=False, monitor_hostname=None, monitor_name="Monitor 2", monitor_port=None, @@ -76,11 +82,17 @@ def mock_pythonkuma() -> Generator[AsyncMock]: monitor_status=MonitorStatus.UP, monitor_type=MonitorType.PORT, monitor_url=None, + monitor_uptime_ratio_1d=0.9992223950233281, + monitor_uptime_ratio_30d=0.9990979870869731, + monitor_uptime_ratio_365d=0.9994612200915926, + monitor_response_time_seconds_1d=0.16390272373540857, + monitor_response_time_seconds_30d=0.3371273224043715, + monitor_response_time_seconds_365d=0.34270098747886596, ) monitor_3 = UptimeKumaMonitor( monitor_id=3, monitor_cert_days_remaining=90, - monitor_cert_is_valid=1, + monitor_cert_is_valid=True, monitor_hostname=None, monitor_name="Monitor 3", monitor_port=None, @@ -88,6 +100,12 @@ def mock_pythonkuma() -> Generator[AsyncMock]: monitor_status=MonitorStatus.DOWN, monitor_type=MonitorType.JSON_QUERY, monitor_url="https://down.example.org", + monitor_uptime_ratio_1d=None, + monitor_uptime_ratio_30d=None, + monitor_uptime_ratio_365d=None, + monitor_response_time_seconds_1d=None, + monitor_response_time_seconds_30d=None, + monitor_response_time_seconds_365d=None, ) with ( diff --git a/tests/components/uptime_kuma/snapshots/test_diagnostics.ambr b/tests/components/uptime_kuma/snapshots/test_diagnostics.ambr index 592c1a839a9..adca1e02227 100644 --- a/tests/components/uptime_kuma/snapshots/test_diagnostics.ambr +++ b/tests/components/uptime_kuma/snapshots/test_diagnostics.ambr @@ -3,43 +3,43 @@ dict({ '1': dict({ 'monitor_cert_days_remaining': 90, - 'monitor_cert_is_valid': 1, + 'monitor_cert_is_valid': True, 'monitor_hostname': None, 'monitor_id': 1, 'monitor_name': 'Monitor 1', 'monitor_port': None, 'monitor_response_time': 120, - 'monitor_response_time_seconds_1d': None, - 'monitor_response_time_seconds_30d': None, - 'monitor_response_time_seconds_365d': None, + 'monitor_response_time_seconds_1d': 0.10920649819494585, + 'monitor_response_time_seconds_30d': 0.0993296843901052, + 'monitor_response_time_seconds_365d': 0.1043971646081903, 'monitor_status': 1, 'monitor_type': 'http', - 'monitor_uptime_ratio_1d': None, - 'monitor_uptime_ratio_30d': None, - 'monitor_uptime_ratio_365d': None, + 'monitor_uptime_ratio_1d': 1, + 'monitor_uptime_ratio_30d': 0.9993369956431142, + 'monitor_uptime_ratio_365d': 0.9941977428851816, 'monitor_url': '**REDACTED**', }), '2': dict({ 'monitor_cert_days_remaining': 0, - 'monitor_cert_is_valid': 0, + 'monitor_cert_is_valid': False, 'monitor_hostname': None, 'monitor_id': 2, 'monitor_name': 'Monitor 2', 'monitor_port': None, 'monitor_response_time': 28, - 'monitor_response_time_seconds_1d': None, - 'monitor_response_time_seconds_30d': None, - 'monitor_response_time_seconds_365d': None, + 'monitor_response_time_seconds_1d': 0.16390272373540857, + 'monitor_response_time_seconds_30d': 0.3371273224043715, + 'monitor_response_time_seconds_365d': 0.34270098747886596, 'monitor_status': 1, 'monitor_type': 'port', - 'monitor_uptime_ratio_1d': None, - 'monitor_uptime_ratio_30d': None, - 'monitor_uptime_ratio_365d': None, + 'monitor_uptime_ratio_1d': 0.9992223950233281, + 'monitor_uptime_ratio_30d': 0.9990979870869731, + 'monitor_uptime_ratio_365d': 0.9994612200915926, 'monitor_url': None, }), '3': dict({ 'monitor_cert_days_remaining': 90, - 'monitor_cert_is_valid': 1, + 'monitor_cert_is_valid': True, 'monitor_hostname': None, 'monitor_id': 3, 'monitor_name': 'Monitor 3', diff --git a/tests/components/uptime_kuma/snapshots/test_sensor.ambr b/tests/components/uptime_kuma/snapshots/test_sensor.ambr index c997de52898..7f223a2c828 100644 --- a/tests/components/uptime_kuma/snapshots/test_sensor.ambr +++ b/tests/components/uptime_kuma/snapshots/test_sensor.ambr @@ -273,6 +273,177 @@ 'state': '120', }) # --- +# name: test_setup[sensor.monitor_1_response_time_o_1_day-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.monitor_1_response_time_o_1_day', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Response time Ø (1 day)', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 0, + }), + 'sensor.private': dict({ + 'suggested_unit_of_measurement': , + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Response time Ø (1 day)', + 'platform': 'uptime_kuma', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': , + 'unique_id': '123456789_1_avg_response_time_1d', + 'unit_of_measurement': , + }) +# --- +# name: test_setup[sensor.monitor_1_response_time_o_1_day-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'duration', + 'friendly_name': 'Monitor 1 Response time Ø (1 day)', + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.monitor_1_response_time_o_1_day', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '109.206498194946', + }) +# --- +# name: test_setup[sensor.monitor_1_response_time_o_30_days-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.monitor_1_response_time_o_30_days', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Response time Ø (30 days)', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 0, + }), + 'sensor.private': dict({ + 'suggested_unit_of_measurement': , + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Response time Ø (30 days)', + 'platform': 'uptime_kuma', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': , + 'unique_id': '123456789_1_avg_response_time_30d', + 'unit_of_measurement': , + }) +# --- +# name: test_setup[sensor.monitor_1_response_time_o_30_days-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'duration', + 'friendly_name': 'Monitor 1 Response time Ø (30 days)', + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.monitor_1_response_time_o_30_days', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '99.3296843901052', + }) +# --- +# name: test_setup[sensor.monitor_1_response_time_o_365_days-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.monitor_1_response_time_o_365_days', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Response time Ø (365 days)', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 0, + }), + 'sensor.private': dict({ + 'suggested_unit_of_measurement': , + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Response time Ø (365 days)', + 'platform': 'uptime_kuma', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': , + 'unique_id': '123456789_1_avg_response_time_365d', + 'unit_of_measurement': , + }) +# --- +# name: test_setup[sensor.monitor_1_response_time_o_365_days-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'duration', + 'friendly_name': 'Monitor 1 Response time Ø (365 days)', + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.monitor_1_response_time_o_365_days', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '104.39716460819', + }) +# --- # name: test_setup[sensor.monitor_1_status-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ @@ -336,6 +507,165 @@ 'state': 'up', }) # --- +# name: test_setup[sensor.monitor_1_uptime_1_day-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.monitor_1_uptime_1_day', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Uptime (1 day)', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Uptime (1 day)', + 'platform': 'uptime_kuma', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': , + 'unique_id': '123456789_1_uptime_1d', + 'unit_of_measurement': '%', + }) +# --- +# name: test_setup[sensor.monitor_1_uptime_1_day-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Monitor 1 Uptime (1 day)', + 'unit_of_measurement': '%', + }), + 'context': , + 'entity_id': 'sensor.monitor_1_uptime_1_day', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '100', + }) +# --- +# name: test_setup[sensor.monitor_1_uptime_30_days-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.monitor_1_uptime_30_days', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Uptime (30 days)', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Uptime (30 days)', + 'platform': 'uptime_kuma', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': , + 'unique_id': '123456789_1_uptime_30d', + 'unit_of_measurement': '%', + }) +# --- +# name: test_setup[sensor.monitor_1_uptime_30_days-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Monitor 1 Uptime (30 days)', + 'unit_of_measurement': '%', + }), + 'context': , + 'entity_id': 'sensor.monitor_1_uptime_30_days', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '99.9336995643114', + }) +# --- +# name: test_setup[sensor.monitor_1_uptime_365_days-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.monitor_1_uptime_365_days', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Uptime (365 days)', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Uptime (365 days)', + 'platform': 'uptime_kuma', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': , + 'unique_id': '123456789_1_uptime_365d', + 'unit_of_measurement': '%', + }) +# --- +# name: test_setup[sensor.monitor_1_uptime_365_days-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Monitor 1 Uptime (365 days)', + 'unit_of_measurement': '%', + }), + 'context': , + 'entity_id': 'sensor.monitor_1_uptime_365_days', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '99.4197742885182', + }) +# --- # name: test_setup[sensor.monitor_2_monitor_type-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ @@ -605,6 +935,177 @@ 'state': '28', }) # --- +# name: test_setup[sensor.monitor_2_response_time_o_1_day-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.monitor_2_response_time_o_1_day', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Response time Ø (1 day)', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 0, + }), + 'sensor.private': dict({ + 'suggested_unit_of_measurement': , + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Response time Ø (1 day)', + 'platform': 'uptime_kuma', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': , + 'unique_id': '123456789_2_avg_response_time_1d', + 'unit_of_measurement': , + }) +# --- +# name: test_setup[sensor.monitor_2_response_time_o_1_day-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'duration', + 'friendly_name': 'Monitor 2 Response time Ø (1 day)', + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.monitor_2_response_time_o_1_day', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '163.902723735409', + }) +# --- +# name: test_setup[sensor.monitor_2_response_time_o_30_days-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.monitor_2_response_time_o_30_days', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Response time Ø (30 days)', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 0, + }), + 'sensor.private': dict({ + 'suggested_unit_of_measurement': , + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Response time Ø (30 days)', + 'platform': 'uptime_kuma', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': , + 'unique_id': '123456789_2_avg_response_time_30d', + 'unit_of_measurement': , + }) +# --- +# name: test_setup[sensor.monitor_2_response_time_o_30_days-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'duration', + 'friendly_name': 'Monitor 2 Response time Ø (30 days)', + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.monitor_2_response_time_o_30_days', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '337.127322404372', + }) +# --- +# name: test_setup[sensor.monitor_2_response_time_o_365_days-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.monitor_2_response_time_o_365_days', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Response time Ø (365 days)', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 0, + }), + 'sensor.private': dict({ + 'suggested_unit_of_measurement': , + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Response time Ø (365 days)', + 'platform': 'uptime_kuma', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': , + 'unique_id': '123456789_2_avg_response_time_365d', + 'unit_of_measurement': , + }) +# --- +# name: test_setup[sensor.monitor_2_response_time_o_365_days-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'duration', + 'friendly_name': 'Monitor 2 Response time Ø (365 days)', + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.monitor_2_response_time_o_365_days', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '342.700987478866', + }) +# --- # name: test_setup[sensor.monitor_2_status-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ @@ -668,6 +1169,165 @@ 'state': 'up', }) # --- +# name: test_setup[sensor.monitor_2_uptime_1_day-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.monitor_2_uptime_1_day', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Uptime (1 day)', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Uptime (1 day)', + 'platform': 'uptime_kuma', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': , + 'unique_id': '123456789_2_uptime_1d', + 'unit_of_measurement': '%', + }) +# --- +# name: test_setup[sensor.monitor_2_uptime_1_day-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Monitor 2 Uptime (1 day)', + 'unit_of_measurement': '%', + }), + 'context': , + 'entity_id': 'sensor.monitor_2_uptime_1_day', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '99.9222395023328', + }) +# --- +# name: test_setup[sensor.monitor_2_uptime_30_days-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.monitor_2_uptime_30_days', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Uptime (30 days)', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Uptime (30 days)', + 'platform': 'uptime_kuma', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': , + 'unique_id': '123456789_2_uptime_30d', + 'unit_of_measurement': '%', + }) +# --- +# name: test_setup[sensor.monitor_2_uptime_30_days-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Monitor 2 Uptime (30 days)', + 'unit_of_measurement': '%', + }), + 'context': , + 'entity_id': 'sensor.monitor_2_uptime_30_days', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '99.9097987086973', + }) +# --- +# name: test_setup[sensor.monitor_2_uptime_365_days-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.monitor_2_uptime_365_days', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Uptime (365 days)', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Uptime (365 days)', + 'platform': 'uptime_kuma', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': , + 'unique_id': '123456789_2_uptime_365d', + 'unit_of_measurement': '%', + }) +# --- +# name: test_setup[sensor.monitor_2_uptime_365_days-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Monitor 2 Uptime (365 days)', + 'unit_of_measurement': '%', + }), + 'context': , + 'entity_id': 'sensor.monitor_2_uptime_365_days', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '99.9461220091593', + }) +# --- # name: test_setup[sensor.monitor_3_certificate_expiry-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ @@ -942,6 +1602,177 @@ 'state': '120', }) # --- +# name: test_setup[sensor.monitor_3_response_time_o_1_day-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.monitor_3_response_time_o_1_day', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Response time Ø (1 day)', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 0, + }), + 'sensor.private': dict({ + 'suggested_unit_of_measurement': , + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Response time Ø (1 day)', + 'platform': 'uptime_kuma', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': , + 'unique_id': '123456789_3_avg_response_time_1d', + 'unit_of_measurement': , + }) +# --- +# name: test_setup[sensor.monitor_3_response_time_o_1_day-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'duration', + 'friendly_name': 'Monitor 3 Response time Ø (1 day)', + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.monitor_3_response_time_o_1_day', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_setup[sensor.monitor_3_response_time_o_30_days-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.monitor_3_response_time_o_30_days', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Response time Ø (30 days)', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 0, + }), + 'sensor.private': dict({ + 'suggested_unit_of_measurement': , + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Response time Ø (30 days)', + 'platform': 'uptime_kuma', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': , + 'unique_id': '123456789_3_avg_response_time_30d', + 'unit_of_measurement': , + }) +# --- +# name: test_setup[sensor.monitor_3_response_time_o_30_days-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'duration', + 'friendly_name': 'Monitor 3 Response time Ø (30 days)', + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.monitor_3_response_time_o_30_days', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_setup[sensor.monitor_3_response_time_o_365_days-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.monitor_3_response_time_o_365_days', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Response time Ø (365 days)', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 0, + }), + 'sensor.private': dict({ + 'suggested_unit_of_measurement': , + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Response time Ø (365 days)', + 'platform': 'uptime_kuma', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': , + 'unique_id': '123456789_3_avg_response_time_365d', + 'unit_of_measurement': , + }) +# --- +# name: test_setup[sensor.monitor_3_response_time_o_365_days-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'duration', + 'friendly_name': 'Monitor 3 Response time Ø (365 days)', + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.monitor_3_response_time_o_365_days', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- # name: test_setup[sensor.monitor_3_status-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ @@ -1005,3 +1836,162 @@ 'state': 'down', }) # --- +# name: test_setup[sensor.monitor_3_uptime_1_day-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.monitor_3_uptime_1_day', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Uptime (1 day)', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Uptime (1 day)', + 'platform': 'uptime_kuma', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': , + 'unique_id': '123456789_3_uptime_1d', + 'unit_of_measurement': '%', + }) +# --- +# name: test_setup[sensor.monitor_3_uptime_1_day-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Monitor 3 Uptime (1 day)', + 'unit_of_measurement': '%', + }), + 'context': , + 'entity_id': 'sensor.monitor_3_uptime_1_day', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_setup[sensor.monitor_3_uptime_30_days-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.monitor_3_uptime_30_days', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Uptime (30 days)', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Uptime (30 days)', + 'platform': 'uptime_kuma', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': , + 'unique_id': '123456789_3_uptime_30d', + 'unit_of_measurement': '%', + }) +# --- +# name: test_setup[sensor.monitor_3_uptime_30_days-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Monitor 3 Uptime (30 days)', + 'unit_of_measurement': '%', + }), + 'context': , + 'entity_id': 'sensor.monitor_3_uptime_30_days', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_setup[sensor.monitor_3_uptime_365_days-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.monitor_3_uptime_365_days', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Uptime (365 days)', + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Uptime (365 days)', + 'platform': 'uptime_kuma', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': , + 'unique_id': '123456789_3_uptime_365d', + 'unit_of_measurement': '%', + }) +# --- +# name: test_setup[sensor.monitor_3_uptime_365_days-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Monitor 3 Uptime (365 days)', + 'unit_of_measurement': '%', + }), + 'context': , + 'entity_id': 'sensor.monitor_3_uptime_365_days', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# ---