Transformation de variable dans home assistant (fonction de calibration de sonde température)

Bonjour à tous et merci de prendre le temps de me lire :slight_smile:

Mon problème

Je fais remonter des données de température dans Home Assistant via MQTT. J’utilise pour cela des ESP sur lesquels j’ai branché des capteurs de température (des HTU21D). Je les ai configurés sous ESPeasy.

J’ai pris le temps d’utiliser du matos pro en faisant des points à différentes températures pour pouvoir calibrer mes capteurs en utilisant une fonction polynomiale de correction.
J’ai donc calculé une fonction de correction pour chacun de mes capteurs. Je voudrais transformer dans Home Assistant, la valeur donnée par mes capteurs en utilisant les fonctions de corrections. Ça fait un petit moment que je cherche comment faire mais je n’ai pas trouvé.

Mes excuses si c’est un truc bateau mais j’avoue que je ne sais pas trop où chercher l’info.

Ma configuration


[center]## System Information

version core-2024.2.1
installation_type Home Assistant Supervised
dev false
hassio true
docker true
user root
virtualenv false
python_version 3.12.1
os_name Linux
os_version 5.10.0-28-amd64
arch x86_64
timezone Europe/Paris
config_dir /config
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 Debian GNU/Linux 11 (bullseye)
update_channel stable
supervisor_version supervisor-2024.01.1
agent_version 1.6.0
docker_version 25.0.3
disk_total 108.5 GB
disk_used 8.8 GB
healthy true
supported true
supervisor_api ok
version_api ok
installed_addons Mosquitto broker (6.4.0), Grafana (9.1.3), File editor (5.8.0), Node-RED (17.0.6), Samba share (12.3.0), InfluxDB (5.0.0), ESPHome (2023.12.9)
Dashboards
dashboards 2
resources 0
views 1
mode storage
Recorder
oldest_recorder_run 10 février 2024 à 18:08
current_recorder_run 17 février 2024 à 15:58
estimated_db_size 41.24 MiB
database_engine sqlite
database_version 3.44.2
[/center] ___

Salut @brisfan

Si tu veux le faire sur HA, je pense qu’il faut que tu regardes ça :

Après faudra voir si ta fonction est facilement transposable en « jinja2 » :wink:

[EDIT] Un exemple chez moi, avec une template trouver sur ce forum pour calculer la t° ressentie en fonctions d’autres entités :

    - name: "Température Ressentie"
      unique_id: temperature_ressentie
      device_class: temperature
      state_class: measurement               
      state: >
        {% set t = states('sensor.org_exterieur_temperature') | float(0) %}
        {% set v = state_attr('weather.saint_philbert_sur_boissey', 'wind_speed') | float(0) %}
        {% set h = states('sensor.org_exterieur_humidity') | float(0) %}
        {% if t <= 10 and v >= 5 %}  
          {{ (13.12 + (0.6215 * t) + (((0.3965 * t) - 11.37) * v**0.16)) | round (1) }}
        {% elif t<= 10 and v <5 %}
          {{ ( t + 0.2 * ( 0.1345 * t - 1.59 ) * v ) | round (1) }}
        {% elif t >= 27 and h >= 40 %}
          {{ ( -8.785 + 1.611*t + 2.339*h - 0.146*t*h - 1.231e-2*t**2 - 1.642e-2*h**2 + 2.212e-3*t**2*h + 7.255e-4*t*h**2 - 3.582e-6*t**2*h**2 ) | round (1) }}  
        {% else %}
          100
        {% endif %}        
      icon: mdi:thermometer
      unit_of_measurement: "°C"

Merci beaucoup, avec tes conseils et le lien que tu m’as donné j’ai réussi à trouver.

Pour aider la communauté voici ce que j’ai fais :

Voilà la formule sous excel (petit clic droit sur l’étiquette de l’équation de la courbe de tendance « format d’étiquette de courbe de tendance » mettre en « nombre » avec autant de décimales que requis).

y = x - 0,00000001200776592549x6 - 0,00000173161883216629x5 + 0,00009617978844107100x4 - 0,00258084042210579000x3 + 0,03408689169796800000x2 - 0,18768840826708700000x + 0,84620761937344500000

Dans un fichier texte faire un rechercher/remplacer et :

  • remplacer les , par des .
  • remplacer les ^par des ** (double étoile)
  • remplacer le x par votre variable

J’ai ajouté un petit |round(1, ‹ common ›) pour arrondir à la première décimale. Pensez a mettre votre équation entre parenthèses, sinon ça ne marche pas.

Voilà ce que ça donne dans mon fichier de config de home assistant :

template:
  - sensor:
      - name: "temp1_rect"
        unit_of_measurement: "°C"
        state: >
          {% set C1 = states('sensor.mqtt_tempsensor_1') | float %}
          {{(C1 - 0.00000001200776592549*C1**6 - 0.00000173161883216629*C1**5 + 0.00009617978844107100*C1**4 - 0.00258084042210579000*C1**3 + 0.03408689169796800000*C1**2 - 0.18768840826708700000*C1** + 0.84620761937344500000)|round(1, 'common')}}
          

S’il y a des motivés je peux faire un petit tuto pour faire les calculs de calibration des sondes que vous mettez sur vos ESP histoire d’avoir une température précise.
:slight_smile:

1 « J'aime »

Salut,
je t’es piquer le template pour tester.
ce matin qui fesait en dessous de 10°C c’est bon, mais passer 10°C ca me donne 100.
dans le template entre 11 et 26°C ca donnera 100 ?
Une explication de ce template ?

Salut @WarC0zes ,

Je suis pas chez moi tout de suite :wink:

J’essaie de répondre en rentrant.

1 « J'aime »

J’ai compris, j’ai retouver le post original.
j’ai adapter, pour avoir une température si rien entre 10 et 27.

        {% set t = states('sensor.temperature_humidity_sensor_exterieur_av_temperature') | float(0) %}
        {% set v = state_attr('weather.saint_xxxxxx', 'wind_speed') | float(0) %}
        {% set h = states('sensor.temperature_humidity_sensor_exterieur_av_humidity') | float(0) %}
        {% if t <= 10 and v >= 5 %}  
          {{ (13.12 + (0.6215 * t) + (((0.3965 * t) - 11.37) * v**0.16)) | round (1) }}
        {% elif t <= 10 and v <5 %}
          {{ ( t + 0.2 * ( 0.1345 * t - 1.59 ) * v ) | round (1) }}
        {% elif t >= 27 and h >= 40 %}
          {{ ( -8.785 + 1.611*t + 2.339*h - 0.146*t*h - 1.231e-2*t**2 - 1.642e-2*h**2 + 2.212e-3*t**2*h + 7.255e-4*t*h**2 - 3.582e-6*t**2*h**2 ) | round (1) }}  
        {% else %}
          {{ t }}
        {% endif %} 

au final , ca fais température ressentie en hiver et chaleur ressentie en été, sinon vrai température.

Ouais, c’est exactement ça.

Chez moi, j’affiche cette simple carte sur mon dashboard :

image

La température ressentie étant celle grisée, je suis parti sur deux cartes conditionnelles, selon que la valeur est égale à 100° ou non.

1 « J'aime »

En fait c’est normal le polynome que tu as dans ce post est un polynome de calibration calculé pour mon capteur entre 2 et 38°C à partir de mesures en milieu controllé.
En dehors de ces valeur ça donne n’importe quoi c’est normal.
Si tu veux utiliser un polynome de correction il faut calculer le tien pour tes propres capteurs.