Skip to content

Commit 01b794e

Browse files
committed
Merge branch 'master' of github.com:OpenEVSE/ESP32_WiFi_V3.x into issue71/Vehicle_config_ui
2 parents b039757 + c75565a commit 01b794e

File tree

11 files changed

+275
-30
lines changed

11 files changed

+275
-30
lines changed

docs/wired-ethernet.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ Network connection can be made with a standard Ethernet cable. For new installat
1313

1414
## Hardware Connections
1515

16+
See [photos ](https://photos.google.com/share/AF1QipNvANgeR_NRmLrq0lhKnA0BR7ieD8DGRoaJFoilMIwQ8c7QpxR4X7hSfGj3XiTTUw) of hardware connectors for new OpenEVSE V5.5 controller.
17+
1618
*Note: The these hardware connections apply to the current Rev.E & Rev.F ESP32-gateway hardware revisions. See section below for older units.*
1719

1820

platformio.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ build_flags =
8181
-DAO_CUSTOM_WS ; ArduinoOcpp: don't use built-in WS library
8282
#-DENABLE_DEBUG
8383
#-DENABLE_DEBUG_MONGOOSE_HTTP_CLIENT
84+
-DRAPI_MAX_COMMANDS=20
8485
build_partitions = min_spiffs.csv
8586
monitor_flags = --filter=esp32_exception_decoder
8687

src/divert.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ void divertmode_update(byte newmode)
9292
event["smoothed_available_current"] = smoothed_available_current = 0;
9393

9494
EvseProperties props(EvseState::Disabled);
95-
evse.claim(EvseClient_OpenEVSE_Divert, EvseManager_Priority_Divert, props);
95+
evse.claim(EvseClient_OpenEVSE_Divert, EvseManager_Priority_Default, props);
9696
} break;
9797

