diff --git a/divert_sim/test_config.py b/divert_sim/test_config.py index 18c98e28..033ead6b 100644 --- a/divert_sim/test_config.py +++ b/divert_sim/test_config.py @@ -91,7 +91,8 @@ def test_config_defaults() -> None: assert config["divert_decay_smoothing_time"] == 600 assert config["divert_min_charge_time"] == 600 assert config["current_shaper_max_pwr"] == 0 - assert config["current_shaper_smoothing_time"] == 60 + assert config["current_shaper_input_smoothing_time"] == 60 + assert config["current_shaper_output_smoothing_time"] == 0 assert config["current_shaper_min_pause_time"] == 300 assert config["current_shaper_data_maxinterval"] == 120 assert config["vehicle_data_src"] == 0 diff --git a/models/Config.yaml b/models/Config.yaml index 3cfddbb4..5736534f 100644 --- a/models/Config.yaml +++ b/models/Config.yaml @@ -68,7 +68,8 @@ x-examples: current_shaper_max_pwr: 9000 current_shaper_min_pause_time: 300 current_shaper_data_maxinterval: 120 - current_shaper_smoothing_time: 60 + current_shaper_input_smoothing_time: 60 + current_shaper_output_smoothing_time: 0 vehicle_data_src: 0 tesla_access_token: _DUMMY_PASSWORD tesla_refresh_token: _DUMMY_PASSWORD diff --git a/src/app_config.cpp b/src/app_config.cpp index 45d29c88..88dc3b75 100644 --- a/src/app_config.cpp +++ b/src/app_config.cpp @@ -102,7 +102,8 @@ uint32_t divert_min_charge_time; // Current Shaper settings uint32_t current_shaper_max_pwr; -uint32_t current_shaper_smoothing_time; +uint32_t current_shaper_input_smoothing_time; +uint32_t current_shaper_output_smoothing_time; uint32_t current_shaper_min_pause_time; // in seconds uint32_t current_shaper_data_maxinterval; // in seconds @@ -208,7 +209,8 @@ ConfigOpt *opts[] = // Current Shaper settings new ConfigOptDefinition(current_shaper_max_pwr, 0, "current_shaper_max_pwr", "smp"), - new ConfigOptDefinition(current_shaper_smoothing_time, 60, "current_shaper_smoothing_time", "sst"), + new ConfigOptDefinition(current_shaper_input_smoothing_time, 60, "current_shaper_input_smoothing_time", "sit"), + new ConfigOptDefinition(current_shaper_output_smoothing_time, 0, "current_shaper_output_smoothing_time", "sot"), new ConfigOptDefinition(current_shaper_min_pause_time, 300, "current_shaper_min_pause_time", "spt"), new ConfigOptDefinition(current_shaper_data_maxinterval, 120, "current_shaper_data_maxinterval", "sdm"), diff --git a/src/app_config.h b/src/app_config.h index 1209596c..c0458fcd 100644 --- a/src/app_config.h +++ b/src/app_config.h @@ -89,7 +89,8 @@ extern uint32_t scheduler_start_window; //Shaper settings extern uint32_t current_shaper_max_pwr; -extern uint32_t current_shaper_smoothing_time; +extern uint32_t current_shaper_input_smoothing_time; +extern uint32_t current_shaper_output_smoothing_time; extern uint32_t current_shaper_min_pause_time; extern uint32_t current_shaper_data_maxinterval; diff --git a/src/current_shaper.cpp b/src/current_shaper.cpp index 100359fa..83c97158 100644 --- a/src/current_shaper.cpp +++ b/src/current_shaper.cpp @@ -164,7 +164,7 @@ void CurrentShaperTask::shapeCurrent() { _smoothed_live_pwr = _live_pwr; } else { - _smoothed_live_pwr = _inputFilter.filter(_live_pwr, _smoothed_live_pwr, current_shaper_smoothing_time); + _smoothed_live_pwr = _inputFilter.filter(_live_pwr, _smoothed_live_pwr, current_shaper_input_smoothing_time); } livepwr = _smoothed_live_pwr; } @@ -177,15 +177,16 @@ void CurrentShaperTask::shapeCurrent() { // if (livepwr > max_pwr) { // livepwr = max_pwr; // } + double max_cur; if(!config_threephase_enabled()) { - _max_cur = ((max_pwr - livepwr) / evse.getVoltage()) + evse.getAmps(); + max_cur = ((max_pwr - livepwr) / evse.getVoltage()) + evse.getAmps(); } else { - _max_cur = ((max_pwr - livepwr) / evse.getVoltage() / 3.0) + evse.getAmps(); + max_cur = ((max_pwr - livepwr) / evse.getVoltage() / 3.0) + evse.getAmps(); } - - + // Smooth shaper output to avoid instability with delayed live power samples. + _max_cur = _outputFilter.filter(max_cur, _max_cur, current_shaper_output_smoothing_time); _changed = true; } @@ -210,4 +211,4 @@ bool CurrentShaperTask::isActive() { bool CurrentShaperTask::isUpdated() { return _updated; -} \ No newline at end of file +} diff --git a/src/current_shaper.h b/src/current_shaper.h index eee7ab28..d6474499 100644 --- a/src/current_shaper.h +++ b/src/current_shaper.h @@ -40,6 +40,7 @@ class CurrentShaperTask: public MicroTasks::Task uint32_t _pause_timer; bool _updated; InputFilter _inputFilter; + InputFilter _outputFilter; protected: void setup();