Ustatnia modyfikacja 21 listopada 2023 przez Olek
Po zainstalowaniu fotowoltaiki i zebraniu na koncie około 3MWh energii trzeba było się zastanowić jak ją wykorzystać. Niestety pomby ciepła nie mam i raczej nie będę miał bo zwykłe powietrzne to nie ta sprawność a koszt znaczące. Jednie może w przyszłości pomba gruntowa z pionowymi odwiertami ale to przyszłość. Na razie najprostszym rozwiązaniem było dogrzewanie powietrza. Rozprowadzenie już mam dzięki rekuperacji. Oryginalne rozwiązanie do istniejącego rekuperatora drogie i jak zwykle trzeba będzie potem kombinować jak nad tym przejąć kontrolę. Dlatego postanowiłem samemu takie urządzenie zbudować.
Znalazłem fajną niedrogą nagrzewnicę EKA 200-6,0-3f SALDA1 i postanowiłem ją u siebie zainstalować. Nagrzewnice zainstalowałem na kanale wylotowym z rekuperatora do pomieszczeń. Aby się zmieściła musiałem też zmodyfikować fragment kanału powrotu. To jest tylko sam aspekt fizycznego montażu nagrzewnicy.
Trzeba jeszcze ją jakoś sterować. Nagrzewnica ma zainstalowane 3 grzałki o łącznej mocy 6kW, zasilana z 3x400V. Czyli grzałki 400V zasilane z trzech faz. Okład oparty na trikach sterownych metodą PWM. Regulator PID zbindowany programowo na bazie mikrokontrolera ESP32 prostym mały wyświetlaczem OLED 0,96 ” i trzema przyciskami. komunikacja z systemem za pomocą WIFi. Początkowo napisałem swój własny kod i komunikowałem się z Home Assistant za pomocą protokołu MQTT. Później jednak przeszedłem na moim zdaniem prostsze rozwiązanie a mianowicie skorzystałem z mechanizmów ESPOHome. W tej wersji już nie wykorzystuje wyświetlacza i przycisków. Zresztą sterownik umieściłem jak najbliżej nagrzewnicy czyli pod sufitem i w zamkniętej obudowie co bardzo utrudnia bezpośredni dostęp do niego.
Oprócz sterownika zamontowałem też stycznik 3 fazowy który jest sterowany równolegle i bezpośrednie z termostatów w nagrzewnicy. To ze względów bezpieczeństwa by konwencjonalne zabezpieczenia w nagrzewnicy miały priorytet przed moim sterownikiem. Tutaj już są większe moce i bezpieczeństwo i niezawodność na pierwszym planie. Oprócz stycznika mamy również dodatkowe czujniki temperatur które obsługuje sterownik. Jeden zainstalowany na wylocie z nagrzewnicy sprawdzający temperaturę nagrzanego powietrza, drugi na radiatorze traków do kontroli ich pracy. Z praktyki zauważyłem że zabezpieczenie termiczne nagrzewnicy jest nastawione na około 40 stopni C i w takim razie nie ma sensu ustawiać sterowni na osiągnięcie tej temperatury powyżej tej wartości.
W samej logice domu (HA) można synchronizować działanie nagrzewnicy z pracą rekuperatora. Można tak ustawić aby podczas pracy nagrzewnicy uruchomić większą wydajność rekuperatora co powoduje większy przepływ powietrza przez nagrzewnicę. Na najwyższym poziomie możemy otrzymać 150m3/h powietrza o temperaturze 40C. Przy tych parametrach i tak wykorzystujemy około 40% mocy nagrzewnicy i jak widać trochę ją przewymiarowałem moc około 3kW by wystarczyła tylko przy tym wydaniu nie mamy nagrzewnicy 3-fazowej na której mi zależało, Chciałem równomiernie obniżać wszystkie 3 fazy. W późniejszych pracach chcę tak opanować kontrole zasilania w domu aby sterować/kontrolować zapotrzebowaniem mocy na każdej fazie. To wiąże się z ewentualnie pracą off grid (poza zasilania z sieci) i z ograniczeniem mocy w tym zakresie. Teraz oprogramowanie i sterownik równomiernie obciąża wszystkie trzy fazy, ale w prosty sposób można to zmienić i kontrolować każdą fazę niezależnie, no może każdą parę faz bo mamy 400V.
Tak jak już wspomniałem oprogramowanie bazuje na pakiecie ESPHome. Jest w nim zaimplementowane pełne starowanie PID z auto kalibracją.