9898
default:
@@ -208,7 +208,7 @@ void divert_update_state()
208208
if(divert_active && divertmode_get_time() >= min_charge_end)
209209
{
210210
EvseProperties props(EvseState::Disabled);
211-
evse.claim(EvseClient_OpenEVSE_Divert, EvseManager_Priority_Divert, props);
211+
evse.claim(EvseClient_OpenEVSE_Divert, EvseManager_Priority_Default, props);
212212

213213
if(previousState != evse.getState())
214214
{

src/evse_man.cpp

Lines changed: 60 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -109,11 +109,19 @@ EvseManager::Claim::Claim() :
109109
{
110110
}
111111

112-
void EvseManager::Claim::claim(EvseClient client, int priority, EvseProperties &target)
112+
bool EvseManager::Claim::claim(EvseClient client, int priority, EvseProperties &target)
113113
{
114-
_client = client;
115-
_priority = priority;
116-
_properties = target;
114+
if(_client != client ||
115+
_priority != priority ||
116+
_properties != target)
117+
{
118+
_client = client;
119+
_priority = priority;
120+
_properties = target;
121+
return true;
122+
}
123+
124+
return false;
117125
}
118126

119127
void EvseManager::Claim::release()
@@ -128,10 +136,10 @@ EvseManager::EvseManager(Stream &port) :
128136
_clients(),
129137
_evseStateListener(this),
130138
_sessionCompleteListener(this),
131-
_targetProperties(),
139+
_targetProperties(EvseState::Active),
132140
_hasClaims(false),
133141
_sleepForDisable(true),
134-
_evaluateClaims(false),
142+
_evaluateClaims(true),
135143
_evaluateTargetState(false),
136144
_waitingForEvent(0),
137145
_vehicleValid(0),
@@ -391,7 +399,7 @@ bool EvseManager::claim(EvseClient client, int priority, EvseProperties &target)
391399
{
392400
Claim *slot = NULL;
393401

394-
DBUGF("New claim from 0x%08x, priority %d, %s", client, priority, target.getState().toString());
402+
DBUGF("Claim from 0x%08x, priority %d, %s", client, priority, target.getState().toString());
395403

396404
for (size_t i = 0; i < EVSE_MANAGER_MAX_CLIENT_CLAIMS; i++)
397405
{
@@ -406,10 +414,13 @@ bool EvseManager::claim(EvseClient client, int priority, EvseProperties &target)
406414

407415
if(slot)
408416
{
409-
DBUGF("Found slot, waking task");
410-
slot->claim(client, priority, target);
411-
_evaluateClaims = true;
412-
MicroTask.wakeTask(this);
417+
DBUGF("Found slot");
418+
if(slot->claim(client, priority, target))
419+
{
420+
DBUGF("Claim added/updated, waking task");
421+
_evaluateClaims = true;
422+
MicroTask.wakeTask(this);
423+
}
413424
return true;
414425
}
415426

@@ -557,3 +568,41 @@ void EvseManager::setVehicleEta(int vehicleEta)
557568
_vehicleLastUpdated = millis();
558569
MicroTask.wakeTask(this);
559570
}
571+
572+
bool EvseManager::isRapiCommandBlocked(String rapi)
573+
{
574+
return rapi.startsWith("$ST");
575+
}
576+
577+
bool EvseManager::serializeClaims(DynamicJsonDocument &doc)
578+
{
579+
doc.to<JsonArray>();
580+
581+
for(size_t i = 0; i < EVSE_MANAGER_MAX_CLIENT_CLAIMS; i++)
582+
{
583+
Claim &claim = _clients[i];
584+
if(claim.isValid())
585+
{
586+
JsonObject obj = doc.createNestedObject();
587+
obj["client"] = claim.getClient();
588+
obj["priority"] = claim.getPriority();
589+
claim.getProperties().serialize(obj);
590+
}
591+
}
592+
593+
return true;
594+
}
595+
596+
bool EvseManager::serializeClaim(DynamicJsonDocument &doc, EvseClient client)
597+
{
598+
Claim *claim;
599+
600+
if(findClaim(client, &claim))
601+
{
602+
doc["priority"] = claim->getPriority();
603+
claim->getProperties().serialize(doc);
604+
return true;
605+
}
606+
607+
return false;
608+
}

src/evse_man.h

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ typedef uint32_t EvseClient;
3939
#define EvseManager_Priority_Divert 50
4040
#define EvseManager_Priority_Timer 100
4141
#define EvseManager_Priority_Boost 200
42+
#define EvseManager_Priority_API 500
4243
#define EvseManager_Priority_Ohm 500
4344
#define EvseManager_Priority_Manual 1000
4445
#define EvseManager_Priority_Ocpp 1050
@@ -167,6 +168,34 @@ class EvseProperties : virtual public JsonSerialize<512>
167168
return *this;
168169
}
169170

171+
bool equals(EvseProperties &rhs) {
172+
return this->_state == rhs._state &&
173+
this->_charge_current == rhs._charge_current &&
174+
this->_max_current == rhs._max_current &&
175+
this->_energy_limit == rhs._energy_limit &&
176+
this->_time_limit == rhs._time_limit &&
177+
this->_auto_release == rhs._auto_release;
178+
179+
}
180+
bool equals(EvseState &rhs) {
181+
return this->_state == rhs;
182+
}
183+
184+
bool operator == (EvseProperties &rhs) {
185+
return this->equals(rhs);
186+
}
187+
bool operator == (EvseState &rhs) {
188+
return this->equals(rhs);
189+
}
190+
191+
bool operator != (EvseProperties &rhs) {
192+
return !equals(rhs);
193+
}
194+
bool operator != (EvseState &rhs) {
195+
return !equals(rhs);
196+
}
197+
198+
170199
using JsonSerialize::deserialize;
171200
virtual bool deserialize(JsonObject &obj);
172201
using JsonSerialize::serialize;
@@ -186,7 +215,7 @@ class EvseManager : public MicroTasks::Task
186215
public:
187216
Claim();
188217

189-
void claim(EvseClient client, int priority, EvseProperties &target);
218+
bool claim(EvseClient client, int priority, EvseProperties &target);
190219
void release();
191220

192221
bool isValid() {
@@ -290,6 +319,9 @@ class EvseManager : public MicroTasks::Task
290319
uint32_t getEnergyLimit(EvseClient client = EvseClient_NULL);
291320
uint32_t getTimeLimit(EvseClient client = EvseClient_NULL);
292321

322+
bool serializeClaims(DynamicJsonDocument &doc);
323+
bool serializeClaim(DynamicJsonDocument &doc, EvseClient client);
324+
293325
// Evse Status
294326
bool isConnected() {
295327
return OpenEVSE.isConnected();
@@ -438,6 +470,8 @@ class EvseManager : public MicroTasks::Task
438470
void onSessionComplete(MicroTasks::EventListener *listner) {
439471
_monitor.onSessionComplete(listner);
440472
}
473+
474+
bool isRapiCommandBlocked(String rapi);
441475
};
442476

443477
#endif // !_OPENEVSE_EVSE_MAN_H

src/mqtt.cpp

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -132,16 +132,19 @@ void mqttmsg_callback(MongooseString topic, MongooseString payload) {
132132
cmd += " "+payload_str;
133133
}
134134

135-
rapiSender.sendCmd(cmd, [](int ret)
135+
if(!evse.isRapiCommandBlocked(cmd))
136136
{
137-
if (RAPI_RESPONSE_OK == ret || RAPI_RESPONSE_NK == ret)
137+
rapiSender.sendCmd(cmd, [](int ret)
138138
{
139-
String rapiString = rapiSender.getResponse();
140-
String mqtt_data = rapiString;
141-
String mqtt_sub_topic = mqtt_topic + "/rapi/out";
142-
mqttclient.publish(mqtt_sub_topic, mqtt_data);
143-
}
144-
});
139+
if (RAPI_RESPONSE_OK == ret || RAPI_RESPONSE_NK == ret)
140+
{
141+
String rapiString = rapiSender.getResponse();
142+
String mqtt_data = rapiString;
143+
String mqtt_sub_topic = mqtt_topic + "/rapi/out";
144+
mqttclient.publish(mqtt_sub_topic, mqtt_data);
145+
}
146+
});
147+
}
145148
}
146149
}
147150
} //end call back

