Hilfe Atribute Template Sensor

Moinsen der erste Part ist in meinen Augen abgeschlossen. Wenn interresse daran besteht es nachzubauen. Bin ich gerne bereit ein How to zu schreiben.
Vielen Dank an alle die geholfen haben.
1648974599271.png
 
Nun zu Part 2.🤣

In der Vergagenheit war es so. Das Gerät auf dem Kodi und TV-Headend läuft wird heruntergefahren wenn der Fernseher ausgeschaltet wird. Ebendso fährt das Gerät wieder hoch wenn wir den Fernseher einschalten. Nun möchte ich das vorm ausschalten geprüft wird ob auch noch eine Aufnahme läuft. Erst wenn der Fernseher aus ist und nicht mehr aufgenommen wird soll das Gerät heruntergefahren werden. Auch soll 5 Minuten bevor eine Aufnahme gestartet werden soll das Gerät gestartet werden.
Ich habe mir schon 2 Template Sensoren angelegt. In der einen wird von der Startzeit - 5 Minuten gerechnet, von der zweiten Berechnen wir die Endzeit mithilfe von airdate + runtime + 5 Minuten. Das klappt sowei auch. Ich glaube ich könnte mit hilfe eines Hilfe-Schalters zum ziel kommen. Halte das vorgehen aber eher für Kombliziert.

Gibt es eine alternative wie ich den Werte Startzeit nach Date-Time und vor Endzeit liegt.
 
Gerät auf dem Kodi und TV-Headend läuft wird heruntergefahren wenn der Fernseher ausgeschaltet wird
Ist das dann nicht eher eine Sache des Gerätes selbst? Stichwort dazu wäre wohl CEC (kann damit jetzt aber auch voll daneben liegen 😅) Also für mich hört sich das in erster Linie so an, als müsste man Kodi/TV-Headend (hab ich von allem keine Ahnung) sagen, dass er die CEC-Anweisung ignorieren soll (bzw. erst später ausführen soll), solange noch eine Aufnahme läuft. Hat in meinen Augen jetzt erstmal nicht so wirklich was mit HA zu tun. Problem ist dabei vermutlich: Wenn man die Anweisung des Ausschaltens via CEC ignoriert - wie kriegt man dann später den Fernseher dazu sich auszuschalten? Also jetzt mal abgesehen von Dingen wie einer schaltbaren Steckdose oder so... Ich vermute mal, dass Du das TV-Gerät selbst nicht direkt in HA integriert hast, oder? Das wäre noch eine Möglichkeit die mir dazu einfallen würde, ansonsten seh ich da eher schwarz bei der Thematik.

EDIT: Immer dran denken: Ich hab keine Ahnung von dem Kram und kann nur - für mich logische - Dinge von mir geben. Vielleicht kann ja jemand anders noch DIE Lösung aus der Mütze zaubern, wer weiss 😁
 
Doch HA erkennt mit einen Ping das das TV-Gerät Eingeschaltet oder Ausgeschaftet ist. Mit einem Command-Line Komando wird Kodi/TV-Headend runtergefahren. Sobald das 30 sec nicht mehr im Netztwerk ist wird die Steckdose ausgeschaltet. Schaltet man den Fernseher ein, wird auch die Steckdeose für Kose/TV-Headend eingeschaltet.

Nur muss da jetzt noch eine Überprüfung rein der Kodi/TV-Headend nicht runterfährt solange eine Aufnahme läuft.
Und diese auch wieder einschaltet bevor eine Aufnahme startet. Ich glaube schon das man es mit HA zum laufen bekommt.
 
Ok, also CEC deaktivieren (aber ich glaub, dann kann man die Fernbedienung des TV auch nicht mehr für Kodi nutzen?) bzw. Kodi sagen, dass erstmal nicht heruntergefahren wird, wenn der TV ausgeschaltet wird. Dann in regelmässigen Intervallen via HA prüfen, ob der TV an ist (ping-check) und wenn der TV aus ist + keine Aufnahme läuft, dann auch Kodi/TV-Headend herunterfahren. Wenn das mit dem einschalten kein Ding ist, dann dürfte es da auch kein Problem mitgeben. Finde nur die CEC-Abschaltung nicht so dolle, aber ggf. kann man das ja auch irgendwo konfigurieren, dass auf eine Abschaltung in diesem Sinne erstmal nicht reagiert wird.

Wenn das Ding wieder hochfahren soll (bzw. Steckdose geschaltet wird), bevor eine neue Aufnahme startet, müsstest Du Dich wohl an den Zeitangaben der Aufnahme-Termine orientieren und vermutlich irgendwas in die Richtung angeben: Steckdose einschalten um "<Film-Startzeit> -5 Minuten". Wobei das auch ein wenig kurz gedacht ist, vermutlich eher etwas in die Richtung: "WENN Steckdose aus UND nächste Aufnahme-Startzeit <= 5 Minuten DANN Steckdose einschalten".
 
