Kurzer trigger-Sensor code - Fehlersuche

Hallo,
ich habe Sensoren =zB sensor.tagesarbeitszahl), deren Werte sich über den Tag hinweg ändern. Ich bin nur am jeweils letzten Wert des Tages interessiert. Diese Tagesendwerte möchte ich mir in einem Balkendiagramm darstellen lassen.

Dafür habe ich einen Triggersensor erstellt, zB:

- trigger:
    - platform: time
      at: "23:59:59"
      sensor:
        - name: "tagesarbeitszahl_eod"
          state: >
             {% set x = states('sensor.tagesarbeitszahl') %}
             {{ x if has_value(x) else this.state | default(0, true) }}

Leider scheint es mit dem Code ein Problem zu geben, der Triggersensor wird nicht erstellt.

Kann jemand sagen, wo das Problem liegt?
Wenn ich den Code im Template-Editor einfüge, wird “this is undefined” zurückgegeben.

Danke

Dazu brauchst Du keinen extra Template Sensor erstellen.

Statistikdiagramm Karte tut es auch. :wink:
Jeweils der maximale Wert eines Tages.

Zum Template selbst.
Wenn sensor.tagesarbeitszahl eine Zahl zurück gibt, dann den Wert vom sensor.tagesarbeitszahl übernehmen, sonst 0.

{% set x = states('sensor.tagesarbeitszahl') %}
{{ iif(is_number(x), x, 0) }}

Oder auch einfach

{{ states('sensor.tagesarbeitszahl') | int(0) }}

Gruß
Osorkon

Hi Oskoron,

danke für die Vorschläge.
Ich möchte allerdings nicht den Maximalwert, sondern den letzten Wert eines Tages, da die Sensorwerte nicht kontinuierlich ansteigen.

Beim Template möchte ich, dass der Wert am Tagesende gespeichert wird, sofern es einen gibt. Falls nicht (unknown/unavailable), soll der letzte Wert gespeichert werden. 0 wäre nicht richtig.

Daher habe ich mich an diesem Code bedient. Leider funktioniert es nicht wie gewollt.

In deinem Code oben ist der Teil ab Sensor zu weit eingerückt. Müsste so aussehen:

- trigger:
    - platform: time
      at: "23:59:59"
  sensor:
    - name: "tagesarbeitszahl_eod"
      state: >
         {% set x = states('sensor.tagesarbeitszahl') %}
         {{ x if has_value(x) else this.state | default(0, true) }}

Dann so:

{% set x = states('sensor.tagesarbeitszahl') %}
{{ iif(is_number(x), x, this.state) }}

Oder so:


{% set x = states('tagesarbeitszahl') %}
{% if x == 'unavailable' or x == 'unknown' %}
  {{ this.state }}
{% else %}
  {{ x }}
{% endif %}

Gruß
Osorkon

Hi,
ich habe es noch nicht hinbekommen und würde dem Problem gerne auf den Grund gehen. Die Sensoren werden nicht mit Werten befüllt.

Kann ich den Code vorab ausprobieren? Ich nutze dafür bislang den Template Editor in den Developer tools, aber es erscheint noch immer “‘this’ is undefined”

Was heisst nicht mit Wert gefüllt? Ist der Status unbekannt?

In dem Fall hat der Sensor sensor.tagesarbeitszahl keinen numerischen Wert.
Und das Template

{% set x = states('sensor.tagesarbeitszahl') %}
{{ iif(is_number(x), x, this.state) }}

Kann den Wert this.state nicht ermitteln, da dieser noch nicht existiert.

In dem Fall gib dem Wert this.state einen default wert mit, z.B die 0

{% set x = states('sensor.tagesarbeitszahl') %}
{{ iif(is_number(x), x, this.state | int(0)) }}

Im Template Editor gibt es das Object This nicht, das this auf sich selbst referenziert. Also innerhalb des Template Sensors auf sich selbst.

Du kannst zu Testzwecken im Template Editor this.state durch einen festen Wert ersetzen, z.B.

{{ is_number(states('sensor.tagesarbeitszahl')) }}

{% set x = states('sensor.tagesarbeitszahl') %}
{{ iif(is_number(x), x, 10) }}

Habe grad bemerkt, dass sich in meinen 2ten Code ein Fehlerteufel eingeschlichen hat, da fehlt das Wörtchen sensor im Template.
Kann ich aber leider nicht mehr korrigieren.
Muss lauten:

{% set x = states('sensor.tagesarbeitszahl') %}
{% if x == 'unavailable' or x == 'unknown' %}
  {{ this.state | int(0) }}
{% else %}
  {{ x }}
{% endif %}

Gruß
Osorkon

es werden jetzt Werte angezeigt. Wenn der Sensor sensor.tagesarbeitszahl einen numerischen Wert hat, funktioniert der Trigger Sensor. Dann wird der aktuelle Wert übernommen.
Wenn sensor.tagesarbeitszahl aber “unavailable” ist, wird dem Triggersensor ein falscher Wert zugewiesen (5.0).

Graph tagesarbeitszahl:
bsp

Graph Triggersensor:
bsp2

Code von sensor.tagesarbeitszahl:

