Перейти до публікації
Пошук в
  • Додатково...
Шукати результати, які містять...
Шукати результати в...

ПВУ_DIY

yur43

Рекомендовані повідомлення

7 годин тому, yur43 сказав:

веб сторінка трохи перегружена інформацією. 

А якби ще датчиків з десяток?

Знімок екрана 2024-02-08 144520.png

Знімок екрана 2024-02-08 144532.png

Ви кожного дня переглядаєте графіки цих датчиків чи що? )) Один раз налаштувати, а далі про це все забудеться, хоть там 20-50-100 датчиків, головне щоб все злагоджено працювало в автоматичному режимі.

Якось так 🤣

image.png.d61ac0f6fa3f70cfdf12cae75f739faf.png

  • Лайк 1
Посилання на коментар
Поділитися на інших сайтах

  • 2 тижні потому...

Все працює бездоганно. Якщо зацікавило кого і бажає повторити, код ESP з останніми змінами

Прихований текст

esphome:

  name: hrv-kc868-a4

  friendly_name: HRV_kc868-a4

 

  on_boot:

    then:

      - number.set:

          id: dac_min

          value: 0.11

      - number.set:

          id: dac_max

          value: 0.35

      - number.set:

          id: dac_bal

          value: -0.024

      - output.set_level:

          id: set_level

          level: 0.4

 

esp32:

  board: esp32dev

  framework:

    type: arduino

 

logger:

    level: error

 

#web_server:

#  port: 80    

 

api:

  encryption:

    key: "***"

 

  services:

    - service: scd4x_calibrate_co2_value

      variables:

        co2_ppm: int

      then:

      - scd4x.perform_forced_calibration:

          value: !lambda 'return co2_ppm;'

          id: scd40

    - service: scd4x_factory_reset

      then:

      - scd4x.factory_reset: scd40  

 

#mqtt:

#  broker: 192.168.1.***

#  topic_prefix: HRV

 # username: mqtt_homeassistant

  #password: mqtt_homeassistant

#  birth_message:

 # will_message:

  #reboot_timeout: 24h

 

ota:

  password: "***"

 

wifi:

  ssid: "********"

  password: "********"

  reboot_timeout: 5h

 

  ap:

    ssid: "Hrv-Kc868-A4 Fallback Hotspot"

    password: "********"

 

captive_portal:

 

rtttl:

  output: rtttl_out

  id: my_rtttl

 

number:

 

  - name: dac_min

    id: dac_min

    platform: template

    min_value: 0

    max_value: 0.3

    step: 0.01

    mode: box

    optimistic: true

    entity_category: config

 

  - name: dac_max

    id: dac_max

    platform: template

    min_value: 0

    max_value: 0.6

    step: 0.01

    mode: box

    optimistic: true

    entity_category: config

 

  - name: dac_bal

    id: dac_bal

    platform: template

    min_value: -0.1

    max_value: 0.1

    step: 0.001

    mode: box

    optimistic: true

    entity_category: config

 

  - name: dac_power

    platform: template

    id: dac_power

    min_value: 0

    max_value: 1

    step: 0.001

    mode: box

    optimistic: true

    entity_category: diagnostic

 

  - name: PID_power

    platform: template

    id: PID_power

    min_value: 0

    max_value: 1

    step: 0.001

    mode: box

    optimistic: true

    entity_category: diagnostic

 

climate:

 

  - platform: bang_bang

    name: "defrost"

    visual:

      min_temperature: 1

      max_temperature: 6

      temperature_step: 0.1

    sensor: temp1

    default_target_temperature_low: 2 °C

    default_target_temperature_high: 3 °C

    heat_action:

      - switch.turn_on: defrost_on

    idle_action:

      - switch.turn_off: defrost_off

      - switch.turn_off: defrost_on

    cool_action:

      - switch.turn_on: defrost_off

 

  - platform: pid

    name: "PID_CO2"

    id: PID_CO2

    visual:

      min_temperature: 500

      max_temperature: 1500

      temperature_step: 10

    sensor: CO2

    default_target_temperature: 800

    cool_output: PID_level

    control_parameters:

      kp: 0.0033

      ki: 0

      kd: 0

      output_averaging_samples: 1     # smooth the output over 5 samples

      derivative_averaging_samples: 1  # smooth the derivative value over 10 samples

 

i2c:

  sda: GPIO19

  scl: GPIO21

  scan: false

  id: bus_a

 

tca9548a:

  - address: 0x70

    id: multiplex0

    i2c_id: bus_a

    channels:

      - bus_id: multiplex0channel0

        channel: 0

      - bus_id: multiplex0channel1

        channel: 1

      - bus_id: multiplex0channel2

        channel: 2

      - bus_id: multiplex0channel3

        channel: 3

      - bus_id: multiplex0channel4

        channel: 4

      - bus_id: multiplex0channel5

        channel: 5

      - bus_id: multiplex0channel6

        channel: 6

      - bus_id: multiplex0channel7

        channel: 7

 

dallas:

  - pin: GPIO13

    id: hub_1

    update_interval: 60s

   

switch:

  - platform: template

    name: "defrost"

    id: defrost_on

    turn_on_action:

      - switch.turn_off: defrost_off

      - switch.turn_off: relay_2    

      - repeat:

          count: 25

          then:

            - switch.turn_on: relay_1

            - delay: 1s

            - switch.turn_off: relay_1

            - delay: 1min

 

  - platform: template

    name: "defrost_off"

    id: defrost_off

    turn_on_action:

      - switch.turn_off: defrost_on

      - switch.turn_off: relay_1

      - repeat:

          count: 27

          then:

            - switch.turn_on: relay_2

            - delay: 1s

            - switch.turn_off: relay_2

            - delay: 1min          

 

  - platform: template

    name: "bypass"

    id: bypass

    turn_on_action:

      - switch.turn_off: relay_2

      - switch.turn_off: relay_4      

      - switch.turn_on: relay_1

      - switch.turn_on: relay_3

      - delay: 1min

      - switch.turn_off: relay_1

      - switch.turn_off: relay_3      

    turn_off_action:

      - switch.turn_off: relay_1

      - switch.turn_off: relay_3      

      - switch.turn_on: relay_2

      - switch.turn_on: relay_4

      - delay: 1min

      - switch.turn_off: relay_2

      - switch.turn_off: relay_4      

 

  - platform: gpio

    name: "bypass_in_on"

    id: relay_1

    pin: 2

    inverted: false

 

  - platform: gpio

    name: "bypass_in_off"

    id: relay_2

    pin: 15

    inverted: false

   

  - platform: gpio

    name: "bypass_out_on"

    id: relay_3

    pin: 5

    inverted: false

   

  - platform: gpio

    name: "bypass_out_off"

    id: relay_4

    pin: 4

    inverted: false

   

