Affichage de la consommation d'eau dans "Energie" du tableau de bord depuis un compteur KNX

Mon problème

Bonjour,
J’ai pu afficher dans le tableau de bord « Energie » les consommations d’électricité et de gaz depuis des index stockés dans des compteurs knx mais je bloque pour l’affichage de la consommation d’eau.

Le problème est lié à device_class water non supportée alors qu’elle est mentionnée dans cette documentation

knx.yaml

 sensor:
#Compteur elec 
  - name: compteur_elec
    state_address: "9/7/0"
    type: "active_energy"

#Compteur gaz 
  - name: compteur_gaz3
    state_address: "9/7/1"
    type: "volume"

#Compteur eau (m3)
  - name: compteur_eau_p
    state_address: "9/7/3"
    type: "volume


configuration.yaml
template:
  - sensor:
    - name: gaz2
      unit_of_measurement: "m³"
      state_class: total_increasing
      device_class: gas
      state: "{{states('sensor.compteur_gaz3') | multiply(1.000) }}"

    - name: eau
      unit_of_measurement: "L"
      state_class: total_increasing
      device_class:  water
      state: "{{states('sensor.compteur_eau_p') | multiply(0.001) }}"

Un message d’erreur s’affiche pour la ligne device_class : water

Value is not accepted. Valid values: « apparent_power », « aqi », « battery », « carbon_dioxide », « carbon_monoxide », « current », « date », « duration », « energy », « frequency », « gas », « humidity », « illuminance », « monetary », « nitrogen_dioxide », « nitrogen_monoxide », « nitrous_oxide », « ozone », « pm1 », « pm10 », « pm25 », « power », « power_factor », « pressure », « signal_strength », « sulphur_dioxide », « temperature », « timestamp », « volatile_organic_compounds », « voltage »

Ma configuration


Home Assistant 2022.11.5 (VM proxmox sur NUC)
Supervisor 2022.11.2
Operating System 9.3
Interface utilisateur : 20221108.0 - latest


Salut,

C’est pas lié à ta config knx sur laquelle il manque une " ?
image
Et moins certain, tu as 2 espaces là
image

le " est bien dans le fichier knx ; c’est un loupé du copier/coller du code sur le forum !

1 « J'aime »

Donc regarde le double espaces dans ce cas.
Techniquement ça semble OK, un exemple ici intégrable dans le dashboard energy


ça y ressemble fort

Les doubles espaces ne passent pas dans knx comme dans le template sensor.

Sur cette copie d’écran on voit la valeur de l’index qui remonte bien dans l’entité associée au compteur knx mais c’est « unavailable » dans le sensor.eau (template)

Et, de ce fait, c’est 0 pour le sensor.conso_eau a été créé via une entrée « Compteur de services publics » avec comme capteur d’entrée sensor.eau (eau du template)

Donc 'est bien pour ça qu’il faut virer celui de ta config …

As-tu vérifié la forme de ton template coté outils de dev ? On voit justement que tu as une valeur 800.0811
Tu n’a pas une erreur de type par exemple string multiplié par un float ?

Dans le code, il n’y a pas de double-espace devant water ; c’est le copier/coller qui en donne l’impression

Dans modele des outils de développement j’ai ceci mai rien sur mon template eau ?

