A cross-platform desktop application for monitoring Battery Management Systems (BMS) via CAN bus communication. Built with Tauri V2 and Svelte 5.
Real-time Dashboard
Alarm Monitoring
Debug Log
Multiple Connection Modes
Ecube BMS-PCS Communication Protocol V1.20
| Command | Description |
|---|---|
| 0x80 | Charge/discharge voltage and current limits |
| 0x81 | SOC, SOH, backup time |
| 0x82 | Battery output voltage and current |
| 0x83 | Cell voltage max/min with PACK/cell numbers |
| 0x84 | Temperature max/min with PACK/sensor numbers |
| 0x85 | Operation status |
| 0x86 | Accumulated charge/discharge times |
| 0x87 | Accumulated charge/discharge power (kWh) |
| 0x8F | BMS software version |
| 0xC0 | Alarm status (64-bit) |
| 0xD0 | Debug status code |
Download the latest release for your platform:
.msi or .exe installer.dmg (Intel & Apple Silicon).deb, .rpm, or .AppImageUbuntu/Debian:
sudo apt-get install libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf libudev-dev
macOS:
xcode-select --install
Windows:
# Clone repository
git clone https://github.com/TheerasakPing/bms-monitor.git
cd bms-monitor
# Install dependencies
npm install
# Run in development mode
npm run tauri dev
# Build for production
npm run tauri build
Tested with I+ Series USB-CAN adapters:
Frame format: 0xAA + type(1) + id(4) + len(1) + data(0-8) + checksum(1)
Add your user to the dialout group:
sudo usermod -a -G dialout $USER
# Log out and log back in
bms-monitor/
├── src/ # Svelte frontend
│ ├── lib/
│ │ ├── components/ # UI components
│ │ ├── stores/ # State management
│ │ └── types/ # TypeScript types
│ └── App.svelte # Main application
├── src-tauri/ # Rust backend
│ └── src/
│ ├── bms_types.rs # BMS data structures
│ ├── bms_parser.rs # Protocol parsing
│ ├── can_handler.rs # CAN communication
│ └── commands.rs # Tauri commands
└── .github/workflows/ # CI/CD
MIT License - see LICENSE file
Contributions are welcome! Please read our contributing guidelines before submitting PRs.