Термостат OpenTherm на ESP8266 для Viessmann VITOPEND 100-W

golosun
Offline
Зарегистрирован: 31.10.2016

Есть тестовый код 

#include <Arduino.h>

#include <OpenTherm.h>

const int inPin = 4;  //for Arduino, 4 for ESP8266 (D2), 21 for ESP32
const int outPin = 5; //for Arduino, 5 for ESP8266 (D1), 22 for ESP32
OpenTherm ot(inPin, outPin);

void ICACHE_RAM_ATTR handleInterrupt() {
    ot.handleInterrupt();
}

void setup() {
  Serial.begin(115200);
  
   ot.begin(handleInterrupt);
}

void loop() {
  
  unsigned int data;
  unsigned long request;
  unsigned long response;

  //Set/Get Boiler Status
    bool enableCentralHeating = true;
    bool enableHotWater = true;
    bool enableCooling = false;
  
  // Set-Get Boiler Status
    response = ot.setBoilerStatus(enableCentralHeating, enableHotWater, enableCooling);
    OpenThermResponseStatus responseStatus = ot.getLastResponseStatus();
    if (responseStatus == OpenThermResponseStatus::SUCCESS) {
        Serial.println("Central Heating: " + String(ot.isCentralHeatingActive(response) ? "on" : "off"));
        Serial.println("Hot Water: " + String(ot.isHotWaterActive(response) ? "on" : "off"));
        Serial.println("Flame: " + String(ot.isFlameOn(response) ? "on" : "off"));
    }
    if (responseStatus == OpenThermResponseStatus::NONE) {
        Serial.println("Error: OpenTherm is not initialized");
    }
    else if (responseStatus == OpenThermResponseStatus::INVALID) {
        Serial.println("Error: Invalid response " + String(response, HEX));
    }
    else if (responseStatus == OpenThermResponseStatus::TIMEOUT) {
        Serial.println("Error: Response timeout");
    }

  Serial.println("");
  Serial.println("");
  
  MembIDcode();
  
  Serial.println("");
  Serial.println("");


  byte Set_Temp_obr = 80;

  // Set Boiler Temp
  request = ot.buildSetBoilerTemperatureRequest((float)Set_Temp_obr);
  response = ot.sendRequest(request);
  responseStatus = ot.getLastResponseStatus();
  if (responseStatus == OpenThermResponseStatus::SUCCESS) {
    Serial.println("Set Boiler Temp - OK = " + String(Set_Temp_obr));
  }
  else {
    Serial.print("Set Boiler Temp Error - ");
    Serial.println("Response status: " + String(ot.statusToString(ot.getLastResponseStatus())) );
    Serial.printf("Response code: 0x%08X\r\n", response);
  }
  
  Serial.println("");

  data = ot.temperatureToData(Set_Temp_obr);
  request = ot.buildRequest(OpenThermRequestType::WRITE, OpenThermMessageID::TSet, data);
  response = ot.sendRequest(request);
  responseStatus = ot.getLastResponseStatus();
  if (responseStatus == OpenThermResponseStatus::SUCCESS) {
    Serial.println("New Set Boiler Temp - OK");
  }
  else {
    Serial.print("New Set Boiler Temp Error - ");
    Serial.println("Response status: " + String(ot.statusToString(ot.getLastResponseStatus())) );
    Serial.printf("Response: 0x%08X\r\n", response);
    }
    
  Serial.println("");

    // Get Boiler Temperature
  //response = ot.sendRequest(ot.buildGetBoilerTemperatureRequest());
  request = ot.buildRequest(OpenThermRequestType::READ, OpenThermMessageID::Tboiler, 0);
  response = ot.sendRequest(request);
  responseStatus = ot.getLastResponseStatus();
  if (responseStatus == OpenThermResponseStatus::SUCCESS) {
    Serial.println("CH temperature is "); // + String(ot.getTemperature(response),1) + " C ");
  }
  else {
    Serial.print("Get Boiler Temperature Error - ");
    Serial.println("Response status: " + String(ot.statusToString(ot.getLastResponseStatus())) );
    Serial.printf("Response: 0x%08X\r\n", response);
  }
  
  Serial.println("");
  
  response = ot.sendRequest(ot.buildRequest(OpenThermRequestType::READ, OpenThermMessageID::Year, 0));
  responseStatus = ot.getLastResponseStatus();
  if (responseStatus == OpenThermResponseStatus::SUCCESS) {
    Serial.println("Boiler Year = " + String(((response & 0xFF) << 8) + ((response >> 8) & 0xFF)));
  }
  else {
    Serial.print("Get Boiler Year Error - ");
    Serial.println("Response status: " + String(ot.statusToString(ot.getLastResponseStatus())) );
    Serial.printf("Response: 0x%08X\r\n", response);
  }

  Serial.println("");
  
  request = ot.buildRequest(OpenThermRequestType::READ, OpenThermMessageID::TdhwSet, 0x0000);
  response = ot.sendRequest(request);
  responseStatus = ot.getLastResponseStatus();
  if (responseStatus == OpenThermResponseStatus::SUCCESS) {
    Serial.println("Get DHW setpoint (°C) - OK = " + String((response >> 8) & 0xFF) + "." + String(response & 0xFF));
   }
   else {
    Serial.print("Get DHW setpoint Error - ");
    Serial.println("Response status: " + String(ot.statusToString(ot.getLastResponseStatus())) );
    Serial.printf("Response: 0x%08X\r\n", response);
  }
  Serial.println("");

  request = ot.buildRequest(OpenThermRequestType::WRITE, OpenThermMessageID::TdhwSet, response);
  response = ot.sendRequest(request);
  responseStatus = ot.getLastResponseStatus();
  if (responseStatus == OpenThermResponseStatus::SUCCESS) {
    Serial.println("Set DHW setpoint (°C) " + String((response >> 8) & 0xFF) + "." + String(response & 0xFF));
   }
   else {
    Serial.print("Set DHW setpoint Error - ");
    Serial.println("Response status: " + String(ot.statusToString(ot.getLastResponseStatus())) );
    Serial.printf("Response: 0x%08X\r\n", response);
  }

  
  Serial.println("");

  Serial.println("ChipID=" + String(ESP.getChipId()));

  Serial.println("");
  Serial.println("");
  Serial.println("");
  Serial.println("");
  delay(1000);

}

void MembIDcode() {
  
  unsigned int data;
  unsigned long request;
  unsigned long response;
  OpenThermResponseStatus responseStatus;
  
  // Get MemberID code
  request = ot.buildRequest(OpenThermRequestType::READ, OpenThermMessageID::SConfigSMemberIDcode, 0xFFFF);
  response = ot.sendRequest(request);
  responseStatus = ot.getLastResponseStatus();
  if (responseStatus == OpenThermResponseStatus::SUCCESS) {
    data = response & 0xFF;
    Serial.println("Get MemberID code - OK = " + String(data));
  }
  else {
    Serial.print("Error get MemberIDcode - ");
    Serial.println("Response status: " + String(ot.statusToString(ot.getLastResponseStatus())) );
    Serial.printf("Response code: 0x%08X\r\n", response);
  } 


  // Set MemberID code
  request = ot.buildRequest(OpenThermRequestType::WRITE,OpenThermMessageID::MConfigMMemberIDcode, data);
  response = ot.sendRequest(request);
  responseStatus = ot.getLastResponseStatus();
  if (responseStatus == OpenThermResponseStatus::SUCCESS) {
    Serial.println("Set MemberID code - OK - " + String(data));
  }
  else {
    Serial.print("Error set MemberIDcode - ");
    Serial.println("Response status: " + String(ot.statusToString(ot.getLastResponseStatus())) );
    Serial.printf("Response code: 0x%08X\r\n", response);
  } 

}

и лог его работы

Central Heating: on
Hot Water: off
Flame: on
 
 
Get MemberID code - OK = 33
Error set MemberIDcode - Response status: INVALID
Response code: 0x70020021
 
 
Set Boiler Temp Error - Response status: INVALID
Response code: 0x10015000
 
New Set Boiler Temp Error - Response status: INVALID
Response: 0x10015000
 
CH temperature is 
 
Boiler Year = 2021
 
Get DHW setpoint (°C) - OK = 43.0
 
Set DHW setpoint Error - Response status: INVALID
Response: 0x70382B00
 
ChipID=15605893
 
Проблема - с котла все читается (местами кривовато, см. Boiler Year - старшие и младшие пары байтов - надо поменять местами), а вот записать в котел ничего не получается. Кто сталкивался с подобным и может/хочет/в состоянии помочь - прошу ваши идеи.
 
 
miks69
Offline
Зарегистрирован: 16.02.2020

Отлично, будем вместе искать решение вашей проблемы. Я постараюсь в ближайшее время подготовить код для более глубокой диагностики проблемы. Я так понимаю с прошивкой от tsv_33 не заработало? Решение от Tasmota с OpenTherm не пробовали собрать? Закиньте сюда в тему какие у вас есть документы или ссылки по документации на котел.

golosun
Offline
Зарегистрирован: 31.10.2016

С tsv_33 не сложилось, доказательств работоспособности не предоставляет, деньги вернуть не обещает - если не заработает.

От  Tasmota - попробую.

 

Есть:

1. Инструкция по монтажу и сервисному обслуживанию

2. Инструкция по эксплуатации

3. Технический паспорт vitopend_100_w

и все.

Проблема ещё в том, что у котла я бываю в выходные. Хотя, если будут интересные идеи - мотнусь и на неделе.

 

miks69
Offline
Зарегистрирован: 16.02.2020

Я думаю, что данная проблема связана не с работой протокола, а с сервисными настройками котла.

Вот посмотрите это видео про активацию протокола OpenTherm на таком котле - https://www.youtube.com/watch?v=OFq_HxNIVQA

Пишут что требуется изменить в режиме кодирования 1, параметр Р07 на 0.

Интересно, что в инструкции по монтажу и сервисному обслуживанию нет описания данного параметра - https://kotel-viessmann.com/uploads/images/instruction/instr_montazhVitipend100-W.pdf

golosun
Offline
Зарегистрирован: 31.10.2016

Спасибо, попробую. А по поводу P07 в инструкциях ничего нет!

 

Есть в https://viessmann.academy/faq/servisniku/vitopend/166-vitopend-100-w-tip-a1xb-kodovye-adresa-kontrollera

 

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

Отыскал у себя код, свой котёл сканировал когда то, вроде рабочий, сейчас не проверял, нужна родная библиотека.

#include <OpenTherm.h>
const int inPin = 4; //4; //D2 2
const int outPin = 5; //5; //D1 3
OpenTherm ot(inPin, outPin);

void ICACHE_RAM_ATTR handleInterrupt()  {
  ot.handleInterrupt();
}

void setup()
{
  Serial.begin(115200);
  Serial.println("Start");
  ot.begin(handleInterrupt);
}

void loop() {
  //Set/Get Boiler Status
  bool enableCentralHeating = true;
  bool enableHotWater = true;
  bool enableCooling = false;
  unsigned long response = ot.setBoilerStatus(enableCentralHeating, enableHotWater, enableCooling);
  OpenThermResponseStatus responseStatus = ot.getLastResponseStatus();
  if (responseStatus == OpenThermResponseStatus::SUCCESS) {
    Serial.println("ID-0 Central Heating: " +
                   String(ot.isCentralHeatingEnabled(response) ? "on" : "off"));
    Serial.println("ID-0 Hot Water: " +
                   String(ot.isHotWaterEnabled(response) ? "on" : "off"));
    Serial.println("ID-0 Flame: " +
                   String(ot.isFlameOn(response) ? "on" : "off"));
  }
  if (responseStatus == OpenThermResponseStatus::NONE) {
    Serial.println("Error: OpenTherm is not initialized");
  }
  else if (responseStatus == OpenThermResponseStatus::INVALID) {
    Serial.println("Error: Invalid response " + String(response, HEX));
  }
  else if (responseStatus == OpenThermResponseStatus::TIMEOUT) {
    Serial.println("Error: Response timeout");
  }
  //ID-1; (W) Set Boiler Temperature to 47 °C
  ot.setBoilerTemperature(47);
  Serial.println("ID-1 (W) Set Boiler Temperature = " + String(47.00) + " °C");
  //ID-25; (R) Get Boiler Temperature
  float temperature = ot.getBoilerTemperature();
  Serial.println("ID-25 (R) Boiler temperature = " + String(temperature) + " °C");
  //ID-56; (W) Set DHW setpoint to 41 °C
  ot.setDHWSetpoint(41);
  Serial.println("ID-56 (W) DHW setpoint = " + String(41.00) + " °C");
  //ID-56; (R) Set DHW setpoint (°C)
  unsigned long request56_ = ot.buildRequest(OpenThermRequestType::READ, OpenThermMessageID::TdhwSet, 0);
  unsigned long respons56_ = ot.sendRequest(request56_);
  uint16_t dataValue56_ = respons56_ & 0xFFFF;
  float result56_ = dataValue56_ / 256;
  Serial.println("ID-56 (R) DHW setpoint = " + String(result56_) + " °C");
  //ID-26; (R) Get DHW Temperature
  unsigned long request26 = ot.buildRequest(OpenThermRequestType::READ, OpenThermMessageID::Tdhw, 0);
  unsigned long respons26 = ot.sendRequest(request26);
  uint16_t dataValue26 = respons26 & 0xFFFF;
  float result26 = dataValue26 / 256;
  Serial.println("ID-26 (R) DHW temperature = " + String(result26) + " °C");
  //ID-2; (W)  MemberID code of the master
  unsigned int data2 = 0x0021;
  unsigned long request2 = ot.buildRequest(OpenThermRequestType::WRITE, OpenThermMessageID::MConfigMMemberIDcode, data2);
  unsigned long respons2 = ot.sendRequest(request2);
  Serial.println("ID-2 (W) Master MemberID Code (HEX) = " + String(respons2 & 0xFFFF, HEX));
  //ID-3; (R)  MemberID code of the slave
  unsigned int data3 = 0x0000;
  unsigned long request3 = ot.buildRequest(OpenThermRequestType::READ, OpenThermMessageID::SConfigSMemberIDcode, data3);
  unsigned long respons3 = ot.sendRequest(request3);
  Serial.println("ID-3 (R) MemberID code of the slave (HEX) = " + String(respons3 & 0xFFFF, HEX));
  //ID-6; (R)  Remote boiler parameter transfer-enable & read/write flags
  unsigned int data6 = 0x0000;
  unsigned long request6 = ot.buildRequest(OpenThermRequestType::READ, OpenThermMessageID::RBPflags, data6);
  unsigned long respons6 = ot.sendRequest(request6);
  Serial.println("ID-6 (R) Remote boiler parameter transfer-enable & read/write flags (HEX) = " + String(respons6 & 0xFFFF, HEX));
  //ID-10; (R) Get Number of Transparent-Slave-Parameters supported by slave
  unsigned long request10 = ot.buildRequest(OpenThermRequestType::READ, OpenThermMessageID::TSP, 0);
  unsigned long respons10 = ot.sendRequest(request10);
  uint16_t dataValue10 = respons10 & 0xFFFF;
  unsigned result10 = dataValue10 / 256;
  uint8_t dataValue10_ = respons10 & 0xFF;
  unsigned result10_ = dataValue10_;
  Serial.println("ID-10 (R) Number of Transparent-Slave-Parameters supported by slave = " + String(result10) + "." + String(result10_));
  Serial.println("ID-10 (R) Number of Transparent-Slave-Parameters supported by slave (HEX) = " + String(respons10 & 0xFFFF, HEX));
  //ID-11; (R) Get index number / Value of referred-to transparent slave parameter.
  unsigned long request11 = ot.buildRequest(OpenThermRequestType::READ, OpenThermMessageID::TSPindexTSPvalue, 0);
  unsigned long respons11 = ot.sendRequest(request11);
  uint16_t dataValue11 = respons11 & 0xFFFF;
  unsigned result11 = dataValue11 / 256;
  uint8_t dataValue11_ = respons11 & 0xFF;
  unsigned result11_ = dataValue11_;
  Serial.println("ID-11 (R) index number / Value of referred-to transparent slave parameter = " + String(result11) + "/" + String(result11_));
  Serial.println("ID-11 (R) index number / Value of referred-to transparent slave parameter (HEX) = " + String(respons11 & 0xFFFF, HEX));
  //ID-27; (R) Get Outside Temperature
  unsigned long request27 = ot.buildRequest(OpenThermRequestType::READ, OpenThermMessageID::Toutside, 0);
  unsigned long respons27 = ot.sendRequest(request27);
  uint16_t dataValue27 = respons27 & 0xFFFF;
  if (dataValue27 > 32768) {
    //negative
    float result27 = -(65536 - dataValue27) / 256;
  } else {
    //positive
    float result27 = dataValue27 / 256;
    Serial.println("ID-27 (R) Outside temperature = " + String(result27) + " °C");
  }
  //ID-48; (R) DHW setpoint upper & lower bounds for adjustment  (°C)
  unsigned long request48 = ot.buildRequest(OpenThermRequestType::READ, OpenThermMessageID::TdhwSetUBTdhwSetLB, 0);
  unsigned long respons48 = ot.sendRequest(request48);
  uint16_t dataValue48 = respons48 & 0xFFFF;
  unsigned result48 = dataValue48 / 256;
  uint8_t dataValue48_ = respons48 & 0xFF;
  unsigned result48_ = dataValue48_;
  Serial.println("ID-48 (R) DHW setpoint upper / lower bounds for adjustment (°C) = " + String(result48) + "/" + String(result48_));
  //ID-57; (R)(W) max CH water setpoint
  unsigned long request57 = ot.buildRequest(OpenThermRequestType::READ, OpenThermMessageID::MaxTSet, 0);
  unsigned long respons57 = ot.sendRequest(request57);
  uint16_t dataValue57 = respons57 & 0xFFFF;
  float result57 = dataValue57 / 256;
  Serial.println("ID-57 (R)(W) max CH water setpoint = " + String(result57) + " °C");
  //ID-126; (W)  Master product version number and type
  unsigned int data126 = 0x0131;
  unsigned long request126 = ot.buildRequest(OpenThermRequestType::WRITE, OpenThermMessageID::MasterVersion, data126);
  unsigned long respons126 = ot.sendRequest(request126);
  uint16_t dataValue126 = respons126 & 0xFFFF;
  unsigned result126 = dataValue126 / 256;
  uint8_t dataValue126_ = respons126 & 0xFF;
  unsigned result126_ = dataValue126_;
  Serial.println("ID-126 (W) Master product version number and type = " + String(result126) + "." + String(result126_));
  //ID-127; (R) Slave product type and version number
  unsigned long request127 = ot.buildRequest(OpenThermRequestType::READ, OpenThermMessageID::SlaveVersion, 0);
  unsigned long respons127 = ot.sendRequest(request127);
  uint16_t dataValue127 = respons127 & 0xFFFF;
  unsigned result127 = dataValue127 / 256;
  uint8_t dataValue127_ = respons127 & 0xFF;
  unsigned result127_ = dataValue127_;
  Serial.println("ID-127 (R) Slave product type and version number = " + String(result127) + "." + String(result127_));

  Serial.println();
  delay(1000);
}

 

