mirror of
https://github.com/esphome/esphome.git
synced 2024-11-22 11:47:30 +01:00
Remove climate legacy away flags (#4744)
This commit is contained in:
parent
6476357596
commit
c5efaa1c00
@ -862,8 +862,7 @@ message ClimateStateResponse {
|
|||||||
float target_temperature = 4;
|
float target_temperature = 4;
|
||||||
float target_temperature_low = 5;
|
float target_temperature_low = 5;
|
||||||
float target_temperature_high = 6;
|
float target_temperature_high = 6;
|
||||||
// For older peers, equal to preset == CLIMATE_PRESET_AWAY
|
bool unused_legacy_away = 7;
|
||||||
bool legacy_away = 7;
|
|
||||||
ClimateAction action = 8;
|
ClimateAction action = 8;
|
||||||
ClimateFanMode fan_mode = 9;
|
ClimateFanMode fan_mode = 9;
|
||||||
ClimateSwingMode swing_mode = 10;
|
ClimateSwingMode swing_mode = 10;
|
||||||
@ -886,9 +885,8 @@ message ClimateCommandRequest {
|
|||||||
float target_temperature_low = 7;
|
float target_temperature_low = 7;
|
||||||
bool has_target_temperature_high = 8;
|
bool has_target_temperature_high = 8;
|
||||||
float target_temperature_high = 9;
|
float target_temperature_high = 9;
|
||||||
// legacy, for older peers, newer ones should use CLIMATE_PRESET_AWAY in preset
|
bool unused_has_legacy_away = 10;
|
||||||
bool has_legacy_away = 10;
|
bool unused_legacy_away = 11;
|
||||||
bool legacy_away = 11;
|
|
||||||
bool has_fan_mode = 12;
|
bool has_fan_mode = 12;
|
||||||
ClimateFanMode fan_mode = 13;
|
ClimateFanMode fan_mode = 13;
|
||||||
bool has_swing_mode = 14;
|
bool has_swing_mode = 14;
|
||||||
|
@ -530,7 +530,6 @@ bool APIConnection::send_climate_state(climate::Climate *climate) {
|
|||||||
resp.custom_fan_mode = climate->custom_fan_mode.value();
|
resp.custom_fan_mode = climate->custom_fan_mode.value();
|
||||||
if (traits.get_supports_presets() && climate->preset.has_value()) {
|
if (traits.get_supports_presets() && climate->preset.has_value()) {
|
||||||
resp.preset = static_cast<enums::ClimatePreset>(climate->preset.value());
|
resp.preset = static_cast<enums::ClimatePreset>(climate->preset.value());
|
||||||
resp.legacy_away = resp.preset == enums::CLIMATE_PRESET_AWAY;
|
|
||||||
}
|
}
|
||||||
if (!traits.get_supported_custom_presets().empty() && climate->custom_preset.has_value())
|
if (!traits.get_supported_custom_presets().empty() && climate->custom_preset.has_value())
|
||||||
resp.custom_preset = climate->custom_preset.value();
|
resp.custom_preset = climate->custom_preset.value();
|
||||||
@ -591,8 +590,6 @@ void APIConnection::climate_command(const ClimateCommandRequest &msg) {
|
|||||||
call.set_target_temperature_low(msg.target_temperature_low);
|
call.set_target_temperature_low(msg.target_temperature_low);
|
||||||
if (msg.has_target_temperature_high)
|
if (msg.has_target_temperature_high)
|
||||||
call.set_target_temperature_high(msg.target_temperature_high);
|
call.set_target_temperature_high(msg.target_temperature_high);
|
||||||
if (msg.has_legacy_away)
|
|
||||||
call.set_preset(msg.legacy_away ? climate::CLIMATE_PRESET_AWAY : climate::CLIMATE_PRESET_HOME);
|
|
||||||
if (msg.has_fan_mode)
|
if (msg.has_fan_mode)
|
||||||
call.set_fan_mode(static_cast<climate::ClimateFanMode>(msg.fan_mode));
|
call.set_fan_mode(static_cast<climate::ClimateFanMode>(msg.fan_mode));
|
||||||
if (msg.has_custom_fan_mode)
|
if (msg.has_custom_fan_mode)
|
||||||
|
@ -3658,7 +3658,7 @@ bool ClimateStateResponse::decode_varint(uint32_t field_id, ProtoVarInt value) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case 7: {
|
case 7: {
|
||||||
this->legacy_away = value.as_bool();
|
this->unused_legacy_away = value.as_bool();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case 8: {
|
case 8: {
|
||||||
@ -3728,7 +3728,7 @@ void ClimateStateResponse::encode(ProtoWriteBuffer buffer) const {
|
|||||||
buffer.encode_float(4, this->target_temperature);
|
buffer.encode_float(4, this->target_temperature);
|
||||||
buffer.encode_float(5, this->target_temperature_low);
|
buffer.encode_float(5, this->target_temperature_low);
|
||||||
buffer.encode_float(6, this->target_temperature_high);
|
buffer.encode_float(6, this->target_temperature_high);
|
||||||
buffer.encode_bool(7, this->legacy_away);
|
buffer.encode_bool(7, this->unused_legacy_away);
|
||||||
buffer.encode_enum<enums::ClimateAction>(8, this->action);
|
buffer.encode_enum<enums::ClimateAction>(8, this->action);
|
||||||
buffer.encode_enum<enums::ClimateFanMode>(9, this->fan_mode);
|
buffer.encode_enum<enums::ClimateFanMode>(9, this->fan_mode);
|
||||||
buffer.encode_enum<enums::ClimateSwingMode>(10, this->swing_mode);
|
buffer.encode_enum<enums::ClimateSwingMode>(10, this->swing_mode);
|
||||||
@ -3769,8 +3769,8 @@ void ClimateStateResponse::dump_to(std::string &out) const {
|
|||||||
out.append(buffer);
|
out.append(buffer);
|
||||||
out.append("\n");
|
out.append("\n");
|
||||||
|
|
||||||
out.append(" legacy_away: ");
|
out.append(" unused_legacy_away: ");
|
||||||
out.append(YESNO(this->legacy_away));
|
out.append(YESNO(this->unused_legacy_away));
|
||||||
out.append("\n");
|
out.append("\n");
|
||||||
|
|
||||||
out.append(" action: ");
|
out.append(" action: ");
|
||||||
@ -3822,11 +3822,11 @@ bool ClimateCommandRequest::decode_varint(uint32_t field_id, ProtoVarInt value)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case 10: {
|
case 10: {
|
||||||
this->has_legacy_away = value.as_bool();
|
this->unused_has_legacy_away = value.as_bool();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case 11: {
|
case 11: {
|
||||||
this->legacy_away = value.as_bool();
|
this->unused_legacy_away = value.as_bool();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case 12: {
|
case 12: {
|
||||||
@ -3911,8 +3911,8 @@ void ClimateCommandRequest::encode(ProtoWriteBuffer buffer) const {
|
|||||||
buffer.encode_float(7, this->target_temperature_low);
|
buffer.encode_float(7, this->target_temperature_low);
|
||||||
buffer.encode_bool(8, this->has_target_temperature_high);
|
buffer.encode_bool(8, this->has_target_temperature_high);
|
||||||
buffer.encode_float(9, this->target_temperature_high);
|
buffer.encode_float(9, this->target_temperature_high);
|
||||||
buffer.encode_bool(10, this->has_legacy_away);
|
buffer.encode_bool(10, this->unused_has_legacy_away);
|
||||||
buffer.encode_bool(11, this->legacy_away);
|
buffer.encode_bool(11, this->unused_legacy_away);
|
||||||
buffer.encode_bool(12, this->has_fan_mode);
|
buffer.encode_bool(12, this->has_fan_mode);
|
||||||
buffer.encode_enum<enums::ClimateFanMode>(13, this->fan_mode);
|
buffer.encode_enum<enums::ClimateFanMode>(13, this->fan_mode);
|
||||||
buffer.encode_bool(14, this->has_swing_mode);
|
buffer.encode_bool(14, this->has_swing_mode);
|
||||||
@ -3968,12 +3968,12 @@ void ClimateCommandRequest::dump_to(std::string &out) const {
|
|||||||
out.append(buffer);
|
out.append(buffer);
|
||||||
out.append("\n");
|
out.append("\n");
|
||||||
|
|
||||||
out.append(" has_legacy_away: ");
|
out.append(" unused_has_legacy_away: ");
|
||||||
out.append(YESNO(this->has_legacy_away));
|
out.append(YESNO(this->unused_has_legacy_away));
|
||||||
out.append("\n");
|
out.append("\n");
|
||||||
|
|
||||||
out.append(" legacy_away: ");
|
out.append(" unused_legacy_away: ");
|
||||||
out.append(YESNO(this->legacy_away));
|
out.append(YESNO(this->unused_legacy_away));
|
||||||
out.append("\n");
|
out.append("\n");
|
||||||
|
|
||||||
out.append(" has_fan_mode: ");
|
out.append(" has_fan_mode: ");
|
||||||
|
@ -959,7 +959,7 @@ class ClimateStateResponse : public ProtoMessage {
|
|||||||
float target_temperature{0.0f};
|
float target_temperature{0.0f};
|
||||||
float target_temperature_low{0.0f};
|
float target_temperature_low{0.0f};
|
||||||
float target_temperature_high{0.0f};
|
float target_temperature_high{0.0f};
|
||||||
bool legacy_away{false};
|
bool unused_legacy_away{false};
|
||||||
enums::ClimateAction action{};
|
enums::ClimateAction action{};
|
||||||
enums::ClimateFanMode fan_mode{};
|
enums::ClimateFanMode fan_mode{};
|
||||||
enums::ClimateSwingMode swing_mode{};
|
enums::ClimateSwingMode swing_mode{};
|
||||||
@ -987,8 +987,8 @@ class ClimateCommandRequest : public ProtoMessage {
|
|||||||
float target_temperature_low{0.0f};
|
float target_temperature_low{0.0f};
|
||||||
bool has_target_temperature_high{false};
|
bool has_target_temperature_high{false};
|
||||||
float target_temperature_high{0.0f};
|
float target_temperature_high{0.0f};
|
||||||
bool has_legacy_away{false};
|
bool unused_has_legacy_away{false};
|
||||||
bool legacy_away{false};
|
bool unused_legacy_away{false};
|
||||||
bool has_fan_mode{false};
|
bool has_fan_mode{false};
|
||||||
enums::ClimateFanMode fan_mode{};
|
enums::ClimateFanMode fan_mode{};
|
||||||
bool has_swing_mode{false};
|
bool has_swing_mode{false};
|
||||||
|
@ -343,7 +343,7 @@ CLIMATE_CONTROL_ACTION_SCHEMA = cv.Schema(
|
|||||||
cv.Optional(CONF_TARGET_TEMPERATURE): cv.templatable(cv.temperature),
|
cv.Optional(CONF_TARGET_TEMPERATURE): cv.templatable(cv.temperature),
|
||||||
cv.Optional(CONF_TARGET_TEMPERATURE_LOW): cv.templatable(cv.temperature),
|
cv.Optional(CONF_TARGET_TEMPERATURE_LOW): cv.templatable(cv.temperature),
|
||||||
cv.Optional(CONF_TARGET_TEMPERATURE_HIGH): cv.templatable(cv.temperature),
|
cv.Optional(CONF_TARGET_TEMPERATURE_HIGH): cv.templatable(cv.temperature),
|
||||||
cv.Optional(CONF_AWAY): cv.templatable(cv.boolean),
|
cv.Optional(CONF_AWAY): cv.invalid("Use preset instead"),
|
||||||
cv.Exclusive(CONF_FAN_MODE, "fan_mode"): cv.templatable(
|
cv.Exclusive(CONF_FAN_MODE, "fan_mode"): cv.templatable(
|
||||||
validate_climate_fan_mode
|
validate_climate_fan_mode
|
||||||
),
|
),
|
||||||
@ -379,9 +379,6 @@ async def climate_control_to_code(config, action_id, template_arg, args):
|
|||||||
config[CONF_TARGET_TEMPERATURE_HIGH], args, float
|
config[CONF_TARGET_TEMPERATURE_HIGH], args, float
|
||||||
)
|
)
|
||||||
cg.add(var.set_target_temperature_high(template_))
|
cg.add(var.set_target_temperature_high(template_))
|
||||||
if CONF_AWAY in config:
|
|
||||||
template_ = await cg.templatable(config[CONF_AWAY], args, bool)
|
|
||||||
cg.add(var.set_away(template_))
|
|
||||||
if CONF_FAN_MODE in config:
|
if CONF_FAN_MODE in config:
|
||||||
template_ = await cg.templatable(config[CONF_FAN_MODE], args, ClimateFanMode)
|
template_ = await cg.templatable(config[CONF_FAN_MODE], args, ClimateFanMode)
|
||||||
cg.add(var.set_fan_mode(template_))
|
cg.add(var.set_fan_mode(template_))
|
||||||
|
@ -264,25 +264,11 @@ const optional<ClimateMode> &ClimateCall::get_mode() const { return this->mode_;
|
|||||||
const optional<float> &ClimateCall::get_target_temperature() const { return this->target_temperature_; }
|
const optional<float> &ClimateCall::get_target_temperature() const { return this->target_temperature_; }
|
||||||
const optional<float> &ClimateCall::get_target_temperature_low() const { return this->target_temperature_low_; }
|
const optional<float> &ClimateCall::get_target_temperature_low() const { return this->target_temperature_low_; }
|
||||||
const optional<float> &ClimateCall::get_target_temperature_high() const { return this->target_temperature_high_; }
|
const optional<float> &ClimateCall::get_target_temperature_high() const { return this->target_temperature_high_; }
|
||||||
optional<bool> ClimateCall::get_away() const {
|
|
||||||
if (!this->preset_.has_value())
|
|
||||||
return {};
|
|
||||||
return *this->preset_ == ClimatePreset::CLIMATE_PRESET_AWAY;
|
|
||||||
}
|
|
||||||
const optional<ClimateFanMode> &ClimateCall::get_fan_mode() const { return this->fan_mode_; }
|
const optional<ClimateFanMode> &ClimateCall::get_fan_mode() const { return this->fan_mode_; }
|
||||||
const optional<std::string> &ClimateCall::get_custom_fan_mode() const { return this->custom_fan_mode_; }
|
const optional<std::string> &ClimateCall::get_custom_fan_mode() const { return this->custom_fan_mode_; }
|
||||||
const optional<ClimatePreset> &ClimateCall::get_preset() const { return this->preset_; }
|
const optional<ClimatePreset> &ClimateCall::get_preset() const { return this->preset_; }
|
||||||
const optional<std::string> &ClimateCall::get_custom_preset() const { return this->custom_preset_; }
|
const optional<std::string> &ClimateCall::get_custom_preset() const { return this->custom_preset_; }
|
||||||
const optional<ClimateSwingMode> &ClimateCall::get_swing_mode() const { return this->swing_mode_; }
|
const optional<ClimateSwingMode> &ClimateCall::get_swing_mode() const { return this->swing_mode_; }
|
||||||
ClimateCall &ClimateCall::set_away(bool away) {
|
|
||||||
this->preset_ = away ? CLIMATE_PRESET_AWAY : CLIMATE_PRESET_HOME;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
ClimateCall &ClimateCall::set_away(optional<bool> away) {
|
|
||||||
if (away.has_value())
|
|
||||||
this->preset_ = *away ? CLIMATE_PRESET_AWAY : CLIMATE_PRESET_HOME;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
ClimateCall &ClimateCall::set_target_temperature_high(optional<float> target_temperature_high) {
|
ClimateCall &ClimateCall::set_target_temperature_high(optional<float> target_temperature_high) {
|
||||||
this->target_temperature_high_ = target_temperature_high;
|
this->target_temperature_high_ = target_temperature_high;
|
||||||
return *this;
|
return *this;
|
||||||
|
@ -64,10 +64,6 @@ class ClimateCall {
|
|||||||
* For climate devices with two point target temperature control
|
* For climate devices with two point target temperature control
|
||||||
*/
|
*/
|
||||||
ClimateCall &set_target_temperature_high(optional<float> target_temperature_high);
|
ClimateCall &set_target_temperature_high(optional<float> target_temperature_high);
|
||||||
ESPDEPRECATED("set_away() is deprecated, please use .set_preset(CLIMATE_PRESET_AWAY) instead", "v1.20")
|
|
||||||
ClimateCall &set_away(bool away);
|
|
||||||
ESPDEPRECATED("set_away() is deprecated, please use .set_preset(CLIMATE_PRESET_AWAY) instead", "v1.20")
|
|
||||||
ClimateCall &set_away(optional<bool> away);
|
|
||||||
/// Set the fan mode of the climate device.
|
/// Set the fan mode of the climate device.
|
||||||
ClimateCall &set_fan_mode(ClimateFanMode fan_mode);
|
ClimateCall &set_fan_mode(ClimateFanMode fan_mode);
|
||||||
/// Set the fan mode of the climate device.
|
/// Set the fan mode of the climate device.
|
||||||
@ -97,8 +93,6 @@ class ClimateCall {
|
|||||||
const optional<float> &get_target_temperature() const;
|
const optional<float> &get_target_temperature() const;
|
||||||
const optional<float> &get_target_temperature_low() const;
|
const optional<float> &get_target_temperature_low() const;
|
||||||
const optional<float> &get_target_temperature_high() const;
|
const optional<float> &get_target_temperature_high() const;
|
||||||
ESPDEPRECATED("get_away() is deprecated, please use .get_preset() instead", "v1.20")
|
|
||||||
optional<bool> get_away() const;
|
|
||||||
const optional<ClimateFanMode> &get_fan_mode() const;
|
const optional<ClimateFanMode> &get_fan_mode() const;
|
||||||
const optional<ClimateSwingMode> &get_swing_mode() const;
|
const optional<ClimateSwingMode> &get_swing_mode() const;
|
||||||
const optional<std::string> &get_custom_fan_mode() const;
|
const optional<std::string> &get_custom_fan_mode() const;
|
||||||
@ -184,14 +178,6 @@ class Climate : public EntityBase {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Whether the climate device is in away mode.
|
|
||||||
*
|
|
||||||
* Away allows climate devices to have two different target temperature configs:
|
|
||||||
* one for normal mode and one for away mode.
|
|
||||||
*/
|
|
||||||
ESPDEPRECATED("away is deprecated, use preset instead", "v1.20")
|
|
||||||
bool away{false};
|
|
||||||
|
|
||||||
/// The active fan mode of the climate device.
|
/// The active fan mode of the climate device.
|
||||||
optional<ClimateFanMode> fan_mode;
|
optional<ClimateFanMode> fan_mode;
|
||||||
|
|
||||||
|
@ -117,15 +117,6 @@ class ClimateTraits {
|
|||||||
bool supports_custom_preset(const std::string &custom_preset) const {
|
bool supports_custom_preset(const std::string &custom_preset) const {
|
||||||
return supported_custom_presets_.count(custom_preset);
|
return supported_custom_presets_.count(custom_preset);
|
||||||
}
|
}
|
||||||
ESPDEPRECATED("This method is deprecated, use set_supported_presets() instead", "v1.20")
|
|
||||||
void set_supports_away(bool supports) {
|
|
||||||
if (supports) {
|
|
||||||
supported_presets_.insert(CLIMATE_PRESET_AWAY);
|
|
||||||
supported_presets_.insert(CLIMATE_PRESET_HOME);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ESPDEPRECATED("This method is deprecated, use supports_preset() instead", "v1.20")
|
|
||||||
bool get_supports_away() const { return supports_preset(CLIMATE_PRESET_AWAY); }
|
|
||||||
|
|
||||||
void set_supported_swing_modes(std::set<ClimateSwingMode> modes) { supported_swing_modes_ = std::move(modes); }
|
void set_supported_swing_modes(std::set<ClimateSwingMode> modes) { supported_swing_modes_ = std::move(modes); }
|
||||||
void add_supported_swing_mode(ClimateSwingMode mode) { supported_swing_modes_.insert(mode); }
|
void add_supported_swing_mode(ClimateSwingMode mode) { supported_swing_modes_.insert(mode); }
|
||||||
|
@ -75,13 +75,8 @@ void MQTTClimateComponent::send_discovery(JsonObject root, mqtt::SendDiscoveryCo
|
|||||||
JsonArray presets = root.createNestedArray("preset_modes");
|
JsonArray presets = root.createNestedArray("preset_modes");
|
||||||
if (traits.supports_preset(CLIMATE_PRESET_HOME))
|
if (traits.supports_preset(CLIMATE_PRESET_HOME))
|
||||||
presets.add("home");
|
presets.add("home");
|
||||||
if (traits.supports_preset(CLIMATE_PRESET_AWAY)) {
|
if (traits.supports_preset(CLIMATE_PRESET_AWAY))
|
||||||
// away_mode_command_topic
|
|
||||||
root[MQTT_AWAY_MODE_COMMAND_TOPIC] = this->get_away_command_topic();
|
|
||||||
// away_mode_state_topic
|
|
||||||
root[MQTT_AWAY_MODE_STATE_TOPIC] = this->get_away_state_topic();
|
|
||||||
presets.add("away");
|
presets.add("away");
|
||||||
}
|
|
||||||
if (traits.supports_preset(CLIMATE_PRESET_BOOST))
|
if (traits.supports_preset(CLIMATE_PRESET_BOOST))
|
||||||
presets.add("boost");
|
presets.add("boost");
|
||||||
if (traits.supports_preset(CLIMATE_PRESET_COMFORT))
|
if (traits.supports_preset(CLIMATE_PRESET_COMFORT))
|
||||||
@ -197,29 +192,6 @@ void MQTTClimateComponent::setup() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (traits.supports_preset(CLIMATE_PRESET_AWAY)) {
|
|
||||||
this->subscribe(this->get_away_command_topic(), [this](const std::string &topic, const std::string &payload) {
|
|
||||||
auto onoff = parse_on_off(payload.c_str());
|
|
||||||
auto call = this->device_->make_call();
|
|
||||||
switch (onoff) {
|
|
||||||
case PARSE_ON:
|
|
||||||
call.set_preset(CLIMATE_PRESET_AWAY);
|
|
||||||
break;
|
|
||||||
case PARSE_OFF:
|
|
||||||
call.set_preset(CLIMATE_PRESET_HOME);
|
|
||||||
break;
|
|
||||||
case PARSE_TOGGLE:
|
|
||||||
call.set_preset(this->device_->preset == CLIMATE_PRESET_AWAY ? CLIMATE_PRESET_HOME : CLIMATE_PRESET_AWAY);
|
|
||||||
break;
|
|
||||||
case PARSE_NONE:
|
|
||||||
default:
|
|
||||||
ESP_LOGW(TAG, "Unknown payload '%s'", payload.c_str());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
call.perform();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (traits.get_supports_presets() || !traits.get_supported_custom_presets().empty()) {
|
if (traits.get_supports_presets() || !traits.get_supported_custom_presets().empty()) {
|
||||||
this->subscribe(this->get_preset_command_topic(), [this](const std::string &topic, const std::string &payload) {
|
this->subscribe(this->get_preset_command_topic(), [this](const std::string &topic, const std::string &payload) {
|
||||||
auto call = this->device_->make_call();
|
auto call = this->device_->make_call();
|
||||||
@ -301,11 +273,6 @@ bool MQTTClimateComponent::publish_state_() {
|
|||||||
success = false;
|
success = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (traits.supports_preset(CLIMATE_PRESET_AWAY)) {
|
|
||||||
std::string payload = ONOFF(this->device_->preset == CLIMATE_PRESET_AWAY);
|
|
||||||
if (!this->publish(this->get_away_state_topic(), payload))
|
|
||||||
success = false;
|
|
||||||
}
|
|
||||||
if (traits.get_supports_presets() || !traits.get_supported_custom_presets().empty()) {
|
if (traits.get_supports_presets() || !traits.get_supported_custom_presets().empty()) {
|
||||||
std::string payload;
|
std::string payload;
|
||||||
if (this->device_->preset.has_value()) {
|
if (this->device_->preset.has_value()) {
|
||||||
|
Loading…
Reference in New Issue
Block a user