Ich möchte mit einem Stromsensor meine Lüfter für die PV-Batterie steuern.
Sie einfach nur an/aus zu steuern ist ja nicht das Problem, aber ich möchte sie bei Erreichen eines Schwellwertes ein- und bei Unterschreiten des Schwellwertes mit einer Verzögerung ausschalten.
Nun ist es aber auch so, dass die Verzögerung stumpf läuft und ein neuer Trigger (Schwellwert wieder überschritten) die Verzögerung nicht unterbricht.
Dadurch fällt das Relais irgendwann ab und geht direkt wieder an.
Wie kann ich das besser lösen als mit nachfolgendem Codeabschnitt ?
interval:
- interval: 10s
then:
- if:
condition:
lambda: !lambda |-
return ((id(strom).state >20) || (id(strom).state <(-20)));
then:
- switch.turn_on: relay
- if:
condition:
for:
time: 300s
condition:
lambda: !lambda |-
return ((id(strom).state <12) || (id(strom).state >(-12)));
then:
- switch.turn_off: relay
Genauso habe ich bis dato noch nicht herausgefunden, wie ich den Status vom Switch nur bei Statusänderung angezeigt bekomme anstatt alle 10s.
Danke im Voraus.
Ich nehme mal an das Strom ein von dir definierter Sensor ist ?
Hast du das mal mit Valuerange versucht ?
sensor:
- platform: dht
humidity:
name: "Living Room Humidity"
on_value_range:
- above: 65.0
then:
- switch.turn_on: dehumidifier1
- below: 50.0
then:
- switch.turn_off: dehumidifier1
temperature:
name: "Living Room Temperature"
Beispiel aus der Esphome Doku :
https://esphome.io/automations/actions/
Ja, “Strom” ist die ID vom Stromsensor.
Mit Range kann ich nicht arbeiten, da ich auch negative Werte bekomme.
Strom fließt ja in beide Richtungen 
Ich habe es nicht getestet aber Negativ sollte auch gehen.
sensor:
- platform: dht
# ...
on_value_range:
- below: 5.0
then:
- switch.turn_on: relay_1
- above: 5.0
below: 10.0
then:
- switch.turn_on: relay_2
- above: 10.0
then:
- switch.turn_on: relay_3
Das wird ja automatisch aufgerufen wenn sich der Wert des Sensors ändert, das wolltest du ja auch haben oder ?
Nein, Negativwerte gingen nicht, deswegen ja mit Lambda.
Geht das :
on_value:
then:
- if:
condition:
lambda: 'return x < -5.0;'
then:
- logger.log: "Value is currently below -5"
Das sollte bei jeder Wertänderung des Sensors anspringen.
muss ich morgen mal testen … aber so ähnlich hatte ich es vorher:
n_value:
then:
- if:
condition:
lambda: !lambda |-
return ((id(strom).state >20) || (id(strom).state <(-20)));
then:
- switch.turn_on: relay
- if:
condition:
lambda: !lambda |-
return ((id(strom).state <12) || (id(strom).state >(-12)));
then:
- delay: 300s
- switch.turn_off: relay
Und da wurde das Relais auch aus und direkt wieder eingeschaltet.
Value müsste der Stromwert vom Sensor sein,dann müsste X der aktuelle Wert wie im Beispiel sein und du brauchst kein state.
Oder wie hast du ihn angelegt .
Das hier könnte etwas der Richtung sein :
So wie ich die Beiträge verstanden habe nur mit Script.
Aber ist doch nicht schlimm ?
Du lagerst den Delay und das ausschalten aus ins Script und prüfst dann im ersten Fall ob es läuft falls ja schaltest du es aus .
hab’s tatsächlich eben auch so umgeschrieben.
Jetzt wird nur das Skript alle 10s gestartet auf Grund der Bedingung.
Muss mich mit Skripts mal mehr auseinandersetzen, jahrelange IEC 61131 Programmierung kriegt man schlecht weg.
Wieso alle 10Sekunden .
Hast du das noch mit Intervall?
Falls ja stell um auf onvalue , das wird nur bei Änderung vom Wert aufgerufen.
Umsetzung z. B. So
Bedingung zum einschalten ist erfüllt
Prüfe ob Script läuft
Falls ja stoppe es
Wenn nein Schalter an
Bedingung zum ausschalten ist erfüllt
Starte Script
Script :
Delay 300
Schalte aus
by HarryP: Post formatiert
sensor:
- platform: adc
pin: A0
filters:
- calibrate_linear:
- 0 -> 0
- 1 -> 200
- lambda: return (round (x));
- median:
window_size: 5
send_every: 5
send_first_at: 1
unit_of_measurement: "A"
accuracy_decimals: 0
name: "Strom"
id: strom
update_interval: 10s
on_value:
then:
- if:
condition:
- lambda: 'return x >20 || x <(-20);'
then:
- script.stop: reset_delay
- switch.turn_on: relay
- if:
condition:
- lambda: 'return x <12 || x >(-12);'
then:
- script.execute: reset_delay
- id: reset_delay
then:
- delay: 300s
- logger.log: "Zeit abgelaufen"
- switch.turn_off: relay
Aktuell so.
Und klappt es jetzt wie es soll ?
Aktuell kann ich nur sagen, dass das Skript ständig durchläuft.
PV-Batterie ist voll und es kommt noch genug vom Dach.
Werde ich erst sehen, wenn sie allmählich entladen wird.
Hmm durchlaufen soll es doch nicht oder ?
Das muss doch nur ausschalten wenn die Lüfter an sind, oder habe ich das falsch verstanden ?
Bei update_interval: 10s wohl kein Wunder. Warum startest Du es alle 10 Sekunden?
Das ist das Updateintervall des Sensors nicht des Scripts
Ja, die Sensorabfrage ist aktuell alle 10s, reichen würden auch alle 60s.
Die Lüfter stecken in den Batteriemodulen und sollen die Zellen bei Ladung/Entladung kühlen.
Aber auch mit 60s oder 360s würde das Skript permanent durchlaufen.
Habe jetzt eine dritte Bedingung geschaffen, aber das ist nur eine Notlösung:
- if:
condition:
- lambda: 'return x <6 || x >(-6);'
then:
- script.stop: reset_delay
Du hast da doch zwei Bedingungen und nur bei der zweiten soll ausgeschaltet werden ?
Wenn das Script konstant durchläuft ist immer die Abschaltbedingung aktiv ?