#binary_sensor:

#  - platform: gpio

#    name: "input1"

#    pin:

#      number: 36

#      inverted: true

#  - platform: gpio

#    name: "input2"

#    pin:

#      number: 39

#      inverted: true

 

sensor:

 

#  - platform: homeassistant

 #   id: CO2_Qingping

  #  entity_id: sensor.qingping_air_monitor_lite_co2_carbon_dioxide

 

#  - platform: homeassistant

 #   id: CO2_Tuya

  #  entity_id: sensor.co2_co2

 

#  - platform: kalman_combinator

 #   name: "co2_1"

  #  id: co2_1

   # unit_of_measurement: ppm

    #process_std_dev: 0.005

#    sources:

 #     - source: CO2

  #      error: 1.0

   #   - source: CO2_Qingping

    #    error: 1.0

     # - source: CO2_Tuya

      #  error: 1.0

 

  - platform: pulse_counter

    pin: 14

    name: "fan1"

    filters:

      - multiply: 0.5

    update_interval: 30s

    accuracy_decimals: 0

    unit_of_measurement: "RPM"

    on_value_range:

      - below: 100

        then:

          - delay: 2min

          - rtttl.play: 'siren:d=8,o=5,b=100:d,e,d,e,d,e,d,e'

 

  - platform: pulse_counter

    pin: 27

    name: "fan2"

    filters:

      - multiply: 0.5

    update_interval: 30s

    accuracy_decimals: 0

    unit_of_measurement: "RPM"

    on_value_range:

      - below: 100

        then:

          - delay: 2min

          - rtttl.play: 'siren:d=8,o=5,b=100:d,e,d,e,d,e,d,e'

 

  - platform: dallas

    dallas_id: hub_1

    address: 0xb401204ec799da28

    name: "temp_outR"

    accuracy_decimals: 1

    id: temp1

 

  - platform: bme280_i2c

    i2c_id: multiplex0channel1

    address: 0x76

    temperature:

      name: "BME280 Temp_room"

      oversampling: 16x

    pressure:

      name: "BME280 Press_room"

    humidity:

      name: "BME280 Humid_room"

    update_interval: 1min        

 

  - platform: bme280_i2c

    i2c_id: multiplex0channel7

    address: 0x76

    temperature:

      name: "BME280 Temp_ino"

      oversampling: 16x

    pressure:

      name: "BME280 Press_ino"

    humidity:

      name: "BME280 Humid_ino"

    update_interval: 1min

 

  - platform: bme280_i2c

    i2c_id: multiplex0channel6

    address: 0x76

    temperature:

      name: "BME280 Temp_in"

      oversampling: 16x

    pressure:

      name: "BME280 Press_in"

      id: bme_pressure

    humidity:

      name: "BME280 Humid_in"

      id: Humid_in

    update_interval: 1min

 

  - platform: scd4x

    i2c_id: multiplex0channel6

    co2:

      name: "CO2"

      id: CO2

      filters:

        - exponential_moving_average:

            alpha: 0.12

            send_every: 1

    automatic_self_calibration: false

    altitude_compensation: 242m

    measurement_mode: low_power_periodic

    ambient_pressure_compensation_source: bme_pressure

    temperature_offset: 0

    temperature:

      name: "scd40_Temperature"

      accuracy_decimals: 1

    humidity:

      name: "scd40_Humidity"

      accuracy_decimals: 0

    id: scd40

    update_interval: 1min

 

output:

  - platform: ledc

    pin: GPIO18

    id: rtttl_out

 

  - platform: esp32_dac

    pin: GPIO26

    id: dac_output1

    inverted: false

    min_power: 0

    max_power: 1

 

  - platform: esp32_dac

    pin: GPIO25

    id: dac_output2

    inverted: false

    min_power: 0

    max_power: 1

 

  - platform: template

    type: float

    id: set_level

    write_action:      

      - lambda: |-

          // зберегти значення, необовязково

          id(dac_power).publish_state(state);      

 

          // розподілення балансу

          auto v1 = id(dac_min).state + (state * (1 + id(dac_bal).state) * 0.9);

          auto v2 = id(dac_min).state + (state * (1 - id(dac_bal).state) * 0.9);

         

          // вихід на ЦАПи

          id(dac_output1).set_level(v1);

          id(dac_output2).set_level(v2);

 

  - platform: template

    type: float

    id: PID_level

    write_action:      

      - lambda: |-

          // встановити стан Fan

          if (id(fans).state) {

          // Fan is ON, do something here

          } else {

          // Fan is OFF, do something else here

          }

 

          // зберегти значення PID

          id(PID_power).publish_state(state);  

 

          // якщо Fan вимкнено, то

          auto v = state * id(dac_max).state;

 

          if (!id(fans).state) {

                    id(set_level).set_level(v);

          }

 

fan:

  - platform: speed

    output: set_level

    name: "fan"

    id: fans

    on_turn_off:

      then:

      - output.set_level:

          id: set_level

          level: 0.15

    on_turn_on:

      then:

      - delay: 30min

      - lambda: !lambda |-

          id(fans).turn_off();

 

за основу взята плата, яка мені обійшлася 13$ з доставкою. Сенсори придбані там же. 

