Template: Vergleich von Uhrzeichen

Hallo Community,

ich brauche mal eure Hilfe. Ich habe trotz umfangreicher Forum sowie Youtube Recherche mein Problem leider nicht lösen können:

Ich möchte mir über eine Template Karte eine entsprechende Uhrzeit anzeigen lassen. Hierbei soll geprüft werden, ob ein Schalter aktiv ist und dann soll er mir je nach Uhrzeit, die Zeit anzeigen, welche als nächstes kommt.

Zeit 1: Sonnenaufgang + 30 Minuten
Zeit 2: 08:00 Uhr

{% if
is_state('input_boolean.ha_schalter1', 'on') 
and if {{ (as_timestamp(state_attr('sun.sun', 'next_rising')) + 1800) | timestamp_custom('%H:%M') }} > {{ (as_timestamp("2025-02-15T07:00:00+00:00")) | timestamp_custom('%H:%M') }} %
  Uhrzeit 1
{% elif is_state('input_boolean.ha_schalter1', 'on') 
and if {{ (as_timestamp(state_attr('sun.sun', 'next_rising')) + 1800) | timestamp_custom('%H:%M') }} < {{ (as_timestamp("2025-02-15T07:00:00+00:00")) | timestamp_custom('%H:%M') }} %
 Uhrzeit 2
{% else %}
 Ausgeschaltet
{% endif %}

{{ (as_timestamp(state_attr('sun.sun', 'next_rising')) + 1800) | timestamp_custom('%H:%M') }}

gibt zur Zeit “07:54” als Zeit / Wert aus

{{ (as_timestamp("2025-02-15T07:00:00+00:00")) | timestamp_custom('%H:%M') }}

gibt aktuell “08:00” als Zeit / Wert aus

Ich hoffe es ist nachvollziehbar, was ich damit meine und hoffe auf Unterstützung. Danke Schön

:crayon:by HarryP: Code-/Logzeilen formatiert (bitte immer in </> einbinden)

Warum immer alle mit solch gewaltigen endloszeilen arbeiten wollen bei denen man nicht mal einfach lesen kann was welchen Wert hat und was ich am Ende mit was vergleiche.
Der Fehler liegt darin das du versuchst einen timestamp wert mit einem custom wert mittels > oder < zu vergleichen was ja nun nicht funktionieren kann

Kopier die Zeile in Entwicklerwerkzeuge>Template
und ersetz in dem “IF” Konstrukt mal t2 durch t3

{% set t1 = as_timestamp(state_attr("sun.sun","next_rising")) + 1800 %}{{ t1 }}
{% set t2 = (as_timestamp("2025-02-15T07:00:00+00:00")) | timestamp_custom("%H:%M") %}{{ t2 }}
{% set t3 = as_timestamp("2025-02-15T07:00:00+00:00") %}{{ t3 }}

{% if (t1 < t2) %}
  {{ t1 | timestamp_custom("%H:%M") }}
{% else %}
  {{ t2 | timestamp_custom("%H:%M") }}
{% endif %}

2025-02-21 11-51-19

Ist da ein Fehler drin?

Kannst es ja mal so versuchen:

{% set t1 = (as_timestamp(state_attr('sun.sun', 'next_rising')) + 1800) %}
{% set t2 = (as_timestamp('2025-02-15T07:00:00+00:00')) %}
{% if is_state('input_boolean.ha_schalter1', 'on') and t1 > t2  %}
Uhrzeit 1
{% elif is_state('input_boolean.ha_schalter1', 'on') and  t1  < t2 %}
Uhrzeit 2
{% else %}
Ausgeschaltet
{% endif %}

Du meinst den absichtlich eingebauten damit der Kollege selbst sehen kann warum es nicht geht. Ja der ist da drin.
Es ist auch absichtlich keine fertige Lösung sondern als Lernhilfe/Hinweis gedacht, warum es so nicht ging und wo der Fehler lag.

deshalb ja auch t2 und t3
1x das was @DeToX probiert hat
1x das was richtig wäre

Und ja ich muss mich mittlerweile auch immer selbst kneifen das ich meinem Vorsatz für 2025 treu bleibe nie wieder komplett fertige Lösungen zu posten, weil das Niveau hier deutlich sinkt und die Menge an “hoffentlich schreibt mir einer ne fertige Lösung” zunimmt. Aber der Punkt gehört definitiv eher in die Rubrik “was nervt” oder wie der Thread hiess.

PS: wenn ich nicht letztens über einen Post eines @RobertoCravallo 's gestolpert wäre in der er genau das selbst beklagt, das Leute irgendwie nicht mehr gewillt sind selbst zu denken oder die KI bemühen, müsste ich jetzt nicht mal schmunzeln. :slight_smile:

1 „Gefällt mir“

@justone
Was du schreibst, stimmt so aber nicht, bzw. wo vergleicht er einen Timestamp mit einem String? Ich sehe nur String-Vergleiche.

@DeToX
Im obigen Code gibt es mehrere Fehler:

  1. die Verwendung der {{ }} ist an der Stelle nicht richtig
  2. in der ersten und dritten Zeile fehlt ein } am Ende, da steht nur ein %, müsste also %}
  3. das if hinter dem jeweiligen and ist dort falsch
  4. generell sollten nur ' oder " verwendet werden (könnte aber ein copy&paste Fehler sein (inzwischen durch @harryp berichtigt)

Hier noch der hoffentlich fehlerfreie Code:

