mirror of
https://github.com/home-assistant/core.git
synced 2025-07-19 11:17:21 +00:00
Add Turn On and Turn Off for Advantage Air climate platform (#88684)
* Added Climate On and Climate Off * Add Tests * Fix off and on in zone * Add test assertions for zone HVAC mode
This commit is contained in:
parent
28e8fae280
commit
e5fc2d3f78
@ -116,6 +116,30 @@ class AdvantageAirAC(AdvantageAirAcEntity, ClimateEntity):
|
|||||||
"""Return the current fan modes."""
|
"""Return the current fan modes."""
|
||||||
return ADVANTAGE_AIR_FAN_MODES.get(self._ac["fan"])
|
return ADVANTAGE_AIR_FAN_MODES.get(self._ac["fan"])
|
||||||
|
|
||||||
|
async def async_turn_on(self) -> None:
|
||||||
|
"""Set the HVAC State to on."""
|
||||||
|
await self.aircon(
|
||||||
|
{
|
||||||
|
self.ac_key: {
|
||||||
|
"info": {
|
||||||
|
"state": ADVANTAGE_AIR_STATE_ON,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
async def async_turn_off(self) -> None:
|
||||||
|
"""Set the HVAC State to off."""
|
||||||
|
await self.aircon(
|
||||||
|
{
|
||||||
|
self.ac_key: {
|
||||||
|
"info": {
|
||||||
|
"state": ADVANTAGE_AIR_STATE_OFF,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None:
|
async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None:
|
||||||
"""Set the HVAC Mode and State."""
|
"""Set the HVAC Mode and State."""
|
||||||
if hvac_mode == HVACMode.OFF:
|
if hvac_mode == HVACMode.OFF:
|
||||||
@ -181,24 +205,32 @@ class AdvantageAirZone(AdvantageAirZoneEntity, ClimateEntity):
|
|||||||
"""Return the target temperature."""
|
"""Return the target temperature."""
|
||||||
return self._zone["setTemp"]
|
return self._zone["setTemp"]
|
||||||
|
|
||||||
|
async def async_turn_on(self) -> None:
|
||||||
|
"""Set the HVAC State to on."""
|
||||||
|
await self.aircon(
|
||||||
|
{
|
||||||
|
self.ac_key: {
|
||||||
|
"zones": {self.zone_key: {"state": ADVANTAGE_AIR_STATE_OPEN}}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
async def async_turn_off(self) -> None:
|
||||||
|
"""Set the HVAC State to off."""
|
||||||
|
await self.aircon(
|
||||||
|
{
|
||||||
|
self.ac_key: {
|
||||||
|
"zones": {self.zone_key: {"state": ADVANTAGE_AIR_STATE_CLOSE}}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None:
|
async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None:
|
||||||
"""Set the HVAC Mode and State."""
|
"""Set the HVAC Mode and State."""
|
||||||
if hvac_mode == HVACMode.OFF:
|
if hvac_mode == HVACMode.OFF:
|
||||||
await self.aircon(
|
await self.async_turn_off()
|
||||||
{
|
|
||||||
self.ac_key: {
|
|
||||||
"zones": {self.zone_key: {"state": ADVANTAGE_AIR_STATE_CLOSE}}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
else:
|
else:
|
||||||
await self.aircon(
|
await self.async_turn_on()
|
||||||
{
|
|
||||||
self.ac_key: {
|
|
||||||
"zones": {self.zone_key: {"state": ADVANTAGE_AIR_STATE_OPEN}}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
async def async_set_temperature(self, **kwargs: Any) -> None:
|
async def async_set_temperature(self, **kwargs: Any) -> None:
|
||||||
"""Set the Temperature."""
|
"""Set the Temperature."""
|
||||||
|
@ -8,8 +8,10 @@ from homeassistant.components.advantage_air.climate import (
|
|||||||
HASS_HVAC_MODES,
|
HASS_HVAC_MODES,
|
||||||
)
|
)
|
||||||
from homeassistant.components.advantage_air.const import (
|
from homeassistant.components.advantage_air.const import (
|
||||||
|
ADVANTAGE_AIR_STATE_CLOSE,
|
||||||
ADVANTAGE_AIR_STATE_OFF,
|
ADVANTAGE_AIR_STATE_OFF,
|
||||||
ADVANTAGE_AIR_STATE_ON,
|
ADVANTAGE_AIR_STATE_ON,
|
||||||
|
ADVANTAGE_AIR_STATE_OPEN,
|
||||||
)
|
)
|
||||||
from homeassistant.components.climate import (
|
from homeassistant.components.climate import (
|
||||||
ATTR_FAN_MODE,
|
ATTR_FAN_MODE,
|
||||||
@ -19,6 +21,8 @@ from homeassistant.components.climate import (
|
|||||||
SERVICE_SET_FAN_MODE,
|
SERVICE_SET_FAN_MODE,
|
||||||
SERVICE_SET_HVAC_MODE,
|
SERVICE_SET_HVAC_MODE,
|
||||||
SERVICE_SET_TEMPERATURE,
|
SERVICE_SET_TEMPERATURE,
|
||||||
|
SERVICE_TURN_OFF,
|
||||||
|
SERVICE_TURN_ON,
|
||||||
HVACMode,
|
HVACMode,
|
||||||
)
|
)
|
||||||
from homeassistant.const import ATTR_ENTITY_ID, ATTR_TEMPERATURE
|
from homeassistant.const import ATTR_ENTITY_ID, ATTR_TEMPERATURE
|
||||||
@ -54,8 +58,6 @@ async def test_climate_async_setup_entry(
|
|||||||
|
|
||||||
registry = er.async_get(hass)
|
registry = er.async_get(hass)
|
||||||
|
|
||||||
assert len(aioclient_mock.mock_calls) == 1
|
|
||||||
|
|
||||||
# Test Main Climate Entity
|
# Test Main Climate Entity
|
||||||
entity_id = "climate.ac_one"
|
entity_id = "climate.ac_one"
|
||||||
state = hass.states.get(entity_id)
|
state = hass.states.get(entity_id)
|
||||||
@ -76,7 +78,6 @@ async def test_climate_async_setup_entry(
|
|||||||
{ATTR_ENTITY_ID: [entity_id], ATTR_HVAC_MODE: HVACMode.FAN_ONLY},
|
{ATTR_ENTITY_ID: [entity_id], ATTR_HVAC_MODE: HVACMode.FAN_ONLY},
|
||||||
blocking=True,
|
blocking=True,
|
||||||
)
|
)
|
||||||
assert len(aioclient_mock.mock_calls) == 3
|
|
||||||
assert aioclient_mock.mock_calls[-2][0] == "GET"
|
assert aioclient_mock.mock_calls[-2][0] == "GET"
|
||||||
assert aioclient_mock.mock_calls[-2][1].path == "/setAircon"
|
assert aioclient_mock.mock_calls[-2][1].path == "/setAircon"
|
||||||
data = loads(aioclient_mock.mock_calls[-2][1].query["json"])
|
data = loads(aioclient_mock.mock_calls[-2][1].query["json"])
|
||||||
@ -91,7 +92,6 @@ async def test_climate_async_setup_entry(
|
|||||||
{ATTR_ENTITY_ID: [entity_id], ATTR_HVAC_MODE: HVACMode.OFF},
|
{ATTR_ENTITY_ID: [entity_id], ATTR_HVAC_MODE: HVACMode.OFF},
|
||||||
blocking=True,
|
blocking=True,
|
||||||
)
|
)
|
||||||
assert len(aioclient_mock.mock_calls) == 5
|
|
||||||
assert aioclient_mock.mock_calls[-2][0] == "GET"
|
assert aioclient_mock.mock_calls[-2][0] == "GET"
|
||||||
assert aioclient_mock.mock_calls[-2][1].path == "/setAircon"
|
assert aioclient_mock.mock_calls[-2][1].path == "/setAircon"
|
||||||
data = loads(aioclient_mock.mock_calls[-2][1].query["json"])
|
data = loads(aioclient_mock.mock_calls[-2][1].query["json"])
|
||||||
@ -105,7 +105,6 @@ async def test_climate_async_setup_entry(
|
|||||||
{ATTR_ENTITY_ID: [entity_id], ATTR_FAN_MODE: FAN_LOW},
|
{ATTR_ENTITY_ID: [entity_id], ATTR_FAN_MODE: FAN_LOW},
|
||||||
blocking=True,
|
blocking=True,
|
||||||
)
|
)
|
||||||
assert len(aioclient_mock.mock_calls) == 7
|
|
||||||
assert aioclient_mock.mock_calls[-2][0] == "GET"
|
assert aioclient_mock.mock_calls[-2][0] == "GET"
|
||||||
assert aioclient_mock.mock_calls[-2][1].path == "/setAircon"
|
assert aioclient_mock.mock_calls[-2][1].path == "/setAircon"
|
||||||
data = loads(aioclient_mock.mock_calls[-2][1].query["json"])
|
data = loads(aioclient_mock.mock_calls[-2][1].query["json"])
|
||||||
@ -119,7 +118,6 @@ async def test_climate_async_setup_entry(
|
|||||||
{ATTR_ENTITY_ID: [entity_id], ATTR_TEMPERATURE: 25},
|
{ATTR_ENTITY_ID: [entity_id], ATTR_TEMPERATURE: 25},
|
||||||
blocking=True,
|
blocking=True,
|
||||||
)
|
)
|
||||||
assert len(aioclient_mock.mock_calls) == 9
|
|
||||||
assert aioclient_mock.mock_calls[-2][0] == "GET"
|
assert aioclient_mock.mock_calls[-2][0] == "GET"
|
||||||
assert aioclient_mock.mock_calls[-2][1].path == "/setAircon"
|
assert aioclient_mock.mock_calls[-2][1].path == "/setAircon"
|
||||||
data = loads(aioclient_mock.mock_calls[-2][1].query["json"])
|
data = loads(aioclient_mock.mock_calls[-2][1].query["json"])
|
||||||
@ -127,6 +125,32 @@ async def test_climate_async_setup_entry(
|
|||||||
assert aioclient_mock.mock_calls[-1][0] == "GET"
|
assert aioclient_mock.mock_calls[-1][0] == "GET"
|
||||||
assert aioclient_mock.mock_calls[-1][1].path == "/getSystemData"
|
assert aioclient_mock.mock_calls[-1][1].path == "/getSystemData"
|
||||||
|
|
||||||
|
await hass.services.async_call(
|
||||||
|
CLIMATE_DOMAIN,
|
||||||
|
SERVICE_TURN_OFF,
|
||||||
|
{ATTR_ENTITY_ID: [entity_id]},
|
||||||
|
blocking=True,
|
||||||
|
)
|
||||||
|
assert aioclient_mock.mock_calls[-2][0] == "GET"
|
||||||
|
assert aioclient_mock.mock_calls[-2][1].path == "/setAircon"
|
||||||
|
data = loads(aioclient_mock.mock_calls[-2][1].query["json"])
|
||||||
|
assert data["ac1"]["info"]["state"] == ADVANTAGE_AIR_STATE_OFF
|
||||||
|
assert aioclient_mock.mock_calls[-1][0] == "GET"
|
||||||
|
assert aioclient_mock.mock_calls[-1][1].path == "/getSystemData"
|
||||||
|
|
||||||
|
await hass.services.async_call(
|
||||||
|
CLIMATE_DOMAIN,
|
||||||
|
SERVICE_TURN_ON,
|
||||||
|
{ATTR_ENTITY_ID: [entity_id]},
|
||||||
|
blocking=True,
|
||||||
|
)
|
||||||
|
assert aioclient_mock.mock_calls[-2][0] == "GET"
|
||||||
|
assert aioclient_mock.mock_calls[-2][1].path == "/setAircon"
|
||||||
|
data = loads(aioclient_mock.mock_calls[-2][1].query["json"])
|
||||||
|
assert data["ac1"]["info"]["state"] == ADVANTAGE_AIR_STATE_ON
|
||||||
|
assert aioclient_mock.mock_calls[-1][0] == "GET"
|
||||||
|
assert aioclient_mock.mock_calls[-1][1].path == "/getSystemData"
|
||||||
|
|
||||||
# Test Climate Zone Entity
|
# Test Climate Zone Entity
|
||||||
entity_id = "climate.ac_one_zone_open_with_sensor"
|
entity_id = "climate.ac_one_zone_open_with_sensor"
|
||||||
state = hass.states.get(entity_id)
|
state = hass.states.get(entity_id)
|
||||||
@ -146,9 +170,11 @@ async def test_climate_async_setup_entry(
|
|||||||
{ATTR_ENTITY_ID: [entity_id], ATTR_HVAC_MODE: HVACMode.FAN_ONLY},
|
{ATTR_ENTITY_ID: [entity_id], ATTR_HVAC_MODE: HVACMode.FAN_ONLY},
|
||||||
blocking=True,
|
blocking=True,
|
||||||
)
|
)
|
||||||
assert len(aioclient_mock.mock_calls) == 11
|
|
||||||
assert aioclient_mock.mock_calls[-2][0] == "GET"
|
assert aioclient_mock.mock_calls[-2][0] == "GET"
|
||||||
assert aioclient_mock.mock_calls[-2][1].path == "/setAircon"
|
assert aioclient_mock.mock_calls[-2][1].path == "/setAircon"
|
||||||
|
data = loads(aioclient_mock.mock_calls[-2][1].query["json"])
|
||||||
|
|
||||||
|
assert data["ac1"]["zones"]["z01"]["state"] == ADVANTAGE_AIR_STATE_OPEN
|
||||||
assert aioclient_mock.mock_calls[-1][0] == "GET"
|
assert aioclient_mock.mock_calls[-1][0] == "GET"
|
||||||
assert aioclient_mock.mock_calls[-1][1].path == "/getSystemData"
|
assert aioclient_mock.mock_calls[-1][1].path == "/getSystemData"
|
||||||
|
|
||||||
@ -158,9 +184,10 @@ async def test_climate_async_setup_entry(
|
|||||||
{ATTR_ENTITY_ID: [entity_id], ATTR_HVAC_MODE: HVACMode.OFF},
|
{ATTR_ENTITY_ID: [entity_id], ATTR_HVAC_MODE: HVACMode.OFF},
|
||||||
blocking=True,
|
blocking=True,
|
||||||
)
|
)
|
||||||
assert len(aioclient_mock.mock_calls) == 13
|
|
||||||
assert aioclient_mock.mock_calls[-2][0] == "GET"
|
assert aioclient_mock.mock_calls[-2][0] == "GET"
|
||||||
assert aioclient_mock.mock_calls[-2][1].path == "/setAircon"
|
assert aioclient_mock.mock_calls[-2][1].path == "/setAircon"
|
||||||
|
data = loads(aioclient_mock.mock_calls[-2][1].query["json"])
|
||||||
|
assert data["ac1"]["zones"]["z01"]["state"] == ADVANTAGE_AIR_STATE_CLOSE
|
||||||
assert aioclient_mock.mock_calls[-1][0] == "GET"
|
assert aioclient_mock.mock_calls[-1][0] == "GET"
|
||||||
assert aioclient_mock.mock_calls[-1][1].path == "/getSystemData"
|
assert aioclient_mock.mock_calls[-1][1].path == "/getSystemData"
|
||||||
|
|
||||||
@ -170,12 +197,37 @@ async def test_climate_async_setup_entry(
|
|||||||
{ATTR_ENTITY_ID: [entity_id], ATTR_TEMPERATURE: 25},
|
{ATTR_ENTITY_ID: [entity_id], ATTR_TEMPERATURE: 25},
|
||||||
blocking=True,
|
blocking=True,
|
||||||
)
|
)
|
||||||
assert len(aioclient_mock.mock_calls) == 15
|
|
||||||
assert aioclient_mock.mock_calls[-2][0] == "GET"
|
assert aioclient_mock.mock_calls[-2][0] == "GET"
|
||||||
assert aioclient_mock.mock_calls[-2][1].path == "/setAircon"
|
assert aioclient_mock.mock_calls[-2][1].path == "/setAircon"
|
||||||
assert aioclient_mock.mock_calls[-1][0] == "GET"
|
assert aioclient_mock.mock_calls[-1][0] == "GET"
|
||||||
assert aioclient_mock.mock_calls[-1][1].path == "/getSystemData"
|
assert aioclient_mock.mock_calls[-1][1].path == "/getSystemData"
|
||||||
|
|
||||||
|
await hass.services.async_call(
|
||||||
|
CLIMATE_DOMAIN,
|
||||||
|
SERVICE_TURN_OFF,
|
||||||
|
{ATTR_ENTITY_ID: [entity_id]},
|
||||||
|
blocking=True,
|
||||||
|
)
|
||||||
|
assert aioclient_mock.mock_calls[-2][0] == "GET"
|
||||||
|
assert aioclient_mock.mock_calls[-2][1].path == "/setAircon"
|
||||||
|
data = loads(aioclient_mock.mock_calls[-2][1].query["json"])
|
||||||
|
assert data["ac1"]["zones"]["z01"]["state"] == ADVANTAGE_AIR_STATE_CLOSE
|
||||||
|
assert aioclient_mock.mock_calls[-1][0] == "GET"
|
||||||
|
assert aioclient_mock.mock_calls[-1][1].path == "/getSystemData"
|
||||||
|
|
||||||
|
await hass.services.async_call(
|
||||||
|
CLIMATE_DOMAIN,
|
||||||
|
SERVICE_TURN_ON,
|
||||||
|
{ATTR_ENTITY_ID: [entity_id]},
|
||||||
|
blocking=True,
|
||||||
|
)
|
||||||
|
assert aioclient_mock.mock_calls[-2][0] == "GET"
|
||||||
|
assert aioclient_mock.mock_calls[-2][1].path == "/setAircon"
|
||||||
|
data = loads(aioclient_mock.mock_calls[-2][1].query["json"])
|
||||||
|
assert data["ac1"]["zones"]["z01"]["state"] == ADVANTAGE_AIR_STATE_OPEN
|
||||||
|
assert aioclient_mock.mock_calls[-1][0] == "GET"
|
||||||
|
assert aioclient_mock.mock_calls[-1][1].path == "/getSystemData"
|
||||||
|
|
||||||
|
|
||||||
async def test_climate_async_failed_update(
|
async def test_climate_async_failed_update(
|
||||||
hass: HomeAssistant, aioclient_mock: AiohttpClientMocker
|
hass: HomeAssistant, aioclient_mock: AiohttpClientMocker
|
||||||
@ -192,8 +244,6 @@ async def test_climate_async_failed_update(
|
|||||||
)
|
)
|
||||||
await add_mock_config(hass)
|
await add_mock_config(hass)
|
||||||
|
|
||||||
assert len(aioclient_mock.mock_calls) == 1
|
|
||||||
|
|
||||||
with pytest.raises(HomeAssistantError):
|
with pytest.raises(HomeAssistantError):
|
||||||
await hass.services.async_call(
|
await hass.services.async_call(
|
||||||
CLIMATE_DOMAIN,
|
CLIMATE_DOMAIN,
|
||||||
@ -201,6 +251,5 @@ async def test_climate_async_failed_update(
|
|||||||
{ATTR_ENTITY_ID: ["climate.ac_one"], ATTR_TEMPERATURE: 25},
|
{ATTR_ENTITY_ID: ["climate.ac_one"], ATTR_TEMPERATURE: 25},
|
||||||
blocking=True,
|
blocking=True,
|
||||||
)
|
)
|
||||||
assert len(aioclient_mock.mock_calls) == 2
|
|
||||||
assert aioclient_mock.mock_calls[-1][0] == "GET"
|
assert aioclient_mock.mock_calls[-1][0] == "GET"
|
||||||
assert aioclient_mock.mock_calls[-1][1].path == "/setAircon"
|
assert aioclient_mock.mock_calls[-1][1].path == "/setAircon"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user