{## Imitate available variables: ##}
{% set my_test_json = {
  "temperature": 25,
  "unit": "°C"
} %}

The temperature is {{ my_test_json.temperature }} {{ my_test_json.unit }}.

{% if is_state("sun.sun", "above_horizon") -%}
  The sun rose {{ relative_time(states.sun.sun.last_changed) }} ago.
{%- else -%}
  The sun will rise at {{ as_timestamp(state_attr("sun.sun", "next_rising")) | timestamp_local }}.
{%- endif %}

For loop example getting entity values in the weather domain:

{% for state in states.weather -%}
  {%- if loop.first %}The {% elif loop.last %} and the {% else %}, the {% endif -%}
  {{ state.name | lower }} is {{state.state_with_unit}}
{%- endfor %}.

800.0811 c’est la valeur en m3 du knx

Pas qu’une impression, le doublon est bien là
image
Mais bon on va dire que c’est pas ça DANS ta config

Normal c’est à toi d’écrire le truc…
Simple copié/collé comme le contenu du template

{{states('sensor.compteur_eau_p') | multiply(0.001) }}

Oui ça c’est clair. Ce qui l’est moins c’est le format qu’utilise HA dans ce cas pour stocker la valeur .
Si c’est une chaine (string), ça peux poser problème de mélanger lors de ta division avec un nombre à virgule (float)
D’ailleurs, naturellement moi, soit je divise par 0.0001 ou je multiplie par 1000 pour convertir des m3 en litres…

Dans les messages précédents, j’ai utilisé l’option Paramètres/ teste préformaté de l’éditeur de message pour copier/coller le code. Voici en collant directement ; il n’y a pas de double espace

  • name: eau
    unit_of_measurement: « L »
    state_class: total_increasing
    device_class: water
    state: « {{states(‹ sensor.compteur_eau_p ›) | multiply(0.001) }} »

Je n’avais jamais utilisé l’outil des templates !

Oui… c’est pas un interpréteur YAML mais un pour le JINJA (comme le message à propos de la doc le confirme)
Donc il faut seulement coller la ligne du ‹ calcul ›… CF mon message précédent
Un exemple qui traine chez moi


Et là aussi tu as une erreur

Donc la valeur issue de KNX n’est pas bonne à mon avis

Tu as raison concernant le format

Pour l’instant je laisse tomber la conversion

J’ai redémarré HA

J’ai créé un entrée Conso eau3 de type « Compteur de sevices publics » avec comme capteur d’entrée sensor.eau

Lorsque je veux ajouter une source, Conso eau 3 n’est pas proposé

Moi je mettrais un truc du genre
{{states('sensor.compteur_eau_p') | float(0) * 1000 |int(0) }}
Mais avant il faut trouver pourquoi sensor.compteur_eau_p ne remonte rien

Normal, c’est pas typé !

      unit_of_measurement: "L"
      state_class: total_increasing
      device_class:  water

Mais c’est pas ça le souci…

Le souci c’est la valeur du KNX.
Si sensor.compteur_eau_p ne remonte pas un chiffre (ou une chaine de caractères qui y ressemble) tu pourras toujours essayer de transformer, ça ne donnera rien de plus que ce que tu as déjà maintenant

ça c’est pas normal

Et c’est pas cohérant avec ça (plus vieux)


Il devrait y avoir le 800 dans les 2 cas

J’ai avancé un peu en créant dans mon module logique knx une conversion de données le volume en m3 (DPT 14.076) est converti en litres (DPT 12.1200).
knx.yaml

#Compteur eau (litres)
  - name: compteur_eau2_litres
    state_address: "9/7/12"
    type: "volume_liquid_litre"

configuration.yaml

- name: eaulitres
      unit_of_measurement: "L"
      state_class: total_increasing
      device_class: water
      state: "{{states('sensor.compteur_eau2_litres') }}"

Je récupère dans « eaulitres » l’index du compteur en litres

J"ai créé une entrée « Conso eau litres2 » de type « Compteur de services publics » avec comme capteur d’entrée eaulitres

Lorsque je veux ajouter une source, Conso eau litres2 n’est pas proposé.

Attention, l’indentation normale d’un yaml c’est 2 espaces, pas 6…

Ok donc là on a 1 int ou un string, mais la valeur est là on dirait

Super mais tu ne partages pas sa config, donc je ne peux rien dire.
Enfin si ,on voit une notion de cron dans l’écran un peu plus bas et que c’est pas bien courant. Et en plus il manque sa device_class: water
Et comme tout à l’heure, tu as valeur unknown à la place du state.

Donc Normal que ça ne marche pas pour moi… HA ne sait même pas que c’est de l’eau…

ça je connais pas…

du coup, ça démontre quoi ton exemple ? Très résumé, de mon point de vue : tu as refait (avec les mêmes erreurs) la même chose que ce qui ne marchait déjà pas avant…

La différence c’est que j’ai déjà une valeur de l’index eau knx qui remonte dans un sensor HA !

configuration.yaml (complet)

homeassistant:
  packages: !include_dir_named knx

template:
  - sensor:
    - name: gaz2
      unit_of_measurement: "m³"
      state_class: total_increasing
      device_class: gas
      state: "{{states('sensor.compteur_gaz3') | multiply(1.000) }}"

    - name: eaulitres
      unit_of_measurement: "L"
      state_class: total_increasing
      device_class: water
      state: "{{states('sensor.compteur_eau2_litres') }}"

 

  # Loads default set of integrations. Do not remove.
default_config:

# Load frontend themes from the themes folder
frontend:
  themes: !include_dir_merge_named themes

# Text to speech
tts:
  - platform: google_translate

automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml

C’est ce qui permet à partir d’un sensor d’avoir des compteurs heure, jour, semaine mois, année
HA fait les calculs et stocke les valeurs

OK donc tu ne fais pas un truc en YAML mais un truc via l’interface. C’est un détail important.
Tu l’alimentes avec quoi ?

EDIT : ça sent le bug


alors qu’index à la base c’est bien quelque chose…

ça vaudrait le coup de le faire manuellement, mais là je découvre

En yaml il y a ce que j’ai mis dans le knx et dans le configuration.yaml

Dans ton exemple on voit que tu utilises une intégration veolia
Dans mon cas les index sont dans des compteurs knx

  1. Pour l’électricité c’est pris en compte directement car il dispose du type « active_energy » (je suppose)
    knx.yaml
#Compteur elec 
  - name: compteur_elec
    state_address: "9/7/0"
    type: "active_energy"

ensuite depuis Paramètres/Appareils et services/Entrées , je créé une nouvelle entrée « Conso elec" de type "Compteur de services publics » avec comme capteur d’entrée sensor.compteur_elec

  1. Pour le gaz
    knx.yaml
#Compteur gaz 
  - name: compteur_gaz3
    state_address: "9/7/1"
    type: "volume"

pas de type gas
donc passage par un template dans le configuration .yaml

template:
  - sensor:
    - name: gaz2
      unit_of_measurement: "m³"
      state_class: total_increasing
      device_class: gas
      state: "{{states('sensor.compteur_gaz3') | multiply(1.000) }}"

ensuite depuis Paramètres/Appareils et services/Entrées , je créé une nouvelle entrée « gaz2" de type "Compteur de services publics » avec comme capteur d’entrée sensor.gaz2

  1. Pour l’eau, voir mon message précédent mais c’est le même principe que pour le gaz sauf que j’ai un message d’erreur indiquant que la device-class : water n’est pas acceptée

C’est pas fondamental, j’ai comme toi une valeur numérique dans son état.

Tout à fait

Par ailleurs, j’ai refait la même chose ici (en plus de faire un utility_meter (c’est le nom des compteurs publique ) et ça donne exactement la même chose que via l’ui

utility_meter:
  veolia3:
    source: sensor.veolia_last_index
    name: veolia3
    cycle: daily

J’ai l’impression qu’il y a plusieurs anomalies et que c’est techniquement coincé

  • L’utility meter n’hérite pas de l’infos device_class quand il est crée (via l’ui ou en yaml)
  • Le calcul de la valeur de l’utility meter ne fonctionne pas
  • Le sensor template (une alternative officielle) n’accepte pas les device_class: water

D’ailleurs il y a 1 an, tu avais presque les mêmes questions