dem helper input_number in template einen Wert zuweisen

amiko

Member
Hallo zusammen, ich bin neu hier im Forum und fange gerade an, mich mit dem Home assystant vertraut zu machen. Im Moment habe ich viele Fragen. Ich beginne mit der ersten Frage, die mich beschäftigt.
Um meine Wallbox zu steuern, habe ich den Helper input_number.max_strom_fuer_wallbox erstellt. Über das Eingabefeld kann ich einen Wert eingeben und an die Wallbox senden. Funktioniert soweit. Im nächsten Schritt möchte ich den Wert für den Ladestrom berechnen. Das funktioniert auch.

Im templatel habe ich die Variable max_strom_wallbox deklariert und den Strom für die Wollbox berechnet.

YAML:
sensor:
  - name: "max Strom Wallbox"
    unique_id: "max_strom_wallbox"
    device_class: "current"
    state_class: "measurement"
    unit_of_measurement: "A"
    state: >
          {% set grid_power = states('sensor.inverter_grid_power') | float * -1 %}
          {% set battery_power = states('sensor.inverter_battery_power') | float * -1 %}
          {% set wallbox_power = states('sensor.l1_l2_l3_power') | float %}
          {{ ((grid_power + battery_power + wallbox_power) /230 / 1 ) | round(1) }}

Nun möchte ich den berechneten Wert max_strom_wallbox dem Helper input_number.max_strom_fuer_wallbox zuweisen. Dazu habe ich eine Logik mit If-Anweisung programmiert.

YAML:
{% if float(states.sensor.max_strom_wallbox.state) > 16 %}
     160
{% elif 6 < float(states.sensor.max_strom_wallbox.state) < 16  %} 
      {{ ((grid_power + battery_power + wallbox_power) /230 / 1 ) | round(1) * 10 }}
{% elif float(states.sensor.max_strom_wallbox.state) < 6 and float(states.sensor.inverter_battery.state) > float(states.input_number.min_battery_soc.state)  %}
      60
{% else %}
      0
{% endif %}



Die eigentliche Frage ist nun, wie man den Wert dem Helper zuweist.
 
Zuletzt bearbeitet:
Die eigentliche Frage ist nun, wie man den Wert dem Helper zuweist.
Tendenziell über eine Automatisierung, die den entsprechenden Dienst auslöst. Sehe ich das richtig, der Wert von max_strom_wallbox kann sich verändern, und dann soll jeweils der Helfer angepasst werden?

Dann könntest Du über Einstellungen => Automatisierungen gehen, dort eine neue erstellen, als Auslöser Entität => Zustand wählen und max_strom_wallbox verwenden, und als Aktion "Dienst ausführen" wählen und dort dann den Sensor abgreifen / Deine Berechnung durchführen.

Wenn Du oben rechts in der neuen Automatisierung über die drei Punkte "Als YAML bearbeiten" auswählst und das hier hineinkopierst:
YAML:
alias: setze max_strom_fuer_wallbox
description: ""
trigger:
  - platform: state
    entity_id:
      - sensor.max_strom_wallbox
condition: []
action:
  - service: input_number.set_value
    target:
      entity_id: input_number.max_strom_fuer_wallbox
    data:
      value: |
        {% if float(states.sensor.max_strom_wallbox.state) > 16 %}
            160
        {% elif 6 < float(states.sensor.max_strom_wallbox.state) < 16  %} 
            {{ ((grid_power + battery_power + wallbox_power) /230 / 1 ) | round(1) * 10 }}
        {% elif float(states.sensor.max_strom_wallbox.state) < 6 and float(states.sensor.inverter_battery.state) > float(states.input_number.min_battery_soc.state)  %}
            60
        {% else %}
            0
        {% endif %}
mode: single
sollte das grundlegend schon funktionieren.

Alternativ könntest Du das aber auch über einen Helfer "Template" regeln und dort Deine Logik verwenden, damit würde der Helfer "sich selbst" den gewünschten Wert zuweisen und man könnte auf die Automatisierung verzichten, es wäre dann eben nur kein Helfer vom Typ Nummer.
 
OK, danke muss ich mal probieren.
Meine Automatisierung für die Wallbox sieht so aus.

