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| | #






