iobroker.autodarts 0.8.2 → 1.0.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 CHANGED
@@ -56,9 +56,9 @@ Connects to your local Autodarts Board Manager (via IP and port, e.g. `192.168.x
56
56
  - **`config.triggerResetSec`**: Auto-reset time for triple/double/bullseye/miss flags
57
57
 
58
58
  ### Tools Addon Integration
59
- - **`tools.RAW`**: Input state used to receive events from browser tools (e.g. busted, gameon, gameshot).
60
- - **`tools.busted/tools.gameon/tools.gameshot`**: Read-only trigger flags that are set when the corresponding event is received via tools.RAW.
61
- - **`tools.config.urlBusted/urlGameon/urlGameshot`**: Pre-generated HTTP URLs (simple-api calls) that can be copied into the Tools for Autodarts browser extension.
59
+ - **`tools.RAW`**: Input state used to receive events from browser tools (e.g. busted, gameon, gameshot, 180, matchshot, takeout).
60
+ - **`trigger.is180/isBusted/isGameon/isGameshot/isMatchshot/isTakeout`**: Read-only trigger flags set when corresponding events received via `tools.RAW`.
61
+ - **`tools.config.url*`**: Pre-generated HTTP URLs (simple-api calls) that can be copied into Tools for Autodarts browser extension.
62
62
 
63
63
  ## What this adapter does NOT do
64
64
 
@@ -132,6 +132,15 @@ In **HELP & FAQ** you will find general information and help about the adapter a
132
132
  <!--
133
133
  ### **WORK IN PROGRESS**
134
134
  -->
135
+ ### 1.0.0 (2026-01-11)
136
+ - (skvarel) BREAKING CHANGE: All triggers to unified trigger.is structure
137
+ - (skvarel) Manual cleanup required: Delete old autodarts.X.throw.is and tools. states after update
138
+ - (skvarel) Unchanged: tools.RAW, tools.config.url, all timers/functionality
139
+
140
+ ### 0.8.3 (2026-01-06)
141
+ - (skvarel) Added: CHANGELOG_OLD.md
142
+ - (skvarel) Improved: Link to documentation added to the help section.
143
+
135
144
  ### 0.8.2 (2026-01-05)
136
145
  - (skvarel) Fixed: ImageURL
137
146
 
@@ -143,91 +152,11 @@ In **HELP & FAQ** you will find general information and help about the adapter a
143
152
  ### 0.8.0 (2026-01-04)
144
153
  - (skvarel) Added: New **TOOLS ADDON INTEGRATION** tab and runtime-generated URL states under `tools.config.*` for browser-based integrations (e.g. Tools for Autodarts).
145
154
 
146
- ### 0.7.3 (2026-01-03)
155
+ ## 0.7.3 (2026-01-03)
147
156
  - (skvarel) Fix Adapter Checker Warnings
148
157
 
149
- ### 0.7.2 (2026-01-03)
150
- - (skvarel) Fix Copyright Year
151
-
152
- ### 0.7.1 (2025-12-31)
153
- - (skvarel) Changed: Reduced reconnect delay after offline.
154
-
155
- ### 0.7.0 (2025-12-31)
156
- - (skvarel) Added: New `status.boardStatus` state. Status indicator of board event (e.g. `"Stopped"`, `"Calibration finished"`, `"Started"`).
157
-
158
- ### 0.6.3 (2025-12-30)
159
- - (skvarel) Improved: Connection handling now uses `info.connection` and clearly marks the adapter as offline when the Autodarts Board Manager is not reachable (including better timeout/ECONNRESET handling).
160
- - (skvarel) Changed: Reduced log noise when the board is offline – only one warning is logged when the connection is lost, subsequent timeouts are written as debug messages.
161
- - (skvarel) Improved: Minor tweaks to the HELP & FAQ tab texts and configuration descriptions.
162
-
163
- ### 0.6.2 (2025-12-29)
164
- - (skvarel) Improved: Settings page reworked to use three tabs (`OPTIONS`, `MAPPINGS` and `HELP & FAQ`) for better clarity.
165
-
166
- ### 0.6.1 (2025-12-29)
167
- - (skvarel) New: Settings page reworked to use two tabs (`OPTIONS` and `MAPPINGS`) for better clarity.
168
- - (skvarel) New: Mapping of ioBroker objects for board light and board power in the **MAPPINGS** tab.
169
- - (skvarel) Improved: Layout of the configuration page (field widths, spacing, texts) for a more symmetric and clean UI.
170
- - (skvarel) Improved: Updated option descriptions in the admin UI.
171
-
172
- ### 0.6.0 (2025-12-28)
173
- - (skvarel) Added: New throw.isMiss state to detect and trigger automations on missed darts (including auto-reset via triggerResetSec).
174
- - (skvarel) Added: New throw.isDouble state to detect and trigger automations on double segments (including auto-reset via triggerResetSec).
175
-
176
- ### 0.5.1 (2025-12-28)
177
- - (skvarel) Fixed: Hardware light/power mapping now respects configured target IDs and works on all systems.
178
-
179
- ### 0.5.0 (2025-12-28)
180
- - (skvarel) Added: Bidirectional hardware control states `system.hardware.light` and `system.hardware.power`
181
- - (skvarel) Added: Configuration options to map light/power states to external ioBroker states (e.g., 0_userdata)
182
- - (skvarel) Changed: Hardware states now support read/write operations for full automation integration
183
-
184
- ### 0.4.0 (2025-12-28)
185
- - (skvarel) Changed: Restructured system information into dedicated `system.hardware`, `system.software` and `system.cams` channels.
186
- - (skvarel) Added: New software info states (`desktopVersion`, `boardVersion`, `platform`, `os`) and hardware info states (`kernelArch`, `cpuModel`, `hostname`).
187
- - (skvarel) Added: Camera configuration states `system.cams.cam0/1/2` containing JSON with width, height and fps.
188
- - (skvarel) Changed: Adapter configuration for polling interval and triple trigger thresholds is now fully driven via jsonConfig (dropdowns and number fields).
189
- - (skvarel) Removed: Experimental light/power alias mapping from internal logic (no user-visible feature was released).
190
-
191
- ### 0.3.3 (2025-12-27)
192
- - (skvarel) Changed: Configuration fields interval and triggerReset now use seconds instead of milliseconds in the admin UI.
193
-
194
- ### 0.3.2 (2025-12-27)
195
- - (DrozmotiX) **ENHANCED**: Fixed all TypeScript type errors by adding proper type definitions for config properties
196
- - (DrozmotiX) **ENHANCED**: Refactored HTTP request handling - created reusable httpHelper module to eliminate code duplication
197
- - (DrozmotiX) **ENHANCED**: Converted HTTP callback-based requests to async/await pattern for better error handling
198
- - (DrozmotiX) **ENHANCED**: Improved connection state logging - now logs when connection is restored after being offline
199
- - (DrozmotiX) **ENHANCED**: Standardized async/await usage across all state change handlers for consistency
200
- - (DrozmotiX) **FIXED**: Removed unused error variable in fetchVersion method
201
- - (DrozmotiX) **FIXED**: Added proper error type checking in fetchConfig to prevent runtime errors
202
- - (DrozmotiX) **TESTING**: Added comprehensive unit tests for httpHelper module covering success, timeout, and error scenarios
203
-
204
- ### 0.3.1 (2025-12-27)
205
- - (skvarel) Changed: Object creation now uses extendObjectAsync with proper roles and types instead of setObjectNotExistsAsync.
206
-
207
- ### 0.3.0 (2025-12-26)
208
- - (skvarel) Added traffic light datapoints (`status.trafficLightColor`, `status.trafficLightState`) mapped from Board Manager status (`Throw` / `Takeout` / connection errors).
209
- - (skvarel) Refactored code: visit handling, throw handling (triple / bull) and traffic light logic moved to separate modules.
210
-
211
- ### 0.2.2 (2025-12-25)
212
- - (skvarel) bugfix
213
-
214
- ### 0.2.1 (2025-12-25)
215
- - (skvarel) Reset for triple and bullseye trigger added
216
-
217
- ### 0.2.0 (2025-12-25)
218
- - (skvarel) Added datapoint for bulls-hit
219
- - (skvarel) Added maximun triple-hit flag score
220
- - (skvarel) Update config
221
- - (skvarel) Warning in log cleared
222
-
223
- ### 0.1.0 (2025-12-23)
224
- - (skvarel) Added: Datapoints for visit score, current dart score, triple-hit flag with configurable minimum score
225
- - (skvarel) Added: Camera configuration states (cam0–cam2)
226
- - (skvarel) Changed: Cleaned up adapter logic and internal polling/timing
227
- - (skvarel) Changed: Updated translations
228
-
229
- ### 0.0.14 - 0.0.2 (2025-12-21 - 2025-12-22)
230
- - (skvarel) Initial release with multiple fixes for adapter checker compliance and documentation improvements
158
+ ## Older changes
159
+ - [CHANGELOG_OLD.md](CHANGELOG_OLD.md)
231
160
 
232
161
  ## License
233
162
  MIT License
@@ -250,4 +179,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
250
179
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
251
180
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
252
181
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
253
- SOFTWARE.
182
+ SOFTWARE.
@@ -36,7 +36,7 @@
36
36
  "triple_flag2": "Maximales Feld für den Triple-Trigger",
37
37
  "triple_flag2_help": "Feld „Maximale Punktzahl“ für den Triple-Trigger. Darts mit einer Punktzahl über diesem Wert lösen den Triple-Trigger-Datenpunkt nicht aus.",
38
38
  "triple_flag_help": "Feld „Mindestpunktzahl“ für den Triple-Trigger. Darts mit einer Punktzahl unter diesem Wert lösen den Triple-Trigger-Datenpunkt nicht aus.",
39
- "txt_one": "<b>Dieser Adapter verbindet den lokalen Autodarts Board-Manager mit dem ioBroker.</b><br><br>1) Konfiguriere die Verbindung unter <b>OPTIONEN</b> (Host, Port, Intervall, Triple Range).<br>2) Ordne Licht- und Powerziele unter <b>ZUWEISUNGEN</b> zu.<br>3) Nutze die erstellten Zustände (Würfe, Ampel, Hardware) in der Visualisierungen, den Skripten und Szenen.",
39
+ "txt_one": "<b>Dieser Adapter verbindet den lokalen Autodarts Board-Manager mit dem ioBroker.</b><br><br>• Konfiguriere die Verbindung unter <b>OPTIONEN</b> (Host, Port, Intervall, Triple Range).<br>• Ordne Licht- und Powerziele unter <b>ZUWEISUNGEN</b> zu.<br>• Nutze die erstellten Zustände (Würfe, Ampel, Hardware) in der Visualisierungen, den Skripten und Szenen.<br>• Verknüpfe Tools für Autodarts mit dem Adapter.",
40
40
  "txt_tools": "Auf dieser Registerkarte wird die Integration mit der Browsererweiterung „Tools for Autodarts“ konfiguriert.<br><br>Um sie verwenden zu können, muss die Browsererweiterung installiert sein und der ioBroker Simple-API-Adapter ausgeführt und über deinen Browser erreichbar sein.",
41
41
  "txt_two": "... weitere Informationen folgen in Kürze!"
42
42
  }
@@ -20,7 +20,7 @@
20
20
  "mappings": "Hardware Mappings",
21
21
  "options_connection": "Connection Options",
22
22
  "options_logic": "Logic Options",
23
- "txt_one": "<b>This adapter connects your local Autodarts Board Manager to ioBroker.</b><br><br>1) Configure the connection under OPTIONS (host, port, polling, triple range).<br>2) Map light and power targets under MAPPINGS.<br>3) Use the created states (throws, traffic light, hardware) in your visualizations, scripts and scenes.",
23
+ "txt_one": "<b>This adapter connects your local Autodarts Board Manager to ioBroker.</b><br><br>• Configure the connection under OPTIONS (host, port, polling, triple range).<br>• Map light and power targets under MAPPINGS.<br>• Use the created states (throws, traffic light, hardware) in your visualizations, scripts and scenes.<br> • Link Tools for Autodarts with the adapter.",
24
24
  "light_txt": "Light Control Mapping (optional)",
25
25
  "light_txt_desc": "Get your lighting data points into the adapter objects.",
26
26
  "power_txt": "Power Control Mapping (optional)",
@@ -36,7 +36,7 @@
36
36
  "triple_flag2": "Campo máximo para el triple disparador",
37
37
  "triple_flag2_help": "Campo de puntuación máxima para el triple disparador. Los dardos con una puntuación superior a este valor no activarán el punto de datos Triple-Trigger.",
38
38
  "triple_flag_help": "Campo de puntuación mínima para el triple disparador. Los dardos con una puntuación inferior a este valor no activarán el punto de datos Triple-Trigger.",
39
- "txt_one": "<b>Este adaptador conecta su Autodarts Board Manager local a ioBroker.</b><br><br>1) Configure la conexión en OPCIONES (host, puerto, sondeo, rango triple).<br>2) Asigne objetivos de luz y energía en MAPAS.<br>3) Utilice los estados creados (tiros, semáforo, hardware) en sus visualizaciones, scripts y escenas.",
40
- "txt_tools": "Esta pestaña configura la integración con la extensión del navegador “Herramientas para Autodarts”.<br>Para usarla, debe tener la extensión del navegador instalada y el adaptador ioBroker simple-api ejecutándose y accesible desde su navegador.",
39
+ "txt_one": "<b>Este adaptador conecta su Autodarts Board Manager local a ioBroker.</b><br><br>• Configure la conexión en OPCIONES (host, puerto, sondeo, rango triple).<br>• Asigne objetivos de luz y energía en MAPEO.<br>• Utilice los estados creados (tiros, semáforo, hardware) en sus visualizaciones, scripts y escenas.<br> • Vincule herramientas para Autodarts con el adaptador.",
40
+ "txt_tools": "Esta pestaña configura la integración con la extensión del navegador “Herramientas para Autodarts”.<br><br>Para usarla, debe tener la extensión del navegador instalada y el adaptador ioBroker simple-api ejecutándose y accesible desde su navegador.",
41
41
  "txt_two": "... ¡más información próximamente!"
42
42
  }
@@ -26,7 +26,7 @@
26
26
  "reset_help": "Réinitialisez les déclencheurs triple, double, bullseye et miss après x secondes (0 = pas de réinitialisation).",
27
27
  "tools_instance": "Numéro d'instance Autodarts",
28
28
  "tools_instance_help": "0 pour autodarts.0, 1 pour autodarts.1, etc.",
29
- "tools_ip": "Adresse IP d'ioBroker",
29
+ "tools_ip": "Adresse IP dioBroker",
30
30
  "tools_ip_help": "IP ou nom d'hôte où votre adaptateur ioBroker / simple-api est accessible.",
31
31
  "tools_port": "Port de l'adaptateur simple-api",
32
32
  "tools_port_help": "Par défaut : 8087",
@@ -36,7 +36,7 @@
36
36
  "triple_flag2": "Champ maximum pour le triple déclencheur",
37
37
  "triple_flag2_help": "Champ de score maximum pour le triple déclencheur. Les fléchettes avec un score supérieur à cette valeur ne déclencheront pas le point de données Triple-Trigger.",
38
38
  "triple_flag_help": "Champ de score minimum pour le triple déclencheur. Les fléchettes avec un score inférieur à cette valeur ne déclencheront pas le point de données Triple-Trigger.",
39
- "txt_one": "<b>Cet adaptateur connecte votre Autodarts Board Manager local à ioBroker.</b><br><br>1) Configurez la connexion sous OPTIONS (hôte, port, sondage, triple plage).<br>2) Cartographiez les cibles lumineuses et électriques sous MAPPINGS.<br>3) Utilisez les états créés (lancements, feux de circulation, matériel) dans vos visualisations, scripts et scènes.",
40
- "txt_tools": "Cet onglet configure l'intégration avec l'extension de navigateur « Outils pour Autodarts ».<br>Pour l'utiliser, vous devez avoir installé l'extension de navigateur et l'adaptateur simple-api ioBroker exécuté et accessible depuis votre navigateur.",
39
+ "txt_one": "<b>Cet adaptateur connecte votre Autodarts Board Manager local à ioBroker.</b><br><br>• Configurez la connexion sous OPTIONS (hôte, port, sondage, triple plage).<br>• Cartographiez les cibles lumineuses et électriques sous MAPPINGS.<br>• Utilisez les états créés (lancements, feux de circulation, matériel) dans vos visualisations, scripts et scènes.<br> • Liez les outils pour Autodarts avec l'adaptateur.",
40
+ "txt_tools": "Cet onglet configure l'intégration avec l'extension de navigateur « Outils pour Autodarts ».<br><br>Pour l'utiliser, vous devez avoir installé l'extension de navigateur et l'adaptateur simple-api ioBroker exécuté et accessible depuis votre navigateur.",
41
41
  "txt_two": "... plus d'informations à venir !"
42
42
  }
@@ -27,7 +27,7 @@
27
27
  "tools_instance": "Numero di istanza di Autodarts",
28
28
  "tools_instance_help": "0 per autodarts.0, 1 per autodarts.1, ecc.",
29
29
  "tools_ip": "Indirizzo IP di ioBroker",
30
- "tools_ip_help": "IP o nome host in cui è raggiungibile il tuo ioBroker/adattatore simple-api.",
30
+ "tools_ip_help": "IP o nome host in cui il tuo ioBroker/adattatore simple-api è raggiungibile.",
31
31
  "tools_port": "Porta dell'adattatore API semplice",
32
32
  "tools_port_help": "Predefinito: 8087",
33
33
  "tools_tab": "Integrazione dei componenti aggiuntivi degli strumenti",
@@ -36,7 +36,7 @@
36
36
  "triple_flag2": "Campo massimo per il triplo trigger",
37
37
  "triple_flag2_help": "Campo del punteggio massimo per il triplo trigger. Le freccette con un punteggio superiore a questo valore non attiveranno il punto dati Triple-Trigger.",
38
38
  "triple_flag_help": "Campo del punteggio minimo per il triplo trigger. Le freccette con un punteggio inferiore a questo valore non attiveranno il punto dati Triple-Trigger.",
39
- "txt_one": "<b>Questo adattatore collega il tuo Autodarts Board Manager locale a ioBroker.</b><br><br>1) Configura la connessione in OPZIONI (host, porta, polling, tripla portata).<br>2) Mappa gli obiettivi di luce e potenza in MAPPINGS.<br>3) Utilizza gli stati creati (lanci, semaforo, hardware) nelle tue visualizzazioni, script e scene.",
40
- "txt_tools": "Questa scheda configura l'integrazione con l'estensione del browser \"Strumenti per Autodarts\".<br>Per utilizzarla, è necessario avere l'estensione del browser installata e l'adattatore ioBroker simple-api in esecuzione e raggiungibile dal browser.",
39
+ "txt_one": "<b>Questo adattatore collega il tuo Autodarts Board Manager locale a ioBroker.</b><br><br>• Configura la connessione in OPZIONI (host, porta, polling, tripla portata).<br>• Mappa gli obiettivi di luce e potenza in MAPPINGS.<br>• Utilizza gli stati creati (lanci, semaforo, hardware) nelle tue visualizzazioni, script e scene.<br> • Collega Strumenti per Autodarts con l'adattatore.",
40
+ "txt_tools": "Questa scheda configura l'integrazione con l'estensione del browser \"Strumenti per Autodarts\".<br><br>Per utilizzarla, è necessario avere l'estensione del browser installata e l'adattatore ioBroker simple-api in esecuzione e raggiungibile dal browser.",
41
41
  "txt_two": "...maggiori informazioni in arrivo!"
42
42
  }
@@ -25,7 +25,7 @@
25
25
  "reset": "Trigger-reset (s)",
26
26
  "reset_help": "Reset de drievoudige, dubbele, bullseye- en miss-trigger na x seconden (0 = geen reset).",
27
27
  "tools_instance": "Autodarts-instantienummer",
28
- "tools_instance_help": "0 voor autodarts.0, 1 voor autodarts.1, etc.",
28
+ "tools_instance_help": "0 voor autodarts.0, 1 voor autodarts.1, enz.",
29
29
  "tools_ip": "IP-adres van ioBroker",
30
30
  "tools_ip_help": "IP- of hostnaam waar uw ioBroker / simple-api-adapter bereikbaar is.",
31
31
  "tools_port": "Poort van de Simple-API-adapter",
@@ -36,7 +36,7 @@
36
36
  "triple_flag2": "Maximaal veld voor de drievoudige trigger",
37
37
  "triple_flag2_help": "Maximaal scoreveld voor de drievoudige trigger. Darten met een score boven deze waarde activeren het Triple-Trigger-datapunt niet.",
38
38
  "triple_flag_help": "Minimumscoreveld voor de drievoudige trigger. Darten met een score onder deze waarde activeren het Triple-Trigger-datapunt niet.",
39
- "txt_one": "<b>Deze adapter verbindt uw lokale Autodarts Board Manager met ioBroker.</b><br><br>1) Configureer de verbinding onder OPTIES (host, poort, polling, drievoudig bereik).<br>2) Breng licht- en stroomdoelen in kaart onder MAPPINGS.<br>3) Gebruik de gemaakte statussen (worpen, verkeerslicht, hardware) in uw visualisaties, scripts en scènes.",
40
- "txt_tools": "Op dit tabblad wordt de integratie met de browserextensie 'Tools for Autodarts' geconfigureerd.<br>Om deze te gebruiken, moet de browserextensie zijn geïnstalleerd en moet de ioBroker simple-api-adapter actief zijn en bereikbaar zijn vanuit uw browser.",
39
+ "txt_one": "<b>Deze adapter verbindt uw lokale Autodarts Board Manager met ioBroker.</b><br><br>• Configureer de verbinding onder OPTIES (host, poort, polling, drievoudig bereik).<br>• Breng licht- en stroomdoelen in kaart onder MAPPINGS.<br>• Gebruik de gemaakte statussen (worpen, verkeerslicht, hardware) in uw visualisaties, scripts en scènes.<br> • Koppel tools voor Autodarts met de adapter.",
40
+ "txt_tools": "Op dit tabblad wordt de integratie met de browserextensie 'Tools for Autodarts' geconfigureerd.<br><br>Om deze te gebruiken, moet de browserextensie zijn geïnstalleerd en moet de ioBroker simple-api-adapter actief zijn en bereikbaar zijn vanuit uw browser.",
41
41
  "txt_two": "... binnenkort meer informatie!"
42
42
  }
@@ -36,7 +36,7 @@
36
36
  "triple_flag2": "Maksymalne pole dla potrójnego wyzwalacza",
37
37
  "triple_flag2_help": "Pole maksymalnego wyniku dla potrójnego wyzwalacza. Rzutki z wynikiem powyżej tej wartości nie uruchomią punktu danych Triple-Trigger.",
38
38
  "triple_flag_help": "Pole minimalnego wyniku dla potrójnego wyzwalacza. Rzutki z wynikiem poniżej tej wartości nie uruchomią punktu danych Triple-Trigger.",
39
- "txt_one": "<b>Ten adapter łączy lokalnego menedżera tablicy Autodarts z ioBrokerem.</b><br><br>1) Skonfiguruj połączenie w OPCJACH (host, port, odpytywanie, potrójny zasięg).<br>2) Mapuj cele świetlne i energetyczne w sekcji MAPPINGS.<br>3) Wykorzystaj utworzone stany (rzuty, sygnalizacja świetlna, sprzęt) w swoich wizualizacjach, skryptach i scenach.",
40
- "txt_tools": "Ta zakładka umożliwia skonfigurowanie integracji z rozszerzeniem przeglądarki „Narzędzia dla Autodarts”.<br>Aby z niego skorzystać, musisz mieć zainstalowane rozszerzenie przeglądarki oraz działający adapter prostego interfejsu API ioBroker, dostępny z poziomu przeglądarki.",
39
+ "txt_one": "<b>Ten adapter łączy lokalnego menedżera Autodarts Board z ioBroker.</b><br><br> Skonfiguruj połączenie w OPCJACH (host, port, odpytywanie, potrójny zasięg).<br> Mapuj cele świetlne i energetyczne w obszarze MAPPINGS.<br> Wykorzystaj utworzone stany (rzuty, sygnalizacja świetlna, sprzęt) w swoich wizualizacjach, skryptach i scenach.<br> • Połącz narzędzia dla Autodarts z adapterem.",
40
+ "txt_tools": "W tej zakładce konfigurowana jest integracja z rozszerzeniem przeglądarki „Narzędzia dla Autodarts”.<br><br>Aby z niego skorzystać, musisz mieć zainstalowane rozszerzenie przeglądarki oraz działający adapter prostego interfejsu API ioBroker, dostępny z poziomu przeglądarki.",
41
41
  "txt_two": "...więcej informacji już wkrótce!"
42
42
  }
@@ -36,7 +36,7 @@
36
36
  "triple_flag2": "Campo máximo para o disparo triplo",
37
37
  "triple_flag2_help": "Campo de pontuação máxima para o disparo triplo. Dardos com pontuação acima deste valor não acionarão o ponto de dados Triple-Trigger.",
38
38
  "triple_flag_help": "Campo de pontuação mínima para o disparo triplo. Dardos com pontuação abaixo deste valor não acionarão o ponto de dados Triple-Trigger.",
39
- "txt_one": "<b>Este adaptador conecta seu Autodarts Board Manager local ao ioBroker.</b><br><br>1) Configure a conexão em OPÇÕES (host, porta, polling, alcance triplo).<br>2) Mapeie alvos de luz e energia em MAPEAMENTOS.<br>3) Use os estados criados (throws, semáforos, hardware) em suas visualizações, scripts e cenas.",
40
- "txt_tools": "Esta aba configura a integração com a extensão do navegador “Tools for Autodarts”.<br>Para utilizá-la, você deve ter a extensão do navegador instalada e o adaptador ioBroker simple-api em execução e acessível a partir do seu navegador.",
41
- "txt_two": "...mais informações em breve!"
39
+ "txt_one": "<b>Este adaptador conecta seu Autodarts Board Manager local ao ioBroker.</b><br><br>• Configure a conexão em OPÇÕES (host, porta, polling, alcance triplo).<br>• Mapeie alvos de luz e energia em MAPEAMENTOS.<br>• Use os estados criados (lançamentos, semáforos, hardware) em suas visualizações, scripts e cenas.<br> • Vincule ferramentas para Autodarts com o adaptador.",
40
+ "txt_tools": "Esta aba configura a integração com a extensão do navegador “Tools for Autodarts”.<br><br>Para utilizá-la, você deve ter a extensão do navegador instalada e o adaptador ioBroker simple-api em execução e acessível a partir do seu navegador.",
41
+ "txt_two": "... mais informações em breve!"
42
42
  }
@@ -36,7 +36,7 @@
36
36
  "triple_flag2": "Максимальное поле для тройного триггера",
37
37
  "triple_flag2_help": "Поле максимального результата для тройного триггера. Дартс с результатом выше этого значения не будет активировать точку данных тройного триггера.",
38
38
  "triple_flag_help": "Поле минимального балла для тройного триггера. Дартс со счетом ниже этого значения не будет активировать точку данных тройного триггера.",
39
- "txt_one": "<b>Этот адаптер подключает ваш локальный менеджер Autodarts Board к ioBroker.</b><br><br>1) Настройте соединение в разделе ОПЦИИ (хост, порт, опрос, тройной диапазон).<br>2) Сопоставьте цели освещения и мощности в разделе MAPPINGS.<br>3) Используйте созданные состояния (броски, светофор, оборудование) в ваших визуализациях, сценариях и сценах.",
40
- "txt_tools": "На этой вкладке настраивается интеграция с расширением браузера «Инструменты для Autodarts».<br>Чтобы использовать его, у вас должно быть установлено расширение браузера и адаптер ioBroker simple-api, работающий и доступный из вашего браузера.",
39
+ "txt_one": "<b>Этот адаптер подключает ваш локальный диспетчер Autodarts Board к ioBroker.</b><br><br>• Настройте соединение в разделе ОПЦИИ (хост, порт, опрос, тройной диапазон).<br>• Сопоставьте цели освещения и мощности в разделе MAPPINGS.<br>• Используйте созданные состояния (броски, светофор, оборудование) в ваших визуализациях, сценариях и сценах.<br> • Свяжите инструменты для Autodarts с адаптером.",
40
+ "txt_tools": "На этой вкладке настраивается интеграция с расширением браузера «Инструменты для Autodarts».<br><br>Чтобы использовать его, у вас должно быть установлено расширение браузера и адаптер ioBroker simple-api, работающий и доступный из вашего браузера.",
41
41
  "txt_two": "... дополнительная информация скоро появится!"
42
42
  }
@@ -36,7 +36,7 @@
36
36
  "triple_flag2": "Максимальне поле для потрійного тригера",
37
37
  "triple_flag2_help": "Поле максимального балу для потрійного тригера. Дартс із результатом вище цього значення не активує точку даних Triple-Trigger.",
38
38
  "triple_flag_help": "Мінімальне поле для потрійного тригера. Дартс із результатом, нижчим за це значення, не активує точку даних Triple-Trigger.",
39
- "txt_one": "<b>Цей адаптер підключає ваш локальний менеджер дошки Autodarts до ioBroker.</b><br><br>1) Налаштуйте з’єднання в OPTIONS (хост, порт, опитування, потрійний діапазон).<br>2) Зіставте світлові й потужні цілі в MAPPINGS.<br>3) Використовуйте створені стани (кидки, світлофор, апаратне забезпечення) у своїх візуалізаціях, сценаріях і сценах.",
40
- "txt_tools": "На цій вкладці налаштовується інтеграція з розширенням для браузера «Інструменти для Autodarts».<br>Щоб використовувати його, у вас має бути встановлено розширення для веб-переглядача та запущений адаптер ioBroker із простим API, доступний із вашого браузера.",
39
+ "txt_one": "<b>Цей адаптер підключає ваш локальний менеджер дошки Autodarts до ioBroker.</b><br><br>• Налаштуйте з’єднання в OPTIONS (хост, порт, опитування, потрійний діапазон).<br>• Зіставте світлові та потужні цілі в MAPPINGS.<br>• Використовуйте створені стани (кидки, світлофор, апаратне забезпечення) у своїх візуалізаціях, сценаріях і сценах.<br> • Зв’яжіть інструменти для Autodarts з адаптером.",
40
+ "txt_tools": "На цій вкладці налаштовується інтеграція з розширенням для веб-переглядача «Інструменти для Autodarts».<br><br>Щоб використовувати його, у вас має бути встановлено розширення для веб-переглядача та запущений адаптер ioBroker із простим API, доступний із вашого веб-переглядача.",
41
41
  "txt_two": "... більше інформації буде незабаром!"
42
42
  }
@@ -36,7 +36,7 @@
36
36
  "triple_flag2": "三重触发器的最大字段",
37
37
  "triple_flag2_help": "三重触发器的最大分数字段。分数高于此值的飞镖将不会触发三重触发数据点。",
38
38
  "triple_flag_help": "三重触发器的最低分数字段。分数低于此值的飞镖将不会触发三重触发数据点。",
39
- "txt_one": "<b>此适配器将您本地的 Autodarts Board Manager 连接到 ioBroker。</b><br><br>1) 在“选项”(主机、端口、轮询、三重范围)下配置连接。<br>2) 在“映射”下映射灯光和功率目标。<br>3) 在可视化、脚本和场景中使用创建的状态(投掷、红绿灯、硬件)。",
40
- "txt_tools": "此选项卡配置与“Tools for Autodarts”浏览器扩展的集成。<br>要使用它,您必须安装浏览器扩展,并且 ioBroker simple-api 适配器正在运行并可通过浏览器访问。",
39
+ "txt_one": "<b>此适配器将您本地的 Autodarts Board Manager 连接到 ioBroker。</b><br><br>• 在“选项”(主机、端口、轮询、三重范围)下配置连接。<br>• 在“映射”下映射灯光和功率目标。<br>• 在可视化、脚本和场景中使用创建的状态(投掷、交通灯、硬件)。<br>• 将 Autodarts 工具与适配器链接。",
40
+ "txt_tools": "此选项卡配置与“Tools for Autodarts”浏览器扩展的集成。<br><br>要使用它,您必须安装浏览器扩展,并且 ioBroker simple-api 适配器正在运行并可通过浏览器访问。",
41
41
  "txt_two": "...更多信息即将推出!"
42
42
  }
@@ -515,7 +515,10 @@
515
515
  },
516
516
  "txtTwo": {
517
517
  "type": "staticText",
518
- "text": "txt_two",
518
+ "text": {
519
+ "en": "For complete documentation, click here below:<br><br>• <a href=\"https://github.com/inventwo/ioBroker.autodarts/blob/main/docs/en/README.md\">Adapter documentation</a>",
520
+ "de": "Für eine vollständige Dokumentation klicke hier unten:<br><br>• <a href=\"https://github.com/inventwo/ioBroker.autodarts/blob/main/docs/de/README.md\">Adapter-Dokumentation</a>"
521
+ },
519
522
  "newLine": true,
520
523
  "xs": 12,
521
524
  "sm": 12,
@@ -524,7 +527,7 @@
524
527
  "xl": 6,
525
528
  "style": {
526
529
  "marginTop": "50px",
527
- "fontSize": "12px"
530
+ "fontSize": "16px"
528
531
  }
529
532
  },
530
533
  "logo": {
package/io-package.json CHANGED
@@ -1,8 +1,34 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "autodarts",
4
- "version": "0.8.2",
4
+ "version": "1.0.0",
5
5
  "news": {
6
+ "1.0.0": {
7
+ "en": "BREAKING CHANGE: All triggers to unified trigger.is structure\nManual cleanup required: Delete old autodarts.X.throw.is and tools. states after update\nUnchanged: tools.RAW, tools.config.url, all timers/functionality",
8
+ "de": "BREAKING CHANGE: Alle Auslöser zum vereinheitlichten Auslöser. ist Struktur\nManuelle Reinigung erforderlich: Löschen Sie alte Autodarts. X.throw.is und Werkzeuge. Zustände nach Update\nUnverändert: Werkzeuge. RAW, tools.config.url, alle Timer/Funktionalität",
9
+ "ru": "Изменить дыхание: Все триггеры в единый триггер. структура\nТребуется ручная очистка: Удалите старые автодарты. X.throw.is и инструменты. государства после обновления\nБез изменений: инструменты. RAW, tools.config.url, все таймеры/функциональность",
10
+ "pt": "MUDANÇAS DE RISCO: Todos os gatilhos para o gatilho unificado. é estrutura\nLimpeza manual necessária: Apagar os autodarts antigos. X.throw.is e ferramentas. estados após a atualização\nInalterado: ferramentas. RAW, tools.config.url, todos os timers/funcionalidade",
11
+ "nl": "Breaking VERANDERING: Alle triggers naar uniforme trekker. is structuur\nHandmatig opruimen vereist: Verwijder oude autodarts. X.throw.is en gereedschap. staat na update\nOngewijzigd: gereedschap. RAW, tools.config.url, all timers/functionaliteit",
12
+ "fr": "CHANGEMENT DE BREAING: Tous les déclencheurs au déclencheur unifié. est la structure\nNettoyage manuel requis: Supprimer les anciens autodarts. X.throw. est et outils. États après mise à jour\nSans changement : outils. RAW, tools.config.url, toutes les minuteries/fonctionnalité",
13
+ "it": "CAMBIO DI BREAKING: Tutti i trigger per attivare unificato. è struttura\nPulizia manuale necessaria: Eliminare vecchi autodarts. X.throw.is e strumenti. stati dopo l'aggiornamento\nSvariato: strumenti. RAW, tools.config.url, tutti i timer/funzionalità",
14
+ "es": "Cambiando: Todos disparan al gatillo unificado. estructura\nLimpieza manual requerida: Eliminar viejos autodarts. X.throw.is y herramientas. estados después de la actualización\nSin cambios: herramientas. RAW, tools.config.url, todos los temporizadores/funcionalidad",
15
+ "pl": "ZMIANA ZBIORCZA: Wszystkie wyzwalacze do jednego zapalnika. jest strukturą\nWymagane jest ręczne czyszczenie: Usuń stare autodoty. X.throw.is i narzędzia. stany po aktualizacji\nBez zmian: narzędzia. RAW, narzędzia .config.url, wszystkie timery / funkcjonalność",
16
+ "uk": "БРЕАКІНГ ЗМІН: Всі тригери для уніфікованого тригера. структура\nВимоги: Видалити старі автодарти. X.throw.is та інструменти. стани після оновлення\nНезмінені: інструменти. RAW, інструменти.config.url, всі таймери/функціональність",
17
+ "zh-cn": "打破变化: 所有触发器统一触发. 是结构\n需要进行人工清理: 删除旧的自定义 。 X. throw.is和工具。 更新后状态\n未更改:工具。 RAW,工具.config.url,所有计时器/功能"
18
+ },
19
+ "0.8.3": {
20
+ "en": "Added: CHANGELOG_OLD.md\nImproved: Link to documentation added to the help section.",
21
+ "de": "Hinzugefügt: CHANGELOG_OLD.md\nVerbessert: Link zur Dokumentation, die im Hilfebereich hinzugefügt wird.",
22
+ "ru": "Добавлено: CHANGELOG_OLD.md\nУлучшено: Ссылка на документацию, добавленную в раздел справки.",
23
+ "pt": "Adicionado: MUDANÇA_OLD.md\nMelhorado: Link para documentação adicionada à seção de ajuda.",
24
+ "nl": "Toegevoegd: VERANDERINGLOG_OLD.md\nVerbeterd: Link naar documentatie toegevoegd aan de help sectie.",
25
+ "fr": "Ajouté : CHANGELOG_OLD.md\nAmélioration : Lien vers la documentation ajoutée à la section d'aide.",
26
+ "it": "Aggiunto: CHANGELOG_OLD.md\nMigliorato: Link alla documentazione aggiunta alla sezione di aiuto.",
27
+ "es": "Añadido: CHANGELOG_OLD.md\nMejorado: Enlace a la documentación agregada a la sección de ayuda.",
28
+ "pl": "Dodano: CHANGELOG _ OLD.md\nUlepszone: Link do dokumentacji dodanej do sekcji pomocy.",
29
+ "uk": "Доданий: CHANGELOG_OLD.md\nУдосконалено: Посилання на документацію, додану до розділу допомоги.",
30
+ "zh-cn": "添加:变换组_OLD.md\n改进:与帮助部分新增的文件链接."
31
+ },
6
32
  "0.8.2": {
7
33
  "en": "Fixed: ImageURL",
8
34
  "de": "Behoben: ImageURL",
@@ -67,32 +93,6 @@
67
93
  "pl": "Napraw rok Copyright",
68
94
  "uk": "Фіксація авторського права",
69
95
  "zh-cn": "修复版权年"
70
- },
71
- "0.7.1": {
72
- "en": "Changed: Reduced reconnect delay after offline.",
73
- "de": "Geändert: Reduzierte Reconnect-Verzögerung nach Offline.",
74
- "ru": "Изменение: снижение задержки повторного подключения после офлайна.",
75
- "pt": "Alterado: Reconectar atraso reduzido após offline.",
76
- "nl": "Veranderd: Verminderde reconnect vertraging na offline.",
77
- "fr": "Changed: Réduction du délai de reconnect après hors ligne.",
78
- "it": "Cambiato: Riduzione del ritardo di ricollegamento dopo offline.",
79
- "es": "Cambio: Reducir el retraso de reconexión después de fuera de línea.",
80
- "pl": "Zmiana: Zmniejszone opóźnienie ponownego połączenia po offline.",
81
- "uk": "Змінено: Зменшення затримки відключення після вимкнення.",
82
- "zh-cn": "更改:下线后减少重联延迟."
83
- },
84
- "0.7.0": {
85
- "en": "Added: New `status.boardStatus` state. Status indicator of board event (e.g. `\"Stopped\"`, `\"Calibration finished\"`, `\"Started\"`).",
86
- "de": "Hinzugefügt: Neu `status.boardStatus` Zustand. Statusanzeige des Board-Events (z.B. \"Stopped\", \"Calibration fertig\", \"Started\"\").",
87
- "ru": "Добавлено: Новое состояние \"status.boardStatus\". Индикатор состояния события на борту (например, \"Остановилось\", \"Калибровка завершена\", \"Начало\").",
88
- "pt": "Adicionado: Novo estado `status.boardStatus`. Indicador de estado do evento de tabuleiro (por exemplo, `\"Parado\"`, `\"A calibração terminou\"`, `\"Iniciado\"`).",
89
- "nl": "Toegevoegd: Nieuwe status.boardStatus Status-indicator van de gebeurtenis van het bord (bv. \"Stopped,\" \"Calibration finished\" en \"Started\").",
90
- "fr": "Ajouté : Nouveau état `status.boardStatus`. Indicateur de l'état de l'événement du conseil d'administration (par exemple, ``Stopupped'``, `'Calibration terminée'`, `'Started'`).",
91
- "it": "Aggiunto: New `status.boardStatus` state. Indicatore di stato dell'evento di bordo (ad esempio `\"Stopped\"`, `\"Calibrazione finita\"`, `\"Started\"`).",
92
- "es": "Añadido: Nuevo estado de `status.boardStatus`. Indicador de estado del evento de la junta (por ejemplo, `\"Stopped\"`, `\"Calibration completed\" `, `\"Started').",
93
- "pl": "Dodano: Nowy stan 'status.boardStatus'. Wskaźnik stanu zdarzenia planszowego (np. \"Zatrzymał\", \"Kalibracja zakończona\", \"Rozpoczęty\").",
94
- "uk": "Додано: Новий стан `status.boardStatus`. Індикатор стану походу дошки (наприклад, ```'', ''''''', '''''''.",
95
- "zh-cn": "添加:新的`状态.boardstatus'状态。 板块事件的状况指标(例如`停止'、`完成的校准'、`开始')."
96
96
  }
