Trouver la position dans une liste?

Bonjour à tous,

Je cherche à pouvoir définir sur une télécommande deux boutons pour contrôler ma clim :

  • le premier qui ferait « ventilation plus fort »
  • le second, « ventilation moins fort »

J’arrive bien à voir quels sont les états possibles pour la valeur :

{{ state_attr('climate.bureau', 'fan_modes') }}

=>

Type de résultat: list
[
  "low",
  "medium low",
  "medium",
  "medium high",
  "high"
]

Et l’état actuel de ma clim :

{{ state_attr('climate.bureau', 'fan_mode') }}

=>

Type de résultat: string
low

Du coup, sauriez vous me dire comment trouver mon index actuel dans la liste, pour pouvoir passer au service « climate.set_fan_mode » l’index suivant / précédent s’il existe ?

Merci d’avance, et bonne journée à tous :slight_smile:

Salut @titoumimi

ça doit pouvoir se faire comme ça :

{{ state_attr('climate.bureau', 'fan_mode')[0] }}

Le nombre entre [ ]correspondant à la position dans la liste, qui commence par zéro :wink:

[Edit] je crois je suis allé un peu vite, je vois pour adapter ma réponse :wink:

Salut,
merci pour l’explication, je comprends enfin ce [ 0 ]:+1:

Yes, ça j’ai bien :wink: (d’ailleurs dans ton exemple, comme tu le fais sur une chaîne, ça retourne le caractère « l » - les noms des deux attributs sont trop proches c’est relou)

Mais ce qui me manque, c’est plus un équivalent de ça :

{{ state_attr('climate.bureau', 'fan_modes') | indexof(state_attr('climate.bureau', 'fan_mode') }}

En gros, « quelle est la position dans la liste de la valeur actuelle ».
Malheureusement je ne trouve rien dans la doc, et indexof n’est qu’une belle invention de ma part ^^

en python, ça donnerait ça :

animals = ['cat', 'dog', 'rabbit', 'horse']

# get the index of 'dog'
index = animals.index('dog')

Ok, en fait suffisait de regarder le code python :

{{ state_attr('climate.bureau', 'fan_modes').index(state_attr('climate.bureau', 'fan_mode')) }}

Merci beaucoup pour l’aide <3

1 « J'aime »

Par curiosité, j’ai voulu tester :wink:

Bref qqc m’échappe :

La fatigue peut-être, c’est lundi :smiley:

Non, ce sont mes clims qui ont des attributs extrêmement proches :slight_smile:

state_attr(‹ climate.bureau ›, ‹ fan_modes ›) (avec un S à modes) : la liste des valeurs possibles

state_attr(‹ climate.bureau ›, ‹ fan_mode ›) (sans le S donc) la valeur actuelle.

Dans ton cas, ça donnerait ça :

{{ state_attr('vacuum.william', 'fan_speed_list').index('Strong') }}

Ou bien :

{{ state_attr('vacuum.william', 'fan_speed_list').index(state_attr('vacuum.william', 'TON ATTRIBUT QUI DONNE L ETAT ACTUEL')) }}

ça sera plus facile si tu me fait un screen de tes états :wink:

1 « J'aime »

Ok, c’est bon je l’ai :stuck_out_tongue:

Thanks :wink: !!!

1 « J'aime »

Tu trouves que sans l’aide d’ @Herbs tu aurais résolu ton problème ? Si c’est vraiment le cas, mettre la solution sur un de tes messages pourrais s’envisager, dans le cas contraire, ça serait cool de mettre la soltion sur celui qui te l’a apportée :wink:

Non non, je persiste et je signe, ce n’est pas sa réponse qui m’a donné la solution :wink: (même si je le remercie chaudement d’avoir répondu)

Et tant qu’à faire, autant mettre la « vraie » réponse en solution pour le prochain qui aura le même problème

Effectivement en relisant plus à fond, la réponse d ’ @Herbs n’était pas la bonne, tu n’étais pas loin avec ton « IndexOf » mais c’est plus une méthode vb.net

Ta parler trop vite :sweat_smile:

1 « J'aime »

Ne te moques pas @WarC0zes !!!

@anon41081891 Pour le coup, j’ai appris un truc grâce @titoumimi :wink:

1 « J'aime »

Et donc, des fois que ça intéresse quelqu’un, j’en ai fait un script :

alias: Incrémente / décrémente ventilation clim
variables:
  current_index_for_fan_mode: "{{ state_attr(climate_id, 'fan_modes').index(state_attr(climate_id, 'fan_mode')) }}"
  next_index_for_fan_mode: >
    {% if fan_strength == 'more' %}
    {{ current_index_for_fan_mode + 1 }}
    {% elif fan_strength == 'less' %}
    {{ current_index_for_fan_mode - 1 }}
    {% else %}
    {{ false }}
    {% endif %}
sequence:
  - if:
      - condition: template
        value_template: "{{ (next_index_for_fan_mode is number) and (next_index_for_fan_mode >= 0) and (next_index_for_fan_mode < (state_attr(climate_id, 'fan_modes') | count)) }}"
    then:
      - service: climate.set_fan_mode
        data:
          fan_mode: "{{ state_attr(climate_id, 'fan_modes')[next_index_for_fan_mode] }}"
          entity_id: "{{ climate_id }}"
mode: queued
icon: mdi:script-text
max: 3

A appeler comme suit :

service: script.incremente_decremente_ventilation_clim
data:
  climate_id: climate.bureau
  fan_strength: less

avec fan_strength qui peut valloir less ou more (le reste sera juste ignoré.

Enjoy !

2 « J'aime »