mirror of
https://github.com/GrKoR/esphome_aux_ac_component.git
synced 2025-12-07 03:57:02 +03:00
Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
61cad07acc | ||
|
|
3110c482c9 | ||
|
|
53a886f818 | ||
|
|
2d4162323a | ||
|
|
74d555b5e1 | ||
|
|
7df8ab3cc2 | ||
|
|
90d9a5cfa7 | ||
|
|
864ad07699 | ||
|
|
e595a4acf9 |
@@ -113,7 +113,7 @@ namespace esphome
|
||||
static const uint32_t AC_PACKET_TIMEOUT_MIN;
|
||||
};
|
||||
|
||||
const std::string Constants::AC_FIRMWARE_VERSION = "0.2.12";
|
||||
const std::string Constants::AC_FIRMWARE_VERSION = "0.2.14";
|
||||
|
||||
// custom fan modes
|
||||
const std::string Constants::MUTE = "mute";
|
||||
@@ -626,10 +626,18 @@ namespace esphome
|
||||
// GK: define убрал, т.к. считаю, что сбрасывать счетчик не надо.
|
||||
// #define AC_MIN_COUNTER_MASK 0b00111111
|
||||
|
||||
// включение-выключение функции "Ограничение мощности".
|
||||
#define AC_POWLIMSTAT_MASK 0b10000000
|
||||
enum ac_powLim_state : uint8_t
|
||||
{
|
||||
AC_POWLIMSTAT_OFF = 0x00,
|
||||
AC_POWLIMSTAT_ON = 0x80,
|
||||
AC_POWLIMSTAT_UNTOUCHED = 0xFF
|
||||
};
|
||||
|
||||
// маски ограничения мощности для инверторного кондиционера
|
||||
#define AC_INVERTER_POWER_LIMITATION_ENABLE_MASK 0b10000000
|
||||
#define AC_INVERTER_POWER_LIMITATION_VALUE_MASK 0b01111111
|
||||
#define AC_INVERTER_POWER_LIMITATION_VALUE_UNTOUCHED 0xFF
|
||||
#define AC_POWLIMVAL_MASK 0b01111111
|
||||
#define AC_POWLIMVAL_UNTOUCHED 0xFF
|
||||
|
||||
// положение вертикальных жалюзи для фронтенда
|
||||
enum ac_vlouver_frontend : uint8_t
|
||||
@@ -707,8 +715,8 @@ namespace esphome
|
||||
ac_realFan realFanSpeed; // текущая скорость вентилятора
|
||||
uint8_t inverter_power; // мощность инвертора
|
||||
bool defrost; // режим разморозки внешнего блока (накопление тепла + прогрев испарителя)
|
||||
bool inverter_power_limitation_enable; // ограничение мощности инвертора
|
||||
uint8_t inverter_power_limitation_value; // значение ограничения мощности инвертора
|
||||
ac_powLim_state power_lim_state; // статус ограничения мощности инвертора
|
||||
uint8_t power_lim_value; // значение ограничения мощности инвертора
|
||||
};
|
||||
|
||||
typedef ac_command_t ac_state_t; // текущее состояние параметров кондея можно хранить в таком же формате, как и комманды
|
||||
@@ -1134,8 +1142,8 @@ namespace esphome
|
||||
cmd->realFanSpeed = AC_REAL_FAN_UNTOUCHED;
|
||||
cmd->inverter_power = 0;
|
||||
cmd->defrost = false;
|
||||
cmd->inverter_power_limitation_enable = false;
|
||||
cmd->inverter_power_limitation_value = AC_INVERTER_POWER_LIMITATION_VALUE_UNTOUCHED;
|
||||
cmd->power_lim_state = AC_POWLIMSTAT_UNTOUCHED;
|
||||
cmd->power_lim_value = AC_POWLIMVAL_UNTOUCHED;
|
||||
};
|
||||
|
||||
// очистка буфера размером AC_BUFFER_SIZE
|
||||
@@ -1509,17 +1517,15 @@ namespace esphome
|
||||
stateByte = small_info_body->display_and_mildew & AC_MILDEW_MASK;
|
||||
stateChangedFlag = stateChangedFlag || (_current_ac_state.mildew != (ac_mildew)stateByte);
|
||||
_current_ac_state.mildew = (ac_mildew)stateByte;
|
||||
|
||||
// enable flag of power limitation for inverter ACs
|
||||
bool temp = small_info_body->inverter_power_limitation_enable;
|
||||
stateChangedFlag = stateChangedFlag || (_current_ac_state.inverter_power_limitation_enable != temp);
|
||||
_current_ac_state.inverter_power_limitation_enable = temp;
|
||||
|
||||
// the limit value of power limitation for inverter ACs
|
||||
|
||||
stateByte = AC_POWLIMSTAT_ON * small_info_body->inverter_power_limitation_enable;
|
||||
stateChangedFlag = stateChangedFlag || (_current_ac_state.power_lim_state != (ac_powLim_state)stateByte);
|
||||
_current_ac_state.power_lim_state = (ac_powLim_state)stateByte;
|
||||
|
||||
stateByte = small_info_body->inverter_power_limitation_value;
|
||||
stateChangedFlag = stateChangedFlag || (_current_ac_state.inverter_power_limitation_value != stateByte);
|
||||
_current_ac_state.inverter_power_limitation_value = stateByte;
|
||||
|
||||
stateChangedFlag = stateChangedFlag || (_current_ac_state.power_lim_value != stateByte);
|
||||
_current_ac_state.power_lim_value = stateByte;
|
||||
|
||||
// уведомляем об изменении статуса сплита
|
||||
if (stateChangedFlag)
|
||||
stateChanged();
|
||||
@@ -1921,13 +1927,17 @@ namespace esphome
|
||||
}
|
||||
}
|
||||
|
||||
// ограничение мощности инвертора
|
||||
if ((cmd->inverter_power_limitation_enable) &&
|
||||
(cmd->inverter_power_limitation_value != AC_INVERTER_POWER_LIMITATION_VALUE_UNTOUCHED))
|
||||
// значение ограничения мощности инвертора
|
||||
if ((cmd->power_lim_value != AC_POWLIMVAL_UNTOUCHED))
|
||||
{
|
||||
pack->body[13] = (pack->body[13] & ~AC_INVERTER_POWER_LIMITATION_ENABLE_MASK) | (cmd->inverter_power_limitation_enable << 7);
|
||||
cmd->inverter_power_limitation_value = _power_limitation_value_normalise(cmd->inverter_power_limitation_value);
|
||||
pack->body[13] = (pack->body[13] & ~AC_INVERTER_POWER_LIMITATION_VALUE_MASK) | cmd->inverter_power_limitation_value;
|
||||
cmd->power_lim_value = _power_limitation_value_normalise(cmd->power_lim_value);
|
||||
pack->body[13] = (pack->body[13] & ~AC_POWLIMVAL_MASK) | (cmd->power_lim_value & AC_POWLIMVAL_MASK);
|
||||
}
|
||||
|
||||
// включение/выключение ограничения мощности инвертора
|
||||
if ((cmd->power_lim_state != AC_POWLIMSTAT_UNTOUCHED))
|
||||
{
|
||||
pack->body[13] = (pack->body[13] & ~AC_POWLIMSTAT_MASK) | (cmd->power_lim_state & AC_POWLIMSTAT_MASK);
|
||||
}
|
||||
|
||||
// обнулить счетчик минут с последней команды
|
||||
@@ -2791,11 +2801,10 @@ namespace esphome
|
||||
sensor_vlouver_state_->publish_state((float)this->getCurrentVlouverFrontendState());
|
||||
// флаг включенного ограничения мощности инвертора
|
||||
if (sensor_inverter_power_limit_state_ != nullptr)
|
||||
sensor_inverter_power_limit_state_->publish_state(_current_ac_state.inverter_power_limitation_enable);
|
||||
sensor_inverter_power_limit_state_->publish_state(_current_ac_state.power_lim_state == AC_POWLIMSTAT_ON);
|
||||
// значение ограничения мощности инвертора
|
||||
if (sensor_inverter_power_limit_value_ != nullptr)
|
||||
sensor_inverter_power_limit_value_->publish_state(_current_ac_state.inverter_power_limitation_value);
|
||||
|
||||
sensor_inverter_power_limit_value_->publish_state(_current_ac_state.power_lim_value);
|
||||
// сенсор состояния сплита
|
||||
if (sensor_preset_reporter_ != nullptr)
|
||||
{
|
||||
@@ -2838,11 +2847,9 @@ namespace esphome
|
||||
#endif
|
||||
|
||||
ESP_LOGCONFIG(TAG, " [?] Is inverter %s", millis() > _update_period + 1000 ? YESNO(_is_inverter) : "pending...");
|
||||
|
||||
LOG_SENSOR(" ", "Inverter Power", this->sensor_inverter_power_);
|
||||
LOG_SENSOR(" ", "Inverter Power Limit Value", this->sensor_inverter_power_limit_value_);
|
||||
LOG_BINARY_SENSOR(" ", "Inverter Power Limit State", this->sensor_inverter_power_limit_state_);
|
||||
|
||||
LOG_SENSOR(" ", "Indoor Temperature", this->sensor_indoor_temperature_);
|
||||
LOG_SENSOR(" ", "Outdoor Temperature", this->sensor_outdoor_temperature_);
|
||||
LOG_SENSOR(" ", "Inbound Temperature", this->sensor_inbound_temperature_);
|
||||
@@ -3534,63 +3541,99 @@ namespace esphome
|
||||
return true;
|
||||
}
|
||||
|
||||
// выключает ограничение мощности сплита
|
||||
bool powerLimitationOffSequence()
|
||||
// устанавливает ограничение мощности сплита на нужный уровень
|
||||
bool powerLimitationSetSequence(uint8_t power_limit, bool set_on=false)
|
||||
{
|
||||
// нет смысла в последовательности, если нет коннекта с кондиционером
|
||||
if (!get_has_connection())
|
||||
{
|
||||
_debugMsg(F("powerLimitationOffSequence: no pings from HVAC. It seems like no AC connected."), ESPHOME_LOG_LEVEL_ERROR, __LINE__);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!this->_is_inverter)
|
||||
return false; // если кондиционер не инверторный, то выходим
|
||||
|
||||
// формируем команду
|
||||
ac_command_t cmd;
|
||||
_clearCommand(&cmd); // не забываем очищать, а то будет мусор
|
||||
cmd.inverter_power_limitation_enable = false;
|
||||
cmd.inverter_power_limitation_value = this->_current_ac_state.inverter_power_limitation_value;
|
||||
// добавляем команду в последовательность
|
||||
if (!commandSequence(&cmd))
|
||||
return false;
|
||||
|
||||
_debugMsg(F("powerLimitationOffSequence: loaded (value = %02X)"), ESPHOME_LOG_LEVEL_VERBOSE, __LINE__, cmd.inverter_power_limitation_enable);
|
||||
return true;
|
||||
}
|
||||
|
||||
// включает ограничение мощности сплита на нужный уровень
|
||||
bool powerLimitationOnSequence(uint8_t power_limit = Constants::AC_MIN_INVERTER_POWER_LIMIT)
|
||||
{
|
||||
// нет смысла в последовательности, если нет коннекта с кондиционером
|
||||
if (!get_has_connection())
|
||||
{
|
||||
_debugMsg(F("powerLimitationOnSequence: no pings from HVAC. It seems like no AC connected."), ESPHOME_LOG_LEVEL_ERROR, __LINE__);
|
||||
_debugMsg(F("powerLimitationSetSequence: no pings from HVAC. It seems like no AC connected."), ESPHOME_LOG_LEVEL_ERROR, __LINE__);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!this->_is_inverter)
|
||||
{ // если кондиционер не инверторный, то выходим
|
||||
_debugMsg(F("powerLimitationOnSequence: unsupported for noninverter AC."), ESPHOME_LOG_LEVEL_WARN, __LINE__);
|
||||
_debugMsg(F("powerLimitationSetSequence: unsupported for noninverter AC."), ESPHOME_LOG_LEVEL_WARN, __LINE__);
|
||||
return false;
|
||||
}
|
||||
|
||||
power_limit = this->_power_limitation_value_normalise(power_limit);
|
||||
|
||||
if(power_limit != this->_power_limitation_value_normalise(power_limit))
|
||||
{
|
||||
_debugMsg(F("powerLimitationSetSequence: incorrect power limit value."), ESPHOME_LOG_LEVEL_WARN, __LINE__);
|
||||
return false;
|
||||
}
|
||||
|
||||
// формируем команду
|
||||
ac_command_t cmd;
|
||||
_clearCommand(&cmd); // не забываем очищать, а то будет мусор
|
||||
cmd.inverter_power_limitation_enable = true;
|
||||
cmd.inverter_power_limitation_value = power_limit;
|
||||
cmd.power_lim_value = power_limit;
|
||||
if (set_on)
|
||||
{
|
||||
cmd.power_lim_state = AC_POWLIMSTAT_ON;
|
||||
}
|
||||
// добавляем команду в последовательность
|
||||
if (!commandSequence(&cmd))
|
||||
return false;
|
||||
|
||||
if (set_on)
|
||||
{
|
||||
_debugMsg(F("powerLimitationSetSequence: loaded (state = %02X, power limit = %02X)"), ESPHOME_LOG_LEVEL_VERBOSE, __LINE__, cmd.power_lim_state, power_limit);
|
||||
} else {
|
||||
_debugMsg(F("powerLimitationSetSequence: loaded (power limit = %02X)"), ESPHOME_LOG_LEVEL_VERBOSE, __LINE__, power_limit);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// включает/выключает ограничение мощности сплита
|
||||
bool powerLimitationOnOffSequence(bool enable_limit)
|
||||
{
|
||||
// нет смысла в последовательности, если нет коннекта с кондиционером
|
||||
if (!get_has_connection())
|
||||
{
|
||||
_debugMsg(F("powerLimitationOnOffSequence: no pings from HVAC. It seems like no AC connected."), ESPHOME_LOG_LEVEL_ERROR, __LINE__);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!this->_is_inverter)
|
||||
{
|
||||
_debugMsg(F("powerLimitationOnSequence: unsupported for noninverter AC."), ESPHOME_LOG_LEVEL_WARN, __LINE__);
|
||||
return false; // если кондиционер не инверторный, то выходим
|
||||
}
|
||||
|
||||
// формируем команду
|
||||
ac_command_t cmd;
|
||||
_clearCommand(&cmd); // не забываем очищать, а то будет мусор
|
||||
if(enable_limit){
|
||||
cmd.power_lim_state = AC_POWLIMSTAT_ON; // включить ограничение мощности
|
||||
} else {
|
||||
cmd.power_lim_state = AC_POWLIMSTAT_OFF; // отключить ограничение мощности
|
||||
}
|
||||
// добавляем команду в последовательность
|
||||
if (!commandSequence(&cmd))
|
||||
return false;
|
||||
|
||||
_debugMsg(F("powerLimitationOnSequence: loaded (power limit = %02X)"), ESPHOME_LOG_LEVEL_VERBOSE, __LINE__, power_limit);
|
||||
_debugMsg(F("powerLimitationOnOffSequence: loaded (state = %02X)"), ESPHOME_LOG_LEVEL_VERBOSE, __LINE__, cmd.power_lim_state);
|
||||
return true;
|
||||
}
|
||||
|
||||
// включает ограничение мощности сплита
|
||||
bool powerLimitationOnSequence()
|
||||
{
|
||||
return powerLimitationOnOffSequence(true);
|
||||
}
|
||||
|
||||
// включает ограничение мощности сплита на нужный уровень
|
||||
bool powerLimitationOnSequence(uint8_t power_limit)
|
||||
{
|
||||
return powerLimitationSetSequence(power_limit, true);
|
||||
}
|
||||
|
||||
// выключает ограничение мощности сплита
|
||||
bool powerLimitationOffSequence()
|
||||
{
|
||||
return powerLimitationOnOffSequence(false);
|
||||
}
|
||||
|
||||
// конвертирует состояние жалюзи из кодов сплита в коды для фронтенда
|
||||
ac_vlouver_frontend AUXvlouverToVlouverFrontend(const ac_louver_V vLouver)
|
||||
{
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
+ Argo (models: Greenstyle 9000, Greenstyle 12000, Greenstyle 18000)
|
||||
+ AUX (models: ALMD-H48/5DR2 / AL-H48/5DR2(U), AMWM-H07/4R1 multisplit, ASW-H07A4/DE-R1DI, ASW-H07A4/FP-R1DI, ASW-H09A4/FP-R1DI, ASW-H09A4/LK-700R1, ASW-H09A4/LK-700R1DI, ASW-H12B4/JD-R2DI, ASW-H12A4/FAR1, ASW-H09B4/LK-700R1, ASW-H12U3/JIR1DI-US, AUX-18QC/I / AUX-18QC/O, KFR-26GW/BpHRB+3, KFR-26GW/BpQYA2+2R3, KFR-26GW/BpQYD2+2R3, KFR-26GW/BpR3QYA1+1, KFR-26GW/BpR3QYD1+1, KFR-26GW/BpR3QYQ1+1, KFR-26GW/BpR3QYQ2+2, KFR-35GW/BpQYA1+1R3, KFR-35GW/BpQYA2+2R3, KFR-35GW/BpQYD1+1R3, KFR-35GW/BpQYD2+2R3, KFR-35GW/BpR3QYQ1+1, KFR-35GW/BpR3QYQ2+2 (see [issue #71](https://github.com/GrKoR/esphome_aux_ac_component/issues/71) for detais of `Aegean Sea`[爱琴海] AUX family AC connection)
|
||||
+ Ballu (models: BLC_CF/in-60HN1, BSUI-09HN8, BSUI-12HN8)
|
||||
+ Ballu (models: BLC_CF-60HN1, BSUI-09HN8, BSUI-12HN8, BSW-09HN1, BSW-12HN1)
|
||||
+ Centek (models: CT-65A12, CT-65F09, CT-65F12, CT-65Q09, CT-65Q12, CT-65U13, CT-65Z10, CT-65Z18, CT-65V24)
|
||||
+ Dimstal (model: SMND-QC-12-J-Smart ECO)
|
||||
+ Elgin (models: HWFI09B2IA/ HWFE09B2NA)
|
||||
@@ -15,7 +15,7 @@
|
||||
+ IGC (models: RAK-07NH multysplit, RAS-07AX/RAC-07AX)
|
||||
+ Loriot (models: LAC-09AS)
|
||||
+ RCool (models: GRA12B0-KSZKLM641)
|
||||
+ Roda (models: RS-AL09F)
|
||||
+ Roda (models: RS-AL09F, RS-AL24F)
|
||||
+ Rovex (models: RS-07ALS1, RS-09ALS1, RS-12ALS1)
|
||||
+ Royal Clima (models: CO-D 18HNI/CO-E 18HNI, RCI-SA30HN)
|
||||
+ Samurai (models: SMA-07HRN1 ION, SMA-09HRN1 ION)
|
||||
|
||||
Reference in New Issue
Block a user