b707
Offline
Зарегистрирован: 26.05.2017

мужики, а нафига отдельная тему?

miks69
Offline
Зарегистрирован: 16.02.2020

b707 пишет:

мужики, а нафига отдельная тему?

В старой теме обсуждается замечательная прошивка от tsv_33, а в этой проблема с конкретной моделью котла

miks69
Offline
Зарегистрирован: 16.02.2020

Два дня ушло на то, чтобы разобраться с Tasmota. В итоге все-таки собрал прошивку с поддержкой OpenTherm. Могу выложить если кому надо.

Как оказалось, интерфейса для работы с котлом в прошивке нету от слова совсем. Судя по картинкам в Инете прошивка должна выводить информацию от котла при наличии подключения. При этом вся работа с котлом (как и с другими устройствами) видимо предполагается только через MQTT. Кроме того, при отсутствии подключения котла прошивка дико тормозит видимо по причине тупого ожидания ответа от котла (таймаут по умолчанию 1 сек), что на мой взгляд совсем не есть гуд. Этот вопрос разбирался в старой теме и насколько я понимаю каждый нашел для себя вариант как от этого уйти. Свой вариант я выложил в виде примера работы с OpenTherm в асинхронном режиме - https://github.com/miksumin/OpenTherm/tree/master/examples/OpenThermMaster_Async

miks69
Offline
Зарегистрирован: 16.02.2020

Вообще, если говорить о схематичной структуре или составных частях прошивки для управления работой котла (управление отоплением), то мне она представляется следующим образом (Tasmota навеяла):

И здесь, на мой взгляд, самое трудоемкое для самостоятельного программирования это полноценный и удобный пользовательский веб-интерфейс. Все остальное достаточно просто и вполне очевидно, либо имеет уже готовые библиотеки.

У себя я еще добавил вывод информации на OLED-дисплей и управление сенсорными кнопками (встроенная возможность ESP32).

golosun
Offline
Зарегистрирован: 31.10.2016

miks69 пишет:

Я думаю, что данная проблема связана не с работой протокола, а с сервисными настройками котла.

Вот посмотрите это видео про активацию протокола OpenTherm на таком котле - https://www.youtube.com/watch?v=OFq_HxNIVQA

Пишут что требуется изменить в режиме кодирования 1, параметр Р07 на 0.

Интересно, что в инструкции по монтажу и сервисному обслуживанию нет описания данного параметра - https://kotel-viessmann.com/uploads/images/instruction/instr_montazhVitipend100-W.pdf

Спасибо, все заработало!

 

miks69
Offline
Зарегистрирован: 16.02.2020

golosun пишет:

Спасибо, все заработало!

Отлично, значит проблема решена. Теперь остается только собрать прошивку для управления котлом под свои задачи. Я как раз сейчас готовлю такой проект (см. схему выше) на основе своих наработок с открытым исходным кодом, который легко можно будет доработать под свои нужны. Как всегда больше всего времени занимает веб-интерфейс.

miks69
Offline
Зарегистрирован: 16.02.2020

miks69 пишет:

Я как раз сейчас готовлю такой проект (см. схему выше) на основе своих наработок с открытым исходным кодом, который легко можно будет доработать под свои нужны. Как всегда больше всего времени занимает веб-интерфейс.

За основу веб-интерфейса для работы с OpenTherm взят всеми любимый WiFi manager и немного доработан. Для тех, кому интересно, выкладываю превью и принимаю конструктивные замечания / предложения / идеи.

ser1980
Offline
Зарегистрирован: 31.03.2021

miks69 пишет:

miks69 пишет:

Я как раз сейчас готовлю такой проект (см. схему выше) на основе своих наработок с открытым исходным кодом, который легко можно будет доработать под свои нужны. Как всегда больше всего времени занимает веб-интерфейс.

За основу веб-интерфейса для работы с OpenTherm взят всеми любимый WiFi manager и немного доработан. Для тех, кому интересно, выкладываю превью и принимаю конструктивные замечания / предложения / идеи.

Красиво, поделитесь кодом 

miks69
Offline
Зарегистрирован: 16.02.2020

miks69 пишет:

miks69 пишет:

Я как раз сейчас готовлю такой проект (см. схему выше) на основе своих наработок с открытым исходным кодом, который легко можно будет доработать под свои нужны. Как всегда больше всего времени занимает веб-интерфейс.

За основу веб-интерфейса для работы с OpenTherm взят всеми любимый WiFi manager и немного доработан.

Выложил проект на гитхабе - https://github.com/miksumin/ESP-OT

