#pragma once #include "esphome/core/component.h" #include "esphome/core/automation.h" #include "esphome/components/lock/lock.h" namespace esphome { namespace lock { template class LockAction : public Action { public: explicit LockAction(Lock *a_lock) : lock_(a_lock) {} void play(Ts... x) override { this->lock_->lock(); } protected: Lock *lock_; }; template class UnlockAction : public Action { public: explicit UnlockAction(Lock *a_lock) : lock_(a_lock) {} void play(Ts... x) override { this->lock_->unlock(); } protected: Lock *lock_; }; template class OpenAction : public Action { public: explicit OpenAction(Lock *a_lock) : lock_(a_lock) {} void play(Ts... x) override { this->lock_->open(); } protected: Lock *lock_; }; template class LockCondition : public Condition { public: LockCondition(Lock *parent, bool state) : parent_(parent), state_(state) {} bool check(Ts... x) override { auto check_state = this->state_ ? LockState::LOCK_STATE_LOCKED : LockState::LOCK_STATE_UNLOCKED; return this->parent_->state == check_state; } protected: Lock *parent_; bool state_; }; class LockLockTrigger : public Trigger<> { public: LockLockTrigger(Lock *a_lock) { a_lock->add_on_state_callback([this, a_lock]() { if (a_lock->state == LockState::LOCK_STATE_LOCKED) { this->trigger(); } }); } }; class LockUnlockTrigger : public Trigger<> { public: LockUnlockTrigger(Lock *a_lock) { a_lock->add_on_state_callback([this, a_lock]() { if (a_lock->state == LockState::LOCK_STATE_UNLOCKED) { this->trigger(); } }); } }; template class LockPublishAction : public Action { public: LockPublishAction(Lock *a_lock) : lock_(a_lock) {} TEMPLATABLE_VALUE(LockState, state) void play(Ts... x) override { this->lock_->publish_state(this->state_.value(x...)); } protected: Lock *lock_; }; } // namespace lock } // namespace esphome