1
0
mirror of https://github.com/home-assistant/core.git synced 2025-12-24 21:06:19 +00:00

Fix zwave_js preset mode lookup (#47851)

This commit is contained in:
Martin Hjelmare
2021-03-13 22:27:05 +01:00
committed by GitHub
parent 7d8eb49d88
commit c53a462b3d
5 changed files with 853 additions and 1 deletions

View File

@@ -9,6 +9,7 @@ from homeassistant.components.climate.const import (
ATTR_HVAC_ACTION,
ATTR_HVAC_MODE,
ATTR_HVAC_MODES,
ATTR_PRESET_MODE,
ATTR_TARGET_TEMP_HIGH,
ATTR_TARGET_TEMP_LOW,
CURRENT_HVAC_IDLE,
@@ -18,8 +19,10 @@ from homeassistant.components.climate.const import (
HVAC_MODE_HEAT,
HVAC_MODE_HEAT_COOL,
HVAC_MODE_OFF,
PRESET_NONE,
SERVICE_SET_FAN_MODE,
SERVICE_SET_HVAC_MODE,
SERVICE_SET_PRESET_MODE,
SERVICE_SET_TEMPERATURE,
SUPPORT_FAN_MODE,
SUPPORT_TARGET_TEMPERATURE,
@@ -34,6 +37,7 @@ from homeassistant.const import (
from .common import (
CLIMATE_DANFOSS_LC13_ENTITY,
CLIMATE_EUROTRONICS_SPIRIT_Z_ENTITY,
CLIMATE_FLOOR_THERMOSTAT_ENTITY,
CLIMATE_MAIN_HEAT_ACTIONNER,
CLIMATE_RADIO_THERMOSTAT_ENTITY,
@@ -457,3 +461,120 @@ async def test_thermostat_srt321_hrt4_zw(hass, client, srt321_hrt4_zw, integrati
]
assert state.attributes[ATTR_CURRENT_TEMPERATURE] is None
assert state.attributes[ATTR_SUPPORTED_FEATURES] == 0
async def test_preset_and_no_setpoint(
hass, client, climate_eurotronic_spirit_z, integration
):
"""Test preset without setpoint value."""
node = climate_eurotronic_spirit_z
state = hass.states.get(CLIMATE_EUROTRONICS_SPIRIT_Z_ENTITY)
assert state
assert state.state == HVAC_MODE_HEAT
assert state.attributes[ATTR_TEMPERATURE] == 22
# Test setting preset mode Full power
await hass.services.async_call(
CLIMATE_DOMAIN,
SERVICE_SET_PRESET_MODE,
{
ATTR_ENTITY_ID: CLIMATE_EUROTRONICS_SPIRIT_Z_ENTITY,
ATTR_PRESET_MODE: "Full power",
},
blocking=True,
)
assert len(client.async_send_command_no_wait.call_args_list) == 1
args = client.async_send_command_no_wait.call_args[0][0]
assert args["command"] == "node.set_value"
assert args["nodeId"] == 8
assert args["valueId"] == {
"commandClassName": "Thermostat Mode",
"commandClass": 64,
"endpoint": 0,
"property": "mode",
"propertyName": "mode",
"ccVersion": 3,
"metadata": {
"type": "number",
"readable": True,
"writeable": True,
"min": 0,
"max": 31,
"label": "Thermostat mode",
"states": {
"0": "Off",
"1": "Heat",
"11": "Energy heat",
"15": "Full power",
},
},
"value": 1,
}
assert args["value"] == 15
client.async_send_command_no_wait.reset_mock()
# Test Full power preset update from value updated event
event = Event(
type="value updated",
data={
"source": "node",
"event": "value updated",
"nodeId": 8,
"args": {
"commandClassName": "Thermostat Mode",
"commandClass": 64,
"endpoint": 0,
"property": "mode",
"propertyName": "mode",
"newValue": 15,
"prevValue": 1,
},
},
)
node.receive_event(event)
state = hass.states.get(CLIMATE_EUROTRONICS_SPIRIT_Z_ENTITY)
assert state.state == HVAC_MODE_HEAT
assert state.attributes[ATTR_TEMPERATURE] is None
assert state.attributes[ATTR_PRESET_MODE] == "Full power"
with pytest.raises(ValueError):
# Test setting invalid preset mode
await hass.services.async_call(
CLIMATE_DOMAIN,
SERVICE_SET_PRESET_MODE,
{
ATTR_ENTITY_ID: CLIMATE_EUROTRONICS_SPIRIT_Z_ENTITY,
ATTR_PRESET_MODE: "invalid_preset",
},
blocking=True,
)
assert len(client.async_send_command_no_wait.call_args_list) == 0
client.async_send_command_no_wait.reset_mock()
# Restore hvac mode by setting preset None
await hass.services.async_call(
CLIMATE_DOMAIN,
SERVICE_SET_PRESET_MODE,
{
ATTR_ENTITY_ID: CLIMATE_EUROTRONICS_SPIRIT_Z_ENTITY,
ATTR_PRESET_MODE: PRESET_NONE,
},
blocking=True,
)
assert len(client.async_send_command_no_wait.call_args_list) == 1
args = client.async_send_command_no_wait.call_args[0][0]
assert args["command"] == "node.set_value"
assert args["nodeId"] == 8
assert args["valueId"]["commandClass"] == 64
assert args["valueId"]["endpoint"] == 0
assert args["valueId"]["property"] == "mode"
assert args["value"] == 1
client.async_send_command_no_wait.reset_mock()