Термостат OpenTherm на ESP8266

tsv_33
Offline
Зарегистрирован: 11.04.2019

Теперь по порядку, т.к. котлы у нас разные, но протокол ОТ един, хотя Бакси его полноценно не использует. Принты:

Текуший уровень модуляции горелки  = 0 % и ADC = 10 и всё, что к этому относится, можете смело закомментировать, это мой частный случай.

Тип и версия термостата: тип 0, версия 0
Тип и версия котла: тип 0, версия 0
Могу предположить, что а-ля термостат только мониторит шину ОТ. 

Нужно, что бы котёл выдал код с MsgID=3 (R) и этот код записать в MsgID=2(W). 

// Записать ID-2; мастер-код MemberID
    unsigned int data = 0x0004;
    unsigned long request = ot.buildRequest(OpenThermRequestType::WRITE, OpenThermMessageID::MConfigMMemberIDcode, data);
    ot.sendRequest(request);

Тут я записываю уже ранее прочитанный 0х0004 (мой Бакси выдал)

VOVA_iS
Offline
Зарегистрирован: 09.07.2019

tsv_33 пишет:

Понял, тогда и с уровнем модуляции вам разбираться надо. Мой котёл по ОТ этот ID Msg "RelModLevel" не отдаёт, потому сам вычисляю, а не читаю его из котла.

 

Отдает мой котел уровень горелки. Написал код

float getADCreal() {
  unsigned long request17 = ot.buildRequest(OpenThermRequestType::READ, OpenThermMessageID::RelModLevel, 0);
  unsigned long respons17 = ot.sendRequest(request17);
  uint16_t dataValue17 = respons17 & 0xFFFF;
  float result17 = dataValue17 / 256;
  return result17;
MQTT, Relative Modulation Level REAL, % = 6.00
 
MQTT, Relative Modulation Level REAL, % = 61.00
 
 
 

 

VOVA_iS
Offline
Зарегистрирован: 09.07.2019

tsv_33 пишет:

Теперь по порядку, т.к. котлы у нас разные, но протокол ОТ един, хотя Бакси его полноценно не использует. Принты:

Текуший уровень модуляции горелки  = 0 % и ADC = 10 и всё, что к этому относится, можете смело закомментировать, это мой частный случай.

Тип и версия термостата: тип 0, версия 0
Тип и версия котла: тип 0, версия 0
Могу предположить, что а-ля термостат только мониторит шину ОТ. 

Нужно, что бы котёл выдал код с MsgID=3 (R) и этот код записать в MsgID=2(W). 

// Записать ID-2; мастер-код MemberID
    unsigned int data = 0x0004;
    unsigned long request = ot.buildRequest(OpenThermRequestType::WRITE, OpenThermMessageID::MConfigMMemberIDcode, data);
    ot.sendRequest(request);

Тут я записываю уже ранее прочитанный 0х0004 (мой Бакси выдал)

 

А мой не хочет. Я бы с установкой температуры ГВС особо и не парисля бы. Её редко менять надо. Я бы мог с котла настроить с кнопок. Но вот не задача кнопки настройки ГВС блокируются.

VOVA_iS
Offline
Зарегистрирован: 09.07.2019

Вообщем почитал в инете. нашел вот это. Про мастер слейв.

https://forum.flprog.ru/viewtopic.php?f=71&t=4842

 

Только ни понял как дать инфу котлу что мой термостат мастер

 

Вот еще проэкт по OT. Правда это вентиляция

https://github.com/apdlv72/VitoWifi

tsv_33
Offline
Зарегистрирован: 11.04.2019

VOVA_iS пишет:

Только ни понял как дать инфу котлу что мой термостат мастер

Повторюсь, нужно, что бы котёл выдал термостату код с MsgID=3 (R) и этот код уже термостатом записать в MsgID=2(W).  В моём случае я сначала прочитал MsgID=3 (ввобще и по хорошему нужно бы вам сначала промониторить все MsgID и вычислить доступные для вашего котла и уже с ними работать в дальнейшем по необходимости), потом этот код обратно в котёл отправить, но уже в MsgID=2 (в моем последнем коде это стр. 449-451.

Если делать универсальный термостат для любых ОТ котлов то MsgID=3 и MsgID=2 должны работать в паре, для себя я такой цели не ставил.

Посмотрите, что вам выдаст MsgID=3.

tsv_33
Offline
Зарегистрирован: 11.04.2019

VOVA_iS пишет:

Вообщем почитал в инете. нашел вот это. Про мастер слейв.

https://forum.flprog.ru/viewtopic.php?f=71&t=4842

Вот еще проэкт по OT. Правда это вентиляция

https://github.com/apdlv72/VitoWifi

Та же Маня, только в другом сарафане. :-)

VOVA_iS
Offline
Зарегистрирован: 09.07.2019
unsigned int TEST() { 
  unsigned long request400 = ot.buildRequest(OpenThermRequestType::READ, OpenThermMessageID::SConfigSMemberIDcode, 0);
  unsigned long respons400 = ot.sendRequest(request400);
  uint16_t dataValue400_ = respons400 & 0xFFFF;
unsigned result400_ = dataValue400_ / 256;
  return result400_;

С этим запросом получаю 1

tsv_33
Offline
Зарегистрирован: 11.04.2019
Посмотрите содержание всего ID-3, у меня в loop сидит, ниже ID-2
 // Чтение ID-3; Slave MemberID Code 
  unsigned long request3 = ot.buildRequest(OpenThermRequestType::READ, OpenThermMessageID::SConfigSMemberIDcode, 0);
  unsigned long respons3 = ot.sendRequest(request3);
  Serial.println("ID-3 = " + String(respons3, HEX));
ID-3 = 40030904
VOVA_iS
Offline
Зарегистрирован: 09.07.2019
Выдало
ID-3 = 40030100
Блин я уже весь мозг вынес себе и вам ))))... 
tsv_33
Offline
Зарегистрирован: 11.04.2019

VOVA_iS пишет:

Выдало
ID-3 = 40030100
Блин я уже весь мозг вынес себе и вам ))))... 

Получается что 0х0000 ну и отправьте эти нули.

VOVA_iS
Offline
Зарегистрирован: 09.07.2019
Вот так сделал 
// Записать ID-2; мастер-код MemberID
    unsigned int data = 0x0000;
    unsigned long request = ot.buildRequest(OpenThermRequestType::WRITE, OpenThermMessageID::MConfigMMemberIDcode, data);
    ot.sendRequest(request);

И еще 

unsigned int data126 = 0x0000;                   // тип и версия термостата (HEX)

 

В ответ тишина....

Установленная температуры ГВС = 0.00 °C
 

 

tsv_33
Offline
Зарегистрирован: 11.04.2019

ID-126 вам зачем? Если хотите получить тип и версию котла нужно мониторить 127.

tsv_33
Offline
Зарегистрирован: 11.04.2019

Посмотрите, ещё, что в 57 лежит и нулевом, интересно глянуть. Чтобы не мудрить в HEX.

VOVA_iS
Offline
Зарегистрирован: 09.07.2019

tsv_33 пишет:

Посмотрите, ещё, что в 57 лежит и нулевом, интересно глянуть. Чтобы не мудрить в HEX.

 

Извените меня. Я вас не понял. Что и где смотреть. Туплю 

tsv_33
Offline
Зарегистрирован: 11.04.2019

И, в вашем случае, заслуживает интереса 6.

tsv_33
Offline
Зарегистрирован: 11.04.2019

Используйте мой пример с чтением ID-3 для мониторинга остальных, заслуживающих внимания ID. Посмотрите, что лежит в 0; 6; 57 ну и 127. В HEX виде.

VOVA_iS
Offline
Зарегистрирован: 09.07.2019

tsv_33 пишет:

Используйте мой пример с чтением ID-3 для мониторинга остальных, заслуживающих внимания ID. Посмотрите, что лежит в 0; 6; 57 ну и 127. В HEX виде.

 

0 ID-3 = c0000000

6  ID-3 = c0060303

57  ID-3 = c0392d00
127 ID-3 = 707f0000
 
tsv_33
Offline
Зарегистрирован: 11.04.2019

