iobroker.tidy 0.1.4 → 0.1.6

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 CHANGED
@@ -9,7 +9,7 @@
9
9
 
10
10
  [![COMMUNITY](https://img.shields.io/badge/community%20-ioBroker%20|%20forum-blue.svg)](https://forum.iobroker.net/topic/84331/tidy-adapter-alpha)
11
11
  [![MAINTAINER](https://img.shields.io/badge/maintainer-skvarel%20@%20inventwo-yellowgreen.svg)](https://github.com/skvarel)
12
- [![AI](https://img.shields.io/badge/ai%20assisted-copilot-blue.svg)](https://github.com/inventwo/ioBroker.tidy/blob/main/.github/copilot-instructions.md)
12
+ [![AI](https://img.shields.io/badge/ai%20assisted-cursor-blue.svg)](https://github.com/inventwo/ioBroker.tidy/blob/main/.cursor/iobroker-adapter.mdc)
13
13
 
14
14
  [![Paypal Donation](https://img.shields.io/badge/paypal-donate%20|%20spenden-green.svg)](https://www.paypal.com/donate/?hosted_button_id=7W6M3TFZ4W9LW)
15
15
 
@@ -31,6 +31,8 @@ The **Tidy** adapter helps to find unused objects and states to clean up your sy
31
31
  - Configurable age thresholds for "stale" and "dead" detection
32
32
  - Optional automatic scanning at configurable intervals (hourly)
33
33
  - Enable/disable individual scan paths
34
+ - Optional complete scan of the entire object tree
35
+ - **🌐 Complete scan**: Scan all states in the system (not limited to configured paths) via a separate result channel
34
36
  - **🎯 Manual triggers**: Each configured path gets a trigger button to run scans on demand
35
37
  - **📋 JSON table output**: Results are provided as JSON arrays, perfect for table widgets in VIS
36
38
  - **📈 Statistics**: Automatic counters for total, dead, stale, and orphaned datapoints
@@ -40,6 +42,7 @@ The **Tidy** adapter helps to find unused objects and states to clean up your sy
40
42
  ### General Settings
41
43
 
42
44
  - **Enable automatic scans**: When enabled, all configured paths are scanned automatically
45
+ - **Scan all objects (complete)**: When enabled, the adapter scans the entire object tree and stores results in a separate `complete` channel (see below)
43
46
  - **Scan interval**: How often automatic scans should run (in hours, minimum 1)
44
47
  - **Days until 'stale'**: Datapoints not updated for this many days are marked as stale (warning)
45
48
  - **Days until 'dead'**: Datapoints not updated for this many days are marked as dead (critical)
@@ -65,6 +68,18 @@ For each configured path (e.g., "userdata"), the adapter creates:
65
68
  - **`tidy.0.userdata.staleCount`** (number): Number of stale datapoints
66
69
  - **`tidy.0.userdata.orphanedCount`** (number): Number of orphaned aliases
67
70
 
71
+ When **Scan all objects (complete)** is enabled in the general settings, the adapter additionally creates:
72
+
73
+ - **`tidy.0.complete.trigger`** (button): Click to manually start a complete scan
74
+ - **`tidy.0.complete.result`** (json): Scan results for all states in the system
75
+ - **`tidy.0.complete.lastScan`** (timestamp): When the last complete scan was performed
76
+ - **`tidy.0.complete.count`** (number): Total datapoints found
77
+ - **`tidy.0.complete.deadCount`** (number): Number of dead datapoints
78
+ - **`tidy.0.complete.staleCount`** (number): Number of stale datapoints
79
+ - **`tidy.0.complete.orphanedCount`** (number): Number of orphaned aliases
80
+
81
+ The complete scan uses the same JSON result structure as path-based scans. Automatic scans include the complete scan when this option is enabled.
82
+
68
83
  ### JSON Result Structure
69
84
 
70
85
  The `result` state contains a JSON array with the following fields for each datapoint:
@@ -132,6 +147,15 @@ Use the JSON result with a table widget to display and sort your datapoints:
132
147
  4. Sort by `last_ts` (oldest first) to find the "deadest" datapoints
133
148
  5. Filter by `issue != null` to show only problematic datapoints
134
149
 
150
+ ### Complete Scan
151
+
152
+ 1. Enable **Scan all objects (complete)** in the general settings
153
+ 2. Save configuration — the adapter performs an initial complete scan
154
+ 3. View results in `tidy.0.complete.result`
155
+ 4. Use `tidy.0.complete.trigger` for manual rescans at any time
156
+
157
+ Use the complete scan to get an overview of all states in your instance. For targeted cleanup, path-based scans (e.g. `0_userdata.0`, `alias.0`) are usually more practical.
158
+
135
159
  ### Automatic Maintenance
136
160
 
137
161
  1. Enable "automatic scans" in settings
@@ -150,6 +174,18 @@ If you like our work and would like to support us, we appreciate any donation.
150
174
  <!--
151
175
  ### **WORK IN PROGRESS**
152
176
  -->
177
+ ### 0.1.6 (2026-05-31)
178
+ - (skvarel) Fixed scan when path name is left empty (result states now use path as fallback)
179
+ - (skvarel) Added default for scan-all-objects option in adapter configuration
180
+ - (skvarel) Fixed incorrect link to Cursor project rules in README
181
+ - (skvarel) Unified issue tracker URL to inventwo repository
182
+ - (skvarel) Fixed type-check script for local development
183
+ - (skvarel) Documented complete scan feature in README
184
+
185
+ ### 0.1.5 (2026-05-29)
186
+ - (skvarel) Updated dependencies
187
+ - (skvarel) Fixed repo checker issue
188
+
153
189
  ### 0.1.4 (2026-05-25)
154
190
  - (skvarel) Revised titel and desciption
155
191
 
@@ -160,12 +196,6 @@ If you like our work and would like to support us, we appreciate any donation.
160
196
  - (skvarel) Changed name of result field to optional
161
197
  - (skvarel) Revised config
162
198
 
163
- ### 0.1.0 (2026-04-17)
164
- - (skvarel) Added option for complete scan
165
-
166
- ### 0.0.1 (2026-04-14)
167
- - (skvarel) initial release
168
-
169
199
  ## Older changes
170
200
  - [CHANGELOG_OLD.md](CHANGELOG_OLD.md)
171
201
 
@@ -8,16 +8,13 @@
8
8
  "Days until 'stale' (warning)": "Tage bis 'veraltet' (Warnung)",
9
9
  "Description": "Beschreibung",
10
10
  "Detection Thresholds": "Erkennungsschwellen",
11
- "Each scan result contains a JSON array with the following 10 fields per datapoint:": "Jedes Scan-Ergebnis enthält ein JSON-Array mit folgenden 10 Feldern pro Datenpunkt:",
12
11
  "Each scan result contains a JSON array with the following fields per datapoint:": "Jedes Scanergebnis enthält ein JSON-Array mit den folgenden 10 Feldern pro Datenpunkt:",
13
12
  "Enable automatic scans": "Automatisches Scannen aktivieren",
14
13
  "Enabled": "Aktiviert",
15
14
  "Enter the full path, e.g. 0_userdata.0. Folders (type: folder) must be entered manually. The instance number is optional.": "Gib hier den vollständigen Pfad ein, z.B. 0_userdata.0. Ordner (Typ: Ordner) müssen manuell eingegeben werden. Die Instanznummer ist optional.",
16
- "Feldbeschreibungen (Deutsch):": "Feldbeschreibungen (Deutsch):",
17
15
  "Field": "Schlüssel",
18
16
  "Field descriptions": "Feldbeschreibungen",
19
17
  "Field descriptions (English):": "Feldbeschreibungen (Englisch):",
20
- "Field descriptions:": "Feldbeschreibungen:",
21
18
  "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.": "Für deutsche Tabellen: Verwende status_de und issue_de Spalten\nFür englische Tabellen: Verwende status und issue Spalten\n\nFiltere nach 'issue != null' um nur problematische Datenpunkte anzuzeigen.",
22
19
  "For alias.* paths: Check if target datapoints exist (ghost detection)": "Für alias.*-Pfade: Prüfen, ob Ziel-Datenpunkte existieren (Geister-Erkennung)",
23
20
  "General Settings": "Allgemeine Einstellungen",
@@ -1,37 +1,38 @@
1
1
  {
2
- "Name (for result state, optional)": "Name (for result state, optional)",
3
- "Optional. If empty, the path will be used as name.": "Optional. If empty, the path will be used as name.",
4
2
  "Automatic Scanning": "Automatic Scanning",
5
3
  "Check alias targets": "Check alias targets",
6
4
  "Configure which paths to scan for unused datapoints. Each path will get its own result state with a JSON table.": "Configure which paths to scan for unused datapoints. Each path will get its own result state with a JSON table.",
7
- "Days until 'dead' (critical)": "Days until 'dead' (critical)",
8
- "Days until 'stale' (warning)": "Days until 'stale' (warning)",
9
5
  "Datapoints not updated for this many days are marked as 'dead'": "Datapoints not updated for this many days are marked as 'dead'",
10
6
  "Datapoints not updated for this many days are marked as 'stale'": "Datapoints not updated for this many days are marked as 'stale'",
7
+ "Days until 'dead' (critical)": "Days until 'dead' (critical)",
8
+ "Days until 'stale' (warning)": "Days until 'stale' (warning)",
11
9
  "Detection Thresholds": "Detection Thresholds",
10
+ "Description": "Description",
12
11
  "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:",
13
12
  "Enable automatic scans": "Enable automatic scans",
14
- "Scan all objects (complete)": "Scan all objects (complete)",
15
- "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.",
16
13
  "Enabled": "Enabled",
17
14
  "Enter the full path, e.g. 0_userdata.0. Folders (type: folder) must be entered manually. The instance number is optional.": "Enter the full path, e.g. 0_userdata.0. Folders (type: folder) must be entered manually. The instance number is optional.",
15
+ "Field": "Key",
16
+ "Field descriptions": "Field descriptions",
17
+ "Field descriptions (English):": "Field descriptions (English):",
18
18
  "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.",
19
19
  "For alias.* paths: Check if target datapoints exist (ghost detection)": "For alias.* paths: Check if target datapoints exist (ghost detection)",
20
20
  "General Settings": "General Settings",
21
21
  "Help & Documentation": "Help & Documentation",
22
22
  "How often the automatic scan should run (minimum 1 hour)": "How often the automatic scan should run (minimum 1 hour)",
23
+ "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.",
23
24
  "JSON Table Field Description": "JSON Table Field Description",
24
25
  "Name (for result state)": "Name (for result state)",
26
+ "Name (for result state, optional)": "Name (for result state, optional)",
27
+ "Optional. If empty, the path will be used as name.": "Optional. If empty, the path will be used as name.",
25
28
  "Path (e.g. 0_userdata.0 or alias.0 - The instance number is optional.)": "Path (e.g. 0_userdata.0 or alias.0 - The instance number is optional.)",
26
29
  "Path Configuration": "Path Configuration",
27
30
  "Paths to scan": "Paths to scan",
28
- "Scan interval (hours)": "Scan interval (hours)",
31
+ "Purpose": "Purpose",
29
32
  "Scan Paths": "Scan Paths",
30
- "tidy adapter settings": "Adapter settings for tidy",
33
+ "Scan all objects (complete)": "Scan all objects (complete)",
34
+ "Scan interval (hours)": "Scan interval (hours)",
31
35
  "Usage in VIS Widgets": "Usage in VIS Widgets",
32
36
  "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",
33
- "Field descriptions": "Field descriptions",
34
- "Purpose": "Purpose",
35
- "Field": "Schlüssel",
36
- "Description": "Description"
37
- }
37
+ "tidy adapter settings": "Adapter settings for tidy"
38
+ }
@@ -12,8 +12,9 @@
12
12
  "Enable automatic scans": "Habilitar escaneos automáticos",
13
13
  "Enabled": "Activado",
14
14
  "Enter the full path, e.g. 0_userdata.0. Folders (type: folder) must be entered manually. The instance number is optional.": "Ingrese la ruta completa, p.e. 0_datosdeusuario.0. Las carpetas (tipo: carpeta) deben ingresarse manualmente. El número de instancia es opcional.",
15
- "Field": "Schlüssel",
15
+ "Field": "Llave",
16
16
  "Field descriptions": "Descripciones de campo",
17
+ "Field descriptions (English):": "Descripciones de campo (inglés):",
17
18
  "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.": "Para tablas alemanas: use las columnas status_de y issues_de\nPara tablas en inglés: use columnas de estado y problema\n\nFiltre por 'problema! = nulo' para mostrar solo puntos de datos problemáticos.",
18
19
  "For alias.* paths: Check if target datapoints exist (ghost detection)": "Para rutas alias.*: compruebe si existen puntos de datos de destino (detección de fantasmas)",
19
20
  "General Settings": "Configuraciones generales",
@@ -12,8 +12,9 @@
12
12
  "Enable automatic scans": "Activer les analyses automatiques",
13
13
  "Enabled": "Activé",
14
14
  "Enter the full path, e.g. 0_userdata.0. Folders (type: folder) must be entered manually. The instance number is optional.": "Entrez le chemin complet, par ex. 0_userdata.0. Les dossiers (type : dossier) doivent être saisis manuellement. Le numéro d'instance est facultatif.",
15
- "Field": "Schlüssel",
15
+ "Field": "Clé",
16
16
  "Field descriptions": "Description des champs",
17
+ "Field descriptions (English):": "Descriptions des champs (anglais) :",
17
18
  "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.": "Pour les tables allemandes : utilisez les colonnes status_de et issue_de\nPour les tableaux en anglais : utilisez les colonnes d'état et de problème\n\nFiltrez par « issue != null » pour afficher uniquement les points de données problématiques.",
18
19
  "For alias.* paths: Check if target datapoints exist (ghost detection)": "Pour les chemins alias.* : Vérifiez si des points de données cibles existent (détection de fantômes)",
19
20
  "General Settings": "Paramètres généraux",
@@ -12,8 +12,9 @@
12
12
  "Enable automatic scans": "Abilita le scansioni automatiche",
13
13
  "Enabled": "Abilitato",
14
14
  "Enter the full path, e.g. 0_userdata.0. Folders (type: folder) must be entered manually. The instance number is optional.": "Inserisci il percorso completo, ad es. 0_datiutente.0. Le cartelle (tipo: cartella) devono essere inserite manualmente. Il numero di istanza è facoltativo.",
15
- "Field": "Schlüssel",
15
+ "Field": "Chiave",
16
16
  "Field descriptions": "Descrizioni dei campi",
17
+ "Field descriptions (English):": "Descrizioni dei campi (inglese):",
17
18
  "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.": "Per le tabelle tedesche: utilizzare le colonne status_de e issue_de\nPer le tabelle in inglese: utilizzare le colonne di stato e di emissione\n\nFiltra per \"problema! = null\" per mostrare solo i punti dati problematici.",
18
19
  "For alias.* paths: Check if target datapoints exist (ghost detection)": "Per percorsi alias.*: controlla se esistono punti dati di destinazione (rilevamento fantasma)",
19
20
  "General Settings": "Impostazioni generali",
@@ -12,8 +12,9 @@
12
12
  "Enable automatic scans": "Schakel automatische scans in",
13
13
  "Enabled": "Ingeschakeld",
14
14
  "Enter the full path, e.g. 0_userdata.0. Folders (type: folder) must be entered manually. The instance number is optional.": "Voer het volledige pad in, b.v. 0_gebruikersgegevens.0. Mappen (type: map) moeten handmatig worden ingevoerd. Het exemplaarnummer is optioneel.",
15
- "Field": "Schlüssel",
15
+ "Field": "Sleutel",
16
16
  "Field descriptions": "Veldbeschrijvingen",
17
+ "Field descriptions (English):": "Veldbeschrijvingen (Engels):",
17
18
  "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.": "Voor Duitse tabellen: gebruik de kolommen status_de en issue_de\nVoor Engelse tabellen: gebruik status- en probleemkolommen\n\nFilter op 'issue != null' om alleen problematische datapunten weer te geven.",
18
19
  "For alias.* paths: Check if target datapoints exist (ghost detection)": "Voor alias.*-paden: Controleer of doeldatapunten bestaan ​​(spookdetectie)",
19
20
  "General Settings": "Algemene instellingen",
@@ -3,7 +3,7 @@
3
3
  "Check alias targets": "Sprawdź cele aliasów",
4
4
  "Configure which paths to scan for unused datapoints. Each path will get its own result state with a JSON table.": "Skonfiguruj ścieżki do skanowania w poszukiwaniu nieużywanych punktów danych. Każda ścieżka otrzyma własny stan wyniku z tabelą JSON.",
5
5
  "Datapoints not updated for this many days are marked as 'dead'": "Punkty danych nieaktualizowane przez tyle dni są oznaczone jako „martwe”",
6
- "Datapoints not updated for this many days are marked as 'stale'": "Punkty danych nieaktualizowane przez tak wiele dni są oznaczone jako „nieaktualne”",
6
+ "Datapoints not updated for this many days are marked as 'stale'": "Punkty danych nieaktualizowane przez tyle dni są oznaczone jako „nieaktualne”",
7
7
  "Days until 'dead' (critical)": "Dni do „martwy” (krytyczne)",
8
8
  "Days until 'stale' (warning)": "Dni do „nieaktualnego” (ostrzeżenie)",
9
9
  "Description": "Opis",
@@ -12,8 +12,9 @@
12
12
  "Enable automatic scans": "Włącz automatyczne skanowanie",
13
13
  "Enabled": "Włączony",
14
14
  "Enter the full path, e.g. 0_userdata.0. Folders (type: folder) must be entered manually. The instance number is optional.": "Wpisz pełną ścieżkę, np. 0_dane użytkownika.0. Foldery (typ: folder) należy wprowadzić ręcznie. Numer instancji jest opcjonalny.",
15
- "Field": "Schlüssel",
15
+ "Field": "Klawisz",
16
16
  "Field descriptions": "Opisy pól",
17
+ "Field descriptions (English):": "Opisy pól (angielski):",
17
18
  "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.": "W przypadku tabel w języku niemieckim: użyj kolumn status_de i Issue_de\nW przypadku tabel w języku angielskim: Użyj kolumn stanu i wydania\n\nFiltruj według „problem != null”, aby wyświetlić tylko problematyczne punkty danych.",
18
19
  "For alias.* paths: Check if target datapoints exist (ghost detection)": "W przypadku ścieżek alias.*: Sprawdź, czy istnieją docelowe punkty danych (wykrywanie duchów)",
19
20
  "General Settings": "Ustawienia ogólne",
@@ -12,8 +12,9 @@
12
12
  "Enable automatic scans": "Habilitar verificações automáticas",
13
13
  "Enabled": "Habilitado",
14
14
  "Enter the full path, e.g. 0_userdata.0. Folders (type: folder) must be entered manually. The instance number is optional.": "Insira o caminho completo, por ex. 0_userdata.0. As pastas (tipo: pasta) devem ser inseridas manualmente. O número da instância é opcional.",
15
- "Field": "Schlüssel",
15
+ "Field": "Chave",
16
16
  "Field descriptions": "Descrições de campo",
17
+ "Field descriptions (English):": "Descrições de campo (inglês):",
17
18
  "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.": "Para tabelas alemãs: use as colunas status_de e issue_de\nPara tabelas em inglês: use colunas de status e de problemas\n\nFiltre por 'issue != null' para mostrar apenas pontos de dados problemáticos.",
18
19
  "For alias.* paths: Check if target datapoints exist (ghost detection)": "Para caminhos alias.*: verifique se existem pontos de dados de destino (detecção de fantasma)",
19
20
  "General Settings": "Configurações Gerais",
@@ -12,8 +12,9 @@
12
12
  "Enable automatic scans": "Включить автоматическое сканирование",
13
13
  "Enabled": "Включено",
14
14
  "Enter the full path, e.g. 0_userdata.0. Folders (type: folder) must be entered manually. The instance number is optional.": "Введите полный путь, например. 0_userdata.0. Папки (тип: папка) необходимо вводить вручную. Номер экземпляра не является обязательным.",
15
- "Field": "Шлюссель",
15
+ "Field": "Ключ",
16
16
  "Field descriptions": "Описание полей",
17
+ "Field descriptions (English):": "Описания полей (на английском языке):",
17
18
  "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.": "Для немецких таблиц: используйте столбцы status_de и Issue_de.\nДля английских таблиц: используйте столбцы состояния и проблемы.\n\nОтфильтруйте по «проблеме!= null», чтобы отобразить только проблемные точки данных.",
18
19
  "For alias.* paths: Check if target datapoints exist (ghost detection)": "Для путей alias.*: проверьте, существуют ли целевые точки данных (обнаружение призраков).",
19
20
  "General Settings": "Общие настройки",
@@ -12,8 +12,9 @@
12
12
  "Enable automatic scans": "Увімкнути автоматичне сканування",
13
13
  "Enabled": "Увімкнено",
14
14
  "Enter the full path, e.g. 0_userdata.0. Folders (type: folder) must be entered manually. The instance number is optional.": "Введіть повний шлях, напр. 0_користувальницькі дані.0. Папки (тип: folder) потрібно вводити вручну. Номер екземпляра необов’язковий.",
15
- "Field": "Шлюссель",
15
+ "Field": "ключ",
16
16
  "Field descriptions": "Описи полів",
17
+ "Field descriptions (English):": "Опис полів (англійською):",
17
18
  "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.": "Для німецьких таблиць: використовуйте стовпці status_de і issue_de\nДля таблиць англійською мовою: використовуйте стовпці статусу та проблеми\n\nВідфільтруйте за «проблемою != нуль», щоб показати лише проблемні точки даних.",
18
19
  "For alias.* paths: Check if target datapoints exist (ghost detection)": "Для шляхів alias.*: перевірте, чи існують цільові точки даних (виявлення привидів)",
19
20
  "General Settings": "Загальні налаштування",
@@ -12,8 +12,9 @@
12
12
  "Enable automatic scans": "启用自动扫描",
13
13
  "Enabled": "启用",
14
14
  "Enter the full path, e.g. 0_userdata.0. Folders (type: folder) must be entered manually. The instance number is optional.": "输入完整路径,例如0_用户数据.0。文件夹(类型:文件夹)必须手动输入。实例编号是可选的。",
15
- "Field": "施吕塞尔",
15
+ "Field": "钥匙",
16
16
  "Field descriptions": "字段说明",
17
+ "Field descriptions (English):": "字段说明(英文):",
17
18
  "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.": "对于德语表:使用 status_de 和 issues_de 列\n对于英文表格:使用状态和问题列\n\n按“问题!= null”过滤以仅显示有问题的数据点。",
18
19
  "For alias.* paths: Check if target datapoints exist (ghost detection)": "对于 alias.* 路径:检查目标数据点是否存在(幽灵检测)",
19
20
  "General Settings": "常规设置",
@@ -148,7 +148,7 @@
148
148
  "attr": "path",
149
149
  "title": "Path (e.g. 0_userdata.0 or alias.0 - The instance number is optional.)",
150
150
  "width": "40%",
151
- "placeholder": "0_userdata.0",
151
+ "placeholder": "Enter the full path, e.g. 0_userdata.0. Folders (type: folder) must be entered manually. The instance number is optional.",
152
152
  "tooltip": "Enter the full path, e.g. 0_userdata.0. Folders (type: folder) must be entered manually. The instance number is optional."
153
153
  },
154
154
  {
package/io-package.json CHANGED
@@ -1,8 +1,34 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "tidy",
4
- "version": "0.1.4",
4
+ "version": "0.1.6",
5
5
  "news": {
6
+ "0.1.6": {
7
+ "en": "Fixed scan when path name is left empty (result states now use path as fallback)\nAdded default for scan-all-objects option in adapter configuration\nFixed incorrect link to Cursor project rules in README\nUnified issue tracker URL to inventwo repository\nFixed type-check script for local development\nDocumented complete scan feature in README",
8
+ "de": "Behobener Scan, wenn der Pfadname leer gelassen wird (Ergebnisse Zustände verwenden nun Pfad als Fallback)\nStandard für Scan-all-Objekte Option in Adapterkonfiguration hinzugefügt\nFehlerhafte Verknüpfung mit Cursor-Projektregeln in README behoben\nUnified Ausgabe Tracker URL zu erfindenwo Repository\nFixed Type-Check-Skript für lokale Entwicklung\nDokumentierte vollständige Scan-Funktion in README",
9
+ "ru": "Исправленное сканирование, когда имя пути оставлено пустым (в результате состояния теперь используют путь в качестве резерва)\nДобавлено по умолчанию для опции сканирования всех объектов в конфигурации адаптера\nИсправлена неправильная ссылка на правила проекта Cursor в README\nUnified Issue Tracker URL для создания репозитория\nФиксированный скрипт проверки типа для локальной разработки\nПолная функция сканирования в README",
10
+ "pt": "Varredura fixa quando o nome do caminho fica vazio (os estados de resultado agora usam o caminho como recuo)\nAdicionado por omissão para a opção scan-all-objects na configuração do adaptador\nLigação incorreta fixa às regras do projeto Cursor no README\nURL unificado do rastreador de problemas para inventar o repositório\nPrograma de verificação de tipo fixo para desenvolvimento local\nFuncionalidade de digitalização completa documentada no README",
11
+ "nl": "Fixed scan wanneer padnaam leeg gelaten wordt (resultaattoestanden gebruiken nu pad als terugval)\nStandaard toegevoegd voor optie scan-all-objecten in adapterconfiguratie\nOnjuiste link naar Cursor-projectregels in README\nUnified issue tracker URL naar inventwo repository\nVast typecontrolescript voor lokale ontwikkeling\nGedocumenteerde volledige scanfunctie in README",
12
+ "fr": "Correction de l'analyse lorsque le nom du chemin est laissé vide (les états de résultat utilisent maintenant le chemin comme retour)\nAjout par défaut de l'option scanner tous les objets dans la configuration de l'adaptateur\nCorrection d'un lien incorrect vers les règles du projet Cursor dans README\nURL de tracker de problèmes unifiée vers le dépôt inventwo\nCorrection du script de vérification de type pour le développement local\nFonction de numérisation complète documentée dans README",
13
+ "it": "Controllo fisso quando il nome del percorso viene lasciato vuoto (i risultati ora usano il percorso come fallback)\nAggiunta di default per scan-all-objects opzione nella configurazione dell'adattatore\nFisso collegamento errato alle regole del progetto Cursor in README\nURL del tracciatore di numeri unificato inventwo repository\nScript di controllo del tipo fisso per lo sviluppo locale\nFunzione di scansione completa documentata in README",
14
+ "es": "Escaneo fijo cuando el nombre de la ruta queda vacío (resulta estados ahora utilizan la ruta como retroceso)\nAñadido predeterminado para la opción Scan-all-objects en la configuración del adaptador\nEnlace incorrecto fijo a las reglas del proyecto Cursor en README\nUnified issue tracker URL para inventwo repository\nScript de comprobación de tipo fijo para el desarrollo local\nFunción de exploración completa documentada en README",
15
+ "pl": "Naprawiono skanowanie, gdy nazwa ścieżki jest pusta (stan wyniku używa ścieżki jako zapasu)\nDodano domyślne dla opcji scan- all- objects w konfiguracji adaptera\nNaprawiono nieprawidłowe łącze do zasad projektu kursora w README\nUnified issue tracker URL do wynalazku dwóch repozytorium\nStałe skrypty sprawdzania typu dla rozwoju lokalnego\nKompletna funkcja skanowania w README",
16
+ "uk": "Виправлено сканування, коли ім'я шляху залишається порожнім (результні стани тепер використовують шлях як випадання)\nДодано за замовчуванням для налаштування скан-all-objects\nВиправлено некоректне посилання на правила проекту Cursor в README\nУніфікований URL-адреса трекера для inventwo repository\nВиправлений сценарій типу-подібним вирізом для місцевого розвитку\nФункція повного сканування документів в README",
17
+ "zh-cn": "当路径名称为空时进行固定扫描( 结果状态现在使用路径作为倒置)\n在适配器配置中添加了扫描全部对象选项的默认值\n与 README 中的光标项目规则的固定错误链接\n统一问题跟踪器 URL 到 Inventwo 仓库\n本地开发的固定类型检查脚本\n在 README 中记录了完整的扫描功能"
18
+ },
19
+ "0.1.5": {
20
+ "en": "Updated dependencies\nFixed repo checker issue",
21
+ "de": "Aktualisierte Abhängigkeiten\nProblem der Repo Checker behoben",
22
+ "ru": "Обновленные зависимости\nФиксированная проблема проверки репо",
23
+ "pt": "Dependências atualizadas\nProblema fixo do verificador de repo",
24
+ "nl": "Bijgewerkte afhankelijkheden\nProbleem met vaste repochecker",
25
+ "fr": "Dépendances actualisées\nCorrection du problème de repo checker",
26
+ "it": "Dipendenze aggiornate\nRischio di errore",
27
+ "es": "Dependencias actualizadas\nNúmero de comprobación de reposo fijo",
28
+ "pl": "Aktualizacja zależności\nStałe wydanie kontrolera repo",
29
+ "uk": "Оновлені залежності\nВиправлено проблему перевірки репо",
30
+ "zh-cn": "更新的依赖关系\n固定回购检查器问题"
31
+ },
6
32
  "0.1.4": {
7
33
  "en": "Revised titel and desciption",
8
34
  "de": "Überarbeiteter Titel und Abschied",
@@ -135,6 +161,7 @@
135
161
  },
136
162
  "native": {
137
163
  "autoScan": false,
164
+ "scanAllObjects": false,
138
165
  "scanInterval": 24,
139
166
  "daysUntilStale": 90,
140
167
  "daysUntilDead": 365,
package/main.js CHANGED
@@ -251,9 +251,7 @@ class Tidy extends utils.Adapter {
251
251
  continue;
252
252
  }
253
253
 
254
- // Fallback: use path if name is empty
255
- const effectiveName = pathConfig.name && pathConfig.name.trim() ? pathConfig.name : pathConfig.path;
256
- const channelId = this.sanitizeName(effectiveName);
254
+ const channelId = this.getChannelId(pathConfig);
257
255
 
258
256
  // Create channel
259
257
  await this.setObjectNotExistsAsync(channelId, {
@@ -392,9 +390,7 @@ class Tidy extends utils.Adapter {
392
390
  // Find the corresponding path config
393
391
  const channelId = id.replace(`${this.namespace}.`, '').replace('.trigger', '');
394
392
  // Fallback: match also if name is empty and path is used
395
- const pathConfig = this.config.paths.find(
396
- p => this.sanitizeName(p.name && p.name.trim() ? p.name : p.path) === channelId,
397
- );
393
+ const pathConfig = this.config.paths.find(p => this.getChannelId(p) === channelId);
398
394
 
399
395
  if (pathConfig && pathConfig.enabled) {
400
396
  await this.scanPath(pathConfig);
@@ -415,7 +411,7 @@ class Tidy extends utils.Adapter {
415
411
  */
416
412
  async scanAllPaths() {
417
413
  for (const pathConfig of this.config.paths) {
418
- if (pathConfig.enabled) {
414
+ if (pathConfig.enabled && (pathConfig.name || pathConfig.path)) {
419
415
  await this.scanPath(pathConfig);
420
416
  }
421
417
  }
@@ -431,7 +427,7 @@ class Tidy extends utils.Adapter {
431
427
  this.log.info(`Scanning path: ${pathConfig.path}`);
432
428
 
433
429
  try {
434
- const channelId = this.sanitizeName(pathConfig.name);
430
+ const channelId = this.getChannelId(pathConfig);
435
431
  const results = [];
436
432
 
437
433
  // Get all objects under the specified path
@@ -575,6 +571,17 @@ class Tidy extends utils.Adapter {
575
571
  return result;
576
572
  }
577
573
 
574
+ /**
575
+ * Resolve channel ID from path config (name with fallback to path)
576
+ *
577
+ * @param {object} pathConfig - Path configuration object
578
+ * @returns {string} Sanitized channel ID
579
+ */
580
+ getChannelId(pathConfig) {
581
+ const effectiveName = pathConfig.name && pathConfig.name.trim() ? pathConfig.name : pathConfig.path;
582
+ return this.sanitizeName(effectiveName);
583
+ }
584
+
578
585
  /**
579
586
  * Sanitize name for use as object ID
580
587
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.tidy",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "description": "Analyzes ioBroker objects for unused datapoints and helps you clean up your instance",
5
5
  "author": {
6
6
  "name": "skvarel",
@@ -39,8 +39,8 @@
39
39
  "@iobroker/dev-server": "^0.8.0",
40
40
  "@iobroker/eslint-config": "^2.3.4",
41
41
  "@iobroker/testing": "^5.2.2",
42
- "@tsconfig/node20": "^20.1.9",
43
- "@types/iobroker": "npm:@iobroker/types@^7.1.1",
42
+ "@tsconfig/node22": "^22.0.5",
43
+ "@types/iobroker": "npm:@iobroker/types@^7.1.2",
44
44
  "@types/node": "^22.19.19",
45
45
  "typescript": "~6.0.3"
46
46
  },
@@ -49,7 +49,6 @@
49
49
  "admin{,/!(src)/**}/!(tsconfig|tsconfig.*|.eslintrc).{json,json5}",
50
50
  "admin{,/!(src)/**}/*.{html,css,png,svg,jpg,js}",
51
51
  "lib/",
52
- "www/",
53
52
  "io-package.json",
54
53
  "LICENSE",
55
54
  "main.js"
@@ -66,10 +65,11 @@
66
65
  "lint": "eslint -c eslint.config.mjs .",
67
66
  "lint-fix": "eslint -c eslint.config.mjs . --fix",
68
67
  "translate": "translate-adapter",
69
- "dev-server": "dev-server"
68
+ "dev-server:start": "dev-server watch",
69
+ "dev-server:stop": "powershell -NonInteractive -Command \"Get-NetTCPConnection -LocalPort 8091,26436,24436,20436 -EA SilentlyContinue | Select-Object -ExpandProperty OwningProcess -Unique | ForEach-Object { Stop-Process -Id $_ -Force -EA SilentlyContinue }; Write-Host 'dev-server stopped'\""
70
70
  },
71
71
  "bugs": {
72
- "url": "https://github.com/skvarel/ioBroker.tidy/issues"
72
+ "url": "https://github.com/inventwo/ioBroker.tidy/issues"
73
73
  },
74
74
  "readmeFilename": "README.md"
75
75
  }