135 lines
3.6 KiB
C++
135 lines
3.6 KiB
C++
#include "helpers.h"
|
|
#include "esphome/core/helpers.h"
|
|
#include "TrumaiNetBoxApp.h"
|
|
|
|
namespace esphome {
|
|
namespace truma_inetbox {
|
|
|
|
u_int8_t addr_parity(const u_int8_t PID) {
|
|
u_int8_t P0 = ((PID >> 0) + (PID >> 1) + (PID >> 2) + (PID >> 4)) & 1;
|
|
u_int8_t P1 = ~((PID >> 1) + (PID >> 3) + (PID >> 4) + (PID >> 5)) & 1;
|
|
return (P0 | (P1 << 1));
|
|
}
|
|
|
|
// sum = 0 LIN 1.X CRC, sum = PID LIN 2.X CRC Enhanced
|
|
u_int8_t data_checksum(const u_int8_t *message, u_int8_t length, uint16_t sum) {
|
|
for (u_int8_t i = 0; i < length; i++) {
|
|
sum += message[i];
|
|
|
|
if (sum >= 256)
|
|
sum -= 255;
|
|
}
|
|
return (~sum);
|
|
}
|
|
|
|
float temp_code_to_decimal(u_int16_t val, float zero) {
|
|
if (val == 0) {
|
|
return zero;
|
|
}
|
|
return ((float) val) / 10.0f - 273.0f;
|
|
}
|
|
|
|
float temp_code_to_decimal(TargetTemp val, float zero) { return temp_code_to_decimal((u_int16_t) val, zero); }
|
|
|
|
TargetTemp decimal_to_temp(u_int8_t val) { return (TargetTemp) ((((u_int16_t) val) + 273) * 10); }
|
|
|
|
TargetTemp decimal_to_temp(float val) { return (TargetTemp) ((val + 273) * 10); }
|
|
|
|
TargetTemp decimal_to_room_temp(u_int8_t val) {
|
|
if (val == 0) {
|
|
return TargetTemp::TARGET_TEMP_OFF;
|
|
}
|
|
if (val <= 5) {
|
|
return TargetTemp::TARGET_TEMP_ROOM_MIN;
|
|
}
|
|
if (val >= 30) {
|
|
return TargetTemp::TARGET_TEMP_ROOM_MAX;
|
|
}
|
|
return decimal_to_temp(val);
|
|
}
|
|
|
|
TargetTemp decimal_to_room_temp(float val) {
|
|
if (val == NAN) {
|
|
return TargetTemp::TARGET_TEMP_OFF;
|
|
}
|
|
if (val <= 5) {
|
|
return TargetTemp::TARGET_TEMP_ROOM_MIN;
|
|
}
|
|
if (val >= 30) {
|
|
return TargetTemp::TARGET_TEMP_ROOM_MAX;
|
|
}
|
|
return decimal_to_temp(val);
|
|
}
|
|
|
|
TargetTemp decimal_to_aircon_temp(u_int8_t val) {
|
|
if (val == 0) {
|
|
return TargetTemp::TARGET_TEMP_OFF;
|
|
}
|
|
if (val <= 16) {
|
|
return TargetTemp::TARGET_TEMP_AIRCON_MIN;
|
|
}
|
|
if (val >= 31) {
|
|
return TargetTemp::TARGET_TEMP_AIRCON_MAX;
|
|
}
|
|
return decimal_to_temp(val);
|
|
}
|
|
|
|
TargetTemp decimal_to_aircon_temp(float val) {
|
|
if (val == NAN) {
|
|
return TargetTemp::TARGET_TEMP_OFF;
|
|
}
|
|
if (val <= 16) {
|
|
return TargetTemp::TARGET_TEMP_AIRCON_MIN;
|
|
}
|
|
if (val >= 31) {
|
|
return TargetTemp::TARGET_TEMP_AIRCON_MAX;
|
|
}
|
|
return decimal_to_temp(val);
|
|
}
|
|
|
|
TargetTemp decimal_to_water_temp(u_int8_t val) {
|
|
if (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) {
|
|
if (val == OperatingStatus::OPERATING_STATUS_OFF) {
|
|
return "OFF";
|
|
} else if (val == OperatingStatus::OPERATING_STATUS_WARNING) {
|
|
return "WARNING";
|
|
} else if (val == OperatingStatus::OPERATING_STATUS_START_OR_COOL_DOWN) {
|
|
return "START/COOL DOWN";
|
|
} else if (val == OperatingStatus::OPERATING_STATUS_ON_5) {
|
|
return "ON (5)";
|
|
} else if (val == OperatingStatus::OPERATING_STATUS_ON_6) {
|
|
return "ON (6)";
|
|
} else if (val == OperatingStatus::OPERATING_STATUS_ON_7) {
|
|
return "ON (7)";
|
|
} else if (val == OperatingStatus::OPERATING_STATUS_ON_8) {
|
|
return "ON (8)";
|
|
} else if (val == OperatingStatus::OPERATING_STATUS_ON_9) {
|
|
return "ON (9)";
|
|
} else {
|
|
return esphome::str_snprintf("ON %u", 6, (uint8_t) val);
|
|
}
|
|
}
|
|
|
|
ElectricPowerLevel decimal_to_el_power_level(u_int16_t val) {
|
|
if (val >= 1800) {
|
|
return ElectricPowerLevel::ELECTRIC_POWER_LEVEL_1800;
|
|
} else if (val >= 900) {
|
|
return ElectricPowerLevel::ELECTRIC_POWER_LEVEL_900;
|
|
} else {
|
|
return ElectricPowerLevel::ELECTRIC_POWER_LEVEL_0;
|
|
}
|
|
}
|
|
|
|
} // namespace truma_inetbox
|
|
} // namespace esphome
|