# HA + Google Home setup — POS Briefing button (DEPLOYED 2026-06-07) Status: deployed on VM HA (`192.168.0.146`, HAOS 2026.2.3) and verified end-to-end through HA. Final Google-app surfacing is yours (see "Your steps"). Chain: **Google Home tile → HA `switch.print_daily_briefing` → `button.press` on `button.pos_briefing_print_daily_briefing` → MQTT `posbriefing/button/press` (broker CT 301) → `pos-briefing-mqtt.service` on steel141 → `pos_briefing.py` → printer (by MAC) → TM-m30.** ## Why a switch, not a scene A `script`/`scene` exposed to Google gets the **Scene** trait, which Google Home does **not** render as a tappable tile (it's voice/Routine-only). A **switch** renders as a tile (like the LG TV). So the action is exposed as a template switch. Because HomeGraph state reporting is currently broken (see below), the switch is forced **always-off** and **both on and off fire the print**, so a tap always prints regardless of Google's cached state. The bridge debounce prevents any double-print. (Once the SA key is fixed, this can be simplified to on-only.) ## What is deployed on VM HA `/config` (backups in `/config/.backup/`) - **`scripts.yaml`** — `script.print_daily_briefing` (presses the button). Kept as an alternate trigger; not exposed to Google. - **`configuration.yaml`**: - `switch:` template `print_daily_briefing` (the tile; entity `switch.print_daily_briefing`). - `google_assistant.entity_config` exposes `switch.print_daily_briefing` (alongside the LG TV + projector; nothing else changed). - `ha core check` passed → `ha core restart`. Local SYNC webhook confirms the entity is reported to Google as `action.devices.types.SWITCH`. ## Verified - Local Google SYNC (the manual integration's local-fulfillment webhook) returns 3 devices: **Print Daily Briefing (SWITCH)**, Big TV (SWITCH), Projector (SETTOP). - `switch.turn_on switch.print_daily_briefing` → bridge `Briefing printed OK` → **physical receipt**. (Same for the earlier `script` path.) ## Known issue — HomeGraph auth broken (pre-existing, not from this work) HA's `SERVICE_ACCOUNT.json` (project `seth-freiberg`, SA `claude@seth-freiberg.iam`) has an **invalid private key** (`invalid_grant: Invalid JWT Signature`) — the key was rotated/deleted during the lgtv 2026-06-06 security cleanup but the HA copy was never refreshed. Effects: - `devices:requestSync` 400 → HA can't proactively push device-list changes; you must re-sync from the Google side ("Hey Google, sync my devices"). - `devices:reportStateAndNotification` 400 → device states (incl. the TV/projector) don't push to Google in real time. **Fix (GCP, your call):** create a new JSON key for `claude@seth-freiberg.iam` (HomeGraph API enabled), deploy to `/config/SERVICE_ACCOUNT.json` (chmod 600), restart HA. Then `request_sync` and live state work for all devices, and this switch can drop the both-directions-fire hack. ## Your steps (Google Home app, account `slingshooter08`) 1. Say **"Hey Google, sync my devices"** (linking-based sync; works despite the SA-key issue). **Print Daily Briefing** should appear as a tile. 2. Remove any **stale/phantom device** — HA only sends 3 devices; if Google shows 4, the extra is leftover from a prior link. (Settings → the duplicate → Remove.) 3. Tap **Print Daily Briefing** → receipt prints in ~1–2 min. ## Notes - A print takes ~1–2 min (gemma4:26b). `posbriefing/status` goes `printing` → `ok`. - Google-linking invariants (lgtv 2026-06-06, satisfied — don't re-fix): manual `google_assistant`, scopes `email`+`name`, "HTTP basic auth header" OFF, GCP consent screen untouched (shared project).