This commit is contained in:
Mat931 2024-05-15 14:49:18 +00:00 committed by GitHub
commit 3da79fa0ac
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 239 additions and 0 deletions

View File

@ -1779,6 +1779,73 @@ async def aeha_action(var, config, args):
cg.add(var.set_data(template_))
# TR502MSV
(
TR502MSVData,
TR502MSVBinarySensor,
TR502MSVTrigger,
TR502MSVAction,
TR502MSVDumper,
) = declare_protocol("TR502MSV")
TR502MSVCommand = remote_base_ns.enum("TR502MSVCommand")
TR502MSV_COMMAND_OPTIONS = {
"turn_off": TR502MSVCommand.COMMAND_OFF,
"turn_on": TR502MSVCommand.COMMAND_ON,
"increase_brightness": TR502MSVCommand.COMMAND_INCREASE_BRIGHTNESS,
"decrease_brightness": TR502MSVCommand.COMMAND_DECREASE_BRIGHTNESS,
}
TR502MSVDevice = remote_base_ns.enum("TR502MSVDevice")
TR502MSV_DEVICE_OPTIONS = {
1: TR502MSVDevice.DEVICE_1,
2: TR502MSVDevice.DEVICE_2,
3: TR502MSVDevice.DEVICE_3,
4: TR502MSVDevice.DEVICE_4,
"all": TR502MSVDevice.DEVICE_ALL,
}
TR502MSV_SCHEMA = cv.Schema(
{
cv.Required(CONF_GROUP): cv.All(cv.hex_int, cv.Range(min=0, max=0xFFF)),
cv.Required(CONF_DEVICE): cv.enum(TR502MSV_DEVICE_OPTIONS),
cv.Required(CONF_COMMAND): cv.enum(TR502MSV_COMMAND_OPTIONS),
}
)
@register_binary_sensor("tr_502msv", TR502MSVBinarySensor, TR502MSV_SCHEMA)
def tr_502msv_binary_sensor(var, config):
cg.add(
var.set_data(
cg.StructInitializer(
TR502MSVData,
("group", config[CONF_GROUP]),
("device", config[CONF_DEVICE]),
("command", config[CONF_COMMAND]),
)
)
)
@register_trigger("tr_502msv", TR502MSVTrigger, TR502MSVData)
def tr_502msv_trigger(var, config):
pass
@register_dumper("tr_502msv", TR502MSVDumper)
def tr_502msv_dumper(var, config):
pass
@register_action("tr_502msv", TR502MSVAction, TR502MSV_SCHEMA)
def tr_502msv_action(var, config, args):
cg.add(var.set_group((yield cg.templatable(config[CONF_GROUP], args, cg.uint16))))
cg.add(var.set_device((yield cg.templatable(config[CONF_DEVICE], args, cg.uint8))))
cg.add(
var.set_command((yield cg.templatable(config[CONF_COMMAND], args, cg.uint8)))
)
# Haier
HaierData, HaierBinarySensor, HaierTrigger, HaierAction, HaierDumper = declare_protocol(
"Haier"

View File

@ -0,0 +1,90 @@
#include "tr_502msv_protocol.h"
#include "esphome/core/log.h"
namespace esphome {
namespace remote_base {
static const char *const TAG = "remote.tr_502msv";
static const uint32_t BIT_ZERO_SPACE_US = 640;
static const uint32_t BIT_ZERO_MARK_US = 1270;
static const uint32_t BIT_ONE_SPACE_US = 1270;
static const uint32_t BIT_ONE_MARK_US = 640;
std::string TR502MSVData::device_string() const {
switch (this->device) {
case DEVICE_1:
return "1";
case DEVICE_2:
return "2";
case DEVICE_3:
return "3";
case DEVICE_4:
return "4";
case DEVICE_ALL:
return "all";
default:
return "unknown";
}
}
std::string TR502MSVData::command_string() const {
switch (this->command) {
case COMMAND_OFF:
return "turn_off";
case COMMAND_ON:
return "turn_on";
case COMMAND_INCREASE_BRIGHTNESS:
return "increase_brightness";
case COMMAND_DECREASE_BRIGHTNESS:
return "decrease_brightness";
default:
return "unknown";
}
}
void TR502MSVProtocol::encode(RemoteTransmitData *dst, const TR502MSVData &data) {
dst->set_carrier_frequency(0); // 433 MHz
dst->reserve(41);
dst->mark(BIT_ONE_MARK_US);
uint32_t d = data.raw;
for (uint32_t mask = 1; mask; mask = (mask << 1) & 0x0fffff) {
if (d & mask) {
dst->space(BIT_ONE_SPACE_US);
dst->mark(BIT_ONE_MARK_US);
} else {
dst->space(BIT_ZERO_SPACE_US);
dst->mark(BIT_ZERO_MARK_US);
}
}
}
optional<TR502MSVData> TR502MSVProtocol::decode(RemoteReceiveData src) {
TR502MSVData out;
uint32_t d = 0;
if (!src.expect_mark(BIT_ONE_MARK_US))
return {};
for (uint32_t mask = 1; mask; mask = (mask << 1) & 0x0fffff) {
if (src.peek_space(BIT_ONE_SPACE_US) && src.peek_mark(BIT_ONE_MARK_US, 1)) {
d |= mask;
} else if (!(src.peek_space(BIT_ZERO_SPACE_US) && src.peek_mark(BIT_ZERO_MARK_US, 1))) {
return {};
}
src.advance(2);
}
out.raw = d;
if (out.calc_cs() != out.checksum) {
return {};
}
return out;
}
void TR502MSVProtocol::dump(const TR502MSVData &data) {
ESP_LOGD(TAG, "Received TR502MSV: group=0x%03X, device=%s, command=%s", data.group, data.device_string().c_str(),
data.command_string().c_str());
}
} // namespace remote_base
} // namespace esphome

View File

@ -0,0 +1,70 @@
#pragma once
#include "esphome/core/component.h"
#include "remote_base.h"
namespace esphome {
namespace remote_base {
enum Devices : uint8_t {
DEVICE_1 = 0,
DEVICE_2 = 1,
DEVICE_3 = 2,
DEVICE_4 = 3,
DEVICE_ALL = 7,
};
enum Commands : uint8_t {
COMMAND_OFF = 0,
COMMAND_ON = 1,
COMMAND_INCREASE_BRIGHTNESS = 2,
COMMAND_DECREASE_BRIGHTNESS = 3,
};
struct TR502MSVData {
union {
struct {
uint16_t group : 12;
uint8_t device : 3;
uint8_t command : 2;
uint8_t _reserved : 1;
uint8_t checksum : 2;
} __attribute__((packed));
uint32_t raw;
};
bool operator==(const TR502MSVData &rhs) const { return this->raw == rhs.raw; }
std::string device_string() const;
std::string command_string() const;
uint8_t calc_cs() const { return (device & 3) ^ ((device >> 2) & 1) ^ ((command >> 1) & 1) ^ ((command << 1) & 2); }
};
class TR502MSVProtocol : public RemoteProtocol<TR502MSVData> {
public:
void encode(RemoteTransmitData *dst, const TR502MSVData &data) override;
optional<TR502MSVData> decode(RemoteReceiveData src) override;
void dump(const TR502MSVData &data) override;
};
DECLARE_REMOTE_PROTOCOL(TR502MSV)
template<typename... Ts> class TR502MSVAction : public RemoteTransmitterActionBase<Ts...> {
public:
TEMPLATABLE_VALUE(uint16_t, group)
TEMPLATABLE_VALUE(uint8_t, device)
TEMPLATABLE_VALUE(uint8_t, command)
void encode(RemoteTransmitData *dst, Ts... x) override {
TR502MSVData data{};
data.group = this->group_.value(x...);
data.device = this->device_.value(x...);
data.command = this->command_.value(x...);
data.checksum = data.calc_cs();
TR502MSVProtocol().encode(dst, data);
}
};
} // namespace remote_base
} // namespace esphome

View File

@ -150,3 +150,9 @@ binary_sensor:
panasonic:
address: 0x4004
command: 0x100BCBD
- platform: remote_receiver
name: TR-502MSV Remote Input
tr_502msv:
group: 0xABC
device: 1
command: turn_on

View File

@ -149,3 +149,9 @@ binary_sensor:
panasonic:
address: 0x4004
command: 0x100BCBD
- platform: remote_receiver
name: TR-502MSV Remote Input
tr_502msv:
group: 0xABC
device: 1
command: turn_on