[Article] Gestion de bout en bout du chauffage

J’ai cherché un peu d’infos et je trouve l’idée PWM/TPI d’@Argonaute est théoriquement intéressante.

Si j’ai bien compris ça consiste à faire des ON/OFF pour moins consommer en fonction de la température atteinte en jouant sur l’inertie ? Ca pourrait d’ailleurs se présenter sous la forme d’un fake switch ? Combien de ON/OFF par heure ? Reste à voir si les convecteurs sont adaptés à ce mode, sans parler des contacteurs (externes ou gérés par le fil pilote) qui vont êtres méchamment sollicites.

Hello,
Oui, une puissance en % comprise entre 0 et 100 est calculée toutes les 10mn et baisse doucement jusqu’a atteindre la température de consigne. Si il fait froid dehors, la puissance se stabilise entre 10% et 15% pour combler les pertes thermiques.
J’ai des radiateurs électriques en fonte a forte inertie et ils restent en permanence juste tièdes sans oscillation de température et cela est vraiment efficace. J’ai maintenant 5 ans de recul pour l’affirmer (sur eedomus avant).

Si la puissance calculée est par exemple de 30%, le convecteur chauffera 3 minutes, puis s’arrêtera 7 minutes, puis recommencera un cycle de 10mn (3 minutes chauffe / 7 minutes arrêt si il reste a 30%). Il y aura donc 6 marche-arrêt par heure.

Effectivement, il est plus que préférable d’utiliser une commande par fil pilote (qubino, heatzy par exemple) car des coupures d’alimentations risquent d’endommager la carte électronique du convecteur.
En utilisant le thermostat de HA on va chauffer très fort jusqu’a la consigne puis arrêter le convecteur. Et chauffer très fort n’est pour le coup pas bon et accélérera le vieillissement du convecteur !

J’ai 2 pièces avec des chauffages au sol électriques (pilotage par thermostat heatit) et cela fonctionne parfaitement aussi.

J’ai vu pour information qu’il existe une proposition de thermostat pid, qui serait une alternative a mon implémentation, mais sans prise en compte de la température extérieure, ce qui me semble dommage.

1 « J'aime »

J’ai testé le blueprint d’Argonaute et cela fonctionne très bien pour diminuer la consommation.
Je l’ai laissé comme dans sa proposition à des mise à jour de la consigne toutes les 5mn, cela donne 12 cycles par heure.
J’ai des sorties de câble connectées Legrand et je suppose qu’elles commutent lorsque la phase est zéro (j’associe Legrand avec qualité). J’ai lu qq part que cela permet de limiter les harmoniques dans le réseau. Dans tous les cas mes radiateurs fonctionnent en PWM avec un cycle par minutes… Je l’ai découvert en branchant la sortie de câble.
image

Mes radiateurs sont jolis avec une très bonne inertie mais le fils pilote ne fonctionne pas :sob:. D’où mon intérêt pour ce qu’a fait Argonaute.
Par contre, j’ai besoin de connaitre un peu mieux comment ma maison réagit à une coupure du chauffage et une remise en route des convecteurs. En adaptant le blueprint, on peut envoyer une puissance fixe (non adapté à la consigne) et voir la température remonter.
Une fois la maison identifiée, je testerai un régulateur avec une vraie intégrale. Je pourrais aussi programmer une sortie de hors gel tranquille en faisant tourner mes 3 radiateurs les uns après les autres ou deux par deux.

1 « J'aime »

Je suis allé voir cette intégration du thermostat PID. Ca a l’air déjà pas mal aboutit. A première vue je dirait que la prise en compte de la température extérieure que tu regrette prends son importance dans une maison peu isolée ou avec des un fort impact du soleil (grandes baies vitrées par exemple). Sans quoi on doit pouvoir s’en passer. Le placement de la sonde me parait également important… Bref, je vais tester ce thermostat…

2 « J'aime »

Intéressant cette intégration. Ca permet de rester dans le « climate » et pour ma part de l’envoyer dans HomeKit pour le control.

Et promis je partage mes carte Apex asap.

Edit: J’ai quand même fait un issue GH pour qu’il rajoute la gestion des ouvrants.

Voila le code de mes cartes Apex :

Consommation/Coûts Energie Globale :

image

type: custom:apexcharts-card
cache: false
update_interval: 1h
header:
  standard_format: true
  show: false
  title: Consommation HP/HC 7j
  show_states: true
span:
  end: day
graph_span: 7d
stacked: true
apex_config:
  fill:
    opacity: 1
    type: gradient
    gradient:
      shade: light
      type: horizontal
  grid:
    show: true
  xaxis:
    axisBorder:
      show: false
    axisTicks:
      show: false
  yaxis:
    show: true
