Recherche simplification de code

Bonjour à tous,
Je peux piloter mes volets roulants somfy RTS grâce à des commandes REST par l’intermédiaire d’un ESP8266 et d’un cc1101.
Tout fonctionne parfaitement mais il y a beaucoup de répétition dans le fichier configuration.

Création des entités de type cover dans configuration.yaml :

  - platform: template
    covers:
      volet_salon:
        device_class: shutter
        friendly_name: "Volet du salon"
        optimistic: true
        open_cover:
          service: script.Volet_ouvre
          data:
            num_volet: '{{ this.attributes.volet_numero }}'
        close_cover:
          service: script.Volet_ferme
          data:
            num_volet: '{{ this.attributes.volet_numero }}'
        stop_cover:
          service: script.Volet_arret
          data:
            num_volet: '{{ this.attributes.volet_numero }}'
      volet_salleamanger:
        device_class: shutter
        friendly_name: "Volet de la salle à manger"
        optimistic: true
        open_cover:
          service: script.Volet_ouvre
          data:
            num_volet: '{{ this.attributes.volet_numero }}'
        close_cover:
          service: script.Volet_ferme
          data:
            num_volet: '{{ this.attributes.volet_numero }}'
        stop_cover:
          service: script.Volet_arret
          data:
            num_volet: '{{ this.attributes.volet_numero }}'

Comme vous le voyez, une grande partie est répétitive. En tout, j’ai 8 volets, donc 8 fois un code identique. Quelqu’un a-t-il une idée pour simplifier cela ?
De plus, je n’ai pas réussi à récupérer le « volet_numéro » directement dans le script via l’équivalent d’un trigger, sans passer par un paramètre. Quelqu’un sait-il comment faire ?

Pour information, voici le customize et le script.
Ajout de l’attribut volet_numero dans customize.yaml :

      cover.volet_salon:
        volet_numero: 0
      cover.volet_salleamanger:
        volet_numero: 2

et un des 3 scripts :

alias: Volet_ouvre
sequence:
  - service: script.volet_action
    data:
      num_v: "{{num_volet}}"
      action: ouvre
mode: queued

Merci pour votre aide.

Interessant l’usage d’un cc1101 pour somfy sous RTS. Si cela fonctionne bien, cela intéressera du monde vu le prix des antennes RTXCom (j’utilise moi un vieux RFXtrx433XL). N’hésites pas a faire un retour voir un petit tuto :blush:

Autrement, si tu veux créer 8 entités cover, je crains qu’il ne faille créer 8 template. On ne peut a ma connaissance créer d’entités dynamiques avec HA. C’est possible avec node-red, mais pas de sens ici je pense.

L’alternative est d’utiliser dans l’interface des boutons qui appellent le script, sans entités cover.
Perso je ferai les copier coller pour avoir mes 8 entités cover propres, mettrai les no de volets directement dans les template (pas de customize), et mettrai tout le yaml dans un package dédié aux volets roulants… :upside_down_face:

Salut,

Dans le fichier de configuration ce n’est pas vraiment un souci si c’est du one-off, en plus je ne pense pas que tu vas ajouter des nouveaux volets tous les 2 jours :slight_smile:
Au pire si c’est pour simplifier ton fichier configuration, tu peux faire un fichier dédié aux covers en include.

Sinon concernant ton code actuel:

  • Je ne comprends pas pourquoi tu ne peux pas directement mettre le numéro de chaque volet directement dans le « num_volet » du fichier de config…?
  • si c’est pour le simplifier HA, mais complexifier ton ESP, tu peux masser en MQTT… tu n’aurais plus besoin que d’une entité plus courte dans HA pour chaque volet et plus de scripts ni de customize.

Salut
J’ajouterai que si le but du numéro de volet c’est uniquement pour simplifier le copier/coller du template alors ça n’a pas d’intérêt:

  • il faut définir le numéro ailleurs donc on gagne pas de temps
  • on peut tout aussi bien piloter les volets via le nom de l’entité, éventuellement même sans script
  • perso je me mémorise mieux volet_cuisine que 3

