Hallo,
ich suche einen Weg, um einen Wert in einer Automation nur dann anzupassen, wenn er mehr als 10% abweicht.
Ich setze in den Nachtstunden in meinen Wechselrichter (APSystems) den aktuellen Stromverbrauch. Da ich das aber nicht live machen möchte (verschleiß des eeprom) möchte ich den Wert alle 5 Minuten anpassen, aber auch nur, wenn sich der Stromverbrauch um mindestens 10% veringert oder erhöht hat.
Aktuell setze ich jede 5 minuten den aktuellen wert, das klappt gut - aber jetzt setze ich diesen wert auch, wenn sich hier nur einige Watt unterscheiden. Das halte ich für unnötig.
Hat das schon mal jemande umgesetzt und kann mir evtl einen Tipp geben?
10% bezogen auf den letzen Wert und den neuen Wert?
Oder 10% innerhalb von einem 5 min Fenster?
Gruß
Osorkon
Hallo @Osorkon
bezogen auf den letzten wert.
Wenn der letzte Wert 200 ist, und der neue wert 210 - denn soll die der neue Wert nicht geschrieben werden, das sich die 210 noch im Bereich der + 20% befindet.
Ist der neue Wert 230 - dann soll wieder der neue Wert geschrieben werden. (außerhalb der 10%)
Muss erst mal mit dem Hund raus.
Danach kann ich Dir gerne eine mögliche Lösung präsentieren.
Also wenn ich es richtig verstanden habe, möchtest Du die Veränderung eines Power Sensor als Auslöser für einen Aktion verwenden. Aber nur wenn der neue Wert mind. 10% höher oder niedriger ist als der alte.
Dann würde eine Automatisierung so ausschauen.
Auslöser ist die Wert Änderung des Sensor.
Und die Bedingung lautet Wertänderung > 10%
Den letzen_wert setze ich im Falle von 0 auf den Wert 1, sonst gibt es eine Division durch 0
alias: 10% Abweichung
description: ""
trigger:
- platform: state
entity_id:
- sensor.xyz
condition:
- condition: template
value_template: |
{% set letzter_wert = iif(trigger.from_state.state | int == 0, 1, trigger.from_state.state | int) %}
{% set neuer_wert = trigger.to_state.state | int %}
{{ (((neuer_wert - letzter_wert) | abs) / letzter_wert) > 0.1 }}
action:
- Deine Aktion
mode: single
Gruß
Osorkon
1 „Gefällt mir“
Guten Morgen @Osorkon,
vielen Dank schon mal. Ich gehe davon aus, dass wenn ich 5% möchte, dass ich den Wert auf 0.05 ändern muss?
Ja genau.
Du kannst ja das Ergebnis auch mal 100 multiplizieren, dann hast Du Deine %
Gruß
Osorkon
Kann ich auch irgendwie festlegen, dass das obere Limit 800 ist und das untere Limit 30?
Wenn der Wert über 800 steigt, kann dieser nicht mehr gesetzt werden. Da der WR nur Werte zwischen 30 - 800 annimmt.
{% if states('sensor.xy') > 800 %}
wert auf 800 setzen
{% else %}
wert auf aktuellen wert setzen
{% endif %}
das selbe wahrscheinlich noch mal für unter 30.
Entschuldige, aber im HA Scripting bin ich wirklich verloren und muss noch ne Menge lernen.
Willst Du Änderungen die einen Wert < 30 und > 800 ignorieren.
Oder willst bei Änderungen Wert < 30, den Wert 30 setzen und bei Änderungen Wert > 800 den Wert 800 setzen?
Zeige mal bitte wie Deine Aktion ausschaut.
Gruß
Osorkon
Die Idee ist, das er, sobald der Wert 800 Überschreitet, diesen auf 800 setzt.
Geht er unter 30 - soll er 30 einstellen. (also zweiteres in Deiner Frage)
Meine Action:
action:
- service: number.set_value
metadata: {}
data:
value: "{{ states('sensor.strom_einspeisung')|float(0) }}"
target:
entity_id: number.solar_maximale_leistung
Meine komplette Automation:
alias: 10% Abweichung
description: ""
trigger:
- platform: state
entity_id:
- sensor.strom_einspeisung
condition:
- condition: template
value_template: >
{% set letzter_wert = iif(trigger.from_state.state | int == 0, 1,
trigger.from_state.state | int) %}
{% set neuer_wert = trigger.to_state.state | int %}
{{ (((neuer_wert - letzter_wert) | abs) / letzter_wert) > 0.1 }}
- condition: numeric_state
entity_id: sensor.strom_einspeisung
above: 30
action:
- service: number.set_value
metadata: {}
data:
value: "{{ states('sensor.strom_einspeisung')|float(0) }}"
target:
entity_id: number.solar_maximale_leistung
mode: single
wie du sieht, hab ich da schonmal versucht mit über “30” zu arbeiten.
Würde ich so umsetzen:
alias: 10% Abweichung
description: ""
trigger:
- platform: state
entity_id:
- sensor.strom_einspeisung
condition:
- condition: template
value_template: >
{% set letzter_wert = iif(trigger.from_state.state | int == 0, 1,
trigger.from_state.state | int) %} {% set neuer_wert =
trigger.to_state.state | int %} {{ (((neuer_wert - letzter_wert) | abs) /
letzter_wert) > 0.1 }}
action:
- choose:
- conditions:
- condition: numeric_state
entity_id: sensor.strom_einspeisung
below: 30
sequence:
- service: number.set_value
metadata: {}
data:
value: 30
target:
entity_id: number.solar_maximale_leistung
- conditions:
- condition: numeric_state
entity_id: sensor.strom_einspeisung
above: 800
sequence:
- service: number.set_value
metadata: {}
data:
value: "800"
target:
entity_id: number.solar_maximale_leistung
default:
- service: number.set_value
metadata: {}
data:
value: "{{ states('sensor.strom_einspeisung')|float(0) }}"
target:
entity_id: number.solar_maximale_leistung
mode: single
Einen Schönheitsfehler hat diese Automatisierung.
Ändert sich der Wert sensor.strom_einspeisung kontinuierlich aber immer in kleinen Schritten von <10% wird niemals ein neuer Wert für number.solar_maximale_leistung gesetzt.
Hier würde sich anbieten als Bedingung die Differenz zwischen number.solar_maximale_leistung & sensor.strom_einspeisung zu ermitteln und wenn diese > 10% beträgt, den neunen Wert für number.solar_maximale_leistung zu setzen.
Gruß
Osorkon
Das wiederum würdest Du über einen Helfer machen? Oder kann das auch in die Automation?
Einfach die Template Bedingung umbauen:
{% set letzter_wert = iif(states('number.solar_maximale_leistung') | int == 0, 1, states('number.solar_maximale_leistung') | int) %}
{% set neuer_wert = states('sensor.strom_einspeisung') | int %}
{{ (((neuer_wert - letzter_wert) | abs) / letzter_wert) > 0.1 }}
Gruß
Osorkon
1 „Gefällt mir“
Wow - danke. Das ist echt gut. Ich werde mal versuchen das zu verstehen um das zukünftig selbst zu können…
Herzlichen Dank!
1 „Gefällt mir“