Temporärer Sensor in permanenten Sensor schreiben

Bereich rings rum zum Thema Yaml und seine Tücken.


Antworten
Alterchen
Beiträge: 15
Registriert: Mo 8. Jan 2024, 19:28
Has thanked: 5 times
Been thanked: 1 time

Temporärer Sensor in permanenten Sensor schreiben

Beitrag von Alterchen »

Hallo zusammen :)

Ich betreibe ein Balkonkraftwerk mit Hoymiles Wechselrichter und OpenDTU. Die Sensoren kommen per Mqtt und Mosquitto ins HA und die Influxdb.
Das Problem ist, dass diese Sensoren nur verfügbar sind wenn der Wechselrichter und OpenDTU laufen. Beide schalten sich nachts aus.

Für die Power-Sensoren AC, DC1 und DC2 habe ich mir aus anderen Sensoren diese zusammengestöpselt, z.B. AC-Power:

Code: Alles auswählen

- name: "BKW Power"
  unique_id: bkw_power
  device_class: power
  state_class: measurement
  unit_of_measurement: W
  state: >
      {% if is_number(states('sensor.hoy1_power')) and states('sensor.hoy1_power') | float(0) > 0 %}
          {{ states('sensor.hoy1_power') | round (3) }}
      {% else %}
          {{ (states ('0.0') | float (0)) | round(3) }}
      {% endif %}

Funktioniert (geht das noch eleganter?)
Mein Problem sind die Sensoren hoy1_yieldday, _yieldtotal und _temperature. Als Lösungen sind meine Überlegungen
Riemann Summenintegralsensor (nur sehr ungern, da schon im Hoymiles vorhanden)
Den letzten Wert >0 aus der Influxdb holen und anzeigen (absolut keine Ahnung, wie)
Oder den letzten gültigen Wert einer Variablen zuweisen und die ausgeben (hätte ich gerne so, aber meine Kenntnisse in Yaml = fast 0)
Gibt es überhaupt Variablen in Yaml und wenn, kann man die in Sensoren verwenden? Ich hoffe, mir kann da jemand auf die Sprünge helfen :oops:

Viele Grüße
Alterchen

Benutzeravatar
Osorkon
Administrator
Beiträge: 1951
Registriert: Sa 17. Jul 2021, 16:53
2
Wohnort: Langenargen
Has thanked: 61 times
Been thanked: 530 times
Kontaktdaten:

Re: Temporärer Sensor in permanenten Sensor schreiben

Beitrag von Osorkon »

Alterchen hat geschrieben: Mi 10. Jan 2024, 16:23

Funktioniert (geht das noch eleganter?)

Was heißt eleganter? Es geht jedenfalls kürzer. :D

Code: Alles auswählen

  state: |
    {% set power = states('sensor.hoy1_power') | float(0) | round(3)%}
    {{ iif( power > 0, power, 0, 0) }}

Wenn Du mehrmals die gleiche Entität im Template verwenden tust, bietet es sich an, einen variable zu definieren und mit dieser dann im Template zu verwenden.
Mit IMMEDIATE IF (IIF) kannst Du auch ein paar Zeilen sparen.

Syntax: iif(condition, if_true, if_false, if_none)

Alterchen hat geschrieben: Mi 10. Jan 2024, 16:23

Mein Problem sind die Sensoren hoy1_yieldday, _yieldtotal und _temperature.

Verstehe ich dich richtig?
Du möchtest einen Template Sensor erstellen, welcher den Wert des echten Sensors repräsentiert. Jedoch wenn der echte Sensor nicht verfügbar ist, soll der Template Sensor den letzen bekannten Wert des echten Sensors anzeigen?

Gruß
Osorkon

Einer muss ja für Ordnung sorgen. :D
Alterchen
Beiträge: 15
Registriert: Mo 8. Jan 2024, 19:28
Has thanked: 5 times
Been thanked: 1 time

Re: Temporärer Sensor in permanenten Sensor schreiben

Beitrag von Alterchen »

Was heißt eleganter? Es geht jedenfalls kürzer. :D

Das sieht für mich sehr viel eleganter aus und beantwortet gleichzeitig meine Frage, ob es Variablen in Yaml gibt :) Vielen Dank!

Verstehe ich dich richtig?
Du möchtest einen Template Sensor erstellen, welcher den Wert des echten Sensors repräsentiert. Jedoch wenn der echte Sensor nicht verfügbar ist, soll der Template Sensor den letzen bekannten Wert des echten Sensors anzeigen?

