Skip to content

Commit 697b6ea

Browse files
Merge pull request #198 from OpenEVSE/issue71/Vehicle_config_ui
Adding a GUI for configuring the vehicle data source
2 parents c75565a + 01b794e commit 697b6ea

26 files changed

+911
-239
lines changed

platformio.ini

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ extra_scripts = scripts/extra_script.py
4848
debug_flags =
4949
-ggdb
5050
-DENABLE_DEBUG
51+
#-DENABLE_DEBUG_WEB
52+
#-DENABLE_DEBUG_WEB_REQUEST
5153
#-DENABLE_DEBUG_SCHEDULER
5254
#-DENABLE_DEBUG_EVSE_MAN
5355
#-DENABLE_DEBUG_EVSE_MONITOR
@@ -56,8 +58,10 @@ debug_flags =
5658
#-DENABLE_DEBUG_LCD
5759
#-DENABLE_DEBUG_MQTT
5860
#-DENABLE_DEBUG_EMONCMS
61+
#-DENABLE_DEBUG_TESLA_CLIENT
5962
#-DENABLE_PROFILE
6063
src_build_flags =
64+
# -DARDUINOJSON_USE_LONG_LONG
6165
# -DENABLE_ASYNC_WIFI_SCAN
6266
build_flags =
6367
-DCS_PLATFORM=CS_P_ESP32
@@ -75,6 +79,8 @@ build_flags =
7579
-DMG_ENABLE_SNTP=1
7680
-DCS_PLATFORM=CS_P_ESP32
7781
-DAO_CUSTOM_WS ; ArduinoOcpp: don't use built-in WS library
82+
#-DENABLE_DEBUG
83+
#-DENABLE_DEBUG_MONGOOSE_HTTP_CLIENT
7884
-DRAPI_MAX_COMMANDS=20
7985
build_partitions = min_spiffs.csv
8086
monitor_flags = --filter=esp32_exception_decoder
@@ -134,8 +140,8 @@ build_flags =
134140
-DTX1=27
135141
-ggdb
136142
#upload_port = openevse.local
137-
#upload_speed = 921600
138-
upload_protocol = ftdi
143+
upload_speed = 2000000
144+
#upload_protocol = ftdi
139145
monitor_speed = 115200
140146
extra_scripts = ${common.extra_scripts}
141147
board_build.partitions = ${common.build_partitions}

src/app_config.cpp

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ String mqtt_pass;
4646
String mqtt_solar;
4747
String mqtt_grid_ie;
4848
String mqtt_vrms;
49+
String mqtt_vehicle_soc;
50+
String mqtt_vehicle_range;
51+
String mqtt_vehicle_eta;
4952
String mqtt_announce_topic;
5053

5154
// OCPP 1.6 Settings
@@ -70,9 +73,12 @@ double divert_decay_smoothing_factor;
7073
uint32_t divert_min_charge_time;
7174

7275
// Tesla Client settings
73-
String tesla_username;
74-
String tesla_password;
75-
int tesla_vehidx;
76+
String tesla_access_token;
77+
String tesla_refresh_token;
78+
uint64_t tesla_created_at;
79+
uint64_t tesla_expires_in;
80+
81+
String tesla_vehicle_id;
7682

7783
#if RGB_LED
7884
uint8_t led_brightness;
@@ -116,6 +122,9 @@ ConfigOpt *opts[] =
116122
new ConfigOptDefenition<String>(mqtt_solar, "", "mqtt_solar", "mo"),
117123
new ConfigOptDefenition<String>(mqtt_grid_ie, "emon/emonpi/power1", "mqtt_grid_ie", "mg"),
118124
new ConfigOptDefenition<String>(mqtt_vrms, "emon/emonpi/vrms", "mqtt_vrms", "mv"),
125+
new ConfigOptDefenition<String>(mqtt_vehicle_soc, "", "mqtt_vehicle_soc", "mc"),
126+
new ConfigOptDefenition<String>(mqtt_vehicle_range, "", "mqtt_vehicle_range", "mr"),
127+
new ConfigOptDefenition<String>(mqtt_vehicle_eta, "", "mqtt_vehicle_eta", "met"),
119128
new ConfigOptDefenition<String>(mqtt_announce_topic, "openevse/announce/"+ESPAL.getShortId(), "mqtt_announce_topic", "ma"),
120129

