Adapter for Sigenergy solar energy systems via Modbus TCP/RTU
Supports the Sigenergy Modbus Protocol V2.5 (released 2025-02-19).
- 📡 Modbus TCP (Ethernet / WLAN / Optical fiber / 4G) — Port 502
- 🔗 Modbus RTU (RS485 Serial)
- ⚡ Full register support — All plant and inverter registers per V2.5 spec
- 🔋 Battery statistics — Time to full, time remaining, daily coverage
- ☀️ PV statistics — Self-consumption rate, autarky rate
- 🔌 AC Charger (Sigen EVAC) — Optional
- ⚡ DC Charger — Optional
- 📊 Calculated values — Derived statistics updated each poll cycle
- 🖥️ VIS Widgets — Energy flow, battery status, statistics panels
| Category | Models |
|---|---|
| Hybrid Inv. | SigenStor EC SP/TP, Sigen Hybrid SP/TP/TPLV, Sigen PV M1-HYA, PG Controller |
| PV Inv. | Sigen PV Max SP/TP, Sigen PV M1 |
| EVAC (AC) | Sigen EVAC 7/11/22 kW, PG EVAC |
| Device | Address |
|---|---|
| Plant (read/write) | 247 |
| Plant broadcast (write, no reply) | 0 |
| Inverter | 1 |
| AC Charger (EVAC) | 2 |
- Connection Type: TCP (Ethernet) or Serial (RS485)
- TCP Host: IP address of your inverter
- TCP Port: 502 (default)
- Plant Modbus ID: 247 (default)
- Inverter Modbus ID: 1 (default)
Select which devices are installed:
- Battery / ESS
- PV Panels
- AC Charger (EVAC)
- DC Charger
Choose which statistical values to calculate:
- Battery time to full
- Battery time remaining
- Daily charge time
- Battery coverage time
- Self-consumption rate
- Autarky rate
| State | Description | Unit |
|---|---|---|
plant.gridActivePower |
Grid power (>0 import, <0 export) | kW |
plant.pvPower |
PV generation | kW |
plant.essPower |
Battery power (<0 discharge) | kW |
plant.essSoc |
Battery state of charge | % |
plant.activePower |
Total plant active power | kW |
plant.runningState |
Plant state (0=Standby, 1=Running...) | - |
| State | Description | Unit |
|---|---|---|
inverter.pvPower |
PV power at inverter | kW |
inverter.essBatterySoc |
Battery SOC | % |
inverter.essBatterySoh |
Battery SOH | % |
inverter.essBatteryTemperature |
Battery temperature | °C |
inverter.phaseAVoltage |
Phase A voltage | V |
inverter.gridFrequency |
Grid frequency | Hz |
| State | Description | Unit |
|---|---|---|
statistics.batteryTimeToFull |
Minutes until battery full | min |
statistics.batteryTimeRemaining |
Minutes of battery left | min |
statistics.selfConsumptionRate |
Self-consumption rate | % |
statistics.autarkyRate |
Autarky rate | % |
statistics.housePower |
Calculated house consumption | kW |
Note: All 7 widgets are provided by the separate ioBroker.vis-2-widgets-sigenergy adapter. Install it alongside this adapter to use the widgets in VIS-2.
Shows animated energy flow between PV → Battery ↔ Grid → House.
Displays SOC bar, SOH badge, time to full/empty, current power.
Live reading of all four power flows.
Today's autarky, self-consumption, SOC min/max, battery coverage time.
Live inverter data: PV power, grid frequency, phase voltages, temperature.
Status and power readings for the Sigen EVAC charging station.
Status and power readings for the DC charger.
- Modbus TCP: TCP mode, full duplex, port 502 (slave)
- Modbus RTU: Half duplex, 9600 bps, 8N1
- Min poll interval: 1000 ms (1 second) per Sigenergy spec
- Timeout: 1000 ms per Sigenergy spec
MIT License — Copyright (c) 2025 ioBroker Community
- Update Dependencies modbus-serial -> 8.0.25
- Remove README.md ## Installation section (S6014); standard ioBroker installation via Admin is the default
- Remove npm-token from workflow (W3019); use Trusted Publishing for npm releases instead
- Add npm-token to test-and-release.yml for npm publish authentication
- Add npm-token to test-and-release.yml workflow for npm publish authentication
- Add comprehensive debug logging: config on startup, FC03/FC04 requests and responses, per-state decoded values, poll cycle timing per component, SigenMicro device details
- Remove adminTab navigation entry; all configuration including SigenMicro scan remains in the instance configuration dialog
- Add test/unit and test/integration directories with basic tests; fixes CI error "No test files found"
- Add test:unit and test:integration scripts to package.json
- Fix all remaining lint errors: sigenMicroRegisters qty tab indent, statistics.js arrow parens, main.js ternary line breaks and @type comment; zero lint errors
- Fix all remaining prettier/eslint errors: wrap lines >120 chars, fix arrow parens in all files, ensure zero lint errors
- Fix remaining ESLint errors: arrow function parens, long string line breaks, sendTo call formatting, mocha globals in test files, JSDoc alignment, remove .prettierrc conflict
- Fix remaining ESLint errors: add parens to all single-param arrow functions; fix eslint.config.mjs formatting; add mocha globals for test files; add prettier.config.mjs
- Fix all ESLint errors: convert spaces to tabs (prettier), add curly braces after if conditions, fix unused variables, fix empty catch blocks, update JSDoc
- Fix W5022: empty words.js (jsonConfig adapters must not use systemDictionary); migrate i18n files from LANG/translations.json to flat LANG.json (preferred by adapter-dev)
- Restore i18n:true with admin/i18n/ files (W5022 compliance); revert inline multilingual objects to string keys per ioBroker best practice
- fixed
- Fix translations: replace i18n:true file-based lookup with inline multilingual label objects in jsonConfig.json and sigenmicro-tab.json; guaranteed to work in all Admin 7 contexts
- Fix i18n in sigenmicro-tab.json: change type from panel to tabs so that i18n:true is respected by Admin 7; panel type ignores i18n, only tabs type activates translation lookup
- Fix language detection: rebuild words.js with all 97 i18n keys (11 languages); add class=translate to all UI strings in admin/index.html; call translateAll() on load
- Add i18n translations for all SigenMicro admin texts (21 new keys in 11 languages); set i18n:true in sigenmicro-tab.json
- Replace HTML adminTab iframe with native jsonConfig tab (sigenmicro-tab.json); use type:state to show live scan progress (info.scanProgress state) directly in admin 7 React UI without any custom JavaScript
- Fix scan progress display: replace all CSS-variable-dependent elements with a single always-visible log box using hardcoded colors; each chunk callback updates text immediately
- Fix scan: restore proven chunked sendTo approach (3 IDs per call); add dual progress display: direct text update per chunk + getState polling from info.scanProgress state
- Fix scan progress: replace unreliable subscribeState with setInterval+getState polling (500ms); extend safety timer to 2s per ID; dedicated _sendToAdapterRaw bypasses old 30s limit
- Fix scan progress display: use ioBroker state subscription (info.scanProgress) instead of sendTo chunks; adapter writes progress per ID, admin page subscribes via socket.subscribeState for real-time updates
- Replace invisible progress bar with plain text status line showing percentage and current ID range
- Fix SigenMicro scan (root causes): reuse existing Modbus connection instead of opening a second TCP socket (device allows only one); pause polling during scan; fix duplicate scan start
- Fix SigenMicro scan progress visibility: replace all CSS-class show/hide with direct element.style.display; reduce probe timeout to 1000ms; chunk size 3 for frequent bar updates
- Fix SigenMicro scan progress: use max-height CSS transition + shimmer animation (no display:none conflicts); use requestAnimationFrame for reliable repaint between chunks
- Fix SigenMicro scan tab: progress bar now visible; reserved IDs (Plant/Inverter/Charger) shown and auto-skipped; "no devices found" message always displayed
- Add SigenMicro scan button directly in the jsonConfig admin tab; scan auto-saves discovered devices and shows a result summary
- SigenMicro scan tab: prominent scan button, real-time chunked progress bar showing current ID range and live device count
- Add SigenMicro micro-inverter support: Modbus scan, device discovery, per-device enable/disable, dedicated admin tab
- Fixes / Cleaning
- Revert eslint/@eslint/js to 9.x (peer conflict with @iobroker/eslint-config@2.2.0); bump serialport to 13.0.0
- Bump eslint to 10.0.3, @eslint/js to 10.0.1, serialport to 13.0.0
- Remove mocha from devDependencies (bundled in @iobroker/testing)
- Restore mocha devDependency and fix test:package script
- Fix indentation of setTimeout in testConnection Promise
- Fix last two lint errors: collapse setTimeout in testConnection, use bare catch in _getSerialPorts
- Fix all ESLint/Prettier errors: add JSDoc to all methods, fix formatting, remove unused imports
- Fix curly-rule regression in modbus.js, statistics.js, main.js
- Fix Prettier: add missing trailing commas in registers.js constant objects
- Fix Prettier: expand inline register objects to multi-line format
- Added documentation in README.md - multilingual
- Add missing uk/zh-cn translations to io-package.json news
- Remove redundant mocha devDependency (included in @iobroker/testing)
- Fix Prettier/ESLint formatting: use tabs, single quotes, curly braces
- (ssbingo) Fix CI: use explicit mocha binary path to avoid PATH resolution issues with npm ci
- (ssbingo) Fix CI: add mocha to devDependencies so test:package script can run
- (ssbingo) Fix duplicate @param JSDoc warning caused by missing closing tag in modbus.js
- (ssbingo) Code quality fixes: unused variables removed, JSDoc documentation completed, lexical declaration in switch-case fixed
- (ssbingo) Multilingual documentation updated
- (ssbingo) fixes
- (ssbingo) Added multilingual documentation to README.md
- (ssbingo) fixes for AdapterCheck
- (ssbingo) fixes
- (ssbingo) fixes
- (ssbingo) Updated StatisticsCalculator: re-added battery time estimations, daily charge time and battery coverage tracking
- (ssbingo) Replaced StatisticsCalculator with improved version: smoothed house power, corrected autarky and self-consumption formulas
- (ssbingo) Corrected author information in package.json; cleaned up news entries in io-package.json
- (ssbingo) Improved logging: added debug/info/warn/error messages for connection lifecycle, poll cycles, register reads and adapter shutdown
- (ssbingo) Added release script to package.json
- (ssbingo) Updated .releaseconfig.json: added manual-review plugin, removed before_commit hook
- (ssbingo) Updated README: corrected VIS widget adapter name and link, added missing widget descriptions
- (ssbingo) Fixed adapter-checker warnings and errors (news cleanup, deprecated fields)
- (ssbingo) Fixed missing responsive size attributes in jsonConfig
- (ssbingo) Fixed adapter-checker warnings and errors (news cleanup, deprecated fields)
- (ssbingo) Migrated admin UI from legacy HTML to jsonConfig (Admin 5+)
- (ssbingo) Removed index.html, index_m.html, words.js
- (ssbingo) Stable release: VIS-2 widgets moved to separate ioBroker.sigenergy-widgets adapter
- (ssbingo) Removed visWidgets and restartAdapters from io-package.json
- (ssbingo) Extracted VIS-2 widgets into separate ioBroker.sigenergy-widgets adapter
- (ssbingo) Fix VIS-1 liveview in vis-2: rewrite EJS templates to read vis.states[oid+'.val'] directly
- (ssbingo) Fix vis-2 liveview: components list must match getWidgetInfo() IDs (tpl-prefixed)
- (ssbingo) Fix vis-2 liveview: add window.visWidgets self-registration on module load
- (ssbingo) Fix vis-2 liveview: removed bundlerType:module, now registers via window.visWidgets
- (ssbingo) Fix vis-2 liveview: resolve VisRxWidget base class from shareScope (Module Federation)
- (ssbingo) Fix vis-2 liveview: get() now waits for window.visRxWidget before creating widget classes
- (ssbingo) Fix VIS-1 editor: removed non-standard EJS syntax; moved HTML into JS createXxx functions
- (ssbingo) Fix: remove DOCTYPE from widget HTML fragment
- (ssbingo) Fix VIS-1 widgets: correct vis.states access, add $div.data binding pattern
- (ssbingo) Stable release: VIS-2 widgets working — correct palette group, React from shareScope
- (ssbingo) Fixed: vis-2 widgets not appearing after adapter installation (
restartAdapters: ["vis-2"]added)
- (ssbingo) Version bump to 0.3.1
- (ssbingo) Fix VIS-2 widget labels: string keys instead of objects (resolves [object Object] in palette)
- (ssbingo) Update dependencies: adapter-core ^3.3.2, @iobroker/testing ^5.2.2
- (ssbingo) Fix repository URL to https://github.com/ssbingo/ioBroker.sigenergy.git
- (ssbingo) Remove duplicate common.license (licenseInformation already declared)
- (ssbingo) Fix io-package.json schema: connectionType, dataSource, js-controller/admin dependencies
- (ssbingo) Update @iobroker/adapter-core to ^3.3.2, @iobroker/testing to ^5.2.2
- (ssbingo) Fix VIS-2 widget labels: use string translation keys instead of objects to prevent [object Object] in palette
- (ssbingo) Add translations module (get('./translations')) for proper i18n support
- (ssbingo) Fix io-package.json: add licenseInformation, connectionType, dataSource, js-controller/admin dependencies
- (ssbingo) Update adapter-core to ^3.3.2, @iobroker/testing to ^5.2.2
- (ssbingo) VIS-2 Module Federation container interface: ES module with init()/get() exports
- (ssbingo) Switch to bundlerType: module for VIS-2 widget loading
- (ssbingo) Fix VIS-2 widget registration; classes properly inherit VisRxWidget
- (ssbingo) Fix VIS-2 widget palette: named export matches io-package.json key
- (ssbingo) Fix VIS-2 widget loading: bundlerType=module for ES module dynamic import
- (ssbingo) Fix VIS-1 widgets: OID attributes must start with "oid" for state auto-subscription
- (ssbingo) Fixed VIS-1/VIS-2 widget registration; fixed DEP0060 deprecation
- (ssbingo) Initial release — Modbus TCP/RTU support for Sigenergy systems