[Article] Gestion de bout en bout du chauffage

Aie, je crains qu’il ne faille soit adapter le blueprint en supprimant la variable et le test de la fenêtre (le plus propre), soit utiliser un binary_sensor pour simuler une fenêtre toujours fermée. Pour cela, tu peux par exemple utiliser un template binary_sensor avec un état toujours à off.
Pour le on-off d’allumage, le plus simple est de changer directement le blue print et de mettre on à la place de off et/ou réciproquement.
J’ai donné les blueprint et cartes comme modèles et il peut y avoir du sens de les adapter aux besoins de chacun.

Je quitte le lua pour le yaml et au premier abord, c’est loin d’etre simple.
Peux-tu verifier, merci ?

blueprint:
  name: Thermostat TPI
  description: Thermostat TPI (Time Propertional & Integral)
  domain: automation

  input:
    coeff_c:
      name: Coefficient C
      description: coefficient multiplicateur de la différence entre la consigne et éa température intérieure pour le calcul de la puissance (0.6 conseillé)
      selector:
        number:
          min: 0.0
          max: 1.0
          step: 0.01
    coeff_t:
      name: Coefficient T
      description: coefficient multiplicateur de la différence entre la consigne et éa température extérieure pour le calcul de la puissance (0.01 conseillé)
      selector:
        number:
          min: 0.0
          max: 0.1
          step: 0.001
    entity_consigne:
      name: Consigne
      description: Champs d'entrée de la température de consigne (input number).
      selector:
        entity:
          domain: input_number
    entity_temp_ext:
      name: Température extérieure
      description: Sonde de mesure de la température extérieure (sensor)
      selector:
        entity:
          domain: sensor
          device_class: temperature
    entity_temp_int:
      name: Température intérieure
      description: Sonde de mesure de la température intérieure (sensor)
      selector:
        entity:
          domain: sensor
          device_class: temperature
    entity_puissance:
      name: Puissance
      description: Champs d'affichage de la puissance (input_number)
      selector:
        entity:
          domain: input_number
    entity_chauffage:
      name: Chauffage
      description: Interrupteur marche / arrêt du chauffage (switch)
      selector:
        entity:
          domain: switch

# Récupération des paramètres
variables:
  coeff_c: !input coeff_c
  coeff_t: !input coeff_t
  entity_temp_int: !input entity_temp_int
  entity_temp_ext: !input entity_temp_ext

trigger:
  - platform: time_pattern
    minutes: "/10"
  - platform: state
    entity_id: !input entity_consigne
#  - platform: state
#    entity_id: !input entity_temp_int

action:
  - alias: récupération des données
    variables:
      entity_consigne: !input entity_consigne
      consigne: "{{states(entity_consigne)}}"
      temp_ext: '{{ states(entity_temp_ext) }}'
      temp_int: '{{ states(entity_temp_int) }}'   
      puissance: >-
        {%set val = coeff_c * (consigne - temp_int) + coeff_t * (consigne -
        temp_ext) %}  {% if val > 1 %} {% set val = 100 %}  {% elif val < 0 %}
        {% set val = 0 %}  {% else %} {% set val = ( (val *
        100) | round(0)) %} {% endif %} {{val}}
      temps_chauffe: '{{ puissance * 6 }}'
  - alias: Met à jour l'indicateur de puissance
    service: input_number.set_value
    target:
      entity_id: !input entity_puissance
    data:
      value: '{{puissance}}'  
  - choose:
      - conditions:
          - condition: template
            value_template: '{{puissance == 0}}'
        sequence:
          - service: switch.turn_on
            target:
              entity_id: !input entity_chauffage
      - conditions:
          - condition: template
            value_template: '{{ puissance > 99}}'
        sequence:
          - service: switch.turn_off
            target:
              entity_id: !input entity_chauffage
    default:
      - service: switch.turn_off
        target:
          entity_id: !input entity_chauffage
      - delay: '{{temps_chauffe}}'
      - service: switch.turn_on
        target:
          entity_id: !input entity_chauffage
mode: restart
blueprint:
  name: Pilotage chauffage
  description: Gestion des différents modes de chauffage - Stop  Hors-gel  Auto confort Auto eco 
  domain: automation

  input:
    entity_consigne:
      name: Consigne
      description: Champs d'entrée de la température de consigne (input number).
      selector:
        entity:
          domain: input_number
    entity_mode:
      name: Sélection du mode
      description: Entité de gestion du mode de gestion du chauffage (input_select)
      selector:
        entity:
          domain: input_select
    entity_schedule_confort:
      name: Schedule mode confort
      description: Entité générée par schedule pour la planification du mode confort (switch)
      selector:
        entity:
          domain: switch
    entity_schedule_eco:
      name: Schedule mode eco
      description: Entité générée par schedule pour la planification du mode eco (switch)
      selector:
        entity:
          domain: switch
    entity_thermostat_tpi:
      name: Thermostat
      description: Entité de gestion du thermostat TPI (automation)
      selector:
        entity:
          domain: automation


# Température pour le hors gel
variables:
  temperature_hg: 10

alias: Pilotage chauffage bureau Patrick
description: ''
trigger:
  - platform: state
    entity_id: !input entity_mode
condition: []
action:
  - choose:
      # ----- Mode Stop
      - conditions:
          - condition: state
            entity_id: !input entity_mode
            state: Stop
        sequence:
          - service: input_number.set_value
            data:
              value: 0
            target:
              entity_id: !input entity_consigne
          - service: switch.turn_on
            target:
              entity_id:
                - !input entity_schedule_eco
                - !input entity_schedule_confort
          - service: automation.turn_on
            target:
              entity_id: !input entity_thermostat_tpi
      # ----- Mode Hors-gel
      - conditions:
          - condition: state
            entity_id: !input entity_mode
            state: Hors-gel
        sequence:
          - service: automation.turn_on
            target:
              entity_id: !input entity_thermostat_tpi
          - service: input_number.set_value
            data:
              value: '{{temperature_hg}}'
            target:
              entity_id: !input entity_consigne
          - service: switch.turn_on
            target:
              entity_id:
                - !input entity_schedule_eco
                - !input entity_schedule_confort
      # ----- Mode Auto - confort
      - conditions:
          - condition: state
            entity_id: !input entity_mode
            state: Auto - confort
        sequence:
          - service: automation.turn_on
            target:
              entity_id: !input entity_thermostat_tpi
          - service: switch.turn_off
            target:
              entity_id: !input entity_schedule_confort
          - service: switch.turn_on
            target:
              entity_id:
                - !input entity_schedule_eco
      # ----- Mode Auto - eco ou absent
      - conditions:
          - condition: or
            conditions:
              - condition: state
                entity_id: !input entity_mode
                state: 'Auto - eco'
              - condition: state
                entity_id: !input entity_mode
                state: 'Absent'
        sequence:
          - service: automation.turn_on
            target:
              entity_id: !input entity_thermostat_tpi
          - service: switch.turn_on
            target:
              entity_id:
                - !input entity_schedule_confort
          - service: switch.turn_off
            target:
              entity_id: !input entity_schedule_eco
    # ----- Mode manuel
    default:
      - service: switch.turn_on
        target:
          entity_id:
            - !input entity_schedule_eco
            - !input entity_schedule_confort
      - service: automation.turn_off
        target:
          entity_id: !input entity_thermostat_tpi
mode: single

J’ai relu et chargé sur mon serveur de test les yaml pour vérifier la syntaxe, mais pas testé. Oui top, c’est à priori bon :blush:

yaml n’est pas naturel au début, surtout si on est habitué à de la programmation structurée classique, mais une fois un cap passé, c’est très puissant et relativement facile et rapide à maintenir. Cela vaut le coup de persévérer.

OK. Merci.
En même temps, j’ai pas fait grand chose. J’ai supprimé tout ce qui concernait le capteur d’ouverture de fenêtre et remplacé switch.turn_on par switch.turn_off et inversement.

Bonjour, est-ce qu’il y a la possibilité de rendre ce thermostat compatible avec les assistants vocaux comme Siri ? Merci d’avance :blush:

Hello,
Pour Siri, il faut passer par HomeKit. Et pour Alexa et Google Assistant, le plus simple reste de passer par le cloud de Nabu Casa.

Si l’objectif est de piloter la température, cela ne fonctionnera pas nativement : il faudrait exposer la consigne du thermostat portée par l’entité input_number. Or sauf erreur les assistants vocaux ne supportent pas le pilotage d’une valeur type input_number.

Par contre, les assistants supportent les thermostats (climate). Il faudrait donc recréer un thermostat type climate juste pour utiliser la consigne via l’assistant vocal, puis reprendre cette consigne dans le thermostat TPI (ou remplacer l’input_number dans le thermostat TPI par la consigne du climate). Je n’ai cependant pas testé.

Aucun problème par contre pour lire une température ou démarrer/arrêter le thermostat par un assistant.

Merci, je regarderai ça, la semaine prochaine :blush:

Merci pour ce super partage
Est il possible de l’adapter à un chauffage central à eau chaude avec vanne thermostatique?

Salut,

ça va dépendre du contexte et de ce que tu veux que ça fasse, mais sur le principe c’est quand même différent :

  • Le chauffage centrale (eau) dispose de beaucoup plus d’inertie que les convecteurs electriques
  • Une vanne thermostatique pilotée en principe, c’est pas du on/on comme sur les convecteurs… Le réglage est progressif

Donc à première vue, la partie planning est réutilisable, mais le reste risque de rendre les choses moins simples que le fonctionnement de base, non ? Et pas certain qu’il y a un gain en confort.

Merci.

Oui tout à fait c’est tout à fait possible. Il y aurait 2 adaptations à faire dans le blueprint du thermostat TPI:

  • Augmenter le temps de recalcul. 10mn est pour un convecteur électrique et il faudrait passer à 30mn (voir plus) pour considérer l’inertie du chauffage à eau chaude.
  • Le thermostat TPI proposé pilote un on-off et module le temps de ON et OFF en fonction de la puissance (par ex 3mn en ON et 7mn en OFF pour puissance à 30%). Il faudrait alors utiliser directement la puissance calculée par le thermostat (entre 0 et 100%) pour piloter la vanne électrostatique.

=> toutes les 30 mn, chaque vanne recevrait alors une valeur comprise entre 0 et 100 en fonction des températures intérieures et extérieures.
Dans l’exemple, une vanne recevra la valeur de 30% si la puissance calculée est à 30%.

Si une fenêtre ouverte, la vanne recevra une valeur de 0%.

Salut
Ça c’est à condition que ce soit une vanne pilotée en ouverture ? Genre les lc13 c’est une consigne

L’idée serait de mettre des vannes thermostatiques zigbee pour pouvoir les piloter et reprendre les informations de température ambiante via ces vannes pour mettre en chauffe la chaudière si une température ambiante est en dessous de la consigne.

Il faut regarder ton système de chauffage…
Vanne 3 voies ? Ballon tampon ? Un bon circulateur ?
En principe, c’est la loi d’eau qui le boulot sur une chaudière. Dans le cas d’un ballon tampon, la chaudière assure le maintien en température du ballon (un volume limité vis-à-vis du circuit complet). Si on pioche dedans en ouvrant les vannes, la température du ballon descend. La chaudière compense. Si les vannes restent fermées la température du ballon varie peu et la chaudière fonctionne au minimum.
Dans le cas d’un vanne 3 voies c’est moins facile (il n’y a pas de réserve) mais le principe reste le même.
Et pareil, allumer/éteindre une chaudière fioul c’est pas vraiment bon pour l’encrassement des brûleurs…

Ma chaudière est une chaudière gaz.
Elle est assez basique.
Un simple contact du thermostat situé dans la pièce principale la met en chauffe et met en marche le circulateur.
Lorsque la température est atteinte la chauffe s’arrête et le circulateur continue pendant 10 à 15 minutes.
La température d’eau est réglée par un bouton en façade de chaudière.
Les vannes thermostatiques font le reste.
La problème avec ce système c’est que si il fait chaud dans la pièce principale, la chaudière ne chauffe pas et il fait froid dans les autres pièces

Effectivement, pour pouvoir adapter le thermostat du blue print, il faut pouvoir piloter l’ouverture de la vanne et non la consigne de température.L’idée est de remplacer le thermostat intégré, comme avec les convecteurs, la sonde du radiateur étant trop proche de la source de chaleur pour être pertinente. Mais je ne connais pas assez ces produits pour savoir quelles vannes le permettent. Si quelqu’un a un retour sur ce sujet…

Je reprends la mise en place de ce blueprint et je rencontre pas mal de difficultés.
Tout d’abord, la création des input_number que j’ai crée dans le fichier /config/input_number.yaml

consigne_salon:                   # l'id unique
    name: consigne_salon         # un nom
    initial: 20.5             # un état initial
    min: 16                 # une valeur mini
    max: 24                 # une valeur max
    step: 0.5               # la valeur d'un interval
    unit_of_measurement: °C
    
consigne_chambre:
    name: consigne_chambre         # un nom
    initial: 17.5             # un état initial
    min: 16                 # une valeur mini
    max: 19                 # une valeur max
    step: 0.5               # la valeur d'un interval
    unit_of_measurement: °C
    
puissance_radiateur_salon:
    name: puissance_radiateur_salon         # un nom
    initial: 7750             # un état initial
    min: 7500                 # une valeur mini
    max: 8000                 # une valeur max
    step: 250               # la valeur d'un interval
    unit_of_measurement: Watt

