J’ai mis à jour le post pour ajouter quelques infos. Je suis sur la 8.3.0
Je vois de ça dans les logs si ça peut te guider
Enregistreur: homeassistant.components.sensor
Source: helpers/entity_platform.py:843
intégration: Capteur (documentation, problèmes)
S'est produit pour la première fois: 13 décembre 2025 à 14:02:05 (24 occurrences)
Dernier enregistrement: 12:45:20
Platform versatile_thermostat does not generate unique IDs. ID nb_device_active_boiler already exists - ignoring sensor.nb_device_active_for_boiler
Platform versatile_thermostat does not generate unique IDs. ID total_power_active_boiler already exists - ignoring sensor.total_power_active_for_boiler
Platform versatile_thermostat does not generate unique IDs. ID nb_device_active_boiler already exists - ignoring sensor.nb_device_active_for_boiler_2
Platform versatile_thermostat does not generate unique IDs. ID total_power_active_boiler already exists - ignoring sensor.total_power_active_for_boiler_2
J’allais justement répondre qu’en supprimant puis recréant la config centrale, cela semble de nouveau fonctionner (« sensor.nb_device_active_for_boiler_3 » est correctement à jour)
Quand je regarde les entités de Versatile, je vois effectivement plusieurs entités non groupées
edit : par contre je ne vois pas comment les supprimer…Impossible depuis l’onglet Entités, j’ai essayé d’utiliser recorder.purge_entities depuis l’outil de dev, mais ça n’a rien supprimé non plus.
Non c’est bon l’outil de purge fonctionne correctement
Et je l’aurai vu quand j’ai installé chez moi. Y a un truc sur certains utilisateurs. Si c’était systématique. Et ici on me dit qu’un simple restart permet de résoudre. Mystère…
2025-12-13 14:02:05.055 ERROR (MainThread) [homeassistant.components.sensor] Error while removing entity sensor.nb_device_active_for_boiler
...
File "/usr/src/homeassistant/homeassistant/helpers/event.py", line 442, in _remove_listener
callbacks[key].remove(job)
~~~~~~~~~~~~~~~~~~~~~^^^^^
ValueError: list.remove(x): x not in list
et juste après on voit bien :
2025-12-15 12:44:48.098 ERROR (MainThread) [homeassistant.components.sensor] Platform versatile_thermostat does not generate unique IDs. ID nb_device_active_boiler already exists - ignoring sensor.nb_device_active_for_boiler_2
En gros, HA n’arrive pas à supprimer les entités existantes et en recréé d’autres avec des _2 ou _3.
Dans la stacktrace je n’ai aucun code VTherm donc je ne sais pas trop ce qui se passe. Je n’ai pas eu le soucis ni le log de mon coté donc y a qqe-chose dans votre conf qui provoque ça. Si vous avez des idées…
EDIT: Chatgpt m’a dit ce qui ne va pas. (il est fort)
@Jean-Marc_Collin Une petite analyse depuis le codebase par Gemini ( histoire de challenger GPT )
Bug Fix: Central Boiler Sensor Tracking & Reload Errors
Goal Description
Fix a bug where sensor.nb_device_active_for_boiler tracks an incorrect number of devices after a central configuration change. Also fix ValueError: list.remove(x): x not in list errors and duplicate entity ID errors in logs.
The ValueError is caused by
NbActiveDeviceForBoilerSensor(and its power counterpart) registering anasync_on_removecallback that tries to remove a listener that isalsomanually removed when the sensor updates its list of monitored entities. This double removal crashes the unload/update process, leading to « zombie » entities and duplicate ID errors, and likely causes existing VTherms to differ from what the sensor sees.
User Review Required
NOTE
This fix addresses the internal listener management in
sensor.py. No configuration changes are required from the user.
Proposed Changes
custom_components/versatile_thermostat/sensor.py
[MODIFY]
sensor.py
Update
NbActiveDeviceForBoilerSensor and TotalPowerActiveDeviceForBoilerSensor classes.
Method
listen_vtherms_entities:
Capture the return value of self.async_on_remove(...). This is the « remove the cleaner » function.
Store it in a new attribute (e.g., self._cancel_on_remove_listener_nb_active).
Method
cancel_listening_nb_active:
When handling manual cancellation:
Call self._cancel_listener_nb_active() (the listener remover).
Call self._cancel_on_remove_listener_nb_active() (the cleanup remover) if it exists, to prevent HA from calling it again on entity unload.
Merci sincèrement de nous mettre à disposition un tel niveau de travail. Grâce à vous, de nombreux utilisateurs tel que moi peuvent pleinement tirer parti de leur chauffage avec cette intégration custom.
Déjà, bravo pour le travail réalisé sur Versatile Thermostat, c’est vraiment une intégration de grande qualité
Je me permets de remonter un comportement que je constate avec une PAC air-air Mitsubishi d’entrée de gamme (via MELCloud), peut-être lié aux spécificités des PAC.
Contexte
Sur ce type de PAC, la sonde de température interne est située dans le caisson de l’unité intérieure, et non dans la pièce.
Cela provoque un biais bien connu : lorsque la ventilation est faible, l’air chaud reste dans le caisson, la sonde interne monte rapidement, et la PAC considère que la consigne est atteinte… alors que la température ambiante réelle ne l’est pas.
De mon côté :
j’utilise Versatile Thermostat avec une sonde Sonoff déportée → fonctionnement excellent
pour éviter ce biais de sonde interne, j’utilise une ventilation fixe à vitesse 2, ce qui permet d’évacuer la chaleur du caisson et d’avoir une régulation beaucoup plus juste
Comportement observé depuis la mise à jour (au passage bravo pour les évolutions)
Versatile gère maintenant le mode de ventilation, ce qui est très intéressant (notamment en cas de gros écart de température, le mode “turbo” fonctionne très bien)
En revanche, en fonctionnement normal :
si je règle manuellement la ventilation à vitesse 2, Versatile la force à repasser en AUTO
pour conserver une ventilation fixe, je suis obligé de désactiver complètement la gestion de la ventilation dans Versatile
Question
Est-ce qu’il existe :
un réglage (peut-être avancé) permettant de ne pas forcer le mode AUTO
ou une option pour autoriser une vitesse de ventilation fixe de base, tout en conservant la logique de boost en cas de gros écart de température ?
Dans mon cas, le mode AUTO constructeur est peu efficace à cause de la sonde interne, et la ventilation fixe donne de bien meilleurs résultats en confort et en stabilité.
Merci encore pour le travail réalisé, et désolé si la question a déjà été abordée
Petit truc étrange que je rencontre et je voulais savoir si le comportement est normal ou pas.
Je voulais mettre en TPI Seuil bas une valeur, par exemple 1. Si je finalise mes réglages, j’ai l’impression qu’il n’est pas pris en compte :
tpi_threshold_low: 0
tpi_threshold_high: 0
Par contre, si je met un chiffre autre que 0 pour le seuil haut, par exemple 1 egalement, la c’est bien pris en compte :
tpi_threshold_low: 1
tpi_threshold_high: 1
Est ce le comportement normal ? il me semble que j’avais réussi à n’utiliser qu’un seul des 2…
Merci par avance !
Ps : je suis en 8.3.1. J’ai essayé de rétrograder mais c’est pareil
Ca me parait très clair. Il est 2025-12-17T14:48 et ta dernière mise à jour du capteur de température de ta pièce est de : 2025-12-17T12:18:53 soit 2h30 de retard. Comme le délai pour la mise en sécurité est de safety_delay_min: 120 (2h), le thermostat se met en sécurité. Ca sert exactement à ça.
Il faut donc que tu vérifies pourquoi ton capteur de temp n’a rien remonté pendant 2h. Si c’est un Zigbee, tu peux configurer le LastSeen comme expliqué dans la doc que je t’ai donné au-dessus.
Là c’est carrément 5h40 de retard sur le capteur extérieur. Si tu lis l’article dont je t’ai donné le lien, tu peux désactiver la mise en sécurité sur le capteur extérieur.
Le Deuxième cas est issu du Github, regardes la date 2023, alors oui je l’ai vu .
Pour ça OK, mais le soucis c’est pendant une période de non chauffe, et du coup lorsque le scheluder est censé mettre le radiateur en chauffe, il ne peux pas plus que les paramètre du safety mode.
Comme c’est la SDB avec un sèche serviette à bain d’huile, l’inertie est très longue, du coup entre la fin d’une chauffe, la température peut rester stable un bon moment.
Le conseil serait d’augmenter le safety_delay_min:, ou d’augmenter le safety_min_on_percent:et le safety_default_on_percent: pour que la SDB remonte en température, que le thermostat détecte un changement de température pour supprimer le safety mode.
J ai justement été confronté à la mise en sécurité d’ un radiateur et ça a fonctionné sans problème. Le soir j ai changé la pile du capteur de température et c’est reparti.
Si tu ne veux pas de mise en sécurité il faut passer a 1 le safety_min_on_percent (cf. doc)
Si tu veux retarder la mise en sécurité, il faut augmenter le délai safety_delay_min
Si tu veux arrêter la mise en sécurité en cours, il faut que le capteur de température revienne à la vie.
La question est donc, comme l a dit Jean-Marc, de savoir pourquoi le capteur n’ est pas remonté ?
Merci pour ta participation, je sais pourquoi le capteur ne remonte pas d’info.
Le capteur sur pile (neuves) n’envoie des informations que si la température change
de +/- 0.5°. Du coup comme la pièce est plutôt bien isolée et que le chauffage (Sèche serviette
bain d’huile) à une bonne inertie, la température peu ne pas évoluer pendant plusieurs heures.