cade formatting

This commit is contained in:
GrKoR
2022-07-14 17:22:57 +03:00
parent 517265f73c
commit 18edab9742
2 changed files with 2649 additions and 2675 deletions

View File

@@ -1,16 +1,15 @@
#pragma once #pragma once
#include "esphome/core/component.h"
#include "esphome/core/automation.h"
#include "aux_ac.h" #include "aux_ac.h"
#include "esphome/core/automation.h"
#include "esphome/core/component.h"
namespace esphome { namespace esphome {
namespace aux_ac { namespace aux_ac {
// **************************************** DISPLAY ACTIONS **************************************** // **************************************** DISPLAY ACTIONS ****************************************
template <typename... Ts> template <typename... Ts>
class AirConDisplayOffAction : public Action<Ts...> class AirConDisplayOffAction : public Action<Ts...> {
{
public: public:
explicit AirConDisplayOffAction(AirCon *ac) : ac_(ac) {} explicit AirConDisplayOffAction(AirCon *ac) : ac_(ac) {}
@@ -21,8 +20,7 @@ namespace aux_ac {
}; };
template <typename... Ts> template <typename... Ts>
class AirConDisplayOnAction : public Action<Ts...> class AirConDisplayOnAction : public Action<Ts...> {
{
public: public:
explicit AirConDisplayOnAction(AirCon *ac) : ac_(ac) {} explicit AirConDisplayOnAction(AirCon *ac) : ac_(ac) {}
@@ -32,12 +30,9 @@ namespace aux_ac {
AirCon *ac_; AirCon *ac_;
}; };
// **************************************** VERTICAL LOUVER ACTIONS **************************************** // **************************************** VERTICAL LOUVER ACTIONS ****************************************
template <typename... Ts> template <typename... Ts>
class AirConVLouverSwingAction : public Action<Ts...> class AirConVLouverSwingAction : public Action<Ts...> {
{
public: public:
explicit AirConVLouverSwingAction(AirCon *ac) : ac_(ac) {} explicit AirConVLouverSwingAction(AirCon *ac) : ac_(ac) {}
@@ -48,8 +43,7 @@ namespace aux_ac {
}; };
template <typename... Ts> template <typename... Ts>
class AirConVLouverStopAction : public Action<Ts...> class AirConVLouverStopAction : public Action<Ts...> {
{
public: public:
explicit AirConVLouverStopAction(AirCon *ac) : ac_(ac) {} explicit AirConVLouverStopAction(AirCon *ac) : ac_(ac) {}
@@ -60,8 +54,7 @@ namespace aux_ac {
}; };
template <typename... Ts> template <typename... Ts>
class AirConVLouverTopAction : public Action<Ts...> class AirConVLouverTopAction : public Action<Ts...> {
{
public: public:
explicit AirConVLouverTopAction(AirCon *ac) : ac_(ac) {} explicit AirConVLouverTopAction(AirCon *ac) : ac_(ac) {}
@@ -72,8 +65,7 @@ namespace aux_ac {
}; };
template <typename... Ts> template <typename... Ts>
class AirConVLouverMiddleAboveAction : public Action<Ts...> class AirConVLouverMiddleAboveAction : public Action<Ts...> {
{
public: public:
explicit AirConVLouverMiddleAboveAction(AirCon *ac) : ac_(ac) {} explicit AirConVLouverMiddleAboveAction(AirCon *ac) : ac_(ac) {}
@@ -84,8 +76,7 @@ namespace aux_ac {
}; };
template <typename... Ts> template <typename... Ts>
class AirConVLouverMiddleAction : public Action<Ts...> class AirConVLouverMiddleAction : public Action<Ts...> {
{
public: public:
explicit AirConVLouverMiddleAction(AirCon *ac) : ac_(ac) {} explicit AirConVLouverMiddleAction(AirCon *ac) : ac_(ac) {}
@@ -96,8 +87,7 @@ namespace aux_ac {
}; };
template <typename... Ts> template <typename... Ts>
class AirConVLouverMiddleBelowAction : public Action<Ts...> class AirConVLouverMiddleBelowAction : public Action<Ts...> {
{
public: public:
explicit AirConVLouverMiddleBelowAction(AirCon *ac) : ac_(ac) {} explicit AirConVLouverMiddleBelowAction(AirCon *ac) : ac_(ac) {}
@@ -108,8 +98,7 @@ namespace aux_ac {
}; };
template <typename... Ts> template <typename... Ts>
class AirConVLouverBottomAction : public Action<Ts...> class AirConVLouverBottomAction : public Action<Ts...> {
{
public: public:
explicit AirConVLouverBottomAction(AirCon *ac) : ac_(ac) {} explicit AirConVLouverBottomAction(AirCon *ac) : ac_(ac) {}
@@ -120,8 +109,7 @@ namespace aux_ac {
}; };
template <typename... Ts> template <typename... Ts>
class AirConVLouverSetAction : public Action<Ts...> class AirConVLouverSetAction : public Action<Ts...> {
{
public: public:
AirConVLouverSetAction(AirCon *ac) : ac_(ac) {} AirConVLouverSetAction(AirCon *ac) : ac_(ac) {}
TEMPLATABLE_VALUE(uint8_t, value); TEMPLATABLE_VALUE(uint8_t, value);
@@ -136,11 +124,9 @@ namespace aux_ac {
uint8_t vlpos_; uint8_t vlpos_;
}; };
// **************************************** SEND TEST PACKET ACTION **************************************** // **************************************** SEND TEST PACKET ACTION ****************************************
template <typename... Ts> template <typename... Ts>
class AirConSendTestPacketAction : public Action<Ts...> class AirConSendTestPacketAction : public Action<Ts...> {
{
public: public:
explicit AirConSendTestPacketAction(AirCon *ac) : ac_(ac) {} explicit AirConSendTestPacketAction(AirCon *ac) : ac_(ac) {}
void set_data_template(std::function<std::vector<uint8_t>(Ts...)> func) { void set_data_template(std::function<std::vector<uint8_t>(Ts...)> func) {

View File

@@ -5,14 +5,15 @@
#pragma once #pragma once
#include <Arduino.h> #include <Arduino.h>
#include "esphome.h"
#include <stdarg.h> #include <stdarg.h>
#include "esphome/core/component.h"
#include "esphome/components/climate/climate.h" #include "esphome.h"
#include "esphome/components/uart/uart.h"
#include "esphome/components/sensor/sensor.h"
#include "esphome/components/binary_sensor/binary_sensor.h" #include "esphome/components/binary_sensor/binary_sensor.h"
#include "esphome/components/climate/climate.h"
#include "esphome/components/sensor/sensor.h"
#include "esphome/components/text_sensor/text_sensor.h" #include "esphome/components/text_sensor/text_sensor.h"
#include "esphome/components/uart/uart.h"
#include "esphome/core/component.h"
#include "esphome/core/helpers.h" #include "esphome/core/helpers.h"
// весь функционал сохранения пресетов прячу под дефайн // весь функционал сохранения пресетов прячу под дефайн
@@ -28,18 +29,16 @@
// раскоментируй ключ HOLMS для вывода лога под Эксель, значение ключа - размер пакетов которые будут видны // раскоментируй ключ HOLMS для вывода лога под Эксель, значение ключа - размер пакетов которые будут видны
//#define HOLMS 19 //#define HOLMS 19
namespace esphome { namespace esphome {
namespace aux_ac { namespace aux_ac {
static const char *const TAG = "AirCon"; static const char *const TAG = "AirCon";
using climate::ClimatePreset;
using climate::ClimateTraits;
using climate::ClimateMode;
using climate::ClimateSwingMode;
using climate::ClimateFanMode; using climate::ClimateFanMode;
using climate::ClimateMode;
using climate::ClimatePreset;
using climate::ClimateSwingMode;
using climate::ClimateTraits;
class Constants { class Constants {
public: public:
@@ -80,7 +79,6 @@ const float Constants::AC_MAX_TEMPERATURE = 32.0;
const float Constants::AC_TEMPERATURE_STEP = 0.5; const float Constants::AC_TEMPERATURE_STEP = 0.5;
const uint32_t Constants::AC_STATES_REQUEST_INTERVAL = 7000; const uint32_t Constants::AC_STATES_REQUEST_INTERVAL = 7000;
class AirCon; class AirCon;
// состояния конечного автомата компонента // состояния конечного автомата компонента
@@ -338,8 +336,6 @@ struct packet_small_info_body_t {
uint8_t target_temp_frac2; uint8_t target_temp_frac2;
}; };
//**************************************************************************************************************************************************** //****************************************************************************************************************************************************
//*************************************************** ПАРАМЕТРЫ РАБОТЫ КОНДИЦИОНЕРА ****************************************************************** //*************************************************** ПАРАМЕТРЫ РАБОТЫ КОНДИЦИОНЕРА ******************************************************************
//**************************************************************************************************************************************************** //****************************************************************************************************************************************************
@@ -347,20 +343,28 @@ struct packet_small_info_body_t {
// питание кондиционера // питание кондиционера
#define AC_POWER_MASK 0b00100000 #define AC_POWER_MASK 0b00100000
enum ac_power : uint8_t { AC_POWER_OFF = 0x00, AC_POWER_ON = 0x20, AC_POWER_UNTOUCHED = 0xFF }; enum ac_power : uint8_t { AC_POWER_OFF = 0x00,
AC_POWER_ON = 0x20,
AC_POWER_UNTOUCHED = 0xFF };
// режим очистки кондиционера, включается (или должен включаться) при AC_POWER_OFF // режим очистки кондиционера, включается (или должен включаться) при AC_POWER_OFF
#define AC_CLEAN_MASK 0b00000100 #define AC_CLEAN_MASK 0b00000100
enum ac_clean : uint8_t { AC_CLEAN_OFF = 0x00, AC_CLEAN_ON = 0x04, AC_CLEAN_UNTOUCHED = 0xFF }; enum ac_clean : uint8_t { AC_CLEAN_OFF = 0x00,
AC_CLEAN_ON = 0x04,
AC_CLEAN_UNTOUCHED = 0xFF };
// для включения ионизатора нужно установить второй бит в байте // для включения ионизатора нужно установить второй бит в байте
// по результату этот бит останется установленным, но кондиционер еще и установит первый бит // по результату этот бит останется установленным, но кондиционер еще и установит первый бит
#define AC_HEALTH_MASK 0b00000010 #define AC_HEALTH_MASK 0b00000010
enum ac_health : uint8_t { AC_HEALTH_OFF = 0x00, AC_HEALTH_ON = 0x02, AC_HEALTH_UNTOUCHED = 0xFF }; enum ac_health : uint8_t { AC_HEALTH_OFF = 0x00,
AC_HEALTH_ON = 0x02,
AC_HEALTH_UNTOUCHED = 0xFF };
// Статус ионизатора. Если бит поднят, то обнаружена ошибка ключения ионизатора // Статус ионизатора. Если бит поднят, то обнаружена ошибка ключения ионизатора
#define AC_HEALTH_STATUS_MASK 0b00000001 #define AC_HEALTH_STATUS_MASK 0b00000001
enum ac_health_status : uint8_t { AC_HEALTH_STATUS_OFF = 0x00, AC_HEALTH_STATUS_ON = 0x01, AC_HEALTH_STATUS_UNTOUCHED = 0xFF }; enum ac_health_status : uint8_t { AC_HEALTH_STATUS_OFF = 0x00,
AC_HEALTH_STATUS_ON = 0x01,
AC_HEALTH_STATUS_UNTOUCHED = 0xFF };
// целевая температура // целевая температура
#define AC_TEMP_TARGET_INT_PART_MASK 0b11111000 #define AC_TEMP_TARGET_INT_PART_MASK 0b11111000
@@ -372,18 +376,27 @@ enum ac_health_status : uint8_t { AC_HEALTH_STATUS_OFF = 0x00, AC_HEALTH_STATUS_
// включение таймера сна // включение таймера сна
#define AC_TIMER_MASK 0b01000000 #define AC_TIMER_MASK 0b01000000
enum ac_timer : uint8_t {AC_TIMER_OFF = 0x00, AC_TIMER_ON = 0x40, AC_TIMER_UNTOUCHED = 0xFF}; enum ac_timer : uint8_t { AC_TIMER_OFF = 0x00,
AC_TIMER_ON = 0x40,
AC_TIMER_UNTOUCHED = 0xFF };
// основные режимы работы кондиционера // основные режимы работы кондиционера
#define AC_MODE_MASK 0b11100000 #define AC_MODE_MASK 0b11100000
enum ac_mode : uint8_t { AC_MODE_AUTO = 0x00, AC_MODE_COOL = 0x20, AC_MODE_DRY = 0x40, AC_MODE_HEAT = 0x80, AC_MODE_FAN = 0xC0, AC_MODE_UNTOUCHED = 0xFF }; enum ac_mode : uint8_t { AC_MODE_AUTO = 0x00,
AC_MODE_COOL = 0x20,
AC_MODE_DRY = 0x40,
AC_MODE_HEAT = 0x80,
AC_MODE_FAN = 0xC0,
AC_MODE_UNTOUCHED = 0xFF };
// Ночной режим (SLEEP). Комбинируется только с режимами COOL и HEAT. Автоматически выключается через 7 часов. // Ночной режим (SLEEP). Комбинируется только с режимами COOL и HEAT. Автоматически выключается через 7 часов.
// COOL: температура +1 градус через час, еще через час дополнительные +1 градус, дальше не меняется. // COOL: температура +1 градус через час, еще через час дополнительные +1 градус, дальше не меняется.
// HEAT: температура -2 градуса через час, еще через час дополнительные -2 градуса, дальше не меняется. // HEAT: температура -2 градуса через час, еще через час дополнительные -2 градуса, дальше не меняется.
// Восстанавливается ли температура через 7 часов при отключении режима - не понятно. // Восстанавливается ли температура через 7 часов при отключении режима - не понятно.
#define AC_SLEEP_MASK 0b00000100 #define AC_SLEEP_MASK 0b00000100
enum ac_sleep : uint8_t { AC_SLEEP_OFF = 0x00, AC_SLEEP_ON = 0x04, AC_SLEEP_UNTOUCHED = 0xFF }; enum ac_sleep : uint8_t { AC_SLEEP_OFF = 0x00,
AC_SLEEP_ON = 0x04,
AC_SLEEP_UNTOUCHED = 0xFF };
// Вертикальные жалюзи. В протоколе зашита возможность двигать ими по всякому, но должна быть такая возможность на уровне железа. // Вертикальные жалюзи. В протоколе зашита возможность двигать ими по всякому, но должна быть такая возможность на уровне железа.
#define AC_LOUVERV_MASK 0b00000111 #define AC_LOUVERV_MASK 0b00000111
@@ -402,7 +415,9 @@ enum ac_louver_V : uint8_t {
// Горизонтальные жалюзи. В протоколе зашита возможность двигать ими по всякому, но должна быть такая возможность на уровне железа. // Горизонтальные жалюзи. В протоколе зашита возможность двигать ими по всякому, но должна быть такая возможность на уровне железа.
// горизонтальные жалюзи выставлять в определенное положение не вышло, протестировано. // горизонтальные жалюзи выставлять в определенное положение не вышло, протестировано.
#define AC_LOUVERH_MASK 0b11100000 #define AC_LOUVERH_MASK 0b11100000
enum ac_louver_H : uint8_t { AC_LOUVERH_SWING_LEFTRIGHT = 0x00, AC_LOUVERH_OFF = 0xE0, AC_LOUVERH_UNTOUCHED = 0xFF }; enum ac_louver_H : uint8_t { AC_LOUVERH_SWING_LEFTRIGHT = 0x00,
AC_LOUVERH_OFF = 0xE0,
AC_LOUVERH_UNTOUCHED = 0xFF };
struct ac_louver { struct ac_louver {
ac_louver_H louver_h; ac_louver_H louver_h;
@@ -411,28 +426,46 @@ struct ac_louver {
// скорость вентилятора // скорость вентилятора
#define AC_FANSPEED_MASK 0b11100000 #define AC_FANSPEED_MASK 0b11100000
enum ac_fanspeed : uint8_t { AC_FANSPEED_HIGH = 0x20, AC_FANSPEED_MEDIUM = 0x40, AC_FANSPEED_LOW = 0x60, AC_FANSPEED_AUTO = 0xA0, AC_FANSPEED_UNTOUCHED = 0xFF }; enum ac_fanspeed : uint8_t { AC_FANSPEED_HIGH = 0x20,
AC_FANSPEED_MEDIUM = 0x40,
AC_FANSPEED_LOW = 0x60,
AC_FANSPEED_AUTO = 0xA0,
AC_FANSPEED_UNTOUCHED = 0xFF };
// TURBO работает только в режимах COOL и HEAT // TURBO работает только в режимах COOL и HEAT
#define AC_FANTURBO_MASK 0b01000000 #define AC_FANTURBO_MASK 0b01000000
enum ac_fanturbo : uint8_t { AC_FANTURBO_OFF = 0x00, AC_FANTURBO_ON = 0x40, AC_FANTURBO_UNTOUCHED = 0xFF }; enum ac_fanturbo : uint8_t { AC_FANTURBO_OFF = 0x00,
AC_FANTURBO_ON = 0x40,
AC_FANTURBO_UNTOUCHED = 0xFF };
// MUTE работает только в режиме FAN. В режиме COOL кондей команду принимает, но MUTE не устанавливается // MUTE работает только в режиме FAN. В режиме COOL кондей команду принимает, но MUTE не устанавливается
#define AC_FANMUTE_MASK 0b10000000 #define AC_FANMUTE_MASK 0b10000000
enum ac_fanmute : uint8_t { AC_FANMUTE_OFF = 0x00, AC_FANMUTE_ON = 0x80, AC_FANMUTE_UNTOUCHED = 0xFF }; enum ac_fanmute : uint8_t { AC_FANMUTE_OFF = 0x00,
AC_FANMUTE_ON = 0x80,
AC_FANMUTE_UNTOUCHED = 0xFF };
// реальная скорость вентилятора // реальная скорость вентилятора
enum ac_realFan : uint8_t { AC_REAL_FAN_OFF = 0x00, AC_REAL_FAN_MUTE = 0x01, AC_REAL_FAN_LOW = 0x02, AC_REAL_FAN_MID = 0x04, AC_REAL_FAN_HIGH = 0x06, AC_REAL_FAN_TURBO = 0x07, AC_REAL_FAN_UNTOUCHED = 0xFF }; enum ac_realFan : uint8_t { AC_REAL_FAN_OFF = 0x00,
AC_REAL_FAN_MUTE = 0x01,
AC_REAL_FAN_LOW = 0x02,
AC_REAL_FAN_MID = 0x04,
AC_REAL_FAN_HIGH = 0x06,
AC_REAL_FAN_TURBO = 0x07,
AC_REAL_FAN_UNTOUCHED = 0xFF };
// включение-выключение дисплея на корпусе внутреннего блока // включение-выключение дисплея на корпусе внутреннего блока
#define AC_DISPLAY_MASK 0b00010000 #define AC_DISPLAY_MASK 0b00010000
enum ac_display : uint8_t { AC_DISPLAY_OFF = 0x00, AC_DISPLAY_ON = 0x10, AC_DISPLAY_UNTOUCHED = 0xFF }; enum ac_display : uint8_t { AC_DISPLAY_OFF = 0x00,
AC_DISPLAY_ON = 0x10,
AC_DISPLAY_UNTOUCHED = 0xFF };
// включение-выключение функции "Антиплесень". // включение-выключение функции "Антиплесень".
// По факту: после выключения сплита он оставляет минут на 5 открытые жалюзи и глушит вентилятор. Уличный блок при этом гудит и тарахтит. // По факту: после выключения сплита он оставляет минут на 5 открытые жалюзи и глушит вентилятор. Уличный блок при этом гудит и тарахтит.
// Возможно, прогревается теплообменник для высыхания. Через некоторое время внешний блок замолкает и сплит закрывает жалюзи. // Возможно, прогревается теплообменник для высыхания. Через некоторое время внешний блок замолкает и сплит закрывает жалюзи.
#define AC_MILDEW_MASK 0b00001000 #define AC_MILDEW_MASK 0b00001000
enum ac_mildew : uint8_t { AC_MILDEW_OFF = 0x00, AC_MILDEW_ON = 0x08, AC_MILDEW_UNTOUCHED = 0xFF }; enum ac_mildew : uint8_t { AC_MILDEW_OFF = 0x00,
AC_MILDEW_ON = 0x08,
AC_MILDEW_UNTOUCHED = 0xFF };
// маска счетчика минут прошедших с последней команды // маска счетчика минут прошедших с последней команды
// https://github.com/GrKoR/AUX_HVAC_Protocol#packet_cmd_11_b12 // https://github.com/GrKoR/AUX_HVAC_Protocol#packet_cmd_11_b12
@@ -450,7 +483,6 @@ enum ac_vlouver_frontend : uint8_t {
AC_VLOUVER_FRONTEND_BOTTOM = 0x06, AC_VLOUVER_FRONTEND_BOTTOM = 0x06,
}; };
/** команда для кондиционера /** команда для кондиционера
* *
* ВАЖНО! В коде используется копирование команд простым присваиванием. * ВАЖНО! В коде используется копирование команд простым присваиванием.
@@ -460,7 +492,8 @@ enum ac_vlouver_frontend : uint8_t {
//***************************************************************************** //*****************************************************************************
// структура для сохранения настроек, специально вынесено в макрос, чтобы использовать в нескольких местах // структура для сохранения настроек, специально вынесено в макрос, чтобы использовать в нескольких местах
// сделано Brokly для того, чтобы поведение wifi-модуля походило на ИК-пульт (для каждого режима сохранялись свои настройки температуры и прочего) // сделано Brokly для того, чтобы поведение wifi-модуля походило на ИК-пульт (для каждого режима сохранялись свои настройки температуры и прочего)
#define AC_COMMAND_BASE float temp_target;\ #define AC_COMMAND_BASE \
float temp_target; \
ac_power power; \ ac_power power; \
ac_clean clean; \ ac_clean clean; \
ac_health health; \ ac_health health; \
@@ -518,9 +551,6 @@ typedef ac_command_t ac_state_t; // текущее состояние пара
//************************************************ КОНЕЦ ПАРАМЕТРОВ РАБОТЫ КОНДИЦИОНЕРА ************************************************************** //************************************************ КОНЕЦ ПАРАМЕТРОВ РАБОТЫ КОНДИЦИОНЕРА **************************************************************
//**************************************************************************************************************************************************** //****************************************************************************************************************************************************
/***************************************************************************************************************************************************** /*****************************************************************************************************************************************************
* структуры и типы для последовательности команд * структуры и типы для последовательности команд
***************************************************************************************************************************************************** *****************************************************************************************************************************************************
@@ -579,10 +609,8 @@ struct sequence_item_t {
}; };
/*****************************************************************************************************************************************************/ /*****************************************************************************************************************************************************/
class AirCon : public esphome::Component, public esphome::climate::Climate { class AirCon : public esphome::Component, public esphome::climate::Climate {
private: private:
#if defined(PRESETS_SAVING) #if defined(PRESETS_SAVING)
// массив для сохранения данных глобальных персетов // массив для сохранения данных глобальных персетов
ac_save_command_t global_presets[POS_MODE_OFF + 1]; ac_save_command_t global_presets[POS_MODE_OFF + 1];
@@ -970,8 +998,7 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
_setStateMachineState(ACSM_RECEIVING_PACKET); _setStateMachineState(ACSM_RECEIVING_PACKET);
} else { } else {
while (_ac_serial->available() > 0) while (_ac_serial->available() > 0) {
{
// если наткнулись на старт пакета, то выходим из while // если наткнулись на старт пакета, то выходим из while
// если какие-то данные были загружены в буфер, то они будут выгружены в лог при загрузке нового пакета // если какие-то данные были загружены в буфер, то они будут выгружены в лог при загрузке нового пакета
if (this->peek() == AC_PACKET_START_BYTE) break; if (this->peek() == AC_PACKET_START_BYTE) break;
@@ -1393,7 +1420,6 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
if (line == 0) line = __LINE__; if (line == 0) line = __LINE__;
_debugMsg(st, dbgLevel, line); _debugMsg(st, dbgLevel, line);
#endif #endif
} }
/** расчет CRC16 для блока данных data длиной len /** расчет CRC16 для блока данных data длиной len
@@ -1614,8 +1640,6 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
pack->body[12] = (pack->body[12] & ~AC_MILDEW_MASK) | cmd->mildew; pack->body[12] = (pack->body[12] & ~AC_MILDEW_MASK) | cmd->mildew;
} }
// рассчитываем и записываем в пакет CRC // рассчитываем и записываем в пакет CRC
pack->crc = (packet_crc_t *)&(pack->data[AC_HEADER_SIZE + pack->header->body_length]); pack->crc = (packet_crc_t *)&(pack->data[AC_HEADER_SIZE + pack->header->body_length]);
_setCRC16(pack); _setCRC16(pack);
@@ -1810,7 +1834,6 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
esphome::binary_sensor::BinarySensor *sensor_defrost_ = nullptr; esphome::binary_sensor::BinarySensor *sensor_defrost_ = nullptr;
esphome::text_sensor::TextSensor *sensor_preset_reporter_ = nullptr; esphome::text_sensor::TextSensor *sensor_preset_reporter_ = nullptr;
// загружает на выполнение последовательность команд на включение/выключение табло с температурой // загружает на выполнение последовательность команд на включение/выключение табло с температурой
bool _displaySequence(ac_display dsp = AC_DISPLAY_ON) { bool _displaySequence(ac_display dsp = AC_DISPLAY_ON) {
// нет смысла в последовательности, если нет коннекта с кондиционером // нет смысла в последовательности, если нет коннекта с кондиционером
@@ -1868,7 +1891,7 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
uint8_t num_preset = get_num_preset(cmd); uint8_t num_preset = get_num_preset(cmd);
if (memcmp(cmd, &(global_presets[num_preset]), AC_COMMAND_BASE_SIZE) != 0) { // содержимое пресетов разное if (memcmp(cmd, &(global_presets[num_preset]), AC_COMMAND_BASE_SIZE) != 0) { // содержимое пресетов разное
memcpy(&(global_presets[num_preset]), cmd, AC_COMMAND_BASE_SIZE); // копируем пресет в массив memcpy(&(global_presets[num_preset]), cmd, AC_COMMAND_BASE_SIZE); // копируем пресет в массив
#if defined(PRESETS_SAVING)
_debugMsg(F("Save preset %02d to NVRAM."), ESPHOME_LOG_LEVEL_WARN, __LINE__, num_preset); _debugMsg(F("Save preset %02d to NVRAM."), ESPHOME_LOG_LEVEL_WARN, __LINE__, num_preset);
if (storage.save(global_presets)) { if (storage.save(global_presets)) {
if (!global_preferences->sync()) // сохраняем все пресеты if (!global_preferences->sync()) // сохраняем все пресеты
@@ -1876,7 +1899,6 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
} else { } else {
_debugMsg(F("Save presets to flash ERROR ! (load result: %02d)"), ESPHOME_LOG_LEVEL_ERROR, __LINE__, load_presets_result); _debugMsg(F("Save presets to flash ERROR ! (load result: %02d)"), ESPHOME_LOG_LEVEL_ERROR, __LINE__, load_presets_result);
} }
#endif
} else { } else {
_debugMsg(F("Preset %02d has not been changed, Saving canceled."), ESPHOME_LOG_LEVEL_WARN, __LINE__, num_preset); _debugMsg(F("Preset %02d has not been changed, Saving canceled."), ESPHOME_LOG_LEVEL_WARN, __LINE__, num_preset);
} }
@@ -2016,7 +2038,6 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
_debugMsg(F("Action mode: %i"), ESPHOME_LOG_LEVEL_VERBOSE, __LINE__, this->action); _debugMsg(F("Action mode: %i"), ESPHOME_LOG_LEVEL_VERBOSE, __LINE__, this->action);
/*************************** POWER & MODE ***************************/ /*************************** POWER & MODE ***************************/
if (_current_ac_state.power == AC_POWER_ON) { if (_current_ac_state.power == AC_POWER_ON) {
switch (_current_ac_state.mode) { switch (_current_ac_state.mode) {
@@ -2118,15 +2139,12 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
// режим работы ионизатора // режим работы ионизатора
if (_current_ac_state.health == AC_HEALTH_ON && if (_current_ac_state.health == AC_HEALTH_ON &&
_current_ac_state.power == AC_POWER_ON) { _current_ac_state.power == AC_POWER_ON) {
this->custom_preset = Constants::HEALTH; this->custom_preset = Constants::HEALTH;
} else if (this->custom_preset == Constants::HEALTH) { } else if (this->custom_preset == Constants::HEALTH) {
// AC_HEALTH_OFF // AC_HEALTH_OFF
// только в том случае, если до этого пресет был установлен // только в том случае, если до этого пресет был установлен
this->custom_preset = (std::string) ""; this->custom_preset = (std::string) "";
} }
_debugMsg(F("Climate HEALTH preset: %i"), ESPHOME_LOG_LEVEL_VERBOSE, __LINE__, _current_ac_state.health); _debugMsg(F("Climate HEALTH preset: %i"), ESPHOME_LOG_LEVEL_VERBOSE, __LINE__, _current_ac_state.health);
@@ -2138,15 +2156,12 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
// Восстанавливается ли температура через 7 часов при отключении режима - не понятно. // Восстанавливается ли температура через 7 часов при отключении режима - не понятно.
if (_current_ac_state.sleep == AC_SLEEP_ON && if (_current_ac_state.sleep == AC_SLEEP_ON &&
_current_ac_state.power == AC_POWER_ON) { _current_ac_state.power == AC_POWER_ON) {
this->preset = climate::CLIMATE_PRESET_SLEEP; this->preset = climate::CLIMATE_PRESET_SLEEP;
} else if (this->preset == climate::CLIMATE_PRESET_SLEEP) { } else if (this->preset == climate::CLIMATE_PRESET_SLEEP) {
// AC_SLEEP_OFF // AC_SLEEP_OFF
// только в том случае, если до этого пресет был установлен // только в том случае, если до этого пресет был установлен
this->preset = climate::CLIMATE_PRESET_NONE; this->preset = climate::CLIMATE_PRESET_NONE;
} }
_debugMsg(F("Climate preset: %i"), ESPHOME_LOG_LEVEL_VERBOSE, __LINE__, this->preset); _debugMsg(F("Climate preset: %i"), ESPHOME_LOG_LEVEL_VERBOSE, __LINE__, this->preset);
@@ -2155,15 +2170,12 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
// режим очистки кондиционера, включается (или должен включаться) при AC_POWER_OFF // режим очистки кондиционера, включается (или должен включаться) при AC_POWER_OFF
if (_current_ac_state.clean == AC_CLEAN_ON && if (_current_ac_state.clean == AC_CLEAN_ON &&
_current_ac_state.power == AC_POWER_OFF) { _current_ac_state.power == AC_POWER_OFF) {
this->custom_preset = Constants::CLEAN; this->custom_preset = Constants::CLEAN;
} else if (this->custom_preset == Constants::CLEAN) { } else if (this->custom_preset == Constants::CLEAN) {
// AC_CLEAN_OFF // AC_CLEAN_OFF
// только в том случае, если до этого пресет был установлен // только в том случае, если до этого пресет был установлен
this->custom_preset = (std::string) ""; this->custom_preset = (std::string) "";
} }
_debugMsg(F("Climate CLEAN preset: %i"), ESPHOME_LOG_LEVEL_VERBOSE, __LINE__, _current_ac_state.clean); _debugMsg(F("Climate CLEAN preset: %i"), ESPHOME_LOG_LEVEL_VERBOSE, __LINE__, _current_ac_state.clean);
@@ -2197,7 +2209,6 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
_debugMsg(F("Climate ANTIFUNGUS preset: %i"), ESPHOME_LOG_LEVEL_VERBOSE, __LINE__, _current_ac_state.mildew); _debugMsg(F("Climate ANTIFUNGUS preset: %i"), ESPHOME_LOG_LEVEL_VERBOSE, __LINE__, _current_ac_state.mildew);
/*************************** LOUVERs ***************************/ /*************************** LOUVERs ***************************/
this->swing_mode = climate::CLIMATE_SWING_OFF; this->swing_mode = climate::CLIMATE_SWING_OFF;
if (_current_ac_state.power == AC_POWER_ON) { if (_current_ac_state.power == AC_POWER_ON) {
@@ -2219,7 +2230,6 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
this->current_temperature = _current_ac_state.temp_ambient; this->current_temperature = _current_ac_state.temp_ambient;
_debugMsg(F("Room temperature: %f"), ESPHOME_LOG_LEVEL_VERBOSE, __LINE__, this->current_temperature); _debugMsg(F("Room temperature: %f"), ESPHOME_LOG_LEVEL_VERBOSE, __LINE__, this->current_temperature);
/*********************************************************************/ /*********************************************************************/
/*************************** PUBLISH STATE ***************************/ /*************************** PUBLISH STATE ***************************/
/*********************************************************************/ /*********************************************************************/
@@ -2317,7 +2327,6 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
LOG_BINARY_SENSOR(" ", "Display", this->sensor_display_); LOG_BINARY_SENSOR(" ", "Display", this->sensor_display_);
LOG_TEXT_SENSOR(" ", "Preset Reporter", this->sensor_preset_reporter_); LOG_TEXT_SENSOR(" ", "Preset Reporter", this->sensor_preset_reporter_);
this->dump_traits_(TAG); this->dump_traits_(TAG);
} }
// вызывается пользователем из интерфейса ESPHome или Home Assistant // вызывается пользователем из интерфейса ESPHome или Home Assistant
@@ -2411,7 +2420,6 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
default: default:
break; break;
} }
} }
// User requested fan_mode change // User requested fan_mode change
@@ -2512,15 +2520,7 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
// COOL: температура +1 градус через час, еще через час дополнительные +1 градус, дальше не меняется. // COOL: температура +1 градус через час, еще через час дополнительные +1 градус, дальше не меняется.
// HEAT: температура -2 градуса через час, еще через час дополнительные -2 градуса, дальше не меняется. // HEAT: температура -2 градуса через час, еще через час дополнительные -2 градуса, дальше не меняется.
// Восстанавливается ли температура через 7 часов при отключении режима - не понятно. // Восстанавливается ли температура через 7 часов при отключении режима - не понятно.
if ( cmd.mode == AC_MODE_COOL if (cmd.mode == AC_MODE_COOL or cmd.mode == AC_MODE_HEAT or cmd.mode == AC_MODE_DRY or cmd.mode == AC_MODE_AUTO or _current_ac_state.mode == AC_MODE_COOL or _current_ac_state.mode == AC_MODE_HEAT or _current_ac_state.mode == AC_MODE_DRY or _current_ac_state.mode == AC_MODE_AUTO) {
or cmd.mode == AC_MODE_HEAT
or cmd.mode == AC_MODE_DRY
or cmd.mode == AC_MODE_AUTO
or _current_ac_state.mode == AC_MODE_COOL
or _current_ac_state.mode == AC_MODE_HEAT
or _current_ac_state.mode == AC_MODE_DRY
or _current_ac_state.mode == AC_MODE_AUTO) {
hasCommand = true; hasCommand = true;
cmd.sleep = AC_SLEEP_ON; cmd.sleep = AC_SLEEP_ON;
cmd.health = AC_HEALTH_OFF; // для логики пресетов cmd.health = AC_HEALTH_OFF; // для логики пресетов
@@ -2555,9 +2555,7 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
if (custom_preset == Constants::CLEAN) { if (custom_preset == Constants::CLEAN) {
// режим очистки кондиционера, включается (или должен включаться) при AC_POWER_OFF // режим очистки кондиционера, включается (или должен включаться) при AC_POWER_OFF
// TODO: надо отдебажить выключение этого режима // TODO: надо отдебажить выключение этого режима
if ( cmd.power == AC_POWER_OFF if (cmd.power == AC_POWER_OFF or _current_ac_state.power == AC_POWER_OFF) {
or _current_ac_state.power == AC_POWER_OFF) {
hasCommand = true; hasCommand = true;
cmd.clean = AC_CLEAN_ON; cmd.clean = AC_CLEAN_ON;
cmd.mildew = AC_MILDEW_OFF; // для логики пресетов cmd.mildew = AC_MILDEW_OFF; // для логики пресетов
@@ -2568,10 +2566,8 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
} }
} else if (custom_preset == Constants::HEALTH) { } else if (custom_preset == Constants::HEALTH) {
if (cmd.power == AC_POWER_ON || if (cmd.power == AC_POWER_ON ||
_current_ac_state.power == AC_POWER_ON) { _current_ac_state.power == AC_POWER_ON) {
hasCommand = true; hasCommand = true;
cmd.health = AC_HEALTH_ON; cmd.health = AC_HEALTH_ON;
// cmd.health_status = AC_HEALTH_STATUS_ON; // GK: статус кондей сам поднимает // cmd.health_status = AC_HEALTH_STATUS_ON; // GK: статус кондей сам поднимает
@@ -2585,14 +2581,11 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
_current_ac_state.mode == AC_MODE_COOL || _current_ac_state.mode == AC_MODE_COOL ||
_current_ac_state.mode == AC_MODE_HEAT || _current_ac_state.mode == AC_MODE_HEAT ||
_current_ac_state.mode == AC_MODE_AUTO) { _current_ac_state.mode == AC_MODE_AUTO) {
cmd.fanSpeed = AC_FANSPEED_AUTO; // зависимость от health cmd.fanSpeed = AC_FANSPEED_AUTO; // зависимость от health
} else if (cmd.mode == AC_MODE_FAN || } else if (cmd.mode == AC_MODE_FAN ||
_current_ac_state.mode == AC_MODE_FAN) { _current_ac_state.mode == AC_MODE_FAN) {
cmd.fanSpeed = AC_FANSPEED_MEDIUM; // зависимость от health cmd.fanSpeed = AC_FANSPEED_MEDIUM; // зависимость от health
} }
this->custom_preset = custom_preset; this->custom_preset = custom_preset;
@@ -2657,7 +2650,6 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
this->swing_mode = swingmode; this->swing_mode = swingmode;
break; break;
} }
} }
// User requested target temperature change // User requested target temperature change
@@ -2968,7 +2960,7 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
default: default:
_debugMsg(F("AUXvlouverToVlouverFrontend: unknown vertical louver state = %u"), ESPHOME_LOG_LEVEL_DEBUG, __LINE__, _current_ac_state.louver.louver_v); _debugMsg(F("AUXvlouverToVlouverFrontend: unknown vertical louver state = %u"), ESPHOME_LOG_LEVEL_DEBUG, __LINE__, _current_ac_state.louver.louver_v);
return AC_VLOUVER_FRONTEND_STOP; // return AC_VLOUVER_FRONTEND_STOP;
} }
} }
@@ -3003,7 +2995,7 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
default: default:
_debugMsg(F("vlouverFrontendToAUXvlouver: unknown vertical louver state = %u"), ESPHOME_LOG_LEVEL_DEBUG, __LINE__, _current_ac_state.louver.louver_v); _debugMsg(F("vlouverFrontendToAUXvlouver: unknown vertical louver state = %u"), ESPHOME_LOG_LEVEL_DEBUG, __LINE__, _current_ac_state.louver.louver_v);
return AC_LOUVERV_OFF; // return AC_LOUVERV_OFF;
} }
} }
@@ -3071,12 +3063,10 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
#if defined(PRESETS_SAVING) #if defined(PRESETS_SAVING)
void set_store_settings(bool store_settings) { this->_store_settings = store_settings; } void set_store_settings(bool store_settings) { this->_store_settings = store_settings; }
bool get_store_settings() { return this->_store_settings; } bool get_store_settings() { return this->_store_settings; }
uint8_t load_presets_result = 0xFF; uint8_t load_presets_result = 0xFF;
#endif #endif
void setup() override { void setup() override {
#if defined(PRESETS_SAVING) #if defined(PRESETS_SAVING)
load_presets_result = storage.load(global_presets); // читаем все пресеты из флеша load_presets_result = storage.load(global_presets); // читаем все пресеты из флеша
_debugMsg(F("Preset base read from NVRAM, result %02d."), ESPHOME_LOG_LEVEL_WARN, __LINE__, load_presets_result); _debugMsg(F("Preset base read from NVRAM, result %02d."), ESPHOME_LOG_LEVEL_WARN, __LINE__, load_presets_result);
@@ -3116,7 +3106,6 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
// if the climate device supports reporting the active current action of the device with the action property. // if the climate device supports reporting the active current action of the device with the action property.
_traits.set_supports_action(this->_show_action); _traits.set_supports_action(this->_show_action);
}; };
void loop() override { void loop() override {
@@ -3162,7 +3151,6 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
// делаем этот запрос только в случае, если есть коннект с кондиционером // делаем этот запрос только в случае, если есть коннект с кондиционером
if (get_has_connection()) getStatusBigAndSmall(); if (get_has_connection()) getStatusBigAndSmall();
} }
}; };
}; };