Skip to content

feat: progressive config flow — from 40 flat options to 5 guided steps#1447

Closed
florianhorner wants to merge 13 commits intobasnijholt:mainfrom
florianhorner:config-ux-overhaul
Closed

feat: progressive config flow — from 40 flat options to 5 guided steps#1447
florianhorner wants to merge 13 commits intobasnijholt:mainfrom
florianhorner:config-ux-overhaul

Conversation

@florianhorner
Copy link

@florianhorner florianhorner commented Mar 16, 2026

Summary

  • Split the monolithic options page into 5 progressive steps: Essentials → Sleep Mode → Sun & Timing → Behavior → Device Workarounds
  • Added room presets (bedroom, office, living room, nursery) that pre-fill sensible defaults on the first step
  • Added contextual validation — brightness/color-temp range checks, sunrise/sunset ordering, dependency guards (e.g. detect_non_ha_changes requires take_over_control)
  • Rewrote all UI strings — replaced emoji-heavy jargon with concise plain-English descriptions using data_description for per-field help text
  • Updated all 38 translation files to match the new step layout, preserving existing translated content where available
  • Added comprehensive test coverage for the new multi-step flow
  • Fixed time comparison bug — sunrise/sunset range validation now uses parsed datetime.time objects instead of lexicographic string comparison

Motivation

The current options page shows ~40 options on a single flat page, which is the #1 user frustration identified across GitHub issues. Most users only need to pick lights and set brightness/color ranges — they shouldn't need to scroll past brightness_mode_time_dark or multi_light_intercept to do that.

QA Evidence — Live Testing on Home Assistant

Deployed branch to a live HA instance and walked through all 5 steps:

Step 1: Essentials

Room preset dropdown, light selector, brightness/color temp ranges, transition.
Step 1

Step 2: Sleep Mode

Sleep brightness, color temp, RGB color, sleep transition, adapt until sleep.
Step 2

Step 3: Sun & Timing

Sunrise/sunset times and offsets, interval, brightness mode settings.
Step 3

Step 4: Behavior

Manual control, take over, detect non-HA changes, intercept settings.
Step 4

Step 5: Device Workarounds

Separate turn on commands, split delay, config in attributes.
Step 5

Flow Completion

All 5 steps submitted successfully, config entry saved.
Complete

Pre-Landing Review

No issues found.

Test plan

  • Ruff lint passes (0 errors on changed Python files)
  • Code review — 1 bug found (time string comparison), fixed
  • Live QA on Home Assistant instance — all 5 steps work correctly
  • CI tests pass (requires homeassistant — not available locally)

🤖 Generated with Claude Code

Florian Horner and others added 3 commits March 16, 2026 23:26
Introduce STEP_OPTIONS mapping to partition VALIDATION_TUPLES across
five config flow steps, ROOM_PRESETS with sensible defaults for
bedroom/office/living_room/nursery, and CONF_ROOM_PRESET constant.
Replace the single monolithic options page with a guided wizard:
Essentials → Sleep Mode → Sun & Timing → Behavior → Device Workarounds.

Each step includes contextual validation (brightness range, color temp
range, sunrise/sunset ordering, dependency checks for take_over_control
and intercept). Room preset selector pre-fills sensible defaults.
…ions

Replace emoji-heavy, jargon-laden descriptions with concise plain-English
explanations organized across the five new options steps. Add new error
messages for validation. Restructure all 38 translation files to match
the new step layout.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
pre-commit-ci bot and others added 2 commits March 16, 2026 22:28
Dead code flagged by pre-landing review. Step ordering is implicit
in the method call chain; the validation map was never referenced.
Four interactive HTML mockups showing the visual improvements:
- before-after-mockup: label+tooltip pattern vs old cramped labels
- mockup-wizard-flow: 40-option wall vs 5-step wizard
- mockup-room-presets: preset dropdown pre-filling fields
- mockup-validation: contextual inline validation errors
@florianhorner
Copy link
Author

florianhorner commented Mar 16, 2026

Cleaning up — the earlier comment was a test, please ignore.

Florian Horner and others added 7 commits March 20, 2026 14:27
String comparison of time values ("9:00:00" >= "10:00:00") gives wrong
results for non-zero-padded hours. Parse with datetime.time.fromisoformat()
before comparing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Screenshots from manual QA on ha.horner.io showing all 5 config
flow steps working correctly on a real Home Assistant instance.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@florianhorner
Copy link
Author

Closing in favor of the split PR chain: #1446 (copy/strings) → #1448 (sync tests) → #1450 (wizard implementation).

This PR was the original monolithic spike that explored the 5-step wizard and presets. Since the work has now been broken into smaller, more reviewable pieces, the feature set from this PR is effectively covered by #1450 — but in a way that reduces merge conflicts and makes review/maintenance easier.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant