Use display_precision if suggested_display_precision is None (#110270)

Co-authored-by: Richard <rikroe@users.noreply.github.com>
Co-authored-by: Erik Montnemery <erik@montnemery.com>
This commit is contained in:
Richard Kroegel 2024-04-24 09:46:55 +02:00 committed by GitHub
parent 44208a5be0
commit 474a1a3d94
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 33 additions and 7 deletions

View File

@ -747,13 +747,15 @@ class SensorEntity(Entity, cached_properties=CACHED_PROPERTIES_WITH_ATTR_):
return value return value
def _suggested_precision_or_none(self) -> int | None: def _display_precision_or_none(self) -> int | None:
"""Return suggested display precision, or None if not set.""" """Return display precision, or None if not set."""
assert self.registry_entry assert self.registry_entry
if (sensor_options := self.registry_entry.options.get(DOMAIN)) and ( if not (sensor_options := self.registry_entry.options.get(DOMAIN)):
precision := sensor_options.get("suggested_display_precision") return None
) is not None:
return cast(int, precision) for option in ("display_precision", "suggested_display_precision"):
if (precision := sensor_options.get(option)) is not None:
return cast(int, precision)
return None return None
def _update_suggested_precision(self) -> None: def _update_suggested_precision(self) -> None:
@ -835,7 +837,7 @@ class SensorEntity(Entity, cached_properties=CACHED_PROPERTIES_WITH_ATTR_):
Called when the entity registry entry has been updated and before the sensor is Called when the entity registry entry has been updated and before the sensor is
added to the state machine. added to the state machine.
""" """
self._sensor_option_display_precision = self._suggested_precision_or_none() self._sensor_option_display_precision = self._display_precision_or_none()
assert self.registry_entry assert self.registry_entry
if ( if (
sensor_options := self.registry_entry.options.get(f"{DOMAIN}.private") sensor_options := self.registry_entry.options.get(f"{DOMAIN}.private")

View File

@ -1146,6 +1146,14 @@ async def test_unit_conversion_priority_precision(
suggested_display_precision=suggested_precision, suggested_display_precision=suggested_precision,
suggested_unit_of_measurement=suggested_unit, suggested_unit_of_measurement=suggested_unit,
) )
entity4 = MockSensor(
name="Test",
device_class=device_class,
native_unit_of_measurement=native_unit,
native_value=str(native_value),
suggested_display_precision=None,
unique_id="very_unique_4",
)
setup_test_component_platform( setup_test_component_platform(
hass, hass,
sensor.DOMAIN, sensor.DOMAIN,
@ -1154,6 +1162,7 @@ async def test_unit_conversion_priority_precision(
entity1, entity1,
entity2, entity2,
entity3, entity3,
entity4,
], ],
) )
@ -1230,6 +1239,21 @@ async def test_unit_conversion_priority_precision(
round(custom_state, 4) round(custom_state, 4)
) )
# Set a display_precision without having suggested_display_precision
entity_registry.async_update_entity_options(
entity4.entity_id,
"sensor",
{"display_precision": 4},
)
entry4 = entity_registry.async_get(entity4.entity_id)
assert "suggested_display_precision" not in entry4.options["sensor"]
assert entry4.options["sensor"]["display_precision"] == 4
await hass.async_block_till_done()
state = hass.states.get(entity4.entity_id)
assert float(async_rounded_state(hass, entity4.entity_id, state)) == pytest.approx(
round(automatic_state, 4)
)
@pytest.mark.parametrize( @pytest.mark.parametrize(
( (