HA-Automatisation des volets

Intro

Description des automatismes mis en place dans la gestion de mes volets roulants

Je possède deux types de volets roulants:
– Volets Somfy protocole RTS
– Volets Filaires

Les volets Somfy sont équipés de moteurs intégrés avec un protocole RTS, les volets filaires sont pilotés par des modules Chacon DIO, dans les deux cas, je les ai associé à HA via une passerelle RFXtrx433E branchée en USB sur le NUC.

L’intégration HA utilisée est RFXCOM RFXtrx. Il faut bien lire la documentation qui explique comment générer le code associé au volet puis comment l’intégrer dans HA.

Modes de fonctionnement

J’utilise 3 modes de fonctionnement sélectionnable via un « input.select »:

Auto Hiv

L’hiver, nous préférons fermer les volets des la tombée de la nuit afin de se préserver du froid. L’ouverture et la fermeture sont basés sur la luminosité extérieure et la position du soleil. La luminosité est mesuré par un ESP8266-01 sous ESPHOME équipé d’une cellule bh1750.

Les seuils de luminosité haut et bas sont mémorisés dans des input_number, un pour la fermeture et un pour l’ouverture, respectivement 5 et 30 lux dans mon cas.

La position du soleil « sous » ou « au-dessus » de l’horizon est donnée par le sensor « sun.sun ». Ces deux sensors permettent de détecter que le soleil se couche ou se lève.

La combinaison logique des ces deux informations permet de calculer un « input_boolean.nuit_jour » avec nuit=off et jour=on, (voir le code ci-après), qui servira dans mon automatisme principal .

- id: '1610184966825'
  alias: Volet_Boolean Nuit/Jour
  description: ''
  trigger:
  - platform: template
    value_template: '{{ states(''sensor.luminosite'' )|float > states(''input_number.luminosite_seuil_haut'')|float
      and is_state("sun.sun", "above_horizon") }}'
    id: nuit->jour
  - platform: template
    value_template: '{{ states(''sensor.luminosite'')|float < states(''input_number.luminosite_seuil_bas'')|float
      and is_state("sun.sun", "below_horizon") }}'
    id: jour->nuit
  condition: []
  action:
  - choose:
    - conditions:
      - condition: trigger
        id: nuit->jour
      sequence:
      - service: input_boolean.turn_on
        target:
          entity_id: input_boolean.nuit_jour
    - conditions:
      - condition: trigger
        id: jour->nuit
      sequence:
      - service: input_boolean.turn_off
        target:
          entity_id: input_boolean.nuit_jour
    default: []
  mode: single

Auto ETE

L’été nous restons dehors plus tard et nous nous couchons bien après la tombée de la nuit. Après avoir essayé plusieurs solutions basées sur le mode hiver, j’ai préféré simplifier le fonctionnement: L’ouverture et la fermeture seront pilotés par deux « input_datetime »: Un pour l’ouverture et le deuxième pour la fermeture.

Absent

J’utilise ce mode lorsque nous nous absentons de la maison pour une longue période. Pour faire simple, je ferme tous les volets et j’ouvre celui du salon pour donner un peu de vie et de clarté en fonction du boolean « jour/nuit ».

Scripts.

La liste des volets à ouvrir et à fermer est programmée dans des scripts, les scripts sont appelés par l’automatisme en fonction du mode de fonctionnement utilisé.

Les scripts « ouverture volet » et « fermeture volets » sont décrits ci_après. A noter que les ordres envoyés aux volets sont espacés de 2 secondes afin de s’assurer que la passerelle RFXtrx ne sature pas.

Un fonctionnement spécifique à l’ouverture est réservé à trois pièces (2 chambres amis et bureau), il est conditionné par un input_boolean précisant si les chambres et le bureau sont occupés.

Mode Auto Hiv et Auto Ete

Ouverture Volets

ouverture_volet:
  alias: ouverture_volet
  sequence:
  - service: cover.open_cover
    data: {}
    entity_id: cover.salon_petit
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - service: cover.open_cover
    data: {}
    entity_id: cover.cuisine
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - service: cover.open_cover
    data: {}
    entity_id: cover.sdb
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - service: cover.open_cover
    data: {}
    entity_id: cover.volet_sam
  - service: script.volets_bureau
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - service: script.ouverture_volets_chamb_nord
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - service: script.ouverture_volet_chamb_sud
  mode: single
  icon: mdi:shuttle

Fermeture Volets

