HA-Asservissement des volets à la position du soleil

Intro

Un automatisme assez simple de gestion des volets en fonction de la position (azimuth) du soleil.

Mise à jour:

du 17/06/2022

  • suppression du contrôle toutes les 15 mn
  • déclenchement des fermetures par des « template »

du 17/05/2022

  • Changement du code l’automatisme: Ouverture des volets le midi et le soir sur changement d’état, ce qui permet de les refermer si besoin
  • Ajout du code de la carte tableau de bord « Non Dwain »

Analyse fonctionnelle

Description de l’automation:

  • choix 1: Si l’azimuth devient supérieur à 103° et inférieur à 137° et si la valeur de radiation est supérieure à un seuil alors je ferme les volets de la salle de bain et de la chambre nord.
  • choix 2: Si l’azimuth devient supérieur à 137° et inférieur à 159° alors j’ouvre les volets de la salle de bain et de la chambre nord si celle-ci est déclarée inoccupée.
  • choix 3: Si l’azimuth devient supérieur à 160° et inférieur à 266° et si la valeur de radiation est supérieure à un seuil alors je ferme les volets de la chambre parents et de la chambre amis sud.
  • L’ouverture des volets le soir reste manuelle, plus pratique dans mon cas car très dépendant de l’ensoleillement, la température, etc..
  • Le seuil de luminosité est modifiable dans un input number.

Azimuth du soleil

Vous trouverez sur ce site un outil vous permettant une approche de la position du soleil en fonction de la situation géographique de votre maison.

Déclaration des entités

Calcul de l’azimuth du soleil et de son élévation par la même occasion.

  - platform: template
    sensors:
# Azimuth et elevation soleil
      sun_elevation:
        friendly_name: 'elevation soleil'
        unit_of_measurement: "°"
        value_template: "{{'%+.1f'|format(state_attr('sun.sun', 'elevation'))}}"

      sun_azimuth:
        friendly_name: 'azimut soleil'
        unit_of_measurement: "°"
        value_template: "{{'%+.1f'|format(state_attr('sun.sun', 'azimuth'))}}"

Calcul simplifié de trois booleans grâce à la nouvelle fonctionnalité « entrées threshold » disponible depuis HA V 2022-04.

binary_sensor.position_soleil_matin = on si 103 < azimuth < 137

binary_sensor.position_soleil_midi = on si 138 < azimuth < 159

binary_sensor.position_soleil_am = on si 160 < azimuth < 266

Déclaration de l’input_number définissant le seuil du niveau d’ensoleillement validant la fermeture des volets


input_number:
# 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

Le niveau ensoleillement est mesuré par ma station météorologique Davis Instrument Vantage pro2, je calcule la valeur moyenne d’ensoleillement sur une heure afin de m’assurer d’un ensoleillement régulier

sensor:
  # Ensoleillement
  - platform: statistics
    entity_id: sensor.vp2_radiation
    unique_id: vp2_radiation_moyenne
    max_age:
      minutes: 60 # sur 1h
    name: vp2_radiation_moyenne
    state_characteristic: median

Automatisme associé

Le déclenchement de fermeture est une combinaison de la position du soleil et de la moyenne ensoleillement supérieure au seuil prédéfini dans l’input_number.

alias: 4_1_3 Volet-Suivi Azimuth Soleil
description: Ouvre et ferme les volets en fonction de la course (azimuth) du soleil
trigger:
  - platform: template
    value_template: >-
      {% set a=states('binary_sensor.position_soleil_matin') %}

      {% set b=states('sensor.vp2_radiation_moyenne') | float(default=0) %}

      {% set c=states('input_number.radiation_seuil_ferm_volet') |
      float(default=0) %}

      {{ a == "on" and b>=c}}
    id: ferm_matin
  - platform: state
    entity_id:
      - binary_sensor.position_soleil_midi
    id: ouv_midi
    to: 'on'
  - platform: template
    value_template: >-
      {% set a=states('binary_sensor.position_soleil_am') %}

      {% set b=states('sensor.vp2_radiation_moyenne') | float(default=0) %}

      {% set c=states('input_number.radiation_seuil_ferm_volet') |
      float(default=0) %}

      {{ a == "on" and b>=c}}
    id: ferm_am