series:
  - entity: sensor.daily_energy_offpeak
    type: column
    name: HC
    color: 5A6FE7
    opacity: 1
    group_by:
      duration: 1d
      func: diff
    show:
      datalabels: true
  - entity: sensor.daily_energy_peak
    type: column
    name: HP
    color: EA4234
    opacity: 1
    group_by:
      duration: 1d
      func: diff
    show:
      datalabels: true
card_mod:
  style: |
    ha-card {
      --ha-card-background: #131313BF;
      --ha-card-border-radius: 10px;
      --paper-item-icon-color: #6E6E6E;
      --paper-item-icon-active-color: #44739e;
    }
    ha-card > h1 {
      text-align: center;
    }

image

type: custom:apexcharts-card
cache: true
update_interval: 30min
header:
  show: false
  standard_format: true
  title: Consommation Jour/7j
  show_states: true
span:
  end: day
graph_span: 7d
stacked: false
apex_config:
  grid:
    show: true
  xaxis:
    axisBorder:
      show: false
    axisTicks:
      show: false
  yaxis:
    axisBorder:
      show: false
    axisTicks:
      show: false
  fill:
    opacity: 1
    type: gradient
    gradient:
      shade: light
      type: horizontal
series:
  - entity: sensor.smart_meter_electric_consumed_kwh
    type: column
    name: Globale
    color: EA4234
    opacity: 1
    group_by:
      duration: 1d
      func: diff
    show:
      datalabels: true
  - entity: sensor.cumul_chauffage_new
    type: column
    name: Chauffages
    color: 5A6FE7
    unit: kWh
    opacity: 1
    group_by:
      duration: 1d
      func: diff
    show:
      datalabels: true
card_mod:
  style: |
    ha-card {
      --ha-card-background: #131313BF;
      --ha-card-border-radius: 10px;
      --paper-item-icon-color: #6E6E6E;
      --paper-item-icon-active-color: #44739e;
    }
    ha-card > h1 {
      text-align: center;
    }

image

type: custom:apexcharts-card
cache: false
update_interval: 1h
header:
  standard_format: true
  show: false
  title: Coût HP/HC 7J
  show_states: true
span:
  end: day
graph_span: 7d
stacked: true
apex_config:
  fill:
    opacity: 1
    type: gradient
    gradient:
      shade: light
      type: horizontal
  grid:
    show: true
  xaxis:
    axisBorder:
      show: false
    axisTicks:
      show: false
  yaxis:
    show: true
series:
  - entity: sensor.cout_jour_energie_hc
    type: column
    name: HC
    color: 5A6FE7
    opacity: 1
    group_by:
      duration: 1d
      func: diff
    show:
      datalabels: true
  - entity: sensor.cout_jour_energie_hp
    type: column
    name: HP
    color: EA4234
    opacity: 1
    group_by:
      duration: 1d
      func: diff
    show:
      datalabels: true
card_mod:
  style: |
    ha-card {
      --ha-card-background: #131313BF;
      --ha-card-border-radius: 10px;
      --paper-item-icon-color: #6E6E6E;
      --paper-item-icon-active-color: #44739e;
    }
    ha-card > h1 {
      text-align: center;
    }

image

type: custom:apexcharts-card
cache: true
update_interval: 10min
header:
  show: false
  standard_format: true
  title: Consommation Heure/24H
  show_states: false
span:
  start: day
graph_span: 24h
stacked: false
apex_config:
  fill:
    opacity: 1
    type: gradient
    gradient:
      shade: light
      type: horizontal
  grid:
    show: true
  xaxis:
    axisBorder:
      show: false
    axisTicks:
      show: false
  yaxis:
    axisBorder:
      show: false
    axisTicks:
      show: false
series:
  - entity: sensor.smart_meter_electric_consumed_kwh
    type: column
    name: Global
    float_precision: 2
    color: EA4234
    opacity: 1
    group_by:
      duration: 1h
      func: diff
    show:
      datalabels: false
  - entity: sensor.cumul_chauffage_new
    type: column
    name: Chauffages
    float_precision: 2
    color: 5A6FE7
    opacity: 1
    group_by:
      duration: 1h
      func: diff
    show:
      datalabels: false
card_mod:
  class: add-header
  style: |
    ha-card {
      --ha-card-background: #131313BF;
      --ha-card-border-radius: 10px;
      --paper-item-icon-color: #6E6E6E;
      --paper-item-icon-active-color: #44739e;
    }
    ha-card > h1 {
      text-align: center;
    }

