Fan no off cycle action (#5564)

Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
This commit is contained in:
Jordan W. Cobb 2023-10-19 03:02:27 -04:00 committed by GitHub
parent b632ae49d4
commit 9f033bce3b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 38 additions and 5 deletions

View File

@ -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(

View File

@ -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);

View File

@ -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"

View File

@ -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: