Problème d'automatisations et script pour portail

Bonjour,

J’essaie depuis plusieurs jours de mettre en place un script et des automatisations pour gérer l’ouverture, l’arrêt et la fermeture de mon portail qui est piloté par un relai zigbee.

Je dois m’y prendre comme une truffe car rien ne fonctionne comme souhaité.

J’ai créé deux entrées (input_number), une entrée avec 4 valeurs possibles : 0, 1, 2 ou 3. La valeur 0 correspondant au portail fermé, la valeur 1 au portail ouvert, la valeur 3 au portail en mouvement et la valeur 4 au portail partiellement ouvert. La deuxième entrée a deux valeurs possibles : 0 ou 1, la première valeur correspondant à l’ouverture (sens) et la deuxième à la fermeture. J’ai créé un timer de 25 secondes correspondant grosso modo au temps que met le portail à s’ouvrir ou se fermer.

J’ai sur le portail trois capteurs d’ouverture (un indiquant quand le portail est fermé, un indiquant quand le battant droit du portail est ouvert en grand et un indiquant quand le battant gauche est ouvert en grand.

J’ai 4 automatisations qui définissent la position du portail (et de de l’input_number nommé input_number.portail_position) :

  • Portail - Position portail fermé :
alias: Portail - Position portail fermé
description: ""
trigger:
  - platform: state
    entity_id:
      - binary_sensor.allee_du_garage_detecteur_de_fermeture_portail_contact
    from: "on"
    to: "off"
  - platform: state
    entity_id:
      - timer.portail_timer
    from: active
    to: idle
condition: []
action:
  - service: input_number.set_value
    metadata: {}
    data:
      value: 0
    target:
      entity_id: input_number.portail_position
  - service: timer.finish
    metadata: {}
    data: {}
    target:
      entity_id: timer.portail_timer
  - service: timer.cancel
    metadata: {}
    data: {}
    target:
      entity_id: timer.portail_timer
mode: single
  • Portail - Position portail ouvert :
alias: Portail - Position portail ouvert
description: ""
trigger:
  - platform: state
    entity_id:
      - >-
        binary_sensor.allee_du_garage_detecteur_d_ouverture_battant_droit_portail_contact
    from: "on"
    to: "off"
  - platform: state
    entity_id:
      - timer.portail_timer
    from: active
    to: idle
condition:
  - condition: state
    entity_id: >-
      binary_sensor.allee_du_garage_detecteur_d_ouverture_battant_gauche_portail_contact
    state: "off"
action:
  - service: input_number.set_value
    metadata: {}
    data:
      value: 1
    target:
      entity_id: input_number.portail_position
  - service: timer.finish
    metadata: {}
    data: {}
    target:
      entity_id: timer.portail_timer
  - service: timer.cancel
    metadata: {}
    data: {}
    target:
      entity_id: timer.portail_timer
mode: single
  • Portail - Position portail en mouvement :
alias: Portail - Position portail en mouvement
description: ""
trigger:
  - platform: state
    entity_id:
      - binary_sensor.allee_du_garage_detecteur_de_fermeture_portail_contact
    from: "off"
    to: "on"
  - platform: state
    entity_id:
      - >-
        binary_sensor.allee_du_garage_detecteur_d_ouverture_battant_droit_portail_contact
    from: "off"
    to: "on"
condition:
  - condition: state
    entity_id: timer.portail_timer
    state: active
action:
  - service: input_number.set_value
    metadata: {}
    data:
      value: 2
    target:
      entity_id: input_number.portail_position
mode: single
  • Portail - Position portail partiellement ouvert :
alias: Portail - Position portail partiellement ouvert
description: ""
trigger:
  - platform: state
    entity_id:
      - timer.portail_timer
    from: active
    to: paused
condition:
  - condition: state
    entity_id: >-
      binary_sensor.allee_du_garage_detecteur_d_ouverture_battant_droit_portail_contact
    state: "on"
  - condition: state
    entity_id: >-
      binary_sensor.allee_du_garage_detecteur_d_ouverture_battant_gauche_portail_contact
    state: "on"
  - condition: state
    entity_id: binary_sensor.allee_du_garage_detecteur_de_fermeture_portail_contact
    state: "on"
action:
  - service: input_number.set_value
    metadata: {}
    data:
      value: 3
    target:
      entity_id: input_number.portail_position
mode: single

Le script utilisé est le suivant :

alias: Allée du garage - Actionner portail
sequence:
  - choose:
      - conditions:
          - condition: numeric_state
            entity_id: input_number.portail_position
            below: 1
        sequence:
          - service: timer.start
            metadata: {}
            data: {}
            target:
              entity_id: timer.portail_timer
          - service: input_number.set_value
            metadata: {}
            data:
              value: 0
            target:
              entity_id: input_number.portail_sens
          - type: turn_on
            device_id: 4bd1068c9b590c3d3b2093b1ddbfd674
            entity_id: 8bbe9d33a26c8a37367385e18359c016
            domain: switch
          - delay:
              hours: 0
              minutes: 0
              seconds: 1
              milliseconds: 0
          - type: turn_off
            device_id: 4bd1068c9b590c3d3b2093b1ddbfd674
            entity_id: 8bbe9d33a26c8a37367385e18359c016
            domain: switch
      - conditions:
          - condition: numeric_state
            entity_id: input_number.portail_position
            above: 0
            below: 2
        sequence:
          - service: timer.start
            metadata: {}
            data: {}
            target:
              entity_id: timer.portail_timer
          - service: input_number.set_value
            metadata: {}
            data:
              value: 1
            target:
              entity_id: input_number.portail_sens
          - type: turn_on
            device_id: 4bd1068c9b590c3d3b2093b1ddbfd674
            entity_id: 8bbe9d33a26c8a37367385e18359c016
            domain: switch
          - delay:
              hours: 0
              minutes: 0
              seconds: 1
              milliseconds: 0
          - type: turn_off
            device_id: 4bd1068c9b590c3d3b2093b1ddbfd674
            entity_id: 8bbe9d33a26c8a37367385e18359c016
            domain: switch
      - conditions:
          - condition: numeric_state
            entity_id: input_number.portail_position
            above: 1
            below: 3
        sequence:
          - service: timer.pause
            metadata: {}
            data: {}
            target:
              entity_id: timer.portail_timer
          - type: turn_on
            device_id: 4bd1068c9b590c3d3b2093b1ddbfd674
            entity_id: 8bbe9d33a26c8a37367385e18359c016
            domain: switch
          - delay:
              hours: 0
              minutes: 0
              seconds: 1
              milliseconds: 0
          - type: turn_off
            device_id: 4bd1068c9b590c3d3b2093b1ddbfd674
            entity_id: 8bbe9d33a26c8a37367385e18359c016
            domain: switch
      - conditions:
          - condition: numeric_state
            entity_id: input_number.portail_position
            above: 2
        sequence:
          - if:
              - condition: numeric_state
                entity_id: input_number.portail_sens
                below: 1
            then:
              - service: timer.start
                metadata: {}
                data: {}
                target:
                  entity_id: timer.portail_timer
              - service: input_number.set_value
                metadata: {}
                data:
                  value: 1
                target:
                  entity_id: input_number.portail_sens
              - type: turn_on
                device_id: 4bd1068c9b590c3d3b2093b1ddbfd674
                entity_id: 8bbe9d33a26c8a37367385e18359c016
                domain: switch
              - delay:
                  hours: 0
                  minutes: 0
                  seconds: 1
                  milliseconds: 0
              - type: turn_off
                device_id: 4bd1068c9b590c3d3b2093b1ddbfd674
                entity_id: 8bbe9d33a26c8a37367385e18359c016
                domain: switch
            else:
              - service: timer.start
                metadata: {}
                data: {}
                target:
                  entity_id: timer.portail_timer
              - service: input_number.set_value
                metadata: {}
                data:
                  value: 0
                target:
                  entity_id: input_number.portail_sens
              - type: turn_on
                device_id: 4bd1068c9b590c3d3b2093b1ddbfd674
                entity_id: 8bbe9d33a26c8a37367385e18359c016
                domain: switch
              - delay:
                  hours: 0
                  minutes: 0
                  seconds: 1
                  milliseconds: 0
              - type: turn_off
                device_id: 4bd1068c9b590c3d3b2093b1ddbfd674
                entity_id: 8bbe9d33a26c8a37367385e18359c016
                domain: switch
mode: single

A des moments, le portail s’arrête en cours d’ouverture ou de fermeture, à d’autres moments, il se ferme complètement puis se rouvre…

Je dois avoir un problème avec les automatisations mais je ne vois pas lequel.

Pour les automatisations Portail - Position portail ouvert et Portail - Position portail fermé, j’ai ajouté en trigger le passage du timer de active à idle car les triggers liés au passage de on à off pour les capteurs d’ouverture ne semblaient pas fonctionner à chaque coup…

Si quelqu’un à une idée de ce qui mer… ça m’aiderait bien. Merci d’avance.

Bonjour cleya

Je comprend pas bien, ce que tu veux faire avec tes input_number.

Si tu as des capteurs pour portes fermées et ouvertes, pourquoi utiliser des input_number.

(Humour) Tu touche des royalties par Nabucasa à la ligne de code ? :joy:

1 « J'aime »

Tu as la réponse si dessous :

        portail_carte:
          card:
            type: custom:button-card
            name: 'Portail :'
            label: |
              [[[
                if (states['input_number.portail_position'].state == '0.0')
                  return "fermé";
                else if (states['input_number.portail_position'].state == '1.0')
                  return "ouvert";
                else if (states['input_number.portail_position'].state == '2.0' && states['input_number.portail_sens'].state == '0.0')
                  return "ouverture en cours";
                else if (states['input_number.portail_position'].state == '2.0' && states['input_number.portail_sens'].state == '1.0')
                  return "fermeture en cours";
                else if (states['input_number.portail_position'].state == '3.0')
                  return "partiellement ouvert";
              ]]]
            show_label: true
            layout: name_label
            styles:
              grid:
                - grid-template-areas: '"n" "l"'
                - grid-template-rows: min-content min-content
                - grid-template-columns: min-content
              name:
                - font-size: 1.0em
                - font-weight: bold
                - padding-left: 140px
                - padding-top: 15px
                - color: rgba(0,0,0,0.6)
              label:
                - font-size: 1.1em
                - font-weight: bold
                - padding-left: 140px
                - padding-top: 5px
                - align-self: start
                - text-align: start
                - color: |
                    [[[
                      if (states['input_number.portail_position'].state == '0.0')
                        return 'rgba(64,192,64,1.0)';
                      else if (states['input_number.portail_position'].state == '1.0')
                        return 'rgba(255,0,0,1.0)';
                      else if (states['input_number.portail_position'].state == '2.0')
                        return 'rgba(255,140,0,1.0)';
                      else if (states['input_number.portail_position'].state == '3.0')
                        return 'rgba(255,140,0,1.0)';
                    ]]]
                - animation: |
                    [[[
                      if (states['input_number.portail_position'].state == '1.0')
                        return 'blink 2s ease infinite';
                      else if (states['input_number.portail_position'].state == '2.0')
                        return 'blink 2s ease infinite';
                      else if (states['input_number.portail_position'].state == '3.0')
                        return 'blink 2s ease infinite';
                    ]]]
              card:
                - background-image: >-
                    linear-gradient(135deg, rgba(64,64,64,1.0) 0%,
                    rgba(96,96,96,1.0) 25%, rgba(128,128,128,1.0) 100%)
                - border-radius: 10px
                - box-shadow: 4px 4px 8px 0px rgba(32,32,32,0.5)
                - border: 2px rgba(32,32,32,0.5) outset
                - width: 320px
                - height: 180px
            tap_action:
              action: none
            hold_action:
              action: none
        portail_fond:
          card:
            type: custom:button-card
            styles:
              card:
                - background-color: |
                    [[[
                      if (states['input_number.portail_position'].state == '0.0')
                        return 'rgba(64,192,64,1.0)';
                      else if (states['input_number.portail_position'].state == '1.0')
                        return 'rgba(255,0,0,0.5)';
                      else if (states['input_number.portail_position'].state == '2.0')
                        return 'rgba(255,140,0,0.5)';
                      else if (states['input_number.portail_position'].state == '3.0')
                        return 'rgba(255,140,0,0.5)';
                    ]]]
                - box-shadow: |
                    [[[
                      if (states['input_number.portail_position'].state == '0.0')
                        return '0px 0px 5px 5px rgba(64,192,64,1.0)';
                      else if (states['input_number.portail_position'].state == '1.0')
                        return '0px 0px 5px 5px rgba(255,0,0,0.5)';
                      else if (states['input_number.portail_position'].state == '2.0')
                        return '0px 0px 5px 5px rgba(255,140,0,0.5)';
                      else if (states['input_number.portail_position'].state == '3.0')
                        return '0px 0px 5px 5px rgba(255,140,0,0.5)';
                    ]]]
                - animation: |
                    [[[
                      if (states['input_number.portail_position'].state == '1.0')
                        return 'blink 2s ease infinite';
                      else if (states['input_number.portail_position'].state == '2.0')
                        return 'blink 2s ease infinite';
                      else if (states['input_number.portail_position'].state == '3.0')
                        return 'blink 2s ease infinite';
                    ]]]
                - border: none
                - width: 66px
                - height: 66px
                - border-radius: 50%
        portail_icone:
          card:
            type: custom:button-card
            entity_picture: |
              [[[
                if (states['input_number.portail_position'].state == '0.0')
                  return '/local/images/icones/portail_ferme.png';
                else if (states['input_number.portail_position'].state == '1.0')
                  return '/local/images/icones/portail_ouvert.png';
                else if (states['input_number.portail_position'].state == '2.0')
                  return '/local/images/icones/portail_mouvement.png';
                else if (states['input_number.portail_position'].state == '3.0')
                  return '/local/images/icones/portail_mouvement.png';
              ]]]
            show_entity_picture: true
            styles:
              card:
                - background-color: rgba(64,192,64,0.0)
                - border: none
                - width: 66px
                - height: 66px
                - border-radius: 50%
              entity_picture:
                - width: 90%
                - opacity: 100%
        portail_ouvrir:
          card:
            type: custom:button-card
            show_name: false
            styles:
              card:
                - background-color: rgba(255,255,255,0.0)
                - background-image: url(/local/images/icones/portail_ouvrir.png)
                - background-size: cover
                - box-shadow: 2px 2px 4px 0px rgba(32,32,32,0.5)
                - border: 2px rgba(211,211,211,1.0) outset
                - border-radius: 50%
                - height: 72px
                - width: 72px
            tap_action:
              action: call-service
              service: script.allee_du_garage_actionner_portail
        portail_fermer:
          card:
            type: custom:button-card
            show_name: false
            styles:
              card:
                - background-color: rgba(255,255,255,0.0)
                - background-image: url(/local/images/icones/portail_fermer.png)
                - background-size: cover
                - box-shadow: 2px 2px 4px 0px rgba(32,32,32,0.5)
                - border: 2px rgba(211,211,211,1.0) outset
                - border-radius: 50%
                - height: 72px
                - width: 72px
            tap_action:
              action: call-service
              service: script.allee_du_garage_actionner_portail

Si j’utilise simplement les ‹ on › ou ‹ off › des capteurs d’ouverture, je ne peux pas déterminer le sens de déplacement du portail et il me faut des 'if" et ‹ else if › très, très, très longs…

Salut,

J’ai pas avancé beaucoup mais je suis entrain de refaire un truc chez moi avec une entité cover (et donc 3 positions ouvert/fermé/partiel).
ça réglera la problème du sens qui sera déduit (comme sur des volets normaux)

Actuellement j’ai un template sensor qui marche pas trop mal

- name: portail_global
  state: >
    {%- if states("binary_sensor.dragonportail_relay2_status") == states("binary_sensor.dragonportail_relay1_status") and states("binary_sensor.dragonportail_relay1_status") == 'on'-%}
      ouvert
    {%- elif states("binary_sensor.dragonportail_relay2_status") == states("binary_sensor.dragonportail_relay1_status") and states("binary_sensor.dragonportail_relay1_status") == 'off'-%}
      fermé
    {%- elif states("binary_sensor.dragonportail_relay1_status") == "on"-%}
      portillon
    {%- elif  states("binary_sensor.dragonportail_relay2_status") == "unknown" or states("binary_sensor.dragonportail_relay1_status") == "unknown"-%}
      desynchro
    {%- else -%}
      ouvert
    {%- endif %}

Bonjour @Pulpy-Luke

Si je comprends bien, tu as un portail avec deux relais contact sec (un pour l’ouverture et un pour la fermeture ?) dont les états sont ‹ on › ou ‹ off › et un template sensor (je ne maitrise pas du tout les ‹ template ›) que tu as modifié en ‹ cover › ?

Chez moi, le relai envoie une (presque) impulsion qui active le mécanisme du portail : première impulsion : ouverture ou fermeture du portail. Deuxième impulsion : arrêt du mouvement (si le portail n’est pas en butée : complètement ouvert ou complètement fermé). Troisième impulsion (si le portail est arrêté position intermédiaire) : le mouvement reprends en sens inverse (fermeture si il était en ouverture et inversement). L’autre problématique est que le relai peut-être actionné par des télécommandes RF433 enplus du zigbee…

Je n’ai pas précisé mais c’est pas exactement ça:
J’ai 2 relais (contact sec) qui déclenchent tous les 2 une ouverture:

  • complete
  • partiel

Et quand le portail est déjà ouvert il faut en théorie envoyer l’impulsion sur le bon relais (en fonction de l’état)

  • ouvert partiel + impulsion partiel = fermeture
  • ouvert total + impulsion totale = fermeture
  • ouvert partiel + impulsion totale = ouverture totale !!!

Et évidement, j’ai des télécommandes et des inter en plus de l’esp …
C’est bordelique à gérer sans un véritable retour d’état

Bon, on est à peu près sur le même bordel (pas de vrai retour)…
Il faut que je vois si en cas d’utilisation des télécommandes RF, le relai est vu ‹ on › par z2m… Mais il faudrait d’abord que j’arrive à faire ce que je veux avec les commandes zigbee mais là j’ai un souci entre les automatisations et le script…

Le script doit pouvoir être simplifié. J’ai aussi un souci sur la détermination de l’état de l’input_number. En mode graphique, on ne peut sélectionner que ‹ inférieur à › et/ou ‹ superieur à › et pas la valeur réelle. Rien que ça c’est pénible…

Je suppose que ‹ contenu du modèle › doit permettre de saisir la valeur mais j’ai pas compris le fonctionnement…

Salut

Quand tu crée ton trigger ou ta condition, si tu prends l’état de l’entité au lieu de l’état numérique ça doit résoudre ce problème non ?

En prenant l’état et pas l’état numérique, j’ai le choix entre « Indisponible » ou « Inconnu ».
Je vais tester en saisissant manuellement la valeur numérique et pas un des choix.

alias: Allée du garage - Actionner portail
sequence:
  - choose:
      - conditions:
          - condition: state
            entity_id: input_number.portail_position
            state: "0.0"
        sequence:
          - service: timer.start
            metadata: {}
            data: {}
            target:
              entity_id: timer.portail_timer
          - service: input_number.set_value
            metadata: {}
            data:
              value: 0
            target:
              entity_id: input_number.portail_sens
          - type: turn_on
            device_id: 4bd1068c9b590c3d3b2093b1ddbfd674
            entity_id: 8bbe9d33a26c8a37367385e18359c016
            domain: switch
          - delay:
              hours: 0
              minutes: 0
              seconds: 1
              milliseconds: 0
          - type: turn_off
            device_id: 4bd1068c9b590c3d3b2093b1ddbfd674
            entity_id: 8bbe9d33a26c8a37367385e18359c016
            domain: switch
      - conditions:
          - condition: state
            entity_id: input_number.portail_position
            state: "1.0"
        sequence:
          - service: timer.start
            metadata: {}
            data: {}
            target:
              entity_id: timer.portail_timer
          - service: input_number.set_value
            metadata: {}
            data:
              value: 1
            target:
              entity_id: input_number.portail_sens
          - type: turn_on
            device_id: 4bd1068c9b590c3d3b2093b1ddbfd674
            entity_id: 8bbe9d33a26c8a37367385e18359c016
            domain: switch
          - delay:
              hours: 0
              minutes: 0
              seconds: 1
              milliseconds: 0
          - type: turn_off
            device_id: 4bd1068c9b590c3d3b2093b1ddbfd674
            entity_id: 8bbe9d33a26c8a37367385e18359c016
            domain: switch
      - conditions:
          - condition: state
            entity_id: input_number.portail_position
            state: "2.0"
        sequence:
          - service: timer.pause
            metadata: {}
            data: {}
            target:
              entity_id: timer.portail_timer
          - type: turn_on
            device_id: 4bd1068c9b590c3d3b2093b1ddbfd674
            entity_id: 8bbe9d33a26c8a37367385e18359c016
            domain: switch
          - delay:
              hours: 0
              minutes: 0
              seconds: 1
              milliseconds: 0
          - type: turn_off
            device_id: 4bd1068c9b590c3d3b2093b1ddbfd674
            entity_id: 8bbe9d33a26c8a37367385e18359c016
            domain: switch
      - conditions:
          - condition: state
            entity_id: input_number.portail_position
            state: "3.0"
        sequence:
          - if:
              - condition: numeric_state
                entity_id: input_number.portail_sens
                below: 1
            then:
              - service: timer.start
                metadata: {}
                data: {}
                target:
                  entity_id: timer.portail_timer
              - service: input_number.set_value
                metadata: {}
                data:
                  value: 1
                target:
                  entity_id: input_number.portail_sens
              - type: turn_on
                device_id: 4bd1068c9b590c3d3b2093b1ddbfd674
                entity_id: 8bbe9d33a26c8a37367385e18359c016
                domain: switch
              - delay:
                  hours: 0
                  minutes: 0
                  seconds: 1
                  milliseconds: 0
              - type: turn_off
                device_id: 4bd1068c9b590c3d3b2093b1ddbfd674
                entity_id: 8bbe9d33a26c8a37367385e18359c016
                domain: switch
            else:
              - service: timer.start
                metadata: {}
                data: {}
                target:
                  entity_id: timer.portail_timer
              - service: input_number.set_value
                metadata: {}
                data:
                  value: 0
                target:
                  entity_id: input_number.portail_sens
              - type: turn_on
                device_id: 4bd1068c9b590c3d3b2093b1ddbfd674
                entity_id: 8bbe9d33a26c8a37367385e18359c016
                domain: switch
              - delay:
                  hours: 0
                  minutes: 0
                  seconds: 1
                  milliseconds: 0
              - type: turn_off
                device_id: 4bd1068c9b590c3d3b2093b1ddbfd674
                entity_id: 8bbe9d33a26c8a37367385e18359c016
                domain: switch
mode: single

Résultat du test :

  • le portail était fermé
  • une exécution du script : l’affichage est passé en « portail en mouvement » puis « portail fermé » (il n’est pas passé par « portail ouvert » alors que le portail s’est ouvert en entier puis s’est refermé…

Le graphique de l’input_number :

L’automatisation ‹ Portail - Position portail ouvert › a bien été declenchée à la fin du timer :

Je ne comprends vraiment pas pourquoi le portail s’est ouvert et refermé dans la foulée sauf si le script a été exécuté deux fois (alors qu’il n’y a eu qu’un seul appel).

Oui l’automatisation s’est lancée mais n’a pas aboutie, je suppose à cause de la condition

On voit bien sur l’historique de l’auto que la condition était fausse puisque après a/b on a X et non pas le 123 (definition de l’input number).

Pour le portail qui se referme, quel est son comportement normal hors HA ? reste il ouvert ou se referme t’il au bout d’un moment ?

Non, le portail doit rester ouvert tant qu’une nouvelle activation du relai n’a pas eu lieu.

Bon, j’ai éventuellement une piste pour faire fonctionner correctement mon portail.
Il va falloir que je supprime le timer et que je me base sur le nombre d’impulsions.
Toute impulsion paire donne lieu au mouvement du portail, toute impulsion impaire arrête le mouvement.
Je vais donc mettre un compteur que j’incrémenterai à chaque passage du relai à ‹ on › avec remise du compteur à zéro lorsque le capteur de fermeture passe à ‹ off › ou le capteur d’ouverture du battant droit passe à ‹ off › (le battant gauche étant ouvert complétement en premier). Il faudra aussi que j’enregistre le dernier sens de déplacement (ouverture ou fermeture) car sur impulsion paire, le sens change. Je mettrai ensuite un input_number avec 5 valeurs ou un input_text avec 5 valeurs (closed, open, opening, closing et stopped). J’ai testé le input_text avec ma porte de garage et cela fonctionne parfaitement. Il faut juste que je puisse reconnaitre si la valeur du compteur est paire ou impaire et comment le concrétiser avec un if else if sur ma carte custom:button-card : un nombre (autre que 0) divisé par 2 donne un entier par exemple mais je ne sais pas trop comment l’écrire…
Tu aurais une idée @Pulpy-Luke ?

Salut,

C’est dense :wink:

Si l’objectif c’est de tester si pair ou impair, le modulo c’est parfait pour ça

{% for i in range(5) %}
    {%- if i % 2 == 0 %}
        {{- i }} est pair
    {%- else %}
        {{- i }} est impair
    {%- endif %}
{% endfor %}

Après croyez moi ou pas, mais j’ai pas une seule custom:button-card :joy:

1 « J'aime »

Merci mais là encore, je vois pas comment l’intégrer à mes custom:button-card :joy:

Mais j’ai réflechi entre temps et je n’ai pas besoin de counter. Un input_boolean suffit (0 ou 1). A chaque 1, il faut simplement changer le sens du mouvement (opening ou closing).
Donc sur chaque passage du relai de ‹ off › à ‹ on › je change la valeur du input_boolean : si il est sur ‹ on ›, je le passe à ‹ off › et inversement. Faut que je mette ça en forme et que je teste en condition réelle. Ca me permettra aussi de prendre en compte l’utilisation des télécommandes RF car le passage du relai sur ‹ on › par la télécommande est visible sur z2m.

Zut, c’est encore dense :upside_down_face:

Histoire de ne pas me coucher plus bête que je ne suis déjà, peux tu me dire qu’elle est le modèle de motorisation ?
Je pige pas ces histoires d’impulsion paire ou impaire ( une impulsion impaire reçue 2 fois = impulsion paire :crazy_face::joy:)

Autre question : l’intérêt de connaître le sens de mouvement ?

C’est une motorisation Avidsen pour portail à battants mais j’ai mis dessus un relai zigbee et RF433 (relai 7-32 V car au départ je ne voulais pas alimenter le portail en 220 V et j’avais l’alimentation par batteries 2x12 Volts sur panneau solaire).

Donc une impulsion du relai ouvre le portail si il est fermé ou le ferme si il est ouvert. Une deuxième impulsion arrête le mouvement, une troisième impulsion relance le mouvement dans le sens inverse, etc…

Pour le garage par exemple :

image

image

image

image

image

Si tu as une autre idée @Krull56 je suis preneur :wink:

Ok, fonctionnement « classique » comme le mien, basé sur l’état du portail au moment de l’impulsion.
Tu m’as embrouillé avec paire et impaire :grin:

Je n’ai pour ma part pas trouvé de cas d’usage où l’état du mouvement serait utile. Il est fermé ou ouvert tout simplement … mais je me doute que tu vas m’en trouver un…ou plusieurs :wink:

Un exemple : je l’ouvre partiellement pour sortir la poubelle. Ce n’est plus aussi important maintenant que j’ai tiré un câble pour l’alimenter en 220V mais avant avec le printemps de m… qu’on a une ouverture partielle bouffait moins de jus sur les batteries qu’une ouverture complète.

Je suis embrouillé aussi mais à cette heure là c’est normal chez moi…

Nos idées seront plus claires après l’apéro :grin:

Pour l’ouverture partielle, pourquoi pas une simple tempo entre 2 impulsions ?

1 « J'aime »