Бачу надлишковість в ЦАП, не бачу сенсу в балансуванні, можна обійтись і одним ЦАПом. 

Також більшість датчиків по суті не використовується, досить було даласів по сторонам рекуператора і CSD40 , який в своєму складі має датчик вологості.

Гарно зарекомендував P-регулятор по CO2 .

Цікава ідея попередження обмерзанню частковим відкриванням приточного байпасу, але її так і не вдалося перевірити - морози скінчилися. 

В перспективі можливо додам диференційний  датчик тиску, тоді можна буде побачити реальну ситуацію з балансом вентиляторів.

Змінено користувачем yur43
  • Лайк 3
Посилання на коментар
Поділитися на інших сайтах

  • 3 тижні потому...

Додав ще датчик температури "вхід з вулиці" і термостат COOL для автоматичного увімкнення байпасу в літньому режимі, для охолодження.

Логіка проста: по температурі вулиці нижче 22С термостат вмикається, вище 23С термостат вимикається.

Далі вже термостат слідкує за температурою приміщення і поступово відкриває обидві заслонки байпасу. Щоб заслонки не смикало часто, введений параметр часової інерції, там для початку стоїть 100сек, можна збільшити під свої вимоги. Або перевести термостат в двоточковий з мертвою зоною. Ще треба буде пробувати то по жарі.

Ці дії для літнього охолодження вуличним повітрям. Якщо вночі жара спаде менше 22С, то даний термостат почне підтримувати задану температуру в приміщенні. Якщо функція непотрібна - ставимо термостат на максимум, він і не спрацює.

Прихований текст

 

captive_portal:

 

rtttl:

  output: rtttl_out

  id: my_rtttl

 

number:

 

  - name: dac_min

    id: dac_min

    platform: template

    min_value: 0

    max_value: 0.3

    step: 0.01

    mode: box

    optimistic: true

    entity_category: config

 

  - name: dac_max

    id: dac_max

    platform: template

    min_value: 0

    max_value: 0.6

    step: 0.01

    mode: box

    optimistic: true

    entity_category: config

 

  - name: dac_bal

    id: dac_bal

    platform: template

    min_value: -0.1

    max_value: 0.1

    step: 0.001

    mode: box

    optimistic: true

    entity_category: config

 

  - name: dac_power

    platform: template

    id: dac_power

    min_value: 0

    max_value: 1

    step: 0.001

    mode: box

    optimistic: true

    entity_category: diagnostic

 

  - name: PID_power

    platform: template

    id: PID_power

    min_value: 0

    max_value: 1

    step: 0.001

    mode: box

    optimistic: true

    entity_category: diagnostic

 

climate:

 

  - platform: thermostat

    name: "COOL"

    id: COOL

    visual:

      min_temperature: 20

      max_temperature: 26

      temperature_step: 0.1

    sensor: temp_in      

    min_cooling_off_time: 100s

    min_cooling_run_time: 100s

    min_idle_time: 100s

    cool_action:

      - switch.turn_on: cool_on

    idle_action:

      - switch.turn_off: cool_off

 

  - platform: bang_bang

    name: "defrost"

    visual:

      min_temperature: 1

      max_temperature: 6

      temperature_step: 0.1

    sensor: temp1

    default_target_temperature_low: 2 °C

    default_target_temperature_high: 3 °C

    heat_action:

      - switch.turn_on: defrost_on

    idle_action:

      - switch.turn_off: defrost_off

      - switch.turn_off: defrost_on

    cool_action:

      - switch.turn_on: defrost_off

 

  - platform: pid

    name: "PID_CO2"

    id: PID_CO2

    visual:

      min_temperature: 500

      max_temperature: 1500

      temperature_step: 10

    sensor: CO2

    default_target_temperature: 850

    cool_output: PID_level

    control_parameters:

      kp: 0.003

      ki: 0

      kd: 3

      output_averaging_samples: 1     # smooth the output over 5 samples

      derivative_averaging_samples: 1  # smooth the derivative value over 10 samples

 

i2c:

  sda: GPIO19

  scl: GPIO21

  scan: false

  id: bus_a

 

tca9548a:

  - address: 0x70

    id: multiplex0

    i2c_id: bus_a

    channels:

      - bus_id: multiplex0channel0

        channel: 0

      - bus_id: multiplex0channel1

        channel: 1

      - bus_id: multiplex0channel2

        channel: 2

      - bus_id: multiplex0channel3

        channel: 3

      - bus_id: multiplex0channel4

        channel: 4

      - bus_id: multiplex0channel5

        channel: 5

      - bus_id: multiplex0channel6

        channel: 6

      - bus_id: multiplex0channel7

        channel: 7

 

dallas:

  - pin: GPIO13

    id: hub_1

    update_interval: 60s

   

