@@ -30,64 +30,129 @@ prerequisites, and deliver a focused change.
3030 - Considerations: update ` docs/ARCHITECTURE.md ` with the decision.
3131- ** M0.3 — Mock providers** (status: ☐)
3232 - Dependencies: M0.1.
33- - Outcome: add mock data sources for Home, Rooms, and Security screens under
34- ` custom/integration/ ` behind a build flag.
35- - Considerations: unblock UI work while MQTT is offline.
33+ - Outcome: add mock data sources for Rooms, CCTV, Weather, Media, and
34+ Settings pages under ` custom/integration/ ` behind a build flag so each
35+ module in ` custom/ui/pages/ ` has sample data.
36+ - Considerations: unblock UI work while MQTT is offline and document how to
37+ switch between real and mock providers.
3638
37- ### Milestone 1 — UI skeleton
39+ ### Milestone 1 — Page scaffolding
3840
39- - ** M1.1 — Screen scaffolding** (status: ☐ )
41+ - ** M1.1 — Rooms page scaffolding** (status: ☑ )
4042 - Dependencies: M0.3.
41- - Outcome: create persistent LVGL objects for ` ui_home.* ` , ` ui_rooms.* ` ,
42- ` ui_security.* ` , and ` ui_control_center.* ` that match the layout spec.
43- - Considerations: reuse placeholder widgets from ` custom/ui/ui_components.* ` .
44- - ** M1.2 — Shared components** (status: ☐)
45- - Dependencies: M1.1.
46- - Outcome: implement cards, chips, sliders, tabs, and confirm sheets styled
47- via ` ui_theme.h ` .
48- - Considerations: centralize styles so future screens stay consistent.
49- - ** M1.3 — Navigation and gestures** (status: ☐)
43+ - Outcome: create persistent LVGL layout for ` ui_page_rooms.* ` , including the
44+ toolbar, wallpaper, and grid of ` ui_room_card ` widgets managed by
45+ ` ui_root.c ` .
46+ - Current state: ` ui_page_rooms_create ` renders three cards with static
47+ descriptors, plays intro animations, and emits toggle/sheet events backed by
48+ mock ` rooms_state_t ` data inside the module.
49+ - Considerations: keep card gestures coordinated with
50+ ` custom/ui/pages/ui_rooms_model.* ` when real data arrives.
51+ - ** M1.2 — CCTV page scaffolding** (status: ☑)
52+ - Dependencies: M0.3.
53+ - Outcome: build the CCTV layout in ` ui_page_cctv.* ` with toolbar controls,
54+ a ` ui_room_card ` wrapper for the live feed, and an events row prepared for
55+ camera history chips.
56+ - Current state: the page renders placeholder labels, hides unused toggles,
57+ and shows a stub "Live feed" container without switching logic or data.
58+ - Considerations: align toolbar button styles with shared assets from
59+ ` custom/ui/ui_theme.h ` .
60+ - ** M1.3 — Weather page scaffolding** (status: ☑)
61+ - Dependencies: M0.3.
62+ - Outcome: assemble the climate dashboard in ` ui_page_weather.* ` , featuring
63+ indoor/outdoor cards and a flexible forecast row that can accept dynamic
64+ metrics.
65+ - Current state: static strings populate each metric block and forecast item,
66+ and the card toggles/specs are hidden until bindings are available.
67+ - Considerations: confirm copy and iconography match ` docs/wireframes.md ` .
68+ - ** M1.4 — Media page scaffolding** (status: ☑)
69+ - Dependencies: M0.3.
70+ - Outcome: layout the media experience in ` ui_page_media.* ` , including now
71+ playing metadata, transport controls, quick scenes, and volume slider ready
72+ for callbacks.
73+ - Current state: album art, track labels, and transport buttons display
74+ placeholder content with no LVGL event handlers attached.
75+ - Considerations: ensure button spacing matches the reusable metrics from
76+ ` custom/ui/ui_theme.h ` .
77+ - ** M1.5 — Settings page scaffolding** (status: ☑)
78+ - Dependencies: M0.3.
79+ - Outcome: implement the settings hierarchy in ` ui_page_settings.* ` with
80+ connectivity tests, theme controls, network tools, OTA prompts, and backup
81+ actions surfaced through ` ui_page_settings_actions_t ` .
82+ - Current state: the page constructs all sections, exposes setters such as
83+ ` ui_page_settings_set_connection_status ` , and binds actions via
84+ ` app_launcher/view ` , but integration calls still return placeholder states
85+ when hardware services are offline.
86+ - Considerations: document the action wiring in ` docs/ARCHITECTURE.md ` when
87+ integration matures.
88+
89+ ### Milestone 2 — Data plumbing
90+
91+ - ** M2.1 — Rooms state pipeline** (status: ☐)
5092 - Dependencies: M1.1.
51- - Outcome: wire the tab rail, edge swipes, and control center sheet
52- interactions.
53- - Considerations: include optimistic animations for taps and long presses.
54-
55- ### Milestone 2 — Feature scaffolding
56-
57- - ** M2.1 — Home bindings** (status: ☐)
58- - Dependencies: M1.2.
59- - Outcome: connect Home cards to mock providers with optimistic updates ready
60- for MQTT swap.
61- - Considerations: keep command helpers in ` custom/integration/ ` .
62- - ** M2.2 — Rooms interactions** (status: ☐)
63- - Dependencies: M1.2.
64- - Outcome: implement room detail updates, two-finger swipe navigation, and
65- long-press sheets.
66- - Considerations: validate gestures on hardware for reliability.
67- - ** M2.3 — Security carousel** (status: ☐)
93+ - Outcome: move the static room descriptors and ` INITIAL_STATE ` out of
94+ ` ui_page_rooms.c ` into a provider so ` ui_page_rooms_set_state ` consumes data
95+ supplied by ` custom/integration/ ` .
96+ - Current state: not started; the page seeds its own mock entities and ignores
97+ external updates.
98+ - Considerations: surface toggle events via a shared bus so integrations can
99+ publish commands.
100+ - ** M2.2 — CCTV event model** (status: ☐)
68101 - Dependencies: M1.2.
69- - Outcome: build the camera carousel and event chips backed by mock Frigate
70- data.
71- - Considerations: respect the HLS → MJPEG → snapshot fallback described in
72- the AI guide.
102+ - Outcome: define data structures for camera rotation and timeline chips,
103+ exposing setters on ` ui_page_cctv.* ` so integrations can drive the view.
104+ - Current state: not started; toolbar labels and chips are hard-coded.
105+ - Considerations: plan for Frigate clip metadata and snapshot fallbacks.
106+ - ** M2.3 — Weather and climate adapter** (status: ☐)
107+ - Dependencies: M1.3.
108+ - Outcome: add an adapter layer that formats indoor, outdoor, and forecast
109+ data for ` ui_page_weather.* ` , including unit conversions and icon mapping.
110+ - Current state: not started; the page renders placeholder Fahrenheit/Celsius
111+ values without conversion helpers.
112+ - Considerations: reuse formatting helpers across Settings where applicable.
113+ - ** M2.4 — Media control hooks** (status: ☐)
114+ - Dependencies: M1.4.
115+ - Outcome: attach LVGL callbacks in ` ui_page_media.* ` that emit play/pause,
116+ skip, volume, and quick-scene events to a media controller in
117+ ` custom/integration/ ` .
118+ - Current state: not started; controls are visual only.
119+ - Considerations: coordinate icon/text updates when playback state changes.
120+ - ** M2.5 — Settings telemetry bridge** (status: ☐⚙)
121+ - Dependencies: M1.5.
122+ - Outcome: finish threading connection test results, OTA progress, and theme
123+ persistence through ` custom/integration/settings_controller.* ` so UI status
124+ pills stay in sync.
125+ - Current state: partially implemented; ` SettingsController ` posts events but
126+ lacks coverage for every action and has stubbed fallback messages when
127+ platform services are unavailable.
128+ - Considerations: audit async callbacks to ensure they survive suspend/resume
129+ of the worker thread.
73130
74131### Milestone 3 — Home Assistant integration
75132
76- - ** M3.1 — MQTT for Home and Rooms** (status: ☐)
77- - Dependencies: M2.1 and M2.2.
78- - Outcome: replace mock providers with real MQTT subscriptions and publish
79- helpers.
80- - Considerations: extend ` docs/mqtt_contract.md ` with payload schemas.
81- - ** M3.2 — Frigate live view** (status: ☐)
82- - Dependencies: M2.3.
83- - Outcome: stream live video with fallback handling and update the event
84- timeline from Frigate.
85- - Considerations: measure frame times against ` docs/PERFORMANCE.md ` .
86- - ** M3.3 — Control center commands** (status: ☐)
133+ - ** M3.1 — MQTT bindings for Rooms** (status: ☐)
87134 - Dependencies: M2.1.
88- - Outcome: publish brightness, volume, and toggle commands with rollback
89- timers.
90- - Considerations: log failures for debugging and expose status to the UI.
135+ - Outcome: subscribe to room sensor and light topics defined in
136+ ` docs/mqtt_contract.md ` , translate them into ` rooms_state_t ` , and publish
137+ toggle commands emitted by ` ui_page_rooms ` .
138+ - Current state: not started; Rooms still relies on compile-time mocks.
139+ - Considerations: debounce slider updates so MQTT traffic stays bounded.
140+ - ** M3.2 — Climate and weather ingestion** (status: ☐)
141+ - Dependencies: M2.3.
142+ - Outcome: map MQTT sensor payloads to the weather adapter and refresh indoor
143+ metrics alongside settings-managed preferences like units and themes.
144+ - Current state: not started; all weather values are placeholders.
145+ - Considerations: document required topics and units in
146+ ` docs/mqtt_contract.md ` .
147+ - ** M3.3 — Media and Settings integration** (status: ☐)
148+ - Dependencies: M2.4 and M2.5.
149+ - Outcome: hook media control events into Assist/Home Assistant transports and
150+ persist device settings (theme, brightness, updates) through MQTT or REST as
151+ defined in ` custom/integration/ ` .
152+ - Current state: not started; media commands are local stubs and settings
153+ persistence runs on in-memory defaults.
154+ - Considerations: record integration quirks in ` docs/ARCHITECTURE.md ` and
155+ expand ` docs/mqtt_contract.md ` when new topics are introduced.
91156
92157### Milestone 4 — Quality and automation
93158
0 commit comments