image

type: custom:apexcharts-card
cache: true
update_interval: 10min
header:
  show: false
  standard_format: true
  title: Consommation 24H/Veille
  show_states: false
span:
  start: day
graph_span: 24h
stacked: false
apex_config:
  fill:
    opacity: 1
    type: gradient
    gradient:
      shade: light
      type: horizontal
  grid:
    show: true
  xaxis:
    axisBorder:
      show: false
    axisTicks:
      show: false
  yaxis:
    axisBorder:
      show: false
    axisTicks:
      show: false
series:
  - entity: sensor.smart_meter_electric_consumed_kwh
    type: column
    name: Veille
    offset: '-1d'
    float_precision: 2
    color: grey
    opacity: 0.3
    group_by:
      duration: 1h
      func: diff
    show:
      datalabels: false
  - entity: sensor.smart_meter_electric_consumed_kwh
    type: column
    name: Jour
    float_precision: 2
    color: EA4234
    opacity: 1
    group_by:
      duration: 1h
      func: diff
    show:
      datalabels: false
card_mod:
  class: add-header
  style: |
    ha-card {
      --ha-card-background: #131313BF;
      --ha-card-border-radius: 10px;
      --paper-item-icon-color: #6E6E6E;
      --paper-item-icon-active-color: #44739e;
    }
    ha-card > h1 {
      text-align: center;
    }

image

type: custom:apexcharts-card
cache: true
update_interval: 10min
header:
  show: false
  standard_format: true
  title: Coût HP/HC 24H
  show_states: false
span:
  start: day
graph_span: 24h
stacked: true
apex_config:
  fill:
    opacity: 1
    type: gradient
    gradient:
      shade: light
      type: horizontal
  grid:
    show: true
  xaxis:
    axisBorder:
      show: false
    axisTicks:
      show: false
  yaxis:
    axisBorder:
      show: false
    axisTicks:
      show: false
series:
  - entity: sensor.cout_heure_energie_hp
    type: column
    name: HP
    float_precision: 2
    color: EA4234
    opacity: 1
    group_by:
      duration: 1h
      func: diff
    show:
      datalabels: false
  - entity: sensor.cout_heure_energie_hc
    type: column
    name: HC
    float_precision: 2
    color: 5A6FE7
    opacity: 1
    group_by:
      duration: 1h
      func: diff
    show:
      datalabels: false
card_mod:
  class: add-header
  style: |
    ha-card {
      --ha-card-background: #131313BF;
      --ha-card-border-radius: 10px;
      --paper-item-icon-color: #6E6E6E;
      --paper-item-icon-active-color: #44739e;
    }
    ha-card > h1 {
      text-align: center;
    }

Consommation/Energie Chauffage :

image

type: custom:apexcharts-card
cache: true
update_interval: 5min
header:
  show: false
  standard_format: true
  title: Chauffages 24H
  show_states: false
span:
  start: day
graph_span: 24h
stacked: false
apex_config:
  grid:
    show: false
  xaxis:
    axisBorder:
      show: false
    axisTicks:
      show: false
  yaxis:
    axisBorder:
      show: false
    axisTicks:
      show: false
  fill:
    opacity: 1
    type: gradient
    gradient:
      shade: light
      type: horizontal
series:
  - entity: sensor.cumul_chauffage_new
    type: column
    offset: '-1d'
    name: Veille
    float_precision: 2
    color: grey
    opacity: 0.2
    group_by:
      duration: 1h
      func: diff
    show:
      datalabels: false
  - entity: sensor.cumul_chauffage_new
    type: column
    name: Chauffages
    float_precision: 2
    color: EA4234
    opacity: 1
    group_by:
      duration: 1h
      func: diff
    show:
      datalabels: false
card_mod:
  class: add-header
  style: |
    ha-card {
      --ha-card-background: #131313BF;
      --ha-card-border-radius: 10px;
     # --paper-item-icon-color: #6E6E6E;
    #  --paper-item-icon-active-color: #44739e;
      --mini-media-player-background-opacity:0;
      --ha-card-box-shadow: 0px;
    }
    ha-card > h1 {
      text-align: center;
    }

image

type: custom:apexcharts-card
cache: true
update_interval: 10min
header:
  standard_format: true
  show: false
  title: Consommation Jour/7j
  show_states: true
span:
  end: day
graph_span: 7d
stacked: true
apex_config:
  fill:
    opacity: 1
    type: gradient
    gradient:
      shade: light
      type: horizontal
  grid:
    show: false
  xaxis:
    axisBorder:
      show: false
    axisTicks:
      show: false
  yaxis:
    show: false