YAML:
- id: '1680707528756'
  alias: Setze Ladestrom
  description: ''
  trigger:
  - platform: state
    entity_id:
    - input_number.max_strom_fuer_wallbox
  condition: []
  action:
  - service: modbus.write_register
    data:
      hub: modbus heidelberg wallbox
      address: 261
      slave: 1
      value:
      - '{{ (states.input_number.max_strom_fuer_wallbox.state) }}'
  mode: single

Gibt es keine Möglichkeit, den Wert einer Variablen über eine Anweisung zuzuweisen? Zum Beispiel wie folgt
{{ states('input_number.max_strom_fuer_wallbox') | float(0) }} = {{ states('sensor.max_strom_wallbox') | float(0) }}
 
Meine Automatisierung für die Wallbox
Naja, dann könntest Du prinzipiell auch die Abkürzung nehmen, und Deine Automatisierung mit meinem Vorschlag vereinen - wird dann nur etwas unübersichtlicher 😅 ansonsten würde ich für diesen Zweck tatsächlich eher den Helfer Template verwenden.

Gibt es keine Möglichkeit, den Wert einer Variablen über eine Anweisung zuzuweisen?
Leider nein, das funktioniert nur über die verfügbaren Dienste, die Du unter Entwicklerwerkzeuge => Dienste einsehen kannst. Variablen direkt setzen kann man nur, wenn man sie auch innerhalb des Templates mittels set definiert, und die sind dann auch nur dort gültig.
 
Hallo zusammen,
gibt es im Template die Möglichkeit eine Zeitverzögerung einzufügen? Z.B. meine Stromberechnung für die Wallbox im Beitrag 1 hat mehrere Operationen, die sich ständig ändern. Ich möchte nicht jede Sekunde den neuen Sollwert an die Wallbox senden.
Ich weiß, dass man die Automatisierung verzögern kann, aber aus meiner Sicht, es ist keine gute Lösung für meine Anwendung.
 
Das in die configuration.yaml einfügen
Es ist nicht möglich, dies in die Datei configuration.yaml einzufügen. Es scheint, dass der Eintrag "template" nur einmal in der Datei configuration.yaml vorhanden sein darf. Wenn ich den Rest einfüge, bekomme ich die Fehlermeldung.

Fehler_Config.png

Diese Trigger kann in die Datei template.yaml eingefügt werden. Nach dem Neustart funktionieren alle meine Berechnungen leider nicht mehr.

YAML:
  - trigger:
      - platform: time_pattern
        secundes: 30
    sensor:
      - name: time_output_strom_wallbox
        state: '{{ states("sensor.output_strom_wallbox") }}'
 
Es scheint, dass der Eintrag "template" nur einmal in der Datei configuration.yaml vorhanden sein darf.
Das ist absolut richtig, wenn Du ein nicht eingerücktes template schon in der Datei stehen hast, dann streich die erste Zeile, und füge den Rest darunter ein.
Nach dem Neustart funktionieren alle meine Berechnungen leider nicht mehr.
Mit den Berechnungen hast es nichts zu tun, kann es nicht. Wenn da irgenwas nicht mehr funktioniert, dann liegt es nicht hierdran.
 
wenn Du ein nicht eingerücktes template schon in der Datei stehen hast, dann streich die erste Zeile, und füge den Rest darunter ein.
Ich mache etwas falsch.
Ich habe die vorhandene template Zeile auskommentiert und den Rest danach eingefügt. Nach dem Neustart funktioniert die template.yaml nicht.


YAML:
#template: !include template.yaml
template:
  - trigger:
      - platform: time_pattern
        minutes: /2
    sensor:
      - name: time_output_strom_wallbox
        state: '{{ states("sensor.output_strom_wallbox") }}'
modbus: !include modbus.yaml

meine Datei template.yaml

