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

Автоматизація системи вентиляції, ESPHome, Home Assistant

TaurosRMK

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

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

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

Якщо прям хочется ото все багацтво - робіть максимально- простий функціонал на есп (фактично завертання датчиків/реле в mqtt) і пишіть всю бізнес-логіку засобами ha/openhab/nodered, там є розвинені мови, багаті можливості, бібліотеки і тп. Ви вже на етапі роботи з таймерами "офігеєте" )

 

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

4 минуты назад, TaurosRMK сказал:

Вже все є готове і працює

Та покажіть вже нарешті, код в гітхабі там. Мені правда цікаво як в вас то вийшло. Що саме у вас вже є? 

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

5 хвилин тому, standov сказав:

"всі умови" "певні умови" - це не схоже на оформлену ідею

Так а що зміниться, якщо я розпишу конкретніше? То ще більше тексту буде, бо тоді будуть реальні дані і фактично це вже буде частина автоматизації тільки написана словами ))

Наприклад:

  • Натиснута кнопка "Старт", команда на запуск вентиляції, спочатку треба відкрити заслінки, вони привязані до вентиляторів (на одному реле), тобто подаєтсья команда на ПЛК DO1 / DO2 для подачі живлення на вентилятори і заслінки, але оберти вентиляторів поки на нулі, час відкриття заслінки 75 сек, після чого можна запускати вентилятори.
  • Перевірка вуличної температури, якщо це зимовий період (наприклад Т < 15°C), то можливо є сенс спочатку запустити витяжний вентилятор на більші оберти, щоб прогріти трохи рекуператор. Це може бути як по часу так і по даних з датчиків, після цього можна запускати приточний вентилятор. Знову перевірка температури, якщо Т < 3°C, потрібно включати нагрів, але він включиться тільки при умові що оберти приточно вентилятора більше ***. Якщо це літній період (Т > 15°C), то вентилятори стартують одночасно і нагрівачі не потрібні.
  • Запустилися обидва вентилятори, нагрівач, все наче працює, допустимо пройшов деякий час і по датчику температури повітря з вулиці має підтримуватися на позначці не менше +3°C, а температура впала нижче і так триває вже 60-120 сек (налаштовується), а при тому під регулятор наче дає команду на нагрів. Значить щось не то, є ризик обмерзання рекуператора, треба фіксувати аварію і повідомити про це, шлемо mms на нокію і вимикаємо вентиляцію.
  • Буває так що уставку +3°C інколи можна понизити, в залежності від показників інших датчиків. Це також треба вміти робити автоматично.
  • Дальше може бути ситуація з обмерзанням рекуператора, коли температура витяжки після рекуператції падає нижче +5С. В такому випадку потрібно за цим слідкувати, трохи збільшувати нагрів або оберти витяжного вентилятора, щоб краще прогрівався рекуператор.
  • Ті ж фільтри, для початку фіксувати час напрацювання і дивитися чи не спрацював пресостат на фільтрах. Якщо вийшов термін роботи фільтрів (налаштовується), то нагадати про це, якщо термін перевищив уставку наприклад на 5-10 днів, то нагадати ще раз, можливо зафіксувати аварію, бо фільтр вже потребує заміни і може бути дизбаланс потоків, що погано відобразиться на рекуперації.
  • Натискаємо кнопку "Стоп", перевіряємо чи працюють в цей момент нагрівачі. Якщо так, то ще можна перевірити на яку потужність, якщо там дуже мало, то можна вентилятори вимикати зразу, думаю нічого страшного не станеться від 50-100 Вт потужності без обдуву. А якщо гріють на 1-1.2 кВт, то спочатку вимикаємо нагрівачі, потім даємо приточному вентилятору покрутитися ще деякий час 1-3 хв, щоб обдути ТЕНи, або просто по датчиках слідкувати, якщо температура починає знижуватися, то можна вимикати вентилятор.

І це мабудь лише частина з того що задумано. Хоча дещо може не буде реалізовано так як описано, дещо може відпаде, але в цілому логіка така що просто робляться налаштування, якісь уставки і воно все працює на автоматі. Розумію що для новачка то може не просто, але попробувати треба 🤣 Частково такий функціонал був записаний на старій системі в тому "нерозумному" ПЛК, але то скучно робити програму на FBD і тоді було менше датчків і обладнання інше.

10 хвилин тому, standov сказав:

максимально- простий функціонал на есп (фактично завертання датчиків/реле в mqtt) і пишіть всю бізнес-логіку засобами ha/openhab/nodered

Так саме про це і запитав сьогодні в першому повідомленні )) Спочатку думав все писати в код ESP, але якось є сумніви що все вийде, тому і питав. Бо може може краще не пхати все в ESP, а вибрати щось інше.

9 хвилин тому, standov сказав:

Та покажіть вже нарешті, код в гітхабі там. Мені правда цікаво як в вас то вийшло. Що саме у вас вже є? 

А що там показувати? Стандартний код ESPHome, фактично зчитування регістрів Modbus з "нерозумного" ПЛК/реле і посилання команд на нього і на контролер обертів вентилятора. І це все закинуто в НА, на тому й все.

Вибачте, я не програміст, мене не є на гітхабі, я з тим не знайомий )) Кусок кину тут, там на 700+ рядків, буде забагато, але плюс мінус то все однотипне. На даний момент в ручному режимі можна робити практично все - вкл/викл вентилятори, разом з ними заслінки, змінювати оберти, вкл/викл нагрівачі, вкл/викл всі релешки на ПЛК, моніторити всі датчики. Але це просто ручний режим, хоча що потрібно в літній період, запустив вентилятори і хай працюють 24/7. На зиму так не прокатить вже.

Прихований текст
# Fan
# ==================================
fan:
  # Supply Fan
  - platform: speed
    output: vo1_output
    id: supply_fan
    name: "Fan Supply"
    restore_mode: ALWAYS_ON
    speed_count: 100
    on_turn_off:
      then:
        - climate.control:
            id: pid_preheater
            mode: "OFF"
        - climate.control:
            id: pid_postheater
            mode: "OFF"
        - delay: 2000ms
        - switch.turn_off: heater1_relay
        - switch.turn_off: heater2_relay
    on_turn_on:
      then:
        - delay: 2000ms
        - switch.turn_on: heater1_relay
        - switch.turn_on: heater2_relay
        - delay: 60000ms
        - climate.control:
            id: pid_preheater
            mode: "HEAT"
        - climate.control:
            id: pid_postheater
            mode: "HEAT"

  # Exhaust Fan
  - platform: speed
    output: vo2_output
    id: exhaust_fan
    name: "Fan Exhaust"
    restore_mode: ALWAYS_ON
    speed_count: 100
# SWITCH
# ==================================
switch:

  - platform: template
    name: "MVHR_ON-OFF"
    id: mvhr_onoff
    lambda: |-
      if (id(supply_fan).state || id(exhaust_fan).state) {
        return true;
      } else {
        return false;
      }
    turn_on_action:
      - fan.turn_on: supply_fan
      - fan.turn_on: exhaust_fan
    turn_off_action:
      - fan.turn_off: supply_fan
      - fan.turn_off: exhaust_fan

  # MVHR ON/OFF
  - platform: modbus_controller
    modbus_controller_id: rs485_pr100
    name: "ON/OFF"
    id: mvhr_on_off
    icon: mdi:power
    register_type: coil
    address: 8320

  # Digital Outputs
  # DO1 - Supply Fan
  - platform: modbus_controller
    modbus_controller_id: rs485_pr100
    name: "PR200 DO1"
    id: do_1
    icon: mdi:electric-switch
    register_type: coil
    address: 8352

  # DO2 - Exhaust Fan
  - platform: modbus_controller
    modbus_controller_id: rs485_pr100
    name: "PR200 DO2"
    id: do_2
    icon: mdi:electric-switch
    register_type: coil
    address: 8353

  # DO3 - Lamp Blue
  - platform: modbus_controller
    modbus_controller_id: rs485_pr100
    name: "PR200 DO3"
    id: do_3
    icon: mdi:electric-switch
    register_type: coil
    address: 8354

  # DO4 - Lamp Red
  - platform: modbus_controller
    modbus_controller_id: rs485_pr100
    name: "PR200 DO4"
    id: do_4
    icon: mdi:electric-switch
    register_type: coil
    address: 8355
climate:

  # PreHeater
  - platform: pid
    name: "pid_preheater"
    id: pid_preheater
    sensor: temp_oda
    default_target_temperature: 3.5°C
    heat_output: preheater_power
    visual:
      min_temperature: 0
      max_temperature: 10
      temperature_step: 0.1
    control_parameters: 
      kp: 0.36587
      ki: 0.00283
      kd: 11.81758
    deadband_parameters: 
      threshold_high: 0.25°C
      threshold_low: -0.25°C

  # PostHeater
  - platform: pid
    name: "pid_postheater"
    id: pid_postheater
    sensor: ds18b20_postheater
    default_target_temperature: 20°C
    heat_output: postheater_power
    visual:
      min_temperature: 12
      max_temperature: 30
      temperature_step: 0.1
    control_parameters: 
      kp: 0.33825 # 0.23506 / 0.35950 / 0.38197 / 0.42882 / 0.31878
      ki: 0.00282 # 0.00163 / 0.00324 / 0.00479 / 0.00282 / 0.00188
      kd: 11.17415 # 8.46213 / 9.97621 / 7.61215 / 16.29531 / 13.54810
    deadband_parameters: 
      threshold_high: 0.3°C
      threshold_low: -0.3°C
Прихований текст

І це все просто в НА в якості сенсорів, свічів і тд.

image.thumb.png.720eed70e88830b5ac705ffa2ca22cd9.pngimage.thumb.png.9562afbc945fbb69c21bbaa9c41ae579.png

 

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

Ну це не автоматизація наразц, ви просто звели потрібні вам реле датчики, ну і плюс два піда. Від цього до ваших хотелок - провалля) я би тепер то все заводив в опенхаб/ха і продовжував там 

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

16 хвилин тому, standov сказав:

Ну це не автоматизація наразц, ви просто звели потрібні вам реле датчики, ну і плюс два піда. Від цього до ваших хотелок - провалля) я би тепер то все заводив в опенхаб/ха і продовжував там 

Так я наче це і писав, що ніякої автоматизації немає, все в ручному режимі )) ну крім того що в НА зробив переключення режимів вентиляторів по графіку 😂

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

Шось я перестав все розуміти. То ви пишете полотно на 10500 пунктів з автоматизацією і кажете що вже майже готово, то пишете що автоматизації нема. В общем нічо не понятно, але вам удачі і натхнення, знадобиться ) 

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

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

То ви пишете полотно на 10500 пунктів з автоматизацією і кажете що вже майже готово, то пишете що автоматизації нема.

Покажіть де я писав що в мене готова автоматизація, бо я щось тоже перестав розуміти )))

Здається декілька разів згадував що все працює в ручному режимі і тільки, а тепер це все треба автоматизувати, для чого і створена тема 😁

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

На даний момент в ручному режимі можна робити практично все - вкл/викл вентилятори, разом з ними заслінки, змінювати оберти, вкл/викл нагрівачі, вкл/викл всі релешки на ПЛК, моніторити всі датчики. Але це просто ручний режим

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

Зараз воно все працює вже декілька місяців, але фактично в ручному режимі і без будь якої логіки, тобто запустив і на тому все, ну окрім ПІД регуляторів, які недавно додав, бо вже була потреба в нагрівачі.

Грубо кажучи зараз все на такому етапі, що все окремо працює і моніториться, але між собою ніяк не зв'язано. Для прикладу в хаті в кожній кімнаті є датчики руху і розумні світильники, і вони працюють, фіксують рухи, але освітлення ніяк не автоматизовано, треба вручну вкл/викл. Так само в мене і з вентиляцією 😄

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

В 03.10.2024 в 02:51, TaurosRMK сказал:

І за допомогою ESP32 і невеликої плати для зв'язку по RS485 той "нерозумний" контролер став розумним і всі дані були показані в НА, звідти і відбувалося керування вентиляцією. На той момент система вентиляції була трохи іншою, з іншим обладнанням, а з початку 2024-го була перероблена, замінено багато обладнання, додано нове. Також зміни потерпів щит керування вентиляцією, "нерозумний" контролер залишився в якості модуля аналогових/дискретних входів/виходів, а вся робота покладена на контролер на базі ESP32 - Kincony A2, який без проблем інтегрувався в НА через ESPHome і керує всіма пристроями.

вибачте, я мабуть не вірно інтерпретував оце ) тобто контролер не став розумним, і керує не він а ви ) ну окей, значить нічого немає ще. Зрозумів

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

3 хвилини тому, standov сказав:

вибачте, я мабуть не вірно інтерпретував оце ) тобто контролер не став розумним, і керує не він а ви ) ну окей, значить нічого немає ще. Зрозумів

"Розумний" я мав на увазі що інтегрований і повністю керуєтсья через НА 😀 Бо до того ніякого зв'язку з реальністю він не мав, працював сам по собі.

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

2 часа назад, TaurosRMK сказал:

а тепер це все треба автоматизувати

ну stm32 в помощь ) подобрать по кол входов выходов и с++ реализует все невозможные хотелки. и выкинуть тот овен. это просто совет, чтоб потом опять не пришлось переделывать через время. 

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

25 хвилин тому, smartdom сказав:

подобрать по кол входов выходов

Варіанти хоть запропонуйте ))

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

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

Варіанти хоть запропонуйте ))

Та там вже на кроку обрати стм з вайфаем чи езернетом виникнуть складності. STM32 у кращому випадку має езернет (ну там ще додатково LAN8720 треба, але у есп езернет такий самий). І готових плат на али з стм та хочаб езернетом я не бачив (ну дев боарди за велики грощі не рахуємо).

Хоча в принципі езернет на STM32 працює:

1000000536.thumb.jpg.db2d49cdb2bceb0296c8e9dd9c0a67a5.jpg

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

17 часов назад, TaurosRMK сказал:

Варіанти хоть запропонуйте ))

находите в ютуб уроки понравившиеся и покупаете как в уроках для ознакомления. а дальше хоть с сенсорными панелями. 

 

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

3 години тому, smartdom сказав:

покупаете как в уроках для ознакомления. а дальше хоть с сенсорными панелями.

А щось готове, ну там аналогові/дискретні входи/виходи, в корпусі на дін рейку, поставив, дроти підключив і готово? Якщо це конструктор, то трохи не підходить, бо знову треба щось нове вивчати і тд. Цікавлять саме готові рішення, без необхідності щось крутити і паяти.

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

2 часа назад, TaurosRMK сказал:

А щось готове, ну там аналогові/дискретні входи/виходи, в корпусі на дін рейку, поставив, дроти підключив і готово? Якщо це конструктор, то трохи не підходить, бо знову треба щось нове вивчати і тд. Цікавлять саме готові рішення, без необхідності щось крутити і паяти.

я не встречал. это как ардуины, только проф. 

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

  • 1 місяць потому...

Що не так з автоматизацією? Зробив, перевіряю, а вона спрацьовує навіть якщо якась з умов не виконується? В даному випадку Fan Supply вимкнено і RPM відповідно = 0. Чи при ручному запуску автоматизація буде спрацьовувати в будь якому випадку?

image.thumb.png.ff03313fad2a40aa6a05da81c32e92f5.png

image.thumb.png.a533a968b865df0357a83ed2160eba83.png

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

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

Чи при ручному запуску автоматизація буде спрацьовувати в будь якому випадку?

здається, так

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

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

Чи при ручному запуску автоматизація буде спрацьовувати в будь якому випадку?

Так. При ручному запуску безумовно відпрацьовує секція Actions (Тоді виконати).

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

Який підхід чи принцип створення автоматизацій (в даному випадку в НА) найбільш правильний/зручний/кращий/логічний?

Створювати окремі автоматизації зі своїми тригерами/умовами, чи краще спочатку робити якісь невеликі кусочки, які можуть десь повторюватися, а на їх основі вже робити більш ширші автоматизації?

І тут зразу наступне питання, конструктор автоматизацій в НА дозволяє робити будь які автоматизації, чи все ж таки є щось таке, що в ньому не можна зробити і прийдеться кодом писати? Чи може зразу з коду починати, заодно трохи практики буде?

Просто не знайомий ще з цим всім і в цілому який підхід має бути, щоб потім десь на середині роботи не виявилося що треба все переробляти, бо щось працює не так як треба )))

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

23.11.2024 в 20:38, TaurosRMK сказав:

Створювати окремі автоматизації зі своїми тригерами/умовами, чи краще спочатку робити якісь невеликі кусочки, які можуть десь повторюватися, а на їх основі вже робити більш ширші автоматизації?

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

23.11.2024 в 20:38, TaurosRMK сказав:

І тут зразу наступне питання, конструктор автоматизацій в НА дозволяє робити будь які автоматизації, чи все ж таки є щось таке, що в ньому не можна зробити і прийдеться кодом писати? Чи може зразу з коду починати, заодно трохи практики буде?

Робота зі змінними тільки через ямл.

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

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

Вирішив попробувати з ESP32 передавати дані через Modbus на головний пристрій, тобто зробити пристрій на ESP32 як slave. На практиці це може пригодитися якщо є якийсь DIY пристрій на базі ESP32 і потрібно передати дані по Modbus на Master пристрій. Прошивка ESPHome, код скопійований з документації, але там трохи заплутаний приклад, тому методом тику вийшло ось так. Може хтось поправить, якщо щось не правильно. Для тесту взяв ESP32 C3 Super Mini, модуль TTL to RS-485 MAX485 і датчик DS18B20. Відповідно ESP32 зчитує дані з датчика і відправляє їх на Master пристрій, чи точніше Master пристрій їх зчитує (не знаю як воно правильно працює). Дані по Modbus передаються в цілих числах, тому показання датчика множаться на 10, щоб при даних з датчика 21.7°C на виході отримувати значення 217, а не округлення до 22. Тут не знаю чи це так нормально, чи щось потрібно змінити, щоб результат відправлявся з крапкою. На Master пристрої їх потрібно помножити на 0.1, щоб отримати 21.7°C.

На комп'ютері підключився через Modbus Poll, все ок, дані отримую.

uart:
  - id: uart_modbus_server
    baud_rate: 115200
    tx_pin: 21
    rx_pin: 20
    stop_bits: 1

modbus:
  - uart_id: uart_modbus_server
    id: modbus_server
    role: server

modbus_controller:
  - modbus_id: modbus_server
    address: 0x3 # Slave ID
    server_registers:
      - address: 2
        value_type: S_DWORD_R
        read_lambda: |-
          return id(ds18b20_rs485).state;

one_wire:
  - platform: gpio
    pin: GPIO2 # 0xc60119373c9a4328

sensor:
  - platform: dallas_temp
    address: 0xc60119373c9a4328
    id: ds18b20_rs485
    name: temperature
    update_interval: 1s
    accuracy_decimals: 3
    filters:
      - multiply: 10

 

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

Як то кажуть, не пройшло і пів року, нарешті почав робити автоматизацю ПВУ 🤣 Але тим не менше, початок покладено. Роблю це вперше, тому паралельно вивчаю. Вирішив по можливості писати все в коді на ESP32 (прошивка ESPHome), щоб контролер працював незалежно від сервера НА. Попередньо не бачу що там будуть якісь складні розрахунки і тд, в більшості лише логічні операції, з чим контролер на ESP32 має без проблем справлятися. Якщо щось піде не так, то ніколи не пізно перенести все в НА.

Ось кусок з того, що можна сказати готове. Здається все написано правильно, але може гуру бачать якісь нюанси, щось не правильно або не логічно зроблено, або щось потрібно додати щоб працювало більш коректно? Я ще не перевіряв чи взагалі працює 😄

Що тут відбувається. Автоматизація нагрівача вуличного повітря (для постнагріву буду аналогічна). По-перше, нагрівачі (переднагрів і постнагрів) можуть працювати тільки за умови що працює приточний вентилятор і має оберти які забезпечують швидкість повітря не менше 1.5 м/с (рекомендація виробника). В моєму випадку це ~95 м³/год для 150 мм діаметру при 750-775 RPM. Записав не менше 700 RPM, думаю не страшно. Якщо умова не виконується, то нагрівачі зразу переходять в стан "Вимкнено". Також є ще додаткові умови при яких нагрівач переходить в стан "Вимкнено". Можна в ручному режимі вимкнути, або ж по спрацюванню термореле, або по датчку, якщо зафіксується занадто висока температура.

