en/dis able emulation mode

change wall panel emulation states from WAITING | ACTIVE to ENABLED | DISABLED.

Add set mode to protocol so the GUI switch can toggle the state between enabled or disabled.

Default mode is disabled. Removed code that watches for a wall panel to simplify.
This commit is contained in:
Paul Wieland 2024-07-11 16:38:47 -04:00
parent 01a4a41809
commit 86a44366c4
5 changed files with 102 additions and 21 deletions

5
.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
# Gitignore settings for ESPHome
# This is an example and may include too much for your use-case.
# You can modify this file to suit your needs.
/.esphome/
/secrets.yaml

75
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,75 @@
{
"files.associations": {
"__bit_reference": "cpp",
"__config": "cpp",
"__debug": "cpp",
"__errc": "cpp",
"__hash_table": "cpp",
"__locale": "cpp",
"__mutex_base": "cpp",
"__node_handle": "cpp",
"__split_buffer": "cpp",
"__threading_support": "cpp",
"__verbose_abort": "cpp",
"array": "cpp",
"atomic": "cpp",
"bitset": "cpp",
"cctype": "cpp",
"charconv": "cpp",
"clocale": "cpp",
"cmath": "cpp",
"complex": "cpp",
"condition_variable": "cpp",
"cstdarg": "cpp",
"cstddef": "cpp",
"cstdint": "cpp",
"cstdio": "cpp",
"cstdlib": "cpp",
"cstring": "cpp",
"ctime": "cpp",
"cwchar": "cpp",
"cwctype": "cpp",
"deque": "cpp",
"exception": "cpp",
"initializer_list": "cpp",
"ios": "cpp",
"iosfwd": "cpp",
"istream": "cpp",
"limits": "cpp",
"locale": "cpp",
"mutex": "cpp",
"new": "cpp",
"numbers": "cpp",
"optional": "cpp",
"ostream": "cpp",
"queue": "cpp",
"ratio": "cpp",
"sstream": "cpp",
"stdexcept": "cpp",
"streambuf": "cpp",
"string": "cpp",
"string_view": "cpp",
"system_error": "cpp",
"thread": "cpp",
"tuple": "cpp",
"typeinfo": "cpp",
"unordered_map": "cpp",
"variant": "cpp",
"vector": "cpp",
"algorithm": "cpp",
"bit": "cpp",
"*.tcc": "cpp",
"chrono": "cpp",
"compare": "cpp",
"concepts": "cpp",
"functional": "cpp",
"iterator": "cpp",
"memory": "cpp",
"memory_resource": "cpp",
"numeric": "cpp",
"random": "cpp",
"type_traits": "cpp",
"utility": "cpp",
"cinttypes": "cpp"
}
}

View File

