iobroker.assistant 1.0.3 → 1.2.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.
Files changed (73) hide show
  1. package/README.md +65 -0
  2. package/admin/custom/.vite/manifest.json +62 -62
  3. package/admin/custom/assets/Components-BSewCBfS.js +2 -0
  4. package/admin/custom/assets/{_virtual_mf-localSharedImportMap___mfe_internal__ConfigCustomAssistant__mf_owner__1-A4gakomR.js → _virtual_mf-localSharedImportMap___mfe_internal__ConfigCustomAssistant__mf_owner__1-C5NPM0Of.js} +1 -1
  5. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__201375093093590__loadShare___mf_0_emotion_mf_1_styled__loadShare__.js-CwqmfMvn.js → _virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__163539842885036__loadShare___mf_0_emotion_mf_1_styled__loadShare__.js-IaosaymG.js} +1 -1
  6. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__201375093093590__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-BMuLYe6f.js → _virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__163539842885036__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-Cdyjt5KT.js} +39 -39
  7. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__201375093093590__loadShare__shared-BxjZmnpc.js → _virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__163539842885036__loadShare__shared-Dsw5zWS8.js} +1 -1
  8. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__163539842885036__prebuild___mf_0_iobroker_mf_1_json_mf_2_config__prebuild__-SgSagTOv.js +122 -0
  9. package/admin/custom/assets/{hostInit-4roC4hEj.js → hostInit-jJe8bIfV.js} +1 -1
  10. package/admin/custom/assets/{lib-CchzgTUs.js → lib-CL8mXvI6.js} +1 -1
  11. package/admin/custom/assets/{mf-entry-bootstrap-0-4806bbe4.js → mf-entry-bootstrap-0-ab227aa6.js} +2 -2
  12. package/admin/custom/assets/{pendingShares-DLlv8yFY.js → pendingShares-wrGtfliQ.js} +1 -1
  13. package/admin/custom/customComponents.js +2 -2
  14. package/admin/custom/i18n/de.json +40 -0
  15. package/admin/custom/i18n/en.json +40 -0
  16. package/admin/custom/i18n/es.json +40 -0
  17. package/admin/custom/i18n/fr.json +40 -0
  18. package/admin/custom/i18n/it.json +40 -0
  19. package/admin/custom/i18n/nl.json +40 -0
  20. package/admin/custom/i18n/pl.json +40 -0
  21. package/admin/custom/i18n/pt.json +40 -0
  22. package/admin/custom/i18n/ru.json +40 -0
  23. package/admin/custom/i18n/uk.json +40 -0
  24. package/admin/custom/i18n/zh-cn.json +40 -0
  25. package/admin/custom/index.html +2 -2
  26. package/admin/custom/mf-manifest.json +1 -1
  27. package/admin/custom/mf-stats.json +1 -1
  28. package/admin/i18n/de.json +13 -3
  29. package/admin/i18n/en.json +13 -3
  30. package/admin/i18n/es.json +13 -3
  31. package/admin/i18n/fr.json +13 -3
  32. package/admin/i18n/it.json +13 -3
  33. package/admin/i18n/nl.json +13 -3
  34. package/admin/i18n/pl.json +13 -3
  35. package/admin/i18n/pt.json +13 -3
  36. package/admin/i18n/ru.json +13 -3
  37. package/admin/i18n/uk.json +13 -3
  38. package/admin/i18n/zh-cn.json +13 -3
  39. package/admin/jsonConfig.json +61 -2
  40. package/build/lib/journal.js +298 -2
  41. package/build/lib/journal.js.map +1 -1
  42. package/build/lib/llm.js +105 -4
  43. package/build/lib/llm.js.map +1 -1
  44. package/build/lib/localLlm.js +47 -10
  45. package/build/lib/localLlm.js.map +1 -1
  46. package/build/lib/nlu.js +124 -5
  47. package/build/lib/nlu.js.map +1 -1
  48. package/build/lib/tools.js +3 -0
  49. package/build/lib/tools.js.map +1 -1
  50. package/build/lib/voice/esphome.js +81 -7
  51. package/build/lib/voice/esphome.js.map +1 -1
  52. package/build/lib/voice/esphomeProto.js.map +1 -1
  53. package/build/lib/voice/mediaServer.js +29 -1
  54. package/build/lib/voice/mediaServer.js.map +1 -1
  55. package/build/lib/voice/protocol.js.map +1 -1
  56. package/build/lib/voice/voiceServer.js +81 -7
  57. package/build/lib/voice/voiceServer.js.map +1 -1
  58. package/build/lib/voice/wakeWords.js +284 -0
  59. package/build/lib/voice/wakeWords.js.map +1 -0
  60. package/build/lib/voice/wyoming.js +12 -4
  61. package/build/lib/voice/wyoming.js.map +1 -1
  62. package/build/lib/weather.js +160 -0
  63. package/build/lib/weather.js.map +1 -1
  64. package/build/lib/youtube.js +625 -0
  65. package/build/lib/youtube.js.map +1 -0
  66. package/build/main.js +1152 -76
  67. package/build/main.js.map +1 -1
  68. package/io-package.json +30 -14
  69. package/package.json +6 -6
  70. package/admin/custom/assets/Components-C6qcpaRC.js +0 -1
  71. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__201375093093590__prebuild___mf_0_iobroker_mf_1_json_mf_2_config__prebuild__-TM4l0OYm.js +0 -122
  72. /package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__201375093093590__loadShare___mf_0_emotion_mf_1_react__loadShare__.js-BkH7fzDw.js → _virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__163539842885036__loadShare___mf_0_emotion_mf_1_react__loadShare__.js-BkH7fzDw.js} +0 -0
  73. /package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__201375093093590__prebuild__react_mf_1_jsx_mf_2_runtime__prebuild__-M61rjtmp.js → _virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__163539842885036__prebuild__react_mf_1_jsx_mf_2_runtime__prebuild__-M61rjtmp.js} +0 -0
package/io-package.json CHANGED
@@ -1,8 +1,34 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "assistant",
4
- "version": "1.0.3",
4
+ "version": "1.2.0",
5
5
  "news": {
6
+ "1.2.0": {
7
+ "en": "Own wake words for ESPHome satellites: upload a microWakeWord model in the satellite settings, the device downloads it when it is activated. Models the device cannot run (e.g. openWakeWord) are rejected on upload with the reason\nVoice answers come faster: the device list for the offline rule engine is built once and shared for a minute instead of up to three times per spoken command\nThe local LLM is now the fallback for when the cloud LLM fails; \"Ask the local model first\" restores the old order. It is stopped after a configurable timeout, answers shorter and leaves one CPU core free\nWhen an answer asks back, UDP satellites now keep the microphone open for the reply too (needs `@iobroker/assistant-satellite` 0.2.0)\n\"Louder\", \"quieter\", \"volume 5\" change the volume of the satellite that heard it - ESPHome, ioBroker-native and UDP satellites\n\"How's the weather tomorrow?\" is answered from the weather adapter without an LLM\nFixed: Russian questions with \"будет\" (\"will it be …\") were taken for alarm queries",
8
+ "de": "Eigene Weckwörter für ESPhome: Laden Sie ein MicroWakeWord-Modell in den Sat-Einstellungen hoch, wenn es aktiviert ist. Geräteunfähige Modelle (z. B. OpenWakeWord) werden beim Upload abgelehnt\nSprachantworten schneller: Die Geräteliste für die Offline-Regel-Engine wird einmal erstellt und eine Minute lang geteilt, statt dreimal per Sprachbefehl\nDas lokale LLM ist nun die Lösung für Cloud-LLM-Fehler. „Fragen Sie zuerst das lokale Model“ Es stoppt nach einem Timeout, antwortet kürzer und lässt einen CPU-Kern frei\nWenn eine Antwort fragt, lassen UDP-Satelliten jetzt auch das Mikrofon offen (benötigt `@iobroker /assistant-satellite` 0.2.0)\n„Lauter“, „leiser“, „Lautstärke 5“ ändern die Lautstärke des Satelliten, der es gehört hat — ESPhome, IOBroker-native und UDP-Satelliten\n„Wie ist das Wetter morgen?“ wird vom Wetteradapter ohne LLM beantwortet\nBehoben: Russische Fragen mit „Wird es...“ galten als Alarmanfragen",
9
+ "ru": "Собственные слова для пробуждения спутников EspHome: загрузите модель MicroWakeWord в настройках спутника, устройство загрузит ее при активации. Модели, которые устройство не может запускать (например, OpenWakeword), отклоняются при загрузке по уважительной причине\nГолосовые ответы приходят быстрее: список устройств для автономного движка правил создается один раз и делится им в течение минуты вместо трех раз за одну голосовую команду\nЛокальный LLM теперь является запасным вариантом на случай сбоя облачного LLM; принцип «Сначала задайте вопрос локальной модели» восстанавливает прежний порядок. Он останавливается по истечении настраиваемого тайм-аута, время ответа сокращается, а одно ядро процессора остается свободным\nКогда ответ возвращается, спутники UDP теперь также оставляют микрофон открытым для ответа (требуется `@iobroker /assistant-satellite` 0.2.0)\n«Громче», «тише», «громче 5» изменяйте громкость спутника, который его услышал — спутники ESPhome, IOBroker-native и UDP\n«Какая погода завтра?» отвечает погодный адаптер без LLM\nИсправлено: русскоязычные вопросы с буквой «будет ли это...» принимались за тревожные запросы",
10
+ "pt": "Sinais próprios para satélites ESPHome: carregue um modelo microwakeWord nas configurações do satélite e o aparelho o baixa. Modelos inoperantes (ex.: OpenWakeWord) são rejeitados no upload\nAs respostas por voz são mais rápidas: a lista de dispositivos do motor de regras offline é compartilhada por um minuto, em vez de até três.\nO LLM local agora substitui a falha do LLM na nuvem; “Ask the local model first” restaura a ordem antiga. Ele pára após um tempo limite configurável, responde menos e deixa um núcleo de CPU livre\nQuando uma resposta é respondida, os satélites UDP também mantêm o microfone aberto (requer `@iobroker /assistant-satellite` 0.2.0)\n“Mais alto”, “silencioso”, “volume 5\" alteram o volume do satélite que o ouviu - ESPHome, IObroker e UDP\n“Como está o tempo amanhã?” é atendido pelo adaptador climático sem LLM\nCorrigido: perguntas russas com “será...” eram usadas para consultas de alarme",
11
+ "nl": "Eigen activeringswoorden voor ESPhome-satellieten: upload een MicroWakeWord-model in de satellietinstellingen, het apparaat downloadt het wanneer het wordt geactiveerd. Modellen die niet kunnen worden uitgevoerd op het apparaat (bijvoorbeeld OpenWakeWord) worden bij het uploaden geweigerd met de reden\nGesproken antwoorden komen sneller: de lijst met apparaten voor de offline regelengine wordt één keer samengesteld en gedurende één minuut gedeeld in plaats van maximaal drie keer per gesproken opdracht\nDe lokale LLM is nu de noodoplossing voor wanneer de LLM in de cloud faalt; „Vraag het eerst aan het lokale model” herstelt de oude volgorde. Het wordt gestopt na een instelbare time-out, het antwoord wordt korter en er blijft één CPU-kern vrij\nAls een antwoord terugvraagt, houden de UDP-satellieten nu ook de microfoon open voor het antwoord (hiervoor is `@iobroker /assistant-satellite` 0.2.0 nodig)\n„Luider”, „stiller”, „volume 5\" veranderen het volume van de satelliet die het heeft gehoord: ESPhome-, IOBroker-native en UDP-satellieten\n„Hoe is het weer morgen?” wordt beantwoord via de weeradapter zonder LLM\nOpgelost: Russische vragen met „...” („wordt het...”) werden beantwoord voor vragen over alarmen",
12
+ "fr": "Propre réveil pour les satellites EspHome : chargez un modèle MicroWakeword dans les paramètres du satellite, l'appareil le télécharge lorsqu'il est activé. Les modèles non compatibles (OpenWakeWord, par exemple) sont rejetés pour cette raison\nLes réponses vocales sont plus rapides : la liste des appareils du moteur de règles hors ligne est créée une fois et partagée pendant une minute au lieu de trois\nLe LLM local est désormais la solution en cas d'échec du LLM cloud ; « Ask the local model first » rétablit l'ancien ordre. Il s'arrête après un délai paramétrable, répond plus vite et laisse un cœur libre\nLorsqu'une réponse est demandée, les satellites UDP gardent le micro ouvert (needs `@iobroker /assistant-satellite` 0.2.0)\n« Plus fort », « plus doux », « volume 5 » : modifiez le volume du satellite qui l'a entendu : ESPHome, IOBroker et UDP\n« Quel temps fera-t-il demain ? » reçoit la réponse de l'adaptateur météo sans LLM\nCorrigé : Les questions russes « будет » (« est-ce que ce sera... ») ont été prises pour des raisons d'alarme",
13
+ "it": "Wake word personali per i satelliti ESPhome: carica un modello MicroWakeWord nelle impostazioni satellitari, lo scarica. I modelli non eseguibili (ad es. OpenWakeWord) vengono caricati e il motivo\nLe risposte vocali sono più veloci: l'elenco dei dispositivi offline è creato una volta e condiviso per un minuto anziché tre volte\nL'LLM locale è ora il rimedio per i fallimenti del cloud; «Ask the local model first» ripristina il vecchio ordine. Si ferma dopo un timeout configurabile, risponde meno e lascia libero un core CPU\nQuando una risposta risponde, i satelliti UDP ora tengono aperto anche il microfono (serve `@iobroker /assistant-satellite` 0.2.0)\n«Più forte», «più basso», «volume 5\" cambia il volume del satellite che lo ha sentito: ESPHome, IOBroker-native e UDP\n«Com'è il tempo domani?» risponde dal Weather Adapter senza un LLM\nRisolto: le domande russe con «удет» («sarà...») erano usate come allarmi",
14
+ "es": "Palabras propias para satélites ESPhome: suba un modelo MicroWakeWord en los ajustes del satélite y el dispositivo lo descarga cuando se activa. Los modelos que el dispositivo no puede ejecutar (por ejemplo, OpenWakeWord) se rechazan al subirlos\nLas respuestas de voz son más rápidas: la lista de dispositivos del motor de reglas offline se crea una vez y se comparte un minuto en lugar de tres veces por comando\nEl LLM local es ahora la alternativa para cuando el LLM en la nube fracasa; «Pregunte primero al modelo local» restaura el viejo orden. Se detiene tras un tiempo de espera configurable, responde menos y deja un núcleo de CPU libre\nCuando responde, los satélites UDP ahora mantienen el micrófono abierto para responder (necesita `@iobroker /assistant-satellite` 0.2.0)\n«Más alto», «más bajo», «volumen 5\" cambie el volumen del satélite que lo oyó: satélites ESPhome, nativos de IOBroker y UDP\n«¿Qué tiempo hace mañana?» se responde desde el adaptador meteorológico sin un LLM\nCorregido: las preguntas en ruso con «хедес» («será...») se respondían para consultas de alarma",
15
+ "pl": "Własne słowa budzące dla satelitów ESPhome: prześlij model MicroWakeWord w ustawieniach satelity, urządzenie pobiera go po aktywacji. Modele, których urządzenie nie może uruchomić (np. OpenWakeWord) są odrzucane po przesłaniu z powodu\nOdpowiedzi głosowe przychodzą szybciej: lista urządzeń dla silnika reguł offline jest tworzona raz i udostępniana przez minutę zamiast do trzech razy na polecenie mówione\nLokalna LLM jest teraz rezerwą, gdy LLM w chmurze ulegnie awarii; „Najpierw zapytaj model lokalny” przywraca stary porządek. Zostaje zatrzymany po konfigurowalnym limitu czasu, odpowiada krótsze i pozostawia jeden rdzeń procesora wolny\nGdy odpowiedź odpowie, satelity UDP utrzymują teraz mikrofon otwarty dla odpowiedzi (wymaga `@iobroker /asystent-satelita` 0.2.0)\n„Głośniejszy”, „cichszy”, „głośność 5” zmieniają głośność satelity, który go słyszał - satelity EspHome, ioBroker-native i UDP\n„Jaka jest pogoda jutro?” otrzymuje odpowiedź z adaptera pogodowego bez LLM\nNaprawiono: pytania rosyjskie z „будет” („czy będzie...”) były przyjmowane do zapytań alarmowych",
16
+ "uk": "Власні слова пробудження для супутників ESPHome: завантажте модель MicroWakeWord у налаштуваннях супутника, пристрій завантажує її, коли вона активована. Моделі, які пристрій не може запустити (наприклад, OpenWakeWord) відхиляються при завантаженні з причиною\nГолосові відповіді надходять швидше: список пристроїв для механізму автономних правил будується один раз і ділиться протягом хвилини, а не до трьох разів на вимовлену команду\nЛокальний LLM тепер є резервним варіантом, коли хмарний LLM не працює; «Спочатку запитати локальну модель» відновлює старий порядок. Він зупиняється після настроюваного тайм-ауту, відповідає коротше і залишає одне ядро процесора вільним\nКоли відповідь запитує, супутники UDP тепер також тримають мікрофон відкритим для відповіді (потрібен `@iobroker /assistant-satelit` 0.2.0)\n«Голосніше», «тихіше», «гучність 5\" змінюють гучність супутника, який його почув - супутники ESPHome, IObroker-native і UDP\n«Яка погода завтра?» відповідає від погодного адаптера без LLM\nВиправлено: російські питання з «будет» («чи буде...») були прийняті для тривожних запитів",
17
+ "zh-cn": "Esphome 卫星的自带唤醒词:在卫星设置中上传一个 MicroWakeWord 模型,设备在激活时下载该模型。设备无法运行的模型(例如 OpenWakeWord)在上传时被拒绝,原因是\n语音答案来得更快:离线规则引擎的设备列表生成一次并共享一分钟,而不是每个口头命令最多共享三次\n本地 LLM 现在是云 LLM 失败时的备用方法;“先询问本地模型” 恢复了旧的顺序。它在可配置的超时后停止,响应时间缩短并留出一个 CPU 内核空闲时间\n当答案要求回复时,UDP 卫星现在也会打开麦克风以进行回复(需要 `@iobroker /assistant-satellite` 0.2.0)\n“更响亮”、“更安静”、“音量 5” 改变听到声音的卫星的音量——ESPhome、IOBroker-Native 和 UDP 卫星\n“明天的天气怎么样?”在没有 LLM 的情况下由天气适配器回答\n已修复:警报查询时使用了带有 “bád耔(“会不会是...”)的俄语问题"
18
+ },
19
+ "1.1.0": {
20
+ "en": "YouTube on the TV: \"play the channel XY\" finds the channel, video or playlist on YouTube (no API key needed), switches the TV on if it is off and plays it over the youtube-remote adapter. The players are set in a table in the settings; the first one is used when no player is named. Pause, skip, volume and \"what is playing\" work too",
21
+ "de": "YouTube auf dem TV: „play the channel XY“ findet den Kanal, das Video oder die Playlist auf YouTube (kein API-Key nötig), schaltet den Fernseher an und spielt ihn über die Fernbedienung ab. Die Spieler stehen in den Einstellungen, ohne Namen, der erste. Pause, Skip, Volume und „Was läuft“ funktionieren auch",
22
+ "ru": "YouTube на телевизоре: функция «Воспроизвести канал XY» находит канал, видео или плейлист на YouTube (ключ API не требуется), включает телевизор, если он выключен, и воспроизводит их через адаптер пульта дистанционного управления YouTube. Игроки расположены в таблице в настройках; первая таблица используется, если имя игрока не указано. Также работают пауза, пропуск, громкость и режим «что играет»",
23
+ "pt": "“play the channel XY” localiza o canal, vídeo ou playlist no YouTube (sem necessidade de chave de API), liga a TV se estiver desligada e a reproduz no adaptador remoto do YouTube. Os jogadores são colocados em uma mesa; a primeira é usada sem nome. Pausa, salto, volume e “o que toca” também funcionam",
24
+ "nl": "YouTube op de tv: „speel het kanaal XY af” vindt het kanaal, de video of de afspeellijst op YouTube (geen API-sleutel nodig), schakelt de tv in als deze is uitgeschakeld en speelt deze af via de YouTube-afstandsbedieningsadapter. De spelers zitten in de instellingen in een tabel; de eerste wordt gebruikt als er geen speler wordt genoemd. Pauzeren, overslaan, volume en „wat wordt er afgespeeld” werken ook",
25
+ "fr": "YouTube à la TV : « play the channel XY » trouve la chaîne, la vidéo ou la playlist sur YouTube (pas besoin de clé API), allume la TV si elle est éteinte et la diffuse sur la télécommande YouTube. Les joueurs sont placés dans une table ; la première est utilisée si aucun joueur n'est nommé. Pause, skip, volume et « What is play » fonctionnent aussi",
26
+ "it": "YouTube in TV: «play the channel XY» trova il canale, il video o la playlist su YouTube (non serve una chiave API), accende la TV se è spenta e la riproduce con il telecomando Youtube. I giocatori sono seduti al tavolo; il primo è usato se nessun giocatore è nominato. Funzionano anche Pausa, Salta, Volume e Suona",
27
+ "es": "YouTube en la TV: «reproducir el canal XY» busca el canal, el vídeo o la lista de reproducción en YouTube (no necesita una clave de API), enciende la TV si está apagada y la reproduce con el adaptador remoto de YouTube. Los jugadores están en una mesa en los ajustes; la primera se usa cuando no se nombra a ningún jugador. Pausa, salto, volumen y «lo que suena» también funcionan",
28
+ "pl": "YouTube w telewizorze: „play the channel XY” znajduje kanał, wideo lub listę odtwarzania na YouTube (nie jest potrzebny klucz API), włącza telewizor, jeśli jest wyłączony, i odtwarza go za pomocą pilota YouTube. Gracze są ustawieni w stole w ustawieniach; pierwszy jest używany, gdy żaden gracz nie jest nazwany. Działają również pauza, pomijanie, głośność i „co gra”",
29
+ "uk": "YouTube на телевізорі: «відтворити канал XY» знаходить канал, відео або список відтворення на YouTube (ключ API не потрібен), вмикає телевізор, якщо він вимкнений, і відтворює його через адаптер youtube-дистанційного керування. Гравці встановлюються в таблиці в налаштуваннях; перший використовується, коли жодного гравця не названо. Пауза, пропуск, гучність і «що грає» теж працюють",
30
+ "zh-cn": "电视上的YouTube:“播放 XY 频道” 可在YouTube上找到该频道、视频或播放列表(无需API密钥),如果电视已关闭,则将其打开,然后通过YouTube远程适配器播放。玩家在设置中的表格中设置;当没有指定玩家时,使用第一个玩家。暂停、跳过、音量和 “正在播放的内容” 也起作用"
31
+ },
6
32
  "1.0.3": {
7
33
  "en": "The Chat tab now shows every request of the last hours live - from satellites, Telegram, scripts and the chat itself - with the satellite, the detected wake word, which stage answered (rule-based NLU, routine, local LLM, cloud LLM), the tool calls and the state ids that were read and written. How many hours are kept is set in the settings (0 = record nothing)",
8
34
  "de": "Der Chat-Tab zeigt jetzt alle Anfragen der letzten Stunden live — von Satelliten, Telegram, Skripten und dem Chat selbst — mit Satellit, erkanntem Weckwort, Antwort (regelbasiertes NLU, Routine, lokales LLM, Cloud-LLM), Toolaufrufen und gelesenen und geschriebenen Status-IDs. Wie viele Stunden gelten, ist vorgegeben (0 = nichts aufnehmen)",
@@ -67,19 +93,6 @@
67
93
  "pl": "Poprawione dane uwierzytelniające",
68
94
  "uk": "Виправлені облікові дані",
69
95
  "zh-cn": "更正后的凭证"
70
- },
71
- "0.1.2": {
72
- "en": "Initial commit",
73
- "de": "Erster Commit",
74
- "ru": "Первоначальный коммит",
75
- "pt": "Confirmação inicial",
76
- "nl": "Eerste commit",
77
- "fr": "Engagement initial",
78
- "it": "Inizial impegnato",
79
- "es": "Compromiso inicial",
80
- "pl": "Początkowe zatwierdzenie",
81
- "uk": "Початковий коміт",
82
- "zh-cn": "初始提交"
83
96
  }
84
97
  },