series:
  - entity: sensor.cumul_chauffage_new
    type: column
    name: Chauffage
    color: EA4234
    unit: kWh
    opacity: 1
    group_by:
      duration: 1d
      func: diff
    show:
      datalabels: true
card_mod:
  style: |
    ha-card {
      --ha-card-background: #131313BF;
      --ha-card-border-radius: 10px;
      --paper-item-icon-color: #6E6E6E;
      --paper-item-icon-active-color: #44739e;
    }
    ha-card > h1 {
      text-align: center;
    }

type: entities
entities:
  - type: custom:button-card
    name: Consommation
    size: 0px
    aspect_ratio: 10/1
    show_icon: true
  - type: custom:apexcharts-card
    cache: true
    update_interval: 5min
    now:
      show: false
      label: Maintenant
    header:
      standard_format: false
      show: false
      show_states: false
    span:
      start: day
      offset: '-1day'
    graph_span: 48h
    stacked: true
    apex_config:
      legend:
        show: false
      xaxis:
        axisBorder:
          show: false
        axisTicks:
          show: false
      yaxis:
        axisBorder:
          show: false
        axisTicks:
          show: false
      fill:
        opacity: 1
        type: gradient
        gradient:
          shade: light
          type: horizontal
      grid:
        show: false
    series:
      - entity: input_number.chauffage_salon_1_index
        type: column
        name: Salon 1
        float_precision: 2
        color: 17AB48
        opacity: 1
        group_by:
          duration: 1h
          func: diff
        show:
          datalabels: false
      - entity: input_number.chauffage_salon_2_index
        type: column
        name: Salon 2
        float_precision: 2
        color: 177DF7
        opacity: 1
        group_by:
          duration: 1h
          func: diff
        show:
          datalabels: false
      - entity: input_number.chauffage_sam_index
        type: column
        name: Salle a Manger
        float_precision: 2
        color: EA4234
        opacity: 1
        group_by:
          duration: 1h
          func: diff
        show:
          datalabels: false
      - entity: input_number.chauffage_pauline_index
        type: column
        name: Pauline
        float_precision: 2
        color: F399CA
        opacity: 1
        group_by:
          duration: 1h
          func: diff
        show:
          datalabels: false
      - entity: input_number.chauffage_parents_index
        type: column
        name: Parents
        float_precision: 2
        color: D3D24C
        opacity: 1
        group_by:
          duration: 1h
          func: diff
        show:
          datalabels: false
    style: |
      ha-card {
        background: var(--background-card-color);
        box-shadow: none;
        font-size: 1px;
        top: -2px;
        margin: -18px
      }
  - type: divider
  - type: custom:apexcharts-card
    cache: true
    update_interval: 5min
    chart_type: donut
    header:
      standard_format: true
      show: false
      show_states: false
    span:
      start: day
    graph_span: 24h
    stacked: false
    apex_config:
      stroke:
        show: true
        width: 0.5
      fill:
        opacity: 1
        type: gradient
        gradient:
          shade: light
          type: horizontal
      grid:
        show: false
    series:
      - entity: input_number.chauffage_salon_1_index
        name: Salon 1
        float_precision: 1
        color: 17AB48
        opacity: 1
        group_by:
          duration: 1d
          func: diff
        show:
          datalabels: true
      - entity: input_number.chauffage_salon_2_index
        name: Salon 2
        float_precision: 1
        color: 177DF7
        opacity: 1
        group_by:
          duration: 1d
          func: diff
        show:
          datalabels: true
      - entity: input_number.chauffage_sam_index
        name: Salle a Manger
        float_precision: 1
        color: EA4234
        opacity: 1
        group_by:
          duration: 1d
          func: diff
        show:
          datalabels: true
      - entity: input_number.chauffage_pauline_index
        name: Pauline
        float_precision: 1
        color: F399CA
        opacity: 1
        group_by:
          duration: 1d
          func: diff
        show:
          datalabels: true
      - entity: input_number.chauffage_parents_index
        name: Parents
        float_precision: 1
        color: D3D24C
        opacity: 1
        group_by:
          duration: 1d
          func: diff
        show:
          datalabels: true
    style: |
      ha-card {
        background: var(--background-card-color);
        box-shadow: none;
        font-size: 1px;
        top: -2px;
        margin: -6px
      }
show_header_toggle: false
card_mod:
  style: |
    ha-card {
      --ha-card-background: #131313BF;
      --ha-card-border-radius: 10px;
     # --paper-item-icon-color: #6E6E6E;
    #  --paper-item-icon-active-color: #44739e;
      --mini-media-player-background-opacity:0;
      --ha-card-box-shadow: 0px;
      --accent-color: #EA4234;
    }

