| 147 | } |
| 148 | |
| 149 | void update_calculated_values(unsigned long currentMillis) { |
| 150 | /* Update CPU temperature*/ |
| 151 | union { |
| 152 | float temp; |
| 153 | uint32_t hex; |
| 154 | } temp = {.temp = temperatureRead()}; |
| 155 | if (temp.hex != 0x42555555) { |
| 156 | // Ignoring erroneous temperature value that ESP32 sometimes returns |
| 157 | datalayer.system.info.CPU_temperature = temp.temp; |
| 158 | } |
| 159 | |
| 160 | /*Update free heap*/ |
| 161 | datalayer.system.info.CPU_free_heap = ESP.getFreeHeap(); |
| 162 | |
| 163 | /* Check is remote set limits have timed out */ |
| 164 | if (currentMillis > datalayer.battery.settings.remote_set_timestamp + datalayer.battery.settings.remote_set_timeout) { |
| 165 | datalayer.battery.settings.remote_settings_limit_charge = false; |
| 166 | datalayer.battery.settings.remote_settings_limit_discharge = false; |
| 167 | datalayer.battery.settings.max_remote_set_charge_dA = 0; |
| 168 | datalayer.battery.settings.max_remote_set_discharge_dA = 0; |
| 169 | } |
| 170 | |
| 171 | /* Calculate allowed charge/discharge currents*/ |
| 172 | if (datalayer.battery.status.voltage_dV > 10) { |
| 173 | // Only update value when we have voltage available to avoid div0. TODO: This should be based on nominal voltage |
| 174 | int32_t target_charge = ((datalayer.battery.status.max_charge_power_W * 100) / datalayer.battery.status.voltage_dV); |
| 175 | int32_t target_discharge = |
| 176 | ((datalayer.battery.status.max_discharge_power_W * 100) / datalayer.battery.status.voltage_dV); |
| 177 | |
| 178 | // Low pass filter only when increasing values (10% new, 90% old) |
| 179 | if (inverter_low_pass_filter) { |
| 180 | if (datalayer.battery.status.max_charge_current_dA == 0) { |
| 181 | datalayer.battery.status.max_charge_current_dA = target_charge; // Initialize immediately if 0 |
| 182 | } else if (target_charge > datalayer.battery.status.max_charge_current_dA) { |
| 183 | datalayer.battery.status.max_charge_current_dA = |
| 184 | (target_charge * 10 + datalayer.battery.status.max_charge_current_dA * 90) / 100; |
| 185 | } else { |
| 186 | datalayer.battery.status.max_charge_current_dA = target_charge; |
| 187 | } |
| 188 | |
| 189 | if (datalayer.battery.status.max_discharge_current_dA == 0) { |
| 190 | datalayer.battery.status.max_discharge_current_dA = target_discharge; // Initialize immediately if 0 |
| 191 | } else if (target_discharge > datalayer.battery.status.max_discharge_current_dA) { |
| 192 | datalayer.battery.status.max_discharge_current_dA = |
| 193 | (target_discharge * 10 + datalayer.battery.status.max_discharge_current_dA * 90) / 100; |
| 194 | } else { |
| 195 | datalayer.battery.status.max_discharge_current_dA = target_discharge; |
| 196 | } |
| 197 | } else { |
| 198 | datalayer.battery.status.max_charge_current_dA = target_charge; |
| 199 | datalayer.battery.status.max_discharge_current_dA = target_discharge; |
| 200 | } |
| 201 | } |
| 202 | |
| 203 | /* Apply remote restrictions if set*/ |
| 204 | if (datalayer.battery.settings.remote_settings_limit_charge) { |
| 205 | if (datalayer.battery.status.max_charge_current_dA > datalayer.battery.settings.max_remote_set_charge_dA) { |
| 206 | datalayer.battery.status.max_charge_current_dA = datalayer.battery.settings.max_remote_set_charge_dA; |