Można powiedzieć, że to część druga OpenTherm i realizacja sterowania pogodowego.
Wszystko co podałem w poprzednim wątku działało i hulało aż miło, no ale przyszło do regulacji temperatur w pokojach - jednak tu jeden stopień podnieś, tam jeden stopień opuść itd. Oczywiście nie był bym sobą, gdybym nie zechciał tego zrealizować w wersji “smart”. Szybki przegląd opcji dostepnych u producentów (mam 2 rozdzielacze - parter i piętro i jak wspominałem brak kabli do termostatów itp) i wyszło na to, że albo wyskakuję z OK 6tys. PLN by mieć sterowanie niezależne w każdym pokoju, albo realizuję sterowanie podłogowe samemu - wiadomo co wybrałem
- Lista części:
- 12 szt siłowników termoelektrycznych tech - 39zł/szt. (łącznie 468zł)
- 2 szt. ESP-WROOM-32U - 40zł/szt (łącznie 80zł)
- moduł przekaźników SSR 8 kanałów 5V High trigger - 58zł/szt (łącznie 116zł)
- Xiaomi Aquara - 55zł/szt. (akurat te miałem w pokojach) (łącznie 10 szt 550zł) - ja zamontowałem mniej póki co, ale z czasem na pewno to poprawię
- zasilacz LX G33 - 20zł/szt (łącznie 40zł)
- przetwornica stepdown DC-DC LM2596 - 13zł/szt (łącznie 26zł)
- pierdy typu obudowy kabelki, listwy goldpin, kawałek PCB uniwersalnej - 50zł
= koszt całkowity projektu: 1330zł
-
Wykonanie:
Na pokład ESP32 trafiło ESPHome, siłowniki zostały podpięte w moduł przekaźników SSR zaś ten został podpięty do ESP32 do kolejnych wyjść. tor zasilania poszedł z 220V na 12V i stepdown do 5V. -
Projekt w ESPHome - przykładowy rozdzielacz:
Konfiguracja:
CHx - tak oznaczam kolejne wyjścia:
CH1 - łazienka dół
CH2 - biuro
CH3 - salon 1 (salon ma 2 osobne pętle)
CH4 - salon 2
CH5 - kotłownia
CH6 - przedpokój - w związku z tym, że to najmniej stabilne temperaturowo pomieszczenie - drzwi wejściowe jego sterowanie osobno nie ma sensu przy bezwładności podłogówki.
CH8 - pompa wody - jeśli któryś z zdefiniowanych termostatów ma grzać - pompa się załącza.
wirtualne termostaty mam 3:
- salon
- biuro
- lazienka_dol
Główna konfiguracja projektu:
heating-hub-1.yaml
:
esphome:
name: heating-hub-1
comment: Heating Hub Driver
on_boot:
then:
- lambda: |-
id(salon).publish_state(0.0);
id(biuro).publish_state(0.0);
id(lazienka_dol).publish_state(0.0);
- climate.control: {id: salon_thermostat, mode: HEAT, target_temperature: 22}
- climate.control: {id: biuro_thermostat, mode: HEAT, target_temperature: 22}
- climate.control: {id: lazienka_dol_thermostat, mode: HEAT, target_temperature: 22}
on_loop:
then:
- lambda: |-
if((id(lazienka_dol_switch).state || id(biuro_switch).state || id(salon_switch).state) && !id(pompa_switch).state) {
id(pompa_switch).turn_on();
} else if ((!id(lazienka_dol_switch).state && !id(biuro_switch).state && !id(salon_switch).state) && id(pompa_switch).state) {
id(pompa_switch).turn_off();
}
esp32:
board: nodemcu-32s
# Enable logging
logger:
# level: DEBUG
# Enable Home Assistant API
api:
encryption:
key: !secret api_encryption
ota:
password: !secret ota_password
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Heating-Hub Fallback Hotspot"
password: !secret wifi_fallback_password
captive_portal:
web_server:
port: 80
auth:
username: !secret web_username
password: !secret web_password
json:
switch:
# CH1
- <<: !include
file: heating-hub/switch.yaml
vars: {id: lazienka_dol, pin: 32, name: Łazienka dół}
# CH2
- <<: !include
file: heating-hub/switch.yaml
vars: {id: biuro, pin: 33, name: Biuro}
# CH3
- platform: gpio
name: "Status Salon 1"
id: salon_switch
pin: 25
device_class: outlet
disabled_by_default: True
on_turn_on:
then:
- switch.turn_on: salon_2_switch
- switch.turn_on: kotlownia_switch
- switch.turn_on: przedpokoj_switch
on_turn_off:
then:
- switch.turn_off: salon_2_switch
- switch.turn_off: kotlownia_switch
- switch.turn_off: przedpokoj_switch
# CH4
- <<: !include
file: heating-hub/switch.yaml
vars: {id: salon_2, pin: 26, name: Salon 2}
# CH5
- <<: !include
file: heating-hub/switch.yaml
vars: {id: kotlownia, pin: 27, name: Kotłownia}
# CH6
- <<: !include
file: heating-hub/switch.yaml
vars: {id: przedpokoj, pin: 14, name: Przedpokój}
# CH8
- <<: !include
file: heating-hub/switch.yaml
vars: {id: pompa, pin: 13, name: Pompa}
binary_sensor:
- platform: status
name: "Rozdzielacz Dół"
sensor:
- <<: !include
file: heating-hub/sensor.yaml
vars: {id: salon, entity_id: sensor.czujnik_temperatury_salon_temperature}
- <<: !include
file: heating-hub/sensor.yaml
vars: {id: biuro, entity_id: sensor.czujnik_temperatury_biuro_temperature}
- <<: !include
file: heating-hub/sensor.yaml
vars: {id: lazienka_dol, entity_id: sensor.czujnik_temperatury_lazienka_dol_temperature}
climate:
- <<: !include
file: heating-hub/climate.yaml
vars: {id: salon, name: "Salon"}
- <<: !include
file: heating-hub/climate.yaml
vars: {id: biuro, name: "Biuro"}
- <<: !include
file: heating-hub/climate.yaml
vars: {id: lazienka_dol, name: "Łazienka dół"}
sensor.yaml
:
platform: homeassistant
id: ${id}
internal: True
device_class: temperature
state_class: measurement
unit_of_measurement: "°C"
icon: mdi:home-thermometer
switch.yaml:
platform: gpio
id: ${id}_switch
pin: ${pin}
name: "Status ${name}"
device_class: outlet
climate.yaml
:
platform: thermostat
name: "Termostat ${name}"
id: ${id}_thermostat
visual:
min_temperature: 18
max_temperature: 25
temperature_step: 0.1
heat_deadband: 0.1
heat_overrun: 0.1
sensor: ${id}
min_idle_time: 30s
min_heating_off_time: 30s
min_heating_run_time: 30s
idle_action:
- switch.turn_off: ${id}_switch
heat_action:
- switch.turn_on: ${id}_switch
off_mode:
- switch.turn_off: ${id}_switch
default_preset: home
on_boot_restore_from: memory
preset:
- name: home
default_target_temperature_low: 21.5
- name: away
default_target_temperature_low: 19
Jak widać projekt ma pseudo zabezpieczenie przed brakiem komunikacji z serwerem - w momencie gdy nie może podłączyć się do HA ustawia stan grzania + temperaturę czujników na 0.
Od dłuższego czasu wszystko działa poprawnie i jestem zadowolony z wyników. Temperatury utrzymują się w granicach +/- 0.5C od zadanej temperatury (przeważnie 0.3C a większe wychylenia są spowodowane warunkami wewnętrznymi w domu - otwarte okno, drzwi do pomieszczenia itp.).
Co zostało do poprawki:
- musze domontować antenki do ESPHome i wyrzucić poza metalowe obudowy bo skutecznie tłumią sygnał wifi.