YAML:
sensor:
  #Ladestrom für die Wallbox berechnen
  - name: "max Strom Wallbox"
    unique_id: "max_strom_wallbox"
    device_class: "current"
    state_class: "measurement"
    unit_of_measurement: "A"
    state: >
          {% set grid_power = states('sensor.inverter_grid_power') | float * -1 %}
          {% set battery_power = states('sensor.inverter_battery_power') | float * -1 %}
          {% set wallbox_power = states('sensor.l1_l2_l3_power') | float %}
          {% set wallbox_spannung = (states('sensor.l1_n_spannung') | float + states('sensor.l2_n_spannung') | float + states('sensor.l3_n_spannung') | float ) / 3 | round(1) %}
          {{ (((grid_power + battery_power + wallbox_power) / (wallbox_spannung * 1) ) * 10 ) | round(0) }}

  #Ladestrom für die Wallbox sortieren
  - name: "output strom Wallbox"
    unique_id: "output_strom_wallbox"
    device_class: "current"
    state_class: "measurement"
    unit_of_measurement: "A"
    state: >
      {% if  (float(states.sensor.inverter_smartload_off.state) + 2) > float(states.sensor.inverter_battery.state)  %}
        0
      {% else %}
      {%  if is_state('input_boolean.manuell_automatik','off') %}
        {{ states('input_number.max_strom_fuer_wallbox') | round(0) }}
      {% else %} 
        {% if float(states.sensor.max_strom_wallbox.state) > 160 %}
            160
        {% elif 60 < float(states.sensor.max_strom_wallbox.state) < 160  %}
            {{ states('sensor.max_strom_wallbox') | round(0) }}
        {% elif float(states.sensor.max_strom_wallbox.state) < 60 and (float(states.sensor.inverter_battery.state) > float(states.input_number.min_battery_soc.state))  %}
            60
        {% else %}
            0
        {% endif %}
      {% endif %}       
      {% endif %}
 
die vorhandene template Zeile
Ach, Du hast das schon aufgeteilt - das hatte ich bei "neu in HA" nun nicht erwartet.

Wenn Du das "include" auskommentierst, dann ist natürlich alles weg, was darin steht, also wieder einkommentieren.

Dann muss mein Code stattdessen in der template.yaml landen, wie genau müsste man schauen - ich habs bei mir "oberste Zeile weg, dann alles zwei Leerzeichen nach links" drin, aber das entspricht nicht Deiner Formatierung wie es scheint. Entweder, Du kommst da nun selbst drauf, oder ich schau morgen nochmal drüber :)
 
Vielen Dank für Deine Unterstützung.
Ich habe template.yaml wie folgt erweitert

YAML:
  #trigger
    -trigger:
    - platform: time_pattern
      minutes: /2
    sensor:
      - name: time_output_strom_wallbox
        state: '{{ states("sensor.output_strom_wallbox") }}'

Nach dem Neustart erhalte ich die Meldung:

2024-07-29 22:17:32.250 ERROR (MainThread) [homeassistant.config] Invalid config for 'template' at template.yaml, line 40: '-trigger' is an invalid option for 'template', check: sensor->1->-trigger
Invalid config for 'template' at template.yaml, line 43: 'sensor' is an invalid option for 'template', check: sensor->1->sensor
 
Laut meinen Versuchen funktioniert es, wenn Du das nicht eingerückte sensor mit - davor versiehst, also insgesamt dann so:
YAML:
- sensor:
  #Ladestrom für die Wallbox berechnen
  - name: "max Strom Wallbox"
    unique_id: "max_strom_wallbox"
    device_class: "current"
    state_class: "measurement"
    unit_of_measurement: "A"
    state: >
          {% set grid_power = states('sensor.inverter_grid_power') | float * -1 %}
          {% set battery_power = states('sensor.inverter_battery_power') | float * -1 %}
          {% set wallbox_power = states('sensor.l1_l2_l3_power') | float %}
          {% set wallbox_spannung = (states('sensor.l1_n_spannung') | float + states('sensor.l2_n_spannung') | float + states('sensor.l3_n_spannung') | float ) / 3 | round(1) %}
          {{ (((grid_power + battery_power + wallbox_power) / (wallbox_spannung * 1) ) * 10 ) | round(0) }}

  #Ladestrom für die Wallbox sortieren
  - name: "output strom Wallbox"
    unique_id: "output_strom_wallbox"
    device_class: "current"
    state_class: "measurement"
    unit_of_measurement: "A"
    state: >
      {% if  (float(states.sensor.inverter_smartload_off.state) + 2) > float(states.sensor.inverter_battery.state)  %}
        0
      {% else %}
      {%  if is_state('input_boolean.manuell_automatik','off') %}
        {{ states('input_number.max_strom_fuer_wallbox') | round(0) }}
      {% else %}
        {% if float(states.sensor.max_strom_wallbox.state) > 160 %}
            160
        {% elif 60 < float(states.sensor.max_strom_wallbox.state) < 160  %}
            {{ states('sensor.max_strom_wallbox') | round(0) }}
        {% elif float(states.sensor.max_strom_wallbox.state) < 60 and (float(states.sensor.inverter_battery.state) > float(states.input_number.min_battery_soc.state))  %}
            60
        {% else %}
            0
        {% endif %}
      {% endif %}      
      {% endif %}
