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