Update buienradar sensors only after being added to HA (#131830)

* 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
This commit is contained in:
Abílio Costa 2024-12-02 12:52:59 +00:00 committed by Franck Nijhof
parent 110935461e
commit c3499e5294
No known key found for this signature in database
GPG Key ID: D62583BA8AB11CA3
3 changed files with 61 additions and 4 deletions

View File

@ -742,6 +742,7 @@ class BrSensor(SensorEntity):
) -> 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}"
@ -756,17 +757,29 @@ class BrSensor(SensorEntity):
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):

View File

@ -509,6 +509,11 @@ class SensorEntity(Entity, cached_properties=CACHED_PROPERTIES_WITH_ATTR_):
"""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}"

View File

@ -548,6 +548,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",