C’est un sujet qui m’a tenu en reflexion pendant de longues années le temps de trouver la solution !
Ma maison est chauffée par un unique poele a granulé qui a une douzaine d’années et qui est très limité au niveau de la flexibilité de programmation et qui ne dispose d’aucune connexion.
Le poele est régulé suivant une sonde de temperature filaire, et une hysthéresis, et fonctionne en mode marche / arret entre les deux bornes d’hysthérésis, ce qui est assez génant pour le confort thermique et pénalisant pour la resistance quand on multiplie les demarrages / arrets.
Après des années de recherche j’ai finalement trouvé la bonne approche : lui faire gober des mensonges pour lui faire faire ce que je veux !
L’astuce passe par un module dédié, qui simule une résistance variable, qu’on vient implanter en lieu et place de la sonde filaire (qu’on conserve pour avoir un secours) : https://www.ohmigo.io/en/product-page/ohmigo-ohm-on-wifi
C’est un module sous tasmota qui ajuste la resistance entre ses deux bornes pour moduler une information de température. Reste plus qu’a assembler tout ça et a caler le systeme pour que le poele reponde :
Grosso modo voici le fonctionnement :
- On place le poele en etat auto avec une consigne fixe (21°C)
- On mesure la temperature ambiante avec un jeu de sondes
- On décide d’une vraie consigne de chauffe, mettons 23°C
- On ajuste la resistance du ohmigo pour faire croire au poele que la température n’a pas encore atteint les 21°C de sa consigne interne en lui envoyant le delta entre la temperature mesurée et la consigne à 23°C q’u’on soustrait de sa consigne interne (21°C) : exemple, on veut 23, on mesure 22, il a sa consigne interne a 21°C => (23-22) = 1°C => on envoie 20°C au ohmigo !
- On ajuste l’info de température au fur et a mesure que la valeur des sondes déportées varie
Pour le forcer a demarrer suffit de lui faire croire qu’il fait froid => envoi 5°C dans la sonde
Pour le forcer a s’eteindre on lui fait croire qu’il fait chaud => 45°C
le principe est applicable a n’importe quel appareil qui régule sur une sonde de type résistance variable.
Pour se premunir d’un eventuel probleme j’ai conservé la sonde filaire en parallele du ohmigo, avec un simple contact sec qui fait la bascule entre les deux en cas de pb
Reste enfin a caler la courbe de la sonde filaire pour que le ohmigo renvoie les bonnes infos de resistance en fonction des mesures de T°. Pour ça c’est simple, on envoie des valeurs de resistance et on regarde l’affichage du poele :
et derriere on reconstruit une courbe paramétrique qui permettra de recalculer en temps réel la consigne de resistance a renvoyer en fonctio ndes mesures de temperature :
puis on construit le script de mise à jour de la valeur de resistance :
alias: update resistance ohmigo
sequence:
- action: mqtt.publish
metadata: {}
data:
retain: false
topic: aha/18fe34ed492b/oowifi_resistance/cmd_t
payload: >-
{{ ((0.0173 * (((states('sensor.ets') |
float) + (states('input_number.etc') | float) )**2) +
6.9597 * ((states('sensor.ets') | float)
+ (states('input_number.etc') | float) )+ 813.1)
*1000) | round(0) }}
evaluate_payload: false
description: ""
on met à jour la valeur de la resistance chaque fois que la sonde de temperature changer de valeur :
alias: update ohmigo resistance
description: ""
triggers:
- trigger: state
entity_id:
- sensor.ets
conditions: []
actions:
- action: script.turn_on
metadata: {}
data: {}
target:
entity_id:
- script.update_resistance_ohmigo
mode: single
On definit les conditions de demarrage et d’arret du poele pour eviter que sa regulation interne ne reprenne le dessus :
alias: Gestion Thermostat Poele
description: ""
triggers:
- alias: Démarrage thermostat
trigger: state
entity_id:
- climate.stove
from: "off"
to: heat
id: demarrage thermostat
- alias: arret thermostat
trigger: state
entity_id:
- climate.stove
from: heat
to: "off"
id: arret thermostat
conditions: []
actions:
- choose:
- conditions:
- condition: trigger
id:
- arret thermostat
sequence:
- action: automation.turn_off
data:
stop_actions: true
target:
entity_id: automation.update_ohmigo_resistance
- action: script.turn_on
metadata: {}
data: {}
target:
entity_id: script.stove_extinction
- action: switch.turn_off
metadata: {}
data: {}
target:
entity_id: switch.schedule_temperature_calendar
- conditions:
- condition: trigger
id:
- demarrage thermostat
sequence:
- action: automation.turn_on
data: {}
target:
entity_id: automation.update_ohmigo_resistance
- action: automation.trigger
target:
entity_id: automation.update_ohmigo_resistance
data:
skip_condition: true
mode: single
et on introduit une automatisation qui modifie l’offset de correction de température en fonction de la consigne qu’on met sur le climate :
alias: ETC update
description: ""
triggers:
- trigger: state
entity_id:
- climate.stove
attribute: temperature
conditions: []
actions:
- action: script.turn_on
metadata: {}
data: {}
target:
entity_id: script.etc_update
- if:
- condition: state
entity_id: climate.stove
state: heat
then:
- action: script.turn_on
metadata: {}
data: {}
target:
entity_id:
- script.update_resistance_ohmigo
mode: single
et le fallback sur la sonde en cas de pépin :
alias: fallback sonde poele
description: ""
triggers:
- trigger: mqtt
topic: aha/18fe34ed492b/avty_t
payload: offline
alias: déconnexion ohmigo
id: déconnexion ohmigo
- alias: reconnexion ohmigo
trigger: mqtt
topic: aha/18fe34ed492b/avty_t
payload: online
id: reconnexion ohmigo
conditions: []
actions:
- choose:
- conditions:
- condition: trigger
id:
- déconnexion ohmigo
sequence:
- action: input_boolean.turn_off
metadata: {}
data: {}
target:
entity_id: input_boolean.etat_ohmigo
alias: ohmigo déconnecté
- conditions:
- condition: trigger
id:
- reconnexion ohmigo
sequence:
- if:
- condition: state
entity_id: input_boolean.etat_ohmigo
state: "off"
then:
- action: input_boolean.turn_on
metadata: {}
data: {}
target:
entity_id: input_boolean.etat_ohmigo
alias: ohmigo reconnecté
mode: single
et voila … tadaaa, un poele non-connecté, entierement connecté via un climate standard de HA :
et une programmation horaire :
Et couplage au AWTRIX pour afficher l’etat du poele :
J’ai rajouté quelques évolutions au fur et a mesure de l’utilisaiton :
une marche continue forcée : quand le poele s’approche de la consigne on lui envoie des infos erronées legerement en dessous de la consigne et il se met alors emode chauffe mini et maintient sa flamme au lieu de s’arreter :
alias: Marche / Arrêt mode continu
description: ""
triggers:
- trigger: state
entity_id:
- timer.minuteur_poele_mode_continu
to: active
from: idle
id: "démarrage mode continu "
- trigger: state
entity_id:
- timer.minuteur_poele_mode_continu
to: idle
from: active
id: arrêt mode continu
conditions: []
actions:
- action: script.turn_on
metadata: {}
data: {}
target:
entity_id: script.update_resistance_ohmigo_mode_continu
- if:
- condition: trigger
id:
- "démarrage mode continu "
then:
- action: automation.turn_on
metadata: {}
data: {}
target:
entity_id: automation.alerte_erreur_mode_continu
- if:
- condition: trigger
id:
- arrêt mode continu
then:
- action: automation.turn_off
metadata: {}
data:
stop_actions: true
target:
entity_id: automation.alerte_erreur_mode_continu
mode: single
et le script qui ajuste la consigne :
alias: update resistance ohmigo (Mode continu)
sequence:
- if:
- condition: state
entity_id: timer.minuteur_poele_mode_continu
state: active
then:
- variables:
temp_sonde: "{{states('sensor.temperature_rdc')|float}}"
temp_mode_continu: >-
{{state_attr('climate.poele', 'temperature') | float +
states('input_number.marge_mode_continu')|float}}
alias: Etablissement des variables
- alias: Si la mesure dépasse la consigne + marge
if:
- condition: template
value_template: "{{temp_sonde > temp_mode_continu}}"
then:
- variables:
temp_sonde: "{{temp_mode_continu}}"
alias: Mesure forcée a consigne + marge
- alias: update resistance avec mesure forcée
action: mqtt.publish
metadata: {}
data:
evaluate_payload: false
retain: true
topic: aha/18fe34ed492b/oowifi_resistance/cmd_t
payload: >-
{{ ((0.0173 * ((temp_sonde +
states('input_number.correction_sonde_poele')|float )**2) +
6.9597 * (temp_sonde +
states('input_number.correction_sonde_poele')|float) + 813.1)
*1000)|round(0) }}
qos: "1"
enabled: true
- action: input_number.set_value
target:
entity_id: input_number.resistance_ohmigo
data:
value: >-
{{ ( 0.0173 * ((temp_sonde + (
states('input_number.correction_sonde_poele') | float )) **2 ) +
6.9597 * (temp_sonde +
(states('input_number.correction_sonde_poele') | float )) +
813.1 ) | round(3) }}
enabled: true
else:
- alias: update resistance avec mesure
action: mqtt.publish
metadata: {}
data:
evaluate_payload: false
retain: true
topic: aha/18fe34ed492b/oowifi_resistance/cmd_t
payload: >-
{{ ((0.0173 * ((temp_sonde +
states('input_number.correction_sonde_poele')|float )**2) +
6.9597 * (temp_sonde +
states('input_number.correction_sonde_poele')|float) + 813.1)
*1000)|round(0)}}
qos: "1"
enabled: true
- action: input_number.set_value
target:
entity_id: input_number.resistance_ohmigo
data:
value: >-
{{ ( 0.0173 * ((temp_sonde + (
states('input_number.correction_sonde_poele') | float )) **2 ) +
6.9597 * (temp_sonde +
(states('input_number.correction_sonde_poele') | float )) +
813.1 ) | round(3) }}
else:
- alias: Update résistance avec mesure
action: mqtt.publish
metadata: {}
data:
evaluate_payload: false
retain: true
topic: aha/18fe34ed492b/oowifi_resistance/cmd_t
payload: >-
{{ ((0.0173 * (((states('sensor.temperature_rdc')|float) +
(states('input_number.correction_sonde_poele')|float) )**2) + 6.9597
* ((states('sensor.temperature_rdc')|float) +
(states('input_number.correction_sonde_poele')|float) )+ 813.1)
*1000)|round(0) }}
qos: "1"
enabled: true
- action: input_number.set_value
target:
entity_id: input_number.resistance_ohmigo
data:
value: >-
{{ ( 0.0173 * (((states('sensor.temperature_rdc') | float ) + (
states('input_number.correction_sonde_poele') | float )) **2 ) +
6.9597 * (( states('sensor.temperature_rdc') | float ) +
(states('input_number.correction_sonde_poele') | float )) + 813.1 )
| round(3) }}
description: ""
mode: restart
tout le detail de la procédure est là : GitHub - jsapede/ohmigo-ha-pelletstove: automate pellet stove using ohmigo and homeassistant






