Fix climate component

This commit is contained in:
Your Name 2023-03-23 12:02:08 +01:00
parent a9115c0d9a
commit 54e289a860
6 changed files with 224 additions and 35 deletions

View File

@ -10,24 +10,37 @@ void TrumaRoomClimate::setup() {
// Publish updated state // Publish updated state
this->target_temperature = temp_code_to_decimal(status_heater->target_temp_room); this->target_temperature = temp_code_to_decimal(status_heater->target_temp_room);
this->current_temperature = temp_code_to_decimal(status_heater->current_temp_room); this->current_temperature = temp_code_to_decimal(status_heater->current_temp_room);
this->mode = (status_heater->operating_status >= OperatingStatus::OPERATING_STATUS_START_OR_COOL_DOWN) this->mode = std::isnan(this->target_temperature) ? climate::CLIMATE_MODE_OFF : climate::CLIMATE_MODE_HEAT;
? climate::CLIMATE_MODE_HEAT
: climate::CLIMATE_MODE_OFF;
switch (status_heater->heating_mode) { switch (status_heater->heating_mode) {
case HeatingMode::HEATING_MODE_ECO: case HeatingMode::HEATING_MODE_ECO:
this->preset = climate::CLIMATE_PRESET_ECO; this->fan_mode = climate::CLIMATE_FAN_LOW;
break; break;
case HeatingMode::HEATING_MODE_HIGH: case HeatingMode::HEATING_MODE_HIGH:
this->preset = climate::CLIMATE_PRESET_COMFORT; this->fan_mode = climate::CLIMATE_FAN_MEDIUM;
break; break;
case HeatingMode::HEATING_MODE_BOOST: case HeatingMode::HEATING_MODE_BOOST:
this->preset = climate::CLIMATE_PRESET_BOOST; this->fan_mode = climate::CLIMATE_FAN_HIGH;
break; break;
default: default:
this->preset = climate::CLIMATE_PRESET_NONE; this->fan_mode = climate::CLIMATE_FAN_OFF;
break; break;
} }
// switch (status_heater->heating_mode) {
// case HeatingMode::HEATING_MODE_ECO:
// this->preset = climate::CLIMATE_PRESET_ECO;
// break;
// case HeatingMode::HEATING_MODE_HIGH:
// this->preset = climate::CLIMATE_PRESET_COMFORT;
// break;
// case HeatingMode::HEATING_MODE_BOOST:
// this->preset = climate::CLIMATE_PRESET_BOOST;
// break;
// default:
// this->preset = climate::CLIMATE_PRESET_NONE;
// break;
// }
this->publish_state(); this->publish_state();
}); });
} }
@ -35,7 +48,7 @@ void TrumaRoomClimate::setup() {
void TrumaRoomClimate::dump_config() { LOG_CLIMATE(TAG, "Truma Room Climate", this); } void TrumaRoomClimate::dump_config() { LOG_CLIMATE(TAG, "Truma Room Climate", this); }
void TrumaRoomClimate::control(const climate::ClimateCall &call) { void TrumaRoomClimate::control(const climate::ClimateCall &call) {
if (call.get_target_temperature().has_value()) { if (call.get_target_temperature().has_value() && !call.get_fan_mode().has_value()) {
float temp = *call.get_target_temperature(); float temp = *call.get_target_temperature();
this->parent_->get_heater()->action_heater_room(static_cast<u_int8_t>(temp)); this->parent_->get_heater()->action_heater_room(static_cast<u_int8_t>(temp));
} }
@ -56,28 +69,62 @@ void TrumaRoomClimate::control(const climate::ClimateCall &call) {
} }
} }
if (call.get_preset().has_value()) { if (call.get_fan_mode().has_value()) {
climate::ClimatePreset pres = *call.get_preset(); auto fan_mode = *call.get_fan_mode();
auto status_heater = this->parent_->get_heater()->get_status(); auto status_heater = this->parent_->get_heater()->get_status();
auto current_target_temp = temp_code_to_decimal(status_heater->target_temp_room); float temp = temp_code_to_decimal(status_heater->target_temp_room, 0);
if (call.get_target_temperature().has_value()) { if (call.get_target_temperature().has_value()) {
current_target_temp = *call.get_target_temperature(); temp = *call.get_target_temperature();
}
switch (fan_mode) {
case climate::CLIMATE_FAN_LOW:
case climate::CLIMATE_FAN_MEDIUM:
case climate::CLIMATE_FAN_HIGH:
if (temp < 5) {
temp = 5;
} }
switch (pres) {
case climate::CLIMATE_PRESET_ECO:
this->parent_->get_heater()->action_heater_room(current_target_temp, HeatingMode::HEATING_MODE_ECO);
break; break;
case climate::CLIMATE_PRESET_COMFORT: default:
this->parent_->get_heater()->action_heater_room(current_target_temp, HeatingMode::HEATING_MODE_HIGH);
break; break;
case climate::CLIMATE_PRESET_BOOST: }
this->parent_->get_heater()->action_heater_room(current_target_temp, HeatingMode::HEATING_MODE_BOOST); switch (fan_mode) {
case climate::CLIMATE_FAN_LOW:
this->parent_->get_heater()->action_heater_room(static_cast<u_int8_t>(temp), HeatingMode::HEATING_MODE_ECO);
break;
case climate::CLIMATE_FAN_MEDIUM:
this->parent_->get_heater()->action_heater_room(static_cast<u_int8_t>(temp), HeatingMode::HEATING_MODE_HIGH);
break;
case climate::CLIMATE_FAN_HIGH:
this->parent_->get_heater()->action_heater_room(static_cast<u_int8_t>(temp), HeatingMode::HEATING_MODE_BOOST);
break; break;
default: default:
this->parent_->get_heater()->action_heater_room(0); this->parent_->get_heater()->action_heater_room(0);
break; break;
} }
} }
// if (call.get_preset().has_value()) {
// climate::ClimatePreset pres = *call.get_preset();
// auto status_heater = this->parent_->get_heater()->get_status();
// auto current_target_temp = temp_code_to_decimal(status_heater->target_temp_room);
// if (call.get_target_temperature().has_value()) {
// current_target_temp = *call.get_target_temperature();
// }
// switch (pres) {
// case climate::CLIMATE_PRESET_ECO:
// this->parent_->get_heater()->action_heater_room(current_target_temp, HeatingMode::HEATING_MODE_ECO);
// break;
// case climate::CLIMATE_PRESET_COMFORT:
// this->parent_->get_heater()->action_heater_room(current_target_temp, HeatingMode::HEATING_MODE_HIGH);
// break;
// case climate::CLIMATE_PRESET_BOOST:
// this->parent_->get_heater()->action_heater_room(current_target_temp, HeatingMode::HEATING_MODE_BOOST);
// break;
// default:
// this->parent_->get_heater()->action_heater_room(0);
// break;
// }
// }
} }
climate::ClimateTraits TrumaRoomClimate::traits() { climate::ClimateTraits TrumaRoomClimate::traits() {
@ -85,17 +132,18 @@ climate::ClimateTraits TrumaRoomClimate::traits() {
auto traits = climate::ClimateTraits(); auto traits = climate::ClimateTraits();
traits.set_supports_current_temperature(true); traits.set_supports_current_temperature(true);
traits.set_supported_modes({climate::CLIMATE_MODE_OFF, climate::CLIMATE_MODE_HEAT}); traits.set_supported_modes({climate::CLIMATE_MODE_OFF, climate::CLIMATE_MODE_HEAT});
// traits.set_supported_fan_modes({{ traits.set_supported_fan_modes({{
// climate::CLIMATE_FAN_LOW, climate::CLIMATE_FAN_OFF,
// climate::CLIMATE_FAN_MEDIUM, climate::CLIMATE_FAN_LOW,
// climate::CLIMATE_FAN_HIGH, climate::CLIMATE_FAN_MEDIUM,
// }}); climate::CLIMATE_FAN_HIGH,
traits.set_supported_presets({{
climate::CLIMATE_PRESET_NONE,
climate::CLIMATE_PRESET_ECO,
climate::CLIMATE_PRESET_COMFORT,
climate::CLIMATE_PRESET_BOOST,
}}); }});
// traits.set_supported_presets({{
// climate::CLIMATE_PRESET_NONE,
// climate::CLIMATE_PRESET_ECO,
// climate::CLIMATE_PRESET_COMFORT,
// climate::CLIMATE_PRESET_BOOST,
// }});
traits.set_visual_min_temperature(5); traits.set_visual_min_temperature(5);
traits.set_visual_max_temperature(30); traits.set_visual_max_temperature(30);
traits.set_visual_temperature_step(1); traits.set_visual_temperature_step(1);

