[DefiDIY25] Domotisation d'un poele a granulés non connecté

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

13 « J'aime »

Au top, j’adore quand c’est si simple !

Pour info je ne connaissais pas le module permettant de simuler une résistance variable, je retiens !

1 « J'aime »

j’ai mis très longtemps a trouver, je suis tombé par hasard dessus en fouillant des forums Reddit.

a priori on peut faire l’équivalent moins cher avec un bete esp32 et des modules de résistance variable mais c’était plus simple d’investir dans un module tout fait

Effectivement il y a meme un projet à base de X9C sur ESPhome. Je ne connaissais pas ce type de composant alors que c’est tout à fait logique que cela existe.

Je me dis que je vais pouvoir l’été prochain interface ma pompe à chaleur non connecté grâce à la même logique que toi.

Bonjour, ton idée m’intéresse. En effet, mon insert (confort maxi) extraflame âgé d’une vingtaine d’années fait n’importe quoi et personne n’est capable de la réparer et surtout se déplacer. Ma sonde externe affiche des températures complétement abérantes genre 50° quand il fait 10° (car je mets la sonde dehors pour essayer d’abaisser de baisser cette température). Du coup, il n’envoie pas assez de pelets croyant qu’il fait trop chaud et m’afiche “no pell” au bout de 5 minutes. On dirait un problème de carte mère mais je n’ai pas les compétences pour identifier le problème.

Avec ton installation, je pourrais donc “simuler” la température j’imagine et lui faire croire qu’il n’y a pas 50° mais 22° ?

oui c’est exactement ces composants mais comme je les ai vu qu’apres avoir acheté mon ohmigo j’ai pas creusé plus loin

A partir du moment ou tu pilotes ce que tu envoies comme info à ta PAc tu devrais pouvoir arriver au meme resultat

C’est surement faisable, la difficulté si la sonde est HS va être de retrouver une courbe d’etalonnage mais si ton insert affiche queleque part la temperature, par tatonnement / dichotomie tu devrais pouvoir le faire.

C’est tout l’objet du systeme, faire croire ce que je veux au poele pour le forcer a reagir comme je veux.

hesite pas a me solliciter

En fait ce que je veux surtout c’est qu’il ne se mette plus en erreur croyant qu’il fait trop chaud (message no pell car la vis sans fin ne sait plus quoi faire). Le reste je l’ai domotisé avec un Broadlink RM mini

ça fera surement l’affaire, faudra juste trouver la bonne courbe d’etalonnage

Il y a aussi le Module TPL0501 , moins chère que le module X9C,

1 « J'aime »

Ce sujet a été automatiquement fermé après 30 jours. Aucune réponse n’est permise dorénavant.