2017-08-12 16:39:05 +00:00
|
|
|
"""The tests for the climate component."""
|
2021-03-18 14:13:22 +00:00
|
|
|
from __future__ import annotations
|
|
|
|
|
2023-12-20 23:00:21 +00:00
|
|
|
from enum import Enum
|
|
|
|
from types import ModuleType
|
2021-01-01 21:31:56 +00:00
|
|
|
from unittest.mock import MagicMock
|
2017-08-12 16:39:05 +00:00
|
|
|
|
2018-11-30 20:28:35 +00:00
|
|
|
import pytest
|
|
|
|
import voluptuous as vol
|
|
|
|
|
2023-12-20 23:00:21 +00:00
|
|
|
from homeassistant.components import climate
|
2019-11-19 19:42:09 +00:00
|
|
|
from homeassistant.components.climate import (
|
2023-12-27 13:51:39 +00:00
|
|
|
DOMAIN,
|
2019-12-08 16:55:01 +00:00
|
|
|
SET_TEMPERATURE_SCHEMA,
|
2020-04-25 16:04:03 +00:00
|
|
|
ClimateEntity,
|
2022-09-20 18:30:54 +00:00
|
|
|
HVACMode,
|
2019-11-19 19:42:09 +00:00
|
|
|
)
|
2023-12-27 13:51:39 +00:00
|
|
|
from homeassistant.components.climate.const import (
|
|
|
|
ATTR_FAN_MODE,
|
|
|
|
ATTR_PRESET_MODE,
|
|
|
|
ATTR_SWING_MODE,
|
|
|
|
SERVICE_SET_FAN_MODE,
|
|
|
|
SERVICE_SET_PRESET_MODE,
|
|
|
|
SERVICE_SET_SWING_MODE,
|
|
|
|
ClimateEntityFeature,
|
|
|
|
)
|
|
|
|
from homeassistant.config_entries import ConfigEntry
|
|
|
|
from homeassistant.const import UnitOfTemperature
|
2023-02-08 17:08:43 +00:00
|
|
|
from homeassistant.core import HomeAssistant
|
2023-12-27 13:51:39 +00:00
|
|
|
from homeassistant.exceptions import ServiceValidationError
|
|
|
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
2019-12-08 16:55:01 +00:00
|
|
|
|
2023-12-20 23:00:21 +00:00
|
|
|
from tests.common import (
|
2023-12-27 13:51:39 +00:00
|
|
|
MockConfigEntry,
|
|
|
|
MockEntity,
|
|
|
|
MockModule,
|
|
|
|
MockPlatform,
|
2023-12-20 23:00:21 +00:00
|
|
|
async_mock_service,
|
|
|
|
import_and_test_deprecated_constant,
|
|
|
|
import_and_test_deprecated_constant_enum,
|
2023-12-27 13:51:39 +00:00
|
|
|
mock_integration,
|
|
|
|
mock_platform,
|
2023-12-20 23:00:21 +00:00
|
|
|
)
|
2017-08-12 16:39:05 +00:00
|
|
|
|
|
|
|
|
2023-02-08 17:08:43 +00:00
|
|
|
async def test_set_temp_schema_no_req(
|
|
|
|
hass: HomeAssistant, caplog: pytest.LogCaptureFixture
|
|
|
|
) -> None:
|
2017-08-12 16:39:05 +00:00
|
|
|
"""Test the set temperature schema with missing required data."""
|
2019-07-31 19:25:30 +00:00
|
|
|
domain = "climate"
|
|
|
|
service = "test_set_temperature"
|
2017-08-12 16:39:05 +00:00
|
|
|
schema = SET_TEMPERATURE_SCHEMA
|
|
|
|
calls = async_mock_service(hass, domain, service, schema)
|
|
|
|
|
2019-07-31 19:25:30 +00:00
|
|
|
data = {"hvac_mode": "off", "entity_id": ["climate.test_id"]}
|
2018-11-30 20:28:35 +00:00
|
|
|
with pytest.raises(vol.Invalid):
|
Climate 1.0 (#23899)
* Climate 1.0 / part 1/2/3
* fix flake
* Lint
* Update Google Assistant
* ambiclimate to climate 1.0 (#24911)
* Fix Alexa
* Lint
* Migrate zhong_hong
* Migrate tuya
* Migrate honeywell to new climate schema (#24257)
* Update one
* Fix model climate v2
* Cleanup p4
* Add comfort hold mode
* Fix old code
* Update homeassistant/components/climate/__init__.py
Co-Authored-By: Paulus Schoutsen <paulus@home-assistant.io>
* Update homeassistant/components/climate/const.py
Co-Authored-By: Paulus Schoutsen <paulus@home-assistant.io>
* First renaming
* Rename operation to hvac for paulus
* Rename hold mode to preset mode
* Cleanup & update comments
* Remove on/off
* Fix supported feature count
* Update services
* Update demo
* Fix tests & use current_hvac
* Update comment
* Fix tests & add typing
* Add more typing
* Update modes
* Fix tests
* Cleanup low/high with range
* Update homematic part 1
* Finish homematic
* Fix lint
* fix hm mapping
* Support simple devices
* convert lcn
* migrate oem
* Fix xs1
* update hive
* update mil
* Update toon
* migrate deconz
* cleanup
* update tesla
* Fix lint
* Fix vera
* Migrate zwave
* Migrate velbus
* Cleanup humity feature
* Cleanup
* Migrate wink
* migrate dyson
* Fix current hvac
* Renaming
* Fix lint
* Migrate tfiac
* migrate tado
* Fix PRESET can be None
* apply PR#23913 from dev
* remove EU component, etc.
* remove EU component, etc.
* ready to test now
* de-linted
* some tweaks
* de-lint
* better handling of edge cases
* delint
* fix set_mode typos
* apply PR#23913 from dev
* remove EU component, etc.
* ready to test now
* de-linted
* some tweaks
* de-lint
* better handling of edge cases
* delint
* fix set_mode typos
* delint, move debug code
* away preset now working
* code tidy-up
* code tidy-up 2
* code tidy-up 3
* address issues #18932, #15063
* address issues #18932, #15063 - 2/2
* refactor MODE_AUTO to MODE_HEAT_COOL and use F not C
* add low/high to set_temp
* add low/high to set_temp 2
* add low/high to set_temp - delint
* run HA scripts
* port changes from PR #24402
* manual rebase
* manual rebase 2
* delint
* minor change
* remove SUPPORT_HVAC_ACTION
* Migrate radiotherm
* Convert touchline
* Migrate flexit
* Migrate nuheat
* Migrate maxcube
* Fix names maxcube const
* Migrate proliphix
* Migrate heatmiser
* Migrate fritzbox
* Migrate opentherm_gw
* Migrate venstar
* Migrate daikin
* Migrate modbus
* Fix elif
* Migrate Homematic IP Cloud to climate-1.0 (#24913)
* hmip climate fix
* Update hvac_mode and preset_mode
* fix lint
* Fix lint
* Migrate generic_thermostat
* Migrate incomfort to new climate schema (#24915)
* initial commit
* Update climate.py
* Migrate eq3btsmart
* Lint
* cleanup PRESET_MANUAL
* Migrate ecobee
* No conditional features
* KNX: Migrate climate component to new climate platform (#24931)
* Migrate climate component
* Remove unused code
* Corrected line length
* Lint
* Lint
* fix tests
* Fix value
* Migrate geniushub to new climate schema (#24191)
* Update one
* Fix model climate v2
* Cleanup p4
* Add comfort hold mode
* Fix old code
* Update homeassistant/components/climate/__init__.py
Co-Authored-By: Paulus Schoutsen <paulus@home-assistant.io>
* Update homeassistant/components/climate/const.py
Co-Authored-By: Paulus Schoutsen <paulus@home-assistant.io>
* First renaming
* Rename operation to hvac for paulus
* Rename hold mode to preset mode
* Cleanup & update comments
* Remove on/off
* Fix supported feature count
* Update services
* Update demo
* Fix tests & use current_hvac
* Update comment
* Fix tests & add typing
* Add more typing
* Update modes
* Fix tests
* Cleanup low/high with range
* Update homematic part 1
* Finish homematic
* Fix lint
* fix hm mapping
* Support simple devices
* convert lcn
* migrate oem
* Fix xs1
* update hive
* update mil
* Update toon
* migrate deconz
* cleanup
* update tesla
* Fix lint
* Fix vera
* Migrate zwave
* Migrate velbus
* Cleanup humity feature
* Cleanup
* Migrate wink
* migrate dyson
* Fix current hvac
* Renaming
* Fix lint
* Migrate tfiac
* migrate tado
* delinted
* delinted
* use latest client
* clean up mappings
* clean up mappings
* add duration to set_temperature
* add duration to set_temperature
* manual rebase
* tweak
* fix regression
* small fix
* fix rebase mixup
* address comments
* finish refactor
* fix regression
* tweak type hints
* delint
* manual rebase
* WIP: Fixes for honeywell migration to climate-1.0 (#24938)
* add type hints
* code tidy-up
* Fixes for incomfort migration to climate-1.0 (#24936)
* delint type hints
* no async unless await
* revert: no async unless await
* revert: no async unless await 2
* delint
* fix typo
* Fix homekit_controller on climate-1.0 (#24948)
* Fix tests on climate-1.0 branch
* As part of climate-1.0, make state return the heating-cooling.current characteristic
* Fixes from review
* lint
* Fix imports
* Migrate stibel_eltron
* Fix lint
* Migrate coolmaster to climate 1.0 (#24967)
* Migrate coolmaster to climate 1.0
* fix lint errors
* More lint fixes
* Fix demo to work with UI
* Migrate spider
* Demo update
* Updated frontend to 20190705.0
* Fix boost mode (#24980)
* Prepare Netatmo for climate 1.0 (#24973)
* Migration Netatmo
* Address comments
* Update climate.py
* Migrate ephember
* Migrate Sensibo
* Implemented review comments (#24942)
* Migrate ESPHome
* Migrate MQTT
* Migrate Nest
* Migrate melissa
* Initial/partial migration of ST
* Migrate ST
* Remove Away mode (#24995)
* Migrate evohome, cache access tokens (#24491)
* add water_heater, add storage - initial commit
* add water_heater, add storage - initial commit
delint
add missing code
desiderata
update honeywell client library & CODEOWNER
add auth_tokens code, refactor & delint
refactor for broker
delint
* Add Broker, Water Heater & Refactor
add missing code
desiderata
* update honeywell client library & CODEOWNER
add auth_tokens code, refactor & delint
refactor for broker
* bugfix - loc_idx may not be 0
more refactor - ensure pure async
more refactoring
appears all r/o attributes are working
tweak precsion, DHW & delint
remove unused code
remove unused code 2
remove unused code, refactor _save_auth_tokens()
* support RoundThermostat
bugfix opmode, switch to util.dt, add until=1h
revert breaking change
* store at_expires as naive UTC
remove debug code
delint
tidy up exception handling
delint
add water_heater, add storage - initial commit
delint
add missing code
desiderata
update honeywell client library & CODEOWNER
add auth_tokens code, refactor & delint
refactor for broker
add water_heater, add storage - initial commit
delint
add missing code
desiderata
update honeywell client library & CODEOWNER
add auth_tokens code, refactor & delint
refactor for broker
delint
bugfix - loc_idx may not be 0
more refactor - ensure pure async
more refactoring
appears all r/o attributes are working
tweak precsion, DHW & delint
remove unused code
remove unused code 2
remove unused code, refactor _save_auth_tokens()
support RoundThermostat
bugfix opmode, switch to util.dt, add until=1h
revert breaking change
store at_expires as naive UTC
remove debug code
delint
tidy up exception handling
delint
* update CODEOWNERS
* fix regression
* fix requirements
* migrate to climate-1.0
* tweaking
* de-lint
* TCS working? & delint
* tweaking
* TCS code finalised
* remove available() logic
* refactor _switchpoints()
* tidy up switchpoint code
* tweak
* teaking device_state_attributes
* some refactoring
* move PRESET_CUSTOM back to evohome
* move CONF_ACCESS_TOKEN_EXPIRES CONF_REFRESH_TOKEN back to evohome
* refactor SP code and dt conversion
* delinted
* delinted
* remove water_heater
* fix regression
* Migrate homekit
* Cleanup away mode
* Fix tests
* add helpers
* fix tests melissa
* Fix nehueat
* fix zwave
* add more tests
* fix deconz
* Fix climate test emulate_hue
* fix tests
* fix dyson tests
* fix demo with new layout
* fix honeywell
* Switch homekit_controller to use HVAC_MODE_HEAT_COOL instead of HVAC_MODE_AUTO (#25009)
* Lint
* PyLint
* Pylint
* fix fritzbox tests
* Fix google
* Fix all tests
* Fix lint
* Fix auto for homekit like controler
* Fix lint
* fix lint
2019-07-08 12:00:24 +00:00
|
|
|
await hass.services.async_call(domain, service, data)
|
|
|
|
await hass.async_block_till_done()
|
2017-08-12 16:39:05 +00:00
|
|
|
|
|
|
|
assert len(calls) == 0
|
|
|
|
|
|
|
|
|
2023-02-08 17:08:43 +00:00
|
|
|
async def test_set_temp_schema(
|
|
|
|
hass: HomeAssistant, caplog: pytest.LogCaptureFixture
|
|
|
|
) -> None:
|
2017-08-12 16:39:05 +00:00
|
|
|
"""Test the set temperature schema with ok required data."""
|
2019-07-31 19:25:30 +00:00
|
|
|
domain = "climate"
|
|
|
|
service = "test_set_temperature"
|
2017-08-12 16:39:05 +00:00
|
|
|
schema = SET_TEMPERATURE_SCHEMA
|
|
|
|
calls = async_mock_service(hass, domain, service, schema)
|
|
|
|
|
2019-07-31 19:25:30 +00:00
|
|
|
data = {"temperature": 20.0, "hvac_mode": "heat", "entity_id": ["climate.test_id"]}
|
Climate 1.0 (#23899)
* Climate 1.0 / part 1/2/3
* fix flake
* Lint
* Update Google Assistant
* ambiclimate to climate 1.0 (#24911)
* Fix Alexa
* Lint
* Migrate zhong_hong
* Migrate tuya
* Migrate honeywell to new climate schema (#24257)
* Update one
* Fix model climate v2
* Cleanup p4
* Add comfort hold mode
* Fix old code
* Update homeassistant/components/climate/__init__.py
Co-Authored-By: Paulus Schoutsen <paulus@home-assistant.io>
* Update homeassistant/components/climate/const.py
Co-Authored-By: Paulus Schoutsen <paulus@home-assistant.io>
* First renaming
* Rename operation to hvac for paulus
* Rename hold mode to preset mode
* Cleanup & update comments
* Remove on/off
* Fix supported feature count
* Update services
* Update demo
* Fix tests & use current_hvac
* Update comment
* Fix tests & add typing
* Add more typing
* Update modes
* Fix tests
* Cleanup low/high with range
* Update homematic part 1
* Finish homematic
* Fix lint
* fix hm mapping
* Support simple devices
* convert lcn
* migrate oem
* Fix xs1
* update hive
* update mil
* Update toon
* migrate deconz
* cleanup
* update tesla
* Fix lint
* Fix vera
* Migrate zwave
* Migrate velbus
* Cleanup humity feature
* Cleanup
* Migrate wink
* migrate dyson
* Fix current hvac
* Renaming
* Fix lint
* Migrate tfiac
* migrate tado
* Fix PRESET can be None
* apply PR#23913 from dev
* remove EU component, etc.
* remove EU component, etc.
* ready to test now
* de-linted
* some tweaks
* de-lint
* better handling of edge cases
* delint
* fix set_mode typos
* apply PR#23913 from dev
* remove EU component, etc.
* ready to test now
* de-linted
* some tweaks
* de-lint
* better handling of edge cases
* delint
* fix set_mode typos
* delint, move debug code
* away preset now working
* code tidy-up
* code tidy-up 2
* code tidy-up 3
* address issues #18932, #15063
* address issues #18932, #15063 - 2/2
* refactor MODE_AUTO to MODE_HEAT_COOL and use F not C
* add low/high to set_temp
* add low/high to set_temp 2
* add low/high to set_temp - delint
* run HA scripts
* port changes from PR #24402
* manual rebase
* manual rebase 2
* delint
* minor change
* remove SUPPORT_HVAC_ACTION
* Migrate radiotherm
* Convert touchline
* Migrate flexit
* Migrate nuheat
* Migrate maxcube
* Fix names maxcube const
* Migrate proliphix
* Migrate heatmiser
* Migrate fritzbox
* Migrate opentherm_gw
* Migrate venstar
* Migrate daikin
* Migrate modbus
* Fix elif
* Migrate Homematic IP Cloud to climate-1.0 (#24913)
* hmip climate fix
* Update hvac_mode and preset_mode
* fix lint
* Fix lint
* Migrate generic_thermostat
* Migrate incomfort to new climate schema (#24915)
* initial commit
* Update climate.py
* Migrate eq3btsmart
* Lint
* cleanup PRESET_MANUAL
* Migrate ecobee
* No conditional features
* KNX: Migrate climate component to new climate platform (#24931)
* Migrate climate component
* Remove unused code
* Corrected line length
* Lint
* Lint
* fix tests
* Fix value
* Migrate geniushub to new climate schema (#24191)
* Update one
* Fix model climate v2
* Cleanup p4
* Add comfort hold mode
* Fix old code
* Update homeassistant/components/climate/__init__.py
Co-Authored-By: Paulus Schoutsen <paulus@home-assistant.io>
* Update homeassistant/components/climate/const.py
Co-Authored-By: Paulus Schoutsen <paulus@home-assistant.io>
* First renaming
* Rename operation to hvac for paulus
* Rename hold mode to preset mode
* Cleanup & update comments
* Remove on/off
* Fix supported feature count
* Update services
* Update demo
* Fix tests & use current_hvac
* Update comment
* Fix tests & add typing
* Add more typing
* Update modes
* Fix tests
* Cleanup low/high with range
* Update homematic part 1
* Finish homematic
* Fix lint
* fix hm mapping
* Support simple devices
* convert lcn
* migrate oem
* Fix xs1
* update hive
* update mil
* Update toon
* migrate deconz
* cleanup
* update tesla
* Fix lint
* Fix vera
* Migrate zwave
* Migrate velbus
* Cleanup humity feature
* Cleanup
* Migrate wink
* migrate dyson
* Fix current hvac
* Renaming
* Fix lint
* Migrate tfiac
* migrate tado
* delinted
* delinted
* use latest client
* clean up mappings
* clean up mappings
* add duration to set_temperature
* add duration to set_temperature
* manual rebase
* tweak
* fix regression
* small fix
* fix rebase mixup
* address comments
* finish refactor
* fix regression
* tweak type hints
* delint
* manual rebase
* WIP: Fixes for honeywell migration to climate-1.0 (#24938)
* add type hints
* code tidy-up
* Fixes for incomfort migration to climate-1.0 (#24936)
* delint type hints
* no async unless await
* revert: no async unless await
* revert: no async unless await 2
* delint
* fix typo
* Fix homekit_controller on climate-1.0 (#24948)
* Fix tests on climate-1.0 branch
* As part of climate-1.0, make state return the heating-cooling.current characteristic
* Fixes from review
* lint
* Fix imports
* Migrate stibel_eltron
* Fix lint
* Migrate coolmaster to climate 1.0 (#24967)
* Migrate coolmaster to climate 1.0
* fix lint errors
* More lint fixes
* Fix demo to work with UI
* Migrate spider
* Demo update
* Updated frontend to 20190705.0
* Fix boost mode (#24980)
* Prepare Netatmo for climate 1.0 (#24973)
* Migration Netatmo
* Address comments
* Update climate.py
* Migrate ephember
* Migrate Sensibo
* Implemented review comments (#24942)
* Migrate ESPHome
* Migrate MQTT
* Migrate Nest
* Migrate melissa
* Initial/partial migration of ST
* Migrate ST
* Remove Away mode (#24995)
* Migrate evohome, cache access tokens (#24491)
* add water_heater, add storage - initial commit
* add water_heater, add storage - initial commit
delint
add missing code
desiderata
update honeywell client library & CODEOWNER
add auth_tokens code, refactor & delint
refactor for broker
delint
* Add Broker, Water Heater & Refactor
add missing code
desiderata
* update honeywell client library & CODEOWNER
add auth_tokens code, refactor & delint
refactor for broker
* bugfix - loc_idx may not be 0
more refactor - ensure pure async
more refactoring
appears all r/o attributes are working
tweak precsion, DHW & delint
remove unused code
remove unused code 2
remove unused code, refactor _save_auth_tokens()
* support RoundThermostat
bugfix opmode, switch to util.dt, add until=1h
revert breaking change
* store at_expires as naive UTC
remove debug code
delint
tidy up exception handling
delint
add water_heater, add storage - initial commit
delint
add missing code
desiderata
update honeywell client library & CODEOWNER
add auth_tokens code, refactor & delint
refactor for broker
add water_heater, add storage - initial commit
delint
add missing code
desiderata
update honeywell client library & CODEOWNER
add auth_tokens code, refactor & delint
refactor for broker
delint
bugfix - loc_idx may not be 0
more refactor - ensure pure async
more refactoring
appears all r/o attributes are working
tweak precsion, DHW & delint
remove unused code
remove unused code 2
remove unused code, refactor _save_auth_tokens()
support RoundThermostat
bugfix opmode, switch to util.dt, add until=1h
revert breaking change
store at_expires as naive UTC
remove debug code
delint
tidy up exception handling
delint
* update CODEOWNERS
* fix regression
* fix requirements
* migrate to climate-1.0
* tweaking
* de-lint
* TCS working? & delint
* tweaking
* TCS code finalised
* remove available() logic
* refactor _switchpoints()
* tidy up switchpoint code
* tweak
* teaking device_state_attributes
* some refactoring
* move PRESET_CUSTOM back to evohome
* move CONF_ACCESS_TOKEN_EXPIRES CONF_REFRESH_TOKEN back to evohome
* refactor SP code and dt conversion
* delinted
* delinted
* remove water_heater
* fix regression
* Migrate homekit
* Cleanup away mode
* Fix tests
* add helpers
* fix tests melissa
* Fix nehueat
* fix zwave
* add more tests
* fix deconz
* Fix climate test emulate_hue
* fix tests
* fix dyson tests
* fix demo with new layout
* fix honeywell
* Switch homekit_controller to use HVAC_MODE_HEAT_COOL instead of HVAC_MODE_AUTO (#25009)
* Lint
* PyLint
* Pylint
* fix fritzbox tests
* Fix google
* Fix all tests
* Fix lint
* Fix auto for homekit like controler
* Fix lint
* fix lint
2019-07-08 12:00:24 +00:00
|
|
|
await hass.services.async_call(domain, service, data)
|
|
|
|
await hass.async_block_till_done()
|
2017-08-12 16:39:05 +00:00
|
|
|
|
|
|
|
assert len(calls) == 1
|
|
|
|
assert calls[-1].data == data
|
2019-07-11 22:28:11 +00:00
|
|
|
|
|
|
|
|
2023-12-27 13:51:39 +00:00
|
|
|
class MockClimateEntity(MockEntity, ClimateEntity):
|
2019-11-19 19:42:09 +00:00
|
|
|
"""Mock Climate device to use in tests."""
|
|
|
|
|
2023-12-27 13:51:39 +00:00
|
|
|
_attr_supported_features = (
|
|
|
|
ClimateEntityFeature.FAN_MODE
|
|
|
|
| ClimateEntityFeature.PRESET_MODE
|
|
|
|
| ClimateEntityFeature.SWING_MODE
|
|
|
|
)
|
|
|
|
_attr_preset_mode = "home"
|
|
|
|
_attr_preset_modes = ["home", "away"]
|
|
|
|
_attr_fan_mode = "auto"
|
|
|
|
_attr_fan_modes = ["auto", "off"]
|
|
|
|
_attr_swing_mode = "auto"
|
|
|
|
_attr_swing_modes = ["auto", "off"]
|
|
|
|
_attr_temperature_unit = UnitOfTemperature.CELSIUS
|
|
|
|
|
2019-11-19 19:42:09 +00:00
|
|
|
@property
|
2022-09-20 18:30:54 +00:00
|
|
|
def hvac_mode(self) -> HVACMode:
|
2019-11-19 19:42:09 +00:00
|
|
|
"""Return hvac operation ie. heat, cool mode.
|
|
|
|
|
2022-09-20 18:30:54 +00:00
|
|
|
Need to be one of HVACMode.*.
|
2019-11-19 19:42:09 +00:00
|
|
|
"""
|
2022-09-20 18:30:54 +00:00
|
|
|
return HVACMode.HEAT
|
2019-11-19 19:42:09 +00:00
|
|
|
|
|
|
|
@property
|
2022-09-20 18:30:54 +00:00
|
|
|
def hvac_modes(self) -> list[HVACMode]:
|
2019-11-19 19:42:09 +00:00
|
|
|
"""Return the list of available hvac operation modes.
|
|
|
|
|
|
|
|
Need to be a subset of HVAC_MODES.
|
|
|
|
"""
|
2022-09-20 18:30:54 +00:00
|
|
|
return [HVACMode.OFF, HVACMode.HEAT]
|
2019-11-19 19:42:09 +00:00
|
|
|
|
2020-05-20 21:47:30 +00:00
|
|
|
def turn_on(self) -> None:
|
|
|
|
"""Turn on."""
|
|
|
|
|
|
|
|
def turn_off(self) -> None:
|
|
|
|
"""Turn off."""
|
|
|
|
|
2023-12-27 13:51:39 +00:00
|
|
|
def set_preset_mode(self, preset_mode: str) -> None:
|
|
|
|
"""Set preset mode."""
|
|
|
|
self._attr_preset_mode = preset_mode
|
|
|
|
|
|
|
|
def set_fan_mode(self, fan_mode: str) -> None:
|
|
|
|
"""Set fan mode."""
|
|
|
|
self._attr_fan_mode = fan_mode
|
|
|
|
|
|
|
|
def set_swing_mode(self, swing_mode: str) -> None:
|
|
|
|
"""Set swing mode."""
|
|
|
|
self._attr_swing_mode = swing_mode
|
|
|
|
|
2019-11-19 19:42:09 +00:00
|
|
|
|
2023-02-08 17:08:43 +00:00
|
|
|
async def test_sync_turn_on(hass: HomeAssistant) -> None:
|
2019-11-19 19:42:09 +00:00
|
|
|
"""Test if async turn_on calls sync turn_on."""
|
2020-04-25 16:04:03 +00:00
|
|
|
climate = MockClimateEntity()
|
2019-07-11 22:28:11 +00:00
|
|
|
climate.hass = hass
|
|
|
|
|
|
|
|
climate.turn_on = MagicMock()
|
|
|
|
await climate.async_turn_on()
|
|
|
|
|
|
|
|
assert climate.turn_on.called
|
|
|
|
|
|
|
|
|
2023-02-08 17:08:43 +00:00
|
|
|
async def test_sync_turn_off(hass: HomeAssistant) -> None:
|
2019-11-19 19:42:09 +00:00
|
|
|
"""Test if async turn_off calls sync turn_off."""
|
2020-04-25 16:04:03 +00:00
|
|
|
climate = MockClimateEntity()
|
2019-07-11 22:28:11 +00:00
|
|
|
climate.hass = hass
|
|
|
|
|
|
|
|
climate.turn_off = MagicMock()
|
|
|
|
await climate.async_turn_off()
|
|
|
|
|
|
|
|
assert climate.turn_off.called
|
2023-12-20 23:00:21 +00:00
|
|
|
|
|
|
|
|
|
|
|
def _create_tuples(enum: Enum, constant_prefix: str) -> list[tuple[Enum, str]]:
|
|
|
|
result = []
|
|
|
|
for enum in enum:
|
|
|
|
result.append((enum, constant_prefix))
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
("enum", "constant_prefix"),
|
|
|
|
_create_tuples(climate.ClimateEntityFeature, "SUPPORT_")
|
|
|
|
+ _create_tuples(climate.HVACMode, "HVAC_MODE_"),
|
|
|
|
)
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
"module",
|
|
|
|
[climate, climate.const],
|
|
|
|
)
|
|
|
|
def test_deprecated_constants(
|
|
|
|
caplog: pytest.LogCaptureFixture,
|
|
|
|
enum: Enum,
|
|
|
|
constant_prefix: str,
|
|
|
|
module: ModuleType,
|
|
|
|
) -> None:
|
|
|
|
"""Test deprecated constants."""
|
|
|
|
import_and_test_deprecated_constant_enum(
|
|
|
|
caplog, module, enum, constant_prefix, "2025.1"
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
("enum", "constant_postfix"),
|
|
|
|
[
|
|
|
|
(climate.HVACAction.OFF, "OFF"),
|
|
|
|
(climate.HVACAction.HEATING, "HEAT"),
|
|
|
|
(climate.HVACAction.COOLING, "COOL"),
|
|
|
|
(climate.HVACAction.DRYING, "DRY"),
|
|
|
|
(climate.HVACAction.IDLE, "IDLE"),
|
|
|
|
(climate.HVACAction.FAN, "FAN"),
|
|
|
|
],
|
|
|
|
)
|
|
|
|
def test_deprecated_current_constants(
|
|
|
|
caplog: pytest.LogCaptureFixture,
|
|
|
|
enum: climate.HVACAction,
|
|
|
|
constant_postfix: str,
|
|
|
|
) -> None:
|
|
|
|
"""Test deprecated current constants."""
|
|
|
|
import_and_test_deprecated_constant(
|
|
|
|
caplog,
|
|
|
|
climate.const,
|
|
|
|
"CURRENT_HVAC_" + constant_postfix,
|
|
|
|
f"{enum.__class__.__name__}.{enum.name}",
|
|
|
|
enum,
|
|
|
|
"2025.1",
|
|
|
|
)
|
2023-12-27 13:51:39 +00:00
|
|
|
|
|
|
|
|
|
|
|
async def test_preset_mode_validation(
|
|
|
|
hass: HomeAssistant, config_flow_fixture: None
|
|
|
|
) -> None:
|
|
|
|
"""Test mode validation for fan, swing and preset."""
|
|
|
|
|
|
|
|
async def async_setup_entry_init(
|
|
|
|
hass: HomeAssistant, config_entry: ConfigEntry
|
|
|
|
) -> bool:
|
|
|
|
"""Set up test config entry."""
|
|
|
|
await hass.config_entries.async_forward_entry_setups(config_entry, [DOMAIN])
|
|
|
|
return True
|
|
|
|
|
|
|
|
async def async_setup_entry_climate_platform(
|
|
|
|
hass: HomeAssistant,
|
|
|
|
config_entry: ConfigEntry,
|
|
|
|
async_add_entities: AddEntitiesCallback,
|
|
|
|
) -> None:
|
|
|
|
"""Set up test climate platform via config entry."""
|
|
|
|
async_add_entities([MockClimateEntity(name="test", entity_id="climate.test")])
|
|
|
|
|
|
|
|
mock_integration(
|
|
|
|
hass,
|
|
|
|
MockModule(
|
|
|
|
"test",
|
|
|
|
async_setup_entry=async_setup_entry_init,
|
|
|
|
),
|
|
|
|
built_in=False,
|
|
|
|
)
|
|
|
|
mock_platform(
|
|
|
|
hass,
|
|
|
|
"test.climate",
|
|
|
|
MockPlatform(async_setup_entry=async_setup_entry_climate_platform),
|
|
|
|
)
|
|
|
|
|
|
|
|
config_entry = MockConfigEntry(domain="test")
|
|
|
|
config_entry.add_to_hass(hass)
|
|
|
|
assert await hass.config_entries.async_setup(config_entry.entry_id)
|
|
|
|
await hass.async_block_till_done()
|
|
|
|
|
|
|
|
state = hass.states.get("climate.test")
|
|
|
|
assert state.attributes.get(ATTR_PRESET_MODE) == "home"
|
|
|
|
assert state.attributes.get(ATTR_FAN_MODE) == "auto"
|
|
|
|
assert state.attributes.get(ATTR_SWING_MODE) == "auto"
|
|
|
|
|
|
|
|
await hass.services.async_call(
|
|
|
|
DOMAIN,
|
|
|
|
SERVICE_SET_PRESET_MODE,
|
|
|
|
{
|
|
|
|
"entity_id": "climate.test",
|
|
|
|
"preset_mode": "away",
|
|
|
|
},
|
|
|
|
blocking=True,
|
|
|
|
)
|
|
|
|
await hass.services.async_call(
|
|
|
|
DOMAIN,
|
|
|
|
SERVICE_SET_SWING_MODE,
|
|
|
|
{
|
|
|
|
"entity_id": "climate.test",
|
|
|
|
"swing_mode": "off",
|
|
|
|
},
|
|
|
|
blocking=True,
|
|
|
|
)
|
|
|
|
await hass.services.async_call(
|
|
|
|
DOMAIN,
|
|
|
|
SERVICE_SET_FAN_MODE,
|
|
|
|
{
|
|
|
|
"entity_id": "climate.test",
|
|
|
|
"fan_mode": "off",
|
|
|
|
},
|
|
|
|
blocking=True,
|
|
|
|
)
|
|
|
|
state = hass.states.get("climate.test")
|
|
|
|
assert state.attributes.get(ATTR_PRESET_MODE) == "away"
|
|
|
|
assert state.attributes.get(ATTR_FAN_MODE) == "off"
|
|
|
|
assert state.attributes.get(ATTR_SWING_MODE) == "off"
|
|
|
|
|
|
|
|
with pytest.raises(
|
|
|
|
ServiceValidationError,
|
|
|
|
match="The preset_mode invalid is not a valid preset_mode: home, away",
|
|
|
|
) as exc:
|
|
|
|
await hass.services.async_call(
|
|
|
|
DOMAIN,
|
|
|
|
SERVICE_SET_PRESET_MODE,
|
|
|
|
{
|
|
|
|
"entity_id": "climate.test",
|
|
|
|
"preset_mode": "invalid",
|
|
|
|
},
|
|
|
|
blocking=True,
|
|
|
|
)
|
|
|
|
assert (
|
|
|
|
str(exc.value)
|
|
|
|
== "The preset_mode invalid is not a valid preset_mode: home, away"
|
|
|
|
)
|
|
|
|
assert exc.value.translation_key == "not_valid_preset_mode"
|
|
|
|
|
|
|
|
with pytest.raises(
|
|
|
|
ServiceValidationError,
|
|
|
|
match="The swing_mode invalid is not a valid swing_mode: auto, off",
|
|
|
|
) as exc:
|
|
|
|
await hass.services.async_call(
|
|
|
|
DOMAIN,
|
|
|
|
SERVICE_SET_SWING_MODE,
|
|
|
|
{
|
|
|
|
"entity_id": "climate.test",
|
|
|
|
"swing_mode": "invalid",
|
|
|
|
},
|
|
|
|
blocking=True,
|
|
|
|
)
|
|
|
|
assert (
|
|
|
|
str(exc.value) == "The swing_mode invalid is not a valid swing_mode: auto, off"
|
|
|
|
)
|
|
|
|
assert exc.value.translation_key == "not_valid_swing_mode"
|
|
|
|
|
|
|
|
with pytest.raises(
|
|
|
|
ServiceValidationError,
|
|
|
|
match="The fan_mode invalid is not a valid fan_mode: auto, off",
|
|
|
|
) as exc:
|
|
|
|
await hass.services.async_call(
|
|
|
|
DOMAIN,
|
|
|
|
SERVICE_SET_FAN_MODE,
|
|
|
|
{
|
|
|
|
"entity_id": "climate.test",
|
|
|
|
"fan_mode": "invalid",
|
|
|
|
},
|
|
|
|
blocking=True,
|
|
|
|
)
|
|
|
|
assert str(exc.value) == "The fan_mode invalid is not a valid fan_mode: auto, off"
|
|
|
|
assert exc.value.translation_key == "not_valid_fan_mode"
|
2023-12-28 23:36:28 +00:00
|
|
|
|
|
|
|
|
|
|
|
def test_deprecated_supported_features_ints(caplog: pytest.LogCaptureFixture) -> None:
|
|
|
|
"""Test deprecated supported features ints."""
|
|
|
|
|
|
|
|
class MockClimateEntity(ClimateEntity):
|
|
|
|
@property
|
|
|
|
def supported_features(self) -> int:
|
|
|
|
"""Return supported features."""
|
|
|
|
return 1
|
|
|
|
|
|
|
|
entity = MockClimateEntity()
|
|
|
|
assert entity.supported_features_compat is ClimateEntityFeature(1)
|
|
|
|
assert "MockClimateEntity" in caplog.text
|
|
|
|
assert "is using deprecated supported features values" in caplog.text
|
|
|
|
assert "Instead it should use" in caplog.text
|
|
|
|
assert "ClimateEntityFeature.TARGET_TEMPERATURE" in caplog.text
|
|
|
|
caplog.clear()
|
|
|
|
assert entity.supported_features_compat is ClimateEntityFeature(1)
|
|
|
|
assert "is using deprecated supported features values" not in caplog.text
|