Équivalent du input type="radio" dans une carte?

Bonjour à tous,

Je cherche à créer un équivalent des input type=« radio » en HTML dans une de mes carte.
Ce qui m’intéresse est le fonctionnement : la sélection d’un item désélectionne les autres.

Je ne peux pas me permettre d’utiliser de input_select, car j’en ai besoin d’un nombre indéterminé (grâce aux decluttering templates), à moins qu’il ne soit possible de cloner un tel input à la volée ?

Et je ne peux pas non plus le gérer manuellement via un template, parce que je n’ai pas de retour sur la valeur que je vais définir par ce biais (j’envoie une info, aucun retour de si elle est reçue ou de l’état actuel).

Et l’idéal serait que ce soit stylable comme une custom:button-card.

Bref, je cherche une arlésienne, si des fois vous aviez des idées SVP ?

Merci d’avance

Bonjour,

input_select, c’est une liste déroulante avec une seule sélection possible, comme le radio bouton.

Merci beaucoup.

Mais comme dit dans mon message initial, ça ne me convient pas, parce que c’est pour intégrer dans un decluttering template et du coup, il faudrait que j’en génère un pour chaque instance de mon template, ce qui n’est pas jouable (à moins de pouvoir le cloner au moment de l’instanciation de la carte)

Salut,

Regarde ça, ça doit pas être loin de ton objectif
https://forum.hacf.fr/t/integration-legrand-cable-outlet-064882-a-zigbee2mqtt/8952/40
J’ai la version decluttering qui traine aussi à la maison

Un custom:button-card avec des custom_fields (radio button) liés à un input_number. Le clic sur un radio-button personnalisé change la valeur de l’input_number et tu gères les actions en fonction de cette valeur…

Hello,

Dans l’idée, c’est parfaitement ce que je cherche d’un point de vue fonctionnel, mais je ne comprend pas comment je peux l’appliquer à mon cas, puisque :

  • besoin d’un nombre de select indéterminés du fait du declustering, donc pas instanciable à la volée
  • pas de templates possibles chez moi puisque je n’ai pas de retours sur l’état réel du device

J’ai peut-être manqué un point, auquel cas n’hésite pas :wink:

C’est pour ça que je recherche un « composant » qui pourrait se rappeler lui-même de son état courant (vraiment genre input type radio), quitte à ce que ça saute au reboot

Merci de la tentative :wink:

Mais c’est le même problème qu’avec mes input_select.
Comme je n’ai aucune idée de combien d’instances de mon template je vais avoir, je ne souhaite pas avoir à créer un input différent pour chaque instance…

Je cherche une solution la plus générique possible

Un seul input_number : valeur = 1 : une instance, valeur = 2 : 2 instances, valeur = x : x instances

Le principe du radio button, c’est de pouvoir choisir un élément parmi une liste définie. En programmation classique, tu peux générer dynamiquement ton nombre de radio button et les étiquettes associées mais ça risque d’être compliqué en YAML :grin:

Salut

tu as une exemple concret ? Parce que si tu n’es pas en mesure de déterminer d’une façon ou d’une autre les choix, ça va être difficile

Le projet, ça serait de rajouter une carte sous mes cartes de clim pour sélectionner le type de balayage.
J’ai donc la liste des valeurs suivantes :

[
    "Default",
    "FullSwing",
    "FixedUpper",
    "FixedUpperMiddle",
    "FixedMiddle",
    "FixedLowerMiddle",
    "FixedLower",
    "SwingUpper",
    "SwingUpperMiddle",
    "SwingMiddle",
    "SwingLowerMiddle",
    "SwingLower"
]

J’ai un service qui existe pour définir cette valeur, mais aucun pour récupérer la valeur définie.

Donc dans l’idéal, il faudrait un input_select par clim avec chacun sa liste de valeurs. Mais je ne veux pas les créer à la mano, je voudrais qu’ils s’instancient comme des grands lors de l’instanciation d’un de mes templates.

D’où ma recherche d’une autre solution :slight_smile:

