ESPHome 2026.5.0b1
Loading...
Searching...
No Matches
rc_switch_protocol.h
Go to the documentation of this file.
1#pragma once
2
4#include "remote_base.h"
5
6namespace esphome::remote_base {
7
9 uint64_t code;
10 uint8_t protocol;
11
12 bool operator==(const RCSwitchData &rhs) const { return code == rhs.code && protocol == rhs.protocol; }
13};
14
16 public:
18
19 RCSwitchBase() = default;
20 RCSwitchBase(uint32_t sync_high, uint32_t sync_low, uint32_t zero_high, uint32_t zero_low, uint32_t one_high,
21 uint32_t one_low, bool inverted);
22
23 void one(RemoteTransmitData *dst) const;
24
25 void zero(RemoteTransmitData *dst) const;
26
27 void sync(RemoteTransmitData *dst) const;
28
29 void transmit(RemoteTransmitData *dst, uint64_t code, uint8_t len) const;
30
31 bool expect_one(RemoteReceiveData &src) const;
32
33 bool expect_zero(RemoteReceiveData &src) const;
34
35 bool expect_sync(RemoteReceiveData &src) const;
36
37 bool decode(RemoteReceiveData &src, uint64_t *out_data, uint8_t *out_nbits) const;
38
39 optional<RCSwitchData> decode(RemoteReceiveData &src) const;
40
41 static void simple_code_to_tristate(uint16_t code, uint8_t nbits, uint64_t *out_code);
42
43 static void type_a_code(uint8_t switch_group, uint8_t switch_device, bool state, uint64_t *out_code,
44 uint8_t *out_nbits);
45
46 static void type_b_code(uint8_t address_code, uint8_t channel_code, bool state, uint64_t *out_code,
47 uint8_t *out_nbits);
48
49 static void type_c_code(uint8_t family, uint8_t group, uint8_t device, bool state, uint64_t *out_code,
50 uint8_t *out_nbits);
51
52 static void type_d_code(uint8_t group, uint8_t device, bool state, uint64_t *out_code, uint8_t *out_nbits);
53
54 protected:
61 bool inverted_{};
62};
63
64extern const RCSwitchBase RC_SWITCH_PROTOCOLS[9];
65
66uint64_t decode_binary_string(const std::string &data);
67
68uint64_t decode_binary_string_mask(const std::string &data);
69
70template<typename... Ts> class RCSwitchRawAction : public RemoteTransmitterActionBase<Ts...> {
71 public:
73 TEMPLATABLE_VALUE(std::string, code);
74
75 void encode(RemoteTransmitData *dst, Ts... x) override {
76 auto code = this->code_.value(x...);
77 uint64_t the_code = decode_binary_string(code);
78 uint8_t nbits = code.size();
79
80 auto proto = this->protocol_.value(x...);
81 proto.transmit(dst, the_code, nbits);
82 }
83};
84
85template<typename... Ts> class RCSwitchTypeAAction : public RemoteTransmitterActionBase<Ts...> {
86 public:
88 TEMPLATABLE_VALUE(std::string, group);
89 TEMPLATABLE_VALUE(std::string, device);
91
92 void encode(RemoteTransmitData *dst, Ts... x) override {
93 auto group = this->group_.value(x...);
94 auto device = this->device_.value(x...);
95 auto state = this->state_.value(x...);
96 uint8_t u_group = decode_binary_string(group);
97 uint8_t u_device = decode_binary_string(device);
98
99 uint64_t code;
100 uint8_t nbits;
101 RCSwitchBase::type_a_code(u_group, u_device, state, &code, &nbits);
102
103 auto proto = this->protocol_.value(x...);
104 proto.transmit(dst, code, nbits);
105 }
106};
107
108template<typename... Ts> class RCSwitchTypeBAction : public RemoteTransmitterActionBase<Ts...> {
109 public:
112 TEMPLATABLE_VALUE(uint8_t, channel);
114
115 void encode(RemoteTransmitData *dst, Ts... x) override {
116 auto address = this->address_.value(x...);
117 auto channel = this->channel_.value(x...);
118 auto state = this->state_.value(x...);
119
120 uint64_t code;
121 uint8_t nbits;
122 RCSwitchBase::type_b_code(address, channel, state, &code, &nbits);
123
124 auto proto = this->protocol_.value(x...);
125 proto.transmit(dst, code, nbits);
126 }
127};
128
129template<typename... Ts> class RCSwitchTypeCAction : public RemoteTransmitterActionBase<Ts...> {
130 public:
132 TEMPLATABLE_VALUE(std::string, family);
133 TEMPLATABLE_VALUE(uint8_t, group);
134 TEMPLATABLE_VALUE(uint8_t, device);
136
137 void encode(RemoteTransmitData *dst, Ts... x) override {
138 auto family = this->family_.value(x...);
139 auto group = this->group_.value(x...);
140 auto device = this->device_.value(x...);
141 auto state = this->state_.value(x...);
142
143 auto u_family = static_cast<uint8_t>(tolower(family[0]) - 'a');
144
145 uint64_t code;
146 uint8_t nbits;
147 RCSwitchBase::type_c_code(u_family, group, device, state, &code, &nbits);
148
149 auto proto = this->protocol_.value(x...);
150 proto.transmit(dst, code, nbits);
151 }
152};
153template<typename... Ts> class RCSwitchTypeDAction : public RemoteTransmitterActionBase<Ts...> {
154 public:
156 TEMPLATABLE_VALUE(std::string, group);
157 TEMPLATABLE_VALUE(uint8_t, device);
159
160 void encode(RemoteTransmitData *dst, Ts... x) override {
161 auto group = this->group_.value(x...);
162 auto device = this->device_.value(x...);
163 auto state = this->state_.value(x...);
164
165 auto u_group = static_cast<uint8_t>(tolower(group[0]) - 'a');
166
167 uint64_t code;
168 uint8_t nbits;
169 RCSwitchBase::type_d_code(u_group, device, state, &code, &nbits);
170
171 auto proto = this->protocol_.value(x...);
172 proto.transmit(dst, code, nbits);
173 }
174};
175
177 public:
178 void set_protocol(const RCSwitchBase &a_protocol) { this->protocol_ = a_protocol; }
179 void set_code(uint64_t code) { this->code_ = code; }
180 void set_code(const std::string &code) {
181 this->code_ = decode_binary_string(code);
182 this->mask_ = decode_binary_string_mask(code);
183 this->nbits_ = code.size();
184 }
185 void set_nbits(uint8_t nbits) { this->nbits_ = nbits; }
186 void set_type_a(const std::string &group, const std::string &device, bool state) {
187 uint8_t u_group = decode_binary_string(group);
188 uint8_t u_device = decode_binary_string(device);
189 RCSwitchBase::type_a_code(u_group, u_device, state, &this->code_, &this->nbits_);
190 }
191 void set_type_b(uint8_t address_code, uint8_t channel_code, bool state) {
192 RCSwitchBase::type_b_code(address_code, channel_code, state, &this->code_, &this->nbits_);
193 }
194 void set_type_c(std::string family, uint8_t group, uint8_t device, bool state) {
195 auto u_family = static_cast<uint8_t>(tolower(family[0]) - 'a');
196 RCSwitchBase::type_c_code(u_family, group, device, state, &this->code_, &this->nbits_);
197 }
198 void set_type_d(std::string group, uint8_t device, bool state) {
199 auto u_group = static_cast<uint8_t>(tolower(group[0]) - 'a');
200 RCSwitchBase::type_d_code(u_group, device, state, &this->code_, &this->nbits_);
201 }
202
203 protected:
204 bool matches(RemoteReceiveData src) override;
205
207 uint64_t code_;
208 uint64_t mask_{0xFFFFFFFFFFFFFFFF};
209 uint8_t nbits_;
210};
211
213 public:
214 bool dump(RemoteReceiveData src) override;
215};
216
218
219} // namespace esphome::remote_base
uint8_t address
Definition bl0906.h:4
bool state
The current state of this binary sensor. Also used as the backing storage for StatefulEntityBase.
void zero(RemoteTransmitData *dst) const
static void type_b_code(uint8_t address_code, uint8_t channel_code, bool state, uint64_t *out_code, uint8_t *out_nbits)
bool expect_one(RemoteReceiveData &src) const
bool expect_zero(RemoteReceiveData &src) const
bool decode(RemoteReceiveData &src, uint64_t *out_data, uint8_t *out_nbits) const
static void type_c_code(uint8_t family, uint8_t group, uint8_t device, bool state, uint64_t *out_code, uint8_t *out_nbits)
void transmit(RemoteTransmitData *dst, uint64_t code, uint8_t len) const
static void type_a_code(uint8_t switch_group, uint8_t switch_device, bool state, uint64_t *out_code, uint8_t *out_nbits)
void one(RemoteTransmitData *dst) const
bool expect_sync(RemoteReceiveData &src) const
static void type_d_code(uint8_t group, uint8_t device, bool state, uint64_t *out_code, uint8_t *out_nbits)
static void simple_code_to_tristate(uint16_t code, uint8_t nbits, uint64_t *out_code)
bool dump(RemoteReceiveData src) override
TEMPLATABLE_VALUE(RCSwitchBase, protocol)
void encode(RemoteTransmitData *dst, Ts... x) override
void set_type_d(std::string group, uint8_t device, bool state)
void set_type_b(uint8_t address_code, uint8_t channel_code, bool state)
void set_protocol(const RCSwitchBase &a_protocol)
void set_type_a(const std::string &group, const std::string &device, bool state)
bool matches(RemoteReceiveData src) override
void set_type_c(std::string family, uint8_t group, uint8_t device, bool state)
void encode(RemoteTransmitData *dst, Ts... x) override
TEMPLATABLE_VALUE(RCSwitchBase, protocol)
TEMPLATABLE_VALUE(RCSwitchBase, protocol)
void encode(RemoteTransmitData *dst, Ts... x) override
void encode(RemoteTransmitData *dst, Ts... x) override
TEMPLATABLE_VALUE(RCSwitchBase, protocol)
void encode(RemoteTransmitData *dst, Ts... x) override
TEMPLATABLE_VALUE(RCSwitchBase, protocol)
bool state
Definition fan.h:2
uint64_t decode_binary_string_mask(const std::string &data)
uint64_t decode_binary_string(const std::string &data)
const RCSwitchBase RC_SWITCH_PROTOCOLS[9]
std::string size_t len
static void uint32_t
bool operator==(const RCSwitchData &rhs) const
uint16_t sync
Definition sun_gtil2.cpp:0
uint16_t x
Definition tt21100.cpp:5