127 (такого DATA-ID нет)

57 (лежит 45 гр. -Maximum allowable CH water setpoint °C) 

6 (тут всё нормально, котёл должен дистанционно управляться)

0 (говорит, что всё clear/0)

 

tsv_33
Offline
Зарегистрирован: 11.04.2019

Вывод, копать дальше...

VOVA_iS
Offline
Зарегистрирован: 09.07.2019

Понял. Спасибо боольшое.

tsv_33
Offline
Зарегистрирован: 11.04.2019

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

VOVA_iS
Offline
Зарегистрирован: 09.07.2019

tsv_33 пишет:

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


Добрый день. Да сделал уже с самого начала. И я буду использовать ваш код. Он хороший и меня полностью устаревает.

Почитал я про представлению котлу термостата. Вроде он должен только прочитать параметр 127 (SlaveVersion)

Вобщем пока не нашел решение данной проблемы регулировки ГВС.

tsv_33
Offline
Зарегистрирован: 11.04.2019

А посмотрите ещё ID-48 и 49, что там лежит.

VOVA_iS
Offline
Зарегистрирован: 09.07.2019

tsv_33 пишет:

А посмотрите ещё ID-48 и 49, что там лежит.

48 = 40304123
49 = c0312823
 
tsv_33
Offline
Зарегистрирован: 11.04.2019

48- это верхняя и нижняя границы для регулировки ГВС 65-35°C соответственно.

49- это верхняя и нижняя границы для регулировки СО 40-35°C соответственно.

Относительно 127, а равно 126 и 2 с 3 полагаю не используются в вашим котлом.

А попробуйте поиграться 57-м, выставьте максимально допустимую уставку воды ГВС в 65°C (сейчас у вас там 45°C).

VOVA_iS
Offline
Зарегистрирован: 09.07.2019

tsv_33 пишет:

 

А попробуйте поиграться 57-м, выставьте максимально допустимую уставку воды ГВС в 65°C (сейчас у вас там 45°C).

 

57 параметр настраевается для отопления. у меня просто минимум в коде настроен 45 градусов.

float pid(float sp, float pv, float pv_last, float& ierr, float dt) {
  float Kc = 10.0; // K / %Heater
  float tauI = 50.0; // sec
  float tauD = 1.0;  // sec
  // ПИД коэффициенты
  float KP = Kc;
  float KI = Kc / tauI;
  float KD = Kc * tauD;
  // верхняя и нижняя границы уровня нагрева
  float ophi = 85;
  float oplo = 45;
  // вычислить ошибку
  float error = sp - pv;
  // calculate the integral error
  ierr = ierr + KI * error * dt;
  // вычислить производную измерения
  float dpv = (pv - pv_last) / dt;
  // рассчитать выход ПИД регулятора
  float P = KP * error;                      // пропорциональная составляющая
  float I = ierr;                            // интегральная составляющая
  float D = -KD * dpv;                       // дифференциальная составляющая
  float op = P + I + D;
  // защита от сброса
  if ((op < oplo) || (op > ophi)) {
    I = I - KI * error * dt;
    // выход регулятора, он же уставка для ID-1 (температура теплоносителя контура СО котла)
    op = max(oplo, min(ophi, op));

У меня котел минимум понимаем 30 градусов команду. максимум 85. Если как у вас в коде

float ophi = 100;
  float oplo = 0;

0 он не записывает. И если например уставка была ГВС 55 градусов. А потом резко уставка ноль, то у котла остается 55. 30 градусов не эфективно, поставил 45. 

 

tsv_33
Offline
Зарегистрирован: 11.04.2019

Из протокола ОТ: Id-1 TSet "Контрольное заданное значение колеблется от минимума 0 до максимума 100. Он представляет собой непосредственно заданное значение температуры подачи от котла. Ведомому устройству не нужно знать, как ведущий вычисляет уставку управления..."

Котёл должен работать в заданном диапазоне ограничительных уставок мин./макс. для СО и ГВС. Этот термостат использует ПИД регулятор для СО. ГВС работает дискретно, т.е. вкл/выкл., только понять нужно с каким гистерезисом. В моём котле подогрев ГВС начинается, если температура упадёт больше чем на 10°C от уставки.

Если, к примеру, у СО выставить диапазон регулировок 30-65, то это не значит что Id-1 TSet должен будет работать в этом же диапазоне, он всё равно должен работать 0-100 и без всяких поправок, чисто ПИД.

 
VOVA_iS
Offline
Зарегистрирован: 09.07.2019

Добавил "Гистерезис" для отключение отопление. 

float sp = 24.5,                                 // точка отсчета комнатной температуры
      pv = 0,                                    // текущая температура в комнате
      pv_last = 0,                               // предыдущая температура
      ierr = 0,                                  // интегральная погрешность
      dt = 0,                                    // время между измерениями
      op = 0,                                    // выход ПИД контроллера
      hys = 0.1,                                   // Гистерезис +- °C
      spdhw = VAL1;                              // точка отсчета температуры горячей воды контура ГВС



if (pv >= (sp +  hys)) {                               // индикация состояния СО.
   enableCentralHeating = false;                        
   digitalWrite(EXTERNAL_LED_3, LOW);
  } else if (pv <= (sp -  hys)) {                   
   enableCentralHeating = true;
   digitalWrite(EXTERNAL_LED_3, HIGH);  

Это отсечет скачки температуры +- от за данной. И котел не будет то включаться, то отключаться при малых изменениях температуры

tsv_33
Offline
Зарегистрирован: 11.04.2019

Возможно имеет смысл, у меня в котле дипами задаётся минимальпое время между включениям либо 10 сек. либо 3 мин., да и сам котёл на Tset не сразу реагирует, пока там ПИД вычислит уставку...

tsv_33
Offline
Зарегистрирован: 11.04.2019

Есть, ещё, задумка реализовать регулировку с помощью температурных кривых, ну и выбирать или ПИД, или кривые. Раскопал соответствующий проект, да ни как не соберусь реализовать https://mxjournal.ru/blog/1154 В коде много лишнего, заслуживает внимания лишь расчёт температуры, как в ручном режиме, так и с учётом температуры за бортом, для того же ID-1, по сути термостат становится вполне себе ничего девайсом, а нужный режим должен иметь возможность выбора/переключения.

tsv_33
Offline
Зарегистрирован: 11.04.2019

Надо ещё подумать, как сохранить изменённые уставки в памяти.

VOVA_iS
Offline
Зарегистрирован: 09.07.2019

Может MQTT.

Плате читать после перезагрузки какой режим был.

типа

1 по кривым темп.

2 по темп. помещения

3 ручной режим

tsv_33
Offline
Зарегистрирован: 11.04.2019

Вроде получилось с выбором типов регуляторов:

1. ПИД;

2. Эквитермические кривые без учёта влияния температуры в помещении;

3. Эквитермические кривые с учётом влияния температуры в помещении;

или режимы 1, 2, 3. на выбор. Во 2 и 3 режиме наличие внешнего датчика температуры обязательно.

А сохранять в память уставки и калибровачные константы удобно, после рестарта, по разным причинам, всё слетает по умолчанию. Можно, конечно, не заморачиваться, всё проверить, подогнать и прошить уже с нужными уставками, будут по умолчанию. С EEPROM, же ни когда дела не имел, да и с SPIFFS то же, только на уровне примеров.

VOVA_iS
Offline
Зарегистрирован: 09.07.2019

Может создать режим номер 4. Настроичный. Забиваешь все настройки они записываются в MQTT. А другие режимы эти параметры могут только читать.

И да у меня вопрос у вас датчик уличный в котёл заведен? У меня нет уличного термодатчика в котле.

tsv_33
Offline
Зарегистрирован: 11.04.2019

VOVA_iS пишет:

Может создать...

Идея понятна.

VOVA_iS пишет:

И да у меня вопрос у вас датчик уличный в котёл заведен?

Да, в котёл.

VOVA_iS пишет:

У меня нет уличного термодатчика в котле.

И не предусмотрен как опция?

VOVA_iS
Offline
Зарегистрирован: 09.07.2019

tsv_33 пишет:

 

И не предусмотрен как опция?

 

В инструкции про него ни чего не сказано. Может разобрать плату и посмотреть. Может пин и есть. Вот только вопрос какой датчик. Аналог или цифровой. 

Для меня проще к ESP второй датчик подключить и выкинуть его наружу.

tsv_33
Offline
Зарегистрирован: 11.04.2019

Да, по факту, в вашей модели уличный датчик и не предусмотрен.

tsv_33
Offline
Зарегистрирован: 11.04.2019

tsv_33
Offline
Зарегистрирован: 11.04.2019

Вот, что получилось, в итоге. Коды с расчётами кривых добавлю чуть позже, проверить надо в работе.

VOVA_iS
Offline
Зарегистрирован: 09.07.2019

tsv_33 пишет:

Вот, что получилось, в итоге. Коды с расчётами кривых добавлю чуть позже, проверить надо в работе.

 

Круто получилось!!! Плату сами делали для OT???

У меня колхоз тестовый на макетной плате в кембрике. а ESP пока просто весит. Хочу все таки победить регулировку ГВС.

tsv_33
Offline
Зарегистрирован: 11.04.2019

Колхоз то же был. Плату сам проектировал, но конструктивная идея автора библиотеки ОТ. Про регулировку ГВС, найдите рекомендованные к вашему котлу описания теростатов ОТ, может там какие особенноаости всплывут...  

VOVA_iS
Offline
Зарегистрирован: 09.07.2019

Вообщем вскрыл я вчера котел. Стоит плата от котла Ferroli Divatech (Котел и есть Ferroli. Только шильдик другой)   PR01335 v1.2. 

вот эти два разъема не подключены. Черный вроде сервесный для прошивки думаю. Белый может там и датчик подключается ул. температуры. Схему не нашел си я чуда.

По поводу ГВС. https://zont-online.ru/internet-magazin/termostaty/adapter-opentherm-704

Эта фигня Ferroli полностью подерживает. 

tsv_33
Offline
Зарегистрирован: 11.04.2019

Профессионалы, ремонтники газовых котлов, подтвердили, что такой возможности нет, увы без внешнего датчика.

tsv_33
Offline
Зарегистрирован: 11.04.2019

С уставками ГВС, полагаю, что нужно соблюсти ряд условий. Положение дипов на плате управления котла какое? Пробежался по описанию рекомендованного термостата «SIRIUS 1Р» есть кое какие мысли.

VOVA_iS
Offline
Зарегистрирован: 09.07.2019

Добрый вечер. Положение дипов как на фото.

 

По поводу разъема CN1. Нашел фото на мониторе платы PR08205. Там на фоте расписанно три пина из пяти. 12 вольт, 5 вольт, 2 пропуска, и земля. Блин может оставшие пины термодатчик. Тестр возьму посмотрю есть ли на них какие либо напряжения и куда идут дорожки. Если без напряга и на микруху, у меня есть термодатчик на 10 Ом. попробую подключить.

 

Посмотрел по фото (на сколько можно утверждать по фото ;))) ) проследил эти два пина уходят на микруху. Какую хз названия не видно. Вообщем выходные плату снимать буду смотреть. 

tsv_33
Offline
Зарегистрирован: 11.04.2019

Нет на этой плате внешнего термодатчика. Но есть на плате ABM01A, ставится в тот же Ferroli но DIVAteck DC. Номер термистора (10k) на схеме 138. Что касается дипов, должен котёл управляться ОТ термостатом в диапазоне 35-55 гр.

VOVA_iS
Offline
Зарегистрирован: 09.07.2019

ГВС не управляется. Только читается...

tsv_33
Offline
Зарегистрирован: 11.04.2019

Значит, что-то не учли...

tsv_33
Offline
Зарегистрирован: 11.04.2019

Решение должно быть, попробуйте подобрать период, по протоколу "Period between mid-bit transitions  :  900μs .. 1150μs  (nominal 1ms)"

tsv_33
Offline
Зарегистрирован: 11.04.2019

У себя убрал из кода все принты, ГВС то же перестала приниматься котлом, вернул всё наместо. На досуге буду искать причину...