Skip to content

Commit eefb950

Browse files
committed
Refresh the status from the EVSE after setting
In some rare cases we do not get the status async event from the EVSE after setting the state, so for safety we reed the state back from the EVSE after enable/sleep/disable.
1 parent 0258345 commit eefb950

File tree

3 files changed

+148
-96
lines changed

3 files changed

+148
-96
lines changed

src/evse_man.cpp

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -250,22 +250,16 @@ bool EvseManager::setTargetState(EvseProperties &target)
250250
if(EvseState::Active == state)
251251
{
252252
DBUGLN("EVSE: enable");
253-
OpenEVSE.enable([this](int ret) {
254-
DBUGF("EVSE: enable - complete %d", ret);
255-
});
253+
_monitor.enable();
256254
}
257255
else
258256
{
259257
if(_sleepForDisable) {
260258
DBUGLN("EVSE: sleep");
261-
OpenEVSE.sleep([this](int ret) {
262-
DBUGF("EVSE: sleep - complete %d", ret);
263-
});
259+
_monitor.sleep();
264260
} else {
265261
DBUGLN("EVSE: disable");
266-
OpenEVSE.disable([this](int ret) {
267-
DBUGF("EVSE: disable - complete %d", ret);
268-
});
262+
_monitor.disable();
269263
}
270264
}
271265

src/evse_monitor.cpp

Lines changed: 136 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -283,99 +283,20 @@ unsigned long EvseMonitor::loop(MicroTasks::WakeReason reason)
283283
}
284284

