3-Punkt Regler für 3-Wegeventil

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

Hey, dank Dir, war schon eine Weile auf der Suche nach so etwas. Macht der Sigma Delta Output dasselbe, was auch ein normaler Heizregler für diese einfachen Mischermotoren macht? Also kurze und lange Stellimpulse je nach PID Stellwert? Kann man auch bestimmen in welche Richtung der Mischer fährt zur Initialisierung? Also 100% oder 0% oder eben Kalt oder Warm?