Forum Francophone Home Assistant

Chauffage électrique sans fils pilote (version centralisé)

cette version est pour une maison bien isolée, à étage ou toutes les pièces sont occupées.


petit rappel j’utilise la méthode des includes.

partie 1 climate.

créer un fichier climat.yaml et l’include dans configuration.yaml. vous avez ainsi vos thermostats.

############### 
### cuisine ###
############### 
  - platform: generic_thermostat
    name: Thermostat Cuisine
    heater: switch.ch_cuisine
    target_sensor: sensor.temperature_cuisine
    min_temp: 15
    max_temp: 21
    ac_mode: false
    cold_tolerance: 0.5
    hot_tolerance: 0.1
    keep_alive:
      minutes: 3
    min_cycle_duration:
      seconds: 60
    away_temp: 15
    precision: 0.1
############### 
#### salon ####
############### 
  - platform: generic_thermostat
    name: Thermostat salon
    heater: switch.ch_salle
    target_sensor: sensor.temperature_salon
    min_temp: 15
    max_temp: 21
    ac_mode: false
    cold_tolerance: 0.5
    hot_tolerance: 0.1
    keep_alive:
      minutes: 3
    min_cycle_duration:
      seconds: 60
    away_temp: 15
    precision: 0.1
############### 
## CHambre 1 ##
############### 
  - platform: generic_thermostat
    name: Thermostat chambre1
    heater: switch.ch_chambre_1
    target_sensor: sensor.temperature_chambre_1
    min_temp: 15
    max_temp: 21
    ac_mode: false
    cold_tolerance: 0.5
    hot_tolerance: 0.1
    keep_alive:
      minutes: 3
    min_cycle_duration:
      seconds: 60
    away_temp: 15
    precision: 0.1
############### 
## CHambre 2 ##
############### 
  - platform: generic_thermostat
    name: Thermostat chambre2
    heater: switch.ch_chambre_2
    target_sensor: sensor.temperature_chambre_2   
    min_temp: 15
    max_temp: 21
    ac_mode: false
    cold_tolerance: 0.5
    hot_tolerance: 0.1
    keep_alive:
      minutes: 3
    min_cycle_duration:
      seconds: 60
    away_temp: 15
    precision: 0.1
############### 
## CHambre 3 ##
############### 
  - platform: generic_thermostat
    name: Thermostat chambre3
    heater: switch.ch_chambre_3
    target_sensor: sensor.temperature_chambre_3 
    min_temp: 15
    max_temp: 21
    ac_mode: false
    cold_tolerance: 0.5
    hot_tolerance: 0.1
    keep_alive:
      minutes: 3
    min_cycle_duration:
      seconds: 60
    away_temp: 15
    precision: 0.1
############### 
## CHambre 4 ##
############### 
  - platform: generic_thermostat
    name: Thermostat chambre4
    heater: switch.ch_ch4
    target_sensor: sensor.temperature_chambre_4
    min_temp: 15
    max_temp: 21
    ac_mode: false
    cold_tolerance: 0.5
    hot_tolerance: 0.1
    keep_alive:
      minutes: 3
    min_cycle_duration:
      seconds: 60
    away_temp: 15
    precision: 0.1
############### 
##### SDB #####
############### 
  - platform: generic_thermostat
    name: Thermostat salle de bain
    heater: switch.ch_sdb
    target_sensor: sensor.temperature_salle_de_bain
    min_temp: 15
    max_temp: 21
    ac_mode: false
    cold_tolerance: 0.5
    hot_tolerance: 0.1
    keep_alive:
      minutes: 3
    min_cycle_duration:
      seconds: 60
    away_temp: 15
    precision: 0.1

partie 2 consigne marche arrêt et forcer.

créer les fichiers input_number.yaml, input_boolean.yaml, input_select.yaml et leurs includes dans configuration.yaml.

  • 2/1 input_number.yaml

     #############################
     ###### consigne CH ############
     #############################
      consigne_confort:
          name: confort
          initial: 21
          min: 20
          max: 24
          step: 0.1
          unit_of_measurement: °C
      consigne_normal:
          name: normal
          initial: 20
          min: 19
          max: 21
          step: 0.1
          unit_of_measurement: °C
      consigne_eco:
          name: Eco
          initial: 19
          min: 16
          max: 20
          step: 0.1
          unit_of_measurement: °C
    
  • 2/2 input_boolean.yaml

      #############################
      ######## chauffage ##########
      #############################    
      thermostats_on_off:
        name: Chauffage On / Off
        icon: mdi:thermostat-box
      thermostats_horaire:
        name: horaire on/off
        icon: mdi:thermostat-box
    
  • 2/3 input_select.yaml

      #############################
      ######## CH select ##########
      #############################
      chauffage:
        name: Etats du Chauffage
        icon: mdi:home-minus
        options:
           - confort
           - normal
           - eco
    

