iobroker.sun2000 0.6.2 → 0.7.1
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 +25 -7
- package/admin/sun2000.png +0 -0
- package/io-package.json +72 -48
- package/lib/controls/service_queue.js +33 -1
- package/lib/drivers/driver_base.js +2 -1
- package/lib/drivers/driver_inverter.js +10 -9
- package/lib/drivers/driver_sdongle.js +2 -2
- package/lib/types.js +5 -5
- package/main.js +4 -2
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -5,7 +5,11 @@
|
|
|
5
5
|
[](https://www.npmjs.com/package/iobroker.sun2000)
|
|
6
6
|

|
|
7
7
|

|
|
8
|
-
[](
|
|
8
|
+
[](https://github.com/bolliy/ioBroker.sun2000/blob/main/docs/README.md)
|
|
9
|
+
[](https://github.com/bolliy/ioBroker.sun2000/wiki)
|
|
10
|
+
[](https://www.paypal.com/donate/?hosted_button_id=ZTX3VP9LZBDCG)
|
|
11
|
+
[](https://github.com/sponsors/bolliy)
|
|
12
|
+
|
|
9
13
|
|
|
10
14
|
[](https://nodei.co/npm/iobroker.sun2000/)
|
|
11
15
|
|
|
@@ -17,16 +21,20 @@ Sentry reporting is used starting with js-controller 3.0.
|
|
|
17
21
|
|
|
18
22
|
## sun2000 adapter for ioBroker
|
|
19
23
|
|
|
20
|
-
Read register data from Huawei SUN2000 inverter and LUNA2000 battery using Modbus TCP.
|
|
24
|
+
Read and write register data from Huawei SUN2000 inverter and LUNA2000 battery using Modbus TCP. Third-party devices can be integrated via the modbus proxy. Even a Huawei SmartLogger can be integrated.
|
|
21
25
|
|
|
22
26
|
[Huawei product information](https://solar.huawei.com/en/professionals/all-products?residential-smart-pv)
|
|
23
27
|
|
|
24
28
|
Feel free to follow the discussions in the german [iobroker forum](https://forum.iobroker.net/topic/71768/test-adapter-sun2000-v0-1-x-huawei-wechselrichter)
|
|
25
29
|
|
|
30
|
+
## Dependencies
|
|
31
|
+
* Node.js 18.x or higher
|
|
32
|
+
* ioBroker host (js-controller) 5.x or higher
|
|
33
|
+
|
|
26
34
|
## Documentation
|
|
27
35
|
|
|
28
|
-
See the [documentation page](
|
|
29
|
-
browse in the [wiki](https://github.com/bolliy/ioBroker.sun2000/wiki)
|
|
36
|
+
See the [documentation page](https://github.com/bolliy/ioBroker.sun2000/blob/main/docs/README.md) or
|
|
37
|
+
browse in the [wiki](https://github.com/bolliy/ioBroker.sun2000/wiki)
|
|
30
38
|
|
|
31
39
|
## Supported hardware
|
|
32
40
|
|
|
@@ -52,9 +60,17 @@ browse in the [wiki](https://github.com/bolliy/ioBroker.sun2000/wiki)
|
|
|
52
60
|
Placeholder for the next version (at the beginning of the line):
|
|
53
61
|
### **WORK IN PROGRESS**
|
|
54
62
|
-->
|
|
63
|
+
### 0.7.1 (2024-04-09)
|
|
64
|
+
* inverter model name too many characters #73
|
|
65
|
+
|
|
66
|
+
### 0.7.0 (2024-04-03)
|
|
67
|
+
* breaking changes
|
|
68
|
+
- Node.js 18.x or higher required
|
|
69
|
+
- ioBroker host (js-controller) 5.x or higher
|
|
70
|
+
|
|
55
71
|
### 0.6.2 (2024-03-31)
|
|
56
72
|
* standby detection adjusted
|
|
57
|
-
*
|
|
73
|
+
* improvement of logs
|
|
58
74
|
|
|
59
75
|
### 0.6.1 (2024-03-23)
|
|
60
76
|
* Battery control: After the second failed attempt, the control event is discarded
|
|
@@ -65,7 +81,7 @@ browse in the [wiki](https://github.com/bolliy/ioBroker.sun2000/wiki)
|
|
|
65
81
|
* fix the standby detection #60
|
|
66
82
|
|
|
67
83
|
### 0.5.1 (2024-03-11)
|
|
68
|
-
*
|
|
84
|
+
* config page restructured
|
|
69
85
|
* read only the required string data
|
|
70
86
|
* fix interval medium
|
|
71
87
|
|
|
@@ -153,4 +169,6 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
153
169
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
154
170
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
155
171
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
156
|
-
SOFTWARE.
|
|
172
|
+
SOFTWARE.
|
|
173
|
+
|
|
174
|
+
[def]: https://github.com/bolliy/ioBroker.sun2000/wiki
|
package/admin/sun2000.png
CHANGED
|
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.7.1",
|
|
5
5
|
"news": {
|
|
6
|
+
"0.7.1": {
|
|
7
|
+
"en": "inverter model name too many characters #73",
|
|
8
|
+
"de": "wechselrichter modellname zu viele zeichen #73",
|
|
9
|
+
"ru": "инверторное имя модели слишком много символов #73",
|
|
10
|
+
"pt": "inversor nome modelo muitos caracteres #73",
|
|
11
|
+
"nl": "inverter modelnaam te veel tekens #73",
|
|
12
|
+
"fr": "nom de modèle d'onduleur trop de caractères #73",
|
|
13
|
+
"it": "inverter nome modello troppi personaggi #73",
|
|
14
|
+
"es": "inverter nombre de modelo demasiados caracteres #73",
|
|
15
|
+
"pl": "inverter model nazwa zbyt wiele znaków # 73",
|
|
16
|
+
"uk": "ім'я інвертора занадто багато символів #73",
|
|
17
|
+
"zh-cn": "翻转模型名称过多字符 # 73"
|
|
18
|
+
},
|
|
19
|
+
"0.7.0": {
|
|
20
|
+
"en": "breaking changes\nNode.js 18.x or higher required\nioBroker host (js-controller) 5.x or higher",
|
|
21
|
+
"de": "änderungen\nNode.js 18.x oder höher erforderlich\nioBroker Host (js-controller) 5.x oder höher",
|
|
22
|
+
"ru": "изменения\nNode.js 18.x или выше требуется\nioBroker host (js-controller) 5.x или выше",
|
|
23
|
+
"pt": "alterações de ruptura\nNode.js 18.x ou superior requerido\nhospedeiro ioBroker (js-controller) 5.x ou superior",
|
|
24
|
+
"nl": "wijzigingen breken\nNode.js 18.x of hoger vereist\nioBroker host (js-controller) 5.x of hoger",
|
|
25
|
+
"fr": "casser les changements\nNode.js 18.x ou plus requis\nioBroker host (js-controller) 5.x ou plus",
|
|
26
|
+
"it": "cambiamenti di rottura\nNode.js 18.x o superiore richiesto\nioBroker host (js-controller) 5.x o superiore",
|
|
27
|
+
"es": "cambios de ruptura\nNode.js 18.x o superior requerido\nioBroker host (js-controller) 5.x o superior",
|
|
28
|
+
"pl": "łamanie zmian\nNode.js 18,x lub wyższa wymagana\njoBroker host (kontroler js-) 5.x lub wyższy",
|
|
29
|
+
"uk": "поломка змін\nNode.js 18.x або вище потрібно\nioBroker host (js-controller) 5.x або вище",
|
|
30
|
+
"zh-cn": "断开更改\n所需节点.js 18.x或更高\nioBroker 主机(js-controller) 5.x或更高"
|
|
31
|
+
},
|
|
6
32
|
"0.6.2": {
|
|
7
33
|
"en": "standby detection adjusted\nImprovement of logs",
|
|
8
34
|
"de": "standby-erkennung angepasst\nVerbesserung der Protokolle",
|
|
@@ -67,32 +93,6 @@
|
|
|
67
93
|
"pl": "Data umieszczenia w wykazie\nniektóre mierniki wskazują, że jednostka została zmieniona (na przykład sun2000.0.meter.activePowerL1) (# 56)\nsun2000 serie M2 lub wyższe mogą być również przetwarzane",
|
|
68
94
|
"uk": "Інтеграція [Huawei SmartLogger](https://support.huawei.com/enterprise/de/doc/EDOC1100130069/d8a00460)\nзмінено блок лічильників (наприклад, Sun2000.0.meter.activePowerL1) (#56)\nсонце2000 serie M2 або вище можна обробити",
|
|
69
95
|
"zh-cn": "[Huawei SmartLogger]的集成(https://support.huawei.com/economist/de/doc/EDOC110013069/d8a00460) 互联网档案馆的存檔,存档日期2013-12-20\n某些度数表示单位已更改( 例如 sun 2000. 0. meter. activePowerL1) (# 56)\n太阳2000 serie M2 或以上也可以加工"
|
|
70
|
-
},
|
|
71
|
-
"0.4.1": {
|
|
72
|
-
"en": "read PV string data slower (medium interval)",
|
|
73
|
-
"de": "pV-Stringdaten langsamer lesen (mittleres Intervall)",
|
|
74
|
-
"ru": "читать данные строки PV медленнее (средний интервал)",
|
|
75
|
-
"pt": "ler dados de cadeia de caracteres PV mais lento (intervalo médio)",
|
|
76
|
-
"nl": "lees PV-stringgegevens langzamer (medium interval)",
|
|
77
|
-
"fr": "lire les données de chaîne PV plus lentement (intervalle moyen)",
|
|
78
|
-
"it": "leggere i dati della stringa PV più lento (intervallo medio)",
|
|
79
|
-
"es": "leer datos de cadena PV más lento (intervalo medio)",
|
|
80
|
-
"pl": "odczyt danych strun fotowoltaicznych wolniej (interwał średni)",
|
|
81
|
-
"uk": "читати повільніші дані ПВ (середній інтервал)",
|
|
82
|
-
"zh-cn": "读取较慢的光电字符串数据( 中间隔)"
|
|
83
|
-
},
|
|
84
|
-
"0.4.0": {
|
|
85
|
-
"en": "detect standby mode of inverters (#34)\ndevices in standby often give incorrect values. These are assigned \"0\" (#40)\nthe modbus register and the length are stored in the description of the states\nimplemented modbus-proxy (read-only cache)\nread register data from SDongleA \nadditional loop interval medium (SDongle data)\nIntegration of [NRGkick Wallbox](https://www.nrgkick.com)\nread string data faster (high interval)",
|
|
86
|
-
"de": "standby-modus von wechselrichtern erkennen (#34)\ngeräte im Standby geben oft falsche Werte. Diese werden \"0\" zugeordnet (#40)\ndas modbusregister und die länge werden in der beschreibung der zustände gespeichert\nimplementiert modbus-proxy (nur lesen cache)\nregisterdaten von SDongleA lesen\nzusätzliches Loop-Intervallmedium (SDongle-Daten)\nIntegration von [NRGkick Wallbox](https://www.nrgkick.com)\nstringdaten schneller lesen (hohes intervall)",
|
|
87
|
-
"ru": "#34\nустройства в режиме ожидания часто дают неправильные значения. Назначены \"0\" (#40)\nрегистр modbus и длина хранятся в описании состояний\nреализованный modbus-proxy (только для чтения)\nчитать данные реестра SDongleA\nдополнительная интерактивная среда (данные SDongle)\nИнтеграция [NRGkick Wallbox] (https://www.nrgkick.com)\nчитать строковые данные быстрее (высокий интервал)",
|
|
88
|
-
"pt": "detectar modo de espera de inversores (#34)\ndispositivos em espera muitas vezes dão valores incorretos. Estes são atribuídos \"0\" (#40)\no registro do modbus e o comprimento são armazenados na descrição dos estados\nimplementado modbus-proxy (apenas leitura cache)\nler dados de registro de SDongleA\nmeio de intervalo de loop adicional (dados de SDongle)\nIntegração de [NRGkick Wallbox](https://www.nrgkick.com)\nler dados de cadeia mais rápido (alto intervalo)",
|
|
89
|
-
"nl": "de standbymodus van de inverters detecteren (#34)\napparaten in stand-by geven vaak onjuiste waarden. Deze worden toegewezen aan \"0\" (#40)\nde modbus register en de lengte worden opgeslagen in de beschrijving van de staten\ngeïmplementeerd modbus-proxy (alleen-lezen cache)\nlees registergegevens van SDongleA\nextra loopintervalmedium (SDongle-gegevens)\nIntegratie van [NRGkick Wallbox](https://www.nrgkick.com)\nlees tekstgegevens sneller (hoog interval)",
|
|
90
|
-
"fr": "détecter le mode veille des onduleurs (#34)\nles dispositifs en attente donnent souvent des valeurs incorrectes. Ils sont assignés « 0 » (#40)\nle registre modbus et la longueur sont stockés dans la description des états\nmis en œuvre modbus-proxy (cache de lecture seule)\nlire les données du registre de SDongleA\nmilieu d'intervalle de boucle supplémentaire (données SDongle)\nIntégration de [NRGkick Wallbox](https://www.nrgkick.com)\nlire les données de chaîne plus rapidement (intervalle élevé)",
|
|
91
|
-
"it": "rilevare modalità standby di inverter (#34)\ni dispositivi in standby spesso danno valori errati. Questi sono assegnati \"0\" (#40)\nil registro modbus e la lunghezza sono memorizzate nella descrizione degli stati\nimplementato modbus-proxy ( cache di sola lettura)\nleggere i dati del registro da SDongleA\nintervallo di loop aggiuntivo medio (dati del triangolo)\nIntegrazione [NRGkick Wallbox](https://www.nrgkick.com)\nleggere i dati della stringa più velocemente (alto intervallo)",
|
|
92
|
-
"es": "detectar el modo de espera de los inversores (#34)\ndispositivos en standby a menudo dan valores incorrectos. Estos son asignados \"0\" (#40)\nel registro del modbus y la longitud se almacenan en la descripción de los estados\naplicado modbus-proxy (caché de sólo lectura)\nread register data from SDongleA\nintervalo de bucle adicional medio (datos de SDongle)\nIntegración de [NRGkick Wallbox](https://www.nrgkick.com)\nleer datos de cadena más rápido (intervalo alto)",
|
|
93
|
-
"pl": "wykrywanie trybu czuwania inwerterów (# 34)\nurządzenia w trybie czuwania często dają nieprawidłowe wartości. Są one przypisane \"0\" (# 40)\nrejestr modbus i długość są przechowywane w opisie stanów\nzaimplementowany modbus- proxy (tylko read- cache)\nczytaj dane rejestru z SDongleA\ndodatkowe medium interwałowe pętli (dane SDongle)\nW związku z tym Komisja uznała, że nie ma podstaw, aby stwierdzić, że w odniesieniu do niektórych rodzajów działalności, które nie są objęte zakresem rozporządzenia (WE) nr 659 / 1999, nie można uznać, że działalność ta nie jest zgodna z rynkiem wewnętrznym\nodczyt danych łańcuchowych szybciej (wysoki interwał)",
|
|
94
|
-
"uk": "виявити режим очікування інверторів (#34)\nпристрої в режимі очікування часто дають неправильні значення. Присвоюється \"0\" (#40)\nреєстр модбусів і довжина зберігаються в описі станів\nреалізований модбус-проксі (тільки кеш)\nчитати реєстраційні дані з SDongleA\nдодатковий інтервал петлі середній (SDongle data)\nІнтеграція [NRGkick Wallbox](https://www.nrgkick.com)\nчитати дані рядка швидше (високий інтервал)",
|
|
95
|
-
"zh-cn": "检测反转器的备用模式 (# 34)\n正在待命的设备往往给出错误的值。 这些被分配为\"0\" (# 40)\nmodbus 寄存器和长度存储在状态描述中\n已执行的 modbus- 代理( 只读缓存)\n从 SDongleA 读取寄存器数据\n额外的循环间隔介质( SDongle 数据)\n整合[NRGkick Wallbox](https://www.nrgkick.com)\n更快地读取字符串数据( 高间隔)"
|
|
96
96
|
}
|
|
97
97
|
},
|
|
98
98
|
"titleLang": {
|
|
@@ -109,17 +109,17 @@
|
|
|
109
109
|
"zh-cn": "Huawei sun2000 inverter"
|
|
110
110
|
},
|
|
111
111
|
"desc": {
|
|
112
|
-
"en": "
|
|
113
|
-
"de": "Daten von bis zu 5 Huawei SUN2000 Wechselrichtern und LUNA2000 Batterien
|
|
114
|
-
"ru": "
|
|
115
|
-
"pt": "
|
|
116
|
-
"nl": "
|
|
117
|
-
"fr": "
|
|
118
|
-
"it": "
|
|
119
|
-
"es": "
|
|
120
|
-
"pl": "
|
|
121
|
-
"uk": "
|
|
122
|
-
"zh-cn": "
|
|
112
|
+
"en": "To read and write data from up to 5 Huawei SUN2000 inverters and LUNA2000 batteries via Modbus TCP. Third-party devices can be integrated via the modbus proxy.",
|
|
113
|
+
"de": "Zum Lesen und Schreiben von Daten von bis zu 5 Huawei SUN2000 Wechselrichtern und LUNA2000 Batterien über Modbus TCP. Drittgeräte können über den Modbus Proxy integriert werden.",
|
|
114
|
+
"ru": "Прочитать и писать данные до 5 инверторов Huawei SUN2000 и батарей LUNA2000 через Modbus TCP. Сторонние устройства могут быть интегрированы через modbus proxy.",
|
|
115
|
+
"pt": "Para ler e escrever dados de até 5 inversores Huawei SUN2000 e baterias LUNA2000 via Modbus TCP. Dispositivos de terceiros podem ser integrados através do proxy modbus.",
|
|
116
|
+
"nl": "Gegevens lezen en schrijven van maximaal 5 Huawei SUN2000 omvormers en LUNA2000 batterijen via Modbus TCP. De apparaten van derden kunnen worden geïntegreerd via de modbus proxy.",
|
|
117
|
+
"fr": "Pour lire et écrire des données de jusqu'à 5 onduleurs Huawei SUN2000 et batteries LUNA2000 via Modbus TCP. Les périphériques tiers peuvent être intégrés via le proxy modbus.",
|
|
118
|
+
"it": "Per leggere e scrivere dati da un massimo di 5 inverter Huawei SUN2000 e batterie LUNA2000 tramite Modbus TCP. I dispositivi di terze parti possono essere integrati tramite il proxy modbus.",
|
|
119
|
+
"es": "Para leer y escribir datos de hasta 5 inversores Huawei SUN2000 y baterías LUNA2000 a través de Modbus TCP. Los dispositivos de terceros se pueden integrar a través del modbus proxy.",
|
|
120
|
+
"pl": "Do odczytu i zapisu danych z do 5 Huawei SUN2000 inwerterów i akumulatorów LUNA2000 za pośrednictwem Modbus TCP. Urządzenia trójstronne mogą być zintegrowane za pośrednictwem proxy modbus.",
|
|
121
|
+
"uk": "Щоб читати та писати дані від 5 інверторів Huawei SUN2000 та батарей LUNA2000 через Modbus TCP. Сторонні пристрої можуть бути інтегровані через проксі модбуса.",
|
|
122
|
+
"zh-cn": "通过Modbus TCP读取和写入最多5个Huawei SUN2000反转器和LUNA2000电池的数据。 第三方设备可以通过modbus代理集成."
|
|
123
123
|
},
|
|
124
124
|
"authors": [
|
|
125
125
|
"bolliy <stephan@mante.info>"
|
|
@@ -130,7 +130,7 @@
|
|
|
130
130
|
"sun2000",
|
|
131
131
|
"luna2000",
|
|
132
132
|
"inverter",
|
|
133
|
-
"
|
|
133
|
+
"smartcharger",
|
|
134
134
|
"sdongle"
|
|
135
135
|
],
|
|
136
136
|
"tier": 2,
|
|
@@ -164,26 +164,50 @@
|
|
|
164
164
|
"condition": {
|
|
165
165
|
"operand": "and",
|
|
166
166
|
"rules": [
|
|
167
|
-
"oldVersion<=0.6.
|
|
168
|
-
"newVersion>0.6.
|
|
167
|
+
"oldVersion<=0.6.2",
|
|
168
|
+
"newVersion>0.6.2"
|
|
169
169
|
]
|
|
170
170
|
},
|
|
171
171
|
"title": {
|
|
172
|
-
"en": "node.js 18.x or higher required"
|
|
172
|
+
"en": "node.js 18.x or higher required",
|
|
173
|
+
"de": "node.js 18.x oder höher erforderlich",
|
|
174
|
+
"ru": "node.js 18.x или выше требуется",
|
|
175
|
+
"pt": "node.js 18.x ou superior requerido",
|
|
176
|
+
"nl": "node.js 18.x of hoger vereist",
|
|
177
|
+
"fr": "node.js 18.x ou plus requis",
|
|
178
|
+
"it": "node.js 18.x o superiore richiesto",
|
|
179
|
+
"es": "node.js 18.x o superior requerido",
|
|
180
|
+
"pl": "node.js 18,x lub wyższa wymagana",
|
|
181
|
+
"uk": "node.js 18.x або вище потрібно",
|
|
182
|
+
"zh-cn": "节点.js 18.x或更高"
|
|
173
183
|
},
|
|
174
184
|
"text": {
|
|
175
|
-
"en": "Please try to stay current with your Node.js version because the support is limited in time. As of now all Node.js versions below 18.x are no longer supported. (End Of Life)."
|
|
185
|
+
"en": "Please try to stay current with your Node.js version because the support is limited in time. As of now all Node.js versions below 18.x are no longer supported. (End Of Life).",
|
|
186
|
+
"de": "Bitte versuchen Sie die Node.js-Version aktuell zu halten, da die Unterstützung zeitlich begrenzt ist. Ab sofort werden alle Node.js Versionen unter 18.x nicht mehr unterstützt. (End Of Life).",
|
|
187
|
+
"ru": "Пожалуйста, попытайтесь оставаться в курсе своей версии Node.js, потому что поддержка ограничена во времени. На данный момент все версии Node.js ниже 18.x больше не поддерживаются. (Конец жизни).",
|
|
188
|
+
"pt": "Por favor, tente manter-se atual com sua versão Node.js porque o suporte é limitado a tempo. A partir de agora todas as versões do Node.js abaixo de 18.x não são mais suportadas. (End Of Life).",
|
|
189
|
+
"nl": "Probeer om actueel te blijven met uw Node.js-versie omdat de ondersteuning beperkt is in de tijd. Vanaf nu worden alle Node.js versies onder 18.x niet meer ondersteund. (Einde van het leven).",
|
|
190
|
+
"fr": "Veuillez essayer de rester à jour avec votre version Node.js car le support est limité dans le temps. Toutes les versions de Node.js sous 18.x ne sont plus prises en charge. (Fin de vie).",
|
|
191
|
+
"it": "Si prega di cercare di rimanere corrente con la versione Node.js perché il supporto è limitato nel tempo. A partire da ora tutte le versioni Node.js inferiori a 18.x non sono più supportate. (End Of Life).",
|
|
192
|
+
"es": "Por favor, trate de mantenerse actualizado con su versión Node.js porque el soporte es limitado en el tiempo. A partir de ahora todas las versiones Node.js debajo de 18.x ya no están soportadas. (End Of Life).",
|
|
193
|
+
"pl": "Proszę spróbować pozostać na bieżąco z wersją Node.js ponieważ wsparcie jest ograniczone w czasie. Od teraz wszystkie wersje Node.js poniżej 18.x nie są już obsługiwane. (Koniec życia).",
|
|
194
|
+
"uk": "Будь-ласка, будь ласка, намагайтеся постійно триматися з версією Node.js, оскільки підтримка обмежена в часі. Зараз всі версії Node.js нижче 18.x не підтримуються. (Для життя).",
|
|
195
|
+
"zh-cn": "请尝试保留您的 Node.js 版本, 因为支持时间有限 。 到目前为止,18x以下的所有Node.js版本不再被支持. (寿终."
|
|
176
196
|
},
|
|
177
|
-
"level": "
|
|
197
|
+
"level": "info",
|
|
178
198
|
"buttons": [
|
|
179
199
|
"agree",
|
|
180
200
|
"cancel"
|
|
181
|
-
]
|
|
201
|
+
],
|
|
202
|
+
"link": "https://github.com/bolliy/ioBroker.sun2000/wiki/Update-node.js",
|
|
203
|
+
"linkText": {
|
|
204
|
+
"en": "The node.js update procedure is described here."
|
|
205
|
+
}
|
|
182
206
|
}
|
|
183
207
|
],
|
|
184
208
|
"dependencies": [
|
|
185
209
|
{
|
|
186
|
-
"js-controller": ">=
|
|
210
|
+
"js-controller": ">=5.0.0"
|
|
187
211
|
}
|
|
188
212
|
],
|
|
189
213
|
"globalDependencies": [
|
|
@@ -280,7 +304,7 @@
|
|
|
280
304
|
"role": "indicator.port",
|
|
281
305
|
"read": true,
|
|
282
306
|
"write": false,
|
|
283
|
-
"desc": "
|
|
307
|
+
"desc": "Device modbus port"
|
|
284
308
|
}
|
|
285
309
|
},
|
|
286
310
|
{
|
|
@@ -295,7 +319,7 @@
|
|
|
295
319
|
"role": "indicator.id",
|
|
296
320
|
"read": true,
|
|
297
321
|
"write": false,
|
|
298
|
-
"desc": "
|
|
322
|
+
"desc": "device modbus IDs"
|
|
299
323
|
}
|
|
300
324
|
},
|
|
301
325
|
{
|
|
@@ -5,7 +5,7 @@ class ServiceQueueMap {
|
|
|
5
5
|
this.adapter = adapterInstance;
|
|
6
6
|
this.log = this.adapter.logger;
|
|
7
7
|
this.inverterInfo = inverter;
|
|
8
|
-
this._modbusClient =
|
|
8
|
+
this._modbusClient = null;
|
|
9
9
|
this._serviceMap = new Map();
|
|
10
10
|
this._eventMap = new Map();
|
|
11
11
|
this._initialized = false;
|
|
@@ -94,6 +94,36 @@ class ServiceQueueMap {
|
|
|
94
94
|
if (event.value < 0) event.value = 0;
|
|
95
95
|
return await this._writeRegisters(47242,dataType.numToArray(event.value,dataType.uint32));
|
|
96
96
|
}
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
state: {id: 'activePowerControlMode', name: 'Active Power Control Mode', type: 'number', unit: '', role: 'value', desc: 'reg:47415, len:1'},
|
|
100
|
+
type : deviceType.meter,
|
|
101
|
+
fn: async event => {
|
|
102
|
+
if (event.value > 7) event.value = 0;
|
|
103
|
+
if (event.value < 0) event.value = 0;
|
|
104
|
+
const ret = await this._writeRegisters(47415,dataType.numToArray(event.value,dataType.uint16));
|
|
105
|
+
if (ret) this.inverterInfo.instance.stateCache.set(this.inverterInfo.path+'.'+event.id, event.value);
|
|
106
|
+
return ret;
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
state: { id: 'maximumFeedGridPower', name: 'Maximum Feed Grid Power', type: 'number', unit: 'kW', role: 'value.power', desc: 'reg: 47416, len: 2'},
|
|
111
|
+
type : deviceType.meter,
|
|
112
|
+
fn: async event => {
|
|
113
|
+
const max = this.inverterInfo.instance.stateCache.get('collected.ratedCapacity')?.value ?? 0;
|
|
114
|
+
if (event.value > max/1000) event.value = 0;
|
|
115
|
+
if (event.value < -1) event.value = 0;
|
|
116
|
+
return await this._writeRegisters(47416,dataType.numToArray(event.value*1000,dataType.uint32));
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
state: { id: 'maximumFeedGridPower_percent', name: 'Maximum Feed Grid Power %', type: 'number', unit: '%', role: 'value', desc: 'reg: 47418, len: 2'},
|
|
121
|
+
type : deviceType.meter,
|
|
122
|
+
fn: async event => {
|
|
123
|
+
if (event.value > 100) event.value = 0;
|
|
124
|
+
if (event.value < 0) event.value = 0;
|
|
125
|
+
return await this._writeRegisters(47418,dataType.numToArray(event.value*10,dataType.int16));
|
|
126
|
+
}
|
|
97
127
|
}
|
|
98
128
|
];
|
|
99
129
|
|
|
@@ -104,6 +134,8 @@ class ServiceQueueMap {
|
|
|
104
134
|
for (const item of this.serviceFields) {
|
|
105
135
|
//no battery - no controls
|
|
106
136
|
if (item.type == deviceType.battery && this.inverterInfo?.numberBatteryUnits == 0) continue;
|
|
137
|
+
//if (item.type == deviceType.meter && !this.inverterInfo?.meter) continue; //v0.8.0
|
|
138
|
+
if (item.type == deviceType.meter) continue;
|
|
107
139
|
|
|
108
140
|
if (item?.state) {
|
|
109
141
|
this._serviceMap.set(item.state.id, item);
|
|
@@ -142,7 +142,7 @@ class DriverBase {
|
|
|
142
142
|
break;
|
|
143
143
|
}
|
|
144
144
|
}
|
|
145
|
-
if (!this.modbusAllowed && reg.standby !== true) continue; //standby - v0.6.
|
|
145
|
+
if (!this.modbusAllowed && reg.standby !== true) continue; //standby - v0.6.2
|
|
146
146
|
if (!dataRefreshRate.compare(refreshRate,reg.refresh)) continue; //refreshrate unequal
|
|
147
147
|
if (reg.type == deviceType.meter && this.deviceInfo?.meter == false) continue; //meter
|
|
148
148
|
if (reg.type == deviceType.battery && this.deviceInfo?.numberBatteryUnits == 0) continue; //battery
|
|
@@ -169,6 +169,7 @@ class DriverBase {
|
|
|
169
169
|
readRegisters++;
|
|
170
170
|
this._errorCount = 0;
|
|
171
171
|
} catch (err) {
|
|
172
|
+
//Only increase if modbus is not connected
|
|
172
173
|
if (err.modbusCode === undefined) this._errorCount ++;
|
|
173
174
|
if (!reg.readErrorHook || !reg.readErrorHook(err,reg)) {
|
|
174
175
|
this.log.warn(`Error while reading from ${modbusClient.ipAddress} [Reg: ${reg.address}, Len: ${reg.length}, modbusID: ${modbusClient.id}] with: ${err.message}`);
|
|
@@ -22,11 +22,11 @@ class InverterInfo extends DriverBase {
|
|
|
22
22
|
type : deviceType.inverter,
|
|
23
23
|
states: [{
|
|
24
24
|
state: {id: 'info.model', name: 'Model', type: 'string', role: 'info.name', desc: 'reg:30000, len:15'},
|
|
25
|
-
register: {reg: 30000, type: dataType.string, length:
|
|
25
|
+
register: {reg: 30000, type: dataType.string, length: 8}
|
|
26
26
|
},
|
|
27
27
|
{
|
|
28
28
|
state: {id: 'info.serialNumber', name: 'Serial number', type: 'string', role: 'info.serial', desc: 'reg:30015, len:10'},
|
|
29
|
-
register: {reg: 30015, type: dataType.string, length:
|
|
29
|
+
register: {reg: 30015, type: dataType.string, length: 6}
|
|
30
30
|
},
|
|
31
31
|
{
|
|
32
32
|
state: {id: 'info.modelID', name: 'Model ID', type: 'number', role: 'info.hardware', desc: 'reg:30070, len:1' },
|
|
@@ -70,7 +70,7 @@ class InverterInfo extends DriverBase {
|
|
|
70
70
|
this._errorCount = 0;
|
|
71
71
|
}
|
|
72
72
|
} else {
|
|
73
|
-
if (this._errorCount >
|
|
73
|
+
if (this._errorCount > 3 && this._modbusAllowed) {
|
|
74
74
|
this.log.warn('It will try again when the sun rises for modbus id '+this._modbusId+' :-)');
|
|
75
75
|
this._modbusAllowed = false;
|
|
76
76
|
}
|
|
@@ -109,7 +109,7 @@ class InverterSun2000 extends DriverBase{
|
|
|
109
109
|
type : deviceType.inverter,
|
|
110
110
|
states: [{
|
|
111
111
|
state: {id: 'info.model', name: 'Model', type: 'string', role: 'info.name'},
|
|
112
|
-
register: {reg: 30000, type: dataType.string, length:
|
|
112
|
+
register: {reg: 30000, type: dataType.string, length: 8},
|
|
113
113
|
store: storeType.never
|
|
114
114
|
},
|
|
115
115
|
{
|
|
@@ -119,7 +119,7 @@ class InverterSun2000 extends DriverBase{
|
|
|
119
119
|
},
|
|
120
120
|
{
|
|
121
121
|
state: {id: 'info.serialNumber', name: 'Serial number', type: 'string', role: 'info.serial'},
|
|
122
|
-
register: {reg: 30015, type: dataType.string, length:
|
|
122
|
+
register: {reg: 30015, type: dataType.string, length: 6},
|
|
123
123
|
store: storeType.never
|
|
124
124
|
},
|
|
125
125
|
{
|
|
@@ -212,7 +212,7 @@ class InverterSun2000 extends DriverBase{
|
|
|
212
212
|
states: [
|
|
213
213
|
{
|
|
214
214
|
state: { id: 'battery.unit.1.SN', name: 'serial number', type: 'string', unit: '', role: 'value'},
|
|
215
|
-
register: { reg: 37052, type: dataType.string, length:
|
|
215
|
+
register: { reg: 37052, type: dataType.string, length: 6},
|
|
216
216
|
store: storeType.never
|
|
217
217
|
},
|
|
218
218
|
],
|
|
@@ -385,7 +385,7 @@ class InverterSun2000 extends DriverBase{
|
|
|
385
385
|
}
|
|
386
386
|
},
|
|
387
387
|
{
|
|
388
|
-
//read also standby
|
|
388
|
+
//read also in standby mode
|
|
389
389
|
address : 32089,
|
|
390
390
|
length : 1,
|
|
391
391
|
info : 'inverter deviceStatus',
|
|
@@ -403,14 +403,15 @@ class InverterSun2000 extends DriverBase{
|
|
|
403
403
|
}
|
|
404
404
|
return value;
|
|
405
405
|
},
|
|
406
|
-
},
|
|
406
|
+
},
|
|
407
|
+
{
|
|
407
408
|
state: {id: 'derived.deviceStatus', name: 'Device Status Information', type: 'string', unit: '', role: 'value'}
|
|
408
409
|
}
|
|
409
410
|
],
|
|
410
411
|
readErrorHook: (err,reg) => { //(err,reg)
|
|
411
412
|
if (err.modbusCode === undefined) {
|
|
412
413
|
reg.lastread = this._newNowTime();
|
|
413
|
-
//return true; //Error has been handled
|
|
414
|
+
//return true; //Error has been self handled
|
|
414
415
|
}
|
|
415
416
|
},
|
|
416
417
|
postHook: (path) => {
|
|
@@ -18,11 +18,11 @@ class Sdongle extends DriverBase{
|
|
|
18
18
|
info : 'SDongle info 1',
|
|
19
19
|
states : [{
|
|
20
20
|
state: {id: 'sdongle.sn', name: 'Serial Number', type: 'string', unit: '', role: 'value', desc: 'reg:30015, len:10'},
|
|
21
|
-
register: {reg: 30015, type: dataType.string, length:
|
|
21
|
+
register: {reg: 30015, type: dataType.string, length: 6}
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
24
|
state: {id: 'sdongle.OSVersion', name: 'OS Version', type: 'string', unit: '', role: 'value', desc: 'reg:30050, len:15'},
|
|
25
|
-
register: {reg: 30050, type: dataType.string, length:
|
|
25
|
+
register: {reg: 30050, type: dataType.string, length: 8}
|
|
26
26
|
},
|
|
27
27
|
{
|
|
28
28
|
state: {id: 'sdongle.protokolVersion', name: 'Protokol Version', type: 'number', unit: '', role: 'value',desc: 'reg:30068, len:2'},
|
package/lib/types.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
|
|
1
2
|
const modbusErrorMessages =
|
|
2
3
|
[
|
|
3
4
|
'Unknown error',
|
|
@@ -190,14 +191,13 @@ const dataType = {
|
|
|
190
191
|
const bytearray = [];
|
|
191
192
|
for(let i = 0; i < length; i++)
|
|
192
193
|
{
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
}
|
|
194
|
+
bytearray.push(array[i] >> 8); //right shift
|
|
195
|
+
bytearray.push(array[i] & 0xff);
|
|
196
|
+
|
|
197
197
|
}
|
|
198
198
|
//const value = String.fromCharCode.apply(null, bytearray);
|
|
199
199
|
const value = String.fromCharCode(...bytearray);
|
|
200
|
-
return new String(value).
|
|
200
|
+
return new String(value).replace(/\0/g,'');
|
|
201
201
|
}
|
|
202
202
|
};
|
|
203
203
|
|
package/main.js
CHANGED
|
@@ -226,7 +226,7 @@ class Sun2000 extends utils.Adapter {
|
|
|
226
226
|
}, msToMidnight);
|
|
227
227
|
}
|
|
228
228
|
|
|
229
|
-
|
|
229
|
+
/*
|
|
230
230
|
sendToSentry (msg) {
|
|
231
231
|
if (this.supportsFeature && this.supportsFeature('PLUGINS')) {
|
|
232
232
|
const sentryInstance = this.getPluginInstance('sentry');
|
|
@@ -241,6 +241,7 @@ class Sun2000 extends utils.Adapter {
|
|
|
241
241
|
}
|
|
242
242
|
}
|
|
243
243
|
}
|
|
244
|
+
*/
|
|
244
245
|
|
|
245
246
|
async endOfmodbusAdjust (info) {
|
|
246
247
|
if (!info.modbusAdjust) {
|
|
@@ -340,7 +341,7 @@ class Sun2000 extends utils.Adapter {
|
|
|
340
341
|
this.settings.cb.tou = this.config.cb_tou;
|
|
341
342
|
|
|
342
343
|
if (this.settings.modbusAdjust) {
|
|
343
|
-
await this.setStateAsync('info.JSONhealth', {val: '{
|
|
344
|
+
await this.setStateAsync('info.JSONhealth', {val: '{message: "Adjust modbus settings"}', ack: true});
|
|
344
345
|
} else {
|
|
345
346
|
await this.setStateAsync('info.JSONhealth', {val: '{message : "Information is collected"}', ack: true});
|
|
346
347
|
}
|
|
@@ -375,6 +376,7 @@ class Sun2000 extends utils.Adapter {
|
|
|
375
376
|
});
|
|
376
377
|
}
|
|
377
378
|
}
|
|
379
|
+
//SDongle
|
|
378
380
|
if (this.settings.sd.active) {
|
|
379
381
|
this.devices.push({
|
|
380
382
|
index: 0,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.sun2000",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.1",
|
|
4
4
|
"description": "sun2000",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "bolliy",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"url": "https://github.com/bolliy/ioBroker.sun2000.git"
|
|
20
20
|
},
|
|
21
21
|
"engines": {
|
|
22
|
-
"node": ">=
|
|
22
|
+
"node": ">= 18"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
25
|
"@iobroker/adapter-core": "^3.0.6",
|
|
@@ -33,12 +33,12 @@
|
|
|
33
33
|
"@alcalzone/release-script-plugin-license": "^3.7.0",
|
|
34
34
|
"@alcalzone/release-script-plugin-manual-review": "^3.7.0",
|
|
35
35
|
"@iobroker/adapter-dev": "^1.3.0",
|
|
36
|
-
"@iobroker/testing": "^4.1.
|
|
37
|
-
"@tsconfig/node16": "^16.1.
|
|
36
|
+
"@iobroker/testing": "^4.1.1",
|
|
37
|
+
"@tsconfig/node16": "^16.1.3",
|
|
38
38
|
"@types/chai": "^4.3.14",
|
|
39
39
|
"@types/chai-as-promised": "^7.1.8",
|
|
40
40
|
"@types/mocha": "^10.0.4",
|
|
41
|
-
"@types/node": "^20.
|
|
41
|
+
"@types/node": "^20.12.2",
|
|
42
42
|
"@types/proxyquire": "^1.3.31",
|
|
43
43
|
"@types/sinon": "^17.0.3",
|
|
44
44
|
"@types/sinon-chai": "^3.2.12",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"proxyquire": "^2.1.3",
|
|
50
50
|
"sinon": "^17.0.1",
|
|
51
51
|
"sinon-chai": "^3.7.0",
|
|
52
|
-
"typescript": "~5.
|
|
52
|
+
"typescript": "~5.4.3"
|
|
53
53
|
},
|
|
54
54
|
"main": "main.js",
|
|
55
55
|
"files": [
|