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

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

TaurosRMK

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

Напилил себе карточку на отопление
Старался сделать в стиле сансинка))

В итоге основная борде выглядит так

image.thumb.png.80d774868abd0af882a2cff8edbaa6a7.png

ПС - кастомные "сенсоры" для дейли енерджи юзедж сегодня переделывал и потому считает не с начала дня) и цифры разные

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

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

карточку на отопление

згадую часи коли ефективність ПВУ в мене рахувало 90%. Чогось останнім часом пише 70-80%

image.png.44600c4cefe3d54e97d63fa5bdcf07f5.png

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

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

згадую часи коли ефективність ПВУ в мене рахувало 90%. Чогось останнім часом пише 70-80%

image.png.44600c4cefe3d54e97d63fa5bdcf07f5.png

Фильтры? У меня до 67 падало когда забились фильтры пылью)

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

Тільки що, ЯД сказав:

Фильтры? У меня до 67 падало когда забились фильтры пылью)

чисто там

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

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

А що по вологості в конкретно даному випадку?

50% в будинку, теплообмінник повний конденсату, дренаж чистий

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

28 минут назад, yur43 сказал:

50% в будинку, теплообмінник повний конденсату, дренаж чистий

Я в очередной раз понимаю что у меня избыточная вентиляция на сейчас 38% в гостинной, 40 и 43 в с/узлах

Но у меня просто вытяжки и микро на окнах

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

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

50% в будинку, теплообмінник повний конденсату, дренаж чистий

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

По вашій картинці ось так виходить. Але це грубо і без врахування вологості, і також залежно де ті датчики стоять.

image.png.51c4c42ac17e8268b90fbcff2b93387a.png

image.png.c70e19f4098839618a99b3aae8793529.png

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

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

 може буде очікувана ефективність. 

вночі погрався балансом приток/витяжка 

image.thumb.png.9523c74ce2045a193000c65dde8cdd69.png

image.png.ccb779da0557c430428e4de498a6d253.png

в 2-05 додав приток +10%  - ефективність ще впала,

в 2-30 зробив пріоритет вихлопа +12% - ефективність зросла.

Просто "на око" погрався.

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

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

вночі погрався балансом приток/витяжка 

image.thumb.png.9523c74ce2045a193000c65dde8cdd69.png

image.png.ccb779da0557c430428e4de498a6d253.png

в 2-05 додав приток +10%  - ефективність ще впала,

в 2-30 зробив пріоритет вихлопа +12% - ефективність зросла.

Просто "на око" погрався.

Ну то відповідь від ШІ була )) Я потім собі рахував, знаючи що в мене плюс-мінус баланс, то ШІ нарахував мені на 300% більше витяжку ))) В деталі не вдавався.

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

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

Просто "на око" погрався.

То залишіть так, додайте до своїх автоматизацій множник 1.1 до притоку. Спостерігайте декілька днів.

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

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

То залишіть так, додайте до своїх автоматизацій множник 1.1 до притоку. Спостерігайте декілька днів.

Просить більший вихлоп.

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

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

Раніше написаний в цій темі код працював цілком задовільно до певного часу. Не скажу що в тому коді реалізував все що хотів, і що все було правильно, але все працювало. В один момент щось пішло не так і контролер на ESP32 (Kincony A2) який керував всім, почав перезавантажуватися. Просто збій і все, що призводило до того, що автоматизації злітали і не виконувалися так, як треба. Згодом знайшов причину в шині І2С, яка по мірках І2С була зовсім трохи довга 🤣 В результаті було прийняте рішення дещо модифікувати контрольний пункт для ПВУ. Два окремих контролери замінив на один, також на ESP32, датчики пішли на RS485, ще дещо переніс і в результаті пів щита вільного )) Це все відповідно потягнуло за собою зміну коду. А в даний час маючи доступ до ШІ писати код простіше простого. Маючи майже рік аналізу роботи системи, я приблизно знав що хочу змінити або додати. Тому саме тим і зайнявся.

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

