Bouton switch de couleur en fonction d'un état

@Herbs , j’ai essayé avec ton code en l’adaptant comme ceci :

input boolean
#
# Input définissant l'état de la demande du bouton Home
#
automower_home_demand:
  name: Bouton Home cliqué
script
#
# Script de gestion du bouton Home de la tondeuse
#
automower_home_mode:
  # alias: ce_que_tu_veux
  sequence:
  - service: input_boolean.turn_on
    target:
      entity_id: input_boolean.automower_home_demand
  - service: mqtt.publish
    data:
      payload: 0F012C0000
      topic: Automower/AM_G2/Cmd/Rawcmd
  - wait_template: "{{ is_state('sensor.automower_mode', 'home') }}"
  - service: input_boolean.turn_off
    target:
      entity_id: input_boolean.automower_home_demand
card
type: custom:button-card
entity: sensor.automower_mode
name: Robot
icon: mdi:robot-mower
styles:
  card:
    - background-color: |
        [[[
          if (entity.state == 'home') return 'green';
          else return 'red';
        ]]]
    - animation: |
        [[[
          if states['input_boolean.automower_home_demand'].state == 'off')
            return 'none';
          else return 'blink 2s ease infinite';
        ]]]
tap_action:
  action: call-service
  service: script.toggle
  service_data:
    entity_id: automower_home_mode

Mais j’ai cette erreur :

ButtonCardJSTemplateError: SyntaxError: Unexpected identifier in 'if states['input_boolean.automower_home_demand'].state == 'off') return 'none'; else return ...'
tap_action:
  action: call-service
  service: script.toggle
  service_data:
    entity_id: automower_home_mode
type: custom:button-card
group_expand: false
hold_action:
  action: none
double_tap_action:
  action: none
layout: vertical
size: 40%
color_type: icon
show_name: true
show_state: false
show_icon: true
show_units: true
show_label: false
show_entity_picture: false
show_live_stream: false
card_size: 3
entity: sensor.automower_mode
name: Robot
icon: mdi:robot-mower
styles:
  card:
    - background-color: |
        [[[
          if (entity.state == 'home') return 'green';
          else return 'red';
        ]]]
    - animation: |
        [[[
          if states['input_boolean.automower_home_demand'].state == 'off')
            return 'none';
          else return 'blink 2s ease infinite';
        ]]]
default_color: var(--primary-text-color)
color_off: var(--paper-item-icon-color)
color_on: var(--paper-item-icon-active-color)
lock:
  enabled: false
  duration: 5
  unlock: tap

Pourtant, l’input est bien visible dans la console de dev :

Une idée ?

Ouais dernière ligne, boulette de ma part.

J’ai amputé l’entity_id du script.automower_home_mode

Avec ça, ça devrait aller mieux.

