Neuling benötigt Hilfe bei einer eigentlich einfachen Werteberechnung --> A = A - B

Hallo,
ich bin langsam am verzweifeln da ich eine einfache Berechnung nicht hin bekommen.
Ich möchte ein regelbares Netzteil nutzen um bei negativem Bezug einen Akku zu laden.
Um den aktuellen Leistungsüberschuss zu ermitteln, wollte ich rechnen:

Überschuss = Überschuss - Bezug

Ich versuche einen Sensorwert in eine Variable zu schreiben:

interval:
  - interval: 30s 
    then:
      - lambda: |-
          
          id(ladeleistung) = id(ladeleistung) - (id(tasmota_sml_curr_w).state);

Der Sensorwert “tasmota_sml_curr_w” beinhaltet den aktuellen Leistungsbezug, den Wert habe ich auch als weiteren Wert verfügbar:

  - sensor:
    # Stromzähler aktueller Bezug
      - name: "aktueller Bezug"
        unique_id: "aktuBezug"
        unit_of_measurement: 'W'
        device_class: "power"
        state_class: "measurement"
        state: >-
            {{ float(states('sensor.tasmota_sml_curr_w')) | round(0) }}

Die beiden Sensorwerte sind z.Z. natürlich identisch, ich wollte später den Interwall der Aktualisierung von “tasmota_sml_curr_w” von 20s auf 3-5s reduzieren und “aktueller Bezug” als Durchschnitt auf 30s oder mehr ändern.
Beide Sensorwerte lassen sich im Dashboard anzeigen und beinhalten +/- Werte.

Auch eine Berechnung in zwei Schritten nach diesem Prinzip hat nicht funktioniert:
Temp = Überschuss
Überschuss = Temp - Bezug

Es gab keine Fehlermeldung beim kompilieren, der Wert für “id(ladeleistung)” bleibt immer auf dem initialisierten Grundwert von 0.

Ich habe es direkt über ESPHome auf einem ESP8266 versucht und über eine Automation, hat beides nicht funktioniert.

Hat da jemand eine Idee, wie ich das gerechnet bekomme oder ob so etwas grunsdätzlich nicht funktioniert ?

Sollten weitere Infos meinerseits fehlen, bitte nachfragen…

Danke & Gruß
Jens

Hi,
hast du schon mal versucht das mit einem Helfer zu machen?

image

Damit müsste das klappen. So addiere ich zumindest die Leistung von 2 PV Anlagen, was ja nichta anderes sein sollte.

Hoffe das hilft dir.

Viele Grüße,
Mischa

Hallo m1scha,
danke für die Rückmeldung…
Einen Helfer anlegen, der einen Werte zu sich selbst addiert,habe ich nicht hin bekommen…
Anlegen ja, gab nur keine Werte.
Außerdem soll der Wert abgezogen und nicht addiert werden :roll_eyes:

Gruß
Jens

Ich glaube, dass du hier einen weiteren Helfer bzw. eine Variable anlegen musst.

Das Verechnen von Var A = Var A Minus Var B ist unlogisch, eine der genannten Var A muss eine neue Variable sein.

Wenn A = A - B unlogisch ist, müsste doch schon der Kompiler meckern und mit Zwischenschritt:
X = A
A = X - B hatte ich es schon probiert :thinking:
Aber ich werd’s nochmal testen.

Gruß
Jens

Hallo, vom Prinzip her funktioniert es so.


Wenn man dann noch die festen Werte gegen die Sensoren austauscht sollte es gehen.

@ rstuck
DANKE, das hat funktioniert :+1:

Mal schauen, wie ich das jetzt bei mir angepasst / umgesetzt bekomme :thinking:

Gruß
Jens

Hallo,
hier jetzt mein angepasster Code in der configuration.yaml:

  - sensor:
        name: "POut"
        unique_id: "POut"
        unit_of_measurement: 'W'
        device_class: "power"
        state_class: "measurement"
        state: >-
            {% set x = states('sensor.POut') %}
            {% set y = states('sensor.tasmota_sml_curr_w') %}
            {% if x != 'unavailable' and y != 'unavailable' %}
            {{ min(max(x | float | int - y | float, -600), 600) }}
            {% else %}
            0
            {% endif %}   

Gruß
Jens

1 „Gefällt mir“

Ich denke, du kannst dir die if-Verzweigung sparen, wenn du die states vorher in ein float wandelst und einen Default-Wert setzt, für den Fall, dass der Wert nicht gewandelt werden kann.
Damit solltest du dir auch das Wandeln in der min/max Funktion sparen können.

{% set x = float(states('sensor.POut'), 0) %}
{% set y = float(states('sensor.tasmota_sml_curr_w'), 0) %}
{{ min(max(x - y, -600), 600) | round(0) }}

Hallo BOP,
ich bin schon froh gewesen, das es so funktioniert, deine Version ist noch schlanker.
Hab’s jetzt so übernommen:

        state: >-
            {% set x = int(states('sensor.POut'), 0) %}
            {% set y = int(states('sensor.tasmota_sml_curr_w'), 0) %}
            {{ min(max(x - y, -600), 600) }}

Danke & Gruß
Jens