# voice-display.yaml configuration template. # # Copy this to firmware/esp32-s3-touch-lcd-1.85c/secrets.yaml (same directory as # voice-display.yaml — that's where ESPHome's !secret lookup expects it) and fill # in real values. Same never-commit handling as digest-engine.env / admin-canvas.env # elsewhere in this repo: the real secrets.yaml is git-ignored, only this .example # is tracked. # # ONE SECRETS.YAML PER PHYSICAL UNIT. This is a per-room device, exactly like the # thin client's per-image THINCLIENT_NAME/DIGEST_WEB_URL (hosts/thin-client/ # scripts/build-thin-client-iso.sh) — flashing two units from the same secrets.yaml # means both show the SAME room's media status, which defeats the point. Keep a # separate copy (or a separate ESPHome dashboard entry) per unit, with `room` in # voice-display.yaml's substitutions and media_player_entity_id below both set to # match that specific unit's actual room. See README.md's "Multiple rooms" section. # --------------------------------------------------------------------------- # Wi-Fi # --------------------------------------------------------------------------- wifi_ssid: "your-wifi-ssid" wifi_password: "your-wifi-password" # Fallback AP password if this device can't join the network above. ap_password: "changeme-fallback-ap-password" # --------------------------------------------------------------------------- # Home Assistant API — generate with the ESPHome dashboard/CLI ("esphome # secrets" or the wizard does this automatically), or by hand: # python3 -c "import base64, os; print(base64.b64encode(os.urandom(32)).decode())" # --------------------------------------------------------------------------- api_encryption_key: "" # OTA updates after the first (USB) flash. ota_password: "changeme-ota-password" # --------------------------------------------------------------------------- # Home Assistant base URL — used only to resolve the relative entity_picture # path HA returns for the media_player entity below into a fetchable URL. # LAN address, not the public one; this device never needs to leave the LAN. # --------------------------------------------------------------------------- ha_base_url: "http://homeassistant.local:8123" # --------------------------------------------------------------------------- # What to mirror on screen — NEITHER of these is guessed, both need a real # decision before the device shows anything meaningful. See README.md. # --------------------------------------------------------------------------- # The media_player entity to mirror (cover art + title/artist + play state) — # MUST be the one that actually reflects what's playing in THIS device's own # room, not just any media_player in the house. # # If this room only ever has one real audio source (e.g. just the thin # client's own media_player, hosts/thin-client/agent/thinclient_agent/ # mqtt_discovery.py's register_media_player), point straight at that entity # and you're done. # # If this room can have more than one active source (the thin client AND a # Spotify Connect speaker AND a cast device, say), a single hardcoded # entity_id can't stay correct on its own — build a Home Assistant "Universal # Media Player" for this room (https://www.home-assistant.io/integrations/universal/) # that aggregates all of that room's real media_player entities and reports # whichever one is actually active, then point this at the universal entity # instead of any one real device: # # media_player: # - platform: universal # name: "Living room media" # children: # - media_player.living_room_thinclient # - media_player.living_room_spotify_connect # # (default child-selection behaviour: whichever child isn't idle/off — see # the integration docs if you need custom logic instead, e.g. one source # should always win over another). That HA-side config is not built by this # repo, same "nothing here builds the HA side" convention as everywhere else. media_player_entity_id: "media_player.CHANGE_ME" # The weather entity to show on the idle page. weather_entity_id: "weather.CHANGE_ME"