Skip to content

Commit 1ef368d

Browse files
abmantisclaude
andauthored
Fix Modbus temperature restoration using the saved unit (#185991)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
1 parent 5677e21 commit 1ef368d

2 files changed

Lines changed: 144 additions & 2 deletions

File tree

‎homeassistant/components/modbus/climate.py‎

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
from homeassistant.helpers.entity_platform import AddEntitiesCallback
4040
from homeassistant.helpers.restore_state import RestoreEntity
4141
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
42+
from homeassistant.util.unit_conversion import TemperatureConverter
4243

4344
from . import get_hub
4445
from .const import (
@@ -318,8 +319,13 @@ async def async_added_to_hass(self) -> None:
318319
if state and state.attributes.get(
319320
ClimateEntityStateAttribute.TARGET_TEMPERATURE
320321
):
321-
self._attr_native_target_temperature = float(
322-
state.attributes[ClimateEntityStateAttribute.TARGET_TEMPERATURE]
322+
self._attr_native_target_temperature = TemperatureConverter.convert(
323+
float(state.attributes[ClimateEntityStateAttribute.TARGET_TEMPERATURE]),
324+
state.attributes.get(
325+
ClimateEntityStateAttribute.TEMPERATURE_UNIT,
326+
self.hass.config.units.temperature_unit,
327+
),
328+
self.native_temperature_unit,
323329
)
324330

325331
@override

‎tests/components/modbus/test_climate.py‎

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,10 @@
101101
CONF_PLATFORM,
102102
CONF_SCAN_INTERVAL,
103103
CONF_SLAVE,
104+
CONF_TEMPERATURE_UNIT,
104105
STATE_UNAVAILABLE,
105106
STATE_UNKNOWN,
107+
UnitOfTemperature,
106108
)
107109
from homeassistant.core import DOMAIN as HOMEASSISTANT_DOMAIN, HomeAssistant, State
108110
from homeassistant.setup import async_setup_component
@@ -1656,6 +1658,140 @@ async def test_restore_state_climate(
16561658
assert state.attributes[ATTR_TEMPERATURE] == 37
16571659

16581660

1661+
@pytest.mark.parametrize(
1662+
("mock_test_state", "do_config"),
1663+
[
1664+
pytest.param(
1665+
(
1666+
State(
1667+
ENTITY_ID,
1668+
HVACMode.AUTO,
1669+
{
1670+
ATTR_TEMPERATURE: 17,
1671+
"temperature_unit": UnitOfTemperature.CELSIUS,
1672+
},
1673+
),
1674+
),
1675+
{
1676+
CONF_CLIMATES: [
1677+
{
1678+
CONF_NAME: TEST_ENTITY_NAME,
1679+
CONF_TARGET_TEMP: 117,
1680+
CONF_ADDRESS: 117,
1681+
CONF_TEMPERATURE_UNIT: "C",
1682+
}
1683+
],
1684+
},
1685+
id="celsius_to_celsius",
1686+
),
1687+
pytest.param(
1688+
(
1689+
State(
1690+
ENTITY_ID,
1691+
HVACMode.AUTO,
1692+
{
1693+
ATTR_TEMPERATURE: 17,
1694+
"temperature_unit": UnitOfTemperature.CELSIUS,
1695+
},
1696+
),
1697+
),
1698+
{
1699+
CONF_CLIMATES: [
1700+
{
1701+
CONF_NAME: TEST_ENTITY_NAME,
1702+
CONF_TARGET_TEMP: 117,
1703+
CONF_ADDRESS: 117,
1704+
CONF_TEMPERATURE_UNIT: "F",
1705+
}
1706+
],
1707+
},
1708+
id="celsius_to_fahrenheit",
1709+
),
1710+
pytest.param(
1711+
(
1712+
State(
1713+
ENTITY_ID,
1714+
HVACMode.AUTO,
1715+
{
1716+
ATTR_TEMPERATURE: 63,
1717+
"temperature_unit": UnitOfTemperature.FAHRENHEIT,
1718+
},
1719+
),
1720+
),
1721+
{
1722+
CONF_CLIMATES: [
1723+
{
1724+
CONF_NAME: TEST_ENTITY_NAME,
1725+
CONF_TARGET_TEMP: 117,
1726+
CONF_ADDRESS: 117,
1727+
CONF_TEMPERATURE_UNIT: "C",
1728+
}
1729+
],
1730+
},
1731+
id="fahrenheit_to_celsius",
1732+
),
1733+
pytest.param(
1734+
(
1735+
State(
1736+
ENTITY_ID,
1737+
HVACMode.AUTO,
1738+
{
1739+
ATTR_TEMPERATURE: 63,
1740+
"temperature_unit": UnitOfTemperature.FAHRENHEIT,
1741+
},
1742+
),
1743+
),
1744+
{
1745+
CONF_CLIMATES: [
1746+
{
1747+
CONF_NAME: TEST_ENTITY_NAME,
1748+
CONF_TARGET_TEMP: 117,
1749+
CONF_ADDRESS: 117,
1750+
CONF_TEMPERATURE_UNIT: "F",
1751+
}
1752+
],
1753+
},
1754+
id="fahrenheit_to_fahrenheit",
1755+
),
1756+
pytest.param(
1757+
(State(ENTITY_ID, HVACMode.AUTO, {ATTR_TEMPERATURE: 17}),),
1758+
{
1759+
CONF_CLIMATES: [
1760+
{
1761+
CONF_NAME: TEST_ENTITY_NAME,
1762+
CONF_TARGET_TEMP: 117,
1763+
CONF_ADDRESS: 117,
1764+
CONF_TEMPERATURE_UNIT: "C",
1765+
}
1766+
],
1767+
},
1768+
id="legacy_to_celsius",
1769+
),
1770+
pytest.param(
1771+
(State(ENTITY_ID, HVACMode.AUTO, {ATTR_TEMPERATURE: 17}),),
1772+
{
1773+
CONF_CLIMATES: [
1774+
{
1775+
CONF_NAME: TEST_ENTITY_NAME,
1776+
CONF_TARGET_TEMP: 117,
1777+
CONF_ADDRESS: 117,
1778+
CONF_TEMPERATURE_UNIT: "F",
1779+
}
1780+
],
1781+
},
1782+
id="legacy_to_fahrenheit",
1783+
),
1784+
],
1785+
indirect=["mock_test_state"],
1786+
)
1787+
@pytest.mark.usefixtures("mock_test_state", "mock_modbus_to_test_errors_config")
1788+
async def test_restore_temperature_unit(hass: HomeAssistant) -> None:
1789+
"""Test restoration uses the saved unit, falling back to the configured unit."""
1790+
# The fixture does not poll, so the restored target temperature is kept.
1791+
state = hass.states.get(ENTITY_ID)
1792+
assert state.attributes[ATTR_TEMPERATURE] == 17
1793+
1794+
16591795
@pytest.mark.parametrize(
16601796
"do_config",
16611797
[

0 commit comments

Comments
 (0)