Template


The template integration allows creating entities which derive their values from other data. This is done by specifying templates for properties of an entity, like the name or the state.

Sensors, binary (on/off) sensors, buttons, images, numbers and selects are covered on this page. For other types, please see the specific pages:

Sensor and binary sensor can be configured using UI or YAML file.

Button, image, number, and select template entities are defined in your YAML configuration files under the template: key and cannot be configured via the UI. You can define multiple configuration blocks as a list. Each block defines sensor/binary sensor/number/select entities and can contain an optional update trigger.

For old sensor/binary sensor configuration format, see below.

UI configuration

Sensor template and binary sensor template can be configured using the user interface at Settings > Devices & Services > Helpers. Select the + Add helper button and then select the Template helper.

To be able to add Helpers via the user interface, you should have default_config: in your configuration.yaml. It should already be there by default unless you removed it.

YAML configuration

State-based template binary sensors, buttons, images, numbers, selects and sensors

Template entities will by default update as soon as any of the referenced data in the template updates.

For example, you can have a template that takes the averages of two sensors. Home Assistant will update your template sensor as soon as either source sensor updates.

template:
  - sensor:
      - name: "Average temperature"
        unit_of_measurement: "°C"
        state: >
          {% set bedroom = states('sensor.bedroom_temperature') | float %}
          {% set kitchen = states('sensor.kitchen_temperature') | float %}

          {{ ((bedroom + kitchen) / 2) | round(1, default=0) }}

Trigger-based template binary sensors, buttons, images, numbers, selects and sensors

If you want more control over when an entity updates, you can define a trigger. Triggers follow the same format and work exactly the same as triggers in automations. This feature is a great way to create entities based on webhook data (example), or update entities based on a schedule.

Whenever the trigger fires, all related entities will re-render and it will have access to the trigger data in the templates.

Trigger-based entities do not automatically update when states referenced in the templates change. This functionality can be added back by defining a state trigger for each entity that you want to trigger updates.

The state, including attributes, of trigger-based sensors and binary sensors is restored when Home Assistant is restarted. The state of other trigger-based template entities is not restored.

# Example configuration entry
template:
  - trigger:
      - platform: time_pattern
        # This will update every night
        hours: 0
        minutes: 0
    sensor:
      # Keep track how many days have past since a date
      - name: "Not smoking"
        state: '{{ ( ( as_timestamp(now()) - as_timestamp(strptime("06.07.2018", "%d.%m.%Y")) ) / 86400 ) | round(default=0) }}'
        unit_of_measurement: "Days"

Configuration Variables

trigger list (Optional)

Define an automation trigger to update the entities. Optional. If omitted will update based on referenced entities. See trigger documentation.

unique_id string (Optional)

The unique ID for this config block. This will be prefixed to all unique IDs of all entities in this block.

action list (Optional)

Define actions to be executed when the trigger fires. Optional. Variables set by the action script are available when evaluating entity templates. This can be used to interact with anything via services, in particular services with response data. See action documentation.

sensor map Required

List of sensors

state template Required

Defines a template to get the state of the sensor. If the sensor is numeric, i.e. it has a state_class or a unit_of_measurement, the state template must render to a number or to none. The state template must not render to a string, including unknown or unavailable. An availability template may be defined to suppress rendering of the state template.

unit_of_measurement string (Optional, default: None)

Defines the units of measurement of the sensor, if any. This will also display the value based on the user profile Number Format setting and influence the graphical presentation in the history visualization as a continuous value.

state_class string (Optional, default: None)

The state_class of the sensor. This will also display the value based on the user profile Number Format setting and influence the graphical presentation in the history visualization as a continuous value.

last_reset template (Optional, default: None)

Defines a template that describes when the state of the sensor was last reset. Must render to a valid datetime. Only available when state_class is set to total

binary_sensor map Required

List of binary sensors

state template Required

The sensor is on if the template evaluates as True, yes, on, enable or a positive number. Any other value will render it as off. The actual appearance in the frontend (Open/Closed, Detected/Clear etc) depends on the sensor’s device_class value

delay_on time (Optional)

The amount of time (e.g. 0:00:05) the template state must be met before this sensor will switch to on. This can also be a template.

delay_off time (Optional)

The amount of time the template state must be not met before this sensor will switch to off. This can also be a template.

auto_off time (Optional)

Requires a trigger. After how much time the entity should turn off after it rendered ‘on’.

[both sensor and binary_sensor entities] map (Optional)

Fields that can be used above for both sensors and binary sensors.

picture template (Optional)