В папке \ESP-OT-Lite находится исходный код ядра прошивки, обеспечивающий подключение к WiFi сети и взаимодействие с котлом, без веб-интерфейса. Данный код при желании может быть самостоятельно дополнен веб-интерфейсом и доработан под свои потребности. В планах переписать алгоритм взаимодействиия с котлом, сделав его более гибким и использующим все DataID, поддерживаемые конкретным котлом.

В папке \ESP-OT-Free находится собранный и готовый для работы вариант прошивки для свободного использования, обеспечивающий подключение к выбранной WiFi сети, отображение и ручное управление основными параметрами работы котла через веб-интерфейс, а также тестирование DataID, поддерживаемых котлом, с формированием веб-страницы с результатами отчета. Единственное ограничение - рестарт каждые 60 мин. Прошивка собрана для контроллера Wemos D1 mini (NodeMCU). Также может быть собрана для других контроллеров.

В папке Screenshots выложены скриншоты интерфейса полной версии, которая собирается под задачи заказчика и предоставляется в виде прошивки на коммерческой основе.

Подробности в файле README. Там же адрес почты для связи с автором.

Ваши вопросы / замечания / предложения / идеи пишите сюда, на гитхаб или на почту.

ser1980
Offline
Зарегистрирован: 31.03.2021

miks69 пишет:

miks69 пишет:

miks69 пишет:

Я как раз сейчас готовлю такой проект (см. схему выше) на основе своих наработок с открытым исходным кодом, который легко можно будет доработать под свои нужны. Как всегда больше всего времени занимает веб-интерфейс.

За основу веб-интерфейса для работы с OpenTherm взят всеми любимый WiFi manager и немного доработан.

Выложил проект на гитхабе - https://github.com/miksumin/ESP-OT

В папке \ESP-OT-Lite находится исходный код ядра прошивки, обеспечивающий подключение к WiFi сети и взаимодействие с котлом, без веб-интерфейса. Данный код при желании может быть самостоятельно дополнен веб-интерфейсом и доработан под свои потребности. В планах переписать алгоритм взаимодействиия с котлом, сделав его более гибким и использующим все DataID, поддерживаемые конкретным котлом.

В папке \ESP-OT-Free находится собранный и готовый для работы вариант прошивки для свободного использования, обеспечивающий подключение к выбранной WiFi сети, отображение и ручное управление основными параметрами работы котла через веб-интерфейс, а также тестирование DataID, поддерживаемых котлом, с формированием веб-страницы с результатами отчета. Единственное ограничение - рестарт каждые 60 мин. Прошивка собрана для контроллера Wemos D1 mini (NodeMCU). Также может быть собрана для других контроллеров.

В папке Screenshots выложены скриншоты интерфейса полной версии, которая собирается под задачи заказчика и предоставляется в виде прошивки на коммерческой основе.

Подробности в файле README. Там же адрес почты для связи с автором.

Ваши вопросы / замечания / предложения / идеи пишите сюда, на гитхаб или на почту.

Мне как раз интересен был веб интерфейс .Тогда стоило наезжать на tsv_33 ,что он не делится исходниками ,у вас теперь тоже самое )) Коммерция

miks69
Offline
Зарегистрирован: 16.02.2020

ser1980 пишет:

Мне как раз интересен был веб интерфейс .Тогда стоило наезжать на tsv_33 ,что он не делится исходниками ,у вас теперь тоже самое )) Коммерция

Исходник ядра я выложил, а HTML-код любой веб-страницы и так открыт, вы можете взять понравившийся и самостоятельно его прикрутить. Кроме того я выложил бесплатную версию, на которой можно проверить работоспособность прошивки. Если же вам нужен готовый продукт под ваши задачи, то это конечно стоит денег, т.к. на это немало сил и времени потрачено, поверьте.

ser1980
Offline
Зарегистрирован: 31.03.2021

бесплатную версию - сброс через 60 мин. Я вас понял )

miks69
Offline
Зарегистрирован: 16.02.2020

ser1980 пишет:

бесплатную версию - сброс через 60 мин. Я вас понял )

лично для вас могу сделать без сброса, если вам это поможет

ser1980
Offline
Зарегистрирован: 31.03.2021

miks69 пишет:

ser1980 пишет:

бесплатную версию - сброс через 60 мин. Я вас понял )

лично для вас могу сделать без сброса, если вам это поможет

спасибо не надо ,мне бы кусок кода веб интерфейса где ползунок ,ну или ссылку где почитать как это сделать 

miks69
Offline
Зарегистрирован: 16.02.2020

ser1980 пишет:

спасибо не надо ,мне бы кусок кода веб интерфейса где ползунок ,ну или ссылку где почитать как это сделать 

пожалуйста - http://htmlbook.ru/samhtml5/formy/polzunok

ser1980
Offline
Зарегистрирован: 31.03.2021

спасибо буду разбираться, делал только приложения для андроид типа такого

miks69
Offline
Зарегистрирован: 16.02.2020

ser1980 пишет:

спасибо буду разбираться, делал только приложения для андроид типа такого

Взаимодействие с прошивкой по какому протоколу?

ser1980
Offline
Зарегистрирован: 31.03.2021

конкретно здесь по sms sim800 и aduino  , буду делать по mqtt через sim800 и gprsб так как нет wifi. Через приложение MQTT Dash работает,  но хочу через свое, интереснее и голосом озвучивает

miks69
Offline
Зарегистрирован: 16.02.2020

ser1980 пишет:

конкретно здесь по sms sim800 и aduino  , буду делать по mqtt через sim800 и gprsб так как нет wifi. Через приложение MQTT Dash работает,  но хочу через свое, интереснее и голосом озвучивает

MQTT брокер в Инете? И зачем вам тогда веб-интерфейс?

ser1980
Offline
Зарегистрирован: 31.03.2021

miks69 пишет:

ser1980 пишет:

конкретно здесь по sms sim800 и aduino  , буду делать по mqtt через sim800 и gprsб так как нет wifi. Через приложение MQTT Dash работает,  но хочу через свое, интереснее и голосом озвучивает

MQTT брокер в Инете? И зачем вам тогда веб-интерфейс?

