Question about ValueError: ...thus indicating it has a numeric value

hello,

for a long time, nearly since beginning of my HASSIO experiment :wink: i do have randomly an error message in log like this, but i had never time to think about…

Logger: homeassistant.helpers.event
Source: components/sensor/__init__.py:593
First occurred: 12:07:35 (3 occurrences)
Last logged: 13:28:11

Error while dispatching event for sensor.power_import to <Job track state_changed event {'sensor.power_export', 'sensor.emp1_power', 'sensor.power_import'} HassJobType.Callback <bound method TrackTemplateResultInfo._refresh of <TrackTemplateResultInfo {Template<template=({% if (states('sensor.power_export')|float(0)) > 0 and (states('sensor.emp1_power')|float(0) - states('sensor.power_export')|float(0)) < 0 %} {% elif (states('sensor.power_export')|float(0)) > 0 and (states('sensor.emp1_power')|float(0) - states('sensor.power_export')|float(0)) > 0 %} {{ ((states('sensor.emp1_power')|float(0)) - states('sensor.power_export')|float(0))|round(3) }} {% else %} {{ (states('sensor.power_import')|float(0) + states('sensor.emp1_power')|float(0))|round(3) }} {% endif %}) renders=1844614>: <RenderInfo Template<template=({% if (states('sensor.power_export')|float(0)) > 0 and (states('sensor.emp1_power')|float(0) - states('sensor.power_export')|float(0)) < 0 %} {% elif (states('sensor.power_export')|float(0)) > 0 and (states('sensor.emp1_power')|float(0) - states('sensor.power_export')|float(0)) > 0 %} {{ ((states('sensor.emp1_power')|float(0)) - states('sensor.power_export')|float(0))|round(3) }} {% else %} {{ (states('sensor.power_import')|float(0) + states('sensor.emp1_power')|float(0))|round(3) }} {% endif %}) renders=1844614> all_states=False all_states_lifecycle=False domains=frozenset() domains_lifecycle=frozenset() entities=frozenset({'sensor.power_export', 'sensor.emp1_power'}) rate_limit=None has_time=False exception=None is_static=False>}>>>
Error while dispatching event for sensor.power_export to <Job track state_changed event {'sensor.power_export', 'sensor.emp1_power'} HassJobType.Callback <bound method TrackTemplateResultInfo._refresh of <TrackTemplateResultInfo {Template<template=({% if (states('sensor.power_export')|float(0)) > 0 and (states('sensor.emp1_power')|float(0) - states('sensor.power_export')|float(0)) < 0 %} {% elif (states('sensor.power_export')|float(0)) > 0 and (states('sensor.emp1_power')|float(0) - states('sensor.power_export')|float(0)) > 0 %} {{ ((states('sensor.emp1_power')|float(0)) - states('sensor.power_export')|float(0))|round(3) }} {% else %} {{ (states('sensor.power_import')|float(0) + states('sensor.emp1_power')|float(0))|round(3) }} {% endif %}) renders=1844902>: <RenderInfo Template<template=({% if (states('sensor.power_export')|float(0)) > 0 and (states('sensor.emp1_power')|float(0) - states('sensor.power_export')|float(0)) < 0 %} {% elif (states('sensor.power_export')|float(0)) > 0 and (states('sensor.emp1_power')|float(0) - states('sensor.power_export')|float(0)) > 0 %} {{ ((states('sensor.emp1_power')|float(0)) - states('sensor.power_export')|float(0))|round(3) }} {% else %} {{ (states('sensor.power_import')|float(0) + states('sensor.emp1_power')|float(0))|round(3) }} {% endif %}) renders=1844902> all_states=False all_states_lifecycle=False domains=frozenset() domains_lifecycle=frozenset() entities=frozenset({'sensor.power_export', 'sensor.emp1_power'}) rate_limit=None has_time=False exception=None is_static=False>}>>>
Error while dispatching event for sensor.power_export to <Job track state_changed event {'sensor.power_export', 'sensor.emp1_power'} HassJobType.Callback <bound method TrackTemplateResultInfo._refresh of <TrackTemplateResultInfo {Template<template=({% if (states('sensor.power_export')|float(0)) > 0 and (states('sensor.emp1_power')|float(0) - states('sensor.power_export')|float(0)) < 0 %} {% elif (states('sensor.power_export')|float(0)) > 0 and (states('sensor.emp1_power')|float(0) - states('sensor.power_export')|float(0)) > 0 %} {{ ((states('sensor.emp1_power')|float(0)) - states('sensor.power_export')|float(0))|round(3) }} {% else %} {{ (states('sensor.power_import')|float(0) + states('sensor.emp1_power')|float(0))|round(3) }} {% endif %}) renders=1849644>: <RenderInfo Template<template=({% if (states('sensor.power_export')|float(0)) > 0 and (states('sensor.emp1_power')|float(0) - states('sensor.power_export')|float(0)) < 0 %} {% elif (states('sensor.power_export')|float(0)) > 0 and (states('sensor.emp1_power')|float(0) - states('sensor.power_export')|float(0)) > 0 %} {{ ((states('sensor.emp1_power')|float(0)) - states('sensor.power_export')|float(0))|round(3) }} {% else %} {{ (states('sensor.power_import')|float(0) + states('sensor.emp1_power')|float(0))|round(3) }} {% endif %}) renders=1849644> all_states=False all_states_lifecycle=False domains=frozenset() domains_lifecycle=frozenset() entities=frozenset({'sensor.power_export', 'sensor.emp1_power'}) rate_limit=None has_time=False exception=None is_static=False>}>>>
....
ValueError: Sensor sensor.power_consumption has device class 'None', state class 'None' unit 'W' and suggested precision 'None' thus indicating it has a numeric value; however, it has the non-numeric value: '' (<class 'str'>)

i understand it must be something that template sensor is expecting numeric values, due to configuration variables set in template sensor or not. In my case is must be unit_of_measurement: 'W'. As this happen randomly, i assume one of the states, or templatesensore state are not present or “null” in some cases, what bashes my template sensor calc…

i have read many post about that, but solution is mostly, simply to delete “unit_of_measurement: ‘W’” variable (or “state_class” what i do not have set) , but i do not unsterstand that configuration variables and wehat they are for, as described here Template - Home Assistant

i understand that unit_of_measurement: 'W' and others like state_class are forcing sensor to except numeric values only… but what will happen when i will delete my unit_of_measurement: 'W'?
it will not “just” prevent any error message only?
i have read something about history states, beeing then without unit… what would be anoing for me… i often take a look in my histories graphs…
but my most important question is: what happen with the calculation of the temp sensor(s)? i woul assume that all vaues will be not an numeric anymore? will it be then a string with ="", how can it be used for further calculation in other template sensors? so how the deleten of unit_of_measurement: 'W' will solve the problem, without creating new props?

And what about the history states. They will not show a unit any longer? And will it affect influxdb measurements too? as i remember they depends mostly on a unit being devilvered by homeassistant recorder (or what ever is filling influx). im using influx integration in hassio on a rasp4…

and i´m using utility-meter as well, will it have have any effect here too?

as this prob only happens in some special cases, wouldn´t it possible to expand the template sensor, to force a "non-numeric “result” like non-numeric value: '' => into a numeric = 0 instead (as i thought float(0) is doing)?

so before i simply delete the variable unit_of_measurement: in my template sensor, i would like to understand what will be the effects? can somebody pls explain me? thank you in advance
br Frank

here a extract of my template sensors im using

## template sensor START
  - platform: template
    sensors:
      # Template sensor for values of power import (active_power > 0)
      power_import:
        friendly_name: "Power Import"
        unit_of_measurement: 'W'
        value_template: >-
          {% if (states('sensor.l1_power')|float(0) + states('sensor.l2_power')|float(0) + states('sensor.l3_power')|float(0)) > 0 %}
            {{ (states('sensor.l1_power')|float(0) + states('sensor.l2_power')|float(0)+ states('sensor.l3_power')|float(0))|round(4) }}
          {% else %}
            {{ 0 }}
          {% endif %}
        availability_template: "{{
            [ states('sensor.l1_power'),
              states('sensor.l2_power'),
              states('sensor.l3_power')
            ] | map('is_number') | min
          }}"

      # Template sensor for values of power export (active_power < 0)
      power_export:
        friendly_name: "Power Export"
        unit_of_measurement: 'W'
        value_template: >-
          {% if (states('sensor.l1_power')|float(0)+ states('sensor.l2_power')|float(0)+ states('sensor.l3_power')|float(0)) < 0 %}
            {{ ((states('sensor.l1_power')|float(0)+ states('sensor.l2_power')|float(0)+ states('sensor.l3_power')|float(0)) * -1)|round(4)}}
          {% else %}
            {{ 0 }}
          {% endif %}
        availability_template: "{{
            [ states('sensor.l1_power'),
              states('sensor.l2_power'),
              states('sensor.l3_power')
            ] | map('is_number') | min
          }}"

      # Template sensor for values of power export (active_power < 0, but inverted for visualising)
      power_export_negative:
        friendly_name: "Power Export (negative)"
        unit_of_measurement: 'W'
        value_template: "{{ states('sensor.power_export')|float(0) * -1 }}"

      # Template sensor for values of power consumption (negative trimmed, only positive values: realverbrauch des Hauses, aber ohne Exportüberschuss, also was bezahlt werden muss)
      power_consumption:
        friendly_name: "Power Consumption"
        unit_of_measurement: 'W'
        value_template: >-
          {% if (states('sensor.power_export')|float(0)) > 0 and (states('sensor.emp1_power')|float(0) - states('sensor.power_export')|float(0)) < 0 %}
          {% elif (states('sensor.power_export')|float(0)) > 0 and (states('sensor.emp1_power')|float(0) - states('sensor.power_export')|float(0)) > 0 %}
            {{ ((states('sensor.emp1_power')|float(0)) - states('sensor.power_export')|float(0))|round(3) }}    
          {% else %}
            {{ (states('sensor.power_import')|float(0) + states('sensor.emp1_power')|float(0))|round(3) }}
          {% endif %}

      # Template sensor for values of power consumption (real postive and negative; komplett 3Phasen gemessen; real)
      power_consumption_real:
        friendly_name: "Power Consumption (real)"
        unit_of_measurement: 'W'
        value_template: "{{ (states('sensor.l1_power')|float(0)+ states('sensor.l2_power')|float(0)+ states('sensor.l3_power')|float(0))|round(3) }}"