switch:

 

  - platform: template

    name: "cool_on"

    id: cool_on

    turn_on_action:

      - switch.turn_off: cool_off

      - switch.turn_off: relay_2    

      - switch.turn_off: relay_4    

      - repeat:

          count: 25

          then:

            - switch.turn_on: relay_1

            - switch.turn_on: relay_3    

            - delay: 1s

            - switch.turn_off: relay_1

            - switch.turn_off: relay_3

            - delay: 1min

 

  - platform: template

    name: "cool_off"

    id: cool_off

    turn_on_action:

      - switch.turn_off: cool_on

      - switch.turn_off: relay_1

      - switch.turn_off: relay_3

      - repeat:

          count: 27

          then:

            - switch.turn_on: relay_2

            - switch.turn_on: relay_4

            - delay: 1s

            - switch.turn_off: relay_2

            - switch.turn_off: relay_4

            - delay: 1min    

 

  - platform: template

    name: "defrost"

    id: defrost_on

    turn_on_action:

      - switch.turn_off: defrost_off

      - switch.turn_off: relay_2    

      - repeat:

          count: 25

          then:

            - switch.turn_on: relay_1

            - delay: 1s

            - switch.turn_off: relay_1

            - delay: 1min

 

  - platform: template

    name: "defrost_off"

    id: defrost_off

    turn_on_action:

      - switch.turn_off: defrost_on

      - switch.turn_off: relay_1

      - repeat:

          count: 27

          then:

            - switch.turn_on: relay_2

            - delay: 1s

            - switch.turn_off: relay_2

            - delay: 1min          

 

  - platform: template

    name: "bypass"

    id: bypass

    turn_on_action:

      - switch.turn_off: relay_2

      - switch.turn_off: relay_4      

      - switch.turn_on: relay_1

      - switch.turn_on: relay_3

      - delay: 1min

      - switch.turn_off: relay_1

      - switch.turn_off: relay_3      

    turn_off_action:

      - switch.turn_off: relay_1

      - switch.turn_off: relay_3      

      - switch.turn_on: relay_2

      - switch.turn_on: relay_4

      - delay: 1min

      - switch.turn_off: relay_2

      - switch.turn_off: relay_4      

 

  - platform: gpio

    name: "bypass_in_on"

    id: relay_1

    pin: 2

    inverted: false

 

  - platform: gpio

    name: "bypass_in_off"

    id: relay_2

    pin: 15

    inverted: false

   

  - platform: gpio

    name: "bypass_out_on"

    id: relay_3

    pin: 5

    inverted: false

   

  - platform: gpio

    name: "bypass_out_off"

    id: relay_4

    pin: 4

    inverted: false

   

#binary_sensor:

#  - platform: gpio

#    name: "input1"

#    pin:

#      number: 36

#      inverted: true

#  - platform: gpio

#    name: "input2"

#    pin:

#      number: 39

#      inverted: true

 

sensor:

 

#  - platform: homeassistant

 #   id: CO2_Qingping

  #  entity_id: sensor.qingping_air_monitor_lite_co2_carbon_dioxide

 

#  - platform: homeassistant

 #   id: CO2_Tuya

  #  entity_id: sensor.co2_co2

 

#  - platform: kalman_combinator

 #   name: "co2_1"

  #  id: co2_1

   # unit_of_measurement: ppm

    #process_std_dev: 0.005

#    sources:

 #     - source: CO2

  #      error: 1.0

   #   - source: CO2_Qingping

    #    error: 1.0

     # - source: CO2_Tuya

      #  error: 1.0

 

  - platform: pulse_counter

    pin: 14

    name: "fan1"

    filters:

      - multiply: 0.5

    update_interval: 30s

    accuracy_decimals: 0

    unit_of_measurement: "RPM"

    on_value_range:

      - below: 100

        then:

          - delay: 2min

          - rtttl.play: 'siren:d=8,o=5,b=100:d,e,d,e,d,e,d,e'

 

  - platform: pulse_counter

    pin: 27

    name: "fan2"

    filters:

      - multiply: 0.5

    update_interval: 30s

    accuracy_decimals: 0

    unit_of_measurement: "RPM"

    on_value_range:

      - below: 100

        then:

          - delay: 2min

          - rtttl.play: 'siren:d=8,o=5,b=100:d,e,d,e,d,e,d,e'

 

  - platform: dallas

    dallas_id: hub_1

    address: 0xb401204ec799da28

    name: "temp_outR"

    accuracy_decimals: 1

    id: temp1

 

  - platform: dallas

    dallas_id: hub_1

    address: 0xce0000034b298828

    name: "temp_out"

    accuracy_decimals: 1

    id: temp_out

    on_value_range:

      - below: 22

        then:

          climate.control:

            id: COOL

            mode: "COOL"  

      - above: 23

        then:

          climate.control:

            id: COOL

            mode: "OFF"


 

  - platform: bme280_i2c

    i2c_id: multiplex0channel1

    address: 0x76

    temperature:

      name: "BME280 Temp_room"

      oversampling: 16x

    pressure:

      name: "BME280 Press_room"

    humidity:

      name: "BME280 Humid_room"

    update_interval: 1min        

 

  - platform: bme280_i2c

    i2c_id: multiplex0channel7

    address: 0x76

    temperature:

      name: "BME280 Temp_ino"

      oversampling: 16x

    pressure:

      name: "BME280 Press_ino"

    humidity:

      name: "BME280 Humid_ino"

    update_interval: 1min

 

  - platform: bme280_i2c

    i2c_id: multiplex0channel6

    address: 0x76

    temperature:

      name: "BME280 Temp_in"

      id: temp_in

      oversampling: 16x

    pressure:

      name: "BME280 Press_in"

      id: bme_pressure

    humidity:

      name: "BME280 Humid_in"

      id: Humid_in

    update_interval: 1min

 

  - platform: scd4x

    i2c_id: multiplex0channel6

    co2:

      name: "CO2"

      id: CO2

      filters:

        - exponential_moving_average:

            alpha: 0.12

            send_every: 1

    automatic_self_calibration: false

    altitude_compensation: 242m

    measurement_mode: low_power_periodic

    ambient_pressure_compensation_source: bme_pressure

    temperature_offset: 0

#    temperature:

 #     name: "scd40_Temperature"

  #    accuracy_decimals: 1

#    humidity:

 #     name: "scd40_Humidity"

  #    accuracy_decimals: 0

    id: scd40

    update_interval: 3min

 

output:

  - platform: ledc

    pin: GPIO18

    id: rtttl_out

 

  - platform: esp32_dac

    pin: GPIO26

    id: dac_output1

    inverted: false

    min_power: 0

    max_power: 1

 

  - platform: esp32_dac

    pin: GPIO25

    id: dac_output2

    inverted: false

    min_power: 0

    max_power: 1

 

  - platform: template

    type: float

    id: set_level

    write_action:      

      - lambda: |-

          // зберегти значення, необовязково

          id(dac_power).publish_state(state);      

 

          // розподілення балансу

          auto v1 = id(dac_min).state + (state * (1 + id(dac_bal).state) * 0.9);

          auto v2 = id(dac_min).state + (state * (1 - id(dac_bal).state) * 0.9);

         

          // вихід на ЦАПи

          id(dac_output1).set_level(v1);

          id(dac_output2).set_level(v2);

 

  - platform: template

    type: float

    id: PID_level

    write_action:      

      - lambda: |-

          // встановити стан Fan

          if (id(fans).state) {

          // Fan is ON, do something here

          } else {

          // Fan is OFF, do something else here

          }

 

          // зберегти значення PID

          id(PID_power).publish_state(state);  

 

          // якщо Fan вимкнено, то

          auto v = state * id(dac_max).state;

 

          if (!id(fans).state) {

                    id(set_level).set_level(v);

          }

 

fan:

  - platform: speed

    output: set_level

    name: "fan"

    id: fans

    on_turn_off:

      then:

      - output.set_level:

          id: set_level

          level: 0.15

    on_turn_on:

      then:

      - delay: 30min

      - lambda: !lambda |-

          id(fans).turn_off();

 

 

Змінено користувачем yur43
  • Лайк 1
Посилання на коментар
Поділитися на інших сайтах

  • 2 тижні потому...

дорекуперувались. Прийшло літо, як далі жити ..

Знімок екрана 2024-03-31 121803.png

Змінено користувачем yur43
  • Конфуз 1
Посилання на коментар
Поділитися на інших сайтах

  • 2 тижні потому...

Прийшло тепло, спробував охолодження увімкненням байпасу, діє. Але на вулиці раптово стало холодно і в будинок дує 15С, відчутно прохолодно.

Мабуть треба вбудованим термостатом "охолодження" задавати певну комфортну температуру охолодження, якою керувати зовні, з НА.

Коротше алгоритм охолодження ще непродуманий.

Посилання на коментар
Поділитися на інших сайтах

2 години тому, yur43 сказав:

Коротше алгоритм охолодження ще непродуманий.

Кондиціонер? :)

В нас тут сонячна погода було і вище 20 градусів вдень, від чого мій будинок встиг добре нагрітись, бо сонце ще відносно низько і добре потрапляє у вікна. Я вирішив включити кондиціонери на охолодження, бо байпасу нема, а відкривати вікна не хочу, бо там шум, пил і комахи. За два дні кондиціонери спожили аж 5 кВт•год електрики, згенерованої сонцем.

  • Лайк 1
Посилання на коментар
Поділитися на інших сайтах

7 годин тому, volomoto сказав:

Кондиціонер? :)

Кондиціонер, це крайня міра. Воно неінверторне, дує як дурне. Вмикається коли день + всі вийшли з будинку, або вручну. Як хто зайшов - вимикається.

Змінено користувачем yur43
  • Лайк 1
Посилання на коментар
Поділитися на інших сайтах

4 години тому, yur43 сказав:

Кондиціонер, це крайня міра. Воно неінверторне, дує як дурне. Вмикається коли день + всі вийшли з будинку, або вручну. Як хто зайшов - вимикається.

Якщо старт-стоп, то я б дійсно заморочувався з байпасом, якщо найближчим часом заміна кондицінера не планується. Теоретично PID контроллера, який працює по заданій внутрішній температурі, мало б бути достатньо.

Посилання на коментар
Поділитися на інших сайтах

1 година тому, volomoto сказав:

Теоретично PID контроллера, який працює по заданій внутрішній температурі, мало б бути достатньо.

Ні. Писав вище, що дує холодним з байпаса. Треба робити подачу 19-20С, тоді воно відчувається приємно.

Тобто алгоритм буде вмикати-вимикати вбудований термостат подачі по двом факторам: температура вулиці має бути нижче 20С, температура в будинку має бути вище 23С. А термостат вже забезпечує подачу в комфортному діапазоні 19-20С.

Посилання на коментар
Поділитися на інших сайтах

11 хвилин тому, yur43 сказав:

Ні. Писав вище, що дує холодним з байпаса. Треба робити подачу 19-20С, тоді воно відчувається приємно.

Можливо я не так зрозумів, але байпас можна відкривати поступово і досягати змішування з повітрям з теплообмінника. Під заданою внутрішньою температурою я мав на увазі температуру подачі, а не температуру в приміщенні.

  • Лайк 1
Посилання на коментар
Поділитися на інших сайтах

на колінці зліпив тимчасову автоматизацію

Прихований текст

alias: охолодження байпас
description: ""
trigger:
  - platform: time_pattern
    minutes: "   30"
condition: []
action:
  - if:
      - type: is_temperature
        condition: device
        device_id: b4238fde6f5225f3782b6d06244fbdb9
        entity_id: 6c66b82cb3c9ab101a960be3ec8380fe
        domain: sensor
        below: 20
      - type: is_temperature
        condition: device
        device_id: b4238fde6f5225f3782b6d06244fbdb9
        entity_id: 71deb9fc90b703fe4339b98c4ca30dd7
        domain: sensor
        above: 23
    then:
      - device_id: b4238fde6f5225f3782b6d06244fbdb9
        domain: climate
        entity_id: a73079a029791bc033278042f56bd8e2
        type: set_hvac_mode
        hvac_mode: heat_cool
    else:
      - device_id: b4238fde6f5225f3782b6d06244fbdb9
        domain: climate
        entity_id: a73079a029791bc033278042f56bd8e2
        type: set_hvac_mode
        hvac_mode: "off"
      - type: turn_on
        device_id: b4238fde6f5225f3782b6d06244fbdb9
        entity_id: de9fa09f1dda1d034c013c2053e4d252
        domain: switch
      - type: turn_on
        device_id: b4238fde6f5225f3782b6d06244fbdb9
        entity_id: 605091adbe12ca7006a21bb4aab12862
        domain: switch
      - delay:
          hours: 0
          minutes: 1
          seconds: 0
          milliseconds: 0
      - type: turn_off
        device_id: b4238fde6f5225f3782b6d06244fbdb9
        entity_id: de9fa09f1dda1d034c013c2053e4d252
        domain: switch
      - type: turn_off
        device_id: b4238fde6f5225f3782b6d06244fbdb9
        entity_id: 605091adbe12ca7006a21bb4aab12862
        domain: switch
mode: single

термостат двоточковий, щоб менше смикало шторки

image.png.bab5872800a75b6af94d89a5c1cddf57.png

вночі тест

Посилання на коментар
Поділитися на інших сайтах

image.thumb.png.e161a7f10540fb5979b886f765ec8c16.pngimage.png.4fb00c82868ea8613c4c285751ad0e7f.png

температура вулиці знизилась, автоматизація запустила режим охолодження, байпас увійшов в коридор комфорта = дує прохолодна подача, але не зовсім холодна. Якщо буде потрібно, байпас підрулює потрібну температуру подачі. Коли зникне потреба в охолодженні, увімкнеться рекуперація.

  • Лайк 2
Посилання на коментар
Поділитися на інших сайтах

image.thumb.png.fbf0396c76975f177e91cf35ee1da8b6.png

заданий коридор тримає чітко, можна переносити алгоритм з НА в ESP. Вийде повністю автономний модуль керування вентиляцією, зможе працювати без інтернету.

  • Лайк 1
Посилання на коментар
Поділитися на інших сайтах

  • 3 тижні потому...

Остання версія прошивки, виправлені помилки автоохолодження.

Прихований текст

esphome:

  name: hrv-kc868-a4

  friendly_name: HRV_kc868-a4

 

  on_boot:

    then:

      - number.set:

          id: dac_min

          value: 0.11

      - number.set:

          id: dac_max

          value: 0.35

      - number.set:

          id: dac_bal

          value: -0.024

      - output.set_level:

          id: set_level

          level: 0.4

 

esp32:

  board: esp32dev

  framework:

    type: arduino

 

logger:

    level: DEBUG

 

web_server:

  port: 80    

 

api:

  encryption:

    key: "***************************"

 

  services:

    - service: scd4x_calibrate_co2_value

      variables:

        co2_ppm: int

      then:

      - scd4x.perform_forced_calibration:

          value: !lambda 'return co2_ppm;'

          id: scd40

    - service: scd4x_factory_reset

      then:

      - scd4x.factory_reset: scd40

 

ota:

  password: "*****************"

 

wifi:

  ssid: "**********"

  password: "********"

  reboot_timeout: 5h

 

  ap:

    ssid: "Hrv-Kc868-A4 Fallback Hotspot"

    password: "////////**"

 

rtttl:

  output: rtttl_out

  id: my_rtttl

 

number:

  - name: dac_min

    id: dac_min

    platform: template

    min_value: 0

    max_value: 0.3

    step: 0.01

    mode: box

    optimistic: true

    entity_category: config

 

  - name: dac_max

    id: dac_max

    platform: template

    min_value: 0

    max_value: 0.6

    step: 0.01

    mode: box

    optimistic: true

    entity_category: config

 

  - name: dac_bal

    id: dac_bal

    platform: template

    min_value: -0.1

    max_value: 0.1

    step: 0.001

    mode: box

    optimistic: true

    entity_category: config

 

  - name: dac_power

    platform: template

    id: dac_power

    min_value: 0

    max_value: 1

    step: 0.001

    mode: box

    optimistic: true

    entity_category: diagnostic

 

  - name: PID_power

    platform: template

    id: PID_power

    min_value: 0

    max_value: 1

    step: 0.001

    mode: box

    optimistic: true

    entity_category: diagnostic

 

climate:

  - platform: bang_bang

    name: "cool_wind"

    id: cool_wind

    visual:

      min_temperature: 10

      max_temperature: 30

      temperature_step: 0.1    

    sensor: temp_ino

    default_target_temperature_low: 18.2 °C

    default_target_temperature_high: 19.5 °C

    cool_action:

      - switch.turn_on: cool_on

    heat_action:

      - switch.turn_on: cool_off

    idle_action:

      - switch.turn_off: cool_on

      - switch.turn_off: cool_off

 

  - platform: bang_bang

    name: "defrost"

    visual:

      min_temperature: 1

      max_temperature: 6

      temperature_step: 0.1

    sensor: temp_outR

    default_target_temperature_low: 2 °C

    default_target_temperature_high: 3 °C

    heat_action:

      - switch.turn_on: defrost_on

    idle_action:

      - switch.turn_off: defrost_off

      - switch.turn_off: defrost_on

    cool_action:

      - switch.turn_on: defrost_off

 

  - platform: pid

    name: "PID_CO2"

    id: PID_CO2

    visual:

      min_temperature: 500

      max_temperature: 1500

      temperature_step: 10

    sensor: CO2

    default_target_temperature: 850

    cool_output: PID_level

    control_parameters:

      kp: 0.003

      ki: 0

      kd: 0

 

i2c:

  sda: GPIO19

  scl: GPIO21

  scan: false

  id: bus_a

 

tca9548a:

  - address: 0x70

    id: multiplex0

    i2c_id: bus_a

    channels:

      - bus_id: multiplex0channel0

        channel: 0

      - bus_id: multiplex0channel1

        channel: 1

      - bus_id: multiplex0channel2

        channel: 2

      - bus_id: multiplex0channel3

        channel: 3

      - bus_id: multiplex0channel4

        channel: 4

      - bus_id: multiplex0channel5

        channel: 5

      - bus_id: multiplex0channel6

        channel: 6

      - bus_id: multiplex0channel7

        channel: 7

 

dallas:

  - pin: GPIO13

   

