From 397091cc7d424f3ecbea035e1ae18e923b654dd6 Mon Sep 17 00:00:00 2001 From: David Rapan Date: Tue, 10 Dec 2024 08:26:42 +0100 Subject: [PATCH] Add Starlink usage sensors (#132738) * Add usage metrics returned from history_stats * Add upload and download usage sensors * Add strings for upload and download usage sensors * Add usage to test_diagnostics.ambr * Add icons for upload and download usage sensors * Add suggested_unit_of_measurement to GIGABYTES --- .../components/starlink/coordinator.py | 17 +++++++++++------ homeassistant/components/starlink/icons.json | 6 ++++++ homeassistant/components/starlink/sensor.py | 19 +++++++++++++++++++ .../components/starlink/strings.json | 6 ++++++ .../starlink/snapshots/test_diagnostics.ambr | 4 ++++ 5 files changed, 46 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/starlink/coordinator.py b/homeassistant/components/starlink/coordinator.py index 81ee56db3b4..89d03a4fadc 100644 --- a/homeassistant/components/starlink/coordinator.py +++ b/homeassistant/components/starlink/coordinator.py @@ -16,6 +16,7 @@ from starlink_grpc import ( ObstructionDict, PowerDict, StatusDict, + UsageDict, get_sleep_config, history_stats, location_data, @@ -41,6 +42,7 @@ class StarlinkData: status: StatusDict obstruction: ObstructionDict alert: AlertDict + usage: UsageDict consumption: PowerDict @@ -60,12 +62,15 @@ class StarlinkUpdateCoordinator(DataUpdateCoordinator[StarlinkData]): def _get_starlink_data(self) -> StarlinkData: """Retrieve Starlink data.""" - channel_context = self.channel_context - location = location_data(channel_context) - sleep = get_sleep_config(channel_context) - status, obstruction, alert = status_data(channel_context) - statistics = history_stats(parse_samples=-1, context=channel_context) - return StarlinkData(location, sleep, status, obstruction, alert, statistics[-1]) + context = self.channel_context + status = status_data(context) + location = location_data(context) + sleep = get_sleep_config(context) + status, obstruction, alert = status_data(context) + usage, consumption = history_stats(parse_samples=-1, context=context)[-2:] + return StarlinkData( + location, sleep, status, obstruction, alert, usage, consumption + ) async def _async_update_data(self) -> StarlinkData: async with asyncio.timeout(4): diff --git a/homeassistant/components/starlink/icons.json b/homeassistant/components/starlink/icons.json index 65cb273e24b..02de62aeb8a 100644 --- a/homeassistant/components/starlink/icons.json +++ b/homeassistant/components/starlink/icons.json @@ -18,6 +18,12 @@ }, "last_boot_time": { "default": "mdi:clock" + }, + "upload": { + "default": "mdi:upload" + }, + "download": { + "default": "mdi:download" } } } diff --git a/homeassistant/components/starlink/sensor.py b/homeassistant/components/starlink/sensor.py index 4b33a7f4337..5481e310fbd 100644 --- a/homeassistant/components/starlink/sensor.py +++ b/homeassistant/components/starlink/sensor.py @@ -19,6 +19,7 @@ from homeassistant.const import ( EntityCategory, UnitOfDataRate, UnitOfEnergy, + UnitOfInformation, UnitOfPower, UnitOfTime, ) @@ -122,6 +123,24 @@ SENSORS: tuple[StarlinkSensorEntityDescription, ...] = ( native_unit_of_measurement=PERCENTAGE, value_fn=lambda data: data.status["pop_ping_drop_rate"] * 100, ), + StarlinkSensorEntityDescription( + key="upload", + translation_key="upload", + device_class=SensorDeviceClass.DATA_SIZE, + state_class=SensorStateClass.TOTAL_INCREASING, + native_unit_of_measurement=UnitOfInformation.BYTES, + suggested_unit_of_measurement=UnitOfInformation.GIGABYTES, + value_fn=lambda data: data.usage["upload_usage"], + ), + StarlinkSensorEntityDescription( + key="download", + translation_key="download", + device_class=SensorDeviceClass.DATA_SIZE, + state_class=SensorStateClass.TOTAL_INCREASING, + native_unit_of_measurement=UnitOfInformation.BYTES, + suggested_unit_of_measurement=UnitOfInformation.GIGABYTES, + value_fn=lambda data: data.usage["download_usage"], + ), StarlinkSensorEntityDescription( key="power", device_class=SensorDeviceClass.POWER, diff --git a/homeassistant/components/starlink/strings.json b/homeassistant/components/starlink/strings.json index 36a4f176e70..395b6288c71 100644 --- a/homeassistant/components/starlink/strings.json +++ b/homeassistant/components/starlink/strings.json @@ -70,6 +70,12 @@ }, "ping_drop_rate": { "name": "Ping drop rate" + }, + "upload": { + "name": "Upload" + }, + "download": { + "name": "Download" } }, "switch": { diff --git a/tests/components/starlink/snapshots/test_diagnostics.ambr b/tests/components/starlink/snapshots/test_diagnostics.ambr index c0b1b93085b..c54e0b2df6d 100644 --- a/tests/components/starlink/snapshots/test_diagnostics.ambr +++ b/tests/components/starlink/snapshots/test_diagnostics.ambr @@ -86,5 +86,9 @@ 'uplink_throughput_bps': 11802.771484375, 'uptime': 804138, }), + 'usage': dict({ + 'download_usage': 72504227, + 'upload_usage': 5719755, + }), }) # ---