dem helper input_number in template einen Wert zuweisen

Ich möchte kurz erklären, warum ich die while-Schleife verwenden möchte.
Der Ladesollstrom für die Wallbox wird berechnet, dann noch um einige Minuten verzögert, um nicht jede Änderung der Eingangsvariablen an die Wallbox weiterzugeben, dann über mehrere If-Anweisungen die Min-,Max-Grenzen und SOC der Hausbatterie ausgewertet wird. Bei Unterschreitung bestimmter Grenzen wird der Ladestrom auf Null gefahren und die Wallbox ausgeschaltet. Mir gefällt der "stufige" Sollstrom für die Wallbox nicht, ich würde den Strom "glätten", indem ich bei großen Unterschieden zwischen Ist und Soll den Sollstrom stufenweise, z.B. in Schritten von 0,2 oder 0,4 A erhöhen oder verringern möchte. Die Schleife läuft nicht immer, sondern nur bei Bedarf. Die For-Schleife möchte ich nicht verwenden, da ich vor der Schleife noch die Anzahl der Durchläufe berechnen muss. Die Until-Schleife passt auch nicht so gut, da die Bedienung am Ende der Schleife ausgewertet wird und die Schleife mindestens einmal durchlaufen wird. Die while-Schleife eignet sich gut, weil ich einige if-Anweisungen einsparen kann, da die Bedienung für die Schleife am Anfang der Schleife ausgwertet wird. Ich glaube, ich werde 2 Schleifen brauchen, eine um den Strom zu erhöhen und andere um den Stron zu verringern. Ich bin sicher, dass man das mit einer Schleife hinbekommt, aber dann muss man einige Variablen umkopieren.
Ich weiß nicht, wie ich mein Vorhaben den Strom zu "glätten" mit den If-Anweisungen umsetzen kann.
 
Ich schätze, am realistischsten wäre es, den Vorgang "Strom geglättet anpassen" in ein Script auszulagern, welches von der Automatisierung mit den Werten für "Zielwert" und "Schrittgröße" versorgt wird, den "aktuellen Zustand" kann man ja innerhalb der While-Schleife auslesen und "ist diese Schleife überhaupt notwendig" wird ja sicher innerhalb der Automatisierung geprüft.

Nur mal angenommen, ich möchte ganz schlicht eine input_number geglättet anpassen, dann wäre das hier ein mögliches Script dafür:
YAML:
alias: hochzählen
variables:
  strom_soll: 95
  strom_step: 5
description: ""
sequence:
  - repeat:
      while:
        - condition: template
          value_template: "{{ states('input_number.xyz') | int < strom_soll }}"
      sequence:
        - service: input_number.set_value
          data_template:
            entity_id: input_number.xyz
            value: "{{ states('input_number.xyz') | int + strom_step }}"
        - service: notify.persistent_notification
          data:
            message: "{{ states('input_number.xyz') }}"
        - alias: "Pause"
          delay: 1
Das strom_soll definiert den Standardwert für "wenn es das überschritten hat, hör auf", strom_step die generelle Schrittgröße, Variablen kann man von der Automatisierung aus überschreiben.

Die Bedingung lautet dann also "solange input_number.xyz kleiner als strom_soll ist".

Aktion 1: erhöhe input_number.xyz um den Wert, den strom_step enthält.
Aktion 2: schick mir eine Benachrichtigung, damit ich das bequem nachvollziehen kann.
Aktion 3: pausiere für 1 Sekunde.

Einzig etwas besonders ist hier die Angabe von data_template für input_number.set_value - nur dann kann man dort eine Berechnung durchführen.

In der Automatisierung kann man das dann so aufgreifen:
YAML:
service: script.turn_on
metadata: {}
data:
  variables:
    strom_step: "{{ 1 + 1 }}"
target:
  entity_id: script.hochzahlen
Script starten, obiges auswählen, bei Bedarf Variablen überschreiben (habe ich hier nur gemacht um zu zeigen, dass Templates verwendet werden können).

Bevor die Frage kommt, nein, innerhalb des Scripts kann man nach der Initialisierung die Variablen nicht mehr umdefinieren ;)
 
@Nival Danke für deine Mühe und Zeit, ich habe wieder was dazu gelernt. Gut zu wissen, dass man in der Automatisierung ein Skript aufrufen kann. Was ist der Unterschied zwischen einem Skript und einem Template? Auf den ersten Blick ist die Syntax des Scripts identisch mit der Syntax des Templates.
Ich habe eine while-Schleife selbst gebaut. Die Schleife funktioniert und läuft im Template. Dies ist nur ein Entwurf, ich werde ihn demnächst anpassen, um den Strom der Wallbox zu "glätten".

Code:
#Schleife selbst gebaut
  - name: "Test schleife"
    unique_id: "test_schleife"
    device_class: "current"
    state_class: "measurement"
    unit_of_measurement: "A"
    state: >
        {% set bs_schleife = states('sensor.test_schleife') | float(0) %}
          {%  if is_state('input_boolean.schleife_einschalten', 'on') %}
            {% if (states('sensor.test_schleife') | float(0) < states('input_number.test_schleife_max_wert') | float(0)) and (states('sensor.test_schleife') | float(0) == states('sensor.zeit_test_schleife') | float(0)) %}                    
                {% set bs_schleife = bs_schleife + 10 %}
                {{ bs_schleife }}
            {% endif %}
          {% else %}
            {% set bs_schleife = 0 %}
            {{ bs_schleife }}
          {% endif %}
         
- trigger:
  - platform: time_pattern
    seconds: /10
  sensor:
    - name: zeit_test_schleife
      state: '{{ states("sensor.test_schleife") }}'
 
Was ist der Unterschied zwischen einem Skript und einem Template?
Ich habe dezente Probleme, die Frage zu verstehen :D aber ich versuchs mal so: Templates können Teil eines Scripts sein (und eines Sensors und einer Automation und eines Helfers...). Templates bieten aber nur einen recht beschränkten Funktionsumfang, mehr als Berechnungen / Ausgaben sind nicht drin, und auch da haben sie weniger Möglichkeiten als ein Script (siehe z.B. while).

Scripte hingegen können, nur so als Beispiel, Dienste verwenden, und mit Hilfe der Dienste Dinge auslösen oder Werte setzen, sie können von einer Automatisierung her Variablen bekommen (die sie mit oder ohne Templates verwenden können), sie sind in der Lage Szenen direkt auszulösen...

Ich habe eine while-Schleife selbst gebaut.
Hmm, nein. Du hast etwas gebaut, das die gewünschte Funktionalität der while-Schleife anderweitig bietet (und das nichtmal schlecht). Es ist aber so wenig eine while-Schleife, wie ein if-elif-elif-elif-elif-elif-else-endif ein switch-case ist, obwohl beides genau die gleiche Funktionalität darstellen kann :)
 
Templates bieten aber nur einen recht beschränkten Funktionsumfang, mehr als Berechnungen / Ausgaben sind nicht drin, und auch da haben sie weniger Möglichkeiten als ein Script
Danke für die Aufklärung, ich werde wahrscheinlich alles, was ich in der Template erstellt habe, in ein Skript packen, ein Skript mit mehreren Eingangsvariablen und einer Ausgangsvariable, Soll-Strom für die Wallbox. Mich hat schon gestört, dass ich viele Variablen habe, die eigentlich nur temporäre Variablen sind. So bleiben alle Zwischenschritte im Skript verborgen.
 
Guten Abend, ich habe ein kleines Problemchen mit der Zeitverzögerung. So funktioniert die Zeitverzögerung.

YAML:
- trigger:
    - platform: time_pattern      
      seconds: /1
  sensor:
    - name: whec_strom_delayed
      device_class: "current"
      state_class: "measurement"
      unit_of_measurement: "A"  
      state: '{{ states("sensor.strom_geglaettert") }}'

Ich bevorzuge die variable Eingabe, also habe ich es so versucht, leider ohne Erfolg.

YAML:
- trigger:
    - platform: template                 
      value_template: "{{ (now().second % states('input_number.verschiebungszeit_schleife') | int) == 0 }}"

  sensor:
    - name: whec_strom_delayed
      device_class: "current"
      state_class: "measurement"
      unit_of_measurement: "A"   
      state: '{{ states("sensor.strom_geglaettert") }}'

Ich habe mir die Informationen auf der Website von Home Assistant unter Templating angesehen, "second" ist richtig.
 
Das erste ist keine Zeitverzögerung, sondern ein Trigger, der deine Automatisierung jede Sekunde startet. Da wird sich dein Logbuch richtig freuen. Endlich mal was zu tun. :D
Das zweite hätte man unter Entwicklerwerkzeuge -> Template einfach mal eingeben können und schauen, was den das Ergebnis deiner Berechnung ist. Und siehe da, da kommt "True" bei raus.
Heißt, immer, wenn dein input_number einen bestimmten Wert aufweist (Vermutlich eine bestimmte Sekunde), wird die Automatisierung ausgelöst.
Sinn machen eigentlich beide nicht.

Die Frage dabei ist, was willst Du erreichen ? Du redest von Zeitverzögerung, programmierst aber einen Auslöser.
 
OK, hier ist der komplette Code aus dem Template, hat nichts mit der Automatisierung zu tun. Das ist meine selbstgebaute Schleife für meine Wallbox zum Glätten der "Stromsprünge". Dieser Trigger verzögert die Variable "sensor.strom_geglaettert" um eine Sekunde. Dies bedeutet, dass der Strom-Sollwert um einen Betrag pro Sekunde erhöht bzw. um einen Betrag pro Sekunde verringert wird. Da ich nicht weiß, ob eine Sekunde ausreicht, würde ich das gerne variabel gestalten.

YAML:
  - name: "Strom für die Wallbox geglaettert"
    unique_id: "strom_geglaettert"
    device_class: "current"
    state_class: "measurement"
    unit_of_measurement: "A"
    state: >
        {% set bs_schleife = states('sensor.strom_geglaettert') | float(0) %}
        {% set t_schleife_delayed = states('sensor.whec_strom_delayed') | float(0) %}
        {% set t_strom_soll_wert = states('input_number.test_schleife_max_wert') | float(0) %}
        {% set t_schrittweite = states('input_number.schrittweite_schleife') | float(0) %}
        {% set t_rest = 0 %}
          {%  if is_state('input_boolean.schleife_einschalten', 'on') %}
            {% if bs_schleife < t_strom_soll_wert and bs_schleife == t_schleife_delayed %}                   
                {% set bs_schleife = bs_schleife + t_schrittweite %}
                {% set t_rest = t_strom_soll_wert - bs_schleife %}
                    {% if t_rest < t_schrittweite %}
                      {% set bs_schleife = t_strom_soll_wert %}
                    {% endif %} 
            {% elif bs_schleife > t_strom_soll_wert and bs_schleife == t_schleife_delayed %}                   
                {% set bs_schleife = bs_schleife - t_schrittweite %}
                {% set t_rest = bs_schleife - t_strom_soll_wert %}
                    {% if t_rest < t_schrittweite %}
                      {% set bs_schleife = t_strom_soll_wert %}
                    {% endif %}               
            {% endif %}
          {% else %}
            {% set bs_schleife = t_strom_soll_wert %}
          {% endif %}
          {{ bs_schleife | round(0) }}
- trigger:
    - platform: time_pattern       #          template       
#                  value_template: "{{ (now().second % states('input_number.verschiebungszeit_schleife') | int) == 0 }}"
      seconds: /1
  sensor:
    - name: whec_strom_delayed
      device_class: "current"
      state_class: "measurement"
      unit_of_measurement: "A" 
      state: '{{ states("sensor.strom_geglaettert") }}'
 
Zuletzt bearbeitet:
hat nichts mit der Automatisierung zu tun.
Die Aussage von mir war nicht richtig, natürlich hat der Triger Einfluss auf die Automation, der Strom-Sollwert wird einmal pro Sekunde an die Wallbox gesendet. Ich werde mal einen Trace machen und schauen, wie hoch die Belastung ist. HA läuft bei mir auf dem Intel NUC mit i3 Prozessor und 8GB Speicher, sollte kein Problem sein, denke ich.
 
Ich möchte einen kleinen Erfolg mit euch teilen, ich konnte heute endlich mit dem Auto testen, was ich mir so ausgedacht habe mit der Stromglättung. (Wobei Glätten nicht ganz der richtige Begriff ist). Es funktioniert, die Steigung ist noch zu steil, da ich mit einer Sekunde getaktet habe, werde ich mit 2 oder 3 Sekunden probieren um die Kurve flacher zu bekommen. Um den Unterschied zu sehen, habe ich zuerst von 6A auf 16A und wieder auf 6A ohne Stromglättung und dann das gleiche mit Stromglättung gemacht. Wie gesagt, die Kurve könnte etwas flacher sein.

