TL;DR My house plays fifteen spoken announcements on a school day, from wake-up to bedtime, on two speakers. At first they played perfectly and nobody moved. The sound was fine. The text was the problem. I rewrote the thirteen messages of the time against eight rules, and the most surprising one was removing every choice. The wake-up was rewritten three times in a single day. The music now starts first and the voice comes in 90 seconds later. This is the one episode of the series with no protocol in it.


7:31 p.m. The living-room speaker announces: "It's quiet time. You can read, draw, or play."

The message goes out at the right time, at the right volume, in the right room. Nobody moves.

For the last three episodes I checked what machines tell me. This time the machine told the truth: the announcement went out on time. The setup worked from day one. The text did not.

The sound was not the problem

Two sentences are enough. I built it in one evening and have not touched it since. Speech synthesis is done by Piper, in a container, in French, with no external service. The announcements never call a speaker directly. They all go through one Home Assistant script, which picks the room and the volume and applies the quiet hours. When a speaker changes name, I fix one place.

Eight rules, written afterwards

The real work was in the texts. I rewrote the thirteen messages of the time in a single pass, then wrote the grid down.

  1. Name first. An impersonal instruction is addressed to nobody, so nobody moves. "We tidy our things" is addressed to no one in particular.
  2. One action per announcement. No two instructions in the same message.
  3. Imperative verb, concrete object. "Brush your teeth", not "it is teeth-brushing time".
  4. Never a question. "In your pyjamas? Then…" opens a discussion.
  5. Bound the time when the task is open-ended. Homework became "Fifteen minutes, then we eat".
  6. Sequence explicitly when order matters. "Shoes, then coat."
  7. Offer no choices. Every option is a decision to make before acting.
  8. No adult logistics in a message for a child. The 7:50 announcement gave everyone else's schedule, and the one useful instruction got lost in it.

A script applied the grid. It walks through every call to the announcement script and fixes the text in place. Thirteen automations rewritten and reloaded, no configuration errors, in the time it takes to make coffee. There are two more today. It cost almost nothing, so I could keep trying until one version worked, instead of keeping the first one that looked reasonable.

Rule 7 is the one that surprised me most. It comes from the quiet-time message.

QUIET TIME · 7:31 PM · THREE VERSIONS Three versions of one message. VERSION 1 · THREE DECISIONS BEFORE ACTING “NAME, it's quiet time. You can read, draw, or play.” VERSION 2 · ONE DECISION “NAME, quiet time. You can read or draw.” VERSION 3 · NONE “NAME, quiet time.” The coloured part never changed. The rest was removed.

The first version offered three activities. I thought I was doing the right thing: offering a choice is a way to respect a child. With two options, it worked slightly better. With none, it worked. The announcement says what is expected. It does not offer a menu.

The grid had another effect that bothered me at first. Two announcements had a "Wednesday" version and a "school day" version that said the same thing in different words. I merged them. A message that is identical every day is recognisable from its first words.

One rule cost me something. The breakfast announcement used to say "you need to be dressed". It no longer does, because of rule 2. Only the wake-up still says it, 90 seconds after the music starts. Nobody checks at the breakfast step any more. I do not know if that is the right trade-off.

Three messages break the grid today. The clearest is a TV announcement, added after the rewrite: "NAME, teeth done? You can go watch TV until seven thirty." It asks a question and leaves an option, so it breaks rules 3, 4 and 7. I have not fixed it yet. The wake-up message chains two instructions: "NAME, get up. Seven fifteen. Get dressed first." (rule 2). The 7:55 gate message, addressed to the whole family, says "Let's go" without a name (rule 1).

An announcement worked if somebody moved. That it played proves nothing.

Messages for adults keep their logistics. The 8 a.m. one says "You are late" and reminds everyone where they should be. At that hour, only the people who have not left hear it.

The wake-up, three versions in one day

The first version of the wake-up announced first, then started the music. It lasted one morning. Being woken by a voice did not go down well.

I flipped the order the same day. The music starts first, and the voice comes in over it 90 seconds later.

