Mischersteuerung mit ESP32 und ESP Home

Hier könnt Ihr eure Smart Home Projekte Vorstellen.


Antworten
Einstein
Beiträge: 21
Registriert: Do 12. Jan 2023, 21:27

Mischersteuerung mit ESP32 und ESP Home

Beitrag von Einstein »

Hallo

Seit ich meinen Heizkessel habe bin ich am überlegen wie ich am Besten die Rücklauftemperaturanhebung regele.
(Athmos Vergaserkessel)

Die vom Kesselhesteller enpfohlene war ein einfaches Thermostat was bei einer bestimmten Temperatur geöffnet hat.
Funktioniert war mir aber zu unflexibel.
(Ladomat)

Also habe ich mich dagegen entschieden und stattdessen einen 3-Wegemischer eingebaut.
Denn möcht ich jetzt regeln.

  1. Versuch die Heizungssteuerung (Resol DeltaSolMX)
    Schöne Steuerung mit vielen Funktionen und ein und Ausgängen bin zufrieden damit aber die Mischersteuerung ist nicht die beste.
    Nachteile:
    • Einfache Regelung (Die Temperatur ist zu hoch na dann mache ich den Mscher auf und warte was passiert)
      Speicher ist voll. (Wenn mal mal etwas zu viel in den Ofen legt) Jetzt pumpen wir den Speicher so lange im Kreis bis er unter der eingestellten Temperatur ist.

    Vorteil:
    • Das Gerät funktioniert bis jetzt ohne einen Fehler und immer noch meine Backuplösung weil der Rest der Anlage so gut läuft und ich den Regler auch über Netzwerk auslesen kann.

  2. Versuch Hausautomations über FHEM
    Nachteil:
    • Ich bekomme einfach keine dauerhaft stabilen Temperaturen (Sensoren) dadurch Fehleranfällig.

    Vorteil:
    • PID - Regler
      You kan script it you can do it.

Ich würde dabei bleiben allerdings die Sensoren.

  1. Versuch jetzt mit ESP32
    Soll alle Vorteile haben ohne die oben genannten Nachteile.
    • Soll nur mit Strom funktionieren
      Alle Sensoren direkt angeschlossen
      Kurze Leitungen (Derzeit sind zwichen Steuerung und Kessel ca. 20m Leitungen)
      Ohne Netzwerk Cloud und Internet funktionieren.
      Nicht viel kosten

Hardware:

  • ESP32
    Relaisbord (SSR) von Chinese des Vertrauens
    Temperatursensoren DS18B20
    Wiederstand xxxOhm für Temperatursensoren
    Lötzubehör

Software: Home Assistant mit ESPHome

Die Theorie:
Systemskizze siehe im Anhang.
Der Mischer arbeitet wie ein "Time Based Cover" er braucht eine Zeit x um auf- und zufahren. Alle Werte dazwichen können errechnet werden. und das macht das Cover bereits.
Die Regelung soll ein PID-Regeler übernehmen dafür haben wir "PID Climate"
Der Rest sind ein paar einfache Funktionen if und else.
Sollte also kein Problem sein.
Also schnell auf den Schreibtisch alles zusammengesteckt und losprogrammiert.

  1. Problem
    "PID-Climat" redet nicht direkt mit "Time Based Cover"
    Lösung:
    Einen GPIO als PWM Ausgang definieren.
    Somit hat man zwar einen GPIO nutzlos verbraucht kann aber mit "PID-Climat" arbeiten

Internetsuche --> erfolglos. Fragen hier im Forum --> erfolglos. Probieren probieren testen --> nach 1Woche mit einem halben Jahr Pause dazwichen konnte ich das Problem auch lösen

  1. Problem
    Gewünchte Solltemperatur wurde nicht angezeigt.
    Nachlesen hat geholfen ist alles optional einstellbar. --> gelöst

Derzeitiger Fortschritt:
Hardware liegt auf meinem Schreibtisch.
Software sollte funktionieren. (siehe unten)

Weitere Planung:
Test am System
Schaltung löten
Kabel zusammenstellen
Alles in einen Kasten bauen und nutzen
(Dislpay anbauen)

Stand 12.11.2023

Code: Alles auswählen

output:
  - platform: esp32_dac
    pin: GPIO25
    id: dac_output

switch:
  - platform: gpio
    pin: 18
    name: "Mischer_auf"
    id: relay1
    inverted: true
    interlock: [relay2]

  - platform: gpio
    pin: 19
    name: "Mischer_zu" 
    id: relay2 
    inverted: true
    interlock: [relay1]  

dallas:
  - pin: 23
    update_interval: 10s
sensor:
  - platform: dallas
    name: "Rücklauf"
    address: 0xe43c01d607557628
    id: Ruecklauf 
  
- platform: dallas name: "Vorlauf" address: 0xc13c01d607623128 id: Vorlauf - platform: dallas name: "Zuleitung" address: 0xdd3c01d60766a728 id: zuleitung
- platform: pid name: "PID Climate Result" type: RESULT on_value: then: - climate.control: id: pid_mischer target_temperature: !lambda |- if (id(Vorlauf).state >= 95) { return 20; } else if(id(zuleitung).state >= 70) { return id(zuleitung).state + 3; } else { return 73; }
- platform: pid name: "PID Climate HEAT" id: pidmi type: HEAT accuracy_decimals: 0 on_value: then: - cover.control: id: mischer_kessel #position: !lambda |- # return id(pidmi).state/100; position: !lambda |- if (id(pidmi).state/100 - id(mischer_kessel).position >= 0.01) { return id(pidmi).state/100; } else if (id(pidmi).state/100 - id(mischer_kessel).position <= -0.01) { return id(pidmi).state/100; }
cover: - platform: time_based name: "Mischer_Kessel" id: mischer_kessel open_action: - switch.turn_on: relay1 open_duration: 2.1min close_action: - switch.turn_on: relay2 close_duration: 2.1min stop_action: - switch.turn_off: relay1 - switch.turn_off: relay2
climate: - platform: pid name: "PID Climate Controller" id: pid_mischer sensor: Ruecklauf default_target_temperature: 73°C heat_output: dac_output visual: min_temperature: 10 max_temperature: 90 control_parameters: kp: 0.49460 ki: 0.00487 kd: 12.56301 output_averaging_samples: 5 # smooth the output over 5 samples derivative_averaging_samples: 5 # smooth the derivative value over 10 samples deadband_parameters: threshold_high: 0.2°C # deadband within +/-0.2°C of target_temperature threshold_low: -0.2°C

Ich würde mich über Verbesserungvorschläge freuen.

Dateianhänge
Kessel.PNG
Kessel.PNG (13.83 KiB) 115 mal betrachtet
Einstein
Beiträge: 21
Registriert: Do 12. Jan 2023, 21:27

Re: Mischersteuerung mit ESP32 und ESP Home

Beitrag von Einstein »

Neues Update

Die Ich habe die Regelung eingebaut.
Nachdem ich alles richtig angeschlossen habe, die richtigen Regelparameter eingestellt habe, keine defekten Relais mehr verbaut habe, (die Heizung ein paar mal gekocht hat) funktioinert die Regelung jetzt erstmal. Jetzt geht es am optimieren.
Aktuell bin ich mit dem Einschwingverhalten noch nicht zufrieden (derzeit +- 3° Ziel +-1°)
Die Temperatur wird auf +- 0,5° gehalten (Ziel +-0,2°)
Hier die aktuelle Konfiguration

Code: Alles auswählen

output:
  - platform: esp32_dac         #Dummy für Ausgang PID Modul
    pin: GPIO25
    id: dac_output


switch:
  - platform: gpio
    pin: 19
    name: "Mischer_zu"
    id: relay1
    #inverted: true
    interlock: [relay2]

  - platform: gpio
    pin: 18
    name: "Mischer_auf" 
    id: relay2 
    #inverted: true
    interlock: [relay1]  

dallas:
  - pin: 23
    update_interval: 10s

#[22:19:05][D][dallas.sensor:082]:   Found sensors:
#[22:19:05][D][dallas.sensor:084]:     0x0e011453f595aa28
#[22:19:05][D][dallas.sensor:084]:     0xe43c01d607557628
#[22:19:05][D][dallas.sensor:084]:     0xc13c01d607623128
#[22:19:05][D][dallas.sensor:084]:     0xdd3c01d60766a728
#[20:01:35][D][dallas.sensor:084]:     0xe03c01d607c7c728 sensor:

sensor:
  - platform: dallas
    name: "Rücklauf"
    address: 0xe03c01d607c7c728
    #address: 0xe43c01d607557628
    #address: 0x0e011453f595aa28
    id: Ruecklauf 

  