Озброївшись VSCode записав базовий код для контролера, а за допомогою спочатку Copilot, а потім Claude інтеграцій почав писати логіку. Ну писати код це трохи перебільшення, фактично майже все написано ШІ, я тільки писав що я хочу і коригував його роботу, поки не отримав той результат, який мені треба. Лінь доходила до того, що я писав щоб ШІ змінив інтервал оновлень сенсорів, ну просто циферки поміняти 🤣 Але навіть так, за декілька днів, особливо не розбираючись в коді, отримав готовий результат валідного коду. Перфект!

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

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

image.png.d01c9f227481497d591a95be60f42518.png

Прихований текст
# =============================================================================
# SYSTEM COMPONENTS
# =============================================================================

# Debug component for reset reason diagnostics
debug:
  update_interval: 5s

# Time synchronization with RTC
time: !include mvhr_hub_components/base/time.yaml

# Hardware watchdog for system freeze protection
<<: !include mvhr_hub_components/base/watchdog.yaml

# Global variables for state management
globals: !include mvhr_hub_components/globals/variables.yaml

# =============================================================================
# HARDWARE INTERFACES
# =============================================================================

uart: !include mvhr_hub_components/hardware/uart.yaml
modbus: !include mvhr_hub_components/hardware/modbus.yaml
modbus_controller: !include mvhr_hub_components/hardware/modbus_controller.yaml
i2c: !include mvhr_hub_components/hardware/i2c.yaml
pcf8574: !include mvhr_hub_components/hardware/pcf8574.yaml

# =============================================================================
# ENTITIES
# =============================================================================

# Sensors (temperature, humidity, pressure, power, etc.)
sensor: !include_dir_merge_list mvhr_hub_components/sensors

# Binary sensors (status indicators, conditions, alarms)
binary_sensor: !include_dir_merge_list mvhr_hub_components/binary_sensors

# Text sensors (status messages, diagnostics)
text_sensor: !include_dir_merge_list mvhr_hub_components/text_sensor

# Analog outputs (PWM, DAC)
output: !include_dir_merge_list mvhr_hub_components/outputs

# Digital outputs (relays, switches)
switch: !include_dir_merge_list mvhr_hub_components/switches

# Controls (fans, climate)
fan: !include mvhr_hub_components/controls/fans.yaml
climate: !include mvhr_hub_components/controls/climate.yaml

# Buttons (actions, resets)
button: !include_dir_merge_list mvhr_hub_components/buttons

# Number inputs (settings, thresholds)
number: !include_dir_merge_list mvhr_hub_components/numbers

# Scripts (automation sequences)
script: !include_dir_merge_list mvhr_hub_components/scripts

# Intervals (periodic automations)
interval: !include mvhr_hub_components/intervals/intervals.yaml

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

Прихований текст
# =============================================================================
# MVHR START/STOP SWITCH
# =============================================================================
# System start/stop control for physical button and Home Assistant
# =============================================================================

- platform: template
  id: start_stop
  name: "Start/Stop"
  icon: "mdi:hvac"
  lambda: |-
    const std::string status = id(system_status);
    return status == "starting" || status == "running";
  turn_on_action:
    - if:
        condition:
          lambda: |-
            return id(emergency_active);
        then:
          - lambda: |-
              ESP_LOGE("mvhr", "Cannot start - Emergency state active: %s", id(emergency_cause).c_str());
              ESP_LOGE("mvhr", "Use Emergency Reset to clear");
              id(start_stop).publish_state(false);
        else:
          - if:
              condition:
                lambda: |-
                  const std::string status = id(system_status);
                  return status == "stopped" || status == "stopping" || status == "error";
              then:
                - script.execute: mvhr_start
  turn_off_action:
    - if:
        condition:
          lambda: |-
            const std::string status = id(system_status);
            return status == "running" || status == "starting";
        then:
          - script.execute: mvhr_stop

Скрипт запуску.