Wenn das Ding wieder hochfahren soll (bzw. Steckdose geschaltet wird), bevor eine neue Aufnahme startet, müsstest Du Dich wohl an den Zeitangaben der Aufnahme-Termine orientieren und vermutlich irgendwas in die Richtung angeben: Steckdose einschalten um "<Film-Startzeit> -5 Minuten". Wobei das auch ein wenig kurz gedacht ist, vermutlich eher etwas in die Richtung: "WENN Steckdose aus UND nächste Aufnahme-Startzeit <= 5 Minuten DANN Steckdose einschalten".
Ja so habe ich es auch gedacht. Ich habe zwar kein plan was CEC ist da die Fernbedienung des TV nicht für Kodi genutzt wird. Ist das wenn ich es bisher richrig verstanden habe auch egal.
 
Ah okay, wenn es eh nicht genutzt wird, dann ist es eigentlich auch egal 😁 Zur Erklärung noch kurz ein Link: https://de.wikipedia.org/wiki/Consumer_Electronics_Control

Ich würde halt einfach mal schauen, dass man über die Dev-Tools ein wenig testet (nächste Aufnahmezeit herausfinden und "-X Minuten" darauf anwenden), bis man das gewünschte Ergebnis (Aufnahmezeit -5 Minuten) auch korrekt angegeben bekommt. Wenn Du das hast, dürfte der Rest ja theoretisch ein Spaziergang werden ☺️
 
Ich habe bei der Automation die Möglichkeit gefunden das man einen Auslöser als Tamplate anlegt.
1649059372858.png
Kann man sowas anlegen wie time = Startzeit dann schalte die Steckdose an, wenn der Fernseher aus ist. Bzw. time = Endzeit fahre das Gerät runter und schalte Steckdose aus, wenn der Ferseher aus ist. Es geht bei der Frage nur um die Umsetzung die Zeiten zu vergleichen. Alles andere habe ich schon hinbekommen und Funktioniert.
 
Naja, wenn Du die Zeiten ausgeben kannst, wirst Du sie auch vergleichen können. Wirst das aber wohl erstmal alles richtig durchformatieren müssen (denke ich). Es ist ja nicht "nur" die Zeit, sondern ggf. auch das Datum. Ich an Deiner Stelle würde wohl erstmal zusehen, dass ich irgendwas verwertbares in die Hand bekomme. Irgendwas in Richtung "ISO 8601" z.B., oder halt ganz einfach und banal "Datum" + "Zeit". Prinzipiell geht es ja nur um einen "vergleichbaren" Aufbau.

Könntest mal schauen, was Dir Deine HA-Installation so ausgibt, wenn Du mal einfach nach der Zeit fragst (https://www.home-assistant.io/integrations/time_date/).

Eine andere Zeitangabe (von den Aufnahmen) hast Du ja schon:
{{ as_timestamp(entry.airdate) | timestamp_custom("%A, den %d.%m.%Y um %H:%M") }}

Wäre halt die Frage, ob es funktioniert, wenn man daran "rumrechnet" (davon hab ich nämlich keine Ahnung). Also kurzum: Irgendwas in die Richtung "entry.airdate -5M" oder so (Also Aufnahmezeit z.B. 20:15 Uhr -5 Minuten = Steckdose an um 20:10 Uhr).

So wie ich das grade gesehen habe, kann man Sekunden wohl einfach so daher nehmen. Dann wäre es wohl ein:

{{ as_timestamp(entry.airdate) - 300 }}

Probier das einfach mal in den Dev-Tools aus und schau, was dabei rum kommt... könnte klappen, muss aber nicht 😅 Testhalber würde ich es auch mal mit dem hier versuchen:

{{ as_timestamp(entry.airdate) - 5M }}

Darauf achten, dass das "M" auch groß geschrieben wird ("Minuten"), ist es ein kleines "m", steht es für "Monate").

Allerdings habe ich jetzt auch keine Ahnung, was genau das bei Dir angibt... ist das die "nächste" Aufnahme die laufen soll, oder gibt es direkt mehrere Ausgaben? Hab das alles nicht mehr so auf dem Schirm und mit Programmierung hab ich eigentlich auch nix zu tun 😇 Du wirst aber sicherlich wissen, wie ich das meine und ob nun "airdate" richtig ist, oder irgendwas anderes, weisst Du sicherlich besser als ich, von daher kann ich erstmal nur sagen: ausprobieren!

