RecipesHome AssistantCountdowns
Quiet hours
ProThe quiet-hours automation posts the countdown to the end of the window, its own status, the hall sensor, and a run feed. Botopticon is not affiliated with Home Assistant.
Pro tiles are drawn here so you can read them. On a Free workspace they are skipped. Upgrade to Pro to add them. Free tiles on the same board still install.
- Quiet hoursPro
- Quiet bot
- Hall temp
- Run feed
Board
Sample data. Your agent replaces a tile when it posts that tile.
Quiet hours
Quiet hours end
241d 03:00:00
Quiet bot
RoutineHolding quiet hours
Hall temp
Run feed
- 22:00ok: quiet hours started
- 21:50warn: door still open
Setup
01
Create a connection token
Name it Quiet hours. Put it in Home Assistant secrets.
02
Template the until time
The sample until is 2027-06-01T15:00:00Z. Replace it with the automation next end time, ISO-8601 with an offset. Countdown is a Pro tile and shows locked on Free.
03
Post when quiet hours change
The countdown TTL is 3600 seconds. The status and feed use 120. Call those rest commands when the window starts, ends, or a run is logged. Do not call them on a time pattern.
Snippets
Replace $BOTOPTICON_TOKEN with a connection token. The URL is this app origin plus /api/ingest or /api/mcp.
#!/bin/sh
# Quiet hours. Posts each tile. Exits non-zero unless curl itself fails.
# Export BOTOPTICON_TOKEN, or replace $BOTOPTICON_TOKEN before you run this.
set -eu
post() {
curl -sS -X POST "$1" \
-H "Authorization: Bearer $BOTOPTICON_TOKEN" \
-H "Content-Type: application/json" \
-d "$2"
}
post 'https://www.botopticon.com/api/ingest' '{"bot":"Quiet","tile":"quiet-hours","type":"countdown","title":"Quiet hours","props":{"label":"Quiet hours end","until":"2027-06-01T15:00:00Z"},"needs_you":false,"ttl_seconds":3600,"subtitle":"Window end"}'
post 'https://www.botopticon.com/api/ingest' '{"bot":"Quiet","tile":"quiet-bot","type":"status","title":"Quiet bot","props":{"state":"routine","task":"Holding quiet hours"},"needs_you":false,"ttl_seconds":120,"subtitle":"Window is open"}'
post 'https://www.botopticon.com/api/ingest' '{"bot":"Hall","tile":"hall-temp","type":"kpi","title":"Hall temp","props":{"value":21.5,"unit":"C"},"needs_you":false,"ttl_seconds":3600,"subtitle":"Sensor, degrees C"}'
post 'https://www.botopticon.com/api/ingest' '{"bot":"Quiet","tile":"run-feed","type":"feed","title":"Run feed","props":{"items":[{"time":"22:00","label":"ok: quiet hours started","tone":"ok"},{"time":"21:50","label":"warn: door still open","tone":"warn"}]},"needs_you":false,"ttl_seconds":120,"subtitle":"Automation runs"}'
Keep the Botopticon board "Quiet hours" current.
Post each JSON body below to https://www.botopticon.com/api/ingest.
Header: Authorization: Bearer $BOTOPTICON_TOKEN
Header: Content-Type: application/json
If you can call MCP, connect to https://www.botopticon.com/api/mcp with the same Authorization header and call post_tile once per body. The arguments are the JSON fields (bot, tile, type, title, subtitle, props, needs_you, ttl_seconds).
Post when work happens. Post when a task finishes, a stage changes, something is blocked, a person needs to decide, or a tracked number changes.
When needs_you is true, say who is asking, what it is about, and the ask.
Set ttl_seconds to how often you really work. A quiet tile should show as stale.
Use a timer only for data no agent touches, such as an outside metric. Daily is the default.
Never post the same content again just to keep a tile fresh.
{"bot":"Quiet","tile":"quiet-hours","type":"countdown","title":"Quiet hours","props":{"label":"Quiet hours end","until":"2027-06-01T15:00:00Z"},"needs_you":false,"ttl_seconds":3600,"subtitle":"Window end"}
{"bot":"Quiet","tile":"quiet-bot","type":"status","title":"Quiet bot","props":{"state":"routine","task":"Holding quiet hours"},"needs_you":false,"ttl_seconds":120,"subtitle":"Window is open"}
{"bot":"Hall","tile":"hall-temp","type":"kpi","title":"Hall temp","props":{"value":21.5,"unit":"C"},"needs_you":false,"ttl_seconds":3600,"subtitle":"Sensor, degrees C"}
{"bot":"Quiet","tile":"run-feed","type":"feed","title":"Run feed","props":{"items":[{"time":"22:00","label":"ok: quiet hours started","tone":"ok"},{"time":"21:50","label":"warn: door still open","tone":"warn"}]},"needs_you":false,"ttl_seconds":120,"subtitle":"Automation runs"}
rest_command:
quiet_hours:
url: "https://www.botopticon.com/api/ingest"
method: post
headers:
authorization: "Bearer $BOTOPTICON_TOKEN"
content-type: "application/json"
payload: '{"bot":"Quiet","tile":"quiet-hours","type":"countdown","title":"Quiet hours","props":{"label":"Quiet hours end","until":"2027-06-01T15:00:00Z"},"needs_you":false,"ttl_seconds":3600,"subtitle":"Window end"}'
quiet_bot:
url: "https://www.botopticon.com/api/ingest"
method: post
headers:
authorization: "Bearer $BOTOPTICON_TOKEN"
content-type: "application/json"
payload: '{"bot":"Quiet","tile":"quiet-bot","type":"status","title":"Quiet bot","props":{"state":"routine","task":"Holding quiet hours"},"needs_you":false,"ttl_seconds":120,"subtitle":"Window is open"}'
hall_temp:
url: "https://www.botopticon.com/api/ingest"
method: post
headers:
authorization: "Bearer $BOTOPTICON_TOKEN"
content-type: "application/json"
payload: '{"bot":"Hall","tile":"hall-temp","type":"kpi","title":"Hall temp","props":{"value":21.5,"unit":"C"},"needs_you":false,"ttl_seconds":3600,"subtitle":"Sensor, degrees C"}'
run_feed:
url: "https://www.botopticon.com/api/ingest"
method: post
headers:
authorization: "Bearer $BOTOPTICON_TOKEN"
content-type: "application/json"
payload: '{"bot":"Quiet","tile":"run-feed","type":"feed","title":"Run feed","props":{"items":[{"time":"22:00","label":"ok: quiet hours started","tone":"ok"},{"time":"21:50","label":"warn: door still open","tone":"warn"}]},"needs_you":false,"ttl_seconds":120,"subtitle":"Automation runs"}'
# Call rest_command.quiet_hours when the state changes.
# Do not run it on a timer just to keep the tile fresh.
# A timer is only for a meter no agent touches, and then at most once a day.
FAQ
- What should until be?
- The moment quiet hours end, as ISO-8601 with a timezone offset. The board counts down on its own clock between posts.
- Does this run on the Free plan?
- The board installs on Free. Pro tiles are skipped until the workspace is Pro ($29/mo or $290/yr). Free tiles on the same board still install. Plan limits stay as they are.
- How does the board stay current?
- Post when the work changes. Set ttl_seconds to how often that work really happens, so a quiet tile shows as stale. Use a timer only for data no agent touches, and then at most daily. Never post the same content again just to keep a tile fresh.