[Tuto] Installer sa pergola Zenisun sur Home Assistant

Bonjour,

À l’intention des nouveaux utilisateurs de Home Assistant, ainsi que de ceux qui effectuent la transition de Jeedom à Home Assistant et pour tous les autres…
Je vais faire une copie de mon fichiers yaml sur ce topic.

Tout d’abord, je tiens à préciser que je ne suis pas programmeur, mais plutôt un bricoleur. J’ai puisé de nombreuses informations sur ce forum, ainsi que sur celui de Jeedom et le forum Construire. Il convient également de noter que Zenisun n’existe plus en raison d’une décision judiciaire ayant entraîné sa liquidation.

Il est nécessaire d’attribuer une adresse IP fixe depuis la box, ce qui dépend de la box ainsi que du fournisseur.

Merci à:MikeBZH44,bart40140,CrottyFr,golfvert,Chris73 et d’un autre forum à Aior et WInd06
Si vous avez un problème de maintenance avec votre pergola, vous pourrez glaner des informations pour la réparer vous même sur le site forum construire https://www.forumconstruire.com/groupes/468913_zenisun.php ou https://www.forumconstruire.com/construire/topic-425853-pergola-bioclimatique-domotique.php ou https://www.forumconstruire.com/recits/recit-40583.php

Ma pergola fonctionne avec une automatition qui vérifie la position du soleil par rapport à ma résidence ainsi que les données de ma station météorologique Netatmo concernant la température et les précipitations. Si vous souhaitez recevoir ce fichier au format YAML, n’hésitez pas à me le faire savoir.

Tout d’abord, avant de me rendre au travail, je vous prie de trouver ci-joint mon fichier YAML. Il est impératif que vous remplaciez, à côté de chaque ligne, l’adresse IP par la vôtre, en veillant à modifier uniquement la partie 192.168.0.100 ; le reste doit demeurer inchangé.

Exemple "http://192.168.0.100/zns.cgi?cmd=d&p=os" par "http://192.168.1.25/zns.cgi?cmd=d&p=os"

Quelques coquilles se cachent dans mes codes des slider. Impossible pour le moment d’éteindre correctement les lumières ou de fermer complètement le lames. La seule solution est d’utiliser un bouton off à part.

Pour aller plus vite, je vous propose d’inclure un fichier packages dans votre configuration.yaml.

Prérequis, matériels nécessaires & utilisés :

  • Studio Code Server (via HACS) ou File Editor d’installé.

homeassistant:
packages: !include_dir_named packages

Vous avez un super tuto de McFly ici → tuto Organisation du fichier configuration.yaml

Ensuite, dans config, vous devez créer le fichier pergola.yaml et y copier-coller le fichier ci-dessous, sans oublier de mettre votre adresse IP à la place de la mienne.