another error (or warning message) but the similar problem? i have those sometimes in my logs, but don´t understand the reason?

Logger: homeassistant.components.sensor.recorder
Source: components/sensor/recorder.py:405
Integration: Sensor (documentation, issues)
First occurred: 15:10:11 (1 occurrences)
Last logged: 15:10:11

The unit of sensor.device_30_energy_consumption_daily (None) cannot be converted to the unit of previously compiled statistics (kWh). Generation of long term statistics will be suppressed unless the unit changes back to kWh or a compatible unit. Go to https://my.home-assistant.io/redirect/developer_statistics to fix this

For your sensor.power_consumption config, you don’t have anything between the if and elif statements, so the sensor attempts to write '' to the state.

Do you want the value of the sensor to remain unchanged in that condition? If so, use this.state

thank you for your answer @mekaneck
as i´m not a native english speaker, i had misunderstood your short answer by a couple of readings and i was nearly about to write that i abslotutely don´t understand what do you mean. But at the end it took me a while to understand, the part “between if end elif i don´t have anything”…

would you be so kind to confirm my correction? have i written this correctly?

      # Template sensor for values of power consumption (negative trimmed, only positive values: realverbrauch des Hauses, aber ohne Exportüberschuss, also was bezahlt werden muss)
      power_consumption:
        friendly_name: "Power Consumption"
        unit_of_measurement: 'W'
        value_template: >-
          {% if (states('sensor.power_export')|float(0)) > 0 and (states('sensor.emp1_power')|float(0) - states('sensor.power_export')|float(0)) < 0 %}
            {{ this.state }}
          {% elif (states('sensor.power_export')|float(0)) > 0 and (states('sensor.emp1_power')|float(0) - states('sensor.power_export')|float(0)) > 0 %}
            {{ ((states('sensor.emp1_power')|float(0)) - states('sensor.power_export')|float(0))|round(3) }}    
          {% else %}
            {{ (states('sensor.power_import')|float(0) + states('sensor.emp1_power')|float(0))|round(3) }}
          {% endif %}

i did not find any documentation or explanation about this.state? what exactly does it mean in my template sensor? does it mean, the template sensor power_consumption will stay at its last “known” state?

There’s not much on self-referencing, here is just a small paragraph on using it on the template sensor page.

Edit: also this more helpful paragraph.

If you’re familiar with the state object in HA, this is simply the state object of the sensor that this is used in. If you want to know more about the state object, see this link.

So you can access all sorts of things in the this state object, like:
this.state
this.entity_id
this.last_updated
this.attributes.some_attribute_that_is_defined_in_this_template_sensor
this.attributes['some attribute that has spaces in the name']

So, yes, using this.state means that the new value of the template sensor will be set to equal the current value of the template sensor.

And just for some additional knowledge: In automations (and trigger-based template sensors) there is a trigger object also, and if you use a state trigger, the trigger object will have trigger.to_state and trigger.from_state which are also state objects that can be accessed in the same way. So if you want to use the new state of an entity that triggered some automation, you can use trigger.to_state.state

1 Like

@mekaneck Rick, thank you verymuch for your detailed explanations, and sorry for late reply (i hadn´t received any emails for notification till yet and i´m logging in rarely…)

:thinking: it´s shard to find a documentation when you have to search for term “this” only?:rofl: so thank you for pointing me to the paragrahps! :grin:but btw. without your explanations i hadn´t imagined the sense of using it! so double thanx :grin::grin:

i wasn´t aware of both trigger state objects… .to_state and .from_state? But honestly i don´t understand the sence of using it? So i might never had used an automation that changes the state of the Entity_ID that this trigger is observing? But good to know! :+1:

br Frank