Exemple de programmation de volet roulant sur un IPX V5 (sans X-4VR)

Je ne pense pas avoir vu cette solution sur le forum, le wiki ou dans la documentation alors je me permet de la partager :blush:

Pour mon bureau (le bâtiment, pas la pièce) j’ai un seul volet roulant donc je ne me voyais pas utiliser un X-4VR juste pour un seul volet roulant, d’autant plus que j’avais assez d’entrées et de sorties pour le gérer « manuellement ».

J’ai donc branché sur mon IPX V5

  • un bouton poussoir pour la montée sur une entrée digitale
  • un bouton poussoir pour la descente sur une autre entrée digitale
  • la sortie montée du volet roulant sur un relais
  • la sortie descente du volet roulant sur un autre relais

Jusque là c’est assez classique comme montage, et très bien documenté :ok_hand:

La première chose que j’ai faite c’est d’éditer les liens de mon IPX afin de lier directement le status des boutons poussoirs aux relais correspondant. Dès que j’appuie sur le bouton poussoir de la montée, le volet roulant monte. Dès que je le relâche, le volet s’arrête. Idem pour la descente.

C’est bien pour mesurer le temps de parcours du volet roulant pour la montée et la descente, mais c’est très contraignant à l’utilisation. J’ai mieux à faire que de rester appuyé sur un bouton poussoir pendant plusieurs dizaines de secondes, comme écrire ce tutoriel :stuck_out_tongue_closed_eyes:

Le comportement habituel et bien plus confortable est le suivant

  • 1ère pression (appuie puis relâche) sur le bouton montée, lance la montée automatique du volet roulant. Cette dernière s’arrêtant « automatiquement » une fois le volet roulant intégralement monté.
  • 2ème pression sur le bouton montée pendant la montée, stoppe le volet roulant dans sa course.
  • 3ème pression sur le bouton montée reprends la montée automatique.

Et vice-versa pour la descente.

Une solution pour réaliser ce comportement est d’utiliser des objets « Tempo ».

  • On crée un Tempo pour la montée et un autre pour la descente.
  • On renseigne le temps (Tb) avec les durées de parcours de la montée et de la descente.
  • On ajoute un lien pour chaque sortie des Tempo vers le relais qui correspond.
  • On crée deux scenes de type [BP ⬇️] -> SWITCH [TEMPO ⬇️] pour chaque direction.

Ainsi, une 1ère pression sur le bouton poussoir de la descente :arrow_down: lancera le « Tempo » de la descente qui lui même activera le relais de la descente du volet roulant.

Si rien n’est fait, a la fin du temps configuré, la « Tempo » s’éteindra, éteignant ainsi le relais. Le volet est maintenant entièrement fermé/descendu.

Si, pendant la descente, on appuie une nouvelle fois sur le BP :arrow_down:, alors la « Tempo » sera mise en pause et le volet roulant s’arrêtera.

Une 3ème pression viendra redémarrer la Tempo qui relancera la descente du volet roulant.

Cette solution fonctionne très bien si l’on ne fait que des ouvertures/fermetures complètes sans changer de direction. Dès lors que l’on change de direction, le Tempo de la direction opposé redémarre au « début » et l’on peux se retrouver dans un cas où l’on a lancé une descente par erreur et l’on souhaite remonter le volet roulant. Si la descente n’aura duré que quelques secondes, la montée elle durera l’intégralité du temps configuré dans le Tempo de la montée. Je ne pense pas que cela soit bien grave car les volets roulants ont des butées de sécurité qui empêchent le volet d’aller trop loin. Mais laisser un relais « actif » plus qu’il n’en faut est trop pour moi :sweat_smile:

C’est pourquoi j’ai opté pour la solution suivante. Elle n’est pas parfaite, et j’imagine que les experts y trouverons des améliorations possibles :wink:

J’ai opté pour l’utilisation d’un compteur pour « matérialiser » l’état du volet roulant. J’ai de la chance que la montée et la descente prennent presque le même temps : 26s pour la descente, 27s pour la montée. Histoire de simplifier la configuration, j’ai décidé que les deux prennent le même temps : 27 secondes. Lorsque mon compteur est à 0, c’est que le volet est entièrement ouvert. Lorsqu’il est à 27, le volet est entièrement fermé.

Le compteur est on ne peux plus basique (veuillez s’assurer que le pas = 1).

Ensuite, j’ai créé deux « blinkers » (clignotants), un pour chaque direction. Ils servent à incrémenter (+1) ou décrémenter (-1) le compteur VR toutes les secondes. Ces derniers sont configurés ainsi

  • Durée en millisecondes (au lieu de seconde par défaut)
  • TA = 1000ms = 1s
  • TB = 50ms
  • La sortie est lié à l’entrée INC + pour la descente et à DEC - pour la montée

Lorsqu’un clignotant est activé, il viendra incrémenter ou décrémenter le compteur en fonction de la direction.

