Skip to content

Commit 952ff86

Browse files
committed
Merge branch 'jeremypoulter/issue147' into jeremypoulter/issue192
2 parents 8142002 + 78090a1 commit 952ff86

File tree

8 files changed

+186
-5
lines changed

8 files changed

+186
-5
lines changed

platformio.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ lib_deps =
3939
4040
4141
42-
42+
4343
4444
4545
extra_scripts = scripts/extra_script.py

src/evse_man.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,3 +529,36 @@ bool EvseManager::isRapiCommandBlocked(String rapi)
529529
{
530530
return rapi.startsWith("$ST");
531531
}
532+
533+
bool EvseManager::serializeClaims(DynamicJsonDocument &doc)
534+
{
535+
doc.to<JsonArray>();
536+
537+
for(size_t i = 0; i < EVSE_MANAGER_MAX_CLIENT_CLAIMS; i++)
538+
{
539+
Claim &claim = _clients[i];
540+
if(claim.isValid())
541+
{
542+
JsonObject obj = doc.createNestedObject();
543+
obj["client"] = claim.getClient();
544+
obj["priority"] = claim.getPriority();
545+
claim.getProperties().serialize(obj);
546+
}
547+
}
548+
549+
return true;
550+
}
551+
552+
bool EvseManager::serializeClaim(DynamicJsonDocument &doc, EvseClient client)
553+
{
554+
Claim *claim;
555+
556+
if(findClaim(client, &claim))
557+
{
558+
doc["priority"] = claim->getPriority();
559+
claim->getProperties().serialize(doc);
560+
return true;
561+
}
562+
563+
return false;
564+
}

src/evse_man.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ typedef uint32_t EvseClient;
3838
#define EvseManager_Priority_Divert 50
3939
#define EvseManager_Priority_Timer 100
4040
#define EvseManager_Priority_Boost 200
41+
#define EvseManager_Priority_API 500
4142
#define EvseManager_Priority_Ohm 500
4243
#define EvseManager_Priority_Manual 1000
4344
#define EvseManager_Priority_Limit 1100
@@ -277,6 +278,9 @@ class EvseManager : public MicroTasks::Task
277278
uint32_t getEnergyLimit(EvseClient client = EvseClient_NULL);
278279
uint32_t getTimeLimit(EvseClient client = EvseClient_NULL);
279280