View File

@ -37,7 +37,7 @@ TargetTemp decimal_to_room_temp(u_int8_t val) {
if (val == 0) { if (val == 0) {
return TargetTemp::TARGET_TEMP_OFF; return TargetTemp::TARGET_TEMP_OFF;
} }
if (val <= 5) { if (val < 5) {
return TargetTemp::TARGET_TEMP_OFF; return TargetTemp::TARGET_TEMP_OFF;
} }
if (val >= 30) { if (val >= 30) {
@ -47,10 +47,10 @@ TargetTemp decimal_to_room_temp(u_int8_t val) {
} }
TargetTemp decimal_to_room_temp(float val) { TargetTemp decimal_to_room_temp(float val) {
if (val == NAN) { if (std::isnan(val)) {
return TargetTemp::TARGET_TEMP_OFF; return TargetTemp::TARGET_TEMP_OFF;
} }
if (val <= 5) { if (val < 5) {
return TargetTemp::TARGET_TEMP_OFF; return TargetTemp::TARGET_TEMP_OFF;
} }
if (val >= 30) { if (val >= 30) {
@ -63,7 +63,7 @@ TargetTemp decimal_to_aircon_temp(u_int8_t val) {
if (val == 0) { if (val == 0) {
return TargetTemp::TARGET_TEMP_OFF; return TargetTemp::TARGET_TEMP_OFF;
} }
if (val <= 16) { if (val < 16) {
return TargetTemp::TARGET_TEMP_OFF; return TargetTemp::TARGET_TEMP_OFF;
} }
if (val >= 31) { if (val >= 31) {
@ -73,10 +73,10 @@ TargetTemp decimal_to_aircon_temp(u_int8_t val) {
} }
TargetTemp decimal_to_aircon_temp(float val) { TargetTemp decimal_to_aircon_temp(float val) {
if (val == NAN) { if (std::isnan(val)) {
return TargetTemp::TARGET_TEMP_OFF; return TargetTemp::TARGET_TEMP_OFF;
} }
if (val <= 16) { if (val < 16) {
return TargetTemp::TARGET_TEMP_OFF; return TargetTemp::TARGET_TEMP_OFF;
} }
if (val >= 31) { if (val >= 31) {
@ -97,6 +97,18 @@ TargetTemp decimal_to_water_temp(u_int8_t val) {
} }
} }
TargetTemp decimal_to_water_temp(float val) {
if (std::isnan(val) || val < 40) {
return TargetTemp::TARGET_TEMP_OFF;
} else if (val >= 40 && val < 60) {
return TargetTemp::TARGET_TEMP_WATER_ECO;
} else if (val >= 60 && val < 80) {
return TargetTemp::TARGET_TEMP_WATER_HIGH;
} else {
return TargetTemp::TARGET_TEMP_WATER_BOOST;
}
}
const std::string operating_status_to_str(OperatingStatus val) { const std::string operating_status_to_str(OperatingStatus val) {
if (val == OperatingStatus::OPERATING_STATUS_OFF) { if (val == OperatingStatus::OPERATING_STATUS_OFF) {
return "OFF"; return "OFF";

View File

@ -20,6 +20,7 @@ TargetTemp decimal_to_room_temp(float val);
TargetTemp decimal_to_aircon_temp(u_int8_t val); TargetTemp decimal_to_aircon_temp(u_int8_t val);
TargetTemp decimal_to_aircon_temp(float val); TargetTemp decimal_to_aircon_temp(float val);
TargetTemp decimal_to_water_temp(u_int8_t val); TargetTemp decimal_to_water_temp(u_int8_t val);
TargetTemp decimal_to_water_temp(float val);
const std::string operating_status_to_str(OperatingStatus val); const std::string operating_status_to_str(OperatingStatus val);
ElectricPowerLevel decimal_to_el_power_level(u_int16_t val); ElectricPowerLevel decimal_to_el_power_level(u_int16_t val);

5
examples/Readme.md Normal file
View File

@ -0,0 +1,5 @@
# Example configuration
[Combi 4 / 4D / 6 / 6D](combi.yaml)
[Combi 4E / 4DE / 6E / 6DE](combi_E.yaml)

59
examples/combi.yaml Normal file
View File

@ -0,0 +1,59 @@
esphome:
name: "Truma Combi"
external_components:
- source: github://Fabian-Schmidt/esphome-truma_inetbox
esp32:
board: esp32dev
# Enable logging
logger:
# Enable Home Assistant API
api:
encryption:
key: ""
ota:
password: ""
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
uart:
- id: lin_uart_bus
tx_pin: 17
rx_pin: 16
baud_rate: 9600
data_bits: 8
parity: NONE
stop_bits: 2
truma_inetbox:
uart_id: lin_uart_bus
climate:
- platform: truma_inetbox
name: "Room"
type: ROOM
- platform: truma_inetbox
name: "Water"
type: WATER
binary_sensor:
- platform: truma_inetbox
name: "CP Plus alive"
type: CP_PLUS_CONNECTED
- platform: truma_inetbox
name: "Heater has error"
type: HEATER_HAS_ERROR
sensor:
- platform: truma_inetbox
name: "Current Room Temperature"
type: CURRENT_ROOM_TEMPERATURE
- platform: truma_inetbox
name: "Current Water Temperature"
type: CURRENT_WATER_TEMPERATURE

64
examples/combi_E.yaml Normal file
View File

@ -0,0 +1,64 @@
esphome:
name: "Truma Combi E"
external_components:
- source: github://Fabian-Schmidt/esphome-truma_inetbox
esp32:
board: esp32dev
# Enable logging
logger:
# Enable Home Assistant API
api:
encryption:
key: ""
ota:
password: ""
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
uart:
- id: lin_uart_bus
tx_pin: 17
rx_pin: 16
baud_rate: 9600
data_bits: 8
parity: NONE
stop_bits: 2
truma_inetbox:
uart_id: lin_uart_bus
climate:
- platform: truma_inetbox
name: "Room"
type: ROOM
- platform: truma_inetbox
name: "Water"
type: WATER
binary_sensor:
- platform: truma_inetbox
name: "CP Plus alive"
type: CP_PLUS_CONNECTED
- platform: truma_inetbox
name: "Heater has error"
type: HEATER_HAS_ERROR
sensor:
- platform: truma_inetbox
name: "Current Room Temperature"
type: CURRENT_ROOM_TEMPERATURE
- platform: truma_inetbox
name: "Current Water Temperature"
type: CURRENT_WATER_TEMPERATURE
number:
- platform: truma_inetbox
name: "electric power level"
type: ELECTRIC_POWER_LEVEL