Join a list into a string: join
The join filter concatenates a list of values into a single string, placing a separator between each element. You can also join a specific attribute of a list of objects.
This is useful whenever you need to turn a list of items into a readable string. For example, you might want to list the names of entitiesAn entity represents a sensor, actor, or function in Home Assistant. Entities are used to monitor physical properties or to control other entities. An entity is usually part of a device or a service. [Learn more] that are currently on, build a comma-separated summary for a notification, or join a list of room names for display on a dashboard.
Usage
Here’s how to use this template function. Copy any example and adjust it to your setup.
{{ ["living room", "kitchen", "bedroom"] | join(", ") }}
living room, kitchen, bedroom
Function signature
The signature is a technical summary of this template function. It shows the name of the function, the values (called parameters) it accepts, and what type of data each parameter expects (for example, a piece of text or a number).
Function parameters that have a = with a value after them are optional. If you leave them out, the default value shown is used automatically. Function parameters without a default are required.
join(
value: list,
separator: str = "",
attribute: str | None = None,
) -> str
Function parameters
The following parameters can be provided to this function.
The list of values to join into a string. Each element is converted to a string before joining.
The string to place between each element. Defaults to an empty string (no separator).
Joining without a separator
By default, elements are concatenated directly with no separator between them.
{{ ["a", "b", "c"] | join }}
abc
Good to know
- The default separator is an empty string, so without an argument the items are concatenated directly.
- Each item is converted to a string automatically, so you can join numbers, booleans, and other types.
- Every item must be concrete. Iterables produced by
selectorselectattrneed no conversion, but generators should be materialized first.
Try it yourself
Ready to test this? Open Developer tools > Template, paste the example into the Template editor, and watch the result update on the right. Edit the values to see how the function adapts to your own entitiesAn entity represents a sensor, actor, or function in Home Assistant. Entities are used to monitor physical properties or to control other entities. An entity is usually part of a device or a service. [Learn more].
More examples
Real scenarios where this function comes up in automations and templates. Copy any example and adapt it to your setup.
List active lights in a notification
Build a human-readable list of lights that are currently on.
{% set lights = ["Living room", "Kitchen", "Porch"] %}
Lights on: {{ lights | join(", ") }}
Lights on: Living room, Kitchen, Porch
Build a path from parts
Join path segments together with a separator.
{{ ["home", "user", "config"] | join("/") }}
home/user/config
Still stuck?
The Home Assistant community is quick to help: join Discord for real-time chat, post on the community forum with your template and expected result, or share on our subreddit /r/homeassistant.
AI assistants like ChatGPT or Claude can also explain or fix templates when you describe what you want in plain language.
Related template functions
These functions work well alongside this one:
-
Flatten nested lists: flatten - Flattens nested lists into a single flat list.
-
Convert to set: set - Converts an iterable to a set, removing duplicate values.