Запускаєтсья автоматизація по датчику температури витяжного повітря на виході з теплообмінника. Якщо температура падає нижче 5°C на час більше 3 хв, то запускається автоматизація, якщо температура піднімаєтсья вище 5.5°C на час більше 30 хв, то автоматизація вимикає нагрівач і обезточує його.

Нагрів керується PID регулятором через твердотіле реле 4-20 mA. Коефіцієнти підібралися автоматично в режимі "Автотюнінг".

  # Режим роботи нагрівачів
  # Переднагрів
  - platform: template
    id: preheater_mode
    name: "PreHeater Mode"
    options:
      - "Auto"
      - "Disable"
    initial_option: "Auto"
    restore_value: true
    optimistic: true

  # Прапорець - нагрів дозволено
  - platform: template
    name: "Heating Allowed"
    id: heating_allowed
    condition:
      and:
        - switch.is_on: do_1
        - fan.is_on: supply_fan
        - sensor.in_range:
            id: supply_fan_rpm
            above: 700

  # Переднагрів
  - platform: template
    name: "PreHeater Automation"
    id: preheater_automation
    condition:
      and:
        - lambda: 'return id(preheater_mode).state == "Auto";'
        - binary_sensor.is_on: heating_allowed
        - binary_sensor.is_off: alert_heater1_ts
        - binary_sensor.is_off: alert_overheating_heater1
    on_press: 
      then:
        - if:
            condition:
              for:
                time: 3min
                condition:
                  sensor.in_range:
                    id: sht30_eha_temp
                    below: 5
            then:
              - switch.turn_on: heater1_relay
              - delay: 3s
              - climate.control:
                  id: pid_preheater
                  mode: HEAT
            else:
              - if:
                  condition:
                    for:
                      time: 30min
                      condition:
                        sensor.in_range:
                          id: sht30_eha_temp
                          abowe: 5.5
                  then:
                    - climate.control:
                        id: pid_preheater
                        mode: "OFF"
                    - delay: 3s
                    - switch.turn_off: heater1_relay
    on_release:
      then:
        - climate.control:
            id: pid_preheater
            mode: "OFF"
        - delay: 3s
        - switch.turn_off: heater1_relay

  # PID - PreHeater
  # Регулятор нагрівача №1
  - platform: pid
    name: "PID PreHeater"
    id: pid_preheater
    sensor: sht30_oda_temp
    default_target_temperature: 1°C
    heat_output: preheater_power
    visual:
      min_temperature: -5
      max_temperature: 10
      temperature_step: 0.1
    control_parameters: 
      kp: 0.20034 
      ki: 0.00072 
      kd: 13.92368 
    deadband_parameters: 
      threshold_high: 0.25°C
      threshold_low: -0.25°C

Я тут що попробував, якщо задати правильно запит, то MS Copilot навіть пропонує якісь автоматизації ))) Може він і напише все що треба 🤣

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

Ох блін, і чому не звернувся за допомогою раніше )))) Сидів пару днів розбирався як написати простий код, а тут за декілька хвилин готовий результат 🤣 Це про сенсори швидкості повітря, в темі про вентиляцію.

sensor:
  - platform: dht
    pin: D2
    temperature:
      name: "Air Temperature"
      id: air_temperature
    humidity:
      name: "Air Humidity"
      id: air_humidity
    update_interval: 60s

  - platform: adc
    pin: A0
    name: "Pressure Difference Sensor"
    id: pressure_difference
    unit_of_measurement: "Pa"
    accuracy_decimals: 2
    filters:
      - multiply: 100.0  # Коефіцієнт для перетворення значень сенсора

interval:
  - interval: 30s
    then:
      - lambda: |-
          float T = id(air_temperature).state + 273.15; // Температура в Кельвінах
          float RH = id(air_humidity).state / 100.0; // Відносна вологість у долях
          float P = 101325.0; // Атмосферний тиск в Па (можна налаштувати)
          
          // Обчислення тиску насиченої пари при температурі T (у Па)
          float e_s = 610.78 * exp(T * 17.27 / (T + 237.3));
          
          // Обчислення парціального тиску водяної пари
          float e = RH * e_s;
          
          // Обчислення парціального тиску сухого повітря
          float p_d = P - e;
          
          // Обчислення густини повітря (кг/м³)
          float R_d = 287.05;
          float R_v = 461.5;
          float rho = (p_d / (R_d * T)) + (e / (R_v * T));
          
          float delta_p = id(pressure_difference).state; // Перепад тиску в Па
          float air_speed = sqrt((2 * delta_p) / rho); // Швидкість повітря в м/с

          // Розрахунок об'ємного потоку через канал діаметром 150 мм (0.15 м)
          float diameter = 0.15; // Діаметр каналу в метрах
          float area = 3.14159 * pow((diameter / 2), 2); // Площа перетину каналу в м²
          float volumetric_flow_rate = air_speed * area; // Об'ємний потік в м³/с

          // Об'ємний потік за годину в м³/год
          float volumetric_flow_rate_per_hour = volumetric_flow_rate * 3600;

          ESP_LOGI("custom", "Air Temperature: %.2f °C", id(air_temperature).state);
          ESP_LOGI("custom", "Air Humidity: %.2f %%", id(air_humidity).state);
          ESP_LOGI("custom", "Air Density: %.3f kg/m³", rho);
          ESP_LOGI("custom", "Air Speed: %.2f m/s", air_speed);
          ESP_LOGI("custom", "Volumetric Flow Rate: %.2f m³/s", volumetric_flow_rate);
          ESP_LOGI("custom", "Volumetric Flow Rate per Hour: %.2f m³/h", volumetric_flow_rate_per_hour);

 

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

Спільними зусиллями з AI процес зрушив з місця 😂 Пермикач "Запуск системи", перевірив, наче працює справно.

При включенні запускається система. Спочатку відкриваються дві заслінки (час відкриття 75 сек), потім запускається витяжний вентилятор і перевіряються умови чи потрібен прогрів теплообмінника. Оскільки ПВУ на холодному горищі і хоть трохи утеплена, але це все рівно не спасає від остивання температури в ПВУ і повітроводах. Тому при температурі на вулиці близькій до 0С і нижче краще деякий час прогріти ТО витяжним повітрям. Після цього вмикається приточний вентилятор, відмічаєтсья прапорець що система запущена і додатково надсилається повідомлення на мобільний додаток НА.

При вимкненні ситуація зворотня, тільки з перевіркою інших умов. Якщо в момент виключення працюють нагрівачі (хоча б один), то приточний вентилятор вимикається з затримкою 2 хв, щоб продути ТЕНи, попередньо PID регулятори вимикаються. Далі нагрівачі обезточуються, заслонки закриваються і надсилаються повідомлення в додаток що система вимкнена.

