iobroker.metermaster 0.9.1 → 0.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -1
- package/io-package.json +28 -81
- package/main.js +69 -16
- package/package.json +7 -3
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://github.com/MPunktBPunkt/ioBroker.metermaster)
|
|
4
4
|
|
|
5
|
-
[](https://github.com/MPunktBPunkt/ioBroker.metermaster)
|
|
6
6
|
[](https://github.com/MPunktBPunkt/ioBroker.metermaster/blob/main/LICENSE)
|
|
7
7
|
[](https://nodejs.org)
|
|
8
8
|
|
|
@@ -247,6 +247,14 @@ iobroker restart metermaster.0
|
|
|
247
247
|
|
|
248
248
|
## Changelog
|
|
249
249
|
|
|
250
|
+
### 0.9.3
|
|
251
|
+
- Fix state roles for ioBroker object structure check (repochecker E1008/E1009/E1011)
|
|
252
|
+
- Migration of existing objects on adapter start
|
|
253
|
+
|
|
254
|
+
### 0.9.2
|
|
255
|
+
- Adapter checker compliance: npm news cleanup, devDependencies, trusted publishing
|
|
256
|
+
- npm publish via GitHub Actions with provenance
|
|
257
|
+
|
|
250
258
|
### 0.9.1
|
|
251
259
|
- Lowered admin dependency to >=7.6.20 (fixes startup when admin 7.7.x is installed)
|
|
252
260
|
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "metermaster",
|
|
4
|
-
"version": "0.9.
|
|
4
|
+
"version": "0.9.3",
|
|
5
5
|
"news": {
|
|
6
|
+
"0.9.3": {
|
|
7
|
+
"en": "Fix state roles for ioBroker object structure check (date, text, json, info.firmware)",
|
|
8
|
+
"de": "State-Rollen für ioBroker-Objektstruktur-Prüfung korrigiert (date, text, json, info.firmware)",
|
|
9
|
+
"ru": "Исправлены роли states для проверки структуры объектов ioBroker",
|
|
10
|
+
"pt": "Corrigidas roles de states para verificação da estrutura de objetos ioBroker",
|
|
11
|
+
"nl": "State-rollen gecorrigeerd voor ioBroker objectstructuurcontrole",
|
|
12
|
+
"fr": "Rôles des states corrigés pour la vérification de structure d'objets ioBroker",
|
|
13
|
+
"it": "Corrette le role degli state per il controllo struttura oggetti ioBroker",
|
|
14
|
+
"es": "Corregidos roles de states para verificación de estructura de objetos ioBroker",
|
|
15
|
+
"pl": "Poprawiono role states dla kontroli struktury obiektów ioBroker",
|
|
16
|
+
"uk": "Виправлено ролі states для перевірки структури об'єктів ioBroker",
|
|
17
|
+
"zh-cn": "修复 state 角色以通过 ioBroker 对象结构检查"
|
|
18
|
+
},
|
|
19
|
+
"0.9.2": {
|
|
20
|
+
"en": "Adapter checker compliance: npm news cleanup, devDependencies, trusted publishing",
|
|
21
|
+
"de": "Adapter-Checker-Konformität: npm-News bereinigt, devDependencies, Trusted Publishing",
|
|
22
|
+
"ru": "Соответствие adapter checker: очистка npm news, devDependencies, trusted publishing",
|
|
23
|
+
"pt": "Conformidade com adapter checker: limpeza npm news, devDependencies, trusted publishing",
|
|
24
|
+
"nl": "Adapter-checker conformiteit: npm news opgeschoond, devDependencies, trusted publishing",
|
|
25
|
+
"fr": "Conformité adapter checker : nettoyage npm news, devDependencies, trusted publishing",
|
|
26
|
+
"it": "Conformità adapter checker: pulizia npm news, devDependencies, trusted publishing",
|
|
27
|
+
"es": "Conformidad adapter checker: limpieza npm news, devDependencies, trusted publishing",
|
|
28
|
+
"pl": "Zgodność z adapter checker: czyszczenie npm news, devDependencies, trusted publishing",
|
|
29
|
+
"uk": "Відповідність adapter checker: очищення npm news, devDependencies, trusted publishing",
|
|
30
|
+
"zh-cn": "适配器检查器合规:清理 npm news、devDependencies、trusted publishing"
|
|
31
|
+
},
|
|
6
32
|
"0.9.1": {
|
|
7
33
|
"en": "Lowered admin dependency to >=7.6.20 (fixes startup with admin 7.7.x)",
|
|
8
34
|
"de": "Admin-Abhängigkeit auf >=7.6.20 gesenkt (behebt Start mit admin 7.7.x)",
|
|
@@ -15,84 +41,6 @@
|
|
|
15
41
|
"pl": "Obniżono zależność admin do >=7.6.20 (naprawia start z admin 7.7.x)",
|
|
16
42
|
"uk": "Знижено залежність admin до >=7.6.20 (виправлено запуск з admin 7.7.x)",
|
|
17
43
|
"zh-cn": "降低 admin 依赖至 >=7.6.20(修复 admin 7.7.x 下无法启动)"
|
|
18
|
-
},
|
|
19
|
-
"0.9.0": {
|
|
20
|
-
"en": "Finalized for ioBroker repository: CI/CD testing, adapter checker compliance, English README, updated dependencies",
|
|
21
|
-
"de": "Finalisiert für ioBroker-Repository: CI/CD-Tests, Adapter-Checker-Konformität, englisches README, aktualisierte Abhängigkeiten",
|
|
22
|
-
"ru": "Финализация для репозитория ioBroker: CI/CD-тестирование, соответствие проверке адаптера, README на английском, обновлённые зависимости",
|
|
23
|
-
"pt": "Finalizado para o repositório ioBroker: testes CI/CD, conformidade com o verificador de adaptadores, README em inglês, dependências atualizadas",
|
|
24
|
-
"nl": "Afgerond voor ioBroker-repository: CI/CD-tests, naleving adapter-checker, Engelstalige README, bijgewerkte afhankelijkheden",
|
|
25
|
-
"fr": "Finalisé pour le dépôt ioBroker : tests CI/CD, conformité au vérificateur d'adaptateurs, README en anglais, dépendances mises à jour",
|
|
26
|
-
"it": "Finalizzato per il repository ioBroker: test CI/CD, conformità al checker degli adapter, README in inglese, dipendenze aggiornate",
|
|
27
|
-
"es": "Finalizado para el repositorio ioBroker: pruebas CI/CD, cumplimiento del verificador de adaptadores, README en inglés, dependencias actualizadas",
|
|
28
|
-
"pl": "Sfinalizowano dla repozytorium ioBroker: testy CI/CD, zgodność z adapter checker, angielskie README, zaktualizowane zależności",
|
|
29
|
-
"uk": "Фіналізовано для репозиторію ioBroker: CI/CD-тестування, відповідність перевірці адаптера, README англійською, оновлені залежності",
|
|
30
|
-
"zh-cn": "为 ioBroker 仓库完成最终化:CI/CD 测试、适配器检查器合规、英文 README、更新依赖项"
|
|
31
|
-
},
|
|
32
|
-
"0.8.3": {
|
|
33
|
-
"en": "Chart: linear time axis, yearly consumption projection toggle, README screenshots",
|
|
34
|
-
"de": "Chart: lineare Zeitachse, Jahresverbrauch-Hochrechnung, README-Screenshots",
|
|
35
|
-
"ru": "График: линейная временная ось, переключатель годового прогноза потребления, скриншоты README",
|
|
36
|
-
"pt": "Gráfico: eixo de tempo linear, alternância de projeção de consumo anual, capturas de tela no README",
|
|
37
|
-
"nl": "Grafiek: lineaire tijdas, schakelaar voor jaarlijks verbruiksprognose, README-screenshots",
|
|
38
|
-
"fr": "Graphique : axe temporel linéaire, bascule de projection de consommation annuelle, captures README",
|
|
39
|
-
"it": "Grafico: asse temporale lineare, opzione proiezione consumo annuale, screenshot README",
|
|
40
|
-
"es": "Gráfico: eje de tiempo lineal, alternancia de proyección de consumo anual, capturas README",
|
|
41
|
-
"pl": "Wykres: liniowa oś czasu, przełącznik prognozy rocznego zużycia, zrzuty ekranu README",
|
|
42
|
-
"uk": "Графік: лінійна часова вісь, перемикач річного прогнозу споживання, скріншоти README",
|
|
43
|
-
"zh-cn": "图表:线性时间轴、年度消耗预测切换、README 截图"
|
|
44
|
-
},
|
|
45
|
-
"0.8.2": {
|
|
46
|
-
"en": "Bugfix: chart modal close button and range filters (modals moved before script init)",
|
|
47
|
-
"de": "Bugfix: Chart-Modal X-Schliessen und Zeitraum-Buttons (Modals vor Script-Init)",
|
|
48
|
-
"ru": "Исправление: кнопка закрытия модального окна графика и фильтры диапазона",
|
|
49
|
-
"pt": "Correção: botão de fechar do modal do gráfico e filtros de intervalo",
|
|
50
|
-
"nl": "Bugfix: sluitknop grafiekmodal en bereikfilters",
|
|
51
|
-
"fr": "Correction : bouton de fermeture du modal graphique et filtres de plage",
|
|
52
|
-
"it": "Bugfix: pulsante chiusura modale grafico e filtri intervallo",
|
|
53
|
-
"es": "Corrección: botón cerrar del modal de gráfico y filtros de rango",
|
|
54
|
-
"pl": "Poprawka: przycisk zamykania modala wykresu i filtry zakresu",
|
|
55
|
-
"uk": "Виправлення: кнопка закриття модального вікна графіка та фільтри діапазону",
|
|
56
|
-
"zh-cn": "修复:图表模态框关闭按钮和范围过滤器"
|
|
57
|
-
},
|
|
58
|
-
"0.8.1": {
|
|
59
|
-
"en": "Bugfix: literal newline in CSV export JS broke entire Web-UI (SyntaxError)",
|
|
60
|
-
"de": "Bugfix: Literal-Zeilenumbruch im CSV-Export-JS brach gesamte Web-UI (SyntaxError)",
|
|
61
|
-
"ru": "Исправление: литеральный перевод строки в JS экспорта CSV ломал Web-UI",
|
|
62
|
-
"pt": "Correção: quebra de linha literal no JS de exportação CSV quebrava a Web-UI",
|
|
63
|
-
"nl": "Bugfix: letterlijke regeleinde in CSV-export-JS brak de hele Web-UI",
|
|
64
|
-
"fr": "Correction : saut de ligne littéral dans le JS d'export CSV cassait la Web-UI",
|
|
65
|
-
"it": "Bugfix: newline letterale nel JS di export CSV rompeva l'intera Web-UI",
|
|
66
|
-
"es": "Corrección: salto de línea literal en JS de exportación CSV rompía la Web-UI",
|
|
67
|
-
"pl": "Poprawka: dosłowny znak nowej linii w JS eksportu CSV psuł całą Web-UI",
|
|
68
|
-
"uk": "Виправлення: літеральний перенос рядка в JS експорту CSV ламав Web-UI",
|
|
69
|
-
"zh-cn": "修复:CSV 导出 JS 中的字面换行符导致 Web-UI 语法错误"
|
|
70
|
-
},
|
|
71
|
-
"0.8.0": {
|
|
72
|
-
"en": "Charts per meter (Chart.js modal), consumption KPI, CSV export, DE/EN language switch, TotalWater/HeatMeter icons",
|
|
73
|
-
"de": "Charts pro Zaehler (Chart.js-Modal), Verbrauchs-KPI, CSV-Export, Sprachumschalter DE/EN, TotalWater/HeatMeter Icons",
|
|
74
|
-
"ru": "Графики по счётчикам, KPI потребления, экспорт CSV, переключатель DE/EN, иконки TotalWater/HeatMeter",
|
|
75
|
-
"pt": "Gráficos por medidor, KPI de consumo, exportação CSV, alternância DE/EN, ícones TotalWater/HeatMeter",
|
|
76
|
-
"nl": "Grafieken per meter, verbruiks-KPI, CSV-export, DE/EN-taalschakelaar, TotalWater/HeatMeter-iconen",
|
|
77
|
-
"fr": "Graphiques par compteur, KPI de consommation, export CSV, bascule DE/EN, icônes TotalWater/HeatMeter",
|
|
78
|
-
"it": "Grafici per contatore, KPI consumo, export CSV, switch lingua DE/EN, icone TotalWater/HeatMeter",
|
|
79
|
-
"es": "Gráficos por medidor, KPI de consumo, exportación CSV, cambio DE/EN, iconos TotalWater/HeatMeter",
|
|
80
|
-
"pl": "Wykresy na licznik, KPI zużycia, eksport CSV, przełącznik DE/EN, ikony TotalWater/HeatMeter",
|
|
81
|
-
"uk": "Графіки на лічильник, KPI споживання, експорт CSV, перемикач DE/EN, іконки TotalWater/HeatMeter",
|
|
82
|
-
"zh-cn": "每表图表、消耗 KPI、CSV 导出、DE/EN 语言切换、TotalWater/HeatMeter 图标"
|
|
83
|
-
},
|
|
84
|
-
"0.7.6": {
|
|
85
|
-
"en": "Login modal for auth (no more browser prompt), newest logs on top",
|
|
86
|
-
"de": "Login-Modal fuer Auth (kein Browser-Prompt mehr), neueste Logs oben",
|
|
87
|
-
"ru": "Модальное окно входа для аутентификации, новейшие логи сверху",
|
|
88
|
-
"pt": "Modal de login para autenticação, logs mais recentes no topo",
|
|
89
|
-
"nl": "Loginmodal voor auth, nieuwste logs bovenaan",
|
|
90
|
-
"fr": "Modal de connexion pour l'auth, journaux les plus récents en haut",
|
|
91
|
-
"it": "Modale login per auth, log più recenti in alto",
|
|
92
|
-
"es": "Modal de inicio de sesión para auth, logs más recientes arriba",
|
|
93
|
-
"pl": "Modal logowania dla auth, najnowsze logi na górze",
|
|
94
|
-
"uk": "Модальне вікно входу для auth, найновіші логи зверху",
|
|
95
|
-
"zh-cn": "登录模态框认证,最新日志在顶部"
|
|
96
44
|
}
|
|
97
45
|
},
|
|
98
46
|
"titleLang": {
|
|
@@ -158,8 +106,7 @@
|
|
|
158
106
|
{
|
|
159
107
|
"admin": ">=7.6.20"
|
|
160
108
|
}
|
|
161
|
-
]
|
|
162
|
-
"installedFrom": "MPunktBPunkt/ioBroker.metermaster#78e6ba943660d68a56ac762643cc99976c985ceb"
|
|
109
|
+
]
|
|
163
110
|
},
|
|
164
111
|
"native": {
|
|
165
112
|
"port": 8089,
|
package/main.js
CHANGED
|
@@ -6,7 +6,7 @@ const crypto = require('node:crypto');
|
|
|
6
6
|
const https = require('node:https');
|
|
7
7
|
const { exec } = require('node:child_process');
|
|
8
8
|
|
|
9
|
-
const CURRENT_VERSION = '0.9.
|
|
9
|
+
const CURRENT_VERSION = '0.9.3';
|
|
10
10
|
const GITHUB_REPO = 'MPunktBPunkt/ioBroker.metermaster';
|
|
11
11
|
const GITHUB_URL = 'https://github.com/MPunktBPunkt/ioBroker.metermaster';
|
|
12
12
|
|
|
@@ -81,6 +81,7 @@ adapter.on('ready', async () => {
|
|
|
81
81
|
// In-Memory-Cache aus gespeicherten ioBroker-States wiederherstellen
|
|
82
82
|
await restoreCacheFromStates();
|
|
83
83
|
await restoreNodesFromStates();
|
|
84
|
+
await migrateStateRoles();
|
|
84
85
|
|
|
85
86
|
// ESP32-Node-States beobachten (Heartbeat-Erkennung via simple-api)
|
|
86
87
|
adapter.subscribeStates('nodes.*');
|
|
@@ -215,11 +216,11 @@ async function ensureNodeStates(mac) {
|
|
|
215
216
|
await ensureChannel(base, `ESP32 Node ${mac}`);
|
|
216
217
|
await ensureState(`${base}.ip`, { name: 'IP-Adresse', type: 'string', role: 'info.ip', read: true, write: false });
|
|
217
218
|
await ensureState(`${base}.name`, { name: 'Gerätename', type: 'string', role: 'info.name', read: true, write: false });
|
|
218
|
-
await ensureState(`${base}.version`, { name: 'Firmware-Version', type: 'string', role: 'info.
|
|
219
|
-
await ensureState(`${base}.lastSeen`, { name: 'Zuletzt gesehen (ms)', type: 'number', role: 'value.time',
|
|
220
|
-
await ensureState(`${base}.config`, { name: 'Konfiguration (JSON)', type: 'string', role: '
|
|
221
|
-
await ensureState(`${base}.configAck`, { name: 'Config-Quittierung', type: 'string', role: '
|
|
222
|
-
await ensureState(`${base}.cmd`, { name: 'Befehl (JSON)', type: 'string', role: '
|
|
219
|
+
await ensureState(`${base}.version`, { name: 'Firmware-Version', type: 'string', role: 'info.firmware', read: true, write: false });
|
|
220
|
+
await ensureState(`${base}.lastSeen`, { name: 'Zuletzt gesehen (ms)', type: 'number', role: 'value.time', read: true, write: false });
|
|
221
|
+
await ensureState(`${base}.config`, { name: 'Konfiguration (JSON)', type: 'string', role: 'json', read: true, write: true });
|
|
222
|
+
await ensureState(`${base}.configAck`, { name: 'Config-Quittierung', type: 'string', role: 'json', read: true, write: false });
|
|
223
|
+
await ensureState(`${base}.cmd`, { name: 'Befehl (JSON)', type: 'string', role: 'json', read: true, write: true });
|
|
223
224
|
}
|
|
224
225
|
|
|
225
226
|
// ─── HTTP-Server ──────────────────────────────────────────────────────────────
|
|
@@ -478,10 +479,10 @@ async function storeReading(data) {
|
|
|
478
479
|
if (isNew) log(LVL.INFO, CAT.DATAPOINT, `Neuer Zähler`, `metermaster.0.${base}`);
|
|
479
480
|
|
|
480
481
|
const dpNew = await ensureState(`${base}.readings.latest`, { name: `${data.meter} – Letzter Wert`, type: 'number', role: 'value', unit: data.unit||'', read: true, write: false });
|
|
481
|
-
await ensureState(`${base}.readings.latestDate`, { name: 'Ablesedatum', type: 'string', role: '
|
|
482
|
-
await ensureState(`${base}.name`, { name: 'Zählername', type: 'string', role: 'info.name',
|
|
483
|
-
await ensureState(`${base}.unit`, { name: 'Einheit', type: 'string', role: '
|
|
484
|
-
await ensureState(`${base}.typeName`, { name: 'Zählertyp', type: 'string', role: '
|
|
482
|
+
await ensureState(`${base}.readings.latestDate`, { name: 'Ablesedatum', type: 'string', role: 'date', read: true, write: false });
|
|
483
|
+
await ensureState(`${base}.name`, { name: 'Zählername', type: 'string', role: 'info.name', read: true, write: false });
|
|
484
|
+
await ensureState(`${base}.unit`, { name: 'Einheit', type: 'string', role: 'text', read: true, write: false });
|
|
485
|
+
await ensureState(`${base}.typeName`, { name: 'Zählertyp', type: 'string', role: 'text', read: true, write: false });
|
|
485
486
|
await ensureState(`${base}.readings.history`, { name: 'Historische Ablesungen', type: 'array', role: 'list', read: true, write: false });
|
|
486
487
|
|
|
487
488
|
if (dpNew) log(LVL.INFO, CAT.DATAPOINT, `Datenpunkte angelegt`, `${base}.readings.{latest,latestDate,history} + name/unit/typeName`);
|
|
@@ -532,20 +533,72 @@ async function ensureChannel(id, name) {
|
|
|
532
533
|
return true;
|
|
533
534
|
}
|
|
534
535
|
async function ensureState(id, common) {
|
|
536
|
+
const fullCommon = {
|
|
537
|
+
...common,
|
|
538
|
+
read: common.read !== undefined ? common.read : true,
|
|
539
|
+
write: common.write !== undefined ? common.write : false,
|
|
540
|
+
def: common.type === 'number' ? 0 : (common.type === 'array' ? '[]' : '')
|
|
541
|
+
};
|
|
535
542
|
const ex = await adapter.getObjectAsync(id).catch(() => null);
|
|
536
|
-
if (ex)
|
|
543
|
+
if (ex) {
|
|
544
|
+
const patch = {};
|
|
545
|
+
for (const key of ['role', 'type', 'read', 'write', 'unit']) {
|
|
546
|
+
if (fullCommon[key] !== undefined && ex.common[key] !== fullCommon[key]) {
|
|
547
|
+
patch[key] = fullCommon[key];
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
if (Object.keys(patch).length) {
|
|
551
|
+
await adapter.extendObjectAsync(id, { common: patch });
|
|
552
|
+
}
|
|
553
|
+
return false;
|
|
554
|
+
}
|
|
537
555
|
await adapter.setObjectNotExistsAsync(id, {
|
|
538
556
|
type: 'state',
|
|
539
|
-
common:
|
|
540
|
-
read: common.read !== undefined ? common.read : true,
|
|
541
|
-
write: common.write !== undefined ? common.write : false,
|
|
542
|
-
def: common.type === 'number' ? 0 : (common.type === 'array' ? '[]' : '')
|
|
543
|
-
},
|
|
557
|
+
common: fullCommon,
|
|
544
558
|
native: {}
|
|
545
559
|
});
|
|
546
560
|
return true;
|
|
547
561
|
}
|
|
548
562
|
|
|
563
|
+
// ─── State-Rollen-Migration (deprecated → ioBroker-Rollenkatalog) ───────────────
|
|
564
|
+
const DEPRECATED_ROLE_MAP = {
|
|
565
|
+
'value.datetime': 'date',
|
|
566
|
+
'value.unit': 'text',
|
|
567
|
+
'info.type': 'text',
|
|
568
|
+
'info.version': 'info.firmware',
|
|
569
|
+
};
|
|
570
|
+
|
|
571
|
+
function resolveMigratedRole(id, common) {
|
|
572
|
+
if (DEPRECATED_ROLE_MAP[common.role]) {
|
|
573
|
+
return DEPRECATED_ROLE_MAP[common.role];
|
|
574
|
+
}
|
|
575
|
+
if (common.role === 'value' && common.type === 'string') {
|
|
576
|
+
const field = id.split('.').pop();
|
|
577
|
+
if (field === 'config' || field === 'configAck' || field === 'cmd') {
|
|
578
|
+
return 'json';
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
return null;
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
async function migrateStateRoles() {
|
|
585
|
+
try {
|
|
586
|
+
const objects = await adapter.getForeignObjectsAsync('*', { type: 'state' });
|
|
587
|
+
if (!objects) return;
|
|
588
|
+
let fixed = 0;
|
|
589
|
+
for (const [id, obj] of Object.entries(objects)) {
|
|
590
|
+
const newRole = resolveMigratedRole(id, obj.common || {});
|
|
591
|
+
if (newRole && obj.common.role !== newRole) {
|
|
592
|
+
await adapter.extendObjectAsync(id, { common: { role: newRole } });
|
|
593
|
+
fixed++;
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
if (fixed) log(LVL.INFO, CAT.SYSTEM, 'State-Rollen migriert', `${fixed} Objekte`);
|
|
597
|
+
} catch (e) {
|
|
598
|
+
log(LVL.WARN, CAT.SYSTEM, 'State-Rollen-Migration fehlgeschlagen', e.message);
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
|
|
549
602
|
// ─── API Endpunkte ────────────────────────────────────────────────────────────
|
|
550
603
|
function serveDataJson(res) {
|
|
551
604
|
sendJson(res, 200, { data: receivedData, receivedTotal: readingsReceived });
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.metermaster",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.3",
|
|
4
4
|
"description": "ioBroker adapter for the MeterMaster Android app – receives meter readings and manages ESP32 display nodes",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "MPunktBPunkt",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
],
|
|
19
19
|
"repository": {
|
|
20
20
|
"type": "git",
|
|
21
|
-
"url": "https://github.com/MPunktBPunkt/ioBroker.metermaster.git"
|
|
21
|
+
"url": "git+https://github.com/MPunktBPunkt/ioBroker.metermaster.git"
|
|
22
22
|
},
|
|
23
23
|
"bugs": {
|
|
24
24
|
"url": "https://github.com/MPunktBPunkt/ioBroker.metermaster/issues"
|
|
@@ -39,7 +39,11 @@
|
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@iobroker/adapter-dev": "^1.5.0",
|
|
41
41
|
"@iobroker/eslint-config": "^2.3.4",
|
|
42
|
-
"@iobroker/testing": "^5.
|
|
42
|
+
"@iobroker/testing": "^5.3.0",
|
|
43
|
+
"@types/node": ">=22"
|
|
44
|
+
},
|
|
45
|
+
"publishConfig": {
|
|
46
|
+
"provenance": true
|
|
43
47
|
},
|
|
44
48
|
"files": [
|
|
45
49
|
"admin{,/!(src)/**}/!(tsconfig|tsconfig.*).json",
|