9 Commits

Author SHA1 Message Date
GK
36dc1fe15f Merge pull request #191 from GrKoR/dev-Fahrenheit
fix: Fahrenheit support
2025-12-22 21:44:08 -08:00
GrKoR
8597e46e3f version: patch++ 2025-12-22 21:37:54 -08:00
GrKoR
c49bed261d clear: unnecessary comments have been deleted 2025-12-21 18:35:24 -08:00
GrKoR
babcb8f895 fix: Fahrenheit temperature feedback fix 2025-12-21 18:25:48 -08:00
GrKoR
0a09ad6642 fix: Fahrenheit temperature frac part 2025-12-21 18:22:05 -08:00
GK
fa0b698afa Merge pull request #189 from GrKoR/dev
Feature/Fix: ESPHome 2025.11.0 Compatibility & Swing Mode Refactor
2025-12-02 23:07:53 -08:00
GK
3391368179 Merge pull request #188 from qbus00/esp2025.11_fix 2025-11-28 07:09:31 -08:00
qbus00
fc56fb7966 fix: remove TWO_POINT_TARGET_TEMPERATURE flag for ESPHome 2025.11+ 2025-11-28 15:09:49 +01:00
GrKoR
efa0991dd0 fix: automations play() method fixed 2025-11-27 17:57:13 -08:00
3 changed files with 200 additions and 145 deletions

View File