97
97
  },
98
98
  "titleLang": {
package/lib/throw.js CHANGED
@@ -1,3 +1,4 @@
1
+ /* eslint-disable jsdoc/require-param-description */
1
2
  // lib/throw.js
2
3
  "use strict";
3
4
 
@@ -10,10 +11,7 @@ async function init(adapter) {
10
11
  await adapter.extendObjectAsync("throw", {
11
12
  type: "channel",
12
13
  common: {
13
- name: {
14
- en: "Current throw",
15
- de: "Aktueller Wurf",
16
- },
14
+ name: { en: "Current throw", de: "Aktueller Wurf" },
17
15
  },
18
16
  native: {},
19
17
  });
@@ -21,92 +19,59 @@ async function init(adapter) {
21
19
  await adapter.extendObjectAsync("throw.current", {
22
20
  type: "state",
23
21
  common: {
24
- name: {
25
- en: "Current dart score",
26
- de: "Punkte aktueller Dart",
27
- },
22
+ name: { en: "Current dart score", de: "Punkte aktueller Dart" },
28
23
  type: "number",
29
24
  role: "value",
30
25
  read: true,
31
26
  write: false,
32
- desc: {
33
- en: "Score of the last dart",
34
- de: "Punktzahl des letzten Dart",
35
- },
36
27
  },
37
28
  native: {},
38
29
  });
39
30
 
40
- await adapter.extendObjectAsync("throw.isTriple", {
31
+ await adapter.extendObjectAsync("trigger.isTriple", {
41
32
  type: "state",
42
33
  common: {
43
- name: {
44
- en: "Triple hit",
45
- de: "Triple getroffen",
46
- },
34
+ name: { en: "Triple (trigger from Board)", de: "Triple (Trigger vom Board)" },
47
35
  type: "boolean",
48
36
  role: "indicator",
49
37
  read: true,
50
38
  write: false,
51
- desc: {
52
- en: "true if the dart hit a triple segment (and passes score range)",
53
- de: "true, wenn ein Dart ein Triple-Segment getroffen hat (und innerhalb der Punkterange liegt)",
54
- },
55
39
  },
56
40
  native: {},
57
41
  });
58
42
 
59
- await adapter.extendObjectAsync("throw.isBullseye", {
43
+ await adapter.extendObjectAsync("trigger.isBullseye", {
60
44
  type: "state",
61
45
  common: {
62
- name: {
63
- en: "Bullseye hit",
64
- de: "Bullseye getroffen",
65
- },
46
+ name: { en: "Bullseye (trigger from Board)", de: "Bullseye (Trigger vom Board)" },
66
47
  type: "boolean",
67
48
  role: "indicator",
68
49
  read: true,
69
50
  write: false,
70
- desc: {
71
- en: "true if the dart hit the bull or bullseye",
72
- de: "true, wenn ein Dart Bull oder Bullseye getroffen hat",
73
- },
74
51
  },
75
52
  native: {},
76
53
  });
77
- await adapter.extendObjectAsync("throw.isMiss", {
54
+
55
+ await adapter.extendObjectAsync("trigger.isMiss", {
78
56
  type: "state",
79
57
  common: {
80
- name: {
81
- en: "Miss",
82
- de: "Kein Treffer",
83
- },
58
+ name: { en: "Miss (trigger from Board)", de: "Miss (Trigger vom Board)" },
84
59
  type: "boolean",
85
60
  role: "indicator",
86
61
  read: true,
87
62
  write: false,
88
- desc: {
89
- en: "true if the dart did not hit a valid scoring segment",
90
- de: "true, wenn der Dart kein gültiges Punktesegment getroffen hat",
91
- },
92
63
  },
93
64
  native: {},
94
65
  });
95
- await adapter.extendObjectAsync("throw.isDouble", {
66
+
67
+ await adapter.extendObjectAsync("trigger.isDouble", {
96
68
  type: "state",
97
69
  common: {
98
- name: {
99
- en: "Double hit",
100
- de: "Doppel getroffen",
101
- },
70
+ name: { en: "Double (trigger from Board)", de: "Doppel (Trigger vom Board)" },
102
71
  type: "boolean",
103
72
  role: "indicator",
104
73
  read: true,
105
74
  write: false,
106
- desc: {
107
- en: "true if the dart hit a double segment",
108
- de: "true, wenn ein Dart ein Doppel-Segment getroffen hat",
109
- },
110
75
  },
111
76
  native: {},
112
77
  });
@@ -115,18 +80,18 @@ async function init(adapter) {
115
80
  /**
116
81
  * Aktualisiert die Throw-States für den letzten Dart inkl. Triple/Bull-Flags.
117
82
  *
118
- * @param {import("@iobroker/adapter-core").AdapterInstance} adapter Adapter-Instanz dieses Autodarts-Adapters
119
- * @param {any} lastDart Letzter Dart aus state.throws
83
+ * @param {import("@iobroker/adapter-core").AdapterInstance} adapter
84
+ * @param {any} lastDart
120
85
  */
121
86
  async function updateThrow(adapter, lastDart) {
122
- // @ts-expect-error - calcScore is a custom method in the Autodarts adapter class
87
+ // @ts-expect-error adapter has custom method calcScore
123
88
  const score = adapter.calcScore(lastDart);
124
89
  const segment = lastDart?.segment?.number || 0;
125
90
 
126
91
  // Score-Range aus Adapter übernehmen
127
- // @ts-expect-error - tripleMinScoreRuntime is a custom property in the Autodarts adapter class
92
+ // @ts-expect-error adapter has custom prop tripleMinScoreRuntime
128
93
  let minScore = adapter.tripleMinScoreRuntime;
129
- // @ts-expect-error - tripleMaxScoreRuntime is a custom property in the Autodarts adapter class
94
+ // @ts-expect-error adapter has custom prop tripleMaxScoreRuntime
130
95
  let maxScore = adapter.tripleMaxScoreRuntime;
131
96
 
132
97
  if (!Number.isFinite(minScore)) {
@@ -145,49 +110,46 @@ async function updateThrow(adapter, lastDart) {
145
110
  const isTriple =
146
111
  !!lastDart?.segment && lastDart.segment.multiplier === 3 && segment >= minScore && segment <= maxScore;
147
112
  const isDouble = !!lastDart?.segment && lastDart.segment.multiplier === 2;
148
-
149
113
  const segName = (lastDart?.segment?.name || "").toUpperCase();
150
114
  const isBullseye = segName.includes("BULL") || lastDart?.segment?.number === 25;
151
115
  const isMiss = !lastDart?.segment || score === 0;
152
116
 
153
117
  await adapter.setStateAsync("throw.current", { val: score, ack: true });
154
118
 
155
- // Timer für Auto-Reset abbrechen
156
- // @ts-expect-error - resetTimer is a custom property in the Autodarts adapter class
157
- if (adapter.resetTimer) {
158
- // @ts-expect-error - resetTimer is a custom property in the Autodarts adapter class
159
- clearTimeout(adapter.resetTimer);
160
- // @ts-expect-error - resetTimer is a custom property in the Autodarts adapter class
161
- adapter.resetTimer = null;
119
+ // 1. Alten Timer für Auto-Reset abbrechen
120
+ if (adapter.resetTimers["throw"]) {
121
+ clearTimeout(adapter.resetTimers["throw"]);
122
+ delete adapter.resetTimers["throw"];
162
123
  }
163
124
 
164
- await adapter.setStateAsync("throw.isTriple", { val: isTriple, ack: true });
165
- await adapter.setStateAsync("throw.isDouble", { val: isDouble, ack: true });
166
- await adapter.setStateAsync("throw.isBullseye", { val: isBullseye, ack: true });
167
- await adapter.setStateAsync("throw.isMiss", { val: isMiss, ack: true });
125
+ // 2. States auf die neuen Werte setzen
126
+ await adapter.setStateAsync("trigger.isTriple", { val: isTriple, ack: true });
127
+ await adapter.setStateAsync("trigger.isDouble", { val: isDouble, ack: true });
128
+ await adapter.setStateAsync("trigger.isBullseye", { val: isBullseye, ack: true });
129
+ await adapter.setStateAsync("trigger.isMiss", { val: isMiss, ack: true });
168
130
 
169
- // @ts-expect-error - triggerResetSecRuntime is a custom property in the Autodarts adapter class
131
+ // 3. Neuen Reset-Timer setzen
132
+ // @ts-expect-error adapter has custom prop triggerResetSecRuntime
170
133
  const timeoutMs = (Number(adapter.triggerResetSecRuntime) || 0) * 1000;
134
+
171
135
  if (timeoutMs > 0) {
172
- adapter.resetTimer = setTimeout(() => {
136
+ adapter.resetTimers["throw"] = setTimeout(() => {
173
137
  if (isTriple) {
174
- adapter.setState("throw.isTriple", { val: false, ack: true });
138
+ adapter.setState("trigger.isTriple", { val: false, ack: true });
175
139
  }
176
140
  if (isDouble) {
177
- adapter.setState("throw.isDouble", { val: false, ack: true });
141
+ adapter.setState("trigger.isDouble", { val: false, ack: true });
178
142
  }
179
143
  if (isBullseye) {
180
- adapter.setState("throw.isBullseye", { val: false, ack: true });
144
+ adapter.setState("trigger.isBullseye", { val: false, ack: true });
181
145
  }
182
146
  if (isMiss) {
183
- adapter.setState("throw.isMiss", { val: false, ack: true });
147
+ adapter.setState("trigger.isMiss", { val: false, ack: true });
184
148
  }
185
- adapter.resetTimer = null;
149
+
150
+ delete adapter.resetTimers["throw"];
186
151
  }, timeoutMs);
187
152
  }
188
153
  }
189
154
 
190
- module.exports = {
191
- init,
192
- updateThrow,
193
- };
155
+ module.exports = { init, updateThrow };
package/lib/tools.js CHANGED
@@ -1,3 +1,4 @@
1
+ // lib/tools.js
1
2
  /* eslint-disable jsdoc/require-param-description */
2
3
  "use strict";
3
4
 
@@ -10,9 +11,12 @@
10
11
  async function init(adapter) {
11
12
  // Initialzustand setzen
12
13
  await adapter.setStateAsync("tools.RAW", { val: "", ack: true });
13
- await adapter.setStateAsync("tools.busted", { val: false, ack: true });
14
- await adapter.setStateAsync("tools.gameon", { val: false, ack: true });
15
- await adapter.setStateAsync("tools.gameshot", { val: false, ack: true });
14
+ await adapter.setStateAsync("trigger.isBusted", { val: false, ack: true });
15
+ await adapter.setStateAsync("trigger.isGameon", { val: false, ack: true });
16
+ await adapter.setStateAsync("trigger.isGameshot", { val: false, ack: true });
17
+ await adapter.setStateAsync("trigger.is180", { val: false, ack: true });
18
+ await adapter.setStateAsync("trigger.isMatchshot", { val: false, ack: true });
19
+ await adapter.setStateAsync("trigger.isTakeout", { val: false, ack: true });
16
20
 
17
21
  // Auf Änderungen von tools.RAW hören
18
22
  adapter.subscribeStates("tools.RAW");
@@ -34,17 +38,27 @@ async function handleStateChange(adapter, idShort, state) {
34
38
  const val = String(state.val || "").toLowerCase();
35
39
  const timeoutMs = (adapter.triggerResetSecRuntime || 0) * 1000;
36
40
 
37
- // Alle Trigger zuerst zurücksetzen
41
+ /* Alle Trigger zuerst zurücksetzen
38
42
  await adapter.setStateAsync("tools.busted", { val: false, ack: true });
39
43
  await adapter.setStateAsync("tools.gameon", { val: false, ack: true });
40
44
  await adapter.setStateAsync("tools.gameshot", { val: false, ack: true });
45
+ await adapter.setStateAsync("tools.180", { val: false, ack: true });
46
+ await adapter.setStateAsync("tools.matchshot", { val: false, ack: true });
47
+ await adapter.setStateAsync("tools.takeout", { val: false, ack: true });
48
+ */
41
49
 
42
50
  if (val === "busted") {
43
- await setPulse(adapter, "tools.busted", timeoutMs);
51
+ await setPulse(adapter, "trigger.isBusted", timeoutMs);
44
52
  } else if (val === "gameon") {
45
- await setPulse(adapter, "tools.gameon", timeoutMs);
53
+ await setPulse(adapter, "trigger.isGameon", timeoutMs);
46
54
  } else if (val === "gameshot") {
47
- await setPulse(adapter, "tools.gameshot", timeoutMs);
55
+ await setPulse(adapter, "trigger.isGameshot", timeoutMs);
56
+ } else if (val === "180") {
57
+ await setPulse(adapter, "trigger.is180", timeoutMs);
58
+ } else if (val === "matchshot") {
59
+ await setPulse(adapter, "trigger.isMatchshot", timeoutMs);
60
+ } else if (val === "takeout") {
61
+ await setPulse(adapter, "trigger.isTakeout", timeoutMs);
48
62
  }
49
63
  }
50
64
 
@@ -58,15 +72,22 @@ async function handleStateChange(adapter, idShort, state) {
58
72
  * @param {number} timeoutMs
59
73
  */
60
74
  async function setPulse(adapter, id, timeoutMs) {
75
+ // Falls das Objekt für die Timer noch nicht existiert, kurz anlegen
76
+ adapter.resetTimers = adapter.resetTimers || {};
77
+
78
+ // 1) Auf true setzen
61
79
  await adapter.setStateAsync(id, { val: true, ack: true });
62
80
 
63
81
  if (timeoutMs > 0) {
64
- if (adapter.resetTimer) {
65
- clearTimeout(adapter.resetTimer);
82
+ // 2) Bestehenden Timer NUR für diese ID löschen
83
+ if (adapter.resetTimers[id]) {
84
+ clearTimeout(adapter.resetTimers[id]);
66
85
  }
67
- adapter.resetTimer = setTimeout(() => {
68
- adapter.setState(id, { val: false, ack: true });
69
- adapter.resetTimer = null;
86
+
87
+ // 3) Neuen Timer für diese ID starten
88
+ adapter.resetTimers[id] = setTimeout(async () => {
89
+ await adapter.setStateAsync(id, { val: false, ack: true });
90
+ delete adapter.resetTimers[id]; // Timer-Referenz nach Ablauf aufräumen
70
91
  }, timeoutMs);
71
92
  }
72
93
  }
package/main.js CHANGED
@@ -35,6 +35,7 @@ class Autodarts extends utils.Adapter {
35
35
  // Reset-Timeout + Timer für isTriple/isBullseye/isDouble/isMiss
36
36
  this.triggerResetSecRuntime = null;
37
37
  this.resetTimer = null;
38
+ this.resetTimers = {}; // NEU: Objekt für individuelle Timer initialisieren
38
39
  }
39
40
 
40
41
  async onReady() {
@@ -73,6 +74,18 @@ class Autodarts extends utils.Adapter {
73
74
  // Visit-Struktur anlegen (ausgelagert)
74
75
  await visit.init(this);
75
76
 
77
+ // Trigger-Channel für alle is*-Trigger
78
+ await this.extendObjectAsync("trigger", {
79
+ type: "channel",
80
+ common: {
81
+ name: {
82
+ en: "Trigger states",
83
+ de: "Trigger-Zustände",
84
+ },
85
+ },
86
+ native: {},
87
+ });
88
+
76
89
  // Throw-Channel und States anlegen (ausgelagert)
77
90
  await throwLogic.init(this);
78
91
 
@@ -483,12 +496,12 @@ class Autodarts extends utils.Adapter {
483
496
  native: {},
484
497
  });
485
498
 
486
- await this.extendObjectAsync("tools.busted", {
499
+ await this.extendObjectAsync("trigger.isBusted", {
487
500
  type: "state",
488
501
  common: {
489
502
  name: {
490
- en: "Busted (trigger)",
491
- de: "Busted (Trigger)",
503
+ en: "Busted (trigger from tools)",
504
+ de: "Busted (Trigger aus Tools)",
492
505
  },
493
506
  type: "boolean",
494
507
  role: "indicator",
@@ -498,12 +511,12 @@ class Autodarts extends utils.Adapter {
498
511
  native: {},
499
512
  });
500
513
 
501
- await this.extendObjectAsync("tools.gameon", {
514
+ await this.extendObjectAsync("trigger.isGameon", {
502
515
  type: "state",
503
516
  common: {
504
517
  name: {
505
- en: "Game on (trigger)",
506
- de: "Game on (Trigger)",
518
+ en: "Game on (trigger from tools)",
519
+ de: "Game on (Trigger aus Tools)",
507
520
  },
508
521
  type: "boolean",
509
522
  role: "indicator",
@@ -513,12 +526,12 @@ class Autodarts extends utils.Adapter {
513
526
  native: {},
514
527
  });
515
528
 
516
- await this.extendObjectAsync("tools.gameshot", {
529
+ await this.extendObjectAsync("trigger.isGameshot", {
517
530
  type: "state",
518
531
  common: {
519
532
  name: {
520
- en: "Gameshot (trigger)",
521
- de: "Gameshot (Trigger)",
533
+ en: "Gameshot (trigger from tools)",
534
+ de: "Gameshot (Trigger aus Tools)",
522
535
  },
523
536
  type: "boolean",
524
537
  role: "indicator",
@@ -527,14 +540,48 @@ class Autodarts extends utils.Adapter {
527
540
  },
528
541
  native: {},
529
542
  });
530
- // NEU: Unter-Channel für URL-Infos
531
- await this.extendObjectAsync("tools.config", {
532
- type: "channel",
543
+
544
+ await this.extendObjectAsync("trigger.is180", {
545
+ type: "state",
546
+ common: {
547
+ name: {
548
+ en: "180 (trigger from tools)",
549
+ de: "180 (Trigger aus Tools)",
550
+ },
551
+ type: "boolean",
552
+ role: "indicator",
553
+ read: true,
554
+ write: false,
555
+ },
556
+ native: {},
557
+ });
558
+
559
+ await this.extendObjectAsync("trigger.isMatchshot", {
560
+ type: "state",
533
561
  common: {
534
562
  name: {
535
- en: "Tools configuration",
536
- de: "Tools-Konfiguration",
563
+ en: "Matchshot (trigger from tools)",
564
+ de: "Matchshot (Trigger aus Tools)",
537
565
  },
566
+ type: "boolean",
567
+ role: "indicator",
568
+ read: true,
569
+ write: false,
570
+ },
571
+ native: {},
572
+ });
573
+
574
+ await this.extendObjectAsync("trigger.isTakeout", {
575
+ type: "state",
576
+ common: {
577
+ name: {
578
+ en: "Takeout (trigger from tools)",
579
+ de: "Takeout (Trigger aus Tools)",
580
+ },
581
+ type: "boolean",
582
+ role: "indicator",
583
+ read: true,
584
+ write: false,
538
585
  },
539
586
  native: {},
540
587
  });
@@ -584,6 +631,49 @@ class Autodarts extends utils.Adapter {
584
631
  native: {},
585
632
  });
586
633
 
634
+ await this.extendObjectAsync("tools.config.url180", {
635
+ type: "state",
636
+ common: {
637
+ name: {
638
+ en: "URL for 180",
639
+ de: "URL für 180",
640
+ },
641
+ type: "string",
642
+ role: "text.url",
643
+ read: true,
644
+ write: false,
645
+ },
646
+ native: {},
647
+ });
648
+ await this.extendObjectAsync("tools.config.urlMatchshot", {
649
+ type: "state",
650
+ common: {
651
+ name: {
652
+ en: "URL for Matchshot",
653
+ de: "URL für Matchshot",
654
+ },
655
+ type: "string",
656
+ role: "text.url",
657
+ read: true,
658
+ write: false,
659
+ },
660
+ native: {},
661
+ });
662
+ await this.extendObjectAsync("tools.config.urlTakeout", {
663
+ type: "state",
664
+ common: {
665
+ name: {
666
+ en: "URL for Takeout",
667
+ de: "URL für Takeout",
668
+ },
669
+ type: "string",
670
+ role: "text.url",
671
+ read: true,
672
+ write: false,
673
+ },
674
+ native: {},
675
+ });
676
+
587
677
  // Tools-Integration initialisieren
588
678
  await tools.init(this);
589
679
 
@@ -776,6 +866,9 @@ class Autodarts extends utils.Adapter {
776
866
  await this.setStateAsync("tools.config.urlBusted", { val: "", ack: true });
777
867
  await this.setStateAsync("tools.config.urlGameon", { val: "", ack: true });
778
868
  await this.setStateAsync("tools.config.urlGameshot", { val: "", ack: true });
869
+ await this.setStateAsync("tools.config.url180", { val: "", ack: true });
870
+ await this.setStateAsync("tools.config.urlMatchshot", { val: "", ack: true });
871
+ await this.setStateAsync("tools.config.urlTakeout", { val: "", ack: true });
779
872
  return;
780
873
  }
781
874
 
@@ -785,12 +878,20 @@ class Autodarts extends utils.Adapter {
785
878
  const urlBusted = `${base}/set/${id}.tools.RAW?value=busted`;
786
879
  const urlGameon = `${base}/set/${id}.tools.RAW?value=gameon`;
787
880
  const urlGameshot = `${base}/set/${id}.tools.RAW?value=gameshot`;
881
+ const url180 = `${base}/set/${id}.tools.RAW?value=180`;
882
+ const urlMatchshot = `${base}/set/${id}.tools.RAW?value=matchshot`;
883
+ const urlTakeout = `${base}/set/${id}.tools.RAW?value=takeout`;
788
884
 
789
885
  await this.setStateAsync("tools.config.urlBusted", { val: urlBusted, ack: true });
790
886
  await this.setStateAsync("tools.config.urlGameon", { val: urlGameon, ack: true });
791
887
  await this.setStateAsync("tools.config.urlGameshot", { val: urlGameshot, ack: true });
888
+ await this.setStateAsync("tools.config.url180", { val: url180, ack: true });
889
+ await this.setStateAsync("tools.config.urlMatchshot", { val: urlMatchshot, ack: true });
890
+ await this.setStateAsync("tools.config.urlTakeout", { val: urlTakeout, ack: true });
792
891
 
793
- this.log.debug(`Updated Tools URLs: ${urlBusted}, ${urlGameon}, ${urlGameshot}`);
892
+ this.log.debug(
893
+ `Updated Tools URLs: ${urlBusted}, ${urlGameon}, ${urlGameshot}, ${url180}, ${urlMatchshot}, ${urlTakeout}`,
894
+ );
794
895
  }
795
896
 
796
897
  /**
@@ -999,6 +1100,13 @@ class Autodarts extends utils.Adapter {
999
1100
  if (this.versionTimer) {
1000
1101
  clearInterval(this.versionTimer);
1001
1102
  }
1103
+ // NEU: Alle individuellen Tools-Timer löschen
1104
+ if (this.resetTimers) {
1105
+ for (const id in this.resetTimers) {
1106
+ clearTimeout(this.resetTimers[id]);
1107
+ }
1108
+ }
1109
+ // Den alten einzelnen Timer (falls noch genutzt) ebenfalls löschen
1002
1110
  if (this.resetTimer) {
1003
1111
  clearTimeout(this.resetTimer);
1004
1112
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.autodarts",
3
- "version": "0.8.2",
3
+ "version": "1.0.0",
4
4
  "description": "Autodarts Autoscoring",
5
5
  "author": "skvarel <skvarel@inventwo.com>",
6
6
  "contributors": [