Add on_tag_removed trigger for RC522 (#4742)

This commit is contained in:
Keith Burzinski 2023-04-26 17:47:45 -05:00 committed by GitHub
parent 986dd2ddd2
commit f639f7c280
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 27 additions and 5 deletions

View file

@ -2,7 +2,12 @@ import esphome.codegen as cg
import esphome.config_validation as cv import esphome.config_validation as cv
from esphome import automation, pins from esphome import automation, pins
from esphome.components import i2c from esphome.components import i2c
from esphome.const import CONF_ON_TAG, CONF_TRIGGER_ID, CONF_RESET_PIN from esphome.const import (
CONF_ON_TAG,
CONF_ON_TAG_REMOVED,
CONF_TRIGGER_ID,
CONF_RESET_PIN,
)
CODEOWNERS = ["@glmnet"] CODEOWNERS = ["@glmnet"]
AUTO_LOAD = ["binary_sensor"] AUTO_LOAD = ["binary_sensor"]
@ -24,6 +29,11 @@ RC522_SCHEMA = cv.Schema(
cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(RC522Trigger), cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(RC522Trigger),
} }
), ),
cv.Optional(CONF_ON_TAG_REMOVED): automation.validate_automation(
{
cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(RC522Trigger),
}
),
} }
).extend(cv.polling_component_schema("1s")) ).extend(cv.polling_component_schema("1s"))
@ -37,5 +47,10 @@ async def setup_rc522(var, config):
for conf in config.get(CONF_ON_TAG, []): for conf in config.get(CONF_ON_TAG, []):
trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID]) trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID])
cg.add(var.register_trigger(trigger)) cg.add(var.register_ontag_trigger(trigger))
await automation.build_automation(trigger, [(cg.std_string, "x")], conf)
for conf in config.get(CONF_ON_TAG_REMOVED, []):
trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID])
cg.add(var.register_ontagremoved_trigger(trigger))
await automation.build_automation(trigger, [(cg.std_string, "x")], conf) await automation.build_automation(trigger, [(cg.std_string, "x")], conf)

View file

@ -256,7 +256,7 @@ void RC522::loop() {
this->current_uid_ = rfid_uid; this->current_uid_ = rfid_uid;
for (auto *trigger : this->triggers_) for (auto *trigger : this->triggers_ontag_)
trigger->process(rfid_uid); trigger->process(rfid_uid);
if (report) { if (report) {
@ -265,6 +265,11 @@ void RC522::loop() {
break; break;
} }
case STATE_DONE: { case STATE_DONE: {
if (!this->current_uid_.empty()) {
ESP_LOGV(TAG, "Tag '%s' removed", format_uid(this->current_uid_).c_str());
for (auto *trigger : this->triggers_ontagremoved_)
trigger->process(this->current_uid_);
}
this->current_uid_ = {}; this->current_uid_ = {};
state_ = STATE_INIT; state_ = STATE_INIT;
break; break;

View file

@ -24,7 +24,8 @@ class RC522 : public PollingComponent {
void loop() override; void loop() override;
void register_tag(RC522BinarySensor *tag) { this->binary_sensors_.push_back(tag); } void register_tag(RC522BinarySensor *tag) { this->binary_sensors_.push_back(tag); }
void register_trigger(RC522Trigger *trig) { this->triggers_.push_back(trig); } void register_ontag_trigger(RC522Trigger *trig) { this->triggers_ontag_.push_back(trig); }
void register_ontagremoved_trigger(RC522Trigger *trig) { this->triggers_ontagremoved_.push_back(trig); }
void set_reset_pin(GPIOPin *reset) { this->reset_pin_ = reset; } void set_reset_pin(GPIOPin *reset) { this->reset_pin_ = reset; }
@ -242,7 +243,8 @@ class RC522 : public PollingComponent {
uint8_t reset_count_{0}; uint8_t reset_count_{0};
uint32_t reset_timeout_{0}; uint32_t reset_timeout_{0};
std::vector<RC522BinarySensor *> binary_sensors_; std::vector<RC522BinarySensor *> binary_sensors_;
std::vector<RC522Trigger *> triggers_; std::vector<RC522Trigger *> triggers_ontag_;
std::vector<RC522Trigger *> triggers_ontagremoved_;
std::vector<uint8_t> current_uid_; std::vector<uint8_t> current_uid_;
enum RC522Error { enum RC522Error {