Уже давно было желание
добавить котел Bosh Gaz 6000W (WBN6000-24H) в систему умного дома, но
никак не доходили руки, но в связи с обновление контроллера WirenBoard с 6 на 8
версию был сразу закуплен модуль расширения: OpenTherm, WBE2-I-OPENTHERM.
После месячного ожидания контроллер наконец то пришел, все модули расширения уже были установлены, спасибо сотрудникам WirenBoard. Однако если вы покупаете модуль отдельно, то на официальном сайте WirenBoard есть подробная инструкция как интегрировать модуль в контроллер. После переноса и настройки SprutHub (инструкция от Raspberry Pi отлично подходит и для переноса между контроллерами WirenBoard)
Пришло время заняться интеграцией котла в систему. И тут началось...
Прописать модуль расширения в WirenBoard по инструкции в документации не составило труда. Однако позже выяснилось, что драйвер, который предустановлен не последний версии. Для того чтобы скачать последнюю нужно прейти на официальный сайт производителя и в разделе документы скачать актуальный шаблон. Далее его необходимо через FTP положить в нужную папку /etc/wb-mqtt-serial.conf.d/templates и перезапустить сервис:
Ура теперь у нас появился нужный драйвер выбираем его, также я включил опрос всех параметров, чтобы увидеть, что вообще я могу получать от котла. Не трогал только секцию Команды Opentherm
Тут меня ждало первое разочарование, поскольку, как выяснилось производители котлов соблюдают протокол OpenTherm очень условно, то у меня отсутствуют множество очень полезных параметров, таких как давление, текущая температура ГВС и отопления. Ну чтож будем работать с тем что есть.
Также хочется отметить поскольку котел по протоколу OpenTherm работает как с простым термостатом и все команды котлом воспринимаются как "рекомендации", то получается, что все логика работы котла остается в нем и через этот протокол нельзя отключить котел или отдельные контура (не считая выбора режима работы зима лето).
Попробовал поиграться с разными режимами (по датчику уличной температуры и по датчику комнатной) вроде как эти режимы работают, но я принял решение что всю логику работы буду прописывать в SprutHub поэтому был выбран режим работы по заданной уставе.
Следующая задача нужно прокинуть это устройство в SprutHub. Официального шаблона нет, однако нашелся пример в Telegram канале спасибо Сергею Лазутову он был отправной точкой. Но этот шаблон был настроен под режим работы по комнатной температуре, поэтому нужно писать новый шаблон.
В качестве основного сервиса был выбран не термостат а HeaterCooler исключительно из-за меньшего количества параметров и возможностью указывать в текущем состояние "простой котла".
Первая проблема: поскольку нельзя управлять активностью котла, то этот атрибут должен быть только читаемым, то в этой характеристики нужно указать "write": false (пришлось искать по другим шаблонам)
Вторая проблема возникла потому что хотелось в активности видеть когда действительно работает котел а это можно понять по двум параметрам «Состояние горелки» и «Состояние контура отопления и ГВС» соответственно, после продолжительного поиска я так и не нашел возможности объединить через логическое И два топика (если кому-нибудь понадобиться то если в link прописать несколько топиков то они буду работать через логичное ИЛИ)
Уже почти отчаявшись пришло осознание что в статусе котла мы получаем 16 битов основных характеристик (можно посмотреть в документации на финальном сайте производителя модуля) и если получать его в топике, то можно с помощью inFunc через JavaScript распарсить это значение и получить нужные биты.
В ходе экспериментов выяснилось что встроенный в SprutHub движок JavaScript не поддерживает некоторые js функции я с толкнулся с тем что конкретно функция padStart() не работает. В итоге получилась вот такое:
{ "write": false, "type": "Active", "link": [ { "type": "Integer", "topicSearch": "/devices/(.*)/controls/Boiler Status", "topicGet": "/devices/(1)/controls/Boiler Status", "inFunc": "((('0000000000000000'+ Number(value).toString(2)).slice(-16)[14] === '1') && (('0000000000000000'+ Number(value).toString(2)).slice(-16)[12] === '1'))?1:0" } ] },
Теперь необходимо в том же духе сделать параметр CurrentHeaterCoolerState тут также нужно из нескольких параметров составить один.
Нас интересуют три состояния:
0 - Неактивен
Логика состоит из трех параметров
1 - Состояние горелки
Получилась такая матрица:
111 - Нагревает, 100 - Неактивен, 011 - Простаивает, 100 - Неактивен
Получилось монструозно но работает (можно попробовать соединять биты в строку а далее через map будет аккуратнее) код ниже
"type": "CurrentHeaterCoolerState", "link": { "type": "Integer", "topicGet": "/devices/(1)/controls/Boiler Status", "inFunc": "((('0000000000000000'+ Number(value).toString(2)).slice(-16)[14] === '1')
&& (('0000000000000000'+ Number(value).toString(2)).slice(-16)[12] === '1')
&& (('0000000000000000'+ Number(value).toString(2)).slice(-16)[7] === '1'))?2:
(((('0000000000000000'+ Number(value).toString(2)).slice(-16)[14] === '1')
&& (('0000000000000000'+ Number(value).toString(2)).slice(-16)[12] === '0')
&& (('0000000000000000'+ Number(value).toString(2)).slice(-16)[7] === '1')))?1:
(((('0000000000000000'+ Number(value).toString(2)).slice(-16)[14] === '0')
&& (('0000000000000000'+ Number(value).toString(2)).slice(-16)[12] === '0')
&& (('0000000000000000'+ Number(value).toString(2)).slice(-16)[7] === '1')))?1:(((('0000000000000000'+ Number(value).toString(2)).slice(-16)[14] === '0')
&& (('0000000000000000'+ Number(value).toString(2)).slice(-16)[12] === '1') && (('0000000000000000'+ Number(value).toString(2)).slice(-16)[7] === '1')))?1:0" } }
С остальными характеристиками не было проблем. Уставу отправляем в TargetTemperature (хоть ее и нет в сервисе но все работает). Так как котел не выдает отдельно температуру ГВС и отопления пришлось в CurrentTemperature установить температуру теплоносителя. Поэтому она общая и для ГВС и для отопления.Другие характеристики занес в раздел options чтобы были но не мешались. Также туда занес аварии котла через map расписал те которые мне известны (опытным путем) это 10 нет газа и 13 не подключен датчик температуры бака косвенного нагрева если будут другие то дополню
В итоге получился вот такой шаблон:
spruthub-templates/MQTT/WBE2-I-OPENTHERM_v5.json at main · darkeum/spruthub-templates · GitHubContribute to darkeum/spruthub-templates development by creating an account on GitHub.https://github.com/darkeum/spruthub-templates/blob/main/MQTT/WBE2-I-OPENTHERM_v5.json
Есть котел «Navien ncb700» (он opentherm). И подключенный к нему проект open source на esp32, со своей «web мордой» и mqtt. Но проблема именно в шаблоне и интерфейсе ны SprutHub.
Тут уже есть нароботки.
Можно картинку того, как это выглядит в вебе СХ?