Sortierung innerhalb einer Card - hier Waste Collection Schedule

Hallo,

ich würde gern die Reihenfolge der Müllabholungen sortieren nach Datum. Also oben sollte die erste Abholung stehen, nach unten dann die folgenden sortiert nach Reihenfolge.

Meine Card sieht so aus:

Der Code dazu in einer Markdown Card:

## Nächste Abfall-Termine
     
### {{ states.sensor.abfallnaechster.attributes.values() | first | replace("papiermuell", "Papiertonne am") | replace("gruenermuell", "Grüne Tonne am") |
replace("restmuell", "graue Restmülltonne am") | replace("elektroschrott", "Elektroschrott") | replace("biomuell", "Biotonne am")}}:
<b>{{ states.sensor.abfallnaechster.attributes | first | as_timestamp |timestamp_custom("%d.%m.%Y") }}
</b>
<hr></br>
<b><u>Weitere Termine</b></u></br></br>
Restmüll: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {{ states.sensor.abfallrestmuell.attributes | first | as_timestamp | timestamp_custom("%d.%m.%Y") }}<br>
Biotonne: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{ states.sensor.abfallbiomuell.attributes | first | as_timestamp | timestamp_custom("%d.%m.%Y") }}</br>
Papiermüll: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{ states.sensor.abfallpapiermuell.attributes | first | as_timestamp | timestamp_custom("%d.%m.%Y") }}</br>
Grüne Tonne: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{ states.sensor.abfallgruenermuell.attributes | first | as_timestamp | timestamp_custom("%d.%m.%Y") }}</br>
Elektroschrott: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{ states.sensor.abfallelektroschrott.attributes | first | as_timestamp | timestamp_custom("%d.%m.%Y") }}
          </br>
          </br>
          <table>
          <tr>
            <td width="30%">Restmüll</th>
            <td width="25%">Biomüll</th>
            <td width="25%">Papier</th>
            <td>Grüne Tonne</th>
          </tr>
          <tr>
            <td>{{ states.sensor.abfallrestmuell.attributes | first | as_timestamp | timestamp_custom("%d.%m.%y   ") }}</td>
            <td>{{ states.sensor.abfallbiomuell.attributes | first | as_timestamp | timestamp_custom("%d.%m.%y   ") }}</td>
            <td>{{ states.sensor.abfallpapiermuell.attributes | first | as_timestamp | timestamp_custom("%d.%m.%y   ") }}</td>
            <td>{{ states.sensor.abfallgruenermuell.attributes | first | as_timestamp | timestamp_custom("%d.%m.%y   ") }}</td>
           </tr>
          </table>

Das würde mich in der Tat auch interessieren. Man dürfte es nicht so fest bauen, sondern müsste die nächsten Termine (sensor.abfallnaechster) in einer for-Schleife abarbeiten. Aber wie man in einer solchen Schleife ein Key/Value-Paar sinnvoll abarbeitet, habe ich bisher nicht herausgefunden.

Ja aber wer kann so etwas?

Ich könnte dazu bisher nur meinen ersten Entwurf anbieten:

{% for termin in states.sensor.abfallnaechster.attributes %}
{{ termin }} {{ states.sensor.abfallnaechster.attributes[termin] }}
{%- endfor %}

Da bekomme ich aber zum Beispiel das Datum nicht mehr formatiert wie in deinem Beispiel. Auch eine Begrenzung (z.B. nur die nächsten 5 Termine) habe ich noch nicht hinbekommen.
Evtl. hat ja jemand einen Tipp, wer schon mehr Erfahrung mit Templates hat.

So, @thphilipp , das ließ mir keine Ruhe. Ich habe es für meine Zwecke jetzt hinbekommen. Evtl. kannst du ja was übernehmen:

{% for termin in states.sensor.abfallnaechster.attributes %}
{{ states.sensor.abfallnaechster.attributes[termin] }} am {{termin[8:10]}}.{{termin[5:7]}}.{{ termin[:4] }}
{%- if loop.index >= 5 -%}{% break %}{%- endif -%}
{% endfor %}

Das Ergebnis sieht bei mir dann so aus:
Restabfall am 06.01.2024
Strauchschnitt am 10.01.2024
Biotonnen am 11.01.2024
Papiertonne am 19.01.2024
Gelbe Tonnen am 23.01.2024

Das ist ja schon echt super. Aber können wir hier die Sache einbauen, wenn kein Datum vorhanden ist, dass “unbekannt” erscheint?

