Volet roulant - module zigbee - arrêt à mi-course

Bonjour, j’ai acquis un module zigbee pour mes volets roulants 4 fils B…dorf.
Je l’ai calibré il monte et descend sans problème.
Je rencontre cependant un souci pour arrêter la course du volet à mi-chemin.
Exemple : dans Lovelace je lance la montée du volet avec la flèche haute… pour le stopper, je dois appuyer sur « stop » (qui ne fait rien) et à nouveau appuyer sur la flèche montante ce qui stoppe enfin la course. Ce problème a-t-il déjà été évoqué ici ou sur le forum ? Faut-il faire un script pour chaque action ? Y a-t-il moyen de configurer le relais ?

Salut,

sans donner le modèle du module difficile pour quelqu’un de te dire.
Normalement dans une entité cover le « stop » est là par défaut sur la carte, mais c’est l’entité qui doit aussi savoir le gérer.
Il faut voir les options de ton module, les branchements de celui-ci.
Sur des sites comme blakadder tu as les infos de tous les modules et des commandes qu’ils gèrent.

Il s’agit d’un module Tuya en Z2M.
Mon volet a 4 fils et ne prend pas en compte le « STOP ». L’interrupteur mural déjà en place n’a que deux boutons. Sans le module, il faut enfoncer une seconde fois le bouton poussoir pour pouvoir stopper la course du volet. Avec le module il faut enfoncer trois fois de suite pour le stopper ; pénible avec le vas et vient c’est interminable et fait du bruit : 6 cliques).

En partageant avec un ami, il m’a été soumis l’idée de récupérer le statut en MQTT et d’en faire une automatisation.

Pour stopper la couse du volet il faut faire un payload {"state": "STOP"} (qui ne fait rien mais permet de réarmer les boutons monté/ descente) et y mettre à la suite un {"state": "OPEN"} ou {"state": "CLOSE"} pour stopper la course.
Le premier et le second appui sur le bouton physique suivent bien cette logique car c’est le comportement observé dans le topic MQTT.

Mon idée (…enfin celle qu’on m’a soufflée) est donc de snifer le payload {"state": "STOP"} qu’il soit généré via l’interrupteur physique ou par Lovelace (PS : Le seul truc qui passe en "STOP" est "moving") et de publier dans la foulée un {"state": "OPEN"} pour stopper le moteur.

{"calibration":"OFF","calibration_time":15.2,"linkquality":69,"motor_reversal":"OFF","moving":"STOP","position":1,"state":"OPEN"}

Or, lorsque le volet fini sa course en butée basse (à la fin de la temporisation lorsqu’il est synchronisé) le payload passe en statut « STOP », ce qui revient à publier un nouveau statut « OPEN » sur MQTT et réouvre le volet. En butée haute (volet totalement ouvert), le statut reste en « OPEN ».
J’ai donc fait une condition pour ne pas faire de modification du payload en fin de course en utilisant la position théorique du volet. J’obtient alors l’automatisation suivante :

automation:
  - alias: cover_stop
    trigger:
      - platform: mqtt
        topic: "zigbee2mqtt/vol_cuisine_bureau"
        payload: "STOP"
        value_template: "{{ value_json.moving }}"
    condition:
      - condition: template
        value_template: '{{ 90 > trigger.payload_json.position > 10 }}'
    action: 
      - service: mqtt.publish
        data:
          payload: '{"state":"OPEN"}' 
          topic: 'zigbee2mqtt/vol_cuisine_bureau/set'

L’automatisation fonctionne comme souhaitée. Il me suffit d’une seule pression pour stopper la course du volet entre les positions 10 et 90 que se soit via l’interupetur physique ou par Lovelace.

Peut être que ceux d’entre vous qui aurons lu le post jusque ici se dirons : « quel couillon. il parle de trois cliques et n’en fait que d’une pierre deux coup dans l’automatisation ».

Je vous expose donc mon dernier problème encore non-résolu : J’ai bel et bien besoin de réaliser trois coups en une action, car le Payload {"state": "OPEN"} qui permet de stopper la course du volet me relance la course théorique via le payload {"position": VALUE}. La position théorique du volet fini donc toujours en butée alors qu’arrêté à mi-course en réel.

J’ai pensé remplacer l’action de l’automation par une séquence qui publierait à la suite un nouveau payload {"state": "STOP"} mais me retrouve avec un cercle vicieux qui relance l’automatisation sans fin.
J’ai penser désactiver l’automation dans la séquence, le temps de la publication mais n’y parvient pas.

Je fait donc appel à vos lumières pour ce dernier point. Merci a ceux qui aurons lu la totalité de mon raisonnement alambiqué. Je suis conscient que malgré la longueur de ce récit une solution alternative et beaucoup plus simple simple pourrait émerger.

Merci par avance

Salut,

Pour faire simple, pourquoi tu ne met pas à jour ta position dans ton automation après la relance ? (avec peut être un « delay » pour attendre que la relance théorique soit terminée)