@@ -4,183 +4,238 @@
#include "esphome/core/automation.h"
#include "esphome/core/component.h"
namespace esphome {
namespace aux_ac {
namespace esphome
{
namespace aux_ac
{
// **************************************** DISPLAY ACTIONS ****************************************
template <typename... Ts>
class AirConDisplayOffAction : public Action<Ts...> {
public:
explicit AirConDisplayOffAction(AirCon *ac) : ac_(ac) {}
// **************************************** DISPLAY ACTIONS ****************************************
template <typename... Ts>
class AirConDisplayOffAction : public Action<Ts...>
{
public:
explicit AirConDisplayOffAction(AirCon *ac) : ac_(ac) {}
void play(Ts... x) override { this->ac_->displayOffSequence(); }
void play(const Ts &...x) override
{
this->ac_->displayOffSequence();
}
protected:
AirCon *ac_;
};
protected:
AirCon *ac_;
};
template <typename... Ts>
class AirConDisplayOnAction : public Action<Ts...> {
public:
explicit AirConDisplayOnAction(AirCon *ac) : ac_(ac) {}
template <typename... Ts>
class AirConDisplayOnAction : public Action<Ts...>
{
public:
explicit AirConDisplayOnAction(AirCon *ac) : ac_(ac) {}
void play(Ts... x) override { this->ac_->displayOnSequence(); }
void play(const Ts &...x) override
{
this->ac_->displayOnSequence();
}
protected:
AirCon *ac_;
};
protected:
AirCon *ac_;
};
// **************************************** VERTICAL LOUVER ACTIONS ****************************************
template <typename... Ts>
class AirConVLouverSwingAction : public Action<Ts...> {
public:
explicit AirConVLouverSwingAction(AirCon *ac) : ac_(ac) {}
// **************************************** VERTICAL LOUVER ACTIONS ****************************************
template <typename... Ts>
class AirConVLouverSwingAction : public Action<Ts...>
{
public:
explicit AirConVLouverSwingAction(AirCon *ac) : ac_(ac) {}
void play(Ts... x) override { this->ac_->setVLouverSwingSequence(); }
void play(const Ts &...x) override
{
this->ac_->setVLouverSwingSequence();
}
protected:
AirCon *ac_;
};
protected:
AirCon *ac_;
};
template <typename... Ts>
class AirConVLouverStopAction : public Action<Ts...> {
public:
explicit AirConVLouverStopAction(AirCon *ac) : ac_(ac) {}
template <typename... Ts>
class AirConVLouverStopAction : public Action<Ts...>
{
public:
explicit AirConVLouverStopAction(AirCon *ac) : ac_(ac) {}
void play(Ts... x) override { this->ac_->setVLouverStopSequence(); }
void play(const Ts &...x) override
{
this->ac_->setVLouverStopSequence();
}
protected:
AirCon *ac_;
};
protected:
AirCon *ac_;
};
template <typename... Ts>
class AirConVLouverTopAction : public Action<Ts...> {
public:
explicit AirConVLouverTopAction(AirCon *ac) : ac_(ac) {}
template <typename... Ts>
class AirConVLouverTopAction : public Action<Ts...>
{
public:
explicit AirConVLouverTopAction(AirCon *ac) : ac_(ac) {}
void play(Ts... x) override { this->ac_->setVLouverTopSequence(); }
void play(const Ts &...x) override
{
this->ac_->setVLouverTopSequence();
}
protected:
AirCon *ac_;
};
protected:
AirCon *ac_;
};
template <typename... Ts>
class AirConVLouverMiddleAboveAction : public Action<Ts...> {
public:
explicit AirConVLouverMiddleAboveAction(AirCon *ac) : ac_(ac) {}
template <typename... Ts>
class AirConVLouverMiddleAboveAction : public Action<Ts...>
{
public:
explicit AirConVLouverMiddleAboveAction(AirCon *ac) : ac_(ac) {}
void play(Ts... x) override { this->ac_->setVLouverMiddleAboveSequence(); }
void play(const Ts &...x) override
{
this->ac_->setVLouverMiddleAboveSequence();
}
protected:
AirCon *ac_;
};
protected:
AirCon *ac_;
};
template <typename... Ts>
class AirConVLouverMiddleAction : public Action<Ts...> {
public:
explicit AirConVLouverMiddleAction(AirCon *ac) : ac_(ac) {}
template <typename... Ts>
class AirConVLouverMiddleAction : public Action<Ts...>
{
public:
explicit AirConVLouverMiddleAction(AirCon *ac) : ac_(ac) {}
void play(Ts... x) override { this->ac_->setVLouverMiddleSequence(); }
void play(const Ts &...x) override
{
this->ac_->setVLouverMiddleSequence();
}
protected:
AirCon *ac_;
};
protected:
AirCon *ac_;
};
template <typename... Ts>
class AirConVLouverMiddleBelowAction : public Action<Ts...> {
public:
explicit AirConVLouverMiddleBelowAction(AirCon *ac) : ac_(ac) {}
template <typename... Ts>
class AirConVLouverMiddleBelowAction : public Action<Ts...>
{
public:
explicit AirConVLouverMiddleBelowAction(AirCon *ac) : ac_(ac) {}
void play(Ts... x) override { this->ac_->setVLouverMiddleBelowSequence(); }
void play(const Ts &...x) override
{
this->ac_->setVLouverMiddleBelowSequence();
}
protected:
AirCon *ac_;
};
protected:
AirCon *ac_;
};
template <typename... Ts>
class AirConVLouverBottomAction : public Action<Ts...> {
public:
explicit AirConVLouverBottomAction(AirCon *ac) : ac_(ac) {}
template <typename... Ts>
class AirConVLouverBottomAction : public Action<Ts...>
{
public:
explicit AirConVLouverBottomAction(AirCon *ac) : ac_(ac) {}
void play(Ts... x) override { this->ac_->setVLouverBottomSequence(); }
void play(const Ts &...x) override
{
this->ac_->setVLouverBottomSequence();
}
protected:
AirCon *ac_;
};
protected:
AirCon *ac_;
};
template <typename... Ts>
class AirConVLouverSetAction : public Action<Ts...> {
public:
AirConVLouverSetAction(AirCon *ac) : ac_(ac) {}
TEMPLATABLE_VALUE(uint8_t, value);
template <typename... Ts>
class AirConVLouverSetAction : public Action<Ts...>
{
public:
TEMPLATABLE_VALUE(uint8_t, value);
void play(Ts... x) {
vlpos_ = this->value_.value(x...);
this->ac_->setVLouverFrontendSequence((ac_vlouver_frontend)vlpos_);
}
AirConVLouverSetAction(AirCon *ac) : ac_(ac) {};
protected:
AirCon *ac_;
uint8_t vlpos_;
};
void play(const Ts &...x) override
{
vlpos_ = this->value_.value(x...);
this->ac_->setVLouverFrontendSequence((ac_vlouver_frontend)vlpos_);
};
// **************************************** SEND TEST PACKET ACTION ****************************************
template <typename... Ts>
class AirConSendTestPacketAction : public Action<Ts...> {
public:
explicit AirConSendTestPacketAction(AirCon *ac) : ac_(ac) {}
void set_data_template(std::function<std::vector<uint8_t>(Ts...)> func) {
this->data_func_ = func;
this->static_ = false;
}
void set_data_static(const std::vector<uint8_t> &data) {
this->data_static_ = data;
this->static_ = true;
}
protected:
AirCon *ac_;
uint8_t vlpos_;
};
void play(Ts... x) override {
if (this->static_) {
this->ac_->sendTestPacket(this->data_static_);
} else {
auto val = this->data_func_(x...);
this->ac_->sendTestPacket(val);
}
}
// **************************************** SEND TEST PACKET ACTION ****************************************
template <typename... Ts>
class AirConSendTestPacketAction : public Action<Ts...>
{
public:
explicit AirConSendTestPacketAction(AirCon *ac) : ac_(ac) {}
void set_data_template(std::function<std::vector<uint8_t>(Ts...)> func)
{
this->data_func_ = func;
this->static_ = false;
}
void set_data_static(const std::vector<uint8_t> &data)
{
this->data_static_ = data;
this->static_ = true;
}
protected:
AirCon *ac_;
bool static_{false};
std::function<std::vector<uint8_t>(Ts...)> data_func_{};
std::vector<uint8_t> data_static_{};
};
void play(const Ts &...x) override
{
if (this->static_)
{
this->ac_->sendTestPacket(this->data_static_);
}
else
{
auto val = this->data_func_(x...);
this->ac_->sendTestPacket(val);
}
}
// **************************************** POWER LIMITATION ACTIONS ****************************************
template <typename... Ts>
class AirConPowerLimitationOffAction : public Action<Ts...> {
public:
explicit AirConPowerLimitationOffAction(AirCon *ac) : ac_(ac) {}
protected:
AirCon *ac_;
bool static_{false};
std::function<std::vector<uint8_t>(Ts...)> data_func_{};
std::vector<uint8_t> data_static_{};
};
void play(Ts... x) override { this->ac_->powerLimitationOffSequence(); }
// **************************************** POWER LIMITATION ACTIONS ****************************************
template <typename... Ts>
class AirConPowerLimitationOffAction : public Action<Ts...>
{
public:
explicit AirConPowerLimitationOffAction(AirCon *ac) : ac_(ac) {}
protected:
AirCon *ac_;
};
void play(const Ts &...x) override
{
this->ac_->powerLimitationOffSequence();
}
template <typename... Ts>
class AirConPowerLimitationOnAction : public Action<Ts...> {
public:
AirConPowerLimitationOnAction(AirCon *ac) : ac_(ac) {}
TEMPLATABLE_VALUE(uint8_t, value);
protected:
AirCon *ac_;
};
void play(Ts... x) {
this->pwr_lim_ = this->value_.value(x...);
this->ac_->powerLimitationOnSequence(this->pwr_lim_);
}
template <typename... Ts>
class AirConPowerLimitationOnAction : public Action<Ts...>
{
public:
TEMPLATABLE_VALUE(uint8_t, value);
protected:
AirCon *ac_;
uint8_t pwr_lim_;
};
AirConPowerLimitationOnAction(AirCon *ac) : ac_(ac) {};
} // namespace aux_ac
} // namespace esphome
void play(const Ts &...x) override
{
this->pwr_lim_ = this->value_.value(x...);
this->ac_->powerLimitationOnSequence(this->pwr_lim_);
}
protected:
AirCon *ac_;
uint8_t pwr_lim_;
};
} // namespace aux_ac
} // namespace esphome

View File

@@ -1476,13 +1476,12 @@ namespace esphome
small_info_body = (packet_small_info_body_t *)(_inPacket.body);
// в малом пакете передается большое количество установленных пользователем параметров работы
// stateFloat = 8 + (small_info_body->target_temp_int_and_v_louver >> 3) + 0.5 * (float)(small_info_body->target_temp_frac >> 7);
stateFloat = 8.0 + (float)(small_info_body->target_temp_int) + ((small_info_body->target_temp_frac_bool) ? 0.5 : 0.0);
// stateFloat = 8.0 + (float)(small_info_body->target_temp_int) + ((small_info_body->target_temp_frac_bool) ? 0.5 : 0.0);
stateFloat = 8.0 + (float)(small_info_body->target_temp_int) + (small_info_body->target_temp_frac_dec / 10.0);
stateChangedFlag = stateChangedFlag || (_current_ac_state.temp_target != stateFloat);
_current_ac_state.temp_target = stateFloat;
_current_ac_state.temp_target_matter = true;
// stateByte = small_info_body->target_temp_int_and_v_louver & AC_LOUVERV_MASK;
stateByte = small_info_body->v_louver;
stateChangedFlag = stateChangedFlag || (_current_ac_state.louver.louver_v != (ac_louver_V)stateByte);
_current_ac_state.louver.louver_v = (ac_louver_V)stateByte;
@@ -1946,6 +1945,7 @@ namespace esphome
{
pack->body[4] = (pack->body[4] & ~AC_TEMP_TARGET_FRAC_PART_MASK);
}
pack->body[14] = ((uint8_t)(cmd->temp_target * 10)) % 10;
}
// значение ограничения мощности инвертора
@@ -4025,7 +4025,7 @@ namespace esphome
// initAC() в формируемом питоном коде вызывается до вызова aux_ac.set_supported_***() с установленными пользователем в конфиге параметрами
#if ESPHOME_VERSION_CODE >= VERSION_CODE(2025, 11, 0)
_traits.add_feature_flags(climate::CLIMATE_SUPPORTS_CURRENT_TEMPERATURE);
_traits.add_feature_flags(climate::CLIMATE_REQUIRES_TWO_POINT_TARGET_TEMPERATURE);
// NOT setting CLIMATE_REQUIRES_TWO_POINT_TARGET_TEMPERATURE - this device uses single target temperature
#else
_traits.set_supports_current_temperature(true);
_traits.set_supports_two_point_target_temperature(false); // if the climate device's target temperature should be split in target_temperature_low and target_temperature_high instead of just the single target_temperature

View File

@@ -34,7 +34,7 @@ from esphome.components.climate import (
ClimateSwingMode,
)
AUX_AC_FIRMWARE_VERSION = '0.3.1'
AUX_AC_FIRMWARE_VERSION = '0.3.2'
AC_PACKET_TIMEOUT_MIN = 150
AC_PACKET_TIMEOUT_MAX = 600
AC_POWER_LIMIT_MIN = 30