Un petit post pour ceux qui ont cette erreur dans leur Log Home Assistant :
Correction valide dans les conditions suivantes :
A effectuer dans l'ordre :
Explications :
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 :
WS command recorder/import_statistics called without specifying unit_class in metadata, this is deprecated and will stop working in HA Core 2026.11Correction 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)
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);
}
F4AME - Patoutheone
8 panneaux Recom Sillia Panther 375 Wc Full Black soit 3 KWc
Onduleur Huawei 3KTL-L1 mono et compteur DDSU666-H
Routeur F1ATB + 2 Afficheurs - Home Assistant
8 panneaux Recom Sillia Panther 375 Wc Full Black soit 3 KWc
Onduleur Huawei 3KTL-L1 mono et compteur DDSU666-H
Routeur F1ATB + 2 Afficheurs - Home Assistant