T’en as tant que ça des clim que tu ne veuille pas dédier un input_select par clim?

De mon point de vue je simplifierai le truc avec genre 4 boutons:

  • un qui fasse balayage auto => FullSwing
  • un qui stoppe le balayage => FixedMiddle
  • un bouton up =< qui monte d’un cran (si fixedLower => FixedLowerMiddle, sinon si FixedLowerMiddle => FixedMidle, etc…)
  • un bouton down qui descend d’un cran (l’inverse du précédent)

ces deux boutons pouvant éventuellement marcher dans les deux modes (swing/fixed).

Tu virtualise seulement l’entity de ton input_select (que tu dupliques) et tu fais tous les tests dans un template dans ta declutering card…

Tout dépend aussi des modes de balayage que tu utilises.
Si tu ne les utilises pas tous :
Tu peux aussi juste mettre deux ou trois raccourcis vers tes modes préférés…

Fondamentalement, non, 5 je pourrais le faire :wink:

Mais le concept me chafouine, dupliquer du code, c’est justement ce que j’essaie d’éviter :slight_smile:

Surtout que dans l’idée, je l’aurais bien étendu à d’autres attributs de ma clim pour le faire une vraie carte méga custom, mais que du coup, c’est NbClims x NbAttributs à créer et à maintenir à chaque fois.

Je vais regarder si je ne peux pas ajouter les infos à mes clims « à la source » avec un customize_domain.

Pis comme ça, je pourrais peut-être m’en servir pour faire autre chose avec mes lumières, …

C’est pas le code qu’il faut dupliquer, c’est juste l’input select qui te permet de savoir l’état de chaque clim.

Le code tu le met dans tes boutons sur les appel de service, donc dans la decluttering card…

oui, c’est bien ce que j’avais en tête :slight_smile: et que j’aimerai éviter :wink:

Du coup, personnellement je ferais comme j’ai dis précédement (button-card et custom_fields) avec 1 input_number avec une valeur de 1 à 5 pour savoir quel est le climatiseur concerné et 5 input_number avec pour valeur de 1 à 12 pour chacun d’eux (chaque valeur correspondant à ta sélection de balayage). Une carte avec 5 boutons (1 par clim) et 12 radio boutons (affichage de la valeur du radio bouton en fonction de la valeur de l’input_number concerné). Le clic sur le bouton 1 coche le bon radio en fonction de la valeur de l’input_number 1 etc.

Si tu veux un exemple, je peux te faire ça ce soir.

1 « J'aime »

Si tu as le temps, ça serait volontiers, je se suis pas sur de te suivre :heart:

Pour l’instant, je m’oriente vers le customize_domain, qui me permet d’ajouter la liste de mes actions possibles à mes entités. Dans mon configuration.yaml :

# https://www.home-assistant.io/docs/configuration/customizing-devices/
homeassistant:
  customize_domain:
    climate:
      vertical_swing_modes:
        [
          "Default",
          "FullSwing",
          "FixedUpper",
          "FixedUpperMiddle",
          "FixedMiddle",
          "FixedLowerMiddle",
          "FixedLower",
          "SwingUpper",
          "SwingUpperMiddle",
          "SwingMiddle",
          "SwingLowerMiddle",
          "SwingLower",
        ]

Maintenant, il faudrait que je puisse définir un état sur mon entité, qui serait « persistant » (en tout cas jusqu’au reboot), et ma solution serait toute trouvée :slight_smile:

Un autre truc, c’est d’utiliser la mécanisme anchor du yaml (du customize par ex)…
1 config complète, et X déclinaisons sur les entités clim

Animation
Voilà ce que ça donne…

Le code de la carte :

type: custom:button-card
aspect_ratio: 1/1
custom_fields:
  clim_1:
    card:
      type: custom:button-card
      name: Clim. 1
      show_state: false
      show_icon: false
      styles:
        card:
          - background-color: dimgrey
          - border: |
              [[[
                if (states['input_number.climatiseurs_clim_courante'].state == '1.0')
                  return '2px inset rgba(255,242,0,1.0)';
                else
                  return '2px outset darkgrey';
              ]]]
          - box-shadow: |
              [[[
                if (states['input_number.climatiseurs_clim_courante'].state == '1.0')
                  return '0px 0px 4px 4px rgba(255,242,0,0.5)';
                else
                  return '0px 0px 0px 0px rgba(0,0,0,0.0)';
              ]]]
          - aspect-ratio: 2/1
          - border-radius: 5%
          - width: 78px
          - padding-left: 5px
        name:
          - font-size: 0.9em
          - font-weight: bold
          - justify-self: start
          - align-self: start
          - color: rgba(0,0,0,0.6)
      tap_action:
        action: call-service
        service: script.climatiseurs_clim_1
      hold_action:
        action: none
  clim_2:
    card:
      type: custom:button-card
      name: clim. 2
      show_state: false
      show_icon: false
      styles:
        card:
          - background-color: dimgrey
          - border: |
              [[[
                if (states['input_number.climatiseurs_clim_courante'].state == '2.0')
                  return '2px inset rgba(255,242,0,1.0)';
                else
                  return '2px outset darkgrey';
              ]]]
          - box-shadow: |
              [[[
                if (states['input_number.climatiseurs_clim_courante'].state == '2.0')
                  return '0px 0px 4px 4px rgba(255,242,0,0.5)';
                else
                  return '0px 0px 0px 0px rgba(0,0,0,0.0)';
              ]]]
          - aspect-ratio: 2/1
          - border-radius: 5%
          - width: 78px
          - padding-left: 5px
        name:
          - font-size: 0.9em
          - font-weight: bold
          - justify-self: start
          - align-self: start
          - color: rgba(0,0,0,0.6)
      tap_action:
        action: call-service
        service: script.climatiseurs_clim_2
      hold_action:
        action: none
  clim_3:
    card:
      type: custom:button-card
      name: Clim. 3
      show_state: false
      show_icon: false
      styles:
        card:
          - background-color: dimgrey
          - border: |
              [[[
                if (states['input_number.climatiseurs_clim_courante'].state == '3.0')
                  return '2px inset rgba(255,242,0,1.0)';
                else
                  return '2px outset darkgrey';
              ]]]
          - box-shadow: |
              [[[
                if (states['input_number.climatiseurs_clim_courante'].state == '3.0')
                  return '0px 0px 4px 4px rgba(255,242,0,0.5)';
                else
                  return '0px 0px 0px 0px rgba(0,0,0,0.0)';
              ]]]
          - aspect-ratio: 2/1
          - border-radius: 5%
          - width: 78px
          - padding-left: 5px
        name:
          - font-size: 0.9em
          - font-weight: bold
          - justify-self: start
          - align-self: start
          - color: rgba(0,0,0,0.6)
      tap_action:
        action: call-service
        service: script.climatiseurs_clim_3
      hold_action:
        action: none
  clim_4:
    card:
      type: custom:button-card
      name: Clim. 4
      show_state: false
      show_icon: false
      styles:
        card:
          - background-color: dimgrey
          - border: |
              [[[
                if (states['input_number.climatiseurs_clim_courante'].state == '4.0')
                  return '2px inset rgba(255,242,0,1.0)';
                else
                  return '2px outset darkgrey';
              ]]]
          - box-shadow: |
              [[[
                if (states['input_number.climatiseurs_clim_courante'].state == '4.0')
                  return '0px 0px 4px 4px rgba(255,242,0,0.5)';
                else
                  return '0px 0px 0px 0px rgba(0,0,0,0.0)';
              ]]]
          - aspect-ratio: 2/1
          - border-radius: 5%
          - width: 78px
          - padding-left: 5px
        name:
          - font-size: 0.9em
          - font-weight: bold
          - justify-self: start
          - align-self: start
          - color: rgba(0,0,0,0.6)
      tap_action:
        action: call-service
        service: script.climatiseurs_clim_4
      hold_action:
        action: none
  clim_5:
    card:
      type: custom:button-card
      name: Clim. 5
      show_state: false
      show_icon: false
      styles:
        card:
          - background-color: dimgrey
          - border: |
              [[[
                if (states['input_number.climatiseurs_clim_courante'].state == '5.0')
                  return '2px inset rgba(255,242,0,1.0)';
                else
                  return '2px outset darkgrey';
              ]]]
          - box-shadow: |
              [[[
                if (states['input_number.climatiseurs_clim_courante'].state == '5.0')
                  return '0px 0px 4px 4px rgba(255,242,0,0.5)';
                else
                  return '0px 0px 0px 0px rgba(0,0,0,0.0)';
              ]]]
          - aspect-ratio: 2/1
          - border-radius: 5%
          - width: 78px
          - padding-left: 5px
        name:
          - font-size: 0.9em
          - font-weight: bold
          - justify-self: start
          - align-self: start
          - color: rgba(0,0,0,0.6)
      tap_action:
        action: call-service
        service: script.climatiseurs_clim_5
      hold_action:
        action: none
  carte_clim:
    card:
      type: custom:button-card
      name: |
        [[[
          if (states['input_number.climatiseurs_clim_courante'].state == '1.0')
            return 'Climatiseur n° 1';
          else if (states['input_number.climatiseurs_clim_courante'].state == '2.0')
            return 'Climatiseur n° 2';
          else if (states['input_number.climatiseurs_clim_courante'].state == '3.0')
            return 'Climatiseur n° 3';
          else if (states['input_number.climatiseurs_clim_courante'].state == '4.0')
            return 'Climatiseur n° 4';
          else if (states['input_number.climatiseurs_clim_courante'].state == '5.0')
            return 'Climatiseur n° 5';
        ]]]
      entity: input_number.tableau_de_bord_carte_courante
      show_state: false
      show_icon: false
      styles:
        card:
          - background-color: rgba(128,128,128,1.0)
          - border: 2px outset darkgrey
          - aspect-ratio: 1/0.93
          - border-radius: 0%
          - width: 414px
          - padding-left: 5px
        name:
          - font-size: 0.9em
          - font-weight: bold
          - justify-self: start
          - align-self: start
          - margin-top: '-10px'
          - color: lightgrey
      tap_action:
        action: none
      hold_action:
        action: none
  bal_1:
    card:
      type: custom:button-card
      name: Default
      icon: |
        [[[
          if (states['input_number.climatiseurs_clim_courante'].state == '1.0')
            if (states['input_number.clim_1_bal'].state == '1.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '2.0')
            if (states['input_number.clim_2_bal'].state == '1.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '3.0')
            if (states['input_number.clim_3_bal'].state == '1.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '4.0')
            if (states['input_number.clim_4_bal'].state == '1.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '5.0')
            if (states['input_number.clim_5_bal'].state == '1.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
        ]]]
      show_state: false
      show_icon: true
      layout: icon_name
      styles:
        card:
          - background-color: rgba(128,128,128,1.0)
          - border: none
          - box-shadow: none
          - aspect-ratio: 3/1
          - border-radius: 0%
          - width: 130px
          - padding-left: 0px
        name:
          - font-size: 0.8em
          - font-weight: bold
          - justify-self: start
          - align-self: middle
          - color: rgba(0,0,0,0.6)
      tap_action:
        action: call-service
        service: script.climatiseurs_balayage_1
      hold_action:
        action: none
  bal_2:
    card:
      type: custom:button-card
      name: Full swing
      icon: |
        [[[
          if (states['input_number.climatiseurs_clim_courante'].state == '1.0')
            if (states['input_number.clim_1_bal'].state == '2.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '2.0')
            if (states['input_number.clim_2_bal'].state == '2.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '3.0')
            if (states['input_number.clim_3_bal'].state == '2.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '4.0')
            if (states['input_number.clim_4_bal'].state == '2.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '5.0')
            if (states['input_number.clim_5_bal'].state == '2.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
        ]]]
      show_state: false
      show_icon: true
      layout: icon_name
      styles:
        card:
          - background-color: rgba(128,128,128,1.0)
          - border: none
          - box-shadow: none
          - aspect-ratio: 3/1
          - border-radius: 0%
          - width: 130px
          - padding-left: 0px
        name:
          - font-size: 0.8em
          - font-weight: bold
          - justify-self: start
          - align-self: middle
          - color: rgba(0,0,0,0.6)
      tap_action:
        action: call-service
        service: script.climatiseurs_balayage_2
      hold_action:
        action: none
  bal_3:
    card:
      type: custom:button-card
      name: Fixed upper
      icon: |
        [[[
          if (states['input_number.climatiseurs_clim_courante'].state == '1.0')
            if (states['input_number.clim_1_bal'].state == '3.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '2.0')
            if (states['input_number.clim_2_bal'].state == '3.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '3.0')
            if (states['input_number.clim_3_bal'].state == '3.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '4.0')
            if (states['input_number.clim_4_bal'].state == '3.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '5.0')
            if (states['input_number.clim_5_bal'].state == '3.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
        ]]]
      show_state: false
      show_icon: true
      layout: icon_name
      styles:
        card:
          - background-color: rgba(128,128,128,1.0)
          - border: none
          - box-shadow: none
          - aspect-ratio: 3/1
          - border-radius: 0%
          - width: 130px
          - padding-left: 0px
        name:
          - font-size: 0.8em
          - font-weight: bold
          - justify-self: start
          - align-self: middle
          - color: rgba(0,0,0,0.6)
      tap_action:
        action: call-service
        service: script.climatiseurs_balayage_3
      hold_action:
        action: none
  bal_4:
    card:
      type: custom:button-card
      name: Fixed upper<br/>middle
      icon: |
        [[[
          if (states['input_number.climatiseurs_clim_courante'].state == '1.0')
            if (states['input_number.clim_1_bal'].state == '4.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '2.0')
            if (states['input_number.clim_2_bal'].state == '4.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '3.0')
            if (states['input_number.clim_3_bal'].state == '4.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '4.0')
            if (states['input_number.clim_4_bal'].state == '4.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '5.0')
            if (states['input_number.clim_5_bal'].state == '4.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
        ]]]
      show_state: false
      show_icon: true
      layout: icon_name
      styles:
        card:
          - background-color: rgba(128,128,128,1.0)
          - border: none
          - box-shadow: none
          - aspect-ratio: 3/1
          - border-radius: 0%
          - width: 130px
          - padding-left: 0px
        name:
          - font-size: 0.8em
          - font-weight: bold
          - justify-self: start
          - align-self: middle
          - color: rgba(0,0,0,0.6)
      tap_action:
        action: call-service
        service: script.climatiseurs_balayage_4
      hold_action:
        action: none
  bal_5:
    card:
      type: custom:button-card
      name: Fixed middle
      icon: |
        [[[
          if (states['input_number.climatiseurs_clim_courante'].state == '1.0')
            if (states['input_number.clim_1_bal'].state == '5.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '2.0')
            if (states['input_number.clim_2_bal'].state == '5.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '3.0')
            if (states['input_number.clim_3_bal'].state == '5.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '4.0')
            if (states['input_number.clim_4_bal'].state == '5.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '5.0')
            if (states['input_number.clim_5_bal'].state == '5.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
        ]]]
      show_state: false
      show_icon: true
      layout: icon_name
      styles:
        card:
          - background-color: rgba(128,128,128,1.0)
          - border: none
          - box-shadow: none
          - aspect-ratio: 3/1
          - border-radius: 0%
          - width: 130px
          - padding-left: 0px
        name:
          - font-size: 0.8em
          - font-weight: bold
          - justify-self: start
          - align-self: middle
          - color: rgba(0,0,0,0.6)
      tap_action:
        action: call-service
        service: script.climatiseurs_balayage_5
      hold_action:
        action: none
  bal_6:
    card:
      type: custom:button-card
      name: Fixed lower<br/>middle
      icon: |
        [[[
          if (states['input_number.climatiseurs_clim_courante'].state == '1.0')
            if (states['input_number.clim_1_bal'].state == '6.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '2.0')
            if (states['input_number.clim_2_bal'].state == '6.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '3.0')
            if (states['input_number.clim_3_bal'].state == '6.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '4.0')
            if (states['input_number.clim_4_bal'].state == '6.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '5.0')
            if (states['input_number.clim_5_bal'].state == '6.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
        ]]]
      show_state: false
      show_icon: true
      layout: icon_name
      styles:
        card:
          - background-color: rgba(128,128,128,1.0)
          - border: none
          - box-shadow: none
          - aspect-ratio: 3/1
          - border-radius: 0%
          - width: 130px
          - padding-left: 0px
        name:
          - font-size: 0.8em
          - font-weight: bold
          - justify-self: start
          - align-self: middle
          - color: rgba(0,0,0,0.6)
      tap_action:
        action: call-service
        service: script.climatiseurs_balayage_6
      hold_action:
        action: none
  bal_7:
    card:
      type: custom:button-card
      name: Fixed lower
      icon: |
        [[[
          if (states['input_number.climatiseurs_clim_courante'].state == '1.0')
            if (states['input_number.clim_1_bal'].state == '7.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '2.0')
            if (states['input_number.clim_2_bal'].state == '7.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '3.0')
            if (states['input_number.clim_3_bal'].state == '7.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '4.0')
            if (states['input_number.clim_4_bal'].state == '7.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '5.0')
            if (states['input_number.clim_5_bal'].state == '7.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
        ]]]
      show_state: false
      show_icon: true
      layout: icon_name
      styles:
        card:
          - background-color: rgba(128,128,128,1.0)
          - border: none
          - box-shadow: none
          - aspect-ratio: 3/1
          - border-radius: 0%
          - width: 130px
          - padding-left: 0px
        name:
          - font-size: 0.8em
          - font-weight: bold
          - justify-self: start
          - align-self: middle
          - color: rgba(0,0,0,0.6)
      tap_action:
        action: call-service
        service: script.climatiseurs_balayage_7
      hold_action:
        action: none
  bal_8:
    card:
      type: custom:button-card
      name: Swing upper
      icon: |
        [[[
          if (states['input_number.climatiseurs_clim_courante'].state == '1.0')
            if (states['input_number.clim_1_bal'].state == '8.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '2.0')
            if (states['input_number.clim_2_bal'].state == '8.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '3.0')
            if (states['input_number.clim_3_bal'].state == '8.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '4.0')
            if (states['input_number.clim_4_bal'].state == '8.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '5.0')
            if (states['input_number.clim_5_bal'].state == '8.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
        ]]]
      show_state: false
      show_icon: true
      layout: icon_name
      styles:
        card:
          - background-color: rgba(128,128,128,1.0)
          - border: none
          - box-shadow: none
          - aspect-ratio: 3/1
          - border-radius: 0%
          - width: 130px
          - padding-left: 0px
        name:
          - font-size: 0.8em
          - font-weight: bold
          - justify-self: start
          - align-self: middle
          - color: rgba(0,0,0,0.6)
      tap_action:
        action: call-service
        service: script.climatiseurs_balayage_8
      hold_action:
        action: none
  bal_9:
    card:
      type: custom:button-card
      name: Swing upper<br/>middle
      icon: |
        [[[
          if (states['input_number.climatiseurs_clim_courante'].state == '1.0')
            if (states['input_number.clim_1_bal'].state == '9.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '2.0')
            if (states['input_number.clim_2_bal'].state == '9.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '3.0')
            if (states['input_number.clim_3_bal'].state == '9.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '4.0')
            if (states['input_number.clim_4_bal'].state == '9.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '5.0')
            if (states['input_number.clim_5_bal'].state == '9.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
        ]]]
      show_state: false
      show_icon: true
      layout: icon_name
      styles:
        card:
          - background-color: rgba(128,128,128,1.0)
          - border: none
          - box-shadow: none
          - aspect-ratio: 3/1
          - border-radius: 0%
          - width: 130px
          - padding-left: 0px
        name:
          - font-size: 0.8em
          - font-weight: bold
          - justify-self: start
          - align-self: middle
          - color: rgba(0,0,0,0.6)
      tap_action:
        action: call-service
        service: script.climatiseurs_balayage_9
      hold_action:
        action: none
  bal_10:
    card:
      type: custom:button-card
      name: Swing<br/>middle
      icon: |
        [[[
          if (states['input_number.climatiseurs_clim_courante'].state == '1.0')
            if (states['input_number.clim_1_bal'].state == '10.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '2.0')
            if (states['input_number.clim_2_bal'].state == '10.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '3.0')
            if (states['input_number.clim_3_bal'].state == '10.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '4.0')
            if (states['input_number.clim_4_bal'].state == '10.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '5.0')
            if (states['input_number.clim_5_bal'].state == '10.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
        ]]]
      show_state: false
      show_icon: true
      layout: icon_name
      styles:
        card:
          - background-color: rgba(128,128,128,1.0)
          - border: none
          - box-shadow: none
          - aspect-ratio: 3/1
          - border-radius: 0%
          - width: 130px
          - padding-left: 0px
        name:
          - font-size: 0.8em
          - font-weight: bold
          - justify-self: start
          - align-self: middle
          - color: rgba(0,0,0,0.6)
      tap_action:
        action: call-service
        service: script.climatiseurs_balayage_10
      hold_action:
        action: none
  bal_11:
    card:
      type: custom:button-card
      name: Swing lower<br/>middle
      icon: |
        [[[
          if (states['input_number.climatiseurs_clim_courante'].state == '1.0')
            if (states['input_number.clim_1_bal'].state == '11.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '2.0')
            if (states['input_number.clim_2_bal'].state == '11.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '3.0')
            if (states['input_number.clim_3_bal'].state == '11.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '4.0')
            if (states['input_number.clim_4_bal'].state == '11.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '5.0')
            if (states['input_number.clim_5_bal'].state == '11.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
        ]]]
      show_state: false
      show_icon: true
      layout: icon_name
      styles:
        card:
          - background-color: rgba(128,128,128,1.0)
          - border: none
          - box-shadow: none
          - aspect-ratio: 3/1
          - border-radius: 0%
          - width: 130px
          - padding-left: 0px
        name:
          - font-size: 0.8em
          - font-weight: bold
          - justify-self: start
          - align-self: middle
          - color: rgba(0,0,0,0.6)
      tap_action:
        action: call-service
        service: script.climatiseurs_balayage_11
      hold_action:
        action: none
  bal_12:
    card:
      type: custom:button-card
      name: Swing lower
      icon: |
        [[[
          if (states['input_number.climatiseurs_clim_courante'].state == '1.0')
            if (states['input_number.clim_1_bal'].state == '12.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '2.0')
            if (states['input_number.clim_2_bal'].state == '12.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '3.0')
            if (states['input_number.clim_3_bal'].state == '12.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '4.0')
            if (states['input_number.clim_4_bal'].state == '12.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
          else if (states['input_number.climatiseurs_clim_courante'].state == '5.0')
            if (states['input_number.clim_5_bal'].state == '12.0')
              return 'mdi:radiobox-marked';
            else
              return 'mdi:radiobox-blank';
        ]]]
      show_state: false
      show_icon: true
      layout: icon_name
      styles:
        card:
          - background-color: rgba(128,128,128,1.0)
          - border: none
          - box-shadow: none
          - aspect-ratio: 3/1
          - border-radius: 0%
          - width: 130px
          - padding-left: 0px
        name:
          - font-size: 0.8em
          - font-weight: bold
          - justify-self: start
          - align-self: middle
          - color: rgba(0,0,0,0.6)
      tap_action:
        action: call-service
        service: script.climatiseurs_balayage_12
      hold_action:
        action: none
styles:
  card:
    - border: 1px solid darkgrey
    - box-shadow: 0px 0px 4px 2px inset darkgrey
    - background-color: rgba(240,240,240,1.0)
  custom_fields:
    clim_1:
      - position: absolute
      - left: 37px
      - top: 30px
    clim_2:
      - position: absolute
      - left: 121px
      - top: 30px
    clim_3:
      - position: absolute
      - left: 205px
      - top: 30px
    clim_4:
      - position: absolute
      - left: 289px
      - top: 30px
    clim_5:
      - position: absolute
      - left: 373px
      - top: 30px
    carte_clim:
      - position: absolute
      - left: 37px
      - top: 75px
    bal_1:
      - position: absolute
      - left: 120px
      - top: 150px
    bal_2:
      - position: absolute
      - left: 120px
      - top: 190px
    bal_3:
      - position: absolute
      - left: 120px
      - top: 230px
    bal_4:
      - position: absolute
      - left: 120px
      - top: 270px
    bal_5:
      - position: absolute
      - left: 120px
      - top: 310px
    bal_6:
      - position: absolute
      - left: 120px
      - top: 350px
    bal_7:
      - position: absolute
      - left: 270px
      - top: 150px
    bal_8:
      - position: absolute
      - left: 270px
      - top: 190px
    bal_9:
      - position: absolute
      - left: 270px
      - top: 230px
    bal_10:
      - position: absolute
      - left: 270px
      - top: 270px
    bal_11:
      - position: absolute
      - left: 270px
      - top: 310px
    bal_12:
      - position: absolute
      - left: 270px
      - top: 350px
tap_action:
  action: none
hold_action:
  action: none

Le code d’un des scripts quand clic sur un radio button :

alias: Climatiseurs - Balayage 1
sequence:
  - choose:
      - conditions:
          - condition: numeric_state
            entity_id: input_number.climatiseurs_clim_courante
            above: 0.9
            below: 1.1
        sequence:
          - service: input_number.set_value
            metadata: {}
            data:
              value: 1
            target:
              entity_id: input_number.clim_1_bal
      - conditions:
          - condition: numeric_state
            entity_id: input_number.climatiseurs_clim_courante
            above: 1.9
            below: 2.1
        sequence:
          - service: input_number.set_value
            metadata: {}
            data:
              value: 1
            target:
              entity_id: input_number.clim_2_bal
      - conditions:
          - condition: numeric_state
            entity_id: input_number.climatiseurs_clim_courante
            above: 2.9
            below: 3.1
        sequence:
          - service: input_number.set_value
            metadata: {}
            data:
              value: 1
            target:
              entity_id:
                - input_number.clim_3_bal
      - conditions:
          - condition: numeric_state
            entity_id: input_number.climatiseurs_clim_courante
            above: 3.9
            below: 4.1
        sequence:
          - service: input_number.set_value
            metadata: {}
            data:
              value: 1
            target:
              entity_id:
                - input_number.clim_4_bal
      - conditions:
          - condition: numeric_state
            entity_id: input_number.climatiseurs_clim_courante
            above: 4.9
            below: 5.1
        sequence:
          - service: input_number.set_value
            metadata: {}
            data:
              value: 1
            target:
              entity_id:
                - input_number.clim_5_bal
mode: single

Il y a un script pour chacune des options de balayage.

Le code correspondant au clic sur un bouton de clim :

alias: Climatiseurs - Clim_1
sequence:
  - service: input_number.set_value
    metadata: {}
    data:
      value: 1
    target:
      entity_id:
        - input_number.climatiseurs_clim_courante
mode: single

Un script par bouton de clim.

Il faut une entrée numérique (input_number) allant de 1 à 12 pour chaque clim et une entrée numérique allant de 1 à 5 pour le choix de la clim.

Salut,
faudrais te mettre au button_card_templates, ca te diminurer grave le code.

Salut @WarC0zes

Bah, il y a moins de 1000 lignes de code là, ça va :grin:

1 « J'aime »