Contents
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.
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.