WAKE-UP · 18 SEPTEMBER VERSION Music first, voice second. 10% 15% 20% 25% 30% T+90 s 0 s · the music starts Three settings in one day, ending at 30%. The speaker volume is not restored afterwards.

The setting that matters is the ramp. The speaker starts at 10%. It climbs 5 points every 20 seconds, up to 30%. The voice comes in at 90 seconds, whatever the ramp. I tried three settings: a single step at 20%, a ramp to 20%, then a ramp to 30%.

I also dropped one of my starting instructions. I had asked for the music to resume "at the speaker's current volume". The music is now the alarm, and inheriting last night's volume makes it unpredictable. One morning it is too loud, the next it is inaudible.

Two limits. The volume is not put back after the wake-up, so the speaker stays at 30% until somebody touches it. And the ramp overrides any manual reduction made during the first 80 seconds, because nothing detects it.

Choosing the music held a surprise. The speaker had no local playlist and its favourites were empty. The only list I listened to came from a streaming service, pushed from the phone. So I saved the current queue as a local playlist. Home Assistant finds that playlist by its exact title, so renaming it in the app breaks the wake-up. One last detail: playback restarts on the first track. The shuffle setting stays whatever the speaker has, and the automation does not touch it.

No dedicated automation stops the music. The 8 a.m. announcement pauses the speakers that are playing at that moment. The list is filtered on the "playing" state instead of being hard-coded, so an idle speaker does not cause an error. If nothing is playing, the list is empty and nothing happens.

The day the speaker does not answer

If a routine announcement fails, it does not matter. If the wake-up fails, nobody wakes up.

So the wake-up automation first checks that the bedroom speaker is available. If it is, the automation starts the music, then calls the announcement script. If not, it sends two notifications: a high-priority one to the phones, and a persistent notification in the interface. Both give the speaker's state and the time, and say the wake-up was not played.

That fallback took me ten minutes to write. At that price, there was no reason to go without it.

What the house does not say

A few prohibitions were added to the writing rules.

The house is single-storey. I never write "go up", "come down", "upstairs" or "downstairs", in announcements or in notifications. They are easy to write out of habit.

Nothing is broadcast between 9:45 p.m. and 7 a.m. unless the call asks for it. A washing machine that finishes at two in the morning wakes nobody. Safety alerts ask for it: gate left open, someone detected outside, freezer failure.

One branch of the script does nothing for now, on purpose. It is meant for a second child's bedroom, which has no speaker yet. When it gets one, giving it the right name in the manufacturer's app will be enough for the script to find it.

What still belongs to humans

Knowing that a child does not like being woken by a voice. No data from this installation shows it. It shows at 7:15.

Checking whether the announcement leads to an action. Home Assistant knows the clip played. It does not know whether anyone moved, and that is the only measure that matters here.

Deciding what the house imposes. Quiet time at 7:31 p.m., the television cut at 7:30, bed at 8:30: these are parenting decisions, not optimisations. No sensor produces them.

What I am taking away

  • Write the grid, not just the messages. A text always ends up changing, and the grid is how I reread the next one. The TV message, added later, shows that I have to reopen it for every new announcement.
  • Test quietly. A throwaway automation that prints the text it receives beats a live trial at seven in the morning.

The next episode goes back to building physics: six shutters deciding their own position from their room temperature and the sun's track across their facade, a land registry, and an office at 29 °C in the middle of the night without a single ray of sun.

Downloads

  • annonce-vocale.yaml: the script every announcement goes through. One thing to adapt, the speaker table.
  • LISEZMOI.md: installation, how it works without Home Assistant, and the eight-line writing grid. Written in French.

Read the series: Ten Years of Home Automation Alone. One Year With an Agent : the inventory and a measurement of what changed. AI Didn't Automate My House : why the win shows up on the projects you never started. I Changed the Evening Schedule Three Times in One Week : gate, television, shutters and the school calendar. My Office Sits at 29 °C at Night : six shutters deciding on their own, and what the model told me not to do.