- sensor:
    - name: tagesarbeitszahl
      unique_id: "tagesarbeitszahl"
      state_class: "measurement"
      state: >-
          {{ (states('sensor.wp_taegliche_energieabgabe')|float / states('sensor.wp_taegliche_energieaufnahme')|float) | round(2) }}
      availability: >-
        {% if is_state('sensor.eu13l_hp1_inverter_power_consumption', '0') %}
            False
          {% else %}
            True
          {% endif %}

Code vom triggersensor:

- trigger:
    - platform: time
      at: "15:10:59"
  sensor:
    - name: "tagesarbeitszahl_ww_heiz_final"
      state_class: "measurement"
      state: >
          {% set x = states('sensor.tagesarbeitszahl') %}
          {% if x == 'unavailable' or x == 'unknown' %}
            {{ this.state | int(0) }}
          {% else %}
            {{ x }}
          {% endif %}

Wenn es sich um eine Gleitkommazahl handelt, dann muss Du auch eine Gleitkommazahl verwenden.
Also

{{ this.state | float(0) }}

Interger (int) ist ja eine Ganzzahl, da wird dann aus 5,88 eine 5.

Gruß
Osorkon

mhh, leider ist der Sensorwert einen Tag später noch immer auf 5 (trotz float).
Hast du noch eine Idee?

- trigger:
    - platform: time
      at: "23:59:59"
  sensor:
    - name: "tagesarbeitszahl_ww_heiz_final"
      state_class: "measurement"
      state: >
          {% set x = states('sensor.tagesarbeitszahl') %}
          {% if x == 'unavailable' or x == 'unknown' %}
            {{ this.state | float(0) }}
          {% else %}
            {{ x }}
          {% endif %}

Welchen Wert hatte den dieser um 23:59?
Wenn er zu diesem Zeitpunkt nicht verfügbar war, bleibt der Wert von 5 ja erstmal stehen.

Gruß
Osorkon

Danke für deine Geduld.
sensor.tagesarbeitszahl war um Mitternacht nicht verfügbar, sein letzter numerischer Wert war 5,87. Damit sollte dieser Wert beim Triggersensor angezeigt werden oder nicht?

Du fragst den Zustand aber nur um 23:59 ab.
Wenn zu diesem Zeitpunkt der Sensor sensor.tagesarbeitszahl nicht verfügbar ist, wird der eigene Wert vom Sensor sensor. tagesarbeitszahl_ww_heiz_final übernommen. Und zu diesem Zeitpunkt betrug dieser 5, oder nicht?

Wenn Du den letzten gültigen Wert haben möchtest, und nicht zum Zeitpunkt 23:59, musst Du den Template sensor anders aufbauen. Als Trigger nicht die Uhrzeit, sondern den Zustand vom Sensor sensor.tagesarbeitszahl

Gruß
Osorkon

ja du hast Recht. Ich hatte das Konzept von “this” noch nicht verstanden.

Ich habe deinen Rat befolgt und den Zustand des sensors.tagesarneitszahl zu Grunde gelegt:

Zuerst habe ich einen input_number-Helfer erstellt (input_number.tagesarbeitszahl_tracker).
In einer Automation weise ich diesem Helfer den aktuellen Wert von Sensor.tagesarbeitszahl zu, sofern letzterer numerisch ist. Falls nicht, behält er seinen alten Wert:

alias: current_tagesarbeitszahl
description: ""
trigger:
  - platform: state
    entity_id:
      - sensor.tagesarbeitszahl
action:
  - action: input_number.set_value
    metadata: {}
    data:
      value: |-
        {% if is_number(states('sensor.tagesarbeitszahl')) %}
          {{ states('sensor.tagesarbeitszahl')|float }}
        {% else %}
          {{ states('input_number.tagesarbeitszahl_tracker')|float }}
        {% endif %}
    target:
      entity_id: input_number.tagesarbeitszahl_tracker
mode: single

Um 23:59:59 Uhr wird dann getriggert, um den letzten Wert des Tages aufzuzeichnen:

- trigger:
  - platform: time
    at: "23:59:59"
sensor:
  - name: "tagesarbeitszahl_ww_heiz_final"
    state_class: "measurement"
    state: >
      {{ states('input_number.tagesarbeitszahl_tracker')|float }}

In Tests hat das funktioniert, aber es erscheint mir ziemlich/unnötig (?) kompliziert?

Nachtrag:
noch eine kleine Nachfrage zur Visualisierung.
Mein derzeitiger sensor.tagesarbeitszahl_ww_heiz_final bekommt seinen finalen Wert am Ende eines Tages zugewiesen. Dieser Wert bleibt ihm konstant bis zum Ende des nächsten Tages zugewiesen, bevor er aktualisiert wird.
Ich hatte mit einer Statistics Graph Card ein Balkendiagramm erstellen (Period: Day).
Das Problem ist jetzt aber, dass der Wert von 23:59:59 Uhr von Tag 2 auch im Balkendiagramm für Tag 2 angezeigt werden soll. Mit meinem Setup nähme der Sensor an Tag 2 aber die fast komplette Zeit über den Wert von Tag 1 an (bis 23:59:58). Im Balkendiagramm (mean) würde man dann den Wert vom Vortag sehen.

Gibt es dafür eine Lösung?

:crayon:by HarryP: Zusammenführung Doppelpost (bitte “bearbeiten” Funktion nutzen)