Battery-Emulator Solar Storage Bridge
This lab guides students through configuring and deploying an embedded communications bridge that integrates repurposed high-voltage electric vehicle (EV) battery packs into stationary residential solar energy storage systems. Using ESP32-based microcontroller hardware, students interface automotive battery management systems with commercial hybrid photovoltaic inverters across CAN bus, CAN-FD, and RS485 Modbus RTU interfaces. Participants program and evaluate protocol translation logic, safe contactor pre-charge sequencing, high-voltage DC telemetry monitoring, and real-time state-of-charge communications while visualizing diagnostics via web dashboards and MQTT. Through this work, students master the practical principles of second-life battery reuse, industrial fieldbus networking, distributed energy storage systems, and electrical safety in high-voltage DC power environments.
Uploaded by demo on 2026-09-03 · ready · Electronics · Original source ↗
Files: README.md · platformio.ini · system_settings.h
Readiness checks
-
complete 2026-09-04 00:05 🛡 Cybersecurity: Do not place on an open network · 4 findings 18 searches · 13 pagesview · PDF
Latest report — 2026-09-04 00:05
Readiness: Battery-Emulator Solar Storage Bridge
Verdict: Ready with caveats · 2026-09-03 · est. parts cost $58–$103 (one host board plus the commodity support parts; excludes the EV pack, the inverter, and the high-voltage DC cabling, which could not be priced to specification) Cybersecurity — software & network: Do not place on an open network
This is the cold check for this lab — there is no previous report, so everything below establishes the baseline for future drift measurement. The lab is buildable today. It is designed around six alternative host boards and needs only one of them; five of the six are purchasable right now between $11.86 and $39.90, and both CAN controller ICs are Active and stocked at several authorized distributors. Three things keep it off a clean "Ready". The exact CAN-FD controller ordering code the lab's materials name, MCP2518FD-E/SL, is not listed by DigiKey or by any ECIA-authorized distributor, so it has to be ordered as MCP2517FD-H/SL (which the lab's own materials also name) or as MCP2518FDT-E/SL. The high-voltage DC traction cable is the one safety-critical line, and none of the products found this run states the ≥ 600 V DC rating the lab requires. And the relay module that drives the battery contactors is sold as a 5 V board whose ability to trigger from the ESP32's 3.3 V logic was not confirmed. None of these is a dead end — each is a matter of buying the right variant.
Action required
| Part | Problem | Recommended action |
|---|---|---|
| Microchip MCP2518FD-E/SL (CAN-FD controller) | Not listed by DigiKey, and the ECIA authorized-distributor check found no authorized distributor carrying this exact ordering code. The MCP2518FD-H/SL and MCP2517FD-E/SL codes came back the same way. | Order MCP2517FD-H/SL at $2.84 — the lab's own materials name it as the alternative and it is Active with stock at five distributors — or MCP2518FDT-E/SL at $1.96. See Substitutes. |
| High-voltage DC traction interconnect cabling | The lab requires ≥ 600 V DC insulation for a 300–450 V pack at 50–125 A. Every product found this run is automotive or car-audio 4 AWG cable, and not one listing states a ≥ 600 V DC rating. | Do not buy from the shopping results below. Specify EV or photovoltaic DC cable rated ≥ 600 V DC (1000 V DC is the usual grade) to your local electrical code, and have the high-voltage side installed by a licensed person. |
| BECom ESP32-S3 custom board | Not sold as a finished product. The project wiki states plainly that boards must be fabricated and assembled from the open-source design. | Use one of the five commercial boards instead, or fabricate from the KiCad project, schematic PDF and footprint libraries published under GPL-3.0. |
| Espressif ESP32-DevKitC (ESP32-DEVKITC-32E) | Active and priced at $10.00 at DigiKey, but DigiKey has no available quantity today. | Order from Mouser instead — the ECIA check found 2,640 units at $10.20. Any standard ESP32-WROOM-32 board with TWAI CAN GPIOs also satisfies the lab's stated latitude. |
Cybersecurity — software & network
Do not place on an open network — The device ships with a published default Wi-Fi password and serves its setup page and over-the-air firmware updater behind no authentication the sources record, on hardware that switches a high-voltage traction pack.
| Component | Version | How known | Support status |
|---|---|---|---|
| pioarduino platform-espressif32 | 55.03.311 | read from project (pinned in the fetched platformio.ini, line 18: platform = https://github.com/pioarduino/platform-espressif32/releases/download/55.03.311/platform-espressif32.zip) | — |
| Arduino core for ESP32 (framework-arduinoespressif32) | not determined | not determined (bundled transitively inside platform-espressif32 55.03.311; no version string for the core itself appears in any file fetched this run) | — |
| ESPAsyncWebServer (ESP32Async) | not determined | unpinned (platformio.ini declares lib_deps twice (lines 58 and 68, [common_esp32] and [common_esp32s3]) and both are empty, so PlatformIO resolves whatever version is current at build time) | — |
| AsyncTCP (ESP32Async) | not determined | unpinned (platformio.ini declares lib_deps twice (lines 58 and 68, [common_esp32] and [common_esp32s3]) and both are empty, so PlatformIO resolves whatever version is current at build time) | — |
| ElegantOTA (ayushsharma82) | not determined | unpinned (platformio.ini declares lib_deps twice (lines 58 and 68, [common_esp32] and [common_esp32s3]) and both are empty, so PlatformIO resolves whatever version is current at build time) | — |
| ArduinoJson (bblanchon) | not determined | unpinned (platformio.ini declares lib_deps twice (lines 58 and 68, [common_esp32] and [common_esp32s3]) and both are empty, so PlatformIO resolves whatever version is current at build time) | — |
| eModbus (eModbus) | not determined | unpinned (platformio.ini declares lib_deps twice (lines 58 and 68, [common_esp32] and [common_esp32s3]) and both are empty, so PlatformIO resolves whatever version is current at build time) | — |
| Adafruit_NeoPixel (adafruit) | not determined | unpinned (platformio.ini declares lib_deps twice (lines 58 and 68, [common_esp32] and [common_esp32s3]) and both are empty, so PlatformIO resolves whatever version is current at build time) | — |
| acan-esp32 (pierremolinaro) | not determined | unpinned (platformio.ini declares lib_deps twice (lines 58 and 68, [common_esp32] and [common_esp32s3]) and both are empty, so PlatformIO resolves whatever version is current at build time) | — |
| acan2517FD (pierremolinaro) | not determined | unpinned (platformio.ini declares lib_deps twice (lines 58 and 68, [common_esp32] and [common_esp32s3]) and both are empty, so PlatformIO resolves whatever version is current at build time) | — |
| Battery-Emulator firmware (the lab's own application) | not determined | not determined (the repository ships no version file and platformio.ini carries no firmware version; the GitHub release badge in README.md is a badge image, not a pinned version) | — |
| tools/identify_build.py (PlatformIO pre-build script) | not determined | not determined (referenced by platformio.ini as extra_scripts = pre:tools/identify_build.py; the script itself was not fetched) | — |
| Component | Finding | Severity | Fix available? |
|---|---|---|---|
| Battery-Emulator firmware (Wi-Fi access point) | The board brings up its own Wi-Fi network with a password that is printed in the project's public README, so anyone in radio range who has read that page can join it. | posture | Mitigation only — change the access-point password (and ideally the SSID) on the setup page before the board is powered up anywhere students or the public can reach it. |
| ESPAsyncWebServer + ElegantOTA (setup page and firmware update) | The HTTP setup page and the ElegantOTA firmware-update endpoint are served on that same access point, and the sources record no login or authentication step in front of either, so joining the network is the only barrier between an outsider and the settings that drive the battery contactors. | posture | Mitigation only — keep the device on an isolated network segment of its own, change the default access-point password, and raise it with campus IT before connecting it to any shared or campus network. |
| Firmware install path (BE-Web-Installer) | The documented way to install the firmware is to open a hosted web installer page and let it flash a prebuilt binary onto the board, so what actually lands on the device is whatever that page serves on the day. | posture | Mitigation only — build and flash from source with PlatformIO from the pinned platform release, or check the release the installer serves against the project's own GitHub releases before flashing. |
| Firmware library dependencies (platformio.ini) | dependencies unpinned: 8 of 8 in platformio.ini — every runtime library, including the web server, the async TCP stack and the OTA updater, is left unpinned, so two builds a month apart can ship different library code and neither has a checkable security state. | posture | Mitigation only — pin each library to a version or commit in lib_deps and rebuild from that pin, so a build is reproducible and can be re-checked later. |
What this means for your lab
Treat this board as an untrusted device on your network until you have changed its settings. Out of the box it creates its own Wi-Fi network called Battery-Emulator with the password 123456789, and that password is printed in the project's public README — so anyone close enough to see the network can join it. Once joined, they reach the same web setup page you use, and the same over-the-air update page, and nothing in the project's documentation describes a login in front of either. On a bench that means someone could change how the bridge talks to the battery and the inverter, or replace its firmware outright, on a device whose job is closing contactors on a 300-450 V battery pack. Before you power it up in a shared space: change the access-point password on the setup page, keep the board on its own isolated network segment rather than the campus network, and talk to campus IT before connecting it to anything shared. Two things are genuinely unknown rather than fine: none of the firmware's libraries is pinned to a version, so no one can say which library code a given build contains, and Arduino libraries have no public vulnerability database, so 'no known issues' could not be established either way.
Not checked
- ESPAsyncWebServer, AsyncTCP, ElegantOTA, ArduinoJson, eModbus, Adafruit_NeoPixel, acan-esp32, acan2517FD: Unpinned in platformio.ini, so no version exists to check; and the Arduino/PlatformIO library ecosystem has no vulnerability database in OSV, so even a pinned version could not be looked up. Absence of an advisory here is not evidence of safety.
- pioarduino platform-espressif32 55.03.311: Version is pinned and was read from platformio.ini, but the toolchain ships as a vendor release archive with no entry in OSV and no product on endoflife.date, so there is no advisory or support-status source to check it against.
- Arduino core for ESP32 (framework-arduinoespressif32): Version not determined — it is pulled in transitively by the platform archive and no fetched file names it.
- Battery-Emulator firmware itself: Source-only project with no advisory database; no release version was determined.
- tools/identify_build.py: Local pre-build script referenced by platformio.ini; missing from the lab's uploaded materials and not fetched this run.
- MQTT client (broker, port, credentials): The sources state no broker address, no port and no credentials, so there was nothing to check.
- Web configuration server listening port: Not stated in the sources; port 80 is the snapshot's assumption, not an observation.
- BE-Web-Installer hosted page and the firmware image it serves: The page was not fetched this run and the binary it distributes was not examined.
Parts
| Part | Spec/Package | Status | Stock | Price | Source |
|---|---|---|---|---|---|
| LilyGO T-CAN485 ESP32 Development Board | ESP32, onboard CAN + RS485, 5–12 V DC or USB, TF slot | readily available | vendor stock not established | $11.86 | Lilygo direct; also tindie $12.85, AliExpress $15.66 |
| Waveshare ESP32-S3-RS485-CAN Development Board | ESP32-S3, isolated RS485 + isolated CAN, 7–36 V DC or USB-C (confirmed on the vendor page) | readily available | not stated | $23.82 | AliExpress; eBay (devkits) $26.02 |
| LilyGO T-2CAN ESP32-S3 Dual-CAN Development Board | ESP32-S3, 16 MB flash / 8 MB PSRAM, dual CAN, USB-C | readily available | vendor stock not established | $24.36 | Lilygo direct; OpenELAB $37.14 |
| DFRobot Edge101 Development Board (DFR0886) | Industrial ESP32, isolated RS485 + CAN + Ethernet, 9–26.4 V DC, chassis mount | readily available (thin stock) | 29 (DigiKey); Arrow 24, Mouser 2 | $39.90 | DigiKey; Arrow $44.14, Mouser $57.50 |
| Espressif ESP32 DevKit (ESP32-DEVKITC-32E) | ESP32-WROOM-32E, 4 MB flash, 2.54 mm DIP module form factor | available, but out of stock at DigiKey | 0 (DigiKey); Mouser 2,640 | $10.00 | DigiKey listing; buy from Mouser at $10.20 |
| BECom ESP32-S3 Custom Board | Purpose-built ESP32-S3 board: dual CAN-FD, contactor drivers, isolated inverter comms, 12 V native supply | hard to obtain — not sold assembled | — | — | Design files, GPL-3.0; fabricate and assemble yourself |
| Stark ESP32 Custom Board (Stark CMR v2) | DIN-rail ESP32 module, three comms buses, four switched DC outputs, CE certified | available commercially; price not checked | not stated | not checked | shop.redispo.se — read the price off the vendor page |
| External CAN-FD Controller — Microchip MCP2518FD-E/SL | SOIC-14, 3.3 V SPI to ESP32 | not obtainable under this ordering code | 0 | — | Not listed at DigiKey; no ECIA-authorized distributor carries this exact code. See Substitutes. |
| External CAN-FD Controller — Microchip MCP2517FD-H/SL (the lab's stated alternative) | 14-SOIC (0.154", 3.90 mm), supply 2.7–5.5 V, −40 °C to 150 °C | readily available | 467 (DigiKey); Mouser 13,494, Newark 10,053 | $2.84 | DigiKey; Newark $2.78, Mouser $2.82 |
| External CAN Controller — Microchip MCP2515-I/SO | 18-SOIC (0.295", 7.50 mm), supply 2.7–5.5 V, −40 °C to 85 °C | readily available | 6,405 (DigiKey); Newark 20,039, Mouser 12,811 | $2.44 | DigiKey; Mouser $2.44, Newark $2.53 |
| Addressable RGB Status LED — WS2812B-B | SMD 5050, 3.3–5 V, 800 kHz single-wire | exact part not distributor-stocked; retail equivalents plentiful | not stated | $6.60 | eBay 5 m WS2812B strip; 12-bit WS2812B ring $11.59. Only one LED is needed. |
| MicroSD Memory Card | 4–32 GB, Class 10 / UHS-1, FAT32, 3.3 V SPI/SDMMC | readily available | not stated | $6.50 | eBay (SanDisk Ultra); Kingston $7.00, Walmart $9.99 |
| Low-Voltage Auxiliary DC Power Supply | 5 V, or 12/24 V DC for terminal-block boards; ≥ 10 W | available; confirm the wattage before ordering | not stated | $26.10 | Mouser, MEAN WELL NDR-120-12 (12 V DIN rail). The USB-powered board paths need no separate supply at all. |
| High-Voltage DC Traction Interconnect Cabling | 16–35 mm² / 4–2 AWG, ≥ 600 V DC, ≥ 50–125 A continuous | not verified — no listing states the required voltage rating | not stated | not checked to specification | Shopping returned only automotive 4 AWG cable (from $19.95/100 ft). See Action required. |
| EV Battery Contactor Relay Interface Circuit | 2–3 channel optocoupled relay or MOSFET board, 3.3 V GPIO input, switches 12 V coils at 1–4 A inrush | readily available; trigger voltage not verified | not stated | $6.99 | Micro Center (Inland 4-channel); eBay $7.27, ShillehTek $7.50 |
Substitutes
| For part | Substitute | Differences | Verified | Judgment |
|---|---|---|---|---|
| MCP2518FD-E/SL | MCP2517FD-H/SL — $2.84, 467 at DigiKey | Not really a substitute: it is the second part number the lab's own materials name for this line. 14-SOIC (0.154", 3.90 mm) matching the required SOIC-14; supply 2.7–5.5 V, which contains the 3.3 V logic rail; −40 °C to 150 °C. | verified: package/case and package width (DigiKey parametrics), supply range vs the lab's 3.3 V rail (DigiKey parametrics), Active lifecycle with stock at five distributors (DigiKey + ECIA). not verified: register-level compatibility with the acan2517FD driver — taken from the lab's own materials, not from a datasheet fetched this run. | Acceptable — the simplest fix, and the one the lab already sanctions. |
| MCP2518FD-E/SL | MCP2518FDT-E/SL — $1.96, 19,352 at DigiKey | Same 14-SOIC (0.154", 3.90 mm) package and width, same 2.7–5.5 V supply range, same −40 °C to 125 °C grade. Cheaper than the MCP2517FD-H/SL and far deeper stock. | verified: package/case and package width (DigiKey parametrics), supply range 2.7–5.5 V vs the 3.3 V rail (DigiKey parametrics), Active lifecycle with stock at five distributors (DigiKey + ECIA). assumed, not verified: that the "T" in the ordering code denotes tape-and-reel packaging of the same die — nothing in the evidence states what that infix encodes. | Acceptable, with that one assumption to confirm on the datasheet. |
| MCP2518FD-E/SL | MCP2518FDT-H/SL — $2.03 | Identical 14-SOIC package and 2.7–5.5 V supply range; temperature grade −40 °C to 150 °C exceeds the −40 °C to 125 °C of the -E part, which is acceptable. DigiKey shows no available quantity; stock sits at Master Electronics and Onlinecomponents (6,600 each), Newark (2,928) and Mouser (2,083). | verified: package/case and width, supply range, wider temperature range (all DigiKey parametrics); stock at four authorized distributors (ECIA). assumed, not verified: the "T" infix, as above, and that "H" denotes only the high-temperature grade — inferred from the parametric range, not a suffix table. | Acceptable, second choice — stock is thinner and more scattered. |
| MCP2518FD-E/SL | MCP2518FDT-E/SLVAO — $2.07, 1,421 at DigiKey | Same 14-SOIC (0.154", 3.90 mm), same 2.7–5.5 V supply range, same −40 °C to 125 °C grade as the -E/SL. | verified: package/case and width, supply range (DigiKey parametrics). not verified: what the "VAO" variant code encodes — the evidence does not say. | Plausible, unverified — prefer MCP2518FDT-E/SL unless you confirm what VAO means on the datasheet. |
| WS2812B-B | Retail WS2812B 5050 strip or ring — from $6.60 | The lab needs one LED and allows any WS2812B, WS2813 or SK6812 800 kHz single-wire part, so a strip or ring is over-supply at a trivial price. Watch out: two products returned by the same search are 12 V "CS8812" strips, which are a different controller at a different supply voltage and do not meet the 3.3–5 V requirement. | not verified: nothing beyond the listing titles. No product page was fetched, because Google Shopping links are search redirects and retail pages block direct fetching. | Plausible, unverified — confirm the listing actually says WS2812B, WS2813 or SK6812 before ordering, not CS8812. |
| BECom ESP32-S3 Custom Board | Any of the five commercial host boards above | Not a component swap but a build-target change, which is the lab's own design: each board has its own PlatformIO environment and pin map. The BECom's integrated contactor drivers and 12 V native supply have to be provided externally on the commercial boards. | verified: that BECom is not sold assembled and that its design files are published under GPL-3.0 (project wiki, fetched this run). not verified: nothing about the electrical equivalence of the alternatives — the lab's own firmware targets define it. | Acceptable — pick a commercial board unless you specifically want to fabricate the BECom. |
Verify any substitute against its own datasheet before ordering — the checks above are only as good as the parametric data the distributors publish.
Other dependencies
- Fabrication — not required for the five commercial-off-the-shelf board paths. For the BECom target, the KiCad project, schematic PDF and footprint libraries are published under GPL-3.0 at github.com/rjsc/BECom, confirmed on the project wiki page fetched this run. This updates the lab's own materials, which state the design files are unavailable — they are missing from the uploaded materials but exist upstream. Layer count, copper weight and board outline were not checked; the KiCad project itself was not opened. For the Stark target no design files are published, because it is sold assembled.
- Project documentation wiki (dalathegreat.github.io/Battery-Emulator-Wiki) — live. Three pages were fetched successfully this run.
- Stark hardware vendor (shop.redispo.se) — live; the Stark CMR v2 product page was fetched successfully. The vendor notes there that it provides no software support for the board.
- Browser-based installation web app (dalathegreat.github.io/BE-Web-Installer) — not checked; the page was not fetched this run.
- External protocol-documentation sources — not checked. The lab's protocol translations were reverse-engineered from twelve external references: pelle8/inverter_resources, burra/byd_battery, flodorn/TeslaBMSV2, dalathegreat/leaf_can_bus_messages, rand12345/solax_can_bus, Tom-evnut/BMWI3BMS, FozzieUK/FoxESS-Canbus-Protocol, maciek16c/hyundai-santa-fe-phev-battery, ljames28/Renault-Zoe-PH2-ZE50-Canbus-LBC-Information, openvehicles/Open-Vehicle-Monitoring-System-3, an EEVBlog forum thread on the Pylontech SC0500 protocol, and a Google Docs spreadsheet. None was fetched this run.
Watch list
- The MCP2518FD ordering codes. Three of the four codes checked (MCP2518FD-E/SL, MCP2518FD-H/SL, MCP2517FD-E/SL) are carried by no ECIA-authorized distributor, while the tape-and-reel codes and MCP2517FD-H/SL are plentiful. Whichever code you standardise on, re-check it before each cohort — this family's stock is spread thin across ordering codes.
- DFRobot Edge101 (DFR0886). About 55 units across all three authorized distributors. Fine for one bench, not enough for a class ordering at once.
- ESP32-DEVKITC-32E at DigiKey. Zero available today with Mouser well stocked; a single-warehouse gap that could go either way by the next check.
- The high-voltage DC cable. It is the one line where the wrong purchase is dangerous, and generic shopping searches consistently return automotive cable that does not meet the voltage rating. It will need specifying by hand every time.
- The relay module's 3.3 V trigger. Cheap 5 V optocoupled boards vary in whether they switch reliably from 3.3 V logic; the products change constantly and none of the current listings confirms it.
- The twelve external protocol references. Community repositories, a forum thread and a Google Docs sheet, none checked this run — the most likely source of quiet link rot before the next check.
Snapshot What the lab depended on when it was uploaded — the baseline the readiness checks research against.
This project builds an open-source communications and translation bridge that interfaces high-voltage electric vehicle (EV) battery packs (such as Nissan LEAF, Tesla Model S/3/X/Y, BMW i3, Renault Zoe, and Hyundai Santa Fe PHEV) with stationary residential solar hybrid storage inverters (including Fronius Symo GEN24, SolaX, FoxESS, SMA, and Pylontech-compatible systems) over CAN bus and RS485 / Modbus RTU. The system hardware is based on 32-bit Espressif ESP32 or ESP32-S3 microcontrollers running at 3.3 V internal logic, communicating with external transceiver ICs and automotive/industrial buses. The electrical setup involves two isolated domains: a low-voltage DC auxiliary domain (typically 5 V DC USB or 7 V to 36 V DC industrial power inputs stepped down to 3.3 V for logic, CAN, and RS485 controllers) and a dangerous high-voltage DC traction power bus (typically 300 V to 450 V DC nominal, up to 500 V DC, with continuous currents exceeding 50 A to 125 A) running between the traction battery terminals and the hybrid inverter.
Bill of Materials
LilyGO T-CAN485 ESP32 Development Board
- Identity: LilyGO T-CAN485 ESP32 Development Board (LilyGO model T-CAN485)
- Quantity needed: 1 (required when compiling for the lilygo_330 environment)
- Footprint/package: Integrated module PCB with screw terminal block headers, micro-USB / USB-C connector, and onboard TF/MicroSD slot
- Electrical constraints: ESP32 dual-core microcontroller running at 3.3 V logic; onboard isolated/transceiver circuits for CAN and RS485; operating input voltage 5 V DC via USB or 5 V to 12 V DC via terminal block
- Substitution latitude: Must match the specific GPIO pin routing defined in the firmware for HW_LILYGO (TWAI CAN interface, RS485 transceiver direction and UART lines, and SD card SPI interface). A generic dev board requires pin remapping or external breakout wiring.
- Operated control: No (microcontroller board with reset and download pushbuttons only)
- Sourcing plan: retail shopping search: LilyGO T-CAN485 ESP32 CAN RS485 development board
Waveshare ESP32-S3-RS485-CAN Development Board
- Identity: Waveshare ESP32-S3-RS485-CAN Development Board (Waveshare SKU 26456)
- Quantity needed: 1 (required when compiling for the waveshare_330 environment)
- Footprint/package: Enclosed/open development PCB with 3.81 mm terminal block connectors and USB Type-C connector
- Electrical constraints: Espressif ESP32-S3R8 SoC (3.3 V logic) equipped with 8 MB Octal (OPI) PSRAM and 16 MB Flash; onboard CAN transceiver and half-duplex RS485 transceiver tied to UART2 with driver-enable (DE) on GPIO21; wide input supply range 7 V to 36 V DC or 5 V via USB-C
- Substitution latitude: Must strictly match the GPIO allocations of HW_WAVESHARE, specifically ESP32-S3R8 memory configuration (qio_opi) and UART2 RS485 transceiver control on GPIO21.
- Operated control: No
- Sourcing plan: retail shopping search: Waveshare ESP32-S3-RS485-CAN development board
LilyGO T-2CAN ESP32-S3 Dual-CAN Development Board
- Identity: LilyGO T-2CAN ESP32-S3 Development Board
- Quantity needed: 1 (required when compiling for the lilygo_2CAN_330 environment)
- Footprint/package: Integrated module PCB with dual CAN bus screw terminals and USB Type-C connector
- Electrical constraints: ESP32-S3 microcontroller running at 3.3 V logic; board PSRAM is set to QSPI mode in firmware configuration to release GPIO35, GPIO36, and GPIO37 for hardware I/O; dual onboard CAN transceivers; 5 V DC input
- Substitution latitude: Must match the HW_LILYGO2CAN board target and pin definitions for both CAN transceivers and freed GPIO lines.
- Operated control: No
- Sourcing plan: retail shopping search: LilyGO T-2CAN ESP32-S3 dual CAN board
DFRobot Edge101 Development Board
- Identity: DFRobot Edge101 ESP32 IoT Edge Controller (DFRobot Edge101)
- Quantity needed: 1 (required when compiling for the dfrobot_edge101_330 environment)
- Footprint/package: Integrated edge controller module with terminal blocks and onboard MicroSD slot
- Electrical constraints: ESP32 microcontroller running at 3.3 V logic; 16 MB flash memory operating in DIO QSPI mode; onboard MicroSD card interface; wide-range DC input terminals
- Substitution latitude: Must match HW_DFROBOT_EDGE101 pin assignments for communications transceivers and SD card SPI/SDMMC interface.
- Operated control: No
- Sourcing plan: retail shopping search: DFRobot Edge101 ESP32 board
Espressif ESP32 DevKit Development Board
- Identity: Espressif ESP32-DevKitC / ESP32-WROOM-32 30-pin or 38-pin development board (target esp32dev)
- Quantity needed: 1 (required when compiling for the esp32devkit_330 environment)
- Footprint/package: Standard 25.4 mm (1.0 inch) pitch DIP module form factor for breadboard/perfboard mounting
- Electrical constraints: ESP32-WROOM-32 module running at 3.3 V logic with ≥ 4 MB SPI flash; 5 V input via micro-USB or 5V pin; onboard 3.3 V LDO regulator; requires external breakout transceivers for CAN and RS485
- Substitution latitude: Any standard ESP32-WROOM-32 development board with access to TWAI CAN GPIOs and hardware UART lines.
- Operated control: No
- Sourcing plan: retail shopping search: ESP32-DevKitC ESP32-WROOM-32 development board
BECom ESP32-S3 Custom Board
- Identity: BECom ESP32-S3 Custom Battery Emulator Hardware Platform (referenced by HW_BECOM)
- Quantity needed: 1 (required when compiling for the BECom_330 environment)
- Footprint/package: Proprietary custom PCB (design files omitted from sources)
- Electrical constraints: ESP32-S3 microcontroller with 16 MB flash memory, 3.3 V logic; integrated CAN and RS485 communication circuitry
- Substitution latitude: Custom hardware design; replacement requires equivalent schematic and pin mapping matching the HW_BECOM firmware definitions.
- Operated control: No
- Sourcing plan: general web research: BECom ESP32-S3 Battery Emulator hardware schematic and files
Stark ESP32 Custom Board
- Identity: Stark ESP32 Custom Battery Emulator Hardware Platform (referenced by HW_STARK)
- Quantity needed: 1 (required when compiling for the stark_330 environment)
- Footprint/package: Proprietary custom PCB (design files omitted from sources)
- Electrical constraints: ESP32 microcontroller with 8 MB flash memory, 3.3 V logic; custom flash partition table (default_8MB.csv)
- Substitution latitude: Custom hardware design; replacement requires equivalent schematic and pin mapping matching the HW_STARK firmware definitions.
- Operated control: No
- Sourcing plan: general web research: Stark ESP32 Battery Emulator hardware design files
External CAN-FD Controller IC / Module (Microchip MCP2517FD / MCP2518FD)
- Identity: Microchip MCP2518FD-E/SL or MCP2517FD-H/SL standalone SPI CAN-FD controller (utilized by pierremolinaro/acan2517FD driver)
- Quantity needed: 1 (required when interfacing with CAN-FD battery packs such as Renault Zoe ZE50 or custom secondary CAN-FD channels)
- Footprint/package: SOIC-14 IC or modular SPI breakout board
- Electrical constraints: 3.3 V logic-level SPI interface compatible with ESP32/ESP32-S3; connects to high-speed CAN-FD differential bus (CANH/CANL) via CAN-FD transceiver
- Substitution latitude: Must be register-compatible with Microchip MCP2517FD or MCP2518FD as hardcoded in the acan2517FD driver library.
- Operated control: No
- Sourcing plan: distributor lookup (representative example — sources give spec only): MCP2518FD-E/SL
External CAN Controller IC / Module (Microchip MCP2515)
- Identity: Microchip MCP2515-I/SO standalone SPI CAN controller (referenced by TASK_ACAN2515_PRIORITY)
- Quantity needed: 1 (required when host board lacks dual onboard CAN transceivers and secondary CAN bus is needed)
- Footprint/package: SOIC-18 / SOIC-14 or standard commercial 8-pin/10-pin SPI breakout module with onboard crystal (8 MHz or 16 MHz) and transceiver
- Electrical constraints: 3.3 V SPI logic interface to ESP32; transceiver portion requires 5 V DC or dedicated 3.3 V CAN transceiver; CANH/CANL differential bus lines
- Substitution latitude: Must be an authentic Microchip MCP2515 controller supported by the acan2515 driver library.
- Operated control: No
- Sourcing plan: distributor lookup (representative example — sources give spec only): MCP2515-I/SO
Addressable RGB Status LED (WS2812B / NeoPixel)
- Identity: Worldsemi WS2812B or SK6812 intelligent control RGB LED (referenced by adafruit/Adafruit_NeoPixel dependency)
- Quantity needed: 1
- Footprint/package: SMD 5050 package (5.0 mm x 5.0 mm) or onboard LED indicator
- Electrical constraints: 3.3 V to 5 V DC supply; single-line NRZ serial data input driven by ESP32 3.3 V GPIO
- Substitution latitude: Any WS2812B, WS2813, or SK6812 compatible 800 kHz single-wire addressable RGB LED.
- Operated control: No
- Sourcing plan: distributor lookup (representative example — sources give spec only): WS2812B-B
MicroSD Memory Card
- Identity: Generic MicroSD / TransFlash memory card (FAT32 formatted, capacity 4 GB to 32 GB)
- Quantity needed: 1 (required for data logging on lilygo_330 and dfrobot_edge101_330 environments with -D SDCARD enabled)
- Footprint/package: Standard MicroSD card format (15 mm x 11 mm x 1 mm)
- Electrical constraints: 3.3 V supply, SPI / SDMMC bus communication
- Substitution latitude: Any standard Class 10 / UHS-1 MicroSD card formatted to FAT32.
- Operated control: No
- Sourcing plan: retail shopping search: MicroSD card 16GB Class 10 FAT32
Low-Voltage Auxiliary DC Power Supply
- Identity: Regulated AC/DC or DC/DC auxiliary power supply (described in installation guidelines as low voltage power supply for Battery Emulator hardware)
- Quantity needed: 1
- Footprint/package: Standalone enclosed module, DIN-rail mount power supply, or DC barrel-jack plug adapter
- Electrical constraints: Output 5 V DC (for DevKit USB power) or 12 V / 24 V DC (for industrial boards with terminal blocks); power rating ≥ 10 W
- Substitution latitude: Any regulated DC power supply capable of supplying the operating voltage range of the chosen hardware board.
- Operated control: No
- Sourcing plan: retail shopping search: 12V 1A DIN rail power supply
High-Voltage DC Traction Interconnect Cabling
- Identity: High-voltage DC automotive/photovoltaic power cable pair (positive and negative) connecting the EV battery terminals to the solar storage hybrid inverter
- Quantity needed: 1 set
- Footprint/package: Flexible stranded copper conductors with double/reinforced insulation (typically 16 mm² to 35 mm² / 4 AWG to 2 AWG) terminating in heavy-duty compression lugs or high-voltage touch-safe connectors
- Electrical constraints: Voltage rating ≥ 600 V DC (nominal battery pack voltage 300 V to 450 V DC); current rating ≥ 50 A to 125 A continuous depending on inverter capacity
- Substitution latitude: Must meet local national electrical codes for stationary energy storage systems and high-voltage DC installations.
- Operated control: No
- Sourcing plan: retail shopping search: 25mm2 4 AWG 1000V orange EV high voltage battery cable
EV Battery Contactor Relay Interface Circuit
- Identity: Contactor driver / relay interface module (required to execute the closing contactors sequence to switch on the EV battery pack)
- Quantity needed: 1 module (2 to 3 channels: positive contactor, negative contactor, pre-charge contactor)
- Footprint/package: Multi-channel relay module or MOSFET switching board with optocoupled inputs
- Electrical constraints: Control input driven by ESP32 3.3 V GPIO; contacts/outputs rated to switch the EV battery pack's 12 V DC contactor coils at 1 A to 4 A inrush current
- Substitution latitude: Any multi-channel relay module or automotive contactor driver circuit capable of triggering 12 V coils from 3.3 V microcontroller logic.
- Operated control: No
- Sourcing plan: retail shopping search: 4-channel 5V optocoupled relay module
Software and network dependencies
- PlatformIO Espressif32 Platform: pioarduino platform-espressif32 toolchain bundle. Source repository URL: https://github.com/pioarduino/platform-espressif32/releases/download/55.03.311/platform-espressif32.zip. Version: 55.03.311. Where version came from: pinned in platformio.ini. Check plan: not checkable: vendor platform release archive without standardized vulnerability database entry.
- Arduino Core for ESP32: Espressif Arduino framework bundled within platform-espressif32. Source: Espressif systems / pioarduino framework-arduinoespressif32. Version: not stated. Where version came from: not stated (managed transitively by platform-espressif32 version 55.03.311). Check plan: not checkable: version not stated.
- Pre-build script tools/identify_build.py: Local Python script referenced in platformio.ini under extra_scripts = pre:tools/identify_build.py. Version: not stated. Where version came from: not stated. Check plan: not checkable: omitted local script.
- Adafruit_NeoPixel Library: adafruit/Adafruit_NeoPixel (LGPL-3.0) for status RGB LED control. Source: https://github.com/adafruit/Adafruit_NeoPixel. Version: not stated. Where version came from: not stated (referenced in README.md; lib_deps is unpinned in platformio.ini). Check plan: not checkable: unpinned version with no C++/Arduino library CVE database.
- ElegantOTA Library: ayushsharma82/ElegantOTA (AGPL-3.0) for web-based over-the-air firmware updates. Source: https://github.com/ayushsharma82/ElegantOTA. Version: not stated. Where version came from: not stated (referenced in README.md; lib_deps is unpinned in platformio.ini). Check plan: not checkable: unpinned version with no C++/Arduino library CVE database.
- ArduinoJson Library: bblanchon/ArduinoJson (MIT) for configuration parsing and serialization. Source: https://github.com/bblanchon/ArduinoJson. Version: not stated. Where version came from: not stated (referenced in README.md; lib_deps is unpinned in platformio.ini). Check plan: not checkable: unpinned version with no C++/Arduino library CVE database.
- eModbus Library: eModbus/eModbus (MIT) for RS485 and Modbus RTU inverter communication. Source: https://github.com/eModbus/eModbus. Version: not stated. Where version came from: not stated (referenced in README.md; lib_deps is unpinned in platformio.ini). Check plan: not checkable: unpinned version with no C++/Arduino library CVE database.
- AsyncTCP Library: ESP32Async/AsyncTCP (LGPL-3.0) for asynchronous TCP networking layer. Source: https://github.com/ESP32Async/AsyncTCP. Version: not stated. Where version came from: not stated (referenced in README.md; stack size set to 4096 bytes in system_settings.h; lib_deps is unpinned in platformio.ini). Check plan: not checkable: unpinned version with no C++/Arduino library CVE database.
- ESPAsyncWebServer Library: ESP32Async/ESPAsyncWebServer (LGPL-3.0) for embedded web configuration interface. Source: https://github.com/ESP32Async/ESPAsyncWebServer. Version: not stated. Where version came from: not stated (referenced in README.md; lib_deps is unpinned in platformio.ini). Check plan: not checkable: unpinned version with no C++/Arduino library CVE database.
- acan-esp32 Library: pierremolinaro/acan-esp32 (MIT) for ESP32 internal TWAI CAN bus controller peripheral driver. Source: https://github.com/pierremolinaro/acan-esp32. Version: not stated. Where version came from: not stated (referenced in README.md; lib_deps is unpinned in platformio.ini). Check plan: not checkable: unpinned version with no C++/Arduino library CVE database.
- acan2517FD Library: pierremolinaro/acan2517FD (MIT) for Microchip MCP2517FD / MCP2518FD SPI CAN-FD controller driver. Source: https://github.com/pierremolinaro/acan2517FD. Version: not stated. Where version came from: not stated (referenced in README.md; lib_deps is unpinned in platformio.ini). Check plan: not checkable: unpinned version with no C++/Arduino library CVE database.
Version pinning status across the project: In platformio.ini, the base platform package is strictly pinned to a specific release archive URL (platform-espressif32 version 55.03.311). However, all runtime firmware C++ libraries (Adafruit_NeoPixel, ElegantOTA, ArduinoJson, eModbus, AsyncTCP, ESPAsyncWebServer, acan-esp32, acan2517FD) are completely unpinned: platformio.ini contains blank lib_deps declarations under common_esp32 and common_esp32s3, and README.md lists them with repository links but specifies no version numbers, release tags, or commit hashes. The pre-build script tools/identify_build.py, custom SDK configuration sdkconfig.be_size.defaults, and partition CSV files (min_spiffs.csv, default_8MB.csv, default_16MB.csv) are referenced in platformio.ini but missing from the repository upload.
Manifest location: The primary configuration manifest is platformio.ini located in the project root directory.
Network exposure:
- Wi-Fi Access Point / Station: The device establishes an 802.11 b/g/n Wi-Fi Access Point (AP) for initial setup and optionally connects to a local home Wi-Fi station network (README.md: Connect your board to your home Wifi).
- Default Wi-Fi AP SSID: Battery-Emulator (stated in README.md: connect to the wireless network (Battery-Emulator , password: 123456789)).
- Default Wi-Fi AP Password: 123456789 (stated in README.md).
- Web Configuration Server: Embedded HTTP web server running on ESPAsyncWebServer (README.md: Go to setup page and configure component selection). The listening TCP port is not explicitly stated in the sources, but standard HTTP defaults to port 80.
- Web OTA Service: Over-The-Air firmware update endpoint provided by ElegantOTA on the HTTP web interface.
- TCP Networking: Asynchronous TCP stack configured with 4096-byte stack allocation (CONFIG_ASYNC_TCP_STACK_SIZE in system_settings.h) and priority 3 (TASK_CONNECTIVITY_PRIO).
- MQTT Client: RTOS task assigned priority 2 (TASK_MQTT_PRIO in system_settings.h) for telemetry and control. Broker port and default credentials are not stated in the sources.
- Browser-based Installation Web App: External browser-based web installer interface accessed via https://dalathegreat.github.io/BE-Web-Installer/ (stated in README.md).
Remaining temporal dependencies
External Protocol Documentation and Upstream Research URLs: The firmware protocol translation engines rely on reverse-engineered CAN and RS485 message definitions maintained in external online repositories and forum threads:
- Fronius Symo GEN24 and BYD battery protocol: https://gitlab.com/pelle8/inverter_resources and https://github.com/burra/byd_battery
- Tesla BMS V2 protocol: https://github.com/flodorn/TeslaBMSV2
- Nissan LEAF CAN bus database: https://github.com/dalathegreat/leaf_can_bus_messages
- SolaX inverter CAN protocol: https://github.com/rand12345/solax_can_bus
- SMA inverter and BMW i3 BMS CAN protocol: https://github.com/Tom-evnut/BMWI3BMS/
- FoxESS CAN protocol: https://github.com/FozzieUK/FoxESS-Canbus-Protocol
- Hyundai Santa Fe PHEV battery CAN protocol: https://github.com/maciek16c/hyundai-santa-fe-phev-battery
- Renault Zoe PH2 ZE50 LBC CAN bus: https://github.com/ljames28/Renault-Zoe-PH2-ZE50-Canbus-LBC-Information and Google Docs spreadsheet link documented in README.md
- Pylontech SC0500 protocol reverse-engineering thread: EEVBlog forum thread link documented in README.md
- Open Vehicle Monitoring System: https://github.com/openvehicles/Open-Vehicle-Monitoring-System-3
- Project documentation wiki: https://dalathegreat.github.io/Battery-Emulator-Wiki/
Fabrication: The primary deployment paths utilize commercial off-the-shelf development boards (LilyGO T-CAN485, Waveshare ESP32-S3-RS485-CAN, LilyGO T-2CAN, DFRobot Edge101, or ESP32 DevKit), requiring no custom PCB manufacturing. Two custom hardware targets are defined in platformio.ini: BECom (HW_BECOM, an ESP32-S3 platform) and Stark (HW_STARK, an ESP32 platform with 8 MB flash). However, no PCB design files (Gerbers, drill files, layer stacks, or dimensional drawings) are included in the repository upload. If fabricating custom hardware, layer count, copper weight, and board outline must be determined from future releases of the BECom and Stark hardware CAD files.