Custom:button-card + tap_action : Incrémenter un input_number!

Bonjour à tous,

J’ai un custom:button-card sur lequel je souhaite réaliser l’action suivante incrémenter de 1, la valeur d’un input_number. J’ai donc testé le code suivant :

tap_action:
  action: call-service
  service: input_number.set_value
  service_data:
	entity_id: input_number.pump_forced_duration_preselection
	value: "{{ (states('input_number.pump_forced_duration_preselection') + 1)|int }}"

J’ai le message d’erreur suivant :

code: « invalid_format »
message: « expected float for dictionary value @ data[‹ value ›] »

J’ai tenté de remplacer « |int » par « |float » mais cela ne change pas et j’ai le même message d’erreur. En mettant un chiffre en dur cella fonctionne. Du coup je dois avouer que là, je suis un peu perdu…

Si quelqu’un à une piste à me donner !!!

Merci d’avance.

Dans un premier temps, j’utiliserais le service dédié à l’augmentation et pas celui que tu utilise :

Te renvoit un string qu’il faut convertir en float avant de pouvoir faire des calcul.

Bonjour @Clemalex et @Arnault
Je désire faire la meme chose depuis l’ecran,
deux petits boutons pour incrementer/decrementer, le volume de mon enceinte, et aussi la consigne de température de mon chauffage.
Le service Input_number semble savoir faire ces choses, mais comment les relier à des boutons.
Quelqu’un aurait il un exemple joliement dessiné ?

Merci @Clemalex je vais utiliser le increse.
Dès que mon bouton fonctionne, je le partage ici (dans le we)

Ne pas hésiter à rechercher sur le forum :

Recherche :mag_right:

Merci @Clemalex pour le increment et le decrement ca fonctionne nickel. Par contre j’ai un rafraichissement complet de l’écran qui n’est pas très jolie :

RPReplay_Final1653149560 (1)

Voici mon YAML si ca peut aider :

popup_pool_pump:
  styles:
    card:
      - box-shadow: none
      - padding: 0px
      - border-radius: 0px
      - background-color: transparent
      - height: "100%"
    grid:
      - grid-template-areas: "'header' 'content' 'buttons'"
      - grid-template-rows: "20vh 65vh 15vh"
      - grid-template-columns: "1fr"
    custom_fields:
      content:
        - display: "block"
        - align-self: "start"
  custom_fields:
    header:
      card:
        type: "custom:button-card"
        template: "popup_header"
        name: "Piscine"
        label: "Mode de filtration"
        icon: mdi:pool
    content:
      card:
        type: vertical-stack
        cards:
          - type: markdown
            content: >-
                  Le mode de filtration de la piscine est actuellement réglé sur
                  **{{states('sensor.pool_pump')}}**. Sur quel mode souhaitez vous
                  régler la filtration ?
            card_mod:
              style: |
                ha-card {
                  background-color: rgba(0, 0, 0, 0);
                  box-shadow: none;
                  font-size: 1rem;
                  text-align: center;
                  cursor: default;
                  border-radius: 0px;
                  padding: 0px 30px;
                }
                ha-card ha-markdown.no-header {
                  padding: 10px;
                }
          - type: custom:mod-card
            card:
              type: grid
              square: false
              columns: 2
              cards:
                - type: custom:button-card
                  template: popup_pool_pump_btn_mode
                  name: Automatique
                  label: Saison & Temp.
                  icon: mdi:calendar
                  variables:
                    mode: "Automatique"
                - type: custom:button-card
                  template: popup_pool_pump_btn_mode
                  name: Programmé
                  label: Horaires fixe
                  icon: mdi:av-timer
                  variables:
                    mode: "Programmé"
                - type: custom:button-card
                  template: popup_pool_pump_btn_mode
                  name: Marche
                  label: Forcé
                  icon: mdi:engine
                  variables:
                    mode: "Marche forcée"
                - type: custom:button-card
                  template: popup_pool_pump_btn_mode
                  name: Arrêt
                  label: Forcé
                  icon: mdi:engine-off
                  variables:
                    mode: "Arrêt forcé"
          - type: conditional
            conditions:
              - entity: input_select.pool_pump_preselection
                state: Marche forcée
            card:
              type: markdown
              content: Quelle durée pour la marche forcée ?
              style: |
                ha-card {
                  background-color: rgba(0, 0, 0, 0);
                  box-shadow: none;
                  font-size: 1rem;
                  text-align: center;
                  cursor: default;
                  border-radius: 0px;
                  padding: 0px 30px;
                }
                ha-card ha-markdown.no-header {
                  padding: 10px;
                }
          - type: conditional
            conditions:
              - entity: input_select.pool_pump_preselection
                state: Marche forcée
            card:
              type: custom:button-card
              styles:
                card:
                  - border-radius: 0px
                  - box-shadow: none
                  - background-color: rgba(0, 0, 0, 0)
                  - padding: 0 0 10px 0
                grid:
                  - grid-template-areas: '''c'''
                  - grid-template-columns: 1fr
                  - grid-template-rows: min-content
                custom_fields:
                  c:
                    - place-self: center
              custom_fields:
                c:
                  card:
                    type: custom:button-card
                    styles:
                      card:
                        - padding: 8px
                        - border-radius: 5px
                        - width: auto
                        - place-self: center
                      grid:
                        - grid-template-areas: "'plus' 'days' 'minus"
                        - grid-template-columns: "min-content"
                        - grid-template-rows: "min-content min-content min-content"
                      custom_fields:
                        plus:
                          - padding: 10px 30px
                        minus:
                          - padding: 10px 30px
                        days:
                          - font-size: 0.85em
                          - padding: 5px 0px
                    custom_fields:
                      plus:
                        card:
                          type: custom:button-card
                          styles:
                            card:
                              - width: 20px
                          name: >
                            [[[
                              return `<ha-icon icon="mdi:arrow-up-drop-circle" style="width: 20px; height: 20px;"></ha-icon>`;
                            ]]]
                          tap_action:
                            action: call-service
                            service: input_number.increment
                            service_data:
                              entity_id: input_number.pump_forced_duration_preselection
                      days: >
                        [[[
                          let days = parseInt(states['input_number.pump_forced_duration_preselection'].state);
                          return days + " jour" + (days > 1 ? "s" : "");
                        ]]]
                      minus:
                        card:
                          type: custom:button-card
                          styles:
                            card:
                              - width: 20px
                          name: >
                            [[[
                              return `<ha-icon icon="mdi:arrow-down-drop-circle" style="width: 20px; height: 20px;"></ha-icon>`;
                            ]]]
                          tap_action:
                            action: call-service
                            service: input_number.decrement
                            service_data:
                              entity_id: input_number.pump_forced_duration_preselection
    buttons:
      card:
        type: "custom:button-card"
        template: "popup_btn_close"

