Document Vino Nest and HA recovery

This commit is contained in:
Donavan Fritz
2026-07-18 10:58:11 -05:00
parent f806ebcbd9
commit efa8a7c1ba
2 changed files with 33 additions and 5 deletions
+1 -1
View File
@@ -27,7 +27,7 @@ user-invocable: true
<references> <references>
<reference file="reference/home-assistant.md" <reference file="reference/home-assistant.md"
summary="HA app layer on home.vino.network: editing Lovelace (storage-mode, WS config/save whole-config read-modify-write), Great Room AV topology (Samsung Frame + HDMI matrix + Denon AVR zones for audio + set_mode scripts), and the virtual-remote subviews (great-room-tv-remote context-aware D-pad). Infra/access owned by fritzlab skill." summary="HA app layer on home.vino.network: Nest Matter naming and cloud-fallback target, storage-mode Lovelace editing, Great Room AV topology and Denon recovery, set_mode scripts, and virtual-remote subviews. Infra/access owned by fritzlab skill."
categories=["services", "automation", "display"] categories=["services", "automation", "display"]
keywords=["Home Assistant", "Lovelace", "dashboard", "virtual remote", "TV remote", "great room", "Frame TV", "HDMI matrix", "Denon AVR", "Roku", "Fire TV", "set_mode", "home.vino.network", "subview", "media_player.great_room"] /> keywords=["Home Assistant", "Lovelace", "dashboard", "virtual remote", "TV remote", "great room", "Frame TV", "HDMI matrix", "Denon AVR", "Roku", "Fire TV", "set_mode", "home.vino.network", "subview", "media_player.great_room"] />
<reference file="reference/boat.md" <reference file="reference/boat.md"
+32 -4
View File
@@ -1,18 +1,40 @@
# Home Assistant (app layer) # Home Assistant (app layer)
<scope>Dashboards (Lovelace), the Great Room AV stack, and household automations on `home.vino.network`. Access/SSH/API/Z-Wave infra is owned by the **fritzlab** skill [[home-assistant]] (`reference/home-assistant.md`). Token: `HA_ACCESS_TOKEN` in `~/code/git/code.fritzlab.net/fritzlab/k8s-manager/.env`.</scope> <scope>Dashboards (Lovelace), the Great Room AV stack, and household automations on `home.vino.network`. Access/SSH/API/Z-Wave infra is owned by the **fritzlab** skill [[home-assistant]] (`reference/home-assistant.md`). Token: `VINO_HA_TOKEN` in `~/.env`.</scope>
<config-repo> <config-repo>
Config is version-controlled at **`dfritz/home-assistant`** (code.fritzlab.net; clone `~/code/git/code.fritzlab.net/dfritz/home-assistant`): a manual mirror of the safe parts of HAOS `/config` — YAML config + includes, blueprints, `custom_components/frame_art`, `www/` cards, and a `dashboards/` snapshot of the storage-mode Lovelace (export, not live-sync). Gitignored: `secrets.yaml`, `.storage/`, the DB, `*.pem`, logs, deps/venv. Externally-managed components stay in their own repos: celebright → `dfritz/celebright`, hdmi_matrix → `dfritz/haas-hdmi-matrix-custom-component`. No CI auto-deploy — sync via `rsync -e "ssh -4"` to/from `home-assistant.vino.network:/config/`. Config is version-controlled at **`dfritz/home-assistant`** (code.fritzlab.net; clone `~/code/git/code.fritzlab.net/dfritz/home-assistant`): a manual mirror of the safe parts of HAOS `/config` — YAML config + includes, blueprints, `custom_components/frame_art`, `www/` cards, and a `dashboards/` snapshot of the storage-mode Lovelace (export, not live-sync). Gitignored: `secrets.yaml`, `.storage/`, the DB, `*.pem`, logs, deps/venv. Externally-managed components stay in their own repos: celebright → `dfritz/celebright`, hdmi_matrix → `dfritz/haas-hdmi-matrix-custom-component`. No CI auto-deploy — sync via `rsync -e "ssh -6"` to/from `home-assistant.vino.network:/config/`.
</config-repo> </config-repo>
<nest-matter>
## Nest thermostats
Matter Server 9.1.0 and the `matter` integration provide local control for three
Nest Learning Thermostat 4th gen nodes plus their bridged sensors. Primary devices
are `Entryway Nest`, `Master Bedroom Nest`, and `Sport Court Nest`; climates are
`climate.entryway_nest`, `climate.master_bedroom_nest`, and
`climate.sport_court_nest`. Thermostats carry `Matter Nest` + `Matter HVAC` labels;
child devices are `<Location> Sensor Nest` and unlabeled. All three are forced-air
`heat_cool` zones.
The cloud `nest` fallback integration is not configured. It requires a dedicated
Vino Web OAuth client in Google Cloud project `home-assistant-471823` (redirect
`https://my.home-assistant.io/redirect/oauth`) and a separate Device Access project;
do not reuse Lodge OAuth credentials, Device Access project, or Pub/Sub subscription.
Target cloud naming is `<Zone> Google Nest` and `climate.<zone>_google_nest`, labels
`Google Nest` + `HVAC`.
Recovery backup `pre-nest-normalization-2026-07-18` (`a7b09a9b`) contains HA
registry/dashboard state without the database.
</nest-matter>
<lovelace> <lovelace>
## Editing dashboards (Lovelace) ## Editing dashboards (Lovelace)
Both dashboards (`Overview` url_path `lovelace`, `Map`) are **storage mode** (UI-managed), not YAML — no file to edit. Drive over the WS API: Both dashboards (`Overview` url_path `lovelace`, `Map`) are **storage mode** (UI-managed), not YAML — no file to edit. Drive over the WS API:
- Read: `{"type":"lovelace/config"}` (no `url_path` = default `Overview`) → full config (`views[]`). - Read: `{"type":"lovelace/config"}` (no `url_path` = default `Overview`) → full config (`views[]`).
- Write: `{"type":"lovelace/config/save","config":<whole config>}`**whole-config read-modify-write**, not per-view. Always back up the fetched config first; a bad save replaces every view. - Write: `{"type":"lovelace/config/save","config":<whole config>}`**whole-config read-modify-write**, not per-view. Always back up the fetched config first; a bad save replaces every view.
- Views use `subview: true` for the per-device remotes (reached by nav, not the top tab bar). Card commands: copy a *proven* button from a working view rather than guessing service/command strings. - Views use `subview: true` for the per-device remotes (reached by nav, not the top tab bar). Card commands: copy a *proven* button from a working view rather than guessing service/command strings.
- No HACS, no custom themes (`frontend/get_themes` empty). Custom Lovelace cards: drop the JS in `/config/www/` (root-owned → `ssh -4 … sudo tee`), register via `{"type":"lovelace/resources/create","res_type":"module","url":"/local/<file>.js?v=N"}`. Served at `https://home.vino.network/local/<file>.js`. Browser caches resources — bump `?v=` and hard-refresh (mobile app: restart) to pick up changes. - No HACS, no custom themes (`frontend/get_themes` empty). Custom Lovelace cards: drop the JS in `/config/www/` (root-owned → `ssh -6 … sudo tee`), register via `{"type":"lovelace/resources/create","res_type":"module","url":"/local/<file>.js?v=N"}`. Served at `https://home.vino.network/local/<file>.js`. Browser caches resources — bump `?v=` and hard-refresh (mobile app: restart) to pick up changes.
</lovelace> </lovelace>
<great-room-av> <great-room-av>
@@ -28,6 +50,12 @@ Source switching = `script.set_mode_great_room_*`:
- Each sets both matrix outputs then runs `script.building_block_set_great_room_to_hdmi_matrix` (TV→HDMI, AVR zones on, vol 0.55, ALL ZONE STEREO). - Each sets both matrix outputs then runs `script.building_block_set_great_room_to_hdmi_matrix` (TV→HDMI, AVR zones on, vol 0.55, ALL ZONE STEREO).
Source devices: Roku (`remote.roku_ultra`/`roku_3`, commands **lowercase** `home/back/up/down/left/right/select/info`); Fire TV (`remote.fire_tv_stick`, commands **UPPERCASE** `HOME/BACK/UP/DOWN/LEFT/RIGHT/CENTER/INFO/MENU`). App shortcuts via `media_player.select_source` (Roku Plex source = `Plex - Free Movies & TV`). Source devices: Roku (`remote.roku_ultra`/`roku_3`, commands **lowercase** `home/back/up/down/left/right/select/info`); Fire TV (`remote.fire_tv_stick`, commands **UPPERCASE** `HOME/BACK/UP/DOWN/LEFT/RIGHT/CENTER/INFO/MENU`). App shortcuts via `media_player.select_source` (Roku Plex source = `Plex - Free Movies & TV`).
Great Room AVR = Denon AVR-X2700H. `setup_error` plus a timeout on
`:8080/goform/Deviceinfo.xml` is a wedged receiver network stack; the narrow repair
is Denon telnet command `NSRBT`, wait for Deviceinfo HTTP 200, then reload the
`Great Room` config entry. This preserves power/mute state and restores
`media_player.great_room` + `media_player.kitchen`.
</great-room-av> </great-room-av>
<remotes> <remotes>
@@ -44,6 +72,6 @@ Source-of-truth: `dfritz/home-assistant` repo → `www/great-room-remote-card.js
- *TV*: forces `remote.the_frame_tv`. One-tap fallback if a source device (asleep Roku → "Error communicating with Roku API") doesn't respond. **Samsung `samsungtv` integration needs `KEY_*` codes** (`KEY_UP/DOWN/LEFT/RIGHT/ENTER/RETURN/HOME/INFO`, `KEY_VOLUP/VOLDOWN`) — lowercase words return HTTP 200 but the TV silently ignores them (this is why the original lowercase remote never actually drove the TV). - *TV*: forces `remote.the_frame_tv`. One-tap fallback if a source device (asleep Roku → "Error communicating with Roku API") doesn't respond. **Samsung `samsungtv` integration needs `KEY_*` codes** (`KEY_UP/DOWN/LEFT/RIGHT/ENTER/RETURN/HOME/INFO`, `KEY_VOLUP/VOLDOWN`) — lowercase words return HTTP 200 but the TV silently ignores them (this is why the original lowercase remote never actually drove the TV).
- Tapping a source pill switches the matrix (`set_mode` script) and snaps target back to Follow source. - Tapping a source pill switches the matrix (`set_mode` script) and snaps target back to Follow source.
**Volume/mute are context-aware too** (per-profile `volume` entity): TV target → `media_player.the_frame_tv` (Samsung supports `volume_set`); source target → `media_player.great_room` (Denon AVR zone, the audio path for matrix sources). The slider uses a timestamp guard (not `activeElement`) so frequent `hass` updates don't snap the thumb back mid-drag on iOS. Frame TV can't launch apps via `select_source` (source_list only `['TV','HDMI']`), so apps only show for Roku/Fire. All entities/commands live in `DEFAULTS` (config-overridable). **Volume/mute are context-aware too** (per-profile `volume` entity): TV target → `media_player.the_frame_tv` (Samsung supports `volume_set`); source target → `media_player.great_room` (Denon AVR zone, the audio path for matrix sources). The slider uses a timestamp guard (not `activeElement`) so frequent `hass` updates don't snap the thumb back mid-drag on iOS. Frame TV can't launch apps via `select_source` (source_list only `['TV','HDMI']`), so apps only show for Roku/Fire. All entities/commands live in `DEFAULTS` (config-overridable).
**Deploy after edit:** `node --check` then `cat www/great-room-remote-card.js | ssh -4 home-assistant.vino.network 'sudo tee /config/www/great-room-remote-card.js'`, bump resource `?v=` (WS `lovelace/resources/update`, resource_id `7ee4fcac14ea4a3b9ef76c0625a89721`), hard-refresh. **Deploy after edit:** `node --check` then `cat www/great-room-remote-card.js | ssh -6 home-assistant.vino.network 'sudo tee /config/www/great-room-remote-card.js'`, bump resource `?v=` (WS `lovelace/resources/update`, resource_id `7ee4fcac14ea4a3b9ef76c0625a89721`), hard-refresh.
</great-room-remote-card> </great-room-remote-card>
</remotes> </remotes>