switch:    

  - platform: template

    name: "wind"

    id: wind

    turn_on_action:

      - lambda: |-

          {

          auto call = id(cool_wind).make_call();

          call.set_mode("HEAT_COOL");

          call.perform();

          }      

 #     - climate.control:

  #        id: cool_wind

   #       mode: HEAT_COOL

    turn_off_action:

      - lambda: |-

          {

          auto call = id(cool_wind).make_call();

          call.set_mode("OFF");

          call.perform();

          }

      - switch.turn_off: cool_on

      - switch.turn_off: cool_off

      - switch.turn_on: relay_2

      - switch.turn_on: relay_4

      - delay: 50s

      - switch.turn_off: relay_2

      - switch.turn_off: relay_4

   

  - platform: template

    name: "cool_on"

    id: cool_on

    turn_on_action:

      - switch.turn_off: cool_off

      - switch.turn_off: relay_2    

      - switch.turn_off: relay_4    

      - repeat:

          count: 50

          then:

            - switch.turn_on: relay_1

            - switch.turn_on: relay_3    

            - delay: 1s

            - switch.turn_off: relay_1

            - switch.turn_off: relay_3

            - delay: 250s

 

  - platform: template

    name: "cool_off"

    id: cool_off

    turn_on_action:

      - switch.turn_off: cool_on

      - switch.turn_off: relay_1

      - switch.turn_off: relay_3

      - repeat:

          count: 60

          then:

            - switch.turn_on: relay_2

            - switch.turn_on: relay_4

            - delay: 1s

            - switch.turn_off: relay_2

            - switch.turn_off: relay_4

            - delay: 250s    

 

  - platform: template

    name: "defrost_on"

    id: defrost_on

    turn_on_action:

      - switch.turn_off: defrost_off

      - switch.turn_off: relay_2    

      - repeat:

          count: 40

          then:

            - switch.turn_on: relay_1

            - delay: 1s

            - switch.turn_off: relay_1

            - delay: 200s

 

  - platform: template

    name: "defrost_off"

    id: defrost_off

    turn_on_action:

      - switch.turn_off: defrost_on

      - switch.turn_off: relay_1

      - repeat:

          count: 45

          then:

            - switch.turn_on: relay_2

            - delay: 1s

            - switch.turn_off: relay_2

            - delay: 200s          

 

  - platform: gpio

    name: "bypass_in_on"

    id: relay_1

    pin: 2

    on_turn_on:

    - delay: 60s

    - switch.turn_off: relay_1

 

  - platform: gpio

    name: "bypass_in_off"

    id: relay_2

    pin: 15

    on_turn_on:

    - delay: 60s

    - switch.turn_off: relay_2

   

  - platform: gpio

    name: "bypass_out_on"

    id: relay_3

    pin: 5

    on_turn_on:

    - delay: 60s

    - switch.turn_off: relay_3

   

  - platform: gpio

    name: "bypass_out_off"

    id: relay_4

    pin: 4

    on_turn_on:

    - delay: 60s

    - switch.turn_off: relay_4

 

sensor:

 

  - platform: pulse_counter

    pin: 14

    name: "fan1"

    filters:

      - multiply: 0.5

    update_interval: 30s

    accuracy_decimals: 0

    unit_of_measurement: "RPM"

    on_value_range:

      - below: 300

        then:

          - delay: 2min

          - rtttl.play: 'siren:d=8,o=5,b=100:d,e,d,e,d,e,d,e'

 

  - platform: pulse_counter

    pin: 27

    name: "fan2"

    filters:

      - multiply: 0.5

    update_interval: 30s

    accuracy_decimals: 0

    unit_of_measurement: "RPM"

    on_value_range:

      - below: 300

        then:

          - delay: 2min

          - rtttl.play: 'siren:d=8,o=5,b=100:d,e,d,e,d,e,d,e'

 

  - platform: dallas

    address: 0xb401204ec799da28

    name: "temp_outR"

    accuracy_decimals: 2

    id: temp_outR

 

  - platform: dallas

    address: 0xce0000034b298828

    name: "temp_out"

    accuracy_decimals: 2

    id: temp_out

 

  - platform: bme280_i2c

    i2c_id: multiplex0channel1

    address: 0x76

    temperature:

      name: "BME280 Temp_room"

      accuracy_decimals: 2

    humidity:

      name: "BME280 Humid_room"

      accuracy_decimals: 1

    update_interval: 3min        

 

  - platform: bme280_i2c

    i2c_id: multiplex0channel7

    address: 0x76

    temperature:

      name: "BME280 Temp_ino"

      id: temp_ino

      accuracy_decimals: 2

    humidity:

      name: "BME280 Humid_ino"

      accuracy_decimals: 1

    update_interval: 30s

 

  - platform: bme280_i2c

    i2c_id: multiplex0channel6

    address: 0x76

    temperature:

      name: "BME280 Temp_in"

      id: temp_in

      accuracy_decimals: 2

    humidity:

      name: "BME280 Humid_in"

      id: Humid_in

      accuracy_decimals: 1

    update_interval: 1min

 

  - platform: scd4x

    i2c_id: multiplex0channel6

    co2:

      name: "CO2"

      id: CO2

#      filters:

 #       - exponential_moving_average:

  #          alpha: 0.12

   #         send_every: 1

    automatic_self_calibration: false

    altitude_compensation: 242m

    measurement_mode: low_power_periodic

    id: scd40

 

output:

  - platform: ledc

    pin: GPIO18

    id: rtttl_out

 

  - platform: esp32_dac

    pin: GPIO26

    id: dac_output1

 

  - platform: esp32_dac

    pin: GPIO25

    id: dac_output2

 

  - platform: template

    type: float

    id: set_level

    write_action:      

      - lambda: |-

          id(dac_power).publish_state(state);      

          auto v1 = id(dac_min).state + (state * (1 + id(dac_bal).state) * 0.9);

          auto v2 = id(dac_min).state + (state * (1 - id(dac_bal).state) * 0.9);

          id(dac_output1).set_level(v1);

          id(dac_output2).set_level(v2);

 

  - platform: template

    type: float

    id: PID_level

    write_action:      

      - lambda: |-

          if (id(fans).state) {

          // Fan is ON, do something here

          } else {

          // Fan is OFF, do something else here

          }

          id(PID_power).publish_state(state);  

          auto v = state * id(dac_max).state;

          if (!id(fans).state) {

          id(set_level).set_level(v);

          }

 

fan:

  - platform: speed

    output: set_level

    name: "fan"

    id: fans

    on_turn_off:

      then:

      - output.set_level:

          id: set_level

          level: 0.15

    on_turn_on:

      then:

      - delay: 60min

      - lambda: !lambda |-

          id(fans).turn_off();

 