{% if is_state('input_boolean.ha_schalter1', 'on') and  (as_timestamp(state_attr('sun.sun', 'next_rising')) + 1800) | timestamp_custom('%H:%M')  >  (as_timestamp('2025-02-15T07:00:00+00:00')) | timestamp_custom('%H:%M')  %}
Uhrzeit 1
{% elif is_state('input_boolean.ha_schalter1', 'on') and   (as_timestamp(state_attr('sun.sun', 'next_rising')) + 1800) | timestamp_custom('%H:%M')  <  (as_timestamp('2025-02-15T07:00:00+00:00')) | timestamp_custom('%H:%M')  %}
Uhrzeit 2
{% else %}
Ausgeschaltet
{% endif %}

Wo du Recht hast hast du Recht, unglücklich formuliert so zwischen mal schnell was getippt auf dem Weg zum Essen.
Ich hätte schreiben müssen das man Strings nicht mit < oder > vergleichen kann.

Denn was

{{ (as_timestamp(state_attr('sun.sun', 'next_rising')) + 1800) | timestamp_custom('%H:%M') }} > {{ (as_timestamp("2025-02-15T07:00:00+00:00")) | timestamp_custom('%H:%M') }}

als Ergebnis liefert ist halt das Hauptproblem mal abgesehen von den syntaxfehlern die sich in der Regel daraus ergeben das Leute 200 Zeichen lange Spaghetticodes basteln.

Aber du hast ja die Lösung gepostet ich hoffe nur für @DeTox das er es nicht nur kopiert sondern versucht zu verstehen warum es nicht ging.
Und klar kann man damit rechnen wenn man die }} {{ entfernt aber es ist trotzdem nicht sonderlich clever.

Und @DeTox, sowas ist mir früher auch genau so passiert, denn es ist ja logisch das 7:30 halt kleiner als 8:00 ist …das kann man ohne groß drüber nachzudenken im Kopf. Denkt man. Es ist aber gar nicht kleiner es ist nur früher. :slight_smile:

Kann man aber in diesem Fall :wink: Versuch es mal!

Guten Morgen,

vielen Dank für das ganze Feedback. Natürlich möchte ich auch die Lösung verstehen und künftig ohne Hilfe umsetzen. Mir hat das Thema aber nochmal deutlich gezeigt, dass ich noch am Anfang stehe und noch einiges lernen muss.

Die beiden Lösungen funktionieren grundsätzlich. Ich habe aber auch festgestellt, dass er nicht nur die Uhrzeit vergleicht, sondern auch das dahinterstehende Datum. Dementsprechend vergleicht er in meinem Beispiel immer den 15.02.2025. Ich habe das Problem aber mit einem Zeitpunkt Helfer gelöst. Die Kombination mit den Formeln sowie meinen Anpassungen funktionieren auf jeden Fall.

Danke nochmal für die Unterstützung.

PS: Ich persönlich finde die Lösung mit „set“ eleganter und werde meine künftigen Codes entsprechend aufbauen. Ich hoffe, dass sie dadurch kleiner und nachvollziehbarer werden :blush:

Wenn du das Datum nicht fest verdrahten möchtest, sondern immer den Timestamp “heute” 8:00 Uhr für den Vergleich nutzen möchtest, dann sollte dieses so möglich sein. (die Wandlung in den Uhrzeitstring benötigst du eigentlich nicht, da du die Timestamps direkt vergleichen könntest)

{% if is_state('input_boolean.ha_schalter1', 'on') and  (as_timestamp(state_attr('sun.sun', 'next_rising')) + 1800) | timestamp_custom('%H:%M')  >  (as_timestamp(now().replace(hour=8, minute=0, second=0, microsecond=0))) | timestamp_custom('%H:%M')  %}
Uhrzeit 1
{% elif is_state('input_boolean.ha_schalter1', 'on') and   (as_timestamp(state_attr('sun.sun', 'next_rising')) + 1800) | timestamp_custom('%H:%M')  <  (as_timestamp(now().replace(hour=8, minute=0, second=0, microsecond=0))) | timestamp_custom('%H:%M')  %}
Uhrzeit 2
{% else %}
Ausgeschaltet
{% endif %}

Die Idee (wie dein Vorschlag) hatte ich auch erst, jedoch ist hier das Problem, dass sich das Datum automatisch anpassen muss. Das habe ich mit einer Automation gemacht, welche das Datum automatisch bei Änderung von “sun.sun’, 'next_rising” ändert.

Wenn ich um 6 Uhr teste, vergleiche ich
22.02.2025 07:45 mit 22.02.2025 08:00 Uhr ← passt

Wenn ich um 9 Uhr teste, vergleiche ich
23.02.2025 07:45 (da nächster Sonnenaufgang) mit 22.02.2025 08:00 Uhr ← falsch

Du möchtest doch immer das aktuelle Datum, oder? Das macht das now eigentlich.

Meine grundsätzliche Automation ist, dass die Rollläden zum Sonnenaufgang aufgehen, jedoch frühstens 08:00 Uhr morgens.

Über das Template wollte ich mir eigentlich nur die entsprechende Zeit anzeigen lassen, wann die Automation startet.

Dementsprechend soll er auch den nächsten Sonnenaufgang (23.02.2025 / 07:45) mit der Zeit 8 Uhr vergleichen. Der 8 Uhr Zeitpunkt muss sich entsprechend am nächsten Sonnenaufgang anpassen.