From 7d1d2985e865c345e418e0071b401afd894474c7 Mon Sep 17 00:00:00 2001 From: BayCom GmbH Date: Mon, 24 May 2021 15:22:28 +0200 Subject: [PATCH 01/41] add plain ESP32 Devkit v1 build Target --- platformio.ini | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 54d105c..ba44f8f 100644 --- a/platformio.ini +++ b/platformio.ini @@ -8,6 +8,36 @@ ; Please visit documentation for the other options and examples ; https://docs.platformio.org/page/projectconf.html +[env:esp32doit-devkit-v1] +platform = espressif32 +board = esp32doit-devkit-v1 +framework = arduino +upload_speed = 921600 +monitor_speed = 115200 +build_flags = -DESP32_DEVKIT ;-DRFID -DOLED +board_build.partitions = huge_app.csv +board_build.embed_txtfiles = + websrc/favicon.ico + websrc/glyph.woff + websrc/glyph.woff2 + websrc/index.htm + websrc/required.css + websrc/required.js + websrc/script.js + websrc/status_charging.svg + websrc/status_detected.svg + websrc/status_ready.svg + +lib_ignore = + ESPAsyncUDP + EspSoftwareSerial +lib_deps = + miguelbalboa/MFRC522 + bblanchon/ArduinoJson + emelianov/modbus-esp8266 + olikraus/U8g2 + 4-20ma/ModbusMaster + [env:base_1_045] platform = espressif32 board = base_1_045 @@ -18,6 +48,7 @@ lib_ignore = EspSoftwareSerial board_build.partitions = default_8MB.csv board_build.f_cpu = 160000000L +build_flags = -DOLED -DRFID lib_deps = miguelbalboa/MFRC522 bblanchon/ArduinoJson @@ -28,7 +59,7 @@ platform = espressif8266 board = d1_mini framework = arduino upload_speed = 921600 -build_flags = -D PIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY -Wl,-Map,output.map +build_flags = -D PIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY -Wl,-Map,output.map -DRFID lib_ignore = U8g2 lib_deps = miguelbalboa/MFRC522 From 5966b50a8aff863ea2248308942ccb36983ef65d Mon Sep 17 00:00:00 2001 From: BayCom GmbH Date: Mon, 24 May 2021 15:23:43 +0200 Subject: [PATCH 02/41] add plain ESP32 Devkit v1 build Target, add phase switching, add API calls --- .vscode/extensions.json | 14 +-- include/config.h | 6 + include/config_template.json | 3 +- pins.txt | 16 +++ src/config.cpp | 42 ++++++- src/main.cpp | 212 +++++++++++++++++++++++++++++++---- src/oled.cpp | 2 + src/rfid.cpp | 15 ++- websrc/index.htm | 10 ++ websrc/script.js | 17 ++- 10 files changed, 299 insertions(+), 38 deletions(-) create mode 100644 pins.txt diff --git a/.vscode/extensions.json b/.vscode/extensions.json index e80666b..0f0d740 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,7 +1,7 @@ -{ - // See http://go.microsoft.com/fwlink/?LinkId=827846 - // for the documentation about the extensions.json format - "recommendations": [ - "platformio.platformio-ide" - ] -} +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": [ + "platformio.platformio-ide" + ] +} diff --git a/include/config.h b/include/config.h index f134cac..242a652 100644 --- a/include/config.h +++ b/include/config.h @@ -79,6 +79,7 @@ struct s_evseConfig { bool reg2000; unsigned long updateInterval; uint8_t currentAfterBoot; // Not in config.json - just for runtime + uint8_t numPhases; }; class EvseWiFiConfig { @@ -113,6 +114,7 @@ class EvseWiFiConfig { uint16_t ICACHE_RAM_ATTR getMeterImpLen(uint8_t meterId); uint8_t ICACHE_FLASH_ATTR getMeterPhaseCount(uint8_t meterId); uint8_t ICACHE_FLASH_ATTR getMeterFactor(uint8_t meterId); + bool ICACHE_FLASH_ATTR setMeterFactor(uint8_t meterId, uint8_t factor); bool useSMeter; bool useMMeter; bool mMeterTypeSDM120; @@ -169,6 +171,10 @@ class EvseWiFiConfig { uint16_t ICACHE_FLASH_ATTR getEvseCurrentAfterBoot(uint8_t evseId); bool ICACHE_FLASH_ATTR setEvseCurrentAfterBoot(uint8_t evseId, uint16_t current); + uint8_t ICACHE_FLASH_ATTR getEvseNumPhasesPin(uint8_t evseId); + bool ICACHE_FLASH_ATTR setEvseNumPhases(uint8_t evseId, uint8_t numphases); + uint8_t ICACHE_FLASH_ATTR getEvseNumPhases(uint8_t evseId); + private: s_wifiConfig wifiConfig; s_meterConfig meterConfig[1]; diff --git a/include/config_template.json b/include/config_template.json index 9bd3f4a..bf29346 100644 --- a/include/config_template.json +++ b/include/config_template.json @@ -57,7 +57,8 @@ "evseinstall": 16, "avgconsumption": 15, "rseactive": false, - "rsevalue": 80 + "rsevalue": 80, + "numPhases": 3 } ] } diff --git a/pins.txt b/pins.txt new file mode 100644 index 0000000..ac1e44c --- /dev/null +++ b/pins.txt @@ -0,0 +1,16 @@ +PIN ES8266 ESP32 base_1_045 DEVKIT +LedPin D0 26 2 +RX2 D1 22 22 +TX2 D2 21 21 +meterintpin D3 17 17 +buttonPin D4 16 16 +SCK D5 18 18 +MISO D6 19 19 +MOSI D7 23 23 +getRfidPin/CS D8 5 5 +CpIntPin -- 4 4 +RsePin -- 2 34 +OLED_CS -- 12 12 +OLED_DC -- 13 13 +OLED_RESET -- 33 33 +numPhasesPin -- 32 32 diff --git a/src/config.cpp b/src/config.cpp index 52ae3cc..bced7b4 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -193,6 +193,13 @@ bool ICACHE_FLASH_ATTR EvseWiFiConfig::loadConfig(String givenConfig) { } // End Testing RS485 + if (jsonDoc["evse"][0].containsKey("numPhases")) { + evseConfig[0].numPhases = jsonDoc["evse"][0]["numPhases"]; + } + else { + evseConfig[0].numPhases = 0; + } + Serial.println("EVSE loaded"); Serial.println("loadConfig.. Check!"); configLoaded = true; @@ -305,6 +312,7 @@ bool ICACHE_FLASH_ATTR EvseWiFiConfig::printConfig() { Serial.println("reg1000: " + String(getEvseReg1000(0))); Serial.println("reg2000: " + String(getEvseReg2000(0))); Serial.println("updateInterval: " + String(getEvseUpdateInterval(0))); + Serial.println("numPhases: " + String(getEvseNumPhases(0))); Serial.println("--- End of Config..."); return true; } @@ -403,6 +411,7 @@ String ICACHE_FLASH_ATTR EvseWiFiConfig::getConfigJson() { evseObject_0["reg1000"] = this->getEvseReg1000(0); evseObject_0["reg2000"] = this->getEvseReg2000(0); evseObject_0["updateInterval"] = this->getEvseUpdateInterval(0); + evseObject_0["numPhases"] = this->getEvseNumPhases(0); String sReturn; serializeJsonPretty(rootDoc, sReturn); @@ -587,6 +596,8 @@ uint8_t ICACHE_FLASH_ATTR EvseWiFiConfig::getMeterPin(uint8_t meterId) { if (meterConfig[meterId].intpin) return meterConfig[meterId].intpin; #ifdef ESP8266 return D3; + #elif ESP32_DEVKIT + return 17; #else return 17; #endif @@ -607,6 +618,10 @@ uint8_t ICACHE_FLASH_ATTR EvseWiFiConfig::getMeterFactor(uint8_t meterId) { if (meterConfig[meterId].factor) return meterConfig[meterId].factor; return 1; } +bool ICACHE_FLASH_ATTR EvseWiFiConfig::setMeterFactor(uint8_t meterId, uint8_t factor) { + meterConfig[meterId].factor = factor; + return true; +} // rfidConfig getter/setter bool ICACHE_FLASH_ATTR EvseWiFiConfig::getRfidActive(){ @@ -650,6 +665,8 @@ uint8_t ICACHE_FLASH_ATTR EvseWiFiConfig::getButtonPin(uint8_t buttonId) { if (buttonConfig[0].buttonpin) return buttonConfig[buttonId].buttonpin; #ifdef ESP8266 return D4; + #elif ESP32_DEVKIT + return 16; #else return 16; #endif @@ -711,6 +728,8 @@ uint8_t ICACHE_FLASH_ATTR EvseWiFiConfig::getEvseDisplayRotation(uint8_t evseId) uint8_t ICACHE_FLASH_ATTR EvseWiFiConfig::getEvseLedPin(uint8_t evseId) { #ifdef ESP8266 return D0; + #elif ESP32_DEVKIT + return 2; #else return 26; #endif @@ -732,7 +751,11 @@ bool ICACHE_FLASH_ATTR EvseWiFiConfig::getEvseRseActive(uint8_t evseId) { return evseConfig[evseId].rseActive; } uint8_t ICACHE_FLASH_ATTR EvseWiFiConfig::getEvseRsePin(uint8_t evseId) { - return 2; + #ifdef ESP32_DEVKIT + return 34; + #else + return 2; + #endif } uint8_t ICACHE_FLASH_ATTR EvseWiFiConfig::getEvseRseValue(uint8_t evseId) { return evseConfig[evseId].rseValue; @@ -757,4 +780,19 @@ uint16_t ICACHE_FLASH_ATTR EvseWiFiConfig::getEvseCurrentAfterBoot(uint8_t evseI bool ICACHE_FLASH_ATTR EvseWiFiConfig::setEvseCurrentAfterBoot(uint8_t evseId, uint16_t current) { evseConfig[evseId].currentAfterBoot = current; return true; -} \ No newline at end of file +} + +// number of phases to switch through +uint8_t ICACHE_FLASH_ATTR EvseWiFiConfig::getEvseNumPhasesPin(uint8_t evseId) { + return 32; +} + +bool ICACHE_FLASH_ATTR EvseWiFiConfig::setEvseNumPhases(uint8_t evseId, uint8_t numPhases) { + evseConfig[evseId].numPhases = numPhases; + return true; +} + +uint8_t ICACHE_FLASH_ATTR EvseWiFiConfig::getEvseNumPhases(uint8_t evseId) { + if (evseConfig[evseId].numPhases) return evseConfig[evseId].numPhases; + return 0; +} diff --git a/src/main.cpp b/src/main.cpp index 36ff470..314a2dc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -48,14 +48,19 @@ #include #include "proto.h" #include "ntp.h" -#include "websrc.h" +#ifdef ESP32_DEVKIT + #include "websrcembed.h" +#else + #include "websrc.h" +#endif #include "config.h" #include "templates.h" #include "rfid.h" + uint8_t sw_min = 2; //Firmware Minor Version uint8_t sw_rev = 2; //Firmware Revision -String sw_add = "-beta2"; +String sw_add = "-deti"; #ifdef ESP8266 uint8_t sw_maj = 1; //Firmware Major Version @@ -100,6 +105,10 @@ unsigned long millisInterruptCp = 0; bool rseActive = false; uint8_t currentBeforeRse = 0; #endif +#ifdef ESP32_DEVKIT +SemaphoreHandle_t CPMutex; +uint8_t numPhasesState = 0; +#endif //RFID bool showLedRfidDecline = false; @@ -139,11 +148,13 @@ float voltageP3 = 0.0; SoftwareSerial SecondSer(D1, D2); //SoftwareSerial object (RX, TX) #else HardwareSerial SecondSer(2); +#ifdef OLED //oLED unsigned long millisUpdateOled = 0; U8G2_SSD1327_WS_128X128_F_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 12, /* dc=*/ 13, /* reset=*/ 33); EvseWiFiOled oled; #endif +#endif unsigned long millisOnTimeOled = 0; @@ -343,14 +354,13 @@ void ICACHE_FLASH_ATTR timerDeactivateMatch() { } } - +#ifdef OLED void ICACHE_FLASH_ATTR turnOnOled(uint32_t ontimesecs = 120) { - #ifdef ESP32 millisOnTimeOled = millis() + ontimesecs * 1000; oled.turnOn(); if (config.getSystemDebug()) Serial.println("[ oLED ] Display turned on"); - #endif } +#endif #ifndef ESP8266 void ICACHE_FLASH_ATTR handleRse() { @@ -505,9 +515,15 @@ bool ICACHE_FLASH_ATTR setSmartWb11kWSettings() { } Serial.println("[ Auto-Config ] Going to interrupt CP for 500ms"); + #ifdef ESP32_DEVKIT + xSemaphoreTake(CPMutex, portMAX_DELAY); + #endif digitalWrite(config.getEvseCpIntPin(0), HIGH); delay(500); digitalWrite(config.getEvseCpIntPin(0), LOW); + #ifdef ESP32_DEVKIT + xSemaphoreGive(CPMutex); + #endif Serial.println("[ Auto-Config ] CP interrupt ended - going to Reboot now..."); toReboot = true; @@ -680,7 +696,7 @@ bool ICACHE_FLASH_ATTR reconnectWiFi() { if (config.getSystemDebug())Serial.print(config.getWifiSsid()); return true; } - +#ifdef RFID ////////////////////////////////////////////////////////////////////////////////////////// /////// RFID Functions ////////////////////////////////////////////////////////////////////////////////////////// @@ -714,7 +730,7 @@ void ICACHE_FLASH_ATTR rfidloop() { jsonDoc["uid"] = scan.uid; jsonDoc["type"] = scan.type; - #ifdef ESP32 + #ifdef OLED if (config.getEvseAlwaysActive(0) || timerActive) { // In AA/Remote just turnOnOled and leave turnOnOled(); return; @@ -746,14 +762,14 @@ void ICACHE_FLASH_ATTR rfidloop() { else { toActivateEVSE = true; } - #ifndef ESP8266 + #ifdef OLED millisUpdateOled = millis() + 3000; oled.showCheck(true, 0); #endif showLedRfidGrant = true; } else { - #ifndef ESP8266 + #ifdef OLED millisUpdateOled = millis() + 3000; oled.showCheck(false, 0); #endif @@ -770,6 +786,7 @@ void ICACHE_FLASH_ATTR rfidloop() { } } } +#endif void ICACHE_FLASH_ATTR sendStatus() { fsWorking = true; @@ -1347,9 +1364,11 @@ bool ICACHE_FLASH_ATTR queryEVSE(bool startup = false) { if (evseVehicleState == 2 || evseVehicleState == 3 || evseVehicleState == 4) { + #ifdef OLED if (evseStatus != 2){ turnOnOled(); } + #endif evseStatus = 2; //vehicle detected if (config.getEvseLedConfig(0) == 3) changeLedTimes(300, 2000); } @@ -1357,7 +1376,9 @@ bool ICACHE_FLASH_ATTR queryEVSE(bool startup = false) { evseStatus = 1; // EVSE deactivated } if (vehicleCharging == true && manualStop == false) { //vehicle interrupted charging + #ifdef OLED turnOnOled(); + #endif stopChargingTimestamp = ntp.getUtcTimeNow(); vehicleCharging = false; if (config.getSystemDebug()) Serial.println("[ SYSTEM ] Vehicle interrupted charging"); @@ -1369,13 +1390,17 @@ bool ICACHE_FLASH_ATTR queryEVSE(bool startup = false) { if (evseVehicleState == 1) { if (evseStatus != 1){ + #ifdef OLED turnOnOled(); + #endif } evseStatus = 1; // ready } else if (evseVehicleState == 2) { if (evseStatus != 2){ + #ifdef OLED turnOnOled(); + #endif } evseStatus = 2; //vehicle detected if (config.getEvseLedConfig(0) == 3) changeLedTimes(300, 2000); @@ -1405,7 +1430,9 @@ bool ICACHE_FLASH_ATTR queryEVSE(bool startup = false) { if (config.getSystemDebug()) Serial.println("[ SYSTEM ] Vehicle interrupted charging"); } if (evseStatus != 1) { + #ifdef OLED turnOnOled(); + #endif } evseStatus = 1; // ready evseActive = true; @@ -1420,9 +1447,11 @@ bool ICACHE_FLASH_ATTR queryEVSE(bool startup = false) { lastUsername = "vehicle"; if (config.getSystemDebug()) Serial.println("[ SYSTEM ] Vehicle interrupted charging"); } + #ifdef OLED if (evseStatus != 2){ turnOnOled(); } + #endif evseStatus = 2; //vehicle detected evseActive = true; if (config.getEvseLedConfig(0) == 3) changeLedTimes(300, 2000); @@ -1432,7 +1461,9 @@ bool ICACHE_FLASH_ATTR queryEVSE(bool startup = false) { if (!startup) { toActivateEVSE = true; } + #ifdef OLED turnOnOled(); + #endif startChargingTimestamp = ntp.getUtcTimeNow(); meteredKWh = 0.0; vehicleCharging = true; @@ -1449,9 +1480,11 @@ bool ICACHE_FLASH_ATTR queryEVSE(bool startup = false) { if (evseVehicleState == 2 || evseVehicleState == 3 || evseVehicleState == 4) { + #ifdef OLED if (evseStatus != 2){ turnOnOled(); } + #endif evseStatus = 2; //vehicle detected if (config.getEvseLedConfig(0) == 3) changeLedTimes(300, 2000); if (vehicleCharging && evseAmpsConfig == 0) { //Current Set to 0 - deactivate @@ -1465,9 +1498,11 @@ bool ICACHE_FLASH_ATTR queryEVSE(bool startup = false) { } } else { + #ifdef OLED if (evseStatus != 1){ turnOnOled(); } + #endif evseStatus = 1; // EVSE deactivated } if (vehicleCharging == true && manualStop == false) { //vehicle interrupted charging @@ -1562,7 +1597,9 @@ bool ICACHE_FLASH_ATTR getAdditionalEVSEData() { bool ICACHE_FLASH_ATTR activateEVSE() { if (!config.getEvseAlwaysActive(0) && !timerActive) { //Normal Mode static uint16_t iTransmit; + #ifdef OLED turnOnOled(); + #endif if (config.useMMeter) { if (millisUpdateMMeter - millis() < 50) { delay(50); @@ -1613,17 +1650,21 @@ bool ICACHE_FLASH_ATTR activateEVSE() { vehicleCharging = true; meteredKWh = 0.0; - #ifndef ESP8266 + #ifdef OLED millisUpdateOled = millis() + 3000; //oled.showCheck(false); #endif + #ifdef RFID showLedRfidGrant = true; + #endif sendEVSEdata(); return true; } bool ICACHE_FLASH_ATTR deactivateEVSE(bool logUpdate) { + #ifdef OLED turnOnOled(); + #endif if (!config.getEvseAlwaysActive(0) && !timerActive) { //Normal Mode //New ModBus Master Library static uint16_t iTransmit = reg2005DefaultValues + 16384; // deactivate evse @@ -1697,10 +1738,14 @@ bool ICACHE_FLASH_ATTR setEVSEcurrent() { // telegram 1: write EVSE current if (config.getEvseRemote(0)) { toSetEVSEcurrent = false; if (currentToSet == evseAmpsConfig) return true; // no oLED action + #ifdef OLED turnOnOled(5); + #endif } else { + #ifdef OLED turnOnOled(); + #endif toSetEVSEcurrent = false; if (currentToSet == evseAmpsConfig) return true; // oLED action but register is already set } @@ -1814,6 +1859,9 @@ void ICACHE_FLASH_ATTR sendEVSEdata() { } jsonDoc["ap_mode"] = inAPMode; jsonDoc["evse_disabled_by_remote_hearbeat"] = deactivatedByRemoteHeartbeat; +#ifdef ESP32_DEVKIT + jsonDoc["evse_num_phases"] = String(numPhasesState); +#endif size_t len = measureJson(jsonDoc); AsyncWebSocketMessageBuffer * buffer = ws.makeBuffer(len); if (buffer) { @@ -1903,6 +1951,9 @@ void ICACHE_FLASH_ATTR sendUserList(int page, AsyncWebSocketClient * client) { #ifndef ESP8266 bool ICACHE_FLASH_ATTR interruptCp() { + #ifdef ESP32_DEVKIT + xSemaphoreTake(CPMutex, portMAX_DELAY); + #endif digitalWrite(config.getEvseCpIntPin(0), HIGH); millisInterruptCp = millis() + 3000; doCpInterruptCp = true; @@ -1911,6 +1962,34 @@ bool ICACHE_FLASH_ATTR interruptCp() { } #endif +#ifdef ESP32_DEVKIT +bool ICACHE_FLASH_ATTR switchNumPhases(uint8_t numPhases) { + // only allow to change mode if previous and current mode is not zero + if(numPhasesState && numPhases && (numPhasesState != numPhases)) + { + if (config.getSystemDebug()) Serial.printf("[ switchNumPhases ] switch to: %d phases ...\r\n", numPhases); + xSemaphoreTake(CPMutex, portMAX_DELAY); + digitalWrite(config.getEvseCpIntPin(0), HIGH); + delay(1500); + if(numPhases == 3) { + config.setEvseNumPhases(0, numPhases); + digitalWrite(config.getEvseNumPhasesPin(0), HIGH); + } else if(numPhases == 1) { + config.setEvseNumPhases(0, numPhases); + digitalWrite(config.getEvseNumPhasesPin(0), LOW); + } + numPhasesState = numPhases; + delay(1500); + digitalWrite(config.getEvseCpIntPin(0), LOW); + xSemaphoreGive(CPMutex); + if (config.getSystemDebug()) Serial.printf("[ switchNumPhases ] switch phases done\r\n"); + return true; + } + return false; +} + +#endif + void ICACHE_FLASH_ATTR onWsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len) { if (type == WS_EVT_ERROR) { if (config.getSystemDebug()) Serial.printf("[ WARN ] WebSocket[%s][%u] error(%u): %s\r\n", server->url(), client->id(), *((uint16_t*)arg), (char*)data); @@ -2431,7 +2510,7 @@ bool ICACHE_FLASH_ATTR startAP(const char * ssid, const char * password = NULL) bool ICACHE_FLASH_ATTR loadConfiguration(String configString = "") { Serial.println("[ SYSTEM ] Loading Config File on Startup..."); - #ifdef ESP32 + #ifdef OLED oled.showSplash("Config File..."); #endif if (configString == "") { @@ -2464,7 +2543,7 @@ bool ICACHE_FLASH_ATTR loadConfiguration(String configString = "") { server.addHandler(new SPIFFSEditor(SPIFFS, "admin", config.getSystemPass())); #endif - #ifdef ESP32 + #ifdef OLED oled.showSplash("EVSE Controller..."); #endif @@ -2472,6 +2551,7 @@ bool ICACHE_FLASH_ATTR loadConfiguration(String configString = "") { while (evseErrorCount != 0) { if(config.getSystemDebug()) Serial.println("[ Modbus ] Error getting EVSE data!"); delay(500); + queryEVSE(true); if (evseErrorCount > 2) { break; @@ -2511,7 +2591,7 @@ bool ICACHE_FLASH_ATTR loadConfiguration(String configString = "") { rfid.begin(config.getRfidPin(), config.getRfidUsePN532(), config.getRfidGain(), &ntp, config.getSystemDebug()); } - #ifdef ESP32 + #ifdef OLED oled.showSplash("Connecting WiFi..."); #endif if (config.getWifiWmode() == 1) { @@ -2619,62 +2699,102 @@ bool ICACHE_FLASH_ATTR loadConfiguration(String configString = "") { void ICACHE_FLASH_ATTR setWebEvents() { server.on("/index.htm", HTTP_GET, [](AsyncWebServerRequest * request) { +#ifdef ESP32_DEVKIT + AsyncWebServerResponse * response = request->beginResponse_P(200, "text/html", websrc_index_htm_start, websrc_index_htm_end-websrc_index_htm_start-1); +#else AsyncWebServerResponse * response = request->beginResponse_P(200, "text/html", WEBSRC_INDEX_HTM, WEBSRC_INDEX_HTM_LEN); response->addHeader("Content-Encoding", "gzip"); +#endif request->send(response); }); server.on("/script.js", HTTP_GET, [](AsyncWebServerRequest * request) { +#ifdef ESP32_DEVKIT + AsyncWebServerResponse * response = request->beginResponse_P(200, "text/javascript", websrc_script_js_start, websrc_script_js_end-websrc_script_js_start-1); +#else AsyncWebServerResponse * response = request->beginResponse_P(200, "text/javascript", WEBSRC_SCRIPT_JS, WEBSRC_SCRIPT_JS_LEN); response->addHeader("Content-Encoding", "gzip"); +#endif request->send(response); }); server.on("/fonts/glyph.woff", HTTP_GET, [](AsyncWebServerRequest * request) { +#ifdef ESP32_DEVKIT + AsyncWebServerResponse * response = request->beginResponse_P(200, "font/woff", websrc_glyph_woff_start, websrc_glyph_woff_end-websrc_glyph_woff_start-1); +#else AsyncWebServerResponse * response = request->beginResponse_P(200, "font/woff", WEBSRC_GLYPH_WOFF, WEBSRC_GLYPH_WOFF_LEN); response->addHeader("Content-Encoding", "gzip"); +#endif request->send(response); }); server.on("/fonts/glyph.woff2", HTTP_GET, [](AsyncWebServerRequest * request) { +#ifdef ESP32_DEVKIT + AsyncWebServerResponse * response = request->beginResponse_P(200, "font/woff", websrc_glyph_woff2_start, websrc_glyph_woff2_end-websrc_glyph_woff2_start-1); +#else AsyncWebServerResponse * response = request->beginResponse_P(200, "font/woff", WEBSRC_GLYPH_WOFF2, WEBSRC_GLYPH_WOFF2_LEN); response->addHeader("Content-Encoding", "gzip"); +#endif request->send(response); }); server.on("/required/required.css", HTTP_GET, [](AsyncWebServerRequest * request) { +#ifdef ESP32_DEVKIT + AsyncWebServerResponse * response = request->beginResponse_P(200, "text/css", websrc_required_css_start, websrc_required_css_end-websrc_required_css_start-1); +#else AsyncWebServerResponse * response = request->beginResponse_P(200, "text/css", WEBSRC_REQUIRED_CSS, WEBSRC_REQUIRED_CSS_LEN); response->addHeader("Content-Encoding", "gzip"); +#endif request->send(response); }); server.on("/required/required.js", HTTP_GET, [](AsyncWebServerRequest * request) { +#ifdef ESP32_DEVKIT + AsyncWebServerResponse * response = request->beginResponse_P(200, "text/javascript", websrc_required_js_start, websrc_required_js_end-websrc_required_js_start-1); +#else AsyncWebServerResponse * response = request->beginResponse_P(200, "text/javascript", WEBSRC_REQUIRED_JS, WEBSRC_REQUIRED_JS_LEN); response->addHeader("Content-Encoding", "gzip"); +#endif request->send(response); }); server.on("/status_charging.svg", HTTP_GET, [](AsyncWebServerRequest * request) { +#ifdef ESP32_DEVKIT + AsyncWebServerResponse * response = request->beginResponse_P(200, "image/svg+xml", websrc_status_charging_svg_start, websrc_status_charging_svg_end-websrc_status_charging_svg_start-1); +#else AsyncWebServerResponse * response = request->beginResponse_P(200, "image/svg+xml", WEBSRC_STATUS_CHARGING_SVG, WEBSRC_STATUS_CHARGING_SVG_LEN); response->addHeader("Content-Encoding", "gzip"); +#endif request->send(response); }); server.on("/status_detected.svg", HTTP_GET, [](AsyncWebServerRequest * request) { +#ifdef ESP32_DEVKIT + AsyncWebServerResponse * response = request->beginResponse_P(200, "image/svg+xml", websrc_status_detected_svg_start, websrc_status_detected_svg_end-websrc_status_detected_svg_start-1); +#else AsyncWebServerResponse * response = request->beginResponse_P(200, "image/svg+xml", WEBSRC_STATUS_DETECTED_SVG, WEBSRC_STATUS_DETECTED_SVG_LEN); response->addHeader("Content-Encoding", "gzip"); +#endif request->send(response); }); server.on("/status_ready.svg", HTTP_GET, [](AsyncWebServerRequest * request) { +#ifdef ESP32_DEVKIT + AsyncWebServerResponse * response = request->beginResponse_P(200, "image/svg+xml", websrc_status_ready_svg_start, websrc_status_ready_svg_end-websrc_status_ready_svg_start-1); +#else AsyncWebServerResponse * response = request->beginResponse_P(200, "image/svg+xml", WEBSRC_STATUS_READY_SVG, WEBSRC_STATUS_READY_SVG_LEN); response->addHeader("Content-Encoding", "gzip"); +#endif request->send(response); }); server.on("/favicon.ico", HTTP_GET, [](AsyncWebServerRequest * request) { +#ifdef ESP32_DEVKIT + AsyncWebServerResponse * response = request->beginResponse_P(200, "image/x-icon", websrc_favicon_ico_start, websrc_favicon_ico_end-websrc_favicon_ico_start-1); +#else AsyncWebServerResponse * response = request->beginResponse_P(200, "image/x-icon", WEBSRC_FAVICON_ICO, WEBSRC_FAVICON_ICO_LEN); response->addHeader("Content-Encoding", "gzip"); +#endif request->send(response); }); @@ -2975,6 +3095,30 @@ void ICACHE_FLASH_ATTR setWebEvents() { request->send(200, "text/plain", "E2_could not set registers and config - wrong parameter"); } }); +#ifdef ESP32_DEVKIT + server.on("/setNumPhases", HTTP_GET, [](AsyncWebServerRequest * request) { + awp = request->getParam(0); + if (awp->name() == "numPhases") { + uint8_t numPhases = atoi(awp->value().c_str()); + if((numPhases == 1) || (numPhases == 3)) { + switchNumPhases(numPhases); + request->send(200, "text/plain", "Number of phases set to given value"); + } + } + request->send(200, "text/plain", "Number of phases could not be processed - wrong parameter"); + }); + server.on("/setMeteringFactor", HTTP_GET, [](AsyncWebServerRequest * request) { + awp = request->getParam(0); + if (awp->name() == "meteringFactor") { + uint8_t meteringFactor = atoi(awp->value().c_str()); + if(meteringFactor > 0) { + config.setMeterFactor(0, meteringFactor); + request->send(200, "text/plain", "Metering factor set to given value"); + } + } + request->send(200, "text/plain", "Metering factor could not be processed - wrong parameter"); + }); +#endif } } @@ -3059,7 +3203,11 @@ void ICACHE_FLASH_ATTR startWebserver() { /////// Setup ////////////////////////////////////////////////////////////////////////////////////////// void ICACHE_RAM_ATTR setup() { + #ifdef ESP32_DEVKIT + Serial.begin(115200); + #else Serial.begin(9600); + #endif if (config.getSystemDebug()) Serial.println(); if (config.getSystemDebug()) Serial.print("[ INFO ] EVSE-WiFi - version "); if (config.getSystemDebug()) Serial.print(swVersion); @@ -3077,7 +3225,7 @@ void ICACHE_RAM_ATTR setup() { evseNode.begin(1, SecondSer); - #ifdef ESP32 + #ifdef OLED oled.begin(&u8g2, config.getEvseDisplayRotation(0)); Serial.println("[ SYSTEM ] OLED started"); turnOnOled(120); @@ -3085,7 +3233,7 @@ void ICACHE_RAM_ATTR setup() { #endif if (!loadConfiguration()) { - #ifdef ESP32 + #ifdef OLED oled.showSplash("WARNING!"); delay(500); oled.showSplash("Fallback Mode!"); @@ -3115,7 +3263,7 @@ void ICACHE_RAM_ATTR setup() { if (digitalRead(config.getButtonPin(0)) == LOW) { pinMode(config.getEvseLedPin(0), OUTPUT); if (config.getSystemDebug()) Serial.println("Button Pressed while boot!"); - #ifdef ESP32 + #ifdef OLED oled.showSplash("FactoryReset in 20s"); #endif digitalWrite(config.getEvseLedPin(0), HIGH); @@ -3124,7 +3272,7 @@ void ICACHE_RAM_ATTR setup() { while (digitalRead(button) == LOW) { if (millis() > (millisBefore + 20000)) { factoryReset(); - #ifdef ESP32 + #ifdef OLED oled.showSplash("Factory Reset done!"); #endif Serial.println("[ SYSTEM ] System has been reset to factory settings!"); @@ -3143,6 +3291,19 @@ void ICACHE_RAM_ATTR setup() { startTotal = getS0MeterReading(); } +#ifdef ESP32_DEVKIT + CPMutex = xSemaphoreCreateMutex(); + if (CPMutex == NULL) { + Serial.println("[ SYSTEM ] CPMutex can not be created"); + } + pinMode(config.getEvseNumPhasesPin(0), OUTPUT); + numPhasesState = config.getEvseNumPhases(0); + if(numPhasesState == 3) { + digitalWrite(config.getEvseNumPhasesPin(0), HIGH); + } else if(numPhasesState == 1) { + digitalWrite(config.getEvseNumPhasesPin(0), LOW); + } +#endif #ifndef ESP8266 pinMode(config.getEvseRsePin(0), INPUT_PULLUP); if (config.getSystemDebug()) Serial.print("[ SYSTEM ] Use RSE GPIO "); @@ -3151,7 +3312,7 @@ void ICACHE_RAM_ATTR setup() { delay(100); #endif now(); - #ifdef ESP32 + #ifdef OLED oled.showSplash("Starting webserver..."); #endif startWebserver(); @@ -3197,10 +3358,11 @@ void ICACHE_RAM_ATTR loop() { delay(100); ESP.restart(); } + #ifdef RFID if (currentMillis >= rfid.cooldown && config.getRfidActive() == true && !updateRunning) { rfidloop(); } - + #endif handleLed(); modbusTCPServerNode.task(); @@ -3262,7 +3424,7 @@ void ICACHE_RAM_ATTR loop() { if (digitalRead(config.getButtonPin(0)) == HIGH) { if (config.getSystemDebug()) Serial.println("Button released"); buttonState = HIGH; - #ifdef ESP32 + #ifdef OLED if (millisOnTimeOled < millis()) { // oLED is off turnOnOled(); } @@ -3277,11 +3439,11 @@ void ICACHE_RAM_ATTR loop() { } lastUsername = "Button"; lastUID = "Button"; - #ifdef ESP32 + #ifdef OLED oled.showCheck(true, 1); #endif } - #ifdef ESP32 + #ifdef OLED } #endif } @@ -3329,6 +3491,7 @@ void ICACHE_RAM_ATTR loop() { } #ifndef ESP8266 + #ifdef OLED oled.oledLoop(); if (millisUpdateOled < millis()) { delay(5); @@ -3340,12 +3503,15 @@ void ICACHE_RAM_ATTR loop() { oled.turnOff(); Serial.println("Display turned off"); ///DBG DBUG DEBUG } - + #endif if (doCpInterruptCp) { if (millis() > millisInterruptCp) { doCpInterruptCp = false; digitalWrite(config.getEvseCpIntPin(0), LOW); Serial.println("Interrupt CP stopped"); + #ifdef ESP32_DEVKIT + xSemaphoreGive(CPMutex); + #endif } } diff --git a/src/oled.cpp b/src/oled.cpp index c9307ed..2bd89f5 100644 --- a/src/oled.cpp +++ b/src/oled.cpp @@ -1,4 +1,5 @@ #ifndef ESP8266 +#ifdef OLED #include "oled.h" #include @@ -275,4 +276,5 @@ void EvseWiFiOled::showCheck(bool checked, uint8_t textID) { drawUncheck(); } } +#endif #endif \ No newline at end of file diff --git a/src/rfid.cpp b/src/rfid.cpp index ebd7c61..5b8c363 100644 --- a/src/rfid.cpp +++ b/src/rfid.cpp @@ -3,6 +3,7 @@ MFRC522 mfrc522 = MFRC522(); bool ICACHE_FLASH_ATTR EvseWiFiRfid::begin(int rfidss, bool usePN532, int rfidgain, NtpClient* ntp, bool debug) { +#ifdef RFID this->debug = debug; this->ntpClient = ntp; mfrc522.PCD_SetAntennaGain(rfidgain); @@ -13,10 +14,12 @@ bool ICACHE_FLASH_ATTR EvseWiFiRfid::begin(int rfidss, bool usePN532, int rfidga if (debug) Serial.println(""); delay(50); printReaderDetails(); +#endif return true; } void ICACHE_FLASH_ATTR EvseWiFiRfid::printReaderDetails() { +#ifdef RFID // Get the MFRC522 software version byte v = mfrc522.PCD_ReadRegister(mfrc522.VersionReg); if (this->debug) Serial.print(F("[ INFO ] MFRC522 Version: 0x")); @@ -38,10 +41,12 @@ void ICACHE_FLASH_ATTR EvseWiFiRfid::printReaderDetails() { if ((v == 0x00) || (v == 0xFF)) { if (this->debug) Serial.println(F("[ WARN ] Communication failure, check if MFRC522 properly connected")); } + #endif } scanResult ICACHE_FLASH_ATTR EvseWiFiRfid::readPicc() { scanResult res; + #ifdef RFID //RC522 if (! mfrc522.PICC_IsNewCardPresent()) { delay(50); @@ -119,7 +124,7 @@ scanResult ICACHE_FLASH_ATTR EvseWiFiRfid::readPicc() { } rfidFile.close(); //SPIFFS.end(); - +#endif return res; } @@ -186,10 +191,16 @@ DynamicJsonDocument ICACHE_FLASH_ATTR EvseWiFiRfid::getUserList(int page) { } bool ICACHE_FLASH_ATTR EvseWiFiRfid::performSelfTest() { + #ifdef RFID return mfrc522.PCD_PerformSelfTest(); + #else + return false; + #endif } bool ICACHE_FLASH_ATTR EvseWiFiRfid::reset() { + #ifdef RFID mfrc522.PCD_Init(); + #endif return true; -} \ No newline at end of file +} diff --git a/websrc/index.htm b/websrc/index.htm index 061915f..c2e9d1d 100644 --- a/websrc/index.htm +++ b/websrc/index.htm @@ -597,6 +597,16 @@
Type your Wi-Fi Network's SSID or Scan for nerby Wireless min="0" max="100"> +
+ +
+
+ +
+
+