J’ai aussi créé 4 comparateurs pour convertir des tests « analogiques » (A > B par exemple) en « booléen » (vrai/faux) car il n’est pas possible de mixer les deux types dans les scènes.

  • VR > 0
  • VR <= 0
  • VR < 27
  • VR >= 27

Chaque compteurs a comme variable d’entrée A un lien vers le compteur VR.
Ensuite, j’ai changé l’opérateur et la variable B en fonction ce qu’ils ont à tester.

Maintenant, il ne reste plus qu’à faire les 4 scènes suivantes, deux pour chaque direction.

Une 1ère scène (:green_circle: VR :arrow_down:) pour lancer ou arrêter la descente du volet roulant via le bouton poussoir.

Évènement = BP VR ⬇️ ET VR < 27

Résultats
= SWITCH BLINKER VR ⬇️ [START] + RELAIS VR ⬇️
= OFF BLINKER VR ⬆️ [START] + BLINKER VR ⬆️ [OUTPUT] + RELAIS VR ⬆️

En :fr:, ça donne : lorsque le bouton poussoir VR :arrow_down: est pressé et que le volet roulant n’est pas déjà entièrement fermé (27 = fermé), alors on

  • Inverse l’état (switch) de l’entrée du clignotant VR :arrow_down: et du relais VR :arrow_down: afin de pouvoir démarrer ou arrêter la descente du volet roulant et son clignotant.
  • Éteint (off) l’entrée du clignotant VR :arrow_up: et la sortie du clignotant VR :arrow_up: et le relais VR :arrow_up: afin de s’assurer que les relais de la montée et de la descente ne soient jamais actifs en même temps !

Une 2ème scène (:red_circle: VR :arrow_down:) pour gérer l’arrêt automatique de la descente lorsque l’on est en fin de parcours (aka. au bout des 27 secondes).

Évènement = COMPTEUR VR >= 27

Résultat OFF BLINKER VR ⬇️ [START] + BLINKER VR ⬇️ [OUTPUT] + RELAIS VR ⬇️

En :fr:, ça donne : lorsque le compteur VR atteints ou dépasse la valeur 27, alors on éteint (mets à OFF)

  • l’entrée « START » du clignotant VR :arrow_down: (pour arrêter le clignotant)
  • la sortie « OUTPUT » du clignotant VR :arrow_down: (pour être :100:% sur que le clignotant à fini)
  • le relais VR :arrow_down: de la descente

Les deux autres scènes sont identiques mais gèrent la montée :point_up_2:

Avec ça, peu importe où/quand vous arrêtez votre volet roulant, les relais ne seront actifs que pour la durée qui reste pour finir la montée ou la descente.

Par example, le volet commence à 0, tout ouvert. On presse le BP :arrow_down: une 1ère fois, ce qui active le relais VR :arrow_down: pour descendre le volet roulant et active aussi le clignotant VR :arrow_down: qui va venir incrémenter le compteur VR de 1 toutes les secondes.

Si, au bout de 10 secondes, vous pressez à nouveau le BP :arrow_down:. Le relais VR :arrow_down: sera désactivé, stoppant le volet roulant dans sa course, et le clignotant VR :arrow_down: sera mis en pause. Le compteur VR restera à 10.

Maintenant, si vous appuyez sur BP :arrow_up:, cela activera le relais VR :arrow_up: et lancera le clignotant VR :arrow_up: qui viendra décrémenter le compteur VR toutes les secondes. Puisque le compteur VR était à 10, la montée ne durera que 10 secondes. :clap:


Un petit bonus de ce système : si vous souhaitez avoir une valeur de 0 à 100 pour indiquer le pourcentage d’ouverture (ou fermeture) du volet roulant, il suffira de créer une fonction personnalisé avec un lien vers le compteur VR et l’entrée A et la formule 100 * x / 27 pour avoir en résultat le %


N’hésitez pas si vous avez des questions, suggestions, idées, commentaires, améliorations, remarques, etc… Je ne mords pas :wink:

8 « J'aime »

Bonjour ZogStrip,

bravo pour l’idée du compteur/position et surtout pour avoir pris le temps de partager :wink:

Suggestion pour faciliter la compréhension, faire un diagramme type SysML, dans le genre de celui que a fait @fgtoul pour le tuto sur les variables.

Bonne journée

1 « J'aime »

Bonjour @ZogStriP,

Super exemple :clap: !!! Pas toujours facile de savoir « comment faire » « pour » et ici cet exemple clairement documenté permettra de dériver cet exemple pour d’autres besoins !
Si tu peux exporter les scénarios (json) et les partager :+1:


C’est presque un mini-tuto à mettre dans la catégorie tuto !!!

Un petit bonus de ce système : si vous souhaitez avoir une valeur de 0 à 100 pour indiquer le pourcentage d’ouverture (ou fermeture) du volet roulant, il suffira de créer une fonction personnalisé avec un lien vers le compteur VR et l’entrée A et la formule 100 * x / 27 pour avoir en résultat le %

