Correctif avertissement Home Assistant : WS command recorder avec routeur en V9.01 - f4ame - 08-11-2025
Un petit post pour ceux qui ont cette erreur dans leur Log Home Assistant :
Code : WS command recorder/import_statistics called without specifying unit_class in metadata, this is deprecated and will stop working in HA Core 2026.11
Correction valide dans les conditions suivantes : - version du routeur : v9.01
- Home assistant version 2025.11.1
A effectuer dans l'ordre : - 1. Sauvegarder Home Assistant et le programme du routeur avant toute chose.
- 2. Modifier le fichier MQTT.ino ou le remplacer par le "MQTT.ino" fourni en pièce jointe a ce message puis recompiler et injecter dans le routeur
- 3. Forcer la redécouverte dans Home assistant pour cela Supprimer l’appareil dans Home Assistant : Paramètres → Appareils & Services → MQTT → Appareils et supprimer “Routeur - ECS”
- 4. Redémarrer Home Assistant
- 5. Redémarrer ESP32 pour republier les topics de découverte
- 6. Vérifier si tout est ok et créer une sauvegarde
Explications : - "mean_type": "arithmetic" (obligatoire depuis 2026.11)
- "unit_class": "energy" (obligatoire depuis 2026.11)
Le message d’erreur indique que Home Assistant ne reçoit pas le champ "unit_class" dans les métadonnées statistiques, ce qui sera bloquant à partir de la version 2026.11.
Selon les dernières modifications du WebSocket API de Home Assistant : le champ unit_class est désormais obligatoire dans les métadonnées envoyées via recorder/import_statistics ou update_statistics_metadata.
Ce champ permet à Home Assistant de convertir les unités et de générer des statistiques cohérentes.
Solution apportée:
Correction a apporter dans le fichier MQTT.ino (lignes 175 à 232)
Code PHP : // END OF sendMQTTDiscoveryMsg_global
void DeviceToDiscover(String VarName, String Unit, String Class, String Round) { char value[700]; char DiscoveryTopic[120]; char UniqueID[50]; char ValTpl[60]; String TitleName = String(MQTTdeviceName) + " " + String(VarName);
sprintf(DiscoveryTopic, "%s/%s/%s_%s/%s", MQTTPrefix.c_str(), SSR, MQTTdeviceName.c_str(), VarName.c_str(), "config"); sprintf(UniqueID, "%s_%s", MQTTdeviceName.c_str(), VarName.c_str()); sprintf(ValTpl, "{{ value_json.%s|default(0)|round(%s)}}", VarName.c_str(), Round.c_str());
if (Unit == "Wh" || Unit == "kWh") { sprintf(value, "{\"name\": \"%s\",\"uniq_id\": \"%s\",\"stat_t\": \"%s\",\"device_class\": \"%s\",\"unit_of_meas\": \"%s\",\"state_class\": \"total_increasing\",\"mean_type\": \"arithmetic\",\"unit_class\": \"energy\",\"val_tpl\": \"%s\",\"device\": %s}", TitleName.c_str(), UniqueID, StateTopic, Class.c_str(), Unit.c_str(), ValTpl, DEVICE); } else { sprintf(value, "{\"name\": \"%s\",\"uniq_id\": \"%s\",\"stat_t\": \"%s\",\"device_class\": \"%s\",\"unit_of_meas\": \"%s\",\"val_tpl\": \"%s\",\"device\": %s}", TitleName.c_str(), UniqueID, StateTopic, Class.c_str(), Unit.c_str(), ValTpl, DEVICE); }
clientMQTT.publish(DiscoveryTopic, value, true); }
void DeviceBinToDiscover(String VarName, String TitleName) { char value[700]; char DiscoveryTopic[120]; char UniqueID[50]; char ValTpl[60]; String ic = "mdi:electric-switch"; // Icône par défaut sprintf(DiscoveryTopic, "%s/%s/%s_%s/%s", MQTTPrefix.c_str(), BINS, MQTTdeviceName.c_str(), VarName.c_str(), "config"); sprintf(UniqueID, "%s_%s", MQTTdeviceName.c_str(), VarName.c_str()); sprintf(ValTpl, "{{ value_json.%s }}", VarName.c_str());
sprintf(value, "{\"name\": \"%s\",\"uniq_id\": \"%s\",\"stat_t\": \"%s\",\"device_class\": \"power\",\"icon\": \"%s\",\"val_tpl\": \"%s\",\"device\": %s}", TitleName.c_str(), UniqueID, StateTopic, ic.c_str(), ValTpl, DEVICE);
clientMQTT.publish(DiscoveryTopic, value, true); }
void DeviceTextToDiscover(String VarName, String TitleName) { char value[600]; char DiscoveryTopic[120]; char UniqueID[50]; char ValTpl[50]; sprintf(DiscoveryTopic, "%s/%s/%s_%s/%s", MQTTPrefix.c_str(), TXT, MQTTdeviceName.c_str(), VarName.c_str(), "config"); sprintf(UniqueID, "%s_%s", MQTTdeviceName.c_str(), VarName.c_str()); sprintf(ValTpl, "{{ value_json.%s }}", VarName.c_str());
sprintf(value, "{\"name\": \"%s\",\"uniq_id\": \"%s\",\"stat_t\": \"%s\",\"device_class\": \"enum\",\"val_tpl\": \"%s\",\"device\": %s}", TitleName.c_str(), UniqueID, StateTopic, ValTpl, DEVICE);
clientMQTT.publish(DiscoveryTopic, value, true); }
RE: Correctif avertissement Home Assistant : WS command recorder avec routeur en V9.01 - Sgb31 - 08-11-2025
Merci F4amefaut pour cette info !
faut que je regarde mes logs HA du coup .
RE: Correctif avertissement Home Assistant : WS command recorder avec routeur en V9.01 - F1ATB - 09-11-2025
Aujourd'hui en V15.12, le fichier MQTT.ino a fortement évolué. Pas facile de reprendre vos suggestions en V9.
André
RE: Correctif avertissement Home Assistant : WS command recorder avec routeur en V9.01 - Sgb31 - 09-11-2025
Après vérif., j'ai pas ce message dans mes logs HA..
RE: Correctif avertissement Home Assistant : WS command recorder avec routeur en V9.01 - f4ame - 11-11-2025
(09-11-2025, 05:56 PM)F1ATB a écrit : Aujourd'hui en V15.12, le fichier MQTT.ino a fortement évolué. Pas facile de reprendre vos suggestions en V9.
André
Je n'en doute pas André, ce n’était pas dans un but correctif mais plus pour aider ceux qui sont resté comme moi sur une ancienne version
RE: Correctif avertissement Home Assistant : WS command recorder avec routeur en V9.01 - f4ame - 23-11-2025
pour André F1ATB,
J'ai appliqué via l'IA cette modification au MQTT.ino en version 16.03 pour éviter le problème d'avertissement avec Home Assistant.
Injecté chez moi cela a l'air fonctionnel.
Code : WS command recorder/import_statistics called without specifying unit_class in metadata, this is deprecated and will stop working in HA Core 2026.11
Modification faite sur le MQTT.ino version 16.03
Lignes 270 a 301
Code : // Ajout de unit_class pour HA Core
sprintf(value, "{\"name\": \"%s\",\"uniq_id\": \"%s\",\"stat_t\": \"%s\",\"device_class\": \"%s\",\"unit_of_meas\": \"%s\",\"unit_class\":\"%s\",%s\"val_tpl\": \"%s\",\"device\": %s, \"availability_topic\": \"%s\"}", TitleName.c_str(), UniqueID, StateTopic, Class.c_str(), Unit.c_str(), Class.c_str(), state_class, ValTpl, DEVICE, AvailableTopic);
clientMQTT.publish(DiscoveryTopic, value);
}
void DeviceToDiscoverWithoutUnit(String VarName, String TitleName, String Round) {
char value[700];
char DiscoveryTopic[120];
char UniqueID[50];
char ValTpl[60];
sprintf(DiscoveryTopic, "%s%s/%s_%s/%s", PrefixMQTT, SSR, MQTTdeviceName.c_str(), VarName.c_str(), "config");
sprintf(UniqueID, "%s_%s", MQTTdeviceName.c_str(), VarName.c_str());
sprintf(ValTpl, "{{ value_json.%s|default(0)|round(%s)}}", VarName.c_str(), Round.c_str());
// Ajout device_class + unit_class pour les facteurs de puissance; sinon on laisse sans classe
if (String(VarName).indexOf("PowerFactor") >= 0) {
sprintf(value, "{\"name\": \"%s\",\"uniq_id\": \"%s\",\"stat_t\": \"%s\",\"device_class\": \"%s\",\"unit_class\":\"%s\",\"val_tpl\": \"%s\",\"device\": %s, \"availability_topic\": \"%s\"}", TitleName.c_str(), UniqueID, StateTopic, "power_factor", "power_factor", ValTpl, DEVICE, AvailableTopic);
} else {
sprintf(value, "{\"name\": \"%s\",\"uniq_id\": \"%s\",\"stat_t\": \"%s\",\"val_tpl\": \"%s\",\"device\": %s, \"availability_topic\": \"%s\"}", TitleName.c_str(), UniqueID, StateTopic, ValTpl, DEVICE, AvailableTopic);
}
clientMQTT.publish(DiscoveryTopic, value);
}
void DeviceToDiscoverWithoutClass(String VarName, String TitleName, String Unit, String Round) {
char value[700];
char DiscoveryTopic[120];
char UniqueID[50];
char ValTpl[60];
sprintf(DiscoveryTopic, "%s%s/%s_%s/%s", PrefixMQTT, SSR, MQTTdeviceName.c_str(), VarName.c_str(), "config");
sprintf(UniqueID, "%s_%s", MQTTdeviceName.c_str(), VarName.c_str());
sprintf(ValTpl, "{{ value_json.%s|default(0)|round(%s)}}", VarName.c_str(), Round.c_str());
// Ajout unit_class basé sur l’unité (ex: "%", "min")
sprintf(value, "{\"name\": \"%s\",\"uniq_id\": \"%s\",\"stat_t\": \"%s\",\"unit_of_meas\": \"%s\",\"unit_class\":\"%s\",\"val_tpl\": \"%s\",\"device\": %s, \"availability_topic\": \"%s\"}", TitleName.c_str(), UniqueID, StateTopic, Unit.c_str(), Unit.c_str(), ValTpl, DEVICE, AvailableTopic);
clientMQTT.publish(DiscoveryTopic, value);
}
Je vous met le fichier modifié en pièce jointe "MQTT.txt" et vous laisse le vérifier pour éventuellement modifier si vous pensez que cela peut être utile dans les futurs versions.
Cordialement
RE: Correctif avertissement Home Assistant : WS command recorder avec routeur en V9.01 - F1ATB - 24-11-2025
Dans la version 16.05 à venir dans quelques jours, j'ai intégré votre code. Merci. 73
André
RE: Correctif avertissement Home Assistant : WS command recorder avec routeur en V9.01 - f4ame - 24-11-2025
Merci André et encore merci pour tout ce travail que vous déployez pour la communauté.
Grace à vous j'en suis à plus de 1.56 MWh injecté dans mon ballon en moins de deux ans 
73 F4AME
|