Sort by numeric state impossible

avec ce template

{{ expand(anniversaires) 
| sort(attribute='state') | map(attribute='state') | list | join(', ')}}

je cherche à trier un dictionnaire ‹ anniversaires › mais le tri ne s’effectue pas comme je le souhaite

le résultat est le suivant

103, 186, 19, 266, 30, 323

auriez vous une idée pour résoudre cela? je cherche à définir le prochain anniversaire via le nombre de jours le plus petit

Salut,

Sans connaitre ce que contient anniversaires et comment c’est organisé, ça va pas être facile !

1 « J'aime »

Bonjour Pulpy
Le dictionnaire (ou le groupe, j’ai essayé les deux) contient 6 sensors anniversaire avec le nombre de jours restant avant l’anniversaire, en state dont le résultat du template est marqué plus bas

On dirait que le tri est basé sur des string et pas des number… En tout cas, l’ordre alphabétique (et pas numérique) a l’air OK. Il faudrait donc en plus transformer en nombre avec un float ou équivalent.

Inspire toi de ce post :

https://forum.hacf.fr/t/recuperer-les-prix-de-carburants/644/47?u=clemalex

merci pour cette piste ,
mais j’ai exactement le même résultat.
les prix de l’essence sont tous au même format x.xxx €, le tri se fait donc naturellement
pour ma part les jours restant avant l’anniversaire sont a 1, 2 ou 3 chiffres. et je ne peux pas les convertir en float ni en int

'float' object is not iterable
'int' object is not iterable

Mets le code même s’il n’est pas bon ça évitera de chercher pour rien si tu l’as déjà fait :+1:

{{ expand(anniversaires) 
| sort(attribute='state') | map(attribute='state') | float | list | join(', ')}}
{{ expand(anniversaires) 
| sort(attribute='state') | map(attribute='state') | int | list | join(', ')}}

Avec la définition suivante :

sensor:
  - platform: template
    sensors: 
      date_01:
          value_template: "100" 
      date_02:
          value_template: "20" 
      date_03:
          value_template: "3" 
group:
  trie:
    name: trie
    entities:
      - sensor.date_01
      - sensor.date_02
      - sensor.date_03

et le code suivant :

{%- set ns = namespace(list=[]) -%}
{%- for states in ("group.trie" |expand ) -%}
{%- set ns.list = ns.list + [{"entity_id":states.entity_id,"state": states.state|int}] -%}
{%- endfor -%}
{{ ns.list |sort(attribute= "state")}}

on obtient un tableau trié :

[
  {
    "entity_id": "sensor.date_03",
    "state": 3
  },
  {
    "entity_id": "sensor.date_02",
    "state": 20
  },
  {
    "entity_id": "sensor.date_01",
    "state": 100
  }
]

Est-ce bien la demande ?

c’est exactement cela. merci

Tu es obligé de passer par un namespace si tu veux conserver les définitions faites dans une boucle for.

Après, list[] correspond juste à la déclaration de la variable list qui est un tableau (d’où les crochets [])

je venais de modifier mon post pour ne pas t’embêter avec namespace, ayant entre temps chercher la signification
merci encore