Boutons incrément décrément d'une variable

Suite du sujet Input_number et tactile :

J’ai actuellement le moyen de monter ou descendre une valeur de consigne à l’aide de boutons + et -
Pour cela j’utilise deux boutons associés à des input_boolean indépendants.
Chacun pilote une automation qui incrémente ou décrémente le même input_number

C’est écrit comme ceci dans mon fichier automation.yaml

- id: 'augmentation consigne'
  alias: Augmentation consigne
  description: 'incrémentation de la consigne'
  
  trigger:
    - platform: state
      entity_id: input_boolean.bouton_plus
      to: 'on'
      
  condition: []      
      
  action: 
    - service: input_number.set_value
      data:
        entity_id: input_number.consigne
        value: "{{ ( states('input_number.consigne' ) | float +  0.2 ) | round (1)  }}"
                
    - delay:
        milliseconds: 200
     
    - data:
        entity_id: input_boolean.bouton_plus
      service: input_boolean.turn_off

   
  
- id: 'diminution consigne'
  alias: Diminution consigne
  description: 'décrémentation de la consigne'
  
  trigger:
    - platform: state
      entity_id: input_boolean.bouton_moins
      to: 'on'
      
  condition: []      
      
  action: 
    - service: input_number.set_value
      data:
        entity_id: input_number.consigne
        value: "{{ ( states('input_number.consigne' ) | float -  0.2 ) | round (1)  }}"
             
    - delay:
        milliseconds: 200
     
    - data:
        entity_id: input_boolean.bouton_moins
      service: input_boolean.turn_off

Il y a sans doute mieux comme procédé. Comment ?

Tu as besoin de support ou la méthode ne t’intéresse pas ?

:slightly_smiling_face:

1 « J'aime »

Ah si !
Je suis curieux de voir.
A l’époque (récente) où j’ai écris ces automations, je ne connaissais rien des scripts (j’en ai maintenant un :speak_no_evil: ).
Le voir écrit en script serait déjà un premier pas. Si je devais le faire, j’ai le sentiment qu’il ressemblerait à mes automations (donc pas mieux).
Mais passer par des variables… je ne vois pas.

Mais si ! Le fait de passer par 2 scripts permet de supprimer les 2 booléens.

Tu n’auras plus qu’à gérer les scripts pour augmenter et diminuer.

Effectivement si on part d’une automatisation, les scripts reprennent les actions. Sauf que là toi tu n’as plus à gérer l’action de remise à zéro du bouléeb et non plus le délai

Alors voici où j’en suis :

Les boutons :

              - type: 'custom:button-card'         
                entity: script.increment_consigne
                icon_height: 23px           
                tap_action:
                  action: call-service
                  service: script.increment_consigne

                state:    
                  - operator: default
                    color: rgb(220, 70, 33)
                    icon: mdi:plus-circle-outline
                show_label: false
                show_name: false
                theme: noctis
                styles:
                  card:
                    - width: 60px
                    - height: 30px
                    - background-color: rgb(31, 61, 160)
                    - border-radius: 5px
                    - --mdc-ripple-color: white
                    - --mdc-ripple-press-opacity: 0.2
              

              - type: 'custom:button-card'         
                entity: script.decrement_consigne
                icon_height: 23px           
                tap_action:
                  action: call-service
                  service: script.decrement_consigne

                state:    
                  - operator: default
                    color: rgb(60, 154, 163)
                    icon: mdi:minus-circle-outline
                show_label: false
                show_name: false
                theme: noctis
                styles:
                  card:
                    - width: 60px
                    - height: 30px
                    - background-color: rgb(31, 61, 160)
                    - border-radius: 5px
                    - --mdc-ripple-color: white
                    - --mdc-ripple-press-opacity: 0.2

Pour les scripts :



increment_consigne:
   sequence:
     - service: input_number.set_value
       data:
         entity_id: input_number.consigne
         value: "{{ ( states('input_number.consigne') | float + 0.2 ) | round (2) }}"
         
         
decrement_consigne:
   sequence:
     - service: input_number.set_value
       data:
         entity_id: input_number.consigne
         value: "{{ ( states('input_number.consigne') | float - 0.2 ) | round (2) }}"

Puis-je mieux faire ?

1 « J'aime »

C’est déjà très bien.

La prochaine étape est de ‹ variabiliser › le fait d’augmenter ou de diminuer et/ou de combien…

:+1:

J’ai beau lire et tenter de comprendre, je ne vois pas là où il faut que j’aille.
Peux-tu m’en dire plus ?

Franck

1 « J'aime »

Je peux même te montrer :wink:

Home assistant permet de créer des variables dans les scripts.
Ces variables peuvent être passées en paramètre lors des automatisations ou des appels du service script directement.

Comme je te propose depuis le début de minimiser ton code (qui au début comptait 2 input_boolean et 2 automatisations avec delais et maintenant seulement 2 scripts :+1: ), je te proposais donc de passer par des variables pour pouvoir réutiliser ces scripts pour d’autre entités.

Imagine que demain, tu as deux autres entités qui demande le même calcul (+0.2), alors tu devras dupliquer 2 fois tes 2 scripts, donc au final pour 3 entités tu auras 6 scripts, etc.

Donc on va variabiliser l’opération (+/-), la valeur (X.X) et l’entité cible (entity_id).
En faisant ainsi, pour les 3 entités tu auras 1 seul et unique script.
Le fait d’augmenter/diminuer, la valeur et l’entité seront passés en paramètres.

Voici pour ton cas la réalisation de ce que j’explique :

  increment_decrement:
    description: "Augmente/diminue l'entité passée en paramètre"
    fields:  # A partir de là, on 'variabilise' 
      entity_id:
        description: "Indique l'entité à faire évoluer"
        example: "input_number.hacf"
      operation:
        description: "Indique le type d'operation (+/-)"
        example: "+"
      value:
        description: "Indique le nombre à ajouter/diminuer"
        example: "1.5"
    sequence:
      - choose:  #ici on utilise une fonction de sélection pour le type d'opération
          - alias: "Si <operation> est une addition"
            conditions:
              - condition: template
                value_template: "{{ operation == '+' }}"
            sequence:
             - service: input_number.set_value
               data:
                 entity_id: "{{entity_id}}" #l'entité cible est ici
                 value: "{{ ( states(entity_id) | float + value ) | round (2) }}"  # l'addition est ici
          - alias: "Si <operation> est une soustraction"
            conditions:
              - condition: template
                value_template: "{{ operation == '-' }}"
            sequence:
             - service: input_number.set_value
               data:
                 entity_id: "{{entity_id}}"  #l'entité cible est ici
                 value: "{{ ( states(entity_id) | float - value ) | round (2) }}"  # la soustraction est ici

Et l’appel du script dans un bouton (button) par exemple :

type: horizontal-stack
cards:
  - type: button
    tap_action:
      action: call-service
      service: script.increment_decrement_consigne
      service_data:
        entity_id: input_number.hacf
        operation: +
        value: 3
    entity: input_number.hacf
    icon: 'mdi:trending-up'
    name: Augmenter
  - type: button
    tap_action:
      action: call-service
      service: script.increment_decrement_consigne
      service_data:
        entity_id: input_number.hacf
        operation: '-'
        value: 1.5
    entity: input_number.hacf
    icon: 'mdi:trending-down'
    name: Diminuer

animate

Si ça coince, n’hésite pas :+1:

1 « J'aime »

Ah… balaise quand même !
(Enfin pour moi)

J’imaginais bien une procédure de ce type. Et tu as raison, j’ai déjà quatre input.number à traiter de la sorte. Mais la mise en œuvre m’aurait été impossible au regard de la complexité de ce que tu as écrit.
Il va me falloir plusieurs jours pour l’appliquer et le mettre en œuvre…mais j’y arriverai :wink:

Merci beaucoup :heartbeat:

Tu a juste à copier mon script… Et comprendre comment ça se décompose.

Et n’hésite pas si tu as besoin d’aide…

Il n’y a pas de question idiote, seulement une réponse idiote
Albert Einstein

2 « J'aime »