Sterowanie ogrzewaniem podłogowym

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 :wink:

  1. 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ł
  1. 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.

  2. 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.
6 polubień

Robię dokładnie ten sam projekt i podobnie do Ciebie choć ja z racji tego że esp ma być w metalowych puszkach od rozdzielaczy użyłem esp z ethernetem na pokładzie :slight_smile:. Polecam problem z wifi rozwiązany, zakładając że możemy po kablu, no bo jeśli nie to wiadomo :stuck_out_tongue:

Jak ja bym miał tam coś więcej niż 230V :wink: antenki są OK