Hi,
ich habe folgenden Helper
sensor.solarman_actual_grid_export_sum
(summe aus folgenden Variablen:
Ich brauche für eine Automatisierung den absoluten (Positiven) Wert der Einspeiseleistung.
Leider ist der Wert, wenn er aus meinem Wechselrichter positiv ausgegeben wird die Bezugsleistung.
Ich tippe darauf, dass ich das via Template (und dadurch als globale Variable) umsetzen muss oder?
LG
Benutze in einem Template den ‘abs’-Filter.
und wie stelle ich das an? Ich bin in der configuration.yaml.
Habe mir simons Anleitung angesehen: Home Assistant Template Sensoren & Hilfsentitäten (Helfer) 101
Am Beispiel
- name: "Strom-EG-aktuell"
unit_of_measurement: "W"
device_class: "power"
state_class: "measurement"
state: >
{{ state_attr('sensor.poweropti', 'Watt') }}
versuche ich nachzuvollziehen wie man die Variable dann aufruft. Das erschliesst sich mir irgendwie nicht.
Wo wird diese deklariert bzw. zugewiesen?
Einfach hinten anbauen.
{{ state_attr('sensor.poweropti', 'Watt') | abs }}
Und wie rufe ich diesen Wert dann auf? Unter dem gleichen Namen ?
In dem Beispiel “sensor.poweropti” ?
Du hast doch schon einen Sensor, der den richtigen Wert ausgibt, nur mit dem falschen Vorzeichen. Dann könnte dein Zusatzsensor in der Configuration.yaml so aussehen:
template:
- sensor:
- name: Solarman Einspeiseleistung absolut
unique_id: solarman_einspeiseleistung_absolut
state: >-
{{ float(states('solarman_actual_grid_export_sum')) | abs }}
Der müsste Deinen Wert dann positiv ausgeben. Falls die Einträge “template” oder “sensor” schon drinstehen, weil Du bereits Templates bzw. Sensoren angelegt hast, müssen die weg, und Du setzt den neuen Sensor einfach unter die vorhandenen.
Danke dir Heiko. Somit ist die Template-Funktion so zu verstehen, als dass man damit die variable überschreibt und global zur Verfügung stellt. Ähnlich des “this.” in Java?
Sehr gerne.
Überschrieben wird nichts. Der Template-Sensor wird als zusätzliche Entität mit neuem Namen eingerichtet und gibt im von mir beschrieben Fall einfach den Wert Deines Sensors noch einmal in einer neuen Form aus.
In Simons Beispiel geht es um einen Template-Sensor, der den Ausgabewert eines Attributes ausgibt, den eine Entität, in diesem Fall der Poweropti, nicht selbst als Sensor bereitstellt.
Danke dir. Ich hab das gleich mal mit If erweitert.
Schlussendlich möchte ich den Wert ja nur als Absolutwert haben wenn er negativ erscheint
template:
- sensor:
name: solarman_actual_grid_export_sum:
unique_id: solarman_einspeiseleistung_absolut
unit_of_measurement: "W"
{% set actual_grid_check = states('sensor.solarman_actual_grid_export_sum') |int %}
{% if actual_grid_check < 0.0 %}
value_template: "{{ (states('sensor.solarman_actual_grid_export_sum'))| int| abs }}"
{% endif %}
Nachtrag:
Hmm… spannende Erkentnis, in der Template-Sandbox bei Developer zeigt es keinen Fehler.
Kopiere ich folgenden Code in die configuration.yaml gibt es den angezeigten Fehler
# Absolute value of export to grid
template:
- sensor:
- name: solarman_actual_grid_export_sum
unique_id: solarman_einspeiseleistung_absolut
unit_of_measurement: "W"
{% set actual_grid_check = sensor.solarman_actual_grid_export_sum %}
{% if float('actual_grid_check') < 0.0 %}
value_template: "{{ float(states('sensor.solarman_actual_grid_export_sum'))| abs }}"
{% endif %}
Fehler →
missed comma between flow collection entries (24:8)
21 | unique_id: solarman_einspeiselei ...
22 | unit_of_measurement: "W"
23 |
24 | {% set actual_grid_check = senso ...
-------------^
25 |
by HarryP: Zusammenführung Doppelpost.
BOP
25. August 2023 um 14:55
11
Probiere es mal so:
template:
- sensor:
name: "solarman einspeiseleistung absolut"
unique_id: "solarman_einspeiseleistung_absolut"
unit_of_measurement: "W"
state: >-
{% set actual_grid_check = states('sensor.solarman_actual_grid_export_sum') |int %}
{% if actual_grid_check < 0 %}
{{ actual_grid_check | abs }}
{% endif %}
Ich habe aus 0.0 noch 0 gemacht, da du ja mit einem Integer vergleichst.
EDIT: Du solltest vielleicht noch einen Else Zweig definieren, bei dem du einen Wert setzt, wenn ein positiver Wert vom solarman kommt.
crypton
25. August 2023 um 15:17
12
So spannend ist die Erkenntnis ja nun nicht. Im Template-Bereich der Entwicklerwerkzeuge wird Jinja-Code interpretiert und entsprechend angezeigt. Der andere Content wird als reiner Text. Ib´n der Configuration.yaml muss man sich dann schon an die YAML/Sensor-Syntax halten.
Danke @BOP
ich musste noch den Doppelpunkt nach dem name rausnehmen dann gings.
(bad indentation of a mapping entry (20:44))
Nun aber noch eine ganz andere Frage - wie finde ich solarman_einspeiseleistung_absolut jetzt?
Unter developer-tools/state schonmal nicht
BOP
25. August 2023 um 16:52
14
Ich habe es oben noch einmal editiert! Hatte ich übersehen.
name: "solarman_actual_grid_export_sum"
unique_id: "solarman_einspeiseleistung_absolut"
Dann sollte es in den Entwicklerwerkzeugen auftauchen.
EDIT: Du hast den neuen Sensor ja genauso benannt, wie den alten! Der neue sollte schon einen eigenen Namen bekommen.
Also eher so:
name: "solarman einspeiseleistung absolut"
unique_id: "solarman_einspeiseleistung_absolut"
Das ist nun der gesamte Block.
HA neu gestartet aber der status ist unavailable…
template:
- sensor:
name: "solarman einspeiseleistung absolut"
unique_id: "solarman_einspeiseleistung_absolut"
unit_of_measurement: "W"
state: >-
{% set actual_grid_check = states('sensor.solarman_actual_grid_export_sum') |int %}
{% if actual_grid_check < 0 %}
{{ actual_grid_check | abs }}
{% else %}
solarman_einspeiseleistung_absolut = 0
{% endif %}
BOP
25. August 2023 um 18:38
16
Die null must du so zurückgeben:
{% else %}
0
{% endif %}
Und dann kopiere den gesamten Ausdruck (nach “state: >-”) mal in den Template-Editor der Entwicklerwerkzeuge und schaue dir an, ob der Ausdruck unter state auch funktioniert. Dort kannst du das schön testen.
1 „Gefällt mir“
Habe es eingefügt, scheint nicht zu klappen. zum Gegencheck habe ich die variable oberhalp eingefügt, dort sehe ich 14Watt, im if Konstrukt gibts ausschliesslich die 0 des Else.
actual_grid_export_value_template: "{{ (states('sensor.solarman_actual_grid_export_sum') | int) | abs }}"
# Absolute value of export to grid
template:
- sensor:
name: "solarman einspeiseleistung absolut"
unique_id: "solarman_einspeiseleistung_absolut"
unit_of_measurement: "W"
state: >-
{% set actual_grid_check = states('sensor.solarman_actual_grid_export_sum') |int %}
{% if actual_grid_check < 0 %}
{{ actual_grid_check | abs }}
{% else %}
0
{% endif %}
actual_grid_export_value_template: "15"
# Absolute value of export to grid
template:
- sensor:
name: "solarman einspeiseleistung absolut"
unique_id: "solarman_einspeiseleistung_absolut"
unit_of_measurement: "W"
state: >-
0
edit: okay stimmt nicht muss ja erstmal warten bis er negativ wird (also einspeist)
BOP
26. August 2023 um 07:11
18
Deswegen meine Empfehlung, es in dem Template-Editor zu testen. Dort kannst du ganz einfach mal eben die If-Bedingung ändern. Also aus dem “<” ein “>” machen.
Ja das hat geklappt! Habe das Vorzeichen gedreht und der Wert wird korrekt ausgegeben.
Was mich aber wundert ist, dass ich bei developer-tools/state immer unavailable vorfinde.
Aber der Wert ist korrekt