Je suis dans le même cas. 9 volets dont 7 rts, avec en plus l’utilisation des intégrations cover_rf_timebased… C’est long à faire mais je n’y suis pas retourné depuis le premier setup

Merci beaucoup à tous pour vos réponses.
Concernant ma solution, je me suis inspiré de :

Par contre, je stocke les valeurs des rolling-code sur ma base SQL que je recharge à chaque redémarrage de l’ESP8266, la limite du nombre d’écriture de l’EEPROM me faisant peur.

Merci pour vos conseils.

  • je vous confirme que les volets sont dans un fichier ‹ volets.yaml › séparé, mais je trouve dommage de réécrire 8 fois exactement les mêmes lignes. En cas de modif, il faut la faire 8 fois. Maintenant, je suis d’accord, une fois mis au point, je n’y retournerai pas.
  • num_volet directement dans le fichier config, j’ai cherché longtemps sans trouvé de réponse. Je vais essayé puis je vous fais un retour.
  • les volets sont numérotés dans l’esp8266, il faut donc attribuer un numéro à chaque volet.

Et pour connaitre l’événement appelant du script (du style ‹ cover.volet_salon.open_cover ›) directement dans le script, des idées ?

Bon, j’ai testé rapidement, impossible de mettre ‹ num_volet › dans la configuration : ‹ invalid option for [cover.template] ›.
Passer par le customize n’est pas un problème, mais si quelqu’un a la solution, cela m’intéresse.

Salut,

Moi je pensais juste à faire comme ci-dessous.
Ca me parait curieux qui’il essaye d’interpreter num_volet comme un paramètre du cover.

  - platform: template
    covers:
      volet_salon:
        device_class: shutter
        friendly_name: "Volet du salon"
        optimistic: true
        open_cover:
          service: script.Volet_ouvre
          data:
            num_volet: 3
        close_cover:
          service: script.Volet_ferme
          data:
            num_volet: 3
        stop_cover:
          service: script.Volet_arret
          data:
            num_volet: 3

Oui, si tu veux, mais je déteste répéter 3 fois le même data … je préfère le mettre en customize.

Comme tu veux mais c’est de l’optimisation non optimale :slight_smile:
Dans la config tu remplaces 1 caractère répété 3 fois par 33 répétés 3 fois + la partie du customize.
Donc 3 caractères remplacés par 99… sur 8 volets, 24 remplacés par 792.
Mais bon le résultat est le même.

1 « J'aime »

Bon, à force d’entêtement, j’ai réussi ce que je voulais :

  • une config simple (malgré le customize)
  • des actions regroupées dans une seule automatisation.
    J’ai mis beaucoup, beaucoup de temps pour trouver le numéro de volet dans l’automatisation (trigger.event…), mais voila le résultat :

Le customize reste inchangé.
La config réduite au minimum :

  - platform: template
    covers:
      volet_salon:
        device_class: shutter
        friendly_name: "Volet du salon"
        optimistic: true
        open_cover:
        close_cover:
        stop_cover:
      volet_salleamanger:
        device_class: shutter
        friendly_name: "Volet de la salle à manger"
        optimistic: true
        open_cover:
        close_cover:
        stop_cover:

et une automatisation à peine plus compliquée :

alias: Volet bouge
description: ""
trigger:
  - platform: event
    event_type: call_service
    event_data:
      domain: cover
      service: open_cover
  - platform: event
    event_type: call_service
    event_data:
      domain: cover
      service: close_cover
  - platform: event
    event_type: call_service
    event_data:
      domain: cover
      service: stop_cover
condition: []
action:
  - service: rest_command.commande_volet
    data:
      code_volet: >-
        {{state_attr(trigger.event.data.service_data.entity_id,'volet_numero')}}
        {% if trigger.event.data.service == 'open_cover' %}
        2
        {% elif trigger.event.data.service == 'close_cover' %}
        4
        {% elif trigger.event.data.service == 'stop_cover' %}
        1
        {% else %}
        0
        {% endif %}
mode: single

Pour la commande REST, il faut envoyer le numéro du volet et le numéro du mouvement. Par exemple : « 14 » pour fermer le volet numéro 1.