Affichage + MQTT + yaml

Mon problème

Bonjour,

J’affiche dans une carte des informations transmises par MQTT.

Le message MQTT comporte plusieurs éléments. Ils ne sont pas tous forcément présents en même temps. En fait je n’envoie pas les informations dont la valeur n’a pas changé au cours d’un cycle ( push des informations toutes les minutes).

Voici un exemple de message :

 
Écouter
/chaudiere_viessmann/etat
 
Message 0 reçu sur /chaudiere_viessmann/etat à 10:42 :
{
    "infos_chaudiere_consigne_temperature_reduit": "18",
    "infos_chaudiere_consigne_temperature_party": "20",
    "infos_chaudiere_regime_eco": "False",
    "infos_chaudiere_mode": "2",
    "infos_chaudiere_temp_ambiante": "19.2",
    "infos_chaudiere_regime_party": "False",
    "infos_chaudiere_consigne_temperature_normale": "19",
    "infos_chaudiere_temp_sonde": "13.7",
    "infos_chaudiere_consommation_jour_chauffage": "10",
    "infos_chaudiere_temps_fonctionnement": "0",
    "infos_chaudiere_temp_fumees": "26",
    "infos_chaudiere_temp_ecs": "45",
    "infos_chaudiere_consigne_temperature_eau_chaude": "50",
    "infos_chaudiere_temp_corps": "25",
    "infos_chaudiere_consommation_jour_eau_chaude": "2",
    "infos_chaudiere_date": "Lun 25/04/2022 10:41:46",
    "infos_chaudiere_puissance": "0.0"
}


Voici un message reçu, il ne comporte que les infos qui ont changé depuis l'appel précédent

Message 1 reçu sur /chaudiere_viessmann/etat à 10:43 :
{
    "infos_chaudiere_temp_sonde": "13.8",
    "infos_chaudiere_date": "Lun 25/04/2022 10:42:44"
}

Voici la description yaml des données MQTT


  - platform: mqtt
    name: infos_chaudiere_temp_ambiante
    state_topic: "/chaudiere_viessmann/etat"
    value_template: |-
      {% if value_json.infos_chaudiere_temp_ambiante is defined %}
        {{value_json.infos_chaudiere_temp_ambiante}}
      {% else %}
        {{ states(entity_id)}}
      {% endif %}
    json_attributes_topic: "/chaudiere_viessmann/etat"
    device_class: temperature
    state_class: measurement
    unit_of_measurement: °C
    icon: mdi:thermometer

  - platform: mqtt
    name: infos_chaudiere_date
    state_topic: "/chaudiere_viessmann/etat"
    value_template: '{{value_json.infos_chaudiere_date}}'
    json_attributes_topic: "/chaudiere_viessmann/etat"
    icon: mdi:calendar


J’ai défini ( un peu à l’arrache) du code pour afficher la valeur de l’entité si elle n’est pas présente dans le message reçu.

Le problème constaté, lors de l’affichage du deuxième message, les données présentes à l’écran sont vides.

Voici trois captures d’écran pour montrer ce qui s epasse à l’affichage.

Affichage de la valeur reçue, OK !

La donnée qui n’est pas transmise dans le message n’est pas affichée à l’écran.

Si je demande le détail de l’entité la valeur reçue est bien mémorisée, même si elle ne s’affiche pas !

Si quelqu’un peut m’aiguiller vers la bonne piste ?

Ma configuration


[center]
System Health

version: core-2022.4.7
installation_type: Home Assistant OS
dev: false
hassio: true
docker: true
user: root
virtualenv: false
python_version: 3.9.9
os_name: Linux
os_version: 5.10.103-v8
arch: aarch64
timezone: Europe/Paris

GitHub API: ok
GitHub Content: ok
GitHub Web: ok
GitHub API Calls Remaining: 5000
Installed Version: 1.24.0
Stage: running
Available Repositories: 1023
Downloaded Repositories: 13

logged_in: false
can_reach_cert_server: ok
can_reach_cloud_auth: ok
can_reach_cloud: ok

host_os: Home Assistant OS 7.6
update_channel: stable
supervisor_version: supervisor-2022.04.0
docker_version: 20.10.9
disk_total: 237.7 GB
disk_used: 11.4 GB
healthy: true
supported: true
board: rpi4-64
supervisor_api: ok
version_api: ok
installed_addons: Samba share (9.5.1), File editor (5.3.3), Duck DNS (1.14.0), SSH & Web Terminal (10.1.1), Mosquitto broker (6.0.1), Node-RED (11.1.1), Z-Wave JS (0.1.57), SQLite Web (3.3.0), InfluxDB (4.4.1), Grafana (7.5.2)

dashboards: 14
resources: 10
views: 37
mode: storage
[/center]


Bonjour,

J’ai une PAC Viessmann aussi (même si ça n’apporte rien au sujet), j’envoi chaque valeur sur des topics dédiés.
Ca vient du fait que je faisais déjà comme ça avant HA, car je n’avais pas bcp de possibilités en MQTT avant.
Ca marche sans problèmes.

Ta façon de faire permet plus de choses avec des sensors plus complexes avec des attributs en plus d’un état, mais si ton but c’est de mettre à jour l’état de sensors pour chaque valeur passée. Pas forcément besoin de faire trop compliqué.

