Guten Abend zusammen,
ich benutze schon länger ESPHome. Besonders um Sensordaten zu sammeln oder einzelne Relays zu schalten. Bis jetzt habe ich alles über die Home Assistent platform automatisiert. Bei diesem Projekt geht es um das Steuern eines 3-Wege Heizungsventil. Da nie zu 100 % das WLAN zur Verfügung steht, wollte ich das als erstes Projekt sehen, um mich mit Automatisierungen direkt auf dem ESP32 zu beschäftigen. Leider möchte es mir nicht so richtig gelingen und ich habe das Gefühl, dass ich was Grundlegendes nicht verstanden habe. Ich würde mich somit über jede Hilfe freuen.
Ich möchte mit einem ESP32 einen 3 Wegemischer für einen Heizkreis steuern.
Das Ventil hat zwei Anschlüsse. Eins zum auffahren und eins zum zu fahren. Somit habe ich 2 Relays die angesteuert werden müssen, gleichzeitig sollten sich beide Relays gegenseitig verriegeln lassen. Das Ventil braucht 120 Sekunden, um einmal komplett zu oder auf zu fahren.
Ein Temperatursensor am Heizungsrohr misst die Temperatur und ist somit der entscheidende Ist-Wert. Dieser Ist-Wert soll über ein PID Regler ausgewertet werden. Über die sigma_delta_output platform soll der float Ausgang des PID Reglers den Binären Ausgang an den Relays schalten.
Es ist zusätzlich ein (fiktiver)Sensor integriert, der den Status des Ventils „errechnet“ wieder gibt. Das passiert dadurch das die eingeschaltete Zeit eines Relay einen Sensor höher oder niedriger rechnet und das dann als % Wert ausgibt.
Wenn der ESP neu startet, wird dem fiktiven Sensor die Position 100 % gegeben und der ESP fährt als Erstes für 120 Sekunden das Ventil zu, um sich zu kalibrieren.
Hier ist mein Code:
esphome:
name: heizungssteuerung
friendly_name: Heizungssteuerung
on_boot:
- switch.turn_on: Vzu
- delay: 120s
- switch.turn_off: Vzu
.
.
.
switch:
- platform: gpio
pin: GPIO4
name: "Ventil_auf"
id: Vauf
restore-mode: ALWAYS_OFF
interlock: Vzu
on-turn-on:
then:
- lambda: |-
id(Ventil).publish_state(id(Ventil).state + 100.0/120.0);
- platform: gpio
pin: GPIO5
name: "Ventil_zu"
id: Vzu
restore-mode: ALWAYS_OFF
interlock: Vauf
on-turn-on:
then:
- lambda: |-
// Verringere den Wert um 100%/120 Sekunden
id(Ventil).publish_state(id(Ventil).state - 100.0/120.0);
# Hier wird der Sensor Definiert; Position 3-Wege Ventil
sensor:
- platform: template
name: "Position Ventil"
id: Ventil
unit_of_measurement: "%"
accuracy_decimals: 2
initial_value: "100"
update_interval: 1s
- platform: dht
pin: GPIO13
name: "Heizung Vorlauf"
id: TempVor
update-interval: 5s
climate:
- platform: pid
name: "PID Regler"
sensor: TempVor
default_target_temperature: 24°C
heat_output: oeffnen
cool-output: schliesser
control_parameters:
kp: 0.49460
ki: 0.00487
kd: 0
output_averaging_samples: 1
derivative_averaging_samples: 5
deadband_parameters:
threshold_high: 2°C
threshold_low: -2°C
output:
- platform: sigma_delta_output
update_interval: 10s
id: oeffnen
turn_on_action:
then:
- output.turn_on: Vauf
turn_off_action:
then:
- output.turn_off: Vauf
- platform: sigma_delta_output
update_interval: 10s
id: schliesser
turn_on_action:
then:
- output.turn_on: Vzu
turn_off_action:
then:
- output.turn_off: Vzu