Wie Helfer Template mit Variablen erstellen?

Moinsen

Ich habe mir einen Helfer/Tamplate gebastelt, der mir den Füllstand meiner Zisterne in Liter umrechnet.

{{ 10**2 * 22 * ( acos(( 10 - ((float(states('sensor.zisterne_shellyuni_adc'))) / 0.5 ) ) / 10 ) - ( 10 - ((float(states('sensor.zisterne_shellyuni_adc'))) / 0.5 ) ) * sqrt( 2 * 10 * ((float(states('sensor.zisterne_shellyuni_adc'))) / 0.5 ) - ((float(states('sensor.zisterne_shellyuni_adc'))) / 0.5 )**2 ) / 10**2 ) }}

Hierbei steht die 10 jeweils für den Radius in dm und die 22 für die Zisternenlänge.
Da die Maße aber nur die Abmessungen Außen sind und die Zisterne nicht glatt ist, will ich die gerechneten Ergebnisse, durch anpassen der Maße, mit der Ausliterungstabelle des Herstellers abgleichen.

Damit ich nicht 1000mal in der Formel rumfuschen muss, würde ich gerne den Radius und die Länge durch Variablen ersetzen, die ich dann anpassen kann.

Wie würde das in einem Helfer aussehen?

Ich hab das zwar gebastelt aber echt keine Ahnung.


