Home Assistant integration for Vestaboard messaging displays.
- Control Vestaboard Flagship and Vestaboard Note boards over the Local API
- Create virtual Vestaboards to try out messages without any hardware
- Combine Vestaboard Notes into a Note array that acts as one larger board
To connect a physical Vestaboard, you must first request access to Vestaboard's Local API. This is required to enable local communication with your Vestaboard device. Virtual Vestaboards don't need it.
- Visit https://www.vestaboard.com/local-api.
- Fill out the request form to apply for a Local API enablement token.
- Once approved, you will receive a token that you'll need to configure this integration.
This integration is available in the default HACS repository.
- Use the My Home Assistant badge above, or from within Home Assistant, click on HACS
- Search for
Vestaboardand click on the appropriate repository - Click DOWNLOAD
- Restart Home Assistant
If you prefer manual installation:
- Download or clone this repository
- Copy the
custom_components/vestaboardfolder to your Home Assistantcustom_componentsdirectory - Restart Home Assistant
β οΈ Manual installation will not provide automatic update notifications. HACS installation is recommended unless you have a specific need.
Once installed, you can set up the integration by clicking on the following badge:
Alternatively:
- Go to Settings > Devices & services
- In the bottom-right corner, select Add integration
- Type
Vestaboardand select the Vestaboard integration - Choose what to add:
- Add a Vestaboard β connect a physical Vestaboard using its host and Local API key
- Create a virtual Vestaboard β see Virtual Vestaboards
- Create a Vestaboard Note array β see Vestaboard Note arrays (shown once at least two Notes are set up)
- Follow the instructions to add the integration to your Home Assistant
- Choose how your board's image looks: its color, for a Flagship whether it has a β€οΈ in place of the Β° (newer Flagships do), and whether to show the frame
Physical Vestaboards on your network are also discovered automatically. If a board's IP address changes, use Reconfigure on its entry to update the host.
A virtual Vestaboard behaves like a real one in Home Assistant, with the same entities, image and vestaboard.message action, but has no hardware behind it. Use one to try out messages and automations, or to try out an array before you buy more boards.
When creating one, choose a name and a model: Vestaboard Flagship (6 x 22) or Vestaboard Note (3 x 15). A virtual board's message is saved and restored when Home Assistant restarts.
A Note array combines Vestaboard Notes that are already set up, real or virtual, into one larger board. A message sent to the array is laid out across the whole grid, and each Note is sent its portion. The array writes through each Note's own connection, so it holds no API keys of its own.
To create an array:
- Set up each Vestaboard Note first. At least two Notes, real or virtual, must be set up and loaded before Create a Vestaboard Note array is offered.
- Choose Create a Vestaboard Note array, give it a name and choose an arrangement, such as 2 Notes side by side, or 4 Notes in 2 rows of 2. The arrangements offered depend on how many Notes you have set up.
- Choose the Note for each position, filled left to right, top to bottom. Each step shows the layout so far and what each available Note is currently showing.
Turn on Show each Note's name on it while arranging to help tell your Notes apart. Each Note goes back to what it was showing when you finish or close the setup.
Use Reconfigure on the array to change its name, arrangement or Notes. If a Note in an array is deleted or disabled, Home Assistant raises a repair with options to fix the array: re-enable the Note, reconfigure the array, or delete the array.
After a Vestaboard is set up, open its Configure dialog to change the following. Color, the heart and show frame are chosen during setup and can be changed here later.
- Color (boards only) β the color of your Vestaboard (black or white), used for the generated image. Each Note in an array is drawn in its own color.
- Heart in place of degree sign (Flagships only) β newer Vestaboard Flagships ship with a β€οΈ on the bit that older ones show as Β°. Turn this on if yours does, so the image and message sensor show a heart. Vestaboard Notes always show a heart.
- Show frame β draw the image with the Vestaboard's frame and logo. When off, only the bits are drawn, edge to edge. This is on by default for boards. Arrays are drawn as one continuous, frameless board by default; turning this on draws each Note in its own frame.
- Default transition β the transition strategy, step size and step interval used when a message doesn't set its own. See Transition Strategy.
| Black | White | |
|---|---|---|
| Flagship | ![]() |
![]() |
| Note | ![]() |
![]() |
| Note array | ![]() |
![]() |
The Note array images show 4 Notes in 2 rows of 2.
Each Vestaboard, virtual Vestaboard and Note array has the following entities:
| Entity | Type | Description |
|---|---|---|
| Image | Image | An image of what the board is showing. |
| Message | Sensor | The text the board is showing. Messages over 255 characters are trimmed in the state; the full text is in the full_message attribute. |
| Temporary message | Binary sensor | On while a temporary message (sent with duration) is showing. |
| Temporary message expiration | Sensor | When the current temporary message expires. |
| Clear temporary message | Button | Clears the temporary message and restores the board's persistent message. |
| Quiet hours | Switch | Turns quiet hours on or off. Turning it on with no times set uses 22:00 to 07:00. |
| Quiet hours start | Time | When quiet hours start. |
| Quiet hours end | Time | When quiet hours end. If the start and end times are the same, quiet hours last all day. |
During quiet hours, messages sent with vestaboard.message are skipped, not queued, unless bypass_quiet_hours is set. An array is in quiet hours when its own quiet hours apply or when any of its Notes is in quiet hours.
The integration adds a Vestaboard panel to the Home Assistant sidebar for composing messages visually. It appears while at least one Vestaboard is set up.
- Pick any Vestaboard, virtual Vestaboard or Note array. Each board is drawn like its image in Home Assistant: in its own color, with the β€οΈ or Β° bit and the frame matching your board's settings. Note arrays are drawn as one board, or as framed Notes when Show frame is on.
- Visual mode: click a bit and type, or use the Pen, Fill and Eraser tools with the color palette. In Type mode, picking a color or the heart inserts it at the cursor. Undo and redo with the buttons or Ctrl+Z / Ctrl+Shift+Z.
- Text mode: type a message, pick its justify and align, and see it laid out exactly as the
vestaboard.messageaction would. Click a color or the heart to insert it at the cursor. Switch back to Visual to fine-tune it. - Load current starts from what the board is showing. Your work on each board is kept in your browser until you send it.
- Choose a transition, show the message for a set time, or bypass quiet hours, then Send.
| Field | Name | Required | Description |
|---|---|---|---|
device_id |
Device | β Yes | The Vestaboard device(s) to send the message to, including virtual Vestaboards and Note arrays. Supports multiple devices. |
message |
Message | No | Plain text message to display. Supports multiline input. |
justify |
Justify | No | Horizontal text alignment. Default: center. Options: left, right, center, justified. |
align |
Align | No | Vertical text alignment. Default: center. Options: top, bottom, center, justified. |
vbml |
Vestaboard Markup Language | No | Compose a static or dynamic message using VBML. Overrides message when provided. |
strategy |
Transition Strategy | No | Animation style when a new message is sent. See Transition Strategy section below. |
step_size |
Step Size | No | Number of columns/rows/bits to animate simultaneously. Range: 1β132. Leave blank to animate one at a time. |
step_interval_ms |
Step Interval | No | Delay (in milliseconds) between each animation step. Range: 1β3000 ms. Leave blank for immediate sequential activation. |
duration |
Duration | No | Display the message temporarily for the specified duration (in seconds). The board reverts to its previous persistent message when the duration expires. Range: 10β43200 seconds. |
bypass_quiet_hours |
Bypass Quiet Hours | No | If true, ignores quiet hours settings and sends the message immediately. |
strategy accepts one of the following literal values. The "Display Name" column shows how each option is labeled in the UI, but is not an acceptable value you can pass; only the strategy column values are valid.
strategy* (accepted value) |
Display Name (UI only) |
|---|---|
classic |
Classic (all-at-once) |
column |
Wave (left-to-right) |
reverse-column |
Drift (right-to-left) |
edges-to-center |
Curtain (outside-in, meeting in center) |
row |
Row (top-to-bottom) |
diagonal |
Diagonal (top-left to bottom-right) |
random** |
Random bits |
* Applies to all strategies except classic: every bit animates on each transition, regardless of whether the character is changing.
** The random strategy animates individual bits rather than full rows/columns, with a delay of several seconds (up to 10) between each step. A transition must fully complete before a new message can be displayed, so a small step_size means many more steps are needed to animate the full board. On a Flagship Vestaboard (132 bits), this can add up to several minutes before the board accepts a new message.
Send a simple text message:
action: vestaboard.message
data:
device_id: your_device_id
message: "Hello, world!"
justify: center
align: centerSend a temporary message with a transition animation:
action: vestaboard.message
data:
device_id: your_device_id
message: "Dinner is ready!"
strategy: column
step_interval_ms: 500
duration: 120Send a dynamic VBML message:
action: vestaboard.message
data:
device_id: your_device_id
vbml: >
{
"props": { "hours": "07", "minutes": "35" },
"components": [{
"style": { "justify": "center", "align": "center" },
"template": "{{ '{{hours}}:{{minutes}}' }}"
}]
}Note: The outer "{{ }}" escapes the inner VBML template syntax in the example above.
Send to multiple devices, bypassing quiet hours:
action: vestaboard.message
data:
device_id:
- device_id_1
- device_id_2
message: "Good morning!"
bypass_quiet_hours: true- Either
messageorvbmlshould be provided, but not both.vbmltakes precedence if both are given. step_sizeandstep_interval_msonly apply when astrategyis specified.durationis useful for transient alerts - the board will restore its last persistent message automatically after the duration expires.- Messages are laid out to fit each target's size, so the same
messageorvbmlfits a Flagship, a Note or a whole Note array. VBML component sizes are checked against each target.
I maintain this Home Assistant integration in my spare time. If you find it useful, consider supporting development:
- π Sponsor me on GitHub
- β Buy me a coffee / beer
- πΈ PayPal (direct support)
- β Star this project
- π¦ If youβd like to support in other ways, such as donating hardware for testing, feel free to reach out to me
If you don't already own a Vestaboard, please consider using my referral link below to get $200 off (as well as a $200 referral bonus to me in appreciation)!
All product names, trademarks and registered trademarks in the images in this repository, are property of their respective owners. All images in this repository are used by the Home Assistant project for identification purposes only.
The use of these names, trademarks and brands appearing in these image files, do not imply endorsement.





