Reduce precision loss when converting HomeKit temperature (#131973)

This commit is contained in:
J. Nick Koston 2024-11-30 16:09:37 -06:00 committed by Paulus Schoutsen
parent e8ef990e72
commit 673bdcc556
3 changed files with 12 additions and 18 deletions

View File

@ -424,20 +424,12 @@ def cleanup_name_for_homekit(name: str | None) -> str:
def temperature_to_homekit(temperature: float, unit: str) -> float: def temperature_to_homekit(temperature: float, unit: str) -> float:
"""Convert temperature to Celsius for HomeKit.""" """Convert temperature to Celsius for HomeKit."""
return round( return TemperatureConverter.convert(temperature, unit, UnitOfTemperature.CELSIUS)
TemperatureConverter.convert(temperature, unit, UnitOfTemperature.CELSIUS), 1
)
def temperature_to_states(temperature: float, unit: str) -> float: def temperature_to_states(temperature: float, unit: str) -> float:
"""Convert temperature back from Celsius to Home Assistant unit.""" """Convert temperature back from Celsius to Home Assistant unit."""
return ( return TemperatureConverter.convert(temperature, UnitOfTemperature.CELSIUS, unit)
round(
TemperatureConverter.convert(temperature, UnitOfTemperature.CELSIUS, unit)
* 2
)
/ 2
)
def density_to_air_quality(density: float) -> int: def density_to_air_quality(density: float) -> int:

View File

@ -921,8 +921,8 @@ async def test_thermostat_fahrenheit(
await hass.async_block_till_done() await hass.async_block_till_done()
assert call_set_temperature[0] assert call_set_temperature[0]
assert call_set_temperature[0].data[ATTR_ENTITY_ID] == entity_id assert call_set_temperature[0].data[ATTR_ENTITY_ID] == entity_id
assert call_set_temperature[0].data[ATTR_TARGET_TEMP_HIGH] == 73.5 assert call_set_temperature[0].data[ATTR_TARGET_TEMP_HIGH] == 73.4
assert call_set_temperature[0].data[ATTR_TARGET_TEMP_LOW] == 68 assert call_set_temperature[0].data[ATTR_TARGET_TEMP_LOW] == 68.18
assert len(events) == 1 assert len(events) == 1
assert events[-1].data[ATTR_VALUE] == "CoolingThresholdTemperature to 23°C" assert events[-1].data[ATTR_VALUE] == "CoolingThresholdTemperature to 23°C"
@ -942,8 +942,8 @@ async def test_thermostat_fahrenheit(
await hass.async_block_till_done() await hass.async_block_till_done()
assert call_set_temperature[1] assert call_set_temperature[1]
assert call_set_temperature[1].data[ATTR_ENTITY_ID] == entity_id assert call_set_temperature[1].data[ATTR_ENTITY_ID] == entity_id
assert call_set_temperature[1].data[ATTR_TARGET_TEMP_HIGH] == 73.5 assert call_set_temperature[1].data[ATTR_TARGET_TEMP_HIGH] == 73.4
assert call_set_temperature[1].data[ATTR_TARGET_TEMP_LOW] == 71.5 assert call_set_temperature[1].data[ATTR_TARGET_TEMP_LOW] == 71.6
assert len(events) == 2 assert len(events) == 2
assert events[-1].data[ATTR_VALUE] == "HeatingThresholdTemperature to 22°C" assert events[-1].data[ATTR_VALUE] == "HeatingThresholdTemperature to 22°C"
@ -962,7 +962,7 @@ async def test_thermostat_fahrenheit(
await hass.async_block_till_done() await hass.async_block_till_done()
assert call_set_temperature[2] assert call_set_temperature[2]
assert call_set_temperature[2].data[ATTR_ENTITY_ID] == entity_id assert call_set_temperature[2].data[ATTR_ENTITY_ID] == entity_id
assert call_set_temperature[2].data[ATTR_TEMPERATURE] == 75.0 assert call_set_temperature[2].data[ATTR_TEMPERATURE] == 75.2
assert len(events) == 3 assert len(events) == 3
assert events[-1].data[ATTR_VALUE] == "TargetTemperature to 24.0°C" assert events[-1].data[ATTR_VALUE] == "TargetTemperature to 24.0°C"

View File

@ -268,14 +268,16 @@ def test_cleanup_name_for_homekit() -> None:
def test_temperature_to_homekit() -> None: def test_temperature_to_homekit() -> None:
"""Test temperature conversion from HA to HomeKit.""" """Test temperature conversion from HA to HomeKit."""
assert temperature_to_homekit(20.46, UnitOfTemperature.CELSIUS) == 20.5 assert temperature_to_homekit(20.46, UnitOfTemperature.CELSIUS) == 20.46
assert temperature_to_homekit(92.1, UnitOfTemperature.FAHRENHEIT) == 33.4 assert temperature_to_homekit(92.1, UnitOfTemperature.FAHRENHEIT) == pytest.approx(
33.388888888888886
)
def test_temperature_to_states() -> None: def test_temperature_to_states() -> None:
"""Test temperature conversion from HomeKit to HA.""" """Test temperature conversion from HomeKit to HA."""
assert temperature_to_states(20, UnitOfTemperature.CELSIUS) == 20.0 assert temperature_to_states(20, UnitOfTemperature.CELSIUS) == 20.0
assert temperature_to_states(20.2, UnitOfTemperature.FAHRENHEIT) == 68.5 assert temperature_to_states(20.2, UnitOfTemperature.FAHRENHEIT) == 68.36
def test_density_to_air_quality() -> None: def test_density_to_air_quality() -> None: