mirror of https://github.com/esphome/esphome.git
Merge 3372bbb168
into 1f29023c92
This commit is contained in:
commit
3da79fa0ac
|
@ -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"
|
||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue