From ec03bdf9a7a8e502e042f6a72b1b78bd9a079a22 Mon Sep 17 00:00:00 2001 From: Sridhar Neti Date: Mon, 5 Oct 2026 07:03:05 -0500 Subject: [PATCH] Fix Hanna sensors showing readings from another device (#184258) Co-authored-by: Claude Opus 5.5 --- homeassistant/components/hanna/coordinator.py | 2 +- tests/components/hanna/test_sensor.py | 47 +++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 tests/components/hanna/test_sensor.py diff --git a/homeassistant/components/hanna/coordinator.py b/homeassistant/components/hanna/coordinator.py index 688911b20ee0..2b71e0d9cb16 100644 --- a/homeassistant/components/hanna/coordinator.py +++ b/homeassistant/components/hanna/coordinator.py @@ -50,7 +50,7 @@ class HannaDataCoordinator(DataUpdateCoordinator[dict[str, Any]]): def get_parameters(self) -> list[dict[str, Any]]: """Get all parameters from the sensor data.""" - return self.api_client.parameters + return self.data.get("messages", {}).get("parameters", []) def get_parameter_value(self, key: str) -> Any: """Get the value for a specific parameter.""" diff --git a/tests/components/hanna/test_sensor.py b/tests/components/hanna/test_sensor.py new file mode 100644 index 000000000000..3c882f8a7fbd --- /dev/null +++ b/tests/components/hanna/test_sensor.py @@ -0,0 +1,47 @@ +"""Tests for the Hanna Instruments sensor platform.""" + +from typing import Any +from unittest.mock import MagicMock + +from homeassistant.const import Platform +from homeassistant.core import HomeAssistant +from homeassistant.helpers import entity_registry as er + +from tests.common import MockConfigEntry + +DEVICE_READINGS = { + "pool": {"DID": "pool", "messages": {"parameters": [{"name": "ph", "value": 7.2}]}}, + "spa": {"DID": "spa", "messages": {"parameters": [{"name": "ph", "value": 7.8}]}}, +} + + +async def test_sensors_use_own_device_readings( + hass: HomeAssistant, + entity_registry: er.EntityRegistry, + mock_hanna_client: MagicMock, + mock_config_entry: MockConfigEntry, +) -> None: + """Test each device's sensors show that device's readings.""" + mock_hanna_client.get_devices.return_value = [ + {"DID": "pool", "name": "Pool"}, + {"DID": "spa", "name": "Spa"}, + ] + + def get_last_device_reading(device_id: str) -> dict[str, Any]: + # The real client keeps only the most recently fetched device's parameters. + readings = DEVICE_READINGS[device_id] + mock_hanna_client.parameters = readings["messages"]["parameters"] + return readings + + mock_hanna_client.get_last_device_reading.side_effect = get_last_device_reading + + mock_config_entry.add_to_hass(hass) + await hass.config_entries.async_setup(mock_config_entry.entry_id) + await hass.async_block_till_done() + + pool_ph = entity_registry.async_get_entity_id(Platform.SENSOR, "hanna", "pool_ph") + spa_ph = entity_registry.async_get_entity_id(Platform.SENSOR, "hanna", "spa_ph") + assert pool_ph is not None + assert spa_ph is not None + assert hass.states.get(pool_ph).state == "7.2" + assert hass.states.get(spa_ph).state == "7.8"