Verlauf.png

Ich habe mir die Prozessorauslastung angesehen, der Prozessor wird kaum belastet.

Auslastung.png


Ich hatte auch einen kleinen Aussetzer gehabt, wo der Sollstrom auf Null geht, die Ursache dafür muss ich noch untersuchen, da stimmt noch etwas nicht. Daher ist die Frage, wie funktioniert es mit dem Template? Wie oft wird Templte aufgerufen und wie werden die Anweisungen im Tempalte abgearbeitet? Es gibt keinen Trigger wie bei der Automatisierung, um den Prozess zu starten.
Ich versuche meine Frage zu präzisieren, wenn ich eine solche Anweisung im Template habe:
{% set t_strom_sollwert = states('sensor.output_strom_wallbox') | float(0) %}
Wie oft wird die interne Variable t_strom_sollwert aktualisiert? In jedem Zyklus? Ich verwende die Variable t_strom_sollwert für weitere Berechnungen, ist es nicht sinnvoller die Originalvariable 'sensor.output_strom_wallbox' zu verwenden?
 
Welchen Sinn genau soll das Ganze eigentlich haben? Wenn ich eine 2000W Heizung anschalte, wird die ja auch nicht hochgedimmt.

Abgesehen davon, dass ich dir nicht so ganz folgen kann, kommt mir, was du da tust, wie eine ziemliche Vergewaltigung vor.
Da wird Programmiererdenke in ein Template gequetscht. In einem Template erzeugt man dynamisch einen statischen Wert, man arbeitet da keine Schleife ab, die irgendwas machen soll.

Zu den Fehlern in https://forum.heimnetz.de/threads/d...-template-einen-wert-zuweisen.5118/post-51450 dein while: muss weiter eingerückt werden und ich glaube nicht, dass man eine in service: definierte variable in repeat: verwenden kann. yaml ist config, nicht programmieren.
Wie schon empfohlen, klick das im UI zusammen, statt als Anfänger Kurzformen zu verwenden.
 
Welchen Sinn genau soll das Ganze eigentlich haben?
Nun ja, das ist alles nur eine Spielerei. Wenn ich ehrlich bin, weiß ich nicht, ob es ein Nachteil für das Auto ist, wenn der Ladestrom plötzlich von 16 A auf 6 A sinkt. Oder umgekehrt, von 6A auf 16A steigt. Deshalb wollte ich den Sollstrom in kleinen Schritten erhöhen oder verringern. Mit einer Heizung kann man es nicht vergleichen. Das hat ja so weit funktioniert, außer diesen kleinen Aussetzer, aber ich weiß, wenn das Problem einmal vorgekommen ist, wird es wieder auftreten.
Da wird Programmiererdenke in ein Template gequetscht.
Hier hast du allerdings recht. Das ist mein Problem.
 
Glaubst du ernsthaft, ein Auto, dass mit verschiedenen Strömen laden kann, ist da nicht drauf eingerichtet? Ansonsten, Automatisierung (oder Script) und nicht Template.
 
Wenn ich ehrlich bin, weiß ich nicht, ob es ein Nachteil für das Auto ist, wenn der Ladestrom plötzlich von 16 A auf 6 A sinkt. Oder umgekehrt, von 6A auf 16A steigt.
Sei versichert, nein, schadet deinem Auto nicht, da die Wallbox sowas eigentlich schon von sich aus macht.
Hier hast du allerdings recht. Das ist mein Problem.
Und weißt Du noch was ?
Anstelle irgendeiner WHILE Schleife wäre eine Automatisierung wesentlich einfacher und schneller entwickelt und ähnelt dabei sogar noch deiner While Schleife.

Du sagst ja
WEIL irgendwas so und so ist
mache dies und jenes und ruf die Schleife wieder auf.

Die Automatisierung sagt.
Wenn irgendwas so und so ist
dann mache dies und jenes. UND wenn eine bestimmte Bedingung erfüllt ist, rufe mich nochmal auf.

Siehst Du da jetzt wirklich einen großen Unterschied ?
 
Und wenn Du dann morgen aufwachst, schaust Du dir mal diesen Beitrag an. Der dürfte mit wenigen Änderungen das machen, was Du willst.
Nur regelt es bei mir die Produktion des PV Strom, um einen gewissen, berechneten Wert nicht zu überschreiten, was aber ziemlich Ähnlich dem ist, was Du machen willst. Nur halt mir einer Automatisierung und Template.
 