Konfiguracja nagrzewnicy w ESPHome
esphome:
name: "nagrzewnica-powietrza"
friendly_name: Nagrzewnica powietrza
on_boot:
then:
- output.ledc.set_frequency:
id: pwm
frequency: "10Hz"
esp32:
board: esp32dev
framework:
type: arduino
# Enable logging
logger:
level: VERBOSE
# Enable Home Assistant API
api:
encryption:
key: "xxxx"
ota:
password: "xxx"
wifi:
networks:
- ssid: !secret wifi_ssidK
password: !secret wifi_passwordK
- ssid: !secret wifi_ssidN
password: !secret wifi_passwordN
- ssid: !secret wifi_ssidA
password: !secret wifi_passwordA
# Enable fallback hotspot (captive portal) in case wifi connection fails
manual_ip:
static_ip: 192.168.1.215
gateway: 192.168.1.1
subnet: 255.255.255.0
dns1: 192.168.1.1
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Nagrzewnica Fallback Hotspot"
password: "xxx"
web_server:
port: 80
captive_portal:
#number:
# - platform: template
# name: "Template number"
# id: tn_1
# optimistic: true
# min_value: 10
# max_value: 50
# step: 1
#Example configuration entry
dallas:
- pin: GPIO2
id: t1
- pin: GPIO4
id: t2
- pin: GPIO15
id: t3
binary_sensor:
- platform: gpio
pin:
number: GPIO27
inverted: true
mode:
input: true
pullup: true
name: "Załączony stycznik"
device_class: running
id: zal_stycznik
- platform: template
name: "Ochrona termostat"
lambda: "return not(id(zal_stycznik).state == id(wlacz_stycznik).state);"
id: ochrona
sensor:
- platform: dallas
dallas_id: t1
address: 0x3302146356ceff28
name: "Temperatura wyjścia"
id: temp_wyj
- platform: dallas
dallas_id: t2
address: 0xf700000624650728
name: "Temperatura triak"
- platform: pid
name: "PID Climate RESUL"
type: RESULT
- platform: pid
name: "PID Climate HEAT"
type: HEAT
#RESULT - The resulting value (sum of P, I, and D terms).
#ERROR - The calculated error (setpoint - process_variable)
#PROPORTIONAL - The proportional term of the PID controller.
#INTEGRAL - The integral term of the PID controller.
#DERIVATIVE - The derivative term of the PID controller.
#HEAT - The resulting heating power to the supplied to the heat_output.
#COOL - The resulting cooling power to the supplied to the cool_output.
#KP - The current factor for the proportional term of the PID controller.
#KI - The current factor for the integral term of the PID controller.
#KD - The current factor for the differential term of the PID controller.
output:
- platform: ledc
pin: GPIO5
id: pwm
- platform: gpio
pin: GPIO18
id: output_stycznik
switch:
- platform: output
name: "Włącz stycznik"
output: output_stycznik
id: wlacz_stycznik
button:
- platform: template
name: "Test PWM"
on_press:
then:
# Must be turned on before setting frequency & level
- output.turn_on: pwm
# Frequency sets the wave size
#- output.ledc.set_frequency:
# id: pwm
# frequency: "10Hz"
# level sets the percentage time the PWM is on
- output.set_level:
id: pwm
level: "50%"
- delay: 5s
- output.turn_off: pwm
- platform: template
name: "PID Climate Autotune"
on_press:
- climate.pid.autotune: clim_pid
climate:
- platform: pid
name: "PID Climate Controller"
sensor: temp_wyj
default_target_temperature: 21°C
visual:
min_temperature: 10
max_temperature: 50
heat_output: pwm
id: clim_pid
control_parameters:
kp: 0 #0.49460
ki: 0 #0.00487
kd: 0 #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.5°C # deadband within +/-0.5°C of target_temperature
threshold_low: -0.5°C
on_state:
- lambda: "if (x.action == CLIMATE_ACTION_HEATING) id(wlacz_stycznik).turn_on(); else id(wlacz_stycznik).turn_off();"
# +---------------+|
# | | | | | |
# [ EN ] |o o| [GPIO23] [VSPI MOSI]
# [RTC_GPIOO] [Sensor VP] [ADC1 CH0] [GPIO36] |o o| [GPIO22] [ I2C SCL ]
# [RTC_GPIO3] [Sensor VN] [ADC1 CH3] [GPIO39] |o ESP-WROOM-32 o| [GPIO1 ] [UART O TX]
# [RTC_GPIO4] [ADC1 CH6] [GPIO34] |o o| [GPIO3 ] [UART O RX]
# [RTC_GPIO5] [ADC1 CH7] [GPIO35] |o o| [GPIO21] [ 12C SDA ]
# [RTC_GPIO9] [ TOUCH9 ] [ADC1 CH4] [GPIO32] |o o| [GPIO19] [VSPI MISO]
# [RTC_GPIO8] [ TOUCH8 ] [ADC1 CH5] [GPIO33] |o PIN 30 o| [GPIO18] [VSPI CLK ]
# [RTC_GPIO6] [ DAC1 ] [ADC2 CH8] [GPIO25] |o o| [GPIO5 ] [VSPI CSO ]
# [RTC_GPI07] [ DAC2 ] [ADC2 CH9] [GPIO26] |o DEVKIT V1 o| [GPIO17] [UART 2 TX]
# [RTC_GPIO17] [ TOUCH7 ] [ADC2 CH7] [GPIO27] |o o| [GPIO16] [UART 2 RX]
#[RTC_GPIO16] [HSPI CLK] [ TOUCH6 ] [ADC2 CH6] [GPIO14] |o o| [GPIO4 ] [ADC2 CHO ] [TOUCHO] [RTC_GPIO10]
#[RTC_GPIO15] [HSPI MISO] [TOUCHS ] [ADC2 CH5] [GPIO12] |o o| [GPIO2 ] [ADC2 CH2 ] [TOUCH2] [RTC_GPIO12]
#[RTC_GPIO14] [HSPI MOSI] [TOUCH4 ] [ADC2 CH4] [GPIO13] |o o| [GPIO15] [ADC2 CH3 ] [TOUCH3] [HSPI CSO] [RTC_GPIO13]
# [ GND ] |o o| [ GND ]
# [ VIN ] |o o| [ 3V3 ]
# | |
# | |usb| |
#
# +---------------+|
# | | | | | |
# 1 [ EN ] |o o| [GPIO23]
# 2 [GPIO36] |o o| [GPIO22] I2C-SCL
# 3 [GPIO39] |o ESP-WROOM-32 o| [GPIO1 ]
# 4 [GPIO34] |o o| [GPIO3 ]
# 5 [GPIO35] |o o| [GPIO21] I2C-SDA
# 6 [GPIO32] |o o| [GPIO19]
# 7 [GPIO33] |o PIN 30 o| [GPIO18] ZAL_MOC
# 8 [GPIO25] |o o| [GPIO5 ] PWM_MOC
# 9 [GPIO26] |o DEVKIT V1 o| [GPIO17]
# 10 styk_styczika_głónego [GPIO27] |o o| [GPIO16]
# 1 SW1 [GPIO14] |o o| [GPIO4 ] T2
# 2 SW2 [GPIO12] |o o| [GPIO2 ] T1
# 3 SW3 [GPIO13] |o o| [GPIO15] T3
# 7 [ GND ] |o o| [GND ]
# 8 [ VIN ] |o o| [ 3V3 ]
# | |
# | |usb| |
#