puissance_radiateur_chambre:
    name: puissance_radiateur_chambre         # un nom
    initial: 1000             # un état initial
    min: 999                 # une valeur mini
    max: 1001                 # une valeur max
    step: 1               # la valeur d'un interval
    unit_of_measurement: Watt

C’est bon ou pas ?

Hello,
Si tu reprends le blueprint, il faut une consigne qui démarre a 0 pour que le blueprint puisse la baisser (hors gel par ex).
Enfin la puissance est un % de 0 a 100. Tu pourra utiliser ultérieurement un template pour convertir en watts.

Hi @Argonaute

J’ai rien compris … :flushed: … ou presque …Comme ça, c’est mieux ?
Par contre, les % pour la puissance, je ne vois comment les faire apparaître.
J’ai copié sur @Steph_Flo, plus haut dans le post.

consigne_salon:                   # l'id unique
    name: consigne_salon         # un nom
    min: 16                 # une valeur mini
    max: 24                 # une valeur max
    step: 0.5               # la valeur d'un interval
    mode: slider
    unit_of_measurement: °C
    
consigne_chambre:
    name: consigne_chambre         # un nom
    min: 16                 # une valeur mini
    max: 19                 # une valeur max
    step: 0.5               # la valeur d'un interval
    mode: slider
    unit_of_measurement: °C
    
puissance_radiateur_salon:
    name: puissance_radiateur_salon         # un nom
    min: 0                 # une valeur mini
    max: 100                 # une valeur max
    step: 5               # la valeur d'un interval
    mode: slider
    
puissance_radiateur_chambre:
    name: puissance_radiateur_chambre         # un nom
    min: 0                 # une valeur mini
    max: 100                 # une valeur max
    step: 5               # la valeur d'un interval
    mode: slider

Dans le paragraphe 5, tu écris …

Une fois la carte scheduler créée, elle est vide. Il faut utiliser l’interface pour créer les différentes planifications (type schema - 2 planifications : auto-eco et auto-confort pour chaque radiateur).
Ci-dessous également le code du bandeau d’entête de la vue principale, avec l’icone pour accéder à la vue de paramétrage.

et là je suis perdu … Un peu d’aide serait la bienvenue. Merci.

Oui il faudra utiliser l’interface du scheduler pour créer les programmations.

Mais avant, il faut faire fonctionner le thermostat. Le min des consignes doit être à 0 et pas 16. Met le max a 28°c pour tester que le thermostat fonctionne (il faut chaud en ce moment, tu as mis 19°c).
Ensuite créer l’automatisation basé sur le blue print du thermostat. Aussi la puissance sera automatiquement réglée en fonction de la différence entre consigne mise dans l’input text et de la chaleur de la pièce.
Tu dois aussi créer l’input select avec les modes.

Enfin, créer la carte lovelace. Pour tester le thermostat, mets en ode manuel, puis change la consigne et vérifie que la puissance change : à 0% si la consigne est basse (par exemple 10°c) et à 100% si la consigne est haute (par exemple 28°c, le max).

Mais avant, il faut faire fonctionner le thermostat. Le min des consignes doit être à 0 et pas 16. Met le max a 28°c pour tester que le thermostat fonctionne (il faut chaud en ce moment, tu as mis 19°c).

J’ai pigé. Min réglé à 0 et max à 28°C, toutefois avec les températures actuelles, mes radiateurs ne se mettront pas en route même en étant à fond.
Mon but étant de mettre le système un maximum en place avant la mise en route.

Ensuite créer l’automatisation basé sur le blue print du thermostat. Aussi la puissance sera automatiquement réglée en fonction de la différence entre consigne mise dans l’input text et de la chaleur de la pièce.

Déjà fait.

Tu dois aussi créer l’input select avec les modes.

Déja fait, comme ça :

chauffage:
  name: Etat du chauffage
  icon: mdi:home-minus
  options:
     - Auto-confort
     - Auto-eco
     - Manuel
     - Stop
     - Hors-gel
     - Absent

Enfin, créer la carte lovelace. Pour tester le thermostat, mets en ode manuel, puis change la consigne et vérifie que la puissance change : à 0% si la consigne est basse (par exemple 10°c) et à 100% si la consigne est haute (par exemple 28°c, le max).

Carte créée. Par contre, la modification de la consigne (0 ou 28°C) ne fait pas bouger la puissance.

Oui il faudra utiliser l’interface du scheduler pour créer les programmations.

Là …par contre, j’ai pas compris comment créer les programmations ?
En cliquant sur Modifier sur la carte, je vois « Groupe » « Entités » « Actions » ??

J’ai beau lire et relire le paragraphe 5 de ton premier post. C’est incompréhensible pour un néophyte comme moi.