Catch status 'none' with value templates

hey,

I’ve been playing around with HA since a couple of month and I did quite some progress using the documentation and the community.

I use a couple of value template in my configuration.yaml and in this case especially with the Xiaomi Air Purifier.

I use the following config

sensor:
  - platform: template
    sensors:
      mi_air_purifier_temp:
        friendly_name: "Temperature"
        value_template: "{{ state_attr('fan.mi_air_purifier_3h', 'temperature') }}"
        unit_of_measurement: "°C"
        device_class: "temperature"
      mi_air_purifier_humidity:
        friendly_name: "Humidity"
        value_template: "{{ state_attr('fan.mi_air_purifier_3h', 'humidity') }}"
        unit_of_measurement: "%"
        device_class: "humidity"
      mi_air_purifier_air_quality_pm25:
        friendly_name: "Air quality (AQI) PM2.5"
        value_template: "{{ state_attr('fan.mi_air_purifier_3h', 'aqi') }}"
        unit_of_measurement: "μg/m³"
        icon_template: "mdi:weather-fog"
      mi_air_purifier_avg_air_quality_pm25:
        friendly_name: "Average air quality (AvgAQI) PM2.5"
        value_template: "{{ state_attr('fan.mi_air_purifier_3h', 'average_aqi') }}"
        unit_of_measurement: "μg/m³"
        icon_template: "mdi:weather-hazy"
      mi_air_purifier_use_time:
        friendly_name: "Time used"
        value_template: >
            {% macro phrase(value, name) %}
            {%- set value = value | int %}
            {%- set end = 's' if value > 1 else '' %}
            {{- '{} {}{}'.format(value, name, end) if value | int > 0 else '' }}
            {%- endmacro %}
            
            {% set weeks = (state_attr('fan.mi_air_purifier_3h', 'use_time') | int / 604800) | int %}
            {% set days = ((state_attr('fan.mi_air_purifier_3h', 'use_time') | int - (weeks * 604800)) / 86400) | int %}
            {% set hours = ((state_attr('fan.mi_air_purifier_3h', 'use_time') | int - (weeks * 604800) - (days * 86400)) / 3600) | int %}
            {% set minutes = ((state_attr('fan.mi_air_purifier_3h', 'use_time') | int - (weeks * 604800) - (days * 86400) - (hours * 3600)) / 60) | int %}
            {% set seconds = (state_attr('fan.mi_air_purifier_3h', 'use_time') | int - (weeks * 604800) - (days * 86400) - (hours * 3600) - (minutes*60)) | int %}
            {{ [ phrase(weeks, 'week'), phrase(days, 'day'), phrase(hours, 'hr'), phrase(minutes, 'min'), phrase(seconds, 'sec') ] | select('!=','') | list | join(', ') }}
        icon_template: "mdi:heart-pulse"
      mi_air_purifier_filter_used:
        friendly_name: "Filter used"
        value_template: "{{ state_attr('fan.mi_air_purifier_3h', 'filter_hours_used') }}"
        unit_of_measurement: "hrs"
        icon_template: "mdi:heart-off"
      mi_air_purifier_filter_remaining:
        friendly_name: "Filter remaining"
        value_template: "{{ state_attr('fan.mi_air_purifier_3h', 'filter_life_remaining') }}"
        unit_of_measurement: "%"
        icon_template: "mdi:heart-outline"
      mi_air_purifier_purify_volume:
        friendly_name: "Purified volume"
        value_template: "{{ state_attr('fan.mi_air_purifier_3h', 'purify_volume') }}"
        unit_of_measurement: "m³"
        icon_template: "mdi:warehouse"
      mi_air_purifier_speed:
        friendly_name: "Motor speed"
        value_template: "{{ state_attr('fan.mi_air_purifier_3h', 'motor_speed') }}"
        unit_of_measurement: "rpm"
        icon_template: "mdi:speedometer"
      mi_air_purifier_led_brightness:
        friendly_name: "Led brightness"
        value_template: "{{ state_attr('fan.mi_air_purifier_3h', 'led_brightness') }}"
        unit_of_measurement: "lx"
        icon_template: "mdi:brightness-5"

This does work if the Xiaomi Air Purifier is powered on.
If it isn’t, i get some warnings in my log file.

e.g.:

  • Invalid option: None (possible options: Auto, Silent, Favorite, Fan)
  • Air Purifier fan level update: Error executing script. Invalid data for call_service at pos 1: Invalid value for input_number.mi_air_purifier_fan_level: 0.0 (range 1.0 - 3.0)
  • Value cannot be processed as a number: <state sensor.mi_air_purifier_air_quality_pm25=None; unit_of_measurement=μg/m³, friendly_name=Air quality (AQI) PM2.5, icon=mdi:weather-fog @ 2020-06-26T19:04:04.927873+02:00> (Offending entity: None)

I understand that if the device is offline it doesn’t return a valid value or number. But is it somehow possible to set a specific value in case the device is offline and doesn’t return a valid value?
Alternatively, is it possible to prevent that these warnings are being written to the log?

thx and Best,
pete

1 Like