1
0
mirror of https://github.com/home-assistant/core.git synced 2026-05-08 17:49:37 +01:00

Refactor Shelly number platform to use upstream set_thermostat_state (#157527)

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
Shay Levy
2025-12-01 12:37:12 +02:00
committed by GitHub
parent 0c4f2326ef
commit e7edd51a65
3 changed files with 13 additions and 23 deletions
+2
View File
@@ -341,3 +341,5 @@ MODEL_TOP_EV_CHARGER_EVE01 = "EVE01"
MODEL_FRANKEVER_IRRIGATION_CONTROLLER = "Irrigation"
ROLE_GENERIC = "generic"
TRV_CHANNEL = 0
+8 -18
View File
@@ -4,7 +4,7 @@ from __future__ import annotations
from collections.abc import Callable
from dataclasses import dataclass
from typing import TYPE_CHECKING, Any, Final, cast
from typing import TYPE_CHECKING, Final, cast
from aioshelly.block_device import Block
from aioshelly.const import RPC_GENERATIONS
@@ -34,6 +34,7 @@ from .const import (
MODEL_LINKEDGO_ST1820_THERMOSTAT,
MODEL_TOP_EV_CHARGER_EVE01,
ROLE_GENERIC,
TRV_CHANNEL,
VIRTUAL_NUMBER_MODE_MAP,
)
from .coordinator import ShellyBlockCoordinator, ShellyConfigEntry, ShellyRpcCoordinator
@@ -62,9 +63,6 @@ PARALLEL_UPDATES = 0
class BlockNumberDescription(BlockEntityDescription, NumberEntityDescription):
"""Class to describe a BLOCK sensor."""
rest_path: str = ""
rest_arg: str = ""
@dataclass(frozen=True, kw_only=True)
class RpcNumberDescription(RpcEntityDescription, NumberEntityDescription):
@@ -178,7 +176,7 @@ class RpcBluTrvExtTempNumber(RpcBluTrvNumber):
self.async_write_ha_state()
NUMBERS: dict[tuple[str, str], BlockNumberDescription] = {
BLOCK_NUMBERS: dict[tuple[str, str], BlockNumberDescription] = {
("device", "valvePos"): BlockNumberDescription(
key="device|valvepos",
translation_key="valve_position",
@@ -189,8 +187,6 @@ NUMBERS: dict[tuple[str, str], BlockNumberDescription] = {
native_max_value=100,
native_step=1,
mode=NumberMode.SLIDER,
rest_path="thermostat/0",
rest_arg="pos",
),
}
@@ -357,7 +353,7 @@ def _async_setup_block_entry(
hass,
config_entry,
async_add_entities,
NUMBERS,
BLOCK_NUMBERS,
BlockSleepingNumber,
)
@@ -426,18 +422,11 @@ class BlockSleepingNumber(ShellySleepingBlockAttributeEntity, RestoreNumber):
async def async_set_native_value(self, value: float) -> None:
"""Set value."""
# Example for Shelly Valve: http://192.168.188.187/thermostat/0?pos=13.0
await self._set_state_full_path(
self.entity_description.rest_path,
{self.entity_description.rest_arg: value},
LOGGER.debug(
"Setting thermostat position for entity %s to %s", self.name, value
)
self.async_write_ha_state()
async def _set_state_full_path(self, path: str, params: Any) -> Any:
"""Set block state (HTTP request)."""
LOGGER.debug("Setting state for entity %s, state: %s", self.name, params)
try:
return await self.coordinator.device.http_request("get", path, params)
await self.coordinator.device.set_thermostat_state(TRV_CHANNEL, pos=value)
except DeviceConnectionError as err:
self.coordinator.last_update_success = False
raise HomeAssistantError(
@@ -450,3 +439,4 @@ class BlockSleepingNumber(ShellySleepingBlockAttributeEntity, RestoreNumber):
) from err
except InvalidAuthError:
await self.coordinator.async_shutdown_device_and_start_reauth()
self.async_write_ha_state()
+3 -5
View File
@@ -192,9 +192,7 @@ async def test_block_number_set_value(
{ATTR_ENTITY_ID: "number.test_name_valve_position", ATTR_VALUE: 30},
blocking=True,
)
mock_block_device.http_request.assert_called_once_with(
"get", "thermostat/0", {"pos": 30.0}
)
mock_block_device.set_thermostat_state.assert_called_once_with(0, pos=30.0)
async def test_block_set_value_connection_error(
@@ -208,7 +206,7 @@ async def test_block_set_value_connection_error(
)
monkeypatch.setattr(
mock_block_device,
"http_request",
"set_thermostat_state",
AsyncMock(side_effect=DeviceConnectionError),
)
await init_integration(hass, 1, sleep_period=3600)
@@ -240,7 +238,7 @@ async def test_block_set_value_auth_error(
)
monkeypatch.setattr(
mock_block_device,
"http_request",
"set_thermostat_state",
AsyncMock(side_effect=InvalidAuthError),
)
entry = await init_integration(hass, 1, sleep_period=3600)