#1 2026-09-03 23:02:08

phosaly
Учасник
Зареєстрований: 2026-09-03
Повідомлень: 3

котел FerroliBlueSens +CloudMQTT+Мобільний додаток Delphi 13 FMX

zobrazenna-viber-2026-09-02-21-09-26-824.jpg
zobrazenna-viber-2026-09-02-21-09-30-688.jpg
zobrazenna-viber-2026-09-02-22-00-50-362.jpg

// ---- Режим "Крива опалення" (погодозалежне регулювання) ----

ESP8266 «Котел» (opentherm_mqtt.ino) — документація
Плата виконує роль шлюзу: спілкується з котлом по протоколу OpenTherm, а з Delphi-застосунком — через MQTT (брокер CloudAMQP).

1. Підключення пінів (NodeMCU)
Пін    GPIO    Призначення    Напрямок
D7    GPIO13    OpenTherm-адаптер — IN    вхід (переривання)
D8    GPIO15    OpenTherm-адаптер — OUT    вихід
D5    GPIO14    Реле насоса    вихід (RELAY_ON=LOW / RELAY_OFF=HIGH)
D3    GPIO0    Кнопка скидання WiFi (вбудована FLASH-кнопка)    вхід, INPUT_PULLUP
3.3V / GND    —    Живлення OpenTherm-адаптера та реле    —

⚠️ D3 (GPIO0) зайнятий кнопкою WiFi-reset — не використовуйте його для реле чи інших периферійних пристроїв (це "strapping"-пін, критичний для завантаження ESP8266).

2. Загальна логіка роботи
setup()
├─ connectWiFi()     — WiFiManager: підключення / точка доступу "Boiler"
├─ ot.begin(...)     — ініціалізація бібліотеки OpenTherm
├─ pinMode(RELAYPUMP, OUTPUT) — реле в безпечний стан (вимкнено)
└─ mqtt.setServer/setCallback

loop()  (виконується постійно)
├─ mqtt.loop()               — обробка вхідних MQTT-повідомлень
├─ якщо минув OT_INTERVAL (1с)  → otCycle()   — обмін з котлом
│    └─ раз на кілька циклів    → readExtParamsStep()
└─ якщо минув PUB_INTERVAL      → publishState() — публікація стану в MQTT
3. Опис функцій
connectWiFi()

Піднімає WiFi через WiFiManager. Якщо при старті утримати кнопку WiFi-reset (D3/GPIO0) — скидає збережені налаштування мережі й відкриває точку доступу "Boiler" для повторного налаштування.

connectMQTT()

Підключається до брокера (goose.rmq2.cloudamqp.com), публікує online (LWT — offline при розриві), підписується на всі командні топіки (set/enable, set/temp, set/room_temp, pump/set, set/curve_mode) і одразу публікує поточні retained-стани (pump, curve_mode).

mqttCallback(topic, payload, length)

Єдина точка прийому команд від Delphi. За назвою топіка визначає, яке поле змінити:

Топік    Дія
home/boiler/set/enable    boiler.enabled = ...
home/boiler/set/temp    boiler.setTemp (перевірка діапазону 20–80°C)
home/boiler/set/room_temp    boiler.roomSetTemp (діапазон 5–30°C)
home/boiler/pump/set    setPump(msg == "1")
home/boiler/set/curve_mode    вмикає/вимикає режим «Крива опалення»
home/sensor/temp / temp_o    кеш кімнатної/зовнішньої температури (для кривої)
setPump(bool on)

Керує реле насоса: digitalWrite(RELAYPUMP, ...), зберігає стан у pumpState, публікує підтверджений статус у home/boiler/pump (retained).

otCycle()

Головний цикл обміну з котлом по OpenTherm (виконується раз на секунду):

Встановлює статус (CH увімкнено/вимкнено, чи є помилка, чи горить пальник).
Розраховує й надсилає уставку температури теплоносія — вручну (boiler.setTemp) або автоматично за кривою (computeHeatingCurve), якщо активний curveMode.
Надсилає уставку кімнатної температури.
Читає поточну температуру подачі й обратки.
Читає код і прапорці несправності (ASF-флаги).
computeHeatingCurve(desired, in, out)

Погодозалежний розрахунок температури теплоносія за квадратичною апроксимацією класичного «температурного графіка», з поправками на бажану кімнатну температуру та фактичне відхилення термостата.

readExtParamsStep()

Читає розширені параметри OpenTherm по одному за виклик (не всі одразу), щоб не блокувати loop() на кілька секунд: тиск у системі (ID18), температура вихлопу, зовнішня температура котла (ID27), рівень модуляції пальника (ID17), макс./мін. потужність (ID15).

publishState()

Публікує повний стан котла в MQTT:

окремі топіки (temp, temp_return, flame, fault_code, fault_flags) — для швидкого доступу;
один великий JSON у home/boiler/status — всі поля разом (enabled, temp, set_temp, room_set, pump, розширені OpenTherm- параметри, curve_mode, curve_calc_temp).
handleInterrupt()

Апаратний обробник переривання OpenTherm-бібліотеки (ICACHE_RAM_ATTR — виконується з RAM для швидкодії, обов'язково для переривань на ESP8266).

4. MQTT-топіки (підсумково)

ESP → Delphi (публікує, retained): home/boiler/status (JSON), home/boiler/temp, home/boiler/temp_return, home/boiler/flame, home/boiler/pump, home/boiler/curve_mode, home/boiler/online

Delphi → ESP (команди, підписка): home/boiler/set/enable, home/boiler/set/temp, home/boiler/set/room_temp, home/boiler/pump/set, home/boiler/set/curve_mode

Неактивний

#2 Вчора 23:01:28

jokeR
Учасник
Зареєстрований: 2024-12-12
Повідомлень: 225

Re: котел FerroliBlueSens +CloudMQTT+Мобільний додаток Delphi 13 FMX

Нічого не зрозуміло але дуже цікаво (ц)
Що це взагалі було? Якийсь потік сознанія. Це ви зробили, чи хочете зробити, чи десь купили, чи хочете продати..?
Взагалі крутити котлом через opentherm цікаво, але особливого смислу я не бачу. Ну, то таке. Існують сценарії де воно непогано. Заміський маєток, куди ви навідуєтесь раз на тиждень wink
Незрозуміло, навіщо чіпати насос - котел і сам непогано ним управляє.
Температура 29С - для сауни малувато, для житла забагато.
І, того, не одному екрані написи і на російській і на український.. WTF?

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму