diff --git a/custom_components/localthings/registry/capabilities/range_hood.py b/custom_components/localthings/registry/capabilities/range_hood.py index 59aa9b7..be0414a 100644 --- a/custom_components/localthings/registry/capabilities/range_hood.py +++ b/custom_components/localthings/registry/capabilities/range_hood.py @@ -79,6 +79,15 @@ def _hood_fan_write(payload, rep, href=None): str(code) for code in rep.get('x.com.samsung.da.hood.supportedFanSpeed', ()) ] + if not supported: + min_s = rep.get('x.com.samsung.da.hood.settableMinFanSpeed') + max_s = rep.get('x.com.samsung.da.hood.settableMaxFanSpeed') + if min_s is not None and max_s is not None: + try: + mn, mx = int(min_s), int(max_s) + supported = [str(i) for i in range(mn, mx + 1)] + except (ValueError, TypeError): + pass if value not in supported: return None return ['hood', 'fanspeed', 'vs', '0'], { diff --git a/tests/test_range_hood_capabilities.py b/tests/test_range_hood_capabilities.py index 7727d49..c31badb 100644 --- a/tests/test_range_hood_capabilities.py +++ b/tests/test_range_hood_capabilities.py @@ -99,6 +99,16 @@ def test_fan_write_contract(): ) assert desc.write_fn(('speed', '99'), rep) is None + rep_fallback = { + 'x.com.samsung.da.hood.settableMinFanSpeed': '0', + 'x.com.samsung.da.hood.settableMaxFanSpeed': '3', + } + assert desc.write_fn(('speed', '2'), rep_fallback) == ( + ['hood', 'fanspeed', 'vs', '0'], + {'x.com.samsung.da.hood.fanSpeed': '2'}, + ) + assert desc.write_fn(('speed', '4'), rep_fallback) is None + def test_lamp_write_contract(): lamp, brightness = range_hood.HOOD_LAMP.entities