Defines a template for the entity picture of the sensor.

attributes map (Optional)

Defines templates for attributes of the sensor.

attribute: template template Required

The attribute and corresponding template.

device_class device_class (Optional, default: None)

Sets the class of the device, changing the device state and icon that is displayed on the UI (see below). It does not set the unit_of_measurement.

number map Required

List of numbers

state template Required

Template for the number’s current value.

set_value action Required

Defines actions to run when the number value changes. The variable value will contain the number entered.

step template Required

Template for the number’s increment/decrement step.

min template (Optional, default: 0.0)

Template for the number’s minimum value.

max template (Optional, default: 100.0)

Template for the number’s maximum value.

optimistic boolean (Optional, default: false)

Flag that defines if number works in optimistic mode.

select map Required

List of selects

state template Required

Template for the select’s current value.

select_option action Required

Defines actions to run to select an option from the options list. The variable option will contain the option selected.

options template Required

Template for the select’s available options.

optimistic boolean (Optional, default: false)

Flag that defines if select works in optimistic mode.

button map Required

List of buttons

press action Required

Defines actions to run to press the button.

image map Required

List of images

url template Required

The URL on which the image is served.

verify_ssl boolean (Optional, default: true)

Enable or disable SSL certificate verification. Set to false to use an http-only URL, or you have a self-signed SSL certificate and haven’t installed the CA certificate to enable verification.

weather map Required

List of weather entities

condition_template template Required

The current weather condition.

temperature_template template Required

The current temperature.

dew_point_template template (Optional)

The current dew point.

apparent_temperature_template template (Optional)

The current apparent (feels-like) temperature.

temperature_unit string (Optional)

Unit for temperature_template output. Valid options are °C, °F, and K.

humidity_template template Required

The current humidity.

pressure_template template (Optional)

The current air pressure.

pressure_unit string (Optional)

Unit for pressure_template output. Valid options are Pa, hPa, kPa, bar, cbar, mbar, mmHg, inHg, psi.

wind_speed_template template (Optional)

The current wind speed.

wind_gust_speed_template template (Optional)

The current wind gust speed.

wind_speed_unit string (Optional)

Unit for wind_speed_template output. Valid options are m/s, km/h, mph, mm/d, in/d, and in/h.

wind_bearing_template template (Optional)

The current wind bearing.

ozone_template template (Optional)

The current ozone level.

cloud_coverage_template template (Optional)

The current cloud coverage.

visibility_template template (Optional)

The current visibility.

visibility_unit string (Optional)

Unit for visibility_template output. Valid options are km, mi, ft, m, cm, mm, in, yd.

forecast_daily_template template (Optional)

Daily forecast data.

forecast_hourly_template template (Optional)

Hourly forecast data.

forecast_twice_daily_template template (Optional)

Twice daily forecast data.

precipitation_unit string (Optional)

Unit for precipitation output. Valid options are km, mi, ft, m, cm, mm, in, yd.

[all sensor, binary sensor, button, image, number, select, weather entities] map (Optional)

Fields that can be used above for sensors, binary sensors, buttons, numbers, and selects.

name template (Optional)

Defines a template to get the name of the entity.

unique_id string (Optional)

An ID that uniquely identifies this entity. Will be combined with the unique ID of the configuration block if available. This allows changing the name, icon and entity_id from the web interface.

icon template (Optional)

Defines a template for the icon of the entity.

availability template (Optional, default: true)

Defines a template to get the available state of the entity. If the template either fails to render or returns True, "1", "true", "yes", "on", "enable", or a non-zero number, the entity will be available. If the template returns any other value, the entity will be unavailable. If not configured, the entity will always be available. Note that the string comparison is not case sensitive; "TrUe" and "yEs" are allowed.

The above configuration variables describe a configuration section. The template integration allows defining multiple sections.

# Example configuration.yaml entry with two sections
template:
  # Define state-based template entities
  - sensor:
      ...
  - binary_sensor:
      ...

  # Define trigger-based template entities
  - trigger:
      ...
    sensor:
      ...
    binary_sensor:
      ...

Video tutorial

This video tutorial explains how to set up a Trigger based template that makes use of an action to retrieve the weather forecast (precipitation).

Template and action variables

State-based and trigger-based template entities have the special template variable this available in their templates and actions. The this variable is the state object of the entity and aids self-referencing of an entity’s state and attribute in templates and actions. Trigger-based entities also provide the trigger data.

Rate limiting updates

When there are entities present in the template and no triggers are defined, the template will be re-rendered when one of the entities changes states. To avoid this taking up too many resources in Home Assistant, rate limiting will be automatically applied if too many states are observed.

