iobroker.sigenergy 3.3.0 → 3.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -0
- package/io-package.json +27 -1
- package/lib/modbus.js +31 -1
- package/main.js +9 -2
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -255,6 +255,15 @@ Status and power readings for the DC charger.
|
|
|
255
255
|
|
|
256
256
|
## Changelog
|
|
257
257
|
|
|
258
|
+
### 3.3.2 (2026-09-12)
|
|
259
|
+
- (ioBroker-Bot) chore: the CI test matrix now also covers Node.js 26 (22/24/26 on ubuntu, windows and macOS) — all three run green, so the adapter is ready for the October 2026 LTS
|
|
260
|
+
- (ssbingo) chore: `@iobroker/testing` updated from 5.3.0 to 6.2.1
|
|
261
|
+
- (ssbingo) chore: raised the `deepl-node` override to 1.28.0 and `adm-zip` to 0.6.1. 1.28.0 no longer depends on `js-yaml` and accepts the patched `adm-zip`, which clears the two advisories the updated tooling pulled in — `npm audit` is back to 0. Development tooling only; `npm audit --omit=dev` was 0 throughout
|
|
262
|
+
|
|
263
|
+
### 3.3.1 (2026-09-07)
|
|
264
|
+
- (ssbingo) fix: registers the device marks as not valid are no longer turned into plausible looking measurements. The protocol signals this by setting all bits ("Range:[0, 0xFFFFFFFE]. With value 0xFFFFFFFF, register is not valid.") and a device answers that way for a register that does not currently apply or that its firmware does not implement. The raw sentinel was scaled by the register gain, so it arrived as a reading that looks real: observed on a SigenStor EC 10.0 TP **with** a DC charger installed, `dcCharger.runningState` = 65535 (Appendix 14 only defines 0x00-0x0A), `dcCharger.dischargingCurrent` = 6553.5 A, `dcCharger.currentDischargingCapacity` = 42949672.95 kWh and `dcCharger.currentDischargingDuration` = 4294967295 s, while the neighbouring DC charger registers (rated power, PV generation, totals) returned real values. The same pattern appears outside the DC charger, e.g. `plant.currentCtrlCmdValue` = 655.35 %, `plant.mergedAlarm7` = 65535, `inverter.essMaxBatteryCellVoltage` = 65.535 V and the ESS/PCS/grid limit registers as 4294967.295 kW. Such registers now report no value instead
|
|
265
|
+
- (ssbingo) fix: a register that reports no value no longer feeds the statistics calculation, which keeps the last known good reading instead
|
|
266
|
+
|
|
258
267
|
### 3.3.0 (2026-09-07)
|
|
259
268
|
- (ssbingo) fix: when the device rejects a grouped register read with a Modbus exception, the registers of that group are now read one by one and only the register(s) the device does not implement are excluded from further polling. Previously a single unsupported register silently disabled its whole group for the rest of the adapter runtime, e.g. `dcCharger.runningState` (31513) never received a value when the discharging registers 31514–31518 of the same group were rejected
|
|
260
269
|
- (ssbingo) feat: new state `info.protocolVersion` (number, e.g. `2.9`) next to the textual `info.protocolLevel`, so widgets and scripts can adapt to the detected protocol version without parsing strings
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "sigenergy",
|
|
4
|
-
"version": "3.3.
|
|
4
|
+
"version": "3.3.2",
|
|
5
5
|
"news": {
|
|
6
|
+
"3.3.2": {
|
|
7
|
+
"en": "(ssbingo) chore: CI now also tests with Node.js 26 (matrix 22/24/26 on ubuntu, windows and macOS); @iobroker/testing updated to 6.2.1 and the dependency overrides adjusted so npm audit stays at 0. Development tooling only — the adapter itself is unchanged.",
|
|
8
|
+
"de": "(ssbingo) chore: CI testet jetzt zusätzlich mit Node.js 26 (Matrix 22/24/26 auf Ubuntu, Windows und macOS); @iobroker/testing auf 6.2.1 aktualisiert und die Dependency-Overrides nachgezogen, damit npm audit bei 0 bleibt. Betrifft nur das Entwicklungs-Tooling — der Adapter selbst ist unverändert.",
|
|
9
|
+
"ru": "(ssbingo) chore: CI теперь тестирует и с Node.js 26 (матрица 22/24/26 на ubuntu, windows и macOS); @iobroker/testing обновлён до 6.2.1, переопределения зависимостей скорректированы, чтобы npm audit оставался на 0. Затрагивает только инструменты разработки — сам адаптер не изменён.",
|
|
10
|
+
"pt": "(ssbingo) chore: a CI passa a testar também com Node.js 26 (matriz 22/24/26 em ubuntu, windows e macOS); @iobroker/testing atualizado para 6.2.1 e os overrides de dependências ajustados para o npm audit continuar a 0. Apenas ferramentas de desenvolvimento — o adaptador em si não mudou.",
|
|
11
|
+
"nl": "(ssbingo) chore: CI test nu ook met Node.js 26 (matrix 22/24/26 op ubuntu, windows en macOS); @iobroker/testing bijgewerkt naar 6.2.1 en de dependency-overrides aangepast zodat npm audit op 0 blijft. Alleen ontwikkeltooling — de adapter zelf is ongewijzigd.",
|
|
12
|
+
"fr": "(ssbingo) chore : la CI teste désormais aussi avec Node.js 26 (matrice 22/24/26 sur ubuntu, windows et macOS) ; @iobroker/testing mis à jour en 6.2.1 et les overrides de dépendances ajustés pour que npm audit reste à 0. Outillage de développement uniquement — l'adaptateur lui-même est inchangé.",
|
|
13
|
+
"it": "(ssbingo) chore: la CI ora testa anche con Node.js 26 (matrice 22/24/26 su ubuntu, windows e macOS); @iobroker/testing aggiornato a 6.2.1 e gli override delle dipendenze adeguati affinché npm audit resti a 0. Solo strumenti di sviluppo — l'adattatore stesso è invariato.",
|
|
14
|
+
"es": "(ssbingo) chore: la CI ahora también prueba con Node.js 26 (matriz 22/24/26 en ubuntu, windows y macOS); @iobroker/testing actualizado a 6.2.1 y los overrides de dependencias ajustados para que npm audit siga en 0. Solo herramientas de desarrollo — el adaptador en sí no cambia.",
|
|
15
|
+
"pl": "(ssbingo) chore: CI testuje teraz także z Node.js 26 (macierz 22/24/26 na ubuntu, windows i macOS); @iobroker/testing zaktualizowany do 6.2.1, a nadpisania zależności dostosowane, by npm audit pozostał na 0. Dotyczy tylko narzędzi deweloperskich — sam adapter bez zmian.",
|
|
16
|
+
"uk": "(ssbingo) chore: CI тепер тестує також із Node.js 26 (матриця 22/24/26 на ubuntu, windows і macOS); @iobroker/testing оновлено до 6.2.1, перевизначення залежностей скориговано, щоб npm audit залишався на 0. Стосується лише інструментів розробки — сам адаптер не змінено.",
|
|
17
|
+
"zh-cn": "(ssbingo) chore: CI 现在也在 Node.js 26 上测试(ubuntu、windows 和 macOS 的 22/24/26 矩阵);@iobroker/testing 升级至 6.2.1,并相应调整依赖 overrides 以使 npm audit 保持为 0。仅涉及开发工具链,适配器本身未变更。"
|
|
18
|
+
},
|
|
19
|
+
"3.3.1": {
|
|
20
|
+
"en": "(ssbingo) fix: registers the device marks as not valid (all bits set, 0xFFFF / 0xFFFFFFFF) are no longer scaled by the register gain into plausible looking measurements — observed as a 6553.5 A discharging current, 42949672.95 kWh and an out-of-range running state 65535 on the DC charger, and as 655.35 % or 65.535 V elsewhere. Such registers now report no value",
|
|
21
|
+
"de": "(ssbingo) fix: Register, die das Gerät als ungültig kennzeichnet (alle Bits gesetzt, 0xFFFF / 0xFFFFFFFF), werden nicht mehr über den Gain in plausibel aussehende Messwerte umgerechnet — sichtbar als 6553,5 A Entladestrom, 42949672,95 kWh und Betriebszustand 65535 beim DC-Charger sowie als 655,35 % oder 65,535 V an anderer Stelle. Solche Register liefern jetzt keinen Wert",
|
|
22
|
+
"ru": "(ssbingo) fix: регистры, помеченные устройством как недействительные (все биты установлены, 0xFFFF / 0xFFFFFFFF), больше не пересчитываются через коэффициент в правдоподобные значения — это проявлялось как ток разряда 6553,5 A, 42949672,95 кВт·ч и состояние 65535 у DC-зарядки, а также как 655,35 % или 65,535 В в других местах. Теперь такие регистры не возвращают значения",
|
|
23
|
+
"pt": "(ssbingo) fix: os registos que o dispositivo marca como inválidos (todos os bits a 1, 0xFFFF / 0xFFFFFFFF) deixam de ser convertidos pelo ganho em medições aparentemente plausíveis — surgiam como 6553,5 A de corrente de descarga, 42949672,95 kWh e o estado 65535 no carregador DC, e como 655,35 % ou 65,535 V noutros pontos. Esses registos passam a não devolver valor",
|
|
24
|
+
"nl": "(ssbingo) fix: registers die het apparaat als ongeldig markeert (alle bits gezet, 0xFFFF / 0xFFFFFFFF) worden niet langer via de gain omgerekend naar plausibel ogende metingen — zichtbaar als 6553,5 A ontlaadstroom, 42949672,95 kWh en status 65535 bij de DC-lader, en als 655,35 % of 65,535 V elders. Zulke registers geven nu geen waarde meer",
|
|
25
|
+
"fr": "(ssbingo) fix : les registres que l'appareil marque comme non valides (tous les bits à 1, 0xFFFF / 0xFFFFFFFF) ne sont plus convertis par le gain en mesures d'apparence plausible — cela apparaissait comme un courant de décharge de 6553,5 A, 42949672,95 kWh et l'état 65535 sur le chargeur DC, et comme 655,35 % ou 65,535 V ailleurs. Ces registres ne renvoient plus de valeur",
|
|
26
|
+
"it": "(ssbingo) fix: i registri che il dispositivo segnala come non validi (tutti i bit a 1, 0xFFFF / 0xFFFFFFFF) non vengono più convertiti dal gain in misure apparentemente plausibili — comparivano come corrente di scarica di 6553,5 A, 42949672,95 kWh e stato 65535 sul caricatore DC, e come 655,35 % o 65,535 V altrove. Tali registri ora non restituiscono alcun valore",
|
|
27
|
+
"es": "(ssbingo) fix: los registros que el dispositivo marca como no válidos (todos los bits a 1, 0xFFFF / 0xFFFFFFFF) ya no se convierten mediante la ganancia en mediciones de apariencia plausible — aparecían como una corriente de descarga de 6553,5 A, 42949672,95 kWh y el estado 65535 en el cargador DC, y como 655,35 % o 65,535 V en otros puntos. Esos registros ya no devuelven valor",
|
|
28
|
+
"pl": "(ssbingo) fix: rejestry oznaczone przez urządzenie jako nieprawidłowe (wszystkie bity ustawione, 0xFFFF / 0xFFFFFFFF) nie są już przeliczane przez wzmocnienie na wiarygodnie wyglądające pomiary — objawiało się to prądem rozładowania 6553,5 A, 42949672,95 kWh i stanem 65535 na ładowarce DC oraz 655,35 % lub 65,535 V w innych miejscach. Takie rejestry nie zwracają teraz wartości",
|
|
29
|
+
"uk": "(ssbingo) fix: регістри, позначені пристроєм як недійсні (усі біти встановлено, 0xFFFF / 0xFFFFFFFF), більше не перетворюються через коефіцієнт на правдоподібні вимірювання — це виглядало як струм розряду 6553,5 A, 42949672,95 кВт·год і стан 65535 на DC-зарядці та як 655,35 % або 65,535 В в інших місцях. Тепер такі регістри не повертають значення",
|
|
30
|
+
"zh-cn": "(ssbingo) fix: 设备标记为无效的寄存器(全部位为 1,0xFFFF / 0xFFFFFFFF)不再经增益换算成看似合理的测量值——此前表现为直流充电桩的 6553.5 A 放电电流、42949672.95 kWh 和超出范围的运行状态 65535,以及其他位置的 655.35 % 或 65.535 V。此类寄存器现在不再返回数值"
|
|
31
|
+
},
|
|
6
32
|
"3.3.0": {
|
|
7
33
|
"en": "(ssbingo) feat: registers are gated by the detected Modbus protocol version, so a device is no longer asked for registers its firmware does not know; rejected register groups are now retried register by register, so one unsupported register no longer silences its whole group; new state info.protocolVersion",
|
|
8
34
|
"de": "(ssbingo) feat: Register werden anhand der erkannten Modbus-Protokollversion gefiltert, damit ein Gerät nicht mehr nach Registern gefragt wird, die seine Firmware nicht kennt; abgelehnte Registergruppen werden jetzt einzeln nachgelesen, sodass ein nicht unterstütztes Register nicht mehr die ganze Gruppe stilllegt; neuer State info.protocolVersion",
|
package/lib/modbus.js
CHANGED
|
@@ -269,13 +269,38 @@ class ModbusConnection {
|
|
|
269
269
|
}
|
|
270
270
|
}
|
|
271
271
|
|
|
272
|
+
/**
|
|
273
|
+
* Values the protocol uses to mark an unsigned register as "not valid",
|
|
274
|
+
* i.e. all bits set. The V2.9 document spells this out for the power
|
|
275
|
+
* limitation registers ("Range:[0, 0xFFFFFFFE]. With value 0xFFFFFFFF,
|
|
276
|
+
* register is not valid.") and devices apply the same convention to
|
|
277
|
+
* registers they do not implement — e.g. a SigenStor without a DC charger
|
|
278
|
+
* answers 0xFFFF for [DC Charger] running state 31513.
|
|
279
|
+
*
|
|
280
|
+
* Only the unsigned types are listed. The document does not define a
|
|
281
|
+
* sentinel for the signed types, and 0x7FFF / 0x7FFFFFFF are legal
|
|
282
|
+
* measurements there, so those must not be filtered.
|
|
283
|
+
*/
|
|
284
|
+
static get INVALID_RAW() {
|
|
285
|
+
return {
|
|
286
|
+
U16: 0xffff,
|
|
287
|
+
U32: 0xffffffff,
|
|
288
|
+
U64: 18446744073709552000, // 2^64 - 1, as close as a double gets
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
|
|
272
292
|
/**
|
|
273
293
|
* Parse raw register data into a typed value
|
|
274
294
|
*
|
|
295
|
+
* Returns null when the device marked the register as not valid (see
|
|
296
|
+
* INVALID_RAW). Without this, the sentinel is scaled by the gain and ends
|
|
297
|
+
* up as a plausible looking measurement — 0xFFFF with gain 10 becomes
|
|
298
|
+
* "6553.5 A", 0xFFFFFFFF with gain 1000 becomes "4294967.295 kW".
|
|
299
|
+
*
|
|
275
300
|
* @param {number[]} rawData - Raw register data
|
|
276
301
|
* @param {string} type - Data type (U16, S16, U32, S32, U64, STRING)
|
|
277
302
|
* @param {number|null} gain - Scaling factor
|
|
278
|
-
* @returns {number|string|null} Decoded value
|
|
303
|
+
* @returns {number|string|null} Decoded value, or null if the register is not valid
|
|
279
304
|
*/
|
|
280
305
|
static parseValue(rawData, type, gain) {
|
|
281
306
|
let raw;
|
|
@@ -327,6 +352,11 @@ class ModbusConnection {
|
|
|
327
352
|
raw = rawData[0];
|
|
328
353
|
}
|
|
329
354
|
|
|
355
|
+
const invalid = ModbusConnection.INVALID_RAW[type];
|
|
356
|
+
if (invalid !== undefined && raw === invalid) {
|
|
357
|
+
return null;
|
|
358
|
+
}
|
|
359
|
+
|
|
330
360
|
if (gain && gain !== 1 && gain !== null) {
|
|
331
361
|
return raw / gain;
|
|
332
362
|
}
|
package/main.js
CHANGED
|
@@ -991,9 +991,16 @@ class Sigenergy extends utils.Adapter {
|
|
|
991
991
|
'inverter.pv3Voltage': 'pv3Voltage',
|
|
992
992
|
'inverter.pv3Current': 'pv3Current',
|
|
993
993
|
};
|
|
994
|
-
if (map[name]
|
|
995
|
-
|
|
994
|
+
if (map[name] === undefined) {
|
|
995
|
+
return;
|
|
996
|
+
}
|
|
997
|
+
// A null value means the device marked the register as not valid
|
|
998
|
+
// (see ModbusConnection.INVALID_RAW). Keep the last known good value
|
|
999
|
+
// instead, so the statistics are not poisoned by a single bad poll.
|
|
1000
|
+
if (value === null) {
|
|
1001
|
+
return;
|
|
996
1002
|
}
|
|
1003
|
+
this._currentData[map[name]] = value;
|
|
997
1004
|
}
|
|
998
1005
|
|
|
999
1006
|
/**
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.sigenergy",
|
|
3
|
-
"version": "3.3.
|
|
3
|
+
"version": "3.3.2",
|
|
4
4
|
"description": "ioBroker adapter for Sigenergy solar energy systems via Modbus TCP/RTU",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "ssbingo",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"@alcalzone/release-script-plugin-manual-review": "^5.2.0",
|
|
35
35
|
"@iobroker/adapter-dev": "^1.5.0",
|
|
36
36
|
"@iobroker/eslint-config": "^2.3.4",
|
|
37
|
-
"@iobroker/testing": "^
|
|
37
|
+
"@iobroker/testing": "^6.2.1",
|
|
38
38
|
"@tsconfig/node22": "^22.0.6",
|
|
39
39
|
"@types/node": "^22.20.1"
|
|
40
40
|
},
|
|
@@ -65,9 +65,9 @@
|
|
|
65
65
|
"node-gyp": "^10.3.1",
|
|
66
66
|
"@babel/core": "^7.29.7",
|
|
67
67
|
"@grpc/grpc-js": "^1.14.4",
|
|
68
|
-
"adm-zip": "^0.6.
|
|
68
|
+
"adm-zip": "^0.6.1",
|
|
69
69
|
"body-parser": "^1.20.6",
|
|
70
|
-
"deepl-node": "^1.
|
|
70
|
+
"deepl-node": "^1.28.0",
|
|
71
71
|
"diff": "^8.0.3",
|
|
72
72
|
"esbuild": "^0.28.1",
|
|
73
73
|
"immutable": "^4.3.9",
|