- trigger:
    - platform: time_pattern
      minutes: /2
  sensor:
    - name: max_strom_fuer_wallbox_2
      state: '{{ states("sensor.max_strom_fuer_wallbox") }}'
 
Hallo @Nival, danke für deine Hilfe, jetzt funktioniert es mit der Zeitverzögerung. Ich dachte, die bestehende Variable max_strom_fuer_wallbox wird verzögert, aber es wird die neue Variable max_strom_fuer_wallbox_2 verzögert. Die neue Variable soll dann an die Wallbox gesendet werden, also in der Automation verwendet werden.

Nicht mit time_pattern, das nimmt keine Variablen, aber mit template als platform und entsprechendem value_template sollte das möglich sein.
Muss ich wohl so umsetzen, variable Zeiteingabe ist auf jeden Fall besser als feste Zeit in ayml Datei.
Ist es nicht zu viel Verlangt, wenn ich nach einem Beispiel fragen würde?
 
es wird die neue Variable max_strom_fuer_wallbox_2 verzögert. Die neue Variable soll dann an die Wallbox gesendet werden, also in der Automation verwendet werden.
Jup.
Muss ich wohl so umsetzen, variable Zeiteingabe ist auf jeden Fall besser als feste Zeit in ayml Datei.
Ist es nicht zu viel Verlangt, wenn ich nach einem Beispiel fragen würde?
Sag mir, was Dein Ziel ist, und ich geb gerne nen Beispiel :)

Bringt herzlich wenig, wenn ich Dir erzähle, wie Du alle 10 Minuten aktualisieren kannst, wenn Du eigentlich bloß jede Stunde zu ner genauen Minute meinst - und umgekehrt. Wo und wie möchtest Du die Variable unterbringen?
 
Sag mir, was Dein Ziel ist, und ich geb gerne nen Beispiel
Ich versuche die Überschussladen für die Wallbox zu realisieren. Die Regelung sollte sich möglichst schnell an den PV-Strom anpassen dabei die großen Schwankungen sollen geglättet werden. Ich schätze zwischen 2 und 10 Minuten wird es werden. Plus die Taktung vom E-Herd muss irgendwie umgangen werden.
Die Zeiteingabe über Eingabefeld (input_number) am Dashbord, meinetwegen in Minuten oder Sekunden.

DashboardWallbox.png

Ich habe noch viel mit HA vor, als nächstes möchte ich ein paar Sachen bei dem Inverter automatisieren, da brauche ich auch die Zeitverzögerung, Hysterese und so weiter.
 
Die Zeiteingabe über Eingabefeld (input_number) am Dashbord
Ah, das war der relevante Punkt :D

YAML:
- trigger:
    - platform: template
      value_template: "{{ (now().minute % states('input_number.xyz') | int) == 0 }}"
aktualisiert alle input_number.xyz Minuten den folgenden Sensor.
 
Ah, das war der relevante Punkt
Ich dachte, es war ziemlich klar, wo ich die Variable unterbringen wollte. Nochmals vielen Dank.

YAML:
- trigger:
    - platform: template
      value_template: "{{ (now().minute % states('input_number.aktualisierungszeit_min') | int) == 0 }}"
  sensor:
    - name: timer_max_strom_wallbox
      device_class: "current"
      state_class: "measurement"
      unit_of_measurement: "A"
      state: '{{ states("sensor.output_strom_wallbox") }}'
 

Zurzeit aktive Besucher

Letzte Anleitungen

Statistik des Forums

Themen
5.215
Beiträge
52.080
Mitglieder
4.954
Neuestes Mitglied
jakes
Zurück
Oben