##############################
###         sensor:          ###
################################
sensor:
  - platform: rest
    name: "Pergola"
    scan_interval: 15
    resource: http://192.168.0.100/zns.cgi?cmd=d&p=os
    json_attributes_path: "$.root"
    value_template: "OK"
    json_attributes:
      - "gpo6"      # white dimmer 
      - "s_elev"    # Elevation
      - "s_azi"     # Azimut
      - "s_prj"     # Projection
      - "user"      # mode (pluie, hiver, suivi,
      - "Mot0"      # Moteur 
      - "date"      # Moteur 
      - "sun_delay" # Actualisation
      - "VDC2"      # Voltage VDC2
      - "orient"      # orientation
      - "lon"    # Longitude
      - "lat"     # Latitude

  - platform: rest
    resource: "http://192.168.0.100/zns.cgi?cmd=d&p=os"
    name: "light_sensor_pergola_white"
    unique_id: "binary_sensor.light_pergola_white"
    scan_interval: 5
    value_template: "{{ value_json['root']['gpo6'].split(';')[0] }}"

  - platform: rest
    resource: "http://192.168.0.100/zns.cgi?cmd=d&p=os"
    name: "sensor_pergola_position des lames_mot0"
    unique_id: "binary_sensor.sensor_pergola_position des lames_mot0"
    scan_interval: 5
    value_template: "{{ value_json['root']['Mot0'].split(';')[0] }}"

  - platform: rest
    resource: "http://192.168.0.100/zns.cgi?cmd=d&p=ios"
    name: "sensor_pergola_temp inter"
    unique_id: "binary_sensor.sensor_pergola_temp inter"
    scan_interval: 600
    timeout: 10
    value_template: >-
      {{ ((value_json['root']['Temp'].split(';')[0] | float) / 10) | round(1) | string | replace('.', ',') }} °C


  - platform: rest
    resource: "http://192.168.0.100/zns.cgi?cmd=d&p=ios"
    name: "sensor_pergola_mode"
    unique_id: "binary_sensor.sensor_pergola_mode"
    scan_interval: 10
    value_template: "{{ value_json['root']['user'].split(';')[0] }}"

  - platform: rest
    resource: "http://192.168.0.100/zns.cgi?cmd=d&p=ios"
    name: "sensor_pergola_conso"
    unique_id: "binary_sensor.sensor_pergola_conso"
    scan_interval: 600
    value_template: >-
      {{ ((value_json['root']['VDC2'].split(';')[0] | float) / 1000) | round(2) | string | replace('.', ',') }} V

  - platform: template
    sensors:
      pergola_mode_display:
        unique_id: "pergola_mode_display"  # Identifiant unique pour ce capteur
        friendly_name: "Affichage Mode Pergola"
        value_template: >-
          {% set mode = states('sensor.sensor_pergola_mode') | int %}
          {% if mode == 4 %}
              Ombrage Mini (4)
          {% elif mode == 8 %}
              Mode Hivernage (8)
          {% elif mode == 1 %}
              Fermeture si Pluie (1)
          {% elif mode == 2 %}
              Suivi Solaire (2)
          {% else %}
            Mode inconnu
          {% endif %}