{% set a = states('input_number.xyz1') | float(0) %}
{% set b = states('input_number.xyz2') | float(0) %}
{{ 10**2 * a * ( acos(( b ...... }}

Wenn Du mal in den Template Editor rein schaust, da gibt es auch ein paar nützliche Bsp. :wink:

Gruß
Osorkon

1 „Gefällt mir“

Besten Dank

Das ich keinen Plan habe war kein Scherz. :wink:

Ich bastele seit heute früh zum ersten mal mit dem Editor und seh den Walt vor lauter Bäumen nicht. Ich hab auch nur gaaanz entferntes Wissen von Programmierung und von Yaml hab ich bis vor ein paar Wochen noch nie was gehört.

Was ich erkennen kann ist, dass deine Lösung ein ganz anderer Ansatz ist als das was ich bisher gefunden habe. Das wiederum bringt mir neue Ideen zum suchen.

Mal schlau ob ich schlau draus werde.

Danke schon mal

Ha. Genau danach habe ich gesucht
so funktioniert es

{% set radius = 10 %} {## in dm ##}
{% set laenge = 22 %} {## in dm ##}
{{ radius**2 * laenge * ( acos(( radius - ((float(states('sensor.zisterne_shellyuni_adc'))) / 0.5 ) ) / radius ) - ( radius - ((float(states('sensor.zisterne_shellyuni_adc'))) / 0.5 ) ) * sqrt( 2 * radius * ((float(states('sensor.zisterne_shellyuni_adc'))) / 0.5 ) - ((float(states('sensor.zisterne_shellyuni_adc'))) / 0.5 )**2 ) / radius**2 ) }}

Super vielen Dank :vulcan_salute:

1 „Gefällt mir“

Da der Sensor “sensor.zisterne_shellyuni_adc” insgesamt 4 mal im Template auftaucht. Würde es auch sinn machen, diesen einer Variable zuzuweisen. Macht das Template ein wenig kurzer.
Auch würde ich immer den einzelnen Sensoren einen default wert mit geben, sonst wirft Dein Template einen Fehler auf, falls der Sensor mal nicht verfügbar ist oder einen ungültigen Wert zurück gibt.

{% set radius = 10 %} {## in dm ##}
{% set laenge = 22 %} {## in dm ##}
{% set sensor = states('sensor.zisterne_shellyuni_adc') | float(0) %}
{{ (radius**2 * laenge * ( acos(( radius - sensor  / 0.5  ) / radius )
- ( radius - sensor  / 0.5 ) * sqrt( 2 * radius * sensor / 0.5 
- (sensor / 0.5 )**2 ) / radius**2 )) | int(0) }}

Gruß
Osorkon

1 „Gefällt mir“

Guten Morgen Osorkon

Das ist ein super Tipp, cool.
Hättest du noch eine Idee, wie man den Sensor etwas glätten könnte, damit er nicht so springt?

Gruß

Du meinst der Sensor „sensor.zisterne_shellyuni_adc“ springt sehr oft hoch und runter?

In dem Fall, würde ich ein Trigger-based Template Sensor verwenden. Der nur dann den Template Sensor aktualisiert, wenn die Änderung alter Wert zu neuer Wert > x ist.

Gruß
Osorkon

Danke dir. Ich such mal danach.

Gruß
Thorsten

Oder Du wartest bis heute Abend, bis ich wieder am Rechner sitze. Dann ich Dir den Template Sensor zusammenstellen.

Gruß
Osorkon

Ich hab die Filter Funktion in HA gefunden.

In der /configuration.yaml konfiguriert, glättet sie den Sensor und zeigt ihn auch gleich mit an.

Screenshot 2024-02-10 165317

Danke nochmals.

Gruß
Thorsten

Ich dachte Du wolltest den Template Sensor entprellen.
So das sich dieser nicht bei jedem kleinsten Sprung der Spannung ändert?

Hier mal der Trigger-based Template Sensor.
Der Zisternen Inhalt in Liter änderst sich nur wenn die Spannung mindestens einen Sprung von 0,05 Volt macht. Wenn nicht behält der Template Sensor “sensor.zisternen_inhalt” seinen Wert und ändert sich nicht.

#configuration.yaml
template:
  - trigger:
      - platform: state
        entity_id:
          - sensor.zisterne_shellyuni_adc
    sensor:
      - name: Zisternen Inhalt
        state: |
          {% set radius = 10 %} {## in dm ##}
          {% set laenge = 22 %} {## in dm ##}
          {% set sensor = states('sensor.zisterne_shellyuni_adc') | float(0) %}
          {% set inhalt = (radius**2 * laenge * ( acos(( radius - sensor  / 0.5  ) / radius )
          - ( radius - sensor  / 0.5 ) * sqrt( 2 * radius * sensor / 0.5 
          - (sensor / 0.5 )**2 ) / radius**2 )) | int(0) %}
          {% set a = trigger.from_state.state | float(0) %}
          {% set b = trigger.to_state.state | float(0) %}
          {% set c = (b-a) | abs %}
          {{ iif(c > 0.05, inhalt, states('sensor.zisternen_inhalt') ) }}
        state_class: measurement
        device_class: volume
        unit_of_measurement: "L"
        unique_id: a4c51af2-d1d1-4793-a685-8f9f6373315f

Zisternen Inhalt

Gruß
Osorkon

2 „Gefällt mir“

Guten Morgen

Der Filter den ich verwende errechnet einen einfachen gleitenden Durchschnittswert. So kenne ich das noch aus der Mess und Regeltechnik, das ist aber auch schon 20 Jahre her. Es hat einfach gerade Sinn gemacht und funktioniert.

sensor:
  - platform: filter
    name: "sensor.zisterne.mittelwert" #Name der ausgegebenen Entität
    entity_id: sensor.zisterne_shellyuni_adc #Name der Quell-Entität
    filters:
      - filter: time_simple_moving_average # Art des Filter ,lowpass, outlier, range, und throttletime_throttletime_simple_moving_average
        window_size: 20  #Zeitfenster, in dem Fall 20 sec

Vorher und nachher, bei einem Fenster von 20sec, wobei der Sensor nur in einer Wasserflasche hängt und aktuell 0,55v vom 10 ausgibt.

Screenshot 2024-02-11 073504

Mit ein paar Optimierungen

# Filter zum glätten der Zisternenmessung https://www.home-assistant.io/integrations/filter
sensor:
  - platform: filter
    name: "sensor.zisterne.mittelwert" #Name der ausgegebenen Entität
    entity_id: sensor.zisterne_shellyuni_adc #Name der Quell-Entität
    scan_interval: "00:00:01"  # Hier wird die Abfrage auf einmal pro Sekunde eingestellt
    filters:
      - filter: time_simple_moving_average # Art des Filter ,lowpass, outlier, range, und throttletime_throttletime_simple_moving_average
        window_size: "00:02:00"  #Zeitfenster, in dem Fall 2 min

image

Danke nochmals sehr für deine Unterstützung, ich schau mir deinen Weg aber auch noch genau an, ich will ja was lernen.

Gruß
Thorsten

Nachtrag: Bei deiner Lösung habe ich verstanden, dass diese viel Ressourcen schonender ist.
Du ermittelst erst den vorherigen Messwert, dann den aktuellen und anschließend die Differenz wobei das eventuelle Vorzeichen entfernt wird. Wenn die Differenz großgenug ist, lässt du den neuen Wert durch.

Soweit richtig?

Könntest du mir den Rest erklären? Darüber hab ich nicht viel gefunden

:crayon:by HeikoBauer: Zusammenführung Doppelpost.

Ressourcen schonender wäre es nicht bei jeder Änderung von “sensor.zisterne_shellyuni_adc” den Template Sensor zu triggern. Sondern z.B. nur alle 15 min.

Richtig.

State Class → siehe Dokumentation
Hat Einfluss auf die Statistik Erfassung und ob die Messwerte als Graph oder in einer Zeitleiste angezeigt werden.

Device Class → siehe Dokumentation Hat Einfluss auf das Symbol und bei Binary Sensoren den Zustand der im Dashboard angezeigt wird.

unit_of_measurement → Ist die Einheit des Sensors und muss zu den Device Class passen

unique_id → EInzigartige ID. Identifiziert den Sensor eindeutig und ermöglicht so die Konfiguration des Sensor auch in der GUI. Name, Entity-ID, Symbol und Device Class. Ich verwende einen Unique ID Generator. Ist eine Zeitstempel basierte Unique ID.

Dokumentation Template Integration

Gruß
Osorkon

1 „Gefällt mir“