8static const char *
const TAG =
"opentherm";
9namespace message_data {
73 bool const ch_enabled = this->
ch_enable && OPENTHERM_READ_ch_enable && OPENTHERM_READ_t_set > 0.0;
74 bool const dhw_enabled = this->
dhw_enable && OPENTHERM_READ_dhw_enable;
75 bool const cooling_enabled =
76 this->
cooling_enable && OPENTHERM_READ_cooling_enable && OPENTHERM_READ_cooling_control > 0.0;
77 bool const otc_enabled = this->
otc_active && OPENTHERM_READ_otc_active;
78 bool const ch2_enabled = this->
ch2_active && OPENTHERM_READ_ch2_active && OPENTHERM_READ_t_set_ch2 > 0.0;
79 bool const summer_mode_is_active = this->
summer_mode_active && OPENTHERM_READ_summer_mode_active;
80 bool const dhw_blocked = this->
dhw_block && OPENTHERM_READ_dhw_block;
84 data.valueHB = ch_enabled | (dhw_enabled << 1) | (cooling_enabled << 2) | (otc_enabled << 3) | (ch2_enabled << 4) |
85 (summer_mode_is_active << 5) | (dhw_blocked << 6);
95 OPENTHERM_SWITCH_MESSAGE_HANDLERS(OPENTHERM_MESSAGE_WRITE_MESSAGE, OPENTHERM_MESSAGE_WRITE_ENTITY, ,
96 OPENTHERM_MESSAGE_WRITE_POSTSCRIPT, )
97 OPENTHERM_NUMBER_MESSAGE_HANDLERS(OPENTHERM_MESSAGE_WRITE_MESSAGE, OPENTHERM_MESSAGE_WRITE_ENTITY, ,
98 OPENTHERM_MESSAGE_WRITE_POSTSCRIPT, )
99 OPENTHERM_OUTPUT_MESSAGE_HANDLERS(OPENTHERM_MESSAGE_WRITE_MESSAGE, OPENTHERM_MESSAGE_WRITE_ENTITY, ,
100 OPENTHERM_MESSAGE_WRITE_POSTSCRIPT, )
101 OPENTHERM_INPUT_SENSOR_MESSAGE_HANDLERS(OPENTHERM_MESSAGE_WRITE_MESSAGE, OPENTHERM_MESSAGE_WRITE_ENTITY, ,
102 OPENTHERM_MESSAGE_WRITE_POSTSCRIPT, )
103 OPENTHERM_SETTING_MESSAGE_HANDLERS(OPENTHERM_MESSAGE_WRITE_MESSAGE, OPENTHERM_MESSAGE_WRITE_SETTING, ,
104 OPENTHERM_MESSAGE_WRITE_POSTSCRIPT, )
110 switch (request_id) {
111 OPENTHERM_SENSOR_MESSAGE_HANDLERS(OPENTHERM_MESSAGE_READ_MESSAGE, OPENTHERM_IGNORE, , , )
115 switch (request_id) {
116 OPENTHERM_BINARY_SENSOR_MESSAGE_HANDLERS(OPENTHERM_MESSAGE_READ_MESSAGE, OPENTHERM_IGNORE, , , )
124 ESP_LOGE(TAG,
"Tried to create a request with unknown id %d. This should never happen, so please open an issue.",
132 ESP_LOGD(TAG,
"Received OpenTherm response with id %d (%s)", data.id,
133 this->opentherm_->message_id_to_str((
MessageId) data.id));
137 OPENTHERM_SENSOR_MESSAGE_HANDLERS(OPENTHERM_MESSAGE_RESPONSE_MESSAGE, OPENTHERM_MESSAGE_RESPONSE_ENTITY, ,
138 OPENTHERM_MESSAGE_RESPONSE_POSTSCRIPT, )
141 OPENTHERM_BINARY_SENSOR_MESSAGE_HANDLERS(OPENTHERM_MESSAGE_RESPONSE_MESSAGE, OPENTHERM_MESSAGE_RESPONSE_ENTITY, ,
142 OPENTHERM_MESSAGE_RESPONSE_POSTSCRIPT, )
149 ESP_LOGE(TAG,
"Failed to initialize OpenTherm protocol. See previous log messages for details.");
166 std::vector<std::pair<MessageId, uint8_t>> sorted;
167 std::copy_if(this->
configured_messages_.begin(), this->configured_messages_.end(), std::back_inserter(sorted),
168 [](
const std::pair<MessageId, uint8_t> &pair) { return pair.second < REPEATING_MESSAGE_ORDER; });
169 std::sort(sorted.begin(), sorted.end(),
170 [](
const std::pair<MessageId, uint8_t> &a,
const std::pair<MessageId, uint8_t> &b) {
171 return a.second < b.second;
175 std::transform(sorted.begin(), sorted.end(), std::back_inserter(target),
176 [](
const std::pair<MessageId, uint8_t> &pair) { return pair.first; });
183 if (pair.second == REPEATING_MESSAGE_ORDER) {
184 target.push_back(pair.first);
196 auto const cur_mode = this->
opentherm_->get_mode();
248 ESP_LOGE(TAG,
"OpenTherm is not idle at the start of the loop");
268 ESP_LOGE(TAG,
"Hub timeout triggered during send");
277 ESP_LOGW(TAG,
"Unexpected state after sending request: %s",
278 this->
opentherm_->operation_mode_to_str(this->opentherm_->get_mode()));
292 ESP_LOGE(TAG,
"Hub timeout triggered during receive");
300 }
else if (!this->
opentherm_->has_message()) {
301 ESP_LOGW(TAG,
"Unexpected state after receiving response: %s",
302 this->
opentherm_->operation_mode_to_str(this->opentherm_->get_mode()));
313 "%d ms elapsed since the start of the last convo, but 1150 ms are allowed at maximum. Look at other "
314 "components that might slow the loop down.",
321 ESP_LOGV(TAG,
"Less than 100 ms elapsed since last convo, skipping this iteration");
330 if (this->sending_initial_) {
331 this->sending_initial_ =
false;
341 ESP_LOGD(TAG,
"Sending request with id %d (%s)", request.id,
342 this->opentherm_->message_id_to_str((
MessageId) request.id));
351 if (!this->
opentherm_->get_message(response)) {
352 ESP_LOGW(TAG,
"Couldn't get the response, but flags indicated success. This is a bug.");
373 ESP_LOGW(TAG,
"Protocol error occured while receiving response: %s",
380 ESP_LOGW(TAG,
"Timeout while waiting for response from device");
385 this->
opentherm_->report_and_reset_timer_error();
392 std::vector<MessageId> initial_messages;
393 std::vector<MessageId> repeating_messages;
401 " Binary sensors: %s\n"
403 " Input sensors: %s\n"
409 LOG_PIN(
" In: ", this->
in_pin_);
411 ESP_LOGCONFIG(TAG,
" Initial requests:");
412 for (
auto type : initial_messages) {
415 ESP_LOGCONFIG(TAG,
" Repeating requests:");
416 for (
auto type : repeating_messages) {
BedjetMode mode
BedJet operating mode.
void mark_failed()
Mark this component as failed.
OPENTHERM_SENSOR_LIST(OPENTHERM_DECLARE_SENSOR,) OPENTHERM_BINARY_SENSOR_LIST(OPENTHERM_DECLARE_BINARY_SENSOR
void check_timings_(uint32_t cur_time)
uint32_t last_conversation_end_
void dump_config() override
void on_shutdown() override
void handle_timer_error_()
std::vector< MessageId > messages_
OpenthermData build_request_(MessageId request_id) const
void start_conversation_()
void add_repeating_message(MessageId message_id)
InternalGPIOPin * out_pin_
std::unordered_map< MessageId, uint8_t > configured_messages_
void process_response(OpenthermData &data)
OPENTHERM_SWITCH_LIST(OPENTHERM_DECLARE_SWITCH,) OPENTHERM_NUMBER_LIST(OPENTHERM_DECLARE_NUMBER
InternalGPIOPin * in_pin_
CallbackManager< void(OpenthermData &)> before_send_callback_
bool handle_error_(OperationMode mode)
CallbackManager< void(OpenthermData &)> before_process_response_callback_
bool spin_wait_(uint32_t timeout, F func)
std::vector< MessageId >::const_iterator message_iterator_
uint32_t last_conversation_start_
void write_initial_messages_(std::vector< MessageId > &target)
void write_repeating_messages_(std::vector< MessageId > &target)
bool should_skip_loop_(uint32_t cur_time) const
OPENTHERM_OUTPUT_LIST(OPENTHERM_DECLARE_OUTPUT,) OPENTHERM_INPUT_SENSOR_LIST(OPENTHERM_DECLARE_INPUT_SENSOR
std::unique_ptr< OpenTherm > opentherm_
void handle_timeout_error_()
void handle_protocol_error_()
void write_flag8_lb_4(const bool value, OpenthermData &data)
bool parse_flag8_lb_3(OpenthermData &data)
bool parse_flag8_lb_2(OpenthermData &data)
bool parse_flag8_lb_5(OpenthermData &data)
void write_flag8_lb_7(const bool value, OpenthermData &data)
uint16_t parse_u16(OpenthermData &data)
bool parse_flag8_hb_7(OpenthermData &data)
int8_t parse_s8_hb(OpenthermData &data)
bool parse_flag8_lb_0(OpenthermData &data)
void write_flag8_lb_5(const bool value, OpenthermData &data)
bool parse_flag8_hb_3(OpenthermData &data)
void write_flag8_hb_7(const bool value, OpenthermData &data)
bool parse_flag8_lb_6(OpenthermData &data)
bool parse_flag8_hb_5(OpenthermData &data)
void write_s8_lb(const int8_t value, OpenthermData &data)
uint8_t parse_u8_hb(OpenthermData &data)
void write_flag8_lb_2(const bool value, OpenthermData &data)
void write_flag8_hb_4(const bool value, OpenthermData &data)
void write_u16(const uint16_t value, OpenthermData &data)
void write_s8_hb(const int8_t value, OpenthermData &data)
bool parse_flag8_hb_4(OpenthermData &data)
void write_flag8_hb_5(const bool value, OpenthermData &data)
void write_flag8_lb_1(const bool value, OpenthermData &data)
void write_u8_lb(const uint8_t value, OpenthermData &data)
void write_flag8_lb_3(const bool value, OpenthermData &data)
float parse_f88(OpenthermData &data)
void write_s16(const int16_t value, OpenthermData &data)
bool parse_flag8_hb_6(OpenthermData &data)
void write_flag8_hb_2(const bool value, OpenthermData &data)
bool parse_flag8_hb_1(OpenthermData &data)
int16_t parse_s16(OpenthermData &data)
void write_flag8_hb_3(const bool value, OpenthermData &data)
bool parse_flag8_lb_4(OpenthermData &data)
uint16_t parse_u8_hb_60(OpenthermData &data)
bool parse_flag8_hb_0(OpenthermData &data)
void write_flag8_lb_0(const bool value, OpenthermData &data)
uint16_t parse_u8_lb_60(OpenthermData &data)
void write_f88(const float value, OpenthermData &data)
void write_flag8_hb_6(const bool value, OpenthermData &data)
bool parse_flag8_lb_7(OpenthermData &data)
void write_u8_hb(const uint8_t value, OpenthermData &data)
void write_flag8_hb_1(const bool value, OpenthermData &data)
void write_flag8_hb_0(const bool value, OpenthermData &data)
int8_t parse_s8_lb(OpenthermData &data)
void write_flag8_lb_6(const bool value, OpenthermData &data)
uint8_t parse_u8_lb(OpenthermData &data)
bool parse_flag8_lb_1(OpenthermData &data)
bool parse_flag8_hb_2(OpenthermData &data)
constexpr T write_bit(T value, uint8_t bit, uint8_t bit_value)
constexpr T read_bit(T value, uint8_t bit)
uint32_t IRAM_ATTR HOT millis()
ProtocolErrorType error_type
Structure to hold Opentherm data packet content.