85
98
  "titleLang": {
@@ -191,6 +204,7 @@
191
204
  "notifyRephrase": true,
192
205
  "weatherInstance": "",
193
206
  "presence": [],
207
+ "youtubePlayers": [],
194
208
  "announceTargets": [],
195
209
  "timerAnnounce": true,
196
210
  "alarmAnnounce": true,
@@ -199,6 +213,8 @@
199
213
  "ringSeconds": 60,
200
214
  "useLocalLlm": false,
201
215
  "localLlmModelUrl": "",
216
+ "localLlmFirst": false,
217
+ "localLlmTimeoutSec": 15,
202
218
  "journalHours": 24,
203
219
  "voiceEnabled": false,
204
220
  "udpServerEnabled": false,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.assistant",
3
- "version": "1.0.3",
3
+ "version": "1.2.0",
4
4
  "description": "LLM assistant for ioBroker — ask about and control any state via an LLM with tool-calling",
5
5
  "author": "ioBroker",
6
6
  "license": "MIT",
@@ -18,13 +18,13 @@
18
18
  },
19
19
  "dependencies": {
20
20
  "@2colors/esphome-native-api": "^1.3.6",
21
- "@anthropic-ai/sdk": "^1.2.0",
22
- "@aws-sdk/client-polly": "^3.1156.0",
23
- "@aws-sdk/client-transcribe-streaming": "^3.1156.0",
21
+ "@anthropic-ai/sdk": "^1.3.0",
22
+ "@aws-sdk/client-polly": "^3.1157.0",
23
+ "@aws-sdk/client-transcribe-streaming": "^3.1157.0",
24
24
  "@iobroker/adapter-core": "^3.4.3",
25
- "@iobroker/mcp-server": "^1.4.0",
25
+ "@iobroker/mcp-server": "^1.8.0",
26
26
  "microsoft-cognitiveservices-speech-sdk": "^1.53.0",
27
- "openai": "^7.43.0"
27
+ "openai": "^7.45.0"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@alcalzone/release-script": "^5.2.1",
@@ -1 +0,0 @@
1
- import{n as e}from"./rolldown-runtime-COiEfhsA.js";import{v as t}from"./_virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__201375093093590__loadShare___mf_0_emotion_mf_1_react__loadShare__.js-BkH7fzDw.js";import{$t as n,Dn as r,Dt as i,En as a,Fn as o,Ht as s,I as c,In as l,It as u,Jn as d,Jt as f,Kt as p,Lt as ee,Mn as m,Mt as te,O as ne,Qt as h,R as re,Sn as ie,Vn as g,W as ae,Wn as oe,Xr as _,Xt as v,Yr as y,Yt as se,Zt as ce,_n as b,an as x,cn as S,ct as le,d as ue,f as de,fn as fe,jr as C,k as pe,lt as me,mn as w,nn as T,on as E,p as D,pn as O,qn as k,un as A,vn as j,xn as M,yn as N,yt as he}from"./_virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__201375093093590__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-BMuLYe6f.js";import{t as P}from"./_virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__201375093093590__loadShare__shared-BxjZmnpc.js";var F=e({custom_assistant_Announcement:()=>I,custom_assistant_Cancel:()=>L,custom_assistant_Chat:()=>R,custom_assistant_Close:()=>z,custom_assistant_Delete:()=>B,custom_assistant_Host:()=>V,custom_assistant_Room:()=>ge,custom_assistant_Routine:()=>_e,custom_assistant_Satellite:()=>ve,custom_assistant_Satellites:()=>ye,custom_assistant_Script:()=>be,custom_assistant_Source:()=>xe,custom_assistant_Speak:()=>Se,custom_assistant_State:()=>Ce,custom_assistant_Status:()=>we,custom_assistant_auto:()=>Te,custom_assistant_device:()=>Ee,custom_assistant_filter:()=>De,custom_assistant_hint:()=>Oe,custom_assistant_llm_downloading:()=>ke,custom_assistant_llm_error:()=>Ae,custom_assistant_llm_idle:()=>je,custom_assistant_llm_installing:()=>Me,custom_assistant_llm_loading:()=>Ne,custom_assistant_llm_ready:()=>Pe,custom_assistant_offline:()=>Fe,custom_assistant_online:()=>Ie,custom_assistant_read:()=>Le,custom_assistant_room:()=>Re,custom_assistant_sat_idle:()=>ze,custom_assistant_sat_listening:()=>Be,custom_assistant_sat_offline:()=>Ve,custom_assistant_sat_processing:()=>He,custom_assistant_sat_speaking:()=>Ue,custom_assistant_type:()=>`Typ`,custom_assistant_wake_word_hint:()=>We,custom_assistant_write:()=>Ge,default:()=>Ke}),I=`Ansage`,L=`Abbrechen`,R=`Chat`,z=`Schließen`,B=`Löschen`,V=`Host`,ge=`Raum`,_e=`Routine`,ve=`Satellit`,ye=`Satelliten`,be=`Skript`,xe=`Quelle`,Se=`Sprechen`,Ce=`State`,we=`Status`,Te=`automatisch`,Ee=`Gerät`,De=`Filter`,Oe=`Deaktivieren Sie die Leseberechtigung, um ein Gerät vor dem Assistenten auszublenden, oder die Schreibberechtigung, um es schreibgeschützt zu halten (z. B. bei Sperren). Geräte sind standardmäßig vollständig zugelassen.`,ke=`Modell wird geladen …`,Ae=`Fehler`,je=`inaktiv`,Me=`Engine wird installiert …`,Ne=`lädt …`,Pe=`bereit`,Fe=`offline`,Ie=`online`,Le=`Lesen`,Re=`Zimmer`,ze=`inaktiv`,Be=`hört zu`,Ve=`offline`,He=`verarbeitet`,Ue=`spricht`,We=`Das Wake-Word läuft auf dem Gerät. Mit der Maus über ein Wort siehst du die trainierten Sprachen — die meisten können nur Englisch.`,Ge=`Schreiben`,Ke={"custom_assistant_%s of %s active":`%s von %s aktiv`,"custom_assistant_(no spoken answer)":`(keine gesprochene Antwort)`,"custom_assistant_All sources":`Alle Quellen`,custom_assistant_Announcement:I,custom_assistant_Cancel:L,custom_assistant_Chat:R,"custom_assistant_Clear chat":`Chat leeren`,custom_assistant_Close:z,"custom_assistant_Cloud LLM":`Cloud-LLM`,custom_assistant_Delete:B,"custom_assistant_Delete the recorded history of all sources?":`Den aufgezeichneten Verlauf aller Quellen löschen?`,"custom_assistant_Device cache cleared.":`Gerätecache geleert.`,"custom_assistant_Device settings":`Geräte-Einstellungen`,"custom_assistant_Hide disabled":`Deaktivierte ausblenden`,"custom_assistant_Hide processing details":`Verarbeitungsdetails ausblenden`,custom_assistant_Host:V,"custom_assistant_Last seen":`Zuletzt gesehen`,"custom_assistant_Listening…":`Höre zu …`,"custom_assistant_Local LLM":`Lokales LLM`,"custom_assistant_Local model":`Lokales Modell`,"custom_assistant_Mic re-opened without wake word":`Mikrofon ohne Wake-Word wieder geöffnet (Nachfrage oder Rückfrage)`,"custom_assistant_Name language: %s":`Namens-Sprache: %s`,"custom_assistant_No devices detected. Assign states to rooms and functions in ioBroker.":`Es wurden keine Geräte erkannt. Weisen Sie Räumen und Funktionen in ioBroker Zustände zu.`,"custom_assistant_No messages yet. Type a question below.":`Noch keine Nachrichten. Geben Sie unten eine Frage ein.`,"custom_assistant_No satellites registered yet.":`Noch keine Satelliten registriert.`,"custom_assistant_Not understood":`Nicht verstanden`,"custom_assistant_Per-device permissions":`Gerätespezifische Berechtigungen`,"custom_assistant_Play answer (backend TTS)":`Antwort abspielen (Backend-TTS)`,"custom_assistant_Read answers aloud":`Antworten vorlesen`,"custom_assistant_Refresh device cache":`Gerätecache aktualisieren`,"custom_assistant_Reply to a question":`Antwort auf Rückfrage`,custom_assistant_Room:ge,custom_assistant_Routine:_e,"custom_assistant_Rule-based NLU":`Regel-NLU (lokal)`,custom_assistant_Satellite:ve,custom_assistant_Satellites:ye,"custom_assistant_Save the configuration (the instance will restart) before chatting.":`Speichern Sie die Konfiguration (die Instanz startet neu), bevor Sie chatten.`,custom_assistant_Script:be,"custom_assistant_Send announcement":`Ansage senden`,"custom_assistant_Settings for %s":`Einstellungen für %s`,"custom_assistant_Show processing details":`Verarbeitungsdetails anzeigen`,"custom_assistant_Shows all requests live: satellites, Telegram, scripts and this chat.":`Zeigt alle Anfragen live: Satelliten, Telegram, Skripte und diesen Chat.`,custom_assistant_Source:xe,custom_assistant_Speak:Se,"custom_assistant_Speak on all satellites":`Auf allen Satelliten ansagen`,"custom_assistant_Speech recognition time":`Dauer der Spracherkennung`,"custom_assistant_Start the assistant instance to chat.":`Starten Sie die Assistenteninstanz, um zu chatten.`,"custom_assistant_Start the assistant instance to load the device list.":`Starten Sie die Assistenteninstanz, um die Geräteliste zu laden.`,custom_assistant_State:Ce,custom_assistant_Status:we,"custom_assistant_Stop listening":`Zuhören beenden`,"custom_assistant_Stop reading answers aloud":`Vorlesen beenden`,"custom_assistant_Stop word":`Stopp-Wort`,"custom_assistant_Test chat":`Test-Chat`,"custom_assistant_Thinking…":`Denkt nach …`,"custom_assistant_This satellite exposes no settings.":`Dieser Satellit bietet keine Einstellungen.`,"custom_assistant_Translate all missing (%s)":`Alle fehlenden übersetzen (%s)`,"custom_assistant_Translate name into %s":`Namen nach %s übersetzen`,"custom_assistant_Type a message…":`Nachricht eingeben …`,"custom_assistant_Wake word":`Wake-Word`,"custom_assistant_Wake words":`Wake-Words`,custom_assistant_auto:Te,"custom_assistant_change it on the Voice tab":`im Voice-Tab umschalten`,custom_assistant_device:Ee,custom_assistant_filter:De,"custom_assistant_follow-up":`Nachfrage`,custom_assistant_hint:Oe,custom_assistant_llm_downloading:ke,custom_assistant_llm_error:Ae,custom_assistant_llm_idle:je,custom_assistant_llm_installing:Me,custom_assistant_llm_loading:Ne,"custom_assistant_llm_not installed":`nicht installiert`,custom_assistant_llm_ready:Pe,"custom_assistant_no name in %s (showing %s)":`Kein Name in "%s" — angezeigt: "%s"`,custom_assistant_offline:Fe,custom_assistant_online:Ie,custom_assistant_read:Le,custom_assistant_room:Re,custom_assistant_sat_idle:ze,custom_assistant_sat_listening:Be,custom_assistant_sat_offline:Ve,custom_assistant_sat_processing:He,custom_assistant_sat_speaking:Ue,custom_assistant_type:`Typ`,"custom_assistant_waits for reply":`wartet auf Antwort`,custom_assistant_wake_word_hint:We,custom_assistant_write:Ge},H=e({custom_assistant_Announcement:()=>qe,custom_assistant_Cancel:()=>Je,custom_assistant_Chat:()=>Ye,custom_assistant_Close:()=>Xe,custom_assistant_Delete:()=>Ze,custom_assistant_Host:()=>Qe,custom_assistant_Room:()=>$e,custom_assistant_Routine:()=>et,custom_assistant_Satellite:()=>tt,custom_assistant_Satellites:()=>nt,custom_assistant_Script:()=>rt,custom_assistant_Source:()=>it,custom_assistant_Speak:()=>at,custom_assistant_State:()=>ot,custom_assistant_Status:()=>st,custom_assistant_auto:()=>ct,custom_assistant_device:()=>lt,custom_assistant_filter:()=>ut,custom_assistant_hint:()=>dt,custom_assistant_llm_downloading:()=>ft,custom_assistant_llm_error:()=>pt,custom_assistant_llm_idle:()=>mt,custom_assistant_llm_installing:()=>ht,custom_assistant_llm_loading:()=>gt,custom_assistant_llm_ready:()=>_t,custom_assistant_offline:()=>vt,custom_assistant_online:()=>yt,custom_assistant_read:()=>bt,custom_assistant_room:()=>xt,custom_assistant_sat_idle:()=>St,custom_assistant_sat_listening:()=>Ct,custom_assistant_sat_offline:()=>wt,custom_assistant_sat_processing:()=>Tt,custom_assistant_sat_speaking:()=>Et,custom_assistant_type:()=>Dt,custom_assistant_wake_word_hint:()=>Ot,custom_assistant_write:()=>kt,default:()=>At}),qe=`Announcement`,Je=`Cancel`,Ye=`Chat`,Xe=`Close`,Ze=`Delete`,Qe=`Host`,$e=`Room`,et=`Routine`,tt=`Satellite`,nt=`Satellites`,rt=`Script`,it=`Source`,at=`Speak`,ot=`State`,st=`Status`,ct=`auto`,lt=`Device`,ut=`Filter`,dt=`Uncheck read to hide a device from the assistant, or uncheck write to keep it read-only (e.g. locks). Devices default to fully allowed.`,ft=`downloading model…`,pt=`error`,mt=`idle`,ht=`installing engine…`,gt=`loading…`,_t=`ready`,vt=`offline`,yt=`online`,bt=`Read`,xt=`Room`,St=`idle`,Ct=`listening`,wt=`offline`,Tt=`processing`,Et=`speaking`,Dt=`Type`,Ot=`The wake word runs on the device. Hover a word to see which languages it was trained on — most are English only.`,kt=`Write`,At={"custom_assistant_%s of %s active":`%s of %s active`,"custom_assistant_(no spoken answer)":`(no spoken answer)`,"custom_assistant_All sources":`All sources`,custom_assistant_Announcement:qe,custom_assistant_Cancel:Je,custom_assistant_Chat:Ye,"custom_assistant_Clear chat":`Clear chat`,custom_assistant_Close:Xe,"custom_assistant_Cloud LLM":`Cloud LLM`,custom_assistant_Delete:Ze,"custom_assistant_Delete the recorded history of all sources?":`Delete the recorded history of all sources?`,"custom_assistant_Device cache cleared.":`Device cache cleared.`,"custom_assistant_Device settings":`Device settings`,"custom_assistant_Hide disabled":`Hide disabled`,"custom_assistant_Hide processing details":`Hide processing details`,custom_assistant_Host:Qe,"custom_assistant_Last seen":`Last seen`,"custom_assistant_Listening…":`Listening…`,"custom_assistant_Local LLM":`Local LLM`,"custom_assistant_Local model":`Local model`,"custom_assistant_Mic re-opened without wake word":`Mic re-opened without wake word (follow-up or question)`,"custom_assistant_Name language: %s":`Name language: %s`,"custom_assistant_No devices detected. Assign states to rooms and functions in ioBroker.":`No devices detected. Assign states to rooms and functions in ioBroker.`,"custom_assistant_No messages yet. Type a question below.":`No messages yet. Type a question below.`,"custom_assistant_No satellites registered yet.":`No satellites registered yet.`,"custom_assistant_Not understood":`Not understood`,"custom_assistant_Per-device permissions":`Per-device permissions`,"custom_assistant_Play answer (backend TTS)":`Play answer (backend TTS)`,"custom_assistant_Read answers aloud":`Read answers aloud`,"custom_assistant_Refresh device cache":`Refresh device cache`,"custom_assistant_Reply to a question":`Reply to a question`,custom_assistant_Room:$e,custom_assistant_Routine:et,"custom_assistant_Rule-based NLU":`Rule-based NLU (local)`,custom_assistant_Satellite:tt,custom_assistant_Satellites:nt,"custom_assistant_Save the configuration (the instance will restart) before chatting.":`Save the configuration (the instance will restart) before chatting.`,custom_assistant_Script:rt,"custom_assistant_Send announcement":`Send announcement`,"custom_assistant_Settings for %s":`Settings for %s`,"custom_assistant_Show processing details":`Show processing details`,"custom_assistant_Shows all requests live: satellites, Telegram, scripts and this chat.":`Shows all requests live: satellites, Telegram, scripts and this chat.`,custom_assistant_Source:it,custom_assistant_Speak:at,"custom_assistant_Speak on all satellites":`Speak on all satellites`,"custom_assistant_Speech recognition time":`Speech recognition time`,"custom_assistant_Start the assistant instance to chat.":`Start the assistant instance to chat.`,"custom_assistant_Start the assistant instance to load the device list.":`Start the assistant instance to load the device list.`,custom_assistant_State:ot,custom_assistant_Status:st,"custom_assistant_Stop listening":`Stop listening`,"custom_assistant_Stop reading answers aloud":`Stop reading answers aloud`,"custom_assistant_Stop word":`Stop word`,"custom_assistant_Test chat":`Test chat`,"custom_assistant_Thinking…":`Thinking…`,"custom_assistant_This satellite exposes no settings.":`This satellite exposes no settings.`,"custom_assistant_Translate all missing (%s)":`Translate all missing (%s)`,"custom_assistant_Translate name into %s":`Translate name into %s`,"custom_assistant_Type a message…":`Type a message…`,"custom_assistant_Wake word":`Wake word`,"custom_assistant_Wake words":`Wake words`,custom_assistant_auto:ct,"custom_assistant_change it on the Voice tab":`change it on the Voice tab`,custom_assistant_device:lt,custom_assistant_filter:ut,"custom_assistant_follow-up":`follow-up`,custom_assistant_hint:dt,custom_assistant_llm_downloading:ft,custom_assistant_llm_error:pt,custom_assistant_llm_idle:mt,custom_assistant_llm_installing:ht,custom_assistant_llm_loading:gt,"custom_assistant_llm_not installed":`not installed`,custom_assistant_llm_ready:_t,"custom_assistant_no name in %s (showing %s)":`No name in "%s" — showing "%s"`,custom_assistant_offline:vt,custom_assistant_online:yt,custom_assistant_read:bt,custom_assistant_room:xt,custom_assistant_sat_idle:St,custom_assistant_sat_listening:Ct,custom_assistant_sat_offline:wt,custom_assistant_sat_processing:Tt,custom_assistant_sat_speaking:Et,custom_assistant_type:Dt,"custom_assistant_waits for reply":`waits for reply`,custom_assistant_wake_word_hint:Ot,custom_assistant_write:kt},U=e({custom_assistant_Announcement:()=>jt,custom_assistant_Cancel:()=>Mt,custom_assistant_Chat:()=>Nt,custom_assistant_Close:()=>Pt,custom_assistant_Delete:()=>Ft,custom_assistant_Host:()=>It,custom_assistant_Room:()=>Lt,custom_assistant_Routine:()=>Rt,custom_assistant_Satellite:()=>zt,custom_assistant_Satellites:()=>Bt,custom_assistant_Script:()=>Vt,custom_assistant_Source:()=>Ht,custom_assistant_Speak:()=>Ut,custom_assistant_State:()=>Wt,custom_assistant_Status:()=>Gt,custom_assistant_auto:()=>Kt,custom_assistant_device:()=>qt,custom_assistant_filter:()=>Jt,custom_assistant_hint:()=>Yt,custom_assistant_llm_downloading:()=>Xt,custom_assistant_llm_error:()=>Zt,custom_assistant_llm_idle:()=>Qt,custom_assistant_llm_installing:()=>$t,custom_assistant_llm_loading:()=>en,custom_assistant_llm_ready:()=>tn,custom_assistant_offline:()=>nn,custom_assistant_online:()=>rn,custom_assistant_read:()=>an,custom_assistant_room:()=>on,custom_assistant_sat_idle:()=>sn,custom_assistant_sat_listening:()=>cn,custom_assistant_sat_offline:()=>ln,custom_assistant_sat_processing:()=>un,custom_assistant_sat_speaking:()=>dn,custom_assistant_type:()=>fn,custom_assistant_wake_word_hint:()=>pn,custom_assistant_write:()=>mn,default:()=>hn}),jt=`Anuncio`,Mt=`Cancel`,Nt=`Chat`,Pt=`Close`,Ft=`Delete`,It=`Anfitrión`,Lt=`Room`,Rt=`Routine`,zt=`Satélite`,Bt=`satélites`,Vt=`Script`,Ht=`Source`,Ut=`Hablar`,Wt=`State`,Gt=`Estado`,Kt=`auto`,qt=`Dispositivo`,Jt=`Filtrar`,Yt=`Desactive la opción de lectura para ocultar un dispositivo al asistente, o desactive la opción de escritura para mantenerlo en modo de solo lectura (por ejemplo, candados). Los dispositivos vienen configurados por defecto con acceso completo.`,Xt=`Descargando modelo…`,Zt=`error`,Qt=`inactivo`,$t=`instalando el motor…`,en=`cargando…`,tn=`listo`,nn=`desconectado`,rn=`en línea`,an=`Leer`,on=`Habitación`,sn=`inactivo`,cn=`escuchando`,ln=`desconectado`,un=`tratamiento`,dn=`discurso`,fn=`Tipo`,pn=`La palabra de activación se procesa en el dispositivo. Pasa el ratón sobre una palabra para ver en qué idiomas se entrenó — la mayoría solo en inglés.`,mn=`Escribir`,hn={"custom_assistant_%s of %s active":`%s of %s active`,"custom_assistant_(no spoken answer)":`(no spoken answer)`,"custom_assistant_All sources":`All sources`,custom_assistant_Announcement:jt,custom_assistant_Cancel:Mt,custom_assistant_Chat:Nt,"custom_assistant_Clear chat":`Chat claro`,custom_assistant_Close:Pt,"custom_assistant_Cloud LLM":`Cloud LLM`,custom_assistant_Delete:Ft,"custom_assistant_Delete the recorded history of all sources?":`Delete the recorded history of all sources?`,"custom_assistant_Device cache cleared.":`Se ha borrado la caché del dispositivo.`,"custom_assistant_Device settings":`Device settings`,"custom_assistant_Hide disabled":`Ocultar deshabilitado`,"custom_assistant_Hide processing details":`Hide processing details`,custom_assistant_Host:It,"custom_assistant_Last seen":`Última vez visto`,"custom_assistant_Listening…":`Escuchando…`,"custom_assistant_Local LLM":`Local LLM`,"custom_assistant_Local model":`Modelo local`,"custom_assistant_Mic re-opened without wake word":`Mic re-opened without wake word (follow-up or question)`,"custom_assistant_Name language: %s":`Idioma del nombre: %s`,"custom_assistant_No devices detected. Assign states to rooms and functions in ioBroker.":`No se detectaron dispositivos. Asigne estados a las salas y funciones en ioBroker.`,"custom_assistant_No messages yet. Type a question below.":`Aún no hay mensajes. Escribe tu pregunta a continuación.`,"custom_assistant_No satellites registered yet.":`Aún no se han registrado satélites.`,"custom_assistant_Not understood":`Not understood`,"custom_assistant_Per-device permissions":`Permisos por dispositivo`,"custom_assistant_Play answer (backend TTS)":`Reproducir respuesta (TTS de backend)`,"custom_assistant_Read answers aloud":`Lee las respuestas en voz alta.`,"custom_assistant_Refresh device cache":`Actualizar la caché del dispositivo`,"custom_assistant_Reply to a question":`Reply to a question`,custom_assistant_Room:Lt,custom_assistant_Routine:Rt,"custom_assistant_Rule-based NLU":`Rule-based NLU (local)`,custom_assistant_Satellite:zt,custom_assistant_Satellites:Bt,"custom_assistant_Save the configuration (the instance will restart) before chatting.":`Guarda la configuración (la instancia se reiniciará) antes de chatear.`,custom_assistant_Script:Vt,"custom_assistant_Send announcement":`Enviar anuncio`,"custom_assistant_Settings for %s":`Settings for %s`,"custom_assistant_Show processing details":`Show processing details`,"custom_assistant_Shows all requests live: satellites, Telegram, scripts and this chat.":`Shows all requests live: satellites, Telegram, scripts and this chat.`,custom_assistant_Source:Ht,custom_assistant_Speak:Ut,"custom_assistant_Speak on all satellites":`Hablar por todos los satélites`,"custom_assistant_Speech recognition time":`Speech recognition time`,"custom_assistant_Start the assistant instance to chat.":`Inicia la instancia del asistente para chatear.`,"custom_assistant_Start the assistant instance to load the device list.":`Inicie la instancia del asistente para cargar la lista de dispositivos.`,custom_assistant_State:Wt,custom_assistant_Status:Gt,"custom_assistant_Stop listening":`Deja de escuchar`,"custom_assistant_Stop reading answers aloud":`Deja de leer las respuestas en voz alta.`,"custom_assistant_Stop word":`Stop word`,"custom_assistant_Test chat":`Chat de prueba`,"custom_assistant_Thinking…":`Pensamiento…`,"custom_assistant_This satellite exposes no settings.":`This satellite exposes no settings.`,"custom_assistant_Translate all missing (%s)":`Traducir todos los (%s) faltantes`,"custom_assistant_Translate name into %s":`Traducir nombre a %s`,"custom_assistant_Type a message…":`Escribe un mensaje…`,"custom_assistant_Wake word":`Wake word`,"custom_assistant_Wake words":`Wake words`,custom_assistant_auto:Kt,"custom_assistant_change it on the Voice tab":`Cámbialo en la pestaña Voz.`,custom_assistant_device:qt,custom_assistant_filter:Jt,"custom_assistant_follow-up":`follow-up`,custom_assistant_hint:Yt,custom_assistant_llm_downloading:Xt,custom_assistant_llm_error:Zt,custom_assistant_llm_idle:Qt,custom_assistant_llm_installing:$t,custom_assistant_llm_loading:en,"custom_assistant_llm_not installed":`no instalado`,custom_assistant_llm_ready:tn,"custom_assistant_no name in %s (showing %s)":`No se encontró ningún nombre en "%s" — se muestra "%s"`,custom_assistant_offline:nn,custom_assistant_online:rn,custom_assistant_read:an,custom_assistant_room:on,custom_assistant_sat_idle:sn,custom_assistant_sat_listening:cn,custom_assistant_sat_offline:ln,custom_assistant_sat_processing:un,custom_assistant_sat_speaking:dn,custom_assistant_type:fn,"custom_assistant_waits for reply":`waits for reply`,custom_assistant_wake_word_hint:pn,custom_assistant_write:mn},W=e({custom_assistant_Announcement:()=>gn,custom_assistant_Cancel:()=>_n,custom_assistant_Chat:()=>vn,custom_assistant_Close:()=>yn,custom_assistant_Delete:()=>bn,custom_assistant_Host:()=>xn,custom_assistant_Room:()=>Sn,custom_assistant_Routine:()=>Cn,custom_assistant_Satellite:()=>wn,custom_assistant_Satellites:()=>Tn,custom_assistant_Script:()=>En,custom_assistant_Source:()=>Dn,custom_assistant_Speak:()=>On,custom_assistant_State:()=>kn,custom_assistant_Status:()=>An,custom_assistant_auto:()=>jn,custom_assistant_device:()=>Mn,custom_assistant_filter:()=>Nn,custom_assistant_hint:()=>Pn,custom_assistant_llm_downloading:()=>Fn,custom_assistant_llm_error:()=>In,custom_assistant_llm_idle:()=>Ln,custom_assistant_llm_installing:()=>Rn,custom_assistant_llm_loading:()=>zn,custom_assistant_llm_ready:()=>Bn,custom_assistant_offline:()=>Vn,custom_assistant_online:()=>Hn,custom_assistant_read:()=>Un,custom_assistant_room:()=>Wn,custom_assistant_sat_idle:()=>Gn,custom_assistant_sat_listening:()=>Kn,custom_assistant_sat_offline:()=>qn,custom_assistant_sat_processing:()=>Jn,custom_assistant_sat_speaking:()=>Yn,custom_assistant_type:()=>Xn,custom_assistant_wake_word_hint:()=>Zn,custom_assistant_write:()=>Qn,default:()=>$n}),gn=`Annonce`,_n=`Cancel`,vn=`Chat`,yn=`Close`,bn=`Delete`,xn=`Hôte`,Sn=`Room`,Cn=`Routine`,wn=`Satellite`,Tn=`Satellites`,En=`Script`,Dn=`Source`,On=`Parler`,kn=`State`,An=`Statut`,jn=`auto`,Mn=`Appareil`,Nn=`Filtre`,Pn=`Décochez l'option «\xA0Lecture\xA0» pour masquer un périphérique à l'assistant, ou décochez l'option «\xA0Écriture\xA0» pour le rendre accessible en lecture seule (par exemple, les verrous). Par défaut, tous les périphériques sont autorisés.`,Fn=`téléchargement du modèle…`,In=`erreur`,Ln=`inactif`,Rn=`installation du moteur…`,zn=`chargement…`,Bn=`prêt`,Vn=`hors ligne`,Hn=`en ligne`,Un=`Lire`,Wn=`Chambre`,Gn=`inactif`,Kn=`écoute`,qn=`hors ligne`,Jn=`traitement`,Yn=`Parlant`,Xn=`Taper`,Zn=`Le mot d'activation s'exécute sur l'appareil. Survolez un mot pour voir dans quelles langues il a été entraîné — la plupart uniquement en anglais.`,Qn=`Écrire`,$n={"custom_assistant_%s of %s active":`%s of %s active`,"custom_assistant_(no spoken answer)":`(no spoken answer)`,"custom_assistant_All sources":`All sources`,custom_assistant_Announcement:gn,custom_assistant_Cancel:_n,custom_assistant_Chat:vn,"custom_assistant_Clear chat":`Discussion claire`,custom_assistant_Close:yn,"custom_assistant_Cloud LLM":`Cloud LLM`,custom_assistant_Delete:bn,"custom_assistant_Delete the recorded history of all sources?":`Delete the recorded history of all sources?`,"custom_assistant_Device cache cleared.":`Cache du périphérique effacé.`,"custom_assistant_Device settings":`Device settings`,"custom_assistant_Hide disabled":`Masquer les fonctions désactivées`,"custom_assistant_Hide processing details":`Hide processing details`,custom_assistant_Host:xn,"custom_assistant_Last seen":`Dernière observation`,"custom_assistant_Listening…":`Écoute…`,"custom_assistant_Local LLM":`Local LLM`,"custom_assistant_Local model":`Modèle local`,"custom_assistant_Mic re-opened without wake word":`Mic re-opened without wake word (follow-up or question)`,"custom_assistant_Name language: %s":`Langue du nom\xA0: %s`,"custom_assistant_No devices detected. Assign states to rooms and functions in ioBroker.":`Aucun appareil détecté. Attribuez des états aux salles et aux fonctions dans ioBroker.`,"custom_assistant_No messages yet. Type a question below.":`Aucun message pour l'instant. Posez votre question ci-dessous.`,"custom_assistant_No satellites registered yet.":`Aucun satellite enregistré pour le moment.`,"custom_assistant_Not understood":`Not understood`,"custom_assistant_Per-device permissions":`Autorisations par appareil`,"custom_assistant_Play answer (backend TTS)":`Réponse de lecture (TTS backend)`,"custom_assistant_Read answers aloud":`Lisez les réponses à voix haute`,"custom_assistant_Refresh device cache":`Actualiser le cache de l'appareil`,"custom_assistant_Reply to a question":`Reply to a question`,custom_assistant_Room:Sn,custom_assistant_Routine:Cn,"custom_assistant_Rule-based NLU":`Rule-based NLU (local)`,custom_assistant_Satellite:wn,custom_assistant_Satellites:Tn,"custom_assistant_Save the configuration (the instance will restart) before chatting.":`Enregistrez la configuration (l'instance redémarrera) avant de discuter.`,custom_assistant_Script:En,"custom_assistant_Send announcement":`Envoyer l'annonce`,"custom_assistant_Settings for %s":`Settings for %s`,"custom_assistant_Show processing details":`Show processing details`,"custom_assistant_Shows all requests live: satellites, Telegram, scripts and this chat.":`Shows all requests live: satellites, Telegram, scripts and this chat.`,custom_assistant_Source:Dn,custom_assistant_Speak:On,"custom_assistant_Speak on all satellites":`Parlez sur tous les satellites`,"custom_assistant_Speech recognition time":`Speech recognition time`,"custom_assistant_Start the assistant instance to chat.":`Démarrez l'instance de l'assistant pour discuter.`,"custom_assistant_Start the assistant instance to load the device list.":`Démarrez l'instance de l'assistant pour charger la liste des périphériques.`,custom_assistant_State:kn,custom_assistant_Status:An,"custom_assistant_Stop listening":`Arrêtez d'écouter`,"custom_assistant_Stop reading answers aloud":`Arrêtez de lire les réponses à voix haute`,"custom_assistant_Stop word":`Stop word`,"custom_assistant_Test chat":`Chat de test`,"custom_assistant_Thinking…":`Pensée…`,"custom_assistant_This satellite exposes no settings.":`This satellite exposes no settings.`,"custom_assistant_Translate all missing (%s)":`Traduire tout ce qui est manquant (%s)`,"custom_assistant_Translate name into %s":`Traduire le nom en %s`,"custom_assistant_Type a message…":`Saisissez un message…`,"custom_assistant_Wake word":`Wake word`,"custom_assistant_Wake words":`Wake words`,custom_assistant_auto:jn,"custom_assistant_change it on the Voice tab":`modifiez-le dans l'onglet Voix`,custom_assistant_device:Mn,custom_assistant_filter:Nn,"custom_assistant_follow-up":`follow-up`,custom_assistant_hint:Pn,custom_assistant_llm_downloading:Fn,custom_assistant_llm_error:In,custom_assistant_llm_idle:Ln,custom_assistant_llm_installing:Rn,custom_assistant_llm_loading:zn,"custom_assistant_llm_not installed":`non installé`,custom_assistant_llm_ready:Bn,"custom_assistant_no name in %s (showing %s)":`Aucun nom dans « %s » — affichage de « %s »`,custom_assistant_offline:Vn,custom_assistant_online:Hn,custom_assistant_read:Un,custom_assistant_room:Wn,custom_assistant_sat_idle:Gn,custom_assistant_sat_listening:Kn,custom_assistant_sat_offline:qn,custom_assistant_sat_processing:Jn,custom_assistant_sat_speaking:Yn,custom_assistant_type:Xn,"custom_assistant_waits for reply":`waits for reply`,custom_assistant_wake_word_hint:Zn,custom_assistant_write:Qn},G=e({custom_assistant_Announcement:()=>er,custom_assistant_Cancel:()=>tr,custom_assistant_Chat:()=>nr,custom_assistant_Close:()=>rr,custom_assistant_Delete:()=>ir,custom_assistant_Host:()=>ar,custom_assistant_Room:()=>or,custom_assistant_Routine:()=>sr,custom_assistant_Satellite:()=>cr,custom_assistant_Satellites:()=>lr,custom_assistant_Script:()=>ur,custom_assistant_Source:()=>dr,custom_assistant_Speak:()=>fr,custom_assistant_State:()=>pr,custom_assistant_Status:()=>mr,custom_assistant_auto:()=>hr,custom_assistant_device:()=>gr,custom_assistant_filter:()=>_r,custom_assistant_hint:()=>vr,custom_assistant_llm_downloading:()=>yr,custom_assistant_llm_error:()=>br,custom_assistant_llm_idle:()=>xr,custom_assistant_llm_installing:()=>Sr,custom_assistant_llm_loading:()=>Cr,custom_assistant_llm_ready:()=>wr,custom_assistant_offline:()=>Tr,custom_assistant_online:()=>Er,custom_assistant_read:()=>Dr,custom_assistant_room:()=>Or,custom_assistant_sat_idle:()=>kr,custom_assistant_sat_listening:()=>Ar,custom_assistant_sat_offline:()=>jr,custom_assistant_sat_processing:()=>Mr,custom_assistant_sat_speaking:()=>Nr,custom_assistant_type:()=>Pr,custom_assistant_wake_word_hint:()=>Fr,custom_assistant_write:()=>Ir,default:()=>Lr}),er=`Annuncio`,tr=`Cancel`,nr=`Chat`,rr=`Close`,ir=`Delete`,ar=`Ospite`,or=`Room`,sr=`Routine`,cr=`Satellitare`,lr=`Satelliti`,ur=`Script`,dr=`Source`,fr=`Parlare`,pr=`State`,mr=`Stato`,hr=`auto`,gr=`Dispositivo`,_r=`Filtro`,vr=`Deseleziona "Lettura" per nascondere un dispositivo all'assistente, oppure deseleziona "Scrittura" per mantenerlo in sola lettura (ad esempio, per bloccare le serrature). Per impostazione predefinita, i dispositivi sono completamente accessibili.`,yr=`modello di download…`,br=`errore`,xr=`oziare`,Sr=`installazione del motore…`,Cr=`caricamento…`,wr=`pronto`,Tr=`offline`,Er=`online`,Dr=`Leggere`,Or=`Camera`,kr=`oziare`,Ar=`ascolto`,jr=`offline`,Mr=`elaborazione`,Nr=`A proposito di`,Pr=`Tipo`,Fr=`La parola di attivazione viene elaborata sul dispositivo. Passa il mouse su una parola per vedere in quali lingue è stata addestrata — la maggior parte solo in inglese.`,Ir=`Scrivere`,Lr={"custom_assistant_%s of %s active":`%s of %s active`,"custom_assistant_(no spoken answer)":`(no spoken answer)`,"custom_assistant_All sources":`All sources`,custom_assistant_Announcement:er,custom_assistant_Cancel:tr,custom_assistant_Chat:nr,"custom_assistant_Clear chat":`Chat chiara`,custom_assistant_Close:rr,"custom_assistant_Cloud LLM":`Cloud LLM`,custom_assistant_Delete:ir,"custom_assistant_Delete the recorded history of all sources?":`Delete the recorded history of all sources?`,"custom_assistant_Device cache cleared.":`Cache del dispositivo svuotata.`,"custom_assistant_Device settings":`Device settings`,"custom_assistant_Hide disabled":`Nascondi disabilitato`,"custom_assistant_Hide processing details":`Hide processing details`,custom_assistant_Host:ar,"custom_assistant_Last seen":`Ultimo avvistamento`,"custom_assistant_Listening…":`Ascolto…`,"custom_assistant_Local LLM":`Local LLM`,"custom_assistant_Local model":`Modello locale`,"custom_assistant_Mic re-opened without wake word":`Mic re-opened without wake word (follow-up or question)`,"custom_assistant_Name language: %s":`Lingua del nome: %s`,"custom_assistant_No devices detected. Assign states to rooms and functions in ioBroker.":`Nessun dispositivo rilevato. Assegna stati a stanze e funzioni in ioBroker.`,"custom_assistant_No messages yet. Type a question below.":`Nessun messaggio ancora. Scrivi una domanda qui sotto.`,"custom_assistant_No satellites registered yet.":`Nessun satellite ancora registrato.`,"custom_assistant_Not understood":`Not understood`,"custom_assistant_Per-device permissions":`Autorizzazioni per dispositivo`,"custom_assistant_Play answer (backend TTS)":`Riproduci la risposta (TST di backend)`,"custom_assistant_Read answers aloud":`Leggi le risposte ad alta voce`,"custom_assistant_Refresh device cache":`Aggiorna la cache del dispositivo`,"custom_assistant_Reply to a question":`Reply to a question`,custom_assistant_Room:or,custom_assistant_Routine:sr,"custom_assistant_Rule-based NLU":`Rule-based NLU (local)`,custom_assistant_Satellite:cr,custom_assistant_Satellites:lr,"custom_assistant_Save the configuration (the instance will restart) before chatting.":`Salva la configurazione (l'istanza si riavvierà) prima di iniziare la chat.`,custom_assistant_Script:ur,"custom_assistant_Send announcement":`Invia annuncio`,"custom_assistant_Settings for %s":`Settings for %s`,"custom_assistant_Show processing details":`Show processing details`,"custom_assistant_Shows all requests live: satellites, Telegram, scripts and this chat.":`Shows all requests live: satellites, Telegram, scripts and this chat.`,custom_assistant_Source:dr,custom_assistant_Speak:fr,"custom_assistant_Speak on all satellites":`Comunicare su tutti i satelliti`,"custom_assistant_Speech recognition time":`Speech recognition time`,"custom_assistant_Start the assistant instance to chat.":`Avvia l'assistente per chattare.`,"custom_assistant_Start the assistant instance to load the device list.":`Avvia l'istanza dell'assistente per caricare l'elenco dei dispositivi.`,custom_assistant_State:pr,custom_assistant_Status:mr,"custom_assistant_Stop listening":`Smetti di ascoltare`,"custom_assistant_Stop reading answers aloud":`Smetti di leggere le risposte ad alta voce`,"custom_assistant_Stop word":`Stop word`,"custom_assistant_Test chat":`Chat di prova`,"custom_assistant_Thinking…":`Pensiero…`,"custom_assistant_This satellite exposes no settings.":`This satellite exposes no settings.`,"custom_assistant_Translate all missing (%s)":`Traduci tutto ciò che manca (%s)`,"custom_assistant_Translate name into %s":`Traduci il nome in %s`,"custom_assistant_Type a message…":`Digita un messaggio…`,"custom_assistant_Wake word":`Wake word`,"custom_assistant_Wake words":`Wake words`,custom_assistant_auto:hr,"custom_assistant_change it on the Voice tab":`modificalo nella scheda Voce`,custom_assistant_device:gr,custom_assistant_filter:_r,"custom_assistant_follow-up":`follow-up`,custom_assistant_hint:vr,custom_assistant_llm_downloading:yr,custom_assistant_llm_error:br,custom_assistant_llm_idle:xr,custom_assistant_llm_installing:Sr,custom_assistant_llm_loading:Cr,"custom_assistant_llm_not installed":`non installato`,custom_assistant_llm_ready:wr,"custom_assistant_no name in %s (showing %s)":`Nessun nome in "%s" — visualizzazione di "%s"`,custom_assistant_offline:Tr,custom_assistant_online:Er,custom_assistant_read:Dr,custom_assistant_room:Or,custom_assistant_sat_idle:kr,custom_assistant_sat_listening:Ar,custom_assistant_sat_offline:jr,custom_assistant_sat_processing:Mr,custom_assistant_sat_speaking:Nr,custom_assistant_type:Pr,"custom_assistant_waits for reply":`waits for reply`,custom_assistant_wake_word_hint:Fr,custom_assistant_write:Ir},K=e({custom_assistant_Announcement:()=>Rr,custom_assistant_Cancel:()=>zr,custom_assistant_Chat:()=>Br,custom_assistant_Close:()=>Vr,custom_assistant_Delete:()=>Hr,custom_assistant_Host:()=>Ur,custom_assistant_Room:()=>Wr,custom_assistant_Routine:()=>Gr,custom_assistant_Satellite:()=>Kr,custom_assistant_Satellites:()=>qr,custom_assistant_Script:()=>Jr,custom_assistant_Source:()=>Yr,custom_assistant_Speak:()=>Xr,custom_assistant_State:()=>Zr,custom_assistant_Status:()=>Qr,custom_assistant_auto:()=>$r,custom_assistant_device:()=>ei,custom_assistant_filter:()=>ti,custom_assistant_hint:()=>ni,custom_assistant_llm_downloading:()=>ri,custom_assistant_llm_error:()=>ii,custom_assistant_llm_idle:()=>ai,custom_assistant_llm_installing:()=>oi,custom_assistant_llm_loading:()=>si,custom_assistant_llm_ready:()=>ci,custom_assistant_offline:()=>li,custom_assistant_online:()=>ui,custom_assistant_read:()=>di,custom_assistant_room:()=>fi,custom_assistant_sat_idle:()=>pi,custom_assistant_sat_listening:()=>mi,custom_assistant_sat_offline:()=>hi,custom_assistant_sat_processing:()=>gi,custom_assistant_sat_speaking:()=>_i,custom_assistant_type:()=>q,custom_assistant_wake_word_hint:()=>vi,custom_assistant_write:()=>yi,default:()=>bi}),Rr=`Aankondiging`,zr=`Cancel`,Br=`Chat`,Vr=`Close`,Hr=`Delete`,Ur=`Gastheer`,Wr=`Room`,Gr=`Routine`,Kr=`Satelliet`,qr=`Satellieten`,Jr=`Script`,Yr=`Source`,Xr=`Spreken`,Zr=`State`,Qr=`Status`,$r=`auto`,ei=`Apparaat`,ti=`Filter`,ni=`Schakel de optie 'Lezen' uit om een apparaat voor de assistent te verbergen, of schakel de optie 'Schrijven' uit om het apparaat alleen-lezen te houden (bijv. sloten). Apparaten zijn standaard volledig toegestaan.`,ri=`Model downloaden…`,ii=`fout`,ai=`inactief`,oi=`motor installeren…`,si=`laden…`,ci=`klaar`,li=`offline`,ui=`online`,di=`Lezen`,fi=`Kamer`,pi=`inactief`,mi=`luisteren`,hi=`offline`,gi=`verwerking`,_i=`spreken`,q=`Type`,vi=`Het activeringswoord draait op het apparaat. Beweeg de muis over een woord om te zien in welke talen het getraind is — de meeste alleen Engels.`,yi=`Schrijven`,bi={"custom_assistant_%s of %s active":`%s of %s active`,"custom_assistant_(no spoken answer)":`(no spoken answer)`,"custom_assistant_All sources":`All sources`,custom_assistant_Announcement:Rr,custom_assistant_Cancel:zr,custom_assistant_Chat:Br,"custom_assistant_Clear chat":`Duidelijke chat`,custom_assistant_Close:Vr,"custom_assistant_Cloud LLM":`Cloud LLM`,custom_assistant_Delete:Hr,"custom_assistant_Delete the recorded history of all sources?":`Delete the recorded history of all sources?`,"custom_assistant_Device cache cleared.":`Apparaatcache gewist.`,"custom_assistant_Device settings":`Device settings`,"custom_assistant_Hide disabled":`Verberg uitgeschakeld`,"custom_assistant_Hide processing details":`Hide processing details`,custom_assistant_Host:Ur,"custom_assistant_Last seen":`Laatst gezien`,"custom_assistant_Listening…":`Luisteren…`,"custom_assistant_Local LLM":`Local LLM`,"custom_assistant_Local model":`Lokaal model`,"custom_assistant_Mic re-opened without wake word":`Mic re-opened without wake word (follow-up or question)`,"custom_assistant_Name language: %s":`Naamtaal: %s`,"custom_assistant_No devices detected. Assign states to rooms and functions in ioBroker.":`Geen apparaten gedetecteerd. Wijs statussen toe aan kamers en functies in ioBroker.`,"custom_assistant_No messages yet. Type a question below.":`Nog geen berichten. Typ hieronder een vraag.`,"custom_assistant_No satellites registered yet.":`Er zijn nog geen satellieten geregistreerd.`,"custom_assistant_Not understood":`Not understood`,"custom_assistant_Per-device permissions":`Machtigingen per apparaat`,"custom_assistant_Play answer (backend TTS)":`Speel antwoord (backend TTS)`,"custom_assistant_Read answers aloud":`Lees de antwoorden hardop voor.`,"custom_assistant_Refresh device cache":`Vernieuw de apparaatcache.`,"custom_assistant_Reply to a question":`Reply to a question`,custom_assistant_Room:Wr,custom_assistant_Routine:Gr,"custom_assistant_Rule-based NLU":`Rule-based NLU (local)`,custom_assistant_Satellite:Kr,custom_assistant_Satellites:qr,"custom_assistant_Save the configuration (the instance will restart) before chatting.":`Sla de configuratie op (het apparaat zal opnieuw opstarten) voordat je gaat chatten.`,custom_assistant_Script:Jr,"custom_assistant_Send announcement":`Aankondiging verzenden`,"custom_assistant_Settings for %s":`Settings for %s`,"custom_assistant_Show processing details":`Show processing details`,"custom_assistant_Shows all requests live: satellites, Telegram, scripts and this chat.":`Shows all requests live: satellites, Telegram, scripts and this chat.`,custom_assistant_Source:Yr,custom_assistant_Speak:Xr,"custom_assistant_Speak on all satellites":`Communiceer via alle satellieten`,"custom_assistant_Speech recognition time":`Speech recognition time`,"custom_assistant_Start the assistant instance to chat.":`Start de assistent-instantie om te chatten.`,"custom_assistant_Start the assistant instance to load the device list.":`Start de assistent-instantie om de lijst met apparaten te laden.`,custom_assistant_State:Zr,custom_assistant_Status:Qr,"custom_assistant_Stop listening":`Stop met luisteren`,"custom_assistant_Stop reading answers aloud":`Stop met het hardop voorlezen van antwoorden.`,"custom_assistant_Stop word":`Stop word`,"custom_assistant_Test chat":`Testchat`,"custom_assistant_Thinking…":`Aan het nadenken…`,"custom_assistant_This satellite exposes no settings.":`This satellite exposes no settings.`,"custom_assistant_Translate all missing (%s)":`Vertaal alle ontbrekende (%) tekens`,"custom_assistant_Translate name into %s":`Vertaal de naam naar %s`,"custom_assistant_Type a message…":`Typ een bericht…`,"custom_assistant_Wake word":`Wake word`,"custom_assistant_Wake words":`Wake words`,custom_assistant_auto:$r,"custom_assistant_change it on the Voice tab":`Wijzig dit op het tabblad 'Stem'.`,custom_assistant_device:ei,custom_assistant_filter:ti,"custom_assistant_follow-up":`follow-up`,custom_assistant_hint:ni,custom_assistant_llm_downloading:ri,custom_assistant_llm_error:ii,custom_assistant_llm_idle:ai,custom_assistant_llm_installing:oi,custom_assistant_llm_loading:si,"custom_assistant_llm_not installed":`niet geïnstalleerd`,custom_assistant_llm_ready:ci,"custom_assistant_no name in %s (showing %s)":`Geen naam in "%s" — "%s" wordt weergegeven`,custom_assistant_offline:li,custom_assistant_online:ui,custom_assistant_read:di,custom_assistant_room:fi,custom_assistant_sat_idle:pi,custom_assistant_sat_listening:mi,custom_assistant_sat_offline:hi,custom_assistant_sat_processing:gi,custom_assistant_sat_speaking:_i,custom_assistant_type:q,"custom_assistant_waits for reply":`waits for reply`,custom_assistant_wake_word_hint:vi,custom_assistant_write:yi},J=e({custom_assistant_Announcement:()=>xi,custom_assistant_Cancel:()=>Si,custom_assistant_Chat:()=>Ci,custom_assistant_Close:()=>wi,custom_assistant_Delete:()=>Ti,custom_assistant_Host:()=>Ei,custom_assistant_Room:()=>Di,custom_assistant_Routine:()=>Oi,custom_assistant_Satellite:()=>ki,custom_assistant_Satellites:()=>Ai,custom_assistant_Script:()=>ji,custom_assistant_Source:()=>Mi,custom_assistant_Speak:()=>Ni,custom_assistant_State:()=>Pi,custom_assistant_Status:()=>Fi,custom_assistant_auto:()=>Ii,custom_assistant_device:()=>Li,custom_assistant_filter:()=>Ri,custom_assistant_hint:()=>zi,custom_assistant_llm_downloading:()=>Bi,custom_assistant_llm_error:()=>Vi,custom_assistant_llm_idle:()=>Hi,custom_assistant_llm_installing:()=>Ui,custom_assistant_llm_loading:()=>Wi,custom_assistant_llm_ready:()=>Gi,custom_assistant_offline:()=>Ki,custom_assistant_online:()=>qi,custom_assistant_read:()=>Ji,custom_assistant_room:()=>Yi,custom_assistant_sat_idle:()=>Xi,custom_assistant_sat_listening:()=>Zi,custom_assistant_sat_offline:()=>Qi,custom_assistant_sat_processing:()=>$i,custom_assistant_sat_speaking:()=>ea,custom_assistant_type:()=>`Typ`,custom_assistant_wake_word_hint:()=>ta,custom_assistant_write:()=>na,default:()=>ra}),xi=`Ogłoszenie`,Si=`Cancel`,Ci=`Chat`,wi=`Close`,Ti=`Delete`,Ei=`Gospodarz`,Di=`Room`,Oi=`Routine`,ki=`Satelita`,Ai=`Satelity`,ji=`Script`,Mi=`Source`,Ni=`Mówić`,Pi=`State`,Fi=`Status`,Ii=`automatyczny`,Li=`Urządzenie`,Ri=`Filtr`,zi=`Odznacz opcję „Odczyt”, aby ukryć urządzenie przed asystentem, lub odznacz opcję „Zapis”, aby zachować je tylko do odczytu (np. blokady). Domyślnie urządzenia mają pełne uprawnienia.`,Bi=`pobieranie modelu…`,Vi=`błąd`,Hi=`bezczynny`,Ui=`instalowanie silnika…`,Wi=`załadunek…`,Gi=`gotowy`,Ki=`nieaktywny`,qi=`w sieci`,Ji=`Czytać`,Yi=`Pokój`,Xi=`bezczynny`,Zi=`słuchający`,Qi=`nieaktywny`,$i=`przetwarzanie`,ea=`mówiąc`,ta=`Słowo aktywujące działa na urządzeniu. Najedź na słowo, aby zobaczyć, w jakich językach było trenowane — większość tylko po angielsku.`,na=`Pisać`,ra={"custom_assistant_%s of %s active":`%s of %s active`,"custom_assistant_(no spoken answer)":`(no spoken answer)`,"custom_assistant_All sources":`All sources`,custom_assistant_Announcement:xi,custom_assistant_Cancel:Si,custom_assistant_Chat:Ci,"custom_assistant_Clear chat":`Wyczyść czat`,custom_assistant_Close:wi,"custom_assistant_Cloud LLM":`Cloud LLM`,custom_assistant_Delete:Ti,"custom_assistant_Delete the recorded history of all sources?":`Delete the recorded history of all sources?`,"custom_assistant_Device cache cleared.":`Pamięć podręczna urządzenia została wyczyszczona.`,"custom_assistant_Device settings":`Device settings`,"custom_assistant_Hide disabled":`Ukryj wyłączone`,"custom_assistant_Hide processing details":`Hide processing details`,custom_assistant_Host:Ei,"custom_assistant_Last seen":`Ostatnio widziany`,"custom_assistant_Listening…":`Słuchający…`,"custom_assistant_Local LLM":`Local LLM`,"custom_assistant_Local model":`Model lokalny`,"custom_assistant_Mic re-opened without wake word":`Mic re-opened without wake word (follow-up or question)`,"custom_assistant_Name language: %s":`Język nazwy: %s`,"custom_assistant_No devices detected. Assign states to rooms and functions in ioBroker.":`Nie wykryto urządzeń. Przypisz stany do pomieszczeń i funkcji w ioBroker.`,"custom_assistant_No messages yet. Type a question below.":`Brak wiadomości. Wpisz pytanie poniżej.`,"custom_assistant_No satellites registered yet.":`Nie zarejestrowano jeszcze żadnych satelitów.`,"custom_assistant_Not understood":`Not understood`,"custom_assistant_Per-device permissions":`Uprawnienia na urządzenie`,"custom_assistant_Play answer (backend TTS)":`Odtwórz odpowiedź (TTS w tle)`,"custom_assistant_Read answers aloud":`Przeczytaj odpowiedzi na głos`,"custom_assistant_Refresh device cache":`Odśwież pamięć podręczną urządzenia`,"custom_assistant_Reply to a question":`Reply to a question`,custom_assistant_Room:Di,custom_assistant_Routine:Oi,"custom_assistant_Rule-based NLU":`Rule-based NLU (local)`,custom_assistant_Satellite:ki,custom_assistant_Satellites:Ai,"custom_assistant_Save the configuration (the instance will restart) before chatting.":`Przed rozpoczęciem czatu zapisz konfigurację (instancja zostanie uruchomiona ponownie).`,custom_assistant_Script:ji,"custom_assistant_Send announcement":`Wyślij ogłoszenie`,"custom_assistant_Settings for %s":`Settings for %s`,"custom_assistant_Show processing details":`Show processing details`,"custom_assistant_Shows all requests live: satellites, Telegram, scripts and this chat.":`Shows all requests live: satellites, Telegram, scripts and this chat.`,custom_assistant_Source:Mi,custom_assistant_Speak:Ni,"custom_assistant_Speak on all satellites":`Mów na wszystkich satelitach`,"custom_assistant_Speech recognition time":`Speech recognition time`,"custom_assistant_Start the assistant instance to chat.":`Uruchom asystenta, aby rozpocząć rozmowę.`,"custom_assistant_Start the assistant instance to load the device list.":`Uruchom instancję asystenta, aby załadować listę urządzeń.`,custom_assistant_State:Pi,custom_assistant_Status:Fi,"custom_assistant_Stop listening":`Przestań słuchać`,"custom_assistant_Stop reading answers aloud":`Przestań czytać odpowiedzi na głos`,"custom_assistant_Stop word":`Stop word`,"custom_assistant_Test chat":`Czat testowy`,"custom_assistant_Thinking…":`Myślący…`,"custom_assistant_This satellite exposes no settings.":`This satellite exposes no settings.`,"custom_assistant_Translate all missing (%s)":`Przetłumacz wszystkie brakujące (%s)`,"custom_assistant_Translate name into %s":`Przetłumacz nazwę na %s`,"custom_assistant_Type a message…":`Wpisz wiadomość…`,"custom_assistant_Wake word":`Wake word`,"custom_assistant_Wake words":`Wake words`,custom_assistant_auto:Ii,"custom_assistant_change it on the Voice tab":`zmień to na karcie Głos`,custom_assistant_device:Li,custom_assistant_filter:Ri,"custom_assistant_follow-up":`follow-up`,custom_assistant_hint:zi,custom_assistant_llm_downloading:Bi,custom_assistant_llm_error:Vi,custom_assistant_llm_idle:Hi,custom_assistant_llm_installing:Ui,custom_assistant_llm_loading:Wi,"custom_assistant_llm_not installed":`nie zainstalowano`,custom_assistant_llm_ready:Gi,"custom_assistant_no name in %s (showing %s)":`Brak nazwy w "%s" — wyświetlanie "%s"`,custom_assistant_offline:Ki,custom_assistant_online:qi,custom_assistant_read:Ji,custom_assistant_room:Yi,custom_assistant_sat_idle:Xi,custom_assistant_sat_listening:Zi,custom_assistant_sat_offline:Qi,custom_assistant_sat_processing:$i,custom_assistant_sat_speaking:ea,custom_assistant_type:`Typ`,"custom_assistant_waits for reply":`waits for reply`,custom_assistant_wake_word_hint:ta,custom_assistant_write:na},Y=e({custom_assistant_Announcement:()=>ia,custom_assistant_Cancel:()=>aa,custom_assistant_Chat:()=>oa,custom_assistant_Close:()=>sa,custom_assistant_Delete:()=>ca,custom_assistant_Host:()=>la,custom_assistant_Room:()=>ua,custom_assistant_Routine:()=>da,custom_assistant_Satellite:()=>fa,custom_assistant_Satellites:()=>pa,custom_assistant_Script:()=>ma,custom_assistant_Source:()=>ha,custom_assistant_Speak:()=>ga,custom_assistant_State:()=>_a,custom_assistant_Status:()=>va,custom_assistant_auto:()=>ya,custom_assistant_device:()=>ba,custom_assistant_filter:()=>xa,custom_assistant_hint:()=>Sa,custom_assistant_llm_downloading:()=>Ca,custom_assistant_llm_error:()=>wa,custom_assistant_llm_idle:()=>Ta,custom_assistant_llm_installing:()=>Ea,custom_assistant_llm_loading:()=>Da,custom_assistant_llm_ready:()=>Oa,custom_assistant_offline:()=>ka,custom_assistant_online:()=>Aa,custom_assistant_read:()=>`Ler`,custom_assistant_room:()=>ja,custom_assistant_sat_idle:()=>Ma,custom_assistant_sat_listening:()=>Na,custom_assistant_sat_offline:()=>Pa,custom_assistant_sat_processing:()=>Fa,custom_assistant_sat_speaking:()=>Ia,custom_assistant_type:()=>La,custom_assistant_wake_word_hint:()=>Ra,custom_assistant_write:()=>za,default:()=>Ba}),ia=`Anúncio`,aa=`Cancel`,oa=`Chat`,sa=`Close`,ca=`Delete`,la=`Hospedar`,ua=`Room`,da=`Routine`,fa=`Satélite`,pa=`Satélites`,ma=`Script`,ha=`Source`,ga=`Falar`,_a=`State`,va=`Status`,ya=`auto`,ba=`Dispositivo`,xa=`Filtro`,Sa=`Desmarque a opção "Ler" para ocultar um dispositivo do assistente ou desmarque a opção "Gravar" para mantê-lo somente leitura (por exemplo, fechaduras). Os dispositivos são configurados por padrão para permitir totalmente o acesso.`,Ca=`baixando modelo…`,wa=`erro`,Ta=`parado`,Ea=`Instalando o motor…`,Da=`carregando…`,Oa=`preparar`,ka=`offline`,Aa=`on-line`,ja=`Sala`,Ma=`parado`,Na=`audição`,Pa=`offline`,Fa=`processamento`,Ia=`Falando`,La=`Tipo`,Ra=`A palavra de ativação é processada no dispositivo. Passe o mouse sobre uma palavra para ver em quais idiomas ela foi treinada — a maioria apenas em inglês.`,za=`Escrever`,Ba={"custom_assistant_%s of %s active":`%s of %s active`,"custom_assistant_(no spoken answer)":`(no spoken answer)`,"custom_assistant_All sources":`All sources`,custom_assistant_Announcement:ia,custom_assistant_Cancel:aa,custom_assistant_Chat:oa,"custom_assistant_Clear chat":`Chat limpo`,custom_assistant_Close:sa,"custom_assistant_Cloud LLM":`Cloud LLM`,custom_assistant_Delete:ca,"custom_assistant_Delete the recorded history of all sources?":`Delete the recorded history of all sources?`,"custom_assistant_Device cache cleared.":`Cache do dispositivo limpo.`,"custom_assistant_Device settings":`Device settings`,"custom_assistant_Hide disabled":`Ocultar desativado`,"custom_assistant_Hide processing details":`Hide processing details`,custom_assistant_Host:la,"custom_assistant_Last seen":`Última vez visto`,"custom_assistant_Listening…":`Audição…`,"custom_assistant_Local LLM":`Local LLM`,"custom_assistant_Local model":`Modelo local`,"custom_assistant_Mic re-opened without wake word":`Mic re-opened without wake word (follow-up or question)`,"custom_assistant_Name language: %s":`Idioma do nome: %s`,"custom_assistant_No devices detected. Assign states to rooms and functions in ioBroker.":`Nenhum dispositivo detectado. Atribua estados a salas e funções no ioBroker.`,"custom_assistant_No messages yet. Type a question below.":`Ainda não há mensagens. Digite sua pergunta abaixo.`,"custom_assistant_No satellites registered yet.":`Nenhum satélite registrado ainda.`,"custom_assistant_Not understood":`Not understood`,"custom_assistant_Per-device permissions":`Permissões por dispositivo`,"custom_assistant_Play answer (backend TTS)":`Reproduzir resposta (TTS em segundo plano)`,"custom_assistant_Read answers aloud":`Leia as respostas em voz alta.`,"custom_assistant_Refresh device cache":`Atualizar cache do dispositivo`,"custom_assistant_Reply to a question":`Reply to a question`,custom_assistant_Room:ua,custom_assistant_Routine:da,"custom_assistant_Rule-based NLU":`Rule-based NLU (local)`,custom_assistant_Satellite:fa,custom_assistant_Satellites:pa,"custom_assistant_Save the configuration (the instance will restart) before chatting.":`Salve a configuração (a instância será reiniciada) antes de iniciar o chat.`,custom_assistant_Script:ma,"custom_assistant_Send announcement":`Enviar anúncio`,"custom_assistant_Settings for %s":`Settings for %s`,"custom_assistant_Show processing details":`Show processing details`,"custom_assistant_Shows all requests live: satellites, Telegram, scripts and this chat.":`Shows all requests live: satellites, Telegram, scripts and this chat.`,custom_assistant_Source:ha,custom_assistant_Speak:ga,"custom_assistant_Speak on all satellites":`Fale em todos os satélites`,"custom_assistant_Speech recognition time":`Speech recognition time`,"custom_assistant_Start the assistant instance to chat.":`Inicie a instância do assistente para conversar.`,"custom_assistant_Start the assistant instance to load the device list.":`Inicie a instância do assistente para carregar a lista de dispositivos.`,custom_assistant_State:_a,custom_assistant_Status:va,"custom_assistant_Stop listening":`Pare de ouvir`,"custom_assistant_Stop reading answers aloud":`Pare de ler as respostas em voz alta.`,"custom_assistant_Stop word":`Stop word`,"custom_assistant_Test chat":`Chat de teste`,"custom_assistant_Thinking…":`Pensamento…`,"custom_assistant_This satellite exposes no settings.":`This satellite exposes no settings.`,"custom_assistant_Translate all missing (%s)":`Traduzir todos os (%s) ausentes`,"custom_assistant_Translate name into %s":`Traduzir nome para %s`,"custom_assistant_Type a message…":`Digite uma mensagem…`,"custom_assistant_Wake word":`Wake word`,"custom_assistant_Wake words":`Wake words`,custom_assistant_auto:ya,"custom_assistant_change it on the Voice tab":`Altere isso na guia Voz.`,custom_assistant_device:ba,custom_assistant_filter:xa,"custom_assistant_follow-up":`follow-up`,custom_assistant_hint:Sa,custom_assistant_llm_downloading:Ca,custom_assistant_llm_error:wa,custom_assistant_llm_idle:Ta,custom_assistant_llm_installing:Ea,custom_assistant_llm_loading:Da,"custom_assistant_llm_not installed":`não instalado`,custom_assistant_llm_ready:Oa,"custom_assistant_no name in %s (showing %s)":`Nenhum nome em "%s" — exibindo "%s"`,custom_assistant_offline:ka,custom_assistant_online:Aa,custom_assistant_read:`Ler`,custom_assistant_room:ja,custom_assistant_sat_idle:Ma,custom_assistant_sat_listening:Na,custom_assistant_sat_offline:Pa,custom_assistant_sat_processing:Fa,custom_assistant_sat_speaking:Ia,custom_assistant_type:La,"custom_assistant_waits for reply":`waits for reply`,custom_assistant_wake_word_hint:Ra,custom_assistant_write:za},X=e({custom_assistant_Announcement:()=>Va,custom_assistant_Cancel:()=>Ha,custom_assistant_Chat:()=>Ua,custom_assistant_Close:()=>Wa,custom_assistant_Delete:()=>Ga,custom_assistant_Host:()=>Ka,custom_assistant_Room:()=>qa,custom_assistant_Routine:()=>Ja,custom_assistant_Satellite:()=>Ya,custom_assistant_Satellites:()=>Xa,custom_assistant_Script:()=>Za,custom_assistant_Source:()=>Qa,custom_assistant_Speak:()=>$a,custom_assistant_State:()=>eo,custom_assistant_Status:()=>to,custom_assistant_auto:()=>no,custom_assistant_device:()=>ro,custom_assistant_filter:()=>io,custom_assistant_hint:()=>ao,custom_assistant_llm_downloading:()=>oo,custom_assistant_llm_error:()=>so,custom_assistant_llm_idle:()=>co,custom_assistant_llm_installing:()=>lo,custom_assistant_llm_loading:()=>uo,custom_assistant_llm_ready:()=>fo,custom_assistant_offline:()=>po,custom_assistant_online:()=>mo,custom_assistant_read:()=>ho,custom_assistant_room:()=>go,custom_assistant_sat_idle:()=>_o,custom_assistant_sat_listening:()=>vo,custom_assistant_sat_offline:()=>yo,custom_assistant_sat_processing:()=>bo,custom_assistant_sat_speaking:()=>xo,custom_assistant_type:()=>So,custom_assistant_wake_word_hint:()=>Co,custom_assistant_write:()=>wo,default:()=>To}),Va=`Объявление`,Ha=`Отмена`,Ua=`Чат`,Wa=`Закрыть`,Ga=`Удалить`,Ka=`Хозяин`,qa=`Комната`,Ja=`Сценарий`,Ya=`Спутник`,Xa=`Спутники`,Za=`Скрипт`,Qa=`Источник`,$a=`Говорить`,eo=`Состояние`,to=`Статус`,no=`авто`,ro=`Устройство`,io=`Фильтр`,ao=`Снимите флажок «Чтение», чтобы скрыть устройство от голосового помощника, или снимите флажок «Запись», чтобы оставить его только для чтения (например, блокировка). По умолчанию устройствам разрешен полный доступ.`,oo=`Загрузка модели…`,so=`ошибка`,co=`праздный`,lo=`установка двигателя…`,uo=`Загрузка…`,fo=`готовый`,po=`офлайн`,mo=`онлайн`,ho=`Читать`,go=`Комната`,_o=`праздный`,vo=`слушание`,yo=`офлайн`,bo=`обработка`,xo=`Говорящий`,So=`Тип`,Co=`Слово активации обрабатывается на устройстве. Наведите курсор на слово, чтобы увидеть, на каких языках оно обучено — большинство только на английском.`,wo=`Писать`,To={"custom_assistant_%s of %s active":`активно %s из %s`,"custom_assistant_(no spoken answer)":`(без голосового ответа)`,"custom_assistant_All sources":`Все источники`,custom_assistant_Announcement:Va,custom_assistant_Cancel:Ha,custom_assistant_Chat:Ua,"custom_assistant_Clear chat":`Четкий чат`,custom_assistant_Close:Wa,"custom_assistant_Cloud LLM":`Облачная LLM`,custom_assistant_Delete:Ga,"custom_assistant_Delete the recorded history of all sources?":`Удалить записанную историю всех источников?`,"custom_assistant_Device cache cleared.":`Кэш устройства очищен.`,"custom_assistant_Device settings":`Настройки устройства`,"custom_assistant_Hide disabled":`Скрыть отключено`,"custom_assistant_Hide processing details":`Скрыть детали обработки`,custom_assistant_Host:Ka,"custom_assistant_Last seen":`Последний раз видели`,"custom_assistant_Listening…":`Слушаю…`,"custom_assistant_Local LLM":`Локальная LLM`,"custom_assistant_Local model":`Локальная модель`,"custom_assistant_Mic re-opened without wake word":`Микрофон снова открыт без слова активации (уточнение или вопрос)`,"custom_assistant_Name language: %s":`Название языка: %s`,"custom_assistant_No devices detected. Assign states to rooms and functions in ioBroker.":`Устройства не обнаружены. Назначьте состояния комнатам и функциям в ioBroker.`,"custom_assistant_No messages yet. Type a question below.":`Сообщений пока нет. Задайте вопрос ниже.`,"custom_assistant_No satellites registered yet.":`Спутники пока не зарегистрированы.`,"custom_assistant_Not understood":`Не понято`,"custom_assistant_Per-device permissions":`Разрешения для каждого устройства`,"custom_assistant_Play answer (backend TTS)":`Воспроизвести ответ (синтезатор речи на стороне сервера)`,"custom_assistant_Read answers aloud":`Прочитайте ответы вслух.`,"custom_assistant_Refresh device cache":`Обновить кэш устройства`,"custom_assistant_Reply to a question":`Ответ на вопрос`,custom_assistant_Room:qa,custom_assistant_Routine:Ja,"custom_assistant_Rule-based NLU":`Правила NLU (локально)`,custom_assistant_Satellite:Ya,custom_assistant_Satellites:Xa,"custom_assistant_Save the configuration (the instance will restart) before chatting.":`Сохраните конфигурацию (при этом экземпляр перезапустится) перед началом чата.`,custom_assistant_Script:Za,"custom_assistant_Send announcement":`Отправить объявление`,"custom_assistant_Settings for %s":`Настройки для %s`,"custom_assistant_Show processing details":`Показать детали обработки`,"custom_assistant_Shows all requests live: satellites, Telegram, scripts and this chat.":`Показывает все запросы в реальном времени: сателлиты, Telegram, скрипты и этот чат.`,custom_assistant_Source:Qa,custom_assistant_Speak:$a,"custom_assistant_Speak on all satellites":`Выступить на всех спутниках`,"custom_assistant_Speech recognition time":`Время распознавания речи`,"custom_assistant_Start the assistant instance to chat.":`Запустите экземпляр ассистента для начала чата.`,"custom_assistant_Start the assistant instance to load the device list.":`Запустите экземпляр помощника, чтобы загрузить список устройств.`,custom_assistant_State:eo,custom_assistant_Status:to,"custom_assistant_Stop listening":`Прекратите слушать`,"custom_assistant_Stop reading answers aloud":`Прекратите зачитывать ответы вслух.`,"custom_assistant_Stop word":`Стоп-слово`,"custom_assistant_Test chat":`Тестовый чат`,"custom_assistant_Thinking…":`Размышления…`,"custom_assistant_This satellite exposes no settings.":`Этот сателлит не предоставляет настроек.`,"custom_assistant_Translate all missing (%s)":`Переведите все отсутствующие (%s)`,"custom_assistant_Translate name into %s":`Переведите имя в %s`,"custom_assistant_Type a message…":`Введите сообщение…`,"custom_assistant_Wake word":`Слово активации`,"custom_assistant_Wake words":`Слова активации`,custom_assistant_auto:no,"custom_assistant_change it on the Voice tab":`Измените это на вкладке «Голос».`,custom_assistant_device:ro,custom_assistant_filter:io,"custom_assistant_follow-up":`продолжение`,custom_assistant_hint:ao,custom_assistant_llm_downloading:oo,custom_assistant_llm_error:so,custom_assistant_llm_idle:co,custom_assistant_llm_installing:lo,custom_assistant_llm_loading:uo,"custom_assistant_llm_not installed":`не установлен`,custom_assistant_llm_ready:fo,"custom_assistant_no name in %s (showing %s)":`Имя отсутствует в "%s" — отображается "%s"`,custom_assistant_offline:po,custom_assistant_online:mo,custom_assistant_read:ho,custom_assistant_room:go,custom_assistant_sat_idle:_o,custom_assistant_sat_listening:vo,custom_assistant_sat_offline:yo,custom_assistant_sat_processing:bo,custom_assistant_sat_speaking:xo,custom_assistant_type:So,"custom_assistant_waits for reply":`ждёт ответа`,custom_assistant_wake_word_hint:Co,custom_assistant_write:wo},Z=e({custom_assistant_Announcement:()=>Eo,custom_assistant_Cancel:()=>Do,custom_assistant_Chat:()=>Oo,custom_assistant_Close:()=>ko,custom_assistant_Delete:()=>Ao,custom_assistant_Host:()=>jo,custom_assistant_Room:()=>Mo,custom_assistant_Routine:()=>No,custom_assistant_Satellite:()=>Po,custom_assistant_Satellites:()=>Fo,custom_assistant_Script:()=>Io,custom_assistant_Source:()=>Lo,custom_assistant_Speak:()=>Ro,custom_assistant_State:()=>zo,custom_assistant_Status:()=>Bo,custom_assistant_auto:()=>Vo,custom_assistant_device:()=>Ho,custom_assistant_filter:()=>Uo,custom_assistant_hint:()=>Wo,custom_assistant_llm_downloading:()=>Go,custom_assistant_llm_error:()=>Ko,custom_assistant_llm_idle:()=>qo,custom_assistant_llm_installing:()=>Jo,custom_assistant_llm_loading:()=>Yo,custom_assistant_llm_ready:()=>Xo,custom_assistant_offline:()=>Zo,custom_assistant_online:()=>Qo,custom_assistant_read:()=>$o,custom_assistant_room:()=>es,custom_assistant_sat_idle:()=>ts,custom_assistant_sat_listening:()=>ns,custom_assistant_sat_offline:()=>rs,custom_assistant_sat_processing:()=>is,custom_assistant_sat_speaking:()=>as,custom_assistant_type:()=>os,custom_assistant_wake_word_hint:()=>ss,custom_assistant_write:()=>cs,default:()=>ls}),Eo=`Оголошення`,Do=`Cancel`,Oo=`Chat`,ko=`Close`,Ao=`Delete`,jo=`Хост`,Mo=`Room`,No=`Routine`,Po=`Супутник`,Fo=`Супутники`,Io=`Script`,Lo=`Source`,Ro=`Говоріть`,zo=`State`,Bo=`Статус`,Vo=`авто`,Ho=`Пристрій`,Uo=`Фільтр`,Wo=`Зніміть позначку «Читання», щоб приховати пристрій від помічника, або «Запис», щоб залишити його в режимі лише для читання (наприклад, блокування). За замовчуванням пристрої повністю дозволені.`,Go=`завантаження моделі…`,Ko=`помилка`,qo=`бездіяльність`,Jo=`встановлення двигуна…`,Yo=`завантаження…`,Xo=`готовий`,Zo=`офлайн`,Qo=`онлайн`,$o=`Читати`,es=`Кімната`,ts=`бездіяльність`,ns=`прослуховування`,rs=`офлайн`,is=`обробка`,as=`розмова`,os=`Тип`,ss=`Слово активації обробляється на пристрої. Наведіть курсор на слово, щоб побачити, якими мовами його навчено — більшість лише англійською.`,cs=`Написати`,ls={"custom_assistant_%s of %s active":`%s of %s active`,"custom_assistant_(no spoken answer)":`(no spoken answer)`,"custom_assistant_All sources":`All sources`,custom_assistant_Announcement:Eo,custom_assistant_Cancel:Do,custom_assistant_Chat:Oo,"custom_assistant_Clear chat":`Очистити чат`,custom_assistant_Close:ko,"custom_assistant_Cloud LLM":`Cloud LLM`,custom_assistant_Delete:Ao,"custom_assistant_Delete the recorded history of all sources?":`Delete the recorded history of all sources?`,"custom_assistant_Device cache cleared.":`Кеш пристрою очищено.`,"custom_assistant_Device settings":`Device settings`,"custom_assistant_Hide disabled":`Приховати вимкнено`,"custom_assistant_Hide processing details":`Hide processing details`,custom_assistant_Host:jo,"custom_assistant_Last seen":`Бачили востаннє`,"custom_assistant_Listening…":`Слухання…`,"custom_assistant_Local LLM":`Local LLM`,"custom_assistant_Local model":`Локальна модель`,"custom_assistant_Mic re-opened without wake word":`Mic re-opened without wake word (follow-up or question)`,"custom_assistant_Name language: %s":`Мова назви: %s`,"custom_assistant_No devices detected. Assign states to rooms and functions in ioBroker.":`Пристроїв не виявлено. Призначте стани кімнатам та функціям в ioBroker.`,"custom_assistant_No messages yet. Type a question below.":`Поки що немає повідомлень. Введіть запитання нижче.`,"custom_assistant_No satellites registered yet.":`Поки що не зареєстровано жодного супутника.`,"custom_assistant_Not understood":`Not understood`,"custom_assistant_Per-device permissions":`Дозволи для кожного пристрою`,"custom_assistant_Play answer (backend TTS)":`Відтворити відповідь (бекенд TTS)`,"custom_assistant_Read answers aloud":`Прочитайте відповіді вголос`,"custom_assistant_Refresh device cache":`Оновити кеш пристрою`,"custom_assistant_Reply to a question":`Reply to a question`,custom_assistant_Room:Mo,custom_assistant_Routine:No,"custom_assistant_Rule-based NLU":`Rule-based NLU (local)`,custom_assistant_Satellite:Po,custom_assistant_Satellites:Fo,"custom_assistant_Save the configuration (the instance will restart) before chatting.":`Збережіть конфігурацію (екземпляр перезавантажиться) перед спілкуванням у чаті.`,custom_assistant_Script:Io,"custom_assistant_Send announcement":`Надіслати оголошення`,"custom_assistant_Settings for %s":`Settings for %s`,"custom_assistant_Show processing details":`Show processing details`,"custom_assistant_Shows all requests live: satellites, Telegram, scripts and this chat.":`Shows all requests live: satellites, Telegram, scripts and this chat.`,custom_assistant_Source:Lo,custom_assistant_Speak:Ro,"custom_assistant_Speak on all satellites":`Розмовляйте на всіх супутниках`,"custom_assistant_Speech recognition time":`Speech recognition time`,"custom_assistant_Start the assistant instance to chat.":`Запустіть екземпляр помічника для спілкування в чаті.`,"custom_assistant_Start the assistant instance to load the device list.":`Запустіть екземпляр помічника, щоб завантажити список пристроїв.`,custom_assistant_State:zo,custom_assistant_Status:Bo,"custom_assistant_Stop listening":`Перестань слухати`,"custom_assistant_Stop reading answers aloud":`Перестаньте читати відповіді вголос`,"custom_assistant_Stop word":`Stop word`,"custom_assistant_Test chat":`Тестовий чат`,"custom_assistant_Thinking…":`Мислення…`,"custom_assistant_This satellite exposes no settings.":`This satellite exposes no settings.`,"custom_assistant_Translate all missing (%s)":`Перекласти все, що відсутні (%s)`,"custom_assistant_Translate name into %s":`Перекладіть назву мовою %s`,"custom_assistant_Type a message…":`Введіть повідомлення…`,"custom_assistant_Wake word":`Wake word`,"custom_assistant_Wake words":`Wake words`,custom_assistant_auto:Vo,"custom_assistant_change it on the Voice tab":`змінити це на вкладці «Голос»`,custom_assistant_device:Ho,custom_assistant_filter:Uo,"custom_assistant_follow-up":`follow-up`,custom_assistant_hint:Wo,custom_assistant_llm_downloading:Go,custom_assistant_llm_error:Ko,custom_assistant_llm_idle:qo,custom_assistant_llm_installing:Jo,custom_assistant_llm_loading:Yo,"custom_assistant_llm_not installed":`не встановлено`,custom_assistant_llm_ready:Xo,"custom_assistant_no name in %s (showing %s)":`Немає імені в "%s" — відображається "%s"`,custom_assistant_offline:Zo,custom_assistant_online:Qo,custom_assistant_read:$o,custom_assistant_room:es,custom_assistant_sat_idle:ts,custom_assistant_sat_listening:ns,custom_assistant_sat_offline:rs,custom_assistant_sat_processing:is,custom_assistant_sat_speaking:as,custom_assistant_type:os,"custom_assistant_waits for reply":`waits for reply`,custom_assistant_wake_word_hint:ss,custom_assistant_write:cs},Q=e({custom_assistant_Announcement:()=>us,custom_assistant_Cancel:()=>ds,custom_assistant_Chat:()=>fs,custom_assistant_Close:()=>ps,custom_assistant_Delete:()=>ms,custom_assistant_Host:()=>hs,custom_assistant_Room:()=>gs,custom_assistant_Routine:()=>_s,custom_assistant_Satellite:()=>vs,custom_assistant_Satellites:()=>ys,custom_assistant_Script:()=>bs,custom_assistant_Source:()=>xs,custom_assistant_Speak:()=>Ss,custom_assistant_State:()=>Cs,custom_assistant_Status:()=>ws,custom_assistant_auto:()=>Ts,custom_assistant_device:()=>Es,custom_assistant_filter:()=>Ds,custom_assistant_hint:()=>Os,custom_assistant_llm_downloading:()=>ks,custom_assistant_llm_error:()=>As,custom_assistant_llm_idle:()=>js,custom_assistant_llm_installing:()=>Ms,custom_assistant_llm_loading:()=>Ns,custom_assistant_llm_ready:()=>Ps,custom_assistant_offline:()=>Fs,custom_assistant_online:()=>Is,custom_assistant_read:()=>`读`,custom_assistant_room:()=>Ls,custom_assistant_sat_idle:()=>Rs,custom_assistant_sat_listening:()=>zs,custom_assistant_sat_offline:()=>Bs,custom_assistant_sat_processing:()=>Vs,custom_assistant_sat_speaking:()=>Hs,custom_assistant_type:()=>Us,custom_assistant_wake_word_hint:()=>Ws,custom_assistant_write:()=>`写`,default:()=>Gs}),us=`公告`,ds=`Cancel`,fs=`Chat`,ps=`Close`,ms=`Delete`,hs=`主持人`,gs=`Room`,_s=`Routine`,vs=`卫星`,ys=`卫星`,bs=`Script`,xs=`Source`,Ss=`说话`,Cs=`State`,ws=`地位`,Ts=`汽车`,Es=`设备`,Ds=`筛选`,Os=`取消勾选“读取”选项可将设备对语音助手隐藏,取消勾选“写入”选项可将其设置为只读(例如,锁定设备)。设备默认设置为完全允许访问。`,ks=`正在下载模型…`,As=`错误`,js=`闲置的`,Ms=`安装发动机…`,Ns=`加载中…`,Ps=`准备好`,Fs=`离线`,Is=`在线的`,Ls=`房间`,Rs=`闲置的`,zs=`聆听`,Bs=`离线`,Vs=`加工`,Hs=`请讲`,Us=`类型`,Ws=`唤醒词在设备上运行。将鼠标悬停在某个词上可查看它训练所用的语言——大多数仅支持英语。`,Gs={"custom_assistant_%s of %s active":`%s of %s active`,"custom_assistant_(no spoken answer)":`(no spoken answer)`,"custom_assistant_All sources":`All sources`,custom_assistant_Announcement:us,custom_assistant_Cancel:ds,custom_assistant_Chat:fs,"custom_assistant_Clear chat":`清晰聊天`,custom_assistant_Close:ps,"custom_assistant_Cloud LLM":`Cloud LLM`,custom_assistant_Delete:ms,"custom_assistant_Delete the recorded history of all sources?":`Delete the recorded history of all sources?`,"custom_assistant_Device cache cleared.":`设备缓存已清除。`,"custom_assistant_Device settings":`Device settings`,"custom_assistant_Hide disabled":`隐藏已禁用`,"custom_assistant_Hide processing details":`Hide processing details`,custom_assistant_Host:hs,"custom_assistant_Last seen":`最后一次出现`,"custom_assistant_Listening…":`正在听……`,"custom_assistant_Local LLM":`Local LLM`,"custom_assistant_Local model":`本地模型`,"custom_assistant_Mic re-opened without wake word":`Mic re-opened without wake word (follow-up or question)`,"custom_assistant_Name language: %s":`名称语言:%s`,"custom_assistant_No devices detected. Assign states to rooms and functions in ioBroker.":`未检测到设备。请在ioBroker中为房间和功能分配状态。`,"custom_assistant_No messages yet. Type a question below.":`暂无消息。请在下方输入问题。`,"custom_assistant_No satellites registered yet.":`目前尚未注册任何卫星。`,"custom_assistant_Not understood":`Not understood`,"custom_assistant_Per-device permissions":`每个设备的权限`,"custom_assistant_Play answer (backend TTS)":`播放答案(后端 TTS)`,"custom_assistant_Read answers aloud":`大声朗读答案`,"custom_assistant_Refresh device cache":`刷新设备缓存`,"custom_assistant_Reply to a question":`Reply to a question`,custom_assistant_Room:gs,custom_assistant_Routine:_s,"custom_assistant_Rule-based NLU":`Rule-based NLU (local)`,custom_assistant_Satellite:vs,custom_assistant_Satellites:ys,"custom_assistant_Save the configuration (the instance will restart) before chatting.":`聊天前请保存配置(实例将重启)。`,custom_assistant_Script:bs,"custom_assistant_Send announcement":`发送公告`,"custom_assistant_Settings for %s":`Settings for %s`,"custom_assistant_Show processing details":`Show processing details`,"custom_assistant_Shows all requests live: satellites, Telegram, scripts and this chat.":`Shows all requests live: satellites, Telegram, scripts and this chat.`,custom_assistant_Source:xs,custom_assistant_Speak:Ss,"custom_assistant_Speak on all satellites":`在所有卫星上通话`,"custom_assistant_Speech recognition time":`Speech recognition time`,"custom_assistant_Start the assistant instance to chat.":`启动助手实例进行聊天。`,"custom_assistant_Start the assistant instance to load the device list.":`启动助手实例以加载设备列表。`,custom_assistant_State:Cs,custom_assistant_Status:ws,"custom_assistant_Stop listening":`别听了`,"custom_assistant_Stop reading answers aloud":`停止大声朗读答案`,"custom_assistant_Stop word":`Stop word`,"custom_assistant_Test chat":`测试聊天`,"custom_assistant_Thinking…":`思维…`,"custom_assistant_This satellite exposes no settings.":`This satellite exposes no settings.`,"custom_assistant_Translate all missing (%s)":`翻译所有缺失值(%s)`,"custom_assistant_Translate name into %s":`将名称翻译成 %s`,"custom_assistant_Type a message…":`输入消息…`,"custom_assistant_Wake word":`Wake word`,"custom_assistant_Wake words":`Wake words`,custom_assistant_auto:Ts,"custom_assistant_change it on the Voice tab":`在“语音”选项卡上更改。`,custom_assistant_device:Es,custom_assistant_filter:Ds,"custom_assistant_follow-up":`follow-up`,custom_assistant_hint:Os,custom_assistant_llm_downloading:ks,custom_assistant_llm_error:As,custom_assistant_llm_idle:js,custom_assistant_llm_installing:Ms,custom_assistant_llm_loading:Ns,"custom_assistant_llm_not installed":`未安装`,custom_assistant_llm_ready:Ps,"custom_assistant_no name in %s (showing %s)":`“%s”中没有名称——显示“%s”`,custom_assistant_offline:Fs,custom_assistant_online:Is,custom_assistant_read:`读`,custom_assistant_room:Ls,custom_assistant_sat_idle:Rs,custom_assistant_sat_listening:zs,custom_assistant_sat_offline:Bs,custom_assistant_sat_processing:Vs,custom_assistant_sat_speaking:Hs,custom_assistant_type:Us,"custom_assistant_waits for reply":`waits for reply`,custom_assistant_wake_word_hint:Ws,custom_assistant_write:`写`};de();var Ks={},qs=Object.assign({"./i18n/de.json":F,"./i18n/en.json":H,"./i18n/es.json":U,"./i18n/fr.json":W,"./i18n/it.json":G,"./i18n/nl.json":K,"./i18n/pl.json":J,"./i18n/pt.json":Y,"./i18n/ru.json":X,"./i18n/uk.json":Z,"./i18n/zh-cn.json":Q});for(let[e,t]of Object.entries(qs)){var Js;let n=((Js=e.split(`/`).pop())==null?void 0:Js.replace(`.json`,``))||`en`;Ks[n]=t.default}D.extendTranslations(Ks);var Ys=new Set([`temperature`,`humidity`,`illuminance`,`motion`,`door`,`window`,`windowTilt`,`fireAlarm`,`floodAlarm`,`camera`,`weatherCurrent`,`weatherForecast`,`warning`,`location`,`info`,`chart`,`image`,`instance`]);function Xs(e){return e===`lock`?{read:!0,write:!1}:{read:!0,write:!0}}var Zs=[{value:`en`,label:`English`},{value:`de`,label:`Deutsch`},{value:`ru`,label:`Русский`},{value:`pt`,label:`Português`},{value:`nl`,label:`Nederlands`},{value:`fr`,label:`Français`},{value:`it`,label:`Italiano`},{value:`es`,label:`Español`},{value:`pl`,label:`Polski`},{value:`uk`,label:`Українська`},{value:`zh-cn`,label:`简体中文`}],Qs=class extends P{constructor(e){super(e),C(this,`aliveSubId`,``),C(this,`onAliveChange`,(e,t)=>{let n=!!(t!=null&&t.val);n!==this.state.alive&&this.setState({alive:n,loading:n},()=>{n&&this.loadDevices()})}),this.state={...this.state,devices:[],loading:!0,alive:!1,filter:``,edits:{},savingKey:``,translatingKeys:{},rowStatus:{},hideDisabled:!1}}rowColor(e){switch(this.state.rowStatus[e]){case`dirty`:return`rgba(128,128,128,0.20)`;case`saving`:return`rgba(244,67,54,0.20)`;case`saved`:return`rgba(76,175,80,0.28)`;default:return}}setRowStatus(e,t){this.setState(n=>{let r={...n.rowStatus};return t?r[e]=t:delete r[e],{rowStatus:r}})}get instanceId(){let e=this.props.oContext;return`${e.adapterName}.${e.instance}`}get editLang(){return String(this.props.data.voiceLanguage||``)||D.getLanguage()}componentDidUpdate(e){String(e.data.voiceLanguage||``)!==String(this.props.data.voiceLanguage||``)&&Object.keys(this.state.edits).length&&this.setState({edits:{}})}async componentDidMount(){super.componentDidMount(),this.aliveSubId=`system.adapter.${this.instanceId}.alive`;let e=!1;try{let t=await this.props.oContext.socket.getState(this.aliveSubId);e=!!(t!=null&&t.val)}catch{e=!1}this.setState({alive:e},()=>void this.loadDevices()),this.props.oContext.socket.subscribeState(this.aliveSubId,this.onAliveChange)}componentWillUnmount(){var e;this.aliveSubId&&this.props.oContext.socket.unsubscribeState(this.aliveSubId,this.onAliveChange),(e=super.componentWillUnmount)==null||e.call(this)}async loadDevices(e=4){if(!this.state.alive){this.setState({loading:!1});return}let t=[];try{let e=await this.props.oContext.socket.sendTo(this.instanceId,`getDevices`,{language:D.getLanguage()});t=(Array.isArray(e)?e:[]).filter(e=>e.type!==`button`)}catch{t=[]}!t.length&&e>0?setTimeout(()=>{this.state.alive&&this.loadDevices(e-1)},1200):this.setState({devices:t,edits:{},loading:!1})}nameFor(e){let t=this.editLang,n=e.smartName;if(typeof n==`string`&&n)return{value:n,exact:!0,from:``};if(n&&typeof n==`object`){if(n[t])return{value:n[t],exact:!0,from:t};let e=n.en?`en`:Object.keys(n)[0];if(e&&n[e])return{value:n[e],exact:!1,from:e}}return{value:e.autoName||e.name||``,exact:!1,from:`auto`}}fieldValue(e){return this.state.edits[e.key]??this.nameFor(e).value}onNameChange(e,t){let n=this.state.devices.find(t=>t.key===e),r=n?this.nameFor(n).value:``;this.setState(n=>{let i={...n.rowStatus};return t===r?i[e]===`dirty`&&delete i[e]:i[e]=`dirty`,{edits:{...n.edits,[e]:t},rowStatus:i}})}flashSaved(e){this.setRowStatus(e,`saved`),setTimeout(()=>{this.state.rowStatus[e]===`saved`&&this.setRowStatus(e,null)},2e3)}applyLocalName(e,t,n){this.setState(r=>({devices:r.devices.map(r=>{if(r.key!==e)return r;let i=r.smartName&&typeof r.smartName==`object`?{...r.smartName}:typeof r.smartName==`string`&&r.smartName?{en:r.smartName}:{};return n?i[t]=n:delete i[t],{...r,smartName:i}}),edits:(()=>{let t={...r.edits};return delete t[e],t})()}))}async saveName(e){let t=this.state.edits[e.key];if(t===void 0||t===this.nameFor(e).value)return;let n=this.editLang;this.setState({savingKey:e.key}),this.setRowStatus(e.key,`saving`);try{await this.props.oContext.socket.sendTo(this.instanceId,`setDeviceName`,{stateId:e.key,name:t,language:n}),this.applyLocalName(e.key,n,t.trim()),this.flashSaved(e.key)}catch{this.setRowStatus(e.key,`dirty`)}this.setState({savingKey:``})}async translateName(e){let t=this.nameFor(e).value,n=e.key;if(!t||this.state.translatingKeys[n])return;let r=this.editLang;this.setState(e=>({translatingKeys:{...e.translatingKeys,[n]:!0}})),this.setRowStatus(n,`saving`);try{var i;let e=await this.props.oContext.socket.sendTo(this.instanceId,`translateName`,{text:t,targetLang:r}),a=e==null||(i=e.translation)==null?void 0:i.trim();a?(await this.props.oContext.socket.sendTo(this.instanceId,`setDeviceName`,{stateId:n,name:a,language:r}),this.applyLocalName(n,r,a),this.flashSaved(n)):this.setRowStatus(n,null)}catch{this.setRowStatus(n,null)}this.setState(e=>{let t={...e.translatingKeys};return delete t[n],{translatingKeys:t}})}async translateAllMissing(){let e=this.state.devices.filter(e=>!this.nameFor(e).exact&&!this.state.translatingKeys[e.key]);await Promise.all(e.map(e=>this.translateName(e)))}getAcl(e){var t;return((t=this.props.data.deviceAcl)==null?void 0:t[e.key])||Xs(e.type)}setAcl(e,t){let n=JSON.parse(JSON.stringify(this.props.data));n.deviceAcl=n.deviceAcl||{};let r=Xs(e.type),i={...n.deviceAcl[e.key]||r,...t};i.read===r.read&&i.write===r.write?delete n.deviceAcl[e.key]:n.deviceAcl[e.key]=i,this.props.onChange(n)}renderItem(){var e;if(this.state.loading)return y(l,{});if(!this.state.alive)return y(E,{sx:{p:2},color:`warning.main`,children:D.t(`custom_assistant_Start the assistant instance to load the device list.`)});if(!this.state.devices.length)return y(E,{sx:{p:2},children:D.t(`custom_assistant_No devices detected. Assign states to rooms and functions in ioBroker.`)});let t=this.state.filter.trim().toLowerCase(),i=t?this.state.devices.filter(e=>`${e.name} ${e.type} ${e.room}`.toLowerCase().includes(t)):this.state.devices;this.state.hideDisabled&&(i=i.filter(e=>this.getAcl(e).read));let a=this.props.oContext.themeType===`dark`;return _(S,{sx:{width:`100%`},children:[y(E,{variant:`h6`,sx:{mt:1},children:D.t(`custom_assistant_Per-device permissions`)}),y(E,{variant:`body2`,sx:{mb:1},color:`text.secondary`,children:D.t(`custom_assistant_hint`)}),_(S,{sx:{display:`flex`,alignItems:`center`,gap:1,mb:1,flexWrap:`wrap`},children:[y(O,{size:`small`,color:`primary`,variant:`outlined`,label:D.t(`custom_assistant_Name language: %s`,((e=Zs.find(e=>e.value===this.editLang))==null?void 0:e.label)||this.editLang)}),y(E,{variant:`caption`,color:`text.secondary`,children:D.t(`custom_assistant_change it on the Voice tab`)}),(()=>{let e=this.state.devices.filter(e=>!this.nameFor(e).exact).length,t=Object.keys(this.state.translatingKeys).length>0;return y(A,{size:`small`,variant:`outlined`,startIcon:t?y(w,{size:14}):y(s,{}),disabled:!e||t,onClick:()=>void this.translateAllMissing(),children:D.t(`custom_assistant_Translate all missing (%s)`,e)})})(),y(S,{sx:{flex:1}}),y(r,{control:y(p,{size:`small`,checked:this.state.hideDisabled,onChange:e=>this.setState({hideDisabled:e.target.checked})}),label:D.t(`custom_assistant_Hide disabled`)}),y(T,{variant:`standard`,size:`small`,label:`Filter`,value:this.state.filter,onChange:e=>this.setState({filter:e.target.value}),sx:{width:320}})]}),y(ce,{component:oe,sx:{width:`100%`},children:_(f,{size:`small`,children:[y(h,{children:_(n,{sx:{background:a?`#333`:`#DDD`},children:[y(v,{children:D.t(`custom_assistant_device`)}),y(v,{children:D.t(`custom_assistant_type`)}),y(v,{children:D.t(`custom_assistant_room`)}),y(v,{align:`center`,children:D.t(`custom_assistant_read`)}),y(v,{align:`center`,children:D.t(`custom_assistant_write`)})]})}),y(se,{children:i.map(e=>{let t=this.getAcl(e),r=e.writableStateIds.length>0&&!Ys.has(e.type),i=!t.read;return _(n,{sx:{background:this.rowColor(e.key),opacity:i?.5:1,transition:`background-color 0.4s`},children:[_(v,{children:[(()=>{let t=this.nameFor(e),n=!!this.state.translatingKeys[e.key],r=this.state.savingKey===e.key||n;return _(S,{sx:{display:`flex`,alignItems:`flex-start`,gap:.5},children:[y(T,{variant:`standard`,size:`small`,fullWidth:!0,value:this.fieldValue(e),disabled:r,error:!t.exact&&!this.state.edits[e.key],helperText:!t.exact&&!this.state.edits[e.key]?D.t(`custom_assistant_no name in %s (showing %s)`,this.editLang,t.from===`auto`?D.t(`custom_assistant_auto`):t.from):` `,onChange:t=>this.onNameChange(e.key,t.target.value),onBlur:()=>void this.saveName(e),onKeyDown:e=>{e.key===`Enter`&&e.target.blur()},slotProps:{input:{endAdornment:this.state.savingKey===e.key?y(w,{size:14}):null}}}),y(x,{title:D.t(`custom_assistant_Translate name into %s`,this.editLang),children:y(`span`,{children:y(m,{size:`small`,disabled:r,onClick:()=>void this.translateName(e),children:n?y(w,{size:16}):y(s,{fontSize:`small`})})})})]})})(),e.stateIds.length?y(E,{variant:`caption`,component:`div`,sx:{wordBreak:`break-all`,fontStyle:`italic`,opacity:.7,fontSize:`smaller`},children:e.stateIds.join(`, `)}):null]}),y(v,{children:_(S,{sx:{display:`flex`,alignItems:`center`,gap:.75},children:[y(ue,{type:e.type,style:{width:20,height:20}}),y(`span`,{children:D.t(`type-${e.type}`)})]})}),y(v,{children:e.room&&e.room!==`No room`?e.room:`-`}),y(v,{align:`center`,children:y(fe,{checked:t.read,onChange:()=>this.setAcl(e,{read:!t.read})})}),y(v,{align:`center`,children:y(fe,{checked:t.write&&r,disabled:!r,onChange:()=>this.setAcl(e,{write:!t.write})})})]},e.key)})})]})})]})}},$s={},ec=Object.assign({"./i18n/de.json":F,"./i18n/en.json":H,"./i18n/es.json":U,"./i18n/fr.json":W,"./i18n/it.json":G,"./i18n/nl.json":K,"./i18n/pl.json":J,"./i18n/pt.json":Y,"./i18n/ru.json":X,"./i18n/uk.json":Z,"./i18n/zh-cn.json":Q});for(let[e,t]of Object.entries(ec)){var tc;let n=((tc=e.split(`/`).pop())==null?void 0:tc.replace(`.json`,``))||`en`;$s[n]=t.default}D.extendTranslations($s);var nc={chat:`Chat`,script:`custom_assistant_Script`,state:`custom_assistant_State`,telegram:`Telegram`,esphome:`ESPHome`,udp:`UDP`,native:`ioBroker`,wyoming:`Wyoming`},rc={stop:`custom_assistant_Stop word`,askReply:`custom_assistant_Reply to a question`,routine:`custom_assistant_Routine`,nlu:`custom_assistant_Rule-based NLU`,localLlm:`custom_assistant_Local LLM`,cloud:`custom_assistant_Cloud LLM`,none:`custom_assistant_Not understood`},ic={stop:`#78909c`,askReply:`#78909c`,routine:`#00897b`,nlu:`#43a047`,localLlm:`#8e24aa`,cloud:`#1e88e5`,none:`#e53935`};function ac(e){return e.satellite||e.source||e.transport}function oc(e){return typeof e==`string`?`"${e}"`:JSON.stringify(e)}function $(e){return e===void 0?``:e<1e3?`${e} ms`:`${(e/1e3).toFixed(1)} s`}var sc=class extends P{constructor(e){super(e),C(this,`scrollRef`,t.createRef()),C(this,`aliveSubId`,``),C(this,`journalSubId`,``),C(this,`recognition`,null),C(this,`onJournalChange`,(e,t)=>{if(!(t!=null&&t.val)||typeof t.val!=`string`)return;let n;try{n=JSON.parse(t.val)}catch{return}if(!(n!=null&&n.id))return;let r=this.isNearBottom();this.setState(e=>({entries:{...e.entries,[n.id]:n}})),r&&this.scrollToBottom()}),C(this,`onAliveChange`,(e,t)=>{let n=!!(t!=null&&t.val),r=this.state.alive;this.setState({alive:n}),n&&!r&&(this.checkTtsAvailable(),this.loadJournal())}),C(this,`onKeyDown`,e=>{e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),this.send())});let n=!0;try{n=window.localStorage.getItem(`assistant.chat.details`)!==`0`}catch{}this.state={...this.state,messages:[],entries:{},journalEnabled:null,showDetails:n,filter:``,confirmClear:!1,input:``,sending:!1,alive:!1,listening:!1,speak:!1,ttsPlaying:``,ttsAvailable:!1}}async checkTtsAvailable(){try{let e=await this.props.oContext.socket.sendTo(this.instanceId,`ttsAvailable`,{});this.setState({ttsAvailable:!!(e!=null&&e.available)})}catch{this.setState({ttsAvailable:!1})}}async loadJournal(){try{let e=await this.props.oContext.socket.sendTo(this.instanceId,`getJournal`,{});if(!e||e.enabled===void 0){this.setState({journalEnabled:!1});return}let t={};for(let n of e.entries||[])t[n.id]=n;this.setState(n=>({journalEnabled:!!e.enabled,entries:{...t,...n.entries}})),this.scrollToBottom()}catch{this.setState({journalEnabled:!1})}}get speechSupported(){let e=window;return(!!e.SpeechRecognition||!!e.webkitSpeechRecognition)&&window.isSecureContext}get ttsSupported(){return typeof window<`u`&&`speechSynthesis`in window}speechLang(){return{de:`de-DE`,en:`en-US`,ru:`ru-RU`,pt:`pt-PT`,nl:`nl-NL`,fr:`fr-FR`,it:`it-IT`,es:`es-ES`,pl:`pl-PL`,uk:`uk-UA`,"zh-cn":`zh-CN`}[D.getLanguage()]||`en-US`}get instanceId(){let e=this.props.oContext;return`${e.adapterName}.${e.instance}`}async componentDidMount(){super.componentDidMount(),this.aliveSubId=`system.adapter.${this.instanceId}.alive`,this.journalSubId=`${this.instanceId}.journal.last`;let e=!1;try{let t=await this.props.oContext.socket.getState(this.aliveSubId);e=!!(t!=null&&t.val)}catch{e=!1}this.setState({alive:e}),e&&(this.checkTtsAvailable(),this.loadJournal()),this.props.oContext.socket.subscribeState(this.aliveSubId,this.onAliveChange),this.props.oContext.socket.subscribeState(this.journalSubId,this.onJournalChange)}componentWillUnmount(){var e;this.aliveSubId&&this.props.oContext.socket.unsubscribeState(this.aliveSubId,this.onAliveChange),this.journalSubId&&this.props.oContext.socket.unsubscribeState(this.journalSubId,this.onJournalChange);try{var t;(t=this.recognition)==null||t.stop()}catch{}this.ttsSupported&&window.speechSynthesis.cancel(),(e=super.componentWillUnmount)==null||e.call(this)}toggleListening(){if(this.state.listening){var e;(e=this.recognition)==null||e.stop();return}let t=window,n=t.SpeechRecognition||t.webkitSpeechRecognition;if(!n)return;let r=new n;r.lang=this.speechLang(),r.interimResults=!1,r.continuous=!1,r.onresult=e=>{var t;let n=((t=e.results)==null||(t=t[0])==null||(t=t[0])==null?void 0:t.transcript)||``;n&&this.setState({input:n},()=>void this.send())},r.onerror=()=>this.setState({listening:!1}),r.onend=()=>this.setState({listening:!1}),this.recognition=r,this.setState({listening:!0});try{r.start()}catch{this.setState({listening:!1})}}speak(e){if(!this.ttsSupported||!e)return;window.speechSynthesis.cancel();let t=new SpeechSynthesisUtterance(e);t.lang=this.speechLang(),window.speechSynthesis.speak(t)}async playViaBackend(e,t){if(this.ready&&t){this.setState({ttsPlaying:e});try{let e=await this.props.oContext.socket.sendTo(this.instanceId,`tts`,{text:t});if(e!=null&&e.audio){let t=new Audio(`data:${e.mime||`audio/wav`};base64,${e.audio}`);t.onended=()=>this.setState({ttsPlaying:``}),t.onerror=()=>this.setState({ttsPlaying:``}),await t.play()}else this.setState({ttsPlaying:``})}catch{this.setState({ttsPlaying:``})}}}isNearBottom(){let e=this.scrollRef.current;return!e||e.scrollHeight-e.scrollTop-e.clientHeight<80}scrollToBottom(){setTimeout(()=>{let e=this.scrollRef.current;e&&(e.scrollTop=e.scrollHeight)},0)}get ready(){return this.state.alive&&!this.props.changed}addMessage(e){this.setState(t=>({messages:[...t.messages,e]})),this.scrollToBottom()}async send(){let e=this.state.input.trim();if(!e||this.state.sending||!this.ready)return;let t=!!this.state.journalEnabled;this.setState({input:``,sending:!0}),t||this.addMessage({role:`user`,text:e,ts:Date.now()}),this.state.filter&&this.state.filter!==`chat`&&this.setState({filter:``}),this.scrollToBottom();try{let t=await this.props.oContext.socket.sendTo(this.instanceId,`ask`,{text:e});(t==null?void 0:t.error)===void 0?t!=null&&t.journaled||this.addMessage({role:`assistant`,text:(t==null?void 0:t.answer)??``,ts:Date.now()}):t.journaled||this.addMessage({role:`error`,text:t.error,ts:Date.now()}),this.state.speak&&t!=null&&t.answer&&this.speak(t.answer)}catch(e){this.addMessage({role:`error`,text:e.message,ts:Date.now()})}this.setState({sending:!1})}async refreshCache(){if(this.ready)try{await this.props.oContext.socket.sendTo(this.instanceId,`clearCache`,{}),this.addMessage({role:`info`,text:D.t(`custom_assistant_Device cache cleared.`),ts:Date.now()})}catch{}}async clearHistory(){if(this.setState({confirmClear:!1,messages:[],entries:{}}),this.state.journalEnabled&&this.state.alive)try{await this.props.oContext.socket.sendTo(this.instanceId,`clearJournal`,{})}catch{}}toggleDetails(){let e=!this.state.showDetails;this.setState({showDetails:e});try{window.localStorage.setItem(`assistant.chat.details`,e?`1`:`0`)}catch{}}bubbleColors(e){let t=this.props.oContext.themeType===`dark`;return e===`user`?{bg:t?`#1e88e5`:`#2196f3`,color:`#fff`}:e===`error`?{bg:t?`#5d1f1f`:`#f8d7da`,color:t?`#ffb4b4`:`#842029`}:{bg:t?`#3a3a3a`:`#eceff1`,color:t?`#eee`:`#111`}}renderBubble(e,t,n,r,a={}){let o=t===`user`,{bg:s,color:c}=this.bubbleColors(t);return y(S,{sx:{display:`flex`,justifyContent:o?`flex-end`:`flex-start`,mb:.5},children:_(oe,{elevation:1,sx:{px:1.5,py:1,maxWidth:`75%`,background:s,color:c,borderRadius:2,whiteSpace:`pre-wrap`,wordBreak:`break-word`},children:[a.header,y(E,{variant:`body2`,component:`div`,children:n}),_(S,{sx:{display:`flex`,alignItems:`center`,justifyContent:`flex-end`,gap:.5},children:[a.footer,a.playText&&this.state.ttsAvailable?y(x,{title:D.t(`custom_assistant_Play answer (backend TTS)`),children:y(`span`,{children:y(m,{size:`small`,disabled:!this.ready||this.state.ttsPlaying===e,onClick:()=>void this.playViaBackend(e,a.playText||``),sx:{p:.25,color:`inherit`,opacity:.7},children:this.state.ttsPlaying===e?y(w,{size:12}):y(i,{sx:{fontSize:`0.9rem`}})})})}):null,y(E,{variant:`caption`,component:`div`,sx:{opacity:.6,fontSize:`0.65rem`},children:new Date(r).toLocaleTimeString()})]})]})},e)}renderMessage(e,t){return e.role===`info`?y(E,{variant:`caption`,component:`div`,sx:{textAlign:`center`,opacity:.6,my:1,fontStyle:`italic`},children:e.text},`m${t}`):this.renderBubble(`m${t}`,e.role,e.text,e.ts,{playText:e.role===`assistant`?e.text:void 0})}chip(e,n,r){let i=y(O,{size:`small`,label:e,sx:{height:18,fontSize:`0.68rem`,mr:.5,color:r?`#fff`:`inherit`,background:r||`rgba(127,127,127,0.25)`,"& .MuiChip-label":{px:.75}}});return n?y(x,{title:n,children:i},e):y(t.Fragment,{children:i},e)}renderOrigin(e){let t=[this.chip(D.t(nc[e.transport]||e.transport))],n=e.satellite||(e.transport===`chat`||e.transport===`state`?``:e.source);return n&&t.push(this.chip(n,D.t(`custom_assistant_Source`))),e.room&&e.room!==n&&t.push(this.chip(e.room,D.t(`custom_assistant_Room`))),e.wakeWord!==void 0&&t.push(e.wakeWord?this.chip(`🎙 ${e.wakeWord}`,D.t(`custom_assistant_Wake word`)):this.chip(`🎙 ${D.t(`custom_assistant_follow-up`)}`,D.t(`custom_assistant_Mic re-opened without wake word`))),e.sttMs!==void 0&&t.push(this.chip(`STT ${$(e.sttMs)}`,D.t(`custom_assistant_Speech recognition time`))),y(S,{sx:{mb:.5,opacity:.9},children:t})}renderDetails(e){if(!this.state.showDetails)return null;let t={fontFamily:`monospace`,fontSize:`0.72rem`},n=[];for(let[r,i]of e.tools.entries())n.push(_(S,{sx:{...t,color:i.error?`error.main`:void 0},children:[`🔧 `,i.name,`(`,JSON.stringify(i.args),`) → `,i.error?`⚠ ${i.error}`:i.result,` `,``,y(`span`,{style:{opacity:.6},children:$(i.ms)})]},`t${r}`));e.read.length&&n.push(_(S,{sx:t,children:[`📖 `,e.read.join(`, `)]},`r`));for(let[r,i]of e.written.entries())n.push(_(S,{sx:t,children:[`✏️ `,i.id,` = `,oc(i.value)]},`w${r}`));return _(S,{sx:{ml:1,mb:1.5,pl:1,borderLeft:`2px solid rgba(127,127,127,0.35)`,opacity:.85},children:[_(S,{sx:{display:`flex`,alignItems:`center`,flexWrap:`wrap`,gap:.25},children:[e.tier?this.chip(D.t(rc[e.tier]),void 0,ic[e.tier]):null,e.detail?y(E,{variant:`caption`,sx:{...t,mr:1},children:e.detail}):null,e.done?y(E,{variant:`caption`,sx:{opacity:.7},children:$(e.ms)}):null,e.followUp?this.chip(D.t(`custom_assistant_waits for reply`)):null]}),n]})}renderEntry(e){let n;return n=e.done?e.error?this.renderBubble(`${e.id}a`,`error`,e.error,e.ts+(e.ms||0)):this.renderBubble(`${e.id}a`,`assistant`,e.answer||y(`i`,{style:{opacity:.6},children:D.t(`custom_assistant_(no spoken answer)`)}),e.ts+(e.ms||0),{playText:e.answer||void 0}):_(S,{sx:{display:`flex`,alignItems:`center`,gap:1,p:1,opacity:.7},children:[y(w,{size:16}),y(E,{variant:`body2`,children:D.t(`custom_assistant_Thinking…`)})]},`${e.id}a`),_(t.Fragment,{children:[this.renderBubble(`${e.id}q`,`user`,e.question,e.ts,{header:this.renderOrigin(e)}),n,this.renderDetails(e)]},e.id)}renderTimeline(){let{entries:e,messages:t,filter:n}=this.state,r=[];for(let t of Object.values(e))n&&ac(t)!==n||r.push({ts:t.ts,el:()=>this.renderEntry(t)});return n&&n!==`chat`||t.forEach((e,t)=>r.push({ts:e.ts,el:()=>this.renderMessage(e,t)})),r.sort((e,t)=>e.ts-t.ts),r.map(e=>e.el())}renderFilter(){let e=[...new Set(Object.values(this.state.entries).map(ac))].sort();return!this.state.journalEnabled||e.length<2?null:_(k,{size:`small`,variant:`standard`,value:e.includes(this.state.filter)?this.state.filter:``,displayEmpty:!0,onChange:e=>this.setState({filter:String(e.target.value)}),sx:{mr:1,minWidth:140,fontSize:`0.85rem`},children:[y(g,{value:``,children:D.t(`custom_assistant_All sources`)}),e.map(e=>y(g,{value:e,children:e},e))]})}renderItem(){let e=this.props.oContext.themeType===`dark`,{alive:t,messages:n,entries:r,sending:i,input:a,listening:o,speak:s,journalEnabled:c,showDetails:l}=this.state,d=this.ready,f=this.renderTimeline(),p=!n.length&&!Object.keys(r).length;return _(S,{sx:{width:`100%`,display:`flex`,flexDirection:`column`,height:`calc(100vh - 300px)`},children:[_(S,{sx:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,mb:1},children:[_(S,{children:[y(E,{variant:`h6`,children:D.t(c?`custom_assistant_Chat`:`custom_assistant_Test chat`)}),c?y(E,{variant:`caption`,sx:{opacity:.7},children:D.t(`custom_assistant_Shows all requests live: satellites, Telegram, scripts and this chat.`)}):null]}),_(S,{sx:{display:`flex`,alignItems:`center`},children:[this.renderFilter(),c?y(x,{title:D.t(l?`custom_assistant_Hide processing details`:`custom_assistant_Show processing details`),children:y(m,{size:`small`,color:l?`primary`:`default`,onClick:()=>this.toggleDetails(),children:y(l?le:me,{})})}):null,this.ttsSupported?y(x,{title:D.t(s?`custom_assistant_Stop reading answers aloud`:`custom_assistant_Read answers aloud`),children:y(m,{size:`small`,color:s?`primary`:`default`,onClick:()=>{s&&window.speechSynthesis.cancel(),this.setState({speak:!s})},children:y(s?pe:ne,{})})}):null,y(x,{title:D.t(`custom_assistant_Refresh device cache`),children:y(`span`,{children:y(m,{size:`small`,disabled:!d,onClick:()=>void this.refreshCache(),children:y(te,{})})})}),y(x,{title:D.t(`custom_assistant_Clear chat`),children:y(`span`,{children:y(m,{size:`small`,disabled:p,onClick:()=>c?this.setState({confirmClear:!0}):void this.clearHistory(),children:y(ae,{})})})})]})]}),d?null:y(E,{sx:{p:2},color:`warning.main`,children:t?D.t(`custom_assistant_Save the configuration (the instance will restart) before chatting.`):D.t(`custom_assistant_Start the assistant instance to chat.`)}),_(S,{ref:this.scrollRef,sx:{flex:1,overflowY:`auto`,p:1,border:`1px solid ${e?`#444`:`#ccc`}`,borderRadius:1,background:e?`#1e1e1e`:`#fafafa`,mb:1},children:[f.length?f:y(E,{sx:{p:2,textAlign:`center`,opacity:.6},variant:`body2`,children:D.t(`custom_assistant_No messages yet. Type a question below.`)}),i&&!c?_(S,{sx:{display:`flex`,alignItems:`center`,gap:1,p:1,opacity:.7},children:[y(w,{size:16}),y(E,{variant:`body2`,children:D.t(`custom_assistant_Thinking…`)})]}):null]}),_(S,{sx:{display:`flex`,alignItems:`flex-end`,gap:1},children:[this.speechSupported?y(x,{title:D.t(o?`custom_assistant_Stop listening`:`custom_assistant_Speak`),children:y(`span`,{children:y(m,{color:o?`error`:`primary`,disabled:!d||i,onClick:()=>this.toggleListening(),children:y(he,{})})})}):null,y(T,{fullWidth:!0,multiline:!0,maxRows:4,size:`small`,variant:`outlined`,placeholder:D.t(o?`custom_assistant_Listening…`:`custom_assistant_Type a message…`),value:a,disabled:!d||i,onChange:e=>this.setState({input:e.target.value}),onKeyDown:this.onKeyDown}),y(m,{color:`primary`,disabled:!d||i||!a.trim(),onClick:()=>void this.send(),children:y(u,{})})]}),_(b,{open:this.state.confirmClear,onClose:()=>this.setState({confirmClear:!1}),children:[y(M,{children:D.t(`custom_assistant_Clear chat`)}),y(N,{children:y(E,{variant:`body2`,children:D.t(`custom_assistant_Delete the recorded history of all sources?`)})}),_(j,{children:[y(A,{color:`error`,variant:`contained`,onClick:()=>void this.clearHistory(),children:D.t(`custom_assistant_Delete`)}),y(A,{onClick:()=>this.setState({confirmClear:!1}),children:D.t(`custom_assistant_Cancel`)})]})]})]})}},cc={},lc=Object.assign({"./i18n/de.json":F,"./i18n/en.json":H,"./i18n/es.json":U,"./i18n/fr.json":W,"./i18n/it.json":G,"./i18n/nl.json":K,"./i18n/pl.json":J,"./i18n/pt.json":Y,"./i18n/ru.json":X,"./i18n/uk.json":Z,"./i18n/zh-cn.json":Q});for(let[e,t]of Object.entries(lc)){var uc;let n=((uc=e.split(`/`).pop())==null?void 0:uc.replace(`.json`,``))||`en`;cc[n]=t.default}D.extendTranslations(cc);var dc={ready:`success`,error:`error`,installing:`info`,downloading:`info`,loading:`info`},fc=class extends P{constructor(e){super(e),C(this,`statusId`,``),C(this,`progressId`,``),C(this,`onStatus`,(e,t)=>{this.setState({status:(t==null?void 0:t.val)||`idle`})}),C(this,`onProgress`,(e,t)=>{this.setState({progress:Number(t==null?void 0:t.val)||0})}),this.state={...this.state,status:`idle`,progress:0}}get instanceId(){let e=this.props.oContext;return`${e.adapterName}.${e.instance}`}async componentDidMount(){super.componentDidMount(),this.statusId=`${this.instanceId}.localLlm.status`,this.progressId=`${this.instanceId}.localLlm.progress`;let e=this.props.oContext.socket;try{let t=await e.getState(this.statusId),n=await e.getState(this.progressId);this.setState({status:(t==null?void 0:t.val)||`idle`,progress:Number(n==null?void 0:n.val)||0})}catch{}e.subscribeState(this.statusId,this.onStatus),e.subscribeState(this.progressId,this.onProgress)}componentWillUnmount(){var e;let t=this.props.oContext.socket;this.statusId&&(t.unsubscribeState(this.statusId,this.onStatus),t.unsubscribeState(this.progressId,this.onProgress)),(e=super.componentWillUnmount)==null||e.call(this)}renderItem(){let{status:e,progress:t}=this.state,n=e===`installing`||e===`downloading`||e===`loading`,r=e===`downloading`;return _(S,{sx:{width:`100%`,mt:.5,mb:1},children:[_(S,{sx:{display:`flex`,alignItems:`center`,gap:1,mb:.5},children:[_(E,{variant:`body2`,children:[D.t(`custom_assistant_Local model`),`:`]}),y(O,{size:`small`,color:dc[e]||`default`,variant:`outlined`,label:D.t(`custom_assistant_llm_${e}`)}),r?_(E,{variant:`body2`,children:[Math.round(t),`%`]}):null]}),n?y(l,{variant:r?`determinate`:`indeterminate`,value:r?t:void 0}):null]})}};function pc(e){return e.common.write===!1}function mc(e){var n,r;let{values:i,objects:s,loading:c,onWrite:l}=e,u=t.useMemo(()=>{try{let e=i.availableWakeWords;return e?JSON.parse(String(e)):null}catch{return null}},[i.availableWakeWords]),f=String(i.wakeWords??``).split(`,`).map(e=>e.trim()).filter(Boolean),ee=e=>{let t=f.includes(e)?f.filter(t=>t!==e):[...f,e];l(`wakeWords`,t.join(`,`))},m=(u==null?void 0:u.max)||0,te=m>0&&f.length>=m,ne=Object.keys(s).sort(),h=new Map;for(let e of ne){let t=e.replace(/^controls\./,``),n=t.indexOf(`.`),r=n<0?t:t.slice(0,n);h.set(r,[...h.get(r)||[],e])}function re(e){let t=s[e],n=t.common,r=n.name&&typeof n.name==`string`?n.name:e,c=i[e];if(n.role===`button`)return y(A,{size:`small`,variant:`outlined`,onClick:()=>l(e,!0),children:r},e);if(pc(t))return _(S,{children:[y(E,{variant:`caption`,sx:{opacity:.7},children:r}),y(E,{variant:`body2`,children:c==null?`—`:String(c)})]},e);if(n.type===`boolean`)return _(S,{sx:{display:`flex`,alignItems:`center`,justifyContent:`space-between`},children:[y(E,{variant:`body2`,children:r}),y(p,{size:`small`,checked:!!c,onChange:t=>l(e,t.target.checked)})]},e);if(n.states){let t=Array.isArray(n.states)?Object.fromEntries(n.states.map(e=>[e,e])):n.states;return _(a,{size:`small`,fullWidth:!0,children:[y(o,{children:r}),y(k,{label:r,value:c==null?``:String(c),onChange:t=>l(e,t.target.value),children:Object.entries(t).map(([e,t])=>y(g,{value:e,children:t},e))})]},e)}if(n.type===`number`&&n.min!==void 0&&n.max!==void 0){let t=Number(c??n.min);return _(S,{children:[_(E,{variant:`body2`,children:[r,_(E,{component:`span`,variant:`caption`,sx:{ml:1,opacity:.7},children:[t,n.unit||``,` (`,n.min,`…`,n.max,`)`]})]}),y(d,{size:`small`,value:Number.isFinite(t)?t:n.min,min:n.min,max:n.max,step:n.step||1,onChangeCommitted:(t,n)=>l(e,Array.isArray(n)?n[0]:n),valueLabelDisplay:`auto`})]},e)}return y(T,{size:`small`,fullWidth:!0,label:r,defaultValue:c==null?``:String(c),onBlur:t=>l(e,t.target.value),onKeyDown:t=>{t.key===`Enter`&&l(e,t.target.value)}},e)}return _(b,{open:!0,onClose:e.onClose,maxWidth:`sm`,fullWidth:!0,children:[_(M,{children:[D.t(`custom_assistant_Settings for %s`,e.satId),e.room?y(E,{variant:`caption`,sx:{ml:1,opacity:.7},children:e.room}):null]}),y(N,{dividers:!0,children:c?y(S,{sx:{display:`flex`,justifyContent:`center`,p:3},children:y(w,{size:28})}):_(S,{sx:{display:`flex`,flexDirection:`column`,gap:2},children:[u!=null&&(n=u.words)!=null&&n.length?_(S,{children:[_(E,{variant:`subtitle2`,children:[D.t(`custom_assistant_Wake words`),y(E,{component:`span`,variant:`caption`,sx:{ml:1,opacity:.7},children:D.t(`custom_assistant_%s of %s active`,f.length,m)})]}),y(S,{sx:{display:`flex`,flexWrap:`wrap`,gap:.5,mt:1},children:u.words.map(e=>{let t=f.includes(e.id);return y(x,{title:e.languages.join(`, `),children:y(O,{size:`small`,label:e.phrase||e.id,color:t?`primary`:`default`,variant:t?`filled`:`outlined`,disabled:!t&&te,onClick:()=>ee(e.id),sx:{border:`1px solid`,borderColor:t?`primary.main`:`text.secondary`,bgcolor:t?void 0:`action.hover`,fontWeight:t?600:400}})},e.id)})}),y(E,{variant:`caption`,sx:{display:`block`,mt:.5,opacity:.7},children:D.t(`custom_assistant_wake_word_hint`)})]}):null,u!=null&&(r=u.words)!=null&&r.length&&h.size?y(ie,{}):null,[...h.entries()].map(([e,t])=>_(S,{sx:{display:`flex`,flexDirection:`column`,gap:1},children:[t.length>1?y(E,{variant:`subtitle2`,sx:{opacity:.8},children:e}):null,t.map(re)]},e)),!h.size&&!u?y(E,{variant:`body2`,sx:{opacity:.7},children:D.t(`custom_assistant_This satellite exposes no settings.`)}):null]})}),y(j,{children:y(A,{onClick:e.onClose,children:D.t(`custom_assistant_Close`)})})]})}var hc={},gc=Object.assign({"./i18n/de.json":F,"./i18n/en.json":H,"./i18n/es.json":U,"./i18n/fr.json":W,"./i18n/it.json":G,"./i18n/nl.json":K,"./i18n/pl.json":J,"./i18n/pt.json":Y,"./i18n/ru.json":X,"./i18n/uk.json":Z,"./i18n/zh-cn.json":Q});for(let[e,t]of Object.entries(gc)){var _c;let n=((_c=e.split(`/`).pop())==null?void 0:_c.replace(`.json`,``))||`en`;hc[n]=t.default}D.extendTranslations(hc);var vc={idle:`default`,listening:`info`,processing:`warning`,speaking:`success`,offline:`error`},yc=`__all__`,bc={DeviceAclComponent:Qs,ChatComponent:sc,LocalLlmProgress:fc,SatellitesComponent:class extends P{constructor(e){super(e),C(this,`pattern`,``),C(this,`onState`,(e,t)=>{this.setState(n=>{let r={...n.sats},i=this.parse(e);i&&r[i.satId]&&(r[i.satId]={...r[i.satId]}),this.applyToMap(r,e,t);let a={...n.vals};return this.applyToVals(a,e,t),{sats:r,vals:a}})}),this.state={...this.state,sats:{},speak:{},vals:{},settingsFor:null,settingsObjects:{},settingsLoading:!1}}get instanceId(){let e=this.props.oContext;return`${e.adapterName}.${e.instance}`}async componentDidMount(){super.componentDidMount(),this.pattern=`${this.instanceId}.satellites.*`;try{let e=await this.props.oContext.socket.getForeignStates(this.pattern),t={},n={};for(let[r,i]of Object.entries(e||{}))this.applyToMap(t,r,i),this.applyToVals(n,r,i);this.setState({sats:t,vals:n})}catch{}this.props.oContext.socket.subscribeState(this.pattern,this.onState)}componentWillUnmount(){var e;this.pattern&&this.props.oContext.socket.unsubscribeState(this.pattern,this.onState),(e=super.componentWillUnmount)==null||e.call(this)}parse(e){let t=`${this.instanceId}.satellites.`;if(!e.startsWith(t))return null;let n=e.slice(t.length),r=n.indexOf(`.`);return r<0?null:{satId:n.slice(0,r),prop:n.slice(r+1)}}applyToMap(e,t,n){let r=this.parse(t);if(!r)return;let i=e[r.satId]||{status:`idle`,room:``,host:``,alive:!1,lastSeen:0};r.prop===`status`?i.status=String((n==null?void 0:n.val)??`idle`):r.prop===`room`?i.room=String((n==null?void 0:n.val)??``):r.prop===`host`?i.host=String((n==null?void 0:n.val)??``):r.prop===`alive`?i.alive=!!(n!=null&&n.val):r.prop===`lastSeen`&&(i.lastSeen=Number(n==null?void 0:n.val)||0),e[r.satId]=i}applyToVals(e,t,n){let r=this.parse(t);r&&(e[r.satId]={...e[r.satId]||{},[r.prop]:(n==null?void 0:n.val)??null})}async openSettings(e){this.setState({settingsFor:e,settingsObjects:{},settingsLoading:!0});let t=`${this.instanceId}.satellites.${e}.`;try{let e=await this.props.oContext.socket.getForeignObjects(`${t}controls.*`,`state`),n={};for(let[r,i]of Object.entries(e||{}))i!=null&&i.common&&(n[r.slice(t.length)]=i);this.setState({settingsObjects:n,settingsLoading:!1})}catch{this.setState({settingsLoading:!1})}}writeSetting(e,t,n){this.props.oContext.socket.setState(`${this.instanceId}.satellites.${e}.${t}`,{val:n,ack:!1}).catch(()=>{})}announce(e){let t=(this.state.speak[e]||``).trim();if(!t)return;let n=e===yc?`${this.instanceId}.tts.text`:`${this.instanceId}.satellites.${e}.tts`;this.props.oContext.socket.setState(n,{val:t,ack:!1}).catch(()=>{}),this.setState(t=>({speak:{...t.speak,[e]:``}}))}ago(e){if(!e)return`—`;let t=Math.max(0,Math.round((Date.now()-e)/1e3));return t<60?`${t} s`:t<3600?`${Math.round(t/60)} min`:t<86400?`${Math.round(t/3600)} h`:`${Math.round(t/86400)} d`}renderComposer(e,t){let n=this.state.speak[e]||``;return _(S,{sx:{display:`flex`,alignItems:`center`,gap:.5},children:[y(T,{size:`small`,variant:`outlined`,placeholder:t,value:n,onChange:t=>this.setState(n=>({speak:{...n.speak,[e]:t.target.value}})),onKeyDown:t=>{t.key===`Enter`&&(t.preventDefault(),this.announce(e))},sx:{minWidth:180}}),y(x,{title:D.t(`custom_assistant_Send announcement`),children:y(`span`,{children:y(m,{size:`small`,color:`primary`,disabled:!n.trim(),onClick:()=>this.announce(e),children:y(c,{})})})})]})}renderItem(){var e;let t=Object.keys(this.state.sats).sort();return _(S,{sx:{width:`100%`},children:[_(S,{sx:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,mb:1},children:[y(E,{variant:`h6`,children:D.t(`custom_assistant_Satellites`)}),t.length?this.renderComposer(yc,D.t(`custom_assistant_Speak on all satellites`)):null]}),t.length?_(f,{size:`small`,sx:{"& td, & th":{px:1}},children:[y(h,{children:_(n,{children:[y(v,{}),y(v,{children:D.t(`custom_assistant_Satellite`)}),y(v,{children:D.t(`custom_assistant_room`)}),y(v,{children:D.t(`custom_assistant_Host`)}),y(v,{children:D.t(`custom_assistant_Status`)}),y(v,{children:D.t(`custom_assistant_Last seen`)}),y(v,{children:D.t(`custom_assistant_Announcement`)}),y(v,{})]})}),y(se,{children:t.map(e=>{let t=this.state.sats[e];return _(n,{children:[y(v,{sx:{width:24},children:y(x,{title:t.alive?D.t(`custom_assistant_online`):D.t(`custom_assistant_offline`),children:y(re,{sx:{fontSize:`0.8rem`,color:t.alive?`success.main`:`error.main`}})})}),y(v,{children:e}),y(v,{children:t.room||`—`}),y(v,{children:t.host||`—`}),y(v,{children:y(O,{size:`small`,variant:`outlined`,color:vc[t.status]||`default`,label:D.t(`custom_assistant_sat_${t.status}`)})}),y(v,{children:y(x,{title:t.lastSeen?new Date(t.lastSeen).toLocaleString():``,children:y(`span`,{children:this.ago(t.lastSeen)})})}),y(v,{children:this.renderComposer(e,D.t(`custom_assistant_Type a message…`))}),y(v,{sx:{width:40},children:y(x,{title:D.t(`custom_assistant_Device settings`),children:y(`span`,{children:y(m,{size:`small`,disabled:!t.alive,onClick:()=>void this.openSettings(e),children:y(ee,{})})})})})]},e)})})]}):y(E,{sx:{p:2,opacity:.7},variant:`body2`,children:D.t(`custom_assistant_No satellites registered yet.`)}),this.state.settingsFor?y(mc,{instanceId:this.instanceId,satId:this.state.settingsFor,room:((e=this.state.sats[this.state.settingsFor])==null?void 0:e.room)||``,values:this.state.vals[this.state.settingsFor]||{},objects:this.state.settingsObjects,loading:this.state.settingsLoading,onWrite:(e,t)=>this.writeSetting(this.state.settingsFor,e,t),onClose:()=>this.setState({settingsFor:null,settingsObjects:{}})}):null]})}}};export{bc as default};