Automations¶
Your board is fast enough for automations that happen while you play. The light flashes the moment the third dart of a 180 lands, and the speaker calls the score before you reach the board.
On this page: Blueprints · Blueprint settings · Board events · Examples · Online matches · Adapting automations from older versions
Blueprints¶
Blueprints are ready-made automations, and the integration brings all fifteen along: once your first board is added, they are on the blueprints page, Settings → Automations & scenes → Blueprints. Choose one, select your board and the devices to use, and you're done. They require Home Assistant 2026.8 or newer, and every update of the integration brings their new versions, see updates of the blueprints.
Not sure which one you need? Start from what your home should do:
| Blueprint | What it does | Import |
|---|---|---|
| Celebrate a visit score | Runs your actions for visits from a minimum score (default 180), the moment the third dart lands. The actions can use score, darts, segments and game. The bot's visits count only if you ask for them. |
|
| Dart caller | Announces every visit on your speakers with any text-to-speech engine, with a special message for 180, and optionally every dart. It stays silent during a practice game, which the practice caller calls. The messages are templates. | |
| Takeout actions | Runs actions when you start pulling darts and when the board is clear, for example to brighten the board light. | |
| Start and stop detection automatically | Starts the detection when someone is at the board and stops it after an idle time you choose, so the cameras and board PC can rest. | |
| Board problem alert | Alerts you after a grace period when the board goes offline or a camera fails. An optional all-clear is sent only after a real alert. The actions can use problem and recovered. |
|
| Training report | Sends a daily summary of darts, 3-dart average, highest visit and 180s, skipping days without darts. The summary variable has the sentence ready. |
|
| Training session routine | When a training session starts, runs your actions, turns on the detection and calibrates the cameras after a short wait; when it ends, turns off the detection and runs your actions with reason, darts, average and duration_minutes. The detection switch and the calibration button are optional. |
|
| Practice caller | Calls the practice game on your speakers: "Sam, you require 81" when a checkout is possible, "No score" after a bust, the game shot of a leg or the match, and optionally the score to leave when no checkout is possible and the bull-off. The messages are templates. | |
| Weekly report | Sends your training week when the board ends it, by default on Monday at midnight: darts, training time, sessions, the 3-dart average and its change since the week before, best visit, 180s, checkout rate, streak and new personal bests. The message is a template; by default the report appears in Home Assistant's notifications. | |
| Highlight photo | Takes a picture with a board camera after a visit of at least 180 points (adjustable) or a checkout of the practice game, while the darts are still in the board. It saves the picture to the highlight gallery and runs your actions, which can use photo_url, photo, image, message, score, checkout and who. |
|
| Light show | Plays your light effects, such as WLED presets or room lights, for a 180, a high finish, a bust, a won leg or match, a personal best, the daily goal, a won bull-off, an achievement and the winner of a tournament, and optionally during the takeout and in online matches. It can restore your lights afterwards and pause the detection while an effect plays. | |
| Score display | Shows the practice game on a pixel display at the board, an AWTRIX 3 or a PixelIt: the score after every dart with the route of a checkout, and for a few seconds a 180, a bust, a won leg and the winner. When the game is switched off, or after the idle time, the display goes back to its clock. | |
| Start a game by voice | Starts a practice game when you tell Assist, for example "Start 501 for Alex and Sam", "Start the game Cricket for Alex" or "Play 501 against the bot", in English, German, Spanish, French or Dutch. Assist answers with the game and the players, or with what was wrong. | |
| Enter darts by voice | Enters the darts of a game when you tell Assist, as at a dart machine: the score of a visit, such as "Alex has 140" or "140 points", a checkout, a single dart such as "Triple 20", the next player and undo, in English, German, Spanish, French or Dutch. Assist answers in the words of the scoreboard's caller: what the visit left and who throws next, or why it was refused. | |
| Ask Assist about your darts | Answers your questions about the darts, such as "What is my average today?", "How many 180s this week?", "What is my best checkout?", "Who leads the leaderboard?" or "Where should I aim?", in English, German, Spanish, French or Dutch, from the statistics of the board. Assist answers in the language you asked in. |
The buttons import a blueprint from GitHub, for example one you deleted. Without My Home Assistant, go to Settings → Automations & scenes → Blueprints → Import blueprint and paste the link to the file in blueprints/automation/homedarts. An imported blueprint is kept up to date like the others.
Updates of the blueprints¶
The blueprints are part of the integration, so they always match it: after an update in HACS and the restart of Home Assistant, every blueprint you haven't changed is the version of the new release. The integration keeps them in /config/blueprints/automation/Dennis-Otto/, the folder where Home Assistant's import saves the blueprints of this repository, so a blueprint you imported before is the same file and is updated as well.
- Changed by you: a blueprint you edited stays as it is. A repair under Settings → System → Repairs, Blueprint not updated, offers the version of the integration: confirm it to replace your file, or ignore it to keep yours. A later release that changes the blueprint asks again.
- Deleted by you: stays deleted. Its button above imports it again.
- Your automations keep their settings, and those made from an updated blueprint reload at once.
- Re-import blueprint in the menu of a blueprint is no longer needed. It fetches the blueprint from the main branch on GitHub, which can be ahead of your release; the integration then treats it as changed and offers the version that belongs to your release.
- A blueprint of your own: to change a blueprint and still get the new versions of the original, save your copy under another name, such as
/config/blueprints/automation/Dennis-Otto/my_light_show.yaml. The integration looks after only the files named like its blueprints.
The integration compares what a blueprint does, not its comments or its layout: an update replaces an unchanged blueprint together with comments you added. An update also replaces an earlier version in which you changed only the options of a setting, such as a range or a filter; until the next update that changes the blueprint, such a change stays and gets the repair.
Which caller?¶
- Dart caller: calls every visit, in any game on the board, for example during an online match. While a practice game of the integration is played, it stays silent, so that it never talks over the practice caller. Turn off Stay silent in practice games if you don't use the practice caller.
- Practice caller: calls what matters in the practice game: requirements, busts, game shots and, if you like, the bull-off.
- Caller of the scoreboard card: the scoreboard calls visits and the practice game in one voice, through the browser of the screen at the board. It needs no speakers in Home Assistant.
All three speak the language of Home Assistant without any setting, in English, German, Dutch, French and Spanish, and all three can call with a voice pack of recorded sounds, such as one of darts-caller: see voice packs of the callers and of the scoreboard.
Blueprint settings¶
Every blueprint shows these settings when you create an automation from it: select the blueprint on the blueprints page, fill in the form and save. Settings with a default are optional.
Celebrate a visit score¶
| Setting | Default | What it does |
|---|---|---|
| Board events | The Events entity of your board. | |
| Minimum score | 180 | The lowest visit score that runs the actions. A visit of three darts counts when its third dart lands; a shorter visit when the darts are pulled. |
| Actions | What happens after such a visit. It can use score, darts, segments and game (the practice game, or empty). |
|
| Also for the bot | off | Also runs the actions for the visits of the practice game's bot. Its darts are not in the board, so its visits are left out by default. |
Dart caller¶
| Setting | Default | What it does |
|---|---|---|
| Board events | The Events entity of your board. | |
| Text-to-speech engine | The engine that speaks, for example Home Assistant Cloud or Piper. | |
| Speakers | The media players that play the calls. | |
| Language | empty | The language of the voice, for example en-GB; empty uses the language of the engine. |
| Voice options | empty | Options of the engine, for example voice: ... for another voice. |
| Voice pack | empty | A voice pack in homedarts/voices of the media folder, such as a pack of darts-caller. Its sounds call the visits and the darts it has; the engine speaks the rest. |
| Call every dart | off | Also calls each dart when it lands. The third dart is not called on its own, because the visit follows right away. |
| Stay silent in practice games | on | Leaves the calls to the practice caller while an X01, Cricket or party game of the integration is played. |
| Visit message | {{ score }} |
Said after a visit. It can use score, darts and segments. |
| Message for 180 | {{ call }} |
Said instead of the visit message after a 180: "One hundred and eighty!" in the language of Home Assistant. |
| Dart message | {{ dart_name }} |
Said for each dart. It can use dart_name (such as Treble 20, 5, Bull or Miss, in the language of Home Assistant), segment (such as T20), dart_score and dart_index. |
An empty message stays silent. call and dart_name are the words of the integration, in English with an older version of the integration.
Takeout actions¶
| Setting | Default | What it does |
|---|---|---|
| Board events | The Events entity of your board. | |
| When the takeout starts | none | Runs when a hand reaches the board to pull the darts. |
| When the board is clear | none | Runs when all darts are out of the board. |
Fill in at least one of the two.
Start and stop detection automatically¶
| Setting | Default | What it does |
|---|---|---|
| Presence | Any on/off entity that is on while someone is at the board: an occupancy sensor, the room light or an input boolean. | |
| Detection switch | The Detection switch of your board. | |
| Stop after | 10 minutes | How long the presence has to be off before the detection stops. |
Don't combine this blueprint with a detection switch in the training session routine: both would switch the detection.
A detection you start by hand while the presence is off keeps running. A restart of Home Assistant forgets how long the presence has been off: if nobody is there and the detection runs when Home Assistant starts, the detection stops after Stop after, also one you started by hand. Saving the automation starts the wait over, too, also the wait after a restart, but leaves a detection you started by hand running; saving other automations changes nothing.
Board problem alert¶
| Setting | Default | What it does |
|---|---|---|
| Board connection | The Local connection sensor of your board. | |
| Camera problem | The Camera problem sensor of your board. | |
| Grace period | 2 minutes | How long a problem has to last before the alert, so that a Board Manager restart or a short calibration stays quiet. |
| Alert actions | For example a notification to your phone. problem is offline or cameras. |
|
| Recovery actions | none | Run when a problem you were alerted about is gone, with recovered set to true. |
A problem also counts when it starts while the sensor is unavailable, for example a camera that fails while the board restarts. A problem that ends while the board is offline gets no all-clear of its own. If the board was offline for longer than the grace period, the all-clear of the connection follows; after a shorter restart, a camera problem that the restart solved stays without an all-clear.
A restart of Home Assistant forgets the grace periods: a problem the board has when Home Assistant starts alerts after the grace period, even if it alerted before the restart, and its all-clear follows as usual. Saving the automation keeps a problem that has not alerted yet, whose grace period was running or whose alert an earlier save was waiting for, and it alerts after a new grace period; a problem that alerted already stays quiet. Saving other automations changes nothing.
What this blueprint and the automatic detection do when Home Assistant starts:
Training report¶
| Setting | Default | What it does |
|---|---|---|
| Time | 21:00 | When the report is sent. Choose a time late in the day: darts count for the day on which they are thrown. |
| Minimum darts | 1 | Skips the report when fewer darts were thrown today. |
| Training darts | The Training darts sensor of your board. | |
| Training 3-dart average | The Training 3-dart average sensor of your board. | |
| Training highest visit | The Training highest visit sensor of your board. | |
| Training 180s | The Training 180s sensor of your board. | |
| Actions | For example a notification with summary. They can also use darts, average, highest, scores_180 and darts_today. |
A finished session keeps its totals until the next one starts, so the report checks the Darts today sensor of the same board and skips days without darts. If that sensor is disabled, the darts of the session decide. To start a new session every day, add New training session of your board as the last action.
Training session routine¶
| Setting | Default | What it does |
|---|---|---|
| Board events | The Events entity of your board. | |
| Detection switch | none | Turned on when a session starts and off when it ends. |
| Calibration button | none | The Start automatic calibration button, pressed after the detection has started. It is skipped when the first dart started the session, because that dart is still in the board. |
| Wait before calibrating | 5 seconds | Gives the cameras time to open. |
| When a session starts | none | Runs first, for example to switch on the board light. The board is prepared even if one of these actions fails. |
| When a session ends | none | Runs after the detection has stopped, with reason, darts, average and duration_minutes. |
| Run for a new training session | off | New training session ends a session and starts the next one at once, for example every morning by an automation. By default the board keeps running then; turn this on to run the whole routine. |
Leave the calibration button empty when the board's Calibrate on start setting is on: the board calibrates by itself when the detection starts. Don't combine a detection switch here with the blueprint that starts and stops the detection automatically.
Practice caller¶
| Setting | Default | What it does |
|---|---|---|
| Board events | The Events entity of your board. | |
| Text-to-speech engine, Speakers, Language, Voice options | As in the dart caller. | |
| Voice pack | empty | A voice pack: its sounds call busts, game shots, the match and, when you play alone, what you require; the engine speaks every other call. |
| Checkout possible | {{ call }} |
Said when the next visit can finish the leg: "Sam, you require 81", or "You require 81" when you play alone. |
| No checkout, a setup | empty | Said when the next visit cannot finish the leg but can leave a finish, with leave and setup; {{ call }} says "Sam, leave yourself 32". Empty uses the Next player message. |
| Next player | empty | Said when the next visit cannot finish the leg; {{ call }} says "Sam to throw." in a match. Empty stays silent. |
| Bust | {{ call }} |
Said when a dart busts the visit: "No score". |
| Leg won | {{ call }} |
Said when a dart wins a leg that does not decide the match: "Game shot, and the leg, Sam!", in a team match with the team's name. |
| Match won | {{ call }} |
Said when a dart decides the match: "Game shot, and the match, Sam!", in a team match with the team's name. |
| Leg won on the round limit | {{ call }} |
Said when the last round of an X01 leg with a round limit ends without a checkout and the lowest score wins a leg that does not decide the match, with rounds and the remaining score of the winner: "Round limit, and the leg, Sam!". |
| Match won on the round limit | {{ call }} |
Said when the round limit decides the match: "Round limit, and the match, Sam!". |
| Bull-off throw | empty | Said when the next player throws for the bull; {{ call }} says "Sam, throw for the bull". The first player of the bull-off is not called. Empty uses the Next player message. |
| Bull-off won | empty | Said when the bull-off decides who starts, in one call with the first call of the match; {{ bull_off_call }} says "Sam to throw first. Game on!". Empty stays silent. |
| Word for a player without a name | Player |
Makes "Player 2" in who of your own messages, in a match without names. |
| Word for the bot | Bot |
The name of the practice game's bot in who of your own messages, as the scoreboard shows it, for example "Bot, you require 40". |
call and bull_off_call are the words of the integration: the examples above in English, and in the language of Home Assistant in any other.
The first visit of a game is not called, because a game starts without a change of turn. With a bull-off, the call of the winner starts the game instead.
Weekly report¶
| Setting | Default | What it does |
|---|---|---|
| Board events | The Events entity of your board. | |
| Minimum darts | 1 | Skips the report of a week with fewer darts, for example a week on holiday. With 0, every week is reported. |
| Title | {{ week_title }} |
The title of the notification, available as title: "Your darts week" in the language of Home Assistant. |
| Message | {{ summary }} |
The text of the notification, available as message: the week in a few sentences, in the language of Home Assistant. |
| Notification actions | a notification in Home Assistant | How the report is sent, for example to your phone, see below. |
The message can use darts, visits, sessions, training_minutes, average, average_change, highest_visit, scores_180, checkout_rate, legs, matches, streak, daily_goals, personal_bests (how many were set), week_start, week_end and summary, a ready-made summary in the language of Home Assistant. The board ends the week at its Weekly report day and Weekly report time, by default on Monday at midnight.
Highlight photo¶
| Setting | Default | What it does |
|---|---|---|
| Board events | The Events entity of your board. | |
| Camera | The board camera that takes the photo. Enable the camera entity first; camera entities are disabled by default. | |
| Visits from | 180 | A visit with at least this score gets a photo when its third dart lands. |
| Checkouts | on | Also a photo when a practice leg is won with a checkout. When the same dart finishes a visit and a leg, you get one photo, with the checkout message. |
| Save to the gallery | on | Saves every photo with homedarts.save_highlight, by default to the highlight gallery of the media browser. |
| Folder | empty | Empty for the highlight gallery: homedarts/highlights in the media folder, /media/homedarts/highlights on Home Assistant OS and in a container, /config/media/homedarts/highlights in other installations. Another folder must be one Home Assistant may write to, such as /media/darts on Home Assistant OS or a folder of allowlist_external_dirs; outside the media folder, a photo has no photo_url. |
| Actions | none | For example a notification, see below. Optional while the photos go to the gallery. |
| Message for a visit | {{ score }}! |
The message of a visit photo. |
| Message for a checkout | Checkout {{ checkout }}{{ ' by ' ~ who if who }}! |
The message of a checkout photo. |
| Clip camera | empty | Optional, in the collapsed section Clip: a camera with a video stream that films the board, such as a camera of the room or the one of your stream. It records each moment as a clip beside the photo, so it needs Save to the gallery. The board cameras of Autodarts give pictures, not a video stream; the list offers only cameras with one. |
| Seconds before | 5 | How much of the clip comes before the moment of the photo. It needs the stream of the camera to run ahead: turn on Preload camera stream in the settings of the camera entity. |
| Seconds after | 8 | How much of the clip follows the moment of the photo. |
Your actions can use:
photo_url: the address of the saved photo, for a notification of the Home Assistant app, for example/media/local/homedarts/highlights/2026-09-26_21-05-33_Alex_180.jpg.photo: the file the picture is saved to.image: the live picture of the camera, for photos that are not saved.message,score,checkoutandwho(the player at the board, when the practice game names them).clipandclip_url: the file and the address of the clip being recorded, empty without a clip camera or a saved photo. The recording runs in the background, so the actions get both at once and don't wait for it; the file is written when the recording ends, Seconds after later. A notification that links the clip waits that long first, for example with adelay.
photo and photo_url are empty when no photo was saved: Save to the gallery is off, the camera entity is disabled or unavailable, the camera gives no picture, or Home Assistant may not write to the folder. The log of Home Assistant then says which of them it was. photo_url is also empty for a folder outside the media folder, which the app cannot load from. So photo_url or image is always a picture: the saved photo, or the live picture of the camera.
The blueprint needs version 1.12.4 or later of the integration, which brings homedarts.save_highlight. Earlier versions of the blueprint saved with camera.snapshot, which also announced a photo that was never written; updating the integration brings the new blueprint, and your automation keeps its settings. A Clip camera needs a version of the integration later than 1.16.0, whose homedarts.save_highlight records the clip.
Light show¶
| Setting | Default | What it does |
|---|---|---|
| Board events | The Events entity of your board. | |
| Actions for a 180 | none | Run the moment the third dart of a 180 lands. |
| High finish from | 100 | A practice leg won with a checkout of at least this score is a high finish. |
| Actions for a high finish | none | Run for a high finish, instead of the actions for a won leg. |
| Actions for a bust | none | Run when a dart of the practice game busts the visit. |
| Actions for a won leg | none | Run when a dart wins a practice leg. The leg that decides a match plays the actions for the match instead. |
| Actions for a won match | none | Run when a dart decides a practice match. |
| Actions for a personal best | none | Run when a value beats your personal best. |
| Actions for the daily goal | none | Run when today's darts reach the daily goal. |
| Actions for a won bull-off | none | Run when the bull-off decides who starts. |
| Actions for an achievement | none | Run when a named player unlocks a new tier of an achievement. |
| Actions for a won tournament | none | Run when the last match of a tournament counts, after the actions for the won match; who is the winner of the tournament. |
| React to the takeout | off | Runs the two actions below while you pull the darts. Leave it off without them, so that takeouts never wait behind an effect. |
| When the takeout starts | none | Run when a hand reaches the board. Not restored. |
| When the board is clear | none | Run when all darts are out of the board. Not restored. |
| Also for the bot | off | Also plays the moments of the practice game's bot: its 180, bust, won leg or match and won bull-off. A leg or match the bot wins in a team match plays anyway, because its partner at the board wins it, too. |
| Word for the bot | Bot |
The bot's name in who. |
| Word for a player without a name | Player |
Makes "Player 2" in who. |
| Moments with an effect | none | The moments whose actions start an effect. Only for them are the lights restored and the detection paused. |
| Restore these lights | none | Their state is saved before an effect and restored after it. |
| Effect duration | 10 seconds | How long an effect plays before the lights are restored and the detection starts again. A training session that ends meanwhile ends the effect at once and leaves the detection off. |
| Pause the detection during effects | off | Turns the detection off while an effect plays and on again afterwards, if it was on. The daily goal never pauses it, because it is reached in the middle of a visit, and neither does a new best session average, which comes when a training session ends. |
| Detection switch | none | The Detection switch of your board, for pausing it. |
| Also react to online matches | off | Also plays the actions for a bust, a won leg and a won match of an online match. A 180 and the takeout of your own darts come from your board anyway. |
The actions can use moment (maximum, high_finish, bust, leg, match, personal_best, daily_goal, bull_off, achievement, tournament, takeout or board_clear), who (the player's name, the word for the bot, or "Player 2"), player, score (of a 180), checkout (of a won leg) and trigger.to_state.attributes for every detail of the board event. See light show with WLED and other lights.
Score display¶
| Setting | Default | What it does |
|---|---|---|
| Board events | The Events entity of your board. | |
| Practice remaining score | The Practice remaining score entity of your board, which follows every dart of the practice game. | |
| Display | AWTRIX 3, over MQTT | The display and how Home Assistant reaches it: an AWTRIX 3 over MQTT, a PixelIt over MQTT, or a PixelIt over HTTP with a REST command; see score display on an AWTRIX or a PixelIt. |
| MQTT prefix | empty | For MQTT: the prefix of the display's topics, as its MQTT settings show it, for example awtrix_1a2b3c. Empty uses awtrix or pixelit. |
| PixelIt REST command | rest_command.pixelit_screen |
For PixelIt over HTTP: the REST command that sends screen to the display. |
| AWTRIX icon | empty | An icon of the AWTRIX 3 next to the text, by its file name on the display or its LaMetric number. |
| Flash duration | 5 seconds | How long a 180, a bust, a won leg or the winner stays before the score comes back. |
| Back to the clock after | 5 minutes | How long the display keeps the score, or the result of a finished game, without a dart. |
| Score | {{ remaining if remaining != '' else points }}{{ ' ' ~ checkout if checkout }} |
What the display shows for the player at the board: in X01 the remaining score and the route of a checkout, for example 81 T15 D18, in Cricket and the party games the points. Empty leaves the display alone during the game; after a moment, the clock comes back at once. |
| Color of the score, Color when a checkout is possible | white, green | The color of the score, and its color while the visit can finish the leg. |
| Minimum score of a visit | 180 | The lowest visit score that flashes. |
| Visit | {{ score }}! |
Flashes for such a visit, the moment its third dart lands. |
| Bust | BUST |
Flashes when a dart busts the visit. |
| Leg won | GAME SHOT |
Flashes when a dart wins a leg that does not decide the match. |
| Match won | {{ team or who }} WINS |
Flashes when a dart decides the match; in a team match with the team's name. |
| Color of a visit, Color of a bust, Color of a won leg, Color of the winner | gold, red, green, gold | The colors of the moments. |
| Word for a player without a name | Player |
Makes "Player 2" in who. |
| Word for the bot | Bot |
The bot's name in who. |
An empty message stays silent. The score can use remaining, checkout (the route), leave and setup (where to aim without a checkout), points, target, who, player, players and game; the moments who, team, score, remaining, checkout (the score checked out), darts and average.
Start a game by voice¶
| Setting | Default | What it does |
|---|---|---|
| Sentences | In five languages | What you say to Assist. {game} is the game and {players} the players; parts in [brackets] are optional, (a|b) means a or b. |
| Bot level | 60 | The 3-dart average the bot plays when a sentence ends in "bot". |
| Board | The board to play on. Needed only with more than one board. |
Say for example:
- "Start 501 for Alex and Sam", "Play 301 with Alex, Sam and Kim" or "Start five hundred one"
- "Start the game Cricket for Alex and Sam", "Play a game of Around the Clock"
- "Start 501 for Alex against the bot", "Play 501 for Alex and the bot", "Play the game Cricket against the bot"
- in German "Starte 501 für Alex und Sam", "Starte das Spiel Doppeltraining" or "Spiele 501 gegen den Bot"
- in Spanish "Juega 501 para Alex y Sam", "Juega una partida de Around the Clock" or "Juega 501 contra el bot"
- in French "Lance 501 pour Alex et Sam", "Lance la partie Cricket pour Alex" or "Joue 501 contre le bot"
- in Dutch "Speel 501 voor Alex en Sam", "Start het spel Dubbeltraining" or "Speel 501 tegen de bot"
Assist answers "Game on: 501 with Alex and Sam." in the language of Home Assistant, or says what was wrong, such as a game it does not know, Killer with one player, more players than the game takes or a name longer than 20 characters.
- The game: X01 is a number from 101 to 1001, as digits or as words in the language of Home Assistant (see numbers). Every other game follows the word "game", "Spiel", "partida", "partie" or "spel" and is named as the game list shows it, in any language of the integration: "Around the Clock", "Bob's 27", "Doubles training", "Doppeltraining". The beginning of a name is enough where it fits one game alone, such as "Cut Throat".
- The players: one word each, joined by "and", "und", "y", "et", "en" or a comma. A player who already has a profile keeps its spelling, even when the voice assistant writes the name in lower case. Without players, the players stay as they are.
- The bot: a sentence that ends in "bot" plays against the bot, which takes a seat after the players; any other sentence starts the game without the bot. The bot is never a player, also not in "Play 501 for Alex and the bot", "Spiele 501 für Alex und den Bot", "Juega 501 para Alex y el bot", "Joue 501 pour Alex et le bot" or "Speel 501 voor Alex en de bot".
- Why a number or the word "game": Assist hears the sentences of an automation before its own commands. A sentence such as "Start {game} for {players}" would also catch "Start a timer for 5 minutes", and the timer would never run. With a number or the word for a game, your other commands stay as they are, in every language.
- New sentences: an automation keeps the sentences you saved in it. After the update of the integration and the restart, the new version of the blueprint is there; for its sentences, leave Sentences at its default. Sentences of your own stay as they are.
Enter darts by voice¶
| Setting | Default | What it does |
|---|---|---|
| Score of a visit | In five languages | Sentences with the score of a visit, {score} from 0 to 180, and optionally the player, {player}; parts in [brackets] are optional, (a|b) means a or b. |
| Checkout | In five languages | Sentences for a visit that checks out what the player has left, optionally with its darts, {darts}, and the player. |
| Single dart | In five languages | Sentences for one dart, with the number of its bed, {number}, or a bull or a miss. |
| Next player | In five languages | Sentences that end the visit, so the next player throws. |
| Undo | In five languages | Sentences that take the last visit back, to enter it anew. |
| Board | The board to enter the darts on. Needed only with more than one board. |
Say for example:
- "Alex has 140", "Sam scored 100", "140 points" or just "one hundred forty", for the score of a visit
- "Checkout with two darts", "Game shot in three darts" or "Alex checks out"
- "Triple 20", "Double 16", "Single 5", "Bull", "Single bull" or "Miss"
- "Next player" and "Undo"
- with Home Assistant in German "Alex hat 140", "Aufnahme 100", "Checkout mit zwei Darts", "Doppel 16", "Fehlwurf", "Nächster Spieler" or "Rückgängig"
- with Home Assistant in Spanish "Alex hace 140", "Tirada 100", "Cierre con dos dardos", "Doble 16", "Fallo", "Siguiente jugador" or "Deshacer"
- with Home Assistant in French "Alex a fait 140", "Volée 100", "Checkout en deux fléchettes", "Double 16", "Raté", "Joueur suivant" or "Annule la dernière volée"
- with Home Assistant in Dutch "Alex heeft 140", "Beurt 100", "Uitgooi met twee darts", "Dubbel 16", "Mis", "Volgende speler" or "Ongedaan maken"
Assist answers in the words of the scoreboard's caller, in the language of Home Assistant: "140 for Alex, 361 left. Sam, you require 501." after a visit, "Triple 20, 441 left." after a dart, "No score: Alex stays at 40." after a bust, "Game shot, and the match, Alex!" after the last visit, "Taken back: 140 of Alex." after an undo, or why it was refused.
- Manual entry: the darts need Practice manual entry, which a dartboard without Autodarts has on always. On a board with Autodarts, switch it on for a player without cameras or for darts the board missed.
- The player: a sentence with a name enters the visit only while that player is at the board. "Sam scored 100" while Alex throws is refused with "It is Alex's turn, not Sam's.", so a misheard visit never counts for the wrong player. Without a name, the visit is for the player at the board.
- The checkout scores what the player has left, with three darts unless the sentence says fewer, one of them at a double. What cannot be checked out, such as 169, is explained.
- A dart: the darts of a visit end with "Next player", as on the keypad. A dart that checks out says "Game shot!", and the next player then calls the leg or the match.
- A number alone is the score of a visit, not a dart: "twenty" enters a visit of 20; say "Single 20" for a dart.
- Other commands: each sentence is a number or has words of darts, so Assist's own commands, such as "What time is it", stay its own.
- Languages: the sentences are in English, German, Spanish, French and Dutch, and Assist answers in the language of Home Assistant. In another language, replace them with your own and keep the words of the beds: triple, double, doble or dubbel, single bull, bull, and miss, raté, fallo or mis.
- New sentences: an automation keeps the sentences you saved in it. After the update of the integration and the restart, the new version of the blueprint is there; for its sentences, leave them at their default.
Numbers by voice¶
Both voice blueprints understand numbers as digits in every language. Numbers in words follow the language of Home Assistant and are written out in full, as Assist knows them:
| Home Assistant in | Say | Not |
|---|---|---|
| English | "one hundred forty", "five hundred one", "two darts" | "one hundred and forty" |
| German | "einhundertvierzig", "fünfhunderteins", "zwei Darts" | "hundertvierzig" |
| Spanish | "ciento cuarenta", "quinientos uno", "dos dardos" | "ciento y cuarenta" |
| French | "cent quarante", "cinq cent un", "deux fléchettes" | "cinq cent et un" |
| Dutch | "honderdveertig", "vijfhonderdeen", "twee darts" | "honderd veertig" |
So "Checkout mit zwei Darts" needs Home Assistant in German and "Checkout with two darts" Home Assistant in English, while "Checkout mit 2 Darts" and "Checkout with 2 darts" work in both.
How Assist answers a sentence of the voice blueprints:
Ask Assist about your darts¶
| Setting | Default | What it does |
|---|---|---|
| Average today | In five languages | Questions for the 3-dart average of today's training sessions; parts in [brackets] are optional, (a|b) means a or b. |
| Average this week | In five languages | Questions for the 3-dart average of the week of the weekly report. |
| 180s this week | In five languages | Questions for the 180s of the week of the weekly report. |
| Darts today | In five languages | Questions for the darts of the day, towards the daily goal. |
| Best checkout | In five languages | Questions for the highest checkout among the personal bests of the board. |
| Training streak | In five languages | Questions for the days in a row with darts, and the longest streak. |
| Leaderboard | In five languages | Questions for the player at the top of the leaderboard. |
| Best aim | In five languages | Questions for the best aim of a player, {player}: "I", "ich", "yo", "je" or "ik" is you, as are sentences without a player. |
| Board | The board whose statistics answer. Without one, the board with the most darts this week answers. |
Ask for example:
- "What is my average today?", "How am I scoring today?" or "What's my average this week?"
- "How many 180s this week?", "How many darts have I thrown today?" or "What is my best checkout?"
- "How long is my streak?", "Who leads the leaderboard?", "Where should Sam aim?" or "Where should I aim?"
- in German "Wie ist mein Schnitt heute?", "Wie viele 180er habe ich diese Woche geworfen?", "Wer führt die Bestenliste an?" or "Wohin soll ich zielen?"
- in Spanish "¿Cuál es mi media de hoy?", "¿Cuántos 180 llevo esta semana?", "¿Quién lidera la clasificación?" or "¿Dónde debo apuntar?"
- in French "Quelle est ma moyenne aujourd'hui ?", "Combien de 180 ai-je faits cette semaine ?", "Qui est en tête du classement ?" or "Où dois-je viser ?"
- in Dutch "Wat is mijn gemiddelde vandaag?", "Hoeveel 180's heb ik deze week gegooid?", "Wie staat bovenaan de ranglijst?" or "Waar moet ik op mikken?"
Assist answers from the statistics of the board, in the language you asked in: "Today: a 3-dart average of 120.2 from 18 darts.", "180s this week: 2.", "18 darts today. 2 more for your daily goal of 20.", "Your best checkout is 141.", "One day in a row. Your record: 1.", "Alex leads the leaderboard with a 3-dart average of 167." or "Sam, aim at Bull: 11.8 points per dart.". Before the first dart, it says what is missing, such as "No darts today yet.".
- Today counts every training session that started today, also one that has ended. A session that began before midnight and runs on has no day of its own, so Assist answers with "This session: …" instead. For a day of its own, end each session with Session idle timeout or start a new one every morning with New training session.
- This week is the week of the weekly report, which ends on Monday at midnight unless you set another time; the average of a new week is compared with the week before, such as "This week: a 3-dart average of 90, 30.1 less than last week.".
- The best checkout is the highest checkout among the personal bests of the board, and the streak counts the days in a row with at least one dart, as the Training streak sensor does.
- The leaderboard ranks the players by their 3-dart average, then by their won legs, as the leaderboard of the scoreboard does.
- The best aim is where a player scores the most points per dart with the spread of their darts (where to aim). It needs darts that the board detected, so a dartboard without Autodarts has none. "I" is the player linked to the person you are signed in as (players and persons); a voice satellite has no person, so it gets the player who played last.
- Languages: the questions are in English, German, Spanish, French and Dutch, and Assist answers in the language of the question, that of your voice assistant, also for a regional language such as Spanish for Latin America. In another language, write questions of your own; Assist answers them in English.
- Other commands: each question has a word of darts, such as average, 180, checkout or leaderboard, so Assist's own commands, such as "What time is it", stay its own. A question only reads the statistics and changes nothing.
- New sentences: an automation keeps the sentences you saved in it. After the update of the integration and the restart, the new version of the blueprint is there; for its sentences, leave them at their default.
Dart caller messages¶
The messages of the dart caller are templates. For example:
| Setting | Example |
|---|---|
| Visit message | {{ score }}, or {{ score }} points |
| Message for 180 | {{ call }} says "One hundred and eighty!", or your own words, such as Maximum! |
| Dart message | {{ dart_name }} says "Treble 20", "5", "Bull" or "Miss"; {{ dart_score }} says the points |
For German words of your own, see the German guide.
Practice caller messages¶
The practice caller's messages are templates with these variables:
| Variable | Content |
|---|---|
call |
What the caller says, in the language of Home Assistant, as the defaults say it: "Sam, you require 81", "No score" or "Game shot, and the leg, Sam!" |
bull_off_call |
What the caller says when the bull-off is won, in Bull-off won: "Sam to throw first. Game on!" |
who |
The player's name, "Bot" for the bot (see Word for the bot), "Player 2" in a match without names, empty when you play alone |
team |
The team of the player in a team match, for example Alex & Kim when both partners have a name; empty otherwise |
remaining |
The score left |
checkout |
The route when a checkout is possible, for example T20 T20 BULL; in Leg won, the score checked out, for example 121 |
darts, average |
Darts and 3-dart average of the leg, in Leg won |
rounds |
The rounds of a leg the round limit decided, in Leg won on the round limit and Match won on the round limit, with the winner's score left in remaining; 0 for a checkout |
points |
Points in the Cricket and party games; strokes in Golf, runs in Baseball. Killer keeps no points: its events carry the player's lives and whether they are a killer, for example trigger.to_state.attributes.lives |
target |
The next target of a party game, for example 20, D or D16; the hole in Golf and the inning in Baseball |
leave, setup |
Where no checkout is possible: the score a setup leaves, for example 32, and its darts, for example T20 T20 S17; empty otherwise |
hit |
The bed of the winning bull-off dart in Bull-off won: BULL, 25 or for example S20 |
distance |
How far the winning bull-off dart landed from the center, in millimeters, in Bull-off won; empty when the board reported no position for it, never None |
For example, in words of your own:
| Setting | Example |
|---|---|
| Checkout possible | {{ who ~ ', you' if who else 'You' }} require {{ remaining }} |
| No checkout, a setup | {{ who ~ ', leave' if who else 'Leave' }} yourself {{ leave }} |
| Next player | {{ who }}, or {{ who }}, {{ target }} in party games |
| Bust | No score |
| Leg won | Game shot, and the leg{{ ', ' ~ (team or who) if team or who }}! {{ checkout }} checkout in {{ darts }} darts. |
| Match won | Game shot, and the match, {{ team or who }}! |
| Leg won on the round limit | After {{ rounds }} rounds, the leg goes to {{ team or who }} on {{ remaining }}! |
| Bull-off throw | {{ who }}, throw for the bull |
| Bull-off won | {{ who }} to throw first. Game on!, or {{ who }} wins the bull{{ ' by ' ~ distance ~ ' millimeters' if distance is number }} |
| Word for a player without a name | Player |
Calls in the language of Home Assistant¶
Home Assistant translates no blueprint, so the integration gives each event that a caller speaks the words for it, in the language of Home Assistant, and the callers say them by default: call on the events of the dart caller and the practice caller, title and summary on the weekly report. They follow a new language of Home Assistant at once, in English, German, Dutch, French and Spanish; a regional variant such as de-CH speaks its language, and another language English. The words are those of the scoreboard's caller and of the voice packs that homedarts.generate_voice_pack records.
| Event | call in English |
call in German |
|---|---|---|
turn_changed |
"Sam, you require 81", "Sam, leave yourself 32", "Sam to throw.", "Sam, throw for the bull" | "Sam, du brauchst 81", "Sam, stell dir die 32", "Sam ist dran.", "Sam, dein Wurf aufs Bull" |
bust |
"No score" | "Überworfen" |
leg_won, match_won |
"Game shot, and the leg, Sam!", "Round limit, and the match, Sam!" | "Game shot, und das Leg, Sam!", "Rundenlimit, und das Match, Sam!" |
bull_off_won |
"Sam to throw first. Game on!" | "Sam beginnt. Game on!" |
visit_thrown, visit_completed |
"One hundred and eighty!", "No score" for 0, otherwise the score | "Einhundertachtzig!", "Keine Punkte" |
dart_detected |
"Treble 20", "Double 16", "5", "25", "Bull", "Miss" | "Triple 20", "Doppel 16", "5", "25", "Bull", "Fehlwurf" |
The default calls name the bot and a player without a name in the integration's words too, such as "Bot" and "Spieler 2" in German; Word for the bot and Word for a player without a name apply to your own messages. Pick a Voice that speaks the language of Home Assistant, or leave Language empty: an English voice reads German or French words badly. To keep the English calls in a Home Assistant of another language, enter the English examples of the practice caller messages as your messages.
A message of your own keeps its words in every language. An automation set up before calls in your language once the update of the integration brings the new blueprint, unless it saved a message, such as the English default of before: replace that with {{ call }}, or the title of the weekly report with {{ week_title }}. With an older version of the integration, the events have no words, and the blueprints say them in English.
Voice packs of the callers¶
With Voice pack, the dart caller and the practice caller play recorded sounds on the speakers instead of the engine's voice: a pack of darts-caller, or one that homedarts.generate_voice_pack recorded, in a folder of homedarts/voices in the media folder, as for the scoreboard. The blueprints ask homedarts.voice_sound for the sound of each call and play it with media_player.play_media; a call the pack has no sound for is spoken by the engine, with your message.
| Blueprint | Calls with a sound of the pack |
|---|---|
| Dart caller | The points of a visit, 0 to 180; every dart: t20, d16, s5 or 5, bull for 25, bullseye, and outside for a miss |
| Practice caller | busted, gameshot and matchshot, also in a match; what you require when you play alone, yr_40. A call that names the player at the board, and a leg or match the round limit decides, stay the engine's |
On a media player, a new sound replaces the one that plays, so each call of the blueprints is one sound; the scoreboard also plays calls of several sounds, such as a name, you_require and 40, one after the other. An empty message stays silent, also with a voice pack. Voice packs need version 1.15.0 or later of the integration.
Highlight photo on your phone¶
In Actions of the highlight photo, add a notification of the Home Assistant app and give it the picture:
action: notify.mobile_app_your_phone
data:
message: "{{ message }}"
data:
image: "{{ photo_url or image }}"
The app loads the saved photo, taken while the darts were still in the board, even when the notification reaches a sleeping phone minutes later. Without a saved photo it falls back to image, the live picture of the camera, which the app loads only when the notification arrives, possibly after the darts are pulled. Enable the camera entity on the device page first; camera entities are disabled by default.
Highlight gallery¶
The highlight photo saves every picture as a file named by the moment, the player and the score, for example 2026-09-26_21-05-33_Alex_180.jpg or 2026-09-26_21-07-10_Alex_checkout-121.jpg; a second photo of the same second with the same name, from a second camera for example, gets a space and (2) at the end and is kept as well. Open Media → HomeDarts in the sidebar: the gallery lists the months, newest first, and every photo with a title such as 180 · Alex · Sep 26, with the clips of the highlight photo beside their photos.
- The gallery shows the folder
homedarts/highlightsof the media folder of Home Assistant, which is/media/homedarts/highlightson Home Assistant OS and in a container. How the gallery works. - Photos you copy there yourself show, too; without a name of this kind, by their file name and the time they were saved.
- To delete a photo, open Media → My media → homedarts → highlights.
- The gallery needs the media browser, which the default configuration of Home Assistant includes.
Highlight clips¶
With a Clip camera, the highlight photo also records each moment as a clip: from Seconds before the photo to Seconds after it, saved as an MP4 beside the photo, under its name with .mp4, such as 2026-09-26_21-05-33_Alex_180.mp4. The highlight gallery lists it as Clip · 180 · Alex · Sep 26 with the picture of its photo and plays it in the browser.
- The camera: any camera with a video stream in Home Assistant, such as an RTSP camera through the Generic Camera or ONVIF integration, or the camera of your stream. The board cameras of Autodarts give pictures only, which can't be recorded.
- The seconds before the dart: Home Assistant keeps them only while the stream of the camera runs. Open the camera entity, its settings (⚙), and turn on Preload camera stream; without it, the clip starts at the photo.
- One clip at a time: a camera records one clip at a time. A moment that comes while the clip of the one before is still recording gets its photo without a clip, and the log says why; the clip before it records to the end.
homedarts.save_highlightrecords the clip in the background with Home Assistant'scamera.record, which writes only to folders Home Assistant may write to, such as the media folder of the gallery. An older version of the integration keeps the clips in the folder, but its gallery lists only the photos.- With the stream overlay of the scoreboard, the camera of your stream shows the score as well.
Light show with WLED and other lights¶
Give every moment you like its own actions; moments without actions stay dark. A WLED preset that you saved in WLED as "180", for a 180:
action: select.select_option
target:
entity_id: select.wled_preset
data:
option: "180"
A WLED effect at full brightness, for example for a won match:
action: light.turn_on
target:
entity_id: light.wled
data:
effect: Fireworks
brightness_pct: 100
Plain room lights in the color of the player who won the leg, from player 1 to 4; for a bust, rgb_color: [255, 0, 0] turns them red:
action: light.turn_on
target:
entity_id: light.dartroom
data:
rgb_color: "{{ [[255, 0, 0], [0, 90, 255], [0, 200, 80], [255, 200, 0]][player - 1] }}"
brightness_pct: 100
- Back to normal: choose the moments with actions under Moments with an effect, and add your lights to Restore these lights, for WLED the WLED light rather than the preset select. Before an effect, the blueprint saves their state in a scene, and after Effect duration it restores color, brightness and effect. Leave the lights empty if your actions end the effect themselves. Moments you don't choose run their actions and nothing else, so a moment without actions never pauses the board.
- Pause the detection: flashing light next to the board can make the cameras see darts that are not there. Turn on Pause the detection during effects and choose the Detection switch: the detection stops for the effects of the chosen moments and starts again afterwards, but only if it was running. When the detection stops, the visit on the board counts as finished, as after a takeout: the practice game books it and the next player is up.
- One after the other: a moment that happens while an effect plays waits for it, and each effect restores the lights it found. Up to nine moments wait, enough for the match that wins a tournament with its personal bests and achievements. The automation runs in queued mode, because a restarted effect would never restore the lights and parallel effects would mix on the same lights.
- The daily goal is reached with a dart in the middle of a visit, so its effect never pauses the detection: the rest of the visit still counts.
- The end of a training session stops the board: the training session routine turns the detection off. A session that ends while an effect plays ends the effect at once, so the lights come back before the routine's actions for the end of the session, and the detection stays off. A new session keeps the board running: the effect plays to its end, and the detection starts again. A new best session average comes when a session ends; its effect plays, but never pauses the detection, because the pause would start it again afterwards.
- Takeout and board clear set a look of their own, for example a bright board light while you pull the darts and your normal light afterwards. Turn on React to the takeout for them. They are not restored and don't pause the detection; while the setting is off, takeouts never wait in the queue.
- The bot: its darts are not in the board, so its moments stay dark unless you turn on Also for the bot. A leg or match it wins in a team match plays anyway.
Score display on an AWTRIX or a PixelIt¶
A pixel display at the board shows the score from across the room, as on a dart machine: the score of the player at the board after every dart, in green with its route when a checkout is possible, a 180 or a bust for a few seconds, and the winner of the match until the idle time is over or you start the next game.
- AWTRIX 3, for example on an Ulanzi TC001: connect it to your MQTT broker in its web interface under MQTT, add the MQTT integration to Home Assistant with the same broker, and enter the Prefix of the display as MQTT prefix. The game shows as a notification that stays until the next one replaces it, in front of the apps of the display; its middle button dismisses it. At the end of the game the blueprint dismisses it, and the apps come back.
- PixelIt over MQTT: turn on MQTT in the settings of the PixelIt with the broker of Home Assistant's MQTT integration, and enter its MQTT master topic, by default
pixelit, as MQTT prefix. - PixelIt over HTTP, without MQTT: add a REST command for the display to
configuration.yaml, with the address of your PixelIt, and restart Home Assistant. The blueprint hands it the screen inscreen, and the command sends it to the display:
rest_command:
pixelit_screen:
url: "http://192.0.2.20/api/screen"
method: post
content_type: "application/json"
payload: "{{ screen | to_json }}"
A PixelIt shows each screen until the next one, so at the end of the game the blueprint brings back its clock.
How it follows the game:
- Every dart changes the Practice remaining score, and the display with it: also a correction, an undone visit and the next player when you pull the darts. The bot's darts count, too, as on the scoreboard.
- A moment flashes for the Flash duration, and then the score comes back. The next dart, or the next player after the takeout, ends a flash early, so the display always shows the game as it is. Outside the practice game, for example in free play, a 180 flashes as well, and the clock comes back after it.
- The end: a finished match keeps its winner on the display. When you switch the practice game off, the clock comes back at once; otherwise after Back to the clock after without a dart. A restart of Home Assistant, or saving this automation before the wait is over, shows the game again and starts the wait anew; saving another automation changes nothing. Without a game, the display belongs to its own apps and notifications: the blueprint sends nothing but the moments (and the clock after them).
Your own Score is a template. With the name of the player in a match before the score, for example Sam 81 T15 D18:
{{ who ~ ' ' if players > 1 }}{{ remaining if remaining != '' else points }}{{ ' ' ~ checkout if checkout }}
With the target of a party game next to the points, for example 12 D16:
{{ remaining if remaining != '' else (points ~ ' ' ~ target) }}{{ ' ' ~ checkout if checkout }}
Weekly report on your phone¶
Replace the Notification actions of the weekly report with a notification of the Home Assistant app:
action: notify.mobile_app_your_phone
data:
title: "{{ title }}"
message: "{{ message }}"
The ready-made summary reads, for example: 312 darts in 95 minutes at the board, 3 sessions. 3-dart average 54.2 (+2.1 on the week before). Best visit 140, 1 × 180. Checkout rate 31.2 %. 4 days in a row. 2 new personal bests. Parts without a value, such as a week without 180s, are left out.
The title and the summary are in the language of Home Assistant, for example Deine Dartwoche and 312 Darts in 95 Minuten am Board, 3 Sessions. 3-Dart-Average 54,2 (+2,1 zur Vorwoche). in German. For words of your own, write your own Title and Message. A shorter German report, in the YAML mode of the automation:
use_blueprint:
path: Dennis-Otto/weekly_report.yaml
input:
board_events: event.autodarts_board_events
report_title: Deine Dartwoche
report_message: >-
{{ darts }} Darts{{ ' in ' ~ training_minutes ~ ' Minuten' if training_minutes else '' }}{{ ', 3-Dart-Average ' ~ (average | replace('.', ',')) ~ (' (' ~ ('+' if average_change > 0 else '') ~ (average_change | replace('.', ',')) ~ ')' if average_change is not none else '') if average is not none else '' }}{{ ', ' ~ scores_180 ~ ' × 180' if scores_180 else '' }}{{ ', ' ~ streak ~ (' Tag' if streak == 1 else ' Tage') ~ ' in Folge' if streak else '' }}.
Board events¶
All realtime moments arrive through the Events entity of the board. Each event carries an event_type and its details; see the event reference. The examples use event.autodarts_board_events, the entity ID of a board named Autodarts Board in a Home Assistant set to English. Home Assistant forms entity IDs from the names in its language, so in German, Dutch, French or Spanish the IDs read differently, for example event.autodarts_board_ereignisse in German. A board set up with an earlier version keeps the ID it got then, such as event.autodarts_board_board_events.
Open the entity on the device page to watch the events arrive while you throw; its activity lists every event with the time it happened.
In the automation editor, choose the trigger Event received (Entity → Event), select the Events entity of your board and the event types you want. In YAML:
triggers:
- trigger: event.received
target:
entity_id: event.autodarts_board_events
options:
event_type:
- visit_thrown
A visit of three darts arrives as visit_thrown the moment its third dart lands, and as visit_completed when the darts are pulled. For celebrations and calls, use visit_thrown, and add visit_completed whose thrown attribute is false for visits with fewer darts.
Darts entered or corrected in Home Assistant carry manual: true, and the events of the bot bot: true; see leave the bot out.
Read the details from trigger.to_state.attributes, not from the current state of the entity. Two events can follow each other within milliseconds, for example visit_completed and takeout_finished, and the current state may already show the second one.
Examples¶
The entity IDs in the examples are those of a board named Autodarts Board in a Home Assistant set to English; yours depend on the name of your board and on the language of Home Assistant during setup. You find them on the device page of the board.
Flash the lights for a 180¶
alias: Darts - 180 light show
triggers:
- trigger: event.received
target:
entity_id: event.autodarts_board_events
options:
event_type:
- visit_thrown
conditions:
- condition: template
value_template: "{{ trigger.to_state.attributes.get('score') == 180 }}"
actions:
- action: light.turn_on
target:
entity_id: light.dartroom
data:
effect: colorloop
- delay: 10
- action: light.turn_on
target:
entity_id: light.dartroom
data:
effect: none
brightness_pct: 100
mode: single
Light up the board while you pull the darts¶
alias: Darts - takeout light
triggers:
- trigger: event.received
id: started
target:
entity_id: event.autodarts_board_events
options:
event_type:
- takeout_started
- trigger: event.received
id: finished
target:
entity_id: event.autodarts_board_events
options:
event_type:
- takeout_finished
actions:
- choose:
- conditions:
- condition: trigger
id: started
sequence:
- action: light.turn_on
target:
entity_id: light.board_light
data:
brightness_pct: 100
default:
- action: light.turn_on
target:
entity_id: light.board_light
data:
brightness_pct: 60
mode: queued
Notify a camera problem¶
alias: Darts - camera problem
triggers:
- trigger: state
entity_id: binary_sensor.autodarts_board_camera_problem
to: "on"
for:
minutes: 2
actions:
- action: notify.mobile_app_phone
data:
title: Darts
message: A board camera delivers no images. Check the camera and its cable.
mode: single
Stop the detection at night¶
alias: Darts - stop detection at night
triggers:
- trigger: time
at: "01:00:00"
conditions:
- condition: state
entity_id: switch.autodarts_board_detection
state: "on"
actions:
- action: switch.turn_off
target:
entity_id: switch.autodarts_board_detection
mode: single
Prepare the board when a training session starts¶
Switch on the board light, start the detection and calibrate the cameras when a session starts, and switch everything off when it ends. Turn off Start sessions automatically and start sessions with the Training session switch, for example from the training card. Leave out the calibration when the board's Calibrate on start setting is on, and don't combine this with automations that switch the detection by presence.
alias: Darts - training session routine
triggers:
- trigger: event.received
target:
entity_id: event.autodarts_board_events
options:
event_type:
- session_started
id: started
- trigger: event.received
target:
entity_id: event.autodarts_board_events
options:
event_type:
- session_ended
id: ended
conditions:
# "New training session" ends a session and starts the next one at once.
- condition: template
value_template: "{{ trigger.to_state.attributes.get('reason') != 'new_session' }}"
actions:
- choose:
- conditions:
- condition: trigger
id: started
sequence:
- action: light.turn_on
target:
entity_id: light.dart_board
- action: switch.turn_on
target:
entity_id: switch.autodarts_board_detection
# The dart that started a session is still in the board.
- if:
- condition: template
value_template: "{{ trigger.to_state.attributes.get('reason') != 'first_dart' }}"
then:
# Give the cameras time to open.
- delay: 5
- action: button.press
target:
entity_id: button.autodarts_board_start_automatic_calibration
- conditions:
- condition: trigger
id: ended
sequence:
- action: switch.turn_off
target:
entity_id: switch.autodarts_board_detection
- action: light.turn_off
target:
entity_id: light.dart_board
mode: queued
Start a new training session every Monday¶
alias: Darts - weekly training session
triggers:
- trigger: time
at: "04:00:00"
conditions:
- condition: time
weekday: mon
actions:
- action: button.press
target:
entity_id: button.autodarts_board_new_training_session
mode: single
Call the game shot in a practice game¶
Announce a won leg and a bust of the practice game on your speakers, with the name of the player.
alias: Darts - practice caller
triggers:
- trigger: event.received
target:
entity_id: event.autodarts_board_events
options:
event_type:
- leg_won
- bust
actions:
- action: tts.speak
target:
entity_id: tts.home_assistant_cloud
data:
media_player_entity_id: media_player.darts_room
message: >-
{% set event = trigger.to_state.attributes %}
{# In a team match, the team wins the leg. #}
{% set player = event.team_name or event.name or 'Player ' ~ event.player %}
{% if event.event_type == 'leg_won' %}
Game shot, and the leg, {{ player }}, in {{ event.darts }} darts.
{% else %}
Bust. {{ player }}, you still need {{ event.remaining }}.
{% endif %}
mode: queued
To say it as the practice caller does, in the language of Home Assistant, use the words of the event: message: "{{ trigger.to_state.attributes.call }}".
Send the summary of a match¶
After a practice match of several players, send every player's numbers to your phone. match_won carries the match summary in summary; X01 has averages and checkouts, Cricket mpr and marks.
alias: Darts - match summary
triggers:
- trigger: event.received
target:
entity_id: event.autodarts_board_events
options:
event_type:
- match_won
actions:
- action: notify.mobile_app_phone
data:
title: "{{ trigger.to_state.attributes.name or 'Player ' ~ trigger.to_state.attributes.player }} wins"
message: >-
{%- for player in trigger.to_state.attributes.summary %}
{{ player.name or 'Player ' ~ player.player }}: legs {{ player.legs }}
{%- if player.get('average') is not none %}, average {{ player.average }}{% endif %}
{%- if 'scores_180' in player %}, 180s {{ player.scores_180 }}{% endif %}
{%- if player.get('checkout_rate') is not none %}, checkout {{ player.checkout_rate }} %{% endif %}
{%- if player.get('mpr') is not none %}, MPR {{ player.mpr }}{% endif %}.
{%- endfor %}
mode: queued
Celebrate a personal best and the daily goal¶
alias: Darts - personal best
triggers:
- trigger: event.received
target:
entity_id: event.autodarts_board_events
options:
event_type:
- personal_best
- daily_goal_reached
actions:
- action: notify.mobile_app_phone
data:
message: >-
{% set event = trigger.to_state.attributes %}
{% if event.event_type == 'personal_best' %}
New personal best: {{ event.record | replace('_', ' ') }} {{ event.value }}
(before {{ event.previous }}){{ ' by ' ~ event.name if event.name }}!
{% else %}
Daily goal reached: {{ event.darts }} darts, {{ event.streak }} days in a row.
{% endif %}
mode: queued
Count the training sessions of the month¶
The training calendar answers questions about the past, for example in a script:
sequence:
- action: calendar.get_events
target:
entity_id: calendar.autodarts_board_training_calendar
data:
start_date_time: "{{ now().replace(day=1, hour=0, minute=0, second=0) }}"
end_date_time: "{{ now() }}"
response_variable: calendar
- variables:
sessions: >-
{{ calendar['calendar.autodarts_board_training_calendar'].events
| selectattr('summary', 'match', 'Training') | list | count }}
Celebrate an achievement¶
A notification with the player, the achievement and its tier. The achievement attribute is the key of the achievement, such as maximum or short_leg; the table there names each one.
alias: Darts - achievement
triggers:
- trigger: event.received
target:
entity_id: event.autodarts_board_events
options:
event_type:
- achievement_unlocked
actions:
- action: notify.mobile_app_phone
data:
message: >-
{% set event = trigger.to_state.attributes %}
{% set medal = ['bronze', 'silver', 'gold', 'platinum'][event.tier - 1]
if event.tiers > 1 else 'unlocked' %}
{{ event.name }}: {{ event.achievement | replace('_', ' ') }}, {{ medal }}!
mode: queued
Start a game by voice¶
The blueprint Start a game by voice does this with sentences in English, German, Spanish, French and Dutch. For sentences of your own, let the action answer: it knows the games by their names in every language of the integration, and with response_variable it tells what started, or what was wrong, in words Assist can say. Keep a fixed word such as "game" before {game}, so the sentence never catches another command of Assist.
alias: Darts - start by voice
triggers:
- trigger: conversation
command:
- "let's play [a] game [of] {game} with {names}"
actions:
- action: homedarts.start_game
data:
game: "{{ trigger.slots.game }}"
players: "{{ trigger.slots.names | regex_replace(' and ', ' ') | regex_findall('[^ ]+') }}"
response_variable: result
- set_conversation_response: "{{ result.message }}"
mode: single
Enter a visit by voice¶
The blueprint Enter darts by voice does this with sentences in English, German, Spanish, French and Dutch. For sentences of your own, in another language for example, let the action answer: with response_variable it says what the visit scored and left and who throws next, or why it was refused. With player, a misheard name never gets the visit.
alias: Darts - a visit by voice
triggers:
- trigger: conversation
command:
- "{name} threw {0..180:score}"
actions:
- action: homedarts.enter_visit
data:
score: "{{ trigger.slots.score }}"
player: "{{ trigger.slots.name }}"
response_variable: result
- set_conversation_response: "{{ result.message }}"
mode: queued
Announce the results of a tournament¶
Call every result of a tournament, the next match and the winner on your speakers.
alias: Darts - tournament announcer
triggers:
- trigger: event.received
target:
entity_id: event.autodarts_board_events
options:
event_type:
- tournament_match_finished
- tournament_finished
actions:
- action: tts.speak
target:
entity_id: tts.home_assistant_cloud
data:
media_player_entity_id: media_player.darts_room
message: >-
{% set event = trigger.to_state.attributes %}
{% if event.event_type == 'tournament_finished' %}
{{ event.winner }} wins the tournament, ahead of {{ event.runner_up }}!
{% else %}
{{ event.winner }} beats {{ event.loser }},
{{ event.legs | max }} legs to {{ event.legs | min }}.
{% if event.next %}Next up: {{ event.next | join(' against ') }}.{% endif %}
{% endif %}
mode: queued
Enter a visit by hand¶
For a player without cameras, or a board with the detection switched off: a script enters a whole visit, for example "T20 T20 S20" from a text field on the dashboard or from Assist, and passes the turn. Switch on Practice manual entry first; the darts count like detected darts and are marked manual.
script:
darts_enter_visit:
alias: Darts - enter a visit by hand
fields:
darts:
description: The beds of the visit, for example T20 T20 S20
example: T20 T20 S20
selector:
text: {}
sequence:
- repeat:
for_each: "{{ darts.split() }}"
sequence:
- action: homedarts.throw_dart
data:
segment: "{{ repeat.item }}"
- action: homedarts.next_player
mode: single
A button on the dashboard takes back the last visit, for a wrong reading noticed after the darts were pulled; the scoreboard has one built in:
type: button
name: Undo last visit
icon: mdi:undo
tap_action:
action: perform-action
perform_action: homedarts.undo_visit
confirmation:
text: Take the last visit back?
Leave the bot out¶
The darts of the bot fire the usual events with bot: true, and its seat has no name. The blueprints know it:
- The visit score and the light show leave the bot out; turn on Also for the bot to include it.
- The highlight photo takes no photo of the bot's darts, which are not in the board.
- The callers call the bot "Bot" in the language of Home Assistant, like the scoreboard; your own messages call it by the Word for the bot.
An automation made from a blueprint takes no conditions of its own unless you take control of it, so use these settings there. To celebrate only your own visits in an automation of your own, add a condition:
conditions:
- condition: template
value_template: "{{ not trigger.to_state.attributes.get('bot', false) }}"
Online matches (experimental)¶
In online matches on play.autodarts.io, your own darts arrive as usual. Busts, won legs and matches and the darts of your opponents arrive through the optional online bridge and the browser extension Tools for Autodarts, as board events whose type starts with online_. The online matches guide explains how to set it up.
Adapting automations from older versions¶
Since version 2.0, the integration is HomeDarts for Autodarts, and its actions start with homedarts.: in automations and scripts that call one, replace autodarts. with homedarts., for example homedarts.next_player. The entity IDs and the board events stay as they are, and the automations made from the blueprints go on working. From Autodarts to HomeDarts explains the switch.
Automations that celebrate a 180 or call a visit on visit_completed react only when the darts are pulled. Switch them to visit_thrown to react the moment the third dart lands, as in the examples.
Since version 1.0, the Detection status sensor reports translatable states: stopped, throw, takeout_in_progress and so on. Older versions reported the raw text of the Board Manager, such as Stopped or Takeout in progress. Update automations that compare against the old text:
| Before | Now |
|---|---|
Stopped |
stopped |
Starting, Stopping |
starting, stopping |
Throw |
throw |
Takeout, Takeout in progress |
takeout, takeout_in_progress |
Calibrating |
calibrating |
Error |
error |
The UI shows these states in your language. The Last event sensor still reports the raw Board Manager text. It is a diagnostic sensor now and, like CPU usage, starts disabled on a board set up with version 1.6.0 or later: enable it on the device page before an automation uses it. Boards set up before keep both entities as they are.