partie 3 horaires. les on/off (horaire et chauffage ont été créer en * 2/2)

créer input_datetime.yaml et son include dans configuration.yaml

#############################
######## heures CH ##########
#############################
  sejour_start_1:
    has_date: false
    has_time: true
  sejour_stop_1:
    has_date: false
    has_time: true
  sejour_start_2:
    has_date: false
    has_time: true
  sejour_stop_2:
    has_date: false
    has_time: true
  sejour_start_3:
    has_date: false
    has_time: true
  sejour_stop_3:
    has_date: false
    has_time: true

la mise en forme:
bloc 1

type: entities
entities:
  - entity: climate.thermostat_cuisine
  - entity: climate.thermostat_salon
  - type: section
  - entity: climate.thermostat_chambre1
  - entity: climate.thermostat_chambre2
  - entity: climate.thermostat_chambre3
  - entity: climate.thermostat_salle_de_bain
  - type: section
  - entity: climate.thermostat_chambre4

bloc 2

type: entities
entities:
  - entity: input_boolean.thermostats_on_off
  - entity: input_select.chauffage
  - entity: input_number.consigne_confort
  - entity: input_number.consigne_eco
  - entity: input_number.consigne_normal
state_color: true
show_header_toggle: false

bloc 3

type: entities
entities:
  - entity: input_boolean.thermostats_horaire
  - type: section
  - entity: input_datetime.sejour_start_1
    name: départ
  - entity: input_datetime.sejour_stop_1
    name: fin
  - type: section
  - entity: input_datetime.sejour_start_2
    name: départ
  - entity: input_datetime.sejour_stop_2
    name: fin
  - type: section
  - entity: input_datetime.sejour_start_3
    name: départ
  - entity: input_datetime.sejour_stop_3
    name: fin
  - type: section
state_color: true

1
j’ai utilisé multiple entiy row et des sensor tranche 1,2,3 pour ma carte du début voici le code

cards: null
type: entities
entities:
  - entity: input_boolean.thermostats_horaire
  - type: section
  - entity: sensor.tranche_1
    type: 'custom:multiple-entity-row'
    state: true
    show_state: false
    entities:
      - entity: input_datetime.sejour_start_1
        name: départ
      - entity: input_datetime.sejour_stop_1
        name: fin
  - type: section
  - entity: sensor.tranche_2
    state: true
    show_state: false
    entities:
      - entity: input_datetime.sejour_start_2
        name: départ
      - entity: input_datetime.sejour_stop_2
        name: fin
    type: 'custom:multiple-entity-row'
  - type: section
  - entity: sensor.tranche_3
    state: true
    show_state: false
    entities:
      - entity: input_datetime.sejour_start_3
        name: départ
      - entity: input_datetime.sejour_stop_3
        name: fin
    type: 'custom:multiple-entity-row'
  - type: section
state_color: true

1

4 les automations: a adapter à vos besoins

attention suite au rajout de température en baisse, remplacer turn on/off automation id par le numero de l’id correspondant (dans automation.yaml)

   alias: 'CH changement consigne '
description: ''
trigger:
  - platform: state
    entity_id: input_select.chauffage
condition: []
action:
  - choose:
      - conditions:
          - condition: state
            entity_id: input_select.chauffage
            state: confort
        sequence:
          - service: climate.set_temperature
            data:
              entity_id: all
              temperature: '{{ states(''input_number.consigne_confort'') }}'
      - conditions:
          - condition: state
            entity_id: input_select.chauffage
            state: normal
        sequence:
          - service: climate.set_temperature
            data:
              entity_id: all
              temperature: '{{ states(''input_number.consigne_normal'') }}'
      - conditions:
          - condition: state
            entity_id: input_select.chauffage
            state: eco
        sequence:
          - service: climate.set_temperature
            data:
              entity_id: all
              temperature: '{{ states(''input_number.consigne_eco'') }}'
    default: []
mode: single

alias: 'CH on/off '
description: ''
trigger:
  - platform: state
entity_id: input_boolean.thermostats_on_off
condition: []
action:
  - choose:
  - conditions:
      - condition: state
        entity_id: input_boolean.thermostats_on_off
        state: 'on'
    sequence:
      - service: climate.turn_on
        data:
          entity_id: all
  - conditions:
      - condition: state
        entity_id: input_boolean.thermostats_on_off
        state: 'off'
    sequence:
      - service: climate.turn_off
        data:
          entity_id: all
default: []
mode: single

alias: 'CH on/off horaire 1 et 2 '
description: ''
trigger:
  - platform: template
value_template: >-
  {{ (states('sensor.time') == states('input_datetime.sejour_start_1')[0:5])
  or (states('sensor.time') == states('input_datetime.sejour_start_2')[0:5])
  }}
  - platform: template
value_template: >-
  {{ (states('sensor.time') ==  states('input_datetime.sejour_stop_1')[0:5])
  or (states('sensor.time') == states('input_datetime.sejour_stop_2')[0:5])
  }}
condition: []
action:
  - choose:
  - conditions:
      - condition: template
        value_template: >-
          {{ (states('sensor.time') ==
          states('input_datetime.sejour_start_1')[0:5]) or
          (states('sensor.time') ==
          states('input_datetime.sejour_start_2')[0:5]) }}
    sequence:
      - service: input_select.select_option
        data:
          option: normal
        entity_id: input_select.chauffage
  - conditions:
      - condition: template
        value_template: >-
          {{ (states('sensor.time') == 
          states('input_datetime.sejour_stop_2')[0:5]) or
          (states('sensor.time') ==
          states('input_datetime.sejour_stop_1')[0:5]) }}
    sequence:
      - service: input_select.select_option
        data:
          option: ecalias: 'CH on/off horaire 1 et 2 '
description: ''
trigger:
  - platform: template
value_template: >-
  {{ (states('sensor.time') == states('input_datetime.sejour_start_1')[0:5])
  or (states('sensor.time') == states('input_datetime.sejour_start_2')[0:5])
  }}
  - platform: template
value_template: >-
  {{ (states('sensor.time') ==  states('input_datetime.sejour_stop_1')[0:5])
  or (states('sensor.time') == states('input_datetime.sejour_stop_2')[0:5])
  }}
condition: []
action:
  - choose:
  - conditions:
  - condition: template
    value_template: >-
      {{ (states('sensor.time') ==
      states('input_datetime.sejour_start_1')[0:5]) or
      (states('sensor.time') ==
      states('input_datetime.sejour_start_2')[0:5]) }}
sequence:
  - service: input_select.select_option
    data:
      option: normal
    entity_id: input_select.chauffage
  - service: automation.turn_off
    data:
      entity_id: CH ext en baisse # id de automation.yaml ex: 1609847554698
  - conditions:
  - condition: template
    value_template: >-
      {{ (states('sensor.time') == 
      states('input_datetime.sejour_stop_2')[0:5]) or
      (states('sensor.time') ==
      states('input_datetime.sejour_stop_1')[0:5]) }}
sequence:
  - service: input_select.select_option
    data:
      option: eco
    entity_id: input_select.chauffage
  - service: automation.turn_on
    data:
      entity_id: CH ext en baisse # id de automation.yaml ex: 1609847554698
default: []
mode: single

alias: CH on/off horaire 3
description: ''
trigger:
  - platform: template
value_template: >-
  {{ (states('sensor.time') == states('input_datetime.sejour_start_3')[0:5])
  }}
  - platform: template
value_template: >-
  {{ (states('sensor.time') ==  states('input_datetime.sejour_stop_3')[0:5])
  }}
condition: []
action:
  - choose:
  - conditions:
  - condition: template
    value_template: >-
      {{ (states('sensor.time') ==
      states('input_datetime.sejour_start_3')[0:5]) }}
sequence:
  - service: input_select.select_option
    data:
      option: confort
    entity_id: input_select.chauffage
  - service: automation.turn_off
    data:
      service: CH ext en baisse # id de automation.yaml ex: 1609847554698
  - conditions:
  - condition: template
    value_template: >-
      {{ (states('sensor.time') == 
      states('input_datetime.sejour_stop_3')[0:5]) }}
sequence:
  - service: input_select.select_option
    data:
      option: eco
    entity_id: input_select.chauffage
  - service: automation.turn_on
    data:
      service: CH ext en baisse # id de automation.yaml ex: 1609847554698
default: []
mode: single

addons:
sensor.yaml pour le visuel des tranches horaires

#############################
########  tranches ##########
#############################
- platform: template
  sensors:
    tranche_1:
      friendly_name: tranche 1
      value_template: >-
        {{ (states.sensor.time.state >= states.input_datetime.sejour_start_1.state) and  (states.sensor.time.state <= states.input_datetime.sejour_stop_1.state)}}
      icon_template: >-
        {% if is_state('sensor.tranche_1', 'True') %}
           mdi:lightning-bolt: mdi:radiator
        {% else %}
            mdi:sleep
          {% endif %}
- platform: template
  sensors:
    tranche_2:
      friendly_name: tranche 2
      value_template: >-
        {{ (states.sensor.time.state >= states.input_datetime.sejour_start_2.state) and  (states.sensor.time.state <= states.input_datetime.sejour_stop_2.state)}}
      icon_template: >-
        {% if is_state('sensor.tranche_2', 'True') %}
           mdi:lightning-bolt: mdi:radiator
        {% else %}
            mdi:sleep
          {% endif %}