time:

  - platform: sntp

    on_time:

      - minutes: /60

        then:

        - lambda: |-

            if (id(temp_in).state > 23 && id(temp_out).state < 22) {

            id(wind).turn_on();              }

            else {

            id(wind).turn_off();

            }

 

  • Дякую 1
Посилання на коментар
Поділитися на інших сайтах

Я так розумію у вас ніяких нагрівачів немає? Рекуператор справляється, холодним не дує? 

Посилання на коментар
Поділитися на інших сайтах

1 година тому, TaurosRMK сказав:

Я так розумію у вас ніяких нагрівачів немає? Рекуператор справляється, холодним не дує? 

без нагрівача.

Вбудований алгоритм попередження обмерзанню зниженням ефективності рекуперації.

Теоретично має дути прохолодним, на практиці ще не було такого.

image.png.e21fc69212dd00db5b0cdd42086f49f6.png

Змінено користувачем yur43
Посилання на коментар
Поділитися на інших сайтах

по схожому принципу працює і охолодження влітку.

Коли повітря вулиці охололо - відкривається байпас, коли вже дуже холодно - працює підмішування рекуперованого повітря, зранку байпас знову повністю відкритий, коли на вулиці більше 22С - байпас повністю закривається. 

В будинку добре, подача прохолодна але комфортна. Вечорами тепло з під перекриття витягується, на день поки вистачає без примусового охолодження перекриття гео.

 

Знімок екрана 2024-05-04 111414.png

Змінено користувачем yur43
Посилання на коментар
Поділитися на інших сайтах

40 хвилин тому, yur43 сказав:

без нагрівача.

Вбудований алгоритм попередження обмерзанню зниженням ефективності рекуперації

Я мав на увазі звичайну роботу, а не захист від обмерзання. Тобто при звичайній роботі температура повітря на подачі комфортна, не прохолодно?

Як часто вмикався захист від обмерзання при мінусових температурах нижче -5С? В теорії він мав би дуже часто вмикатися, тому що то вже критичні температури вхідного повітря.

Посилання на коментар
Поділитися на інших сайтах

51 хвилину тому, TaurosRMK сказав:

Я мав на увазі звичайну роботу, а не захист від обмерзання. Тобто при звичайній роботі температура повітря на подачі комфортна, не прохолодно?

Як часто вмикався захист від обмерзання при мінусових температурах нижче -5С? В теорії він мав би дуже часто вмикатися, тому що то вже критичні температури вхідного повітря.

1. при звичайній роботі подача дуже близько до Т приміщення, пару градусів.

2. Захист не вмикався жодного разу, з січня наче. 

 

Посилання на коментар
Поділитися на інших сайтах

18 хвилин тому, yur43 сказав:

1. при звичайній роботі подача дуже близько до Т приміщення, пару градусів.

А це скільки, 21-22С чи менше 20С? У вас повітроводи розведені по теплому контуру?

19 хвилин тому, yur43 сказав:

2. Захист не вмикався жодного разу, з січня наче. 

А тоді були морози чи постійно було вище нуля?

Цікаві практичні показники майже однакових теплообмінників/ПВУ, одні пишуть що без переднагріву не обійтися, інші що постнагрів при низьких температурах обов'язково потрібен, а у декого без нагрівачів все працює 😁

Посилання на коментар
Поділитися на інших сайтах

1 година тому, TaurosRMK сказав:

А це скільки, 21-22С чи менше 20С? У вас повітроводи розведені по теплому контуру?

А тоді були морози чи постійно було вище нуля?

Цікаві практичні показники майже однакових теплообмінників/ПВУ, одні пишуть що без переднагріву не обійтися, інші що постнагрів при низьких температурах обов'язково потрібен, а у декого без нагрівачів все працює 😁

image.thumb.png.05c2cdbe328304411da96f986240da50.png

29,02,2024р

 

image.thumb.png.88ada576875213ef0d9eaf3b8cc9b583.png

02,03,2024р

Змінено користувачем yur43
  • Лайк 1
Посилання на коментар
Поділитися на інших сайтах

6 годин тому, yur43 сказав:

image.thumb.png.05c2cdbe328304411da96f986240da50.png

29,02,2024р

 

image.thumb.png.88ada576875213ef0d9eaf3b8cc9b583.png

02,03,2024р

А в мене таке саме питання, яке ви в моїй темі задавали 😁 Вихлоп хтось підігріває чи як? Чи може витягуєтсья більше, ніж подається? Калькулятор рахує що там мало б бути десь 5-6С, а у вас 10-11С.

Прихований текст

image.thumb.png.8286c13c0ade0ee78c8e5d86bfb0a158.png

image.thumb.png.83e415b8d46a509c87f89c3acf893c9d.png

image.png.bf1be6401988d4e188dcf96d0260c2af.png

 

Посилання на коментар
Поділитися на інших сайтах

6 хвилин тому, TaurosRMK сказав:

А в мене таке саме питання, яке ви в моїй темі задавали 😁 Вихлоп хтось підігріває чи як? Чи може витягуєтсья більше, ніж подається? Калькулятор рахує що там мало б бути десь 5-6С, а у вас 10-11С.

  Приховати вміст

 

датчики цифрові, покази розходились не більше 0,05С, але швидкодія різна. І швидкість потоків приток-витяжка може бути різна. Я цим не переймаюсь поки. Згодом планую додати дифманометр приміщення-вулиця і ним балансувати потоки. Рахувати формули не планую.

Параметри вологості і тиску взагалі відключив.

  • Лайк 1
Посилання на коментар
Поділитися на інших сайтах

Створіть акаунт або увійдіть у нього для коментування

Ви маєте бути користувачем, щоб залишити коментар

Створити акаунт

Зареєструйтеся для отримання акаунта. Це просто!

Зареєструвати акаунт

Увійти

Вже зареєстровані? Увійдіть тут.

Увійти зараз
×
×
  • Створити...