ESPHome 2026.11.0-dev
Loading...
Searching...
No Matches
yashima.cpp
Go to the documentation of this file.
1#include "yashima.h"
2#include "esphome/core/log.h"
3
4namespace esphome::yashima {
5
6ESPHOME_LOG_TAG(TAG, "yashima.climate");
7
8const uint16_t YASHIMA_STATE_LENGTH = 9;
9const uint16_t YASHIMA_BITS = YASHIMA_STATE_LENGTH * 8;
10
11/* the bit masks are intended to be sent from the MSB to the LSB */
12const uint8_t YASHIMA_MODE_HEAT_BYTE0 = 0b00100000;
13const uint8_t YASHIMA_MODE_DRY_BYTE0 = 0b01100000;
14const uint8_t YASHIMA_MODE_COOL_BYTE0 = 0b11100000;
15const uint8_t YASHIMA_MODE_FAN_BYTE0 = 0b10100000;
16const uint8_t YASHIMA_MODE_AUTO_BYTE0 = 0b11100000;
17const uint8_t YASHIMA_MODE_OFF_BYTE0 = 0b11110000;
18const uint8_t YASHIMA_BASE_BYTE0 = 0b1110;
19
20const uint8_t YASHIMA_TEMP_MAX = 30; // Celsius
21const uint8_t YASHIMA_TEMP_MIN = 16; // Celsius
23
25 0b01100100, // 16C
26 0b10100100, // 17C
27 0b00100100, // 18C
28 0b11000100, // 19C
29 0b01000100, // 20C
30 0b10000100, // 21C
31 0b00000100, // 22C
32 0b11111000, // 23C
33 0b01111000, // 24C
34 0b10111000, // 25C
35 0b00111000, // 26C
36 0b11011000, // 27C
37 0b01011000, // 28C
38 0b10011000, // 29C
39 0b00011000, // 30C
40};
41const uint8_t YASHIMA_BASE_BYTE1 = 0b11;
42
43const uint8_t YASHIMA_FAN_AUTO_BYTE2 = 0b11000000;
44const uint8_t YASHIMA_FAN_LOW_BYTE2 = 0b00000000;
45const uint8_t YASHIMA_FAN_MEDIUM_BYTE2 = 0b10000000;
46const uint8_t YASHIMA_FAN_HIGH_BYTE2 = 0b01000000;
47const uint8_t YASHIMA_BASE_BYTE2 = 0b111111;
48
49const uint8_t YASHIMA_BASE_BYTE3 = 0b11111111;
50const uint8_t YASHIMA_BASE_BYTE4 = 0b11;
51
52const uint8_t YASHIMA_MODE_HEAT_BYTE5 = 0b00000000;
53const uint8_t YASHIMA_MODE_DRY_BYTE5 = 0b00000000;
54const uint8_t YASHIMA_MODE_FAN_BYTE5 = 0b00000000;
55const uint8_t YASHIMA_MODE_AUTO_BYTE5 = 0b00000000;
56const uint8_t YASHIMA_MODE_COOL_BYTE5 = 0b10000000;
57const uint8_t YASHIMA_MODE_OFF_BYTE5 = 0b10000000;
58const uint8_t YASHIMA_BASE_BYTE5 = 0b11111;
59
60const uint8_t YASHIMA_BASE_BYTE6 = 0b11111111;
61const uint8_t YASHIMA_BASE_BYTE7 = 0b11111111;
62const uint8_t YASHIMA_BASE_BYTE8 = 0b11001111;
63
64/* values sampled using a Broadlink Mini 3: */
65// const uint16_t YASHIMA_HEADER_MARK = 9600;
66// const uint16_t YASHIMA_HEADER_SPACE = 4800;
67// const uint16_t YASHIMA_BIT_MARK = 720;
68// const uint16_t YASHIMA_ONE_SPACE = 550;
69// const uint16_t YASHIMA_ZERO_SPACE = 1640;
70
71/* scaled values to get correct timing on ESP8266/ESP32: */
72const uint16_t YASHIMA_HEADER_MARK = 9035;
73const uint16_t YASHIMA_HEADER_SPACE = 4517;
74const uint16_t YASHIMA_BIT_MARK = 667;
75const uint16_t YASHIMA_ONE_SPACE = 517;
76const uint16_t YASHIMA_ZERO_SPACE = 1543;
78static constexpr remote_base::BitTimings YASHIMA_BIT_TIMINGS{.bit_mark = YASHIMA_BIT_MARK,
79 .one_space = YASHIMA_ONE_SPACE,
80 .zero_space = YASHIMA_ZERO_SPACE,
82
84
102
104 if (this->sensor_) {
105 this->sensor_->add_on_state_callback([this](float state) {
107 // current temperature changed, publish state
108 this->publish_state();
109 });
110 this->current_temperature = this->sensor_->state;
111 } else {
112 this->current_temperature = NAN;
113 }
114 // restore set points
115 auto restore = this->restore_state_();
116 if (restore.has_value()) {
117 restore->apply(this);
118 } else {
119 // restore from defaults
121 this->target_temperature = 24;
122 }
123}
124
126 auto call_mode = call.get_mode();
127 if (call_mode.has_value())
128 this->mode = *call_mode;
129 auto call_target = call.get_target_temperature();
130 if (call_target.has_value())
131 this->target_temperature = *call_target;
132
133 this->transmit_state_();
134 this->publish_state();
135}
136
138 uint8_t remote_state[YASHIMA_STATE_LENGTH] = {0};
139
140 remote_state[0] = YASHIMA_BASE_BYTE0;
141 remote_state[1] = YASHIMA_BASE_BYTE1;
142 remote_state[2] = YASHIMA_BASE_BYTE2;
143 remote_state[3] = YASHIMA_BASE_BYTE3;
144 remote_state[4] = YASHIMA_BASE_BYTE4;
145 remote_state[5] = YASHIMA_BASE_BYTE5;
146 remote_state[6] = YASHIMA_BASE_BYTE6;
147 remote_state[7] = YASHIMA_BASE_BYTE7;
148 remote_state[8] = YASHIMA_BASE_BYTE8;
149
150 // Set mode
151 switch (this->mode) {
153 remote_state[0] |= YASHIMA_MODE_AUTO_BYTE0;
154 remote_state[5] |= YASHIMA_MODE_AUTO_BYTE5;
155 break;
157 remote_state[0] |= YASHIMA_MODE_COOL_BYTE0;
158 remote_state[5] |= YASHIMA_MODE_COOL_BYTE5;
159 break;
161 remote_state[0] |= YASHIMA_MODE_HEAT_BYTE0;
162 remote_state[5] |= YASHIMA_MODE_HEAT_BYTE5;
163 break;
165 default:
166 remote_state[0] |= YASHIMA_MODE_OFF_BYTE0;
167 remote_state[5] |= YASHIMA_MODE_OFF_BYTE5;
168 break;
169 // TODO: CLIMATE_MODE_FAN_ONLY, CLIMATE_MODE_DRY are missing in esphome
170 }
171
172 // TODO: missing support for fan speed
173 remote_state[2] |= YASHIMA_FAN_AUTO_BYTE2;
174
175 // Set temperature
176 uint8_t safecelsius = std::max((uint8_t) this->target_temperature, YASHIMA_TEMP_MIN);
177 safecelsius = std::min(safecelsius, YASHIMA_TEMP_MAX);
178 remote_state[1] |= YASHIMA_TEMP_MAP_BYTE1[safecelsius - YASHIMA_TEMP_MIN];
179
180 auto transmit = this->transmitter_->transmit();
181 auto *data = transmit.get_data();
182
183 data->set_carrier_frequency(YASHIMA_CARRIER_FREQUENCY);
184
185 // Header
186 data->mark(YASHIMA_HEADER_MARK);
187 data->space(YASHIMA_HEADER_SPACE);
188 data->item_bytes<YASHIMA_BIT_TIMINGS>(remote_state, YASHIMA_STATE_LENGTH);
189 // Footer
190 data->mark(YASHIMA_BIT_MARK);
191 data->space(YASHIMA_GAP);
192
193 transmit.perform();
194}
195
196} // namespace esphome::yashima
This class is used to encode all control actions on a climate device.
Definition climate.h:31
ClimateMode mode
The active mode of the climate device.
Definition climate.h:317
float target_temperature
The target temperature of the climate device.
Definition climate.h:298
float current_temperature
The current temperature of the climate device, as reported from the integration.
Definition climate.h:291
void publish_state()
Publish the state of the climate device, to be called from integrations.
Definition climate.cpp:432
optional< ClimateDeviceRestoreState > restore_state_()
Restore the state of the climate device, call this from your setup() method.
Definition climate.cpp:365
void set_visual_max_temperature(float visual_max_temperature)
void add_feature_flags(uint32_t feature_flags)
void set_visual_temperature_step(float temperature_step)
void set_visual_min_temperature(float visual_min_temperature)
void set_supported_modes(ClimateModeMask modes)
void add_supported_mode(ClimateMode mode)
void add_on_state_callback(F &&callback)
Add a callback that will be called every time a filtered value arrives.
Definition sensor.h:121
float state
This member variable stores the last state that has passed through all filters.
Definition sensor.h:140
void transmit_state_()
Transmit via IR the state of this climate controller.
Definition yashima.cpp:137
climate::ClimateTraits traits() override
Return the traits of this controller.
Definition yashima.cpp:85
void control(const climate::ClimateCall &call) override
Override control to change settings of the climate device.
Definition yashima.cpp:125
remote_transmitter::RemoteTransmitterComponent * transmitter_
Definition yashima.h:34
bool state
Definition fan.h:2
@ CLIMATE_SUPPORTS_CURRENT_TEMPERATURE
@ CLIMATE_MODE_HEAT
The climate device is set to heat to reach the target temperature.
@ CLIMATE_MODE_COOL
The climate device is set to cool to reach the target temperature.
@ CLIMATE_MODE_HEAT_COOL
The climate device is set to heat/cool to reach the target temperature.
@ CLIMATE_MODE_OFF
The climate device is off.
const uint8_t YASHIMA_BASE_BYTE1
Definition yashima.cpp:41
const uint8_t YASHIMA_MODE_COOL_BYTE5
Definition yashima.cpp:56
const uint8_t YASHIMA_MODE_AUTO_BYTE5
Definition yashima.cpp:55
const uint8_t YASHIMA_TEMP_MIN
Definition yashima.cpp:21
const uint16_t YASHIMA_HEADER_MARK
Definition yashima.cpp:72
const uint8_t YASHIMA_BASE_BYTE8
Definition yashima.cpp:62
const uint16_t YASHIMA_HEADER_SPACE
Definition yashima.cpp:73
const uint32_t YASHIMA_GAP
Definition yashima.cpp:77
ESPHOME_LOG_TAG(TAG, "yashima.climate")
const uint8_t YASHIMA_MODE_HEAT_BYTE5
Definition yashima.cpp:52
const uint8_t YASHIMA_MODE_DRY_BYTE0
Definition yashima.cpp:13
const uint8_t YASHIMA_FAN_HIGH_BYTE2
Definition yashima.cpp:46
const uint8_t YASHIMA_TEMP_RANGE
Definition yashima.cpp:22
const uint8_t YASHIMA_TEMP_MAX
Definition yashima.cpp:20
const uint8_t YASHIMA_FAN_AUTO_BYTE2
Definition yashima.cpp:43
const uint16_t YASHIMA_BITS
Definition yashima.cpp:9
const uint16_t YASHIMA_BIT_MARK
Definition yashima.cpp:74
const uint32_t YASHIMA_CARRIER_FREQUENCY
Definition yashima.cpp:83
const uint8_t YASHIMA_BASE_BYTE3
Definition yashima.cpp:49
const uint16_t YASHIMA_ZERO_SPACE
Definition yashima.cpp:76
const uint8_t YASHIMA_MODE_OFF_BYTE5
Definition yashima.cpp:57
const uint8_t YASHIMA_BASE_BYTE2
Definition yashima.cpp:47
const uint8_t YASHIMA_BASE_BYTE5
Definition yashima.cpp:58
const uint8_t YASHIMA_MODE_AUTO_BYTE0
Definition yashima.cpp:16
const uint8_t YASHIMA_MODE_FAN_BYTE0
Definition yashima.cpp:15
const uint8_t YASHIMA_MODE_OFF_BYTE0
Definition yashima.cpp:17
const uint8_t YASHIMA_MODE_DRY_BYTE5
Definition yashima.cpp:53
const uint8_t YASHIMA_BASE_BYTE4
Definition yashima.cpp:50
const uint8_t YASHIMA_MODE_FAN_BYTE5
Definition yashima.cpp:54
const uint16_t YASHIMA_STATE_LENGTH
Definition yashima.cpp:8
const uint16_t YASHIMA_ONE_SPACE
Definition yashima.cpp:75
const uint8_t YASHIMA_FAN_LOW_BYTE2
Definition yashima.cpp:44
const uint8_t YASHIMA_FAN_MEDIUM_BYTE2
Definition yashima.cpp:45
const uint8_t YASHIMA_BASE_BYTE6
Definition yashima.cpp:60
const uint8_t YASHIMA_MODE_COOL_BYTE0
Definition yashima.cpp:14
const uint8_t YASHIMA_TEMP_MAP_BYTE1[YASHIMA_TEMP_RANGE]
Definition yashima.cpp:24
const uint8_t YASHIMA_BASE_BYTE7
Definition yashima.cpp:61
const uint8_t YASHIMA_MODE_HEAT_BYTE0
Definition yashima.cpp:12
const uint8_t YASHIMA_BASE_BYTE0
Definition yashima.cpp:18
static void uint32_t
A bit is a mark (one_mark or zero_mark, both bit_mark unless set) and a space (one_space or zero_spac...
Definition remote_base.h:29