121130
// OCPP 1.6 Settings
@@ -134,9 +143,11 @@ ConfigOpt *opts[] =
134143
new ConfigOptDefenition<uint32_t>(divert_min_charge_time, (10 * 60), "divert_min_charge_time", "dt"),
135144

136145
// Tesla client settings
137-
new ConfigOptDefenition<String>(tesla_username, "", "tesla_username", "tu"),
138-
new ConfigOptSecret(tesla_password, "", "tesla_password", "tp"),
139-
new ConfigOptDefenition<int>(tesla_vehidx, -1, "tesla_vehidx", "ti"),
146+
new ConfigOptSecret(tesla_access_token, "", "tesla_access_token", "tat"),
147+
new ConfigOptSecret(tesla_refresh_token, "", "tesla_refresh_token", "trt"),
148+
new ConfigOptDefenition<uint64_t>(tesla_created_at, -1, "tesla_created_at", "tc"),
149+
new ConfigOptDefenition<uint64_t>(tesla_expires_in, -1, "tesla_expires_in", "tx"),
150+
new ConfigOptDefenition<String>(tesla_vehicle_id, "", "tesla_vehicle_id", "ti"),
140151

141152
#if RGB_LED
142153
// LED brightness
@@ -152,9 +163,10 @@ ConfigOpt *opts[] =
152163
new ConfigOptVirtualBool(flagsOpt, CONFIG_MQTT_ALLOW_ANY_CERT, 0, "mqtt_reject_unauthorized", "mru"),
153164
new ConfigOptVirtualBool(flagsOpt, CONFIG_SERVICE_OHM, CONFIG_SERVICE_OHM, "ohm_enabled", "oe"),
154165
new ConfigOptVirtualBool(flagsOpt, CONFIG_SERVICE_SNTP, CONFIG_SERVICE_SNTP, "sntp_enabled", "se"),
155-
new ConfigOptVirtualBool(flagsOpt,CONFIG_SERVICE_TESLA,CONFIG_SERVICE_TESLA, "tesla_enabled", "te"),
166+
new ConfigOptVirtualBool(flagsOpt, CONFIG_SERVICE_TESLA, CONFIG_SERVICE_TESLA, "tesla_enabled", "te"),
156167
new ConfigOptVirtualBool(flagsOpt, CONFIG_SERVICE_DIVERT, CONFIG_SERVICE_DIVERT, "divert_enabled", "de"),
157168
new ConfigOptVirtualBool(flagsOpt, CONFIG_PAUSE_USES_DISABLED, CONFIG_PAUSE_USES_DISABLED, "pause_uses_disabled", "pd"),
169+
new ConfigOptVirtualBool(flagsOpt, CONFIG_VEHICLE_RANGE_MILES, CONFIG_VEHICLE_RANGE_MILES, "mqtt_vehicle_range_miles", "mvru"),
158170
new ConfigOptVirtualBool(flagsOpt, CONFIG_SERVICE_OCPP, CONFIG_SERVICE_OCPP, "ocpp_enabled", "ope"),
159171
new ConfigOptVirtualBool(flagsOpt, CONFIG_OCPP_ACCESS_SUSPEND, CONFIG_OCPP_ACCESS_SUSPEND, "ocpp_suspend_evse", "ops"),
160172
new ConfigOptVirtualBool(flagsOpt, CONFIG_OCPP_ACCESS_ENERGIZE, CONFIG_OCPP_ACCESS_ENERGIZE, "ocpp_energize_plug", "opn"),
@@ -218,12 +230,10 @@ void config_changed(String name)
218230
DBUGVAR(config_divert_enabled());
219231
DBUGVAR(config_charge_mode());
220232
divertmode_update((config_divert_enabled() && 1 == config_charge_mode()) ? DIVERT_MODE_ECO : DIVERT_MODE_NORMAL);
221-
} else if(name == "tesla_username") {
222-
teslaClient.setUser(tesla_username.c_str());
223-
} else if(name == "tesla_password") {
224-
teslaClient.setPass(tesla_password.c_str());
225-
} else if(name == "tesla_vehidx") {
226-
teslaClient.setVehicleIdx(tesla_vehidx);
233+
} else if(name == "tesla_vehicle_id") {
234+
teslaClient.setVehicleId(tesla_vehicle_id);
235+
} else if(name.startsWith("tesla_")) {
236+
teslaClient.setCredentials(tesla_access_token, tesla_refresh_token, tesla_created_at, tesla_expires_in);
227237
#if RGB_LED
228238
} else if(name == "led_brightness") {
229239
ledManager.setBrightness(led_brightness);

src/app_config.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ extern String mqtt_pass;
4040
extern String mqtt_solar;
4141
extern String mqtt_grid_ie;
4242
extern String mqtt_vrms;
43+
extern String mqtt_vehicle_soc;
44+
extern String mqtt_vehicle_range;
45+
extern String mqtt_vehicle_eta;
4346
extern String mqtt_announce_topic;
4447

4548
// OCPP 1.6 Settings
@@ -69,10 +72,11 @@ extern uint32_t flags;
6972
#define CONFIG_SERVICE_TESLA (1 << 8)
7073
#define CONFIG_SERVICE_DIVERT (1 << 9)
7174
#define CONFIG_CHARGE_MODE (7 << 10) // 3 bits for mode
72-
#define CONFIG_PAUSE_USES_DISABLED (1 << 13)
75+
#define CONFIG_PAUSE_USES_DISABLED (1 << 13)
7376
#define CONFIG_SERVICE_OCPP (1 << 14)
7477
#define CONFIG_OCPP_ACCESS_SUSPEND (1 << 15)
7578
#define CONFIG_OCPP_ACCESS_ENERGIZE (1 << 16)
79+
#define CONFIG_VEHICLE_RANGE_MILES (1 << 17)
7680

7781
inline bool config_emoncms_enabled() {
7882
return CONFIG_SERVICE_EMONCMS == (flags & CONFIG_SERVICE_EMONCMS);
@@ -126,6 +130,10 @@ inline bool config_pause_uses_disabled() {
126130
return CONFIG_PAUSE_USES_DISABLED == (flags & CONFIG_PAUSE_USES_DISABLED);
127131
}
128132

133+
inline bool config_vehicle_range_miles() {
134+
return CONFIG_VEHICLE_RANGE_MILES == (flags & CONFIG_VEHICLE_RANGE_MILES);
135+
}
136+
129137
// Ohm Connect Settings
130138
extern String ohm;
131139

src/evse_man.cpp

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,13 @@ EvseManager::EvseManager(Stream &port) :
141141
_sleepForDisable(true),
142142
_evaluateClaims(true),
143143
_evaluateTargetState(false),
144-
_waitingForEvent(0)
144+
_waitingForEvent(0),
145+
_vehicleValid(0),
146+
_vehicleUpdated(0),
147+
_vehicleLastUpdated(0),
148+
_vehicleStateOfCharge(0),
149+
_vehicleRange(0),
150+
_vehicleEta(0)
145151
{
146152
}
147153

@@ -536,6 +542,33 @@ uint32_t EvseManager::getTimeLimit(EvseClient client)
536542
return getClaimProperties(client).getTimeLimit();
537543
}
538544

545+
void EvseManager::setVehicleStateOfCharge(int vehicleStateOfCharge)
546+
{
547+
_vehicleStateOfCharge = vehicleStateOfCharge;
548+
_vehicleValid |= EVSE_VEHICLE_SOC;
549+
_vehicleUpdated |= EVSE_VEHICLE_SOC;
550+
_vehicleLastUpdated = millis();
551+
MicroTask.wakeTask(this);
552+
}
553+
554+
void EvseManager::setVehicleRange(int vehicleRange)
555+
{
556+
_vehicleRange = vehicleRange;
557+
_vehicleValid |= EVSE_VEHICLE_RANGE;
558+
_vehicleUpdated |= EVSE_VEHICLE_RANGE;
559+
_vehicleLastUpdated = millis();
560+
MicroTask.wakeTask(this);
561+
}
562+
563+
void EvseManager::setVehicleEta(int vehicleEta)
564+
{
565+
_vehicleEta = vehicleEta;
566+
_vehicleValid |= EVSE_VEHICLE_ETA;
567+
_vehicleUpdated |= EVSE_VEHICLE_ETA;
568+
_vehicleLastUpdated = millis();
569+
MicroTask.wakeTask(this);
570+
}
571+
539572
bool EvseManager::isRapiCommandBlocked(String rapi)
540573
{
541574
return rapi.startsWith("$ST");

src/evse_man.h

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ typedef uint32_t EvseClient;
4646
#define EvseManager_Priority_Limit 1100
4747
#define EvseManager_Priority_Error 10000
4848

49+
#define EVSE_VEHICLE_SOC (1 << 0)
50+
#define EVSE_VEHICLE_RANGE (1 << 1)
51+
#define EVSE_VEHICLE_ETA (1 << 2)
52+
4953
#ifndef EVSE_MANAGER_MAX_CLIENT_CLAIMS
5054
#define EVSE_MANAGER_MAX_CLIENT_CLAIMS 10
5155
#endif // !EVSE_MANAGER_MAX_CLIENT_CLAIMS
@@ -276,6 +280,13 @@ class EvseManager : public MicroTasks::Task
276280
bool _evaluateTargetState;
277281
int _waitingForEvent;
278282

283+
uint32_t _vehicleValid;
284+
uint32_t _vehicleUpdated;
285+
uint32_t _vehicleLastUpdated;
286+
int _vehicleStateOfCharge;
287+
int _vehicleRange;
288+
int _vehicleEta;
289+
279290
void initialiseEvse();
280291
bool findClaim(EvseClient client, Claim **claim = NULL);
281292
bool evaluateClaims(EvseProperties &properties);
@@ -343,6 +354,9 @@ class EvseManager : public MicroTasks::Task
343354
double getVoltage() {
344355
return _monitor.getVoltage();
345356
}
357+
void setVoltage(double volts) {
358+
_monitor.setVoltage(volts);
359+
}
346360
uint32_t getSessionElapsed() {
347361
return _monitor.getSessionElapsed();
348362
}
@@ -407,6 +421,32 @@ class EvseManager : public MicroTasks::Task
407421
return _monitor.getMinCurrent();
408422
}
409423

424+
// Get/set the vehicle state
425+
int getVehicleStateOfCharge() {
426+
return _vehicleStateOfCharge;
427+
}
428+
int getVehicleRange() {
429+
return _vehicleRange;
430+
}
431+
int getVehicleEta() {
432+
return _vehicleEta;
433+
}
434+
uint32_t getVehicleLastUpdated() {
435+
return _vehicleLastUpdated;
436+
}
437+
int isVehicleStateOfChargeValid() {
438+
return 0 != (_vehicleValid & EVSE_VEHICLE_SOC);
439+
}
440+
int isVehicleRangeValid() {
441+
return 0 != (_vehicleValid & EVSE_VEHICLE_RANGE);
442+
}
443+
int isVehicleEtaValid() {
444+
return 0 != (_vehicleValid & EVSE_VEHICLE_ETA);
445+
}
446+
void setVehicleStateOfCharge(int vehicleStateOfCharge);
447+
void setVehicleRange(int vehicleRange);
448+
void setVehicleEta(int vehicleEta);
449+
410450
// Temp until everything uses EvseManager
411451
RapiSender &getSender() {
412452
return _sender;

src/evse_monitor.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,17 @@ void EvseMonitor::setPilot(long amps)
397397
});
398398
}
399399

