Template - Liste Sortieren

IvoryBalboa90

Active member
Moin!

Heute bin ich mal auf der Seite der Fragenden, nicht der Antwortenden.

Mein Ziel:
Mit der Integration Tankerkoenig ein wenig schwarze Magie machen und eine Benachrichtigung bekommen, wenn es aus einer Auswahl an 10 Tankstellen eine/mehrere Tankstelle/n einen neuen günstigsten Preis gibt.
Das Template dazu hab ich auch schon geschrieben, ist ja nix wildes (siehe unten).
Zweiter Schritt, gucken welche Tankstellen diesen günstigen Preis haben... Ebenso kein Problem, siehe unten.
Dritter Schritt, sortieren nach Distanz. Da fangen meine Probleme an 😱

Erster Schritt:
Günstigsten Preis in den Tankstellen finden
YAML:
{% set preis =
  states.sensor |
  selectattr('attributes.fuel_type','defined') |
  selectattr('attributes.fuel_type','eq','e5') |
  map(attribute='state') |
  min
%}
"preis" beinhaltet jetzt den günstigsten Preis meiner Tankstellen.


Zweiter Schritt:
Nachgucken, welche Tankstellen diesen "günstigen" Preis haben
YAML:
{% set wo =
  states.sensor |
  selectattr('attributes.fuel_type','defined') |
  selectattr('state','eq',preis) |
  map(attribute='entity_id') |
  list
%}
"wo" ist nun eine Liste an Tankstellen (deren Entitäten), die den "preis" von oben haben.

Dritter Schritt:
Herausfinden, wie weit die Tankstelle von mir weg ist
YAML:
{% for entfernung in wo %}
{{ distance(entfernung)
}}
{%- endfor -%}

Soweit alles gut, Entfernungen werden mir angezeigt. Sieht dann so aus:
Code:
Ergebnistyp: string
1.919515
18.170924
17.442168
1.211782
17.447663
2.221553
18.181788

Nur bekomm ich die ums Verrecken nicht sortiert 😢

Jemand ne Idee/Lösung?
 
Meiner Meinung nach sollte das eigentlich mit einem "String" auch funktionieren, aber ggf. umwandeln in "Integer" und dann via "| sort"?

EDIT: Aber weisst ja, ich hab keine Ahnung, also von daher auch nur eine "Idee" 😅
EDIT2: Hab grade etwas gefunden....vllt geht es ja so:
sort(attribute='entfernung', reverse=false)
 
umwandeln in "Integer" und dann via "| sort
Das war natürlich auch mein erster Gedanke. Pustekuchen, HA sagt:
YAML:
TypeError: 'int' object is not iterable
Ebensowenig funktioniert es mit |float


EDIT2: Hab grade etwas gefunden....vllt geht es ja so:
Die Entitäten haben kein Attribut, das mir direkt die Entfernung gibt. Long/Lat steht zur Verfügung, also Koordinaten. Daher muss ich die Funktion distance('sensor.xxx') nutzen
 
Mal ganz doof und laienhaft gesprochen: Kann man die Records nicht in ein Array schieben (falls es nicht eh schon ein Array ist) und nach einer bestimmten im Array Position (Entfernung) sortieren?
 
Hab ich auch schon probiert.

Das wäre eins von den beiden:
YAML:
|list|sort
|list|min

Und das ergibt leider auch:
Code:
TypeError: 'float' object is not iterable
 
Also prinzipiell lässt sich nen Array so schon sortieren:
YAML:
{% set data = [1.919515, 18.170924, 17.442168, 1.211782, 17.447663, 2.221553, 18.181788] %}
{{ data|sort }}
- gibt die Zahlen sortiert aus. Daran kann es eigentlich nicht hängen.
 
Nein, das ist keine Möglichkeit, da ich wie eingangs geschrieben das Ergebnis in einer Automation (Benachrichtigung) nutzen will.
 
Hast du mal versuchte hier schon direkt zu sortieren, bin mir aber nicht sicher ob das so schon funktioniert.... nur als gedanken Anstoß.

Code:
{% for entfernung in wo %}
{{ distance(entfernung) | sort(attribute='attributes.xxx')
}}
{%- endfor -%}
 
Leider nicht.
"wo" ist eine Liste aus Entitäten (also entity_ids), die den aktuellen günstigsten Preis haben. In der Liste steht also:

[sensor.tankstelle_a, sensor.tankstelle_a,....]

Da gibt's noch nix zu sortieren.
 
aus der Jinja Doku:
YAML:
{% for user in users|sort(attribute="age,name") %}
    ...
{% endfor %}

und hier gehts darum Zeiten zu sortieren
YAML:
          {% for item in states.sensor | selectattr('object_id', 'match', 'cal_cd_') | sort(attribute='attributes.days') -%}
          |{{item.state}}||{{item.name | replace(' Countdown', '')}}|
          {% endfor %}
 
Siehe oben, ich hab die Entfernung nicht als Attribut, ich hab Koordinaten als Attribut. Die Entfernung bekomm ich nur über distance('sensor.xxxx'), daher mit nem loop durch eine Liste mit entity_ids.
 
Wie, noch immer keine Lösung? 🤨 :D

Versuchs mal so:
YAML:
{% set data = namespace(temp=[]) %}
{% for entfernung in wo %}
{% set data.temp = data.temp + [distance(entfernung)|float] %}
{% endfor %}
{{ data.temp|sort }}

Um das dann wieder in ner einfachen Liste zu haben bei Bedarf einfach neu setzen:
YAML:
{% set sorted = data.temp|sort %}
{{ sorted }}
 
Danke dir, das ist die Lösung.
Fast das gleiche hab ich gestern abend auch noch gebastelt, konnte es aber nicht testen, da alle Tankstellen zu waren und daher die Sensoren unavailable 😂
 
Habs auch nur mit nem Array mit Deinen vorgegebenen Daten ausprobiert :D - insofern auch keine Ahnung ob das konvertieren nach float tatsächlich nötig ist, aber sicher ist sicher.
 

Zurzeit aktive Besucher

Keine Mitglieder online.

Letzte Anleitungen

Statistik des Forums

Themen
4.212
Beiträge
43.948
Mitglieder
3.806
Neuestes Mitglied
Andy74
Zurück
Oben