Tip
Not sure which YAML to choose ? ... YamBMS_Remote_Packages_example.yaml
is a good basis for creating your custom YAML.
Examples of BMS and Shunt packages can be found in the examples folder.
You don't have to import a shunt but you must import at least one BMS.
You can mix different BMS models, the only condition is that the bms_id are numbered in order starting from 1 !
Important
The most important thing for proper functioning of YamBMS is that the voltage of your BMS is well calibrated.
YamBMS logic is based on the min_cell_voltage and max_cell_voltage voltages of your BMS.
If you use YamBMS, the internal charging logic of the JK-PB BMS will not be used.
Please read the documentation and the setup instructions.
| ESPHome application to monitor BMS and communicate with inverters supporting CAN bus protocol compatible with Pylontech, GoodWe, SMA, Victron or Luxpower (EG4). |
![]() |
|---|---|
| Note: Pylontech uses 15S/48V and many others uses 16S/51.2V ! Other battery profiles that utilise the PYLON protocol with different cell countsmay also work, e.g. Alpha Ess Smile, BYD Battery-Box LV Flex Lite. Select the correct battery profile in the inverter to match your battery pack ! The ESP32 communicates with the BMS using the BLE / UART / RS485protocol and then sends the CAN bus frames to the inverter via the CAN bus transceiver. |
![]() |
Sends over CAN bus to inverter:
- Battery Voltage
- Battery Current (+charge, -discharge)
- State of Charge (SoC)
SoC 100% will be sent to your inverter only when the battery is fully charged - State of Health (SoH)
- Max cell V. and ID
- Min cell V. and ID
- BMS temperature
- Charging voltage
- Charging max amps
- Discharge min voltage
- Discharge max amps
- Battery name
- Alarms: Cell over/under voltage, Charge/discharge over current, High/low Temp, BMS fault
Note: this code support multi-BMS and multi-shunt connection per inverter with a single ESP32 and should work with inverters that support the CAN bus protocol PYLON, SMA, Victron or LuxPower (EG4). I'm only testing it with my Deye SUN-6K-SG03-LP1-EU inverter.
This project is still in development and testing...
Dedicated topic on DIY Solar Forum
- Supported devices
- YamBMS behavior
- YamBMS functions
- Charging logic
- CAN bus protocol
- Hardware and schematic instructions
- Installation procedure
- Troubleshooting
You install YamBMS on a single ESP32 connected to your BMS and your inverter.
- Max 3x BMS BLE
- Max 3x BMS UART
- several RS485 BMS on the same bus
Each BMS/Shunt turns into a modbus server with its own address.
Important
The max number of UART BMS/Shunt per ESP32 is 2 (unless you use a UART expander) because you need to keep the last UART for the RS485 network.
The max number of BLE BMS/Shunt per ESP32 is 2, ESP32-S3 / AtomS3 can supervise 3 BLE devices.
YamBMS installs on node1 as a modbus client to collect information from all your BMS.
The node1 is also connected to your inverter via the CAN bus.
The BMS/Shunt are connected to other ESP32 nodes connected on a dedicated RS485 bus for YamBMS. Each BMS/Shunt becomes a modbus server.
The theoretical limit is 256 modbus server (BMS/Shunt) per RS485 bus but in reality this will depend on the capabilities of node1 (YamBMS) which will have to combine all the BMS/Shunt together.
You can find more information about creating your YAML in this How To.
Tip
If you have a lot of BMS/Shunt to combine, using an ESP32-S3 or AtomS3 for node1 is recommended.
You can simply test the application with a generic ESP32 without compiling and connecting anything on your ESP32.
The DEMO firmware is composed of 3x BMS and 1x Shunt (fake) for a 48V LFP system.
Important
YamBMS_DEMO_ESP32.factory.bin is intended for a generic ESP32, does not work with ESP32-S3.
If you want to test YamBMS DEMO with another board you need to compile the firmware with the YamBMS_RP_DEMO.yaml.
- Download YamBMS_DEMO_ESP32.factory.bin
- Follow the procedure explained in this document.
If you want to add a CAN transceiver on this DEMO board here are the GPIOs to connect it to :
tx_pin: 23 # to CAN board CTX
rx_pin: 22 # to CAN board CRX (with 4.7K resistor except for SN65HVD230)- ESPHome 2025.6.0 or higher
- ESP32 MCU (buying a board with ≥8MB flash is advised if you intend to monitor multiple BMS)
- CAN transceiver (only with TJA1050/TJA1051 => 4.7K resistor for 5V to 3V3 level shifing)
- BMS JK, JBD, Seplos (other BMS brands already integrated with ESPhome can be added easily)
- Inverters supporting CAN PYLON/GoodWe/SMA/Victron Low Voltage protocol
- Optional: 48V to 5V DC-DC converter to power the ESP32 from the JK-BMS VBAT pin (URB4805YMD-10WR3 or VRB4805S-6WR3)
- Optional: JK RS485 adaptor and RS485 to TTL 3V3 adaptor (see schematic section)
Note
For your information, in June 2025 there were 100 YamBMS users.
If the ESP32 has an internet connection, the following data is sent to this script for statistics collection. Only @Sleeper85 have access to this information for the production of statistics, the support and the update service.
- ESP32 MAC address
- YamBMS version
- Board chip
- Board name
- BMS model
- BMS count
- CAN bus name
- CAN bus protocol
- Uptime
- Current date and time
- YamBMS 1.5.8 :
- New Dashboards
1.5.8compatible withCANBUSandRS485inverter communication protocol - Added BMS
SEPLOS V3(beta) - Added YamBMS
Web Server v3 - Added
WiFi AP WiFi APandWeb Servercredentials centralized insecrets.yaml- Added
WT32-ETH01board - Fixed issue 8 ETH01-EVO board - Davicom DM9051 SPI Ethernet Controller is now integrated in esphome
2025.7 - Fixed issue 24 [JK-PB] SoC never reaches 100%
- Fixed issue 63 [JK RS485 component] Fix ._SCHEMA deprecations
- Merged PR 67 Add options to restrict max. charge and discharge current
- Merged PR 72 Add Pylontech RS485 inverter protocol
- Merged PR 74
PYLON RS485link status, Heartbeat and Requested Force Charge - Merged PR 75 Round
Auto CCL/Auto DCLvalues - Merged PR 77
PYLON RS485prevent stale data on BMS disconnect - Merged PR 80 BMS Modbus client: Return 0 when not online
- Merged PR 81 Fix balance trigger voltage for Basen and Deye
- New Dashboards
- YamBMS 1.5.7 :
- Adapted the default
min/maxvalues for theFloatslider - Merged PR 53 Add feature
Auto Float Voltage - New dashboard for
Auto Float Voltagefunction - Defining
state_classfor all YamBMS sensors - Set esphome
min_versionto2025.6.0 - Fixed: change
Charge StatustoBulkwhenForce Chargeis requested - Merged PR 70 Dashboards compatible with
HA 2025.7 - Merged PR 70 Dashboard
max/mincell voltage in color using macro - Removed all special characters in entities name + dashboards correction
- Adapted the default
- YamBMS 1.5.6 :
- Fixed issue 58 Compilation problem with
esphome 2025.5.0 - Fixed issue 55 New CPU frequency option
- Fixed issue 65 JBD Circular dependency error
- Fixed issue 35 BMS Charging Cycles Offset
- Merged PR 51 Support for RP2040 RPi Pico
- Merged PR 56 Add support for Basengreen BMS
- Merged PR 60 Fixes for new ESPHome and add of BMS Cycle Count offset
- Merged PR 61 Set Modbus BMS values to 0 when BMS goes offline
- New
board_ESP32-S3_Touch-LCD-4.3.yamlboard - New
board_ESP32-S3_Touch-LCD-7.yamlboard - New
board_ESP32-S3_YBoard_DJK.yamlboard - New
board_RP2040_RPi_Pico.yamlboard
- Fixed issue 58 Compilation problem with
- YamBMS 1.5.5 :
- New
main.yamlwith LP (local packages) and RP (remote packages) versions - New
board.yamlwith modular UART/CAN interfaces - The name of the JK
bms.yamlis no longer linked to a specific model - SoC calculation is now based on remaining capacity for more accuracy (BMS only) issues #39
- SoH calculation is moved to BMS level (for those who do not provide this information)
- Improvement of the Victron SmartShunt doc issues #38
- New
- YamBMS 1.5.4 :
- New low SoC corrected at each BMS level (the corrected SoC is the one transmitted to YamBMS)
- New BMS dashboard
- New end of charge logic at each BMS level, the charge switch turns off when the cells are equalized (disabled by default)
- Fixed
errors_bitamskfor JK-PB RS485, test OK with YamBMS (forked component)
- YamBMS 1.5.3 :
- Broadcasting JK-PB settings to all BMS set to OFF by default
- Reorganizing the
boardfolder and YAMLs (device_base.yaml moved to board.yaml) device_base.yamlshould no longer be part ofYamBMS_main.yaml- New
RGB LED statuslight effects (red, green, blue, cyan) as anoptionspackages forboard.yaml - Increased CPU frequency to
240Mhzas anoptionspackages forboard.yaml - Added
ESP32 Generic,LilyGo T-CAN485,LilyGo T-ConnectandXIAOboards - Fixed SoC logic (low SoC will be detected at BMS level and no longer at YamBMS level)
- Simplified combination logic (removal of the combine switch) + dashboard update
- Check
Battery Capacityis> 0before combining info (see issue #14) - Improved alarm logic with a common
YamBMS errors bitmaskfor all BMS models (see OTP vs UTP bug reported by @ChrisG) - Added PR #7547 regarding publishing entities via the API
- Removed
captive_portalbecause it increases theloop timetoo much PSRAMwill no longer be enabled by default as this has a bad impact onBLE BMS
- YamBMS 1.5.2 :
- Added shunt
Online Statusbinary_sensor - Shunt combine condition based on the new binary_sensor
Online Status - Logger
baud_rate: 0by default (frees the 3rd UART and avoids some bugs like "WK2168 with canbus" or "BLE client with RS485 modbus") - Changed names of
bmsandshuntYAMLs for modbusmulti-nodesolution - Added shared configuration file to simplify main YAML (centralization of parameters)
- Simplification (fewer options) when importing
BMS / ShuntYAMLs - New
multi-nodesolution usingRS485 modbusto communicate information to YamBMS - New board
espBerrywith2-CH-CAN HAT
- Added shunt
- YamBMS 1.5.1 :
- The conditions for
combiningBMS and thecharginganddischarginginstructions no longer have any relation with theerrors_bitmasksensor, the new system relies on the three binary_sensoronline status,charging allowedanddischarging allowedbeing linked to the status of alarms and switches. - The BMS combination procedure has been completely rewritten.
- Improved structure and ID names of
bms.yaml. - The
yambms.yamlandyambms_combine.yamlglobal variable names have been changed for better code reading. - Improved code regarding the CAN bus
esp_lightstatus for boards without integrated LED. - New
Atom S3Rboard andSmartshunt BLEshunt. - New
JBD,Seplos V1 V2,JK-B RS485(display port) andFAKEBMS. - New
YamBMS DEMOYAML and firmware offered to test and discover howYamBMSworks. - New management of temperature sensors (no longer limited to two sensors).
- @Der_Hannes fixed the AtomS3
black screenissue (with esphome > 2024.7.3) and developed new code for display management based on the ili9xxx platform. Auto CCL/DCLfunctions have been fixed to work withJK-PBandnew JK-BBMS, see this issue.- The
UVPRandOVPRsensors are no longer used and replaced byUVPandOVPto ensure operation with all BMS. - @txubelaxu fixed a bug in the
JK-PB RS485component that could cause a false battery voltage value to be sent, see this issue. - Improved documentation, added a
HowToto create its main YAML, warning about galvanic isolation.
- The conditions for
- CANBUS 2.3.7 : If there is no response from the inverter, the time before a new communication test has been reduced from
120sto60s, added Victron0x372nbr. of modulesblocking charge/discharge. - YamBMS 1.4.5 : Changed the way to configure WiFi/Ethernet network, added
ESP32-C3 ETH01-EVOethernet board, reduction of the number of YAML bms files, UARTrx_buffer_sizeis set to512by default for JK-B and JK-PB, new JK-BMS BLE sensors (last commits of @syssi) and new BLEstandardversion - CANBUS 2.3.6 : Sending CAN frames stops immediately if there are no combined BMS
- YamBMS 1.4.4 : Multi-shunt support, Simplified and new YamBMS option
battery chemistry, slidermin/maxvalues are automatically configured based on the battery chemistry and cell count, addedYamBMS Fallback Hotspot, added YamBMSUpdate service, added PVbrain2 and Atom Matrix board, added PSRAM settings YAML (not enabled by default), new MIN/MAX temperature sensor, added DC current icon, fixed dual sensorCell UVPR (MAX)bug, Improvedcombinecode, Breaking change : Atom S3GPIOs 1 and 2reversed - CANBUS 2.3.5 : New MIN/MAX temperature / sensor ID, Improved Victron protocol (online/offline battery modules, installed/available battery capacity)
- CANBUS 2.3.4 : Fixed bug of canbus link validation without inverter connected
- YamBMS 1.4.3 : Added Victron and Junctek KH-F
Shuntsupport andRequested Force Chargefunction based onSoC start/stop, newTotal Daily Energysensors - CANBUS 2.3.3 : Added
AutomaticBMS name selection andRequested Force ChargeBit 3/4/5 (PYLON 0x35C) - CANBUS 2.3.2 : Added
LuxPowerprotocol with updatedcan_id0x355, 0x356, 0x359 and 0x35C - CANBUS 2.3.1 : Improved the procedure for sending canbus frames with reduced loop time, rewritten of the canbus link validation code and added
Inverter Heartbeat Monitoringfunction - YamBMS 1.4.2 : Added new
Auto CVL Boost V.andRebulk SoCfunctions, new debug.yaml for ESP32 and ESP32-S3, improved code and comments - YamBMS 1.4.1 : Rewriting of the alarm system, bug fixes and improvement of the charging logic (new status
Cut-Off), icon allocation for each sensor, UART and CANBUS!extend ${vars}, New sensorYamBMS Delta Cell V., ImprovedBattery SOClogic - YamBMS 1.3.2 : New var
yambms_cell_count, the BMS charge or discharge switches can be activated separately without causing the decombination of the BMS, newminimalversion of the BMS YAML in order to reduce the loop time - YamBMS 1.3.1 : First multi-BMS version named
YamBMS
- Thanks to @syssi for help and making many BMS components (JK, JBD, Seplos, Pace, etc.)
- Thanks to @txubelaxu for help and making the
JK-PB RS485component. - Thanks to @uksa007 for making the original CANBUS code.