Прихований текст
# =============================================================================
# MVHR STARTUP SCRIPT
# =============================================================================
# Initializes system: fans, dampers, and basic state setup
# =============================================================================

- id: mvhr_start
  then:
    - script.stop: mvhr_stop
    - script.stop: mvhr_warmup

    - lambda: |-
        id(system_status) = "starting";
        ESP_LOGI("mvhr", "STARTUP: Initializing system");

    - switch.turn_on: do07_lamp_blue
    - delay: 2s

    - switch.turn_on: do01_fan_supply
    - switch.turn_on: do02_fan_exhaust

    # Wait for dampers to open
    - delay: 75s

    - fan.turn_on:
        id: fan_supply_speed
        speed: 40
    - fan.turn_on:
        id: fan_exhaust_speed
        speed: 40
    - delay: 3s

    - lambda: |-
        id(current_fan_supply_speed) = id(fan_supply_speed).speed;
        id(current_fan_exhaust_speed) = id(fan_exhaust_speed).speed;

    - lambda: |-
        id(system_status) = "running";
        ESP_LOGI("mvhr", "STARTUP: System running");

    - delay: 10s

    # Check if warmup is needed based on ETA temperature
    - if:
        condition:
          lambda: |-
            const float eta_temp = id(temperature_eta).state;
            if (isnan(eta_temp)) {
              return true;
            }
            return eta_temp < 19.0f;
        then:
          - script.execute: mvhr_warmup
          - script.wait: mvhr_warmup

    - lambda: |-
        if (id(system_status) == "running") {
          id(system_ready) = true;
          ESP_LOGI("mvhr", "STARTUP: System ready");
        } else {
          ESP_LOGW("mvhr", "STARTUP: System was stopped during startup");
        }

Скрипт зупинки.

Прихований текст
# =============================================================================
# MVHR SHUTDOWN SCRIPT
# =============================================================================
# Safely stops system: fans, dampers, and final state cleanup
# =============================================================================

- id: mvhr_stop
  then:
    - script.stop: mvhr_start
    - script.stop: mvhr_warmup

    - lambda: |-
        id(system_status) = "stopping";
        ESP_LOGI("mvhr", "SHUTDOWN: Stopping system");

    - fan.turn_off: fan_exhaust_speed
    - fan.turn_off: fan_supply_speed

    - switch.turn_off: do02_fan_exhaust
    - switch.turn_off: do01_fan_supply

    # Wait for dampers to close
    - delay: 75s

    - switch.turn_off: do07_lamp_blue

    - lambda: |-
        id(system_ready) = false;
        id(system_status) = "stopped";
        ESP_LOGI("mvhr", "SHUTDOWN: System stopped");

Скрипт прогріву теплообмінника.

Прихований текст
# =============================================================================
# MVHR HEAT EXCHANGER WARMUP SCRIPT
# =============================================================================
# Determines warmup duration based on ETA temperature and performs warmup
# =============================================================================

- id: mvhr_warmup
  mode: restart
  then:
    # Determine warmup duration based on ETA temperature
    - lambda: |-
        const float eta_temp = id(temperature_eta).state;
        const bool winter = id(season_winter_state);
        int warmup_minutes = 0;

        // Check if temperature is valid (not NaN)
        if (isnan(eta_temp)) {
          if (winter) {
            warmup_minutes = 10;
          } else {
            warmup_minutes = 0;
            return;
          }
        } else if (eta_temp < 17.0f) {
          warmup_minutes = 10;
        } else if (eta_temp >= 17.0f && eta_temp < 19.0f) {
          warmup_minutes = 5;
        } else {
          return;  // Exit script if no warmup needed
        }

        // Store warmup time
        id(warmup_timer) = warmup_minutes;

    # Set exhaust fan to 75% for warmup
    - fan.turn_on:
        id: fan_exhaust_speed
        speed: 75
    - lambda: |-
        ESP_LOGI("mvhr", "WARMUP: Started for %d minutes at 75%% exhaust speed", id(warmup_timer));

    # Wait for warmup duration using while loop
    # Exit early if system is stopped
    - while:
        condition:
          lambda: |-
            // Continue warmup only if system is still running AND timer > 0
            if (id(system_status) != "running") {
              ESP_LOGW("mvhr", "WARMUP: System stopped, exiting warmup");
              return false;
            }
            return id(warmup_timer) > 0;
        then:
          - delay: 1min
          - lambda: |-
              id(warmup_timer)--;

    - lambda: |-
        ESP_LOGI("mvhr", "WARMUP: Finished");

    # Restore exhaust fan to saved speed
    - lambda: |-
        auto call = id(fan_exhaust_speed).turn_on();
        call.set_speed(id(current_fan_exhaust_speed));
        call.perform();

