mirror of
https://github.com/esphome/esphome.git
synced 2024-11-28 09:44:12 +01:00
Fan no off cycle action (#5564)
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
This commit is contained in:
parent
b632ae49d4
commit
9f033bce3b
4 changed files with 38 additions and 5 deletions
|
@ -14,6 +14,7 @@ from esphome.const import (
|
||||||
CONF_SPEED_LEVEL_STATE_TOPIC,
|
CONF_SPEED_LEVEL_STATE_TOPIC,
|
||||||
CONF_SPEED_COMMAND_TOPIC,
|
CONF_SPEED_COMMAND_TOPIC,
|
||||||
CONF_SPEED_STATE_TOPIC,
|
CONF_SPEED_STATE_TOPIC,
|
||||||
|
CONF_OFF_SPEED_CYCLE,
|
||||||
CONF_ON_SPEED_SET,
|
CONF_ON_SPEED_SET,
|
||||||
CONF_ON_TURN_OFF,
|
CONF_ON_TURN_OFF,
|
||||||
CONF_ON_TURN_ON,
|
CONF_ON_TURN_ON,
|
||||||
|
@ -217,10 +218,22 @@ async def fan_turn_on_to_code(config, action_id, template_arg, args):
|
||||||
return var
|
return var
|
||||||
|
|
||||||
|
|
||||||
@automation.register_action("fan.cycle_speed", CycleSpeedAction, FAN_ACTION_SCHEMA)
|
@automation.register_action(
|
||||||
|
"fan.cycle_speed",
|
||||||
|
CycleSpeedAction,
|
||||||
|
maybe_simple_id(
|
||||||
|
{
|
||||||
|
cv.Required(CONF_ID): cv.use_id(Fan),
|
||||||
|
cv.Optional(CONF_OFF_SPEED_CYCLE, default=True): cv.boolean,
|
||||||
|
}
|
||||||
|
),
|
||||||
|
)
|
||||||
async def fan_cycle_speed_to_code(config, action_id, template_arg, args):
|
async def fan_cycle_speed_to_code(config, action_id, template_arg, args):
|
||||||
paren = await cg.get_variable(config[CONF_ID])
|
paren = await cg.get_variable(config[CONF_ID])
|
||||||
return cg.new_Pvariable(action_id, template_arg, paren)
|
var = cg.new_Pvariable(action_id, template_arg, paren)
|
||||||
|
template_ = await cg.templatable(config[CONF_OFF_SPEED_CYCLE], args, bool)
|
||||||
|
cg.add(var.set_no_off_cycle(template_))
|
||||||
|
return var
|
||||||
|
|
||||||
|
|
||||||
@automation.register_condition(
|
@automation.register_condition(
|
||||||
|
|
|
@ -54,18 +54,26 @@ template<typename... Ts> class CycleSpeedAction : public Action<Ts...> {
|
||||||
public:
|
public:
|
||||||
explicit CycleSpeedAction(Fan *state) : state_(state) {}
|
explicit CycleSpeedAction(Fan *state) : state_(state) {}
|
||||||
|
|
||||||
|
TEMPLATABLE_VALUE(bool, no_off_cycle)
|
||||||
|
|
||||||
void play(Ts... x) override {
|
void play(Ts... x) override {
|
||||||
// check to see if fan supports speeds and is on
|
// check to see if fan supports speeds and is on
|
||||||
if (this->state_->get_traits().supported_speed_count()) {
|
if (this->state_->get_traits().supported_speed_count()) {
|
||||||
if (this->state_->state) {
|
if (this->state_->state) {
|
||||||
int speed = this->state_->speed + 1;
|
int speed = this->state_->speed + 1;
|
||||||
int supported_speed_count = this->state_->get_traits().supported_speed_count();
|
int supported_speed_count = this->state_->get_traits().supported_speed_count();
|
||||||
if (speed > supported_speed_count) {
|
bool off_speed_cycle = no_off_cycle_.value(x...);
|
||||||
// was running at max speed, so turn off
|
if (speed > supported_speed_count && off_speed_cycle) {
|
||||||
|
// was running at max speed, off speed cycle enabled, so turn off
|
||||||
speed = 1;
|
speed = 1;
|
||||||
auto call = this->state_->turn_off();
|
auto call = this->state_->turn_off();
|
||||||
call.set_speed(speed);
|
call.set_speed(speed);
|
||||||
call.perform();
|
call.perform();
|
||||||
|
} else if (speed > supported_speed_count && !off_speed_cycle) {
|
||||||
|
// was running at max speed, off speed cycle disabled, so set to lowest speed
|
||||||
|
auto call = this->state_->turn_on();
|
||||||
|
call.set_speed(1);
|
||||||
|
call.perform();
|
||||||
} else {
|
} else {
|
||||||
auto call = this->state_->turn_on();
|
auto call = this->state_->turn_on();
|
||||||
call.set_speed(speed);
|
call.set_speed(speed);
|
||||||
|
|
|
@ -475,6 +475,7 @@ CONF_NUM_SCANS = "num_scans"
|
||||||
CONF_NUMBER = "number"
|
CONF_NUMBER = "number"
|
||||||
CONF_NUMBER_DATAPOINT = "number_datapoint"
|
CONF_NUMBER_DATAPOINT = "number_datapoint"
|
||||||
CONF_OFF_MODE = "off_mode"
|
CONF_OFF_MODE = "off_mode"
|
||||||
|
CONF_OFF_SPEED_CYCLE = "off_speed_cycle"
|
||||||
CONF_OFFSET = "offset"
|
CONF_OFFSET = "offset"
|
||||||
CONF_ON = "on"
|
CONF_ON = "on"
|
||||||
CONF_ON_BLE_ADVERTISE = "on_ble_advertise"
|
CONF_ON_BLE_ADVERTISE = "on_ble_advertise"
|
||||||
|
|
|
@ -1693,7 +1693,18 @@ binary_sensor:
|
||||||
number: 7
|
number: 7
|
||||||
mode: INPUT
|
mode: INPUT
|
||||||
inverted: false
|
inverted: false
|
||||||
|
- platform: gpio
|
||||||
|
name: Speed Fan Cycle binary sensor"
|
||||||
|
pin:
|
||||||
|
number: 18
|
||||||
|
mode:
|
||||||
|
input: true
|
||||||
|
pulldown: true
|
||||||
|
on_press:
|
||||||
|
- fan.cycle_speed:
|
||||||
|
id: fan_speed
|
||||||
|
off_speed_cycle: False
|
||||||
|
- logger.log: "Cycle speed clicked"
|
||||||
- platform: remote_receiver
|
- platform: remote_receiver
|
||||||
name: Raw Remote Receiver Test
|
name: Raw Remote Receiver Test
|
||||||
raw:
|
raw:
|
||||||
|
|
Loading…
Reference in a new issue