iobroker.tidy 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -4
- package/admin/i18n/de.json +2 -0
- package/admin/i18n/en.json +2 -0
- package/admin/i18n/es.json +2 -0
- package/admin/i18n/fr.json +2 -0
- package/admin/i18n/it.json +2 -0
- package/admin/i18n/nl.json +2 -0
- package/admin/i18n/pl.json +2 -0
- package/admin/i18n/pt.json +2 -0
- package/admin/i18n/ru.json +2 -0
- package/admin/i18n/uk.json +2 -0
- package/admin/i18n/zh-cn.json +2 -0
- package/admin/jsonConfig.json +62 -6
- package/io-package.json +173 -110
- package/main.js +171 -0
- package/package.json +75 -75
package/README.md
CHANGED
|
@@ -143,11 +143,13 @@ If you like our work and would like to support us, we appreciate any donation.
|
|
|
143
143
|
## Changelog
|
|
144
144
|
<!--
|
|
145
145
|
### **WORK IN PROGRESS**
|
|
146
|
-
-->
|
|
147
|
-
|
|
146
|
+
-->
|
|
147
|
+
### 0.1.0 (2026-04-17)
|
|
148
|
+
- (skvarel) Added option for complete scan
|
|
149
|
+
|
|
148
150
|
### 0.0.1 (2026-04-14)
|
|
149
|
-
- (skvarel) initial release
|
|
150
|
-
|
|
151
|
+
- (skvarel) initial release
|
|
152
|
+
|
|
151
153
|
## Older changes
|
|
152
154
|
- [CHANGELOG_OLD.md](CHANGELOG_OLD.md)
|
|
153
155
|
|
package/admin/i18n/de.json
CHANGED
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
"General Settings": "Allgemeine Einstellungen",
|
|
23
23
|
"Help & Documentation": "Hilfe & Dokumentation",
|
|
24
24
|
"How often the automatic scan should run (minimum 1 hour)": "Wie oft der automatische Scan ausgeführt werden soll (mindestens 1 Stunde)",
|
|
25
|
+
"If enabled, the adapter will scan the entire object tree and store the result in a separate 'complete' result channel.": "Wenn aktiviert, scannt der Adapter den gesamten Objektbaum und speichert das Ergebnis in einem separaten 'complete'-Kanal.",
|
|
25
26
|
"JSON Table Field Description": "JSON-Tabellen-Feldbeschreibung",
|
|
26
27
|
"Name (for result state)": "Name (für Ergebnis-Datenpunkt)",
|
|
27
28
|
"Path (e.g. 0_userdata.0 or alias.0)": "Pfad (z.B. 0_userdata.0 oder alias.0)",
|
|
@@ -29,6 +30,7 @@
|
|
|
29
30
|
"Paths to scan": "Zu scannende Pfade",
|
|
30
31
|
"Purpose": "Zweck",
|
|
31
32
|
"Scan Paths": "Scan-Pfade",
|
|
33
|
+
"Scan all objects (complete)": "Alle Objekte scannen (Komplett)",
|
|
32
34
|
"Scan interval (hours)": "Scan-Intervall (Stunden)",
|
|
33
35
|
"Usage in VIS Widgets": "Verwendung in VIS-Widgets",
|
|
34
36
|
"When enabled, all configured paths will be scanned automatically at the specified interval": "Wenn aktiviert, werden alle konfigurierten Pfade automatisch im angegebenen Intervall gescannt",
|
package/admin/i18n/en.json
CHANGED
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
"Detection Thresholds": "Detection Thresholds",
|
|
10
10
|
"Each scan result contains a JSON array with the following fields per datapoint:": "Each scan result contains a JSON array with the following 10 fields per datapoint:",
|
|
11
11
|
"Enable automatic scans": "Enable automatic scans",
|
|
12
|
+
"Scan all objects (complete)": "Scan all objects (complete)",
|
|
13
|
+
"If enabled, the adapter will scan the entire object tree and store the result in a separate 'complete' result channel.": "If enabled, the adapter will scan the entire object tree and store the result in a separate 'complete' result channel.",
|
|
12
14
|
"Enabled": "Enabled",
|
|
13
15
|
"For German tables: Use status_de and issue_de columns\nFor English tables: Use status and issue columns\n\nFilter by 'issue != null' to show only problematic datapoints.": "For German tables: Use status_de and issue_de columns\nFor English tables: Use status and issue columns\n\nFilter by 'issue != null' to show only problematic datapoints.",
|
|
14
16
|
"For alias.* paths: Check if target datapoints exist (ghost detection)": "For alias.* paths: Check if target datapoints exist (ghost detection)",
|
package/admin/i18n/es.json
CHANGED
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
"General Settings": "General Settings",
|
|
35
35
|
"Help & Documentation": "Ayuda y documentación",
|
|
36
36
|
"How often the automatic scan should run (minimum 1 hour)": "How often the automatic scan should run (minimum 1 hour)",
|
|
37
|
+
"If enabled, the adapter will scan the entire object tree and store the result in a separate 'complete' result channel.": "Si está habilitado, el adaptador escaneará todo el árbol de objetos y almacenará el resultado en un canal de resultados \"completo\" separado.",
|
|
37
38
|
"JSON Table Field Description": "Descripción del campo de la tabla JSON",
|
|
38
39
|
"Name (for result state)": "Name (for result state)",
|
|
39
40
|
"Path (e.g. 0_userdata.0 or alias.0)": "Path (e.g. 0_userdata.0 or alias.0)",
|
|
@@ -41,6 +42,7 @@
|
|
|
41
42
|
"Paths to scan": "Paths to scan",
|
|
42
43
|
"Purpose": "Objetivo",
|
|
43
44
|
"Scan Paths": "Scan Paths",
|
|
45
|
+
"Scan all objects (complete)": "Escanear todos los objetos (completo)",
|
|
44
46
|
"Scan interval (hours)": "Scan interval (hours)",
|
|
45
47
|
"Usage in VIS Widgets": "Uso en widgets de VIS",
|
|
46
48
|
"When enabled, all configured paths will be scanned automatically at the specified interval": "When enabled, all configured paths will be scanned automatically at the specified interval",
|
package/admin/i18n/fr.json
CHANGED
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
"General Settings": "General Settings",
|
|
35
35
|
"Help & Documentation": "Aide et documentation",
|
|
36
36
|
"How often the automatic scan should run (minimum 1 hour)": "How often the automatic scan should run (minimum 1 hour)",
|
|
37
|
+
"If enabled, the adapter will scan the entire object tree and store the result in a separate 'complete' result channel.": "S'il est activé, l'adaptateur analysera l'intégralité de l'arborescence d'objets et stockera le résultat dans un canal de résultats « complet » distinct.",
|
|
37
38
|
"JSON Table Field Description": "JSON Table Field Description",
|
|
38
39
|
"Name (for result state)": "Name (for result state)",
|
|
39
40
|
"Path (e.g. 0_userdata.0 or alias.0)": "Path (e.g. 0_userdata.0 or alias.0)",
|
|
@@ -41,6 +42,7 @@
|
|
|
41
42
|
"Paths to scan": "Paths to scan",
|
|
42
43
|
"Purpose": "But",
|
|
43
44
|
"Scan Paths": "Scan Paths",
|
|
45
|
+
"Scan all objects (complete)": "Scanner tous les objets (terminé)",
|
|
44
46
|
"Scan interval (hours)": "Scan interval (hours)",
|
|
45
47
|
"Usage in VIS Widgets": "Utilisation dans les widgets VIS",
|
|
46
48
|
"When enabled, all configured paths will be scanned automatically at the specified interval": "When enabled, all configured paths will be scanned automatically at the specified interval",
|
package/admin/i18n/it.json
CHANGED
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
"General Settings": "General Settings",
|
|
35
35
|
"Help & Documentation": "Aiuto e documentazione",
|
|
36
36
|
"How often the automatic scan should run (minimum 1 hour)": "How often the automatic scan should run (minimum 1 hour)",
|
|
37
|
+
"If enabled, the adapter will scan the entire object tree and store the result in a separate 'complete' result channel.": "Se abilitato, l'adattatore eseguirà la scansione dell'intero albero degli oggetti e memorizzerà il risultato in un canale di risultati \"completo\" separato.",
|
|
37
38
|
"JSON Table Field Description": "Descrizione campo tabella JSON",
|
|
38
39
|
"Name (for result state)": "Name (for result state)",
|
|
39
40
|
"Path (e.g. 0_userdata.0 or alias.0)": "Path (e.g. 0_userdata.0 or alias.0)",
|
|
@@ -41,6 +42,7 @@
|
|
|
41
42
|
"Paths to scan": "Paths to scan",
|
|
42
43
|
"Purpose": "Scopo",
|
|
43
44
|
"Scan Paths": "Scan Paths",
|
|
45
|
+
"Scan all objects (complete)": "Scansiona tutti gli oggetti (completo)",
|
|
44
46
|
"Scan interval (hours)": "Scan interval (hours)",
|
|
45
47
|
"Usage in VIS Widgets": "Utilizzo nei widget VIS",
|
|
46
48
|
"When enabled, all configured paths will be scanned automatically at the specified interval": "When enabled, all configured paths will be scanned automatically at the specified interval",
|
package/admin/i18n/nl.json
CHANGED
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
"General Settings": "General Settings",
|
|
35
35
|
"Help & Documentation": "Hulp & Documentatie",
|
|
36
36
|
"How often the automatic scan should run (minimum 1 hour)": "How often the automatic scan should run (minimum 1 hour)",
|
|
37
|
+
"If enabled, the adapter will scan the entire object tree and store the result in a separate 'complete' result channel.": "Indien ingeschakeld, scant de adapter de gehele objectboom en slaat het resultaat op in een apart 'volledig' resultaatkanaal.",
|
|
37
38
|
"JSON Table Field Description": "JSON-tabelveldbeschrijving",
|
|
38
39
|
"Name (for result state)": "Name (for result state)",
|
|
39
40
|
"Path (e.g. 0_userdata.0 or alias.0)": "Path (e.g. 0_userdata.0 or alias.0)",
|
|
@@ -41,6 +42,7 @@
|
|
|
41
42
|
"Paths to scan": "Paths to scan",
|
|
42
43
|
"Purpose": "Doel",
|
|
43
44
|
"Scan Paths": "Scan Paths",
|
|
45
|
+
"Scan all objects (complete)": "Scan alle objecten (compleet)",
|
|
44
46
|
"Scan interval (hours)": "Scan interval (hours)",
|
|
45
47
|
"Usage in VIS Widgets": "Gebruik in VIS-widgets",
|
|
46
48
|
"When enabled, all configured paths will be scanned automatically at the specified interval": "When enabled, all configured paths will be scanned automatically at the specified interval",
|
package/admin/i18n/pl.json
CHANGED
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
"General Settings": "General Settings",
|
|
35
35
|
"Help & Documentation": "Pomoc i dokumentacja",
|
|
36
36
|
"How often the automatic scan should run (minimum 1 hour)": "How often the automatic scan should run (minimum 1 hour)",
|
|
37
|
+
"If enabled, the adapter will scan the entire object tree and store the result in a separate 'complete' result channel.": "Jeśli ta opcja jest włączona, adapter przeskanuje całe drzewo obiektów i zapisze wynik w oddzielnym „kompletnym” kanale wyników.",
|
|
37
38
|
"JSON Table Field Description": "Opis pola tabeli JSON",
|
|
38
39
|
"Name (for result state)": "Name (for result state)",
|
|
39
40
|
"Path (e.g. 0_userdata.0 or alias.0)": "Path (e.g. 0_userdata.0 or alias.0)",
|
|
@@ -41,6 +42,7 @@
|
|
|
41
42
|
"Paths to scan": "Paths to scan",
|
|
42
43
|
"Purpose": "Zamiar",
|
|
43
44
|
"Scan Paths": "Scan Paths",
|
|
45
|
+
"Scan all objects (complete)": "Zeskanuj wszystkie obiekty (ukończono)",
|
|
44
46
|
"Scan interval (hours)": "Scan interval (hours)",
|
|
45
47
|
"Usage in VIS Widgets": "Wykorzystanie w widżetach VIS",
|
|
46
48
|
"When enabled, all configured paths will be scanned automatically at the specified interval": "When enabled, all configured paths will be scanned automatically at the specified interval",
|
package/admin/i18n/pt.json
CHANGED
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
"General Settings": "General Settings",
|
|
35
35
|
"Help & Documentation": "Ajuda e documentação",
|
|
36
36
|
"How often the automatic scan should run (minimum 1 hour)": "How often the automatic scan should run (minimum 1 hour)",
|
|
37
|
+
"If enabled, the adapter will scan the entire object tree and store the result in a separate 'complete' result channel.": "Se ativado, o adaptador varrerá toda a árvore de objetos e armazenará o resultado em um canal de resultados 'completo' separado.",
|
|
37
38
|
"JSON Table Field Description": "Descrição do campo da tabela JSON",
|
|
38
39
|
"Name (for result state)": "Name (for result state)",
|
|
39
40
|
"Path (e.g. 0_userdata.0 or alias.0)": "Path (e.g. 0_userdata.0 or alias.0)",
|
|
@@ -41,6 +42,7 @@
|
|
|
41
42
|
"Paths to scan": "Paths to scan",
|
|
42
43
|
"Purpose": "Propósito",
|
|
43
44
|
"Scan Paths": "Scan Paths",
|
|
45
|
+
"Scan all objects (complete)": "Digitalizar todos os objetos (completo)",
|
|
44
46
|
"Scan interval (hours)": "Scan interval (hours)",
|
|
45
47
|
"Usage in VIS Widgets": "Uso em widgets VIS",
|
|
46
48
|
"When enabled, all configured paths will be scanned automatically at the specified interval": "When enabled, all configured paths will be scanned automatically at the specified interval",
|
package/admin/i18n/ru.json
CHANGED
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
"General Settings": "General Settings",
|
|
35
35
|
"Help & Documentation": "Помощь и документация",
|
|
36
36
|
"How often the automatic scan should run (minimum 1 hour)": "How often the automatic scan should run (minimum 1 hour)",
|
|
37
|
+
"If enabled, the adapter will scan the entire object tree and store the result in a separate 'complete' result channel.": "Если этот параметр включен, адаптер просканирует все дерево объектов и сохранит результат в отдельном «полном» канале результатов.",
|
|
37
38
|
"JSON Table Field Description": "Описание поля таблицы JSON",
|
|
38
39
|
"Name (for result state)": "Name (for result state)",
|
|
39
40
|
"Path (e.g. 0_userdata.0 or alias.0)": "Path (e.g. 0_userdata.0 or alias.0)",
|
|
@@ -41,6 +42,7 @@
|
|
|
41
42
|
"Paths to scan": "Paths to scan",
|
|
42
43
|
"Purpose": "Цель",
|
|
43
44
|
"Scan Paths": "Scan Paths",
|
|
45
|
+
"Scan all objects (complete)": "Сканировать все объекты (полное)",
|
|
44
46
|
"Scan interval (hours)": "Scan interval (hours)",
|
|
45
47
|
"Usage in VIS Widgets": "Использование в виджетах VIS",
|
|
46
48
|
"When enabled, all configured paths will be scanned automatically at the specified interval": "When enabled, all configured paths will be scanned automatically at the specified interval",
|
package/admin/i18n/uk.json
CHANGED
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
"General Settings": "General Settings",
|
|
35
35
|
"Help & Documentation": "Довідка та документація",
|
|
36
36
|
"How often the automatic scan should run (minimum 1 hour)": "How often the automatic scan should run (minimum 1 hour)",
|
|
37
|
+
"If enabled, the adapter will scan the entire object tree and store the result in a separate 'complete' result channel.": "Якщо ввімкнено, адаптер скануватиме все дерево об’єктів і зберігатиме результат в окремому «повному» каналі результатів.",
|
|
37
38
|
"JSON Table Field Description": "Опис поля таблиці JSON",
|
|
38
39
|
"Name (for result state)": "Name (for result state)",
|
|
39
40
|
"Path (e.g. 0_userdata.0 or alias.0)": "Path (e.g. 0_userdata.0 or alias.0)",
|
|
@@ -41,6 +42,7 @@
|
|
|
41
42
|
"Paths to scan": "Paths to scan",
|
|
42
43
|
"Purpose": "призначення",
|
|
43
44
|
"Scan Paths": "Scan Paths",
|
|
45
|
+
"Scan all objects (complete)": "Сканувати всі об'єкти (завершено)",
|
|
44
46
|
"Scan interval (hours)": "Scan interval (hours)",
|
|
45
47
|
"Usage in VIS Widgets": "Використання у віджетах VIS",
|
|
46
48
|
"When enabled, all configured paths will be scanned automatically at the specified interval": "When enabled, all configured paths will be scanned automatically at the specified interval",
|
package/admin/i18n/zh-cn.json
CHANGED
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
"General Settings": "General Settings",
|
|
35
35
|
"Help & Documentation": "帮助和文档",
|
|
36
36
|
"How often the automatic scan should run (minimum 1 hour)": "How often the automatic scan should run (minimum 1 hour)",
|
|
37
|
+
"If enabled, the adapter will scan the entire object tree and store the result in a separate 'complete' result channel.": "如果启用,适配器将扫描整个对象树并将结果存储在单独的“完整”结果通道中。",
|
|
37
38
|
"JSON Table Field Description": "JSON 表字段说明",
|
|
38
39
|
"Name (for result state)": "Name (for result state)",
|
|
39
40
|
"Path (e.g. 0_userdata.0 or alias.0)": "Path (e.g. 0_userdata.0 or alias.0)",
|
|
@@ -41,6 +42,7 @@
|
|
|
41
42
|
"Paths to scan": "Paths to scan",
|
|
42
43
|
"Purpose": "目的",
|
|
43
44
|
"Scan Paths": "Scan Paths",
|
|
45
|
+
"Scan all objects (complete)": "扫描所有对象(完整)",
|
|
44
46
|
"Scan interval (hours)": "Scan interval (hours)",
|
|
45
47
|
"Usage in VIS Widgets": "在 VIS 小部件中的使用",
|
|
46
48
|
"When enabled, all configured paths will be scanned automatically at the specified interval": "When enabled, all configured paths will be scanned automatically at the specified interval",
|
package/admin/jsonConfig.json
CHANGED
|
@@ -10,13 +10,33 @@
|
|
|
10
10
|
"_headerAutoScan": {
|
|
11
11
|
"type": "header",
|
|
12
12
|
"text": "Automatic Scanning",
|
|
13
|
-
"size": 3
|
|
13
|
+
"size": 3,
|
|
14
|
+
"xs": 12,
|
|
15
|
+
"sm": 12,
|
|
16
|
+
"md": 12,
|
|
17
|
+
"lg": 12,
|
|
18
|
+
"xl": 12
|
|
14
19
|
},
|
|
15
20
|
"autoScan": {
|
|
16
21
|
"type": "checkbox",
|
|
17
22
|
"label": "Enable automatic scans",
|
|
18
23
|
"help": "When enabled, all configured paths will be scanned automatically at the specified interval",
|
|
19
24
|
"newLine": true,
|
|
25
|
+
"xs": 12,
|
|
26
|
+
"sm": 12,
|
|
27
|
+
"md": 6,
|
|
28
|
+
"lg": 4,
|
|
29
|
+
"xl": 4,
|
|
30
|
+
"style": {
|
|
31
|
+
"fontSize": "0.875rem"
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"scanAllObjects": {
|
|
35
|
+
"type": "checkbox",
|
|
36
|
+
"label": "Scan all objects (complete)",
|
|
37
|
+
"help": "If enabled, the adapter will scan the entire object tree and store the result in a separate 'complete' result channel.",
|
|
38
|
+
"newLine": true,
|
|
39
|
+
"xs": 12,
|
|
20
40
|
"sm": 12,
|
|
21
41
|
"md": 6,
|
|
22
42
|
"lg": 4,
|
|
@@ -33,6 +53,7 @@
|
|
|
33
53
|
"max": 168,
|
|
34
54
|
"default": 24,
|
|
35
55
|
"hidden": "!data.autoScan",
|
|
56
|
+
"xs": 12,
|
|
36
57
|
"sm": 12,
|
|
37
58
|
"md": 6,
|
|
38
59
|
"lg": 4,
|
|
@@ -42,7 +63,12 @@
|
|
|
42
63
|
"type": "header",
|
|
43
64
|
"text": "Detection Thresholds",
|
|
44
65
|
"size": 3,
|
|
45
|
-
"newLine": true
|
|
66
|
+
"newLine": true,
|
|
67
|
+
"xs": 12,
|
|
68
|
+
"sm": 12,
|
|
69
|
+
"md": 12,
|
|
70
|
+
"lg": 12,
|
|
71
|
+
"xl": 12
|
|
46
72
|
},
|
|
47
73
|
"daysUntilStale": {
|
|
48
74
|
"type": "number",
|
|
@@ -51,6 +77,7 @@
|
|
|
51
77
|
"min": 1,
|
|
52
78
|
"max": 3650,
|
|
53
79
|
"default": 90,
|
|
80
|
+
"xs": 12,
|
|
54
81
|
"sm": 12,
|
|
55
82
|
"md": 6,
|
|
56
83
|
"lg": 4,
|
|
@@ -63,6 +90,7 @@
|
|
|
63
90
|
"min": 1,
|
|
64
91
|
"max": 3650,
|
|
65
92
|
"default": 365,
|
|
93
|
+
"xs": 12,
|
|
66
94
|
"sm": 12,
|
|
67
95
|
"md": 6,
|
|
68
96
|
"lg": 4,
|
|
@@ -78,12 +106,18 @@
|
|
|
78
106
|
"_headerPaths": {
|
|
79
107
|
"type": "header",
|
|
80
108
|
"text": "Path Configuration",
|
|
81
|
-
"size": 3
|
|
109
|
+
"size": 3,
|
|
110
|
+
"xs": 12,
|
|
111
|
+
"sm": 12,
|
|
112
|
+
"md": 12,
|
|
113
|
+
"lg": 12,
|
|
114
|
+
"xl": 12
|
|
82
115
|
},
|
|
83
116
|
"_pathsInfo": {
|
|
84
117
|
"type": "staticText",
|
|
85
118
|
"text": "Configure which paths to scan for unused datapoints. Each path will get its own result state with a JSON table.",
|
|
86
119
|
"newLine": true,
|
|
120
|
+
"xs": 12,
|
|
87
121
|
"sm": 12,
|
|
88
122
|
"md": 12,
|
|
89
123
|
"lg": 12,
|
|
@@ -96,6 +130,11 @@
|
|
|
96
130
|
"type": "table",
|
|
97
131
|
"newLine": true,
|
|
98
132
|
"label": "Paths to scan",
|
|
133
|
+
"xs": 12,
|
|
134
|
+
"sm": 12,
|
|
135
|
+
"md": 12,
|
|
136
|
+
"lg": 12,
|
|
137
|
+
"xl": 12,
|
|
99
138
|
"items": [
|
|
100
139
|
{
|
|
101
140
|
"type": "checkbox",
|
|
@@ -138,12 +177,18 @@
|
|
|
138
177
|
"_headerFields": {
|
|
139
178
|
"type": "header",
|
|
140
179
|
"text": "JSON Table Field Description",
|
|
141
|
-
"size": 3
|
|
180
|
+
"size": 3,
|
|
181
|
+
"xs": 12,
|
|
182
|
+
"sm": 12,
|
|
183
|
+
"md": 12,
|
|
184
|
+
"lg": 12,
|
|
185
|
+
"xl": 12
|
|
142
186
|
},
|
|
143
187
|
"_fieldInfo": {
|
|
144
188
|
"type": "staticText",
|
|
145
189
|
"text": "Each scan result contains a JSON array with the following 10 fields per datapoint:",
|
|
146
190
|
"newLine": true,
|
|
191
|
+
"xs": 12,
|
|
147
192
|
"sm": 12,
|
|
148
193
|
"md": 12,
|
|
149
194
|
"lg": 12,
|
|
@@ -157,6 +202,11 @@
|
|
|
157
202
|
"newLine": true,
|
|
158
203
|
"noDelete": true,
|
|
159
204
|
"compact": true,
|
|
205
|
+
"xs": 12,
|
|
206
|
+
"sm": 12,
|
|
207
|
+
"md": 12,
|
|
208
|
+
"lg": 12,
|
|
209
|
+
"xl": 12,
|
|
160
210
|
"items": [
|
|
161
211
|
{
|
|
162
212
|
"type": "text",
|
|
@@ -191,12 +241,18 @@
|
|
|
191
241
|
"type": "header",
|
|
192
242
|
"text": "Usage in VIS Widgets",
|
|
193
243
|
"size": 3,
|
|
194
|
-
"newLine": true
|
|
244
|
+
"newLine": true,
|
|
245
|
+
"xs": 12,
|
|
246
|
+
"sm": 12,
|
|
247
|
+
"md": 12,
|
|
248
|
+
"lg": 12,
|
|
249
|
+
"xl": 12
|
|
195
250
|
},
|
|
196
251
|
"_usageInfo": {
|
|
197
252
|
"type": "staticText",
|
|
198
253
|
"text": "For German tables: Use status_de and issue_de columns\nFor English tables: Use status and issue columns\n\nFilter by 'issue != null' to show only problematic datapoints.",
|
|
199
254
|
"newLine": true,
|
|
255
|
+
"xs": 12,
|
|
200
256
|
"sm": 12,
|
|
201
257
|
"md": 12,
|
|
202
258
|
"lg": 12,
|
|
@@ -209,8 +265,8 @@
|
|
|
209
265
|
"type": "staticText",
|
|
210
266
|
"text": "Team inventwo • <a href=\"https://github.com/inventwo\">https://github.com/inventwo</a> • by skvarel",
|
|
211
267
|
"newLine": true,
|
|
212
|
-
"sm": 12,
|
|
213
268
|
"xs": 12,
|
|
269
|
+
"sm": 12,
|
|
214
270
|
"md": 12,
|
|
215
271
|
"lg": 12,
|
|
216
272
|
"xl": 12,
|
package/io-package.json
CHANGED
|
@@ -1,112 +1,175 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
2
|
+
"common": {
|
|
3
|
+
"name": "tidy",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"news": {
|
|
6
|
+
"0.1.0": {
|
|
7
|
+
"en": "Added option for complete scan",
|
|
8
|
+
"de": "Option für den kompletten Scan hinzugefügt",
|
|
9
|
+
"ru": "Дополнительный вариант для полного сканирования",
|
|
10
|
+
"pt": "Opção adicionada para verificação completa",
|
|
11
|
+
"nl": "Toegevoegd optie voor volledige scan",
|
|
12
|
+
"fr": "Ajout de l'option pour la numérisation complète",
|
|
13
|
+
"it": "Aggiunta opzione per la scansione completa",
|
|
14
|
+
"es": "Opción agregada para el escaneo completo",
|
|
15
|
+
"pl": "Dodano opcję do pełnego skanowania",
|
|
16
|
+
"uk": "Додано варіант для повного сканування",
|
|
17
|
+
"zh-cn": "添加完整扫描选项"
|
|
18
|
+
},
|
|
19
|
+
"0.0.1": {
|
|
20
|
+
"en": "initial release",
|
|
21
|
+
"de": "Erstveröffentlichung",
|
|
22
|
+
"ru": "Начальная версия",
|
|
23
|
+
"pt": "lançamento inicial",
|
|
24
|
+
"nl": "Eerste uitgave",
|
|
25
|
+
"fr": "Première version",
|
|
26
|
+
"it": "Versione iniziale",
|
|
27
|
+
"es": "Versión inicial",
|
|
28
|
+
"pl": "Pierwsze wydanie",
|
|
29
|
+
"uk": "Початкова версія",
|
|
30
|
+
"zh-cn": "首次出版"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"titleLang": {
|
|
34
|
+
"en": "Tidy",
|
|
35
|
+
"de": "Tidy",
|
|
36
|
+
"ru": "Tidy",
|
|
37
|
+
"pt": "Tidy",
|
|
38
|
+
"nl": "Tidy",
|
|
39
|
+
"fr": "Tidy",
|
|
40
|
+
"it": "Tidy",
|
|
41
|
+
"es": "Tidy",
|
|
42
|
+
"pl": "Tidy",
|
|
43
|
+
"uk": "Tidy",
|
|
44
|
+
"zh-cn": "Tidy"
|
|
45
|
+
},
|
|
46
|
+
"desc": {
|
|
47
|
+
"en": "Helps to find unused objects and states to clean up your system.",
|
|
48
|
+
"de": "Hilft dabei, ungenutzte Objekte und Zustände zu finden, um dein System aufzuräumen.",
|
|
49
|
+
"ru": "Помогает находить неиспользуемые объекты и состояния для очистки системы.",
|
|
50
|
+
"pt": "Ajuda você a encontrar objetos e estados não utilizados para limpar seu sistema.",
|
|
51
|
+
"nl": "Helpt je ongebruikte objecten en statussen te vinden om je systeem op te schonen.",
|
|
52
|
+
"fr": "Vous aide à trouver les objets et états inutilisés afin de nettoyer votre système.",
|
|
53
|
+
"it": "Ti aiuta a trovare oggetti e stati inutilizzati per ripulire il sistema.",
|
|
54
|
+
"es": "Te ayuda a encontrar objetos y estados no utilizados para limpiar tu sistema.",
|
|
55
|
+
"pl": "Pomaga znaleźć nieużywane obiekty i stany, dzięki czemu możesz oczyścić system.",
|
|
56
|
+
"uk": "Допомагає знайти невикористовувані об'єкти та стани для очищення системи.",
|
|
57
|
+
"zh-cn": "帮助您查找未使用的对象和状态,以清理您的系统。"
|
|
58
|
+
},
|
|
59
|
+
"authors": [
|
|
60
|
+
"skvarel <skvarel@inventwo.com>"
|
|
61
|
+
],
|
|
62
|
+
"keywords": [
|
|
63
|
+
"cleanup",
|
|
64
|
+
"tidy",
|
|
65
|
+
"unused"
|
|
66
|
+
],
|
|
67
|
+
"licenseInformation": {
|
|
68
|
+
"type": "free",
|
|
69
|
+
"license": "MIT"
|
|
70
|
+
},
|
|
71
|
+
"platform": "Javascript/Node.js",
|
|
72
|
+
"icon": "tidy.svg",
|
|
73
|
+
"enabled": true,
|
|
74
|
+
"extIcon": "https://raw.githubusercontent.com/inventwo/ioBroker.tidy/main/admin/tidy.svg",
|
|
75
|
+
"readme": "https://github.com/inventwo/ioBroker.tidy/blob/main/README.md",
|
|
76
|
+
"loglevel": "info",
|
|
77
|
+
"tier": 3,
|
|
78
|
+
"mode": "daemon",
|
|
79
|
+
"type": "storage",
|
|
80
|
+
"compact": true,
|
|
81
|
+
"connectionType": "local",
|
|
82
|
+
"dataSource": "poll",
|
|
83
|
+
"adminUI": {
|
|
84
|
+
"config": "json"
|
|
85
|
+
},
|
|
86
|
+
"dependencies": [
|
|
87
|
+
{
|
|
88
|
+
"js-controller": ">=6.0.11"
|
|
89
|
+
}
|
|
90
|
+
],
|
|
91
|
+
"globalDependencies": [
|
|
92
|
+
{
|
|
93
|
+
"admin": ">=7.6.20"
|
|
94
|
+
}
|
|
95
|
+
]
|
|
96
|
+
},
|
|
97
|
+
"native": {
|
|
98
|
+
"autoScan": false,
|
|
99
|
+
"scanInterval": 24,
|
|
100
|
+
"daysUntilStale": 90,
|
|
101
|
+
"daysUntilDead": 365,
|
|
102
|
+
"paths": [
|
|
103
|
+
{
|
|
104
|
+
"enabled": true,
|
|
105
|
+
"path": "0_userdata.0",
|
|
106
|
+
"name": "userdata",
|
|
107
|
+
"checkAliasTargets": false
|
|
108
|
+
}
|
|
109
|
+
],
|
|
110
|
+
"fieldDocs": [
|
|
111
|
+
{
|
|
112
|
+
"pos": "01",
|
|
113
|
+
"field": "id",
|
|
114
|
+
"description": "Full datapoint path",
|
|
115
|
+
"purpose": "Unique identification"
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
"pos": "02",
|
|
119
|
+
"field": "name",
|
|
120
|
+
"description": "common.name or last part of ID",
|
|
121
|
+
"purpose": "User-friendly name"
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"pos": "03",
|
|
125
|
+
"field": "last_ts",
|
|
126
|
+
"description": "Unix timestamp (ms) or null",
|
|
127
|
+
"purpose": "Sorting in background"
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
"pos": "04",
|
|
131
|
+
"field": "last_ts_iso",
|
|
132
|
+
"description": "Formatted date string",
|
|
133
|
+
"purpose": "Display in table"
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"pos": "05",
|
|
137
|
+
"field": "value",
|
|
138
|
+
"description": "Current datapoint value",
|
|
139
|
+
"purpose": "Final check before deletion"
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
"pos": "06",
|
|
143
|
+
"field": "status",
|
|
144
|
+
"description": "active, dead, stale, undefined, orphaned",
|
|
145
|
+
"purpose": "Classification (English)"
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
"pos": "07",
|
|
149
|
+
"field": "status_de",
|
|
150
|
+
"description": "aktiv, inaktiv, veraltet, undefiniert, verwaist",
|
|
151
|
+
"purpose": "Classification (German)"
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"pos": "08",
|
|
155
|
+
"field": "issue",
|
|
156
|
+
"description": "dead, stale, orphaned_alias, or null",
|
|
157
|
+
"purpose": "Filter criterion (null = OK)"
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
"pos": "09",
|
|
161
|
+
"field": "issue_de",
|
|
162
|
+
"description": "inaktiv, veraltet, verwaistes Alias, or null",
|
|
163
|
+
"purpose": "Filter criterion (German)"
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
"pos": "10",
|
|
167
|
+
"field": "size",
|
|
168
|
+
"description": "JSON.stringify(val).length",
|
|
169
|
+
"purpose": "Finds \"storage hogs\""
|
|
170
|
+
}
|
|
171
|
+
]
|
|
172
|
+
},
|
|
173
|
+
"objects": [],
|
|
174
|
+
"instanceObjects": []
|
|
112
175
|
}
|
package/main.js
CHANGED
|
@@ -39,12 +39,22 @@ class Tidy extends utils.Adapter {
|
|
|
39
39
|
// Create objects for each configured path
|
|
40
40
|
await this.createPathObjects();
|
|
41
41
|
|
|
42
|
+
// Create objects for complete scan if enabled
|
|
43
|
+
if (this.config.scanAllObjects) {
|
|
44
|
+
await this.createCompleteObjects();
|
|
45
|
+
}
|
|
46
|
+
|
|
42
47
|
// Subscribe to trigger states
|
|
43
48
|
this.subscribeStates('*.trigger');
|
|
44
49
|
|
|
45
50
|
// Run initial scan for all enabled paths
|
|
46
51
|
await this.scanAllPaths();
|
|
47
52
|
|
|
53
|
+
// Run complete scan if enabled
|
|
54
|
+
if (this.config.scanAllObjects) {
|
|
55
|
+
await this.scanComplete();
|
|
56
|
+
}
|
|
57
|
+
|
|
48
58
|
// Setup automatic scanning if enabled
|
|
49
59
|
if (this.config.autoScan && this.config.scanInterval > 0) {
|
|
50
60
|
const intervalMs = this.config.scanInterval * 60 * 60 * 1000; // Convert hours to milliseconds
|
|
@@ -52,9 +62,165 @@ class Tidy extends utils.Adapter {
|
|
|
52
62
|
this.scanInterval = setInterval(async () => {
|
|
53
63
|
this.log.info('Running automatic scan...');
|
|
54
64
|
await this.scanAllPaths();
|
|
65
|
+
if (this.config.scanAllObjects) {
|
|
66
|
+
await this.scanComplete();
|
|
67
|
+
}
|
|
55
68
|
}, intervalMs);
|
|
56
69
|
}
|
|
57
70
|
}
|
|
71
|
+
/**
|
|
72
|
+
* Create channel and states for complete scan
|
|
73
|
+
*/
|
|
74
|
+
async createCompleteObjects() {
|
|
75
|
+
const channelId = 'complete';
|
|
76
|
+
// Channel
|
|
77
|
+
await this.setObjectNotExistsAsync(channelId, {
|
|
78
|
+
type: 'channel',
|
|
79
|
+
common: { name: 'Scan results for complete object tree' },
|
|
80
|
+
native: {},
|
|
81
|
+
});
|
|
82
|
+
// States
|
|
83
|
+
await this.setObjectNotExistsAsync(`${channelId}.trigger`, {
|
|
84
|
+
type: 'state',
|
|
85
|
+
common: {
|
|
86
|
+
name: 'Trigger complete scan',
|
|
87
|
+
type: 'boolean',
|
|
88
|
+
role: 'button',
|
|
89
|
+
read: true,
|
|
90
|
+
write: true,
|
|
91
|
+
def: false,
|
|
92
|
+
},
|
|
93
|
+
native: {},
|
|
94
|
+
});
|
|
95
|
+
await this.setObjectNotExistsAsync(`${channelId}.result`, {
|
|
96
|
+
type: 'state',
|
|
97
|
+
common: {
|
|
98
|
+
name: 'Complete scan result (JSON table)',
|
|
99
|
+
type: 'string',
|
|
100
|
+
role: 'json',
|
|
101
|
+
read: true,
|
|
102
|
+
write: false,
|
|
103
|
+
def: '[]',
|
|
104
|
+
},
|
|
105
|
+
native: {},
|
|
106
|
+
});
|
|
107
|
+
await this.setObjectNotExistsAsync(`${channelId}.lastScan`, {
|
|
108
|
+
type: 'state',
|
|
109
|
+
common: {
|
|
110
|
+
name: 'Last complete scan timestamp',
|
|
111
|
+
type: 'number',
|
|
112
|
+
role: 'value.time',
|
|
113
|
+
read: true,
|
|
114
|
+
write: false,
|
|
115
|
+
def: 0,
|
|
116
|
+
},
|
|
117
|
+
native: {},
|
|
118
|
+
});
|
|
119
|
+
await this.setObjectNotExistsAsync(`${channelId}.count`, {
|
|
120
|
+
type: 'state',
|
|
121
|
+
common: {
|
|
122
|
+
name: 'Total datapoints found (complete)',
|
|
123
|
+
type: 'number',
|
|
124
|
+
role: 'value',
|
|
125
|
+
read: true,
|
|
126
|
+
write: false,
|
|
127
|
+
def: 0,
|
|
128
|
+
},
|
|
129
|
+
native: {},
|
|
130
|
+
});
|
|
131
|
+
await this.setObjectNotExistsAsync(`${channelId}.deadCount`, {
|
|
132
|
+
type: 'state',
|
|
133
|
+
common: {
|
|
134
|
+
name: 'Dead datapoints (complete)',
|
|
135
|
+
type: 'number',
|
|
136
|
+
role: 'value',
|
|
137
|
+
read: true,
|
|
138
|
+
write: false,
|
|
139
|
+
def: 0,
|
|
140
|
+
},
|
|
141
|
+
native: {},
|
|
142
|
+
});
|
|
143
|
+
await this.setObjectNotExistsAsync(`${channelId}.staleCount`, {
|
|
144
|
+
type: 'state',
|
|
145
|
+
common: {
|
|
146
|
+
name: 'Stale datapoints (complete)',
|
|
147
|
+
type: 'number',
|
|
148
|
+
role: 'value',
|
|
149
|
+
read: true,
|
|
150
|
+
write: false,
|
|
151
|
+
def: 0,
|
|
152
|
+
},
|
|
153
|
+
native: {},
|
|
154
|
+
});
|
|
155
|
+
await this.setObjectNotExistsAsync(`${channelId}.orphanedCount`, {
|
|
156
|
+
type: 'state',
|
|
157
|
+
common: {
|
|
158
|
+
name: 'Orphaned aliases (complete)',
|
|
159
|
+
type: 'number',
|
|
160
|
+
role: 'value',
|
|
161
|
+
read: true,
|
|
162
|
+
write: false,
|
|
163
|
+
def: 0,
|
|
164
|
+
},
|
|
165
|
+
native: {},
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Scan the entire object tree for datapoints
|
|
171
|
+
*/
|
|
172
|
+
async scanComplete() {
|
|
173
|
+
const startTime = Date.now();
|
|
174
|
+
const channelId = 'complete';
|
|
175
|
+
this.log.info('Scanning entire object tree (complete scan) ...');
|
|
176
|
+
try {
|
|
177
|
+
const results = [];
|
|
178
|
+
// Get all states in the system
|
|
179
|
+
const objects = await this.getForeignObjectsAsync('*', 'state');
|
|
180
|
+
this.log.debug(`Found ${Object.keys(objects).length} objects in complete scan`);
|
|
181
|
+
for (const [id, obj] of Object.entries(objects)) {
|
|
182
|
+
if (!obj || obj.type !== 'state') {
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
const state = await this.getForeignStateAsync(id);
|
|
186
|
+
// Use a dummy pathConfig for analyzeDatapoint
|
|
187
|
+
const analysis = await this.analyzeDatapoint(id, obj, state, {});
|
|
188
|
+
if (analysis) {
|
|
189
|
+
results.push(analysis);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// Sort results by timestamp (oldest first)
|
|
193
|
+
results.sort((a, b) => {
|
|
194
|
+
if (a.last_ts === null) {
|
|
195
|
+
return -1;
|
|
196
|
+
}
|
|
197
|
+
if (b.last_ts === null) {
|
|
198
|
+
return 1;
|
|
199
|
+
}
|
|
200
|
+
return a.last_ts - b.last_ts;
|
|
201
|
+
});
|
|
202
|
+
// Count issues
|
|
203
|
+
const counts = {
|
|
204
|
+
total: results.length,
|
|
205
|
+
dead: results.filter(r => r.issue === 'dead').length,
|
|
206
|
+
stale: results.filter(r => r.issue === 'stale').length,
|
|
207
|
+
orphaned: results.filter(r => r.issue === 'orphaned_alias').length,
|
|
208
|
+
};
|
|
209
|
+
// Store results
|
|
210
|
+
await this.setStateAsync(`${channelId}.result`, JSON.stringify(results), true);
|
|
211
|
+
await this.setStateAsync(`${channelId}.lastScan`, Date.now(), true);
|
|
212
|
+
await this.setStateAsync(`${channelId}.count`, counts.total, true);
|
|
213
|
+
await this.setStateAsync(`${channelId}.deadCount`, counts.dead, true);
|
|
214
|
+
await this.setStateAsync(`${channelId}.staleCount`, counts.stale, true);
|
|
215
|
+
await this.setStateAsync(`${channelId}.orphanedCount`, counts.orphaned, true);
|
|
216
|
+
const duration = ((Date.now() - startTime) / 1000).toFixed(2);
|
|
217
|
+
this.log.info(
|
|
218
|
+
`Complete scan finished: ${counts.total} datapoints (${counts.dead} dead, ${counts.stale} stale, ${counts.orphaned} orphaned) in ${duration}s`,
|
|
219
|
+
);
|
|
220
|
+
} catch (error) {
|
|
221
|
+
this.log.error(`Error during complete scan: ${error.message}`);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
58
224
|
|
|
59
225
|
/**
|
|
60
226
|
* Is called when adapter shuts down - callback has to be called under any circumstances!
|
|
@@ -229,6 +395,11 @@ class Tidy extends utils.Adapter {
|
|
|
229
395
|
await this.scanPath(pathConfig);
|
|
230
396
|
}
|
|
231
397
|
|
|
398
|
+
// Complete scan trigger
|
|
399
|
+
if (this.config.scanAllObjects && channelId === 'complete') {
|
|
400
|
+
await this.scanComplete();
|
|
401
|
+
}
|
|
402
|
+
|
|
232
403
|
// Reset trigger
|
|
233
404
|
await this.setStateAsync(id, false, true);
|
|
234
405
|
}
|
package/package.json
CHANGED
|
@@ -1,75 +1,75 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "iobroker.tidy",
|
|
3
|
-
"version": "0.0
|
|
4
|
-
"description": "Analyzes ioBroker objects for unused datapoints and helps you clean up your instance",
|
|
5
|
-
"author": {
|
|
6
|
-
"name": "skvarel",
|
|
7
|
-
"email": "skvarel@inventwo.com"
|
|
8
|
-
},
|
|
9
|
-
"contributors": [
|
|
10
|
-
{
|
|
11
|
-
"name": "skvarel"
|
|
12
|
-
}
|
|
13
|
-
],
|
|
14
|
-
"homepage": "https://github.com/inventwo/ioBroker.tidy",
|
|
15
|
-
"license": "MIT",
|
|
16
|
-
"keywords": [
|
|
17
|
-
"cleanup",
|
|
18
|
-
"tidy",
|
|
19
|
-
"unused",
|
|
20
|
-
"ioBroker",
|
|
21
|
-
"objects"
|
|
22
|
-
],
|
|
23
|
-
"repository": {
|
|
24
|
-
"type": "git",
|
|
25
|
-
"url": "https://github.com/inventwo/ioBroker.tidy.git"
|
|
26
|
-
},
|
|
27
|
-
"engines": {
|
|
28
|
-
"node": ">= 20"
|
|
29
|
-
},
|
|
30
|
-
"dependencies": {
|
|
31
|
-
"@iobroker/adapter-core": "^3.3.2"
|
|
32
|
-
},
|
|
33
|
-
"devDependencies": {
|
|
34
|
-
"@alcalzone/release-script": "^5.1.1",
|
|
35
|
-
"@alcalzone/release-script-plugin-iobroker": "^5.1.2",
|
|
36
|
-
"@alcalzone/release-script-plugin-license": "^5.1.1",
|
|
37
|
-
"@alcalzone/release-script-plugin-manual-review": "^5.1.1",
|
|
38
|
-
"@iobroker/adapter-dev": "^1.5.0",
|
|
39
|
-
"@iobroker/dev-server": "^0.8.0",
|
|
40
|
-
"@iobroker/eslint-config": "^2.2.0",
|
|
41
|
-
"@iobroker/testing": "^5.2.2",
|
|
42
|
-
"@tsconfig/node20": "^20.1.9",
|
|
43
|
-
"@types/iobroker": "npm:@iobroker/types@^7.1.1",
|
|
44
|
-
"@types/node": "^25.5.2",
|
|
45
|
-
"typescript": "~6.0.2"
|
|
46
|
-
},
|
|
47
|
-
"main": "main.js",
|
|
48
|
-
"files": [
|
|
49
|
-
"admin{,/!(src)/**}/!(tsconfig|tsconfig.*|.eslintrc).{json,json5}",
|
|
50
|
-
"admin{,/!(src)/**}/*.{html,css,png,svg,jpg,js}",
|
|
51
|
-
"lib/",
|
|
52
|
-
"www/",
|
|
53
|
-
"io-package.json",
|
|
54
|
-
"LICENSE",
|
|
55
|
-
"main.js"
|
|
56
|
-
],
|
|
57
|
-
"scripts": {
|
|
58
|
-
"release-patch": "release-script patch --yes",
|
|
59
|
-
"release-minor": "release-script minor --yes",
|
|
60
|
-
"release-major": "release-script major --yes",
|
|
61
|
-
"test:js": "mocha --config test/mocharc.custom.json \"{!(node_modules|test)/**/*.test.js,*.test.js,test/**/test!(PackageFiles|Startup).js}\"",
|
|
62
|
-
"test:package": "mocha test/package --exit",
|
|
63
|
-
"test:integration": "mocha test/integration --exit",
|
|
64
|
-
"test": "npm run test:js && npm run test:package",
|
|
65
|
-
"check": "tsc --noEmit -p tsconfig.check.json",
|
|
66
|
-
"lint": "eslint -c eslint.config.mjs .",
|
|
67
|
-
"lint-fix": "eslint -c eslint.config.mjs . --fix",
|
|
68
|
-
"translate": "translate-adapter",
|
|
69
|
-
"dev-server": "dev-server"
|
|
70
|
-
},
|
|
71
|
-
"bugs": {
|
|
72
|
-
"url": "https://github.com/skvarel/ioBroker.tidy/issues"
|
|
73
|
-
},
|
|
74
|
-
"readmeFilename": "README.md"
|
|
75
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "iobroker.tidy",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Analyzes ioBroker objects for unused datapoints and helps you clean up your instance",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "skvarel",
|
|
7
|
+
"email": "skvarel@inventwo.com"
|
|
8
|
+
},
|
|
9
|
+
"contributors": [
|
|
10
|
+
{
|
|
11
|
+
"name": "skvarel"
|
|
12
|
+
}
|
|
13
|
+
],
|
|
14
|
+
"homepage": "https://github.com/inventwo/ioBroker.tidy",
|
|
15
|
+
"license": "MIT",
|
|
16
|
+
"keywords": [
|
|
17
|
+
"cleanup",
|
|
18
|
+
"tidy",
|
|
19
|
+
"unused",
|
|
20
|
+
"ioBroker",
|
|
21
|
+
"objects"
|
|
22
|
+
],
|
|
23
|
+
"repository": {
|
|
24
|
+
"type": "git",
|
|
25
|
+
"url": "https://github.com/inventwo/ioBroker.tidy.git"
|
|
26
|
+
},
|
|
27
|
+
"engines": {
|
|
28
|
+
"node": ">= 20"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@iobroker/adapter-core": "^3.3.2"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@alcalzone/release-script": "^5.1.1",
|
|
35
|
+
"@alcalzone/release-script-plugin-iobroker": "^5.1.2",
|
|
36
|
+
"@alcalzone/release-script-plugin-license": "^5.1.1",
|
|
37
|
+
"@alcalzone/release-script-plugin-manual-review": "^5.1.1",
|
|
38
|
+
"@iobroker/adapter-dev": "^1.5.0",
|
|
39
|
+
"@iobroker/dev-server": "^0.8.0",
|
|
40
|
+
"@iobroker/eslint-config": "^2.2.0",
|
|
41
|
+
"@iobroker/testing": "^5.2.2",
|
|
42
|
+
"@tsconfig/node20": "^20.1.9",
|
|
43
|
+
"@types/iobroker": "npm:@iobroker/types@^7.1.1",
|
|
44
|
+
"@types/node": "^25.5.2",
|
|
45
|
+
"typescript": "~6.0.2"
|
|
46
|
+
},
|
|
47
|
+
"main": "main.js",
|
|
48
|
+
"files": [
|
|
49
|
+
"admin{,/!(src)/**}/!(tsconfig|tsconfig.*|.eslintrc).{json,json5}",
|
|
50
|
+
"admin{,/!(src)/**}/*.{html,css,png,svg,jpg,js}",
|
|
51
|
+
"lib/",
|
|
52
|
+
"www/",
|
|
53
|
+
"io-package.json",
|
|
54
|
+
"LICENSE",
|
|
55
|
+
"main.js"
|
|
56
|
+
],
|
|
57
|
+
"scripts": {
|
|
58
|
+
"release-patch": "release-script patch --yes",
|
|
59
|
+
"release-minor": "release-script minor --yes",
|
|
60
|
+
"release-major": "release-script major --yes",
|
|
61
|
+
"test:js": "mocha --config test/mocharc.custom.json \"{!(node_modules|test)/**/*.test.js,*.test.js,test/**/test!(PackageFiles|Startup).js}\"",
|
|
62
|
+
"test:package": "mocha test/package --exit",
|
|
63
|
+
"test:integration": "mocha test/integration --exit",
|
|
64
|
+
"test": "npm run test:js && npm run test:package",
|
|
65
|
+
"check": "tsc --noEmit -p tsconfig.check.json",
|
|
66
|
+
"lint": "eslint -c eslint.config.mjs .",
|
|
67
|
+
"lint-fix": "eslint -c eslint.config.mjs . --fix",
|
|
68
|
+
"translate": "translate-adapter",
|
|
69
|
+
"dev-server": "dev-server"
|
|
70
|
+
},
|
|
71
|
+
"bugs": {
|
|
72
|
+
"url": "https://github.com/skvarel/ioBroker.tidy/issues"
|
|
73
|
+
},
|
|
74
|
+
"readmeFilename": "README.md"
|
|
75
|
+
}
|