Light & Switch Inverted Restore mode (#1810)

This commit is contained in:
Franck Nijhof 2021-05-23 22:20:11 +02:00 committed by GitHub
parent aebad04c0b
commit 0ce57e5a39
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 32 additions and 2 deletions

View file

@ -13,6 +13,8 @@ RESTORE_MODES = {
"RESTORE_DEFAULT_ON": GPIOSwitchRestoreMode.GPIO_SWITCH_RESTORE_DEFAULT_ON, "RESTORE_DEFAULT_ON": GPIOSwitchRestoreMode.GPIO_SWITCH_RESTORE_DEFAULT_ON,
"ALWAYS_OFF": GPIOSwitchRestoreMode.GPIO_SWITCH_ALWAYS_OFF, "ALWAYS_OFF": GPIOSwitchRestoreMode.GPIO_SWITCH_ALWAYS_OFF,
"ALWAYS_ON": GPIOSwitchRestoreMode.GPIO_SWITCH_ALWAYS_ON, "ALWAYS_ON": GPIOSwitchRestoreMode.GPIO_SWITCH_ALWAYS_ON,
"RESTORE_INVERTED_DEFAULT_OFF": GPIOSwitchRestoreMode.GPIO_SWITCH_RESTORE_INVERTED_DEFAULT_OFF,
"RESTORE_INVERTED_DEFAULT_ON": GPIOSwitchRestoreMode.GPIO_SWITCH_RESTORE_INVERTED_DEFAULT_ON,
} }
CONF_INTERLOCK_WAIT_TIME = "interlock_wait_time" CONF_INTERLOCK_WAIT_TIME = "interlock_wait_time"

View file

@ -18,6 +18,12 @@ void GPIOSwitch::setup() {
case GPIO_SWITCH_RESTORE_DEFAULT_ON: case GPIO_SWITCH_RESTORE_DEFAULT_ON:
initial_state = this->get_initial_state().value_or(true); initial_state = this->get_initial_state().value_or(true);
break; break;
case GPIO_SWITCH_RESTORE_INVERTED_DEFAULT_OFF:
initial_state = !this->get_initial_state().value_or(true);
break;
case GPIO_SWITCH_RESTORE_INVERTED_DEFAULT_ON:
initial_state = !this->get_initial_state().value_or(false);
break;
case GPIO_SWITCH_ALWAYS_OFF: case GPIO_SWITCH_ALWAYS_OFF:
initial_state = false; initial_state = false;
break; break;
@ -49,6 +55,12 @@ void GPIOSwitch::dump_config() {
case GPIO_SWITCH_RESTORE_DEFAULT_ON: case GPIO_SWITCH_RESTORE_DEFAULT_ON:
restore_mode = "Restore (Defaults to ON)"; restore_mode = "Restore (Defaults to ON)";
break; break;
case GPIO_SWITCH_RESTORE_INVERTED_DEFAULT_ON:
restore_mode = "Restore inverted (Defaults to ON)";
break;
case GPIO_SWITCH_RESTORE_INVERTED_DEFAULT_OFF:
restore_mode = "Restore inverted (Defaults to OFF)";
break;
case GPIO_SWITCH_ALWAYS_OFF: case GPIO_SWITCH_ALWAYS_OFF:
restore_mode = "Always OFF"; restore_mode = "Always OFF";
break; break;

View file

@ -11,6 +11,8 @@ enum GPIOSwitchRestoreMode {
GPIO_SWITCH_RESTORE_DEFAULT_ON, GPIO_SWITCH_RESTORE_DEFAULT_ON,
GPIO_SWITCH_ALWAYS_OFF, GPIO_SWITCH_ALWAYS_OFF,
GPIO_SWITCH_ALWAYS_ON, GPIO_SWITCH_ALWAYS_ON,
GPIO_SWITCH_RESTORE_INVERTED_DEFAULT_OFF,
GPIO_SWITCH_RESTORE_INVERTED_DEFAULT_ON,
}; };
class GPIOSwitch : public switch_::Switch, public Component { class GPIOSwitch : public switch_::Switch, public Component {

View file

@ -46,6 +46,8 @@ RESTORE_MODES = {
"RESTORE_DEFAULT_ON": LightRestoreMode.LIGHT_RESTORE_DEFAULT_ON, "RESTORE_DEFAULT_ON": LightRestoreMode.LIGHT_RESTORE_DEFAULT_ON,
"ALWAYS_OFF": LightRestoreMode.LIGHT_ALWAYS_OFF, "ALWAYS_OFF": LightRestoreMode.LIGHT_ALWAYS_OFF,
"ALWAYS_ON": LightRestoreMode.LIGHT_ALWAYS_ON, "ALWAYS_ON": LightRestoreMode.LIGHT_ALWAYS_ON,
"RESTORE_INVERTED_DEFAULT_OFF": LightRestoreMode.LIGHT_RESTORE_INVERTED_DEFAULT_OFF,
"RESTORE_INVERTED_DEFAULT_ON": LightRestoreMode.LIGHT_RESTORE_INVERTED_DEFAULT_ON,
} }
LIGHT_SCHEMA = cv.MQTT_COMMAND_COMPONENT_SCHEMA.extend( LIGHT_SCHEMA = cv.MQTT_COMMAND_COMPONENT_SCHEMA.extend(

View file

@ -106,10 +106,20 @@ void LightState::setup() {
switch (this->restore_mode_) { switch (this->restore_mode_) {
case LIGHT_RESTORE_DEFAULT_OFF: case LIGHT_RESTORE_DEFAULT_OFF:
case LIGHT_RESTORE_DEFAULT_ON: case LIGHT_RESTORE_DEFAULT_ON:
case LIGHT_RESTORE_INVERTED_DEFAULT_OFF:
case LIGHT_RESTORE_INVERTED_DEFAULT_ON:
this->rtc_ = global_preferences.make_preference<LightStateRTCState>(this->get_object_id_hash()); this->rtc_ = global_preferences.make_preference<LightStateRTCState>(this->get_object_id_hash());
// Attempt to load from preferences, else fall back to default values from struct // Attempt to load from preferences, else fall back to default values
if (!this->rtc_.load(&recovered)) { if (!this->rtc_.load(&recovered)) {
recovered.state = this->restore_mode_ == LIGHT_RESTORE_DEFAULT_ON; recovered.state = false;
if (this->restore_mode_ == LIGHT_RESTORE_DEFAULT_ON ||
this->restore_mode_ == LIGHT_RESTORE_INVERTED_DEFAULT_ON) {
recovered.state = true;
}
} else if (this->restore_mode_ == LIGHT_RESTORE_INVERTED_DEFAULT_OFF ||
this->restore_mode_ == LIGHT_RESTORE_INVERTED_DEFAULT_ON) {
// Inverted restore state
recovered.state = !recovered.state;
} }
break; break;
case LIGHT_ALWAYS_OFF: case LIGHT_ALWAYS_OFF:

View file

@ -165,6 +165,8 @@ enum LightRestoreMode {
LIGHT_RESTORE_DEFAULT_ON, LIGHT_RESTORE_DEFAULT_ON,
LIGHT_ALWAYS_OFF, LIGHT_ALWAYS_OFF,
LIGHT_ALWAYS_ON, LIGHT_ALWAYS_ON,
LIGHT_RESTORE_INVERTED_DEFAULT_OFF,
LIGHT_RESTORE_INVERTED_DEFAULT_ON,
}; };
/** This class represents the communication layer between the front-end MQTT layer and the /** This class represents the communication layer between the front-end MQTT layer and the