Ustatnia modyfikacja 1 stycznia 2024 przez Anita
Tak jak to było w przypadku budowy nagrzewnicy powietrza i przy tym projekcie moim podstawowym celem było wykorzystanie nadmiaru wyprodukowanej energii elektrycznej z fotowoltaiki. Obecnie do podgrzania CWU (ciepłej wody użytkowej) wykorzystywany jest piec gazowy. Zmiana ta będzie korzystna przede wszystkim w okresie letnim, kiedy ogrzewanie jest wyłączone a piec gazowy pracuje jedynie w celu ogrzania wody użytkowej. Zmiana ta pozwoli zupełnie wyłączyć piec gazowy a wodę użytkową podgrzewać za pomocą grzałki elektrycznej tak aby korzystała z energii uzyskiwanej bezpośrednio z paneli słonecznych. Aby dokonać tej zmiany wystarczyłaby zwykła grzałka wstawiona do zasobnika, problem w tym, że mój zasobnik nie posiadał takiej możliwości. Nie znalazłem też innego zasobnika, który wymiarami i sposobem podłączenia mogłby zastąpić obecny zasobnik. Można by oczywiście zastosować inny zasobnik natomiast wiązałoby się to z przeorganizowaniem urządzeń w kotłowni. Nie bez znaczenia jest też fakt, iż zakup nowego zasobnika oraz jego podłączenie i zmodernizowanie instalacji wiąże się z kosztami, które cały projekt czyniłyby praktycznie nieopłacalnym. I tu pojawiło się moje autorskie rozwiązanie aby zamiast grzałki wewnątrz zasobnika zastosować grzałkę na zewnątrz (w specjalnym wymienniku) i podłączyć ją z zasobnikiem małym zamkniętym obiegiem.
Tutaj jednak pojawił sie problem bo trudno było znaleźć tak mały i kompletny wymiennik. Dostępne są tylko „gołe” części zamienne do przepływowych podgrzewaczy natomiast wymagają one dorobienia obudowy i kilku dodatkowych elementów. Dlatego zdecydowałem się na wykorzystanie kompletnego nowego podgrzewacza przepływowego. Do mojego projektu zakupiłem podgrzewacz POW Multi 11/13,5/15 o mocy od 9kW do 15kW1 firmy Wijas, polskiego producenta tego typu urządzeń.

Instalacja hydrauliczna polegała na zmodyfikowaniu obecnego podłączenia według zademonstrowanego schematu.
Woda z zasobnika poprzez dolne ujęcie (oryginalnie spust wody) za pomocą pompy jest przepuszczana przez podgrzewacz i po ogrzaniu wraca z powrotem do zasobnika wejściem cyrkulacyjnym. Oprócz pompy zamontowałem kilka ręcznych zaworów (nie przedstawionych na schemacie), dwa przepływomierze i zawory zwrotne oraz zamontowałem dodatkowy czujnik temperatury.
Montaż wykonałem sam metodą zgrzewania (przydatna umiejętność) na bazie rur i kształtek PP.
Sterowanie odbywa się praktycznie jedynie poprzez włączenie pompy obiegu podgrzewacza. Podgrzewacz sam rozpoznaje uruchomiony obieg i utrzymuję odpowiednio nastawioną temperaturę na wyjściu, w moim przypadku jest to 50°C. W tym rozwiązaniu nie ma konieczności zajmowaniavsię sterowaniem grzałek, wbudowana elektronika podgrzewacza sama to reguluje. Obecnie ten mechanizm jest dla mnie w zupełności wystarczający, ale w przyszłości żeby mieć pełną kontrolę nad mocą grzałek i ustawianiem temperatury wykonam swój własny sterownik.
Natomiast konieczny był mechanizm do włączania i wyłączania pompy obiegowej. Jak zwykle posłużył mi do tego prosty układ na bazie ESP32 z modułem przekaźników. Oprócz podstawowej funkcji włącznika posiada również odczyt temperatury z zasobnika – do tego celu użyłem prostego cyfrowego termometru DS18B20. Dodatkowo układ odczytuje również dane z dwóch zamontowanych w instalacji przepływomierzy impulsowych.
Wykonany sterownik przejął również kontrolę nad pompą cyrkulacyjną i steruje nią w bardziej inteligentny sposób niż piec gazowy (wyłączony w okresie letnim). Oryginalnie są po prostu określone przedziały czasowe w których to cyrkulacja była załączona na stałe. Nie jest to optymalne rozwiązanie bo niepotrzebny obieg cyrkulacyjny mocno wychładza wodę w zasobniku. Dlatego zaimplementowałem własny mechanizm do załączania cyrkulacji na żądanie. Wystarczy na chwilę włączyć (puścić) ciepłą wodę tak aby przepływomierz to wykrył i załączył docelowy obieg cyrkulacji. Potem należy chwilę odczekać (około pół minuty) aby cyrkulacja doprowadziła ciepłą wodę do kranu i korzystać już z niej w pełni. Oczywiście cyrkulacja po określonym czasie automatycznie się wyłącza. I tak do następnego razu. Jeżeli dla kogoś ten mechanizm nie jest optymalny to bez problemu można zaimplementować stary wariant z przedziałami czasowymi.
Co ważne mając zasobnik wody możemy regulować kiedy i jak szybko chcemy w nim uzupełniać ciepło. Mając informacje nad całą infrastrukturą wykorzystywania energii w domu możemy to zorganizować tak, żeby odbywało się to jak najkorzystniej. Czyli włączyć tą funkcję w jak najbardziej energetycznie optymalnym momencie. W moim przypadku jest to moment, kiedy fotowoltaika wytwarza więcej energii niż jest w danej chwili wykorzystywane i nadwyżka zostaje przekazywana do sieci. I to moim zdaniem na tym właśnie polega istota instalacji „inteligentnego domu”.