@ -58,6 +58,9 @@ namespace ratgdo {
struct SetClientID { struct SetClientID {
uint64_t client_id; uint64_t client_id;
}; };
struct SetEnableEmulationMode {
bool enable_emulation_mode;
};
struct QueryStatus { struct QueryStatus {
}; };
struct QueryOpenings { struct QueryOpenings {
@ -80,6 +83,7 @@ namespace ratgdo {
(SetRollingCodeCounter, set_rolling_code_counter), (SetRollingCodeCounter, set_rolling_code_counter),
(GetRollingCodeCounter, get_rolling_code_counter), (GetRollingCodeCounter, get_rolling_code_counter),
(SetClientID, set_client_id), (SetClientID, set_client_id),
(SetEnableEmulationMode, set_enable_emulation_mode),
(QueryStatus, query_status), (QueryStatus, query_status),
(QueryOpenings, query_openings), (QueryOpenings, query_openings),
(ActivateLearn, activate_learn), (ActivateLearn, activate_learn),

View File

@ -35,7 +35,7 @@ namespace ratgdo {
(millis() - this->last_tx_) > 200 && // don't send twice in a period (millis() - this->last_tx_) > 200 && // don't send twice in a period
(millis() - this->last_rx_) > 50 && // time to send it (millis() - this->last_rx_) > 50 && // time to send it
tx_cmd && // have pending command tx_cmd && // have pending command
!(this->is_0x37_panel_ && tx_cmd.value() == CommandType::TOGGLE_LOCK_PRESS) && this->wall_panel_emulation_state_ != WallPanelEmulationState::RUNNING) { !(this->is_0x37_panel_ && tx_cmd.value() == CommandType::TOGGLE_LOCK_PRESS) && this->wall_panel_emulation_state_ != WallPanelEmulationState::ENABLED) {
this->do_transmit_if_pending(); this->do_transmit_if_pending();
} }
} }
@ -47,7 +47,6 @@ namespace ratgdo {
void Secplus1::sync() void Secplus1::sync()
{ {
this->wall_panel_emulation_state_ = WallPanelEmulationState::WAITING;
this->wall_panel_emulation_start_ = millis(); this->wall_panel_emulation_start_ = millis();
this->door_state = DoorState::UNKNOWN; this->door_state = DoorState::UNKNOWN;
this->light_state = LightState::UNKNOWN; this->light_state = LightState::UNKNOWN;
@ -62,24 +61,17 @@ namespace ratgdo {
}); });
} }
void Secplus1::set_enable_emulation_mode(bool state)
{
this->wall_panel_emulation_state_ = state ? WallPanelEmulationState::ENABLED : WallPanelEmulationState::DISABLED;
this->wall_panel_emulation();
}
void Secplus1::wall_panel_emulation(size_t index) void Secplus1::wall_panel_emulation(size_t index)
{ {
if (this->wall_panel_emulation_state_ == WallPanelEmulationState::WAITING) { if (this->wall_panel_emulation_state_ == WallPanelEmulationState::DISABLED){
ESP_LOG1(TAG, "Looking for security+ 1.0 wall panel..."); ESP_LOGD(TAG, "Emulation mode is disabled");
} else if (this->wall_panel_emulation_state_ == WallPanelEmulationState::ENABLED) {
if (this->door_state != DoorState::UNKNOWN || this->light_state != LightState::UNKNOWN) {
ESP_LOG1(TAG, "Wall panel detected");
return;
}
if (millis() - this->wall_panel_emulation_start_ > 35000 && !this->wall_panel_starting_) {
ESP_LOG1(TAG, "No wall panel detected. Switching to emulation mode.");
this->wall_panel_emulation_state_ = WallPanelEmulationState::RUNNING;
}
this->scheduler_->set_timeout(this->ratgdo_, "wall_panel_emulation", 2000, [=] {
this->wall_panel_emulation();
});
return;
} else if (this->wall_panel_emulation_state_ == WallPanelEmulationState::RUNNING) {
// ESP_LOG2(TAG, "[Wall panel emulation] Sending byte: [%02X]", secplus1_states[index]); // ESP_LOG2(TAG, "[Wall panel emulation] Sending byte: [%02X]", secplus1_states[index]);
if (index < 15 || !this->do_transmit_if_pending()) { if (index < 15 || !this->do_transmit_if_pending()) {
@ -205,6 +197,10 @@ namespace ratgdo {
Result Secplus1::call(Args args) Result Secplus1::call(Args args)
{ {
using Tag = Args::Tag;
if (args.tag == Tag::set_enable_emulation_mode) {
this->set_enable_emulation_mode(args.value.set_enable_emulation_mode.enable_emulation_mode);
}
return {}; return {};
} }

View File

@ -76,8 +76,8 @@ namespace ratgdo {
}; };
enum class WallPanelEmulationState { enum class WallPanelEmulationState {
WAITING, DISABLED,
RUNNING, ENABLED,
}; };
class Secplus1 : public Protocol { class Secplus1 : public Protocol {
@ -104,6 +104,7 @@ namespace ratgdo {
protected: protected:
void wall_panel_emulation(size_t index = 0); void wall_panel_emulation(size_t index = 0);
void set_enable_emulation_mode(bool state);
optional<RxCommand> read_command(); optional<RxCommand> read_command();
void handle_command(const RxCommand& cmd); void handle_command(const RxCommand& cmd);
@ -138,7 +139,7 @@ namespace ratgdo {
bool wall_panel_starting_ { false }; bool wall_panel_starting_ { false };
uint32_t wall_panel_emulation_start_ { 0 }; uint32_t wall_panel_emulation_start_ { 0 };
WallPanelEmulationState wall_panel_emulation_state_ { WallPanelEmulationState::WAITING }; WallPanelEmulationState wall_panel_emulation_state_ { WallPanelEmulationState::DISABLED };
bool is_0x37_panel_ { false }; bool is_0x37_panel_ { false };
std::priority_queue<TxCommand, std::vector<TxCommand>, FirstToSend> pending_tx_; std::priority_queue<TxCommand, std::vector<TxCommand>, FirstToSend> pending_tx_;