Pubers, ze kunnen soms zo leuk zijn...
Als ze zich terugtrekken op hun kamer met de deur dicht en je wil ze roepen voor het eten bijvoorbeeld. Telefoons? Op stil. Dus schreeuwen door het huis. Nou, daar was ik zo klaar mee....
Toen bedacht ik dat ik Google TTS in HA heb zitten. En ze hebben allebei een connected speaker op hun kamer: dochterlief een Sonos Symfonisk en zoonlief een oude Harman Kardon Citation 700. Daar moet ik toch wat mee kunnen?
Met de Sonos speakers is het heel eenvoudig. Je gooit er een TTS bericht naartoe, als er wat speelt wordt dat gedempt, bericht wordt afgespeeld en daarna vervolgt de originele bron.
De Citation was lastiger. Dit is een Google Cast apparaat en als er een TTS bericht op afgespeeld wordt gaat die niet terug naar de originele bron. Daar zijn ook geen entiteiten/acties voor in HA. Uiteindelijk stuitte ik op een post op de HA community: die Harman Kardon blijkt een lokale API te hebben waarmee de bron gezet kan worden. Dus YAML aangemaakt die de API aanroept.
Vervolgens een script opgezet wat:
- bericht afspeelt
- originele bron herstelt
Zoals ik al aangaf gaat dat met Sonos heel makkelijk. Voor de Citation is het bericht afspelen niet zo moeilijk, maar als je de bron terug wil zetten zal je moeten weten hoe lang het bericht duurt. AI kwam hier met een goede oplossing: TTS spreekt in Nederlands ongeveer 10 karakters per seconde. Dus door de lengte van de tekst te nemen, dat te delen door 10 en naar boven af te ronden zit je heel behoorlijk. Daarna via de API de bron terug zetten.
De eerste test bezorgde me een enorm boze puber: haar speaker stond nog op standje discotheek en ze zat zonder muziek te leren. Die boodschap dat het eten klaar was kwam letterlijk nogal binnen
Dus toegevoegd dat het volume op 40% wordt gezet als er niets afgespeeld wordt. Anders wordt het huidige afspeelvolume gebruikt.
Nog wat leuke dingen erbij zoals een vooraankondiging en we hebben zowaar een simpel Intercom systeem in huis!
YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
| alias: Intercom verzenden
mode: queued
sequence:
- variables:
bestemming: "{{ states('input_select.intercom_bestemming') }}"
bericht: "{{ states('input_text.intercom_bericht') }}"
speakers: >
{% if bestemming == 'Thijs' %}
['media_player.soundbar_thijs']
{% elif bestemming == 'Vera' %}
['media_player.slaapkamer_vera']
{% elif bestemming == 'Woonkamer' %}
['media_player.woonkamer']
{% elif bestemming == 'Keuken' %}
['media_player.keuken']
{% elif bestemming == 'Vera en Thijs' %}
['media_player.slaapkamer_vera', 'media_player.soundbar_thijs']
{% endif %}
- repeat:
for_each: "{{ speakers }}"
sequence:
- variables:
speaker_is_playing: >
{{ states(repeat.item) == 'playing' }}
original_volume: >
{{ state_attr(repeat.item, 'volume_level') | default(0.4) }}
volledige_tekst: >
Bericht voor {{ bestemming }}.
{{ bericht }}
# Volume alleen aanpassen als er niets speelt
- if:
- condition: template
value_template: "{{ not speaker_is_playing }}"
then:
- action: media_player.volume_set
target:
entity_id: "{{ repeat.item }}"
data:
volume_level: 0.4
- choose:
# Sonos / Symfonisk
- conditions:
- condition: template
value_template: >
{{ repeat.item != 'media_player.soundbar_thijs' }}
sequence:
- action: tts.speak
target:
entity_id: tts.google_translate_nl_nl
data:
media_player_entity_id: "{{ repeat.item }}"
message: "{{ volledige_tekst }}"
# Citation
- conditions:
- condition: template
value_template: >
{{ repeat.item == 'media_player.soundbar_thijs' }}
sequence:
- action: tts.speak
target:
entity_id: tts.google_translate_nl_nl
data:
media_player_entity_id: "{{ repeat.item }}"
message: "{{ volledige_tekst }}"
- delay:
seconds: >
{{ [
4,
((volledige_tekst | length) / 10) | round(0, 'ceil')
] | max }}
- action: rest_command.citation_set_optical
# Volume terugzetten indien aangepast
- if:
- condition: template
value_template: "{{ not speaker_is_playing }}"
then:
- action: media_player.volume_set
target:
entity_id: "{{ repeat.item }}"
data:
volume_level: "{{ original_volume }}" |
Input komt van een simpele kaart met een dropdown voor de ontvanger en een tekstinvoer voor het bericht.
Eerlijkheidshalve moet ik wel zeggen dat ik ChatGPT vooral gevoed heb met wat ik wil hebben. Het script is van de hand van ChatGPT. Ik begrijp echter wel wat het script doet
Verbeteringen zijn dan ook altijd welkom!
[
Voor 0% gewijzigd door
Septillion op 23-06-2026 20:03
. Reden: Yaml code tags ]