Template Sensor - dealing with "unavailable" values

Hey guys,

I have a template sensor that calculates the energy cost based on my power consumption:

      power_rate:
        friendly_name: "Power Rate"
        unit_of_measurement: 'R$'
        value_template: "{{0.654533 if states('sensor.power_meter_energy_total')|float < 150 else 0.782816}}"

However, if sensor.power_meter_energy_total is unavailable, I don’t want to update the value of power_rate. How could I do it?

I think this will do what you want.

value_template: >
  {% if states('sensor.power_meter_energy_total')  != 'unavailable' %}
    {{0.654533 if states('sensor.power_meter_energy_total')|float < 150 else 0.782816}}
  {% else %}
    {{ states('sensor.power_rate') }}
  {% endif %}

That can produce false positives.

Here’s an example:

  • I have a sensor.advisories whose state is unknown because it has not yet received any value.

  • I don’t have a sensor.power_meter_energy_total defined on my system.

Screenshot%20from%202019-04-05%2015-24-09

Now watch what’s produced by the following templates:

  • The first template evaluates to true even though the sensor doesn’t exist.

  • The second template also evaluate to true even though the sensor contains no valid value (it’s unknown).

  • The third template correctly evaluates to false because the sensor’s value is indeed unknown.


This solution assumes power_meter_energy_total can never have a negative number.

value_template: >
  {% set energy = states('sensor.power_meter_energy_total') | float(default=-1) %}
  {% if energy != -1 %}
    {{0.654533 if energy < 150 else 0.782816}}
  {% else %}
    {{ states('sensor.power_rate') }}
  {% endif %}

It is based on the principle that if sensor.power_meter_energy_total is either undefined or contains no value, float will be unable to convert it so it reports a default value of -1.

6 Likes

I did a similar thing, using the developer tools, template and testing each variable by putting it in brackets like this {{ variable name }} enabled me to write this template from scratch.

  - platform: template
    sensors:
      battery_time_left:
        friendly_name: "Battery Time Left"
        unit_of_measurement: "hours"
        value_template: >-
          {% set battery_capacity = 5.94 %}
          {% set battery_percentage = states('sensor.battery_state_of_charge')|int / 100 %}
          {% set battery_load = states('sensor.battery_power')|int /-1000 %}
          {% set battery_power = battery_capacity * battery_percentage %}
{# Testing for Negative Battery Load - Battery no longer has charge #}
          {% if battery_load < 1 %}
              {% set battery_time_left = 0 %}
            {% else %}
              {% set battery_time_left = battery_power + battery_load %}
          {% endif %}
{# Testing for Negative Time left - Charging #}          
          {% if battery_time_left < 0 %}
            0
          {% else %}
            {{ battery_time_left|round(2) }}
          {% endif %}