281+
bool serializeClaims(DynamicJsonDocument &doc);
282+
bool serializeClaim(DynamicJsonDocument &doc, EvseClient client);
283+
280284
// Evse Status
281285
bool isConnected() {
282286
return OpenEVSE.isConnected();

src/main.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -192,9 +192,8 @@ loop() {
192192
// -------------------------------------------------------------------
193193
// Do these things once every 30 seconds
194194
// -------------------------------------------------------------------
195-
if ((millis() - Timer1) >= 30000) {
196-
DBUGLN("Time1");
197-
195+
if ((millis() - Timer1) >= 30000)
196+
{
198197
if(!Update.isRunning())
199198
{
200199
if(config_ohm_enabled()) {

src/web_server.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ const char _CONTENT_TYPE_SVG[] PROGMEM = "image/svg+xml";
5858

5959
#define RAPI_RESPONSE_BLOCKED -300
6060

61+
void handleEvseClaims(MongooseHttpServerRequest *request);
62+
6163
void dumpRequest(MongooseHttpServerRequest *request)
6264
{
6365
#ifdef ENABLE_DEBUG_WEB_REQUEST
@@ -119,7 +121,7 @@ void dumpRequest(MongooseHttpServerRequest *request)
119121
// -------------------------------------------------------------------
120122
// Helper function to perform the standard operations on a request
121123
// -------------------------------------------------------------------
122-
bool requestPreProcess(MongooseHttpServerRequest *request, MongooseHttpServerResponseStream *&response, fstr_t contentType = CONTENT_TYPE_JSON)
124+
bool requestPreProcess(MongooseHttpServerRequest *request, MongooseHttpServerResponseStream *&response, fstr_t contentType)
123125
{
124126
dumpRequest(request);
125127

@@ -585,6 +587,8 @@ handleStatus(MongooseHttpServerRequest *request) {
585587

586588
create_rapi_json(doc);
587589

590+
doc["status"] = evse.getState().toString();
591+
588592
doc["elapsed"] = evse.getSessionElapsed();
589593
doc["wattsec"] = evse.getSessionEnergy() * SESSION_ENERGY_SCALE_FACTOR;
590594
doc["watthour"] = evse.getTotalEnergy() * TOTAL_ENERGY_SCALE_FACTOR;
@@ -1256,6 +1260,8 @@ web_server_setup() {
12561260
server.on("/schedule/plan$", handleSchedulePlan);
12571261
server.on("/schedule", handleSchedule);
12581262

1263+
server.on("/claims", handleEvseClaims);
1264+
12591265
server.on("/override$", handleOverride);
12601266

12611267
// 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

src/web_server_claims.cpp

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
#if defined(ENABLE_DEBUG) && !defined(ENABLE_DEBUG_WEB)
2+
#undef ENABLE_DEBUG
3+
#endif
4+
5+
#include <Arduino.h>
6+
7+
typedef const __FlashStringHelper *fstr_t;
8+
9+
#include "emonesp.h"
10+
#include "web_server.h"
11+
#include "evse_man.h"
12+
#include "input.h"
13+
14+
// -------------------------------------------------------------------
15+
//
16+
// url: /claims
17+
// -------------------------------------------------------------------
18+
void
19+
handleEvseClaimsGet(MongooseHttpServerRequest *request, MongooseHttpServerResponseStream *response, uint32_t client)
20+
{
21+
const size_t capacity = JSON_OBJECT_SIZE(40) + 1024;
22+
DynamicJsonDocument doc(capacity);
23+
24+
bool success = (EvseClient_NULL == client) ?
25+
evse.serializeClaims(doc) :
26+
evse.serializeClaim(doc, client);
27+
28+
if(success) {
29+
response->setCode(200);
30+
serializeJson(doc, *response);
31+
} else {
32+
response->setCode(404);
33+
response->print("{\"msg\":\"Not found\"}");
34+
}
35+
}
36+
37+
void
38+
handleEvseClaimsPost(MongooseHttpServerRequest *request, MongooseHttpServerResponseStream *response, uint32_t client)
39+
{
40+
String body = request->body().toString();
41+
42+
if(EvseClient_NULL == client)
43+
{
44+
EvseProperties properties;
45+
if(properties.deserialize(body))
46+
{
47+
int priority = 500;
48+
if(evse.claim(client, EvseManager_Priority_API, properties)) {
49+
response->setCode(200);
50+
response->print("{\"msg\":\"done\"}");
51+
} else {
52+
response->setCode(400);
53+
response->print("{\"msg\":\"Could not make claim\"}");
54+
}
55+
} else {
56+
response->setCode(400);
57+
response->print("{\"msg\":\"Could not parse JSON\"}");
58+
}
59+
} else {
60+
response->setCode(405);
61+
response->print("{\"msg\":\"Method not allowed\"}");
62+
}
63+
}
64+
65+
void
66+
handleEvseClaimsDelete(MongooseHttpServerRequest *request, MongooseHttpServerResponseStream *response, uint32_t client)
67+
{
68+
if(EvseClient_NULL != client)
69+
{
70+
if(evse.release(client)) {
71+
response->setCode(200);
72+
response->print("{\"msg\":\"done\"}");
73+
} else {
74+
response->setCode(404);
75+
response->print("{\"msg\":\"Not found\"}");
76+
}
77+
} else {
78+
response->setCode(405);
79+
response->print("{\"msg\":\"Method not allowed\"}");
80+
}
81+
}
82+
83+
#define EVSE_CLAIM_PATH_LEN (sizeof("/claims/") - 1)
84+
85+
void
86+
handleEvseClaims(MongooseHttpServerRequest *request)
87+
{
88+
MongooseHttpServerResponseStream *response;
89+
if(false == requestPreProcess(request, response)) {
90+
return;
91+
}
92+
93+
uint32_t client = EvseClient_NULL;
94+
95+
String path = request->uri();
96+
if(path.length() > EVSE_CLAIM_PATH_LEN) {
97+
String clientStr = path.substring(EVSE_CLAIM_PATH_LEN);
98+
DBUGVAR(clientStr);
99+
client = clientStr.toInt();
100+
}
101+
102+
DBUGVAR(client, HEX);
103+
104+
if(HTTP_GET == request->method()) {
105+
handleEvseClaimsGet(request, response, client);
106+
} else if(HTTP_POST == request->method()) {
107+
handleEvseClaimsPost(request, response, client);
108+
} else if(HTTP_DELETE == request->method()) {
109+
handleEvseClaimsDelete(request, response, client);
110+
} else {
111+
response->setCode(405);
112+
response->print("{\"msg\":\"Method not allowed\"}");
113+
}
114+
115+
request->send(response);
116+
}

test/claims.http

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Name: REST Client
2+
# Id: humao.rest-client
3+
# Description: REST Client for Visual Studio Code
4+
# Version: 0.21.3
5+
# Publisher: Huachao Mao
6+
# VS Marketplace Link: https://marketplace.visualstudio.com/items?itemName=humao.rest-client
7+
8+
# You should use environment vars (https://marketplace.visualstudio.com/items?itemName=humao.rest-client#environment-variables) for these
9+
# but you can also set here if needed (just don't check in!)
10+
11+
#@baseUrl = http://openevse.local
12+
13+
#@ssid = your_ssid
14+
#@pass = your_password
15+
#@apikey = your_key
16+
17+
###
18+
19+
# Get the EVSE claims
20+
GET {{baseUrl}}/claims HTTP/1.1

0 commit comments

Comments
 (0)