################################
###     binary_sensor:       ###
################################
binary_sensor:
  - platform: template
    sensors:
      pergola_sechage_ok:
        friendly_name: "Pas de pluie depuis 30 minutes"
        unique_id: "Pas de pluie depuis 30 minutes"
        value_template: >-
          {% set last_changed = states.sensor.pluviometre_precipitation.last_changed %}
          {% set time_diff = (as_timestamp(now()) - as_timestamp(last_changed)) if last_changed else 99999 %}
          {% set pluie_meteo = states('weather.salaunes') in ['rainy', 'pouring'] %}
          {% set pluie_pluvio = states('sensor.pluviometre_precipitation') | float(0) >= 0.1 %}
          {% set temps_ecoule = time_diff <= 1800 if last_changed else false %}

          {# Il ne pleut pas si: #}
          {# 1. Pas de pluie détectée par la météo ET #}
          {# 2. Pas de pluie détectée par le pluviomètre depuis 30 min #}
          {{ not pluie_meteo and not (pluie_pluvio and temps_ecoule) }}

################################
###          cover:          ###
################################
cover:
  - platform: template
    covers:
      pergola_motor:
        friendly_name: "Pergola: lames"
        #value_template: "{{ states.sensor.pergola_motor.state|int > 0 }}"
        position_template: "{{ states.sensor.pergola_motor.state|int }}"
        open_cover:
          action: rest_command.pergola_set_motorlevel_open
        close_cover:
          action: rest_command.pergola_set_motorlevel_close
        set_cover_position:
          action: rest_command.pergola_set_motorlevel
          data:
            position: "{{position}}"
        device_class: shutter
        icon_template:  >-
          {% if states('sensor.pergola_motor')|float > 0 %}
            hass:electric-switch
          {% else %}
            mdi:electric-switch-closed
          {% endif %}
          
################################
###       rest_command:      ###
################################
rest_command:
  pergola_set_brightnesslevel:
    url: http://192.168.0.100/zns.cgi?cmd=l&o=64&p={{ brightness }}
    method: GET
    payload: ""
    content_type: "text/plain"

  pergola_set_motorlevel:
    url: http://192.168.0.100/zns.cgi?cmd=m&m=1&p={{ position }}
    method: GET
    payload: ""
    content_type: "text/plain"

  pergola_set_user:
    url: http://192.168.0.100/zns.cgi?cmd=u&p=3&v={{ user_value }}
    method: GET
    payload: ""
    content_type: "text/plain"

################################
###           group          ###
################################
group:
  pergola_modes:
    name: "Modes Pergola"
    entities:
      - switch.pergola_switch_rain
      - switch.pergola_switch_suntracking
      - switch.pergola_switch_shade
      - switch.pergola_switch_winter

input_number:
  pergola_light_brightness:
    name: Luminosité
    min: 0
    max: 255
    step: 1
    mode: slider
    icon: mdi:lightbulb

  pergola_motor_position:
    name: "Pergola Motor Position"
    min: 0
    max: 500
    step: 1
    initial: 0
    mode: box

  pergola_blades_angle:
    name: Inclinaison lames
    min: 0
    max: 500  # ou 255 selon ton API
    step: 1
    mode: slider
    icon: mdi:blinds

Toujours à corriger (27_04_2025) :

*scanner le wifi également avec cette commande

http://192.168.xxx.xxx/zns.cgi?cmd=s&p=s

Et on récupère la liste des réseaux avec cette commande

 http://zenisun.local/zns.cgi?cmd=s&p=g

A vous de l’améliorer, moi par exemple il est comme ceci

La partie concernant les switch:
J’ai simplié au maximum pour éviter les problèmes. Toute la partie commande se trouve maintenant Lovelace directement dans la carte avec des `tap_action’

type: grid
cards:
  - type: tile
    entity: automation.auto_pergola_lames
    features_position: inline
    vertical: false
    grid_options:
      columns: full
    features:
      - type: toggle
  - features:
      - type: cover-open-close
    type: tile
    entity: cover.pergola_petit_volet
    features_position: inline
    vertical: false
    name: PETIT VOLET
  - features:
      - type: cover-open-close
    type: tile
    entity: cover.pergola_grand_volet
    features_position: inline
    vertical: false
    name: GRAND VOLET
  - type: heading
    heading: Lumières
    heading_style: title
    badges:
      - type: entity
        show_state: true
        show_icon: true
        entity: sensor.light_sensor_pergola_white
        icon: mdi:flash-triangle-outline
  - features:
      - style: slider
        type: numeric-input
    type: tile
    entity: input_number.pergola_light_brightness
    name: Lumière
    features_position: inline
    vertical: false
  - type: vertical-stack
    cards:
      - type: horizontal-stack
        cards:
          - show_name: true
            show_icon: true
            type: button
            name: "ON"
            icon: mdi:lightbulb
            tap_action:
              action: call-service
              service: rest_command.pergola_set_brightnesslevel
              service_data:
                brightness: 130
          - type: button
            name: "OFF"
            icon: mdi:lightbulb-off
            tap_action:
              action: call-service
              service: rest_command.pergola_set_brightnesslevel
              service_data:
                brightness: 0
      - type: horizontal-stack
        cards:
          - type: button
            name: 25%
            tap_action:
              action: call-service
              service: rest_command.pergola_set_brightnesslevel
              service_data:
                brightness: 75
          - type: button
            name: 50%
            tap_action:
              action: call-service
              service: rest_command.pergola_set_brightnesslevel
              service_data:
                brightness: 130
          - type: button
            name: 75%
            tap_action:
              action: call-service
              service: rest_command.pergola_set_brightnesslevel
              service_data:
                brightness: 190
          - type: button
            name: 100%
            tap_action:
              action: call-service
              service: rest_command.pergola_set_brightnesslevel
              service_data:
                brightness: 255
  - type: heading
    heading: Lames
    heading_style: title
    badges:
      - type: entity
        entity: sensor.sensor_pergola_position_des_lames_mot0
  - features:
      - style: slider
        type: numeric-input
    type: tile
    entity: input_number.pergola_blades_angle
    name: Positioon des lames
    features_position: inline
    vertical: false
  - type: vertical-stack
    cards:
      - type: horizontal-stack
        cards:
          - show_name: true
            show_icon: true
            type: button
            name: Ouvrir
            icon: mdi:arrow-up-bold
            tap_action:
              action: call-service
              service: rest_command.pergola_set_motorlevel
              service_data:
                position: 500
          - type: button
            name: Fermer
            icon: mdi:arrow-down-bold
            tap_action:
              action: call-service
              service: rest_command.pergola_set_motorlevel
              service_data:
                position: 0
      - type: horizontal-stack
        cards:
          - show_name: true
            show_icon: true
            type: button
            name: 25%
            tap_action:
              action: call-service
              service: rest_command.pergola_set_motorlevel
              service_data:
                position: 190
          - type: button
            name: 50%
            tap_action:
              action: call-service
              service: rest_command.pergola_set_motorlevel
              service_data:
                position: 300
          - type: button
            name: 75%
            tap_action:
              action: call-service
              service: rest_command.pergola_set_motorlevel
              service_data:
                position: 400
          - type: button
            name: 100%
            tap_action:
              action: call-service
              service: rest_command.pergola_set_motorlevel
              service_data:
                position: 500
  - type: heading
    heading: Pergola mode
    heading_style: title
    badges:
      - type: entity
        show_state: true
        show_icon: true
        entity: sensor.pergola_mode_display
        icon: mdi:arrow-decision
  - type: horizontal-stack
    cards:
      - show_name: true
        show_icon: true
        type: button
        name: Rain
        icon: mdi:weather-rainy
        tap_action:
          action: call-service
          service: rest_command.pergola_set_user
          service_data:
            user_value: 1
        show_state: false
      - type: button
        name: Sun
        icon: mdi:sun-angle
        tap_action:
          action: call-service
          service: rest_command.pergola_set_user
          service_data:
            user_value: 2
        show_state: false
      - type: button
        name: Shade
        icon: mdi:weather-partly-cloudy
        tap_action:
          action: call-service
          service: rest_command.pergola_set_user
          service_data:
            user_value: 4
        show_state: false
      - type: button
        name: Winter
        icon: mdi:snowflake
        tap_action:
          action: call-service
          service: rest_command.pergola_set_user
          service_data:
            user_value: 8
        show_state: false
      - type: button
        name: "OFF"
        icon: mdi:power
        tap_action:
          action: call-service
          service: rest_command.pergola_set_user
          service_data:
            user_value: 0
        show_state: false
  - type: heading
    heading: Volets
    heading_style: title
    badges: []

Et enfin on vas créer la carte:

type: vertical-stack
cards:
  - type: entities
    entities:
      - entity: input_number.pergola_light_brightness
        name: Luminosité
  - type: entities
    entities:
      - entity: input_number.pergola_blades_angle
        name: Position lames

Et enfin pour les lames, on ajoute ceci dans le yaml:

  pergola_blades_angle:
    name: Inclinaison lames
    min: 0
    max: 255  # ou 255 selon ton API
    step: 1
    mode: slider
    icon: mdi:blinds

et sa carte

type: vertical-stack
cards:
  - type: entities
    entities:
      - entity: input_number.pergola_light_brightness
        name: Luminosité
  - type: entities
    entities:
      - entity: input_number.pergola_blades_angle
        name: Position lames

et enfin l’automation qui va avec:

alias: AUTO - Pergola - Régler position lames
description: Envoie la position des lames à la pergola
triggers:
  - entity_id:
      - input_number.pergola_blades_angle
    trigger: state
conditions: []
actions:
  - data:
      position: "{{ trigger.to_state.state | int }}"
    action: rest_command.pergola_set_motorlevel
mode: single

Voilà une pergola qui fonctionne :nerd_face:

Modification de l’automation pour s’adapter à la nouvelle configuration yaml du 13/08/2025

Ma partie automation en yaml qui utilise la position du soleil par rapport à la maison et ma météo Netatmo et le service season.
Cette automation fonctionne de 8h à 22h , sauf pour les fortes chaleurs. Ma pergola me protège une grande baie vitré côté ouest et me fait de l’ombre quand il fait trop chaud.

alias: PERGOLA_PLUIE_HEURES_SIMPLE
description: >
  Gestion optimisée de la pergola sans vérification de position. Positions :
  0=0%, 190=25%, 300=50%, 500=100%. Horaires spécifiques pour les week-ends
  (début à 9h). En été/printemps, si couverture nuageuse ≥ 70% entre 8h et
  20h30, ouverture à 50% (vérifié toutes les 15 min).
triggers:
  - minutes: /15
    id: toutes_les_15_minutes
    trigger: time_pattern
  - at: "08:00:00"
    id: heure_8h
    trigger: time
  - at: "09:00:00"
    id: heure_9h
    trigger: time
  - at: "10:00:00"
    id: heure_10h
    trigger: time
  - at: "12:00:00"
    id: heure_12h
    trigger: time
  - at: "20:30:00"
    id: heure_20h30
    trigger: time
  - event: sunset
    id: coucher_soleil
    trigger: sun
conditions:
  - condition: state
    entity_id: automation.auto_pergola_lames
    state: "on"
  - condition: time
    after: "08:00:00"
    before: "20:40:00"
actions:
  - choose:
      - conditions:
          - condition: trigger
            id: toutes_les_15_minutes
          - condition: numeric_state
            entity_id: sensor.temperature_moyenne_exterieure
            above: 4
          - condition: numeric_state
            entity_id: sensor.salaunes_cloud_cover
            above: 71
          - condition: state
            entity_id: binary_sensor.pergola_sechage_ok
            state: "on"
        sequence:
          - data:
              position: 300
            action: rest_command.pergola_set_motorlevel
      - conditions:
          - condition: trigger
            id: heure_8h
          - condition: or
            conditions:
              - condition: state
                entity_id: sensor.season
                state: spring
              - condition: state
                entity_id: sensor.season
                state: summer
          - condition: time
            weekday:
              - mon
              - tue
              - wed
              - thu
              - fri
          - condition: numeric_state
            entity_id: sensor.temperature_moyenne_exterieure
            above: 4
          - condition: state
            entity_id: binary_sensor.pergola_sechage_ok
            state: "on"
        sequence:
          - data:
              position: 190
            action: rest_command.pergola_set_motorlevel
      - conditions:
          - condition: trigger
            id: heure_9h
          - condition: or
            conditions:
              - condition: state
                entity_id: sensor.season
                state: spring
              - condition: state
                entity_id: sensor.season
                state: summer
          - condition: time
            weekday:
              - sat
              - sun
          - condition: numeric_state
            entity_id: sensor.temperature_moyenne_exterieure
            above: 4
          - condition: state
            entity_id: binary_sensor.pergola_sechage_ok
            state: "on"
        sequence:
          - data:
              position: 190
            action: rest_command.pergola_set_motorlevel
      - conditions:
          - condition: trigger
            id: heure_10h
          - condition: or
            conditions:
              - condition: state
                entity_id: sensor.season
                state: spring
              - condition: state
                entity_id: sensor.season
                state: summer
          - condition: state
            entity_id: binary_sensor.pergola_sechage_ok
            state: "on"
        sequence:
          - data:
              position: 300
            action: rest_command.pergola_set_motorlevel
      - conditions:
          - condition: trigger
            id: heure_12h
          - condition: numeric_state
            entity_id: sensor.salaunes_cloud_cover
            below: 70.9
          - condition: or
            conditions:
              - condition: state
                entity_id: sensor.season
                state: spring
              - condition: state
                entity_id: sensor.season
                state: summer
          - condition: state
            entity_id: binary_sensor.pergola_sechage_ok
            state: "on"
        sequence:
          - data:
              position: 500
            action: rest_command.pergola_set_motorlevel
      - conditions:
          - condition: or
            conditions:
              - condition: trigger
                id: coucher_soleil
              - condition: trigger
                id: heure_20h30
        sequence:
          - data:
              position: 190
            action: rest_command.pergola_set_motorlevel
mode: restart


Partie automation pour Régler luminosité:

alias: AUTO - Pergola - Régler luminosité
description: Envoie la valeur de luminosité à la pergola
triggers:
  - entity_id: input_number.pergola_light_brightness
    trigger: state
conditions: []
actions:
  - data:
      brightness: "{{ trigger.to_state.state | int }}"
    action: rest_command.pergola_set_brightnesslevel
mode: single

Partie automation pour Régler position lames

alias: AUTO - Pergola - Régler position lames
description: Envoie la position des lames à la pergola
triggers:
  - entity_id:
      - input_number.pergola_blades_angle
    trigger: state
conditions: []
actions:
  - data:
      position: "{{ trigger.to_state.state | int }}"
    action: rest_command.pergola_set_motorlevel
mode: single

Modification de l’automation pour s’adapter à la nouvelle configuration yaml du 31/08/2025

1 « J'aime »

Bonjour @Zigfou

Merci beaucoup pour toutes ces informations, c’est juste top
Merci aussi à @MikeBZH44 qui m’a été d’un grand secours pour ma domotique Jeedom de l’époque, et qui l’est encore pour mon HA d’aujourdhui
Et merci à tous les autres
Sans vous tous, je serai encore à l’âge de pierre chez moi :smiley:

Je veux bien à l’occase les infos sur la station netatmo

Pour Zenisun, il y a aussi un topic plus précis ici qui peut être utile je pense :

2 « J'aime »

Il doit y avoir une coquille dans ton premier message car le 3ème bloc de code est identique au 1er et traite de l’ouverture des lames :wink:

ça doit être pour ça que je m’arrache les cheveux depuis une heure :rofl:

(bon suis pas doué non plus hein )

Je corrigé ce soir, j’ai fait ça rapidos ce matin

1 « J'aime »

Si tout se passe comme prévu, voici ce que l’on obtient.

1 « J'aime »

Beau boulot ! :+1: :+1: :+1:

Le slider de la rotation des lames ne fonctionne pas
Est ce une erreur de mon côté, ou sur le script ?

Egalement, la lumiere ne s’éteind pas completement, et les lames ne se ferment pas completement

Il prend pas la fonction off et c’est vrai que je ne l’utilise pas. Faut que je regarde comment le corriger.

Moi aussi j’étais sur jeedom et j’ai utilisé les infos de mikeBZH44.

Je ne sais pas si ça peut aider
sur Jeedom, cette commande ferme completement les lames

(« http://192.168.0.xx/zns.cgi?cmd=m&m=3&a=0 »)

Egalement si je fais cette requete sur mon naviguateur web, ca ferme complement

Par contre, quand je passe par HA, a « fermeture lame 0 », les lames restent ouvertes à 6°
Je comprends pas pourquoi ce décalage

Le bouton lumiere pergola Off, c’est ok par contre
Juste le slider lumière qui laisse allumé à 1%

J’ai le même problème et je n’arrive pas à comprendre comment ça fonctionne, c’est pour ça que je ne les utilise pas et préfère les boutons

@MikeBZH44 va nous sauver :innocent: :smiley:

Bonjour,

N’étant pas très a l’aise avec HA je n’arrive pas à avoir une structure de fichier correct pour mettre en Œuvre Zenisun.

Dans un premier temps j’avais créé un fichier zenisun.yaml et tenté un include dans le fichier configuration, mais je n’y suis pas arrivé. Message me disant que zenisun.yaml introuvable.

Du coup j’ai tout mis dans le fichier configuration de HA, mais sûrement pas une bonne idée.

Qui pourrais m’aider pour la structure et quoi mettre dans le fichier config…

Merci

tu as un super tuto sur la chaine youtube de thomas https://www.youtube.com/watch?v=To0250X2ABU.

Tu as aussi le tuto de tof https://les-tutos-du-tof.fr/modifier-configuration-yaml/

Et enfin tu as le tuto de McFly https://forum.hacf.fr/t/organisation-du-fichier-configuration-yaml/205

Mais en gros et en résumé, tu chercher la ligne:
-sensor et tu copie toute la ligne senor
-light et tu copie toute la ligne light.

si tu n’a pas de ligne rest command, tu la copie tout en bas de ton fichier.

Merci je vais regarder tout ça.

Salut

@Erik06
Pour le codage, mon frangin m’a fait découvrir hier soir une ia (Claude.ai)
Il peut même générer les codes
N’hésite pas à essayer, et lui poser des questions, c’est bluffant

@Zigfou @MikeBZH44
J’ai réussi à fermer complement la pergo en utilisant la commande toute simple

execute_zns_command:
  url: "http://192.168.0.xx/zns.cgi?cmd=m&m=1&p=0"
  method: GET

Cela veut dire que dans ton code @Zigfou la variable n’est jamais à 0
Voilà, c’était juste pour info

1 « J'aime »

@Chris73,
Merci pour ce pointeur IA, effectivement très intéressant :wink:.
Je lui ai demander comment structurer et sa réponse m’a l’air pas mal du tout.

Je prends note et modifie mon code ici présent après l’avoir testé dès que possible.