src/scheduler.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,9 @@ unsigned long Scheduler::loop(MicroTasks::WakeReason reason)
204204
DBUGF("Starting %s claim",
205205
currentEvent.getState().toString());
206206
EvseProperties properties(currentEvent.getState());
207-
_evse->claim(EvseClient_OpenEVSE_Schedule, EvseManager_Priority_Timer, properties);
207+
_evse->claim(EvseClient_OpenEVSE_Schedule,
208+
EvseState::Active == currentEvent.getState() ? EvseManager_Priority_Timer : EvseManager_Priority_Default,
209+
properties);
208210
} else {
209211
// No scheduled events, release any claims
210212
DBUGLN("releasing claims");

src/web_server.cpp

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ const char _CONTENT_TYPE_JPEG[] PROGMEM = "image/jpeg";
5858
const char _CONTENT_TYPE_PNG[] PROGMEM = "image/png";
5959
const char _CONTENT_TYPE_SVG[] PROGMEM = "image/svg+xml";
6060

61+
#define RAPI_RESPONSE_BLOCKED -300
62+
63+
void handleEvseClaims(MongooseHttpServerRequest *request);
64+
6165
void dumpRequest(MongooseHttpServerRequest *request)
6266
{
6367
#ifdef ENABLE_DEBUG_WEB_REQUEST
@@ -119,7 +123,7 @@ void dumpRequest(MongooseHttpServerRequest *request)
119123
// -------------------------------------------------------------------
120124
// Helper function to perform the standard operations on a request
121125
// -------------------------------------------------------------------
122-
bool requestPreProcess(MongooseHttpServerRequest *request, MongooseHttpServerResponseStream *&response, fstr_t contentType = CONTENT_TYPE_JSON)
126+
bool requestPreProcess(MongooseHttpServerRequest *request, MongooseHttpServerResponseStream *&response, fstr_t contentType)
123127
{
124128
dumpRequest(request);
125129

@@ -587,6 +591,8 @@ handleStatus(MongooseHttpServerRequest *request) {
587591

588592
create_rapi_json(doc);
589593

594+
doc["status"] = evse.getState().toString();
595+
590596
doc["elapsed"] = evse.getSessionElapsed();
591597
doc["wattsec"] = evse.getSessionEnergy() * SESSION_ENERGY_SCALE_FACTOR;
592598
doc["watthour"] = evse.getTotalEnergy() * TOTAL_ENERGY_SCALE_FACTOR;
@@ -1106,12 +1112,18 @@ handleRapi(MongooseHttpServerRequest *request) {
11061112
if (request->hasParam("rapi"))
11071113
{
11081114
String rapi = request->getParam("rapi");
1115+
int ret = RAPI_RESPONSE_NK;
11091116

1110-
// BUG: Really we should do this in the main loop not here...
1111-
RAPI_PORT.flush();
1112-
DBUGVAR(rapi);
1113-
int ret = rapiSender.sendCmdSync(rapi);
1114-
DBUGVAR(ret);
1117+
if(!evse.isRapiCommandBlocked(rapi))
1118+
{
1119+
// BUG: Really we should do this in the main loop not here...
1120+
RAPI_PORT.flush();
1121+
DBUGVAR(rapi);
1122+
ret = rapiSender.sendCmdSync(rapi);
1123+
DBUGVAR(ret);
1124+
} else {
1125+
ret = RAPI_RESPONSE_BLOCKED;
1126+
}
11151127

11161128
if(RAPI_RESPONSE_OK == ret ||
11171129
RAPI_RESPONSE_NK == ret)
@@ -1167,6 +1179,7 @@ handleRapi(MongooseHttpServerRequest *request) {
11671179
RAPI_RESPONSE_BAD_CHECKSUM == ret ? F("RAPI_RESPONSE_BAD_CHECKSUM") :
11681180
RAPI_RESPONSE_BAD_SEQUENCE_ID == ret ? F("RAPI_RESPONSE_BAD_SEQUENCE_ID") :
11691181
RAPI_RESPONSE_ASYNC_EVENT == ret ? F("RAPI_RESPONSE_ASYNC_EVENT") :
1182+
RAPI_RESPONSE_BLOCKED == ret ? F("RAPI_RESPONSE_BLOCKED") :
11701183
F("UNKNOWN");
11711184

11721185
if (json) {
@@ -1177,7 +1190,7 @@ handleRapi(MongooseHttpServerRequest *request) {
11771190
s += errorString;
11781191
}
11791192

1180-
code = 500;
1193+
code = RAPI_RESPONSE_BLOCKED == ret ? 400 : 500;
11811194
}
11821195
}
11831196
if (false == json) {
@@ -1261,6 +1274,8 @@ web_server_setup() {
12611274
server.on("/schedule/plan$", handleSchedulePlan);
12621275
server.on("/schedule", handleSchedule);
12631276

1277+
server.on("/claims", handleEvseClaims);
1278+
12641279
server.on("/override$", handleOverride);
12651280

12661281
// Simple Firmware Update Form

src/web_server.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ extern void web_server_loop();
3636

3737
extern void web_server_event(JsonDocument &event);
3838

39+
typedef const __FlashStringHelper *fstr_t;
40+
41+
bool requestPreProcess(MongooseHttpServerRequest *request, MongooseHttpServerResponseStream *&response, fstr_t contentType = CONTENT_TYPE_JSON);
3942
void dumpRequest(MongooseHttpServerRequest *request);
4043

4144
#endif // _EMONESP_WEB_SERVER_H

0 commit comments

Comments
 (0)