mqtt да в интернете, но хочу сделать на pasberi pi . веб нужен для другого ,просто не когда не делал и времени лишнего нет . 

miks69
Offline
Зарегистрирован: 16.02.2020

ser1980 пишет:

miks69 пишет:

MQTT брокер в Инете? И зачем вам тогда веб-интерфейс?

mqtt да в интернете, но хочу сделать на pasberi pi . веб нужен для другого ,просто не когда не делал и времени лишнего нет . 

Просто если ваша прошивка будет доступна по веб в Инете, тогда проще сделать взаимодействие напрямую с прошивкой через HTTP GET запросы

miks69
Offline
Зарегистрирован: 16.02.2020

miks69 пишет:

Выложил проект на гитхабе - https://github.com/miksumin/ESP-OT

В папке \ESP-OT-Lite находится исходный код ядра прошивки, обеспечивающий подключение к WiFi сети и взаимодействие с котлом, без веб-интерфейса. Данный код при желании может быть самостоятельно дополнен веб-интерфейсом и доработан под свои потребности. В планах переписать алгоритм взаимодействиия с котлом, сделав его более гибким и использующим все DataID, поддерживаемые конкретным котлом.
В папке \ESP-OT-Free находится собранный и готовый для работы вариант прошивки для свободного использования, обеспечивающий подключение к выбранной WiFi сети, отображение и ручное управление основными параметрами работы котла через веб-интерфейс, а также тестирование DataID, поддерживаемых котлом, с формированием веб-страницы с результатами отчета. Единственное ограничение - рестарт каждые 60 мин. Прошивка собрана для контроллера Wemos D1 mini (NodeMCU). Также может быть собрана для других контроллеров.

В папке Screenshots выложены скриншоты интерфейса полной версии, которая собирается под задачи заказчика и предоставляется в виде прошивки на коммерческой основе.

Подробности в файле README. Там же адрес почты для связи с автором.

Ваши вопросы / замечания / предложения / идеи пишите сюда, на гитхаб или на почту.


В папке \ESP-OT-Lite-v2 выложил код обновленной версии ядра прошивки, переписанную с целью более гибкой организации работы с конкретной моделью котла, а точнее с перечнем поддерживамых им ID.
При запуске происходит однократный опрос всех ID на предмет получения разумного ответа от котла и маркировкой ID, на которые котел не отвечает. В дальнейшей работе с котлом используются только "читаемые" ID. Таким образом код прошивки подстраивается под конкретную модель котла.
Первичный опрос занимает около 15 сек, но работа основного цикла при этом не блокируется, т.к. все запросы делаются в асинхронном режиме. Алгоритм дальнейшего опроса "читаемых" ID настраивается в коде указанием интервала опроса для каждого ID, либо указанием необходимости только однократного опроса.
Расшифровка ответов котла в приведенном коде сделана только для тех ID, которые поддерживает мой котел. Расшифровка других ID может быть добавлена самостоятельно. В частности, в процессе тестирования выяснилось, что мой котел поддерживает запрос "Fan Speed" (ID=35), которого нет в описании протокола Opentherm.
Получить полный отчет о конфигурации вашего котла, а также о поддерживаемых ID, возможно с помощью кнопки "Opentherm report" в обновленной бесплатной версии прошивки.

miks69
Offline
Зарегистрирован: 16.02.2020

miks69 пишет:

В папке \ESP-OT-Lite-v2 выложил код обновленной версии ядра прошивки, переписанную с целью более гибкой организации работы с конкретной моделью котла, а точнее с перечнем поддерживамых им ID.
При запуске происходит однократный опрос всех ID на предмет получения разумного ответа от котла и маркировкой ID, на которые котел не отвечает. В дальнейшей работе с котлом используются только "читаемые" ID. Таким образом код прошивки подстраивается под конкретную модель котла.
Первичный опрос занимает около 15 сек, но работа основного цикла при этом не блокируется, т.к. все запросы делаются в асинхронном режиме. Алгоритм дальнейшего опроса "читаемых" ID настраивается в коде указанием интервала опроса для каждого ID, либо указанием необходимости только однократного опроса.
Расшифровка ответов котла в приведенном коде сделана только для тех ID, которые поддерживает мой котел. Расшифровка других ID может быть добавлена самостоятельно. В частности, в процессе тестирования выяснилось, что мой котел поддерживает запрос "Fan Speed" (ID=35), которого нет в описании протокола Opentherm.
Получить полный отчет о конфигурации вашего котла, а также о поддерживаемых ID, возможно с помощью кнопки "Opentherm report" в обновленной бесплатной версии прошивки.

На основе своего универсального ядра, готового к работе с любым котлом без доработки кода, собрана прошивка для управления котлом как вручную так и с помощью встроенного термостата. Прошивка успешно протестирована и проходит опытную эксплуатацию на реальной системе отопления частного дома с котлом Viessmann VITOPEND 100W. Все данные работы котла и параметры термостата передаются MQTT брокеру, через который также возможно управление работой котла и термостата. Для работы термостата в прошивке используется подключение к внешнему BLE датчику Xiaomi Mijia. Параметры конфигурации прошивки вынесены в файл настроек, хранящийся в памяти прошивки, и доступный для редактирования пользователем. Дебаггинг работы прошивки возможен как по сериал порту, так и по сети. Для тех, кому интересно, выкладываю некоторые реальные скриншоты работы прошивки.

Aliskin_Papa
Offline
Зарегистрирован: 04.06.2021

