Skip to content

Commit

Permalink
Update buienradar sensors only after being added to HA (#131830)
Browse files Browse the repository at this point in the history
* Update buienradar sensors only after being added to HA

* Move check to util

* Check for platform in sensor state property

* Move check to unit translation key property

* Add test for sensor check

* Properly handle added_to_hass

* Remove redundant comment
  • Loading branch information
abmantis authored Dec 2, 2024
1 parent 99063ba commit 6db8fce
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 4 deletions.
21 changes: 17 additions & 4 deletions homeassistant/components/buienradar/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -742,6 +742,7 @@ def __init__(
) -> None:
"""Initialize the sensor."""
self.entity_description = description
self._data: BrData | None = None
self._measured = None
self._attr_unique_id = (
f"{coordinates[CONF_LATITUDE]:2.6f}{coordinates[CONF_LONGITUDE]:2.6f}"
Expand All @@ -756,17 +757,29 @@ def __init__(
if description.key.startswith(PRECIPITATION_FORECAST):
self._timeframe = None

async def async_added_to_hass(self) -> None:
"""Handle entity being added to hass."""
if self._data is None:
return
self._update()

@callback
def data_updated(self, data: BrData):
"""Update data."""
if self._load_data(data.data) and self.hass:
"""Handle data update."""
self._data = data
if not self.hass:
return
self._update()

def _update(self):
"""Update sensor data."""
_LOGGER.debug("Updating sensor %s", self.entity_id)
if self._load_data(self._data.data):
self.async_write_ha_state()

@callback
def _load_data(self, data): # noqa: C901
"""Load the sensor with relevant data."""
# Find sensor

# Check if we have a new measurement,
# otherwise we do not have to update the sensor
if self._measured == data.get(MEASURED):
Expand Down
5 changes: 5 additions & 0 deletions homeassistant/components/sensor/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -472,6 +472,11 @@ def _unit_of_measurement_translation_key(self) -> str | None:
"""Return translation key for unit of measurement."""
if self.translation_key is None:
return None
if self.platform is None:
raise ValueError(
f"Sensor {type(self)} cannot have a translation key for "
"unit of measurement before being added to the entity platform"
)
platform = self.platform
return (
f"component.{platform.platform_name}.entity.{platform.domain}"
Expand Down
39 changes: 39 additions & 0 deletions tests/components/sensor/test_init.py
Original file line number Diff line number Diff line change
Expand Up @@ -545,6 +545,45 @@ async def test_translated_unit_with_native_unit_raises(
assert entity0.entity_id is None


async def test_unit_translation_key_without_platform_raises(
hass: HomeAssistant,
) -> None:
"""Test that unit translation key property raises if the entity has no platform yet."""

with patch(
"homeassistant.helpers.service.translation.async_get_translations",
return_value={
"component.test.entity.sensor.test_translation_key.unit_of_measurement": "Tests"
},
):
entity0 = MockSensor(
name="Test",
native_value="123",
unique_id="very_unique",
)
entity0.entity_description = SensorEntityDescription(
"test",
translation_key="test_translation_key",
)
with pytest.raises(
ValueError,
match="cannot have a translation key for unit of measurement before "
"being added to the entity platform",
):
unit = entity0.unit_of_measurement # noqa: F841

setup_test_component_platform(hass, sensor.DOMAIN, [entity0])

assert await async_setup_component(
hass, "sensor", {"sensor": {"platform": "test"}}
)
await hass.async_block_till_done()

# Should not raise after being added to the platform
unit = entity0.unit_of_measurement # noqa: F841
assert unit == "Tests"


@pytest.mark.parametrize(
(
"device_class",
Expand Down

0 comments on commit 6db8fce

Please sign in to comment.