From 041db5a767454a558269a917ad4a2633e1aa92ef Mon Sep 17 00:00:00 2001 From: ChrisHanuta Date: Wed, 1 Nov 2023 19:00:58 +0100 Subject: [PATCH] Issue with trim fixed, so E-BOX-4850P works now. eb test data added Relationships updated --- README.md | 37 ++- build/pylontech/ParserBase.js | 2 +- build/pylontech/ParserBase.js.map | 4 +- data/eb/bat 1.txt | 23 ++ data/eb/bat 2.txt | 23 ++ data/eb/info 1.txt | 23 ++ data/eb/info 2.txt | 23 ++ data/eb/log.txt | 187 ++++++++++++++ data/eb/pwr 1.txt | 30 +++ data/eb/pwr 2.txt | 30 +++ data/eb/pwr.txt | 16 ++ data/eb/soh 1.txt | 24 ++ data/eb/soh 2.txt | 24 ++ data/eb/stat 1.txt | 56 +++++ data/eb/stat 2.txt | 56 +++++ data/eb/time.txt | 8 + io-package.json | 61 +++-- media/pytes.jpg | Bin 0 -> 10857 bytes package-lock.json | 392 +++++++++++++++++------------- package.json | 36 +-- src/pylontech/ParserBase.ts | 2 +- 21 files changed, 828 insertions(+), 229 deletions(-) create mode 100644 data/eb/bat 1.txt create mode 100644 data/eb/bat 2.txt create mode 100644 data/eb/info 1.txt create mode 100644 data/eb/info 2.txt create mode 100644 data/eb/log.txt create mode 100644 data/eb/pwr 1.txt create mode 100644 data/eb/pwr 2.txt create mode 100644 data/eb/pwr.txt create mode 100644 data/eb/soh 1.txt create mode 100644 data/eb/soh 2.txt create mode 100644 data/eb/stat 1.txt create mode 100644 data/eb/stat 2.txt create mode 100644 data/eb/time.txt create mode 100644 media/pytes.jpg diff --git a/README.md b/README.md index 9e416b6..fc03759 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ ![Logo](media/logo.png) +![Logo](media/pytes.jpg) + # ioBroker.pylontech [![NPM version](https://img.shields.io/npm/v/iobroker.pylontech.svg)](https://www.npmjs.com/package/iobroker.pylontech) @@ -11,15 +13,15 @@ **Tests:** ![Test and Release](https://github.com/PLCHome/ioBroker.pylontech/workflows/Test%20and%20Release/badge.svg) -## pylontech adapter for ioBroker +## pylontech and pytes adapter for ioBroker -Query the cell voltages and the status of pylontech batteries via the console. I'm not affiliated. +Query the cell voltages and the status of pylontech or pytes batteries via the console. I'm not affiliated. **Please note that everything you build or connect is always your responsibility. The developer of this adapter assumes no liability for any damage!** ## how it works -This adapter is used to determine the health status and functions of a Pylontech array, which can consist of one or up to fifteen batteries. +This adapter is used to determine the health status and functions of a Pylontech or Pytes array, which can consist of one or up to fifteen batteries. This adapter is not used to control the battery. This is the part of a charging and power unit or an inverter. The batteries have a console connection that provides a RS232 or V24 interface. This adapter is connected to it via a serial interface. The first battery provides all the data and asks the others via the uplink. @@ -184,16 +186,19 @@ Serial Port Over WiFi: https://www.instructables.com/Serial-Port-Over-WiFi/ Tasmota can also be used: https://tasmota.github.io/docs/Serial-to-TCP-Bridge/ Only the following or self-compiled ones can be used as bin, otherwise the TCP server is not included: -* http://ota.tasmota.com/tasmota32/release/tasmota32-zbbrdgpro.bin -* http://ota.tasmota.com/tasmota/release/tasmota-zbbrdgpro.bin + +- http://ota.tasmota.com/tasmota32/release/tasmota32-zbbrdgpro.bin +- http://ota.tasmota.com/tasmota/release/tasmota-zbbrdgpro.bin The Gipos must be set beforehand. One each on TCP Rx and TCP Tx. + ``` TCPBaudRate 115200 TCPStart 23 -Rule1 ON System#Boot do TCPStart 23 endon -Rule1 1 +Rule1 ON System#Boot do TCPStart 23 endon +Rule1 1 ``` + It works because a transparent TCP server is provided on, for example, port 23. The port can be selected, simply exchange 23 for 9000, for example. **And of course solder a MAX2323 between the Gipos and the RJ/DSUB plug!!!!** @@ -252,13 +257,17 @@ What was tested: #### Batteries -| Pylontech model | Model | Firmware | Is working | Comment | -| ---------------- | ----- | ------------- | ---------- | ------------------------------------------ | -| US5000 | US | V1.3 22-08-10 | fine | | -| US2000C | US | V2.6 21-09-26 | fine | | -| US2000 (US2KBPL) | US | V2.8 21-04-29 | fine | Temperatures only in one degree increments | +| Pylontech model | Model | Firmware | Is working | Comment | +| ---------------- | ----- | ------------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | +| US5000 | US | V1.3 22-08-10 | fine | | +| US2000C | US | V2.6 21-09-26 | fine | | +| US2000 (US2KBPL) | US | V2.8 21-04-29 | fine | Temperatures only in one degree increments | | Force H2 | Force | V1.5 21-06-18 | fine | Attention: in some Force manuals only the RX and TX connections are listed in the connector description. The ground is on PIN 8 and must also be connected. | +| Pytes model | Model | Firmware | Is working | Comment | +| ----------- | ----- | ------------- | ---------- | -------------------------------------- | +| E-BOX-4850P | US | V1.3 22-12-20 | fine | Thanx to kletternaut for the test data | + If you use hardware, please write to me in the forum or in Github as an issue. We would be happy to continue this list. ioBroker forum: https://forum.iobroker.net/topic/68707 @@ -501,6 +510,10 @@ If true without ack is written to set, the current time is sent to the Pylontech ## Changelog +### 0.0.7 (01.11.2023) + +- (PLCHome) issue "Cannot read properties of undefined (reading 'trim') at Parser" fixed, so E-BOX-4850P works now. + ### 0.0.6 (09.10.2023) - (PLCHome) The sent command was recognized from the response. Now the command is passed to the parser. diff --git a/build/pylontech/ParserBase.js b/build/pylontech/ParserBase.js index 6de76db..8c07ca2 100644 --- a/build/pylontech/ParserBase.js +++ b/build/pylontech/ParserBase.js @@ -17,7 +17,7 @@ class ParserBase { let lasthead = "-X-"; if (head !== null) { for (let i = 1; i < head.length; i++) { - head[i] = head[i].trim() == "" ? `${lasthead}_` : head[i].trim(); + head[i] = !head[i] || head[i].trim() == "" ? `${lasthead}_` : head[i].trim(); lasthead = head[i]; } result[command] = {}; diff --git a/build/pylontech/ParserBase.js.map b/build/pylontech/ParserBase.js.map index 5ee3cb1..02e108e 100644 --- a/build/pylontech/ParserBase.js.map +++ b/build/pylontech/ParserBase.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../src/pylontech/ParserBase.ts"], - "sourcesContent": ["// Copyright (c) 2020-2023 Tr\u00E4ger\n\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the \"Software\"),\n// to deal in the Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense,\n// and/or sell copies of the Software, and to permit persons to whom the\n// Software is furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\n// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n// DEALINGS IN THE SOFTWARE.\n\nimport { ConvertValue } from './ConvertValue';\nimport { IParser } from './IParser';\n\nabstract class ParserBase implements IParser {\n protected _number: number | undefined;\n protected _convertValue: ConvertValue = new ConvertValue();\n protected _noConvertKeys: string[] = [];\n protected _filterKeys: string[] = ['voltage', 'battery', 'power'];\n\n protected _isParser(cmd: string, prompt: RegExp, command: string): boolean {\n const cmdParsed: RegExpExecArray | null = prompt.exec(cmd);\n this._number = cmdParsed !== null ? parseInt(cmdParsed[2]) : undefined;\n return this._number !== undefined && cmdParsed !== null && cmdParsed[1] === command;\n }\n\n protected _parseDataHeadlineN(data: string, row: RegExp, command: string, identColumn: number): any {\n const head: RegExpExecArray | null = row.exec(data);\n let result: any = {};\n let lasthead: string = '-X-';\n if (head !== null) {\n for (let i: number = 1; i < head.length; i++) {\n head[i] = head[i].trim() == '' ? `${lasthead}_` : head[i].trim();\n lasthead = head[i];\n }\n result[command] = {};\n for (let match: RegExpExecArray | null; (match = row.exec(data)) !== null; ) {\n const dat: any = {};\n for (let i: number = 1; i < match.length; i++) {\n if (match[i]) {\n dat[head[i] !== null ? head[i] : `${lasthead}_`] = match[i].trim();\n lasthead = head[i];\n }\n }\n if (identColumn > 0) {\n if (match[identColumn]) {\n result[command][match[identColumn].trim()] = dat;\n }\n } else {\n result[command] = dat;\n }\n }\n }\n if (this._number) {\n const res: any = {};\n res[this._number] = result;\n result = res;\n }\n return this._processDatatypes(result);\n }\n\n protected _parseDataNameValN(data: string, row: RegExp, command: string): any {\n let result: any = {};\n result = {};\n result[command] = {};\n let lasthead: string = '-X-';\n for (let match; (match = row.exec(data)) !== null; ) {\n if (match !== null) {\n lasthead = match[1] && match[1].trim() !== '' ? match[1].trim() : `${lasthead}_`;\n result[command][lasthead] = match[2].trim();\n }\n }\n if (this._number) {\n const res: any = {};\n res[this._number] = result;\n result = res;\n }\n return this._processDatatypes(result);\n }\n\n protected _parseNameValMultiData(data: string, row: RegExp, command: string, indexColum: string): any {\n const result: any = {};\n result[command] = {};\n let index: number = NaN;\n let lasthead: string = '-X-';\n for (let match; (match = row.exec(data)) !== null; ) {\n if (match !== null) {\n const col: string = match[1].trim() === '' ? `${lasthead}_` : match[1].trim();\n lasthead = match[1].trim();\n if (col === indexColum) {\n index = parseInt(match[2]);\n result[command][index] = {};\n }\n if (!isNaN(index)) {\n result[command][index][col] = match[2].trim();\n }\n }\n }\n return this._processDatatypes(result);\n }\n\n protected _processDatatypes(data: any): any {\n const result: any = {};\n Object.keys(data).forEach((key: string) => {\n if (typeof data[key] === 'object') {\n result[key] = this._processDatatypes(data[key]);\n } else {\n const newKey = key.replaceAll('>', '').replaceAll('.', '').replaceAll(' ', '_').replaceAll('__', '_').toLowerCase();\n if (data[key] !== '-' && !this._filterKeys.includes(newKey)) {\n result[newKey] = this._convertValue.parseValues(key, data[key], this._noConvertKeys);\n }\n }\n });\n return result;\n }\n\n abstract isParser(data: string): boolean;\n\n abstract parseData(data: string): object;\n\n getParserName(): string {\n return (this).constructor.name;\n }\n}\nexport = ParserBase;\n"], - "mappings": "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", + "sourcesContent": ["// Copyright (c) 2020-2023 Tr\u00E4ger\n\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the \"Software\"),\n// to deal in the Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense,\n// and/or sell copies of the Software, and to permit persons to whom the\n// Software is furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\n// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n// DEALINGS IN THE SOFTWARE.\n\nimport { ConvertValue } from './ConvertValue';\nimport { IParser } from './IParser';\n\nabstract class ParserBase implements IParser {\n protected _number: number | undefined;\n protected _convertValue: ConvertValue = new ConvertValue();\n protected _noConvertKeys: string[] = [];\n protected _filterKeys: string[] = ['voltage', 'battery', 'power'];\n\n protected _isParser(cmd: string, prompt: RegExp, command: string): boolean {\n const cmdParsed: RegExpExecArray | null = prompt.exec(cmd);\n this._number = cmdParsed !== null ? parseInt(cmdParsed[2]) : undefined;\n return this._number !== undefined && cmdParsed !== null && cmdParsed[1] === command;\n }\n\n protected _parseDataHeadlineN(data: string, row: RegExp, command: string, identColumn: number): any {\n const head: RegExpExecArray | null = row.exec(data);\n let result: any = {};\n let lasthead: string = '-X-';\n if (head !== null) {\n for (let i: number = 1; i < head.length; i++) {\n head[i] = !head[i] || head[i].trim() == '' ? `${lasthead}_` : head[i].trim();\n lasthead = head[i];\n }\n result[command] = {};\n for (let match: RegExpExecArray | null; (match = row.exec(data)) !== null; ) {\n const dat: any = {};\n for (let i: number = 1; i < match.length; i++) {\n if (match[i]) {\n dat[head[i] !== null ? head[i] : `${lasthead}_`] = match[i].trim();\n lasthead = head[i];\n }\n }\n if (identColumn > 0) {\n if (match[identColumn]) {\n result[command][match[identColumn].trim()] = dat;\n }\n } else {\n result[command] = dat;\n }\n }\n }\n if (this._number) {\n const res: any = {};\n res[this._number] = result;\n result = res;\n }\n return this._processDatatypes(result);\n }\n\n protected _parseDataNameValN(data: string, row: RegExp, command: string): any {\n let result: any = {};\n result = {};\n result[command] = {};\n let lasthead: string = '-X-';\n for (let match; (match = row.exec(data)) !== null; ) {\n if (match !== null) {\n lasthead = match[1] && match[1].trim() !== '' ? match[1].trim() : `${lasthead}_`;\n result[command][lasthead] = match[2].trim();\n }\n }\n if (this._number) {\n const res: any = {};\n res[this._number] = result;\n result = res;\n }\n return this._processDatatypes(result);\n }\n\n protected _parseNameValMultiData(data: string, row: RegExp, command: string, indexColum: string): any {\n const result: any = {};\n result[command] = {};\n let index: number = NaN;\n let lasthead: string = '-X-';\n for (let match; (match = row.exec(data)) !== null; ) {\n if (match !== null) {\n const col: string = match[1].trim() === '' ? `${lasthead}_` : match[1].trim();\n lasthead = match[1].trim();\n if (col === indexColum) {\n index = parseInt(match[2]);\n result[command][index] = {};\n }\n if (!isNaN(index)) {\n result[command][index][col] = match[2].trim();\n }\n }\n }\n return this._processDatatypes(result);\n }\n\n protected _processDatatypes(data: any): any {\n const result: any = {};\n Object.keys(data).forEach((key: string) => {\n if (typeof data[key] === 'object') {\n result[key] = this._processDatatypes(data[key]);\n } else {\n const newKey = key.replaceAll('>', '').replaceAll('.', '').replaceAll(' ', '_').replaceAll('__', '_').toLowerCase();\n if (data[key] !== '-' && !this._filterKeys.includes(newKey)) {\n result[newKey] = this._convertValue.parseValues(key, data[key], this._noConvertKeys);\n }\n }\n });\n return result;\n }\n\n abstract isParser(data: string): boolean;\n\n abstract parseData(data: string): object;\n\n getParserName(): string {\n return (this).constructor.name;\n }\n}\nexport = ParserBase;\n"], + "mappings": ";AAoBA,0BAA6B;AAG7B,MAAe,WAA8B;AAAA,EAA7C;AAEE,SAAU,gBAA8B,IAAI,iCAAa;AACzD,SAAU,iBAA2B,CAAC;AACtC,SAAU,cAAwB,CAAC,WAAW,WAAW,OAAO;AAAA;AAAA,EAEtD,UAAU,KAAa,QAAgB,SAA0B;AACzE,UAAM,YAAoC,OAAO,KAAK,GAAG;AACzD,SAAK,UAAU,cAAc,OAAO,SAAS,UAAU,EAAE,IAAI;AAC7D,WAAO,KAAK,YAAY,UAAa,cAAc,QAAQ,UAAU,OAAO;AAAA,EAC9E;AAAA,EAEU,oBAAoB,MAAc,KAAa,SAAiB,aAA0B;AAClG,UAAM,OAA+B,IAAI,KAAK,IAAI;AAClD,QAAI,SAAc,CAAC;AACnB,QAAI,WAAmB;AACvB,QAAI,SAAS,MAAM;AACjB,eAAS,IAAY,GAAG,IAAI,KAAK,QAAQ,KAAK;AAC5C,aAAK,KAAK,CAAC,KAAK,MAAM,KAAK,GAAG,KAAK,KAAK,KAAK,GAAG,cAAc,KAAK,GAAG,KAAK;AAC3E,mBAAW,KAAK;AAAA,MAClB;AACA,aAAO,WAAW,CAAC;AACnB,eAAS,QAAgC,QAAQ,IAAI,KAAK,IAAI,OAAO,QAAQ;AAC3E,cAAM,MAAW,CAAC;AAClB,iBAAS,IAAY,GAAG,IAAI,MAAM,QAAQ,KAAK;AAC7C,cAAI,MAAM,IAAI;AACZ,gBAAI,KAAK,OAAO,OAAO,KAAK,KAAK,GAAG,eAAe,MAAM,GAAG,KAAK;AACjE,uBAAW,KAAK;AAAA,UAClB;AAAA,QACF;AACA,YAAI,cAAc,GAAG;AACnB,cAAI,MAAM,cAAc;AACtB,mBAAO,SAAS,MAAM,aAAa,KAAK,KAAK;AAAA,UAC/C;AAAA,QACF,OAAO;AACL,iBAAO,WAAW;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AACA,QAAI,KAAK,SAAS;AAChB,YAAM,MAAW,CAAC;AAClB,UAAI,KAAK,WAAW;AACpB,eAAS;AAAA,IACX;AACA,WAAO,KAAK,kBAAkB,MAAM;AAAA,EACtC;AAAA,EAEU,mBAAmB,MAAc,KAAa,SAAsB;AAC5E,QAAI,SAAc,CAAC;AACnB,aAAS,CAAC;AACV,WAAO,WAAW,CAAC;AACnB,QAAI,WAAmB;AACvB,aAAS,QAAQ,QAAQ,IAAI,KAAK,IAAI,OAAO,QAAQ;AACnD,UAAI,UAAU,MAAM;AAClB,mBAAW,MAAM,MAAM,MAAM,GAAG,KAAK,MAAM,KAAK,MAAM,GAAG,KAAK,IAAI,GAAG;AACrE,eAAO,SAAS,YAAY,MAAM,GAAG,KAAK;AAAA,MAC5C;AAAA,IACF;AACA,QAAI,KAAK,SAAS;AAChB,YAAM,MAAW,CAAC;AAClB,UAAI,KAAK,WAAW;AACpB,eAAS;AAAA,IACX;AACA,WAAO,KAAK,kBAAkB,MAAM;AAAA,EACtC;AAAA,EAEU,uBAAuB,MAAc,KAAa,SAAiB,YAAyB;AACpG,UAAM,SAAc,CAAC;AACrB,WAAO,WAAW,CAAC;AACnB,QAAI,QAAgB;AACpB,QAAI,WAAmB;AACvB,aAAS,QAAQ,QAAQ,IAAI,KAAK,IAAI,OAAO,QAAQ;AACnD,UAAI,UAAU,MAAM;AAClB,cAAM,MAAc,MAAM,GAAG,KAAK,MAAM,KAAK,GAAG,cAAc,MAAM,GAAG,KAAK;AAC5E,mBAAW,MAAM,GAAG,KAAK;AACzB,YAAI,QAAQ,YAAY;AACtB,kBAAQ,SAAS,MAAM,EAAE;AACzB,iBAAO,SAAS,SAAS,CAAC;AAAA,QAC5B;AACA,YAAI,CAAC,MAAM,KAAK,GAAG;AACjB,iBAAO,SAAS,OAAO,OAAO,MAAM,GAAG,KAAK;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AACA,WAAO,KAAK,kBAAkB,MAAM;AAAA,EACtC;AAAA,EAEU,kBAAkB,MAAgB;AAC1C,UAAM,SAAc,CAAC;AACrB,WAAO,KAAK,IAAI,EAAE,QAAQ,CAAC,QAAgB;AACzC,UAAI,OAAO,KAAK,SAAS,UAAU;AACjC,eAAO,OAAO,KAAK,kBAAkB,KAAK,IAAI;AAAA,MAChD,OAAO;AACL,cAAM,SAAS,IAAI,WAAW,KAAK,EAAE,EAAE,WAAW,KAAK,EAAE,EAAE,WAAW,KAAK,GAAG,EAAE,WAAW,MAAM,GAAG,EAAE,YAAY;AAClH,YAAI,KAAK,SAAS,OAAO,CAAC,KAAK,YAAY,SAAS,MAAM,GAAG;AAC3D,iBAAO,UAAU,KAAK,cAAc,YAAY,KAAK,KAAK,MAAM,KAAK,cAAc;AAAA,QACrF;AAAA,MACF;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAMA,gBAAwB;AACtB,WAAa,KAAM,YAAY;AAAA,EACjC;AACF;AACA,iBAAS;", "names": [] } diff --git a/data/eb/bat 1.txt b/data/eb/bat 1.txt new file mode 100644 index 0000000..d756f0d --- /dev/null +++ b/data/eb/bat 1.txt @@ -0,0 +1,23 @@ + + PYTES> + PYTES>bat 1 + @ +Battery Volt Curr Tempr Base State Volt. State Curr. State Temp. State Coulomb +0 3217 0 25000 Idle Normal Normal Normal 77% 38286 mAH +1 3219 0 25000 Idle Normal Normal Normal 80% 39952 mAH +2 3222 0 25000 Idle Normal Normal Normal 79% 39450 mAH +3 3223 0 25000 Idle Normal Normal Normal 80% 40068 mAH +4 3219 0 25000 Idle Normal Normal Normal 79% 39472 mAH +5 3225 0 25000 Idle Normal Normal Normal 81% 40534 mAH +6 3220 0 25000 Idle Normal Normal Normal 80% 39930 mAH +7 3222 0 25000 Idle Normal Normal Normal 80% 40049 mAH +8 3220 0 25000 Idle Normal Normal Normal 80% 39885 mAH +9 3217 0 25000 Idle Normal Normal Normal 77% 38524 mAH +10 3225 0 25000 Idle Normal Normal Normal 80% 40025 mAH +11 3223 0 25000 Idle Normal Normal Normal 81% 40518 mAH +12 3222 0 25000 Idle Normal Normal Normal 80% 40178 mAH +13 3224 0 25000 Idle Normal Normal Normal 81% 40497 mAH +14 3222 0 25000 Idle Normal Normal Normal 79% 39449 mAH + Command completed successfully + $$ + PYTES> \ No newline at end of file diff --git a/data/eb/bat 2.txt b/data/eb/bat 2.txt new file mode 100644 index 0000000..3c7e82f --- /dev/null +++ b/data/eb/bat 2.txt @@ -0,0 +1,23 @@ + + PYTES> + PYTES>bat 2 + @ +Battery Volt Curr Tempr Base State Volt. State Curr. State Temp. State Coulomb +0 3220 0 25000 Idle Normal Normal Normal 76% 38092 mAH +1 3223 0 25000 Idle Normal Normal Normal 80% 40004 mAH +2 3224 0 25000 Idle Normal Normal 80% Normal 40255 mAH +3 3225 0 25000 Idle Normal Normal Normal 81% 40546 mAH +4 3223 0 25000 Idle Normal Normal Normal 81% 40271 mAH +5 3225 0 25000 Idle Normal Normal Normal 79% 39587 mAH +6 3213 0 25000 Idle Normal Normal Normal 74% 37085 mAH +7 3220 0 25000 Idle Normal Normal Normal 80% 40034 mAH +8 3220 0 25000 Idle Normal Normal Normal 80% 39917 mAH +9 3223 0 25000 Idle Normal Normal Normal 81% 40323 mAH +10 3217 0 25000 Idle Normal Normal Normal 80% 40067 mAH +11 3219 0 25000 Idle Normal Normal Normal 79% 39757 mAH +12 3225 0 25000 Idle Normal Normal Normal 82% 40914 mAH +13 3223 0 25000 Idle Normal Normal Normal 80% 40037 mAH +14 3225 0 25000 Idle Normal Normal Normal 80% 40116 mAH + Command completed successfully + $$ + PYTES> \ No newline at end of file diff --git a/data/eb/info 1.txt b/data/eb/info 1.txt new file mode 100644 index 0000000..d3e8bf6 --- /dev/null +++ b/data/eb/info 1.txt @@ -0,0 +1,23 @@ + + PYTES> + PYTES>info 1 + @ + Device address : 1 + Manufacturer : PYTES + Device name : E-BOX-4850P + Board version : SQBMSV13 + Main Soft version : SPBMS15SPH2111V1.3.19 + Soft version : V1.3 + Boot version : V1.6 + Comm version : V2.0 + Release Date : 22-12-20 + Barcode : LBXXXXXXXXXXXXX4 + + Specification : 48V/50AH + Cell Number : 15 + Max Dischg Curr : -102000mA + Max Charge Curr : 102000mA + Console Port rate : 115200 + Command completed successfully + $$ + PYTES> \ No newline at end of file diff --git a/data/eb/info 2.txt b/data/eb/info 2.txt new file mode 100644 index 0000000..ea0b7f6 --- /dev/null +++ b/data/eb/info 2.txt @@ -0,0 +1,23 @@ + + PYTES> + PYTES>info 2 + @ + Device address : 2 + Manufacturer : PYTES + Device name : E-BOX-4850P + Board version : SQBMSV13 + Main Soft version : SPBMS15SPH2111V1.3.19 + Soft version : V1.3 + Boot version : V1.6 + Comm version : V2.0 + Release Date : 22-12-20 + Barcode : LBXXXXXXXXXXXXX5 + + Specification : 48V/50AH + Cell Number : 15 + Max Dischg Curr : -102000mA + Max Charge Curr : 102000mA + Console Port rate : 115200 + Command completed successfully + $$ + PYTES> \ No newline at end of file diff --git a/data/eb/log.txt b/data/eb/log.txt new file mode 100644 index 0000000..52b37e4 --- /dev/null +++ b/data/eb/log.txt @@ -0,0 +1,187 @@ + + PYTES> + PYTES>log + @ + Index : 29 + Time : 23-11-01 15:59:01 + ModID : BMM + Code : 0 + Info : The device start discharging. + + Index : 28 + Time : 23-11-01 15:58:41 + ModID : BMM + Code : 0 + Info : The device start discharging. + + Index : 27 + Time : 23-11-01 15:58:35 + ModID : BMM + Code : 0 + Info : The device start discharging. + Press [Enter] to be continued,other key to exit + Index : 26 + Time : 23-11-01 15:56:53 + ModID : BMM + Code : 0 + Info : The device start discharging. + + Index : 25 + Time : 23-11-01 15:56:39 + ModID : BMM + Code : 0 + Info : The device start discharging. + + Index : 24 + Time : 23-11-01 15:56:31 + ModID : BMM + Code : 0 + Info : The device start discharging. + Press [Enter] to be continued,other key to exit + Index : 23 + Time : 23-11-01 15:56:19 + ModID : BMM + Code : 0 + Info : The device start discharging. + + Index : 22 + Time : 23-11-01 15:55:55 + ModID : BMM + Code : 0 + Info : The device start discharging. + + Index : 21 + Time : 23-11-01 15:55:45 + ModID : BMM + Code : 0 + Info : The device start discharging. + Press [Enter] to be continued,other key to exit + Index : 20 + Time : 23-11-01 15:55:35 + ModID : BMM + Code : 0 + Info : The device start discharging. + + Index : 19 + Time : 23-11-01 15:55:19 + ModID : BMM + Code : 0 + Info : The device start discharging. + + Index : 18 + Time : 23-11-01 15:54:59 + ModID : BMM + Code : 0 + Info : The device start discharging. + Press [Enter] to be continued,other key to exit + Index : 17 + Time : 23-11-01 15:52:17 + ModID : BMM + Code : 0 + Info : The device start discharging. + + Index : 16 + Time : 23-11-01 15:51:55 + ModID : BMM + Code : 0 + Info : The device start discharging. + + Index : 15 + Time : 23-11-01 15:51:45 + ModID : BMM + Code : 0 + Info : The device start discharging. + Press [Enter] to be continued,other key to exit + Index : 14 + Time : 23-11-01 15:51:35 + ModID : BMM + Code : 0 + Info : The device start discharging. + + Index : 13 + Time : 23-11-01 15:51:15 + ModID : BMM + Code : 0 + Info : The device start discharging. + + Index : 12 + Time : 23-11-01 15:50:57 + ModID : BMM + Code : 0 + Info : The device start discharging. + Press [Enter] to be continued,other key to exit + Index : 11 + Time : 23-11-01 15:50:41 + ModID : BMM + Code : 0 + Info : The device start discharging. + + Index : 10 + Time : 23-11-01 15:50:19 + ModID : BMM + Code : 0 + Info : The device start discharging. + + Index : 9 + Time : 23-11-01 15:49:41 + ModID : BMM + Code : 0 + Info : The device start discharging. + Press [Enter] to be continued,other key to exit + Index : 8 + Time : 23-11-01 15:49:25 + ModID : BMM + Code : 0 + Info : The device start discharging. + + Index : 7 + Time : 23-11-01 15:49:19 + ModID : BMM + Code : 0 + Info : The device start discharging. + + Index : 6 + Time : 23-11-01 15:48:45 + ModID : BMM + Code : 0 + Info : The device start discharging. + Press [Enter] to be continued,other key to exit + Index : 5 + Time : 23-11-01 15:47:51 + ModID : BMM + Code : 0 + Info : The device start discharging. + + Index : 4 + Time : 23-11-01 15:46:33 + ModID : BMM + Code : 0 + Info : The device start discharging. + + Index : 3 + Time : 23-11-01 15:46:19 + ModID : BMM + Code : 0 + Info : The device start discharging. + Press [Enter] to be continued,other key to exit + Index : 2 + Time : 23-11-01 15:45:51 + ModID : BMM + Code : 0 + Info : The device start discharging. + + Index : 1 + Time : 23-11-01 15:45:21 + ModID : BMM + Code : 0 + Info : The device start discharging. + + Index : 0 + Time : 23-11-01 15:45:05 + ModID : BMM + Code : 0 + Info : The device start discharging. + Press [Enter] to be continued,other key to exit + Command completed successfully + $$ + PYTES> \ No newline at end of file diff --git a/data/eb/pwr 1.txt b/data/eb/pwr 1.txt new file mode 100644 index 0000000..f8f13f3 --- /dev/null +++ b/data/eb/pwr 1.txt @@ -0,0 +1,30 @@ + + PYTES> + PYTES>pwr 1 + @ + ---------------------------- + Power 1 + + Voltage : 48328 mV + Current : 0 mA + Temperature : 26000 mC + Coulomb : 77 % + Total Coulomb : 50000 mAH + Real Coulomb : 49700 mAH + Max Voltage : 54000 mV + Charge Times : 32170 + Basic Status : Idle + Volt Status : Normal + Current Status : Normal + Tmpr. Status : Normal + Coul. Status : Normal + Soh. Status : Normal + Heater Status : OFF + Protect ENA : BOV BHV BLV BUV POV PHV PLV PUV CBOT CBHT CBLT CBUT DBOT DBHT DBLT DBUT POT PHT PLT PUT COC COC2 COCA DOCA DOC DOC2 SC LCOUL + Bat Events : 0x0 + Power Events : 0x0 + System Fault : 0x0 + ---------------------------- + Command completed successfully + $$ + PYTES> \ No newline at end of file diff --git a/data/eb/pwr 2.txt b/data/eb/pwr 2.txt new file mode 100644 index 0000000..9595222 --- /dev/null +++ b/data/eb/pwr 2.txt @@ -0,0 +1,30 @@ + + PYTES> + PYTES>pwr 2 + @ + ---------------------------- + Power 2 + + Voltage : 48318 mV + Current : 0 mA + Temperature : 26000 mC + Coulomb : 74 % + Total Coulomb : 50000 mAH + Real Coulomb : 49700 mAH + Max Voltage : 54000 mV + Charge Times : 0 + Basic Status : Idle + Volt Status : Normal + Current Status : Normal + Tmpr. Status : Normal + Coul. Status : Normal + Soh. Status : Normal + Heater Status : OFF + Protect ENA : BOV BHV BLV BUV POV PHV PLV PUV CBOT CBHT CBLT CBUT DBOT DBHT DBLT DBUT POT PHT PLT PUT COC COC2 COCA DOCA DOC DOC2 SC LCOUL + Bat Events : 0x0 + Power Events : 0x0 + System Fault : 0x0 + ---------------------------- + Command completed successfully + $$ + PYTES> \ No newline at end of file diff --git a/data/eb/pwr.txt b/data/eb/pwr.txt new file mode 100644 index 0000000..8bd1c95 --- /dev/null +++ b/data/eb/pwr.txt @@ -0,0 +1,16 @@ + + PYTES> + PYTES>pwr + @ +Power Volt Curr Tempr Tlow Thigh Vlow Vhigh Base.St Volt.St Curr.St Temp.St Coulomb Time B.V.St B.T.St +1 48314 0 26000 25000 25000 3214 3225 Idle Normal Normal Normal 77% 2023-11-01 16:49:17 Normal Normal +2 48322 0 26000 25000 25000 3213 3227 Idle Normal Normal Normal 74% 2023-11-01 16:49:17 Normal Normal +3 - - - - - - - Absent - - - - - - - +4 - - - - - - - Absent - - - - - - - +5 - - - - - - - Absent - - - - - - - +6 - - - - - - - Absent - - - - - - - +7 - - - - - - - Absent - - - - - - - +8 - - - - - - - Absent - - - - - - - + Command completed successfully + $$ + PYTES> \ No newline at end of file diff --git a/data/eb/soh 1.txt b/data/eb/soh 1.txt new file mode 100644 index 0000000..a4918e1 --- /dev/null +++ b/data/eb/soh 1.txt @@ -0,0 +1,24 @@ + + PYTES> + PYTES>soh 1 + @ +Power 1 +Battery Voltage SOHCount SOHStatus +0 3214 0 Normal +1 3219 0 Normal +2 3217 0 Normal +3 3224 0 Normal +4 3222 0 Normal +5 3225 0 Normal +6 3222 0 Normal +7 3222 0 Normal +8 3219 0 Normal +9 3218 0 Normal +10 3223 0 Normal +11 3222 0 Normal +12 3224 0 Normal +13 3224 0 Normal +14 3223 0 Normal + Command completed successfully + $$ + PYTES> \ No newline at end of file diff --git a/data/eb/soh 2.txt b/data/eb/soh 2.txt new file mode 100644 index 0000000..6413d0b --- /dev/null +++ b/data/eb/soh 2.txt @@ -0,0 +1,24 @@ + + PYTES> + PYTES>soh 2 + @ +Power 2 +Battery Voltage SOHCount SOHStatus +0 3222 0 Normal +1 3219 0 Normal +2 3224 0 Normal +3 3225 0 Normal +4 3223 0 Normal +5 3220 0 Normal +6 3212 0 Normal +7 3224 0 Normal +8 3222 0 Normal +9 3218 0 Normal +10 3218 0 Normal +11 3219 0 Normal +12 3227 0 Normal +13 3222 0 Normal +14 3225 0 Normal + Command completed successfully + $$ + PYTES> \ No newline at end of file diff --git a/data/eb/stat 1.txt b/data/eb/stat 1.txt new file mode 100644 index 0000000..00787ea --- /dev/null +++ b/data/eb/stat 1.txt @@ -0,0 +1,56 @@ + + PYTES> + PYTES>stat 1 + @ +Device address 1 +Data Items : 487 +HisData Items : 2249 +MiscData Items : 249 +Charge Cnt. : 0 +Discharge Cnt. : 0 +Charge Times : 32170 +Status Cnt. : 1114 +Idle Times : 53862 +COC Times : 0 +DOC Times : 0 +COCA Times : 0 +DOCA Times : 0 +SC Times : 0 +Bat OV Times : 41 +Bat HV Times : 5 +Bat LV Times : 0 +Bat UV Times : 0 +Bat SLP Times : 0 +Pwr OV Times : 0 +Pwr HV Times : 0 +Pwr LV Times : 3 +Pwr UV Times : 0 +Pwr SLP Times : 0 +COT Times : 0 +CUT Times : 0 +DOT Times : 0 +DUT Times : 0 +CHT Times : 0 +CLT Times : 0 +DHT Times : 0 +DLT Times : 0 +Shut Times : 11 +Reset Times : 62 +RV Times : 0 +Input OV Times : 0 +SOH Times : 4 +BMICERR Times : 0 +CYCLE Times : 62 +Pwr Percent : 77 +Pwr Coulomb : 137832026 +Dsg Cap : 3125858 +HT@0.5C Cnt : 0 +LT@0.5C Cnt : 0 +HT Cnt : 0 +LT Cnt : 0 +LV Cnt : 4184 +LifeWarn Times : 0 +LifeAlarm Times : 0 + Command completed successfully + $$ + PYTES> \ No newline at end of file diff --git a/data/eb/stat 2.txt b/data/eb/stat 2.txt new file mode 100644 index 0000000..a4edbbd --- /dev/null +++ b/data/eb/stat 2.txt @@ -0,0 +1,56 @@ + + PYTES> + PYTES>stat 2 + @ +Device address 2 +Data Items : 1985 +HisData Items : 4095 +MiscData Items : 255 +Charge Cnt. : 0 +Discharge Cnt. : 0 +Charge Times : 30890 +Status Cnt. : 1119 +Idle Times : 51515 +COC Times : 0 +DOC Times : 0 +COCA Times : 0 +DOCA Times : 0 +SC Times : 0 +Bat OV Times : 50 +Bat HV Times : 4 +Bat LV Times : 0 +Bat UV Times : 0 +Bat SLP Times : 0 +Pwr OV Times : 0 +Pwr HV Times : 0 +Pwr LV Times : 8 +Pwr UV Times : 0 +Pwr SLP Times : 0 +COT Times : 0 +CUT Times : 0 +DOT Times : 0 +DUT Times : 0 +CHT Times : 0 +CLT Times : 0 +DHT Times : 0 +DLT Times : 0 +Shut Times : 18 +Reset Times : 67 +RV Times : 0 +Input OV Times : 0 +SOH Times : 5 +BMICERR Times : 0 +CYCLE Times : 67 +Pwr Percent : 74 +Pwr Coulomb : 133508966 +Dsg Cap : 3385583 +HT@0.5C Cnt : 0 +LT@0.5C Cnt : 0 +HT Cnt : 0 +LT Cnt : 0 +LV Cnt : 4620 +LifeWarn Times : 0 +LifeAlarm Times : 0 + Command completed successfully + $$ + PYTES> \ No newline at end of file diff --git a/data/eb/time.txt b/data/eb/time.txt new file mode 100644 index 0000000..8bddc56 --- /dev/null +++ b/data/eb/time.txt @@ -0,0 +1,8 @@ + + PYTES> + PYTES>time + @ + DS3231M 2023-11-01 16:50:05 + Command completed successfully + $$ + PYTES> \ No newline at end of file diff --git a/io-package.json b/io-package.json index aad77ee..85a0c7b 100644 --- a/io-package.json +++ b/io-package.json @@ -1,8 +1,21 @@ { "common": { "name": "pylontech", - "version": "0.0.6", + "version": "0.0.7", "news": { + "0.0.7": { + "en": "Issue with trim fixed, so E-BOX-4850P works now.", + "de": "E-BOX-4850P funktioniert jetzt.", + "ru": "Номер с отделкой, поэтому E-BOX-4850P работает сейчас.", + "pt": "Problema com guarnição fixa, então E-BOX-4850P funciona agora.", + "nl": "E-BOX-4850P werkt nu.", + "fr": "Émission avec finition fixe, donc E-BOX-4850P fonctionne maintenant.", + "it": "Problema con trim fisso, così E-BOX-4850P funziona ora.", + "es": "Edición con corte fijo, por lo que E-BOX-4850P funciona ahora.", + "pl": "Problemy z wyposażeniem, więc E-BOX-4850P działa obecnie.", + "uk": "Питання з обрізкою фіксованої, тому E-BOX-4850P працює зараз.", + "zh-cn": "现在与三周固定有关的问题,如E-BOX-4850P工程。." + }, "0.0.6": { "en": "The sent command was recognized from the response. Now the command is passed to the parser.", "de": "Der gesendete Befehl wurde von der Antwort erkannt. Jetzt wird der Befehl an den Parser übergeben.", @@ -31,33 +44,33 @@ } }, "titleLang": { - "en": "Pylontech health", - "de": "Pylontech Gesundheit", - "ru": "Pylontech здоровье", - "pt": "Saúde da Pylontech", - "nl": "Pylontech gezondheid", - "fr": "Santé Pylontech", - "it": "Salute di Pylontech", - "es": "Salud de Pylontech", - "pl": "Plontech health", - "uk": "Пілонтех здоров'я", - "zh-cn": "Pylontech Health" + "en": "Pylontech and Pytes health", + "de": "Pylontech und Pytes Gesundheit", + "ru": "Pylontech и Pytes здоровье", + "pt": "Pylontech e Pytes saúde", + "nl": "Pylontech en Pytes gezondheid", + "fr": "Pylontech et Pytes santé", + "it": "Pylontech e Pytes salute", + "es": "Pylontech y Pytes salud", + "pl": "Pylontech i Pylontech", + "uk": "Pylontech і Pytes здоров'я", + "zh-cn": "Pylontech and Pytes health" }, "desc": { - "en": "Query the cell voltages and the status of pylontech batteries via the console", - "de": "Abfrage der Zellspannungen und des Status von pylontech-Batterien über die Konsole", - "ru": "Запросите напряжение клеток и статус пилонтех-батареи через консоль", - "pt": "Consultar as tensões celulares e o status das baterias pilontech através do console", - "nl": "Vraag de cellen voltages en de status van pylontech batterijen via de console", - "fr": "Query the cell tensions and the status of pylontech batteries via the console", - "it": "Accosta le tensioni cellulari e lo stato delle batterie pilotecniche tramite la console", - "es": "Consultar los voltajes celulares y el estado de las baterías pilontech a través de la consola", - "pl": "Query napięcia komórek i status baterii pylontech poprzez konsolę", - "uk": "Перегляньте напруги клітин і статус батарей піронетех через консоль", - "zh-cn": "2. 通过宫颈部划分电池组和电池组的地位" + "en": "Query the cell voltages and the status of pylontech or pytes batteries via the console", + "de": "Abfrage der Zellspannungen und des Status von Pylontech- oder Pytes-Batterien über die Konsole", + "ru": "Запросите напряжение клеток и статус pylontech или pytes батареи через консоли", + "pt": "Consultar as tensões de célula e o status das baterias pilontech ou pites através do console", + "nl": "Vraag de cellen voltages en de status van pylontech of pytes batterijen via de console", + "fr": "Query the cell tensions and the status of pylontech or pytes batteries via the console", + "it": "Accostare le tensioni delle celle e lo stato delle batterie di pilone o pite tramite la console", + "es": "Consultar los voltajes celulares y el estado de las pilas pilontech o pitones a través de la consola", + "pl": "Query napięcia komórkowe i status baterii pylontech lub pyte poprzez konsolę", + "uk": "Перегляньте напруги клітин і статус pylontech або pytes батарей через консоль", + "zh-cn": "2. 通过宫颈癌或电池组的配件" }, "authors": ["PLCHome"], - "keywords": ["battery", "pylontech", "photovoltaics", "inverter", "energy storage system", "growatt", "victron"], + "keywords": ["battery", "pylontech", "pytes", "photovoltaics", "inverter", "energy storage system", "growatt", "victron"], "license": "MIT", "platform": "Javascript/Node.js", "main": "build/pylontechMain.js", diff --git a/media/pytes.jpg b/media/pytes.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c5051af48520edb7e7b161006dd0eb4dc06016e4 GIT binary patch literal 10857 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 literal 0 HcmV?d00001 diff --git a/package-lock.json b/package-lock.json index 18b95f8..94c0dfe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,15 @@ { "name": "iobroker.pylontech", - "version": "0.0.6", + "version": "0.0.7", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "iobroker.pylontech", - "version": "0.0.6", + "version": "0.0.7", "license": "MIT", "dependencies": { - "@iobroker/adapter-core": "^3.0.3", + "@iobroker/adapter-core": "^3.0.4", "debug": "^4.3.4", "net": "^1.0.2", "serialport": "^12.0.0", @@ -23,26 +23,26 @@ "@iobroker/adapter-dev": "^1.2.0", "@iobroker/testing": "^4.1.0", "@tsconfig/node14": "^14.1.0", - "@types/chai": "^4.3.6", - "@types/chai-as-promised": "^7.1.6", - "@types/debug": "^4.1.9", - "@types/mocha": "^10.0.2", - "@types/node": "^20.8.3", - "@types/proxyquire": "^1.3.29", - "@types/sinon": "^10.0.19", - "@types/sinon-chai": "^3.2.10", - "@typescript-eslint/eslint-plugin": "^6.7.4", - "@typescript-eslint/parser": "^6.7.4", + "@types/chai": "^4.3.9", + "@types/chai-as-promised": "^7.1.7", + "@types/debug": "^4.1.10", + "@types/mocha": "^10.0.3", + "@types/node": "^20.8.10", + "@types/proxyquire": "^1.3.30", + "@types/sinon": "^10.0.20", + "@types/sinon-chai": "^3.2.11", + "@typescript-eslint/eslint-plugin": "^6.9.1", + "@typescript-eslint/parser": "^6.9.1", "chai": "^4.3.10", "chai-as-promised": "^7.1.1", - "eslint": "^8.51.0", + "eslint": "^8.52.0", "eslint-config-prettier": "^9.0.0", - "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-prettier": "^5.0.1", "mocha": "^10.2.0", "prettier": "^3.0.3", "proxyquire": "^2.1.3", "rimraf": "^5.0.5", - "sinon": "^16.1.0", + "sinon": "^17.0.1", "sinon-chai": "^3.7.0", "source-map-support": "^0.5.21", "ts-node": "^10.9.1", @@ -307,9 +307,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz", - "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -339,9 +339,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", - "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz", + "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -547,12 +547,12 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" }, @@ -574,15 +574,18 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, "node_modules/@iobroker/adapter-core": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@iobroker/adapter-core/-/adapter-core-3.0.3.tgz", - "integrity": "sha512-SZmL69BtUXitnTbidNjlljQKB6CbkBLK9+Tqo/NMsOqHb1RmhPCNKhO4F5o8jc0dW0J6d4VArXryUkL7Ru0WpA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@iobroker/adapter-core/-/adapter-core-3.0.4.tgz", + "integrity": "sha512-QsSeIkOa+zEVdIQ0kc0GcfsnQC+pTWWkixotdG4naKuaLUwMWK7xP0UyUEUiaHfPG3KqyZxwIxQR9HMENvvIYQ==", + "engines": { + "npm": ">=7.0.0" + }, "peerDependencies": { "@iobroker/types": "^5.0.11" } @@ -668,6 +671,7 @@ "version": "14.0.2", "resolved": "https://registry.npmjs.org/sinon/-/sinon-14.0.2.tgz", "integrity": "sha512-PDpV0ZI3ZCS3pEqx0vpNp6kzPhHrLx72wA0G+ZLaaJjLIYeE0n8INlgaohKuGy7hP0as5tbUd23QWu5U233t+w==", + "deprecated": "16.1.1", "dev": true, "dependencies": { "@sinonjs/commons": "^2.0.0", @@ -683,9 +687,9 @@ } }, "node_modules/@iobroker/types": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/@iobroker/types/-/types-5.0.13.tgz", - "integrity": "sha512-QfGN+P1ixBtbeevgDkTDa1/lC5C89oCrlCwu1/MoRpFn1ryHMfCYpTuQVIMcty2KJNtlh/H2ocAu7TFui4kB1Q==", + "version": "5.0.16", + "resolved": "https://registry.npmjs.org/@iobroker/types/-/types-5.0.16.tgz", + "integrity": "sha512-qqxFdkt5G4ccZtqkQWKRUXMt1Et7ZG7i/Sizun/aBt4qLUxKqhFaOi6xChLNFAu+KXRqy6SS4iBQeXp04EKIng==", "peer": true, "engines": { "node": ">=12.0.0" @@ -1152,9 +1156,9 @@ } }, "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz", + "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==", "dev": true, "dependencies": { "@sinonjs/commons": "^3.0.0" @@ -1220,24 +1224,24 @@ "dev": true }, "node_modules/@types/chai": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.6.tgz", - "integrity": "sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==", + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.9.tgz", + "integrity": "sha512-69TtiDzu0bcmKQv3yg1Zx409/Kd7r0b5F1PfpYJfSHzLGtB53547V4u+9iqKYsTu/O2ai6KTb0TInNpvuQ3qmg==", "dev": true }, "node_modules/@types/chai-as-promised": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.6.tgz", - "integrity": "sha512-cQLhk8fFarRVZAXUQV1xEnZgMoPxqKojBvRkqPCKPQCzEhpbbSKl1Uu75kDng7k5Ln6LQLUmNBjLlFthCgm1NA==", + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.7.tgz", + "integrity": "sha512-APucaP5rlmTRYKtRA6FE5QPP87x76ejw5t5guRJ4y5OgMnwtsvigw7HHhKZlx2MGXLeZd6R/GNZR/IqDHcbtQw==", "dev": true, "dependencies": { "@types/chai": "*" } }, "node_modules/@types/debug": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.9.tgz", - "integrity": "sha512-8Hz50m2eoS56ldRlepxSBa6PWEVCtzUo/92HgLc2qTMnotJNIm7xP+UZhyWoYsyOdd5dxZ+NZLb24rsKyFs2ow==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.10.tgz", + "integrity": "sha512-tOSCru6s732pofZ+sMv9o4o3Zc+Sa8l3bxd/tweTQudFn06vAzb13ZX46Zi6m6EJ+RUbRTHvgQJ1gBtSgkaUYA==", "dev": true, "dependencies": { "@types/ms": "*" @@ -1254,15 +1258,15 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", - "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", + "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", "dev": true }, "node_modules/@types/linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-pTjcqY9E4nOI55Wgpz7eiI8+LzdYnw3qxXCfHyBDdPbYvbyLgWLJGh8EdPvqawwMK1Uo1794AUkkR38Fr0g+2g==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.4.tgz", + "integrity": "sha512-hPpIeeHb/2UuCw06kSNAOVWgehBLXEo0/fUs0mw3W2qhqX89PI2yvok83MnuctYGCPrabGIoi0fFso4DQ+sNUQ==", "dev": true }, "node_modules/@types/long": { @@ -1282,9 +1286,9 @@ } }, "node_modules/@types/mdurl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.3.tgz", - "integrity": "sha512-T5k6kTXak79gwmIOaDF2UUQXFbnBE0zBUzF20pz7wDYu0RQMzWg+Ml/Pz50214NsFHBITkoi5VtdjFZnJ2ijjA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.4.tgz", + "integrity": "sha512-ARVxjAEX5TARFRzpDRVC6cEk0hUIXCCwaMhz8y7S1/PxU6zZS1UMjyobz7q4w/D/R552r4++EhwmXK1N2rAy0A==", "dev": true }, "node_modules/@types/minimatch": { @@ -1294,27 +1298,30 @@ "dev": true }, "node_modules/@types/mocha": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.2.tgz", - "integrity": "sha512-NaHL0+0lLNhX6d9rs+NSt97WH/gIlRHmszXbQ/8/MV/eVcFNdeJ/GYhrFuUc8K7WuPhRhTSdMkCp8VMzhUq85w==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.3.tgz", + "integrity": "sha512-RsOPImTriV/OE4A9qKjMtk2MnXiuLLbcO3nCXK+kvq4nr0iMfFgpjaX3MPLb6f7+EL1FGSelYvuJMV6REH+ZPQ==", "dev": true }, "node_modules/@types/ms": { - "version": "0.7.32", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.32.tgz", - "integrity": "sha512-xPSg0jm4mqgEkNhowKgZFBNtwoEwF6gJ4Dhww+GFpm3IgtNseHQZ5IqdNwnquZEoANxyDAKDRAdVo4Z72VvD/g==", + "version": "0.7.33", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.33.tgz", + "integrity": "sha512-AuHIyzR5Hea7ij0P9q7vx7xu4z0C28ucwjAZC0ja7JhINyCnOw8/DnvAPQQ9TfOlCtZAmCERKQX9+o1mgQhuOQ==", "dev": true }, "node_modules/@types/node": { - "version": "20.8.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.3.tgz", - "integrity": "sha512-jxiZQFpb+NlH5kjW49vXxvxTjeeqlbsnTAdBTKpzEdPs9itay7MscYXz3Fo9VYFEsfQ6LJFitHad3faerLAjCw==", - "dev": true + "version": "20.8.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", + "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/proxyquire": { - "version": "1.3.29", - "resolved": "https://registry.npmjs.org/@types/proxyquire/-/proxyquire-1.3.29.tgz", - "integrity": "sha512-8/JYXN9NmE4tEGUU/JI7FcvloTu7CxYkb01h4kI+HRvABxwpleLXsvVmOF85LlgEb/xwe+H8MwM4s3ushNuffg==", + "version": "1.3.30", + "resolved": "https://registry.npmjs.org/@types/proxyquire/-/proxyquire-1.3.30.tgz", + "integrity": "sha512-erD15isFDzHMfeQC09DMjGeI0G6pJm7r5R7X/CxnEEe6tEp7N4r6xLYhTptdzne8zMz+2+5wJzrefCMvbmV/Fg==", "dev": true }, "node_modules/@types/rimraf": { @@ -1328,24 +1335,24 @@ } }, "node_modules/@types/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", "dev": true }, "node_modules/@types/sinon": { - "version": "10.0.19", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.19.tgz", - "integrity": "sha512-MWZNGPSchIdDfb5FL+VFi4zHsHbNOTQEgjqFQk7HazXSXwUU9PAX3z9XBqb3AJGYr9YwrtCtaSMsT3brYsN/jQ==", + "version": "10.0.20", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.20.tgz", + "integrity": "sha512-2APKKruFNCAZgx3daAyACGzWuJ028VVCUDk6o2rw/Z4PXT0ogwdV4KUegW0MwVs0Zu59auPXbbuBJHF12Sx1Eg==", "dev": true, "dependencies": { "@types/sinonjs__fake-timers": "*" } }, "node_modules/@types/sinon-chai": { - "version": "3.2.10", - "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.10.tgz", - "integrity": "sha512-D+VFqUjMqeku/FGl4Ioo+fDeWOaIfbZ6Oj+glgFUgz5m5RJ4kgCER3FdV1uvhmEt0A+FRz+juPdybFlg5Hxfow==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.11.tgz", + "integrity": "sha512-1C5SBFzwn9hjiMr1xfqbULcSI9qXVpkGZT/LYbbd3jWiTo2MSvA+iFfwODlSoAXGeCgBw6S509dxy8zSIacr3Q==", "dev": true, "dependencies": { "@types/chai": "*", @@ -1353,22 +1360,22 @@ } }, "node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.3.tgz", - "integrity": "sha512-4g+2YyWe0Ve+LBh+WUm1697PD0Kdi6coG1eU0YjQbwx61AZ8XbEpL1zIT6WjuUKrCMCROpEaYQPDjBnDouBVAQ==", + "version": "8.1.4", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.4.tgz", + "integrity": "sha512-GDV68H0mBSN449sa5HEj51E0wfpVQb8xNSMzxf/PrypMFcLTMwJMOM/cgXiv71Mq5drkOQmUGvL1okOZcu6RrQ==", "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.4.tgz", - "integrity": "sha512-DAbgDXwtX+pDkAHwiGhqP3zWUGpW49B7eqmgpPtg+BKJXwdct79ut9+ifqOFPJGClGKSHXn2PTBatCnldJRUoA==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.1.tgz", + "integrity": "sha512-w0tiiRc9I4S5XSXXrMHOWgHgxbrBn1Ro+PmiYhSg2ZVdxrAJtQgzU5o2m1BfP6UOn7Vxcc6152vFjQfmZR4xEg==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.7.4", - "@typescript-eslint/type-utils": "6.7.4", - "@typescript-eslint/utils": "6.7.4", - "@typescript-eslint/visitor-keys": "6.7.4", + "@typescript-eslint/scope-manager": "6.9.1", + "@typescript-eslint/type-utils": "6.9.1", + "@typescript-eslint/utils": "6.9.1", + "@typescript-eslint/visitor-keys": "6.9.1", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -1394,15 +1401,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.4.tgz", - "integrity": "sha512-I5zVZFY+cw4IMZUeNCU7Sh2PO5O57F7Lr0uyhgCJmhN/BuTlnc55KxPonR4+EM3GBdfiCyGZye6DgMjtubQkmA==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.1.tgz", + "integrity": "sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.7.4", - "@typescript-eslint/types": "6.7.4", - "@typescript-eslint/typescript-estree": "6.7.4", - "@typescript-eslint/visitor-keys": "6.7.4", + "@typescript-eslint/scope-manager": "6.9.1", + "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/typescript-estree": "6.9.1", + "@typescript-eslint/visitor-keys": "6.9.1", "debug": "^4.3.4" }, "engines": { @@ -1422,13 +1429,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.4.tgz", - "integrity": "sha512-SdGqSLUPTXAXi7c3Ob7peAGVnmMoGzZ361VswK2Mqf8UOYcODiYvs8rs5ILqEdfvX1lE7wEZbLyELCW+Yrql1A==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.1.tgz", + "integrity": "sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.4", - "@typescript-eslint/visitor-keys": "6.7.4" + "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/visitor-keys": "6.9.1" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1439,13 +1446,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.4.tgz", - "integrity": "sha512-n+g3zi1QzpcAdHFP9KQF+rEFxMb2KxtnJGID3teA/nxKHOVi3ylKovaqEzGBbVY2pBttU6z85gp0D00ufLzViQ==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.9.1.tgz", + "integrity": "sha512-eh2oHaUKCK58qIeYp19F5V5TbpM52680sB4zNSz29VBQPTWIlE/hCj5P5B1AChxECe/fmZlspAWFuRniep1Skg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.7.4", - "@typescript-eslint/utils": "6.7.4", + "@typescript-eslint/typescript-estree": "6.9.1", + "@typescript-eslint/utils": "6.9.1", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -1466,9 +1473,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.4.tgz", - "integrity": "sha512-o9XWK2FLW6eSS/0r/tgjAGsYasLAnOWg7hvZ/dGYSSNjCh+49k5ocPN8OmG5aZcSJ8pclSOyVKP2x03Sj+RrCA==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.1.tgz", + "integrity": "sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1479,13 +1486,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.4.tgz", - "integrity": "sha512-ty8b5qHKatlNYd9vmpHooQz3Vki3gG+3PchmtsA4TgrZBKWHNjWfkQid7K7xQogBqqc7/BhGazxMD5vr6Ha+iQ==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.1.tgz", + "integrity": "sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.4", - "@typescript-eslint/visitor-keys": "6.7.4", + "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/visitor-keys": "6.9.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1506,17 +1513,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.4.tgz", - "integrity": "sha512-PRQAs+HUn85Qdk+khAxsVV+oULy3VkbH3hQ8hxLRJXWBEd7iI+GbQxH5SEUSH7kbEoTp6oT1bOwyga24ELALTA==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.9.1.tgz", + "integrity": "sha512-L1T0A5nFdQrMVunpZgzqPL6y2wVreSyHhKGZryS6jrEN7bD9NplVAyMryUhXsQ4TWLnZmxc2ekar/lSGIlprCA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.7.4", - "@typescript-eslint/types": "6.7.4", - "@typescript-eslint/typescript-estree": "6.7.4", + "@typescript-eslint/scope-manager": "6.9.1", + "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/typescript-estree": "6.9.1", "semver": "^7.5.4" }, "engines": { @@ -1531,12 +1538,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.4.tgz", - "integrity": "sha512-pOW37DUhlTZbvph50x5zZCkFn3xzwkGtNoJHzIM3svpiSkJzwOYr/kVBaXmf+RAQiUDs1AHEZVNPg6UJCJpwRA==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.1.tgz", + "integrity": "sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/types": "6.9.1", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1547,6 +1554,12 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -1560,9 +1573,9 @@ } }, "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1581,9 +1594,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", + "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", "dev": true, "engines": { "node": ">=0.4.0" @@ -2836,18 +2849,19 @@ } }, "node_modules/eslint": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", - "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz", + "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.51.0", - "@humanwhocodes/config-array": "^0.11.11", + "@eslint/js": "8.52.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -2902,9 +2916,9 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", - "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.1.tgz", + "integrity": "sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==", "dev": true, "dependencies": { "prettier-linter-helpers": "^1.0.0", @@ -3328,6 +3342,15 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gaxios": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz", @@ -3556,15 +3579,6 @@ "node": ">=12.0.0" } }, - "node_modules/has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3574,6 +3588,18 @@ "node": ">=8" } }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -3694,12 +3720,12 @@ } }, "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4130,12 +4156,12 @@ "dev": true }, "node_modules/loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, "dependencies": { - "get-func-name": "^2.0.0" + "get-func-name": "^2.0.1" } }, "node_modules/lru-cache": { @@ -4461,9 +4487,9 @@ "integrity": "sha512-kbhcj2SVVR4caaVnGLJKmlk2+f+oLkjqdKeQlmUtz6nGzOpbcobwVIeSURNgraV/v3tlmGIX82OcPCl0K6RbHQ==" }, "node_modules/nise": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz", - "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.5.tgz", + "integrity": "sha512-VJuPIfUFaXNRzETTQEEItTOP8Y171ijr+JLq42wHes3DiryR8vT+1TXQW/Rx8JNUhyYYWyIvjXTU6dOhJcs9Nw==", "dev": true, "dependencies": { "@sinonjs/commons": "^2.0.0", @@ -4482,6 +4508,24 @@ "type-detect": "4.0.8" } }, + "node_modules/nise/node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/nise/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, "node_modules/node-addon-api": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.0.0.tgz", @@ -4912,9 +4956,9 @@ } }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "engines": { "node": ">=6" @@ -4994,9 +5038,9 @@ } }, "node_modules/resolve": { - "version": "1.22.6", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", - "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "dependencies": { "is-core-module": "^2.13.0", @@ -5243,16 +5287,16 @@ "dev": true }, "node_modules/sinon": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-16.1.0.tgz", - "integrity": "sha512-ZSgzF0vwmoa8pq0GEynqfdnpEDyP1PkYmEChnkjW0Vyh8IDlyFEJ+fkMhCP0il6d5cJjPl2PUsnUSAuP5sttOQ==", + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-17.0.1.tgz", + "integrity": "sha512-wmwE19Lie0MLT+ZYNpDymasPHUKTaZHUH/pKEubRXIzySv9Atnlw+BUMGCzWgV7b7wO+Hw6f1TEOr0IUnmU8/g==", "dev": true, "dependencies": { "@sinonjs/commons": "^3.0.0", - "@sinonjs/fake-timers": "^10.3.0", + "@sinonjs/fake-timers": "^11.2.2", "@sinonjs/samsam": "^8.0.0", "diff": "^5.1.0", - "nise": "^5.1.4", + "nise": "^5.1.5", "supports-color": "^7.2.0" }, "funding": { @@ -5695,10 +5739,16 @@ "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", "dev": true }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "engines": { "node": ">= 10.0.0" diff --git a/package.json b/package.json index 11f273e..7f24e9d 100644 --- a/package.json +++ b/package.json @@ -1,16 +1,16 @@ { "name": "iobroker.pylontech", - "version": "0.0.6", - "description": "Query the cell voltages and the status of pylontech batteries via the console", + "version": "0.0.7", + "description": "Query the cell voltages and the status of pylontech or pytes batteries via the console", "author": { - "name": "PLCHome", - "email": "GitHub@traeger-welt.de" + "name": "PLCHome" }, "homepage": "https://github.com/PLCHome/ioBroker.pylontech", "license": "MIT", "keywords": [ "battery", "pylontech", + "pytes", "photovoltaics", "inverter", "energy storage system", @@ -25,7 +25,7 @@ "node": ">= 16" }, "dependencies": { - "@iobroker/adapter-core": "^3.0.3", + "@iobroker/adapter-core": "^3.0.4", "debug": "^4.3.4", "net": "^1.0.2", "serialport": "^12.0.0", @@ -39,26 +39,26 @@ "@iobroker/adapter-dev": "^1.2.0", "@iobroker/testing": "^4.1.0", "@tsconfig/node14": "^14.1.0", - "@types/chai": "^4.3.6", - "@types/chai-as-promised": "^7.1.6", - "@types/debug": "^4.1.9", - "@types/mocha": "^10.0.2", - "@types/node": "^20.8.3", - "@types/proxyquire": "^1.3.29", - "@types/sinon": "^10.0.19", - "@types/sinon-chai": "^3.2.10", - "@typescript-eslint/eslint-plugin": "^6.7.4", - "@typescript-eslint/parser": "^6.7.4", + "@types/chai": "^4.3.9", + "@types/chai-as-promised": "^7.1.7", + "@types/debug": "^4.1.10", + "@types/mocha": "^10.0.3", + "@types/node": "^20.8.10", + "@types/proxyquire": "^1.3.30", + "@types/sinon": "^10.0.20", + "@types/sinon-chai": "^3.2.11", + "@typescript-eslint/eslint-plugin": "^6.9.1", + "@typescript-eslint/parser": "^6.9.1", "chai": "^4.3.10", "chai-as-promised": "^7.1.1", - "eslint": "^8.51.0", + "eslint": "^8.52.0", "eslint-config-prettier": "^9.0.0", - "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-prettier": "^5.0.1", "mocha": "^10.2.0", "prettier": "^3.0.3", "proxyquire": "^2.1.3", "rimraf": "^5.0.5", - "sinon": "^16.1.0", + "sinon": "^17.0.1", "sinon-chai": "^3.7.0", "source-map-support": "^0.5.21", "ts-node": "^10.9.1", diff --git a/src/pylontech/ParserBase.ts b/src/pylontech/ParserBase.ts index ab28467..cd8f9de 100644 --- a/src/pylontech/ParserBase.ts +++ b/src/pylontech/ParserBase.ts @@ -39,7 +39,7 @@ abstract class ParserBase implements IParser { let lasthead: string = '-X-'; if (head !== null) { for (let i: number = 1; i < head.length; i++) { - head[i] = head[i].trim() == '' ? `${lasthead}_` : head[i].trim(); + head[i] = !head[i] || head[i].trim() == '' ? `${lasthead}_` : head[i].trim(); lasthead = head[i]; } result[command] = {};