Possible d’avoir une capture d’écran de la fonction car je vois pas trop (je suppose que le 27 est le temps de montée ou descente et donc à adapter à chaque cas de volet) ?

1 « J'aime »

Ravis que cela puisse aider d’autres personnes :raised_hands:

Je n’avais pas vu cette option. Le voici

{
  "name": "VOLET ROULANT",
  "version": "A1",
  "date": "2023-08-25T12:13:40.937Z",
  "data": [
    {
      "api": "/api/rule-engine/scene",
      "keys": [],
      "content": {
        "name": "VOLET ROULANT",
        "icon": 9001,
        "errorStatus": "0x0000",
        "usage": 12,
        "exportLabels": {}
      }
    },
    {
      "api": "/api/rule-engine/rule",
      "keys": [
        {
          "label": "inputList",
          "type": "in"
        },
        {
          "label": "outputList",
          "type": "out"
        }
      ],
      "content": {
        "name": "🟢 VR ⬇️",
        "scene": 10551298,
        "inputList": [
          12648447,
          10,
          1441791
        ],
        "outputList": [
          4,
          13959167,
          12713983,
          2,
          13959167,
          13959167,
          65536
        ],
        "errorStatus": 0,
        "trigMode": 1,
        "tmpName": "🟢 VR ⬇️",
        "exportLabels": {
          "inputList": [
            "⬇️ VR",
            "not found",
            "VR < 27"
          ],
          "outputList": [
            "not found",
            "⬇️ VR [START]",
            "⬇️ VR",
            "not found",
            "⬆️ VR [START]",
            "⬆️ VR [OUTPUT]",
            "⬆️ VR"
          ]
        }
      }
    },
    {
      "api": "/api/rule-engine/rule",
      "keys": [
        {
          "label": "inputList",
          "type": "in"
        },
        {
          "label": "outputList",
          "type": "out"
        }
      ],
      "content": {
        "name": "🔴 VR ⬇️",
        "scene": 10551298,
        "inputList": [
          1441791
        ],
        "outputList": [
          2,
          13959167,
          13959167,
          12713983
        ],
        "errorStatus": 0,
        "trigMode": 1,
        "tmpName": "🔴 VR ⬇️",
        "exportLabels": {
          "inputList": [
            "VR >= 27"
          ],
          "outputList": [
            "not found",
            "⬇️ VR [START]",
            "⬇️ VR [OUTPUT]",
            "⬇️ VR"
          ]
        }
      }
    },
    {
      "api": "/api/rule-engine/rule",
      "keys": [
        {
          "label": "inputList",
          "type": "in"
        },
        {
          "label": "outputList",
          "type": "out"
        }
      ],
      "content": {
        "name": "🟢 VR ⬆️",
        "scene": 10551298,
        "inputList": [
          12648447,
          10,
          1441791
        ],
        "outputList": [
          4,
          13959167,
          65536,
          2,
          13959167,
          13959167,
          12713983
        ],
        "errorStatus": 0,
        "trigMode": 1,
        "tmpName": "🟢 VR ⬆️",
        "exportLabels": {
          "inputList": [
            "⬆️ VR",
            "not found",
            "VR > 0"
          ],
          "outputList": [
            "not found",
            "⬆️ VR [START]",
            "⬆️ VR",
            "not found",
            "⬇️ VR [START]",
            "⬇️ VR [OUTPUT]",
            "⬇️ VR"
          ]
        }
      }
    },
    {
      "api": "/api/rule-engine/rule",
      "keys": [
        {
          "label": "inputList",
          "type": "in"
        },
        {
          "label": "outputList",
          "type": "out"
        }
      ],
      "content": {
        "name": "🔴 VR ⬆️",
        "scene": 10551298,
        "inputList": [
          1441791
        ],
        "outputList": [
          2,
          13959167,
          13959167,
          65536
        ],
        "errorStatus": 0,
        "trigMode": 1,
        "tmpName": "🔴 VR ⬆️",
        "exportLabels": {
          "inputList": [
            "VR <= 0"
          ],
          "outputList": [
            "not found",
            "⬆️ VR [START]",
            "⬆️ VR [OUTPUT]",
            "⬆️ VR"
          ]
        }
      }
    }
  ]
}

VR.zip (694 Octets)

Oui c’est juste une formule basique de conversion d’une valeur entre 0 et 27 vers une valeur entre 0 et 100.

1 « J'aime »

bonjour @ZogStriP
Aie malheureusement cela ne fonctionnes que sur l’ipx car il n’y a pas les fonctions etc dans le json :sob:


Dommage car cela permettrait plein d’échanges de scénarios !
Peut-être que @GCE fera une évolution dans le futur qui permettra cela… :thinking:

Bonjour, désolé, mais j’utilise le traducteur. Je suis dans la même situation sans VR4. Je deviens fou… Pourrais-tu m’envoyer des photos de ta configuration pour un volet roulant complet avec commande haut/bas ? Je parle des objets, du minuteur, des compteurs, etc. Merci.