Skip to content

Instantly share code, notes, and snippets.

@stalniy
Last active March 28, 2024 09:10
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save stalniy/5ec118d50f7b8c0a87514e9085418b64 to your computer and use it in GitHub Desktop.
Save stalniy/5ec118d50f7b8c0a87514e9085418b64 to your computer and use it in GitHub Desktop.
Ebusd Vaillant Eloblock

Прошивка Wemos D1 mini для ebusd адаптера

Зазначені нижче кроки будуть актуальні для linux (ubuntu) та macos, вінда на "відпочинку" не мав змоги перевірити це там. Для прошивки будемо використовувати esptool.py

Вимоги: ubuntu : встановлений пайтон 3.8.10, або вище (має бути доступний за замовчанням, перевіряємо: python3 -V) macos : встановлений brew, за допомогою якого доставимо все необхідне

Установка esptool: MacOS:

  1. Ставимо brew (може зайняти деякий час, качає багато і довго)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  1. (цей крок може бути не обов'язковим, немає змоги перевірити)
brew install python3
  1. brew install esptool

Ubuntu:

  1. python3 -m venv ~/venv_esptool
  2. source ~/venv_esptool/bin/activate
  3. pip install -U pip setuptools wheel esptool

Прошивка Wemos D1 mini: (актуально для обох ОС, дрібні деталі можуть відрізнятися в залежності від багатьох ввідних, тому тут наводжу "універсальний рецепт")

  1. Від'єднуємо Wemos D1 mini від плати ebusd адаптера
  2. Підключаємо wemos usb кабелем до компухтєра, запалюється синій діод (не всякий micro-usb кабель може підійти, попереджаю одразу, бо деякі розраховані суто на зарядку і не мають живої пари контактів на передачу даних, у мене з 3ї спроби знайшовся нормальний кабель, "не нормальні" кабелі просто не показують wemos в списку девайсів)
  3. Шукаємо wemos в списку девайсів: 3.1.
    • ls -la /dev/tty*
    • або ls -la /dev/serial/by-id 3.2. В консолі має бути щось типу
    • /dev/tty.usbserial-025NC761
    • або usb-Serial_Converter_025NC761-if00-port0 -> ../../ttyUSB1 (прямий шлях відповідно буде /dev/ttyUSB1, він нам і потрібен) 3.3. Можете від'єднати-приєднати wemos, і переглянути список ще раз, щоб засвідчитися, що знайшли саме wemos
  4. Скачуємо прошивку (https://github.com/john30/ebusd-esp/blob/master/dist/ebus-v3_d1mini.bin) в хоум директорію:
    ~/ebus-v3_d1mini.bin (не дивлячись на те, що наш wemos виглядає як d1 mini pro, виглядає так що пам'яті у нього рівно в 4 рази менше, відповідно прошивку беремо для звичайної, "не про", версії)
  5. Чистимо wemos (де значенням для --port відповідно буде шлях знайдений вище)
esptool.py --port /dev/tty.usbserial-025NC761 erase_flash
  1. Зашиваємо скачану прошивку
esptool.py --port /dev/tty.usbserial-025NC761 --baud 921600 write_flash -fm dio 0x00000 ~/ebus-v3_d1mini.bin
  1. Жодних помилок не має бути

Конфігурація Wemos D1 mini:

  1. Не від'єднуючи wemos від usb компухтєра, його можна одразу і сконфігурувати через веб, аби не морочитися з консолью (якщо комп має wifi, якщо ж не має - можна використати телефон, якщо ж телефон кнопковий - хз нащо вам ebusd, киньте ту справу)
  2. Підключаємося до wifi споту "EBUS", заходимо в браузері по адресі http://192.168.4.1
  3. Міняємо поля: 1 - назва wifi споту вашого роутера, 2 - пароль до wifi споту, 5 - тип девайсу "Adapter 3.0 RX+TX =GPIO3+1" (скріншот додаю), решту полів можна залишити як є (чому тип девайсу саме такий - не питайте, я хз)
  4. Тиснемо кнопку Save & Reboot, wemos перезапуститься і під'єднається до вказаної wifi мережі
  5. Зайти в налаштування dhcp (сервера) роутера, знайти там IP адресу wemos та зробити її статичною, перевірити що веб-інтерфейс доступний за тією адресою відкривши його в браузері

Далі можна приєднувати Wemos D1 mini назад до ebusd адаптера (wemos пін 5v йде на позначку "+" на платі, якщо ви раптом забули зафоткати, коли знімали)

Основна проблема на яку я натрапив після: wemos не стартує від живлення з ebusd плати (не запалюється синій діод), причому рандомним чином; спочатку мені здалося що то через приєднані ebus дроти, але згодом зрозумів шо проблема не в тому. Живлення відповідно давав лише на ebusd плату, різне, від 5 до 12в, якоїсь залежності не знайшов. При підключенні ж по USB-B (оте здоровезне одоробло) напряму до сервера, зовнішнє живлення не потрібне, і сама ebusd плата працює (з від'єднаним wemos відповідно)

Налаштування Ebusd конфігурації для Vaillant Eloblock

Перш за все треба підключити ebusd-adapter в котел до Ebus шини. Потім запустити ebusd з опцією autoscan (docker compose):

ebusd:
  image: john30/ebusd
  container_name: esbud
  restart: unless-stopped
  environment:
    - "EBUSD_DEVICE=tcp:192.168.0.2:9999" # change IP address to your ebusd adapter
    - EBUSD_MQTTPORT=1883
    - EBUSD_MQTTHOST=127.0.0.1
    - EBUSD_MQTTUSER=***
    - EBUSD_MQTTPASS=***
    - EBUSD_MQTTINT=/etc/ebusd/mqtt-hassio.cfg 
    - EBUSD_CONFIGPATH=/etc/ebusd-config
    # - EBUSD_LOGLEVEL=debug
    - EBUSD_SCANCONFIG=1 # auto scanning
    - EBUSD_LATENCY=60
    - EBUSD_ACCESSLEVEL=* # important in order to use SetMode or SetModeOverride
  volumes:
  - /home/homeman/smarthome/ebusd/ebusd-configuration/ebusd-2.1.x/en:/etc/ebusd-config # mount configuration
  network_mode: host # optional, just for easier debugging

запускаємо docker compose і дивимось як визначився котел, це можна перевірити за допомогою ebusctl (треба почекати деякий час поки сканування закінчиться ebusctl scan result):

ebusctl scan full
ebusctl info

Нас цікавить декілька рядків внизу результата, в мене було ось це:

address 03: master #11
address 08: slave #11, scanned "MF=Vaillant;ID=BAI00;SW=0109;HW=7503", loaded "vaillant/bai.308523.inc", "vaillant/08.bai.csv"
address 31: master #8, ebusd
address 36: slave #8, ebusd

Це значить, що ebusd не має конфігів під підключений котел і використав generic конфігурацію, яка теоретично щось таки буде віддавати (але це неточно).

Оскільки конфігурація generic, то створюємо окремий файл під свій котел і називаємо його bai.$PRODUCT_ID.inc, кладемо в одну папку з vaillant/bai.308523.inc, $PRODUCT_ID беремо з команди:

# scan.08 замінити на власне значення якщо треба, яке можна знайти в `ebusctl find` внизу
ebusctl find -d -v -c scan.08 id

На виході отримав я:

scan.08 id = prefix=**;year=**;week=**;product=0010023657;supplier=**;counter=***;suffix=N7

$PRODUCT_ID = значенню в product, тобто 0010023657. Потім змінюємо vaillant/08.bai.csv ось так:

 [PROD='0010004276';'0010004277';'0010004279';'0010004280';'0010004281';'0010004282';'0010004283';'0010004285';'0010004286';'0010004288';'0010004289';'0010004290';'0010004291';'0010004292';'0010004336';'0010004337';'0010004338';'0010004339';'0010004340';'0010005466';'0010005467';'0010005468';'0010005469';'0010010392';'0010010393';'0010010394';'0010010400';'0020051714';'0020051715';'0020051716';'0020051717';'174']!load,bai.308523.inc,,,
 [PROD='0010021961';'0010021962';'0010021963';'0010021964';'0010021965';'0010021966';'0010021967']!load,bai.0010021961.inc,,,
 [PROD='0010008045';'0010008863';'0010023648']!load,bai.0010008045.inc,,,
+[PROD='0010023657']!load,bai.0010023657.inc,,,
 #fallbacks:,,,,
 [HW=6701]!load,bai.0010003886.inc,,,
 [HW=0902]!load,bai.0010004121.inc,,,

Не забудьте змінити PROD і назву файла на власне значення ;) Далі цей файлик відсортується в дереві серед інших і за основу беремо перший файл над нашим (скоріше всього product id +- однакові в них, а відповідно і функції однакові).

--bai.0010021961.inc
--bai.0010023657.inc # <--- мій файл, беремо той що вище ^
--bai.0020066007.inc

В моєму випадку це був файл bai.0010021961.inc, копіюємо його вміст у свій пустий файл. Додаємо строку:

wi,bai,SetModeOverride,Operation Mode,,08,"B510","00",hcmode,,UCH,,,,flowtempdesired,,D1C,,,,hwctempdesired,,D1C,,,,hwcflowtempdesired,,UCH,,,,setmode1,,UCH,,,,disablehc,,BI0,,,,disablehwctapping,,BI1,,,,disablehwcload,,BI2,,,,setmode2,,UCH,,,,remoteControlHcPump,,BI0,,,,releaseBackup,,BI1,,,,releaseCooling,,BI2

Я додав як перше значення в Expertenebene секцію (для експертів). Перезапускаємо ebusd і тепер він має використати наш новостворений файл:

ebusctl scan full
ebusctl info

В результаті:

address 03: master #11
address 08: slave #11, scanned "MF=Vaillant;ID=BAI00;SW=0109;HW=7503", loaded "vaillant/bai.0010023657.inc" ([PROD='0010023657']), "vaillant/08.bai.csv"
address 31: master #8, ebusd
address 36: slave #8, ebusd

"Всі" можливі значення, що можна читати і писати можна подивитись за допомогою ebusctl find. Він не буде показувати значення до першого read, тому не лякаємся. Наприклад:

$ ebusctl read -f WaterPressure  
1.771;ok

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

Зміна значення температури

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

Значення для цієї команди складається з декількох параметрів, які звісно ніде ніким не описані (я не знайшов точних пояснень):

hcmode="0" # якщо відправити 1, то клапан переключається на ГВС
flowtempdesired="65" # температура опалення
hwctempdesired="45" # температура ГВС
hwcflowtempdesired="-"
disablehc="0" # вимкнути опалення
disablehwcload="0" # вимкнути ГВС

ebusctl w -c bai SetModeOverride "$hcmode;$flowtempdesired;$hwctempdesired;$hwcflowtempdesired;-;$disablehc;0;$disablehwcload;-;0;0;0"

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

disablehc і disablehwcload в мене працює, але якось воно неоднозначно, можна запустити команду, котел покаже що хоче ввімкнути опалення, але клапап поставлений на ГВС і вогник не з'являється, тому я вирішив ці параметри не встановлювати, а використати відповідні writable поля:

  • HeatingSwitch - вмикання/вимикання опалення
    ebusctl write -c bai HeatingSwitch on # or off
    
  • HwcSwitch - вмикання/вимикання ГВС
    ebusctl write -c bai HwcSwitch on # or off
    

В такому випадку клапан трохи подумавши, приймає правильне положення. Із плюсів, це те що ці параметри синхронізуються з котлом і не треба їх відправляти кожні Х секунд по Ebus

На прикладі параметра PartloadHwcKW для свого котла

Робимо це так:

  1. без всяких змін читаємо стан всіх реєстрів на котлі використавши цей скрипт - https://github.com/stalniy/ebusd/blob/feat/retry_for_read_all/contrib/scripts/readallvaillantregisters.sh і записуємо результат у файл
  2. Чистимо від помилок (всі строки що починаються з ERR:)
  3. Міняємо на котлі параметр який нас цікавить
  4. Запускаємо знову скрипт з пункту №1 і пишемо результат у файл
  5. робимо diff -u цих 2 файлів і дивимось які параметри змінились
  6. розбираємось з результатом (було 0102, стало 010а, 02 - це HEX 2 i 0a - це HEX 10). Я змінив обмеження з 2кВт на 10кВт. Значить це той параметр який мене цікавить

Зміняться декілька різних параметрів, наприклад тиск, або температура бойлера/теплоносія, тому додатково до цього порівняння треба ще мати список відомих параметрів, щоб відразу їх відсіяти. Їх можна знайти через ebusctl grab result all і брати лише параметри в яких вкінці є name англійською

потім беремо останні 4 цифри коду, в моєму випадку А900 і вставляємо в конфіг файлі

@stalniy
Copy link
Author

stalniy commented Mar 28, 2024

Малюнки до CSV конфігурації:

photo_2024-03-28_11-02-58
photo_2024-03-28_11-07-18

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment