feat: dishwasher cycle/settings entities, stale-state fixes, LED/sound controls

Dishwasher:
- Revert remote_control to BinarySensorDesc ("Smart Control", read-only)
- Add cycle SelectDesc on /course/vs/0 via options-array RMW (AI Wash,
  Pre blast, Self clean, Normal, Express 60, Heavy, Pots and pans,
  Delicate, Plastic, Baby Care)
- Add Storm Wash+ and Auto release dry SwitchDescs on /course/vs/0
- Add Sanitize SwitchDesc and Smart Dry SelectDesc on /dishwasher/vs/0
- Add Sound volume NumberDesc (0–15 step 5) on /settings/sound/volume/vs/0
- Add Door LED night brightness, night start/end time to DOOR_LED capability
- Add SOUND_VOLUME capability to laundry module

Stale-state fixes (firmware leaves values set after cycle ends):
- finish_time: suppress when machine state is not active
- progress: return 'Idle' when machine state is not active
- water filter: gate WATER_FILTER capability on filterStatus != 'notused'

Translations:
- Add ICESTATUS_RUN → "Making ice" to strings.json and en.json

Tests:
- Update dishwasher and refrigerator golden fixtures to reflect current entity set
- Remove dead test_project_extrapolates_remaining_time (on_observation removed)
This commit is contained in:
Marc Billow committed 2026-07-01 00:36:24 -05:00
1 parent 800b113495
commit db2148467b
11 files changed
+257 -72

No files matched your search

-9
View File
@@ -1,4 +1,3 @@
import time
from custom_components.localthings.ocf.registry.capabilities.operational import OPERATIONAL_STATE
@@ -12,11 +11,3 @@ def test_machine_state_maps_samsung_to_ocf():
def test_active_when_true_only_when_running():
assert OPERATIONAL_STATE.active_when({'x.com.samsung.da.state': 'Run'}) is True
assert OPERATIONAL_STATE.active_when({'x.com.samsung.da.state': 'Ready'}) is False
def test_project_extrapolates_remaining_time():
state = {}
OPERATIONAL_STATE.on_observation(state, {'x.com.samsung.da.remainingTime': '1:00:00'})
assert 'remaining_anchor' in state
out = OPERATIONAL_STATE.project(state, {'machine_state': 'active', 'completion_minutes': 60})
assert out['completion_minutes'] <= 60