Template Sensor


The template platform supports sensors which break out state_attributes from other entities.

If you do not supply an entity_id in the configuration you will need to run the service homeassistant.update_entity to update the sensor.

Configuration

To enable Template Sensors in your installation, add the following to your configuration.yaml file:

# 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)List 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).

entity_id

(string | list)(Optional)The template engine will attempt to work out what entities should trigger an update of the sensor. If this fails to get the correct list (for example if your template loops over the contents of a group) then you can provide a list of entity IDs that will cause the sensor to update.

unit_of_measurement

(string)(Optional)Defines the units of measurement of the sensor, if any. This will also influence the graphical presentation in the history visualisation as continuous value. Sensors with missing unit_of_measurement are showing as discrete values.

Default value: None

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.

device_class

(device_class)(Optional)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.

Default value: None

Considerations

If you are using the state of a platform that takes extra time to load, the Template Sensor may get an unknown state during startup. To avoid this (and the resulting error messages in your log file), you can use is_state() function in your template. For example, you would 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 this sensor.

Sun Angle

This example shows the sun angle in the frontend.

sensor:
  - platform: template
    sensors:
      solar_angle:
        friendly_name: "Sun Angle"
        unit_of_measurement: '°'
        value_template: "{{ '%+.1f'|format(state_attr('sun.sun', 'elevation')) }}"

Renaming Sensor 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 component as a simple example:

sensor:
  - platform: template
    sensors:
      sun_state:
        friendly_name: "Sun State"
        value_template: >-
          {% if is_state('sun.sun', 'above_horizon') %}
            up
          {% else %}
            down
          {% endif %}

Processes monitored by the System Monitor sensor show on or off if they are running or not. This example shows how the output of a monitored glances process can be renamed.

sensor:
  - platform: template
    sensors:
      glances:
        friendly_name: "Glances"
        value_template: >-
          {% if is_state('sensor.process_glances', 'on') %}
            running
          {% else %}
            not running
          {% endif %}

The Template Binary Sensor is the one in similar cases if you prefer to see an icon instead of text.

Multiline Example 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.

sensor:
  - platform: template
    sensors:
      kettle:
        friendly_name: "Kettle"
        value_template: >-
          {% if is_state('switch.kettle', 'off') %}
            off
          {% elif state_attr('switch.kettle', 'kwh')|float < 1000 %}
            standby
          {% elif is_state('switch.kettle', 'on') %}
            on
          {% else %}
            failed
          {% endif %}

      next_sensor:
        ...

Change The Unit of Measurement

With a Template Sensor it’s easy to convert given values into others if the unit of measurement doesn’t fit your needs.

sensor:
  - platform: template
    sensors:
      transmission_down_speed_kbps:
        friendly_name: "Transmission Down Speed"
        unit_of_measurement: 'kB/s'
        value_template: "{{ states('sensor.transmission_down_speed')|float * 1024 }}"

      transmission_up_speed_kbps:
        friendly_name: "Transmission Up Speed"
        unit_of_measurement: 'kB/s'
        value_template: "{{ states('sensor.transmission_up_speed')|float * 1024 }}"

Change The Icon

This example shows how to change the icon based on the day/night cycle.

sensor:
  - platform: template
    sensors:
      day_night:
        friendly_name: "Day/Night"
        value_template: >-
          {% if is_state('sun.sun', 'above_horizon') %}
            Day
          {% else %}
            Night
          {% endif %}
        icon_template: >-
          {% if is_state('sun.sun', 'above_horizon') %}
            mdi:weather-sunny
          {% else %}
            mdi:weather-night
          {% endif %}

Change The Entity Picture

This example shows how to change the entity picture based on the day/night cycle.

sensor:
  - platform: template
    sensors:
      day_night:
        friendly_name: "Day/Night"
        value_template: >-
          {% if is_state('sun.sun', 'above_horizon') %}
            Day
          {% else %}
            Night
          {% endif %}
        entity_picture_template: >-
          {% if is_state('sun.sun', 'above_horizon') %}
            /local/daytime.png
          {% else %}
            /local/nighttime.png
          {% endif %}

Change the Friendly Name Used in the Frontend

This example shows how to change the friendly_name based on a date. Explanation: We add a multiple of 86400 seconds (= 1 day) to the current unix timestamp to get a future date.

sensor:
  - platform: template
    sensors:
      forecast_1_day_ahead:
        friendly_name_template: >-
          {%- set date = as_timestamp(now()) + (1 * 86400 ) -%}
          {{ date|timestamp_custom("Tomorrow (%-m/%-d)") }}
        value_template: "{{ sensor.darksky_weather_forecast_1 }}"
      forecast_2_days_ahead:
        friendly_name_template: >-
          {%- set date = as_timestamp(now()) + (2 * 86400 ) -%}
          {{ date|timestamp_custom("%A (%-m/%-d)") }}
        value_template: "{{ sensor.darksky_weather_forecast_2 }}"

This example shows how to change the friendly_name based on a state.

sensor:
  - platform: template
    sensors:
      net_power:
        friendly_name_template: >-
          {% if states('sensor.power_consumption')|float < 0 %}
            Power Consumption
          {% else %}
            Power Production
          {% end %}
        value_template: "{{ states('sensor.power_consumption') }}"
        unit_of_measurement: 'kW'

Working with dates

The template sensors are not limited to use attributes from other entities but can also work with Home Assistant’s template extensions. This template contains no entities that will trigger an update, so either we need to use homeassistant.update_entity or add an entity_id: line for an entity that will force an update - here we’re using sensor.date.

sensor:
- platform: template
  sensors:
    nonsmoker:
      value_template: '{{ (( as_timestamp(now()) - as_timestamp(strptime("06.07.2018", "%d.%m.%Y")) ) / 86400 ) | round(2) }}'
      entity_id: sensor.date
      friendly_name: 'Not smoking'
      unit_of_measurement: "Days"

Useful entities to choose might be sensor.date which update once per day, or sensor.time which updates once per minute.

Note: If a template uses more than one sensor they can be listed

The alternative to this is to create an Automationusing the new (81.0) service homeassistant.update_entity and list all entity’s requiring updates and setting the interval based on time.

automation:
  - alias: 'nonsmoker_update'
    trigger:
      - platform: time
        minutes: '/1'
    action:
      - service: homeassistant.update_entity
        entity_id: sensor.nonsmoker