Pour ton souci, je dirais:
Dans ton sensor « infos_chaudiere_temp_ambiante » il y a surement un souci dans la logique du value_template, le « else » n’est surement pas bon. Que se passerait-il si tu ne mettais pas du tout de « else »?

Aussi je ne crois pas que tu ais besoin du « json_attributes_topic » vu que tu ne vas chercher aucun autre attribut. Et c’est même possible que ce soit aussi un cause de problèmes (voir la doc MQTT Sensor sur cette variable).

Juste pour ref mes sensors MQTT de la PAC: 1 / Sensor / Valeur/ Topic

  - platform: mqtt
    name: "PAC Puissance Consommee"
    state_topic: "PAC/puissance_consommee"
    unit_of_measurement: "W"
    device_class: power
    force_update: true
  - platform: mqtt
    name: "PAC Puissance Chauffage"
    state_topic: "PAC/puissance_chauffage"
    unit_of_measurement: "W"
    device_class: power
    force_update: true
  - platform: mqtt
    name: "PAC Temperature Depart"
    state_topic: "PAC/temp_depart"
    unit_of_measurement: "°C"
    device_class: temperature
  - platform: mqtt
    name: "PAC Temperature Consigne"
    state_topic: "PAC/temp_normale"
    unit_of_measurement: "°C"
    device_class: temperature
    force_update: true
  - platform: mqtt
    name: "PAC Heures Compresseurs"
    state_topic: "PAC/heures_comp"
    force_update: true
  - platform: mqtt
    name: "PAC Heures Appoint 1"
    state_topic: "PAC/heures_appoint1"
    force_update: true
  - platform: mqtt
    name: "PAC Heures Appoint 2"
    state_topic: "PAC/heures_appoint2"
    force_update: true
  - platform: mqtt
    name: "PAC Nombre de démarrages"
    state_topic: "PAC/demarrages"
    force_update: true
  - platform: mqtt
    name: "PAC en erreur"
    state_topic: "PAC/error"

Bonsoir,

Merci pour les infos.

je vais regarder cela de plus près.

Re,

j’ai fait pas mal de tests sans succès.
Si le message MQT ne comprend pas tous les attributs, alors les attributs manquants effacent ce qui est affiché à l’écran.

Une piste ?

Je trouve dommage de créer un topic par attribut !

J’ai essayé une solution avec la création de template sensors. Je récupère dans ces templates sensors la valeur du sensor mqtt. La valeur du template sensor n’est mise à jour que si le message mqtt contient l’attribut.
C’est un peu usine à gaz ! template !

J’ai consulté la page mqtt : C’est franchement peu clair !
Apparemment il est possible de faire des choses compliquées, mais aussi de faire très compliqué des choses simples !

Si vraiment c’est le cas, il va falloir soit tout envoyer tout le temps. Soit penser aux Topics dédiés, ce n’est pas vraiment un gros problème en soit en fait… de toutes façons côté config HA tu créera sûrement 1 sensor par valeur, donc dans HA ça ne change rien. Dans le MQTT, le brocker lui ça ne lui fait rien non plus, côté volume de données qui transitent c’est négligeable vu que visiblement tu vas envoyer des données partielles assez souvent.

Merci pour les infos.

Finalement (sous réserve de stabilité) j’ai réussi à traiter les messages que toutes les les données soient présentes ou partielles.

J’ai joué à la fois sur les sensors MQTT et sur les affichages lovelace.

Donc, je maintiens la solution d’envoi d’un seul topic comportant les valeurs qui ont changé entre deux envois. Cela me gonflait un peu de créer un topic par valeur.

Dans mqtt cela se présente ainsi :

  - platform: mqtt
    name: infos_chaudiere_temp_ambiante
    state_topic: "/chaudiere_viessmann/etat"
    value_template: >
      {% if value_json.infos_chaudiere_temp_ambiante is defined %}
        {{value_json.infos_chaudiere_temp_ambiante}}
      {% else %}
        {{states('sensor.infos_chaudiere_temp_ambiante')}}
      {% endif %}
    device_class: temperature
    state_class: measurement
    unit_of_measurement: °C
    icon: mdi:thermometer

Dans la carte lovelace cela se présente très simplement ainsi :

type: entities
title: Températures
entities:
  - entity: sensor.infos_chaudiere_temp_ambiante
    name: Thermo. salon
    suffix: °C
  - entity: sensor.infos_chaudiere_temp_sonde
    name: Sonde
    suffix: °C
  - entity: sensor.universal_binary_sensor_air_temperature_6
    name: Extérieur
  - entity: sensor.infos_chaudiere_temp_ecs
    name: ECS
    suffix: °C
  - entity: sensor.infos_chaudiere_temp_corps
    name: Corps
    icon: mdi:thermometer
    suffix: °C
  - entity: sensor.infos_chaudiere_temp_fumees
    name: Fumées
    suffix: °C

J’ai ôté dans l’affichage tout ce que j’avais indiqué avec un type attribut. peut-être que le problème venait de là.

Bonne soirée.
A+
Bernard

Ah ben donc du coup c’était bien ce que je disais dans mon premier post. :wink:

En quelque sorte ! Merci pour l’aide.

C’est dommage que je n’ai pas trouvé d’explications pour traiter correctement les attributs, comme indiqué dans la doc!

L’essentiel est que cela fonctionne.

A+
Bernard