Move Shelly thermostat check to status endpoint (#110543)

* Move Shelly thermostat check to status endpoint

* fix key path
This commit is contained in:
Simone Chemelli 2024-02-14 16:36:42 +01:00 committed by GitHub
parent eee6a119d5
commit 538ef7764e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 21 additions and 9 deletions

View File

@ -43,7 +43,12 @@ from .const import (
)
from .coordinator import ShellyBlockCoordinator, ShellyRpcCoordinator, get_entry_data
from .entity import ShellyRpcEntity
from .utils import async_remove_shelly_entity, get_device_entry_gen, get_rpc_key_ids
from .utils import (
async_remove_shelly_entity,
get_device_entry_gen,
get_rpc_key_ids,
is_rpc_thermostat_internal_actuator,
)
async def async_setup_entry(
@ -127,7 +132,7 @@ def async_setup_rpc_entry(
for id_ in climate_key_ids:
climate_ids.append(id_)
if coordinator.device.shelly.get("relay_in_thermostat", False):
if is_rpc_thermostat_internal_actuator(coordinator.device.status):
# Wall Display relay is used as the thermostat actuator,
# we need to remove a switch entity
unique_id = f"{coordinator.mac}-switch:{id_}"

View File

@ -41,6 +41,7 @@ from .utils import (
get_rpc_key_ids,
is_block_channel_type_light,
is_rpc_channel_type_light,
is_rpc_thermostat_internal_actuator,
)
@ -134,7 +135,7 @@ def async_setup_rpc_entry(
continue
if coordinator.model == MODEL_WALL_DISPLAY:
if not coordinator.device.shelly.get("relay_in_thermostat", False):
if not is_rpc_thermostat_internal_actuator(coordinator.device.status):
# Wall Display relay is not used as the thermostat actuator,
# we need to remove a climate entity
unique_id = f"{coordinator.mac}-thermostat:{id_}"

View File

@ -367,6 +367,11 @@ def is_rpc_channel_type_light(config: dict[str, Any], channel: int) -> bool:
return cast(str, con_types[channel]).lower().startswith("light")
def is_rpc_thermostat_internal_actuator(status: dict[str, Any]) -> bool:
"""Return true if the thermostat uses an internal relay."""
return cast(bool, status["sys"].get("relay_in_thermostat", False))
def get_rpc_input_triggers(device: RpcDevice) -> list[tuple[str, str]]:
"""Return list of input triggers for RPC device."""
triggers = []

View File

@ -201,7 +201,6 @@ MOCK_SHELLY_RPC = {
"auth_en": False,
"auth_domain": None,
"profile": "cover",
"relay_in_thermostat": True,
}
MOCK_STATUS_COAP = {
@ -248,7 +247,8 @@ MOCK_STATUS_RPC = {
"available_updates": {
"beta": {"version": "some_beta_version"},
"stable": {"version": "some_beta_version"},
}
},
"relay_in_thermostat": True,
},
"voltmeter": {"voltage": 4.321},
"wifi": {"rssi": -63},

View File

@ -146,7 +146,8 @@ async def test_rpc_config_entry_diagnostics(
"available_updates": {
"beta": {"version": "some_beta_version"},
"stable": {"version": "some_beta_version"},
}
},
"relay_in_thermostat": True,
},
"wifi": {"rssi": -63},
},

View File

@ -327,9 +327,9 @@ async def test_wall_display_relay_mode(
climate_entity_id = "climate.test_name"
switch_entity_id = "switch.test_switch_0"
new_shelly = deepcopy(mock_rpc_device.shelly)
new_shelly["relay_in_thermostat"] = False
monkeypatch.setattr(mock_rpc_device, "shelly", new_shelly)
new_status = deepcopy(mock_rpc_device.status)
new_status["sys"]["relay_in_thermostat"] = False
monkeypatch.setattr(mock_rpc_device, "status", new_status)
await init_integration(hass, 2, model=MODEL_WALL_DISPLAY)