diff --git a/components/panasonic_heatpump/binary_sensor/panasonic_heatpump_binary_sensor.cpp b/components/panasonic_heatpump/binary_sensor/panasonic_heatpump_binary_sensor.cpp index 2ef6264..7dfa8d8 100644 --- a/components/panasonic_heatpump/binary_sensor/panasonic_heatpump_binary_sensor.cpp +++ b/components/panasonic_heatpump/binary_sensor/panasonic_heatpump_binary_sensor.cpp @@ -15,6 +15,8 @@ namespace esphome void PanasonicHeatpumpBinarySensor::publish_new_state(const std::vector& data) { + if (data.empty()) return; + bool new_state; switch (this->id_) { @@ -158,6 +160,7 @@ namespace esphome } default: return; }; + this->publish_state(new_state); } } // namespace panasonic_heatpump diff --git a/components/panasonic_heatpump/number/panasonic_heatpump_number.cpp b/components/panasonic_heatpump/number/panasonic_heatpump_number.cpp index 5b112da..06d762f 100644 --- a/components/panasonic_heatpump/number/panasonic_heatpump_number.cpp +++ b/components/panasonic_heatpump/number/panasonic_heatpump_number.cpp @@ -195,6 +195,7 @@ namespace esphome this->keep_state_--; return; } + if (data.empty()) return; float new_state; switch (this->id_) @@ -399,16 +400,18 @@ namespace esphome } default: return; }; + this->publish_state(new_state); } bool PanasonicHeatpumpNumber::set_traits(const std::vector& data) { + if (data.empty()) return false; + std::string top76 = PanasonicDecode::getTextState( PanasonicDecode::WaterTempControl, PanasonicDecode::getBit7and8(data[28])); // Heating Mode std::string top81 = PanasonicDecode::getTextState( PanasonicDecode::WaterTempControl, PanasonicDecode::getBit5and6(data[28])); // Cooling Mode - switch (this->id_) { case NumberIds::CONF_SET5: diff --git a/components/panasonic_heatpump/panasonic_heatpump.cpp b/components/panasonic_heatpump/panasonic_heatpump.cpp index 484cdf0..4514969 100644 --- a/components/panasonic_heatpump/panasonic_heatpump.cpp +++ b/components/panasonic_heatpump/panasonic_heatpump.cpp @@ -60,37 +60,55 @@ namespace esphome } case LoopState::PUBLISH_SENSOR: { - this->publish_sensor(this->heatpump_message_); + for (auto *entity : this->sensors_) + { + entity->publish_new_state(this->heatpump_message_); + } this->loop_state_ = LoopState::PUBLISH_BINARY_SENSOR; break; } case LoopState::PUBLISH_BINARY_SENSOR: { - this->publish_binary_sensor(this->heatpump_message_); + for (auto *entity : this->binary_sensors_) + { + entity->publish_new_state(this->heatpump_message_); + } this->loop_state_ = LoopState::PUBLISH_TEXT_SENSOR; break; } case LoopState::PUBLISH_TEXT_SENSOR: { - this->publish_text_sensor(this->heatpump_message_); + for (auto *entity : this->text_sensors_) + { + entity->publish_new_state(this->heatpump_message_); + } this->loop_state_ = LoopState::PUBLISH_NUMBER; break; } case LoopState::PUBLISH_NUMBER: { - this->publish_number(this->heatpump_message_); + for (auto *entity : this->numbers_) + { + entity->publish_new_state(this->heatpump_message_); + } this->loop_state_ = LoopState::PUBLISH_SELECT; break; } case LoopState::PUBLISH_SELECT: { - this->publish_select(this->heatpump_message_); + for (auto *entity : this->selects_) + { + entity->publish_new_state(this->heatpump_message_); + } this->loop_state_ = LoopState::PUBLISH_SWITCH; break; } case LoopState::PUBLISH_SWITCH: { - this->publish_switch(this->heatpump_message_); + for (auto *entity : this->switches_) + { + entity->publish_new_state(this->heatpump_message_); + } this->loop_state_ = LoopState::SEND_REQUEST; break; } @@ -108,19 +126,19 @@ namespace esphome } default: { - if (this->set_traits_loop_) this->set_traits_total_++; + if (this->traits_changed_) this->traits_update_counter_++; // Perform reboot only if a traits (e.g. min/max value of a number entity) was changed the second time. // The first traits change should happen before controller is connected to home assistant, - // because the default min/max value is 0. - if (this->set_traits_total_ > 1) + // because the initial traits value is 0 or an empty vector. + if (this->traits_update_counter_ > 1) { - ESP_LOGW(TAG, "Min/max values have changed. Rebooting so Home Assistant reconfigures the number component."); + ESP_LOGW(TAG, "Limit values have changed. Rebooting so Home Assistant can reconfigures the entity limits."); delay(100); // NOLINT App.safe_reboot(); } - this->set_traits_loop_ = false; + this->traits_changed_ = false; this->loop_state_ = LoopState::READ_RESPONSE; break; } @@ -396,23 +414,9 @@ namespace esphome this->next_request_ = RequestType::COMMAND; } - void PanasonicHeatpumpComponent::publish_binary_sensor(const std::vector& data) - { - if (data.empty()) return; - for (auto *entity : this->binary_sensors_) - { - entity->publish_new_state(data); - } - } - - void PanasonicHeatpumpComponent::publish_number(const std::vector& data) - { - if (data.empty()) return; - for (auto *entity : this->numbers_) - { - entity->publish_new_state(data); - } - } + // traits can be changed anytime, but entities will only be updated in home assistant, + // if the traits was set before connecting to home assistant. If now a traits must be changed later, + // a reboot of the ESP controller is required to see the changes in home assistant. void PanasonicHeatpumpComponent::set_number_traits(const std::vector& data) { @@ -423,27 +427,9 @@ namespace esphome PanasonicDecode::WaterTempControl, PanasonicDecode::getBit5and6(data[28])); // Cooling Mode // ToDo: Convert top76 and top81 into int and pass them to set_traits(); - // traits can be changed anytime, but entities will only be updated in home assistant, - // if the traits was set before connecting to home assistant. If now a traits must be changed later, - // a reboot of the ESP controller is required to see the changes in home assistant. - - bool change_detected = false; for (auto *entity : this->numbers_) { - change_detected = entity->set_traits(data) ? true : change_detected; - } - if (change_detected) - { - this->set_traits_loop_ = true; - } - } - - void PanasonicHeatpumpComponent::publish_select(const std::vector& data) - { - if (data.empty()) return; - for (auto *entity : this->selects_) - { - entity->publish_new_state(data); + this->traits_changed_ = entity->set_traits(data) ? true : this->traits_changed_; } } @@ -452,41 +438,9 @@ namespace esphome if (data.empty()) return; bool top120 = PanasonicDecode::getBinaryState(PanasonicDecode::getBit5and6(data[23])); // Heat Cool Control - bool change_detected = false; for (auto *entity : this->selects_) { - change_detected = entity->set_traits(data) ? true : change_detected; - } - if (change_detected) - { - this->set_traits_loop_ = true; - } - } - - void PanasonicHeatpumpComponent::publish_sensor(const std::vector& data) - { - if (data.empty()) return; - for (auto *entity : this->sensors_) - { - entity->publish_new_state(data); - } - } - - void PanasonicHeatpumpComponent::publish_switch(const std::vector& data) - { - if (data.empty()) return; - for (auto *entity : this->switches_) - { - entity->publish_new_state(data); - } - } - - void PanasonicHeatpumpComponent::publish_text_sensor(const std::vector& data) - { - if (data.empty()) return; - for (auto *entity : this->text_sensors_) - { - entity->publish_new_state(data); + this->traits_changed_ = entity->set_traits(data) ? true : this->traits_changed_ ; } } } // namespace panasonic_heatpump diff --git a/components/panasonic_heatpump/panasonic_heatpump.h b/components/panasonic_heatpump/panasonic_heatpump.h index c8e445c..b739ee5 100644 --- a/components/panasonic_heatpump/panasonic_heatpump.h +++ b/components/panasonic_heatpump/panasonic_heatpump.h @@ -55,7 +55,7 @@ namespace esphome class PanasonicHeatpumpComponent : public PollingComponent, public uart::UARTDevice { public: - bool set_traits_loop_ { false }; + bool traits_changed_ { false }; PanasonicHeatpumpComponent() = default; // base class functions @@ -99,7 +99,7 @@ namespace esphome bool request_receiving_ { false }; RequestType next_request_ { RequestType::INITIAL }; LoopState loop_state_ { LoopState::RESTART_LOOP }; - uint8_t set_traits_total_ { 0 }; + uint8_t traits_update_counter_ { 0 }; // entity vectors std::vector binary_sensors_; std::vector numbers_; @@ -114,12 +114,6 @@ namespace esphome void read_request(); bool check_response(const std::vector& data); // entity functions - void publish_binary_sensor(const std::vector& data); - void publish_number(const std::vector& data); - void publish_select(const std::vector& data); - void publish_sensor(const std::vector& data); - void publish_switch(const std::vector& data); - void publish_text_sensor(const std::vector& data); void set_number_traits(const std::vector& data); void set_select_traits(const std::vector& data); }; diff --git a/components/panasonic_heatpump/select/panasonic_heatpump_select.cpp b/components/panasonic_heatpump/select/panasonic_heatpump_select.cpp index aacf1ee..1e88228 100644 --- a/components/panasonic_heatpump/select/panasonic_heatpump_select.cpp +++ b/components/panasonic_heatpump/select/panasonic_heatpump_select.cpp @@ -69,6 +69,7 @@ namespace esphome this->keep_state_--; return; } + if (data.empty()) return; std::string new_state; switch (this->id_) @@ -117,13 +118,15 @@ namespace esphome } default: return; }; - Select::publish_state(new_state); + + this->publish_state(new_state); } bool PanasonicHeatpumpSelect::set_traits(const std::vector& data) { - bool top120 = PanasonicDecode::getBinaryState(PanasonicDecode::getBit5and6(data[23])); // Heat Cool Control + if (data.empty()) return false; + bool top120 = PanasonicDecode::getBinaryState(PanasonicDecode::getBit5and6(data[23])); // Heat Cool Control switch (this->id_) { case SelectIds::CONF_SET9: diff --git a/components/panasonic_heatpump/sensor/panasonic_heatpump_sensor.cpp b/components/panasonic_heatpump/sensor/panasonic_heatpump_sensor.cpp index c57113a..ae6bcdd 100644 --- a/components/panasonic_heatpump/sensor/panasonic_heatpump_sensor.cpp +++ b/components/panasonic_heatpump/sensor/panasonic_heatpump_sensor.cpp @@ -15,6 +15,8 @@ namespace esphome void PanasonicHeatpumpSensor::publish_new_state(const std::vector& data) { + if (data.empty()) return; + float new_state; switch (this->id_) { @@ -590,6 +592,7 @@ namespace esphome } default: return; }; + this->publish_state(new_state); } } // namespace panasonic_heatpump diff --git a/components/panasonic_heatpump/switch/panasonic_heatpump_switch.cpp b/components/panasonic_heatpump/switch/panasonic_heatpump_switch.cpp index 651c0be..6b2ef19 100644 --- a/components/panasonic_heatpump/switch/panasonic_heatpump_switch.cpp +++ b/components/panasonic_heatpump/switch/panasonic_heatpump_switch.cpp @@ -16,6 +16,7 @@ namespace esphome void PanasonicHeatpumpSwitch::write_state(bool state) { size_t value = state ? 1 : 0; + switch (this->id_) { case SwitchIds::CONF_SET1: @@ -96,6 +97,7 @@ namespace esphome this->keep_state_--; return; } + if (data.empty()) return; bool new_state; switch (this->id_) @@ -174,6 +176,7 @@ namespace esphome } default: return; }; + this->publish_state(new_state); } } // namespace panasonic_heatpump diff --git a/components/panasonic_heatpump/text_sensor/panasonic_heatpump_text_sensor.cpp b/components/panasonic_heatpump/text_sensor/panasonic_heatpump_text_sensor.cpp index a8c8333..a6d1d33 100644 --- a/components/panasonic_heatpump/text_sensor/panasonic_heatpump_text_sensor.cpp +++ b/components/panasonic_heatpump/text_sensor/panasonic_heatpump_text_sensor.cpp @@ -15,6 +15,8 @@ namespace esphome void PanasonicHeatpumpTextSensor::publish_new_state(const std::vector& data) { + if (data.empty()) return; + std::string new_state; switch (this->id_) { @@ -146,6 +148,7 @@ namespace esphome } default: return; }; + this->publish_state(new_state); } } // namespace panasonic_heatpump