Define a trigger to avoid a rate limit and get more control over entity updates.

When states is used in a template by itself to iterate all states on the system, the template is re-rendered each time any state changed event happens if any part of the state is accessed. When merely counting states, the template is only re-rendered when a state is added or removed from the system. On busy systems with many entities or hundreds of thousands state changed events per day, templates may re-render more than desirable.

In the below example, re-renders are limited to once per minute because we iterate over all available entities:

template:
  - binary_sensor:
      - name: "Has Unavailable States"
        state: "{{ states | selectattr('state', 'in', ['unavailable', 'unknown', 'none']) | list | count }}"

In the below example, re-renders are limited to once per second because we iterate over all entities in a single domain (sensor):

template:
  - binary_sensor:
      - name: "Has Unavailable States"
        state: "{{ states.sensor | selectattr('state', 'in', ['unavailable', 'unknown', 'none']) | list | count }}"

If the template accesses every state on the system, a rate limit of one update per minute is applied. If the template accesses all states under a specific domain, a rate limit of one update per second is applied. If the template only accesses specific states, receives update events for specifically referenced entities, or the homeassistant.update_entity service is used, no rate limit is applied.

Considerations

Startup

If you are using the state of a platform that might not be available during startup, the Template Sensor may get an unknown state. To avoid this, use the states() function in your template. For example, you should replace {{ states.sensor.moon.state }} with this equivalent that returns the state and never results in unknown: {{ states('sensor.moon') }} .

The same would apply to the is_state() function. You should replace {{ states.switch.source.state == 'on' }} with this equivalent that returns true/false and never gives an unknown result:

{{ is_state('switch.source', 'on') }}

Examples

In this section, you find some real-life examples of how to use template sensors.

Trigger based sensor and binary sensor storing webhook information

Template entities can be triggered using any automation trigger, including webhook triggers. Use a trigger-based template entity to store this information in template entities.

template:
  - trigger:
      - platform: webhook
        webhook_id: my-super-secret-webhook-id
    sensor:
      - name: "Webhook Temperature"
        state: "{{ trigger.json.temperature }}"
        unit_of_measurement: °C

      - name: "Webhook Humidity"
        state: "{{ trigger.json.humidity }}"
        unit_of_measurement: %

    binary_sensor:
      - name: "Motion"
        state: "{{ trigger.json.motion }}"
        device_class: motion

You can test this trigger entity with the following CURL command:

curl --header "Content-Type: application/json" \
  --request POST \
  --data '{"temperature": 5, "humidity": 34, "motion": true}' \
  http://homeassistant.local:8123/api/webhook/my-super-secret-webhook-id

Turning an event into a trigger based binary sensor

You can use a trigger-based template entity to convert any event or other automation trigger into a binary sensor. The below configuration will turn on a binary sensor for 5 seconds when the automation trigger triggers.

template:
  - trigger:
      platform: event
      event_type: my_event
    binary_sensor:
      - name: Event recently fired
        auto_off: 5
        state: "true"

State based sensor exposing sun angle

This example shows the sun angle in the frontend.

template:
  - sensor:
      - name: Sun Angle
        unit_of_measurement: "°"
        state: "{{ '%+.1f'|format(state_attr('sun.sun', 'elevation')) }}"

State based sensor modifying another sensor’s output

If you don’t like the wording of a sensor output, then the Template Sensor can help too. Let’s rename the output of the Sun integration as a simple example:

template:
  - sensor:
      - name: "Sun State"
        state: >
          {% if is_state('sun.sun', 'above_horizon') %}
            up
          {% else %}
            down
          {% endif %}

State based sensor with multiline template with an if test

This example shows a multiple line template with an if test. It looks at a sensing switch and shows on/off in the frontend, and shows ‘standby’ if the power use is less than 1000 watts.

template:
  - sensor:
      - name: "Kettle"
        state: >
          {% if is_state('switch.kettle', 'off') %}
            off
          {% elif state_attr('switch.kettle', 'W')|float < 1000 %}
            standby
          {% elif is_state('switch.kettle', 'on') %}
            on
          {% else %}
            failed
          {% endif %}

State based sensor changing the unit of measurement of another sensor

With a Template Sensor, it’s easy to convert given values into others if the unit of measurement doesn’t fit your needs. Because the sensors do math on the source sensor’s state and need to render to a numeric value, an availability template is used to suppress rendering of the state template if the source sensor does not have a valid numeric state.

template:
  - sensor:
      - name: "Transmission Down Speed"
        unit_of_measurement: "kB/s"
        state: "{{ states('sensor.transmission_down_speed')|float * 1024 }}"
        availability: "{{ is_number(states('sensor.transmission_down_speed')) }}"

      - name: "Transmission Up Speed"
        unit_of_measurement: "kB/s"
        state: "{{ states('sensor.transmission_up_speed')|float * 1024 }}"
        availability: "{{ is_number(states('sensor.transmission_up_speed')) }}"

State based binary sensor - Washing Machine Running

This example creates a washing machine “load running” sensor by monitoring an energy meter connected to the washer. During the washer’s operation, the energy meter will fluctuate wildly, hitting zero frequently even before the load is finished. By utilizing delay_off, we can have this sensor only turn off if there has been no washer activity for 5 minutes.

# Determine when the washing machine has a load running.
template:
  - binary_sensor:
      - name: "Washing Machine"
        delay_off:
          minutes: 5
        state: >
          {{ states('sensor.washing_machine_power')|float > 0 }}

State based binary sensor - Is Anyone Home

This example is determining if anyone is home based on the combination of device tracking and motion sensors. It’s extremely useful if you have kids/baby sitter/grand parents who might still be in your house that aren’t represented by a trackable device in Home Assistant. This is providing a composite of Wi-Fi based device tracking and Z-Wave multisensor presence sensors.

template:
  - binary_sensor:
      - name: People home
        state: >
          {{ is_state('device_tracker.sean', 'home')
             or is_state('device_tracker.susan', 'home')
             or is_state('binary_sensor.office_124', 'on')
             or is_state('binary_sensor.hallway_134', 'on')
             or is_state('binary_sensor.living_room_139', 'on')
             or is_state('binary_sensor.porch_ms6_1_129', 'on')
             or is_state('binary_sensor.family_room_144', 'on') }}

State based binary sensor - device tracker sensor with latitude and longitude attributes

This example shows how to combine a non-GPS (e.g., NMAP) and GPS device tracker while still including latitude and longitude attributes

template:
  - binary_sensor:
      - name: My Device
        state: >
          {{ is_state('device_tracker.my_device_nmap', 'home') or is_state('device_tracker.my_device_gps', 'home') }}
        device_class: "presence"
        attributes:
          latitude: >
            {% if is_state('device_tracker.my_device_nmap', 'home') %}
              {{ state_attr('zone.home', 'latitude') }}
            {% else %}
              {{ state_attr('device_tracker.my_device_gps', 'latitude') }}
            {% endif %}
          longitude: >
            {% if is_state('device_tracker.my_device_nmap', 'home') %}
              {{ state_attr('zone.home', 'longitude') }}
            {% else %}
              {{ state_attr('device_tracker.my_device_gps', 'longitude') }}
            {% endif %}

State based binary sensor - Change the icon when a state changes

This example demonstrates how to use template to change the icon as its state changes. This icon is referencing its own state.

template:
  - binary_sensor:
      - name: Sun Up
        state: >
          {{ is_state("sun.sun", "above_horizon") }}
        icon: >
          {% if is_state("binary_sensor.sun_up", "on") %}
            mdi:weather-sunset-up
          {% else %}
            mdi:weather-sunset-down
          {% endif %}

A more advanced use case could be to set the icon based on the sensor’s own state like above, but when triggered by an event. This example demonstrates a binary sensor that turns on momentarily, such as when a doorbell button is pressed.

The binary sensor turns on and sets the matching icon when the appropriate event is received. After 5 seconds, the binary sensor turns off automatically. To ensure the icon gets updated, there must be a trigger for when the state changes to off.

template:
  - trigger:
      - platform: event
        event_type: YOUR_EVENT
      - platform: state
        entity_id: binary_sensor.doorbell_rang
        to: "off"
    binary_sensor:
      name: doorbell_rang
      icon: "{{ (trigger.platform == 'event') | iif('mdi:bell-ring-outline', 'mdi:bell-outline') }}"
      state: "{{ trigger.platform == 'event' }}"
      auto_off:
        seconds: 5

State based select - Control Day/Night mode of a camera

This show how a state based template select can be used to call a service.

template:
  select:
    - name: "Porch Camera Day-Night Mode"
      unique_id: porch_camera_day_night_mode
      state: "{{ state_attr('camera.porch_camera_sd', 'day_night_mode') }}"
      options: "{{ ['off', 'on', 'auto'] }}"
      select_option:
        - service: tapo_control.set_day_night_mode
          data:
            day_night_mode: "{{ option }}"
          target:
            entity_id: camera.porch_camera_sd