Sterownik oprogramowałem znanym narzędziem do HA czyli ESPHome2.
Kod konfiguracji poniżej.
esphome:
name: cwu
friendly_name: cwu
on_boot:
priority: 500
then:
- pulse_meter.set_total_pulses:
id: pulse_meter_ciepla_woda
value: !lambda "return id(total_pulse_meter_ciepla_woda);"
- pulse_meter.set_total_pulses:
id: pulse_meter_woda_cyrkulacja
value: !lambda "return id(total_pulse_meter_woda_cyrkulacja);"
# - lambda: "id(auto_cyrkulacja).publish_state(id(g_auto_cyrkulacja))"
esp32:
board: esp32dev
framework:
type: arduino
# Enable logging
logger:
level: INFO
# Enable Home Assistant API
api:
encryption:
key: "xxx"
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
ap:
ssid: "Cwu Fallback Hotspot"
password: "xxx"
manual_ip:
static_ip: 192.168.x.x
gateway: 192.168.x.x
subnet: 255.255.255.0
dns1: 192.168.x.x
web_server:
port: 80
captive_portal:
globals:
- id: total_pulse_meter_ciepla_woda
type: int
restore_value: yes
- id: total_pulse_meter_woda_cyrkulacja
type: int
restore_value: yes
- id: g_auto_cyrkulacja
type: bool
restore_value: yes
# https://esphome.io/components/sensor/dallas.html
dallas:
- pin: GPIO23
update_interval: 10s
switch:
- platform: gpio
id: pompa_grzanie
name: "Pompa grzenie"
pin: GPIO16
inverted: yes
restore_mode: RESTORE_DEFAULT_OFF
- platform: gpio
id: pompa_cyrkulacja
name: "Pompa cyrkulacja"
pin: GPIO17
inverted: yes
restore_mode: RESTORE_DEFAULT_OFF
- platform: template
name: "Automat cyrkulacji"
id: auto_cyrkulacja
optimistic : true
lambda: "return id(g_auto_cyrkulacja);"
on_turn_on:
- lambda: "id(g_auto_cyrkulacja) = true;"
on_turn_off:
- lambda: "id(g_auto_cyrkulacja) = false;"
#https://esphome.io/components/sensor/pulse_meter.html
sensor:
# (6.6 * Q) Q = L/Min ± 3%
- platform: pulse_meter
pin: 13
unit_of_measurement: 'l/min'
name: 'Woda cyrkulacja przepływ'
id: pulse_meter_woda_cyrkulacja
#internal_filter: 100ms
timeout: 1s
accuracy_decimals: 2
filters:
#- multiply: 0.004
- lambda: return (x / 400.0); #400 = 6.6*60 -> F=(6.68Q)±5% Q=L/min
total:
name: "Woda cyrkulacja licznik"
unit_of_measurement: "m3"
accuracy_decimals: 3
filters:
#- multiply: 0.004
#- lambda: return (x / 400000.0);
- lambda: |-
id(total_pulse_meter_woda_cyrkulacja) = x;
return (x / 400000.0);
- platform: dallas
address: 0x9380000026286c28
name: "Temeratura w zasobniku"
- platform: pulse_meter
pin: 12
unit_of_measurement: 'l/min'
name: 'Ciepła woda przepływ'
id: pulse_meter_ciepla_woda
timeout: 1s
accuracy_decimals: 2
filters:
#- multiply: 0.004
- lambda: return x / 360; #360 = 6*60 -> f=(6*Q)±3% - Q=L/Min
on_value_range:
- above : 0.3
then:
if:
condition:
switch.is_on: auto_cyrkulacja
then:
if:
condition:
not:
script.is_running: wlacz_cyrkulacje
then:
- script.execute: wlacz_cyrkulacje
total:
name: "Ciepła woda licznik"
unit_of_measurement: "m3"
accuracy_decimals: 3
filters:
#- multiply: 0.004
#- lambda: return (x / 360000.0);
- lambda: |-
id(total_pulse_meter_ciepla_woda) = x;
return (x / 360000.0);
# on_value:
# then:
# if:
# condition:
# switch.is_on: auto_cyrkulacja
# then:
# if:
# condition:
# not:
# script.is_running: wlacz_cyrkulacje
# then:
# - script.execute: wlacz_cyrkulacje
# https://esphome.io/components/sensor/adc.html
# - platform: adc
# pin: 32
# id: adc_cosnienie_cepla_woda
# name: "Cisnienie CWU"
# update_interval: 1s
# unit_of_measurement: ''
# raw: true
# filters:
# #- multiply: 0.00026862 # 1.1/4095, for attenuation 0db
# #- multiply: 0.00036630 # 1.5/4095, for attenuation 2.5db
# #- multiply: 0.00053724 # 2.2/4095, for attenuation 6db
# - multiply: 0.00095238 # 3.9/4095, for attenuation 11db
# #attenuation: 11dB
# #filters:
# # - calibrate_linear:
# # - 0.0 -> 0.0
# # - 40.0 -> 45.0
# # - 3.11 -> 7
# https://forum.arturhome.pl/t/czujnik-ntc-10k-w-esphome/7068
# https://esphome.io/components/sensor/ntc.html
# https://community.home-assistant.io/t/measuring-vcc-and-a0-for-ntc/258541
# - platform: ntc
# sensor: resistance_sensor
# name: NTC Temperature
# calibration:
# b_constant: 3950
# reference_temperature: 25°C
# reference_resistance: 50kOhm
# - platform: resistance
# id: resistance_sensor
# sensor: source_sensor
# configuration: DOWNSTREAM
# resistor: 22kOhm
# reference_voltage: 3.3V
# name: Resistance Sensor
# - platform: adc
# id: source_sensor
# name: ADC Value
# # filters:
# # - offset: -0.042
# # - multiply: 3.3
# pin: 33
# update_interval: 10s
script:
- id: wlacz_cyrkulacje
then:
- logger.log:
format: START skrypt wlacz_cyrkulacje
level: INFO
- switch.turn_on: pompa_cyrkulacja
- delay: 50s
- switch.turn_off: pompa_cyrkulacja
- delay: 10s
- logger.log:
format: STOP skrypt wlacz_cyrkulacje
level: INFO
# +---------------+|
# | | | | | |
# [ 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| |
#
# +---------------+|
# | | | | | |
# [ EN ] |o o| [GPIO23] dallas DS18B20 <= 4,7k => 3.3V
# [GPIO36] |o o| [GPIO22]
# [GPIO39] |o ESP-WROOM-32 o| [GPIO1 ]
# [GPIO34] |o o| [GPIO3 ]
# [GPIO35] |o o| [GPIO21]
# adc_cosnienie_cepla_woda [GPIO32] |o o| [GPIO19]
# resistance_sensor [GPIO33] |o PIN 30 o| [GPIO18]
# [GPIO25] |o o| [GPIO5 ]
# [GPIO26] |o DEVKIT V1 o| [GPIO17] pompa_cyrkulacja
# [GPIO27] |o o| [GPIO16] pompa_grzanie
# [GPIO14] |o o| [GPIO4 ]
# pulse_meter_ciepla_woda [GPIO12] |o o| [GPIO2 ]
# pulse_meter_woda_cyrkulacja [GPIO13] |o o| [GPIO15]
# [ GND ] |o o| [ GND ]
# [ VIN ] |o o| [ 3V3 ]
# | |
# | |usb| |
#