400+
void EvseMonitor::setVoltage(double volts)
401+
{
402+
_openevse.setVoltage(volts, [this, volts](int ret)
403+
{
404+
if(RAPI_RESPONSE_OK == ret || RAPI_RESPONSE_NK == ret) {
405+
_voltage = volts;
406+
}
407+
});
408+
}
409+
410+
400411
void EvseMonitor::getStatusFromEvse()
401412
{
402413
DBUGLN("Get EVSE status");

src/evse_monitor.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,8 @@ class EvseMonitor : public MicroTasks::Task
186186

187187
void setPilot(long amps);
188188

189+
void setVoltage(double volts);
190+
189191
uint8_t getEvseState() {
190192
return _state.getEvseState();
191193
}

src/input.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,10 @@ class InputTask : public MicroTasks::Task
5656
DynamicJsonDocument data(4096);
5757

5858
create_rapi_json(data); // create JSON Strings for EmonCMS and MQTT
59-
emoncms_publish(data);
60-
61-
teslaClient.getChargeInfoJson(data);
6259
event_send(data);
60+
// Already evented to MQTT etc
61+
teslaClient.getChargeInfoJson(data);
62+
emoncms_publish(data);
6363
}
6464
}
6565

@@ -126,6 +126,8 @@ void create_rapi_json(JsonDocument &doc)
126126
doc["freeram"] = ESPAL.getFreeHeap();
127127
doc["divertmode"] = divertmode;
128128
doc["srssi"] = WiFi.RSSI();
129+
130+
//teslaClient.getChargeInfoJson(doc);
129131
}
130132

131133
void

0 commit comments

Comments
 (0)