fermeture_volet:
  alias: fermeture_volet
  sequence:
  - service: cover.open_cover
    data: {}
    entity_id: cover.bureau_gauche
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - service: cover.close_cover
    data: {}
    entity_id: cover.bureau_droit
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - service: cover.close_cover
    data: {}
    entity_id: cover.salon_petit
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - service: cover.close_cover
    data: {}
    entity_id: cover.sdb
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - service: cover.close_cover
    data: {}
    entity_id: cover.amis_nord
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - service: cover.close_cover
    data: {}
    entity_id: cover.parents_petit
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - service: cover.close_cover
    data: {}
    entity_id: cover.volet_parents_grand
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - service: cover.close_cover
    data: {}
    entity_id: cover.amis_sud_petit
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - service: cover.close_cover
    data: {}
    entity_id: cover.volet_amis_sud_grand
  mode: single
  icon: mdi:shuttle

Mode Absent

Ouverture Volets

ouverture_volet_absent:
  alias: ouverture_volet_absent
  sequence:
  - service: cover.open_cover
    data: {}
    target:
      entity_id: cover.bureau_droit
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - service: cover.close_cover
    target:
      entity_id: cover.bureau_gauche
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - service: cover.open_cover
    data: {}
    target:
      entity_id: cover.salon_petit
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - service: cover.open_cover
    data: {}
    target:
      entity_id: cover.cuisine
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - service: cover.open_cover
    data: {}
    target:
      entity_id: cover.sdb
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - service: cover.open_cover
    data: {}
    target:
      entity_id: cover.amis_nord
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - service: cover.open_cover
    data: {}
    target:
      entity_id: cover.parents_petit
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - service: cover.open_cover
    data: {}
    target:
      entity_id: cover.volet_parents_grand
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - service: cover.open_cover
    data: {}
    target:
      entity_id: cover.volet_sam
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - service: cover.open_cover
    data: {}
    target:
      entity_id: cover.volet_amis_sud_grand
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - service: cover.open_cover
    data: {}
    target:
      entity_id: cover.amis_sud_petit
  mode: single
  icon: mdi:shuttle

Fermeture Volets

fermeture_volet_absent:
  alias: fermeture_volet_absent
  sequence:
  - service: cover.open_cover
    data: {}
    entity_id: cover.bureau_gauche
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - service: cover.close_cover
    data: {}
    entity_id: cover.bureau_droit
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - service: cover.close_cover
    data: {}
    entity_id: cover.salon_petit
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - service: cover.close_cover
    data: {}
    target:
      entity_id:
      - cover.cuisine
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - service: cover.close_cover
    data: {}
    entity_id: cover.sdb
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - service: cover.close_cover
    data: {}
    entity_id: cover.amis_nord
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - service: cover.close_cover
    data: {}
    entity_id: cover.parents_petit
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - service: cover.close_cover
    data: {}
    entity_id: cover.volet_parents_grand
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - service: cover.close_cover
    data: {}
    entity_id: cover.amis_sud_petit
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - service: cover.close_cover
    data: {}
    entity_id: cover.volet_amis_sud_grand
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - service: cover.close_cover
    data: {}
    entity_id: cover.volet_sam
  mode: single
  icon: mdi:shuttle

Déclaration des entités

Vous trouverez ci-après le fichier volet.yam.
Dans ce fichier vous retrouverez la déclaration des différentes variables utilisées.

Code source à télécharger

input_boolean:
  # Gestion volets
  presence_amis_bureau:
    name: Presence Amis Bureau
    icon: mdi:account

  presence_amis_ch_sud:
    name: Presence Amis Chamb Sud
    icon: mdi:account

  presence_amis_ch_nord:
    name: Presence Amis Chamb Nord
    icon: mdi:account

# Calcul Jour/nuit selon luminosite et position du soleil sur l'horizon
  nuit_jour:
    name: Nuit=0/Jour=1
    icon: mdi:weather-sunny


# Calcul Jour/nuit selon luminosite
  val_automs_soleil:
    name: Valid Automs Volet Soleil
    icon: mdi:weather-sunny

input_datetime:
  # Horaires Volets ete
  horaire_ete_volet_ouv:
    name: Horaire ete volets ouverture
    has_date: false
    has_time: true
  horaire_ete_volet_ferm:
    name: Horaire ete volets fermeture
    has_date: false
    has_time: true

input_number:
# Consigne Min/max luminosité 
# gestion volet: Calcul du Input_boolean Nuit/jout
    luminosite_seuil_bas:
      name: Lum. seuil bas
      mode: box
      min: 0
      max: 10
      unit_of_measurement: "Lux"
      icon: mdi:weather-sunny
    luminosite_seuil_haut:
      name: Lum. seuil haut
      mode: box
      min: 10
      max: 50
      unit_of_measurement: "Lux"
      icon: mdi:weather-sunny 