Wenn das alles läuft, kommt sowieso "eine" Zeitangabe raus (Start -5M) und zu dieser (variablen) "Zeit" wird das Gerät dann zwecks Aufnahme eingeschaltet. So wäre zumindestens mein Verständnis der Dinge (so mit ohne Ahnung halt 😁).
 
Ich habe mir zwei Template-Sensoren angelegt.
Code:
- platform: template
  sensors:
    rec_startzeit:
      value_template: >-
        {% set new_data = state_attr('sensor.rec', 'data')|from_json %}
        {{ as_timestamp(new_data[1].airdate) | float - 5 }}
      friendly_name: Aufnahme Startzeit
    rec_endzeit:
      value_template: >-
        {% set new_data = state_attr('sensor.rec', 'data')|from_json %}
        {{ as_timestamp(new_data[1].airdate) | float + new_data[1].runtime | float + 5 }}
      friendly_name: Aufnahme Endzeit

Rein Theoretisch wird hier auch richtig gerechnet. Nur wird mir als Zustand nur eine Zahl geliefert.
1649069602669.png
Sehe ich es richtig das ich diese Zahl erstmal ins richtige Format bekommen muss, bevor ich mit den vergleichen beginne?
Bei Excel zum Beispiel ist es vollkommen egal wie die Zahlen formatiert werden. Es wird denoch korrekt gerechnet.
 
Einmal kurz zum Zeitvergleich (nach Anlage des von @blurrrr verlinkten Sensors in der configuration.yaml):
Code:
{% set target_timestamp = as_timestamp("2022-04-04T12:56:00") %}
{% set current_timestamp = as_timestamp(states('sensor.date_time_iso')) %}
{% if current_timestamp >= target_timestamp - 300 and current_timestamp <= target_timestamp %}
{{ "Zielzeit ist in weniger als 5 Minuten erreicht." }}
{% elif current_timestamp > target_timestamp %}
{{ "Zielzeit ist überschritten." }}
{% else %}
{{ "Zielzeit ist noch länger hin." }}
{% endif %}
Vielleicht hilft das etwas weiter - die oberste Zeile dann natürlich mit dem entsprechenden Wert ersetzen, das ist aktuell für manuelles austesten.
 
Sehe ich es richtig das ich diese Zahl erstmal ins richtige Format bekommen muss, bevor ich mit den vergleichen beginne?
Bei Excel zum Beispiel ist es vollkommen egal wie die Zahlen formatiert werden. Es wird denoch korrekt gerechnet.
Ja, das ist in der Programmierung immer so. Manche Sprachen sind gnädig und rechnen beispielsweise "5" + 5 (String, Zahl) miteinander, andere nicht - HA scheint zu letzteen zu gehören.

Was bei Deiner Rechnung noch auffällt - Timestamp ist immer in Sekunden, während die runtime offensichtlich in Minuten angezeigt wird. Die müsstest Du also noch in Sekunden umrechnen. Das wäre dann also airdate als Timestamp + runtime * 60 = Timestamp vom Ende der Aufnahme.

Ergänzend:
Code:
{% set runtime = 1 %}
{% set target_timestamp_start = as_timestamp("2022-04-04T13:34:00") %}
{% set target_timestamp_end = target_timestamp_start + runtime * 60 %}
{% set current_timestamp = as_timestamp(states('sensor.date_time_iso')) %}
{% if current_timestamp >= target_timestamp_start - 300 and current_timestamp < target_timestamp_start %}
{{ "Startzeit ist in weniger als 5 Minuten erreicht." }}
{% elif current_timestamp >= target_timestamp_start and current_timestamp <= target_timestamp_end %}
{{ "Innerhalb der Aufnahme." }}
{% else %}
{{ "Aufnahme vorbei." }}
{% endif %}
Die Variablen runtime und target_timestamp_start dann eben mit new_data[1].runtime und new_data[1].airdate befüllen.
 
Zuletzt bearbeitet:
Uuund nochmal als Sensor nun aber auch genug herumgespielt, sonst lern ich noch HA 🤪
YAML:
  - platform: template
    sensors:
      recording:
        value_template: >-
          {% set runtime = 15 %}
          {% set target_timestamp_start = as_timestamp("2022-04-04T14:35:00") %}
          {% set target_timestamp_end = target_timestamp_start + runtime * 60 %}
          {% set current_timestamp = as_timestamp(now()) %}
          {% if current_timestamp >= target_timestamp_start and current_timestamp <= target_timestamp_end %}
          {{ true }}
          {% else %}
          {{ false }}
          {% endif %}
        friendly_name: Aufnahme aktiv
Wie Du siehst, es geht sogar ohne den zusätzlichen Sensor, now() ergibt das aktuelle Datum.
 
