Dernière valeur non nulle ou égale à 0

Mon problème

Bonjour

J’ai un capteur qui affiche le kilométrage de ma voiture électrique (Intégration Hyundai / Kya connect). Ce capteur repasse à « 0 » lorsque le contact est coupé sur ma voiture

Capture d’écran 2024-03-18 à 20.03.27

Je voudrais avoir la dernière valeur avant qu’elle ne repasse à 0. Pour cela j’ai tenter de créer 1 capteur qui essaye de récupérer la dernière valeur non nulle. Je n’ai rien inventé c’est Open AI qui me l’a proposé :innocent:

sensor:
  - platform: template
    sensors:
      last_non_null_kona_odometer:
        friendly_name: "Dernière valeur non nulle kona odometer"
        value_template: >
          {% set last_non_null = states('sensor.kona_odometer') %}
          {% for state in states.sensor %}
            {% if state.entity_id == 'sensor.kona_odometer' %}
              {% continue %}
            {% endif %}
            {% if state.state != 'unknown' %}
              {% set last_non_null = state.state %}
            {% endif %}
          {% endfor %}
          {{ last_non_null }}

Le capteur est bien créée, mais il remonte la même chose que le capteur d’origine. Il repasse donc à 0

Capture d’écran 2024-03-18 à 21.13.16

Du coup je ne sais pas comment faire. Mais je suis sur que les experts du coin vont me dire quoi faire :wink:

@+

JC

Ma configuration


[center]## System Information

version core-2024.3.1
installation_type Home Assistant OS
dev false
hassio true
docker true
user root
virtualenv false
python_version 3.12.2
os_name Linux
os_version 6.6.20-haos
arch x86_64
timezone Europe/Paris
config_dir /config
Home Assistant Community Store
GitHub API ok
GitHub Content ok
GitHub Web ok
GitHub API Calls Remaining 4972
Installed Version 1.34.0
Stage running
Available Repositories 1399
Downloaded Repositories 4
Home Assistant Cloud
logged_in false
can_reach_cert_server ok
can_reach_cloud_auth ok
can_reach_cloud ok
Home Assistant Supervisor
host_os Home Assistant OS 12.1
update_channel stable
supervisor_version supervisor-2024.03.0
agent_version 1.6.0
docker_version 24.0.7
disk_total 234.0 GB
disk_used 9.1 GB
healthy true
supported true
board generic-x86-64
supervisor_api ok
version_api ok
installed_addons Terminal & SSH (9.10.0), Z-Wave JS (0.4.5), Studio Code Server (5.15.0), Samba Backup (5.2.0), Mosquitto broker (6.4.0), ZeroTier One (0.18.0), InfluxDB (5.0.0), Grafana (9.2.0), File editor (5.8.0)
Dashboards
dashboards 6
resources 1
views 9
mode storage
Recorder
oldest_recorder_run 8 mars 2024 à 11:15
current_recorder_run 16 mars 2024 à 21:13
estimated_db_size 295.38 MiB
database_engine sqlite
database_version 3.44.2
Solcast PV Forecast
can_reach_server pending
used_requests 5
rooftop_site_count 1
[/center]

C’est peut-être bête, mais si tu crée un sensor qui prend le max de sensor.kona_odometer ?

1 « J'aime »

Merci @Gilles2 pour cette suggestion. Je teste ça demain
@+
JC

Re

Bon j’ai essayé ça

sensor:
  - platform: template
    sensors:
      max_value_kona_odometer:
        friendly_name: "Valeur maximale kona odometer"
        value_template: >
          {% set max_value = states('sensor.kona_odometer') %}
          {% for state in states.sensor %}
            {% if state.entity_id == 'sensor.kona_odometer' %}
              {% continue %}
            {% endif %}
            {% if state.state != 'unknown' %}
              {% set state_float = state.state | float %}
              {% if state_float > max_value | float %}
                {% set max_value = state_float %}
              {% endif %}
            {% endif %}
          {% endfor %}
          {{ max_value }}

Et c’est encore pire. Le capteur est « indisponible » et j’ai ça comme erreur dans les logs. On dirait qu’il n’aime pas l’instruction « float » ou que je l’utilise mal en tous cas

2024-03-20 18:16:01.806 ERROR (MainThread) [homeassistant.helpers.event] Error while processing template: Template<template=({% set max_value = states('sensor.kona_odometer') %} {% for state in states.sensor %}
  {% if state.entity_id == 'sensor.kona_odometer' %}
    {% continue %}
  {% endif %}
  {% if state.state != 'unknown' %}
    {% set state_float = state.state | float %}
    {% if state_float > max_value | float %}
      {% set max_value = state_float %}
    {% endif %}
  {% endif %}
{% endfor %} {{ max_value }}) renders=2>
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2037, in forgiving_float_filter
    return float(value)
           ^^^^^^^^^^^^
ValueError: could not convert string to float: 'Situation normale'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 573, in async_render
    render_result = _render_with_context(self.template, compiled, **kwargs)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2364, in _render_with_context
    return template.render(**kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/jinja2/environment.py", line 1301, in render
    self.environment.handle_exception()
  File "/usr/local/lib/python3.12/site-packages/jinja2/environment.py", line 936, in handle_exception
    raise rewrite_traceback_stack(source=source)
  File "<template>", line 6, in top-level template code
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2040, in forgiving_float_filter
    raise_no_default("float", value)
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 1668, in raise_no_default
    raise ValueError(
ValueError: Template error: float got invalid input 'Situation normale' when rendering template '{% set max_value = states('sensor.kona_odometer') %} {% for state in states.sensor %}
  {% if state.entity_id == 'sensor.kona_odometer' %}
    {% continue %}
  {% endif %}
  {% if state.state != 'unknown' %}
    {% set state_float = state.state | float %}
    {% if state_float > max_value | float %}
      {% set max_value = state_float %}
    {% endif %}
  {% endif %}
{% endfor %} {{ max_value }}' but no default was specified

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 699, in async_render_to_info
    render_info._result = self.async_render(
                          ^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 575, in async_render
    raise TemplateError(err) from err
homeassistant.exceptions.TemplateError: ValueError: Template error: float got invalid input 'Situation normale' when rendering template '{% set max_value = states('sensor.kona_odometer') %} {% for state in states.sensor %}
  {% if state.entity_id == 'sensor.kona_odometer' %}
    {% continue %}
  {% endif %}
  {% if state.state != 'unknown' %}
    {% set state_float = state.state | float %}
    {% if state_float > max_value | float %}
      {% set max_value = state_float %}
    {% endif %}
  {% endif %}
{% endfor %} {{ max_value }}' but no default was specified
2024-03-20 18:16:01.821 ERROR (MainThread) [homeassistant.components.template.template_entity] TemplateError('ValueError: Template error: float got invalid input 'Situation normale' when rendering template '{% set max_value = states('sensor.kona_odometer') %} {% for state in states.sensor %}
  {% if state.entity_id == 'sensor.kona_odometer' %}
    {% continue %}
  {% endif %}
  {% if state.state != 'unknown' %}
    {% set state_float = state.state | float %}
    {% if state_float > max_value | float %}
      {% set max_value = state_float %}
    {% endif %}
  {% endif %}
{% endfor %} {{ max_value }}' but no default was specified') while processing template 'Template<template=({% set max_value = states('sensor.kona_odometer') %} {% for state in states.sensor %}
  {% if state.entity_id == 'sensor.kona_odometer' %}
    {% continue %}
  {% endif %}
  {% if state.state != 'unknown' %}
    {% set state_float = state.state | float %}
    {% if state_float > max_value | float %}
      {% set max_value = state_float %}
    {% endif %}
  {% endif %}
{% endfor %} {{ max_value }}) renders=4>' for attribute '_attr_native_value' in entity 'sensor.max_value_kona_odometer'

La 1ère erreur semble indiqué que la valeur du capteur est de type « string ». Ce qui est étrange pour un nombre de km

Pour info, voici comment est définit le sensor dans l’integragtion

    SensorEntityDescription(
        key="_odometer",
        name="Odometer",
        icon="mdi:speedometer",
        native_unit_of_measurement=DYNAMIC_UNIT,
        device_class=SensorDeviceClass.DISTANCE,
        state_class=SensorStateClass.TOTAL_INCREASING,

Là je suis perdu.

JC

Salut,
pour l’erreur but no default was specified faut mettre float(0)

correction:

sensor:
  - platform: template
    sensors:
      max_value_kona_odometer:
        friendly_name: "Valeur maximale kona odometer"
        value_template: >
          {% set max_value = states('sensor.kona_odometer') %}
          {% for state in states.sensor %}
            {% if state.entity_id == 'sensor.kona_odometer' %}
              {% continue %}
            {% endif %}
            {% if state.state != 'unknown' %}
              {% set state_float = state.state | float(0) %}
              {% if state_float > max_value | float(0) %}
                {% set max_value = state_float %}
              {% endif %}
            {% endif %}
          {% endfor %}
          {{ max_value | float(0) }}

Salut,

C’est pas plus simple de passer pas un total_increasing ?

Merci @Pulpy-Luke
Je vais essayer ça
A suivre…
JC

Je pense qu’on doit pouvoir faire plus simple.
Peut-être en utilisant
Statistics - Home Assistant (home-assistant.io)
et en remontant la value_max de ton sensor sur une période assez longue à définir.

Bonsoir,

Je ne connais pas beaucoup Home Assistant et encore moins sa programmation.
Cependant, il doit y avoir moyen de créer une variable permanente dans Home Assistant.

Ensuite, on change sa valeur si la nouvelle valeur lui est supérieure…

Savez-vous où est enregistré l’historique et pouvez-vous y accéder, le modifier, le dupliquer et si oui travailler à partir de cette copie ?

Bon j’ai tester avec ça

sensor:
  - platform: template
    sensors:
      max_total_increasing_kona_odometer:
        friendly_name: "Valeur max total_increasing kona odometer"
        value_template: >
          {% set max_total_increasing = states('sensor.kona_odometer.attributes.total_increasing') %}
          {% for state in states.sensor %}
            {% if state.entity_id == 'sensor.kona_odometer' %}
              {% continue %}
            {% endif %}
            {% if state.attributes.total_increasing is defined %}
              {% set current_total_increasing = state.attributes.total_increasing %}
              {% if current_total_increasing > max_total_increasing %}
                {% set max_total_increasing = current_total_increasing %}
              {% endif %}
            {% endif %}
          {% endfor %}
          {{ max_total_increasing }}

Et ça ne fonctionne toujours pas.

image

Là non plus j’ai mis ça dans le fichier configuration.yaml

sensor:
  - platform: statistics
    name: "Statistics sensor kona odometer"
    unique_id: "statistics_kona_odometer"
    entity_id: sensor.kona_odometer
    state_characteristic: value_max
    sampling_size: 100

Et là le sensor n’est même pas créé

J’ai pourtant bien attendu une journée pour que ma voiture renvoie bien le kilométrage mais les sensors ne sont pas mis à jour

Aucune erreur dans le fichier log

Je cherche encore…

@+
JC

Je ne suis pas non plus un expert Home Assistant.

C’est justement ce que je cherche à faire mais sans succès :frowning:

Mais je ne désespère pas :slight_smile:

L’historique, en fait les différentes valeurs sont enregistrées dans un capteur. Et c’est à partir de ce capteur que je cherche à actualiser la valeur d’un nouveau capteur…

image

@+
JC

Question bête… tu as redémarré HA?

Oui oui ça j’y ai pensé :wink: J’ai même essayé le Rechargement Rapide et le Redémarrage de HA.

Mais tu as raison de le rappeler

Ah je progresse…

En enlevant

unique_id: "statistics_kona_odometer"

J’ai ça
image

Mais je ne peux pas le gérer depuis l’interface utilisateur
image

Mais ça avance :wink:

Bonjour,

Je doute sur le fait que l’historique soit physiquement dans le capteur, mais plus dans le « calculateur » du véhicule. Mais je chipote.

Si le véhicule n’est pas là, est-ce que home assistant à accès à l’historique de ce capteur ?
Si oui de quelle façon ?

Bonne nouvelle, je pense que le plus dûr est fait, car tu as maintenant une valeur qui représente en permanence le kilométrage de ton véhicule et ne se remet pas à zéro.

Et si tu enlèves les guillemets autour du nom après unique_id?

unique_id: statistics_kona_odometer

Par ailleurs, tu dois pouvoir rajouter un

precision: 1

Pour éviter d’avoir toutes les décimales.
Que cherches tu à faire lorsque tu as l’erreur que tu as copiée ?

1 « J'aime »

Salut

Merci pour le tuyau ça fonctionne maintenant :+1:

Justement enlever les décimales :slight_smile:

Merci pour toutes ces info qui m’ont aidé à solutionner mon pb

@+

JC

Salut

L’historique doit se trouvé dans la base de donnée et les valeurs sont bien dispo au niveau du capteur et visibles sur les graphes de visualisation de HA

Capture d’écran 2024-03-22 à 18.49.16

Peut importe la localisation du véhicule, les infos sont remontées dans HA via l’intégration Hyundai / Kia Connect qui communique avec l’appli Bleulink de Hyundai

@+

JC

Bonne nouvelle, et bravo pour ta persévérence.

Si le véhicule est connecté, effectivement, peu importe où il se trouve.
C’était juste pour savoir s’il était possible de rapatrier localement les data, pour les formater à votre besoin et les exploiter ensuite.