📦 Zařízení · Reproduktory

Reproduktory — tři Cast cíle

Tři Google Cast koncové body (kuchyně, koupelna, ložnice) plus Nest Hub Max v ložnici jako vizuální + audio hybrid. Žádný multi-room sync — místo toho context-aware routing: ráno briefing do kuchyně, odpolední radio do koupelny, večerní hudba do ložnice.

3Cast speakery
1Hub s displejem
200Char TTS limit
4Audio módy

Co to dělá

Speakers s rolí

Tři reproduktory v bytě, každý ve své zóně — kuchyně, koupelna, ložnice. Všechny Google Cast kompatibilní, takže Homey může poslat audio stream přímo (TTS, radio URL, hudba). Plus Nest Hub Max v ložnici který má displej a kameru, dvojí role (audio + vizuální alerty).

Speakers nejsou multi-room synced. Místo toho context-aware routing — audio_brain dispatcher rozhoduje cílový speaker dle TOD a aktivní zóny: ráno briefing do kuchyně (kde se chystá káva), odpolední radio do koupelny (sprchování), večerní muzika do ložnice. Sync není potřeba, je jeden user v jedné zóně v čase.

Capability API přes Homey: speaker_playing, speaker_track, volume_set, volume_mute. Custom radio URLs (Italian Classic Hits Sanremo TuneIn) jdou přes speaker_track hodnotu = stream URL.

Denní provoz

Který speaker kdy

Routing není random — je determinisitc dle TOD + zóny.

  1. Ráno

    Kuchyně dominantní

    03:15 / 03:30 briefing do kuchyňského speakeru. Kuchyně je centrem rituálu — káva, chystání. Speaker volume mid (60), aby probudil ale nebudil sousedy. TV mute pipeline souběžně.

  2. Sprcha

    Koupelna radio

    Motion v koupelně + TOD ráno → spustí Italian Classic Hits Sanremo. Stop při motion_off + 30 s timeout. Volume vyšší (75) aby konkuroval vodě. Prev_playing guard zabraňuje resume bez explicit play.

  3. Den

    Idle

    sh_audio_request='idle'. Speakers fungují jen jako TTS recipients pro alerty (anti-freeze, water leak, brain guardian warnings). Většinou ticho.

  4. Večer

    Ložnice + Nest Hub Max

    Comfort suggest (AI coordinator) → Nest Hub Max v ložnici. Visual prompt na displeji + audio. User může accept přes Cube. Hudba (Spotify cast) jde do ložnice speakeru paralelně.

Hardware v provozu

Konkrétní speakery

Tři Cast koncové body + jeden hybrid.

Speaker kuchyně

Google Cast · Wi-Fi · TTS + radio

Hlavní speaker pro ranní briefing. Capability speaker_playing, speaker_track, volume_set. TTS recipient pro většinu hlášek. Radio backup pro bathroom.

Speaker koupelna

Google Cast · Wi-Fi · ranní radio

Italian Classic Hits ráno při sprchování. Motion-trigger, motion_off + 30 s stop. Po bathroom misroute bug 25.4. doplněn prev_playing guard, aby se nezapnulo z prázdna.

Speaker ložnice

Google Cast · Wi-Fi · evening

Lehčí použití — večerní hudba před spaním, alerty když user v ložnici. Sleep guard chrání před nočními TTS. Speaker variable sh_tts_speaker='ložnice' historicky, real cast jde do kuchyně.

Nest Hub Max ložnice 2

Google Cast · displej · vizuál + audio

ID 5ffffbce3, com.google.chromecast:cast. Sekundární výstup pro vizuální alerty. Comfort suggest s text na displeji + audio. TV mute pipeline jde přes Android TV remote (jiný device).

Pracovna speaker Plánováno

Google Cast · podcast / hudba

Plánovaný Cast speaker do pracovny — focus music, podcast během práce. Aktuální workflow je sluchátka, ale ambient option by byla užitečná pro call awareness (pause music při hovoru).

Pro tech-savvy

Co se děje pod kapotou

Cast capability API, dispatcher routing, TV mute pipeline.

Cast capability API

Homey přes Google Chromecast app exposuje:

  • speaker_playing: boolean — start/stop playback
  • speaker_track: string — URL streamu nebo název
  • speaker_artist: string — read-only metadata
  • speaker_album: string — read-only
  • speaker_position: float 0–1 — track position
  • volume_set: float 0–1 — volume level
  • volume_mute: boolean — mute toggle
  • volume_up / volume_down: trigger eventy

TTS jde přes speaker_track jako data URI nebo TTS endpoint URL (Google Cloud TTS gen → MP3 → cast).

Audio brain dispatcher routing

sh_audio_brain_v2 rozhoduje cílový speaker dle:

  1. User explicit zone: pokud sh_audio_target_zone set
  2. Active zone: nejaktuálnější motion / presence (max(open, kuchyne, koupelna, loznice))
  3. TOD default: ráno=kuchyně, sprcha=koupelna, večer=ložnice
  4. Fallback: kuchyňský speaker (centrální, slyšitelný odkudkoli)

Decision logged do EventLog: audio_dispatch event s zone + speaker + reason. Dohledatelné v Sheets.

200 char TTS limit + briefing split

Google Cast SDK má hard limit 200 znaků na utterance. Delší = stream padá nebo truncates uprostřed věty. Defenzivní truncation v sh_gemini_brain_v1::sayTTS():

if (cleaned.length > 200) {
  cleaned = cleaned.substring(0, 200);
  logMsg('GOOGLE CAST: message truncated to 200 chars');
}

Briefing split do 2 fází:

  • briefing (3:15) — pozdrav, čas, datum, počasí, svátek (max 150 chars)
  • briefing2 (+15 min) — BTC, PM2.5, vlhkost, vtipný komentář (max 170 chars)
TV mute / unmute pipeline

Před každým TTS:

  1. Read TV state (Android TV remote, IP 192.168.1.245)
  2. Pokud volume > 0 → setCap volume_mute = true, ulož original volume
  3. Spustí TTS
  4. Po tts_completed: setCap volume_mute = false, restore volume

Bez tohoto by TTS hlas konkuroval s TV soundu — ranní zprávy + briefing nebylo slyšet. Capability volume_mute je toggle, není potřeba čekat na driver ack.

Sleep guard pro speakers

Sleep state aktivní → priority engine deny pro TTS (priority 100) pokud není critical bypass:

  • Briefing: blokované do unset (3:15 odepne sh_spim)
  • Comfort suggest: blokované celou noc
  • Critical alerts: anti-freeze, water leak, gas → bypass
  • Bathroom radio: blokované (motion v noci → bathroom router dim, žádné radio)

Critical bypass jde přes sh_safety_bypass='yes' short-circuit v priority engine.