HA-Automatisation des volets

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 chadion DIO, dans les deux cas, je les ai associés à 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électionnables via un « input.select »:

1-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 confirmer 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

2-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érer simplifier le fonctionnement: L’ouverture et la fermeture seront pilotés par deux « input_datetime »: Une heure pour l’ouverture et une pour la fermeture.

3-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

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

  • Declenchement: 
    • Input_boolean nuit=0/jour=1: off->on (id=nuit->jour) 
    • Input_boolean nuit=0/jour=1: on->off (id=jour->nuit)  
    • Input_datetime.horaire_ete_volet_ouv (id=ouv) 
    • Input_datetime.horaire_ete_volet_ferm (id=ferm)  

Actions: 

Choix: 

Choix 1 auto/ferm/hiver 2 auto/ouv/hiver 3 auto/ouv/ete 4 auto/ferm/ete 5 absent/ferm 6 absent/ouv 
Conditions:  Mode=Auto Hiv
 id=jour->nuit  
Mode=Auto Hiv
 id=nuit->jour  
Mode=Auto Ete Id=ouv  Mode=Auto Ete Id=ferm  Mode=Absent
 id=jour->nuit  
Mode=Absent
id=nuit->jour  
Action script Fermeture Volets Ouverture Volets Ouverture Volets  Fermeture Volets  Fermeture Volets  absentOuverture Volets  absent
       
       

Choix gestion nb de chambres: 

Input boolean: Presence Amis    

  • Si= on => Chambre nord, amis sud, bureau ne sont pas pilotés 
  • Si = off => pas de restriction 

Calcul du input_boolean nuit/jour 

  • Transition de Jour à Nuit: 
    • {{ states(‘sensor.luxmetre_2’)|float <  states(‘input_number.luminosite_seuil_bas’)|float and is_state(« sun.sun », « below_horizon ») }} 
    • Transistion de Nuit à Jour : 
      • {{ states(‘sensor.luxmetre_2’ )|float >   states(‘input_number.luminosite_seuil_haut’)|float and is_state(« sun.sun », « above_horizon ») }} 

Code .yaml

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 necessaires au pilotage, à la surveillance et au paramétrage de la fonction « Volets »

Le fronted custom: »multiple-entity-row » disponible sur HACS permet de réduire l’encombrement de la fenêtre en masquant des sections, les « Paramètres » dans mon cas.

Code de la carte

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.

Laisser un commentaire

Votre adresse de messagerie 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.