From ab69d806f231ee77fd45c634cad1679b05d1131a Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 30 Aug 2026 12:26:19 +0200 Subject: [PATCH] Add Elgato Wi-Fi signal sensors (#180758) --- homeassistant/components/elgato/icons.json | 5 + homeassistant/components/elgato/sensor.py | 21 +++ homeassistant/components/elgato/strings.json | 6 + .../elgato/snapshots/test_sensor.ambr | 177 ++++++++++++++++++ tests/components/elgato/test_sensor.py | 19 ++ 5 files changed, 228 insertions(+) diff --git a/homeassistant/components/elgato/icons.json b/homeassistant/components/elgato/icons.json index e8e171f107ac..628bd8c20772 100644 --- a/homeassistant/components/elgato/icons.json +++ b/homeassistant/components/elgato/icons.json @@ -13,6 +13,11 @@ "default": "mdi:power-settings" } }, + "sensor": { + "wifi_signal_strength": { + "default": "mdi:wifi" + } + }, "switch": { "bypass": { "default": "mdi:battery-off-outline" diff --git a/homeassistant/components/elgato/sensor.py b/homeassistant/components/elgato/sensor.py index d8c9a1406fb8..50b6372bd773 100644 --- a/homeassistant/components/elgato/sensor.py +++ b/homeassistant/components/elgato/sensor.py @@ -12,6 +12,7 @@ from homeassistant.components.sensor import ( ) from homeassistant.const import ( PERCENTAGE, + SIGNAL_STRENGTH_DECIBELS_MILLIWATT, EntityCategory, UnitOfElectricCurrent, UnitOfElectricPotential, @@ -97,6 +98,26 @@ SENSORS = [ has_fn=lambda x: x.battery is not None, value_fn=lambda x: x.battery.input_charge_voltage if x.battery else None, ), + ElgatoSensorEntityDescription( + key="wifi_signal_strength", + translation_key="wifi_signal_strength", + entity_category=EntityCategory.DIAGNOSTIC, + native_unit_of_measurement=PERCENTAGE, + state_class=SensorStateClass.MEASUREMENT, + has_fn=lambda x: x.info.wifi is not None, + value_fn=lambda x: x.info.wifi.signal_strength if x.info.wifi else None, + ), + ElgatoSensorEntityDescription( + key="wifi_rssi", + translation_key="wifi_rssi", + entity_registry_enabled_default=False, + device_class=SensorDeviceClass.SIGNAL_STRENGTH, + entity_category=EntityCategory.DIAGNOSTIC, + native_unit_of_measurement=SIGNAL_STRENGTH_DECIBELS_MILLIWATT, + state_class=SensorStateClass.MEASUREMENT, + has_fn=lambda x: x.info.wifi is not None, + value_fn=lambda x: x.info.wifi.rssi if x.info.wifi else None, + ), ] diff --git a/homeassistant/components/elgato/strings.json b/homeassistant/components/elgato/strings.json index ca63e4f3b7f7..6f813761f544 100644 --- a/homeassistant/components/elgato/strings.json +++ b/homeassistant/components/elgato/strings.json @@ -65,6 +65,12 @@ }, "voltage": { "name": "Battery voltage" + }, + "wifi_rssi": { + "name": "Wi-Fi RSSI" + }, + "wifi_signal_strength": { + "name": "Wi-Fi signal strength" } }, "switch": { diff --git a/tests/components/elgato/snapshots/test_sensor.ambr b/tests/components/elgato/snapshots/test_sensor.ambr index 4e0ae5d822ee..053ae449a705 100644 --- a/tests/components/elgato/snapshots/test_sensor.ambr +++ b/tests/components/elgato/snapshots/test_sensor.ambr @@ -468,3 +468,180 @@ 'via_device_id': None, }) # --- +# name: test_sensors[sensor.frenck_wi_fi_rssi-key-light-mini] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + : 'signal_strength', + : 'Frenck Wi-Fi RSSI', + : , + : 'dBm', + }), + 'context': , + 'entity_id': 'sensor.frenck_wi_fi_rssi', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '-41', + }) +# --- +# name: test_sensors[sensor.frenck_wi_fi_rssi-key-light-mini].1 + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': dict({ + : , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.frenck_wi_fi_rssi', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Wi-Fi RSSI', + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Wi-Fi RSSI', + 'platform': 'elgato', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'wifi_rssi', + 'unique_id': 'GW24L1A02987_wifi_rssi', + 'unit_of_measurement': 'dBm', + }) +# --- +# name: test_sensors[sensor.frenck_wi_fi_rssi-key-light-mini].2 + DeviceRegistryEntrySnapshot({ + 'area_id': None, + 'config_entry_id': , + 'config_subentry_id': , + 'configuration_url': None, + 'connections': set({ + tuple( + 'mac', + 'aa:bb:cc:dd:ee:ff', + ), + }), + 'disabled_by': None, + 'entry_type': None, + 'hw_version': '202', + 'id': , + 'identifiers': set({ + tuple( + 'elgato', + 'GW24L1A02987', + ), + }), + 'labels': set({ + }), + 'manufacturer': 'Elgato', + 'model': 'Elgato Key Light Mini', + 'model_id': None, + 'name': 'Frenck', + 'name_by_user': None, + 'serial_number': 'GW24L1A02987', + 'sw_version': '1.0.4 (229)', + 'via_device_id': None, + }) +# --- +# name: test_sensors[sensor.frenck_wi_fi_signal_strength-key-light-mini] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + : 'Frenck Wi-Fi signal strength', + : , + : '%', + }), + 'context': , + 'entity_id': 'sensor.frenck_wi_fi_signal_strength', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '100', + }) +# --- +# name: test_sensors[sensor.frenck_wi_fi_signal_strength-key-light-mini].1 + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': dict({ + : , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.frenck_wi_fi_signal_strength', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Wi-Fi signal strength', + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Wi-Fi signal strength', + 'platform': 'elgato', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'wifi_signal_strength', + 'unique_id': 'GW24L1A02987_wifi_signal_strength', + 'unit_of_measurement': '%', + }) +# --- +# name: test_sensors[sensor.frenck_wi_fi_signal_strength-key-light-mini].2 + DeviceRegistryEntrySnapshot({ + 'area_id': None, + 'config_entry_id': , + 'config_subentry_id': , + 'configuration_url': None, + 'connections': set({ + tuple( + 'mac', + 'aa:bb:cc:dd:ee:ff', + ), + }), + 'disabled_by': None, + 'entry_type': None, + 'hw_version': '202', + 'id': , + 'identifiers': set({ + tuple( + 'elgato', + 'GW24L1A02987', + ), + }), + 'labels': set({ + }), + 'manufacturer': 'Elgato', + 'model': 'Elgato Key Light Mini', + 'model_id': None, + 'name': 'Frenck', + 'name_by_user': None, + 'serial_number': 'GW24L1A02987', + 'sw_version': '1.0.4 (229)', + 'via_device_id': None, + }) +# --- diff --git a/tests/components/elgato/test_sensor.py b/tests/components/elgato/test_sensor.py index 1ad37d938e78..f84dc8da5ef3 100644 --- a/tests/components/elgato/test_sensor.py +++ b/tests/components/elgato/test_sensor.py @@ -21,6 +21,8 @@ pytestmark = [ "sensor.frenck_charging_current", "sensor.frenck_charging_power", "sensor.frenck_charging_voltage", + "sensor.frenck_wi_fi_rssi", + "sensor.frenck_wi_fi_signal_strength", ], ) async def test_sensors( @@ -50,6 +52,7 @@ async def test_sensors( "sensor.frenck_charging_current", "sensor.frenck_charging_power", "sensor.frenck_charging_voltage", + "sensor.frenck_wi_fi_rssi", ], ) async def test_disabled_by_default_sensors( @@ -61,3 +64,19 @@ async def test_disabled_by_default_sensors( assert (entry := entity_registry.async_get(entity_id)) assert entry.disabled assert entry.disabled_by is er.RegistryEntryDisabler.INTEGRATION + + +async def test_wifi_signal_strength_is_enabled( + hass: HomeAssistant, + entity_registry: er.EntityRegistry, +) -> None: + """Test the signal strength percentage is on without asking for it. + + A percentage is what someone can actually read, so it is the one that + shows up by default. The dBm behind it stays available but off. + """ + assert (state := hass.states.get("sensor.frenck_wi_fi_signal_strength")) + assert state.state == "100" + + assert (entry := entity_registry.async_get("sensor.frenck_wi_fi_signal_strength")) + assert not entry.disabled