Скрипт аварії. На даний час це фактично просто запуск скрипта зупинки системи, але не користувачем, а системою. Наразі цей скрипт ще не повноцінний, бо треба подумати що саме буде визивати аварії, а що може ігноруватися. Поки що аварію визиває загроза обмерзання теплообмінника, якщо температура на витяжці після ТО опускаєтсья нижче 3°C, то це тригер для аварійної зупинки.

Прихований текст
# =============================================================================
# EMERGENCY SHUTDOWN SCRIPT
# =============================================================================
# Safely shuts down MVHR system in emergency conditions
# =============================================================================

- id: emergency_shutdown
  mode: single
  then:
    - lambda: |-
        ESP_LOGE("emergency", "Emergency shutdown sequence initiated");

    # Activate red warning lamp
    - switch.turn_on: do08_lamp_red

    # Stop MVHR system (heaters auto-disable via enable conditions)
    - script.execute: mvhr_stop

    # Shutdown complete - log cause
    - lambda: |-
        ESP_LOGE("emergency", "Emergency shutdown complete");
        ESP_LOGE("emergency", "Cause: %s", id(emergency_cause).c_str());
        ESP_LOGE("emergency", "Manual reset required");

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

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

В 08.10.2024 в 01:18, standov сказал:

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

кхм )

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

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

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

Команда є, я і мої друзі Claude і Copilot 🤣 Досвід в них є, код пишуть швидко, на будь які запити )))

На рахунок версій - не впевнений нащо аж півсотні, якщо тут за пару днів можна сказати бета версія вже готова, яка на 80% має бажаний функціонал. Ну звісно це все не з нуля, а фактично повторення того, що вже було на старому контролері, тільки з деякими змінами.

А що не так з алгоритмами і ресурсами заліза? От просто не розумію, якось це все працювало на аналогічній ESP32 приблизно з січня минулого року і до кінця серпня, без будь яких нюансів, 24/7 🤔 А тоді щось не так пішло з І2С (велика обнова) і трохи поламалася робота через регулярні збої. Але проблема не в залізі/коді, а в шині І2С під 10 метрів 😅 Зараз такий самий чіп ESP32-Wroom-32E-N16 (попередній взагалі був *-N4), функціонал передбачається такий самий, тільки з деякими змінами, які за рік користування захотілося змінити/покращити. Тому на мою думку і з досвідом використання контролера на ESP32 для таких задач, не бачу проблем. Має працювати.

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

Так що я без поняння про які нюанси ви пишете. Може хоча б коротко про них розкажете, щоб я перевірив? Я не стверджую що в тому коді все зроблено по всіх канонах, точніше не в самому коді, а в побудові логіки роботи. Тому що код Claude пише дуже непоганий, навіть сам алгоритми пропонує, але як пов'язати одну задачу/алгоритм з усім проектом, щоб це все було правильно, де і які умови потрібно перевіряти, локально чи глобально і всяке таке, з цим хіба що можуть бути нюанси, тому що я не програміст і цю всю логіку, що і як має бути, не знаю. У всьому іншому, словесно описати алгоритм і з допомогою помічників довести до потрібного результату, наче не виникає нюансів.

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

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

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

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

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

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

Увійти

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

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