switch:
  - platform: template
    name: "Start MVHR"
    id: start_mvhr
    optimistic: true
    #restore_mode: ALWAYS_OFF
    turn_on_action:
      - switch.turn_on: do_1 # Приточна заслонка і вентилятор
      - switch.turn_on: do_2 # Витяжна заслонка і вентилятор
      - lambda: |-
          ESP_LOGI("MVHR", "Opening the dampers");
      - switch.turn_on: do_3 # Індикатор роботи
      - delay: 75s # Затримка відкриття заслонок
      - lambda: |-
          ESP_LOGI("MVHR", "Dampers are open");
      - fan.turn_on:
          id: exhaust_fan
      - lambda: |-
          // Збереження поточної швидкості витяжного вентилятора
          id(current_exhaust_speed) = id(exhaust_fan).speed;
          ESP_LOGI("MVHR", "Current exhaust fan speed saved: %f", id(current_exhaust_speed));
      - delay: 5s
      - delay: !lambda |-
          float exhaust_temp = id(sht30_eta_temp).state;
          int delay_time = 0;
          id(exhaust_warmup_speed) = id(current_exhaust_speed); // Початкова швидкість - поточна швидкість

          if (exhaust_temp < 17.0) {
            delay_time = 6;  // 6 хвилин
            id(exhaust_warmup_speed) = 60;  // Швидкість встановлюється на 60
            ESP_LOGI("MVHR", "Exhaust temperature < 17.0°C, delay for 6 minutes, setting speed to 60");
          } else if (exhaust_temp >= 17.0 && exhaust_temp <= 19.0) {
            delay_time = 3;  // 3 хвилини
            id(exhaust_warmup_speed) = 60;  // Швидкість встановлюється на 60
            ESP_LOGI("MVHR", "Exhaust temperature between 17.0°C and 19.0°C, delay for 3 minutes, setting speed to 60");
          } else {
            ESP_LOGI("MVHR", "Exhaust temperature > 19.0°C, using current speed: %f", id(exhaust_warmup_speed));
          }

          auto call = id(exhaust_fan).turn_on();
          call.set_speed(id(exhaust_warmup_speed));
          call.perform();

          return delay_time * 60000;  // Конвертуємо хвилини в мілісекунди
      - lambda: |-
          // Повернення швидкості витяжного вентилятора до поточної, якщо була затримка на прогрів
          if (id(exhaust_warmup_speed) != id(current_exhaust_speed)) {
            auto call = id(exhaust_fan).turn_on();
            call.set_speed(id(current_exhaust_speed));
            call.perform();
            ESP_LOGI("MVHR", "Exhaust fan speed restored to %f", id(current_exhaust_speed));
          }
      - fan.turn_on:
          id: supply_fan
      - lambda: |-
          // Збереження поточної швидкості приточного вентилятора
          id(current_supply_speed) = id(supply_fan).speed;
          ESP_LOGI("MVHR", "Current supply fan speed saved: %f", id(current_supply_speed));
      - binary_sensor.template.publish: 
          id: system_is_running 
          state: ON
      - lambda: |-
          ESP_LOGI("MVHR", "System is running");
      - homeassistant.action:
          action: notify.mobile_app_xiaomi_14t
          data:
            message: "The MVHR system has been started."
            title: "MVHR System Running"

    turn_off_action:
      - fan.turn_off:
          id: exhaust_fan
      - delay: !lambda |-
          bool heater1_active = id(pid_preheater).mode == CLIMATE_MODE_HEAT;
          bool heater2_active = id(pid_postheater).mode == CLIMATE_MODE_HEAT;
          int delay_time = 0;

          if (heater1_active || heater2_active) {
              delay_time = 2;  // 2 хвилини
              ESP_LOGI("MVHR", "Blowing the heaters for 2 minutes");
          }

          // Встановлення PID регуляторів на OFF
          auto call_preheater = id(pid_preheater).make_call();
          call_preheater.set_mode("OFF");
          call_preheater.perform();

          auto call_postheater = id(pid_postheater).make_call();
          call_postheater.set_mode("OFF");
          call_postheater.perform();

          return delay_time * 60000;  // Конвертуємо хвилини в мілісекунди
      - delay: 3s
      - switch.turn_off: 
          id: heater1_relay
      - switch.turn_off: 
          id: heater2_relay
      - fan.turn_off:
          id: supply_fan
      - lambda: |-
          ESP_LOGI("MVHR", "Closing the dampers");
      - switch.turn_off: do_2 # Витяжна заслонка і вентилятор
      - switch.turn_off: do_1 # Приточна заслонка і вентилятор
      - delay: 75s # Затримка закриття заслонок
      - lambda: |-
          ESP_LOGI("MVHR", "Dampers are closed");
      - switch.turn_off: do_3 # Індикатор роботи
      - binary_sensor.template.publish: 
          id: system_is_running 
          state: 'OFF'
      - lambda: |-
          ESP_LOGI("MVHR", "System is stopped");
      - homeassistant.action:
          action: notify.mobile_app_xiaomi_14t
          data:
            message: "The MVHR system has been stopped."
            title: "MVHR System Stopped"

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

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

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

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

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

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

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

Увійти

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

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