# gestion volet: Niveau Ensoleilement ouv auto volet
    radiation_seuil_ferm_volet:
      name: Radiat seuil ferm volets
      mode: box
      min: 0
      max: 1200
      unit_of_measurement: "w/m2"
      icon: mdi:weather-sunny

input_select:
  volets:
    name: Volets
    icon: mdi:window-shutter
    options:
      - Auto Hiv
      - Auto Ete
      - Absent
      - Arret
cover:
# Convertion TC volet Amis grand en cover
  - platform: template
    covers:
      volet_amis_sud_grand:
        friendly_name: "Volet amis sud grand"
        open_cover:
          service: switch.turn_on
          data:
            entity_id: switch.tc_volet_amis_grand
        close_cover:
          service: switch.turn_off
          data:
            entity_id: switch.tc_volet_amis_grand
        icon_template: >-
          {% if is_state('switch.tc_volet_amis_grand', 'on') %}
            mdi:garage-open
          {% else %}
            mdi:garage
          {% endif %} 
  # Convertion TC volet SaM en cover
      volet_sam:
        friendly_name: "Volet SaM"
        open_cover:
          service: switch.turn_on
          data:
            entity_id: switch.tc_volet_sam
        close_cover:
          service: switch.turn_off
          data:
            entity_id: switch.tc_volet_sam
        icon_template: >-
          {% if is_state('switch.tc_volet_sam', 'on') %}
            mdi:garage-open
          {% else %}
            mdi:garage
          {% endif %} 
  # Convertion TC parents grand
      volet_parents_grand:
        friendly_name: "Volet Parents Grand"
        open_cover:
          service: switch.turn_on
          data:
            entity_id: switch.tc_chamb_parents
        close_cover:
          service: switch.turn_off
          data:
            entity_id: switch.tc_chamb_parents
        icon_template: >-
          {% if is_state('switch.tc_chamb_parents', 'on') %}
            mdi:garage-open
          {% else %}
            mdi:garage
          {% endif %}

Automatisme principal

Vous trouverez ci après le descriptif fonctionnel de l’automatisme principal.
J’utilise la fonction »choose » qui, combinée aux déclencheurs sur « balise »(id), permet de simplifier le codage.

Descriptif fonctionnel

Choix gestion nb de chambres: 

Calcul du input_boolean nuit/jour 

Codage

Vous trouverez ci-après le code .yaml de l’automatisation correspondant au descriptif fonctionnel:

- id: '1632989157968'
  alias: Volet_Automatismes
  description: Ete/Hiver/Absent
  trigger:
  - platform: state
    entity_id: input_boolean.nuit_jour
    from: 'on'
    to: 'off'
    id: jour->nuit
  - platform: time
    at: input_datetime.horaire_ete_volet_ouv
    id: ouv
  - platform: time
    at: input_datetime.horaire_ete_volet_ferm
    id: ferm
  - platform: state
    entity_id: input_boolean.nuit_jour
    id: nuit->jour
    from: 'off'
    to: 'on'
  condition: []
  action:
  - choose:
    - conditions:
      - condition: state
        entity_id: input_select.volets
        state: Auto Hiv
      - condition: trigger
        id: jour->nuit
      sequence:
      - service: script.fermeture_volet
    - conditions:
      - condition: state
        entity_id: input_select.volets
        state: Auto Hiv
      - condition: trigger
        id: nuit->jour
      sequence:
      - service: script.ouverture_volet
    - conditions:
      - condition: state
        entity_id: input_select.volets
        state: Auto Ete
      - condition: trigger
        id: ouv
      sequence:
      - service: script.ouverture_volet
    - conditions:
      - condition: state
        entity_id: input_select.volets
        state: Auto Ete
      - condition: trigger
        id: ferm
      sequence:
      - service: script.fermeture_volet
    - conditions:
      - condition: state
        entity_id: input_select.volets
        state: Absent
      - condition: state
        entity_id: input_boolean.nuit_jour
        state: 'off'
      sequence:
      - service: script.fermeture_volet_absent
    - conditions:
      - condition: state
        entity_id: input_select.volets
        state: Absent
      - condition: state
        entity_id: input_boolean.nuit_jour
        state: 'on'
      sequence:
      - service: script.ouverture_volet_absent
    default: []
  mode: single

Interface lovelace

Interfaces simples regroupant les informations nécessaires au pilotage, à la surveillance et au paramétrage de la fonction « Volets »

J’utilise l’excellente l’intégration HACS dwain dashboard. Le code est disponible ici.

Conclusion:

Un fonctionnement basique qui n’a rien d’exceptionnel mais bougrement pratique. J’espère que cela donnera des idées à certain d’entre vous.

Article en lien avec cette publication

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.