mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-25 03:36:42 +00:00
Code optimizations
This commit is contained in:
parent
5bdf430512
commit
4b2d4e3f79
@ -350,6 +350,7 @@ void ThermostatCtrState(uint8_t ctr_output)
|
|||||||
|
|
||||||
void ThermostatHybridCtrPhase(uint8_t ctr_output)
|
void ThermostatHybridCtrPhase(uint8_t ctr_output)
|
||||||
{
|
{
|
||||||
|
bool flag_heating = (Thermostat[ctr_output].status.climate_mode == CLIMATE_HEATING);
|
||||||
if (Thermostat[ctr_output].status.controller_mode == CTR_HYBRID) {
|
if (Thermostat[ctr_output].status.controller_mode == CTR_HYBRID) {
|
||||||
switch (Thermostat[ctr_output].status.phase_hybrid_ctr) {
|
switch (Thermostat[ctr_output].status.phase_hybrid_ctr) {
|
||||||
// Ramp-up phase with gradient control
|
// Ramp-up phase with gradient control
|
||||||
@ -375,9 +376,9 @@ void ThermostatHybridCtrPhase(uint8_t ctr_output)
|
|||||||
if (((uptime - Thermostat[ctr_output].timestamp_output_off) > (60 * (uint32_t)Thermostat[ctr_output].time_allow_rampup))
|
if (((uptime - Thermostat[ctr_output].timestamp_output_off) > (60 * (uint32_t)Thermostat[ctr_output].time_allow_rampup))
|
||||||
&& (Thermostat[ctr_output].temp_target_level != Thermostat[ctr_output].temp_target_level_ctr)
|
&& (Thermostat[ctr_output].temp_target_level != Thermostat[ctr_output].temp_target_level_ctr)
|
||||||
&& ( ( (Thermostat[ctr_output].temp_target_level - Thermostat[ctr_output].temp_measured > Thermostat[ctr_output].temp_rampup_delta_in)
|
&& ( ( (Thermostat[ctr_output].temp_target_level - Thermostat[ctr_output].temp_measured > Thermostat[ctr_output].temp_rampup_delta_in)
|
||||||
&& (Thermostat[ctr_output].status.climate_mode == CLIMATE_HEATING))
|
&& (flag_heating))
|
||||||
|| ( (Thermostat[ctr_output].temp_measured - Thermostat[ctr_output].temp_target_level > Thermostat[ctr_output].temp_rampup_delta_in)
|
|| ( (Thermostat[ctr_output].temp_measured - Thermostat[ctr_output].temp_target_level > Thermostat[ctr_output].temp_rampup_delta_in)
|
||||||
&& (Thermostat[ctr_output].status.climate_mode == CLIMATE_COOLING)))) {
|
&& (!flag_heating)))) {
|
||||||
Thermostat[ctr_output].timestamp_rampup_start = uptime;
|
Thermostat[ctr_output].timestamp_rampup_start = uptime;
|
||||||
Thermostat[ctr_output].temp_rampup_start = Thermostat[ctr_output].temp_measured;
|
Thermostat[ctr_output].temp_rampup_start = Thermostat[ctr_output].temp_measured;
|
||||||
Thermostat[ctr_output].temp_rampup_meas_gradient = 0;
|
Thermostat[ctr_output].temp_rampup_meas_gradient = 0;
|
||||||
@ -492,7 +493,8 @@ void ThermostatOutputRelay(uint8_t ctr_output, uint32_t command)
|
|||||||
void ThermostatCalculatePI(uint8_t ctr_output)
|
void ThermostatCalculatePI(uint8_t ctr_output)
|
||||||
{
|
{
|
||||||
// General comment: Some variables have been increased in resolution to avoid loosing accuracy in division operations
|
// General comment: Some variables have been increased in resolution to avoid loosing accuracy in division operations
|
||||||
|
|
||||||
|
bool flag_heating = (Thermostat[ctr_output].status.climate_mode == CLIMATE_HEATING);
|
||||||
int32_t aux_temp_error;
|
int32_t aux_temp_error;
|
||||||
|
|
||||||
// Calculate error
|
// Calculate error
|
||||||
@ -576,9 +578,9 @@ void ThermostatCalculatePI(uint8_t ctr_output)
|
|||||||
if ( (Thermostat[ctr_output].temp_pi_error >= 0)
|
if ( (Thermostat[ctr_output].temp_pi_error >= 0)
|
||||||
&& (abs((Thermostat[ctr_output].temp_pi_error) / 10) <= (int16_t)Thermostat[ctr_output].temp_hysteresis)
|
&& (abs((Thermostat[ctr_output].temp_pi_error) / 10) <= (int16_t)Thermostat[ctr_output].temp_hysteresis)
|
||||||
&& ( ((Thermostat[ctr_output].temp_measured_gradient > 0)
|
&& ( ((Thermostat[ctr_output].temp_measured_gradient > 0)
|
||||||
&& (Thermostat[ctr_output].status.climate_mode == CLIMATE_HEATING))
|
&& (flag_heating))
|
||||||
|| ( (Thermostat[ctr_output].temp_measured_gradient < 0)
|
|| ( (Thermostat[ctr_output].temp_measured_gradient < 0)
|
||||||
&& (Thermostat[ctr_output].status.climate_mode == CLIMATE_COOLING)))) {
|
&& (!flag_heating)))) {
|
||||||
// Reduce accumulator error 20% in each cycle
|
// Reduce accumulator error 20% in each cycle
|
||||||
Thermostat[ctr_output].temp_pi_accum_error *= 0.8;
|
Thermostat[ctr_output].temp_pi_accum_error *= 0.8;
|
||||||
}
|
}
|
||||||
@ -586,9 +588,9 @@ void ThermostatCalculatePI(uint8_t ctr_output)
|
|||||||
// AND temperature is rising for heating or sinking for cooling
|
// AND temperature is rising for heating or sinking for cooling
|
||||||
else if ((Thermostat[ctr_output].temp_pi_error < 0)
|
else if ((Thermostat[ctr_output].temp_pi_error < 0)
|
||||||
&& ( ((Thermostat[ctr_output].temp_measured_gradient > 0)
|
&& ( ((Thermostat[ctr_output].temp_measured_gradient > 0)
|
||||||
&& (Thermostat[ctr_output].status.climate_mode == CLIMATE_HEATING))
|
&& (flag_heating))
|
||||||
|| ( (Thermostat[ctr_output].temp_measured_gradient < 0)
|
|| ( (Thermostat[ctr_output].temp_measured_gradient < 0)
|
||||||
&& (Thermostat[ctr_output].status.climate_mode == CLIMATE_COOLING)))) {
|
&& (!flag_heating)))) {
|
||||||
// Reduce accumulator error 20% in each cycle
|
// Reduce accumulator error 20% in each cycle
|
||||||
Thermostat[ctr_output].temp_pi_accum_error *= 0.8;
|
Thermostat[ctr_output].temp_pi_accum_error *= 0.8;
|
||||||
}
|
}
|
||||||
@ -629,9 +631,9 @@ void ThermostatCalculatePI(uint8_t ctr_output)
|
|||||||
// If we are over the hysteresis or the gradient is positive for heating or negative for cooling
|
// If we are over the hysteresis or the gradient is positive for heating or negative for cooling
|
||||||
if ((abs((Thermostat[ctr_output].temp_pi_error) / 10) > Thermostat[ctr_output].temp_hysteresis)
|
if ((abs((Thermostat[ctr_output].temp_pi_error) / 10) > Thermostat[ctr_output].temp_hysteresis)
|
||||||
|| ( ((Thermostat[ctr_output].temp_measured_gradient >= 0)
|
|| ( ((Thermostat[ctr_output].temp_measured_gradient >= 0)
|
||||||
&& (Thermostat[ctr_output].status.climate_mode == CLIMATE_HEATING))
|
&& (flag_heating))
|
||||||
|| ( (Thermostat[ctr_output].temp_measured_gradient <= 0)
|
|| ( (Thermostat[ctr_output].temp_measured_gradient <= 0)
|
||||||
&& (Thermostat[ctr_output].status.climate_mode == CLIMATE_COOLING)))){
|
&& (!flag_heating)))){
|
||||||
Thermostat[ctr_output].time_total_pi = 0;
|
Thermostat[ctr_output].time_total_pi = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -642,9 +644,9 @@ void ThermostatCalculatePI(uint8_t ctr_output)
|
|||||||
else if ((Thermostat[ctr_output].temp_pi_error > 0)
|
else if ((Thermostat[ctr_output].temp_pi_error > 0)
|
||||||
&& (abs((Thermostat[ctr_output].temp_pi_error) / 10) <= Thermostat[ctr_output].temp_hysteresis)
|
&& (abs((Thermostat[ctr_output].temp_pi_error) / 10) <= Thermostat[ctr_output].temp_hysteresis)
|
||||||
&& (((Thermostat[ctr_output].temp_measured_gradient > 0)
|
&& (((Thermostat[ctr_output].temp_measured_gradient > 0)
|
||||||
&& (Thermostat[ctr_output].status.climate_mode == CLIMATE_HEATING))
|
&& (flag_heating))
|
||||||
|| ( (Thermostat[ctr_output].temp_measured_gradient < 0)
|
|| ( (Thermostat[ctr_output].temp_measured_gradient < 0)
|
||||||
&& (Thermostat[ctr_output].status.climate_mode == CLIMATE_COOLING)))) {
|
&& (!flag_heating)))) {
|
||||||
Thermostat[ctr_output].time_total_pi = 0;
|
Thermostat[ctr_output].time_total_pi = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -672,14 +674,15 @@ void ThermostatCalculatePI(uint8_t ctr_output)
|
|||||||
|
|
||||||
void ThermostatWorkAutomaticPI(uint8_t ctr_output)
|
void ThermostatWorkAutomaticPI(uint8_t ctr_output)
|
||||||
{
|
{
|
||||||
|
bool flag_heating = (Thermostat[ctr_output].status.climate_mode == CLIMATE_HEATING);
|
||||||
if ( (uptime >= Thermostat[ctr_output].time_ctr_checkpoint)
|
if ( (uptime >= Thermostat[ctr_output].time_ctr_checkpoint)
|
||||||
|| (Thermostat[ctr_output].temp_target_level != Thermostat[ctr_output].temp_target_level_ctr)
|
|| (Thermostat[ctr_output].temp_target_level != Thermostat[ctr_output].temp_target_level_ctr)
|
||||||
|| ( (( (Thermostat[ctr_output].temp_measured < Thermostat[ctr_output].temp_target_level)
|
|| ( (( (Thermostat[ctr_output].temp_measured < Thermostat[ctr_output].temp_target_level)
|
||||||
&& (Thermostat[ctr_output].temp_measured_gradient < 0)
|
&& (Thermostat[ctr_output].temp_measured_gradient < 0)
|
||||||
&& (Thermostat[ctr_output].status.climate_mode == CLIMATE_HEATING))
|
&& (flag_heating))
|
||||||
|| ((Thermostat[ctr_output].temp_measured > Thermostat[ctr_output].temp_target_level)
|
|| ((Thermostat[ctr_output].temp_measured > Thermostat[ctr_output].temp_target_level)
|
||||||
&& (Thermostat[ctr_output].temp_measured_gradient > 0)
|
&& (Thermostat[ctr_output].temp_measured_gradient > 0)
|
||||||
&& (Thermostat[ctr_output].status.climate_mode == CLIMATE_COOLING)))
|
&& (!flag_heating)))
|
||||||
&& (Thermostat[ctr_output].status.status_cycle_active == CYCLE_OFF))) {
|
&& (Thermostat[ctr_output].status.status_cycle_active == CYCLE_OFF))) {
|
||||||
Thermostat[ctr_output].temp_target_level_ctr = Thermostat[ctr_output].temp_target_level;
|
Thermostat[ctr_output].temp_target_level_ctr = Thermostat[ctr_output].temp_target_level;
|
||||||
ThermostatCalculatePI(ctr_output);
|
ThermostatCalculatePI(ctr_output);
|
||||||
@ -697,16 +700,17 @@ void ThermostatWorkAutomaticPI(uint8_t ctr_output)
|
|||||||
|
|
||||||
void ThermostatWorkAutomaticRampUp(uint8_t ctr_output)
|
void ThermostatWorkAutomaticRampUp(uint8_t ctr_output)
|
||||||
{
|
{
|
||||||
int16_t aux_temp_delta;
|
|
||||||
uint32_t time_in_rampup;
|
uint32_t time_in_rampup;
|
||||||
|
int16_t aux_temp_delta;
|
||||||
int16_t temp_delta_rampup;
|
int16_t temp_delta_rampup;
|
||||||
|
bool flag_heating = (Thermostat[ctr_output].status.climate_mode == CLIMATE_HEATING);
|
||||||
|
|
||||||
// Update timestamp for temperature at start of ramp-up if temperature still
|
// Update timestamp for temperature at start of ramp-up if temperature still
|
||||||
// dropping for heating or rising for cooling
|
// dropping for heating or rising for cooling
|
||||||
if ( ((Thermostat[ctr_output].temp_measured < Thermostat[ctr_output].temp_rampup_start)
|
if ( ((Thermostat[ctr_output].temp_measured < Thermostat[ctr_output].temp_rampup_start)
|
||||||
&& (Thermostat[ctr_output].status.climate_mode == CLIMATE_HEATING))
|
&& (flag_heating))
|
||||||
|| ((Thermostat[ctr_output].temp_measured > Thermostat[ctr_output].temp_rampup_start)
|
|| ((Thermostat[ctr_output].temp_measured > Thermostat[ctr_output].temp_rampup_start)
|
||||||
&& (Thermostat[ctr_output].status.climate_mode == CLIMATE_COOLING)))
|
&& (!flag_heating)))
|
||||||
{
|
{
|
||||||
Thermostat[ctr_output].temp_rampup_start = Thermostat[ctr_output].temp_measured;
|
Thermostat[ctr_output].temp_rampup_start = Thermostat[ctr_output].temp_measured;
|
||||||
}
|
}
|
||||||
@ -723,9 +727,9 @@ void ThermostatWorkAutomaticRampUp(uint8_t ctr_output)
|
|||||||
// AND temperature measured < target for heating or > for cooling
|
// AND temperature measured < target for heating or > for cooling
|
||||||
if ((time_in_rampup <= (60 * (uint32_t)Thermostat[ctr_output].time_rampup_max))
|
if ((time_in_rampup <= (60 * (uint32_t)Thermostat[ctr_output].time_rampup_max))
|
||||||
&& ( ((Thermostat[ctr_output].temp_measured < Thermostat[ctr_output].temp_target_level)
|
&& ( ((Thermostat[ctr_output].temp_measured < Thermostat[ctr_output].temp_target_level)
|
||||||
&& (Thermostat[ctr_output].status.climate_mode == CLIMATE_HEATING))
|
&& (flag_heating))
|
||||||
|| ((Thermostat[ctr_output].temp_measured > Thermostat[ctr_output].temp_target_level)
|
|| ((Thermostat[ctr_output].temp_measured > Thermostat[ctr_output].temp_target_level)
|
||||||
&& (Thermostat[ctr_output].status.climate_mode == CLIMATE_COOLING)))){
|
&& (!flag_heating)))){
|
||||||
// DEADTIME point reached
|
// DEADTIME point reached
|
||||||
// If temperature measured minus temperature at start of ramp-up >= threshold
|
// If temperature measured minus temperature at start of ramp-up >= threshold
|
||||||
// AND deadtime still 0
|
// AND deadtime still 0
|
||||||
@ -758,9 +762,9 @@ void ThermostatWorkAutomaticRampUp(uint8_t ctr_output)
|
|||||||
// Translate into gradient per hour (thousandths of ° per hour)
|
// Translate into gradient per hour (thousandths of ° per hour)
|
||||||
Thermostat[ctr_output].temp_rampup_meas_gradient = int32_t((360000 * (int32_t)temp_delta_rampup) / (int32_t)time_total_rampup);
|
Thermostat[ctr_output].temp_rampup_meas_gradient = int32_t((360000 * (int32_t)temp_delta_rampup) / (int32_t)time_total_rampup);
|
||||||
if ( ((Thermostat[ctr_output].temp_rampup_meas_gradient > 0)
|
if ( ((Thermostat[ctr_output].temp_rampup_meas_gradient > 0)
|
||||||
&& ((Thermostat[ctr_output].status.climate_mode == CLIMATE_HEATING)))
|
&& ((flag_heating)))
|
||||||
|| ((Thermostat[ctr_output].temp_rampup_meas_gradient < 0)
|
|| ((Thermostat[ctr_output].temp_rampup_meas_gradient < 0)
|
||||||
&& ((Thermostat[ctr_output].status.climate_mode == CLIMATE_COOLING)))) {
|
&& ((!flag_heating)))) {
|
||||||
// Calculate time to switch Off and come out of ramp-up
|
// Calculate time to switch Off and come out of ramp-up
|
||||||
// y-y1 = m(x-x1) -> x = ((y-y1) / m) + x1 -> y1 = temp_rampup_cycle, x1 = (time_rampup_nextcycle - time_rampup_cycle), m = gradient in º/sec
|
// y-y1 = m(x-x1) -> x = ((y-y1) / m) + x1 -> y1 = temp_rampup_cycle, x1 = (time_rampup_nextcycle - time_rampup_cycle), m = gradient in º/sec
|
||||||
// Better Alternative -> (y-y1)/(x-x1) = ((y2-y1)/(x2-x1)) -> where y = temp (target) and x = time (to switch off, what its needed)
|
// Better Alternative -> (y-y1)/(x-x1) = ((y2-y1)/(x2-x1)) -> where y = temp (target) and x = time (to switch off, what its needed)
|
||||||
@ -799,13 +803,13 @@ void ThermostatWorkAutomaticRampUp(uint8_t ctr_output)
|
|||||||
|| (Thermostat[ctr_output].time_ctr_checkpoint == 0)
|
|| (Thermostat[ctr_output].time_ctr_checkpoint == 0)
|
||||||
|| (uptime < Thermostat[ctr_output].time_ctr_changepoint)
|
|| (uptime < Thermostat[ctr_output].time_ctr_changepoint)
|
||||||
|| ( ((Thermostat[ctr_output].temp_measured < Thermostat[ctr_output].temp_rampup_output_off)
|
|| ( ((Thermostat[ctr_output].temp_measured < Thermostat[ctr_output].temp_rampup_output_off)
|
||||||
&& (Thermostat[ctr_output].status.climate_mode == CLIMATE_HEATING))
|
&& (flag_heating))
|
||||||
|| ((Thermostat[ctr_output].temp_measured > Thermostat[ctr_output].temp_rampup_output_off)
|
|| ((Thermostat[ctr_output].temp_measured > Thermostat[ctr_output].temp_rampup_output_off)
|
||||||
&& (Thermostat[ctr_output].status.climate_mode == CLIMATE_COOLING)))
|
&& (!flag_heating)))
|
||||||
|| ( ((Thermostat[ctr_output].temp_rampup_meas_gradient <= 0)
|
|| ( ((Thermostat[ctr_output].temp_rampup_meas_gradient <= 0)
|
||||||
&& (Thermostat[ctr_output].status.climate_mode == CLIMATE_HEATING))
|
&& (flag_heating))
|
||||||
|| ((Thermostat[ctr_output].temp_rampup_meas_gradient >= 0)
|
|| ((Thermostat[ctr_output].temp_rampup_meas_gradient >= 0)
|
||||||
&& (Thermostat[ctr_output].status.climate_mode == CLIMATE_COOLING)))) {
|
&& (!flag_heating)))) {
|
||||||
Thermostat[ctr_output].status.command_output = IFACE_ON;
|
Thermostat[ctr_output].status.command_output = IFACE_ON;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -815,9 +819,9 @@ void ThermostatWorkAutomaticRampUp(uint8_t ctr_output)
|
|||||||
else {
|
else {
|
||||||
// If we have not reached the temperature, start with an initial value for accumulated error for the PI controller
|
// If we have not reached the temperature, start with an initial value for accumulated error for the PI controller
|
||||||
if ( ((Thermostat[ctr_output].temp_measured < Thermostat[ctr_output].temp_target_level_ctr)
|
if ( ((Thermostat[ctr_output].temp_measured < Thermostat[ctr_output].temp_target_level_ctr)
|
||||||
&& (Thermostat[ctr_output].status.climate_mode == CLIMATE_HEATING))
|
&& (flag_heating))
|
||||||
|| ((Thermostat[ctr_output].temp_measured > Thermostat[ctr_output].temp_target_level_ctr)
|
|| ((Thermostat[ctr_output].temp_measured > Thermostat[ctr_output].temp_target_level_ctr)
|
||||||
&& (Thermostat[ctr_output].status.climate_mode == CLIMATE_COOLING))) {
|
&& (!flag_heating))) {
|
||||||
Thermostat[ctr_output].temp_pi_accum_error = Thermostat[ctr_output].temp_rampup_pi_acc_error;
|
Thermostat[ctr_output].temp_pi_accum_error = Thermostat[ctr_output].temp_rampup_pi_acc_error;
|
||||||
}
|
}
|
||||||
// Set to now time to get out of ramp-up
|
// Set to now time to get out of ramp-up
|
||||||
|
Loading…
x
Reference in New Issue
Block a user