- platform: template
  sensors:
    tranche_3:
      friendly_name: tranche 3
      value_template: >-
        {{ (states.sensor.time.state >= states.input_datetime.sejour_start_3.state) and  (states.sensor.time.state <= states.input_datetime.sejour_stop_3.state)}}
      icon_template: >-
        {% if is_state('sensor.tranche_3', 'True') %}
           mdi:lightning-bolt: mdi:radiator
        {% else %}
            mdi:sleep
          {% endif %}

petit rajout:
en cas de baisse rapide de température extérieur: 3c° en 1h augmentation temporaire du chauffage si pas en normal ou confort.

binary_sensor.yaml

- platform: trend
      sensors:
        temp_en baisse:
          entity_id: sensor.temperature_ext
          sample_duration: 7200
          max_samples: 120
          min_gradient: -0.0008
          device_class: cold

        temp_en hausse:
          entity_id: sensor.temperature_ext
          sample_duration: 7200
          max_samples: 120
          min_gradient: 0.0008
          device_class: heat

automation:

alias: CH ext en baisse
description: ''
trigger:
  - platform: state
    entity_id: binary_sensor.temp_en_baisse
condition:
  - condition: state
    entity_id: input_select.chauffage
    state: eco
action:
  - choose:
      - conditions:
          - condition: state
            entity_id: binary_sensor.temp_en_baisse
            state: 'off'
        sequence:
          - service: input_select.select_option
            entity_id: input_select.chauffage
            data:
              option: eco
      - conditions:
          - condition: state
            entity_id: binary_sensor.temp_en_baisse
            state: 'on'
        sequence:
          - service: input_select.select_option
            entity_id: input_select.chauffage
            data:
              option: confort
    default: []
mode: single
3 J'aimes

Merci pour le partage :wink:

Tu chauffes à la même température dasn toutes les pièces :wink:

Il semblerait qu’il soit conseillé d’utiliser cette syntaxe la pour les templates dorénavant :

Devient

{{ states('input_number.consigne_confort') }}

oui j’habite une maison à étage, et donc en chauffant en bas ca monte toujours ( très grand escalier). je chauffe essentiellement en heures creuses ( et j’ai des automations que pour la salle de bain). la journée je chauffe au bois. en réalité les radiateurs marchent très peu ( à part la cuisine qui est le passage avec l’extérieur) car j’ai une isolation très performante sur mes murs extérieurs.
je partage le principe après il est sûre qu’il faut adapter à son besoin. (comme toujours).
:revolving_hearts:
je vais corriger les Templates.
Rajout:
Corrigé
Et du coup quand je chauffe les étages le froid descend, dans l’escalier on prend une douche de froid, :fire:

2 J'aimes

euh la je bloque :slight_smile: ca marche mais ca doit pas etre ca.
si j’ecrit

> "{{states('input_number.consigne_normal')}}"

il m’enregistre avec l’ancienne valeur.

C’est ce que j’avais fait il y a un an. Mais depuis il y a le Sheduler qui peut bien t’aider…

1 J'aime

tu veux dire que cela ne se met pas à jour ?
Dans ton code il manque les espaces.

Essaie cela dans developer tools stp et modifie ta consigne

{{ states('input_number.consigne_normal') }}

dans développer tool ca marche mais dans mon automation ca change a chaque fois.

ca doit etre temperature: '{{ states(''input_number.consigne_normal'') }}' qui marche et pas l’autre.

Tu veux dire que les simples quotes et doubles quotes sont inversées ?
Ce qui est possible vu la signification normale des quotes

1 J'aime

Oui tout à fait , ça fonctionne

Bonsoir Steffleur,
Super boulot ta gestion du chauffage, j’aimerai faire pareil mais je début et je ne comprend pas tout encore loin de là.
je vois pas ou tu mets les bloc 1, 2 et 3.
Il y aurait moyen de voir tes fichiers yaml ? Je trouve que ce tout n’est pas super intuitif dans Home Assistant mais je trouve que c’est puissant une fois que l’on comprend comment fonctionne les fichiers yaml.
En tout cas merci pour ce tuto.
Bonne soirée

1 J'aime

les bloc 1.2.3
sont les cartes. pour lovelace. L’interface graphique (la photo tout en haut)
image
tu vas sur lovelace puis les trois point en haut a droite .
modifier le tableau de bord.
puis ajouter une carte.
et tu prend la dermiere ‹ manuelle ›
et tu colle le code.

Merci, je vais essayer d’appliquer cela à mon système. Si ça ne te derange pas je risque de demander quelques conseilles de plus si je bloque à moment donné. Encore merci