11 static const std::string *bedjet_fan_step_to_fan_mode(
const uint8_t
fan_step) {
12 if (fan_step < BEDJET_FAN_SPEED_COUNT)
13 return &BEDJET_FAN_STEP_NAME_STRINGS[
fan_step];
17 static uint8_t bedjet_fan_speed_to_step(
const std::string &fan_step_percent) {
18 for (
int i = 0; i < BEDJET_FAN_SPEED_COUNT; i++) {
19 if (fan_step_percent == BEDJET_FAN_STEP_NAME_STRINGS[i]) {
33 LOG_CLIMATE(
"",
"BedJet Climate",
this);
34 auto traits = this->get_traits();
36 ESP_LOGCONFIG(TAG,
" Supported modes:");
37 for (
auto mode : traits.get_supported_modes()) {
41 ESP_LOGCONFIG(TAG,
" - BedJet heating mode: EXT HT");
43 ESP_LOGCONFIG(TAG,
" - BedJet heating mode: HEAT");
46 ESP_LOGCONFIG(TAG,
" Supported fan modes:");
47 for (
const auto &
mode : traits.get_supported_fan_modes()) {
50 for (
const auto &
mode : traits.get_supported_custom_fan_modes()) {
51 ESP_LOGCONFIG(TAG,
" - %s (c)",
mode.c_str());
54 ESP_LOGCONFIG(TAG,
" Supported presets:");
55 for (
auto preset : traits.get_supported_presets()) {
58 for (
const auto &
preset : traits.get_supported_custom_presets()) {
59 ESP_LOGCONFIG(TAG,
" - %s (c)",
preset.c_str());
65 auto restore = this->restore_state_();
66 if (restore.has_value()) {
67 ESP_LOGI(TAG,
"Restored previous saved state.");
80 this->current_temperature = NAN;
83 this->publish_state();
89 ESP_LOGD(TAG,
"Received BedJetClimate::control");
90 if (!this->parent_->is_connected()) {
91 ESP_LOGW(TAG,
"Not connected, cannot handle control call yet.");
100 button_result = this->parent_->button_off();
103 button_result = this->parent_->send_button(heat_button(this->heating_mode_));
106 button_result = this->parent_->button_cool();
109 button_result = this->parent_->button_dry();
112 ESP_LOGW(TAG,
"Unsupported mode: %d", mode);
126 auto result = this->parent_->set_target_temp(target_temp);
139 result = this->parent_->button_turbo();
149 result = this->parent_->send_button(heat_button(this->heating_mode_));
151 this->preset.reset();
155 ESP_LOGD(TAG,
"Ignoring preset '%s' call; with current mode '%s' and preset '%s'",
160 ESP_LOGW(TAG,
"Unsupported preset: %d", preset);
167 if (preset ==
"M1") {
168 result = this->parent_->button_memory1();
169 }
else if (preset ==
"M2") {
170 result = this->parent_->button_memory2();
171 }
else if (preset ==
"M3") {
172 result = this->parent_->button_memory3();
173 }
else if (preset ==
"LTD HT") {
174 result = this->parent_->button_heat();
175 }
else if (preset ==
"EXT HT") {
176 result = this->parent_->button_ext_heat();
178 ESP_LOGW(TAG,
"Unsupported preset: %s", preset.c_str());
184 this->preset.reset();
194 result = this->parent_->set_fan_speed(20);
196 result = this->parent_->set_fan_speed(50);
198 result = this->parent_->set_fan_speed(75);
200 ESP_LOGW(TAG,
"[%s] Unsupported fan mode: %s", this->get_name().c_str(),
211 auto fan_index = bedjet_fan_speed_to_step(
fan_mode);
212 if (fan_index <= 19) {
213 ESP_LOGV(TAG,
"[%s] Converted fan mode %s to bedjet fan step %d", this->get_name().c_str(),
fan_mode.c_str(),
215 bool result = this->parent_->set_fan_index(fan_index);
227 ESP_LOGV(TAG,
"[%s] Handling on_status with data=%p", this->get_name().c_str(), (
void *) data);
230 if (converted_temp > 0)
238 if (converted_temp > 0) {
239 this->current_temperature = converted_temp;
242 const auto *fan_mode_name = bedjet_fan_step_to_fan_mode(data->fan_step);
243 if (fan_mode_name !=
nullptr) {
248 switch (data->mode) {
263 this->set_custom_preset_(
"LTD HT");
276 this->set_custom_preset_(
"EXT HT");
302 ESP_LOGW(TAG,
"[%s] Unexpected mode: 0x%02X", this->get_name().c_str(), data->mode);
306 ESP_LOGV(TAG,
"[%s] After on_status, new mode=%s", this->get_name().c_str(),
309 this->publish_state();
320 if (!this->parent_->is_connected())
322 if (!this->parent_->has_status())
325 auto *
status = this->parent_->get_status_packet();
332 if (this->is_valid_()) {
334 this->publish_state();
335 this->status_clear_warning();
343 ESP_LOGD(TAG,
"[%s] update()", this->get_name().c_str());
346 auto result = this->update_status_();
347 ESP_LOGD(TAG,
"[%s] update_status result=%s", this->get_name().c_str(), result ?
"true" :
"false");
void on_bedjet_state(bool is_ready) override
This class is used to encode all control actions on a climate device.
ClimatePreset
Enum for all preset modes.
void reset_state_()
Resets states to defaults.
const optional< ClimateMode > & get_mode() const
Enter Extended Heat mode (limited to 10 hours)
const LogString * climate_mode_to_string(ClimateMode mode)
Convert the given ClimateMode to a human-readable string.
BedJet is in Extended Heat mode (limited to 10 hours)
Enter Heat mode (limited to 4 hours)
BedJet is in "wait" mode, a step during a biorhythm program.
The format of a BedJet V3 status packet.
float bedjet_temp_to_c(uint8_t temp)
Converts a BedJet temp step into degrees Celsius.
BedJet is in Dry mode (high speed, no heat)
BedJet is in Cool mode (actually "Fan only" mode)
bool update_status_()
Attempts to update the climate device from the last received BedjetStatusPacket.
std::string describe() override
HVACMode.HEAT is handled using BTN_EXTHT.
const optional< std::string > & get_custom_preset() const
const optional< ClimatePreset > & get_preset() const
void control(const climate::ClimateCall &call) override
BedJet is in Heat mode (limited to 4 hours)
BedjetMode mode
BedJet operating mode.
const LogString * climate_preset_to_string(ClimatePreset preset)
Convert the given PresetMode to a human-readable string.
const optional< std::string > & get_custom_fan_mode() const
const optional< float > & get_target_temperature() const
ClimateMode
Enum for all modes a climate device can be in.
const LogString * climate_fan_mode_to_string(ClimateFanMode fan_mode)
Convert the given ClimateFanMode to a human-readable string.
const optional< ClimateFanMode > & get_fan_mode() const
BedJet is in Turbo mode (high heat, limited time)
BedjetHeatMode
Optional heating strategies to use for climate::CLIMATE_MODE_HEAT.
Implementation of SPI Controller mode.
uint8_t fan_step
BedJet fan speed; value is in the 0-19 range, representing 5% increments (5%-100%): `5 + 5...
void dump_config() override
void on_status(const BedjetStatusPacket *data) override