Genau das möchte ich, und wenn der echte Sensor morgens wieder verfügbar ist, den echten Sensorwert wieder anzeigen. Funktionieren dann auch noch Zähler-Helfer, z.B. für Monats- und Jahresauswertungen mit diesem neuen Sensor?

Viele Grüße
Alterchen

Benutzeravatar
Osorkon
Administrator
Beiträge: 1951
Registriert: Sa 17. Jul 2021, 16:53
2
Wohnort: Langenargen
Has thanked: 61 times
Been thanked: 530 times
Kontaktdaten:

Re: Temporärer Sensor in permanenten Sensor schreiben

Beitrag von Osorkon »

Im Prinzip ist es ein einfacher Template Sensor. Dieser nimmt den Wert des echten Sensors an, solange dieser verfügbar ist. Sobald dieser nicht verfügbar ist, nimmt der Template Sensor den Wert von sich selbst. Also den Wert des echten Sensors, solange dieser noch verfügbar war.
Theoretisch ginge das mit einem einfachen Sensor. Leider hat dieser den Nachteil, dass dieser einen Home Assistant Neustart nicht überlebt. Oder besser gesagt. Sollte HA einen Neustart durchführen so lange der original Sensor nicht verfügbar ist. Erhält der Template Sensor den Wert „Unbekannt“
Aber es gibt eine Alternative, den Trigger based Template Sensor, dieser hat die Eigenschaft, dass er den letzten Wert nach HA Neustart beibehält.
Als Trigger nehmen wir den Zustand des echten Sensors. Sobald dieser sich ändert, soll der Template Sensor dessen Wert übernehmen. Wechselt der echte Sensor zu „nicht Verfügbar“ soll der Template Sensor seinen letzten Wert beibehalten.
So viel zur Theorie, hier mal ein Tempelte Sensor auf Basis des Sensors "sensor.hoy1_yieldday"
Auszug aus der template.yaml

Code: Alles auswählen

'#template.yaml
- trigger:
    - platform: state
      entity_id:
        - sensor.hoy1_yieldday"
  sensor:
    - name: Das ist mein neuer Sensor
      unique_id: 3e3b9c21-a0da-4b42-8860-fea475e052cb
      state: |
        {{ iif(is_state('sensor.hoy1_yieldday", 'unavailable'), states('sensor.das_ist_mein_neuer_sensor'), states('sensor.hoy1_yieldday"')) }}
      state_class: measurement
      device_class: energy
      unit_of_measurement: "kWh"

Allerdings bin ich mir nicht sicher welchen Wert der Sensor "sensor.hoy1_yieldday" repräsentiert.
Deshalb musst Du ggf. state_class, device:class und unit_of_measurement noch anpassen.

Gruß
Osorkon

Einer muss ja für Ordnung sorgen. :D
Alterchen
Beiträge: 15
Registriert: Mo 8. Jan 2024, 19:28
Has thanked: 5 times
Been thanked: 1 time

Re: Temporärer Sensor in permanenten Sensor schreiben

Beitrag von Alterchen »

Vielen Dank Osorkon!

Nachdem ich zwei kleine Fehler lt. Log (state_class: musste in total, und das " hinter sensor.hoy1_yieldday entfernt werden) beseitigt hatte, funktionieren die beiden neu erstellten Sensoren ganz fantastisch. Die überleben auch einen HA Neustart :!:

Hier noch meine angepasste Version, für alle, die es vielleicht brauchen können:

Code: Alles auswählen

  - trigger:
    - platform: state
      entity_id:
        - sensor.hoy1_yieldday
        - sensor.hoy1_yieldtotal
  - sensor:
    - name: "BKW heute"
      unique_id: bkw_heute
      state_class: total_increasing
      device_class: energy
      unit_of_measurement: "Wh"
      state: |
          {{ iif(is_state('sensor.hoy1_yieldday', 'unavailable'), states('sensor.bkw_heute'), states('sensor.hoy1_yieldday')) }}
    - name: "BKW total"
      unique_id: bkw_total
      state_class: total
      device_class: energy
      unit_of_measurement: "kWh"
      state: |
          {{ iif(is_state('sensor.hoy1_yieldtotal', 'unavailable'), states('sensor.bkw_total'), states('sensor.hoy1_yieldtotal')) }}

Nochmals vielen Dank für die Hilfe :D

Viele Grüße
Alterchen

Antworten