diff --git a/websrc/script.js b/websrc/script.js index ee513bc..24a954a 100644 --- a/websrc/script.js +++ b/websrc/script.js @@ -77,12 +77,14 @@ function listEVSEData(obj) { chargingTime = obj.evse_charging_time; evseActive = obj.evse_active; document.getElementById("evse_charging_time").innerHTML = getTimeFormat(obj.evse_charging_time); - document.getElementById("evse_current_limit").innerHTML = obj.evse_current_limit + " A"; if (obj.evse_rse_status === true) { document.getElementById("evse_current_limit").innerHTML = "RSE Active  " + obj.evse_current_limit + " / " + obj.evse_rse_current_before + " A (" + obj.evse_rse_value + "%)"; - } - if (obj.evse_current_limit > pp_limit) { + } else if (obj.evse_current_limit > pp_limit) { document.getElementById("evse_current_limit").innerHTML = "PP-Limit  " + pp_limit + " A / " + obj.evse_current_limit + " A"; + } else if (obj.evse_num_phases) { + document.getElementById("evse_current_limit").innerHTML = obj.evse_current_limit + " A (" + obj.evse_num_phases + "P)"; + } else { + document.getElementById("evse_current_limit").innerHTML = obj.evse_current_limit + " A"; } document.getElementById("evse_current").innerHTML = obj.evse_current + " kW"; @@ -723,6 +725,7 @@ function listCONF(obj) { hw_rev = "ESP8266"; document.getElementById("divRSEValue").style.display = "none"; document.getElementById("divUseRSE").style.display = "none"; + document.getElementById("divNumPhases").style.display = "none"; document.getElementById("divCPInterrupt").style.display = "none"; document.getElementById("divDisplayRotation").style.display = "none"; document.getElementById("textDownloadFwVersion").innerHTML = "Download latest version from GitHub."; @@ -822,6 +825,13 @@ function listCONF(obj) { document.getElementById("rsevalue").value = obj.evse[0].rsevalue; handleUseRse(); + //number of phases switchable? () + if(obj.evse[0].numPhases) { + document.getElementById("checkboxNumPhases").checked = obj.evse[0].numPhases==3?true:false; + } else { + document.getElementById("divNumPhases").style.display = "none"; + } + var dataStr = "data:text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(obj, null, 2)); var dlAnchorElem = document.getElementById("downloadSet"); dlAnchorElem.setAttribute("href", dataStr); @@ -1198,6 +1208,7 @@ function saveConf() { else { datatosend.evse[0].rseactive = document.getElementById("checkboxUseRse").checked; datatosend.evse[0].rsevalue = parseInt(document.getElementById("rsevalue").value); + datatosend.evse[0].numPhases = document.getElementById("checkboxNumPhases").checked?3:1; } websock.send(JSON.stringify(datatosend)); From f75974447777596afd92b921193ffb4f63476225 Mon Sep 17 00:00:00 2001 From: BayCom GmbH Date: Mon, 24 May 2021 15:24:24 +0200 Subject: [PATCH 03/41] add embedded storage for web content --- include/websrcembed.h | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 include/websrcembed.h diff --git a/include/websrcembed.h b/include/websrcembed.h new file mode 100644 index 0000000..0c7f26a --- /dev/null +++ b/include/websrcembed.h @@ -0,0 +1,20 @@ +extern const uint8_t websrc_favicon_ico_start[] asm("_binary_websrc_favicon_ico_start"); +extern const uint8_t websrc_favicon_ico_end[] asm("_binary_websrc_favicon_ico_end"); +extern const uint8_t websrc_glyph_woff_start[] asm("_binary_websrc_glyph_woff_start"); +extern const uint8_t websrc_glyph_woff_end[] asm("_binary_websrc_glyph_woff_end"); +extern const uint8_t websrc_glyph_woff2_start[] asm("_binary_websrc_glyph_woff2_start"); +extern const uint8_t websrc_glyph_woff2_end[] asm("_binary_websrc_glyph_woff2_end"); +extern const uint8_t websrc_index_htm_start[] asm("_binary_websrc_index_htm_start"); +extern const uint8_t websrc_index_htm_end[] asm("_binary_websrc_index_htm_end"); +extern const uint8_t websrc_required_css_start[] asm("_binary_websrc_required_css_start"); +extern const uint8_t websrc_required_css_end[] asm("_binary_websrc_required_css_end"); +extern const uint8_t websrc_required_js_start[] asm("_binary_websrc_required_js_start"); +extern const uint8_t websrc_required_js_end[] asm("_binary_websrc_required_js_end"); +extern const uint8_t websrc_script_js_start[] asm("_binary_websrc_script_js_start"); +extern const uint8_t websrc_script_js_end[] asm("_binary_websrc_script_js_end"); +extern const uint8_t websrc_status_charging_svg_start[] asm("_binary_websrc_status_charging_svg_start"); +extern const uint8_t websrc_status_charging_svg_end[] asm("_binary_websrc_status_charging_svg_end"); +extern const uint8_t websrc_status_detected_svg_start[] asm("_binary_websrc_status_detected_svg_start"); +extern const uint8_t websrc_status_detected_svg_end[] asm("_binary_websrc_status_detected_svg_end"); +extern const uint8_t websrc_status_ready_svg_start[] asm("_binary_websrc_status_ready_svg_start"); +extern const uint8_t websrc_status_ready_svg_end[] asm("_binary_websrc_status_ready_svg_end"); From 72ed7c921ce029de3702b5b599ff1f24a4bd4436 Mon Sep 17 00:00:00 2001 From: BayCom GmbH Date: Mon, 24 May 2021 17:23:10 +0200 Subject: [PATCH 04/41] make oled.h depend on OLED define --- include/oled.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/oled.h b/include/oled.h index 927d7c9..51b3421 100644 --- a/include/oled.h +++ b/include/oled.h @@ -1,4 +1,4 @@ -#ifndef ESP8266 +#ifdef OLED #include #include #include "oled_templates.h" From fbd77b8400a3b897f24a6d000d16364edecb95da Mon Sep 17 00:00:00 2001 From: BayCom GmbH Date: Mon, 24 May 2021 17:23:53 +0200 Subject: [PATCH 05/41] fix numPhases display --- websrc/script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/websrc/script.js b/websrc/script.js index 24a954a..6549f00 100644 --- a/websrc/script.js +++ b/websrc/script.js @@ -81,7 +81,7 @@ function listEVSEData(obj) { document.getElementById("evse_current_limit").innerHTML = "RSE Active  " + obj.evse_current_limit + " / " + obj.evse_rse_current_before + " A (" + obj.evse_rse_value + "%)"; } else if (obj.evse_current_limit > pp_limit) { document.getElementById("evse_current_limit").innerHTML = "PP-Limit  " + pp_limit + " A / " + obj.evse_current_limit + " A"; - } else if (obj.evse_num_phases) { + } else if (parseInt(obj.evse_num_phases)>0) { document.getElementById("evse_current_limit").innerHTML = obj.evse_current_limit + " A (" + obj.evse_num_phases + "P)"; } else { document.getElementById("evse_current_limit").innerHTML = obj.evse_current_limit + " A"; From c13b55579824c2d6cfdddc2789c78f20ac65e445 Mon Sep 17 00:00:00 2001 From: BayCom GmbH Date: Mon, 24 May 2021 17:24:26 +0200 Subject: [PATCH 06/41] use better partition layout for small ESP32 --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index ba44f8f..2240c7f 100644 --- a/platformio.ini +++ b/platformio.ini @@ -15,7 +15,7 @@ framework = arduino upload_speed = 921600 monitor_speed = 115200 build_flags = -DESP32_DEVKIT ;-DRFID -DOLED -board_build.partitions = huge_app.csv +board_build.partitions = min_spiffs.csv board_build.embed_txtfiles = websrc/favicon.ico websrc/glyph.woff From c4a8dbc336b72adbfed5bc5c271f1844f66b8ee2 Mon Sep 17 00:00:00 2001 From: BayCom GmbH Date: Mon, 24 May 2021 19:04:35 +0200 Subject: [PATCH 07/41] properly remove rfid and oled code from build --- include/rfid.h | 4 +++- lib/Time | 1 + platformio.ini | 7 +++++-- src/main.cpp | 1 - src/oled.cpp | 2 -- src/rfid.cpp | 2 ++ 6 files changed, 11 insertions(+), 6 deletions(-) create mode 160000 lib/Time diff --git a/include/rfid.h b/include/rfid.h index 6e184f1..fdab21a 100644 --- a/include/rfid.h +++ b/include/rfid.h @@ -1,5 +1,7 @@ #include -#include +#ifdef RFID + #include +#endif #include #include #include diff --git a/lib/Time b/lib/Time new file mode 160000 index 0000000..410aee4 --- /dev/null +++ b/lib/Time @@ -0,0 +1 @@ +Subproject commit 410aee4fda01c7ab03aa032c9dc50641633e2d4f diff --git a/platformio.ini b/platformio.ini index 2240c7f..5088015 100644 --- a/platformio.ini +++ b/platformio.ini @@ -31,12 +31,15 @@ board_build.embed_txtfiles = lib_ignore = ESPAsyncUDP EspSoftwareSerial + MFRC522 + U8g2 + lib_deps = - miguelbalboa/MFRC522 bblanchon/ArduinoJson emelianov/modbus-esp8266 - olikraus/U8g2 4-20ma/ModbusMaster +; miguelbalboa/MFRC522 +; olikraus/U8g2 [env:base_1_045] platform = espressif32 diff --git a/src/main.cpp b/src/main.cpp index 314a2dc..dafc6e8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -36,7 +36,6 @@ #include // Library for converting epochtime to a date #include // SPI protocol -#include // Library for Mifare RC522 Devices #include // JSON Library for Encoding and Parsing Json object to send browser #include // Async Web Server with built-in WebSocket Plug-in #include // This creates a web page on server which can be used to edit text based files diff --git a/src/oled.cpp b/src/oled.cpp index 2bd89f5..103397e 100644 --- a/src/oled.cpp +++ b/src/oled.cpp @@ -1,4 +1,3 @@ -#ifndef ESP8266 #ifdef OLED #include "oled.h" #include @@ -277,4 +276,3 @@ void EvseWiFiOled::showCheck(bool checked, uint8_t textID) { } } #endif -#endif \ No newline at end of file diff --git a/src/rfid.cpp b/src/rfid.cpp index 5b8c363..31e16e9 100644 --- a/src/rfid.cpp +++ b/src/rfid.cpp @@ -1,6 +1,8 @@ #include +#ifdef RFID MFRC522 mfrc522 = MFRC522(); +#endif bool ICACHE_FLASH_ATTR EvseWiFiRfid::begin(int rfidss, bool usePN532, int rfidgain, NtpClient* ntp, bool debug) { #ifdef RFID From bc61b12d28a9c9c9d4f3c7d101459de9bae8b446 Mon Sep 17 00:00:00 2001 From: BayCom GmbH Date: Tue, 25 May 2021 00:08:18 +0200 Subject: [PATCH 08/41] remove 4-20ma/ModbusMaster from deps --- platformio.ini | 1 - 1 file changed, 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 5088015..c6a7357 100644 --- a/platformio.ini +++ b/platformio.ini @@ -37,7 +37,6 @@ lib_ignore = lib_deps = bblanchon/ArduinoJson emelianov/modbus-esp8266 - 4-20ma/ModbusMaster ; miguelbalboa/MFRC522 ; olikraus/U8g2 From 6d5754356ebad350d2706ae6e76582192d2355d4 Mon Sep 17 00:00:00 2001 From: BayCom GmbH Date: Tue, 25 May 2021 00:18:25 +0200 Subject: [PATCH 09/41] Update README.md --- README.md | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/README.md b/README.md index 5e0430e..c49ddbd 100644 --- a/README.md +++ b/README.md @@ -287,6 +287,50 @@ E0_could not set current - internal error | Internal error occured (unspecified) E1_could not set current - give a value between *x* and *y* | Wrong value was given E2_could not set current - wrong parameter | Wrong parameter was given +### setNumPhases() +using setNumPhases() will switch between one and three phase operation + +Parameter | Description +--------- | ----------- +numPhases | Number of phases to be used (1 or 3). + +#### Example + +`GET http://192.168.4.1/setNumPhases?numPhases=3` + +> Enables three phase operation. + +```text +Number of phases set to given value +``` +In cases of Error, the answer would be + +Answer | Description +--------- | ----------- +Number of phases could not be processed - wrong parameter + +### setMeteringFactor() +using setMeteringFactor() will the metering factor. + +Parameter | Description +--------- | ----------- +meteringFactor | When using a single phase meter it might make sense to switch between factor 1 and 3 when switching the number of phases. + +#### Example + +`GET http://192.168.4.1/setMeteringFactor?meteringFactor=3` + +> Sets factor 3 (for e.g. in three phase operation with a single phase meter). + +```text +Metering factor set to given value +``` +In cases of Error, the answer would be + +Answer | Description +--------- | ----------- +Metering factor could not be processed - wrong parameter + ### setStatus() will activate/deactivate EVSE WB From 28e4c8cdb2d7b2810a7207139fcf288ed43e861a Mon Sep 17 00:00:00 2001 From: BayCom GmbH Date: Wed, 26 May 2021 16:32:34 +0200 Subject: [PATCH 10/41] switchNumPhases: increase pre switch delay --- src/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index dafc6e8..37803ec 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1969,7 +1969,7 @@ bool ICACHE_FLASH_ATTR switchNumPhases(uint8_t numPhases) { if (config.getSystemDebug()) Serial.printf("[ switchNumPhases ] switch to: %d phases ...\r\n", numPhases); xSemaphoreTake(CPMutex, portMAX_DELAY); digitalWrite(config.getEvseCpIntPin(0), HIGH); - delay(1500); + delay(5000); if(numPhases == 3) { config.setEvseNumPhases(0, numPhases); digitalWrite(config.getEvseNumPhasesPin(0), HIGH); @@ -1978,7 +1978,7 @@ bool ICACHE_FLASH_ATTR switchNumPhases(uint8_t numPhases) { digitalWrite(config.getEvseNumPhasesPin(0), LOW); } numPhasesState = numPhases; - delay(1500); + delay(500); digitalWrite(config.getEvseCpIntPin(0), LOW); xSemaphoreGive(CPMutex); if (config.getSystemDebug()) Serial.printf("[ switchNumPhases ] switch phases done\r\n"); From 392604203b787047109f114ea3a7b698af64222d Mon Sep 17 00:00:00 2001 From: BayCom GmbH Date: Wed, 26 May 2021 21:05:52 +0200 Subject: [PATCH 11/41] updated README.md --- README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c49ddbd..a72478a 100644 --- a/README.md +++ b/README.md @@ -307,7 +307,10 @@ In cases of Error, the answer would be Answer | Description --------- | ----------- -Number of phases could not be processed - wrong parameter +S0_switchNumPhases set to given value +E1_switchNumPhases failed - wrong state +E2_switchNumPhases failed - always active mode +E3_switchNumPhases failed - wrong parameter name ### setMeteringFactor() using setMeteringFactor() will the metering factor. @@ -329,7 +332,9 @@ In cases of Error, the answer would be Answer | Description --------- | ----------- -Metering factor could not be processed - wrong parameter +S0_setMeterFactor set to given value +E1_setMeterFactor failed - invalid factor value +E2_setMeterFactor - wrong parameter name ### setStatus() will activate/deactivate EVSE WB From 856c034fa5858723430cbceccaafd0db740f6978 Mon Sep 17 00:00:00 2001 From: BayCom GmbH Date: Wed, 26 May 2021 21:06:42 +0200 Subject: [PATCH 12/41] reworked switchNumPhases to deactivate and reactivate EVSE properly, improved error handling --- src/main.cpp | 89 +++++++++++++++++++++++++++++----------------------- 1 file changed, 49 insertions(+), 40 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 37803ec..d8f7df6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -48,6 +48,7 @@ #include "proto.h" #include "ntp.h" #ifdef ESP32_DEVKIT + #include #include "websrcembed.h" #else #include "websrc.h" @@ -59,7 +60,7 @@ uint8_t sw_min = 2; //Firmware Minor Version uint8_t sw_rev = 2; //Firmware Revision -String sw_add = "-deti"; +String sw_add = "-deti-3"; #ifdef ESP8266 uint8_t sw_maj = 1; //Firmware Major Version @@ -105,8 +106,9 @@ bool rseActive = false; uint8_t currentBeforeRse = 0; #endif #ifdef ESP32_DEVKIT -SemaphoreHandle_t CPMutex; uint8_t numPhasesState = 0; +uint8_t numPhasesDoSwitch = 0; +bool needReactivation = false; #endif //RFID @@ -514,15 +516,9 @@ bool ICACHE_FLASH_ATTR setSmartWb11kWSettings() { } Serial.println("[ Auto-Config ] Going to interrupt CP for 500ms"); - #ifdef ESP32_DEVKIT - xSemaphoreTake(CPMutex, portMAX_DELAY); - #endif digitalWrite(config.getEvseCpIntPin(0), HIGH); delay(500); digitalWrite(config.getEvseCpIntPin(0), LOW); - #ifdef ESP32_DEVKIT - xSemaphoreGive(CPMutex); - #endif Serial.println("[ Auto-Config ] CP interrupt ended - going to Reboot now..."); toReboot = true; @@ -1950,9 +1946,6 @@ void ICACHE_FLASH_ATTR sendUserList(int page, AsyncWebSocketClient * client) { #ifndef ESP8266 bool ICACHE_FLASH_ATTR interruptCp() { - #ifdef ESP32_DEVKIT - xSemaphoreTake(CPMutex, portMAX_DELAY); - #endif digitalWrite(config.getEvseCpIntPin(0), HIGH); millisInterruptCp = millis() + 3000; doCpInterruptCp = true; @@ -1964,24 +1957,17 @@ bool ICACHE_FLASH_ATTR interruptCp() { #ifdef ESP32_DEVKIT bool ICACHE_FLASH_ATTR switchNumPhases(uint8_t numPhases) { // only allow to change mode if previous and current mode is not zero - if(numPhasesState && numPhases && (numPhasesState != numPhases)) + if(!numPhasesDoSwitch && numPhasesState && numPhases && (numPhasesState != numPhases)) { if (config.getSystemDebug()) Serial.printf("[ switchNumPhases ] switch to: %d phases ...\r\n", numPhases); - xSemaphoreTake(CPMutex, portMAX_DELAY); - digitalWrite(config.getEvseCpIntPin(0), HIGH); - delay(5000); - if(numPhases == 3) { - config.setEvseNumPhases(0, numPhases); - digitalWrite(config.getEvseNumPhasesPin(0), HIGH); - } else if(numPhases == 1) { - config.setEvseNumPhases(0, numPhases); - digitalWrite(config.getEvseNumPhasesPin(0), LOW); + if(evseStatus == 3) { + if (config.getSystemDebug()) Serial.printf("[ switchNumPhases ] need to deactivateEVSE first\r\n"); + toDeactivateEVSE = true; + needReactivation = true; + } else { + needReactivation = false; } - numPhasesState = numPhases; - delay(500); - digitalWrite(config.getEvseCpIntPin(0), LOW); - xSemaphoreGive(CPMutex); - if (config.getSystemDebug()) Serial.printf("[ switchNumPhases ] switch phases done\r\n"); + numPhasesDoSwitch = numPhases; return true; } return false; @@ -3099,23 +3085,33 @@ void ICACHE_FLASH_ATTR setWebEvents() { awp = request->getParam(0); if (awp->name() == "numPhases") { uint8_t numPhases = atoi(awp->value().c_str()); - if((numPhases == 1) || (numPhases == 3)) { - switchNumPhases(numPhases); - request->send(200, "text/plain", "Number of phases set to given value"); + if(!config.getEvseAlwaysActive(0)) { + if((numPhases == 1) || (numPhases == 3)) { + if(switchNumPhases(numPhases)) { + request->send(200, "text/plain", "S0_switchNumPhases set to given value"); + } else { + request->send(200, "text/plain", "E1_switchNumPhases failed - wrong state"); + } + } + } else { + request->send(200, "text/plain", "E2_switchNumPhases failed - always active mode"); } } - request->send(200, "text/plain", "Number of phases could not be processed - wrong parameter"); + request->send(200, "text/plain", "E3_switchNumPhases failed - wrong parameter name"); }); server.on("/setMeteringFactor", HTTP_GET, [](AsyncWebServerRequest * request) { awp = request->getParam(0); if (awp->name() == "meteringFactor") { uint8_t meteringFactor = atoi(awp->value().c_str()); - if(meteringFactor > 0) { + if(meteringFactor >= 1 && meteringFactor <= 3) { config.setMeterFactor(0, meteringFactor); - request->send(200, "text/plain", "Metering factor set to given value"); + request->send(200, "text/plain", "S0_setMeterFactor set to given value"); + } else { + request->send(200, "text/plain", "E1_setMeterFactor failed - invalid factor value"); } + } - request->send(200, "text/plain", "Metering factor could not be processed - wrong parameter"); + request->send(200, "text/plain", "E2_setMeterFactor - wrong parameter name"); }); #endif } @@ -3291,10 +3287,6 @@ void ICACHE_RAM_ATTR setup() { } #ifdef ESP32_DEVKIT - CPMutex = xSemaphoreCreateMutex(); - if (CPMutex == NULL) { - Serial.println("[ SYSTEM ] CPMutex can not be created"); - } pinMode(config.getEvseNumPhasesPin(0), OUTPUT); numPhasesState = config.getEvseNumPhases(0); if(numPhasesState == 3) { @@ -3508,11 +3500,28 @@ void ICACHE_RAM_ATTR loop() { doCpInterruptCp = false; digitalWrite(config.getEvseCpIntPin(0), LOW); Serial.println("Interrupt CP stopped"); - #ifdef ESP32_DEVKIT - xSemaphoreGive(CPMutex); - #endif } } + if (numPhasesDoSwitch && (numPhasesState != numPhasesDoSwitch) && (evseStatus < 3)) { + if(numPhasesDoSwitch == 3) { + config.setEvseNumPhases(0, numPhasesDoSwitch); + digitalWrite(config.getEvseNumPhasesPin(0), HIGH); + } else if(numPhasesDoSwitch == 1) { + config.setEvseNumPhases(0, numPhasesDoSwitch); + digitalWrite(config.getEvseNumPhasesPin(0), LOW); + } + numPhasesState = numPhasesDoSwitch; + + numPhasesDoSwitch = 0; + + if(needReactivation) { + if (config.getSystemDebug()) Serial.printf("[ switchNumPhases ] need to reactivate EVSE\r\n"); + toActivateEVSE = true; + needReactivation = false; + } + if (config.getSystemDebug()) Serial.printf("[ switchNumPhases ] switch phases done\r\n"); + + } if (config.getEvseRseActive(0)) { if (digitalRead(config.getEvseRsePin(0)) == LOW && rseActive == false) { From 8d279b20ff05e852896a7e3b577abe5709a29c45 Mon Sep 17 00:00:00 2001 From: BayCom GmbH Date: Wed, 26 May 2021 22:43:20 +0200 Subject: [PATCH 13/41] Update README.md --- README.md | 67 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 36 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index a72478a..227185a 100644 --- a/README.md +++ b/README.md @@ -72,28 +72,28 @@ SimpleEVSE-WiFi supports not only the control of the EVSE WB but also the use of ##### Mandatory This wiring is mandatory and absolutely needed to run SimpleEVSE-WiFi -ESP8266-Pin | ESP8266-GPIO | EVSE WB ------------ | ----------- | ----------- -D1 | GPIO5 | TX -D2 | GPIO4 | RX -GND | | GND +ESP8266-Pin | ESP8266-GPIO | EVSE WB | ESP32 DEVKIT V1 +----------- | ----------- | ----------- | ----------- +D1 | GPIO5 | TX | 21 +D2 | GPIO4 | RX | 22 +GND | | GND | GND ##### Button (optional) -ESP8266-Pin | ESP8266-GPIO | Button ------------ | ----------- | ----------- -D4 | GPIO2 | Pin 1 -GND | | Pin 2 +ESP8266-Pin | ESP8266-GPIO | Button | ESP32 DEVKIT V1 +----------- | ----------- | ----------- | ----------- +D4 | GPIO2 | Pin 1 | 16 +GND | | Pin 2| GND ##### S0 Electicity Meter (optional)* -ESP8266-Pin | ESP8266-GPIO | electricity meter ------------ | ----------- | ----------- -D3 | GPIO0 | S0+ -GND | | S0- +ESP8266-Pin | ESP8266-GPIO | electricity meter | ESP32 DEVKIT V1 +----------- | ----------- | ----------- | ----------- +D3 | GPIO0 | S0+ | 17 +GND | | S0- | GND ##### LED (optional) -ESP8266-Pin | ESP8266-GPIO | LED ------------ | ----------- | ----------- -D0 | GPIO16 | Anode (+) +ESP8266-Pin | ESP8266-GPIO | LED | ESP32 DEVKIT V1 +----------- | ----------- | ----------- | ----------- +D0 | GPIO16 | Anode (+) | 2 GND | | Kathode (-) ##### Modbus Electicity Meter (optional)** @@ -109,17 +109,22 @@ TTL->RS485 | Modbus Meter A+ | A B- | B +##### Phase switching (optional)** +ESP8266-Pin | ESP8266-GPIO | LED | ESP32 DEVKIT V1 +----------- | ----------- | ----------- | ----------- + | | | 32 + | | | GND ##### RC522 RFID-Reader (optional) -ESP8266-Pin | ESP8266-GPIO | RC522 ------------ | ----------- | ----------- -D5 | GPIO14 | SCK -D6 | GPIO12 | MISO -D7 | GPIO13 | MOSI -D8 | GPIO15 | SDA -GND | | GND -3.3V | | 3.3V +ESP8266-Pin | ESP8266-GPIO | RC522 | ESP32 DEVKIT V1 +----------- | ----------- | ----------- | ----------- +D5 | GPIO14 | SCK | 18 +D6 | GPIO12 | MISO | 19 +D7 | GPIO13 | MOSI | 23 +D8 | GPIO15 | SDA | 5 +GND | | GND | GND +3.3V | | 3.3V | 3.3V Be sure to use a suitable power supply for ESP. At least 500mA is recommended! @@ -307,10 +312,10 @@ In cases of Error, the answer would be Answer | Description --------- | ----------- -S0_switchNumPhases set to given value -E1_switchNumPhases failed - wrong state -E2_switchNumPhases failed - always active mode -E3_switchNumPhases failed - wrong parameter name +S0_switchNumPhases set to given value | Operation succeeded +E1_switchNumPhases failed - wrong state | Wrong value or already set +E2_switchNumPhases failed - always active mode | Function is not available in always active ode +E3_switchNumPhases failed - wrong parameter name | Parameter `numPhases` is missing ### setMeteringFactor() using setMeteringFactor() will the metering factor. @@ -332,9 +337,9 @@ In cases of Error, the answer would be Answer | Description --------- | ----------- -S0_setMeterFactor set to given value -E1_setMeterFactor failed - invalid factor value -E2_setMeterFactor - wrong parameter name +S0_setMeterFactor set to given value | Operation succeeded +E1_setMeterFactor failed - invalid factor value | Factor has to be 1 2 or 3 +E2_setMeterFactor - wrong parameter name | Parameter `meteringFactor` is missing ### setStatus() will activate/deactivate EVSE WB From e545c05ad3a8a5e791fb95fd94c6bf39f6b62f1a Mon Sep 17 00:00:00 2001 From: BayCom GmbH Date: Wed, 26 May 2021 22:44:20 +0200 Subject: [PATCH 14/41] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 227185a..088bf60 100644 --- a/README.md +++ b/README.md @@ -94,7 +94,7 @@ GND | | S0- | GND ESP8266-Pin | ESP8266-GPIO | LED | ESP32 DEVKIT V1 ----------- | ----------- | ----------- | ----------- D0 | GPIO16 | Anode (+) | 2 -GND | | Kathode (-) +GND | | Kathode (-) | GND ##### Modbus Electicity Meter (optional)** TTL->RS485 | ESP8266-Pin @@ -110,7 +110,7 @@ A+ | A B- | B ##### Phase switching (optional)** -ESP8266-Pin | ESP8266-GPIO | LED | ESP32 DEVKIT V1 +ESP8266-Pin | ESP8266-GPIO | | ESP32 DEVKIT V1 ----------- | ----------- | ----------- | ----------- | | | 32 | | | GND From a54db4c35f77326453d857bdf83c3714fbcb63d3 Mon Sep 17 00:00:00 2001 From: BayCom GmbH Date: Wed, 26 May 2021 22:45:25 +0200 Subject: [PATCH 15/41] Update README.md --- README.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 088bf60..2dd9e05 100644 --- a/README.md +++ b/README.md @@ -110,11 +110,10 @@ A+ | A B- | B ##### Phase switching (optional)** -ESP8266-Pin | ESP8266-GPIO | | ESP32 DEVKIT V1 ------------ | ----------- | ----------- | ----------- - | | | 32 - | | | GND - +ESP32 DEVKIT V1 +----------- | +32 | +GND | ##### RC522 RFID-Reader (optional) ESP8266-Pin | ESP8266-GPIO | RC522 | ESP32 DEVKIT V1 From 7594a6403717b5ff8222162ac13a75b0c2ce197b Mon Sep 17 00:00:00 2001 From: BayCom GmbH Date: Thu, 27 May 2021 13:59:31 +0200 Subject: [PATCH 16/41] reset CPIntPin on reboot --- src/main.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main.cpp b/src/main.cpp index d8f7df6..77bac87 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3300,6 +3300,7 @@ void ICACHE_RAM_ATTR setup() { if (config.getSystemDebug()) Serial.print("[ SYSTEM ] Use RSE GPIO "); if (config.getSystemDebug()) Serial.println(config.getEvseRsePin(0)); pinMode(config.getEvseCpIntPin(0), OUTPUT); + digitalWrite(config.getEvseCpIntPin(0), LOW); delay(100); #endif now(); From 010630b9bb875b3594a2d0d4f41f8d090192fa36 Mon Sep 17 00:00:00 2001 From: BayCom GmbH Date: Thu, 27 May 2021 19:45:47 +0200 Subject: [PATCH 17/41] add numPhases to parameters --- src/main.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 77bac87..b8d5dc6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -60,7 +60,7 @@ uint8_t sw_min = 2; //Firmware Minor Version uint8_t sw_rev = 2; //Firmware Revision -String sw_add = "-deti-3"; +String sw_add = "-deti-4"; #ifdef ESP8266 uint8_t sw_maj = 1; //Firmware Major Version @@ -2845,6 +2845,9 @@ void ICACHE_FLASH_ATTR setWebEvents() { } items["useMeter"] = config.getMeterActive(0); items["RFIDUID"] = lastRFIDUID; +#ifdef ESP32_DEVKIT + items["numPhases"] = numPhasesState; +#endif remoteHeartbeatCounter = 0; // Reset Heartbeat Counter From 4a401b57a85f703a30106ccba913c5b676bf4c65 Mon Sep 17 00:00:00 2001 From: BayCom GmbH Date: Fri, 28 May 2021 00:45:09 +0200 Subject: [PATCH 18/41] fix api requests (double request->send) --- src/main.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index b8d5dc6..3a6f680 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -60,7 +60,7 @@ uint8_t sw_min = 2; //Firmware Minor Version uint8_t sw_rev = 2; //Firmware Revision -String sw_add = "-deti-4"; +String sw_add = "-deti-6"; #ifdef ESP8266 uint8_t sw_maj = 1; //Firmware Major Version @@ -3099,8 +3099,9 @@ void ICACHE_FLASH_ATTR setWebEvents() { } else { request->send(200, "text/plain", "E2_switchNumPhases failed - always active mode"); } + } else { + request->send(200, "text/plain", "E3_switchNumPhases failed - wrong parameter name"); } - request->send(200, "text/plain", "E3_switchNumPhases failed - wrong parameter name"); }); server.on("/setMeteringFactor", HTTP_GET, [](AsyncWebServerRequest * request) { awp = request->getParam(0); @@ -3112,9 +3113,9 @@ void ICACHE_FLASH_ATTR setWebEvents() { } else { request->send(200, "text/plain", "E1_setMeterFactor failed - invalid factor value"); } - + } else { + request->send(200, "text/plain", "E2_setMeterFactor - wrong parameter name"); } - request->send(200, "text/plain", "E2_setMeterFactor - wrong parameter name"); }); #endif } From 78df54135591227abd6c57fef26ce084058692eb Mon Sep 17 00:00:00 2001 From: BayCom GmbH Date: Fri, 28 May 2021 20:33:34 +0200 Subject: [PATCH 19/41] simplify phase status --- websrc/script.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/websrc/script.js b/websrc/script.js index 6549f00..a97fd90 100644 --- a/websrc/script.js +++ b/websrc/script.js @@ -81,11 +81,12 @@ function listEVSEData(obj) { document.getElementById("evse_current_limit").innerHTML = "RSE Active  " + obj.evse_current_limit + " / " + obj.evse_rse_current_before + " A (" + obj.evse_rse_value + "%)"; } else if (obj.evse_current_limit > pp_limit) { document.getElementById("evse_current_limit").innerHTML = "PP-Limit  " + pp_limit + " A / " + obj.evse_current_limit + " A"; - } else if (parseInt(obj.evse_num_phases)>0) { - document.getElementById("evse_current_limit").innerHTML = obj.evse_current_limit + " A (" + obj.evse_num_phases + "P)"; } else { document.getElementById("evse_current_limit").innerHTML = obj.evse_current_limit + " A"; } + if (parseInt(obj.evse_num_phases)>0) { + document.getElementById("evse_current_limit").innerHTML += " (" + obj.evse_num_phases + "P)"; + } document.getElementById("evse_current").innerHTML = obj.evse_current + " kW"; document.getElementById("evse_charged_kwh").innerHTML = obj.evse_charged_kwh + " kWh / " + obj.evse_charged_amount + " €"; @@ -168,7 +169,6 @@ function listEVSEData(obj) { document.getElementById("successRemoteHeartbeat").style.display = "block"; } } - } function handleSlider(value) { if (highResolution) { From 0790e31f6db06fafe06748affc3341a29524ac3c Mon Sep 17 00:00:00 2001 From: BayCom GmbH Date: Mon, 31 May 2021 10:48:05 +0200 Subject: [PATCH 20/41] add numPhases and meteringFactor to modbus regs --- src/main.cpp | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 3a6f680..87d2b71 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2212,8 +2212,24 @@ uint16_t onSetMbTCPHreg(TRegister *reg, uint16_t val) { #endif return false; break; - default: + #ifdef ESP32_DEVKIT + case 40004: // numPhases + if (val == 1 || val == 3) { + switchNumPhases(val); + return 0; + } + return false; + break; + case 40005: // meteringFactor + if (val >= 1 && val <= 3) { + config.setMeterFactor(0, val); + return 0; + } + return false; break; + #endif + default: + break; } return -1; } @@ -2234,6 +2250,15 @@ uint16_t onGetMbTCPHreg(TRegister *reg, uint16_t val) { else { return 0; } + break; +#ifdef ESP32_DEVKIT + case 40004: // numPhases + return numPhasesState; + break; + case 40005: // meteringFactor + return config.getMeterFactor(0); + break; +#endif default: break; } @@ -2403,9 +2428,13 @@ void setModbusTCPRegisters() { modbusTCPServerNode.addHreg(40001); modbusTCPServerNode.addHreg(40002); modbusTCPServerNode.addHreg(40003); - modbusTCPServerNode.onGetHreg(40000, onGetMbTCPHreg, 3); + modbusTCPServerNode.addHreg(40004); + modbusTCPServerNode.addHreg(40005); + modbusTCPServerNode.onGetHreg(40000, onGetMbTCPHreg, 6); modbusTCPServerNode.onSetHreg(40000, onSetMbTCPHreg, 2); modbusTCPServerNode.onSetHreg(40003, onSetMbTCPHreg, 1); + modbusTCPServerNode.onSetHreg(40004, onSetMbTCPHreg, 1); + modbusTCPServerNode.onSetHreg(40005, onSetMbTCPHreg, 1); } ////////////////////////////////////////////////////////////////////////////////////////// From b4184093b4d073b3057fd223c36c048aac359eb4 Mon Sep 17 00:00:00 2001 From: BayCom GmbH Date: Mon, 31 May 2021 13:19:36 +0200 Subject: [PATCH 21/41] add numPhases and meteringFactor to modbus regs --- src/main.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 87d2b71..f3e48fa 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -60,7 +60,7 @@ uint8_t sw_min = 2; //Firmware Minor Version uint8_t sw_rev = 2; //Firmware Revision -String sw_add = "-deti-6"; +String sw_add = "-deti-8"; #ifdef ESP8266 uint8_t sw_maj = 1; //Firmware Major Version @@ -2212,22 +2212,22 @@ uint16_t onSetMbTCPHreg(TRegister *reg, uint16_t val) { #endif return false; break; - #ifdef ESP32_DEVKIT +#ifdef ESP32_DEVKIT case 40004: // numPhases if (val == 1 || val == 3) { switchNumPhases(val); - return 0; + return val; } return false; break; case 40005: // meteringFactor if (val >= 1 && val <= 3) { config.setMeterFactor(0, val); - return 0; + return val; } return false; break; - #endif +#endif default: break; } @@ -3231,11 +3231,11 @@ void ICACHE_FLASH_ATTR startWebserver() { /////// Setup ////////////////////////////////////////////////////////////////////////////////////////// void ICACHE_RAM_ATTR setup() { - #ifdef ESP32_DEVKIT +#ifdef ESP32_DEVKIT Serial.begin(115200); - #else +#else Serial.begin(9600); - #endif +#endif if (config.getSystemDebug()) Serial.println(); if (config.getSystemDebug()) Serial.print("[ INFO ] EVSE-WiFi - version "); if (config.getSystemDebug()) Serial.print(swVersion); @@ -3536,6 +3536,7 @@ void ICACHE_RAM_ATTR loop() { Serial.println("Interrupt CP stopped"); } } +#ifdef ESP32_DEVKIT if (numPhasesDoSwitch && (numPhasesState != numPhasesDoSwitch) && (evseStatus < 3)) { if(numPhasesDoSwitch == 3) { config.setEvseNumPhases(0, numPhasesDoSwitch); @@ -3554,8 +3555,8 @@ void ICACHE_RAM_ATTR loop() { needReactivation = false; } if (config.getSystemDebug()) Serial.printf("[ switchNumPhases ] switch phases done\r\n"); - } +#endif if (config.getEvseRseActive(0)) { if (digitalRead(config.getEvseRsePin(0)) == LOW && rseActive == false) { From 98869d28bb104b9702d6f824110cebdcad1036b5 Mon Sep 17 00:00:00 2001 From: BayCom GmbH Date: Tue, 1 Jun 2021 10:46:01 +0200 Subject: [PATCH 22/41] add phase switching to current modal --- websrc/index.htm | 8 ++++++++ websrc/script.js | 20 ++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/websrc/index.htm b/websrc/index.htm index c2e9d1d..564852a 100644 --- a/websrc/index.htm +++ b/websrc/index.htm @@ -76,6 +76,14 @@