From 6a94c87eaed68751d9c51ea86b36ded760d48716 Mon Sep 17 00:00:00 2001 From: alainmic <56118503+alainmic@users.noreply.github.com> Date: Mon, 5 Oct 2026 05:14:57 -0400 Subject: [PATCH] Add Tuya number platform support for category hwsb (#183758) --- homeassistant/components/tuya/const.py | 1 + homeassistant/components/tuya/icons.json | 3 ++ homeassistant/components/tuya/number.py | 7 +++++ homeassistant/components/tuya/strings.json | 3 ++ tests/components/tuya/test_number.py | 34 ++++++++++++++++++++++ 5 files changed, 48 insertions(+) diff --git a/homeassistant/components/tuya/const.py b/homeassistant/components/tuya/const.py index 2f7a267845eb..01b4769fc26e 100644 --- a/homeassistant/components/tuya/const.py +++ b/homeassistant/components/tuya/const.py @@ -893,6 +893,7 @@ class DPCode(StrEnum): SOS = "sos" # Emergency State SOS_STATE = "sos_state" # Emergency mode SPEED = "speed" # Speed level + SPEED_SET = "speed_set" SPRAY_MODE = "spray_mode" # Spraying mode START = "start" # Start STATUS = "status" diff --git a/homeassistant/components/tuya/icons.json b/homeassistant/components/tuya/icons.json index aa28a88706d5..5a894ed7221b 100644 --- a/homeassistant/components/tuya/icons.json +++ b/homeassistant/components/tuya/icons.json @@ -83,6 +83,9 @@ "near_detection": { "default": "mdi:signal-distance-variant" }, + "speed": { + "default": "mdi:speedometer" + }, "temperature": { "default": "mdi:thermometer" }, diff --git a/homeassistant/components/tuya/number.py b/homeassistant/components/tuya/number.py index 12037c774159..f53b8c76dcb3 100644 --- a/homeassistant/components/tuya/number.py +++ b/homeassistant/components/tuya/number.py @@ -150,6 +150,13 @@ NUMBERS: dict[DeviceCategory, tuple[TuyaNumberEntityDescription, ...]] = { device_class=NumberDeviceClass.DISTANCE, ), ), + DeviceCategory.HWSB: ( + TuyaNumberEntityDescription( + key=DPCode.SPEED_SET, + translation_key="speed", + native_unit_of_measurement=UnitOfRatio.PERCENTAGE, + ), + ), DeviceCategory.JSQ: ( TuyaNumberEntityDescription( key=DPCode.TEMP_SET, diff --git a/homeassistant/components/tuya/strings.json b/homeassistant/components/tuya/strings.json index 961e817bbeaf..a40f90f1d09a 100644 --- a/homeassistant/components/tuya/strings.json +++ b/homeassistant/components/tuya/strings.json @@ -275,6 +275,9 @@ "siren_duration": { "name": "Siren duration" }, + "speed": { + "name": "[%key:component::sensor::entity_component::speed::name%]" + }, "target_dis_closest": { "name": "Closest target distance" }, diff --git a/tests/components/tuya/test_number.py b/tests/components/tuya/test_number.py index ab782270f83d..4f984e9905ce 100644 --- a/tests/components/tuya/test_number.py +++ b/tests/components/tuya/test_number.py @@ -249,3 +249,37 @@ async def test_temp_unit_convert_number_invalid( assert state is not None assert state.attributes.get("device_class") is None assert state.attributes.get("unit_of_measurement") == "" + + +@pytest.mark.parametrize("mock_device_code", ["hwsb_ircs2n82vgrozoew"]) +async def test_hwsb_number_with_quirk( + hass: HomeAssistant, + mock_manager: Manager, + mock_config_entry: MockConfigEntry, + mock_device: CustomerDevice, +) -> None: + """Test HWSB outdoor equipment number with quirk applied.""" + mock_device.status["speed_set"] = 50 + await initialize_entry(hass, mock_manager, mock_config_entry, mock_device) + + entity_id = "number.inverflow_speed" + state = hass.states.get(entity_id) + assert state is not None + assert state.state == "50.0" + assert state.attributes["min"] == 30 + assert state.attributes["max"] == 120 + assert state.attributes["step"] == 5 + assert state.attributes["unit_of_measurement"] == "%" + + await hass.services.async_call( + NUMBER_DOMAIN, + SERVICE_SET_VALUE, + { + ATTR_ENTITY_ID: entity_id, + ATTR_VALUE: 75, + }, + blocking=True, + ) + mock_manager.send_commands.assert_called_once_with( + mock_device.id, [{"code": "speed_set", "value": 75}] + )