8 struct RacPt1411hwruFanSpeed {
13 static const char *
const TAG =
"toshiba.climate";
94 0x04, 0x0C, 0x0D, 0x09, 0x08, 0x0A, 0x0B};
97 0x22, 0x06, 0x26, 0x07, 0x05, 0x25, 0x04, 0x24, 0x0C,
98 0x2C, 0x0D, 0x2D, 0x09, 0x08, 0x28, 0x0A, 0x2A, 0x0B};
102 this->sensor_->add_on_state_callback([
this](
float state) {
103 this->current_temperature =
state;
104 this->transmit_rac_pt1411hwru_temp_();
106 this->publish_state();
108 this->current_temperature = this->sensor_->state;
110 this->current_temperature = NAN;
113 auto restore = this->restore_state_();
114 if (restore.has_value()) {
115 restore->apply(
this);
121 roundf(clamp<float>(this->current_temperature, this->minimum_temperature_, this->maximum_temperature_));
126 this->minimum_temperature_ = this->temperature_min_();
127 this->maximum_temperature_ = this->temperature_max_();
128 this->swing_modes_ = this->toshiba_swing_modes_();
136 transmit_rac_pt1411hwru_();
143 uint8_t message[16] = {0};
144 uint8_t message_length = 9;
151 message[2] = message_length - 6;
154 message[3] = message[0] ^ message[1] ^ message[2];
166 switch (this->mode) {
215 message[6] = fan |
mode;
225 for (uint8_t i = 4; i < 8; i++) {
226 message[8] ^= message[i];
230 auto transmit = this->transmitter_->transmit();
231 auto *data = transmit.get_data();
233 encode_(data, message, message_length, 1);
239 uint8_t code = 0, index = 0, message[RAC_PT1411HWRU_MESSAGE_LENGTH * 2] = {0};
243 auto transmit = this->transmitter_->transmit();
244 auto *data = transmit.get_data();
249 message[1] = ~message[0];
282 message[3] = ~message[2];
285 temperature = (temperature * 1.8) + 32;
289 index =
static_cast<uint8_t
>(roundf(temp_adjd));
301 if (code & RAC_PT1411HWRU_FLAG_FRAC) {
304 if (code & RAC_PT1411HWRU_FLAG_NEG) {
309 switch (this->
mode) {
337 message[5] = ~message[4];
347 for (index = 6; index <= 10; index++) {
348 message[11] += message[index];
351 ESP_LOGV(TAG,
"*** Generated codes: 0x%.2X%.2X%.2X%.2X%.2X%.2X 0x%.2X%.2X%.2X%.2X%.2X%.2X", message[0], message[1],
352 message[2], message[3], message[4], message[5], message[6], message[7], message[8], message[9], message[10],
356 encode_(data, &message[0], RAC_PT1411HWRU_MESSAGE_LENGTH, 1);
358 if (message[6] != 0) {
359 encode_(data, &message[6], RAC_PT1411HWRU_MESSAGE_LENGTH, 0);
366 data->space(TOSHIBA_PACKET_SPACE);
377 data->space(TOSHIBA_PACKET_SPACE);
381 transmit_rac_pt1411hwru_temp_(
true,
false);
390 auto transmit = this->transmitter_->transmit();
391 auto *data = transmit.get_data();
404 message[1] = ~message[0];
406 message[2] =
static_cast<uint8_t
>(roundf(temperature));
407 if (cs_send_update) {
409 }
else if (cs_state) {
413 message[3] = ~message[2];
415 switch (this->
mode) {
431 message[5] = ~message[4];
433 ESP_LOGV(TAG,
"*** Generated code: 0x%.2X%.2X%.2X%.2X%.2X%.2X", message[0], message[1], message[2], message[3],
434 message[4], message[5]);
436 encode_(data, message, RAC_PT1411HWRU_MESSAGE_LENGTH, 1);
444 RAC_PT1411HWRU_SWING_HEADER};
446 for (
auto i : header) {
447 if ((message[0] == i) && (message[1] == static_cast<uint8_t>(~i)))
450 if (message[0] == RAC_PT1411HWRU_MESSAGE_HEADER1)
458 if (message1[i] != message2[i])
467 switch (is_valid_rac_pt1411hwru_header_(message)) {
471 if (is_valid_rac_pt1411hwru_header_(message) && (message[2] == static_cast<uint8_t>(~message[3])) &&
472 (message[4] == static_cast<uint8_t>(~message[5]))) {
478 for (uint8_t i = 0; i < RAC_PT1411HWRU_MESSAGE_LENGTH - 1; i++) {
479 checksum += message[i];
481 if (checksum == message[RAC_PT1411HWRU_MESSAGE_LENGTH - 1]) {
494 uint8_t message[18] = {0};
498 if (!data.
expect_item(TOSHIBA_HEADER_MARK, TOSHIBA_HEADER_SPACE)) {
502 if (!decode_(&data, message, message_length)) {
506 if (is_valid_rac_pt1411hwru_header_(message)) {
508 message_length = RAC_PT1411HWRU_MESSAGE_LENGTH - 4;
509 }
else if ((message[0] ^ message[1] ^ message[2]) != message[3]) {
514 message_length = message[2] + 2;
517 if (!decode_(&data, &message[4], message_length)) {
521 if (is_valid_rac_pt1411hwru_header_(message)) {
523 if (!data.
expect_item(TOSHIBA_BIT_MARK, TOSHIBA_GAP_SPACE)) {
527 if (!data.
expect_item(TOSHIBA_HEADER_MARK, TOSHIBA_HEADER_SPACE)) {
530 if (!decode_(&data, &message[6], RAC_PT1411HWRU_MESSAGE_LENGTH)) {
535 if (data.
expect_item(TOSHIBA_BIT_MARK, TOSHIBA_GAP_SPACE)) {
537 data.
expect_item(TOSHIBA_HEADER_MARK, TOSHIBA_HEADER_SPACE);
538 if (decode_(&data, &message[12], RAC_PT1411HWRU_MESSAGE_LENGTH)) {
539 if (!is_valid_rac_pt1411hwru_message_(&message[12])) {
545 if (!compare_rac_pt1411hwru_packets_(&message[0], &message[6])) {
549 if (!is_valid_rac_pt1411hwru_message_(&message[0])) {
556 switch (is_valid_rac_pt1411hwru_header_(message)) {
560 switch (message[4] & 0x0F) {
567 if (((message[4] >> 4) == RAC_PT1411HWRU_TEMPERATURE_FAN_ONLY) && (message[2] == RAC_PT1411HWRU_FAN_OFF)) {
576 if ((message[4] >> 4) == RAC_PT1411HWRU_TEMPERATURE_FAN_ONLY) {
592 switch (message[2]) {
611 if (is_valid_rac_pt1411hwru_message_(&message[12])) {
614 if (message[15] & RAC_PT1411HWRU_FLAG_FAH) {
660 for (uint8_t i = TOSHIBA_HEADER_LENGTH; i < message_length - 1; i++) {
661 checksum ^= message[i];
664 if (checksum != message[message_length - 1]) {
668 if (message[4] & TOSHIBA_COMMAND_MOTION) {
674 switch (message[6] & 0x0F) {
701 switch (message[6] & 0xF0) {
728 this->publish_state();
733 const uint8_t repeat) {
736 for (uint8_t copy = 0; copy <= repeat; copy++) {
737 data->
item(TOSHIBA_HEADER_MARK, TOSHIBA_HEADER_SPACE);
739 for (uint8_t byte = 0; byte < nbytes; byte++) {
740 for (uint8_t bit = 0; bit < 8; bit++) {
741 data->
mark(TOSHIBA_BIT_MARK);
742 if (message[byte] & (1 << (7 - bit))) {
743 data->
space(TOSHIBA_ONE_SPACE);
745 data->
space(TOSHIBA_ZERO_SPACE);
749 data->
item(TOSHIBA_BIT_MARK, TOSHIBA_GAP_SPACE);
754 for (uint8_t byte = 0; byte < nbytes; byte++) {
755 for (uint8_t bit = 0; bit < 8; bit++) {
756 if (data->
expect_item(TOSHIBA_BIT_MARK, TOSHIBA_ONE_SPACE)) {
757 message[byte] |= 1 << (7 - bit);
758 }
else if (data->
expect_item(TOSHIBA_BIT_MARK, TOSHIBA_ZERO_SPACE)) {
759 message[byte] &=
static_cast<uint8_t
>(~(1 << (7 - bit)));
The fan mode is set to Low.
const uint8_t RAC_PT1411HWRU_MESSAGE_LENGTH
The fan mode is set to Quiet.
const float TOSHIBA_RAC_PT1411HWRU_TEMP_C_MAX
const uint8_t TOSHIBA_HEADER_LENGTH
const std::vector< uint8_t > RAC_PT1411HWRU_TEMPERATURE_F
const uint16_t TOSHIBA_HEADER_MARK
const uint8_t RAC_PT1411HWRU_TEMPERATURE_FAN_ONLY
bool decode_(remote_base::RemoteReceiveData *data, uint8_t *message, uint8_t nbytes)
void transmit_state() override
const std::vector< uint8_t > RAC_PT1411HWRU_TEMPERATURE_C
const uint8_t TOSHIBA_FAN_SPEED_QUIET
void set_carrier_frequency(uint32_t carrier_frequency)
const uint8_t TOSHIBA_COMMAND_POWER
const uint8_t TOSHIBA_FAN_SPEED_3
void item(uint32_t mark, uint32_t space)
The climate device is set to heat to reach the target temperature.
const uint8_t TOSHIBA_FAN_SPEED_2
void transmit_rac_pt1411hwru_temp_(bool cs_state=true, bool cs_send_update=true)
const uint16_t TOSHIBA_ONE_SPACE
const uint8_t RAC_PT1411HWRU_SWING_HEADER
const uint8_t TOSHIBA_COMMAND_DEFAULT
const uint8_t TOSHIBA_COMMAND_MOTION
const uint16_t TOSHIBA_CARRIER_FREQUENCY
const RacPt1411hwruFanSpeed RAC_PT1411HWRU_NO_FAN
const uint8_t RAC_PT1411HWRU_MODE_AUTO
The climate device is set to dry/humidity mode.
constexpr RacPt1411hwruFanSpeed RAC_PT1411HWRU_FAN_LOW
const uint8_t RAC_PT1411HWRU_MODE_OFF
const uint8_t TOSHIBA_FAN_SPEED_5
const uint8_t TOSHIBA_MODE_DRY
const uint8_t TOSHIBA_MODE_FAN_ONLY
ClimateSwingMode swing_mode
const uint8_t RAC_PT1411HWRU_FAN_OFF
const uint8_t TOSHIBA_MOTION_FIX
bool on_receive(remote_base::RemoteReceiveData data) override
void transmit_rac_pt1411hwru_()
const uint8_t RAC_PT1411HWRU_FLAG_FAH
const uint8_t TOSHIBA_MODE_OFF
const uint16_t TOSHIBA_HEADER_SPACE
const float TOSHIBA_RAC_PT1411HWRU_TEMP_F_MIN
const uint16_t TOSHIBA_BIT_MARK
const uint8_t RAC_PT1411HWRU_FLAG_NEG
const uint8_t RAC_PT1411HWRU_FLAG_FRAC
The climate device is set to cool to reach the target temperature.
const uint8_t RAC_PT1411HWRU_CS_DATA
const uint8_t RAC_PT1411HWRU_MODE_COOL
The fan mode is set to Auto.
const uint8_t TOSHIBA_MODE_COOL
const uint8_t RAC_PT1411HWRU_MODE_HEAT
const uint16_t TOSHIBA_ZERO_SPACE
constexpr RacPt1411hwruFanSpeed RAC_PT1411HWRU_FAN_AUTO
BedjetMode mode
BedJet operating mode.
const uint8_t RAC_PT1411HWRU_FLAG_MASK
const std::vector< uint8_t > RAC_PT1411HWRU_SWING_OFF
const uint8_t RAC_PT1411HWRU_CS_FOOTER_HEAT
void mark(uint32_t length)
const uint16_t TOSHIBA_PACKET_SPACE
const uint8_t RAC_PT1411HWRU_MESSAGE_HEADER0
The climate device is set to heat/cool to reach the target temperature.
bool is_valid_rac_pt1411hwru_message_(const uint8_t *message)
The fan mode is set to Vertical.
void encode_(remote_base::RemoteTransmitData *data, const uint8_t *message, uint8_t nbytes, uint8_t repeat)
The fan mode is set to High.
The swing mode is set to Off.
The climate device is off.
const uint8_t RAC_PT1411HWRU_CS_HEADER
const uint8_t TOSHIBA_MODE_AUTO
const uint8_t TOSHIBA_FAN_SPEED_AUTO
const uint8_t TOSHIBA_MODE_HEAT
constexpr RacPt1411hwruFanSpeed RAC_PT1411HWRU_FAN_HIGH
const uint8_t RAC_PT1411HWRU_CS_ENABLED
const uint8_t TOSHIBA_COMMAND_TIMER
const float TOSHIBA_RAC_PT1411HWRU_TEMP_C_MIN
const uint8_t RAC_PT1411HWRU_MESSAGE_HEADER1
void space(uint32_t length)
const uint8_t RAC_PT1411HWRU_MODE_DRY
constexpr RacPt1411hwruFanSpeed RAC_PT1411HWRU_FAN_MED
Implementation of SPI Controller mode.
const uint16_t TOSHIBA_GAP_SPACE
const uint8_t TOSHIBA_FAN_SPEED_1
const uint8_t TOSHIBA_FAN_SPEED_4
const uint8_t RAC_PT1411HWRU_MODE_FAN
The fan mode is set to Medium.
const uint8_t RAC_PT1411HWRU_CS_FOOTER_COOL
const uint8_t TOSHIBA_POWER_ECO
bool expect_item(uint32_t mark, uint32_t space)
const std::vector< uint8_t > RAC_PT1411HWRU_SWING_VERTICAL
The climate device only has the fan enabled, no heating or cooling is taking place.
const uint8_t RAC_PT1411HWRU_CS_FOOTER_AUTO
const float TOSHIBA_GENERIC_TEMP_C_MAX
const float TOSHIBA_GENERIC_TEMP_C_MIN
const uint8_t TOSHIBA_MOTION_SWING
const uint8_t TOSHIBA_POWER_HIGH
bool compare_rac_pt1411hwru_packets_(const uint8_t *message1, const uint8_t *message2)
uint8_t is_valid_rac_pt1411hwru_header_(const uint8_t *message)