mirror of
https://github.com/GrKoR/esphome_aux_ac_component.git
synced 2025-12-12 14:37:11 +03:00
new actions: set vertical louver position
This commit is contained in:
@@ -7,6 +7,7 @@
|
|||||||
namespace esphome {
|
namespace esphome {
|
||||||
namespace aux_ac {
|
namespace aux_ac {
|
||||||
|
|
||||||
|
// **************************************** DISPLAY ACTIONS ****************************************
|
||||||
template <typename... Ts>
|
template <typename... Ts>
|
||||||
class AirConDisplayOffAction : public Action<Ts...>
|
class AirConDisplayOffAction : public Action<Ts...>
|
||||||
{
|
{
|
||||||
@@ -31,6 +32,96 @@ namespace aux_ac {
|
|||||||
AirCon *ac_;
|
AirCon *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(); }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
AirCon *ac_;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename... Ts>
|
||||||
|
class AirConVLouverStopAction : public Action<Ts...>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit AirConVLouverStopAction(AirCon *ac) : ac_(ac) {}
|
||||||
|
|
||||||
|
void play(Ts... x) override { this->ac_->setVLouverStopSequence(); }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
AirCon *ac_;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename... Ts>
|
||||||
|
class AirConVLouverTopAction : public Action<Ts...>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit AirConVLouverTopAction(AirCon *ac) : ac_(ac) {}
|
||||||
|
|
||||||
|
void play(Ts... x) override { this->ac_->setVLouverTopSequence(); }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
AirCon *ac_;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename... Ts>
|
||||||
|
class AirConVLouverMiddleAboveAction : public Action<Ts...>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit AirConVLouverMiddleAboveAction(AirCon *ac) : ac_(ac) {}
|
||||||
|
|
||||||
|
void play(Ts... x) override { this->ac_->setVLouverMiddleAboveSequence(); }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
AirCon *ac_;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename... Ts>
|
||||||
|
class AirConVLouverMiddleAction : public Action<Ts...>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit AirConVLouverMiddleAction(AirCon *ac) : ac_(ac) {}
|
||||||
|
|
||||||
|
void play(Ts... x) override { this->ac_->setVLouverMiddleSequence(); }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
AirCon *ac_;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename... Ts>
|
||||||
|
class AirConVLouverMiddleBelowAction : public Action<Ts...>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit AirConVLouverMiddleBelowAction(AirCon *ac) : ac_(ac) {}
|
||||||
|
|
||||||
|
void play(Ts... x) override { this->ac_->setVLouverMiddleBelowSequence(); }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
AirCon *ac_;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename... Ts>
|
||||||
|
class AirConVLouverBottomAction : public Action<Ts...>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit AirConVLouverBottomAction(AirCon *ac) : ac_(ac) {}
|
||||||
|
|
||||||
|
void play(Ts... x) override { this->ac_->setVLouverBottomSequence(); }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
AirCon *ac_;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// **************************************** SEND TEST PACKET ACTION ****************************************
|
||||||
template <typename... Ts>
|
template <typename... Ts>
|
||||||
class AirConSendTestPacketAction : public Action<Ts...>
|
class AirConSendTestPacketAction : public Action<Ts...>
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -391,7 +391,16 @@ enum ac_sleep : uint8_t { AC_SLEEP_OFF = 0x00, AC_SLEEP_ON = 0x04, AC_SLEEP_UNTO
|
|||||||
// Вертикальные жалюзи. В протоколе зашита возможность двигать ими по всякому, но должна быть такая возможность на уровне железа.
|
// Вертикальные жалюзи. В протоколе зашита возможность двигать ими по всякому, но должна быть такая возможность на уровне железа.
|
||||||
// TODO: надо протестировать значения 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 для ac_louver_V
|
// TODO: надо протестировать значения 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 для ac_louver_V
|
||||||
#define AC_LOUVERV_MASK 0b00000111
|
#define AC_LOUVERV_MASK 0b00000111
|
||||||
enum ac_louver_V : uint8_t { AC_LOUVERV_SWING_UPDOWN = 0x00, AC_LOUVERV_OFF = 0x07, AC_LOUVERV_UNTOUCHED = 0xFF };
|
enum ac_louver_V : uint8_t {
|
||||||
|
AC_LOUVERV_SWING_UPDOWN = 0x00,
|
||||||
|
AC_LOUVERV_SWING_TOP = 0x01,
|
||||||
|
AC_LOUVERV_SWING_MIDDLE_ABOVE = 0x02,
|
||||||
|
AC_LOUVERV_SWING_MIDDLE = 0x03,
|
||||||
|
AC_LOUVERV_SWING_MIDDLE_BELOW = 0x04,
|
||||||
|
AC_LOUVERV_SWING_BOTTOM = 0x05,
|
||||||
|
AC_LOUVERV_OFF = 0x07,
|
||||||
|
AC_LOUVERV_UNTOUCHED = 0xFF
|
||||||
|
};
|
||||||
|
|
||||||
// Горизонтальные жалюзи. В протоколе зашита возможность двигать ими по всякому, но должна быть такая возможность на уровне железа.
|
// Горизонтальные жалюзи. В протоколе зашита возможность двигать ими по всякому, но должна быть такая возможность на уровне железа.
|
||||||
// TODO: надо протестировать значения 0x20, 0x40, 0x60, 0x80, 0xA0, 0xC0 для ac_louver_H
|
// TODO: надо протестировать значения 0x20, 0x40, 0x60, 0x80, 0xA0, 0xC0 для ac_louver_H
|
||||||
@@ -2945,12 +2954,12 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
|
|||||||
|
|
||||||
/*************************************** set params request ***********************************************/
|
/*************************************** set params request ***********************************************/
|
||||||
if (!_addSequenceFuncStep(&AirCon::sq_requestDoCommand, cmd)) {
|
if (!_addSequenceFuncStep(&AirCon::sq_requestDoCommand, cmd)) {
|
||||||
_debugMsg(F("commandSequence: getBigInfo request sequence step fail."), ESPHOME_LOG_LEVEL_WARN, __LINE__);
|
_debugMsg(F("commandSequence: request sequence step fail."), ESPHOME_LOG_LEVEL_WARN, __LINE__);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
/*************************************** set params control ***********************************************/
|
/*************************************** set params control ***********************************************/
|
||||||
if (!_addSequenceFuncStep(&AirCon::sq_controlDoCommand)) {
|
if (!_addSequenceFuncStep(&AirCon::sq_controlDoCommand)) {
|
||||||
_debugMsg(F("commandSequence: getBigInfo control sequence step fail."), ESPHOME_LOG_LEVEL_WARN, __LINE__);
|
_debugMsg(F("commandSequence: control sequence step fail."), ESPHOME_LOG_LEVEL_WARN, __LINE__);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
/**************************************************************************************/
|
/**************************************************************************************/
|
||||||
@@ -3070,6 +3079,37 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// устанавливает жалюзи в нужное положение
|
||||||
|
bool setVLouverSequence(const ac_louver_V vLouver){
|
||||||
|
// нет смысла в последовательности, если нет коннекта с кондиционером
|
||||||
|
if (!get_has_connection()) {
|
||||||
|
_debugMsg(F("setVLouverSequence: no pings from HVAC. It seems like no AC connected."), ESPHOME_LOG_LEVEL_ERROR, __LINE__);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (vLouver == AC_LOUVERV_UNTOUCHED) return false; // выходим, чтобы не тратить время
|
||||||
|
|
||||||
|
if ((vLouver > AC_LOUVERV_OFF) || (vLouver == 0x06)) return false; // нет таких команд
|
||||||
|
|
||||||
|
// формируем команду
|
||||||
|
ac_command_t cmd;
|
||||||
|
_clearCommand(&cmd); // не забываем очищать, а то будет мусор
|
||||||
|
cmd.louver.louver_v = vLouver;
|
||||||
|
// добавляем команду в последовательность
|
||||||
|
if (!commandSequence(&cmd)) return false;
|
||||||
|
|
||||||
|
_debugMsg(F("setVLouverSequence: loaded (power = %02X)"), ESPHOME_LOG_LEVEL_VERBOSE, __LINE__, vLouver);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// установка жалюзи в определенные положения
|
||||||
|
bool setVLouverSwingSequence() { return setVLouverSequence(AC_LOUVERV_SWING_UPDOWN); }
|
||||||
|
bool setVLouverStopSequence() { return setVLouverSequence(AC_LOUVERV_OFF); }
|
||||||
|
bool setVLouverTopSequence() { return setVLouverSequence(AC_LOUVERV_SWING_TOP); }
|
||||||
|
bool setVLouverMiddleAboveSequence() { return setVLouverSequence(AC_LOUVERV_SWING_MIDDLE_ABOVE); }
|
||||||
|
bool setVLouverMiddleSequence() { return setVLouverSequence(AC_LOUVERV_SWING_MIDDLE); }
|
||||||
|
bool setVLouverMiddleBelowSequence() { return setVLouverSequence(AC_LOUVERV_SWING_MIDDLE_BELOW); }
|
||||||
|
bool setVLouverBottomSequence() { return setVLouverSequence(AC_LOUVERV_SWING_BOTTOM); }
|
||||||
|
|
||||||
void set_period(uint32_t ms) { this->_update_period = ms; }
|
void set_period(uint32_t ms) { this->_update_period = ms; }
|
||||||
uint32_t get_period() { return this->_update_period; }
|
uint32_t get_period() { return this->_update_period; }
|
||||||
|
|
||||||
|
|||||||
@@ -65,6 +65,13 @@ Capabilities = aux_ac_ns.namespace("Constants")
|
|||||||
|
|
||||||
AirConDisplayOffAction = aux_ac_ns.class_("AirConDisplayOffAction", automation.Action)
|
AirConDisplayOffAction = aux_ac_ns.class_("AirConDisplayOffAction", automation.Action)
|
||||||
AirConDisplayOnAction = aux_ac_ns.class_("AirConDisplayOnAction", automation.Action)
|
AirConDisplayOnAction = aux_ac_ns.class_("AirConDisplayOnAction", automation.Action)
|
||||||
|
AirConVLouverSwingAction = aux_ac_ns.class_("AirConVLouverSwingAction", automation.Action)
|
||||||
|
AirConVLouverStopAction = aux_ac_ns.class_("AirConVLouverStopAction", automation.Action)
|
||||||
|
AirConVLouverTopAction = aux_ac_ns.class_("AirConVLouverTopAction", automation.Action)
|
||||||
|
AirConVLouverMiddleAboveAction = aux_ac_ns.class_("AirConVLouverMiddleAboveAction", automation.Action)
|
||||||
|
AirConVLouverMiddleAction = aux_ac_ns.class_("AirConVLouverMiddleAction", automation.Action)
|
||||||
|
AirConVLouverMiddleBelowAction = aux_ac_ns.class_("AirConVLouverMiddleBelowAction", automation.Action)
|
||||||
|
AirConVLouverBottomAction = aux_ac_ns.class_("AirConVLouverBottomAction", automation.Action)
|
||||||
AirConSendTestPacketAction = aux_ac_ns.class_("AirConSendTestPacketAction", automation.Action)
|
AirConSendTestPacketAction = aux_ac_ns.class_("AirConSendTestPacketAction", automation.Action)
|
||||||
|
|
||||||
ALLOWED_CLIMATE_MODES = {
|
ALLOWED_CLIMATE_MODES = {
|
||||||
@@ -121,7 +128,6 @@ CONFIG_SCHEMA = cv.All(
|
|||||||
cv.Optional(CONF_PERIOD, default="7s"): cv.time_period,
|
cv.Optional(CONF_PERIOD, default="7s"): cv.time_period,
|
||||||
cv.Optional(CONF_SHOW_ACTION, default="true"): cv.boolean,
|
cv.Optional(CONF_SHOW_ACTION, default="true"): cv.boolean,
|
||||||
cv.Optional(CONF_DISPLAY_INVERTED, default="false"): cv.boolean,
|
cv.Optional(CONF_DISPLAY_INVERTED, default="false"): cv.boolean,
|
||||||
cv.Optional(CONF_DEFROST_STATE, default="false"): cv.boolean,
|
|
||||||
cv.Optional(CONF_INVERTOR_POWER): sensor.sensor_schema(
|
cv.Optional(CONF_INVERTOR_POWER): sensor.sensor_schema(
|
||||||
unit_of_measurement=UNIT_PERCENT,
|
unit_of_measurement=UNIT_PERCENT,
|
||||||
icon=ICON_POWER,
|
icon=ICON_POWER,
|
||||||
@@ -188,32 +194,27 @@ CONFIG_SCHEMA = cv.All(
|
|||||||
cv.Optional(CONF_INTERNAL, default="true"): cv.boolean,
|
cv.Optional(CONF_INTERNAL, default="true"): cv.boolean,
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
|
|
||||||
cv.Optional(CONF_DISPLAY_STATE): binary_sensor.binary_sensor_schema(
|
cv.Optional(CONF_DISPLAY_STATE): binary_sensor.binary_sensor_schema(
|
||||||
icon=ICON_DISPLAY
|
icon=ICON_DISPLAY,
|
||||||
).extend(
|
).extend(
|
||||||
{
|
{
|
||||||
cv.Optional(CONF_INTERNAL, default="true"): cv.boolean
|
cv.Optional(CONF_INTERNAL, default="true"): cv.boolean,
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
|
|
||||||
cv.Optional(CONF_DEFROST_STATE): binary_sensor.binary_sensor_schema(
|
cv.Optional(CONF_DEFROST_STATE): binary_sensor.binary_sensor_schema(
|
||||||
icon=ICON_DEFROST
|
icon=ICON_DEFROST,
|
||||||
).extend(
|
).extend(
|
||||||
{
|
{
|
||||||
cv.Optional(CONF_INTERNAL, default="true"): cv.boolean
|
cv.Optional(CONF_INTERNAL, default="true"): cv.boolean,
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
|
|
||||||
cv.Optional(CONF_PRESET_REPORTER): text_sensor.text_sensor_schema(
|
cv.Optional(CONF_PRESET_REPORTER): text_sensor.text_sensor_schema(
|
||||||
icon=ICON_PRESET_REPORTER
|
icon=ICON_PRESET_REPORTER,
|
||||||
).extend(
|
).extend(
|
||||||
{
|
{
|
||||||
cv.Optional(CONF_INTERNAL, default="true"): cv.boolean
|
cv.Optional(CONF_INTERNAL, default="true"): cv.boolean,
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
|
|
||||||
|
|
||||||
cv.Optional(CONF_SUPPORTED_MODES): cv.ensure_list(validate_modes),
|
cv.Optional(CONF_SUPPORTED_MODES): cv.ensure_list(validate_modes),
|
||||||
cv.Optional(CONF_SUPPORTED_SWING_MODES): cv.ensure_list(validate_swing_modes),
|
cv.Optional(CONF_SUPPORTED_SWING_MODES): cv.ensure_list(validate_swing_modes),
|
||||||
cv.Optional(CONF_SUPPORTED_PRESETS): cv.ensure_list(validate_presets),
|
cv.Optional(CONF_SUPPORTED_PRESETS): cv.ensure_list(validate_presets),
|
||||||
@@ -265,7 +266,7 @@ async def to_code(config):
|
|||||||
conf = config[CONF_DISPLAY_STATE]
|
conf = config[CONF_DISPLAY_STATE]
|
||||||
sens = await binary_sensor.new_binary_sensor(conf)
|
sens = await binary_sensor.new_binary_sensor(conf)
|
||||||
cg.add(var.set_display_sensor(sens))
|
cg.add(var.set_display_sensor(sens))
|
||||||
|
|
||||||
if CONF_DEFROST_STATE in config:
|
if CONF_DEFROST_STATE in config:
|
||||||
conf = config[CONF_DEFROST_STATE]
|
conf = config[CONF_DEFROST_STATE]
|
||||||
sens = await binary_sensor.new_binary_sensor(conf)
|
sens = await binary_sensor.new_binary_sensor(conf)
|
||||||
@@ -314,13 +315,48 @@ async def display_on_to_code(config, action_id, template_arg, args):
|
|||||||
return cg.new_Pvariable(action_id, template_arg, paren)
|
return cg.new_Pvariable(action_id, template_arg, paren)
|
||||||
|
|
||||||
|
|
||||||
SEND_TEST_PACKET_ACTION_SCHEMA = maybe_simple_id(
|
VLOUVER_ACTION_SCHEMA = maybe_simple_id(
|
||||||
{
|
{
|
||||||
cv.Required(CONF_ID): cv.use_id(AirCon),
|
cv.Required(CONF_ID): cv.use_id(AirCon),
|
||||||
cv.Required(CONF_DATA): cv.templatable(validate_raw_data),
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@automation.register_action("aux_ac.vlouver_stop", AirConVLouverStopAction, VLOUVER_ACTION_SCHEMA)
|
||||||
|
async def vlouver_stop_to_code(config, action_id, template_arg, args):
|
||||||
|
paren = await cg.get_variable(config[CONF_ID])
|
||||||
|
return cg.new_Pvariable(action_id, template_arg, paren)
|
||||||
|
|
||||||
|
@automation.register_action("aux_ac.vlouver_swing", AirConVLouverSwingAction, VLOUVER_ACTION_SCHEMA)
|
||||||
|
async def vlouver_swing_to_code(config, action_id, template_arg, args):
|
||||||
|
paren = await cg.get_variable(config[CONF_ID])
|
||||||
|
return cg.new_Pvariable(action_id, template_arg, paren)
|
||||||
|
|
||||||
|
|
||||||
|
@automation.register_action("aux_ac.vlouver_top", AirConVLouverTopAction, VLOUVER_ACTION_SCHEMA)
|
||||||
|
async def vlouver_top_to_code(config, action_id, template_arg, args):
|
||||||
|
paren = await cg.get_variable(config[CONF_ID])
|
||||||
|
return cg.new_Pvariable(action_id, template_arg, paren)
|
||||||
|
|
||||||
|
@automation.register_action("aux_ac.vlouver_middle_above", AirConVLouverMiddleAboveAction, VLOUVER_ACTION_SCHEMA)
|
||||||
|
async def vlouver_middle_above_to_code(config, action_id, template_arg, args):
|
||||||
|
paren = await cg.get_variable(config[CONF_ID])
|
||||||
|
return cg.new_Pvariable(action_id, template_arg, paren)
|
||||||
|
|
||||||
|
@automation.register_action("aux_ac.vlouver_middle", AirConVLouverMiddleAction, VLOUVER_ACTION_SCHEMA)
|
||||||
|
async def vlouver_middle_to_code(config, action_id, template_arg, args):
|
||||||
|
paren = await cg.get_variable(config[CONF_ID])
|
||||||
|
return cg.new_Pvariable(action_id, template_arg, paren)
|
||||||
|
|
||||||
|
@automation.register_action("aux_ac.vlouver_middle_below", AirConVLouverMiddleBelowAction, VLOUVER_ACTION_SCHEMA)
|
||||||
|
async def vlouver_middle_below_to_code(config, action_id, template_arg, args):
|
||||||
|
paren = await cg.get_variable(config[CONF_ID])
|
||||||
|
return cg.new_Pvariable(action_id, template_arg, paren)
|
||||||
|
|
||||||
|
@automation.register_action("aux_ac.vlouver_bottom", AirConVLouverBottomAction, VLOUVER_ACTION_SCHEMA)
|
||||||
|
async def vlouver_bottom_to_code(config, action_id, template_arg, args):
|
||||||
|
paren = await cg.get_variable(config[CONF_ID])
|
||||||
|
return cg.new_Pvariable(action_id, template_arg, paren)
|
||||||
|
|
||||||
|
|
||||||
# *********************************************************************************************************
|
# *********************************************************************************************************
|
||||||
# ВАЖНО! Только для инженеров!
|
# ВАЖНО! Только для инженеров!
|
||||||
@@ -328,6 +364,13 @@ SEND_TEST_PACKET_ACTION_SCHEMA = maybe_simple_id(
|
|||||||
# кондиционеру всё как есть. Какой эффект получится от передачи кондиционеру рандомных байт, никто не знает.
|
# кондиционеру всё как есть. Какой эффект получится от передачи кондиционеру рандомных байт, никто не знает.
|
||||||
# Вы действуете на свой страх и риск.
|
# Вы действуете на свой страх и риск.
|
||||||
# *********************************************************************************************************
|
# *********************************************************************************************************
|
||||||
|
SEND_TEST_PACKET_ACTION_SCHEMA = maybe_simple_id(
|
||||||
|
{
|
||||||
|
cv.Required(CONF_ID): cv.use_id(AirCon),
|
||||||
|
cv.Required(CONF_DATA): cv.templatable(validate_raw_data),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
@automation.register_action(
|
@automation.register_action(
|
||||||
"aux_ac.send_packet",
|
"aux_ac.send_packet",
|
||||||
AirConSendTestPacketAction,
|
AirConSendTestPacketAction,
|
||||||
|
|||||||
@@ -3,9 +3,12 @@ external_components:
|
|||||||
components: [ aux_ac ]
|
components: [ aux_ac ]
|
||||||
refresh: 0s
|
refresh: 0s
|
||||||
|
|
||||||
|
substitutions:
|
||||||
|
devicename: test_aux_ac_ext_esp32
|
||||||
|
upper_devicename: Test AUX
|
||||||
|
|
||||||
esphome:
|
esphome:
|
||||||
name: test_aux_ac_ext_esp32
|
name: $devicename
|
||||||
platform: ESP32
|
platform: ESP32
|
||||||
board: nodemcu-32s
|
board: nodemcu-32s
|
||||||
|
|
||||||
@@ -51,21 +54,54 @@ sensor:
|
|||||||
|
|
||||||
climate:
|
climate:
|
||||||
- platform: aux_ac
|
- platform: aux_ac
|
||||||
name: "AC Name"
|
name: $upper_devicename
|
||||||
id: aux_id
|
id: aux_id
|
||||||
uart_id: ac_uart_bus
|
uart_id: ac_uart_bus
|
||||||
period: 7s # период опроса состояния сплита, по дефолту 7 сек
|
period: 7s
|
||||||
show_action: true # надо ли показывать текущий режим работы: при HEAT_COOL mode сплит может греть (HEAT), охлаждать (COOL) или бездействовать (IDLE)
|
show_action: true
|
||||||
indoor_temperature: # сенсор, показывающий температуру воздуха на внутреннем блоке кондиционера; имеет все те же параметры, как и любой сенсор ESPHome
|
display_inverted: true
|
||||||
name: AC Indoor Temperature
|
indoor_temperature:
|
||||||
id: ac_indoor_temp
|
name: $upper_devicename Indoor Temperature
|
||||||
internal: true # сенсор установлен как внутренний по дефолту (не попадёт в Home Assistant)
|
id: ${devicename}_indoor_temp
|
||||||
|
internal: false
|
||||||
|
display_state:
|
||||||
|
name: $upper_devicename Display State
|
||||||
|
id: ${devicename}_display_state
|
||||||
|
internal: false
|
||||||
|
outdoor_temperature:
|
||||||
|
name: $upper_devicename Outdoor Temperature
|
||||||
|
id: ${devicename}_outdoor_temp
|
||||||
|
internal: false
|
||||||
|
outbound_temperature:
|
||||||
|
name: $upper_devicename Colant Outbound Temperature
|
||||||
|
id: ${devicename}_outbound_temp
|
||||||
|
internal: false
|
||||||
|
inbound_temperature:
|
||||||
|
name: $upper_devicename Colant Inbound Temperature
|
||||||
|
id: ${devicename}_inbound_temp
|
||||||
|
internal: false
|
||||||
|
compressor_temperature:
|
||||||
|
name: $upper_devicename Compressor Temperature
|
||||||
|
id: ${devicename}_strange_temp
|
||||||
|
internal: false
|
||||||
|
defrost_state:
|
||||||
|
name: $upper_devicename Defrost State
|
||||||
|
id: ${devicename}_defrost_state
|
||||||
|
internal: false
|
||||||
|
invertor_power:
|
||||||
|
name: $upper_devicename Invertor Power
|
||||||
|
id: ${devicename}_invertor_power
|
||||||
|
internal: false
|
||||||
|
preset_reporter:
|
||||||
|
name: $upper_devicename Preset Reporter
|
||||||
|
id: ${devicename}_preset_reporter
|
||||||
|
internal: false
|
||||||
visual:
|
visual:
|
||||||
min_temperature: 16
|
min_temperature: 16
|
||||||
max_temperature: 32
|
max_temperature: 32
|
||||||
temperature_step: 0.5
|
temperature_step: 0.5
|
||||||
supported_modes:
|
supported_modes:
|
||||||
- HEAT_COOL # не AUTO, так как только нагревает и остужает. В доках на ESPHome говорится, что AUTO - это если у устройства есть календарь и какие-то установки по расписанию.
|
- HEAT_COOL
|
||||||
- COOL
|
- COOL
|
||||||
- HEAT
|
- HEAT
|
||||||
- DRY
|
- DRY
|
||||||
@@ -77,10 +113,9 @@ climate:
|
|||||||
- SLEEP
|
- SLEEP
|
||||||
custom_presets:
|
custom_presets:
|
||||||
- CLEAN
|
- CLEAN
|
||||||
- FEEL
|
|
||||||
- HEALTH
|
- HEALTH
|
||||||
- ANTIFUNGUS
|
- ANTIFUNGUS
|
||||||
supported_swing_modes:
|
supported_swing_modes:
|
||||||
- VERTICAL
|
- VERTICAL
|
||||||
- HORIZONTAL
|
- HORIZONTAL
|
||||||
- BOTH
|
- BOTH
|
||||||
|
|||||||
@@ -3,8 +3,12 @@ external_components:
|
|||||||
components: [ aux_ac ]
|
components: [ aux_ac ]
|
||||||
refresh: 0s
|
refresh: 0s
|
||||||
|
|
||||||
|
substitutions:
|
||||||
|
devicename: test_aux_ac_ext_engeneer
|
||||||
|
upper_devicename: Test AUX
|
||||||
|
|
||||||
esphome:
|
esphome:
|
||||||
name: test_aux_ac_ext
|
name: $devicename
|
||||||
platform: ESP8266
|
platform: ESP8266
|
||||||
board: esp12e
|
board: esp12e
|
||||||
|
|
||||||
@@ -69,26 +73,54 @@ sensor:
|
|||||||
|
|
||||||
climate:
|
climate:
|
||||||
- platform: aux_ac
|
- platform: aux_ac
|
||||||
name: "AC Name"
|
name: $upper_devicename
|
||||||
id: aux_id
|
id: aux_id
|
||||||
uart_id: ac_uart_bus
|
uart_id: ac_uart_bus
|
||||||
period: 7s # период опроса состояния сплита, по дефолту 7 сек
|
period: 7s
|
||||||
show_action: true # надо ли показывать текущий режим работы: при HEAT_COOL mode сплит может греть (HEAT), охлаждать (COOL) или бездействовать (IDLE)
|
show_action: true
|
||||||
display_inverted: true # как отрабатывать вкл/выкл дисплея: у Rovex "1" выключает дисплей, у многих других "1" дисплей включает
|
display_inverted: true
|
||||||
indoor_temperature: # сенсор, показывающий температуру воздуха на внутреннем блоке кондиционера; имеет все те же параметры, как и любой сенсор ESPHome
|
indoor_temperature:
|
||||||
name: AC Indoor Temperature
|
name: $upper_devicename Indoor Temperature
|
||||||
id: ac_indoor_temp
|
id: ${devicename}_indoor_temp
|
||||||
internal: false # сенсор установлен как внутренний по дефолту (не попадёт в Home Assistant)
|
internal: false
|
||||||
display_state:
|
display_state:
|
||||||
name: AC Display State
|
name: $upper_devicename Display State
|
||||||
id: ac_display_state
|
id: ${devicename}_display_state
|
||||||
internal: false # сенсор установлен как внутренний по дефолту (не попадёт в Home Assistant)
|
internal: false
|
||||||
|
outdoor_temperature:
|
||||||
|
name: $upper_devicename Outdoor Temperature
|
||||||
|
id: ${devicename}_outdoor_temp
|
||||||
|
internal: false
|
||||||
|
outbound_temperature:
|
||||||
|
name: $upper_devicename Colant Outbound Temperature
|
||||||
|
id: ${devicename}_outbound_temp
|
||||||
|
internal: false
|
||||||
|
inbound_temperature:
|
||||||
|
name: $upper_devicename Colant Inbound Temperature
|
||||||
|
id: ${devicename}_inbound_temp
|
||||||
|
internal: false
|
||||||
|
compressor_temperature:
|
||||||
|
name: $upper_devicename Compressor Temperature
|
||||||
|
id: ${devicename}_strange_temp
|
||||||
|
internal: false
|
||||||
|
defrost_state:
|
||||||
|
name: $upper_devicename Defrost State
|
||||||
|
id: ${devicename}_defrost_state
|
||||||
|
internal: false
|
||||||
|
invertor_power:
|
||||||
|
name: $upper_devicename Invertor Power
|
||||||
|
id: ${devicename}_invertor_power
|
||||||
|
internal: false
|
||||||
|
preset_reporter:
|
||||||
|
name: $upper_devicename Preset Reporter
|
||||||
|
id: ${devicename}_preset_reporter
|
||||||
|
internal: false
|
||||||
visual:
|
visual:
|
||||||
min_temperature: 16
|
min_temperature: 16
|
||||||
max_temperature: 32
|
max_temperature: 32
|
||||||
temperature_step: 0.5
|
temperature_step: 0.5
|
||||||
supported_modes:
|
supported_modes:
|
||||||
- HEAT_COOL # не AUTO, так как только нагревает и остужает. В доках на ESPHome говорится, что AUTO - это если у устройства есть календарь и какие-то установки по расписанию.
|
- HEAT_COOL
|
||||||
- COOL
|
- COOL
|
||||||
- HEAT
|
- HEAT
|
||||||
- DRY
|
- DRY
|
||||||
@@ -100,7 +132,6 @@ climate:
|
|||||||
- SLEEP
|
- SLEEP
|
||||||
custom_presets:
|
custom_presets:
|
||||||
- CLEAN
|
- CLEAN
|
||||||
- FEEL
|
|
||||||
- HEALTH
|
- HEALTH
|
||||||
- ANTIFUNGUS
|
- ANTIFUNGUS
|
||||||
supported_swing_modes:
|
supported_swing_modes:
|
||||||
@@ -113,7 +144,7 @@ switch:
|
|||||||
- platform: template
|
- platform: template
|
||||||
name: AC Display
|
name: AC Display
|
||||||
lambda: |-
|
lambda: |-
|
||||||
if (id(ac_display_state).state) {
|
if (id(${devicename}_display_state).state) {
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
159
tests/test-local-arflow-dir.yaml
Normal file
159
tests/test-local-arflow-dir.yaml
Normal file
@@ -0,0 +1,159 @@
|
|||||||
|
external_components:
|
||||||
|
- source:
|
||||||
|
type: local
|
||||||
|
path: ..\components
|
||||||
|
|
||||||
|
substitutions:
|
||||||
|
devicename: test_local_airflow_dir
|
||||||
|
upper_devicename: Test AUX
|
||||||
|
|
||||||
|
esphome:
|
||||||
|
name: $devicename
|
||||||
|
platform: ESP8266
|
||||||
|
board: esp12e
|
||||||
|
|
||||||
|
wifi:
|
||||||
|
ssid: !secret wifi_ssid
|
||||||
|
password: !secret wifi_pass
|
||||||
|
manual_ip:
|
||||||
|
static_ip: !secret wifi_ip
|
||||||
|
gateway: !secret wifi_gateway
|
||||||
|
subnet: !secret wifi_subnet
|
||||||
|
dns1: 8.8.8.8
|
||||||
|
dns2: 1.1.1.1
|
||||||
|
reboot_timeout: 0s
|
||||||
|
ap:
|
||||||
|
ssid: $upper_devicename Fallback Hotspot
|
||||||
|
password: !secret wifi_ap_pass
|
||||||
|
|
||||||
|
logger:
|
||||||
|
level: DEBUG
|
||||||
|
baud_rate: 0
|
||||||
|
|
||||||
|
api:
|
||||||
|
password: !secret api_pass
|
||||||
|
reboot_timeout: 0s
|
||||||
|
|
||||||
|
ota:
|
||||||
|
password: !secret ota_pass
|
||||||
|
|
||||||
|
web_server:
|
||||||
|
port: 80
|
||||||
|
|
||||||
|
uart:
|
||||||
|
id: ac_uart_bus
|
||||||
|
tx_pin: GPIO1
|
||||||
|
rx_pin: GPIO3
|
||||||
|
baud_rate: 4800
|
||||||
|
data_bits: 8
|
||||||
|
parity: EVEN
|
||||||
|
stop_bits: 1
|
||||||
|
|
||||||
|
|
||||||
|
sensor:
|
||||||
|
- platform: uptime
|
||||||
|
name: Uptime Sensor
|
||||||
|
|
||||||
|
|
||||||
|
climate:
|
||||||
|
- platform: aux_ac
|
||||||
|
name: $upper_devicename
|
||||||
|
id: aux_id
|
||||||
|
uart_id: ac_uart_bus
|
||||||
|
period: 7s
|
||||||
|
show_action: true
|
||||||
|
display_inverted: true
|
||||||
|
|
||||||
|
|
||||||
|
button:
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} VLouver Stop
|
||||||
|
icon: "mdi:circle-small"
|
||||||
|
on_press:
|
||||||
|
- aux_ac.vlouver_stop: aux_id
|
||||||
|
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} VLouver Swing
|
||||||
|
icon: "mdi:pan-vertical"
|
||||||
|
on_press:
|
||||||
|
- aux_ac.vlouver_swing: aux_id
|
||||||
|
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} VLouver Top
|
||||||
|
icon: "mdi:pan-up"
|
||||||
|
on_press:
|
||||||
|
- aux_ac.vlouver_top: aux_id
|
||||||
|
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} VLouver Middle Above
|
||||||
|
icon: "mdi:pan-top-left"
|
||||||
|
on_press:
|
||||||
|
- aux_ac.vlouver_middle_above: aux_id
|
||||||
|
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} VLouver Middle
|
||||||
|
icon: "mdi:pan-left"
|
||||||
|
on_press:
|
||||||
|
- aux_ac.vlouver_middle: aux_id
|
||||||
|
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} VLouver Middle Below
|
||||||
|
icon: "mdi:pan-bottom-left"
|
||||||
|
on_press:
|
||||||
|
- aux_ac.vlouver_middle_below: aux_id
|
||||||
|
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} VLouver Bottom
|
||||||
|
icon: "mdi:pan-down"
|
||||||
|
on_press:
|
||||||
|
- aux_ac.vlouver_bottom: aux_id
|
||||||
|
|
||||||
|
|
||||||
|
number:
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} Vertical Louver
|
||||||
|
id: ${devicename}_vlouver
|
||||||
|
icon: "mdi:circle-small"
|
||||||
|
mode: "slider"
|
||||||
|
min_value: 0
|
||||||
|
max_value: 6
|
||||||
|
step: 1
|
||||||
|
set_action:
|
||||||
|
then:
|
||||||
|
- lambda: !lambda |-
|
||||||
|
auto icon = "";
|
||||||
|
if (x == 6) x = 7; // делаем так, чтобы выключение отрабатывать корректно
|
||||||
|
|
||||||
|
switch ( static_cast<uint8_t>(x) ) {
|
||||||
|
case 0: // vertical swing
|
||||||
|
icon = "mdi:pan-vertical";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1: // top position
|
||||||
|
icon = "mdi:pan-up";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2: // middle above position
|
||||||
|
icon = "mdi:pan-top-left";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3: // middle position
|
||||||
|
icon = "mdi:pan-left";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4: // middle below position
|
||||||
|
icon = "mdi:pan-bottom-left";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 5: // bottom position
|
||||||
|
icon = "mdi:pan-down";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 7: // stop vertical louver
|
||||||
|
default:
|
||||||
|
icon = "mdi:circle-small";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
id(${devicename}_vlouver).set_icon(icon);
|
||||||
|
id(aux_id).setVLouverSequence( static_cast<esphome::aux_ac::ac_louver_V>(x) );
|
||||||
@@ -3,8 +3,12 @@ external_components:
|
|||||||
type: local
|
type: local
|
||||||
path: ..\components
|
path: ..\components
|
||||||
|
|
||||||
|
substitutions:
|
||||||
|
devicename: test_local_airflow_dir
|
||||||
|
upper_devicename: Test AUX
|
||||||
|
|
||||||
esphome:
|
esphome:
|
||||||
name: test_aux_ac_local
|
name: $devicename
|
||||||
platform: ESP8266
|
platform: ESP8266
|
||||||
board: esp12e
|
board: esp12e
|
||||||
|
|
||||||
@@ -51,21 +55,54 @@ sensor:
|
|||||||
|
|
||||||
climate:
|
climate:
|
||||||
- platform: aux_ac
|
- platform: aux_ac
|
||||||
name: "AC Name"
|
name: $upper_devicename
|
||||||
id: aux_id
|
id: aux_id
|
||||||
uart_id: ac_uart_bus
|
uart_id: ac_uart_bus
|
||||||
period: 7s # период опроса состояния сплита, по дефолту 7 сек
|
period: 7s
|
||||||
show_action: true # надо ли показывать текущий режим работы: при HEAT_COOL mode сплит может греть (HEAT), охлаждать (COOL) или бездействовать (IDLE)
|
show_action: true
|
||||||
indoor_temperature: # сенсор, показывающий температуру воздуха на внутреннем блоке кондиционера; имеет все те же параметры, как и любой сенсор ESPHome
|
display_inverted: true
|
||||||
name: AC Indoor Temperature
|
indoor_temperature:
|
||||||
id: ac_indoor_temp
|
name: $upper_devicename Indoor Temperature
|
||||||
internal: true # сенсор установлен как внутренний по дефолту (не попадёт в Home Assistant)
|
id: ${devicename}_indoor_temp
|
||||||
|
internal: false
|
||||||
|
display_state:
|
||||||
|
name: $upper_devicename Display State
|
||||||
|
id: ${devicename}_display_state
|
||||||
|
internal: false
|
||||||
|
outdoor_temperature:
|
||||||
|
name: $upper_devicename Outdoor Temperature
|
||||||
|
id: ${devicename}_outdoor_temp
|
||||||
|
internal: false
|
||||||
|
outbound_temperature:
|
||||||
|
name: $upper_devicename Colant Outbound Temperature
|
||||||
|
id: ${devicename}_outbound_temp
|
||||||
|
internal: false
|
||||||
|
inbound_temperature:
|
||||||
|
name: $upper_devicename Colant Inbound Temperature
|
||||||
|
id: ${devicename}_inbound_temp
|
||||||
|
internal: false
|
||||||
|
compressor_temperature:
|
||||||
|
name: $upper_devicename Compressor Temperature
|
||||||
|
id: ${devicename}_strange_temp
|
||||||
|
internal: false
|
||||||
|
defrost_state:
|
||||||
|
name: $upper_devicename Defrost State
|
||||||
|
id: ${devicename}_defrost_state
|
||||||
|
internal: false
|
||||||
|
invertor_power:
|
||||||
|
name: $upper_devicename Invertor Power
|
||||||
|
id: ${devicename}_invertor_power
|
||||||
|
internal: false
|
||||||
|
preset_reporter:
|
||||||
|
name: $upper_devicename Preset Reporter
|
||||||
|
id: ${devicename}_preset_reporter
|
||||||
|
internal: false
|
||||||
visual:
|
visual:
|
||||||
min_temperature: 16
|
min_temperature: 16
|
||||||
max_temperature: 32
|
max_temperature: 32
|
||||||
temperature_step: 0.5
|
temperature_step: 0.5
|
||||||
supported_modes:
|
supported_modes:
|
||||||
- HEAT_COOL # не AUTO, так как только нагревает и остужает. В доках на ESPHome говорится, что AUTO - это если у устройства есть календарь и какие-то установки по расписанию.
|
- HEAT_COOL
|
||||||
- COOL
|
- COOL
|
||||||
- HEAT
|
- HEAT
|
||||||
- DRY
|
- DRY
|
||||||
@@ -77,10 +114,9 @@ climate:
|
|||||||
- SLEEP
|
- SLEEP
|
||||||
custom_presets:
|
custom_presets:
|
||||||
- CLEAN
|
- CLEAN
|
||||||
- FEEL
|
|
||||||
- HEALTH
|
- HEALTH
|
||||||
- ANTIFUNGUS
|
- ANTIFUNGUS
|
||||||
supported_swing_modes:
|
supported_swing_modes:
|
||||||
- VERTICAL
|
- VERTICAL
|
||||||
- HORIZONTAL
|
- HORIZONTAL
|
||||||
- BOTH
|
- BOTH
|
||||||
|
|||||||
@@ -6,8 +6,12 @@ external_components:
|
|||||||
#components: [ aux_ac ]
|
#components: [ aux_ac ]
|
||||||
#refresh: 0s
|
#refresh: 0s
|
||||||
|
|
||||||
|
substitutions:
|
||||||
|
devicename: test_local_minimal
|
||||||
|
upper_devicename: Test AUX
|
||||||
|
|
||||||
esphome:
|
esphome:
|
||||||
name: test_aux_ac_minimal
|
name: $devicename
|
||||||
platform: ESP8266
|
platform: ESP8266
|
||||||
board: esp12e
|
board: esp12e
|
||||||
|
|
||||||
@@ -41,4 +45,4 @@ uart:
|
|||||||
|
|
||||||
climate:
|
climate:
|
||||||
- platform: aux_ac
|
- platform: aux_ac
|
||||||
name: "AC Name"
|
name: $upper_devicename
|
||||||
Reference in New Issue
Block a user