285285
// Get the EVSE state
286-
if(0 == _count % EVSE_MONITOR_STATE_TIME)
287-
{
288-
DBUGLN("Get EVSE status");
289-
_openevse.getStatus([this](int ret, uint8_t evse_state, uint32_t session_time, uint8_t pilot_state, uint32_t vflags)
290-
{
291-
if(RAPI_RESPONSE_OK == ret)
292-
{
293-
DBUGF("evse_state = %02x, session_time = %d, pilot_state = %02x, vflags = %08x", evse_state, session_time, pilot_state, vflags);
294-
if(_state.setState(evse_state, pilot_state, vflags)) {
295-
evseStateChanged();
296-
}
297-
298-
_elapsed = session_time;
299-
_elapsed_set_time = millis();
300-
301-
_data_ready.ready(EVSE_MONITOR_STATE_DATA_READY);
302-
}
303-
});
286+
if(0 == _count % EVSE_MONITOR_STATE_TIME) {
287+
getStatusFromEvse();
304288
}
305289

306-
if(0 == _count % EVSE_MONITOR_AMP_AND_VOLT_TIME)
307-
{
308-
if(_state.isCharging())
309-
{
310-
DBUGLN("Get charge current/voltage status");
311-
_openevse.getChargeCurrentAndVoltage([this](int ret, double a, double volts)
312-
{
313-
if(RAPI_RESPONSE_OK == ret)
314-
{
315-
DBUGF("amps = %.2f, volts = %.2f", a, volts);
316-
_amp = a;
317-
if(volts >= 0) {
318-
_voltage = volts;
319-
}
320-
_data_ready.ready(EVSE_MONITOR_AMP_AND_VOLT_DATA_READY);
321-
}
322-
});
323-
} else {
324-
_data_ready.ready(EVSE_MONITOR_AMP_AND_VOLT_DATA_READY);
325-
}
290+
if(0 == _count % EVSE_MONITOR_AMP_AND_VOLT_TIME) {
291+
getChargeCurrentAndVoltageFromEvse();
326292
}
327293

328-
if(0 == _count % EVSE_MONITOR_TEMP_TIME)
329-
{
330-
DBUGLN("Get tempurature status");
331-
_openevse.getTemperature([this](int ret, double t1, bool t1_valid, double t2, bool t2_valid, double t3, bool t3_valid)
332-
{
333-
if(RAPI_RESPONSE_OK == ret)
334-
{
335-
DBUGF("t1 = %.1f%s, t2 = %.1f%s, t3 = %.1f%s", t1, t1_valid ? "" : "*", t2, t2_valid ? "" : "*", t3, t3_valid ? "" : "*");
336-
_temps[EVSE_MONITOR_TEMP_EVSE_DS3232].set(t1, t1_valid);
337-
_temps[EVSE_MONITOR_TEMP_EVSE_MCP9808].set(t2, t2_valid);
338-
_temps[EVSE_MONITOR_TEMP_EVSE_TMP007].set(t3, t3_valid);
339-
#ifdef ENABLE_MCP9808
340-
{
341-
double mcp9808_temp = _mcp9808.readTempC();
342-
DBUGVAR(mcp9808_temp);
343-
_temps[EVSE_MONITOR_TEMP_ESP_MCP9808].set(mcp9808_temp, !isnan(mcp9808_temp));
344-
}
345-
#endif
346-
347-
_temps[EVSE_MONITOR_TEMP_MONITOR].invalidate();
348-
for(int i = 1; i < EVSE_MONITOR_TEMP_COUNT; i++)
349-
{
350-
if(_temps[i].isValid()) {
351-
_temps[EVSE_MONITOR_TEMP_MONITOR].set(_temps[i].get(), _temps[i].isValid());
352-
break;
353-
}
354-
}
355-
_data_ready.ready(EVSE_MONITOR_TEMP_DATA_READY);
356-
}
357-
});
294+
if(0 == _count % EVSE_MONITOR_TEMP_TIME) {
295+
getTemperatureFromEvse();
358296
}
359297

360-
if(0 == _count % EVSE_MONITOR_ENERGY_TIME)
361-
{
362-
if(_state.isCharging())
363-
{
364-
DBUGLN("Get charge energy usage");
365-
_openevse.getEnergy([this](int ret, double session_wh, double total_kwh)
366-
{
367-
if(RAPI_RESPONSE_OK == ret)
368-
{
369-
DBUGF("session_wh = %.2f, total_kwh = %.2f", session_wh, total_kwh);
370-
_session_wh = session_wh;
371-
_total_kwh = total_kwh;
372-
373-
_data_ready.ready(EVSE_MONITOR_ENERGY_DATA_READY);
374-
}
375-
});
376-
} else {
377-
_data_ready.ready(EVSE_MONITOR_ENERGY_DATA_READY);
378-
}
298+
if(0 == _count % EVSE_MONITOR_ENERGY_TIME) {
299+
getEnergyFromEvse();
379300
}
380301

381302
_count ++;
@@ -433,6 +354,39 @@ EvseMonitor::ServiceLevel EvseMonitor::getServiceLevel()
433354
ServiceLevel::L1;
434355
}
435356

357+
void EvseMonitor::enable()
358+
{
359+
OpenEVSE.enable([this](int ret)
360+
{
361+
DBUGF("EVSE: enable - complete %d", ret);
362+
if(RAPI_RESPONSE_OK == ret) {
363+
getStatusFromEvse();
364+
}
365+
});
366+
}
367+
368+
void EvseMonitor::sleep()
369+
{
370+
OpenEVSE.sleep([this](int ret)
371+
{
372+
DBUGF("EVSE: sleep - complete %d", ret);
373+
if(RAPI_RESPONSE_OK == ret) {
374+
getStatusFromEvse();
375+
}
376+
});
377+
}
378+
379+
void EvseMonitor::disable()
380+
{
381+
OpenEVSE.disable([this](int ret)
382+
{
383+
DBUGF("EVSE: disable - complete %d", ret);
384+
if(RAPI_RESPONSE_OK == ret) {
385+
getStatusFromEvse();
386+
}
387+
});
388+
}
389+
436390
void EvseMonitor::setPilot(long amps)
437391
{
438392
_openevse.setCurrentCapacity(amps, false, [this](int ret, long pilot)
@@ -443,3 +397,98 @@ void EvseMonitor::setPilot(long amps)
443397
});
444398
}
445399

400+
void EvseMonitor::getStatusFromEvse()
401+
{
402+
DBUGLN("Get EVSE status");
403+
_openevse.getStatus([this](int ret, uint8_t evse_state, uint32_t session_time, uint8_t pilot_state, uint32_t vflags)
404+
{
405+
if(RAPI_RESPONSE_OK == ret)
406+
{
407+
DBUGF("evse_state = %02x, session_time = %d, pilot_state = %02x, vflags = %08x", evse_state, session_time, pilot_state, vflags);
408+
if(_state.setState(evse_state, pilot_state, vflags)) {
409+
evseStateChanged();
410+
}
411+
412+
_elapsed = session_time;
413+
_elapsed_set_time = millis();
414+
415+
_data_ready.ready(EVSE_MONITOR_STATE_DATA_READY);
416+
}
417+
});
418+
}
419+
420+
void EvseMonitor::getChargeCurrentAndVoltageFromEvse()
421+
{
422+
if(_state.isCharging())
423+
{
424+
DBUGLN("Get charge current/voltage status");
425+
_openevse.getChargeCurrentAndVoltage([this](int ret, double a, double volts)
426+
{
427+
if(RAPI_RESPONSE_OK == ret)
428+
{
429+
DBUGF("amps = %.2f, volts = %.2f", a, volts);
430+
_amp = a;
431+
if(volts >= 0) {
432+
_voltage = volts;
433+
}
434+
_data_ready.ready(EVSE_MONITOR_AMP_AND_VOLT_DATA_READY);
435+
}
436+
});
437+
} else {
438+
_data_ready.ready(EVSE_MONITOR_AMP_AND_VOLT_DATA_READY);
439+
}
440+
}
441+
442+
void EvseMonitor::getTemperatureFromEvse()
443+
{
444+
DBUGLN("Get tempurature status");
445+
_openevse.getTemperature([this](int ret, double t1, bool t1_valid, double t2, bool t2_valid, double t3, bool t3_valid)
446+
{
447+
if(RAPI_RESPONSE_OK == ret)
448+
{
449+
DBUGF("t1 = %.1f%s, t2 = %.1f%s, t3 = %.1f%s", t1, t1_valid ? "" : "*", t2, t2_valid ? "" : "*", t3, t3_valid ? "" : "*");
450+
_temps[EVSE_MONITOR_TEMP_EVSE_DS3232].set(t1, t1_valid);
451+
_temps[EVSE_MONITOR_TEMP_EVSE_MCP9808].set(t2, t2_valid);
452+
_temps[EVSE_MONITOR_TEMP_EVSE_TMP007].set(t3, t3_valid);
453+
#ifdef ENABLE_MCP9808
454+
{
455+
double mcp9808_temp = _mcp9808.readTempC();
456+
DBUGVAR(mcp9808_temp);
457+
_temps[EVSE_MONITOR_TEMP_ESP_MCP9808].set(mcp9808_temp, !isnan(mcp9808_temp));
458+
}
459+
#endif
460+
461+
_temps[EVSE_MONITOR_TEMP_MONITOR].invalidate();
462+
for(int i = 1; i < EVSE_MONITOR_TEMP_COUNT; i++)
463+
{
464+
if(_temps[i].isValid()) {
465+
_temps[EVSE_MONITOR_TEMP_MONITOR].set(_temps[i].get(), _temps[i].isValid());
466+
break;
467+
}
468+
}
469+
_data_ready.ready(EVSE_MONITOR_TEMP_DATA_READY);
470+
}
471+
});
472+
}
473+
474+
void EvseMonitor::getEnergyFromEvse()
475+
{
476+
if(_state.isCharging())
477+
{
478+
DBUGLN("Get charge energy usage");
479+
_openevse.getEnergy([this](int ret, double session_wh, double total_kwh)
480+
{
481+
if(RAPI_RESPONSE_OK == ret)
482+
{
483+
DBUGF("session_wh = %.2f, total_kwh = %.2f", session_wh, total_kwh);
484+
_session_wh = session_wh;
485+
_total_kwh = total_kwh;
486+
487+
_data_ready.ready(EVSE_MONITOR_ENERGY_DATA_READY);
488+
}
489+
});
490+
} else {
491+
_data_ready.ready(EVSE_MONITOR_ENERGY_DATA_READY);
492+
}
493+
}
494+

src/evse_monitor.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,11 @@ class EvseMonitor : public MicroTasks::Task
154154

155155
void evseBoot(const char *firmware_version);
156156
void evseStateChanged();
157+
158+
void getStatusFromEvse();
159+
void getChargeCurrentAndVoltageFromEvse();
160+
void getTemperatureFromEvse();
161+
void getEnergyFromEvse();
157162
protected:
158163
void setup();
159164
unsigned long loop(MicroTasks::WakeReason reason);
@@ -175,6 +180,10 @@ class EvseMonitor : public MicroTasks::Task
175180

176181
bool begin(RapiSender &sender);
177182

183+
void enable();
184+
void sleep();
185+
void disable();
186+
178187
void setPilot(long amps);
179188

180189
uint8_t getEvseState() {

0 commit comments

Comments
 (0)