Solange Aufnahmen geplant sind klappt es ganz gut. Sobald keine mehr geplant sind. Taucht hier
UndefinedError: list object has no element 1
auf. Ich habe gedacht dann nimmst du in der IF Abfrage mit rein das er den Count prüfen soll. Das hat aber auch nicht zum richtigen ergebnis geführt.
Ich vermute das die Abfrage also schon deutlich früher abgebrochen wird.
- platform: template
sensors:
rec_aktiv:
value_template: >-
{% set new_data = state_attr('sensor.rec', 'data')|from_json %}
{% set runtime = new_data[1].runtime %}
{% set target_timestamp_start = as_timestamp(new_data[1].airdate) %}
{% set target_timestamp_end = target_timestamp_start + runtime * 60 %}
{% set current_timestamp = as_timestamp(now()) %}
{% if states.sensor.rec >= 1 and current_timestamp >= target_timestamp_start -300 and current_timestamp <= target_timestamp_end %}
{{ true }}
{% else %}
{{ false }}
{% endif %}
friendly_name: Aufnahme aktiv
 
Ich vermute das die Abfrage also schon deutlich früher abgebrochen wird.
Vermutlich an der Stelle, wo auf new_data[1] erstmalig zugegriffen wird, sprich, man müsste vorher abfragen. Soweit ich es reproduzieren kann muss zunächst state_attr('sensor.rec', 'data') geprüft werden, weil der Versuch es mit |from_json zu behandeln schon die Meldung verfälscht (deshalb die temporäre Variable) - kann aber auch sein dass es bei Dir anders aussieht, da der Sensor bei Dir ja vorhanden ist und nur ggf. keine Werte enthält. Bei mir funktioniert es so:
YAML:
  - platform: template
    sensors:
      rec_aktiv:
        value_template: >-
          {% set temp_data = state_attr('sensor.rec', 'data') %}
          {% if temp_data is not none %}
            {% set new_data = temp_data|from_json %}
            {% set runtime = new_data[1].runtime %}
            {% set target_timestamp_start = as_timestamp(new_data[1].airdate) %}
            {% set target_timestamp_end = target_timestamp_start + runtime * 60 %}
            {% set current_timestamp = as_timestamp(now()) %}
            {% if states.sensor.rec >= 1 and current_timestamp >= target_timestamp_start -300 and current_timestamp <= target_timestamp_end %}
            {{ true }}
            {% else %}
            {{ false }}
            {% endif %}
          {% else %}
          {{ false }}
          {% endif %}
        friendly_name: Aufnahme aktiv
Wenn das bei Dir nicht funktioniert, versuch es mal mit is_defined oder auf leeren String prüfen. Kannst auch schauen, ob bei Dir die Zwischenspeicherung in der temporären Variable wirklich nötig ist.
 
Das hat leider nicht zum Ziel geführt.
UndefinedError: list object has no element 1

Das verstehe ich nicht sollte es nicht so sein das bei einer IF-Abfrage geprüft wird ob die Abfrage wahr oder unwahr ist.
Ist es Wahr sollen die nachfolgenden Zeilen abgearbeitet werden. Es schaut aber so aus als ob er dennoch die Zeilen abarbeitet.

Na klar data ist ja auch nicht lehr dort steht Standartmässig ja immer was drin.
1649158746838.png
 
Leider auch nicht.
Code:
{% if temp_data[1] is defined %}
oder
Code:
{% if temp_data[1] is not none %}

ergibt
UndefinedError: list object has no element 1
 
Nein, das geht so auch nicht - bei temp_data wurde from_json noch nicht angewendet, also nichts zum auf die Art ansprechen anwesend :) da aber immer irgendwelche Daten vorhanden sind brauchen wir die temporäre Variable doch nicht.
YAML:
  - platform: template
    sensors:
      rec_aktiv:
        value_template: >-
          {% set new_data = state_attr('sensor.rec', 'data')|from_json %}
          {% if new_data[1] is defined %}
            {% set runtime = new_data[1].runtime %}
            {% set target_timestamp_start = as_timestamp(new_data[1].airdate) %}
            {% set target_timestamp_end = target_timestamp_start + runtime * 60 %}
            {% set current_timestamp = as_timestamp(now()) %}
            {% if states.sensor.rec >= 1 and current_timestamp >= target_timestamp_start -300 and current_timestamp <= target_timestamp_end %}
            {{ true }}
            {% else %}
            {{ false }}
            {% endif %}
          {% else %}
          {{ false }}
          {% endif %}
        friendly_name: Aufnahme aktiv
 

Zurzeit aktive Besucher

Letzte Anleitungen

Statistik des Forums

Themen
4.519
Beiträge
46.338
Mitglieder
4.149
Neuestes Mitglied
Kolloge
Zurück
Oben