- platform: dallas name: "Vorlauf" address: 0xc13c01d607623128 id: Vorlauf - platform: dallas name: "Zuleitung" #address: 0xe43c01d607557628 #address: 0xe03c01d607c7c728 address: 0x0e011453f595aa28 id: zuleitung - platform: template name: "Sollwert_Rücklauf" id: sw_rl
- platform: pid name: "PID Climate Result" type: RESULT on_value: # Berrechnung der Solltemperatur then: - climate.control: id: pid_mischer target_temperature: !lambda |- if (id(Vorlauf).state >= 95) { return 20; } else if(id(zuleitung).state >= id(sw_rl).state -3) { return id(zuleitung).state + 3; } else { return id(sw_rl).state; }
- platform: pid #name: "PID Climate Cool" name: "PID Climate HEAT" id: pidmi #type: COOL type: HEAT accuracy_decimals: 0 # Steuerung der Mischers abgreifen der Einstellung des PWM Ausgangs on_value: then: - cover.control: id: mischer_kessel #position: !lambda |- # return id(dac_output).set_level; position: !lambda |- if (id(pidmi).state/100 - id(mischer_kessel).position >= 0.01) { return id(pidmi).state/100; } else if (id(pidmi).state/100 - id(mischer_kessel).position <= -0.01) { return id(pidmi).state/100; } - platform: pid name: "PID Climate KP" type: KP - platform: pid name: "PID Climate KI" type: KI - platform: pid name: "PID Climate KD" type: KD - platform: pid name: "PID Climate PROPORTIONAL" type: PROPORTIONAL - platform: pid name: "INTEGRAL" type: INTEGRAL - platform: pid name: "PID DERIVATIVE" type: DERIVATIVE cover: #Mischerausgang - platform: time_based name: "Mischer_Kessel" id: mischer_kessel open_action: - switch.turn_on: relay2 open_duration: 2.2min close_action: - switch.turn_on: relay1 close_duration: 2.2min stop_action: - switch.turn_off: relay1 - switch.turn_off: relay2
climate: - platform: pid name: "PID Climate Controller" id: pid_mischer sensor: Ruecklauf default_target_temperature: 73°C heat_output: dac_output #cool_output: dac_output visual: #Temperaturanzeige in Home Assistant min_temperature: 10 max_temperature: 90 control_parameters: kp: 0.05 ki: 0.00166 kd: 0.0 #1.20249 output_averaging_samples: 5 # smooth the output over 5 samples derivative_averaging_samples: 5 # smooth the derivative value over 10 samples deadband_parameters: threshold_high: 0.2°C # deadband within +/-0.2°C of target_temperature threshold_low: -0.2°C on_state: then: - sensor.template.publish: id: sw_rl #position: !lambda |- # return id(pidmi).state/100; state: !lambda |- return id(pid_mischer).target_temperature; button: - platform: template #für Autotune (erste Einstellung) name: "PID Climate Autotune"
on_press: - climate.pid.autotune: pid_mischer #[20:52:18][I][pid.autotune:124]: pid_climate_controller: PID Autotune finished! #[20:52:18][I][pid.autotune:140]: pid_climate_controller: PID Autotune: #[20:52:18][I][pid.autotune:141]: State: Succeeded! #[20:52:18][I][pid.autotune:158]: All checks passed! #[20:52:18][I][pid.autotune:162]: Calculated PID parameters ("Ziegler-Nichols PID" rule): #[20:52:18][I][pid.autotune:163]:
#[20:52:18][I][pid.autotune:164]: control_parameters: #[20:52:18][I][pid.autotune:165]: kp: 0.16977 #[20:52:18][I][pid.autotune:166]: ki: 0.00499 #[20:52:18][I][pid.autotune:167]: kd: 1.44299 #[20:52:18][I][pid.autotune:168]:
#[20:52:18][I][pid.autotune:169]: Please copy these values into your YAML configuration! They will reset on the next reboot. #[20:52:18][D][pid.autotune:175]: Alternative Rules: #[20:52:18][D][pid.autotune:207]: Rule 'Ziegler-Nichols PI': #[20:52:18][D][pid.autotune:208]: kp: 0.12732, ki: 0.00225, kd: 0.00000 #[20:52:18][D][pid.autotune:207]: Rule 'Pessen Integral PID': #[20:52:18][D][pid.autotune:208]: kp: 0.19806, ki: 0.00728, kd: 2.02018 #[20:52:18][D][pid.autotune:207]: Rule 'Some Overshoot PID': #[20:52:18][D][pid.autotune:208]: kp: 0.09422, ki: 0.00278, kd: 2.13562 #[20:52:18][D][pid.autotune:207]: Rule 'No Overshoot PID': #[20:52:18][D][pid.autotune:208]: kp: 0.05659, ki: 0.00166, kd: 1.20249 #[20:52:18][I][pid.autotune:181]: pid_climate_controller: Autotune completed
Dateianhänge
TempRL_detail.PNG
TempRL_detail.PNG (43.63 KiB) 53 mal betrachtet
TempRL.PNG
TempRL.PNG (48.52 KiB) 53 mal betrachtet
Antworten