Skip to content

Commit 7167351

Browse files
tronikoscoderabbitai[bot]pre-commit-ci[bot]bdraco
authored
Add WaterHeaterFeature class for ESPHome (#1493)
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: J. Nick Koston <nick@home-assistant.io>
1 parent a821e72 commit 7167351

File tree

5 files changed

+76
-53
lines changed

5 files changed

+76
-53
lines changed

aioesphomeapi/api.proto

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1155,9 +1155,11 @@ enum WaterHeaterCommandHasField {
11551155
WATER_HEATER_COMMAND_HAS_NONE = 0;
11561156
WATER_HEATER_COMMAND_HAS_MODE = 1;
11571157
WATER_HEATER_COMMAND_HAS_TARGET_TEMPERATURE = 2;
1158-
WATER_HEATER_COMMAND_HAS_STATE = 4;
1158+
WATER_HEATER_COMMAND_HAS_STATE = 4 [deprecated=true];
11591159
WATER_HEATER_COMMAND_HAS_TARGET_TEMPERATURE_LOW = 8;
11601160
WATER_HEATER_COMMAND_HAS_TARGET_TEMPERATURE_HIGH = 16;
1161+
WATER_HEATER_COMMAND_HAS_ON_STATE = 32;
1162+
WATER_HEATER_COMMAND_HAS_AWAY_STATE = 64;
11611163
}
11621164

11631165
message WaterHeaterCommandRequest {

aioesphomeapi/api_pb2.py

Lines changed: 44 additions & 42 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

aioesphomeapi/client.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1405,14 +1405,19 @@ def water_heater_command(
14051405
req.has_fields |= WaterHeaterCommandField.TARGET_TEMPERATURE
14061406
req.target_temperature = target_temperature
14071407

1408-
if away is not None or on is not None:
1409-
req.has_fields |= WaterHeaterCommandField.STATE
1410-
state = WaterHeaterStateFlag(0)
1408+
# Use the new granular AWAY_STATE/ON_STATE fields instead of the
1409+
# deprecated combined STATE field. Water heater support only shipped
1410+
# in HA 2026.2.0/ESPHome 2026.1.0 so early adopters can update
1411+
# their devices; no need for legacy STATE backward compat.
1412+
if away is not None:
1413+
req.has_fields |= WaterHeaterCommandField.AWAY_STATE
14111414
if away:
1412-
state |= WaterHeaterStateFlag.AWAY
1415+
req.state |= WaterHeaterStateFlag.AWAY
1416+
1417+
if on is not None:
1418+
req.has_fields |= WaterHeaterCommandField.ON_STATE
14131419
if on:
1414-
state |= WaterHeaterStateFlag.ON
1415-
req.state = state
1420+
req.state |= WaterHeaterStateFlag.ON
14161421

14171422
if target_temperature_low is not None:
14181423
req.has_fields |= WaterHeaterCommandField.TARGET_TEMPERATURE_LOW

aioesphomeapi/model.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1109,6 +1109,16 @@ class WaterHeaterMode(APIIntEnum):
11091109
GAS = 6
11101110

11111111

1112+
class WaterHeaterFeature(enum.IntFlag):
1113+
"""ESPHome water heater feature flags (WaterHeaterFeature)."""
1114+
1115+
SUPPORTS_CURRENT_TEMPERATURE = 1 << 0
1116+
SUPPORTS_TARGET_TEMPERATURE = 1 << 1
1117+
SUPPORTS_OPERATION_MODE = 1 << 2
1118+
SUPPORTS_AWAY_MODE = 1 << 3
1119+
SUPPORTS_ON_OFF = 1 << 4
1120+
1121+
11121122
class WaterHeaterCommandField(enum.IntFlag):
11131123
"""Bitmask for has_fields in WaterHeaterCommandRequest."""
11141124

@@ -1117,6 +1127,8 @@ class WaterHeaterCommandField(enum.IntFlag):
11171127
STATE = 1 << 2
11181128
TARGET_TEMPERATURE_LOW = 1 << 3
11191129
TARGET_TEMPERATURE_HIGH = 1 << 4
1130+
ON_STATE = 1 << 5
1131+
AWAY_STATE = 1 << 6
11201132

11211133

11221134
class WaterHeaterStateFlag(enum.IntFlag):

tests/test_client.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -760,7 +760,7 @@ async def test_switch_command(
760760
{
761761
"key": 1,
762762
"device_id": 0,
763-
"has_fields": WaterHeaterCommandField.STATE,
763+
"has_fields": WaterHeaterCommandField.AWAY_STATE,
764764
"state": WaterHeaterStateFlag.AWAY,
765765
},
766766
),
@@ -769,7 +769,7 @@ async def test_switch_command(
769769
{
770770
"key": 1,
771771
"device_id": 0,
772-
"has_fields": WaterHeaterCommandField.STATE,
772+
"has_fields": WaterHeaterCommandField.ON_STATE,
773773
"state": WaterHeaterStateFlag.ON,
774774
},
775775
),
@@ -778,7 +778,8 @@ async def test_switch_command(
778778
{
779779
"key": 1,
780780
"device_id": 0,
781-
"has_fields": WaterHeaterCommandField.STATE,
781+
"has_fields": WaterHeaterCommandField.AWAY_STATE
782+
| WaterHeaterCommandField.ON_STATE,
782783
"state": WaterHeaterStateFlag.AWAY | WaterHeaterStateFlag.ON,
783784
},
784785
),
@@ -787,7 +788,8 @@ async def test_switch_command(
787788
{
788789
"key": 1,
789790
"device_id": 0,
790-
"has_fields": WaterHeaterCommandField.STATE,
791+
"has_fields": WaterHeaterCommandField.AWAY_STATE
792+
| WaterHeaterCommandField.ON_STATE,
791793
"state": WaterHeaterStateFlag(0),
792794
},
793795
),

0 commit comments

Comments
 (0)