Désolé du pavé :slight_smile:, amusez vous bien!

@Argonaute je peux déplacer ça dans un nouveau topic si ça t’embête ici :wink:

4 « J'aime »

Hello @djal,
Excellent, merci pour le partage. Non cela m’embête pas, mais par contre, tu as la un beau contenu et il va être noyé dans toutes les réponses à mon post. C’est vraiment dommage. Si cela te convient, l’idéal serait que tu refasses un sujet à toi avec le titre et l’intro qui vont bien. Je référencerai ton post dans mon post initial, comme j’ai déjà commencé à le faire.

2 « J'aime »

@Argonaute ok je vais faire ça. Mais je n’ai rien inventé, simplement lu la doc de Apex hein :slight_smile:

Sympa tes exemples. Je garde ça de coté :wink:
Mais l’intégration Energy maintenant disponible va continuer à bien évoluer, en tous cas chez HA il y bossent.

J’ai regardé le PID et oui ça à l’air pas mal.
On peut noter que le terme utilisé pour actionner les radiateur est PWM.
De mes souvenir d’automatisme, une pré-commande (ici en delta de température consigne-externe) peut être ajoutée sans problème à un PID (si elle n’est pas complètement fausse). Par contre cela nécessiterait de modifier le python.

Pour ma part, je posséde des panneaux rayonnants donc pas d’inertie.
Si je veux atteindre la consigne, il m’a été nécessaire d’ajuster le coefficient C à 0,8 et T à 0,015.

Il faut que je fignole encore ces paramètres compte tenu de la température extérieure qui baisse et qui continuera de baisser.

Mouais, entre la complexité du code de ScratMan et la simplicité de celui de @Argonaute, je n’hésite pas longtemps.
J’imagine que la complexité vient sans doute de l’intégration dans le climate.
Et effectivement, l’absence de prise en compte de la température extérieure (alors que l’algo en PID devrait être adapté) me semble une limitation (ce n’est que mon avis): tout le monde n’a pas un lieu de vie « bien » isolé, et c’est justement l’intérêt de l’approche d’@argonaute.

Bref, merci @Argonaute pour ce travail (je me répète, mais bon :grin:) mais j’attends tout de même ton retour @mycanaletto !

1 « J'aime »

L’approche est très différente. Le composant de ScratMan est un thermostat utilisable en remplacement des thermostats en place, il en est au début et va surement évoluer. Je lui ai laissé un mot à propos des condition extérieures, je pense plus à la température ressentie car en cas de vent ça a son importance…

63 messages ont été fusionnés à un sujet existant : [HACS] Smart Thermostat - le chauffage contrôlé par PID

Bonjour merci pour ce topic.
Le mode est très intéressant.

j’ai juste un problème en tant que novice, je souhaiterai mettre à la place du capteur de fenêtre que je n’ai pas, un virtual switch : binary_sensor si j’ai bien compris mais je ne trouve pas de tuto claire pour en créer un et pouvoir le sélectionner dans le paramétrage du blueprints.

13 messages ont été fusionnés à un sujet existant : [HACS] Smart Thermostat - le chauffage contrôlé par PID

Hello @Plouis,
Merci. Voila le code à mettre dans ton fichier yaml. Tu aura ainsi un binary sensor "fenetre_virtuelle toujours à off, en attendant d’avoir un vrai détecteur sur ta fenêtre.

binary_sensor:
  - platform: template
    sensors:
      fenetre_virtuelle:
          friendly_name: Fenetre vituelle
          value_template: off
          device_class: opening
2 « J'aime »

Pour les ouvertures il vaut mieux insérer un delai avant de tenir compte de l’information :

  - platform: template
    sensors:
      bureau_window_delayed:
        friendly_name: "Fenêtre (delayed)"
        device_class: window  # ou door
        delay_on: 
          seconds: 300
        delay_off:
          seconds: 300
        value_template: >-
          {{ is_state('binary_sensor.fenetre_bureau', 'on') }}
        icon_template: >-
          {% if is_state('binary_sensor.fenetre_bureau', 'on') %}
            mdi:window-open
          {% else %}
            mdi:window-closed
          {% endif %}  
1 « J'aime »

Merci pour votre aide

J’ai ajouté le bout de code dans mon fichier yam configuration, mais quand je retourne après un redémarrage du serveur sur le blueprints. dans la partie fenêtre il ne me propose pas de sensor.

qu’est ce que je fais mal ?

Oups, je suis désolé, il manquait la device_class. Essaie ce code.