condition: []
action:
  - choose:
      - conditions:
          - condition: trigger
            id: ferm_matin
        sequence:
          - service: cover.set_cover_position
            data:
              position: 10
            target:
              entity_id:
                - cover.volet_sdb_p
                - cover.volet_amis_nord_p
      - conditions:
          - condition: trigger
            id: ouv_midi
        sequence:
          - service: cover.open_cover
            data: {}
            target:
              entity_id: cover.volet_sdb_p
          - condition: state
            entity_id: input_boolean.presence_amis_ch_nord
            state: 'off'
          - service: cover.open_cover
            target:
              entity_id:
                - cover.volet_amis_nord_p
            data: {}
      - conditions:
          - condition: trigger
            id: ferm_am
        sequence:
          - service: cover.set_cover_position
            data:
              position: 10
            target:
              entity_id:
                - cover.volet_amis_sud_p
                - cover.volet_ch_parent_p
    default: []
mode: single

Tableau de Bord

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

Fichier du « carré orange » à télécharger dans votre dossier « www/images ».

Ci-aprés le code à pour un tableau de bord non Dwain: carte « manuel »

type: vertical-stack
cards:
  - type: grid
    cards:
      - type: button
        show_name: true
        icon: mdi:desk-lamp
        entity: group.volets_bureau
        show_state: false
        show_icon: true
        hold_action:
          action: none
        tap_action:
          action: more-info
        name: Bureau
      - type: button
        tap_action:
          action: call-service
          service: cover.open_cover
          service_data: {}
          target:
            entity_id:
              - cover.volet_gauche_p
              - cover.volet_droit_p
        show_name: false
        name: Ouvrir
        icon: mdi:arrow-up-bold
      - type: button
        tap_action:
          action: call-service
          service: cover.stop_cover
          service_data: {}
          target:
            entity_id:
              - cover.volet_droit_p
              - cover.volet_gauche_p
        show_name: false
        name: Stop
        icon: mdi:pause
      - type: button
        tap_action:
          action: call-service
          service: cover.close_cover
          service_data: {}
          target:
            entity_id:
              - cover.volet_droit_p
              - cover.volet_gauche_p
        show_name: false
        name: Fermer
        icon: mdi:arrow-down-bold
      - type: button
        tap_action:
          action: call-service
          service: cover.set_cover_position
          service_data:
            position: 49
          target:
            entity_id:
              - cover.volet_droit_p
              - cover.volet_gauche_p
        show_name: false
        name: Soleil
        icon: mdi:weather-sunset-up
      - type: picture-elements
        image: /local/images/carre_orange.png
        elements:
          - type: state-label
            entity: cover.volet_droit_p
            attribute: current_position
            suffix: '%'
            tap_action:
              action: more-info
            style:
              top: 50%
              left: 50%
              font-size: 16px
              font-weight: bold
              color: '#44739E'
        view_layout:
          position: sidebar
    columns: 6
    square: true
  - type: grid
    cards:
      - type: button
        show_name: true
        show_icon: true
        icon: mdi:sofa
        show_state: false
        tap_action:
          action: more-info
        entity: group.volets_salon_cuisine
        hold_action:
          action: none
        name: Salon
      - type: button
        tap_action:
          action: call-service
          service: cover.open_cover
          service_data: {}
          target:
            entity_id:
              - cover.volet_sam
              - cover.salon_petit
              - cover.cuisine
        icon: mdi:arrow-up-bold
        name: Ouvrir
        show_icon: true
        show_name: false
      - type: button
        tap_action:
          action: call-service
          service: cover.stop_cover
          service_data: {}
          target:
            entity_id:
              - cover.salon_petit
              - cover.cuisine
        icon: mdi:pause
        name: Stop
        show_name: false
      - type: button
        tap_action:
          action: call-service
          service: cover.close_cover
          service_data: {}
          target:
            entity_id:
              - cover.salon_petit
              - cover.volet_sam
              - cover.cuisine
        icon: mdi:arrow-down-bold
        name: Fermer
        show_name: false
      - type: button
        tap_action:
          action: call-service
          service: cover.set_cover_position
          service_data:
            position: 20
          target:
            entity_id:
              - cover.salon_petit
              - cover.volet_sam
              - cover.cuisine
        icon: mdi:weather-sunset-up
        name: Soleil
        show_name: false
      - type: picture-elements
        image: /local/images/carre_orange.png
        elements:
          - type: state-label
            entity: cover.volet_salon_zb
            attribute: current_position
            suffix: '%'
            tap_action:
              action: more-info
            style:
              top: 50%
              left: 50%
              font-size: 16px
              font-weight: bold
              color: '#44739E'
        view_layout:
          position: sidebar
    square: true
    columns: 6
  - type: grid
    cards:
      - type: button
        show_name: true
        show_icon: true
        icon: mdi:bathtub
        show_state: false
        tap_action:
          action: more-info
        entity: cover.volet_sdb_p
        hold_action:
          action: none
        name: SdB
      - type: button
        tap_action:
          action: call-service
          service: cover.open_cover
          service_data: {}
          target:
            entity_id: cover.volet_sdb_p
        icon: mdi:arrow-up-bold
        name: Ouvrir
        show_icon: true
        show_name: false
      - type: button
        tap_action:
          action: call-service
          service: cover.stop_cover
          service_data: {}
          target:
            entity_id: cover.volet_sdb_p
        icon: mdi:pause
        name: Stop
        show_name: false
      - type: button
        tap_action:
          action: call-service
          service: cover.close_cover
          service_data: {}
          target:
            entity_id: cover.volet_sdb_p
        icon: mdi:arrow-down-bold
        name: Fermer
        show_name: false
      - type: button
        tap_action:
          action: call-service
          service: cover.set_cover_position
          service_data:
            position: 20
          target:
            entity_id: cover.volet_sdb_p
        icon: mdi:weather-sunset-up
        name: Soleil
        show_name: false
      - type: picture-elements
        image: /local/images/carre_orange.png
        elements:
          - type: state-label
            entity: cover.volet_sdb_p
            attribute: current_position
            suffix: '%'
            tap_action:
              action: more-info
            style:
              top: 50%
              left: 50%
              font-size: 16px
              font-weight: bold
              color: '#44739E'
        view_layout:
          position: sidebar
    square: true
    columns: 6
  - type: grid
    cards:
      - type: button
        show_name: true
        show_icon: true
        icon: mdi:bed
        show_state: false
        tap_action:
          action: more-info
        entity: cover.volet_amis_nord_p
        hold_action:
          action: none
        name: Am Nord
      - type: button
        tap_action:
          action: call-service
          service: cover.open_cover
          service_data: {}
          target:
            entity_id: cover.volet_amis_nord_p
        icon: mdi:arrow-up-bold
        name: Ouvrir
        show_icon: true
        show_name: false
      - type: button
        tap_action:
          action: call-service
          service: cover.stop_cover
          service_data: {}
          target:
            entity_id:
              - cover.volet_amis_nord_p
        icon: mdi:pause
        name: Stop
        show_name: false
      - type: button
        tap_action:
          action: call-service
          service: cover.close_cover
          service_data: {}
          target:
            entity_id:
              - cover.volet_amis_nord_p
        icon: mdi:arrow-down-bold
        name: Fermer
        show_name: false
      - type: button
        tap_action:
          action: call-service
          service: cover.set_cover_position
          service_data:
            position: 20
          target:
            entity_id: cover.volet_amis_nord_p
        icon: mdi:weather-sunset-up
        name: Soleil
        show_name: false
      - type: picture-elements
        image: /local/images/carre_orange.png
        elements:
          - type: state-label
            entity: cover.volet_amis_nord_p
            attribute: current_position
            suffix: '%'
            tap_action:
              action: more-info
            style:
              top: 50%
              left: 50%
              font-size: 16px
              font-weight: bold
              color: '#44739E'
        view_layout:
          position: sidebar
    square: true
    columns: 6
  - type: grid
    cards:
      - type: button
        show_name: true
        show_icon: true
        icon: mdi:bed
        show_state: false
        tap_action:
          action: more-info
        entity: group.volets_parents
        hold_action:
          action: none
        name: Parents
      - type: button
        tap_action:
          action: call-service
          service: cover.open_cover
          service_data: {}
          target:
            entity_id:
              - cover.volet_parents_grand
              - cover.volet_ch_parent_p
        icon: mdi:arrow-up-bold
        name: Ouvrir
        show_icon: true
        show_name: false
      - type: button
        tap_action:
          action: call-service
          service: cover.stop_cover
          service_data: {}
          target:
            entity_id:
              - cover.volet_ch_parent_p
        icon: mdi:pause
        name: Stop
        show_name: false
      - type: button
        tap_action:
          action: call-service
          service: cover.close_cover
          service_data: {}
          target:
            entity_id:
              - cover.volet_parents_grand
              - cover.volet_ch_parent_p
        icon: mdi:arrow-down-bold
        name: Fermer
        show_name: false
      - type: button
        tap_action:
          action: call-service
          service: cover.set_cover_position
          service_data:
            position: 20
          target:
            entity_id: cover.volet_ch_parent_p
        icon: mdi:weather-sunset-up
        name: Soleil
        show_name: false
      - type: picture-elements
        image: /local/images/carre_orange.png
        elements:
          - type: state-label
            entity: cover.volet_ch_parent_p
            attribute: current_position
            suffix: '%'
            tap_action:
              action: more-info
            style:
              top: 50%
              left: 50%
              font-size: 16px
              font-weight: bold
              color: '#44739E'
        view_layout:
          position: sidebar
    square: true
    columns: 6
  - type: grid
    cards:
      - type: button
        show_name: true
        show_icon: true
        icon: mdi:bed
        show_state: false
        tap_action:
          action: more-info
        entity: group.volets_amis_sud
        hold_action:
          action: none
        name: Am Sud
      - type: button
        tap_action:
          action: call-service
          service: cover.open_cover
          service_data: {}
          target:
            entity_id:
              - cover.volet_amis_sud_grand
              - cover.volet_amis_sud_p
        icon: mdi:arrow-up-bold
        name: Ouvrir
        show_icon: true
        show_name: false
      - type: button
        tap_action:
          action: call-service
          service: cover.stop_cover
          service_data: {}
          target:
            entity_id:
              - cover.volet_amis_sud_p
        icon: mdi:pause
        name: Stop
        show_name: false
      - type: button
        tap_action:
          action: call-service
          service: cover.close_cover
          service_data: {}
          target:
            entity_id:
              - cover.volet_amis_sud_grand
              - cover.volet_amis_sud_p
        icon: mdi:arrow-down-bold
        name: Fermer
        show_name: false
      - type: button
        tap_action:
          action: call-service
          service: cover.set_cover_position
          service_data:
            position: 20
          target:
            entity_id:
              - cover.volet_amis_sud_p
        icon: mdi:weather-sunset-up
        name: Soleil
        show_name: false
      - type: picture-elements
        image: /local/images/carre_orange.png
        elements:
          - type: state-label
            entity: cover.volet_amis_sud_p
            attribute: current_position
            suffix: '%'
            tap_action:
              action: more-info
            style:
              top: 50%
              left: 50%
              font-size: 16px
              font-weight: bold
              color: '#44739E'
        view_layout:
          position: sidebar
    square: true
    columns: 6