Un payload avec la position ? C’est une solution. Mais on voit sur fermer le volet sur l’appli avant. Si l’on arrive a stopper la course théorique, je n’ai plus ce problème.
Je pensais publier un "state":"stop" mais il est aussi interprété comme "moving":"stop" et lance la boucle infinie.

Salut,

juste pour être sûr d’avoir couvert toutes les bases, dans zigbee2MQTT, tu as bien essayé le stop depuis l’interface, directement dans Z2M?

Oui. Il passe bien le payload en stop, mais le volet continu. Il lui faut un impulsion sur le fil haut ou bas pour qu’il stop.
Par ailleurs un simple impulsion lui suffirai si on peut paramétrer le comportement du module. En écrivant ces ligne je me demande si mettre en place une calibration à 0,5 sec et passer par un sensor time pour géré la position du volet ne serait pas la solution.

Question qui parait simple mais qui amène à faire réfléchir

Juste comme ça, mon idée initiale ne fonctionne pas ? (créer un template et ne plus utiliser l’entité utilisée par zigbee2mqtt)

Il te suffit de créer une autre entité manuellement : voici un exemple sans les options que tu trouveras ici →

https://www.home-assistant.io/integrations/cover.template

En ajoutant des options propres à ta configuration tu pourra avoir la position, stocker l’état etc.

cover:  
  - platform: template
    covers:
      vol_cuisine_bureau:
        friendly_name: "Volets cuisine bureau"
        unique_id: volet_bureau_cuisine
        open_cover:
          - service: mqtt.publish
            data:
			  payload: '{"state":"OPEN"}' 
              topic: 'zigbee2mqtt/vol_cuisine_bureau/set'
        close_cover:
          - service: mqtt.publish
            data:
			  payload: '{"state":"CLOSE"}' 
              topic: 'zigbee2mqtt/vol_cuisine_bureau/set'
        stop_cover:
          - service: mqtt.publish
            data:
			  payload: '{"state":"STOP"}' 
              topic: 'zigbee2mqtt/vol_cuisine_bureau/set'
          - service: mqtt.publish
            data:
			  payload: '{"state":"OPEN"}' 
              topic: 'zigbee2mqtt/vol_cuisine_bureau/set'

A créer dans ton cover.yaml ou directement dans configuration.yaml

Si ca ne marche pas, quelques pistes :

  • Mettre un delay entre chaque service pour le stop et/ou ajouter un 3eme service STOP

J’ai mis en place le corver template avec le script suivant :

  - platform: template
    covers:
      mqtt_volets_bureau:
        device_class: shutter
        friendly_name: "Volets Bureau"
        open_cover:
          - service: mqtt.publish
            data:
              payload: '{"state":"OPEN"}'
              topic: 'zigbee2mqtt/vol_cuisine_bureau/set'
        close_cover:
          - service: mqtt.publish
            data:
              payload: '{"state":"CLOSE"}'
              topic: 'zigbee2mqtt/vol_cuisine_bureau/set'
        stop_cover:
          service_template: >
            {% if (is_state_attr('cover.vol_cuisine_bureau', 'moving', 'UP')) %}
              script.cover_mqtt_volets_bureau_stop_up
            {%elif (is_state_attr('cover.vol_cuisine_bureau', 'moving', 'DOWN'))%}
              script.cover_mqtt_volets_bureau_stop_down
            {% endif %}

script:
  cover_mqtt_volets_bureau_stop_up:
    sequence:
      - service: mqtt.publish
        data:
          payload: '{"state":"CLOSE"}'
          topic: 'zigbee2mqtt/vol_cuisine_bureau/set'
      - delay: "00:00:01"
      - service: mqtt.publish
        data:
          payload: '{"state":"STOP"}'
          topic: 'zigbee2mqtt/vol_cuisine_bureau/set'
  cover_mqtt_volets_bureau_stop_down:
    sequence:
      - service: mqtt.publish
        data:
          payload: '{"state":"OPEN"}'
          topic: 'zigbee2mqtt/vol_cuisine_bureau/set'
      - delay: "00:00:01"
      - service: mqtt.publish
        data:
          payload: '{"state":"STOP"}'
          topic: 'zigbee2mqtt/vol_cuisine_bureau/set'

Le comportement des boutons du « cover template » est bon, mais je perds le comportement des boutons physiques. J’ai dû mettre une temporisation, car il semble que les infos ne soient pas prises en compte sans.
Capture d’écran 2023-01-23 à 09.47.26
Le positionnement de mon volet « cover initial » est le bon, car le script il permet d’arrêter le la course fictive du volet. Cependant il n’affiche pas la position du volet. Comment récupérer cette position pour mon « cover template » ?

PS : j’aurais pu me passer du script pour le fonctionnement, mais aurais arrêté la course du volet avec soit CLOSE, soit OPEN. Je rencontrais des soucis avec cette config. Du fait que je ne possède pas le report d’état je n’ai qu’un bouton de dispo sur le « cover template » alors que je volet peut repartir dans les deux sens.