iobroker.bydhvs 1.5.0 → 1.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.bydhvs",
3
- "version": "1.5.0",
3
+ "version": "1.5.2",
4
4
  "description": "BYD HVS Battery poll data",
5
5
  "author": {
6
6
  "name": "Christian",
@@ -9,44 +9,50 @@
9
9
  "homepage": "https://github.com/christianh17/ioBroker.bydhvs",
10
10
  "license": "MIT",
11
11
  "keywords": [
12
- "byd hvs battery pv"
12
+ "byd hvs battery pv",
13
+ "ioBroker"
13
14
  ],
14
15
  "repository": {
15
16
  "type": "git",
16
17
  "url": "git@github.com:christianh17/ioBroker.bydhvs.git"
17
18
  },
18
19
  "engines": {
19
- "node": ">= 16"
20
+ "node": ">= 20"
20
21
  },
21
22
  "dependencies": {
22
- "@iobroker/adapter-core": "^3.0.4",
23
+ "@iobroker/adapter-core": "^3.2.3",
23
24
  "crc": "4.3.2"
24
25
  },
25
26
  "devDependencies": {
26
- "@alcalzone/release-script": "^3.6.0",
27
- "@alcalzone/release-script-plugin-iobroker": "^3.6.0",
28
- "@alcalzone/release-script-plugin-license": "^3.5.9",
29
- "@alcalzone/release-script-plugin-manual-review": "^3.5.9",
30
- "@iobroker/adapter-dev": "^1.2.0",
31
- "@iobroker/testing": "^4.1.0",
32
- "@types/chai": "^4.3.9",
33
- "@types/chai-as-promised": "^7.1.7",
34
- "@types/gulp": "^4.0.16",
35
- "@types/mocha": "^10.0.3",
36
- "@types/node": "^20.8.10",
37
- "@types/proxyquire": "^1.3.30",
38
- "@types/sinon": "^10.0.20",
39
- "@types/sinon-chai": "^3.2.11",
40
- "axios": "^1.6.0",
41
- "chai": "^4.3.10",
42
- "chai-as-promised": "^7.1.1",
43
- "eslint": "^8.52.0",
44
- "gulp": "^4.0.2",
45
- "mocha": "^10.2.0",
27
+ "@alcalzone/release-script": "^3.8.0",
28
+ "@alcalzone/release-script-plugin-iobroker": "^3.7.2",
29
+ "@alcalzone/release-script-plugin-license": "^3.7.0",
30
+ "@alcalzone/release-script-plugin-manual-review": "^3.7.0",
31
+ "@iobroker/adapter-dev": "^1.3.0",
32
+ "@iobroker/testing": "^5.0.0",
33
+ "@tsconfig/node14": "^14.1.2",
34
+ "@iobroker/eslint-config": "^1.0.0",
35
+ "@types/chai": "^4.3.5",
36
+ "@types/chai-as-promised": "^8.0.1",
37
+ "@types/mocha": "^10.0.10",
38
+ "@types/node": "^24.1.0",
39
+ "@types/node-schedule": "^2.1.7",
40
+ "@types/proxyquire": "^1.3.31",
41
+ "@types/sinon": "^17.0.3",
42
+ "@types/sinon-chai": "^3.2.12",
43
+ "chai": "^4.4.1",
44
+ "chai-as-promised": "^8.0.1",
45
+ "eslint": "^9.32.0",
46
+ "eslint-config-prettier": "^9.1.0",
47
+ "eslint-plugin-prettier": "^5.5.3",
48
+ "mocha": "^11.0.1",
46
49
  "proxyquire": "^2.1.3",
47
- "sinon": "^17.0.0",
50
+ "rimraf": "^3.0.2",
51
+ "sinon": "^21.0.0",
48
52
  "sinon-chai": "^3.7.0",
49
- "typescript": "^5.2.2"
53
+ "source-map-support": "^0.5.21",
54
+ "ts-node": "^10.9.1",
55
+ "typescript": "~5.7.2"
50
56
  },
51
57
  "main": "main.js",
52
58
  "scripts": {
@@ -56,7 +62,7 @@
56
62
  "test:integration": "mocha test/integration --exit",
57
63
  "test": "npm run test:js && npm run test:package",
58
64
  "check": "tsc --noEmit -p tsconfig.check.json",
59
- "lint": "eslint",
65
+ "lint": "eslint -c eslint.config.mjs .",
60
66
  "translate": "translate-adapter",
61
67
  "release": "release-script"
62
68
  },
@@ -0,0 +1,8 @@
1
+ // iobroker prettier configuration file
2
+ import prettierConfig from '@iobroker/eslint-config/prettier.config.mjs';
3
+
4
+ export default {
5
+ ...prettierConfig,
6
+ // uncomment next line if you prefer double quotes
7
+ // singleQuote: false,
8
+ }
Binary file
package/admin/admin.d.ts DELETED
@@ -1,93 +0,0 @@
1
- declare let systemDictionary: Record<string, Record<string, string>>;
2
-
3
- declare let load: (settings: Record<string, unknown>, onChange: (hasChanges: boolean) => void) => void;
4
- declare let save: (callback: (settings: Record<string, unknown>) => void) => void;
5
-
6
- // make load and save exist on the window object
7
- interface Window {
8
- load: typeof load;
9
- save: typeof save;
10
- }
11
-
12
- declare const instance: number;
13
- declare const adapter: string;
14
- /** Translates text */
15
- declare function _(text: string): string;
16
- declare const socket: ioBrokerSocket;
17
- declare function sendTo(
18
- instance: any | null,
19
- command: string,
20
- message: any,
21
- callback: (result: SendToResult) => void | Promise<void>,
22
- ): void;
23
-
24
- interface SendToResult {
25
- error?: string | Error;
26
- result?: any;
27
- }
28
-
29
- // tslint:disable-next-line:class-name
30
- interface ioBrokerSocket {
31
- emit(
32
- command: "subscribeObjects",
33
- pattern: string,
34
- callback?: (err?: string) => void | Promise<void>,
35
- ): void;
36
- emit(
37
- command: "subscribeStates",
38
- pattern: string,
39
- callback?: (err?: string) => void | Promise<void>,
40
- ): void;
41
- emit(
42
- command: "unsubscribeObjects",
43
- pattern: string,
44
- callback?: (err?: string) => void | Promise<void>,
45
- ): void;
46
- emit(
47
- command: "unsubscribeStates",
48
- pattern: string,
49
- callback?: (err?: string) => void | Promise<void>,
50
- ): void;
51
-
52
- emit(
53
- event: "getObjectView",
54
- view: "system",
55
- type: "device",
56
- options: ioBroker.GetObjectViewParams,
57
- callback: (
58
- err: string | undefined,
59
- result?: any,
60
- ) => void | Promise<void>,
61
- ): void;
62
- emit(
63
- event: "getStates",
64
- callback: (
65
- err: string | undefined,
66
- result?: Record<string, any>,
67
- ) => void,
68
- ): void;
69
- emit(
70
- event: "getState",
71
- id: string,
72
- callback: (err: string | undefined, result?: ioBroker.State) => void,
73
- ): void;
74
- emit(
75
- event: "setState",
76
- id: string,
77
- state: unknown,
78
- callback: (err: string | undefined, result?: any) => void,
79
- ): void;
80
-
81
- on(event: "objectChange", handler: ioBroker.ObjectChangeHandler): void;
82
- on(event: "stateChange", handler: ioBroker.StateChangeHandler): void;
83
- removeEventHandler(
84
- event: "objectChange",
85
- handler: ioBroker.ObjectChangeHandler,
86
- ): void;
87
- removeEventHandler(
88
- event: "stateChange",
89
- handler: ioBroker.StateChangeHandler,
90
- ): void;
91
-
92
- // TODO: other events
93
- }
@@ -1,113 +0,0 @@
1
- <html>
2
-
3
- <head>
4
-
5
- <!-- Load ioBroker scripts and styles-->
6
- <link rel="stylesheet" type="text/css" href="../../css/adapter.css" />
7
- <link rel="stylesheet" type="text/css" href="../../lib/css/materialize.css">
8
-
9
- <script type="text/javascript" src="../../lib/js/jquery-3.2.1.min.js"></script>
10
- <script type="text/javascript" src="../../socket.io/socket.io.js"></script>
11
-
12
- <script type="text/javascript" src="../../js/translate.js"></script>
13
- <script type="text/javascript" src="../../lib/js/materialize.js"></script>
14
- <script type="text/javascript" src="../../js/adapter-settings.js"></script>
15
-
16
- <!-- Load our own files -->
17
- <link rel="stylesheet" type="text/css" href="style.css" />
18
- <script type="text/javascript" src="words.js"></script>
19
-
20
- <script type="text/javascript">
21
- // This will be called by the admin adapter when the settings page loads
22
- function load(settings, onChange) {
23
- // example: select elements with id=key and class=value and insert value
24
- if (!settings) return;
25
- $('.value').each(function () {
26
- var $key = $(this);
27
- var id = $key.attr('id');
28
- if ($key.attr('type') === 'checkbox') {
29
- // do not call onChange direct, because onChange could expect some arguments
30
- $key.prop('checked', settings[id])
31
- .on('change', () => onChange())
32
- ;
33
- } else {
34
- // do not call onChange direct, because onChange could expect some arguments
35
- $key.val(settings[id])
36
- .on('change', () => onChange())
37
- .on('keyup', () => onChange())
38
- ;
39
- }
40
- });
41
- onChange(false);
42
- // reinitialize all the Materialize labels on the page if you are dynamically adding inputs:
43
- if (M) M.updateTextFields();
44
- }
45
-
46
- // This will be called by the admin adapter when the user presses the save button
47
- function save(callback) {
48
- // example: select elements with class=value and build settings object
49
- var obj = {};
50
- $('.value').each(function () {
51
- var $this = $(this);
52
- if ($this.attr('type') === 'checkbox') {
53
- obj[$this.attr('id')] = $this.prop('checked');
54
- } else if ($this.attr('type') === 'number') {
55
- obj[$this.attr('id')] = parseFloat($this.val());
56
- } else {
57
- obj[$this.attr('id')] = $this.val();
58
- }
59
- });
60
- callback(obj);
61
- }
62
- </script>
63
-
64
- </head>
65
-
66
- <body>
67
-
68
- <div class="m adapter-container">
69
-
70
- <div class="row">
71
- <div class="col s12 m4 l2">
72
- <img src="bydhvs.png" class="logo">
73
- </div>
74
- </div>
75
-
76
- <!-- Put your content here -->
77
-
78
- <!-- For example columns with settings: -->
79
- <div class="row">
80
- <div class="col s6 input-field">
81
- <input type="text" class="value" id="ConfPollInterval" />
82
- <label for="PollInterval" class="translate">Interval (s)</label>
83
- </div>
84
-
85
- <div class="col s6 input-field">
86
- <input type="text" class="value" id="ConfIPAdress" />
87
- <label for="IP Adress" class="translate">IP Adress</label>
88
- </div>
89
- <div class="row">
90
- <div class="col s6 input-field">
91
- <input type="checkbox" class="value" id="ConfBatDetails" />
92
- <label for="ConfBatDetails" class="translate">Diagnosis Data from Battery (only tested with two and four modules)</label>
93
- </div>
94
- </div>
95
- <div class="row">
96
- <div class="col s6 input-field">
97
- <input type="checkbox" class="value" id="ConfTestMode" />
98
- <label for="ConfTestMode" class="translate">Test Mode - show data in error log</label>
99
- </div>
100
- </div>
101
- <div class="row">
102
- <div class="col s6 input-field">
103
- <input type="text" class="value" id="ConfDetailshowoften" />
104
- <label for="ConfDetailshowoften" class="translate">Battery-details - every ... cycles</label>
105
- </div>
106
- </div>
107
- </div>
108
-
109
- </div>
110
-
111
- </body>
112
-
113
- </html>
package/admin/style.css DELETED
@@ -1,32 +0,0 @@
1
- /* You can delete those if you want. I just found them very helpful */
2
- * {
3
- box-sizing: border-box
4
- }
5
- .m {
6
- /* Don't cut off dropdowns! */
7
- overflow: initial;
8
- }
9
- .m.adapter-container,
10
- .m.adapter-container > div.App {
11
- /* Fix layout/scrolling issues with tabs */
12
- height: 100%;
13
- width: 100%;
14
- position: relative;
15
- }
16
- .m .select-wrapper + label {
17
- /* The positioning for dropdown labels is messed up */
18
- transform: none !important;
19
- }
20
-
21
- label > i[title] {
22
- /* Display the help cursor for the tooltip icons and fix their positioning */
23
- cursor: help;
24
- margin-left: 0.25em;
25
- }
26
-
27
- .dropdown-content {
28
- /* Don't wrap text in dropdowns */
29
- white-space: nowrap;
30
- }
31
-
32
- /* Add your styles here */
package/admin/words.js DELETED
@@ -1,81 +0,0 @@
1
- /*global systemDictionary:true */
2
- "use strict";
3
-
4
- systemDictionary = {
5
- "bydhvs adapter settings": {
6
- "en": "Adapter settings for bydhvs",
7
- "de": "Adaptereinstellungen für bydhvs",
8
- "ru": "Настройки адаптера для bydhvs",
9
- "pt": "Configurações do adaptador para bydhvs",
10
- "nl": "Adapterinstellingen voor bydhvs",
11
- "fr": "Paramètres d'adaptateur pour bydhvs",
12
- "it": "Impostazioni dell'adattatore per bydhvs",
13
- "es": "Ajustes del adaptador para bydhvs",
14
- "pl": "Ustawienia adaptera dla bydhvs",
15
- "zh-cn": "bydhvs的适配器设置"
16
- },
17
- "Interval (s)": {
18
- "en": "Interval (s)",
19
- "de": "Intervall (s)",
20
- "ru": "Интервал (с)",
21
- "pt": "Intervalo (s)",
22
- "nl": "Interval (en)",
23
- "fr": "Intervalle (s)",
24
- "it": "Intervallo (i)",
25
- "es": "Intervalo (s)",
26
- "pl": "Odstęp (y)",
27
- "zh-cn": "间隔"
28
- },
29
-
30
- "IP Address": {
31
- "en": "IP Address",
32
- "de": "IP Adresse",
33
- "ru": "Айпи адрес",
34
- "pt": "Endereço de IP",
35
- "nl": "IP adres",
36
- "fr": "Adresse IP",
37
- "it": "Indirizzo IP",
38
- "es": "Dirección IP",
39
- "pl": "Adres IP",
40
- "zh-cn": "IP地址"
41
- },
42
- "Diagnosis Data from Battery (only tested with two and four modules)": {
43
- "en": "Diagnosis Data from Battery (only tested with two and four modules)",
44
- "de": "Diagnosedaten von der Batterie (nur mit zwei und vier Modulen getestet)",
45
- "ru": "Данные диагностики от аккумулятора (проверено только с двумя и четырьмя модулями)",
46
- "pt": "Dados de diagnóstico da bateria (testado apenas com dois e quatro módulos)",
47
- "nl": "Diagnosegegevens van batterij (alleen getest met twee en vier modules)",
48
- "fr": "Données de diagnostic de la batterie (testées uniquement avec deux et quatre modules)",
49
- "it": "Dati di diagnosi dalla batteria (testato solo con due e quattro moduli)",
50
- "es": "Datos de diagnóstico de la batería (solo probado con dos y cuatro módulos)",
51
- "pl": "Dane diagnostyczne z akumulatora (testowane tylko z dwoma i czterema modułami)",
52
- "zh-cn": "来自电池的诊断数据(仅使用两个和四个模块进行了测试)"
53
- },
54
-
55
-
56
- "Battery-details - every ... cycles": {
57
- "en": "Battery-details - every ... cycles",
58
- "de": "Batteriedetails - alle ... Zyklen",
59
- "ru": "Детали батареи - каждые ... циклы",
60
- "pt": "Detalhes da bateria - a cada ... ciclos",
61
- "nl": "Batterij-details - elke ... cycli",
62
- "fr": "Détails de la batterie - tous les ... cycles",
63
- "it": "Dettagli della batteria - ogni ... cicli",
64
- "es": "Detalles de la batería - cada ... ciclos",
65
- "pl": "Szczegóły baterii - co ... cykle",
66
- "zh-cn": "电池详细信息-每...个周期"
67
- },
68
-
69
- "Test Mode - show data in error log": {
70
- "en": "Test Mode - show data in error log",
71
- "de": "Testmodus - Daten im Fehlerprotokoll anzeigen",
72
- "ru": "Тестовый режим - показывать данные в журнале ошибок",
73
- "pt": "Modo de teste - mostra os dados no registro de erros",
74
- "nl": "Testmodus - toon gegevens in foutenlogboek",
75
- "fr": "Mode test - afficher les données dans le journal des erreurs",
76
- "it": "Modalità test: mostra i dati nel registro degli errori",
77
- "es": "Modo de prueba: muestra datos en el registro de errores",
78
- "pl": "Tryb testowy - pokaż dane w dzienniku błędów",
79
- "zh-cn": "测试模式-在错误日志中显示数据"
80
- }
81
- };
package/lib/tools.js DELETED
@@ -1,99 +0,0 @@
1
- const axios = require("axios").default;
2
-
3
- /**
4
- * Tests whether the given variable is a real object and not an Array
5
- * @param {any} it The variable to test
6
- * @returns {it is Record<string, any>}
7
- */
8
- function isObject(it) {
9
- // This is necessary because:
10
- // typeof null === 'object'
11
- // typeof [] === 'object'
12
- // [] instanceof Object === true
13
- return Object.prototype.toString.call(it) === "[object Object]";
14
- }
15
-
16
- /**
17
- * Tests whether the given variable is really an Array
18
- * @param {any} it The variable to test
19
- * @returns {it is any[]}
20
- */
21
- function isArray(it) {
22
- if (typeof Array.isArray === "function") return Array.isArray(it);
23
- return Object.prototype.toString.call(it) === "[object Array]";
24
- }
25
-
26
- /**
27
- * Translates text to the target language. Automatically chooses the right translation API.
28
- * @param {string} text The text to translate
29
- * @param {string} targetLang The target languate
30
- * @param {string} [yandexApiKey] The yandex API key. You can create one for free at https://translate.yandex.com/developers
31
- * @returns {Promise<string>}
32
- */
33
- async function translateText(text, targetLang, yandexApiKey) {
34
- if (targetLang === "en") {
35
- return text;
36
- } else if (!text) {
37
- return "";
38
- }
39
- if (yandexApiKey) {
40
- return translateYandex(text, targetLang, yandexApiKey);
41
- } else {
42
- return translateGoogle(text, targetLang);
43
- }
44
- }
45
-
46
- /**
47
- * Translates text with Yandex API
48
- * @param {string} text The text to translate
49
- * @param {string} targetLang The target languate
50
- * @param {string} apiKey The yandex API key. You can create one for free at https://translate.yandex.com/developers
51
- * @returns {Promise<string>}
52
- */
53
- async function translateYandex(text, targetLang, apiKey) {
54
- if (targetLang === "zh-cn") {
55
- targetLang = "zh";
56
- }
57
- try {
58
- const url = `https://translate.yandex.net/api/v1.5/tr.json/translate?key=${apiKey}&text=${encodeURIComponent(text)}&lang=en-${targetLang}`;
59
- const response = await axios({url, timeout: 15000});
60
- if (response.data && response.data.text && isArray(response.data.text)) {
61
- return response.data.text[0];
62
- }
63
- throw new Error("Invalid response for translate request");
64
- } catch (e) {
65
- throw new Error(`Could not translate to "${targetLang}": ${e}`);
66
- }
67
- }
68
-
69
- /**
70
- * Translates text with Google API
71
- * @param {string} text The text to translate
72
- * @param {string} targetLang The target languate
73
- * @returns {Promise<string>}
74
- */
75
- async function translateGoogle(text, targetLang) {
76
- try {
77
- const url = `http://translate.googleapis.com/translate_a/single?client=gtx&sl=en&tl=${targetLang}&dt=t&q=${encodeURIComponent(text)}&ie=UTF-8&oe=UTF-8`;
78
- const response = await axios({url, timeout: 15000});
79
- if (isArray(response.data)) {
80
- // we got a valid response
81
- return response.data[0][0][0];
82
- }
83
- throw new Error("Invalid response for translate request");
84
- } catch (e) {
85
- if (e.response && e.response.status === 429) {
86
- throw new Error(
87
- `Could not translate to "${targetLang}": Rate-limited by Google Translate`
88
- );
89
- } else {
90
- throw new Error(`Could not translate to "${targetLang}": ${e}`);
91
- }
92
- }
93
- }
94
-
95
- module.exports = {
96
- isArray,
97
- isObject,
98
- translateText
99
- };