iobroker.sun2000 0.10.0 → 0.12.0
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 +11 -1
- package/admin/i18n/de/translations.json +2 -1
- package/admin/i18n/en/translations.json +1 -0
- package/admin/i18n/es/translations.json +1 -0
- package/admin/i18n/fr/translations.json +1 -0
- package/admin/i18n/it/translations.json +1 -0
- package/admin/i18n/nl/translations.json +1 -0
- package/admin/i18n/pl/translations.json +1 -0
- package/admin/i18n/pt/translations.json +1 -0
- package/admin/i18n/ru/translations.json +2 -1
- package/admin/i18n/uk/translations.json +1 -0
- package/admin/i18n/zh-cn/translations.json +1 -0
- package/admin/jsonConfig.json +35 -0
- package/admin/paypal-button.png +0 -0
- package/io-package.json +30 -29
- package/lib/drivers/driver_base.js +3 -2
- package/lib/drivers/driver_inverter.js +405 -23
- package/lib/register.js +7 -0
- package/lib/types.js +0 -7
- package/main.js +9 -2
- package/package.json +18 -13
package/README.md
CHANGED
|
@@ -29,7 +29,8 @@ Feel free to follow the discussions in the german [iobroker forum](https://forum
|
|
|
29
29
|
|
|
30
30
|
## Dependencies
|
|
31
31
|
* Node.js 18.x or higher
|
|
32
|
-
* ioBroker host (js-controller) 5.
|
|
32
|
+
* ioBroker host (js-controller) 5.0.19 or higher
|
|
33
|
+
* ioBroker admin 5.1.13 or higher
|
|
33
34
|
|
|
34
35
|
## Documentation
|
|
35
36
|
|
|
@@ -62,6 +63,15 @@ browse in the [wiki](https://github.com/bolliy/ioBroker.sun2000/wiki)
|
|
|
62
63
|
Placeholder for the next version (at the beginning of the line):
|
|
63
64
|
### **WORK IN PROGRESS**
|
|
64
65
|
-->
|
|
66
|
+
### 0.12.0 (2024-09-23)
|
|
67
|
+
* Requirements from ioBroker Check and Service Bot #104
|
|
68
|
+
* added battery packs #85
|
|
69
|
+
* added config panel `Further Register`
|
|
70
|
+
|
|
71
|
+
### 0.11.0 (2024-06-27)
|
|
72
|
+
* added a donation link in the adapter settings
|
|
73
|
+
* dependency updated
|
|
74
|
+
|
|
65
75
|
### 0.10.0 (2024-06-14)
|
|
66
76
|
* dependency and configuration updates
|
|
67
77
|
* adjust roles in the control path
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
+
"donateTxt": "Wenn Ihnen dieser Adapter gefällt, denken Sie bitte über eine Spende nach um meine Arbeit zu unterstützen.",
|
|
2
3
|
"sun2000 adapter settings": "Adaptereinstellungen für Huawei Inverter Sun2000",
|
|
3
4
|
"address": "Geräte-IP-Adresse",
|
|
4
5
|
"port": "Modbus TCP-Port",
|
|
@@ -15,7 +16,7 @@
|
|
|
15
16
|
"ms.aktive": "Modbus-Proxy aktiv",
|
|
16
17
|
"Modbus-proxy via TCP for read-only is active": "Modbus-Proxy über TCP zum Nur-Lesen ist aktiv",
|
|
17
18
|
"ms.address": "Modbus-Proxy überwacht die Adresse",
|
|
18
|
-
"If want to listen only at localhost use 127.0.0.1": "Wenn Sie nur auf localhost
|
|
19
|
+
"If want to listen only at localhost use 127.0.0.1": "Wenn Sie nur auf localhost hören möchten, verwenden Sie 127.0.0.1",
|
|
19
20
|
"ms.port": "Modbus-Proxy-TCP-Port",
|
|
20
21
|
"The Modbus-proxy TCP port": "Der Modbus-Proxy-TCP-Port",
|
|
21
22
|
"The SDongle modbus ID": "Die SDongle-Modbus-ID – normalerweise 100",
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
+
"donateTxt": "Se ti piace questo adattatore, considera di fare una donazione per sostenere il mio lavoro.",
|
|
2
3
|
"sun2000 adapter settings": "Impostazioni dell'adattatore per inverter huawai sun2000",
|
|
3
4
|
"address": "Indirizzo IP del dispositivo",
|
|
4
5
|
"port": "porta TCP Modbus",
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
|
+
"donateTxt": "Если вам понравился этот адаптер, рассмотрите возможность сделать пожертвование в поддержку моей работы.",
|
|
2
3
|
"sun2000 adapter settings": "Настройки адаптера для инвертора huawei sun2000",
|
|
3
4
|
"address": "IP-адрес устройства",
|
|
4
5
|
"port": "TCP-порт Modbus",
|
|
5
6
|
"Modbus inverter IDs": "Идентификаторы преобразователей Modbus",
|
|
6
7
|
"Update interval (sec)": "Интервал обновления [сек]",
|
|
7
|
-
"The device ip address": "IP-адрес
|
|
8
|
+
"The device ip address": "IP-адрес инверторов",
|
|
8
9
|
"The modbus TCP port": "TCP-порт Modbus",
|
|
9
10
|
"The modbus inverter IDs, separated with character ,": "Идентификаторы инверторов Modbus, разделенные символом ,",
|
|
10
11
|
"Update interval to update the values from the inverters": "Интервал обновления для обновления значений инверторов.",
|
package/admin/jsonConfig.json
CHANGED
|
@@ -6,6 +6,17 @@
|
|
|
6
6
|
"type": "panel",
|
|
7
7
|
"label": "Main settings",
|
|
8
8
|
"items": {
|
|
9
|
+
"donateTxt": {
|
|
10
|
+
"type": "staticText",
|
|
11
|
+
"text": "donateTxt"
|
|
12
|
+
},
|
|
13
|
+
"donateImage": {
|
|
14
|
+
"type": "staticImage",
|
|
15
|
+
"label": "label",
|
|
16
|
+
"href" : "https://www.paypal.com/donate/?hosted_button_id=ZTX3VP9LZBDCG",
|
|
17
|
+
"src" : "paypal-button.png",
|
|
18
|
+
"newLine": true
|
|
19
|
+
},
|
|
9
20
|
"mainHdr1": {
|
|
10
21
|
"newLine": true,
|
|
11
22
|
"type": "header",
|
|
@@ -116,6 +127,30 @@
|
|
|
116
127
|
}
|
|
117
128
|
}
|
|
118
129
|
},
|
|
130
|
+
"tab7": {
|
|
131
|
+
"type": "panel",
|
|
132
|
+
"label": "Further Register",
|
|
133
|
+
"items": {
|
|
134
|
+
"mainHdr1": {
|
|
135
|
+
"newLine": true,
|
|
136
|
+
"type": "header",
|
|
137
|
+
"text": "Further battery register data",
|
|
138
|
+
"size": 2
|
|
139
|
+
},
|
|
140
|
+
"ds_bu": {
|
|
141
|
+
"type": "checkbox",
|
|
142
|
+
"label": "battery units",
|
|
143
|
+
"newLine": true,
|
|
144
|
+
"help": "This register data is stored in the opject path “sun2000.x.inverter.x.battery.unit”"
|
|
145
|
+
},
|
|
146
|
+
"ds_bp": {
|
|
147
|
+
"type": "checkbox",
|
|
148
|
+
"label": "battery packs",
|
|
149
|
+
"newLine": true,
|
|
150
|
+
"help": "This register data is stored in the opject path “sun2000.x.inverter.x.battery.unit.x.pack”"
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
},
|
|
119
154
|
"tab3": {
|
|
120
155
|
"type": "panel",
|
|
121
156
|
"label": "Energy control",
|
|
Binary file
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "sun2000",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.12.0",
|
|
5
5
|
"news": {
|
|
6
|
+
"0.12.0": {
|
|
7
|
+
"en": "Requirements from ioBroker Check and Service Bot #104\nadded battery packs #85\nadded config panel `Further Register`",
|
|
8
|
+
"de": "Anforderungen an ioBroker Check und Service Bot #104\nakkupacks #85\nhinzufügen config panel `Weiter registrieren `",
|
|
9
|
+
"ru": "Требования от ioBroker Check and Service Bot #104\n#85\nдобавленная панель конфигурации `Further Register \"",
|
|
10
|
+
"pt": "Requisitos de ioBroker Check e Service Bot #104\npacotes de bateria adicionados #85\nadicionado painel de configuração `Further Register \"",
|
|
11
|
+
"nl": "Vereisten van ioBroker Check and Service Bot #104\ntoegevoegde batterijpakketten #85\ntoegevoegd config paneel \"Verder registreren\" Wat",
|
|
12
|
+
"fr": "Exigences de ioBroker Check and Service Bot #104\npacks de batterie supplémentaires #85\najouté panneau de configuration `Plus grand registre \"",
|
|
13
|
+
"it": "Requisiti da ioBroker Check and Service Bot #104\nbatterie aggiunte #85\naggiunto pannello di configurazione `Further Register #",
|
|
14
|
+
"es": "Requisitos de ioBroker Check and Service Bot #104\nañadir paquetes de batería #85\npanel de configuración añadido `Más registro `",
|
|
15
|
+
"pl": "Wymagania dotyczące kontroli ioBroker i serwisu Bot # 104\ndodany zestaw baterii # 85\ndodany panel konfiguracyjny \"Dalszy rejestr '",
|
|
16
|
+
"uk": "Вимоги до ioBroker Check and Service Bot #104\nдоданий акумуляторний пакет #85\nдодано панель налаштувань `Further Реєстр й",
|
|
17
|
+
"zh-cn": "ioBroker检查和服务瓶的所需经费#104\n添加电池包# 85\n添加配置面板“ 进一步登记” `"
|
|
18
|
+
},
|
|
19
|
+
"0.11.0": {
|
|
20
|
+
"en": "added a donation link in the adapter settings\ndependency updated",
|
|
21
|
+
"de": "einen spendenlink in den adaptereinstellungen hinzugefügt\naktualisierte abhängigkeit",
|
|
22
|
+
"ru": "добавлена ссылка пожертвований в настройках адаптера\nобновленные данные",
|
|
23
|
+
"pt": "adicionou um link de doação nas configurações do adaptador\ndependência atualizada",
|
|
24
|
+
"nl": "een donatielink toegevoegd in de adapterinstellingen\nafhankelijkheid bijgewerkt",
|
|
25
|
+
"fr": "ajouté un lien de don dans les paramètres de l'adaptateur\nmise à jour de la dépendance",
|
|
26
|
+
"it": "aggiunto un link di donazione nelle impostazioni dell'adattatore\naggiornamento della dipendenza",
|
|
27
|
+
"es": "añadido un enlace de donación en la configuración del adaptador\nactualización de la dependencia",
|
|
28
|
+
"pl": "dodano link do darowizny w ustawieniach adaptera\nzaktualizowana zależność",
|
|
29
|
+
"uk": "додано посилання пожертвування в налаштуваннях адаптера\nоновлення залежності",
|
|
30
|
+
"zh-cn": "在适配器设置中添加一个捐赠链接\n更新依赖关系"
|
|
31
|
+
},
|
|
6
32
|
"0.10.0": {
|
|
7
33
|
"en": "dependency and configuration updates\nadjust roles in the control path\nBattery control: add backup power SOC #84\nfix: wrong state name `control.battery.targetSOC` with trailing space",
|
|
8
34
|
"de": "abhängigkeits- und konfigurationsupdates\nrollen im kontrollpfad anpassen\nBatteriesteuerung: Backup-Leistung hinzufügen SOC #84\nfix: falscher Zustandsname `control.battery.targetSOC` mit Trailing Space",
|
|
@@ -67,32 +93,6 @@
|
|
|
67
93
|
"pl": "łamanie zmian\nNode.js 18,x lub wyższa wymagana\njoBroker host (kontroler js-) 5.x lub wyższy",
|
|
68
94
|
"uk": "поломка змін\nNode.js 18.x або вище потрібно\nioBroker host (js-controller) 5.x або вище",
|
|
69
95
|
"zh-cn": "断开更改\n所需节点.js 18.x或更高\nioBroker 主机(js-controller) 5.x或更高"
|
|
70
|
-
},
|
|
71
|
-
"0.6.2": {
|
|
72
|
-
"en": "standby detection adjusted\nImprovement of logs",
|
|
73
|
-
"de": "standby-erkennung angepasst\nVerbesserung der Protokolle",
|
|
74
|
-
"ru": "резервное обнаружение с поправкой\nСовершенствование журналов",
|
|
75
|
-
"pt": "detecção de espera ajustada\nMelhoria dos logs",
|
|
76
|
-
"nl": "stand-by detectie aangepast\nVerbetering van de logs",
|
|
77
|
-
"fr": "réglage de la détection en attente\nAmélioration des registres",
|
|
78
|
-
"it": "rilevamento standby regolato\nMiglioramento dei registri",
|
|
79
|
-
"es": "detección de reserva ajustada\nMejora de los registros",
|
|
80
|
-
"pl": "korekta detekcji czuwania\nPoprawa dzienników",
|
|
81
|
-
"uk": "автономне виявлення\nУдосконалення колод",
|
|
82
|
-
"zh-cn": "经调整的备用检测\n改进日志"
|
|
83
|
-
},
|
|
84
|
-
"0.6.1": {
|
|
85
|
-
"en": "Battery control: After the second failed attempt, the control event is discarded\nBattery control: Adjust the battery maxCharge and Discharge to the actual values",
|
|
86
|
-
"de": "Batteriesteuerung: Nach dem zweiten gescheiterten Versuch wird das Kontrollereignis verworfen\nBatteriesteuerung: Einstellen der Batterie maxCharge und Entladen auf die tatsächlichen Werte",
|
|
87
|
-
"ru": "Контроль батареи: После второй неудачной попытки, событие управления отбрасывается\nКонтроль батареи: Настройка аккумулятора maxCharge и выгрузка на фактические значения",
|
|
88
|
-
"pt": "Controle da bateria: Após a segunda tentativa falhada, o evento de controle é descartado\nControle da bateria: Ajuste a bateria maxCharge e descarga para os valores reais",
|
|
89
|
-
"nl": "Controle van de batterij: Na de tweede mislukte poging, de controle gebeurtenis wordt weggegooid\nControle van de batterij: Pas de batterij maxCharge en Discharge aan aan de werkelijke waarden",
|
|
90
|
-
"fr": "Contrôle de la batterie: Après la deuxième tentative ratée, l'événement de contrôle est écarté\nContrôle de la batterie: Régler la batterie maxCharge et décharge aux valeurs réelles",
|
|
91
|
-
"it": "Controllo della batteria: Dopo il secondo tentativo fallito, l'evento di controllo viene scartato\nControllo della batteria: Regolare la batteria maxCharge e Scaricare i valori effettivi",
|
|
92
|
-
"es": "Control de batería: Después del segundo intento fallido, el evento de control es descartado\nControl de batería: Ajustar la batería maxCargue y descarga a los valores reales",
|
|
93
|
-
"pl": "Kontrola baterii: Po drugiej nieudanej próbie zdarzenie kontrolne zostaje odrzucone\nKontrola baterii: Dostosuj maxCharge i absolutorium baterii do rzeczywistych wartości",
|
|
94
|
-
"uk": "Контроль акумулятора: Після другого невдалого спробу контрольний захід відхилений\nКонтроль акумулятора: Налаштуйте акумулятор maxCharge і відключіть до фактичних значень",
|
|
95
|
-
"zh-cn": "电池控制 : 在第二次尝试失败后, 控制事件被丢弃\n电池控制 : 按照实际值调整电池最大充电器和放电装置"
|
|
96
96
|
}
|
|
97
97
|
},
|
|
98
98
|
"titleLang": {
|
|
@@ -216,7 +216,7 @@
|
|
|
216
216
|
],
|
|
217
217
|
"dependencies": [
|
|
218
218
|
{
|
|
219
|
-
"js-controller": ">=5.0.
|
|
219
|
+
"js-controller": ">=5.0.19"
|
|
220
220
|
}
|
|
221
221
|
],
|
|
222
222
|
"globalDependencies": [
|
|
@@ -246,7 +246,8 @@
|
|
|
246
246
|
"ms_port": 502,
|
|
247
247
|
"ms_log": false,
|
|
248
248
|
"sl_active": false,
|
|
249
|
-
"sl_meterId": 11
|
|
249
|
+
"sl_meterId": 11,
|
|
250
|
+
"ds_bu": true
|
|
250
251
|
},
|
|
251
252
|
"objects": [],
|
|
252
253
|
"instanceObjects": [
|
|
@@ -180,9 +180,10 @@ class DriverBase {
|
|
|
180
180
|
if (!this.modbusAllowed && reg.standby !== true) continue; //standby - v0.6.2
|
|
181
181
|
if (!dataRefreshRate.compare(refreshRate,reg.refresh)) continue; //refreshrate unequal
|
|
182
182
|
if (reg.type == deviceType.meter && !this.deviceInfo?.meter) continue; //meter
|
|
183
|
-
if (reg.type == deviceType.battery && this.deviceInfo?.numberBatteryUnits == 0) continue; //battery
|
|
184
|
-
if (reg.type == deviceType.batteryUnit2 && this.deviceInfo?.numberBatteryUnits < 2) continue; //battery Unit2
|
|
185
183
|
if (reg.type == deviceType.gridPowerControl && !this.deviceInfo?.meter) continue; //Grid Power Control - v0.8.x
|
|
184
|
+
|
|
185
|
+
if (reg.checkIfActive && !reg.checkIfActive(this._getStatePath(reg.type))) continue; //NEW, PATH
|
|
186
|
+
|
|
186
187
|
//refresh rate low or empty
|
|
187
188
|
const lastread = reg.lastread;
|
|
188
189
|
if ( refreshRate !== dataRefreshRate.high) {
|
|
@@ -133,7 +133,7 @@ class InverterSun2000 extends DriverBase{
|
|
|
133
133
|
{
|
|
134
134
|
state: {id: 'info.ratedPower', name: 'Rated power', type: 'number', unit: 'kW', role: 'value.power', desc: 'reg:30073, len:2'},
|
|
135
135
|
register: {reg: 30073, type: dataType.int32, gain:1000}
|
|
136
|
-
}]
|
|
136
|
+
}]
|
|
137
137
|
},
|
|
138
138
|
{
|
|
139
139
|
address : 32080,
|
|
@@ -156,7 +156,9 @@ class InverterSun2000 extends DriverBase{
|
|
|
156
156
|
states : [{
|
|
157
157
|
state: {id: 'battery.chargeDischargePower', name: 'Charge/Discharge power', desc: 'reg:37765, len:2 (>0 charging, <0 discharging)', type: 'number', unit: 'kW', role: 'value.power'},
|
|
158
158
|
register: {reg: 37765, type: dataType.int32, gain:1000}
|
|
159
|
-
}]
|
|
159
|
+
}],
|
|
160
|
+
//Check if the address field is active
|
|
161
|
+
checkIfActive: (path) => this._batteryExists(path)
|
|
160
162
|
},
|
|
161
163
|
{
|
|
162
164
|
address : 32064,
|
|
@@ -199,7 +201,6 @@ class InverterSun2000 extends DriverBase{
|
|
|
199
201
|
info : 'meter activePower',
|
|
200
202
|
refresh : dataRefreshRate.high,
|
|
201
203
|
type : deviceType.meter,
|
|
202
|
-
//standby : true,
|
|
203
204
|
states: [{
|
|
204
205
|
state: {id: 'meter.activePower', name: 'ActivePower', type: 'number', unit: 'kW', role: 'value.power.active', desc: 'reg:37113, len:2 (>0: feed-in to grid. <0: supply from grid.)' },
|
|
205
206
|
register: { reg: 37113, type: dataType.int32, gain:1000 }
|
|
@@ -208,7 +209,7 @@ class InverterSun2000 extends DriverBase{
|
|
|
208
209
|
{
|
|
209
210
|
address : 37052,
|
|
210
211
|
length : 10,
|
|
211
|
-
info : 'battery unit1 indicator',
|
|
212
|
+
info : 'battery unit1 (indicator)',
|
|
212
213
|
states: [
|
|
213
214
|
{
|
|
214
215
|
state: { id: 'battery.unit.1.SN', name: 'serial number', type: 'string', unit: '', role: 'value'},
|
|
@@ -221,10 +222,186 @@ class InverterSun2000 extends DriverBase{
|
|
|
221
222
|
if(err.modbusCode === 2) {
|
|
222
223
|
reg.lastread = this._newNowTime(); //try it once
|
|
223
224
|
this.stateCache.set(this._getStatePath(reg.type)+'battery.unit.1.SN', '', { stored : true });
|
|
224
|
-
return true; //self handle
|
|
225
|
+
return true; //error self handle
|
|
225
226
|
}
|
|
226
227
|
}
|
|
227
228
|
},
|
|
229
|
+
//--
|
|
230
|
+
{
|
|
231
|
+
address : 38200,
|
|
232
|
+
length : 10,
|
|
233
|
+
info : 'battery unit1 Pack1 (indicator)',
|
|
234
|
+
states: [
|
|
235
|
+
{
|
|
236
|
+
state: { id: 'battery.unit.1.batteryPack.1.SN', name: 'serial number', type: 'string', unit: '', role: 'value'},
|
|
237
|
+
register: { reg: 38200, type: dataType.string, length: 6},
|
|
238
|
+
store: storeType.never
|
|
239
|
+
},
|
|
240
|
+
],
|
|
241
|
+
readErrorHook: (err,reg) => {
|
|
242
|
+
//modbus Error 2 - illegal address
|
|
243
|
+
if(err.modbusCode === 2) {
|
|
244
|
+
reg.lastread = this._newNowTime(); //try it once
|
|
245
|
+
this.stateCache.set(this._getStatePath(reg.type)+'battery.unit.1.batteryPack.1.SN', '', { stored : true });
|
|
246
|
+
return true; //error self handle
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
address : 38242,
|
|
252
|
+
length : 10,
|
|
253
|
+
info : 'battery unit1 Pack2 (indicator)',
|
|
254
|
+
states: [
|
|
255
|
+
{
|
|
256
|
+
state: { id: 'battery.unit.1.batteryPack.2.SN', name: 'serial number', type: 'string', unit: '', role: 'value'},
|
|
257
|
+
register: { reg: 38242, type: dataType.string, length: 6},
|
|
258
|
+
store: storeType.never
|
|
259
|
+
},
|
|
260
|
+
],
|
|
261
|
+
readErrorHook: (err,reg) => {
|
|
262
|
+
//modbus Error 2 - illegal address
|
|
263
|
+
if(err.modbusCode === 2) {
|
|
264
|
+
reg.lastread = this._newNowTime(); //try it once
|
|
265
|
+
this.stateCache.set(this._getStatePath(reg.type)+'battery.unit.1.batteryPack.2.SN', '', { stored : true });
|
|
266
|
+
return true; //error self handle
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
address : 38284,
|
|
272
|
+
length : 10,
|
|
273
|
+
info : 'battery unit1 Pack3 (indicator)',
|
|
274
|
+
states: [
|
|
275
|
+
{
|
|
276
|
+
state: { id: 'battery.unit.1.batteryPack.3.SN', name: 'serial number', type: 'string', unit: '', role: 'value'},
|
|
277
|
+
register: { reg: 38284, type: dataType.string, length: 6},
|
|
278
|
+
store: storeType.never
|
|
279
|
+
},
|
|
280
|
+
],
|
|
281
|
+
readErrorHook: (err,reg) => {
|
|
282
|
+
//modbus Error 2 - illegal address
|
|
283
|
+
if(err.modbusCode === 2) {
|
|
284
|
+
reg.lastread = this._newNowTime(); //try it once
|
|
285
|
+
this.stateCache.set(this._getStatePath(reg.type)+'battery.unit.1.batteryPack.3.SN', '', { stored : true });
|
|
286
|
+
return true; //error self handle
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
address : 38229,
|
|
292
|
+
length : 13,
|
|
293
|
+
info : 'battery Pack 1 information',
|
|
294
|
+
refresh : dataRefreshRate.low,
|
|
295
|
+
type : deviceType.battery,
|
|
296
|
+
states: [
|
|
297
|
+
{
|
|
298
|
+
state: {id: 'battery.unit.1.batteryPack.1.SOC', name: 'State of capacity', type: 'number', unit: '%', role: 'value.battery', desc: 'reg:38229 len:1'},
|
|
299
|
+
register: {reg: 38229, type: dataType.uint16, gain: 10}
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
state: {id: 'battery.unit.1.batteryPack.1.totalCharge', name: 'Total Charge', type: 'number', unit: 'kWh', role: 'value.power.consumption', desc: 'reg:38238, len:2'},
|
|
303
|
+
register: {reg: 38238, type: dataType.uint32, gain: 100}
|
|
304
|
+
},
|
|
305
|
+
{
|
|
306
|
+
state: {id: 'battery.unit.1.batteryPack.1.totalDischarge', name: 'Total Discharge', type: 'number', unit: 'kWh', role: 'value.power.consumption', desc: 'reg:38240, len:2'},
|
|
307
|
+
register: {reg: 38240, type: dataType.uint32, gain: 100}
|
|
308
|
+
}
|
|
309
|
+
],
|
|
310
|
+
checkIfActive: (path) => this._batteryExists(path,1,1)
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
address : 38271,
|
|
314
|
+
length : 13,
|
|
315
|
+
info : 'battery Pack 2 information',
|
|
316
|
+
refresh : dataRefreshRate.low,
|
|
317
|
+
type : deviceType.battery,
|
|
318
|
+
states: [
|
|
319
|
+
{
|
|
320
|
+
state: {id: 'battery.unit.1.batteryPack.2.SOC', name: 'State of capacity', type: 'number', unit: '%', role: 'value.battery', desc: 'reg:38271, len:1'},
|
|
321
|
+
register: {reg: 38271, type: dataType.uint16, gain: 10}
|
|
322
|
+
},
|
|
323
|
+
{
|
|
324
|
+
state: {id: 'battery.unit.1.batteryPack.2.totalCharge', name: 'Total Charge', type: 'number', unit: 'kWh', role: 'value.power.consumption', desc: 'reg:38280, len:2'},
|
|
325
|
+
register: {reg: 38280, type: dataType.uint32, gain: 100}
|
|
326
|
+
},
|
|
327
|
+
{
|
|
328
|
+
state: {id: 'battery.unit.1.batteryPack.2.totalDischarge', name: 'Total Discharge', type: 'number', unit: 'kWh', role: 'value.power.consumption', desc: 'reg:38282, len:2'},
|
|
329
|
+
register: {reg: 38282, type: dataType.uint32, gain: 100}
|
|
330
|
+
}
|
|
331
|
+
],
|
|
332
|
+
checkIfActive: (path) => this._batteryExists(path,1,2)
|
|
333
|
+
},
|
|
334
|
+
{
|
|
335
|
+
address : 38313,
|
|
336
|
+
length : 13,
|
|
337
|
+
info : 'battery Pack 3 information',
|
|
338
|
+
refresh : dataRefreshRate.low,
|
|
339
|
+
type : deviceType.battery,
|
|
340
|
+
states: [
|
|
341
|
+
{
|
|
342
|
+
state: {id: 'battery.unit.1.batteryPack.3.SOC', name: 'State of capacity', type: 'number', unit: '%', role: 'value.battery', desc: 'reg:38313, len:1'},
|
|
343
|
+
register: {reg: 38313, type: dataType.uint16, gain: 10}
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
state: {id: 'battery.unit.1.batteryPack.3.totalCharge', name: 'Total Charge', type: 'number', unit: 'kWh', role: 'value.power.consumption', desc: 'reg:38322, len:2'},
|
|
347
|
+
register: {reg: 38322, type: dataType.uint32, gain: 100}
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
state: {id: 'battery.unit.1.batteryPack.3.totalDischarge', name: 'Total Discharge', type: 'number', unit: 'kWh', role: 'value.power.consumption', desc: 'reg:38324, len:2'},
|
|
351
|
+
register: {reg: 38324, type: dataType.uint32, gain: 100}
|
|
352
|
+
}
|
|
353
|
+
],
|
|
354
|
+
checkIfActive: (path) => this._batteryExists(path,1,3)
|
|
355
|
+
},
|
|
356
|
+
{
|
|
357
|
+
address : 38233,
|
|
358
|
+
length : 3,
|
|
359
|
+
info : 'Battery Pack 1 Charge And Discharge Power',
|
|
360
|
+
refresh : dataRefreshRate.high,
|
|
361
|
+
type : deviceType.battery,
|
|
362
|
+
states : [{
|
|
363
|
+
state: {id: 'battery.unit.1.batteryPack.1.chargeDischargePower', name: 'Charge/Discharge power', desc: 'reg:38233, len:2 (>0 charging, <0 discharging)', type: 'number', unit: 'kW', role: 'value.power'},
|
|
364
|
+
register: {reg: 38233, type: dataType.int32, gain:1000}
|
|
365
|
+
},
|
|
366
|
+
{
|
|
367
|
+
state: {id: 'battery.unit.1.batteryPack.1.voltage', name: 'Voltage', type: 'number', unit: 'V', role: 'value.voltage', desc: 'reg:38235, len:1'},
|
|
368
|
+
register: {reg: 38235, type: dataType.uint16, gain: 10},
|
|
369
|
+
}],
|
|
370
|
+
checkIfActive: (path) => this._batteryExists(path,1,1)
|
|
371
|
+
},
|
|
372
|
+
{
|
|
373
|
+
address : 38275,
|
|
374
|
+
length : 3,
|
|
375
|
+
info : 'Battery Pack 2 Charge And Discharge Power',
|
|
376
|
+
refresh : dataRefreshRate.high,
|
|
377
|
+
type : deviceType.battery,
|
|
378
|
+
states : [{
|
|
379
|
+
state: {id: 'battery.unit.1.batteryPack.2.chargeDischargePower', name: 'Charge/Discharge power', desc: 'reg:38275, len:2 (>0 charging, <0 discharging)', type: 'number', unit: 'kW', role: 'value.power'},
|
|
380
|
+
register: {reg: 38275, type: dataType.int32, gain:1000}
|
|
381
|
+
},
|
|
382
|
+
{
|
|
383
|
+
state: {id: 'battery.unit.1.batteryPack.2.voltage', name: 'Voltage', type: 'number', unit: 'V', role: 'value.voltage', desc: 'reg:38277, len:1'},
|
|
384
|
+
register: {reg: 38277, type: dataType.uint16, gain: 10},
|
|
385
|
+
}],
|
|
386
|
+
checkIfActive: (path) => this._batteryExists(path,1,2)
|
|
387
|
+
},
|
|
388
|
+
{
|
|
389
|
+
address : 38317,
|
|
390
|
+
length : 3,
|
|
391
|
+
info : 'Battery Pack 3Charge And Discharge Power',
|
|
392
|
+
refresh : dataRefreshRate.high,
|
|
393
|
+
type : deviceType.battery,
|
|
394
|
+
states : [{
|
|
395
|
+
state: {id: 'battery.unit.1.batteryPack.3.chargeDischargePower', name: 'Charge/Discharge power', desc: 'reg:38317, len:2 (>0 charging, <0 discharging)', type: 'number', unit: 'kW', role: 'value.power'},
|
|
396
|
+
register: {reg: 38317, type: dataType.int32, gain:1000}
|
|
397
|
+
},
|
|
398
|
+
{
|
|
399
|
+
state: {id: 'battery.unit.1.batteryPack.3.voltage', name: 'Voltage', type: 'number', unit: 'V', role: 'value.voltage', desc: 'reg:38319, len:1'},
|
|
400
|
+
register: {reg: 38319, type: dataType.uint16, gain: 10},
|
|
401
|
+
}],
|
|
402
|
+
checkIfActive: (path) => this._batteryExists(path,1,3)
|
|
403
|
+
},
|
|
404
|
+
//++
|
|
228
405
|
{
|
|
229
406
|
address : 37000,
|
|
230
407
|
length : 50,
|
|
@@ -241,6 +418,14 @@ class InverterSun2000 extends DriverBase{
|
|
|
241
418
|
state: {id: 'battery.unit.1.batterySOC', name: 'battery SOC', type: 'number', unit: '%', role: 'value.battery', desc: 'reg:37004, len:1'},
|
|
242
419
|
register: {reg: 37004, type: dataType.uint16, gain:10}
|
|
243
420
|
},
|
|
421
|
+
{
|
|
422
|
+
state: {id: 'battery.unit.1.RatedChargePower', name: 'rated charge power', type: 'number', unit: 'W', role: 'value.power', desc: 'reg:37007, len:2'},
|
|
423
|
+
register: {reg: 37007, type: dataType.uint32}
|
|
424
|
+
},
|
|
425
|
+
{
|
|
426
|
+
state: {id: 'battery.unit.1.RatedDischargePower', name: 'rated discharge power', type: 'number', unit: 'W', role: 'value.power', desc: 'reg:37009, len:2'},
|
|
427
|
+
register: {reg: 37009, type: dataType.uint32}
|
|
428
|
+
},
|
|
244
429
|
{
|
|
245
430
|
state: {id: 'battery.unit.1.batteryTemperature', name: 'battery temperature', type: 'number', unit: '°C', role: 'value.temperature', desc: 'reg:37022, len:1'},
|
|
246
431
|
register: {reg: 37022, type: dataType.uint16, gain:10},
|
|
@@ -254,7 +439,8 @@ class InverterSun2000 extends DriverBase{
|
|
|
254
439
|
state: { id: 'battery.maximumDischargePower', name: 'MaximumDischargePower', type: 'number', unit: 'W', role: 'value.power', desc: 'reg:37048, len:2'},
|
|
255
440
|
register: { reg: 37048, type: dataType.uint32}
|
|
256
441
|
}
|
|
257
|
-
]
|
|
442
|
+
],
|
|
443
|
+
checkIfActive: (path) => this._batteryExists(path)
|
|
258
444
|
},
|
|
259
445
|
{ //for NRGKick
|
|
260
446
|
address : 47000,
|
|
@@ -266,7 +452,8 @@ class InverterSun2000 extends DriverBase{
|
|
|
266
452
|
state: { id: 'battery.unit.1.productMode', name: 'Product Mode', type: 'number', unit: '', role: 'value', desc: 'reg:47000, len:1'},
|
|
267
453
|
register: { reg: 47000, type: dataType.uint16}
|
|
268
454
|
},
|
|
269
|
-
]
|
|
455
|
+
],
|
|
456
|
+
checkIfActive: (path) => this._batteryExists(path)
|
|
270
457
|
},
|
|
271
458
|
{
|
|
272
459
|
address : 47081,
|
|
@@ -299,7 +486,8 @@ class InverterSun2000 extends DriverBase{
|
|
|
299
486
|
state: {id: 'battery.gridChargeCutoffSOC', name: 'Grid Charge Cutoff SOC', type: 'number', unit: '%', role: 'value', desc: 'reg:47088, len:1'},
|
|
300
487
|
register: {reg: 47088, type: dataType.uint16, gain: 10}
|
|
301
488
|
}
|
|
302
|
-
]
|
|
489
|
+
],
|
|
490
|
+
checkIfActive: (path) => this._batteryExists(path)
|
|
303
491
|
},
|
|
304
492
|
{
|
|
305
493
|
address : 47101,
|
|
@@ -317,10 +505,11 @@ class InverterSun2000 extends DriverBase{
|
|
|
317
505
|
register: {reg: 47102, type: dataType.uint16, gain: 10}
|
|
318
506
|
},
|
|
319
507
|
{
|
|
320
|
-
state: { id: 'battery.productModel', name: 'Product Model', type: 'number', unit: '', role: 'value', desc: 'reg:
|
|
508
|
+
state: { id: 'battery.productModel', name: 'Product Model', type: 'number', unit: '', role: 'value', desc: 'reg: 47106 , len: 1'},
|
|
321
509
|
register: {reg: 47106, type: dataType.uint16}
|
|
322
510
|
}
|
|
323
|
-
]
|
|
511
|
+
],
|
|
512
|
+
checkIfActive: (path) => this._batteryExists(path)
|
|
324
513
|
},
|
|
325
514
|
{
|
|
326
515
|
address : 32000,
|
|
@@ -671,7 +860,8 @@ class InverterSun2000 extends DriverBase{
|
|
|
671
860
|
state: {id: 'battery.currentDayDischargeCapacity', name: 'Current Day Discharge Capacity', type: 'number', unit: 'kWh', role: 'value.power.consumption', desc: 'reg:37786, len:2' },
|
|
672
861
|
register: { reg: 37786, type: dataType.uint32, gain: 100 }
|
|
673
862
|
}
|
|
674
|
-
]
|
|
863
|
+
],
|
|
864
|
+
checkIfActive: (path) => this._batteryExists(path)
|
|
675
865
|
},
|
|
676
866
|
{
|
|
677
867
|
//https://photomate.zendesk.com/hc/en-gb/articles/5701625507485-Export-limitation-for-SUN2000-inverters-via-FusionSolar-App
|
|
@@ -726,12 +916,6 @@ class InverterSun2000 extends DriverBase{
|
|
|
726
916
|
|
|
727
917
|
if (inputYield < 0 || isNaN(inputYield)) inputYield = 0;
|
|
728
918
|
this.stateCache.set(path+'derived.dailyInputYield', inputYield, {type: 'number'});
|
|
729
|
-
|
|
730
|
-
//Battery Indicator
|
|
731
|
-
let state = this.stateCache.get(path+'battery.unit.1.SN');
|
|
732
|
-
if (state && state?.value !== '') this.deviceInfo.numberBatteryUnits = 1;
|
|
733
|
-
state = this.stateCache.get(path+'battery.unit.2.SN');
|
|
734
|
-
if (state && state?.value !== '') this.deviceInfo.numberBatteryUnits += 1;
|
|
735
919
|
}
|
|
736
920
|
},
|
|
737
921
|
{
|
|
@@ -758,6 +942,27 @@ class InverterSun2000 extends DriverBase{
|
|
|
758
942
|
return value;
|
|
759
943
|
}
|
|
760
944
|
|
|
945
|
+
//V0.12
|
|
946
|
+
_batteryExists(path,unit=0,pack=0) {
|
|
947
|
+
if (unit === 0) {
|
|
948
|
+
if (!this.adapter.settings.ds.batteryUnits) return false;
|
|
949
|
+
const state1 = this.stateCache.get(path+'battery.unit.1.SN');
|
|
950
|
+
const state2 = this.stateCache.get(path+'battery.unit.2.SN');
|
|
951
|
+
return (state1 && state1.value) || (state2 && state2.value);
|
|
952
|
+
} else {
|
|
953
|
+
if (pack === 0) {
|
|
954
|
+
const state = this.stateCache.get(`${path}battery.unit.${unit}.SN`);
|
|
955
|
+
return this.adapter.settings.ds.batteryUnits && state && state.value;
|
|
956
|
+
//return (state && 'test');
|
|
957
|
+
} else {
|
|
958
|
+
const state = this.stateCache.get(`${path}battery.unit.${unit}.batteryPack.${pack}.SN`);
|
|
959
|
+
return this.adapter.settings.ds.batteryPacks && state && state.value;
|
|
960
|
+
//return state && state.value;
|
|
961
|
+
//return (state && 'test');
|
|
962
|
+
}
|
|
963
|
+
}
|
|
964
|
+
}
|
|
965
|
+
|
|
761
966
|
//overload
|
|
762
967
|
get modbusAllowed () {
|
|
763
968
|
//if the modbus-device offline we cannot read or write anythink!
|
|
@@ -831,10 +1036,9 @@ class InverterSun2000_M1 extends InverterSun2000{
|
|
|
831
1036
|
}]
|
|
832
1037
|
},
|
|
833
1038
|
{
|
|
834
|
-
|
|
835
1039
|
address : 37700,
|
|
836
1040
|
length : 10,
|
|
837
|
-
info : 'battery unit2 indicator',
|
|
1041
|
+
info : 'battery unit2 (indicator)',
|
|
838
1042
|
states: [
|
|
839
1043
|
{
|
|
840
1044
|
state: { id: 'battery.unit.2.SN', name: 'serial number', type: 'string', unit: '', role: 'value', desc: 'reg:37700, len:10'},
|
|
@@ -851,12 +1055,72 @@ class InverterSun2000_M1 extends InverterSun2000{
|
|
|
851
1055
|
}
|
|
852
1056
|
}
|
|
853
1057
|
},
|
|
1058
|
+
{
|
|
1059
|
+
address : 38326,
|
|
1060
|
+
length : 10,
|
|
1061
|
+
info : 'battery unit2 Pack1 (indicator)',
|
|
1062
|
+
states: [
|
|
1063
|
+
{
|
|
1064
|
+
state: { id: 'battery.unit.2.batteryPack.1.SN', name: 'serial number', type: 'string', unit: '', role: 'value'},
|
|
1065
|
+
register: { reg: 38326, type: dataType.string, length: 6},
|
|
1066
|
+
store: storeType.never
|
|
1067
|
+
},
|
|
1068
|
+
],
|
|
1069
|
+
readErrorHook: (err,reg) => {
|
|
1070
|
+
//modbus Error 2 - illegal address
|
|
1071
|
+
if(err.modbusCode === 2) {
|
|
1072
|
+
reg.lastread = this._newNowTime(); //try it once
|
|
1073
|
+
this.stateCache.set(this._getStatePath(reg.type)+'battery.unit.2.batteryPack.1.SN', '', { stored : true });
|
|
1074
|
+
return true; //error self handle
|
|
1075
|
+
}
|
|
1076
|
+
}
|
|
1077
|
+
},
|
|
1078
|
+
{
|
|
1079
|
+
address : 38368,
|
|
1080
|
+
length : 10,
|
|
1081
|
+
info : 'battery unit2 Pack2 (indicator)',
|
|
1082
|
+
states: [
|
|
1083
|
+
{
|
|
1084
|
+
state: { id: 'battery.unit.2.batteryPack.2.SN', name: 'serial number', type: 'string', unit: '', role: 'value'},
|
|
1085
|
+
register: { reg: 38368, type: dataType.string, length: 6},
|
|
1086
|
+
store: storeType.never
|
|
1087
|
+
},
|
|
1088
|
+
],
|
|
1089
|
+
readErrorHook: (err,reg) => {
|
|
1090
|
+
//modbus Error 2 - illegal address
|
|
1091
|
+
if(err.modbusCode === 2) {
|
|
1092
|
+
reg.lastread = this._newNowTime(); //try it once
|
|
1093
|
+
this.stateCache.set(this._getStatePath(reg.type)+'battery.unit.2.batteryPack.2.SN', '', { stored : true });
|
|
1094
|
+
return true; //error self handle
|
|
1095
|
+
}
|
|
1096
|
+
}
|
|
1097
|
+
},
|
|
1098
|
+
{
|
|
1099
|
+
address : 38410,
|
|
1100
|
+
length : 10,
|
|
1101
|
+
info : 'battery unit1 Pack3 (indicator)',
|
|
1102
|
+
states: [
|
|
1103
|
+
{
|
|
1104
|
+
state: { id: 'battery.unit.1.batteryPack.3.SN', name: 'serial number', type: 'string', unit: '', role: 'value'},
|
|
1105
|
+
register: { reg: 38410, type: dataType.string, length: 6},
|
|
1106
|
+
store: storeType.never
|
|
1107
|
+
},
|
|
1108
|
+
],
|
|
1109
|
+
readErrorHook: (err,reg) => {
|
|
1110
|
+
//modbus Error 2 - illegal address
|
|
1111
|
+
if(err.modbusCode === 2) {
|
|
1112
|
+
reg.lastread = this._newNowTime(); //try it once
|
|
1113
|
+
this.stateCache.set(this._getStatePath(reg.type)+'battery.unit.1.batteryPack.3.SN', '', { stored : true });
|
|
1114
|
+
return true; //error self handle
|
|
1115
|
+
}
|
|
1116
|
+
}
|
|
1117
|
+
},
|
|
854
1118
|
{
|
|
855
1119
|
address : 37738,
|
|
856
1120
|
length : 15,
|
|
857
1121
|
info : 'battery unit2 information',
|
|
858
1122
|
refresh : dataRefreshRate.low,
|
|
859
|
-
type : deviceType.
|
|
1123
|
+
type : deviceType.battery,
|
|
860
1124
|
states: [
|
|
861
1125
|
{
|
|
862
1126
|
state: {id: 'battery.unit.2.batterySOC', name: 'battery SOC', type: 'number', unit: '%', role: 'value.battery', desc: 'reg:37738, len:1'},
|
|
@@ -872,20 +1136,138 @@ class InverterSun2000_M1 extends InverterSun2000{
|
|
|
872
1136
|
register: {reg: 37752, type: dataType.uint16, gain:10},
|
|
873
1137
|
mapper: value => Promise.resolve(this._checkValidNumber(value,-100,100))
|
|
874
1138
|
}
|
|
875
|
-
]
|
|
1139
|
+
],
|
|
1140
|
+
checkIfActive: (path) => this._batteryExists(path,2)
|
|
876
1141
|
},
|
|
877
1142
|
{ //for NRGKick
|
|
878
1143
|
address : 47089,
|
|
879
1144
|
length : 1,
|
|
880
1145
|
info : 'battery unit2 (static)',
|
|
881
|
-
type : deviceType.
|
|
1146
|
+
type : deviceType.battery,
|
|
882
1147
|
states: [
|
|
883
1148
|
{
|
|
884
1149
|
state: { id: 'battery.unit.2.productMode', name: 'Product Mode', type: 'number', unit: '', role: 'value', desc: 'reg:37089, len:1'},
|
|
885
1150
|
register: { reg: 47089, type: dataType.uint16}
|
|
886
1151
|
},
|
|
887
|
-
]
|
|
1152
|
+
],
|
|
1153
|
+
checkIfActive: (path) => this._batteryExists(path,2)
|
|
1154
|
+
},
|
|
1155
|
+
//--V0.12
|
|
1156
|
+
{
|
|
1157
|
+
address : 38355,
|
|
1158
|
+
length : 13,
|
|
1159
|
+
info : 'battery Pack 1 information',
|
|
1160
|
+
refresh : dataRefreshRate.low,
|
|
1161
|
+
type : deviceType.battery,
|
|
1162
|
+
states: [
|
|
1163
|
+
{
|
|
1164
|
+
state: {id: 'battery.unit.2.batteryPack.1.SOC', name: 'State of capacity', type: 'number', unit: '%', role: 'value.battery', desc: 'reg:38355, len:1'},
|
|
1165
|
+
register: {reg: 38355, type: dataType.uint16, gain: 10}
|
|
1166
|
+
},
|
|
1167
|
+
{
|
|
1168
|
+
state: {id: 'battery.unit.2.batteryPack.1.totalCharge', name: 'Total Charge', type: 'number', unit: 'kWh', role: 'value.power.consumption', desc: 'reg:38364, len:2'},
|
|
1169
|
+
register: {reg: 38364, type: dataType.uint32, gain: 100}
|
|
1170
|
+
},
|
|
1171
|
+
{
|
|
1172
|
+
state: {id: 'battery.unit.2.batteryPack.1.totalDischarge', name: 'Total Discharge', type: 'number', unit: 'kWh', role: 'value.power.consumption', desc: 'reg:38366, len:2'},
|
|
1173
|
+
register: {reg: 38366, type: dataType.uint32, gain: 100}
|
|
1174
|
+
}
|
|
1175
|
+
],
|
|
1176
|
+
checkIfActive: (path) => this._batteryExists(path,2,1)
|
|
1177
|
+
},
|
|
1178
|
+
{
|
|
1179
|
+
address : 38397,
|
|
1180
|
+
length : 13,
|
|
1181
|
+
info : 'battery Pack 2 information',
|
|
1182
|
+
refresh : dataRefreshRate.low,
|
|
1183
|
+
type : deviceType.battery,
|
|
1184
|
+
states: [
|
|
1185
|
+
{
|
|
1186
|
+
state: {id: 'battery.unit.2.batteryPack.2.SOC', name: 'State of capacity', type: 'number', unit: '%', role: 'value.battery', desc: 'reg:38397, len:1'},
|
|
1187
|
+
register: {reg: 38397, type: dataType.uint16, gain: 10}
|
|
1188
|
+
},
|
|
1189
|
+
{
|
|
1190
|
+
state: {id: 'battery.unit.2.batteryPack.2.totalCharge', name: 'Total Charge', type: 'number', unit: 'kWh', role: 'value.power.consumption', desc: 'reg:38406, len:2'},
|
|
1191
|
+
register: {reg: 38406, type: dataType.uint32, gain: 100}
|
|
1192
|
+
},
|
|
1193
|
+
{
|
|
1194
|
+
state: {id: 'battery.unit.2.batteryPack.2.totalDischarge', name: 'Total Discharge', type: 'number', unit: 'kWh', role: 'value.power.consumption', desc: 'reg:38408, len:2'},
|
|
1195
|
+
register: {reg: 38408, type: dataType.uint32, gain: 100}
|
|
1196
|
+
}
|
|
1197
|
+
],
|
|
1198
|
+
checkIfActive: (path) => this._batteryExists(path,2,2)
|
|
1199
|
+
},
|
|
1200
|
+
{
|
|
1201
|
+
address : 38439,
|
|
1202
|
+
length : 13,
|
|
1203
|
+
info : 'battery Pack 3 information',
|
|
1204
|
+
refresh : dataRefreshRate.low,
|
|
1205
|
+
type : deviceType.battery,
|
|
1206
|
+
states: [
|
|
1207
|
+
{
|
|
1208
|
+
state: {id: 'battery.unit.2.batteryPack.3.SOC', name: 'State of capacity', type: 'number', unit: '%', role: 'value.battery', desc: 'reg:38439, len:1'},
|
|
1209
|
+
register: {reg: 38439, type: dataType.uint16, gain: 10}
|
|
1210
|
+
},
|
|
1211
|
+
{
|
|
1212
|
+
state: {id: 'battery.unit.2.batteryPack.3.totalCharge', name: 'Total Charge', type: 'number', unit: 'kWh', role: 'value.power.consumption', desc: 'reg:38448, len:2'},
|
|
1213
|
+
register: {reg: 38448, type: dataType.uint32, gain: 100}
|
|
1214
|
+
},
|
|
1215
|
+
{
|
|
1216
|
+
state: {id: 'battery.unit.2.batteryPack.3.totalDischarge', name: 'Total Discharge', type: 'number', unit: 'kWh', role: 'value.power.consumption', desc: 'reg:38450, len:2'},
|
|
1217
|
+
register: {reg: 38450, type: dataType.uint32, gain: 100}
|
|
1218
|
+
}
|
|
1219
|
+
],
|
|
1220
|
+
checkIfActive: (path) => this._batteryExists(path,2,3)
|
|
1221
|
+
},
|
|
1222
|
+
{
|
|
1223
|
+
address : 38359,
|
|
1224
|
+
length : 3,
|
|
1225
|
+
info : 'Battery Pack 1 Charge And Discharge Power',
|
|
1226
|
+
refresh : dataRefreshRate.high,
|
|
1227
|
+
type : deviceType.battery,
|
|
1228
|
+
states : [{
|
|
1229
|
+
state: {id: 'battery.unit.2.batteryPack.1.chargeDischargePower', name: 'Charge/Discharge power', desc: 'reg:38359, len:2 (>0 charging, <0 discharging)', type: 'number', unit: 'kW', role: 'value.power'},
|
|
1230
|
+
register: {reg: 38359, type: dataType.int32, gain:1000}
|
|
1231
|
+
},
|
|
1232
|
+
{
|
|
1233
|
+
state: {id: 'battery.unit.2.batteryPack.1.voltage', name: 'Voltage', type: 'number', unit: 'V', role: 'value.voltage', desc: 'reg:38361, len:1'},
|
|
1234
|
+
register: {reg: 38361, type: dataType.uint16, gain: 10},
|
|
1235
|
+
}],
|
|
1236
|
+
checkIfActive: (path) => this._batteryExists(path,2,1)
|
|
1237
|
+
},
|
|
1238
|
+
{
|
|
1239
|
+
address : 38401,
|
|
1240
|
+
length : 3,
|
|
1241
|
+
info : 'Battery Pack 2 Charge And Discharge Power',
|
|
1242
|
+
refresh : dataRefreshRate.high,
|
|
1243
|
+
type : deviceType.battery,
|
|
1244
|
+
states : [{
|
|
1245
|
+
state: {id: 'battery.unit.2.batteryPack.2.chargeDischargePower', name: 'Charge/Discharge power', desc: 'reg:38401, len:2 (>0 charging, <0 discharging)', type: 'number', unit: 'kW', role: 'value.power'},
|
|
1246
|
+
register: {reg: 38401, type: dataType.int32, gain:1000}
|
|
1247
|
+
},
|
|
1248
|
+
{
|
|
1249
|
+
state: {id: 'battery.unit.2.batteryPack.2.voltage', name: 'Voltage', type: 'number', unit: 'V', role: 'value.voltage', desc: 'reg:38403, len:1'},
|
|
1250
|
+
register: {reg: 38403, type: dataType.uint16, gain: 10},
|
|
1251
|
+
}],
|
|
1252
|
+
checkIfActive: (path) => this._batteryExists(path,2,2)
|
|
1253
|
+
},
|
|
1254
|
+
{
|
|
1255
|
+
address : 38443,
|
|
1256
|
+
length : 3,
|
|
1257
|
+
info : 'Battery Pack 3 Charge And Discharge Power',
|
|
1258
|
+
refresh : dataRefreshRate.high,
|
|
1259
|
+
type : deviceType.battery,
|
|
1260
|
+
states : [{
|
|
1261
|
+
state: {id: 'battery.unit.2.batteryPack.3.chargeDischargePower', name: 'Charge/Discharge power', desc: 'reg:38443, len:2 (>0 charging, <0 discharging)', type: 'number', unit: 'kW', role: 'value.power'},
|
|
1262
|
+
register: {reg: 38443, type: dataType.int32, gain:1000}
|
|
1263
|
+
},
|
|
1264
|
+
{
|
|
1265
|
+
state: {id: 'battery.unit.2.batteryPack.3.voltage', name: 'Voltage', type: 'number', unit: 'V', role: 'value.voltage', desc: 'reg:38445, len:1'},
|
|
1266
|
+
register: {reg: 38445, type: dataType.uint16, gain: 10},
|
|
1267
|
+
}],
|
|
1268
|
+
checkIfActive: (path) => this._batteryExists(path,2,3)
|
|
888
1269
|
}
|
|
1270
|
+
//++
|
|
889
1271
|
];
|
|
890
1272
|
this.registerFields.push.apply(this.registerFields,newFields);
|
|
891
1273
|
}
|
package/lib/register.js
CHANGED
|
@@ -218,8 +218,15 @@ class Registers {
|
|
|
218
218
|
for (const [i, reg] of device.instance.registerFields.entries()) {
|
|
219
219
|
if (!device.instance.modbusAllowed) continue; //standby
|
|
220
220
|
if (reg.type == deviceType.meter && !device?.meter) continue; //not meter
|
|
221
|
+
/*
|
|
221
222
|
if (reg.type == deviceType.battery && device?.numberBatteryUnits == 0) continue; //battery
|
|
222
223
|
if (reg.type == deviceType.batteryUnit2 && device?.numberBatteryUnits < 2) continue; //battery Unit2
|
|
224
|
+
|
|
225
|
+
if (reg.type == deviceType.battery && device?.battery.unit1.exist === false && device?.battery.unit2.exist === false) continue; //battery exist
|
|
226
|
+
if (reg.type == deviceType.batteryUnit2 && device?.battery.unit2.exist === false) continue; //battery Unit2
|
|
227
|
+
*/
|
|
228
|
+
if (reg.checkIfActive && !reg.checkIfActive(device.instance._getStatePath(reg.type))) continue; //NEW, PATH
|
|
229
|
+
|
|
223
230
|
if (reg.type == deviceType.gridPowerControl && !device?.meter) continue; //power control v0.8.x
|
|
224
231
|
if (reg.states && reg.refresh) {
|
|
225
232
|
const lastread = reg.lastread;
|
package/lib/types.js
CHANGED
|
@@ -61,14 +61,8 @@ const dataRefreshRate = {
|
|
|
61
61
|
medium: 'medium',
|
|
62
62
|
high : 'high',
|
|
63
63
|
compare (refresh,fieldRefresh) {
|
|
64
|
-
//v0.4.0
|
|
65
64
|
if (refresh === this.high) return (fieldRefresh === this.high);
|
|
66
65
|
else return (fieldRefresh !== this.high);
|
|
67
|
-
/*
|
|
68
|
-
if (refresh !== this.high && fieldRefresh === undefined) return true;
|
|
69
|
-
if (fieldRefresh === this.medium && refresh === this.low) return true;
|
|
70
|
-
return (fieldRefresh === refresh );
|
|
71
|
-
*/
|
|
72
66
|
}
|
|
73
67
|
};
|
|
74
68
|
|
|
@@ -76,7 +70,6 @@ const deviceType = {
|
|
|
76
70
|
inverter : 'inverter', //default
|
|
77
71
|
meter : 'meter',
|
|
78
72
|
battery : 'battery',
|
|
79
|
-
batteryUnit2 : 'batteryUnit2',
|
|
80
73
|
gridPowerControl : 'gridPowerControl' //v8.0.x
|
|
81
74
|
};
|
|
82
75
|
|
package/main.js
CHANGED
|
@@ -59,6 +59,10 @@ class Sun2000 extends utils.Adapter {
|
|
|
59
59
|
},
|
|
60
60
|
cb: {
|
|
61
61
|
tou : false
|
|
62
|
+
},
|
|
63
|
+
ds: {
|
|
64
|
+
batteryUnits : true,
|
|
65
|
+
batterPacks : false
|
|
62
66
|
}
|
|
63
67
|
};
|
|
64
68
|
|
|
@@ -339,6 +343,10 @@ class Sun2000 extends utils.Adapter {
|
|
|
339
343
|
this.settings.sl.meterId = this.config.sl_meterId;
|
|
340
344
|
//battery charge control
|
|
341
345
|
this.settings.cb.tou = this.config.cb_tou;
|
|
346
|
+
//data scope
|
|
347
|
+
this.settings.ds.batteryUnits = this.config.ds_bu;
|
|
348
|
+
this.settings.ds.batteryPacks = this.config.ds_bp;
|
|
349
|
+
|
|
342
350
|
|
|
343
351
|
if (this.settings.modbusAdjust) {
|
|
344
352
|
await this.setState('info.JSONhealth', {val: '{message: "Adjust modbus settings"}', ack: true});
|
|
@@ -354,8 +362,7 @@ class Sun2000 extends utils.Adapter {
|
|
|
354
362
|
duration: 5000,
|
|
355
363
|
modbusId: id,
|
|
356
364
|
driverClass: driverClasses.inverter,
|
|
357
|
-
meter: (i==0 && !this.settings.sl.active)
|
|
358
|
-
numberBatteryUnits : 0
|
|
365
|
+
meter: (i==0 && !this.settings.sl.active)
|
|
359
366
|
});
|
|
360
367
|
}
|
|
361
368
|
//SmartLogger
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.sun2000",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"description": "sun2000",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "bolliy",
|
|
@@ -10,9 +10,14 @@
|
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"keywords": [
|
|
12
12
|
"ioBroker",
|
|
13
|
-
"template",
|
|
14
13
|
"Smart Home",
|
|
15
|
-
"home automation"
|
|
14
|
+
"home automation",
|
|
15
|
+
"inverter",
|
|
16
|
+
"sun2000",
|
|
17
|
+
"modbus",
|
|
18
|
+
"modbus-proxy",
|
|
19
|
+
"smartlogger",
|
|
20
|
+
"huawei"
|
|
16
21
|
],
|
|
17
22
|
"repository": {
|
|
18
23
|
"type": "git",
|
|
@@ -23,33 +28,33 @@
|
|
|
23
28
|
},
|
|
24
29
|
"dependencies": {
|
|
25
30
|
"@iobroker/adapter-core": "^3.1.6",
|
|
26
|
-
"modbus-serial": "^8.0.
|
|
31
|
+
"modbus-serial": "^8.0.17",
|
|
27
32
|
"suncalc2": "^1.8.1",
|
|
28
33
|
"tcp-port-used": "^1.0.2"
|
|
29
34
|
},
|
|
30
35
|
"devDependencies": {
|
|
31
|
-
"@alcalzone/release-script": "^3.
|
|
32
|
-
"@alcalzone/release-script-plugin-iobroker": "^3.7.
|
|
36
|
+
"@alcalzone/release-script": "^3.8.0",
|
|
37
|
+
"@alcalzone/release-script-plugin-iobroker": "^3.7.2",
|
|
33
38
|
"@alcalzone/release-script-plugin-license": "^3.7.0",
|
|
34
39
|
"@alcalzone/release-script-plugin-manual-review": "^3.7.0",
|
|
35
40
|
"@iobroker/adapter-dev": "^1.3.0",
|
|
36
41
|
"@iobroker/testing": "^4.1.3",
|
|
37
42
|
"@tsconfig/node16": "^16.1.3",
|
|
38
|
-
"@types/chai": "^4.3.
|
|
43
|
+
"@types/chai": "^4.3.19",
|
|
39
44
|
"@types/chai-as-promised": "^7.1.8",
|
|
40
|
-
"@types/mocha": "^10.0.
|
|
41
|
-
"@types/node": "^
|
|
45
|
+
"@types/mocha": "^10.0.7",
|
|
46
|
+
"@types/node": "^22.5.5",
|
|
42
47
|
"@types/proxyquire": "^1.3.31",
|
|
43
48
|
"@types/sinon": "^17.0.3",
|
|
44
49
|
"@types/sinon-chai": "^3.2.12",
|
|
45
|
-
"chai": "^4.
|
|
46
|
-
"chai-as-promised": "^7.1.
|
|
50
|
+
"chai": "^4.5.0",
|
|
51
|
+
"chai-as-promised": "^7.1.2",
|
|
47
52
|
"eslint": "^8.57.0",
|
|
48
|
-
"mocha": "^10.
|
|
53
|
+
"mocha": "^10.7.3",
|
|
49
54
|
"proxyquire": "^2.1.3",
|
|
50
55
|
"sinon": "^18.0.0",
|
|
51
56
|
"sinon-chai": "^3.7.0",
|
|
52
|
-
"typescript": "~5.
|
|
57
|
+
"typescript": "~5.5.2"
|
|
53
58
|
},
|
|
54
59
|
"main": "main.js",
|
|
55
60
|
"files": [
|