Nur regelt es bei mir die Produktion des PV Strom, um einen gewissen, berechneten Wert nicht zu überschreiten, was aber ziemlich Ähnlich dem ist, was Du machen willst. Nur halt mir einer Automatisierung und Template.
Im Prinzip habe ich das gleiche gemacht, die Formel nach der ich den Sollstrom für die Wallbox berechne steht gleich im ersten Beitrag. Die Berechnung erflogt in dem Templaet. Meine Automatisierung habe ich auch schon gepostet. Die Automatisierung wird getriggert, wenn sich der Sollstrom ändert. Das Überschussladen funktioniert ohne Probleme. Im Moment habe ich keine Regelung, sondern eine Steuerung, da kein Soll-Ist-Vergleich stattfindet. Es ist aber geplant.
Leider habe ich im Moment sehr wenig Zeit für HA, vielleicht kann ich im Herbst oder im Winter mehr Zeit in HA investieren. Als erstes mächte ich alle meine Berechnungen in ein Skript packen, so wie @Nival es vorgeschlagen hat.
 
Hallo, ich brauche mal wieder Hilfe. Ich versuche meine programmierten Templates in ein Skript zu übertragen, aber es funktioniert irgendwie nicht. Im visuellen Editor habe ich ein Skript erstellt, dann interne Variablen definiert und mit Hilfe der Felder Übergabevariablen definiert. Dann habe ich das Script in der Automatisierung aufgerufen. So weit, so gut.

YAML:
- id: '1724608184989'
  alias: Test Skript 1
  description: ''
  trigger: []
  condition: []
  action:
  - action: script.strom_fur_die_hec_wallbox_berechnen
    metadata: {}
    data:
      l1_strom: sensor.l1_strom
      l2_strom: sensor.l2_strom
      l3_strom: sensor.l3_strom
      test_ziel:
        entity_id: sensor.anzahl_phasen
      l1_n_spannung: sensor.l1_n_spannung
      l2_n_spannung: sensor.l2_n_spannung
      l3_n_spannung: sensor.l3_n_spannung
      min_battery_soc: input_number.min_battery_soc
      min_battery_soc_hand: input_number.min_battery_soc_hand
    response_variable: input_number.schwellenwert_pv_leistung
  mode: single

Wie kann ich auf interne Variablen im Skript zugreifen?
Wenn ich im visuellen Editor die Aktion WENN - DANN verwende, werden die internen Variablen nicht angezeigt.
Mit input_number funktioniert das Script.

YAML:
  - if:
    - condition: numeric_state
      entity_id: input_number.min_battery_soc_hand
      above: input_number.min_battery_soc
    then:
    - action: input_number.set_value
      target:
        entity_id: input_number.min_battery_soc_hand
      data:
        value: 33

Wenn ich die input_number durch die interne Variable ersetze, erhalte ich eine Fehlermeldung.

YAML:
  - if:
    - condition: numeric_state
      entity_id: min_battery_soc_hand
      above: min_battery_soc
    then:
    - action: input_number.set_value

Aktionen: Entity min_battery_soc_hand is neither a valid entity ID nor a valid UUID for dictionary value @ data[2]['if'][0]['entity_id'

Ich habe versucht, die Teile aus meiner Template in das Skript einzufügen, erhalte aber auch eine Fehlermeldung.

YAML:
    - condition: state
      entity_id: anzahl_phasen
      state: >
            {% if states('sensor.l1_strom') | float(0) > 0.2 %}
              {% set anzahl_phasen = 1 %}
            {% endif %}
            {% if states('sensor.l2_strom') | float(0) > 0.2 %}
              {% set anzahl_phasen = anzahl_phasen + 1 %}
            {% endif %}
            {% if states('sensor.l3_strom') | float(0) > 0.2 %}
              {% set anzahl_phasen = anzahl_phasen + 1  %}
            {% endif %}

Aktionen: Entity anzahl_phasen is neither a valid entity ID nor a valid UUID for dictionary value @ data[2]['then'][1]['entity_id']
 

Zurzeit aktive Besucher

Letzte Anleitungen

Statistik des Forums

Themen
5.268
Beiträge
52.459
Mitglieder
5.019
Neuestes Mitglied
Jeff888
Zurück
Oben