Aus dem Discord habe ich dazu folgenden Code:

{% if has_value(‘sensor.abfallrestmuell’) %} {{states.sensor.abfallrestmuell.attributes | first | as_timestamp | timestamp_custom( “%d.%m.%y”) }} {% else %} kein Termin {%endif %}

Hallo,

sortieren könnt ihr so:

  1. Erstellt euch eine Gruppe (/config/groups.yaml) mit Euren Sensoren der einzelnen Abholungen als Entities:
#################### Müllabholung ####################
grp_MuellSensoren:
  name: Muellentsorgung
  entities:
    - sensor.muell_Gelb_next
    - sensor.muell_Blau_next
    - sensor.muell_Schwarz_next
    - sensor.muell_Braun_next
######################################################

Diese Gruppe lässt sich dann bspw. in einer Markdown-Karte durchlaufen und sortieren:

{% set ns = namespace(x=[]) %} 
{% for e in expand('group.grp_MuellSensoren') %}
  {% set ns.x = ns.x + [{"name": e.name, "state": e.state | int(0), "picture": e.attributes.entity_picture}] %}
{% endfor %} 
{% for e in ns.x | sort(attribute='state') -%}
  {% if e.name == 'muell_Blau_next' %} Blaue Tonne {% elif e.name == 'muell_Schwarz_next' %} Schwarze Tonne {% else %} Gelbe Tonne {% endif %} 
  {% if e.state==0 %} Heute {% elif e.state==1 %} Morgen {% else %} in {{ e.state }} Tagen {% endif %}  ![Image]({{ e.picture }})
{% endfor %}

Gruß

Man kann vieles. Ich passe bei mir immer auf, dass auf den Dashboards keine unnötigen Infos stehen. Wenn es keinen Termin gibt, brauche ich auch keine Anzeige :wink:

Ich habe es bei mir jetzt optisch so eingerichtet. Mehr braucht es bei mir nicht:
grafik

Mal rein aus Interesse: funktioniert ein sortieren nach “state” wirklich? In meinem Bild steht der State in Klammern ganz hinten. Da stehen ja die unterschiedlichsten Dinge drin (Heute, Morgen, in 6 Tagen, am xx.xx.xxxx, …).
Und warum hast du dich dafür entschlossen? Im Sensor “abfallnaester” stehen die Termine doch schon sortiert drin.

Was für eine Gruppe genaue? Sensor oder binary_sensor?

Und welche Einstellung vom Typ? minimum, maximum, …?

Halle er hier beschrieben zusammen mit dem Code

Klar. Aber dann kannst du immer nur den nächsten ausgeben.
Ich wollte aber eine Anzeige aller 4 Tonnen in der Reihenfolge wie sie abgeholt werden. Und wenn ich thphilipp recht verstanden habe, er auch.

Gruß

Ja Du hast völlig Recht. Würde ich gern realisieren. Allerdings ergibt die erstellte Gruppe als Zustand “unknown”?

Ja. Genau das macht der Code von mir ja:

{% for termin in states.sensor.abfallnaechster.attributes %}
{{ states.sensor.abfallnaechster.attributes[termin] }} am {{termin[8:10]}}.{{termin[5:7]}}.{{ termin[:4] }}
{%- if loop.index >= 5 -%}{% break %}{%- endif -%}
{% endfor %}

Ergebnis:
Restabfall am 06.01.2024
Strauchschnitt am 10.01.2024
Biotonnen am 11.01.2024
Papiertonne am 19.01.2024
Gelbe Tonnen am 23.01.2024

Die Termine werden aus den Attributen des “abfallnaechster”-Sensors entnommen, wo sie bereits in sortierter Form drin stehen:

Wie muss ich diese Zeilen ändern:

{% set ns = namespace(x=) %} {% for e in expand(‘group.grp_MuellSensoren’) %} {% set ns.x = ns.x + [{“name”: e.name, “state”: e.state | int(0), “picture”: e.attributes.entity_picture}] %} {% endfor %}
{% for e in ns.x | sort(attribute=‘state’) -%} {% if e.name == ‘muell_Blau_next’ %} Grüne Tonne {% elif e.name == ‘muell_Schwarz_next’ %} Schwarze Tonne {% else %} Gelbe Tonne {% endif %}

{% if e.state==0 %} Heute {% elif e.state==1 %} Morgen {% else %} in {{ e.state }} Tagen {% endif %} ![Image]({{ e.picture }})
{% endfor %}

Wenn ich folgende Sensoren habe:

#################### Müllabholung ####################
grp_MuellSensoren:
  name: Muellentsorgung
  entities:
    - sensor.Restmuell
    - sensor.Gruenermuell
    - sensor.Biomuell
    - sensor.Elektroschrott
    - sensor.Tannenbaum
    - sensor.Papiermuell
    - sensor.Schadstoffe
    - sensor.Sperrmuell
######################################################

Habe ich selber geschafft…

Ich würde gerne an Euch noch eine Frage stellen, die ich gerne umsetzen würde:

Ich möchte, dass das Wort “morgen” oder “heute” blinkt, wenn es unten in der letzten grünen Zeile erscheint. Wäre das möglich??

Hier mein Code:

{###########################################################################################}
{#                                                                                         #}
{#     In der nächsten Zeile die Namen der Abfallsensoren eintragen, ohne "sensor." !!!   #}
{#                                                                                         #}
{###########################################################################################}

{% set abfall_sensoren = ['abfallrestmuell','abfallgruenermuell','abfallbiomuell','abfallelektroschrott','abfallschadstoffe','abfallpapiermuell','abfallsperrmuell','abfalltannenbaum'] %}


{% set variable_name = 'abfallnaechster' %}
{% set ns = namespace(a=[],b=[]) %}
{% for item in abfall_sensoren %}
{% if has_value('sensor.' ~ item) %}
{% set ns.a= ns.a + [[as_timestamp((states.sensor[item].attributes.items()|list)[0][0]),(states.sensor[item].attributes.items()|list)[0][1]]] %}
{% else %} {% set ns.b= ns.b + [['kein Termin',item]] %}
{% endif%}
{%endfor%}
{% set l= ns.a|sort()|list %}
{% set ns.a=[] %}
{% for item in l%}
{% set ns.a= ns.a + [[(item[0]|timestamp_custom('%d.%m.%Y')),item[1]]] %}
{% endfor%}
{% set l = ns.a+  ns.b %}


# <font color = red>Nächster Abfall-Termin:
{% if has_value('sensor.abfallnaechster')  %}

{###########################################################################################}
{#                                                                                         #}
{#     In der nächsten Zeile ggf. die Anzeigenamen anpassen!!!                             #}
{#                                                                                         #}
{###########################################################################################}

### {{ states.sensor.abfallnaechster.attributes.values() | first | replace("Papiertonne", "Papiertonne am:") | replace("Grüne Tonne", "Grüne Tonne am:") | replace("Graue Tonne", "graue Restmülltonne am:") | replace("elektroschrott", "Elektroschrott am:") | replace("Bio Tonne", "Bio Tonne am:") | replace("Sperrmüll", "Sperrmüll am:") | replace("Tannenbaum", "Tannenbaum am:") | replace("Schadstoffe", "Schadstoffe am:") }} {{ states.sensor.abfallnaechster.attributes | first | as_timestamp |timestamp_custom("%d.%m.%y") }}
<font color = white>
{% else %}
### kein Termin
{% endif%}
<hr><b><u><h2>Weitere Termine</b></u></br></h2>
<table>
{%for item in l%}
<tr><td>{{item[1]}}:</td><td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td><td>{{item[0]}}</td>
{% endfor%}
</table><hr></br><h4>
<table><tr>
            <td width="26%" align="left">Graue Tonne</th>
            <td width="28%" align="left">Grüne Tonne</th>
            <td width="26%" align="left">Biotonne</th>
            <td align="left">Papiertonne</th>
          <tr>
            <td align="left"><font color="gree">{% if has_value('sensor.abfallrestmuell') %} {{ states.sensor.abfallrestmuell.state}} {% else %} kein Termin {%endif %}
            <td align="left"><font color="gree"> {% if has_value('sensor.abfallgruenermuell') %} {{states.sensor.abfallgruenermuell.state  }} {% else %} kein Termin {%endif %}
            <td align="left"><font color="gree"> {% if has_value('sensor.abfallbiomuell') %} {{states.sensor.abfallbiomuell.state }} {% else %} kein Termin {%endif %}
            <td align="left"> <font color="gree"> {% if has_value('sensor.abfallpapiermuell') %} {{states.sensor.abfallpapiermuell.state  }} {% else %} kein Termin {%endif %}
          
</table>```

Hi,

möchte hierzu nochmals eine Frage stellen. Wäre es möglich, die ersten beiden Zeilen, die in rot dargestellt sind, bei einem morgigen Termin blinken zu lassen?