Skip to content

Commit 8ef0a50

Browse files
Merge pull request #996 from OpenEVSE/max_hardware_current_set
Changes to allow setting of the max hardware current
2 parents d835f5c + 06df94e commit 8ef0a50

18 files changed

+9051
-8872
lines changed

platformio.ini

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ lib_deps =
3434
jeremypoulter/[email protected]
3535
jeremypoulter/Micro [email protected]
3636
jeremypoulter/[email protected]
37-
jeremypoulter/[email protected].14
37+
jeremypoulter/[email protected].15
3838
jeremypoulter/[email protected]
3939
jeremypoulter/[email protected]
4040
jeremypoulter/[email protected]
@@ -52,7 +52,7 @@ debug_flags =
5252
#-D ENABLE_DEBUG_WEB_REQUEST
5353
#-D ENABLE_DEBUG_SCHEDULER
5454
#-D ENABLE_DEBUG_TIME
55-
#-D ENABLE_DEBUG_EVSE_MAN
55+
-D ENABLE_DEBUG_EVSE_MAN
5656
#-D ENABLE_DEBUG_EVSE_MONITOR
5757
#-D ENABLE_DEBUG_DIVERT
5858
#-D ENABLE_DEBUG_LED

src/app_config.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -503,6 +503,17 @@ bool config_deserialize(DynamicJsonDocument &doc)
503503
}
504504
}
505505

506+
if(doc.containsKey("max_current_hard"))
507+
{
508+
// This value can only be written once so we need to check if the value has changed after setting
509+
long current = doc["max_current_hard"];
510+
if(current != evse.getMaxHardwareCurrent()) {
511+
evse.setMaxHardwareCurrent(current);
512+
config_modified = true;
513+
DBUGLN("max_current_hard changed");
514+
}
515+
}
516+
506517
if(doc.containsKey("scale") && doc.containsKey("offset"))
507518
{
508519
long scale = doc["scale"];

src/evse_man.cpp

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ EvseManager::EvseManager(Stream &port, EventLog &eventLog) :
122122
_evseStateListener(this),
123123
_evseBootListener(this),
124124
_sessionCompleteListener(this),
125+
_settingsChangedListener(this),
125126
_targetProperties(EvseState::Active),
126127
_hasClaims(false),
127128
_sleepForDisable(true),
@@ -234,6 +235,7 @@ void EvseManager::setup()
234235
_monitor.onBootReady(&_evseBootListener);
235236
_monitor.onStateChange(&_evseStateListener);
236237
_monitor.onSessionComplete(&_sessionCompleteListener);
238+
_monitor.onSettingsChanged(&_settingsChangedListener);
237239
}
238240

239241
bool EvseManager::setTargetState(EvseProperties &target)
@@ -370,6 +372,18 @@ unsigned long EvseManager::loop(MicroTasks::WakeReason reason)
370372
_monitor.clearEnergyMeterSession();
371373
}
372374

375+
DBUGVAR(_settingsChangedListener.IsTriggered());
376+
if(_settingsChangedListener.IsTriggered())
377+
{
378+
// Settings have changed, re-evaluate claims
379+
_evaluateClaims = true;
380+
381+
DBUGVAR(_monitor.getPilot());
382+
DBUGVAR(_monitor.getMinCurrent());
383+
DBUGVAR(_monitor.getMaxConfiguredCurrent());
384+
DBUGVAR(_monitor.getMaxHardwareCurrent());
385+
}
386+
373387
DBUGVAR(_evaluateClaims);
374388
if(_evaluateClaims)
375389
{
@@ -594,11 +608,13 @@ void EvseManager::setVehicleEta(int vehicleEta)
594608
void EvseManager::setMaxConfiguredCurrent(long amps)
595609
{
596610
_monitor.setMaxConfiguredCurrent(amps);
597-
DBUGF("Max configured current set to %ld", _monitor.getMaxConfiguredCurrent());
598-
// Setting the Max Current will update the pilot as well, but in any case we may
599-
// need to change the level so re-evaluate the claims
600-
_evaluateClaims = true;
601-
MicroTask.wakeTask(this);
611+
DBUGF("Max configured current set to %ld (%ld)", _monitor.getMaxConfiguredCurrent(), amps);
612+
}
613+
614+
void EvseManager::setMaxHardwareCurrent(long amps)
615+
{
616+
_monitor.setMaxHardwareCurrent(amps);
617+
DBUGF("Max hardware current set to actual: %ld, requested: %ld", _monitor.getMaxHardwareCurrent(), amps);
602618
}
603619

604620
bool EvseManager::isRapiCommandBlocked(String rapi)

src/evse_man.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@ class EvseManager : public MicroTasks::Task
221221
MicroTasks::EventListener _evseStateListener;
222222
MicroTasks::EventListener _evseBootListener;
223223
MicroTasks::EventListener _sessionCompleteListener;
224+
MicroTasks::EventListener _settingsChangedListener;
224225

225226
EvseProperties _targetProperties;
226227
bool _hasClaims;
@@ -418,6 +419,7 @@ class EvseManager : public MicroTasks::Task
418419
long getMaxConfiguredCurrent() {
419420
return _monitor.getMaxConfiguredCurrent();
420421
}
422+
void setMaxHardwareCurrent(long amps);
421423
long getMaxHardwareCurrent() {
422424
return _monitor.getMaxHardwareCurrent();
423425
}

src/evse_monitor.cpp

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -699,6 +699,35 @@ void EvseMonitor::setMaxConfiguredCurrent(long amps)
699699
});
700700
}
701701

702+
// This method will attempt to set the hardware current limit. This
703+
// can only be set once. If called subsequent times it will be ignored.
704+
// We will need to read back the hardware limit to know what it is.
705+
void EvseMonitor::setMaxHardwareCurrent(long amps)
706+
{
707+
// limit `amps` to the hardware limit
708+
if(amps > _max_hardware_current) {
709+
amps = _max_hardware_current;
710+
}
711+
if(amps < _min_current && _min_current != 0) {
712+
amps = _min_current;
713+
}
714+
715+
_openevse.setCurrentCapacityFactoryLimit(amps, [this, amps](int ret, long pilot)
716+
{
717+
if(RAPI_RESPONSE_OK == ret)
718+
{
719+
_max_hardware_current = amps;
720+
DBUGVAR(_max_hardware_current);
721+
722+
if(_max_configured_current > _max_hardware_current) {
723+
setMaxConfiguredCurrent(_max_hardware_current);
724+
}
725+
726+
_settings_changed.Trigger();
727+
}
728+
});
729+
}
730+
702731
void EvseMonitor::getStatusFromEvse(bool allowStart)
703732
{
704733
DBUGLN("Get EVSE status");
@@ -813,4 +842,4 @@ void EvseMonitor::getAmmeterSettings()
813842
_current_sensor_offset = offset;
814843
}
815844
});
816-
}
845+
}

src/evse_monitor.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ class EvseMonitor : public MicroTasks::Task
197197
void disable();
198198
void restart();
199199
void setMaxConfiguredCurrent(long amps);
200+
void setMaxHardwareCurrent(long amps);
200201

201202
void setPilot(long amps, bool force=false, std::function<void(int ret)> callback = NULL);
202203
void setVoltage(double volts, std::function<void(int ret)> callback = NULL);

0 commit comments

Comments
 (0)