popup_pool_pump_btn_mode:
  variables:
    mode: ""
  template: icon_info_bg
  entity: input_select.pool_pump_preselection
  show_lable: true
  show_name: true
  shwo_icon: true
  styles:
    icon:
      - color: "rgba(var(--color-theme),0.9)"
    name:
      - align-self: "end"
      - justify-self: "start"
      - font-weight: "bold"
      - font-size: "14px"
      - margin-left: "12px"
      - filter: "opacity(100%)"
    label:
      - justify-self: "start"
      - align-self: "start"
      - font-weight: "bolder"
      - font-size: "12px"
      - filter: "opacity(40%)"
      - margin-left: "12px"
    grid:
      - grid-template-areas: "'i n' 'i l'"
      - grid-template-columns: "min-content auto"
      - grid-template-rows: "min-content min-content"
  state:
    - value: "[[[ return variables.mode; ]]]"
      styles:
        img_cell:
          - background-color: var(--accent-color)
  tap_action:
    action: call-service
    service: input_select.select_option
    service_data:
      option: "[[[ return variables.mode; ]]]"
      entity_id: input_select.pool_pump_preselection

Merci

Merci @Arnault de ce partage, et merci au forum en général pour les bonnes astuces

1 « J'aime »

En remplaçant mes cartes markdown par des custom:button-card je n’ai plus le rafraichissement des cartes du coup c’est parfait :slight_smile:

Bonjour @Clemalex

J’upgrade mon idée en essayant de me faire un bouton qui va me permettre a partir d’un input_datetime de modifier cette valeur. J’ai créé un template pour mon bouton au quel je passe mon entité et j’arrive à afficher le bouton comme je le souhaite.
Capture d’écran sur l’heure de mise en marche et d’arrêt de la filtration :
image

Sur le tap_action de mon bouton pour incrémenter les minutes j’étais parti sur un template :

{% set hour = states('input_datetime.pool_pump_programmed_mode_start').split(':')[0]|int %}
{% set minutes = states('input_datetime.pool_pump_programmed_mode_start').split(':')[1]|int + 5 %}
{% if minutes > 55 -%}{% set minutes = 55 %}{%- endif %}
{% if hour < 10 -%}0{%- endif %}{{ hour }}:{% if minutes < 10 -%}0{%- endif %}{{ minutes }}:00

Seulement après recherche, le cutom:button-card supporte le Javascript : GitHub - custom-cards/button-card: ❇️ Lovelace button-card for home assistant

Je suis donc parti sur un appel tout simple qui ne change pas la valeur de l’entity mais pour faire mes tests :

tap_action:
  action: call-service
  service: input_datetime.set_datetime
  service_data:
    entity_id: "[[[ return variables.entity; ]]]"
    time: |
      [[[
        console.log(states[variables.entity].state);
        return states[variables.entity].state;
      ]]]

Là en regardant ma console, je vois que le template JS est appelé au chargement de la page mais pas à chaque appuie sur le bouton.

Du coup après mon long message, ma question, est-il possible d’executer un code JS à chaque appuie sur le bouton ?

Sans ca je ne vois pas comment gérer l’incrémentation ou la décrémentation de l’heure ou des minutes (par pas de 5) de mon input_datetime…

Merci

Je suis en long week-end… Pas internet…

Regarde de ce côté si tu veux jouer avec les heures et styliser une carte :

https://forum.hacf.fr/t/interface-pour-entrer-dates-et-heures/3825/6?u=clemalex

Je partirais sur la carte dans le lien plutôt que de tout fabriquer…