[EDIT] je viens d’en voir une deuxième :stuck_out_tongue: il manque une ( devant le states du if.

Tests avec ça :

Désolé pour ce retard mais la semaine a été dur… Et je n’ai pu mis remettre que ce WE.
Super, j’ai pu avoir quelque chose de fonctionnel avec ce code :

Le code de la carte
  - type: horizontal-stack
    cards:
      - type: custom:button-card
        icon: mdi:home
        name: Home
        entity: sensor.automower_mode
        styles:
          card:
            - background-color: |
                [[[
                  if (entity.state == 'home') return 'green';
                  else return 'none';
                ]]]
            - animation: |
                [[[
                  if (states['input_boolean.automower_home_demand'].state == 'off')
                    return 'none';
                  else return 'blink 2s ease infinite';
                ]]]
        tap_action:
          action: call-service
          service: script.toggle
          service_data:
            entity_id: script.automower_home_mode
      - type: custom:button-card
        icon: mdi:gesture-tap
        name: Manuel
        entity: sensor.automower_mode
        tap_action:
          action: call-service
          service: mqtt.publish
          service_data:
            payload: 0F012C0000
            topic: Automower/AM_G2/Cmd/Rawcmd
        state:
          - value: manu
            color: green
      - type: custom:button-card
        icon: mdi:refresh-auto
        name: Auto
        entity: sensor.automower_mode
        styles:
          card:
            - background-color: |
                [[[
                  if (entity.state == 'auto') return 'green';
                  else return 'none';
                ]]]
            - animation: |
                [[[
                  if (states['input_boolean.automower_auto_demand'].state == 'off')
                    return 'none';
                  else return 'blink 2s ease infinite';
                ]]]
        tap_action:
          action: call-service
          service: script.toggle
          service_data:
            entity_id: script.automower_auto_mode

Le code d’un script pour l’exemple, les 2 autres fonctionnent sur le même principe en changeant juste l’input_boolean, la valeur di is_state() et le payload envoyer évidemment.

Le code du script automower_home_mode.yaml
#
# Script de gestion du bouton Home de la tondeuse
#
automower_home_mode:
  # alias: ce_que_tu_veux
  sequence:
  - service: input_boolean.turn_on
    target:
      entity_id: input_boolean.automower_home_demand
  - service: mqtt.publish
    data:
      payload: 0F812C0003
      topic: Automower/AM_G2/Cmd/Rawcmd
  - wait_template: "{{ is_state('sensor.automower_mode', 'home') }}"
  - service: input_boolean.turn_off
    target:
      entity_id: input_boolean.automower_home_demand

Mon problème restant est que si l’état de sensor.automower_mode est à « auto », le bouton est vert fixe et lorsque j’appuie sur le bouton « Home » par exemple pour envoyer l’ordre de retourner à sa base, le bouton clignote bien « Home » clignote jusqu’à être fixe lorsque le sensor.automower_mode est à « home » mais le bouton « Auto » reste vert fixe alors qu’il devrait repassé à « none » fixe.

Dans la capture suivante, je suis passé de « Auto » à « Manu » à « Home » et on voit bien que les bouton ne repasse pas sans fond vert, ce qui devrait être le cas si l’état de sensor.automower_mode n’est pas la valeur du bouton.

Salut @Sylvain_G

Regardes si en jouant avec « triggers_update » ça peut régler ton problème.

Sans la même install c’est compliqué de tester mais je pense qu’il y’a moyen d’y arriver avec ça :wink:

Salut

je vois pas où dans ton code tu changes l’état de ton sensor.automower_mode .

A+ Fred

Le sensor.automower_mode est mis à jour via un topic MQTT, voici le code qui le met à jour en fonction du retour du topic :

name: "automower mode"
state_topic: "Automower/AM_G2/State/Mode"
value_template: |-
      {% set mapper = {
          '0'      : 'manu',
          '1'      : 'auto',
          '3'      : 'home'
        }
      %}
      {% set state = value %}
      {{ mapper[state] if state in mapper else 'Unknown' }}

D’après la documentation :

Je n’ai normalement pas besoin d’ajouter de triggers_update puisque que l’update doit se déclencher par l’entity principale sensor.automower_mode

J’ai quand même ajouter sur chaque boutons triggers_update: all comme ceci pour vérifier :

Code modifié
  - type: horizontal-stack
    cards:
      - type: custom:button-card
        icon: mdi:home
        name: Home
        entity: sensor.automower_mode
        triggers_update: all
        styles:
          card:
            - background-color: |
                [[[
                  if (entity.state == 'home') return 'green';
                  else return 'none';
                ]]]
            - animation: |
                [[[
                  if (states['input_boolean.automower_home_demand'].state == 'off')
                    return 'none';
                  else return 'blink 2s ease infinite';
                ]]]
        tap_action:
          action: call-service
          service: script.toggle
          service_data:
            entity_id: script.automower_home_mode
      - type: custom:button-card
        icon: mdi:gesture-tap
        name: Manuel
        entity: sensor.automower_mode
        triggers_update: all
        styles:
          card:
            - background-color: |
                [[[
                  if (entity.state == 'manu') return 'green';
                  else return 'none';
                ]]]
            - animation: |
                [[[
                  if (states['input_boolean.automower_manu_demand'].state == 'off')
                    return 'none';
                  else return 'blink 2s ease infinite';
                ]]]
        tap_action:
          action: call-service
          service: script.toggle
          service_data:
            entity_id: script.automower_manu_mode
      - type: custom:button-card
        icon: mdi:refresh-auto
        name: Auto
        entity: sensor.automower_mode
        triggers_update: all
        styles:
          card:
            - background-color: |
                [[[
                  if (entity.state == 'auto') return 'green';
                  else return 'none';
                ]]]
            - animation: |
                [[[
                  if (states['input_boolean.automower_auto_demand'].state == 'off')
                    return 'none';
                  else return 'blink 2s ease infinite';
                ]]]
        tap_action:
          action: call-service
          service: script.toggle
          service_data:
            entity_id: script.automower_auto_mode

Mon test pour valider :

  • Le bouton « Home » est vert fixe car le sensor.automower_mode est égal à home (normal).
  • Le bouton « Auto » est sans fond fixe puisque le sensor.automower_mode n’est pas égal à auto (normal).
  • J’ai cliqué sur le bouton « Auto » qui s’est mis à clignoté jusqu’au moment au sensor.automower_mode est passé de home à auto (normal). Le bouton « Auto » est alors passé de clignotant sans fond à fixe avec le fond vert (exactement ce que je recherche).
  • Le bouton « Home » est resté vert fixe alors que lorsque le sensor.automower_mode n’est plus égale à home (pas normal), il devrait passer à sans fond vert… :thinking:

J’en déduis que l’ajout de triggers_update: all ne change rien ou j’ai mal utilisé cette option.

Edit :

Après un certain temps (plus d’une minute), et un rechargement de la page, le bouton « Auto » repasse sans fond vert.
La mise à jour des boutons n’est pas dynamique ?

Normalement oui, en jouant aves les outils de dev le rendu sur mon bouton :

robot

Là clairement je sais plus trop quoi te proposer sans que ce soit un peu au « pif ».

Au cas où je mettrai une seconde couleur de fond au lieu de « none » et sur la partie « trigger_update » au pire je mettrai que « sensor.automower_mode » (pour voir).

Après ça à moins de revoir toute la « mécanique » je suis sec …

[EDIT] le délais pour le changement d’état suite au mqtt.publish est de combien de temps ?

Si ton bouton repasse sans fond vert, c’est que ton état n’est plus le même.
es tu vraiment certain que ton sensor.automower_mode est bien dans le bon état.
Et pourquoi tu as un sensor.automower_mode puisque c’est déjà dans une valeur MQTT. Tu pourrais utiliser directement cette valeur MQTT plutôt que copier cette valeur dans un sensor puis tester. J’ai du mal à saisir l’intérêt de cette manip

Oui, j’ai en parallèle l’affichage de ce sensor.autower_mode pour valider justement sa valeur. Dans la capture suivante, « Mode Caroline » correspond à sensor.autower_mode
image

En fait, la valeur lu dans MQTT n’est pas celle testée et affichée, j’i un mapping de fait pour « convertir » la valeur numérique en texte compréhensible par l’utilisateur.

Je vais essayer ça demain pour voir, je vous tiens au courant…

Bin justement, c’est pas tres logique. La valeur d’affichage n’a rien a voir avec celle de test. Si un jour tu veux changer ton affichage, ton test ne fonctionne plus.
D’un côté on teste et de l’autre on affiche. De plus dans mqtt tu as une valeur int qui ne peut pas du tout prêter a confusion, alors que de l’autre tu as un char qui est sujet à la casse, orthographe… par exemple Auto n’est pas auto et n’est pas AUTO non plus.

Je comprends parfaitement ce que tu as voulu faire, mais pour moi ce n’est pas logique :yum:

1 « J'aime »