Conclusion

Un automatisme simplifié par les nouvelles fonctionnalités de HA V2022-04, merci aux développeurs qui font un travail remarquable.

Mais pourquoi faire simple quand on peut faire compliquer, on pourrait aussi tenir compte de la température de la pièce, de la température extérieure, etc.. A voir à l’usage cet été.

Article en lien avec cette publication

3 Comments on “HA-Asservissement des volets à la position du soleil”

  1. Salut, encore un super tuto que j’ai adapté à ma config. Or je rencontre un problème, la fermeture et l’ouverture des volets fonctionnent correctement en fonction des deux valeurs, position du soleil et ensoleillement, mais lorsque ils sont définitivement fermés pour la nuit l’automatisation les réouvrent car l’état de binary_sensor.position_soleil_am est sur off. Comment puis je remédier à ce problème? Deuxième question, je souhaiterai reprendre la mise en forme de tes boutons pour commander les volets dans lovelace sans passer par l’intégration dwain dashboard, est ce possible car malgré pas mal d’essai je n’ai pas réussi.

    En te remerciant encore pour ce super tuto.

    1. Merci Bob
      Dans cette configuration, l’automatisme est conditionné par la mesure luminosité qui doit etre supérieure au seuil prédéfini.
      Si tu ne mesure pas la luminosité tu peux en lieu et place tester si le soleil est levé ou pas (conditions: etat sun)
      J’ai ajouté le code de la carte pour un tableau de bord « non Dwains »
      @+

      1. Merci pour ta réponse, pourtant je mesure bien la luminosité. Je suis repassé sur deux automatisation, une pour la fermeture et l’autre pour l’ouverture, que j’ai couplé avec la luminosité et la position du soleil.
        Merci pour la carte je vais y jeter un oeil 😉

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

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