ESPHome 2025.5.0
Loading...
Searching...
No Matches
gpio_switch.cpp
Go to the documentation of this file.
1#include "gpio_switch.h"
2#include "esphome/core/log.h"
3
4namespace esphome {
5namespace gpio {
6
7static const char *const TAG = "switch.gpio";
8
11 ESP_LOGCONFIG(TAG, "Setting up GPIO Switch '%s'...", this->name_.c_str());
12
13 bool initial_state = this->get_initial_state_with_restore_mode().value_or(false);
14
15 // write state before setup
16 if (initial_state) {
17 this->turn_on();
18 } else {
19 this->turn_off();
20 }
21 this->pin_->setup();
22 // write after setup again for other IOs
23 if (initial_state) {
24 this->turn_on();
25 } else {
26 this->turn_off();
27 }
28}
30 LOG_SWITCH("", "GPIO Switch", this);
31 LOG_PIN(" Pin: ", this->pin_);
32 if (!this->interlock_.empty()) {
33 ESP_LOGCONFIG(TAG, " Interlocks:");
34 for (auto *lock : this->interlock_) {
35 if (lock == this)
36 continue;
37 ESP_LOGCONFIG(TAG, " %s", lock->get_name().c_str());
38 }
39 }
40}
42 if (state != this->inverted_) {
43 // Turning ON, check interlocking
44
45 bool found = false;
46 for (auto *lock : this->interlock_) {
47 if (lock == this)
48 continue;
49
50 if (lock->state) {
51 lock->turn_off();
52 found = true;
53 }
54 }
55 if (found && this->interlock_wait_time_ != 0) {
56 this->set_timeout("interlock", this->interlock_wait_time_, [this, state] {
57 // Don't write directly, call the function again
58 // (some other switch may have changed state while we were waiting)
59 this->write_state(state);
60 });
61 return;
62 }
63 } else if (this->interlock_wait_time_ != 0) {
64 // If we are switched off during the interlock wait time, cancel any pending
65 // re-activations
66 this->cancel_timeout("interlock");
67 }
68
69 this->pin_->digital_write(state);
70 this->publish_state(state);
71}
72void GPIOSwitch::set_interlock(const std::vector<Switch *> &interlock) { this->interlock_ = interlock; }
73
74} // namespace gpio
75} // namespace esphome
bool cancel_timeout(const std::string &name)
Cancel a timeout function.
Definition component.cpp:76
void set_timeout(const std::string &name, uint32_t timeout, std::function< void()> &&f)
Set a timeout function with a unique name.
Definition component.cpp:72
virtual void setup()=0
virtual void digital_write(bool value)=0
constexpr const char * c_str() const
Definition string_ref.h:68
void dump_config() override
float get_setup_priority() const override
void set_interlock(const std::vector< Switch * > &interlock)
void write_state(bool state) override
std::vector< Switch * > interlock_
Definition gpio_switch.h:29
value_type value_or(U const &v) const
Definition optional.h:93
void turn_on()
Turn this switch on.
Definition switch.cpp:11
void turn_off()
Turn this switch off.
Definition switch.cpp:15
bool state
The current reported state of the binary sensor.
Definition switch.h:53
void publish_state(bool state)
Publish a state to the front-end from the back-end.
Definition switch.cpp:47
optional< bool > get_initial_state_with_restore_mode()
Returns the initial state of the switch, after applying restore mode rules.
Definition switch.cpp:33
bool state
Definition fan.h:0
const float HARDWARE
For components that deal with hardware and are very important like GPIO switch.
Definition component.cpp:18
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7