Всем добра! Имею котел Viessmann Vitopend 100w, кнопочный. Эксперименты начал гдето с год назад - сначала простейшее управление розеткой с сухими контактами в МиХоум, потом GenericTermostat в HA, так плавно и дошел до ESP. Перепробовал все решения, которые есть для адаптера от Игоря Мельника - все прошивки у него на сайте (работают, но все - половинчатые решения), прошивки с ГитХаб и плавно в результате поисков пришел сюда. Попробовал прошивку Михаила. Подкупил простой и чистый дизайн интерфейса и возможность прошивки просканировать ОТ котла и вывести репорт по ОТ. В результате совместной с Михаилом работы по отладке прошивки, получился, на мой взгляд, практически идеальный продукт: 1. Видит все, что может выдавать Витопенд и управляет всем, чем позволяет протокол ОТ Витопенда 2. Использует ПИД регулятор, с адекватной логикой - греет тогда когда нужно и сколько нужно. 3. Публикует для НА все нужные топики в MQTT 4. Имеет возможность настройки через файл конфигурации, сохраняемый в контроллере 5. При перезапуске помнит ВСЕ введенные в нее настройки и уставки! 6. Сканирует эфир и пассивно использует данные с BLE Термометра Сяоми (причем хоть со стандартного, хоть с перепрошитого на кастом) 7. Может работать полностью автономно, без участия Умного дома, а может и быть интегрирована в умный дом (у меня затащена в НА).

Короче, на текущий момент, по моему субъективному мнению, наиболее завершеный и полноценный продукт, который реально работает не только с китайскими котлами (у которых в ОТ отдается ну просто все), а и с Европейскими котлами, конкретно - Viessmann Vitopend!

Ниже дам все скриншоты и интерфейса и из Home Assistant (как интегрирован котел и графики, как работает ПИД).

#opentherm #vitopend #esp32

Aliskin_Papa
Offline
Зарегистрирован: 04.06.2021

Уставка отопления у меня 24.2°С

Точность отработки PID на прошивке Михаила 0,2 градуса вверх и 0,1 градус вниз с учетом инертности системы обогрева дома площадью 180м2.

Могу управлять из HomeAssistant, но пока дальше контроля не требуется, ибо прошивка справляется сама, автономно.

Скриншоты ниже, кому интересно - спрашиваем, все что касается работы Витопенд - расскажу.

Aliskin_Papa
Offline
Зарегистрирован: 04.06.2021

Я конечно со всем уважением к хозяевам хостинга, но такую дебильно-старомодную систему присоединения картинок к сообщениям я последний раз видел лет 15 назад....

Может администрации форума помощь нужна, чтоб встать на новые рельсы? Вы только свисните - вам помогут, ибо ресурс нужный и ваша личная отсталость не должна тормозить его развитие.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Aliskin_Papa пишет:

Я конечно со всем уважением к хозяевам хостинга, но такую дебильно-старомодную систему присоединения картинок к сообщениям я последний раз видел лет 15 назад....

Не хочете - не ешьте. 

miks69
Offline
Зарегистрирован: 16.02.2020

miks69 пишет:

Выложил проект на гитхабе - https://github.com/miksumin/ESP-OT

Для тех, кому интересно протестировать прошивку на своем котле, Free-версия теперь содержит весь функционал прошивки. Для работы термостата используется датчик DS18B20. Ограничения прежние: изменения установок и режимов применяются, но не сохраняются при рестарте прошивки, который, как и прежде автоматически происходит один раз в сутки.

ser1980
Offline
Зарегистрирован: 31.03.2021

miks69 пишет:

miks69 пишет:

Выложил проект на гитхабе - https://github.com/miksumin/ESP-OT

Для тех, кому интересно протестировать прошивку на своем котле, Free-версия теперь содержит весь функционал прошивки. Для работы термостата используется датчик DS18B20. Ограничения прежние: изменения установок и режимов применяются, но не сохраняются при рестарте прошивки, который, как и прежде автоматически происходит один раз в сутки.

попробовал прошивку, в термостате температура с датчика DS18B20 не показывает, а в сенсор инфо показывает и меняется 

miks69
Offline
Зарегистрирован: 16.02.2020

ser1980 пишет:

попробовал прошивку, в термостате температура с датчика DS18B20 не показывает, а в сенсор инфо показывает и меняется 

Функционал прошивки постоянно дорабатывается, поэтому возможны некоторые нестыковки в коде. Загрузите и залейте свежую версию пробной прошивки с гитхаб. Если возникнут какие-либо проблемы или вопросы - пишите на почту.

madved
Offline
Зарегистрирован: 03.11.2013

Чего-то не компилится ни ESP-OT, ни ESP-OT-Lite-v2...  Ругается на ot.getTemperature(response)

'class OpenTherm' has no member named 'getTemperature'; did you mean 'getDHWTemperature'?

библиотека ОТ Мельника 1.1.13, компилятор 1.8.13.

wemos D1 mini

Другие проектики, попроще, например Мельника, работают норм.

miks69
Offline
Зарегистрирован: 16.02.2020

madved пишет:

Чего-то не компилится ни ESP-OT, ни ESP-OT-Lite-v2...  Ругается на ot.getTemperature(response)

'class OpenTherm' has no member named 'getTemperature'; did you mean 'getDHWTemperature'?

библиотека ОТ Мельника 1.1.13, компилятор 1.8.13.

wemos D1 mini

Другие проектики, попроще, например Мельника, работают норм.

Используйте мой вариант библиотеки (https://github.com/miksumin/OpenTherm) или замените на ot.getFloat(response)

А еще лучше используйте "другие проектики, попроще"

madved
Offline
Зарегистрирован: 03.11.2013

Да, действующая связка Bosch WBN - OT - ESP - MQTT - HomeAssistant меня устраивает, три команды и большего не надо. И еще управление котлом не зависит от работы остальных устройств. Сместить слегка график, можно, выключить - недоступно. Пришла рекомендация с "малинки" поддать тепла - да, выполним) Пожеланий нет - живем по погоде.

Насчет попроще, да, вот сделал по проекту Гувера подсветку в спальню - ВАУ! но намучачено, ужс... Работает норм, но нет, как-то очень громоздко. Переделал на ESPHome - норм.

madved
Offline
Зарегистрирован: 03.11.2013

madved пишет:

Спасибо, заработало))) FanSpeed не прошел, и ладно.

 

miks69
Offline
Зарегистрирован: 16.02.2020

madved пишет:

Спасибо, заработало))) FanSpeed не прошел, и ладно.

Поставьте бесплатную версию моей прошивки, там все покажет.

ser1980
Offline
Зарегистрирован: 31.03.2021

miks69 пишет:

ser1980 пишет:

попробовал прошивку, в термостате температура с датчика DS18B20 не показывает, а в сенсор инфо показывает и меняется 

Функционал прошивки постоянно дорабатывается, поэтому возможны некоторые нестыковки в коде. Загрузите и залейте свежую версию пробной прошивки с гитхаб. Если возникнут какие-либо проблемы или вопросы - пишите на почту.

теперь датчик видит . у меня котел 2 контурный , по воде управляется правильно по модуляции горелки, чем больше расход воды тем сильнее греет и поддерживает заданную температуру . А вот управление отоплением странное ,термостат управляет не модуляцией котла (мощностью нагрева ) , а меняет уставку нагрева (модуляция всегда 88%)  или это только у меня так . 

miks69
Offline
Зарегистрирован: 16.02.2020

ser1980 пишет:

теперь датчик видит . у меня котел 2 контурный , по воде управляется правильно по модуляции горелки, чем больше расход воды тем сильнее греет и поддерживает заданную температуру . А вот управление отоплением странное ,термостат управляет не модуляцией котла (мощностью нагрева ) , а меняет уставку нагрева (модуляция всегда 88%)  или это только у меня так . 

Уровень модуляции котла задается мозгами котла исходя из текущей темппературы теплоносителя и уставки нагрева, которую расчитывает и задет ему термостат, по другому никак.

Судя по высокой степени модуляции котлу непросто прогревать вашу систему отопления. Что за модель котла у вас? Сколько батарей отопления?

ser1980
Offline
Зарегистрирован: 31.03.2021

miks69]</p> <p>[quote=ser1980 пишет:

теперь датчик видит . у меня котел 2 контурный , по воде управляется правильно по модуляции горелки, чем больше расход воды тем сильнее греет и поддерживает заданную температуру . А вот управление отоплением странное ,термостат управляет не модуляцией котла (мощностью нагрева ) , а меняет уставку нагрева (модуляция всегда 88%)  или это только у меня так . 

Уровень модуляции котла задается мозгами котла исходя из текущей темппературы теплоносителя и уставки нагрева, которую расчитывает и задет ему термостат, по другому никак.

Судя по высокой степени модуляции котлу непросто прогревать вашу систему отопления. Что за модель котла у вас? Сколько батарей отопления?

система отопления простая всего 4 батареи по 10 сек, площадь пом. 36кв,  котел Buderus Logamax U072-24K, 24 кВт. Ставлю уставку термостата на 1гр выше чем показывает датчик ds18b20, термостат вычислил уставку нагрева отопления 45град. котел греет до 45 и выключается при модуляции 88% и какую бы термостат не вычислил  уставку нагрева  модуляция всегда 88% ,по воде такого нет.  Пробовал код другого автора ,модуляцией при отоплении  управляет.

miks69
Offline
Зарегистрирован: 16.02.2020

ser1980 пишет:

система отопления простая всего 4 батареи по 10 сек, площадь пом. 36кв,  котел Buderus Logamax U072-24K, 24 кВт. Ставлю уставку термостата на 1гр выше чем показывает датчик ds18b20, термостат вычислил уставку нагрева отопления 45град. котел греет до 45 и выключается при модуляции 88% и какую бы термостат не вычислил  уставку нагрева  модуляция всегда 88% ,по воде такого нет.  Пробовал код другого автора ,модуляцией при отоплении  управляет.

У меня у самого стоит Buderus Logamax U072K 35кВт, модуляция при нагреве плавно меняется в зависимости от требуемой мощности. Странная история...

Просто при управлении котлом по Opentherm у вас нет возможности управлять уровнем модуляции, посмотрите описание протокола.

ser1980
Offline
Зарегистрирован: 31.03.2021

может что-то с прошивкой , уровень модуляции на отопление всегда 88% и не влияет при изменении уставок ,при нагреве горячей воды все ок.

miks69
Offline
Зарегистрирован: 16.02.2020

ser1980 пишет:

может что-то с прошивкой , уровень модуляции на отопление всегда 88% и не влияет при изменении уставок ,при нагреве горячей воды все ок.

Возможно, хотя вряд ли, т.к. прошивка проверена на разных моделях котлов.

Можете прислать свои контакты мне на почту, чтобы я мог с вами свзаться для уточнения некоторых вопросов?

ser1980
Offline
Зарегистрирован: 31.03.2021

miks69 пишет:

ser1980 пишет:

может что-то с прошивкой , уровень модуляции на отопление всегда 88% и не влияет при изменении уставок ,при нагреве горячей воды все ок.

Возможно, хотя вряд ли, т.к. прошивка проверена на разных моделях котлов.

Можете прислать свои контакты мне на почту, чтобы я мог с вами свзаться для уточнения некоторых вопросов?

написал вам на почту  esp-ot

miks69
Offline
Зарегистрирован: 16.02.2020

ser1980 пишет:

Пробовал код другого автора ,модуляцией при отоплении  управляет.

Можете выложить скриншоты управления модуляцией при использовании другого кода?

ser1980
Offline
Зарегистрирован: 31.03.2021

miks69 пишет:

ser1980 пишет:

Пробовал код другого автора ,модуляцией при отоплении  управляет.

Можете выложить скриншоты управления модуляцией при использовании другого кода?

сейчас пока нет возможности 

miks69
Offline
Зарегистрирован: 16.02.2020

ser1980 пишет:

система отопления простая всего 4 батареи по 10 сек, площадь пом. 36кв,  котел Buderus Logamax U072-24K, 24 кВт. Ставлю уставку термостата на 1гр выше чем показывает датчик ds18b20, термостат вычислил уставку нагрева отопления 45град. котел греет до 45 и выключается при модуляции 88% и какую бы термостат не вычислил  уставку нагрева  модуляция всегда 88% ,по воде такого нет.  Пробовал код другого автора ,модуляцией при отоплении  управляет.

Давление воды в системе и давление газа в норме? Газ магистральный или из баллонов? С котлом нет никаких проблем?