← Back to Home Control Guide · hub v1.53.152 · raw .md

Home Control — Complete User & Design Guide

Product: Home Control (LutronControl hub)

Current software version: see Settings tab / APP_VERSION in lutron_lights.py (this guide ships with hub 1.21.0+)

Hub machine: Pete’s iMac (Petes-iMac.local / LAN IP typically 192.168.1.249)

Web UI ports: HTTP 8787 · HTTPS 8443 (mic on phones)

Mac AV agent port: 8788 (local agent for opening links on the iMac)

Open this guide from the app footer: Guide → /guide

Raw markdown file: /USER_GUIDE.md on the hub disk: ~/LutronControl/USER_GUIDE.md


Table of contents

What this app is

How to open it (every URL)

Design system & UX principles

Global chrome (header, dock, footer, overlays)

Device identity (“This Mac” / “This iPhone”)

Tab: Home

Tab: Lights

Tab: Music

Tab: Video (Easy Watch, Search, TVs, confirmation)

Tab: Cameras

Tab: Systems

Voice / mic

Sticky play reel

Duplicates & overlapping controls

Legal / free content policy

Backend engines & files

HTTP / API map (high level)

Start / restart / autostart

Troubleshooting

Version history (recent UX)


1. What this app is

Home Control is a whole-home web remote that runs on the iMac hub and is opened from phones, tablets, and computers on the home network (and optional Tailscale/remote URL).

It controls (when hardware is online and configured):

DomainHardware / serviceEngine / notes
LightsLutron RadioRA 2 processorlutron_engine.py — may show Lights paused if processor offline
MusicSonos, Google Cast, Autonomic/Mirage, free radio, YouTube→Sonossonos_engine, cast_engine, autonomic_engine, music_engine, cast_engine YT proxy
VideoApple TVs (per room), Fire Stick (ADB), Find & Watch, Easy Watchav_engine, firestick_engine, find_watch_engine, sports_tonight
CamerasNest (if linked)nest_engine
VoiceBrowser mic + optional Alexa/cast stationsvoice_assistant, HTTPS cert for mic
House mapRooms in rooms_config.jsonKitchen, Living Room, Den/Office, Dining, Master Suite, Basement, Exterior, Roof Deck, Patio, 3rd Floor, Joseph’s Room, Arianna’s Room

Boundaries (product rules):


2. How to open it (every URL)

URLPurpose
http://192.168.1.249:8787/LAN main app
http://Petes-iMac.local:8787/mDNS name on home Wi‑Fi
http://127.0.0.1:8787/On the iMac itself (hub browser)
https://192.168.1.249:8443/LAN HTTPS (mic on phones after cert)
…/setup-httpsOne-time phone certificate install flow
…/guideThis guide (HTML)
…/USER_GUIDE.mdRaw markdown of this guide
…/watch or …/view-on-macCompanion “View on Mac” page for TV remote + open same title
…/simpleSimplified entry (if enabled)
…/manifest.jsonPWA-ish web app manifest
Remote / Tailscale URLFrom home_config.json → remote_url / preferred_home_url when configured

Hard-refresh after hub updates: desktop Cmd+Shift+R, iPhone Safari reload after force-quit or clear cache if version badge doesn’t move.

Confirm build: bottom Systems panel shows Version; API GET /api/ping returns "version": "…".


3. Design system & UX principles

Visual language (v1.20 design pass)

UX principles (why the layout looks this way)

Phone-first Video: Primary path is Where → App → Show (Easy Watch), not a wall of search results.

Search is secondary: “Search anything” is collapsed by default.

Honest playback: UI must not say LIVE / playing without evidence (title, progress, app focus, or confirm poll).

Device labels match the browser: “This Mac”, “This iPhone”, etc. — never sticky wrong names from old localStorage.

Chrome diet: Footer is quiet (“Ready” + ··· for logs). Version lives mainly on Systems.

Gold = primary only: Secondary actions use ghost/neutral borders.

Design scores (target after 1.20)

DimensionGoal
Information architectureCalm Video; Home room map clear
Trust / feedbackConfirm path + weak “TV on” language
Mobile daily useLarge Easy Watch buttons
Visual hierarchyOne gold CTA

4. Global chrome (header, dock, footer, overlays)

Header

ControlWhat it does
Home Control titleBranding only
headerMeta (subtitle)Short status: e.g. “Home”, “N lights”, “Lights paused” — not full version spam
HUB OK pillHub process responding
LUTRON … / OK / PAUSEDLights processor connection
🎤 mic button (header)Opens voice listen (needs HTTPS + cert on phone)

Dock / tabs (top navigation)

TabIconPanel idWhat opens
Home⌂panelHomeRoom grid, quick actions, status strip
Lights◐panelLightsAll zones / levels / hot buttons
Music♪panelSonosSonos, Mirage, free, YouTube music, speakers
Video▶panelVideoEasy Watch, Find, TVs, Fire Stick
Cameras◎panelCamerasNest streams
Systems◈panelSystemsHealth, network, version, diagnostics

Duplicate path: Home also has mini buttons that jump to Video, Systems, Music, etc.

Footer log bar

ControlWhat it does
lastEvent textHuman short status (“Ready”, “Lights paused…”) — not engineer uptime spam
Guide linkOpens /guide in a new tab (this document)
···Toggles event log panel (#logPanel)

Other global UI

ElementBehavior
Sticky play reel (#playReel)Fixed bottom card when something was played / confirmed; X dismisses
Room overlay sheetTap a Home room → sheet for that room’s audio + lights
Apple TV pair modalPIN entry when pairing Companion remote
Hot button modalCreate/edit scene shortcuts
Voice panelMic status + text command fallback
Connection bannerNetwork issues + Rescan
Stale cache bannerPage version ≠ hub version → reload

5. Device identity (“This Mac” / “This iPhone”)

Every browser tab registers itself so Find can “Play on” other devices.

Detection (fwDetectDevice)

Runs on every page load from User-Agent (+ Client Hints when available):

DeviceDisplay nameKind
iPhoneThis iPhonephone
iPad (incl. iPadOS-as-Mac UA with touch UI)This iPadtablet
Desktop Mac / iMac / MacBookThis Maccomputer or hub if URL is localhost
WindowsThis Windows PCcomputer
Android phone/tabletThis Android phone/tabletphone/tablet

Rules:

Where the name appears


6. Tab: Home

Purpose

House overview: status, quick jumps, room cards.

Typical controls

ControlAction
Status stripOne-line house state; transport shortcuts when music/TV known
Quick help / mini buttonsJump to Systems, Video, hard refresh, etc.
Room cardsOpen room sheet for that area
Room sheet — lightsOn/off/dimmers for zones in room
Room sheet — audioSonos/Cast for that room when mapped
Room sheet — TVPower / pause / home for room Apple TV when mapped
Mirror (in sheet)Match one Apple TV to another room
Hot buttons (if shown)Saved multi-zone scenes

Rooms (configured)

Kitchen, Living Room, Den / Office, Dining, Master Suite, Basement, Exterior, Roof Deck, Patio, 3rd Floor, Joseph’s Room, Arianna’s Room.

Lights paused mode

If Lutron processor is offline, UI shows Lights paused but music/video still work.


7. Tab: Lights

Purpose

Whole-house lighting control by zone.

ControlAction
Zone OnLevel 100
Zone OffLevel 0
SliderDim 1–100
Area / floor groupsBatch on/off when UI groups exist
Hot buttonsSave current levels as a named scene; tap to recall
Hot button +Create new scene
Delete hot buttonRemoves scene

API: /api/set, /api/set-batch, /api/levels, /api/hot-buttons.


8. Tab: Music

Purpose

Play music to Sonos, Mirage/Autonomic, Google speakers, free streams, YouTube→Sonos.

Common controls (many are mode-dependent)

ControlAction
Backend / mode chipsSwitch Mirage / Sonos / Speakers / Free / YouTube music, etc.
Room / speaker pickerWhich Sonos or cast target
▶ Play / ⏸ PauseTransport
Prev / NextSonos skip
Volume sliderRoom volume
Favorites / playlists / browseLibrary navigation
SearchSonos or YouTube music search
YouTube → Den/SonosHub proxies stream so Sonos can play (avoids googlevideo fail)
Group SonosMulti-room group coordinator + members
Free stationsLegal free radio / streams
Mac openOpen URL on hub Mac browser

Music design notes


9. Tab: Video

Video is the densest tab. Layout order (top → bottom):

Easy Watch (primary)

Search anything (collapsed fold)

Find results (when a search is open)

Now stage (featured room; honest Live)

TVs & remotes (collapsed fold: room cards, Scan, Mac, Fire help)

Sticky play reel (global)


9.1 Easy Watch (▶ Watch)

Goal: Three taps — Where → App → Show.

Step 1 — Where

ButtonTarget idWhat Play will do
Living RoomlivingApple TV Living (av_engine deep link / app launch)
Fire StickfirestickADB launch / URL on stick
This Mac / This iPhone / …this_deviceOpen URL in *this* browser
EverywhereeverywhereBest-effort fan-out: this device + Living + Fire + Mac

Back returns to previous step.

Crumbs (Where › App › Show) are tappable to jump steps.

Step 2 — App (stream)

ButtonSourceNotes
YouTube TVyoutube_tvOwned live TV app
Fox Newsfox_newsFox News app / live URL
YouTubeyoutubeFree clips / search
NetflixnetflixOpen app (login on device)

Step 3 — Show (presets)

YouTube TV presets include: Live guide, Fox News, CNN, ESPN, MSNBC, Local news, Search more…

Fox News presets include: Fox News Live, Fox News app, FOX Sports, Politics

YouTube presets: Open YouTube, Fox News live search, News live

Netflix: Open Netflix

Search more… opens the Search anything fold and focuses the query box (keeps selected Where as Play target).

After Play

Command sent → reel Starting… / status ⏳

confirmVideoPlayback polls now-playing (Apple TV) or Fire Stick focus

✅ Confirmed · ⚠️ Unconfirmed · ❌ Failed

Reel shows LIVE only if confirmed: true


9.2 Search anything (Find & Watch)

ControlAction
Query fieldFree text: movies, sports, “Yankees tonight”, etc.
Find (gold)POST /api/find/watch — free clips first, legal apps, sports inject
Mode chipsAll · Movies · TV · Sports · Live · Free · Kids · Music
Play on chipsThis device · Living TV · Fire Stick · More… (Mac, Everywhere, other browsers)
Result cardsTap to select (on phone row Play hidden — use bottom Play)
Play (bottom bar)POST /api/find/play + confirmation
Sports “Ship it”When sports_tonight answers, ship buttons jump to YTTV / live targets

Duplicate: Mode chips exist sticky + hidden in panel host (both stay in sync).

Duplicate: Query field sticky is real; hidden #findWatchQuery mirrors value for legacy code.


9.3 Now stage (featured TV)

ElementMeaning
Live (green pill)Confirmed evidence (title / progress / app + playing)
TV on (gray)Power on, title not reported
Title / subHonest status — not “content active” lies
Progress barOnly when confirmed + duration known
⏯ / Off / RoomsTransport + jump to TVs fold
Mirror to other rooms (collapsed)Multi-select destinations → mirror

9.4 TVs & remotes fold

ControlAction
Room cardsPer Apple TV: On · Play/Pause · Home · Off
Fire Stick cardHome · ▶/⏸ · Back · Netflix shortcut; Apps & full remote in details
Scan/api/video/scan rediscover devices
Living on MacOpens companion / Mac AV view path
Fire Stick helpOne-time ADB “Allow” instructions + Recheck
Pair Apple TVCompanion pairing PIN modal
Remote · mirror · Mac (per room details)Full D-pad remote, re-pair, view on Mac
More devicesUnmapped Apple TVs, Roku shortcuts, Mac hosts, cast devices

Fire Stick notes


9.5 Play confirmation (all play paths)

confirmVideoPlayback:

Levels: confirmed · weak · failed / pending→weak after timeout.


10. Tab: Cameras

ControlAction
Camera gridLive Nest streams when linked
Refresh / auto refreshDetect new cameras
Retry on errorReconnect WebRTC/session

Requires Nest OAuth tokens (nest_tokens.json / config). If unlinked, panel explains linking.


11. Tab: Systems

SectionContents
VersionHub APP_VERSION
HealthTimed checks: hub, lutron, sonos, cast, nest, video, mirage, mac_av, astro, discovery
Deep healthLonger probe
Network / discoverySeen devices
Speed testHub speed helper
AstroSunrise/sunset lighting schedules status
LogsServer log tail
Connection healForce network rescan

Use Systems when something “doesn’t work” before blaming the TV.


12. Voice / mic

ControlAction
🎤 (header or dock)Start voice recognition
Voice text inputType a command if mic blocked
HTTPS setup/setup-https install LAN CA, then open :8443

Mic on iPhone requires HTTPS + trusted cert. Plain HTTP works for lights/music/video without mic.


13. Sticky play reel

Appears after Play / Easy Watch / featured room sync.

ElementBehavior
Room · statusLIVE only if confirmed; else starting / check TV / paused
Title / subTitle + app + device_state
ProgressTicks when confirmed playing; polls hub every ~6s
XDismiss reel (hidePlayReel)

14. Duplicates & overlapping controls

These are intentional or legacy; knowing them avoids confusion.

DuplicateWhereNotes
PlayEasy Watch vs Find Play vs room ▶Easy Watch = presets; Find = search results; room ▶ = transport only
Where / Play onEasy Watch step 1 vs Find target chipsSame targets (living, firestick, this_device, …)
Search boxSticky fold vs (hidden) hero fieldSticky is source of truth; hero hidden syncs
Mode chipsSticky + hidden panel rowBoth call fwRenderModeChips
Mic buttonHeader + dockSame voice start
Jump to VideoDock + Home mini + log shortcuts (older)Same tab
MirrorNow stage fold + per-room mirror + Home sheetSame /api/video/match
Fire Stick NetflixTransport shortcut + full app gridSame launch path
YouTube vs YouTube TVEasy Watch appsDifferent sources (youtube vs youtube_tv)
Mac openFind target Mac · Living on Mac · View on MacMac AV agent :8788
Status languageReel + Now stage + room pillsShould all respect confirmation; room pills may still say TV On from power hint
VersionSystems · (optional) old badgesPrefer Systems
Client devices listFind “More places”Other browsers that heartbeated hello
Two launchd labels (ops)com.homecontrol.lutron preferredDuplicate agents caused double hub historically


16. Backend engines & files

FileRole
lutron_lights.pyMain hub HTTP server + entire SPA HTML/CSS/JS
lutron_engine.pyRadioRA 2 telnet / levels
sonos_engine.pySonos discovery & transport
cast_engine.pyChromecast / Google speakers + YT cache/proxy
autonomic_engine.pyMirage / Autonomic music
music_engine.pyFree / library sources
av_engine.pyApple TV pyatv Companion
firestick_engine.pyADB Fire Stick
find_watch_engine.pySearch + play routing
sports_tonight.py“Yankees tonight?” style answers
mac_av_engine.py / mac_av_agent.pyOpen URLs / YTTV on Mac
nest_engine.pyCameras
voice_assistant.pyVoice parsing
secrets_env.py + secrets.envStreaming credentials (local)
rooms_config.jsonRoom map
home_config.jsonURLs, systems flags
firestick_config.jsonStick serials / IPs
zones.json / scenes.jsonLights
USER_GUIDE.mdThis document
start_hub.shStart venv python hub
install_mac_autostart.shlaunchd

17. HTTP / API map (high level)

Pages

PathContent
/Main SPA
/guideHTML guide (this doc)
/USER_GUIDE.mdRaw markdown
/setup-httpsCert install help
/watchView on Mac companion
/api/ping{ ok, version, uptime_sec, url }

Representative APIs

AreaExamples
Lights/api/set, /api/set-batch, /api/levels, /api/hot-buttons
Home/api/home/status, /api/home/rooms
Sonos/api/sonos/speakers, …/transport, …/play, …/volume, …/favorites
Cast/api/cast/play-url, …/transport, …/stations
Music YT/api/music/youtube/search, …/play, …/stream
Video/api/video/layout, …/now-playing, …/scan, …/match, …/appletv/command
Fire Stick/api/video/firestick/status, …/launch, …/key, …/connect
Find/api/find/watch, /api/find/play
Clients/api/client/hello, …/devices, …/pending
Health/api/health, /api/connection, /api/logs
Cameras/api/cameras/status, stream endpoints

18. Start / restart / autostart

macOS (iMac)


cd ~/LutronControl
./start_hub.sh
# or
.venv/bin/python lutron_lights.py

launchd (preferred single agent): ~/Library/LaunchAgents/com.homecontrol.lutron.plist

KeepAlive + RunAtLoad · working directory ~/LutronControl · venv python.

Mac AV agent: mac_av_agent.py on port 8788 (start_hub may launch it).

Windows PC (host the hub)

Full guide: WINDOWS_HOST.md

Install Python 3 (add to PATH)

Copy LutronControl folder to the PC

Run Setup Windows Host.bat

Run Start Home Control.bat

Open http://127.0.0.1:8787/ (phones: http://PC_LAN_IP:8787/)

Optional: Install Auto-Start.bat for login + watchdog

Only one hub at a time on port 8787 (stop iMac hub if Windows is hosting).

Ping check:


curl -s http://127.0.0.1:8787/api/ping

19. Troubleshooting

SymptomWhat to try
Wrong version in UIHard-refresh; check /api/ping version
Says iPhone on MacFixed in 1.20.2+; hard-refresh; last resort localStorage.removeItem('fwDevice')
Lights pausedLutron processor IP / network; music & video still work
Fire Stick unauthorizedHDMI to TV → Developer options → Allow this computer
Play says OK but nothing on TVRead confirm status; check pair Apple TV; Fire focus app
Sonos YouTube silentUse hub YT proxy path (Music YT mode), not raw googlevideo
Mic blockedHTTPS + install CA via /setup-https
Double hub / flaky portsOnly one launchd agent; free 8787/8443
Search results emptyTry Movies mode; check hub online; free filters hide stubs

20. Version history (recent UX)

VersionHighlights
1.19.xFind & Watch polish, sports ship, sticky search, Fire Stick, play reel
1.19.27Real play confirmation (no fake LIVE)
1.19.28Easy Watch Where→App→Show
1.20.0Design overhaul: calm Video, folds, gold=primary, honest Now stage, quiet footer
1.20.1–1.20.2Device labels: live detect This Mac / This iPhone
1.20.3This guide + footer Guide link
1.21.0Redesign brief: single status strip, calm room cards (no IPs), Settings tab, gated Integrations PIN, lights All off, camera states, play reel only when confirmed

Quick couch recipes

Fox News on Living Room

Video → Watch → Living Room → Fox News → Fox News Live

YouTube TV guide on Living

Video → Watch → Living Room → YouTube TV → Live guide

Free dog cartoon on Living

Video → Search anything → type query → Find → pick FULL FREE → Play on Living TV

Pause Patio TV

Video → TVs & remotes → Patio card → ⏸

Music on Den Sonos

Music → pick Den/Sonos → search or favorite → ▶


Maintainer notes


*End of Home Control complete guide. For ops install notes see also README.txt (sync / File Sharing / Windows legacy).*