Self referencing

This example demonstrates how the this variable can be used in templates for self-referencing.

template:
  - sensor:
      - name: test
        state: "{{ this.attributes.test | default('Value when missing') }}"
        # not: "{{ state_attr('sensor.test', 'test') }}"
        attributes:
          test: "{{ now() }}"

Trigger based handling of service response data

This example demonstrates how to use an action to call a service with response data and use the response in a template.

template:
  - trigger:
      - platform: time_pattern
        hours: /1
    action:
      - service: weather.get_forecasts
        data:
          type: hourly
        target:
          entity_id: weather.home
        response_variable: hourly
    sensor:
      - name: Weather Forecast Hourly
        unique_id: weather_forecast_hourly
        state: "{{ now().isoformat() }}"
        attributes:
          forecast: "{{ hourly['weather.home'].forecast }}"

Legacy binary sensor configuration format

This format still works but is no longer recommended. Use modern configuration.

This format is configured as a platform for the binary_sensor integration and not directly under the template integration.

# Example configuration.yaml entry
binary_sensor:
  - platform: template
    sensors:
      sun_up:
        friendly_name: "Sun is up"
        value_template: {{ state_attr('sun.sun', 'elevation') > 0 }}

Configuration Variables

sensors map Required

List of your sensors.

sensor_name map Required

The slug of the sensor.

friendly_name string (Optional)

Name to use in the frontend.

unique_id string (Optional)

An ID that uniquely identifies this binary sensor. Set this to a unique value to allow customization through the UI.

device_class device_class (Optional, default: None)

Sets the class of the device, changing the device state and icon that is displayed on the frontend.

value_template template Required

The sensor is on if the template evaluates as True and off otherwise. The actual appearance in the frontend (Open/Closed, Detected/Clear etc) depends on the sensor’s device_class value

availability_template template (Optional, default: true)

Defines a template to get the available state of the entity. If the template either fails to render or returns True, "1", "true", "yes", "on", "enable", or a non-zero number, the entity will be available. If the template returns any other value, the entity will be unavailable. If not configured, the entity will always be available. Note that the string comparison not case sensitive; "TrUe" and "yEs" are allowed.

icon_template template (Optional)

Defines a template for the icon of the sensor.

entity_picture_template template (Optional)

Defines a template for the entity picture of the sensor.

attribute_templates map (Optional)

Defines templates for attributes of the sensor.

attribute: template template Required

The attribute and corresponding template.

delay_on time (Optional)

The amount of time the template state must be met before this sensor will switch to on. This can also be a template.

delay_off time (Optional)

The amount of time the template state must be not met before this sensor will switch to off. This can also be a template.

Legacy Sensor configuration format

This format still works but is no longer recommended. Use modern configuration.

This format is configured as a platform for the sensor integration and not directly under the template integration.

# Example configuration.yaml entry
sensor:
  - platform: template
    sensors:
      solar_angle:
        friendly_name: "Sun angle"
        unit_of_measurement: "degrees"
        value_template: "{{ state_attr('sun.sun', 'elevation') }}"

      sunrise:
        value_template: "{{ state_attr('sun.sun', 'next_rising') }}"

Configuration Variables

sensors map Required

Map of your sensors.

friendly_name string (Optional)

Name to use in the frontend.

friendly_name_template template (Optional)

Defines a template for the name to be used in the frontend (this overrides friendly_name).

unique_id string (Optional)

An ID that uniquely identifies this sensor. Set this to a unique value to allow customization through the UI.

unit_of_measurement string (Optional, default: None)

Defines the units of measurement of the sensor, if any. This will also display the value based on the user profile Number Format setting and influence the graphical presentation in the history visualization as a continuous value.

value_template template Required

Defines a template to get the state of the sensor.

icon_template template (Optional)

Defines a template for the icon of the sensor.

entity_picture_template template (Optional)

Defines a template for the entity picture of the sensor.

attribute_templates map (Optional)

Defines templates for attributes of the sensor.

attribute: template template Required

The attribute and corresponding template.

availability_template template (Optional, default: true)

Defines a template to get the available state of the integration. If the template returns true, the device is available. If the template returns any other value, the device will be unavailable. If availability_template is not configured, the integration will always be available.

device_class device_class (Optional, default: None)

Sets the class of the device, changing the device state and icon that is displayed on the UI (see below). It does not set the unit_of_measurement.

Event event_template_reloaded

Event event_template_reloaded is fired when Template entities have been reloaded and entities thus might have changed.

This event has no additional data.