iobroker.assistant 0.1.2

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 (98) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +176 -0
  3. package/admin/assistant.svg +19 -0
  4. package/admin/custom/.vite/manifest.json +169 -0
  5. package/admin/custom/assets/Components-DcnuVFM6.js +1 -0
  6. package/admin/custom/assets/_virtual_mf-localSharedImportMap___mfe_internal__ConfigCustomAssistant__mf_owner__1-DogEjv3U.js +1 -0
  7. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__1__loadShare___mf_0_emotion_mf_1_react__loadShare__.js-Dw5TkU1t.js +1 -0
  8. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__1__loadShare___mf_0_emotion_mf_1_styled__loadShare__.js-BEFjTs9S.js +1 -0
  9. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-C4r3udVz.js +1243 -0
  10. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__1__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__.js-DlOBHPL0.js +1494 -0
  11. package/admin/custom/assets/hostInit-DKMI-sLp.js +1 -0
  12. package/admin/custom/assets/index-B8wW0kQx.js +1 -0
  13. package/admin/custom/assets/lib-DpE8sc4h.js +3 -0
  14. package/admin/custom/assets/mf-entry-bootstrap-0-e7fa582d.js +36 -0
  15. package/admin/custom/assets/rolldown-runtime-C0FnF6B9.js +1 -0
  16. package/admin/custom/assets/virtualExposes-DOTO22UK.js +1 -0
  17. package/admin/custom/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__ConfigCustomAssistant__customComponents_js-CQa59yVi.js +1 -0
  18. package/admin/custom/assets/virtual_mf-exposes-ssr___mfe_internal__ConfigCustomAssistant__customComponents_js-9g2Fj8tk.js +2 -0
  19. package/admin/custom/assets/virtual_mf-exposes___mfe_internal__ConfigCustomAssistant__customComponents_js-BTUQTbYo.js +2 -0
  20. package/admin/custom/assets/vite-preload-helper-B7qeedMF.js +1 -0
  21. package/admin/custom/customComponents.js +1 -0
  22. package/admin/custom/customComponents.ssr.js +1 -0
  23. package/admin/custom/i18n/de.json +58 -0
  24. package/admin/custom/i18n/en.json +58 -0
  25. package/admin/custom/i18n/es.json +34 -0
  26. package/admin/custom/i18n/fr.json +34 -0
  27. package/admin/custom/i18n/it.json +34 -0
  28. package/admin/custom/i18n/nl.json +34 -0
  29. package/admin/custom/i18n/pl.json +34 -0
  30. package/admin/custom/i18n/pt.json +34 -0
  31. package/admin/custom/i18n/ru.json +34 -0
  32. package/admin/custom/i18n/uk.json +34 -0
  33. package/admin/custom/i18n/zh-cn.json +34 -0
  34. package/admin/custom/index.html +32 -0
  35. package/admin/custom/mf-manifest.json +1 -0
  36. package/admin/custom/mf-stats.json +1 -0
  37. package/admin/i18n/de.json +130 -0
  38. package/admin/i18n/en.json +130 -0
  39. package/admin/i18n/es.json +106 -0
  40. package/admin/i18n/fr.json +106 -0
  41. package/admin/i18n/it.json +106 -0
  42. package/admin/i18n/nl.json +106 -0
  43. package/admin/i18n/pl.json +106 -0
  44. package/admin/i18n/pt.json +106 -0
  45. package/admin/i18n/ru.json +106 -0
  46. package/admin/i18n/uk.json +106 -0
  47. package/admin/i18n/zh-cn.json +106 -0
  48. package/admin/jsonConfig.json +743 -0
  49. package/admin/sounds/alarm.wav +0 -0
  50. package/admin/sounds/timer.wav +0 -0
  51. package/build/lib/alarms.js +281 -0
  52. package/build/lib/alarms.js.map +1 -0
  53. package/build/lib/context.js +52 -0
  54. package/build/lib/context.js.map +1 -0
  55. package/build/lib/credentials.js +121 -0
  56. package/build/lib/credentials.js.map +1 -0
  57. package/build/lib/llm.js +303 -0
  58. package/build/lib/llm.js.map +1 -0
  59. package/build/lib/localLlm.js +221 -0
  60. package/build/lib/localLlm.js.map +1 -0
  61. package/build/lib/memory.js +190 -0
  62. package/build/lib/memory.js.map +1 -0
  63. package/build/lib/nlu.js +929 -0
  64. package/build/lib/nlu.js.map +1 -0
  65. package/build/lib/timers.js +245 -0
  66. package/build/lib/timers.js.map +1 -0
  67. package/build/lib/tools.js +299 -0
  68. package/build/lib/tools.js.map +1 -0
  69. package/build/lib/voice/aws.js +102 -0
  70. package/build/lib/voice/aws.js.map +1 -0
  71. package/build/lib/voice/azure.js +144 -0
  72. package/build/lib/voice/azure.js.map +1 -0
  73. package/build/lib/voice/download.js +76 -0
  74. package/build/lib/voice/download.js.map +1 -0
  75. package/build/lib/voice/engines.js +89 -0
  76. package/build/lib/voice/engines.js.map +1 -0
  77. package/build/lib/voice/lang.js +33 -0
  78. package/build/lib/voice/lang.js.map +1 -0
  79. package/build/lib/voice/piper.js +191 -0
  80. package/build/lib/voice/piper.js.map +1 -0
  81. package/build/lib/voice/protocol.js +35 -0
  82. package/build/lib/voice/protocol.js.map +1 -0
  83. package/build/lib/voice/stt.js +116 -0
  84. package/build/lib/voice/stt.js.map +1 -0
  85. package/build/lib/voice/tts.js +36 -0
  86. package/build/lib/voice/tts.js.map +1 -0
  87. package/build/lib/voice/voiceServer.js +249 -0
  88. package/build/lib/voice/voiceServer.js.map +1 -0
  89. package/build/lib/voice/vosk.js +260 -0
  90. package/build/lib/voice/vosk.js.map +1 -0
  91. package/build/lib/voice/wyoming.js +320 -0
  92. package/build/lib/voice/wyoming.js.map +1 -0
  93. package/build/lib/weather.js +423 -0
  94. package/build/lib/weather.js.map +1 -0
  95. package/build/main.js +3152 -0
  96. package/build/main.js.map +1 -0
  97. package/io-package.json +528 -0
  98. package/package.json +68 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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","sourcesContent":["import * as os from 'node:os';\nimport * as fs from 'node:fs';\nimport { spawn } from 'node:child_process';\n\nimport {\n Adapter,\n getAbsoluteInstanceDataDir,\n getAbsoluteDefaultDataDir,\n type AdapterOptions,\n} from '@iobroker/adapter-core';\nimport * as path from 'node:path';\nimport { createInProcessMcp, type InProcessMcp } from '@iobroker/mcp-server';\n\nimport { LlmAgent, resolveProvider } from './lib/llm';\nimport { buildMcpTools, deviceKey, ListCache, type Tool } from './lib/tools';\nimport {\n Nlu,\n parseDurationSeconds,\n parseClockTime,\n parseWeekdays,\n isStopCommand,\n type NluDevice,\n type NluIntent,\n} from './lib/nlu';\nimport { TimerManager, formatDuration, type TimerInfo } from './lib/timers';\nimport { AlarmManager, formatClock, formatWeekdays, type AlarmInfo } from './lib/alarms';\nimport { MemoryStore, buildMemoryPrompt, type MemoryEntry } from './lib/memory';\nimport { WEATHER_ADAPTERS, buildWeatherReport, trimReport, type WeatherReport, type StateValues } from './lib/weather';\nimport { LocalLlm, installLocalLlm, isLocalLlmInstalled, isHandoff, DEFAULT_LOCAL_MODEL_URL } from './lib/localLlm';\nimport { resolveApiKey, resolveVoiceCredentials } from './lib/credentials';\nimport { ConversationStore, type ConversationTurn } from './lib/context';\nimport { VoiceServer } from './lib/voice/voiceServer';\nimport { WyomingServer } from './lib/voice/wyoming';\nimport {\n createSttEngine,\n createTtsEngine,\n listVoices,\n listSttModels,\n type EngineContext,\n type VoiceCredentials,\n type SpeechProvider,\n} from './lib/voice/engines';\nimport type { SttEngine } from './lib/voice/stt';\nimport type { TtsEngine } from './lib/voice/tts';\nimport type { SatelliteState } from './lib/voice/protocol';\nimport type { AdapterConfig } from './types';\n\n/** A tts value is treated as an audio file (not text) when it looks like an mp3/wav/… URL or path. */\nfunction isAudioRef(v: string): boolean {\n return /\\.(mp3|wav|ogg|flac|m4a|aac|opus)(\\?.*)?$/i.test(v.trim());\n}\n\n/** ioBroker language code → an English language name for the translation prompt. */\nfunction languageLabel(lang?: string): string {\n const map: Record<string, string> = {\n en: 'English',\n de: 'German',\n ru: 'Russian',\n pt: 'Portuguese',\n nl: 'Dutch',\n fr: 'French',\n it: 'Italian',\n es: 'Spanish',\n pl: 'Polish',\n uk: 'Ukrainian',\n 'zh-cn': 'Chinese',\n };\n return map[lang || 'en'] || 'English';\n}\n\n/** One row of the admin device/ACL editor. */\ninterface DeviceListEntry {\n key: string;\n /** Resolved display name (smartName in requested lang → parent name → detector name). */\n name: string;\n /** Raw `common.smartName`: string, per-language map, or null (for the multi-language editor). */\n smartName: string | Record<string, string> | null;\n /** Language-independent fallback name (parent/detector), shown when no smartName exists. */\n autoName: string;\n type: string;\n room: string;\n stateIds: string[];\n writableStateIds: string[];\n}\n\nclass Assistant extends Adapter {\n declare config: AdapterConfig;\n private agent: LlmAgent | null = null;\n private mcp: InProcessMcp | null = null;\n /** Short-TTL cache for the expensive device/room/function listings; invalidated on enum changes. */\n private listCache: ListCache | null = null;\n /** Cache of a `<base>.SET` level state id → its writable boolean sibling switch (`<base>.ON_SET`/`.ON`), or ''. */\n private readonly siblingSwitch = new Map<string, string>();\n /** Tier-1a local LLM (node-llama-cpp), lazily loaded when enabled + installed; null otherwise. */\n private localLlm: LocalLlm | null = null;\n /** Guards against concurrent local-LLM loads. */\n private localLlmLoading: Promise<void> | null = null;\n /** Last reported local-LLM download percent (to throttle state writes / avoid log spam). */\n private lastLlmPct = -1;\n /** UDP voice server for satellites (only when voiceEnabled); null otherwise. */\n private voice: VoiceServer | null = null;\n /** Wyoming TCP endpoint (only when wyomingEnabled); null otherwise. */\n private wyoming: WyomingServer | null = null;\n /** Short-term per-source conversation memory (in-memory, TTL) for follow-up questions. */\n private readonly context = new ConversationStore();\n /** Satellite ids whose state objects have already been created (avoid re-creating on every update). */\n private readonly satStatesEnsured = new Set<string>();\n /** Sanitised satellite state-id → real device name (for the per-satellite `tts` announce state). */\n private readonly satDeviceById = new Map<string, string>();\n /** Native (ioBroker) satellite state-id → sender instance id, so we can push announcements back to it. */\n private readonly nativeSatFrom = new Map<string, string>();\n /** Countdown timers / reminders (roadmap #2); mirrored into `timers.*` states. Null until onReady. */\n private timers: TimerManager | null = null;\n /** Per-timer `timers.items.<id>` channels currently rendered, so we can delete the ones that expire. */\n private readonly timerObjIds = new Set<string>();\n /** Alarms at a fixed clock time (roadmap #2); mirrored into `alarms.*` states. Null until onReady. */\n private alarms: AlarmManager | null = null;\n /** Per-alarm `alarms.items.<id>` channels currently rendered. */\n private readonly alarmObjIds = new Set<string>();\n /** Long-term memory (roadmap #6); mirrored into `memory.*` states. Null until onReady / when disabled. */\n private memory: MemoryStore | null = null;\n /** Per-memory `memory.items.<id>` channels currently rendered. */\n private readonly memoryObjIds = new Set<string>();\n /** Active \"ringing\" sessions (a timer/alarm looping its sound until stopped or timed out). */\n private readonly rings: {\n target: string | null;\n stopped: boolean;\n timeout: ReturnType<typeof setTimeout> | null;\n }[] = [];\n\n public constructor(options: Partial<AdapterOptions> = {}) {\n super({ ...options, name: 'assistant' });\n this.on('ready', this.onReady.bind(this));\n this.on('stateChange', this.onStateChange.bind(this));\n this.on('objectChange', this.onObjectChange.bind(this));\n this.on('message', this.onMessage.bind(this));\n this.on('unload', this.onUnload.bind(this));\n }\n\n private async onReady(): Promise<void> {\n const cfg = this.config;\n const apiKey = await resolveApiKey(this, cfg);\n\n if (!apiKey) {\n this.log.warn(\n cfg.credentialType === 'manager'\n ? 'No credential selected (manager mode) — pick an API-key credential in the adapter settings.'\n : 'No API key configured — open the adapter settings and enter your LLM API key.',\n );\n await this.setStateAsync('info.connection', { val: false, ack: true });\n return;\n }\n\n try {\n this.mcp = await createInProcessMcp({\n adapter: this,\n language: this.language,\n allowSetState: cfg.allowWriteStates,\n allowObjectChange: cfg.allowObjectChange,\n });\n this.listCache = new ListCache();\n const { tools, denied } = await buildMcpTools(this.mcp, cfg, this.listCache, (id, fb) =>\n this.resolveDeviceName(id, fb),\n );\n // Let the cloud LLM handle timers/alarms too (for phrasings the rule-based NLU misses).\n tools.push(...this.buildTimerTools(), ...this.buildAlarmTools());\n if (cfg.useLongTermMemory !== false) {\n tools.push(...this.buildMemoryTools());\n }\n if ((cfg.weatherInstance || '').trim()) {\n tools.push(this.buildWeatherTool());\n }\n this.log.info(`ioBroker tools enabled (${tools.length}): ${tools.map(t => t.name).join(', ')}`);\n if (denied.length) {\n this.log.debug(`Tools denied by access settings: ${denied.join(', ')}`);\n }\n // Bust the device/room cache when room/function memberships change (new device shows within TTL anyway).\n this.subscribeForeignObjects('enum.rooms.*');\n this.subscribeForeignObjects('enum.functions.*');\n\n const prov = resolveProvider(cfg.provider, cfg.baseUrl);\n this.agent = new LlmAgent({\n provider: cfg.provider || 'openai',\n apiKey,\n model: cfg.model || prov.defaultModel,\n baseUrl: prov.baseUrl,\n systemPrompt: cfg.systemPrompt || '',\n maxTokens: cfg.maxTokens || 1024,\n tools,\n log: this.log,\n });\n } catch (e) {\n this.log.error(`Could not initialise assistant: ${(e as Error).message}`);\n await this.setStateAsync('info.connection', { val: false, ack: true });\n return;\n }\n\n await this.setStateAsync('info.connection', { val: true, ack: true });\n this.subscribeStates('text.request');\n // Meta object backing this instance's file storage (so the admin can upload sound assets and the\n // adapter can read them back for timer/alarm jingles).\n await this.setForeignObjectNotExistsAsync(this.namespace, {\n type: 'meta',\n common: { name: 'assistant data', type: 'meta.user' },\n native: {},\n });\n await this.ensureBuiltinSounds();\n this.subscribeStates('stopRinging');\n await this.setupTimers();\n await this.setupAlarms();\n if (cfg.useLongTermMemory !== false) {\n await this.setupMemory();\n }\n this.log.info(`Assistant ready (provider=${cfg.provider}, model=${this.agent.model}).`);\n\n if (cfg.useLocalLlm) {\n void this.ensureLocalLlm(); // background: model load/download must not block onReady\n }\n\n if (cfg.voiceEnabled) {\n // Announcements: `tts.text` (broadcast) + per-satellite `.tts` states (subscribed on first sight).\n // Subscribe regardless of the UDP server so writes are always handled (and logged if unroutable).\n this.subscribeStates('tts.text');\n if (cfg.udpServerEnabled) {\n await this.startVoiceServer(apiKey);\n }\n }\n\n if (cfg.wyomingEnabled) {\n await this.startWyoming(apiKey);\n }\n }\n\n /** Start the Wyoming TCP endpoint, bridging to the same STT/answer/TTS pipeline as the UDP server. */\n private async startWyoming(mainApiKey: string): Promise<void> {\n const cfg = this.config;\n const creds = await resolveVoiceCredentials(this, cfg, mainApiKey);\n const ctx = this.voiceContext(cfg, creds);\n const language = cfg.voiceLanguage || this.language || '';\n let stt: SttEngine;\n let tts: TtsEngine;\n try {\n stt = createSttEngine(cfg.sttProvider || 'openai', ctx);\n tts = createTtsEngine(cfg.ttsProvider || 'openai', ctx);\n } catch (e) {\n this.log.warn(`Wyoming not started — ${(e as Error).message}. Check the Voice tab settings.`);\n return;\n }\n try {\n this.wyoming = new WyomingServer({\n port: cfg.wyomingPort || 10700,\n bindAddress: cfg.bind || '0.0.0.0',\n language,\n stt,\n tts,\n answer: question => this.answer(question, 'wyoming'),\n getHints: () => this.buildSttHints(),\n log: this.log,\n });\n await this.wyoming.start();\n if (!this.voice) {\n this.warmupEngines(stt, tts, language); // only if the UDP server didn't already warm up\n }\n } catch (e) {\n this.log.error(`Could not start Wyoming server: ${(e as Error).message}`);\n this.wyoming = null;\n }\n }\n\n /** Build the engine context (creds + local-model settings + data dir) for the STT/TTS factory. */\n private voiceContext(cfg: AdapterConfig, creds: VoiceCredentials): EngineContext {\n return {\n creds,\n voices: {\n openai: cfg.ttsVoice || 'alloy',\n azure: (cfg.azureVoice || '').trim(),\n aws: (cfg.awsVoice || '').trim(),\n piper: (cfg.piperVoice || '').trim(),\n },\n dataDir: this.instanceDataDir(),\n log: this.log,\n voskModel: (cfg.voskModel || '').trim(),\n sttModel: (cfg.sttModel || '').trim(),\n ttsModel: (cfg.ttsModel || '').trim(),\n };\n }\n\n /**\n * Start the UDP voice server. STT and TTS providers are selected independently (OpenAI / Azure /\n * AWS cloud, or Vosk / Piper locally); credentials come from the encrypted config fields or the\n * central credential store (voiceCredentialType).\n */\n private async startVoiceServer(mainApiKey: string): Promise<void> {\n const cfg = this.config;\n const creds = await resolveVoiceCredentials(this, cfg, mainApiKey);\n const ctx = this.voiceContext(cfg, creds);\n // Raw language (e.g. 'de' or 'zh-cn') — each engine normalises it (ISO for cloud, model per lang for local).\n const language = cfg.voiceLanguage || this.language || '';\n\n let stt: SttEngine;\n let tts: TtsEngine;\n try {\n stt = createSttEngine(cfg.sttProvider || 'openai', ctx);\n tts = createTtsEngine(cfg.ttsProvider || 'openai', ctx);\n } catch (e) {\n this.log.warn(`Voice server not started — ${(e as Error).message}. Check the Voice tab settings.`);\n return;\n }\n\n try {\n this.voice = new VoiceServer({\n port: cfg.port || 7775,\n bindAddress: cfg.bind || '0.0.0.0',\n language,\n stt,\n tts,\n answer: (question, ctx) => this.answerVoice(question, ctx.device),\n getHints: () => this.buildSttHints(),\n log: this.log,\n onStatus: (device, room, state) => {\n this.updateSatelliteState(device, room, state).catch(e =>\n this.log.debug(`satellite state update failed: ${(e as Error).message}`),\n );\n },\n });\n await this.voice.start();\n this.log.info(`Voice server: STT=${cfg.sttProvider || 'openai'}, TTS=${cfg.ttsProvider || 'openai'}.`);\n // Warm up local engines now (install/download) instead of on the first spoken command.\n this.warmupEngines(stt, tts, language);\n } catch (e) {\n this.log.error(`Could not start voice server: ${(e as Error).message}`);\n this.voice = null;\n }\n }\n\n /** Kick off engine install + model/voice download at startup (background) so the first command isn't slow. */\n private warmupEngines(stt: SttEngine, tts: TtsEngine, language: string): void {\n const lang = language || this.language || 'en';\n if (stt.prepare) {\n this.log.info('Preparing speech-to-text engine (download in background) …');\n stt.prepare(lang).catch(e => this.log.warn(`STT warm-up failed: ${(e as Error).message}`));\n }\n if (tts.prepare) {\n this.log.info('Preparing text-to-speech engine (download in background) …');\n tts.prepare(lang).catch(e => this.log.warn(`TTS warm-up failed: ${(e as Error).message}`));\n }\n }\n\n /**\n * Answer a voice request and mirror it into the text states: the recognised text into\n * `text.request` and the reply into `text.response` (both ack:true, so writing the request does\n * not re-trigger onStateChange). The state writes must not block the spoken reply, so they are\n * fire-and-forget.\n */\n private async answerVoice(question: string, source: string): Promise<string> {\n this.setStateAsync('text.request', { val: question, ack: true }).catch(() => {});\n this.setQuerySource(source);\n this.log.info(`Voice Q (${source}): ${question}`);\n const answer = await this.answer(question, source);\n this.log.info(`Voice A (${source}): ${answer}`);\n this.setStateAsync('text.response', { val: answer, ack: true }).catch(() => {});\n return answer;\n }\n\n /**\n * True when the assistant's reply asks the user something, so a satellite should re-open its mic to\n * capture the answer without a wake word (→ the `listen` flag of the voice response). Detects a question\n * mark anywhere, not just at the end, because a clarifying reply often reads \"Welches Gerät …? Sag mir …\".\n */\n private expectsFollowUp(answer: string): boolean {\n return /[??]/.test(answer || '');\n }\n\n /** Record the origin of the current text.request/response ('' = state write, 'chat' = message, else satellite). */\n private setQuerySource(source: string): void {\n this.setStateAsync('text.querySource', { val: source, ack: true }).catch(() => {});\n }\n\n /** Lazily built + cached STT/TTS engines, shared by the `voice` sendTo handler (ioBroker-native satellites). */\n private speechEngines: { stt: SttEngine; tts: TtsEngine; language: string } | null = null;\n\n private async getSpeechEngines(): Promise<{ stt: SttEngine; tts: TtsEngine; language: string } | null> {\n if (this.speechEngines) {\n return this.speechEngines;\n }\n const cfg = this.config;\n const mainKey = await resolveApiKey(this, cfg);\n const creds = await resolveVoiceCredentials(this, cfg, mainKey);\n const ctx = this.voiceContext(cfg, creds);\n const language = cfg.voiceLanguage || this.language || '';\n try {\n this.speechEngines = {\n stt: createSttEngine(cfg.sttProvider || 'openai', ctx),\n tts: createTtsEngine(cfg.ttsProvider || 'openai', ctx),\n language,\n };\n return this.speechEngines;\n } catch (e) {\n this.log.warn(`Speech engines unavailable — ${(e as Error).message}. Check the Voice tab settings.`);\n return null;\n }\n }\n\n /**\n * Handle a voice query from an ioBroker-native satellite over the message bus (no UDP): decode the\n * recorded utterance, run STT → answer → TTS centrally, and return the reply as audio + text. Audio is\n * base64 raw 16-bit mono PCM (`format: 'pcm'`, default) or a WAV blob (`format: 'wav'`).\n */\n private async handleVoiceQuery(msg: {\n audio?: string;\n format?: 'pcm' | 'wav';\n sampleRate?: number;\n source?: string;\n room?: string;\n language?: string;\n }): Promise<{\n text?: string;\n answer?: string;\n audio?: string;\n sampleRate?: number;\n listen?: boolean;\n error?: string;\n }> {\n const source = msg.source || 'satellite';\n const room = msg.room || '';\n // Make the native satellite visible under assistant.0.satellites (+ lastSeen/room), like UDP ones.\n this.updateSatelliteState(source, room, 'processing').catch(() => {});\n try {\n if (!this.config.voiceEnabled) {\n return { error: 'voice is disabled — enable it on the Voice tab' };\n }\n if (!msg?.audio) {\n return { error: 'no audio provided' };\n }\n const engines = await this.getSpeechEngines();\n if (!engines) {\n return { error: 'speech engines not configured' };\n }\n let pcm = Buffer.from(msg.audio, 'base64');\n let rate = msg.sampleRate || 16000;\n if (msg.format === 'wav' && pcm.length > 44) {\n rate = pcm.readUInt32LE(24); // sample rate from the WAV header\n pcm = pcm.subarray(44);\n }\n const language = msg.language || engines.language;\n const text = (await engines.stt.transcribe(pcm, rate, language, await this.buildSttHints())).trim();\n if (!text) {\n return { text: '', answer: '' };\n }\n const answer = await this.answerVoice(text, source);\n if (!answer) {\n return { text, answer: '' };\n }\n const reply = await engines.tts.synthesize(answer, language);\n // Follow-up: primarily the LLM's own signal ([[LISTEN]] → lastFollowUp); \"?\" heuristic as fallback.\n const llmSignalled = this.lastFollowUp;\n const listen = llmSignalled || this.expectsFollowUp(answer);\n if (listen) {\n this.log.info(\n `→ mic-on to satellite '${source}' (${llmSignalled ? 'LLM signalled a follow-up' : 'reply is a question (fallback)'}).`,\n );\n }\n return { text, answer, audio: reply.pcm.toString('base64'), sampleRate: reply.sampleRate, listen };\n } catch (e) {\n this.log.warn(`Voice query failed: ${(e as Error).message}`);\n return { error: (e as Error).message };\n } finally {\n this.updateSatelliteState(source, room, 'idle').catch(() => {});\n }\n }\n\n /**\n * List TTS voices for the settings voice dropdown. Uses the (unsaved) form values passed in the\n * message so it works before saving, falling back to the stored config; resolves credentials via\n * the same manual/manager path as the running server.\n */\n private async getVoices(msg: {\n ttsProvider?: SpeechProvider;\n language?: string;\n voiceCredentialType?: 'manual' | 'manager';\n voiceApiKey?: string;\n voiceCredentialId?: string;\n azureSpeechKey?: string;\n azureSpeechRegion?: string;\n azureCredentialId?: string;\n awsAccessKeyId?: string;\n awsSecretAccessKey?: string;\n awsRegion?: string;\n awsCredentialId?: string;\n }): Promise<string[]> {\n try {\n // Merge the form's config-shaped fields over the saved config (ttsProvider/language handled apart).\n const overrides = Object.fromEntries(\n Object.entries(msg).filter(([k, v]) => v !== undefined && k !== 'ttsProvider' && k !== 'language'),\n ) as Partial<AdapterConfig>;\n const cfg = { ...this.config, ...overrides };\n const provider = msg.ttsProvider || cfg.ttsProvider || 'openai';\n const language = msg.language || cfg.voiceLanguage || this.language || '';\n const mainKey = await resolveApiKey(this, this.config);\n const creds = await resolveVoiceCredentials(this, cfg, mainKey);\n return await listVoices(provider, this.voiceContext(cfg, creds), language);\n } catch (e) {\n this.log.warn(`getVoices failed: ${(e as Error).message}`);\n return [];\n }\n }\n\n /** This host's bindable IPv4 addresses (for the voice-server bind-address dropdown). */\n private getBindAddresses(): { label: string; value: string }[] {\n const out = [\n { label: '0.0.0.0 (all interfaces)', value: '0.0.0.0' },\n { label: '127.0.0.1 (this host only)', value: '127.0.0.1' },\n ];\n for (const list of Object.values(os.networkInterfaces())) {\n for (const iface of list || []) {\n if (iface.family === 'IPv4' && !iface.internal) {\n out.push({ label: `${iface.address} (${iface.address})`, value: iface.address });\n }\n }\n }\n return out;\n }\n\n /** State id for a satellite: room name (enum prefix stripped) if known, else the device name. */\n private satelliteStateId(device: string, room: string): string {\n const roomName = (room || '').replace(/^(enum\\.rooms\\.|system\\.rooms\\.)/, '');\n return (roomName || device).replace(/[^\\w-]/g, '_') || 'unknown';\n }\n\n /** Reflect a satellite's status into `satellites.<room>.*` states (created on first sight). */\n private async updateSatelliteState(device: string, room: string, state: SatelliteState | 'offline'): Promise<void> {\n const id = this.satelliteStateId(device, room);\n const roomName = (room || '').replace(/^(enum\\.rooms\\.|system\\.rooms\\.)/, '');\n const base = `satellites.${id}`;\n if (!this.satStatesEnsured.has(id)) {\n await this.setObjectNotExistsAsync('satellites', {\n type: 'channel',\n common: { name: 'Voice satellites' },\n native: {},\n });\n await this.setObjectNotExistsAsync(base, {\n type: 'device',\n common: { name: roomName || device },\n native: {},\n });\n await this.setObjectNotExistsAsync(`${base}.status`, {\n type: 'state',\n common: { name: 'Status', type: 'string', role: 'text', read: true, write: false, def: 'idle' },\n native: {},\n });\n await this.setObjectNotExistsAsync(`${base}.room`, {\n type: 'state',\n common: { name: 'Room', type: 'string', role: 'text', read: true, write: false, def: '' },\n native: {},\n });\n await this.setObjectNotExistsAsync(`${base}.alive`, {\n type: 'state',\n common: {\n name: 'Alive',\n type: 'boolean',\n role: 'indicator.reachable',\n read: true,\n write: false,\n def: false,\n },\n native: {},\n });\n await this.setObjectNotExistsAsync(`${base}.lastSeen`, {\n type: 'state',\n common: { name: 'Last seen', type: 'number', role: 'value.time', read: true, write: false },\n native: {},\n });\n await this.setObjectNotExistsAsync(`${base}.host`, {\n type: 'state',\n common: {\n name: 'Host the satellite runs on',\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n def: '',\n },\n native: {},\n });\n await this.setObjectNotExistsAsync(`${base}.tts`, {\n type: 'state',\n common: {\n name: 'Speak on this satellite (plain text, or a URL/path to an mp3/wav)',\n type: 'string',\n role: 'text',\n read: true,\n write: true,\n def: '',\n },\n native: {},\n });\n this.subscribeStates(`${base}.tts`);\n this.satStatesEnsured.add(id);\n }\n // Map the (sanitised) state id back to the real device name for the per-satellite tts state.\n this.satDeviceById.set(id, device);\n await this.setStateAsync(`${base}.status`, { val: state, ack: true });\n await this.setStateAsync(`${base}.alive`, { val: state !== 'offline', ack: true });\n await this.setStateAsync(`${base}.lastSeen`, { val: Date.now(), ack: true });\n if (room) {\n await this.setStateAsync(`${base}.room`, { val: room, ack: true });\n }\n }\n\n /**\n * Record which ioBroker host a satellite runs on, resolved from the sender instance object\n * (`system.adapter.<from>.common.host`). Only meaningful for ioBroker-native satellites; UDP/ESP ones\n * have no instance, so their host stays empty.\n */\n private async setSatelliteHost(satId: string, from: string): Promise<void> {\n try {\n const instId = from.startsWith('system.adapter.') ? from : `system.adapter.${from}`;\n const obj = await this.getForeignObjectAsync(instId);\n const host = (obj?.common as { host?: string } | undefined)?.host;\n if (host && this.satStatesEnsured.has(satId)) {\n await this.setStateAsync(`satellites.${satId}.host`, { val: host, ack: true });\n }\n } catch {\n /* sender isn't an adapter instance (UDP satellite) — leave host empty */\n }\n }\n\n /**\n * Speak `value` on one satellite (by state id) or all (`targetId=null`). Plain text is synthesised with\n * the configured TTS engine; a URL/path to an audio file (mp3/wav/…) is decoded with ffmpeg. Delivered\n * to **both** transports: ioBroker-native satellites via a `sendTo(from, 'announce', …)` message and UDP\n * satellites via the UDP server.\n */\n private async announceToSatellites(value: string, targetId: string | null): Promise<void> {\n let v = value.trim();\n if (!v) {\n return;\n }\n // A leading \"!\" marks a priority announcement: strip it and let it bypass a satellite's\n // Do-Not-Disturb (e.g. \"!Water leak detected\" is played even in DND).\n const priority = v.startsWith('!');\n if (priority) {\n v = v.slice(1).trim();\n if (!v) {\n return;\n }\n }\n const isAudio = isAudioRef(v);\n let pcm: Buffer;\n let sampleRate: number;\n try {\n if (isAudio) {\n ({ pcm, sampleRate } = await this.decodeAudioToPcm(v));\n } else {\n const engine = await this.buildTtsEngine();\n ({ pcm, sampleRate } = await engine.synthesize(v, this.config.voiceLanguage || this.language || ''));\n }\n } catch (e) {\n this.log.error(`Announcement failed: ${(e as Error).message}`);\n return;\n }\n\n const delivered = await this.deliverPcm(pcm, sampleRate, targetId, priority);\n this.log.info(\n `Announce → ${targetId || 'all satellites'} (${delivered} channel(s)): ${isAudio ? v : `\"${v}\"`}`,\n );\n if (!delivered) {\n this.log.warn('Announcement not delivered — no satellites registered (native or UDP).');\n }\n }\n\n /**\n * Deliver a ready 16-bit-mono-PCM buffer to one satellite (`targetId`) or all (`null`), over both\n * transports (ioBroker-native message bus + UDP). Returns how many channels it reached.\n */\n private async deliverPcm(\n pcm: Buffer,\n sampleRate: number,\n targetId: string | null,\n priority: boolean,\n ): Promise<number> {\n let delivered = 0;\n // ── ioBroker-native satellites: push over the message bus ───────────────\n const nativeTargets = targetId\n ? this.nativeSatFrom.has(targetId)\n ? [[targetId, this.nativeSatFrom.get(targetId)!] as const]\n : []\n : [...this.nativeSatFrom.entries()];\n for (const [, from] of nativeTargets) {\n this.sendTo(from, 'announce', { audio: pcm.toString('base64'), sampleRate, format: 'pcm', priority });\n delivered++;\n }\n // ── UDP satellites (if the UDP server runs and the target isn't a native one) ──\n if (this.voice && !(targetId && this.nativeSatFrom.has(targetId))) {\n const device = targetId ? this.satDeviceById.get(targetId) || targetId : null;\n try {\n await this.voice.announce(device, pcm, sampleRate);\n delivered++;\n } catch (e) {\n this.log.debug(`UDP announce failed: ${(e as Error).message}`);\n }\n }\n return delivered;\n }\n\n /**\n * Install the bundled default jingles (`admin/sounds/{timer,alarm}.wav`) into this instance's file\n * storage the first time, so they appear in the settings sound dropdown and can be played out of the\n * box. Never overwrites an existing file (a user upload/replacement or a previous copy wins).\n */\n private async ensureBuiltinSounds(): Promise<void> {\n for (const name of ['timer.wav', 'alarm.wav']) {\n const target = `sounds/${name}`;\n try {\n await this.readFileAsync(this.namespace, target);\n continue; // already present — leave the user's version alone\n } catch {\n /* not present → install the bundled default */\n }\n try {\n const src = path.join(__dirname, '..', 'admin', 'sounds', name);\n await this.writeFileAsync(this.namespace, target, await fs.promises.readFile(src));\n this.log.debug(`installed default sound ${target}`);\n } catch (e) {\n this.log.debug(`could not install default sound ${name}: ${(e as Error).message}`);\n }\n }\n }\n\n /**\n * Play an uploaded sound asset (a `sounds/*.mp3|wav|…` file in this instance's file storage) on the\n * satellites. Jingles bypass Do-Not-Disturb (a timer/alarm the user set should be heard). Returns the\n * jingle's duration in seconds so the caller can wait before speaking a following announcement.\n */\n private async playStoredSound(name: string, targetId: string | null): Promise<number> {\n const clean = (name || '').trim();\n if (!clean) {\n return 0;\n }\n // The fileSelector may return the name with or without its `sounds/` folder — try both.\n const candidates = clean.includes('/') ? [clean] : [clean, `sounds/${clean}`];\n let data: Buffer | null = null;\n for (const p of candidates) {\n try {\n const res = (await this.readFileAsync(this.namespace, p)) as\n { file?: Buffer | string } | Buffer | string;\n const f = Buffer.isBuffer(res) || typeof res === 'string' ? res : res.file;\n if (f != null) {\n data = Buffer.isBuffer(f) ? f : Buffer.from(f, 'binary');\n break;\n }\n } catch {\n /* try the next candidate */\n }\n }\n if (!data || !data.length) {\n throw new Error(`sound \"${clean}\" not found in ${this.namespace} file storage`);\n }\n const { pcm, sampleRate } = await this.decodeAudioBufferToPcm(data);\n const delivered = await this.deliverPcm(pcm, sampleRate, targetId, true);\n this.log.info(`Sound → ${targetId || 'all satellites'} (${delivered} channel(s)): ${clean}`);\n return pcm.length / 2 / sampleRate; // 16-bit mono → bytes/2 samples ÷ rate = seconds\n }\n\n /**\n * Effect for an expiring timer/alarm: if a sound is set and `ringSeconds > 0`, ring (loop the sound)\n * until stopped by voice (\"stop\"/\"halt\"/…) or the ring timeout; otherwise play once + announce.\n */\n private fireEffects(sound: string, announce: boolean, message: string, target: string | null): void {\n const ringMs = Math.max(0, this.config.ringSeconds ?? 60) * 1000;\n if (sound && ringMs > 0) {\n this.startRing(sound, message, announce, target, ringMs);\n } else {\n void this.playAndAnnounce(sound, announce, message, target).catch(e =>\n this.log.debug(`fire effects failed: ${(e as Error).message}`),\n );\n }\n }\n\n /**\n * Ring: loop `sound` on `target` until stopped or `maxMs` elapses, announcing `message` once after the\n * first ring. The user silences it by saying a stop word (handled in {@link produceAnswer}), writing\n * `stopRinging`, or it auto-stops after the timeout.\n */\n private startRing(sound: string, message: string, announce: boolean, target: string | null, maxMs: number): void {\n const session: { target: string | null; stopped: boolean; timeout: ReturnType<typeof setTimeout> | null } = {\n target,\n stopped: false,\n timeout: null,\n };\n this.rings.push(session);\n this.setStateAsync('ringing', { val: true, ack: true }).catch(() => {});\n const endAt = Date.now() + maxMs;\n let announced = false;\n const tick = async (): Promise<void> => {\n if (session.stopped) {\n return;\n }\n let dur = 1;\n try {\n dur = (await this.playStoredSound(sound, target)) || 1;\n } catch (e) {\n this.log.debug(`ring play failed: ${(e as Error).message}`);\n this.endRing(session);\n return;\n }\n if (session.stopped) {\n return;\n }\n if (!announced && announce && message) {\n announced = true;\n await this.delay(Math.min(dur * 1000 + 150, 6000)); // let the jingle finish, then speak once\n if (session.stopped) {\n return;\n }\n await this.announceToSatellites(message, target).catch(() => {});\n }\n if (session.stopped) {\n return;\n }\n if (Date.now() >= endAt) {\n this.endRing(session);\n return;\n }\n session.timeout = setTimeout(() => void tick(), Math.max(300, Math.round(dur * 1000) + 700));\n };\n void tick();\n }\n\n /** Remove a ring session and clear the \"ringing\" state when the last one ends. */\n private endRing(session: { stopped: boolean; timeout: ReturnType<typeof setTimeout> | null }): void {\n session.stopped = true;\n if (session.timeout) {\n clearTimeout(session.timeout);\n session.timeout = null;\n }\n const i = this.rings.indexOf(session as (typeof this.rings)[number]);\n if (i >= 0) {\n this.rings.splice(i, 1);\n }\n if (!this.rings.length) {\n this.setStateAsync('ringing', { val: false, ack: true }).catch(() => {});\n }\n }\n\n /** Stop all active ring sessions (voice \"stop\", the `stopRinging` state, or on unload). Returns count. */\n private stopRinging(): number {\n const n = this.rings.length;\n for (const s of [...this.rings]) {\n this.endRing(s);\n }\n return n;\n }\n\n /**\n * Play the configured jingle (if any) and then speak the announcement (if enabled), leaving a short gap\n * so they don't overlap on the satellite. Used by the timer/alarm fire handlers.\n */\n private async playAndAnnounce(\n sound: string,\n announce: boolean,\n text: string,\n targetId: string | null,\n ): Promise<void> {\n try {\n const dur = sound ? await this.playStoredSound(sound, targetId) : 0;\n if (dur > 0 && announce) {\n await this.delay(Math.min(dur * 1000 + 150, 10000)); // let the jingle finish first\n }\n } catch (e) {\n this.log.debug(`sound play failed: ${(e as Error).message}`);\n }\n if (announce) {\n await this.announceToSatellites(text, targetId);\n }\n }\n\n /** Decode an audio file/URL (mp3/wav/…) to mono 16-bit PCM via ffmpeg. */\n private decodeAudioToPcm(src: string): Promise<{ pcm: Buffer; sampleRate: number }> {\n return this.runFfmpegDecode(src);\n }\n\n /** Decode an in-memory audio buffer (uploaded mp3/wav) to mono 16-bit PCM via ffmpeg (stdin pipe). */\n private decodeAudioBufferToPcm(buf: Buffer): Promise<{ pcm: Buffer; sampleRate: number }> {\n return this.runFfmpegDecode('pipe:0', buf);\n }\n\n /** Run ffmpeg to decode `input` (a path/URL, or `pipe:0` with `stdinData`) to mono 16-bit PCM. */\n private runFfmpegDecode(input: string, stdinData?: Buffer): Promise<{ pcm: Buffer; sampleRate: number }> {\n return new Promise((resolve, reject) => {\n const sampleRate = 24000;\n // prettier-ignore\n const args = ['-hide_banner', '-loglevel', 'error', '-i', input, '-ac', '1', '-ar', String(sampleRate), '-f', 's16le', '-'];\n const proc = spawn('ffmpeg', args);\n const chunks: Buffer[] = [];\n proc.stdout.on('data', (d: Buffer) => chunks.push(d));\n proc.stderr.on('data', (d: Buffer) => this.log.debug(`ffmpeg: ${String(d).trim()}`));\n proc.on('error', e =>\n reject(new Error(`ffmpeg failed: ${e.message} — install ffmpeg to play audio files`)),\n );\n proc.on('close', code =>\n code === 0\n ? resolve({ pcm: Buffer.concat(chunks), sampleRate })\n : reject(new Error(`ffmpeg exited with code ${code}`)),\n );\n if (stdinData) {\n proc.stdin.on('error', () => {}); // ignore EPIPE if ffmpeg exits early\n proc.stdin.end(stdinData);\n }\n });\n }\n\n /** Invalidate the cached device/room/function listings when a room/function enum changes. */\n private onObjectChange(id: string, _obj: ioBroker.Object | null | undefined): void {\n if (this.listCache && (id.startsWith('enum.rooms.') || id.startsWith('enum.functions.'))) {\n this.listCache.clear();\n this.log.debug(`list cache cleared (object changed: ${id})`);\n }\n }\n\n private async onStateChange(id: string, state: ioBroker.State | null | undefined): Promise<void> {\n if (!state || state.ack) {\n return;\n } // ignore our own ack-writes\n\n // Announcements: `tts.text` → all satellites; `satellites.<id>.tts` → that satellite.\n if (id.endsWith('.tts.text')) {\n await this.announceToSatellites(String(state.val ?? ''), null);\n return;\n }\n const satTts = id.match(/\\.satellites\\.([^.]+)\\.tts$/);\n if (satTts) {\n await this.announceToSatellites(String(state.val ?? ''), satTts[1]); // satTts[1] = satellite state id\n return;\n }\n\n // Silence a ringing timer/alarm from vis/JS.\n if (id.endsWith('.stopRinging')) {\n if (state.val) {\n const n = this.stopRinging();\n this.log.info(`Ring stopped via stopRinging state (${n} session(s)).`);\n }\n await this.setStateAsync('stopRinging', { val: false, ack: true });\n return;\n }\n\n // Timer cancel controls: `timers.cancelAll` and each per-timer `timers.items.<id>.cancel`.\n if (id.endsWith('.timers.cancelAll')) {\n if (state.val) {\n const n = this.timers?.cancelAll() ?? 0;\n this.log.info(`Cancelled ${n} timer(s) via timers.cancelAll.`);\n }\n await this.setStateAsync('timers.cancelAll', { val: false, ack: true });\n return;\n }\n const timerCancel = id.match(/\\.timers\\.items\\.([^.]+)\\.cancel$/);\n if (timerCancel) {\n if (state.val && this.timers?.cancel(timerCancel[1])) {\n this.log.info(`Timer ${timerCancel[1]} cancelled via its cancel button.`);\n }\n return;\n }\n\n // Alarm controls: cancel-all, per-alarm delete button, and the enable/disable switch.\n if (id.endsWith('.alarms.cancelAll')) {\n if (state.val) {\n const n = this.alarms?.cancelAll() ?? 0;\n this.log.info(`Deleted ${n} alarm(s) via alarms.cancelAll.`);\n }\n await this.setStateAsync('alarms.cancelAll', { val: false, ack: true });\n return;\n }\n const alarmDelete = id.match(/\\.alarms\\.items\\.([^.]+)\\.delete$/);\n if (alarmDelete) {\n if (state.val && this.alarms?.cancel(alarmDelete[1])) {\n this.log.info(`Alarm ${alarmDelete[1]} deleted via its delete button.`);\n }\n return;\n }\n const alarmEnable = id.match(/\\.alarms\\.items\\.([^.]+)\\.enabled$/);\n if (alarmEnable) {\n this.alarms?.setEnabled(alarmEnable[1], !!state.val);\n return;\n }\n\n // Long-term memory controls: add a fact, forget by id/key, clear all, edit/delete a single fact.\n if (id.endsWith('.memory.add')) {\n const text = String(state.val ?? '').trim();\n if (text && this.memory?.add({ text, source: 'state' })) {\n this.log.info('Fact remembered via memory.add.');\n }\n await this.setStateAsync('memory.add', { val: '', ack: true });\n return;\n }\n if (id.endsWith('.memory.forget')) {\n const needle = String(state.val ?? '').trim();\n if (needle) {\n const n = this.memory?.forget(needle) ?? 0;\n this.log.info(`Forgot ${n} fact(s) via memory.forget.`);\n }\n await this.setStateAsync('memory.forget', { val: '', ack: true });\n return;\n }\n if (id.endsWith('.memory.clearAll')) {\n if (state.val) {\n const n = this.memory?.clear() ?? 0;\n this.log.info(`Forgot all ${n} fact(s) via memory.clearAll.`);\n }\n await this.setStateAsync('memory.clearAll', { val: false, ack: true });\n return;\n }\n const memDelete = id.match(/\\.memory\\.items\\.([^.]+)\\.delete$/);\n if (memDelete) {\n if (state.val && this.memory?.forgetById(memDelete[1])) {\n this.log.info(`Forgot fact ${memDelete[1]} via its button.`);\n }\n return;\n }\n const memEdit = id.match(/\\.memory\\.items\\.([^.]+)\\.text$/);\n if (memEdit) {\n this.memory?.update(memEdit[1], String(state.val ?? ''));\n return;\n }\n\n if (!id.endsWith('.text.request')) {\n return;\n }\n if (!this.agent) {\n return;\n }\n\n const question = String(state.val ?? '').trim();\n if (!question) {\n return;\n }\n\n this.log.info(`Q: ${question}`);\n this.setQuerySource(''); // origin: direct write to the text.request state\n try {\n const answer = await this.answer(question);\n this.log.info(`A: ${answer}`);\n await this.setStateAsync('text.response', { val: answer, ack: true });\n } catch (e) {\n this.log.error(`Assistant error: ${(e as Error).message}`);\n await this.setStateAsync('text.response', {\n val: `Fehler: ${(e as Error).message}`,\n ack: true,\n });\n }\n }\n\n /** Allow scripts to ask via sendTo('assistant.0', 'ask', { text: '...' }, cb). */\n private async onMessage(obj: ioBroker.Message): Promise<void> {\n if (!obj?.command) {\n return;\n }\n\n // Settings-dialog \"Test connection\" button.\n if (obj.command === 'testApiConnection') {\n const result = await this.testApiConnection(\n (obj.message || {}) as {\n provider?: AdapterConfig['provider'];\n apiKey?: string;\n credentialType?: 'manual' | 'manager';\n credentialId?: string;\n model?: string;\n baseUrl?: string;\n },\n );\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, result, obj.callback);\n }\n return;\n }\n\n // Settings-dialog model dropdown (selectSendTo).\n if (obj.command === 'getModels') {\n const models = await this.getModels(\n (obj.message || {}) as {\n provider?: AdapterConfig['provider'];\n apiKey?: string;\n credentialType?: 'manual' | 'manager';\n credentialId?: string;\n baseUrl?: string;\n },\n );\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, models, obj.callback);\n }\n return;\n }\n\n // Settings button: install the on-demand local LLM engine (node-llama-cpp) + load the model.\n if (obj.command === 'installLocalLlm') {\n const dataDir = this.instanceDataDir();\n try {\n await this.ensureLocalLlmStates();\n this.setLlmStatus('installing', 0);\n this.log.info('Installing local LLM engine (node-llama-cpp) — this may take a few minutes…');\n await installLocalLlm(dataDir, line => line && this.log.debug(`local-llm install: ${line}`));\n void this.ensureLocalLlm(); // background: downloads + loads the model\n if (obj.callback) {\n this.sendTo(\n obj.from,\n obj.command,\n { result: 'Engine installed. The model is downloading in the background (see the log).' },\n obj.callback,\n );\n }\n } catch (e) {\n this.setLlmStatus('error');\n this.log.error(`Local LLM install failed: ${(e as Error).message}`);\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, { error: (e as Error).message }, obj.callback);\n }\n }\n return;\n }\n\n // Voice-tab TTS voice dropdown (autocompleteSendTo): list voices for the selected provider.\n if (obj.command === 'getVoices') {\n const voices = await this.getVoices(\n (obj.message || {}) as {\n ttsProvider?: SpeechProvider;\n language?: string;\n voiceCredentialType?: 'manual' | 'manager';\n voiceApiKey?: string;\n voiceCredentialId?: string;\n azureSpeechKey?: string;\n azureSpeechRegion?: string;\n azureCredentialId?: string;\n awsAccessKeyId?: string;\n awsSecretAccessKey?: string;\n awsRegion?: string;\n awsCredentialId?: string;\n },\n );\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, voices, obj.callback);\n }\n return;\n }\n\n // STT model dropdown (Vosk): suggest model names for the selected language.\n if (obj.command === 'getSttModels') {\n const msg = (obj.message || {}) as { sttProvider?: SpeechProvider; language?: string };\n const cfg = this.config;\n const provider = msg.sttProvider || cfg.sttProvider || 'openai';\n const language = msg.language || cfg.voiceLanguage || this.language || '';\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, listSttModels(provider, language), obj.callback);\n }\n return;\n }\n\n // ioBroker-native satellite registration / heartbeat: makes it visible + enables announce push.\n if (obj.command === 'registerSatellite') {\n const m = (obj.message || {}) as { device?: string; room?: string; state?: SatelliteState | 'offline' };\n const device = m.device || 'satellite';\n const room = m.room || '';\n const satId = this.satelliteStateId(device, room);\n // Strip the `system.adapter.` prefix so we can push a fresh sendTo to the instance later.\n const from = String(obj.from).replace(/^system\\.adapter\\./, '');\n if (m.state === 'offline') {\n this.nativeSatFrom.delete(satId);\n } else {\n this.nativeSatFrom.set(satId, from);\n }\n await this.updateSatelliteState(device, room, m.state || 'idle');\n if (m.state !== 'offline') {\n void this.setSatelliteHost(satId, String(obj.from));\n }\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, { ok: true, id: satId }, obj.callback);\n }\n return;\n }\n\n // ioBroker-native satellite: a recorded utterance over the message bus (no UDP) → reply audio + text.\n if (obj.command === 'voice') {\n const m = (obj.message || {}) as {\n audio?: string;\n format?: 'pcm' | 'wav';\n sampleRate?: number;\n source?: string;\n room?: string;\n language?: string;\n };\n // Remember the sender so announcements can be pushed back to this native satellite.\n const from = String(obj.from).replace(/^system\\.adapter\\./, '');\n const satId = this.satelliteStateId(m.source || 'satellite', m.room || '');\n this.nativeSatFrom.set(satId, from);\n const res = await this.handleVoiceQuery(m);\n void this.setSatelliteHost(satId, String(obj.from));\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, res, obj.callback);\n }\n return;\n }\n\n // Scripts: start a countdown timer. message = { duration: seconds | \"5 min\", label?, room? }.\n if (obj.command === 'setTimer') {\n const m = (obj.message || {}) as { duration?: number | string; label?: string; room?: string };\n const duration =\n typeof m.duration === 'string'\n ? parseDurationSeconds(m.duration, true) || 0\n : Math.round(Number(m.duration) || 0);\n let result: { ok: boolean; id?: string; fireAt?: number; error?: string };\n if (!this.timers || duration <= 0) {\n result = { ok: false, error: this.timers ? 'duration must be > 0 seconds' : 'timers not ready' };\n } else {\n const info = this.timers.add({ label: m.label || '', room: m.room || '', source: '', duration });\n result = { ok: true, id: info.id, fireAt: info.fireAt };\n }\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, result, obj.callback);\n }\n return;\n }\n\n // Scripts: cancel a timer by id, or all when no id is given. message = { id? }.\n if (obj.command === 'cancelTimer') {\n const m = (obj.message || {}) as { id?: string };\n const cancelled = m.id ? (this.timers?.cancel(m.id) ? 1 : 0) : (this.timers?.cancelAll() ?? 0);\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, { ok: true, cancelled }, obj.callback);\n }\n return;\n }\n\n // Scripts: list the running timers.\n if (obj.command === 'listTimers') {\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, { timers: this.timers?.list() || [] }, obj.callback);\n }\n return;\n }\n\n // Scripts: set an alarm. message = { hour, minute } | { time: \"7:30\" | \"weck mich um 7\" }, weekdays?, label?, room?.\n if (obj.command === 'setAlarm') {\n const m = (obj.message || {}) as {\n hour?: number;\n minute?: number;\n time?: string;\n weekdays?: number[];\n label?: string;\n room?: string;\n };\n let hour = typeof m.hour === 'number' ? m.hour : NaN;\n let minute = typeof m.minute === 'number' ? m.minute : 0;\n if (Number.isNaN(hour) && m.time) {\n const clock = parseClockTime(m.time);\n if (clock) {\n hour = clock.hour;\n minute = clock.minute;\n }\n }\n const weekdays = Array.isArray(m.weekdays) ? m.weekdays : m.time ? parseWeekdays(m.time) : [];\n let result: { ok: boolean; id?: string; nextFireAt?: number; error?: string };\n if (!this.alarms || Number.isNaN(hour)) {\n result = {\n ok: false,\n error: this.alarms ? 'hour/minute or a parseable time is required' : 'alarms not ready',\n };\n } else {\n const info = this.alarms.add({\n label: m.label || '',\n room: m.room || '',\n source: '',\n hour,\n minute,\n weekdays,\n });\n result = { ok: true, id: info.id, nextFireAt: info.nextFireAt };\n }\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, result, obj.callback);\n }\n return;\n }\n\n // Scripts: delete an alarm by id, or all when no id is given. message = { id? }.\n if (obj.command === 'cancelAlarm') {\n const m = (obj.message || {}) as { id?: string };\n const deleted = m.id ? (this.alarms?.cancel(m.id) ? 1 : 0) : (this.alarms?.cancelAll() ?? 0);\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, { ok: true, deleted }, obj.callback);\n }\n return;\n }\n\n // Scripts: list the configured alarms.\n if (obj.command === 'listAlarms') {\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, { alarms: this.alarms?.list() || [] }, obj.callback);\n }\n return;\n }\n\n // Scripts: remember a durable fact. message = { text, key? }.\n if (obj.command === 'saveMemory') {\n const m = (obj.message || {}) as { text?: string; key?: string };\n const entry = this.memory?.add({ text: String(m.text || ''), key: String(m.key || ''), source: 'script' });\n if (obj.callback) {\n this.sendTo(\n obj.from,\n obj.command,\n entry\n ? { ok: true, id: entry.id }\n : { ok: false, error: this.memory ? 'empty text' : 'memory disabled' },\n obj.callback,\n );\n }\n return;\n }\n\n // Scripts: forget a fact by id/key, or all when nothing is given. message = { idOrKey? }.\n if (obj.command === 'forgetMemory') {\n const m = (obj.message || {}) as { idOrKey?: string };\n const forgotten = m.idOrKey ? (this.memory?.forget(m.idOrKey) ?? 0) : (this.memory?.clear() ?? 0);\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, { ok: true, forgotten }, obj.callback);\n }\n return;\n }\n\n // Scripts: list remembered facts.\n if (obj.command === 'listMemories') {\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, { memories: this.memory?.list() || [] }, obj.callback);\n }\n return;\n }\n\n // Settings weather dropdown (selectSendTo): list installed weather-adapter instances/locations.\n if (obj.command === 'getWeatherInstances') {\n const list = await this.getWeatherInstances();\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, list, obj.callback);\n }\n return;\n }\n\n // Scripts: the normalized weather report from the configured source. message = { when? }.\n if (obj.command === 'getWeather') {\n const m = (obj.message || {}) as { when?: string };\n const value = (this.config.weatherInstance || '').trim();\n const res = value ? await this.readWeather(value) : { error: 'no weather source configured' };\n const payload =\n res.report !== undefined ? { ...res, report: trimReport(res.report, String(m.when || '')) } : res;\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, payload, obj.callback);\n }\n return;\n }\n\n // Scripts: silence a ringing timer/alarm.\n if (obj.command === 'stopRinging') {\n const n = this.stopRinging();\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, { ok: true, stopped: n }, obj.callback);\n }\n return;\n }\n\n // Settings \"Play\" button / scripts: play an uploaded sound on the satellites. message = { name, target? }.\n if (obj.command === 'playSound') {\n const m = (obj.message || {}) as { name?: string; target?: string };\n const target = m.target ? this.announceTargetForSource(m.target) || m.target : null;\n let result: { ok: boolean; duration?: number; error?: string };\n try {\n const duration = await this.playStoredSound(String(m.name || ''), target);\n result = duration ? { ok: true, duration } : { ok: false, error: 'no sound selected' };\n } catch (e) {\n result = { ok: false, error: (e as Error).message };\n }\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, result, obj.callback);\n }\n return;\n }\n\n // Custom admin component: drop the cached device/room/function listings (Chat refresh button).\n if (obj.command === 'clearCache') {\n this.listCache?.clear();\n this.siblingSwitch.clear();\n this.log.debug('list cache cleared (clearCache command)');\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, { ok: true }, obj.callback);\n }\n return;\n }\n\n // Custom admin component: set/clear the friendly device name (writes common.smartName).\n if (obj.command === 'setDeviceName') {\n const { stateId, name, language } = (obj.message || {}) as {\n stateId?: string;\n name?: string;\n language?: string;\n };\n const result = await this.setDeviceSmartName(stateId, name, language);\n this.listCache?.clear(); // so the new name shows on the next list_devices\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, result, obj.callback);\n }\n return;\n }\n\n // Settings device editor: translate a device name into a target language via the LLM.\n if (obj.command === 'translateName') {\n const { text, targetLang } = (obj.message || {}) as { text?: string; targetLang?: string };\n if (!this.agent) {\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, { error: 'agent not ready' }, obj.callback);\n }\n return;\n }\n try {\n const translation = await this.agent.translate(String(text ?? ''), languageLabel(targetLang));\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, { translation }, obj.callback);\n }\n } catch (e) {\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, { error: (e as Error).message }, obj.callback);\n }\n }\n return;\n }\n\n // Chat: is backend TTS usable (a voice key is configured)? Drives the play button's visibility.\n if (obj.command === 'ttsAvailable') {\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, { available: await this.isTtsAvailable() }, obj.callback);\n }\n return;\n }\n\n // Chat: synthesize an answer to speech (WAV) via the configured TTS engine.\n if (obj.command === 'tts') {\n const { text, language } = (obj.message || {}) as { text?: string; language?: string };\n const result = await this.synthesizeToWav(String(text ?? ''), language);\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, result, obj.callback);\n }\n return;\n }\n\n // Custom admin component: device list for the per-device ACL editor.\n if (obj.command === 'getDevices') {\n // Resolve names/rooms in the admin UI language (may differ from the system language).\n const lang = (obj.message as { language?: ioBroker.Languages } | undefined)?.language;\n const devices = await this.getDeviceList(lang);\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, devices, obj.callback);\n }\n return;\n }\n\n if (obj.command !== 'ask') {\n return;\n }\n const message = obj.message as { text?: string; source?: string } | string;\n const text = typeof message === 'string' ? message : message?.text;\n // Origin for text.querySource: caller-provided (e.g. 'telegram:Max') or 'chat' for the admin chat.\n const source = (typeof message === 'string' ? '' : message?.source?.trim()) || 'chat';\n\n if (!this.agent) {\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, { error: 'agent not ready' }, obj.callback);\n }\n return;\n }\n const question = String(text ?? '');\n this.log.info(`Q (${obj.command}): ${question}`);\n this.setStateAsync('text.request', { val: question, ack: true }).catch(() => {});\n this.setQuerySource(source);\n try {\n const answer = await this.answer(question, source);\n this.log.info(`A: ${answer}`);\n this.setStateAsync('text.response', { val: answer, ack: true }).catch(() => {});\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, { answer }, obj.callback);\n }\n } catch (e) {\n this.log.error(`Assistant error: ${(e as Error).message}`);\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, { error: (e as Error).message }, obj.callback);\n }\n }\n }\n\n /**\n * Answer a question. Tier 0: the built-in rule-based NLU handles simple device commands offline/free;\n * anything it can't resolve falls through to the LLM (Tier 2, and later the local model as Tier 1a).\n */\n /**\n * Answer a request, keyed by `source` for short-term conversation context (follow-ups). The context\n * is applied to the cloud LLM tier; every completed exchange (whichever tier answered) is recorded so\n * later turns have the full thread.\n */\n private async answer(question: string, source = ''): Promise<string> {\n const useCtx = this.config.useConversationContext !== false;\n const history = useCtx ? this.context.get(source) : [];\n const raw = await this.produceAnswer(question, history, source);\n // The LLM signals \"I'm waiting for the user's reply\" by appending the [[LISTEN]] control marker\n // (see followUpHint). Strip it here so it's neither stored, shown nor spoken, and expose it as the\n // follow-up flag. Single-user voice → a shared field is race-free enough (read right after await).\n this.lastFollowUp = /\\[\\[LISTEN\\]\\]/i.test(raw);\n const result = raw.replace(/\\s*\\[\\[LISTEN\\]\\]\\s*/gi, ' ').trim();\n if (useCtx && result) {\n this.context.add(source, question, result);\n }\n return result;\n }\n\n /** Whether the LAST {@link answer} asked the user something (LLM-signalled via [[LISTEN]]). */\n private lastFollowUp = false;\n\n /**\n * System-prompt instruction letting the LLM explicitly signal a follow-up: append [[LISTEN]] when it\n * asks the user something and waits for an answer. More reliable than a \"?\" heuristic and lets a\n * satellite re-open its mic on the model's decision. Localized (de/en/ru).\n */\n private followUpHint(): string {\n const lang = String(this.config.voiceLanguage || this.language || 'en');\n if (lang === 'ru') {\n return 'Если твой ответ — это встречный вопрос и ты ждёшь ответа пользователя, добавь в самом конце управляющий маркер [[LISTEN]] (он удаляется и не произносится). Если ответа не требуется — не добавляй.';\n }\n if (lang === 'de') {\n return 'Wenn deine Antwort eine Rückfrage an den Nutzer ist und du auf dessen Antwort wartest, hänge ganz am Ende den Steuer-Marker [[LISTEN]] an (er wird entfernt und nicht vorgelesen). Wenn keine Antwort nötig ist, hänge ihn nicht an.';\n }\n return 'If your reply asks the user something and you are waiting for their answer, append the control marker [[LISTEN]] at the very end (it is removed and not spoken). If no answer is expected, do not append it.';\n }\n\n /**\n * Current date/time line, prepended to the user turn so the LLM has a clock — it has none otherwise and\n * cannot answer \"what time/day is it?\" or reason about relative times. Uses the host's local timezone and\n * a localized label (de/en/ru). Deliberately kept OUT of the (prompt-cached) system prompt: a per-request\n * timestamp there would bust the cache — incl. the large device list — on every single call.\n */\n private buildTimeContext(): string {\n const lang = String(this.config.voiceLanguage || this.language || 'en');\n const locale = lang === 'de' ? 'de-DE' : lang === 'ru' ? 'ru-RU' : 'en-GB';\n let tz = '';\n try {\n tz = Intl.DateTimeFormat().resolvedOptions().timeZone || '';\n } catch {\n /* no ICU/timezone data — omit the zone name */\n }\n const formatted = new Intl.DateTimeFormat(locale, {\n weekday: 'long',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n }).format(new Date());\n const label =\n lang === 'ru'\n ? 'Текущие дата и время'\n : lang === 'de'\n ? 'Aktuelles Datum und Uhrzeit'\n : 'Current date and time';\n return tz ? `${label}: ${formatted} (${tz}).` : `${label}: ${formatted}.`;\n }\n\n /**\n * Answer a time/date query from the rule-based NLU directly off the host clock — instant, offline, no\n * LLM. Localized (de/en/ru) spoken-style reply; uses the host's local timezone via {@link Intl}.\n */\n private executeTimeIntent(intent: NluIntent): string {\n const lang = String(this.config.voiceLanguage || this.language || 'en');\n const locale = lang === 'de' ? 'de-DE' : lang === 'ru' ? 'ru-RU' : 'en-GB';\n const now = new Date();\n if (intent.action === 'dateQuery') {\n const date = new Intl.DateTimeFormat(locale, {\n weekday: 'long',\n day: 'numeric',\n month: 'long',\n year: 'numeric',\n }).format(now);\n const s = lang === 'ru' ? `Сегодня ${date}.` : lang === 'de' ? `Heute ist ${date}.` : `Today is ${date}.`;\n // The ru locale already ends the date with \"г.\" — collapse the resulting \"..\" to a single period.\n return s.replace(/\\.+$/, '.');\n }\n const time = new Intl.DateTimeFormat(locale, { hour: '2-digit', minute: '2-digit' }).format(now);\n return lang === 'ru' ? `Сейчас ${time}.` : lang === 'de' ? `Es ist ${time} Uhr.` : `It's ${time}.`;\n }\n\n private async produceAnswer(question: string, history: ConversationTurn[], source = ''): Promise<string> {\n this.log.debug(`answer: source='${source}', context=${history.length} turn(s)`);\n // A ringing timer/alarm is silenced by a stop word (\"stop\"/\"halt\"/\"aufhören\"/…) — checked first so\n // it always wins over the normal pipeline while something is ringing.\n if (this.rings.length && isStopCommand(question)) {\n const n = this.stopRinging();\n this.log.info(`Ring stopped by voice (${n} session(s)).`);\n const lang = String(this.config.voiceLanguage || this.language || 'en');\n return lang === 'ru' ? 'Хорошо.' : lang === 'de' ? 'Ok.' : 'Okay.';\n }\n // Tier 0: rule-based NLU (device commands) — fastest, offline, free.\n if (this.config.useLocalNlu) {\n try {\n const handled = await this.tryLocalNlu(question, source);\n if (handled !== null) {\n this.log.info(`Answered by rule-based NLU (source='${source}').`);\n return handled;\n }\n } catch (e) {\n this.log.debug(`NLU skipped: ${(e as Error).message}`);\n }\n }\n // Tier 1a: local LLM — answers general questions offline; emits HANDOFF for anything needing tools.\n // Skipped inside an ongoing conversation (history present): the tool-free local model gets no history,\n // so it would answer a follow-up like \"yes\" context-free and swallow it — let the cloud LLM (which has\n // the thread and the tools) handle follow-ups instead.\n if (this.config.useLocalLlm && this.localLlm && !history.length) {\n try {\n const ans = await this.localLlm.ask(question);\n if (ans && !isHandoff(ans)) {\n this.log.info(`Answered by local LLM (source='${source}').`);\n return ans;\n }\n this.log.debug('Local LLM handed off to the cloud LLM.');\n } catch (e) {\n this.log.debug(`Local LLM error: ${(e as Error).message}`);\n }\n } else if (this.config.useLocalLlm && this.localLlm) {\n this.log.debug('Local LLM skipped (follow-up in an ongoing conversation → cloud LLM).');\n }\n // Tier 2: cloud LLM with full tool access. Inject a compact device list into the system prompt so\n // the model can act without a first `list_devices` round-trip (kept cached via prompt caching).\n if (!this.agent) {\n throw new Error('agent not ready');\n }\n const ctx = await this.buildDeviceContext();\n const mem = this.buildMemoryContext();\n // Only ask the model to emit the follow-up marker when satellites can actually re-open the mic.\n const followUp = this.config.voiceEnabled ? this.followUpHint() : '';\n const parts = [this.config.systemPrompt || '', followUp, mem, ctx].filter(Boolean);\n const sys = parts.length ? parts.join('\\n\\n') : undefined;\n this.log.info(\n `Cloud LLM [${this.agent.model}] (source='${source}', context=${history.length} turn(s)${mem ? ', memory' : ''}) — running tool loop…`,\n );\n // Prepend the current date/time to the user turn (cache-safe — see buildTimeContext) so the model can\n // answer time/date questions and reason about \"now\". The stored history keeps the untouched question.\n const questionForLlm = `${this.buildTimeContext()}\\n\\n${question}`;\n return this.agent.ask(questionForLlm, sys, history);\n }\n\n /**\n * Compact device listing for the LLM system prompt: \"Name (Room, type): stateId, …\" per device,\n * so the model can call set_state/get_states directly without a `list_devices` round-trip. Honors\n * the read ACL (hides read-disabled devices) and reuses the cached NLU device model.\n */\n private async buildDeviceContext(): Promise<string> {\n let devices: NluDevice[];\n try {\n ({ devices } = await this.getNluDevices());\n } catch {\n return '';\n }\n const acl = this.config.deviceAcl || {};\n const lines: string[] = [];\n for (const d of devices) {\n const ids = [...new Set(Object.values(d.controls))];\n if (!ids.length) {\n continue;\n }\n if (acl[deviceKey(ids)]?.read === false) {\n continue; // hidden from the LLM\n }\n const room = d.room ? `${d.room}, ` : '';\n lines.push(`- ${d.name} (${room}${d.type}): ${ids.join(', ')}`);\n }\n if (!lines.length) {\n return '';\n }\n const lang = String(this.config.voiceLanguage || this.language || 'en');\n const header =\n lang === 'ru'\n ? 'Известные устройства — «имя (комната, тип): stateId». Используй эти stateId напрямую с set_state/get_states; вызывай list_devices только если нужного устройства здесь нет.'\n : lang === 'de'\n ? 'Bekannte Geräte — \"Name (Raum, Typ): stateId\". Nutze diese stateIds direkt mit set_state/get_states; rufe list_devices nur, wenn ein Gerät hier fehlt.'\n : 'Known devices — \"name (room, type): stateId\". Use these stateIds directly with set_state/get_states; only call list_devices if a needed device is missing here.';\n return `${header}\\n${lines.join('\\n')}`;\n }\n\n /** Writable per-instance data dir via the adapter-core function (with a fallback for old runtimes). */\n private instanceDataDir(): string {\n try {\n return getAbsoluteInstanceDataDir(this);\n } catch {\n return path.join(getAbsoluteDefaultDataDir(), this.namespace);\n }\n }\n\n /** Create the `localLlm.status`/`localLlm.progress` states (once) for the GUI progress display. */\n private async ensureLocalLlmStates(): Promise<void> {\n await this.setObjectNotExistsAsync('localLlm', {\n type: 'channel',\n common: { name: 'Local LLM' },\n native: {},\n });\n await this.setObjectNotExistsAsync('localLlm.status', {\n type: 'state',\n common: {\n name: 'Local LLM status',\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n def: 'idle',\n },\n native: {},\n });\n await this.setObjectNotExistsAsync('localLlm.progress', {\n type: 'state',\n common: {\n name: 'Local LLM download progress',\n type: 'number',\n role: 'value',\n unit: '%',\n min: 0,\n max: 100,\n read: true,\n write: false,\n def: 0,\n },\n native: {},\n });\n }\n\n /** Update the local-LLM status (and optionally the download percent) states. */\n private setLlmStatus(status: string, progress?: number): void {\n this.setStateAsync('localLlm.status', { val: status, ack: true }).catch(() => {});\n if (progress !== undefined) {\n this.setStateAsync('localLlm.progress', { val: progress, ack: true }).catch(() => {});\n }\n }\n\n /** Parse a `download NN%` line into the progress state (throttled to whole-percent changes; no log spam). */\n private onLocalLlmProgress(line: string): void {\n const m = /download\\s+(\\d+)%/i.exec(line);\n if (m) {\n const pct = parseInt(m[1], 10);\n if (pct !== this.lastLlmPct) {\n this.lastLlmPct = pct;\n this.setLlmStatus('downloading', pct);\n if (pct % 25 === 0) {\n this.log.debug(`local model download ${pct}%`);\n }\n }\n return;\n }\n this.log.debug(`local-llm: ${line}`);\n }\n\n /**\n * Lazily load the local LLM (Tier 1a) when enabled + installed. Runs in the background — the model\n * download can take a while — so callers should not await it on the hot path.\n */\n private async ensureLocalLlm(): Promise<void> {\n if (this.localLlm) {\n this.setLlmStatus('ready', 100); // already loaded (e.g. warmed up at start) — reflect that\n return;\n }\n if (this.localLlmLoading) {\n return this.localLlmLoading; // a load is in flight; it manages the status itself\n }\n const dataDir = this.instanceDataDir();\n await this.ensureLocalLlmStates();\n if (!isLocalLlmInstalled(dataDir)) {\n this.setLlmStatus('not installed');\n this.log.info(\n 'Local LLM is enabled but not installed yet — click \"Install local model\" in the adapter settings.',\n );\n return;\n }\n const llm = new LocalLlm({\n dataDir,\n modelUrl: (this.config.localLlmModelUrl || '').trim() || DEFAULT_LOCAL_MODEL_URL,\n systemPrompt: this.config.systemPrompt || '',\n maxTokens: this.config.maxTokens || 512,\n log: this.log,\n });\n this.lastLlmPct = -1;\n this.setLlmStatus('loading');\n this.localLlmLoading = llm\n .load(line => this.onLocalLlmProgress(line))\n .then(() => {\n this.localLlm = llm;\n this.setLlmStatus('ready', 100);\n this.log.info('Local model ready.');\n })\n .catch(e => {\n this.setLlmStatus('error');\n this.log.warn(`Local LLM load failed: ${(e as Error).message}`);\n })\n .finally(() => {\n this.localLlmLoading = null;\n });\n return this.localLlmLoading;\n }\n\n /** Run the rule-based NLU; returns a response string if it produced an executable intent, else null. */\n private async tryLocalNlu(question: string, source = ''): Promise<string | null> {\n if (!this.mcp) {\n return null;\n }\n // Timer intents match device-independently (parse() checks them first), so build the NLU even\n // when no devices are known and always try timers before bailing out.\n const { rooms, devices } = await this.getNluDevices();\n const intent = new Nlu(rooms, devices, this.getNluAliases()).parse(question);\n if (!intent) {\n return null;\n }\n if (intent.action === 'timerSet' || intent.action === 'timerQuery' || intent.action === 'timerCancel') {\n return this.timers ? this.executeTimerIntent(intent, source) : null;\n }\n if (intent.action === 'alarmSet' || intent.action === 'alarmQuery' || intent.action === 'alarmCancel') {\n return this.alarms ? this.executeAlarmIntent(intent, source) : null;\n }\n if (intent.action === 'timeQuery' || intent.action === 'dateQuery') {\n return this.executeTimeIntent(intent);\n }\n if (!devices.length) {\n return null;\n }\n // Writes require the coarse toggle; if off, let the LLM explain instead of silently doing nothing.\n const isWrite = ['on', 'off', 'level', 'color'].includes(intent.action);\n if (isWrite && !this.config.allowWriteStates) {\n return null;\n }\n return this.executeIntent(intent);\n }\n\n /**\n * The configured NLU synonym dictionary filtered to the current interaction language (entries with no\n * language apply to every language). Passed to {@link Nlu} so spoken/typed variants are rewritten to\n * the canonical device/room/action wording before matching.\n */\n private getNluAliases(): { from: string; to: string }[] {\n const iso = String(this.config.voiceLanguage || this.language || 'en')\n .split('-')[0]\n .toLowerCase();\n return (this.config.nluAliases || [])\n .filter(a => a?.from && a?.to && (!a.language || String(a.language).split('-')[0].toLowerCase() === iso))\n .map(a => ({ from: a.from, to: a.to }));\n }\n\n /**\n * Vocabulary hints for STT biasing: the room and device names (in the interaction language), so the\n * speech engine better recognizes those proper nouns — exactly the words the NLU then needs to match.\n * Reuses the cached NLU device model; engines that support soft biasing (Whisper/Azure) consume it.\n */\n private async buildSttHints(): Promise<string[]> {\n try {\n const { rooms, devices } = await this.getNluDevices();\n const set = new Set<string>();\n for (const r of rooms) {\n if (r) {\n set.add(r);\n }\n }\n for (const d of devices) {\n if (d.name) {\n set.add(d.name);\n }\n }\n return [...set];\n } catch (e) {\n this.log.debug(`STT hints unavailable: ${(e as Error).message}`);\n return [];\n }\n }\n\n /** Device model for the NLU: friendly name, room, type and controls (controlType → state id). */\n private async getNluDevices(): Promise<{ rooms: string[]; devices: NluDevice[] }> {\n if (!this.mcp) {\n return { rooms: [], devices: [] };\n }\n // Match names in the assistant's interaction language (voice language, else system) so a\n // Russian command matches Russian smartNames.\n const nluLang = (this.config.voiceLanguage || this.language || 'en') as ioBroker.Languages;\n try {\n const res = await this.mcp.callTool('list_devices', { language: nluLang });\n const parsed = JSON.parse(res.text) as {\n data?: {\n rooms?: {\n roomName: string;\n devicesInRoom?: {\n deviceName?: string;\n deviceType?: string;\n controls?: Record<string, { stateId?: string; writable?: boolean }>;\n }[];\n }[];\n };\n };\n const rooms = new Set<string>();\n const devices: NluDevice[] = [];\n for (const room of parsed.data?.rooms || []) {\n const roomName = room.roomName === 'No room' ? '' : String(room.roomName ?? '');\n if (roomName) {\n rooms.add(roomName);\n }\n for (const dev of room.devicesInRoom || []) {\n if (dev.deviceType === 'button') {\n continue; // write-only trigger — not a device the NLU should match\n }\n const controls: Record<string, string> = {};\n const writable: Record<string, boolean> = {};\n const types: Record<string, string> = {};\n const roles: Record<string, string> = {};\n const stateIds: string[] = [];\n for (const [ct, c] of Object.entries(dev.controls || {})) {\n if (c?.stateId) {\n controls[ct] = c.stateId;\n writable[ct] = !!c.writable;\n types[ct] = (c as { ioBrokerValueType?: string }).ioBrokerValueType || '';\n roles[ct] = (c as { role?: string }).role || '';\n stateIds.push(c.stateId);\n }\n }\n if (!stateIds.length) {\n continue;\n }\n // The type detector sometimes exposes only a numeric `<base>.SET` level and omits the\n // sibling on/off switch. Enrich the model with the ioBroker alias/iot convention switch\n // (`<base>.ON_SET` / `<base>.ON`) so on/off and \"set to X%\" can power the device on.\n if (!Object.keys(controls).some(k => types[k] === 'boolean')) {\n for (const [k, id] of Object.entries(controls)) {\n if (types[k] === 'number' && /\\.SET$/.test(id)) {\n const onId = await this.probeSiblingSwitch(id);\n if (onId) {\n controls.on = onId;\n types.on = 'boolean';\n writable.on = true;\n roles.on = 'switch';\n break;\n }\n }\n }\n }\n const name = await this.resolveDeviceName(\n deviceKey(stateIds),\n String(dev.deviceName ?? ''),\n nluLang,\n );\n devices.push({\n name,\n room: roomName,\n type: String(dev.deviceType ?? ''),\n controls,\n writable,\n types,\n roles,\n });\n }\n }\n return { rooms: [...rooms], devices };\n } catch (e) {\n this.log.debug(`getNluDevices failed: ${(e as Error).message}`);\n return { rooms: [], devices: [] };\n }\n }\n\n /**\n * Find the writable boolean on/off sibling of a `<base>.SET` level state (ioBroker alias/iot convention:\n * `<base>.ON_SET`, or `<base>.ON`). Cached (incl. negative results) so it probes each state at most once.\n * Returns the sibling state id, or '' if there is none.\n */\n private async probeSiblingSwitch(setId: string): Promise<string> {\n if (!/\\.SET$/.test(setId)) {\n return '';\n }\n const cached = this.siblingSwitch.get(setId);\n if (cached !== undefined) {\n return cached;\n }\n let result = '';\n for (const suffix of ['.ON_SET', '.ON']) {\n const onId = setId.replace(/\\.SET$/, suffix);\n try {\n const obj = await this.getForeignObjectAsync(onId);\n const c = obj?.common as { type?: string; write?: boolean } | undefined;\n if (c && c.type === 'boolean' && c.write !== false) {\n result = onId;\n break;\n }\n } catch {\n /* sibling not present — try the next suffix */\n }\n }\n this.siblingSwitch.set(setId, result);\n return result;\n }\n\n /** Execute an NLU intent directly via the ioBroker API and return a short spoken-style response. */\n private async executeIntent(intent: NluIntent): Promise<string> {\n const mcp = this.mcp;\n if (!mcp) {\n throw new Error('mcp not ready');\n }\n // Aggregate query (\"which windows are open\") — reads many devices, not a single one.\n if (intent.action === 'listByState') {\n return this.executeListByState(intent);\n }\n const device = intent.device;\n if (!device) {\n return '';\n }\n // Respond in the assistant's interaction language (voice language, else system).\n const lang = String(this.config.voiceLanguage || this.language || 'en');\n const ru = lang === 'ru';\n const de = lang === 'de';\n const pick = (rus: string, ger: string, eng: string): string => (ru ? rus : de ? ger : eng);\n const room = intent.room || device.room;\n // Appositive room qualifier \"(<Raum>)\" — grammatically safe in every language and reads fine aloud.\n const where = room ? ` (${room})` : '';\n const dev = device.name;\n\n // Per-device ACL (key = primary state id, same as the ACL editor / read+write guards).\n const key = deviceKey(Object.values(device.controls));\n\n if (intent.action === 'query') {\n if (this.config.deviceAcl?.[key]?.read === false) {\n return pick(\n `${dev}${where} нельзя прочитать.`,\n `${dev}${where} kann nicht gelesen werden.`,\n `${dev}${where} cannot be read.`,\n );\n }\n this.log.debug(`NLU query ${device.name}: get_states ${intent.stateId}`);\n const res = await mcp.callTool('get_states', { ids: [intent.stateId] });\n let value: unknown;\n try {\n const parsed = JSON.parse(res.text) as { data?: { states?: { value?: unknown }[] } };\n value = parsed.data?.states?.[0]?.value;\n } catch {\n value = undefined;\n }\n // Append the state's unit (e.g. °C) so the spoken answer is \"minus 4,1 °C\" instead of a raw number.\n let unit = '';\n try {\n const obj = await this.getForeignObjectAsync(intent.stateId || '');\n unit = (obj?.common as { unit?: string } | undefined)?.unit || '';\n } catch {\n /* no unit */\n }\n return `${dev}${where}: ${this.describeValue(value, lang, unit)}.`;\n }\n\n if (this.config.deviceAcl?.[key]?.write === false) {\n return pick(\n `${dev}${where} только для чтения.`,\n `${dev}${where} ist schreibgeschützt.`,\n `${dev}${where} is read-only.`,\n );\n }\n\n this.log.debug(\n `NLU control ${device.name} (${intent.action}): set_state ${intent.stateId} = ${JSON.stringify(intent.value)}`,\n );\n await mcp.callTool('set_state', { id: intent.stateId, value: intent.value });\n // Secondary write: also flip the device's on/off switch when setting a level (e.g. dimmer that needs\n // an explicit power-on besides the level). Same device → covered by the write-ACL check above.\n if (intent.also) {\n this.log.debug(\n `NLU control ${device.name} (also): set_state ${intent.also.stateId} = ${intent.also.value}`,\n );\n await mcp.callTool('set_state', { id: intent.also.stateId, value: intent.also.value });\n }\n\n if (intent.action === 'on') {\n return pick(`${dev}${where} включено.`, `${dev}${where} wurde eingeschaltet.`, `${dev}${where} turned on.`);\n }\n if (intent.action === 'off') {\n return pick(\n `${dev}${where} выключено.`,\n `${dev}${where} wurde ausgeschaltet.`,\n `${dev}${where} turned off.`,\n );\n }\n if (intent.action === 'level') {\n return pick(\n `${dev}${where} установлено на ${intent.value}%.`,\n `${dev}${where} auf ${intent.value}% gesetzt.`,\n `${dev}${where} set to ${intent.value}%.`,\n );\n }\n return pick(\n `Цвет ${dev}${where} установлен.`,\n `Farbe von ${dev}${where} gesetzt.`,\n `Color of ${dev}${where} set.`,\n );\n }\n\n /**\n * Aggregate query \"which windows are open\": read every window's state and name the open ones\n * (respecting the per-device read ACL). Answers in the interaction language (de/en/ru).\n */\n private async executeListByState(intent: NluIntent): Promise<string> {\n const mcp = this.mcp;\n if (!mcp) {\n throw new Error('mcp not ready');\n }\n const lang = String(this.config.voiceLanguage || this.language || 'en');\n const ru = lang === 'ru';\n const de = lang === 'de';\n const pick = (rus: string, ger: string, eng: string): string => (ru ? rus : de ? ger : eng);\n\n // Each window's readable state (skip read-disabled devices), deduped.\n const acl = this.config.deviceAcl || {};\n const list = (intent.devices || [])\n .map(d => {\n const ids = Object.values(d.controls);\n return { name: d.name, room: d.room, key: deviceKey(ids), stateId: ids[0] };\n })\n .filter(w => w.stateId && acl[w.key]?.read !== false);\n if (!list.length) {\n return pick('Окна не найдены.', 'Keine Fenster gefunden.', 'No windows found.');\n }\n\n let states: { id?: string; value?: unknown }[] = [];\n try {\n const res = await mcp.callTool('get_states', { ids: list.map(w => w.stateId) });\n states =\n (JSON.parse(res.text) as { data?: { states?: { id?: string; value?: unknown }[] } }).data?.states || [];\n } catch {\n states = [];\n }\n const valueById = new Map(states.map(s => [s.id, s.value]));\n // A window/contact sensor reports open as a truthy value.\n const isOpen = (v: unknown): boolean => v === true || v === 'true' || v === 1 || v === 'open';\n const open = list.filter(w => isOpen(valueById.get(w.stateId)));\n\n if (!open.length) {\n return pick('Все окна закрыты.', 'Alle Fenster sind geschlossen.', 'All windows are closed.');\n }\n const names = open.map(w => (w.room ? `${w.name} (${w.room})` : w.name)).join(', ');\n return pick(`Открыты: ${names}.`, `Offen: ${names}.`, `Open: ${names}.`);\n }\n\n /** Human-readable rendering of a state value for NLU query responses (spoken aloud). */\n private describeValue(value: unknown, lang: string, unit = ''): string {\n const ru = lang === 'ru';\n const de = lang === 'de';\n const pick = (rus: string, ger: string, eng: string): string => (ru ? rus : de ? ger : eng);\n if (value === true) {\n return pick('включено', 'an', 'on');\n }\n if (value === false) {\n return pick('выключено', 'aus', 'off');\n }\n if (value === null || value === undefined) {\n return pick('неизвестно', 'unbekannt', 'unknown');\n }\n const withUnit = (s: string): string => (unit ? `${s} ${unit}` : s);\n if (typeof value === 'number') {\n // Round to 2 decimals (kills float noise) and use a decimal comma in German/Russian.\n const rounded = Math.round(value * 100) / 100;\n return withUnit(ru || de ? String(rounded).replace('.', ',') : String(rounded));\n }\n if (typeof value === 'string') {\n return withUnit(value);\n }\n return JSON.stringify(value);\n }\n\n // ── Timers / reminders (roadmap #2) ─────────────────────────────────────\n\n /**\n * Create the timer manager and wire it to the ioBroker state tree: `onChange` mirrors the active\n * timers into `timers.*` (+ per-timer `timers.items.<id>.*`) and `onFire` announces the expiry. States\n * carry the absolute `fireAt` timestamp only — no per-second countdown writes — so nothing updates\n * periodically; a vis/script derives the live \"remaining\" from `fireAt`. Stale per-timer objects from a\n * previous run are dropped before restoring the persisted list.\n */\n private async setupTimers(): Promise<void> {\n this.timers = new TimerManager({\n now: () => Date.now(),\n log: this.log,\n onFire: t => this.onTimerFired(t),\n onChange: list => void this.renderTimers(list).catch(e => this.log.debug(`renderTimers: ${e}`)),\n });\n // Cancel controls: the global \"cancel all\" and each per-timer `.cancel` button.\n this.subscribeStates('timers.cancelAll');\n this.subscribeStates('timers.items.*');\n // Drop any per-timer objects left over from before the restart; restore then recreates the live ones.\n await this.delObjectAsync('timers.items', { recursive: true }).catch(() => {});\n this.timerObjIds.clear();\n await this.restoreTimers();\n }\n\n /** Restore timers persisted in `timers.list` across a restart (future ones rescheduled, expired dropped). */\n private async restoreTimers(): Promise<void> {\n if (!this.timers) {\n return;\n }\n let arr: TimerInfo[] = [];\n try {\n const st = await this.getStateAsync('timers.list');\n if (typeof st?.val === 'string' && st.val) {\n arr = JSON.parse(st.val) as TimerInfo[];\n }\n } catch (e) {\n this.log.debug(`restoreTimers parse failed: ${(e as Error).message}`);\n }\n if (!Array.isArray(arr) || !arr.length) {\n await this.renderTimers([]); // reset the summary states to \"no timers\"\n return;\n }\n const { restored, dropped } = this.timers.restore(arr);\n if (restored) {\n this.log.info(`Restored ${restored} timer(s) after restart.`);\n }\n if (dropped) {\n this.log.info(`Dropped ${dropped} timer(s) that expired while the adapter was down.`);\n }\n }\n\n /** Mirror the active-timer list into the summary states and the per-timer `timers.items.<id>` objects. */\n private async renderTimers(list: TimerInfo[]): Promise<void> {\n const next = list[0]; // sorted soonest-first by the manager\n await this.setStateAsync('timers.count', { val: list.length, ack: true });\n await this.setStateAsync('timers.list', { val: JSON.stringify(list), ack: true });\n await this.setStateAsync('timers.nextExpiry', { val: next ? next.fireAt : 0, ack: true });\n await this.setStateAsync('timers.nextLabel', { val: next?.label || '', ack: true });\n\n const wanted = new Set(list.map(t => t.id));\n for (const id of [...this.timerObjIds]) {\n if (!wanted.has(id)) {\n await this.delObjectAsync(`timers.items.${id}`, { recursive: true }).catch(() => {});\n this.timerObjIds.delete(id);\n }\n }\n if (list.length) {\n await this.setObjectNotExistsAsync('timers.items', {\n type: 'channel',\n common: { name: 'Active timers' },\n native: {},\n });\n }\n for (const t of list) {\n await this.ensureTimerObject(t);\n }\n }\n\n /**\n * Create (once) and update the `timers.items.<id>.*` states for a single timer. Only absolute values\n * (`fireAt`, `duration`) are written — the live countdown is derived from `fireAt` by the consumer, so\n * these states are written once per timer, not on a periodic tick.\n */\n private async ensureTimerObject(t: TimerInfo): Promise<void> {\n const base = `timers.items.${t.id}`;\n if (!this.timerObjIds.has(t.id)) {\n await this.setObjectNotExistsAsync(base, {\n type: 'channel',\n common: { name: t.label || 'Timer' },\n native: {},\n });\n const mk = (sub: string, common: ioBroker.StateCommon): Promise<unknown> =>\n this.setObjectNotExistsAsync(`${base}.${sub}`, { type: 'state', common, native: {} });\n await mk('label', { name: 'Label', type: 'string', role: 'text', read: true, write: false });\n await mk('room', { name: 'Room', type: 'string', role: 'text', read: true, write: false });\n await mk('duration', {\n name: 'Duration',\n type: 'number',\n role: 'value.interval',\n unit: 's',\n read: true,\n write: false,\n });\n await mk('fireAt', { name: 'Fires at', type: 'number', role: 'value.time', read: true, write: false });\n await mk('cancel', {\n name: 'Cancel this timer',\n type: 'boolean',\n role: 'button',\n read: false,\n write: true,\n def: false,\n });\n this.timerObjIds.add(t.id);\n }\n await this.setStateAsync(`${base}.label`, { val: t.label, ack: true });\n await this.setStateAsync(`${base}.room`, { val: t.room, ack: true });\n await this.setStateAsync(`${base}.duration`, { val: t.duration, ack: true });\n await this.setStateAsync(`${base}.fireAt`, { val: t.fireAt, ack: true });\n }\n\n /** A timer expired: record it, play the jingle (if any) and speak the announcement on the origin satellite. */\n private onTimerFired(t: TimerInfo): void {\n this.log.info(`Timer fired: \"${t.label || '(no label)'}\"${t.room ? ` (${t.room})` : ''}`);\n this.setStateAsync('timers.lastFired', { val: t.label || t.id, ack: true }).catch(() => {});\n const announce = this.config.timerAnnounce !== false;\n const target = this.announceTargetForSource(t.source);\n this.fireEffects(this.config.timerSound || '', announce, this.timerAnnounceMessage(t), target);\n }\n\n /** Build the spoken expiry message (\"Timer abgelaufen: die Nudeln.\") in the interaction language. */\n private timerAnnounceMessage(t: TimerInfo): string {\n const lang = String(this.config.voiceLanguage || this.language || 'en');\n const ru = lang === 'ru';\n const de = lang === 'de';\n const pick = (rus: string, ger: string, eng: string): string => (ru ? rus : de ? ger : eng);\n if (t.label) {\n return pick(`Таймер сработал: ${t.label}.`, `Timer abgelaufen: ${t.label}.`, `Timer finished: ${t.label}.`);\n }\n const dur = formatDuration(t.duration, lang);\n return pick(`Таймер на ${dur} сработал.`, `Timer über ${dur} ist abgelaufen.`, `Your ${dur} timer is done.`);\n }\n\n /**\n * Resolve a request source (satellite device name / 'chat' / '') to an announcement target id, so a\n * timer rings on the satellite it was set from. Returns null (→ broadcast to all) when the source is\n * the chat/text interface or the originating satellite is no longer known.\n */\n private announceTargetForSource(source: string): string | null {\n if (!source || source === 'chat' || source === 'wyoming') {\n return null;\n }\n for (const [id, device] of this.satDeviceById) {\n if (device === source) {\n return id;\n }\n }\n if (this.satDeviceById.has(source) || this.nativeSatFrom.has(source)) {\n return source;\n }\n return null;\n }\n\n /** Execute a timer intent (set/query/cancel) from the NLU and return a spoken-style reply. */\n private executeTimerIntent(intent: NluIntent, source: string): string {\n const mgr = this.timers;\n if (!mgr) {\n return '';\n }\n const lang = String(this.config.voiceLanguage || this.language || 'en');\n const ru = lang === 'ru';\n const de = lang === 'de';\n const pick = (rus: string, ger: string, eng: string): string => (ru ? rus : de ? ger : eng);\n\n if (intent.action === 'timerSet') {\n const info = mgr.add({\n label: intent.label || '',\n room: intent.room || '',\n source,\n duration: intent.durationSec || 0,\n });\n const dur = formatDuration(info.duration, lang);\n const tail = info.label ? ` (${info.label})` : '';\n return pick(\n `Таймер на ${dur} установлен${tail}.`,\n `Timer auf ${dur} gestellt${tail}.`,\n `Timer set for ${dur}${tail}.`,\n );\n }\n\n if (intent.action === 'timerCancel') {\n let victims = mgr.list();\n if (intent.room) {\n victims = victims.filter(t => t.room === intent.room);\n }\n if (intent.label) {\n const l = intent.label.toLowerCase();\n const byLabel = victims.filter(t => t.label && t.label.toLowerCase().includes(l));\n if (byLabel.length) {\n victims = byLabel;\n }\n }\n if (!victims.length) {\n return pick('Активных таймеров нет.', 'Es laufen keine Timer.', 'There are no timers running.');\n }\n for (const t of victims) {\n mgr.cancel(t.id);\n }\n if (victims.length === 1) {\n return pick('Таймер отменён.', 'Timer abgebrochen.', 'Timer cancelled.');\n }\n return pick(\n `Отменено таймеров: ${victims.length}.`,\n `${victims.length} Timer abgebrochen.`,\n `Cancelled ${victims.length} timers.`,\n );\n }\n\n // timerQuery\n let list = mgr.list();\n if (intent.room) {\n list = list.filter(t => t.room === intent.room);\n }\n if (!list.length) {\n return pick('Активных таймеров нет.', 'Es laufen keine Timer.', 'There are no timers running.');\n }\n const now = Date.now();\n const parts = list.map(t => {\n const rem = formatDuration(Math.max(0, Math.round((t.fireAt - now) / 1000)), lang);\n return t.label\n ? pick(`${t.label}: ещё ${rem}`, `${t.label}: noch ${rem}`, `${t.label}: ${rem} left`)\n : pick(`ещё ${rem}`, `noch ${rem}`, `${rem} left`);\n });\n return `${parts.join(', ')}.`;\n }\n\n /** LLM tools for timers (set/list/cancel), appended to the MCP tool set so the cloud model can use them. */\n private buildTimerTools(): Tool[] {\n const summarize = (t: TimerInfo): Record<string, unknown> => ({\n id: t.id,\n label: t.label,\n room: t.room,\n durationSec: t.duration,\n fireAt: t.fireAt,\n remainingSec: Math.max(0, Math.round((t.fireAt - Date.now()) / 1000)),\n });\n return [\n {\n name: 'set_timer',\n description:\n 'Start a countdown timer / reminder that announces on the satellite when it expires. duration is in whole seconds; label and room are optional.',\n parameters: {\n type: 'object',\n properties: {\n duration: { type: 'number', description: 'Duration in seconds (> 0)' },\n label: { type: 'string', description: 'Optional label, e.g. \"pasta\"' },\n room: { type: 'string', description: 'Optional room' },\n },\n required: ['duration'],\n additionalProperties: false,\n },\n run: (args): Promise<string> => {\n if (!this.timers) {\n return Promise.resolve(JSON.stringify({ ok: false, error: 'timers unavailable' }));\n }\n const duration = Math.round(Number(args.duration) || 0);\n if (duration <= 0) {\n return Promise.resolve(JSON.stringify({ ok: false, error: 'duration must be > 0 seconds' }));\n }\n const info = this.timers.add({\n label: String((args.label as string) || ''),\n room: String((args.room as string) || ''),\n source: '',\n duration,\n });\n return Promise.resolve(JSON.stringify({ ok: true, data: summarize(info) }));\n },\n },\n {\n name: 'list_timers',\n description: 'List the currently running countdown timers with their remaining time.',\n parameters: { type: 'object', properties: {}, additionalProperties: false },\n run: (): Promise<string> =>\n Promise.resolve(JSON.stringify({ ok: true, data: (this.timers?.list() || []).map(summarize) })),\n },\n {\n name: 'cancel_timer',\n description: 'Cancel a running timer by its id, or all timers when no id is given.',\n parameters: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Timer id from list_timers; omit to cancel all' },\n },\n additionalProperties: false,\n },\n run: (args): Promise<string> => {\n if (!this.timers) {\n return Promise.resolve(JSON.stringify({ ok: false, error: 'timers unavailable' }));\n }\n if (args.id && typeof args.id === 'string') {\n const ok = this.timers.cancel(args.id);\n return Promise.resolve(JSON.stringify({ ok, data: { cancelled: ok ? 1 : 0 } }));\n }\n const n = this.timers.cancelAll();\n return Promise.resolve(JSON.stringify({ ok: true, data: { cancelled: n } }));\n },\n },\n ];\n }\n\n // ── Alarms / wake-ups at a fixed clock time (roadmap #2) ────────────────\n\n /**\n * Create the alarm manager and mirror it into `alarms.*` (+ per-alarm `alarms.items.<id>.*`). Like the\n * timers, states carry only the absolute `nextFireAt` — nothing is written periodically. Stale per-alarm\n * objects from a previous run are dropped before restoring the persisted list.\n */\n private async setupAlarms(): Promise<void> {\n this.alarms = new AlarmManager({\n now: () => Date.now(),\n log: this.log,\n onFire: a => this.onAlarmFired(a),\n onChange: list => void this.renderAlarms(list).catch(e => this.log.debug(`renderAlarms: ${e}`)),\n });\n this.subscribeStates('alarms.cancelAll');\n this.subscribeStates('alarms.items.*');\n await this.delObjectAsync('alarms.items', { recursive: true }).catch(() => {});\n this.alarmObjIds.clear();\n await this.restoreAlarms();\n }\n\n /** Restore alarms persisted in `alarms.list` across a restart (recompute next fire; drop missed one-shots). */\n private async restoreAlarms(): Promise<void> {\n if (!this.alarms) {\n return;\n }\n let arr: AlarmInfo[] = [];\n try {\n const st = await this.getStateAsync('alarms.list');\n if (typeof st?.val === 'string' && st.val) {\n arr = JSON.parse(st.val) as AlarmInfo[];\n }\n } catch (e) {\n this.log.debug(`restoreAlarms parse failed: ${(e as Error).message}`);\n }\n if (!Array.isArray(arr) || !arr.length) {\n await this.renderAlarms([]);\n return;\n }\n const { restored, dropped } = this.alarms.restore(arr);\n if (restored) {\n this.log.info(`Restored ${restored} alarm(s) after restart.`);\n }\n if (dropped) {\n this.log.info(`Dropped ${dropped} one-shot alarm(s) that were due while the adapter was down.`);\n }\n }\n\n /** Mirror the alarm list into the summary states and the per-alarm `alarms.items.<id>` objects. */\n private async renderAlarms(list: AlarmInfo[]): Promise<void> {\n const upcoming = list.filter(a => a.enabled && a.nextFireAt);\n const next = upcoming[0];\n await this.setStateAsync('alarms.count', { val: list.length, ack: true });\n await this.setStateAsync('alarms.list', { val: JSON.stringify(list), ack: true });\n await this.setStateAsync('alarms.nextAlarm', { val: next ? next.nextFireAt : 0, ack: true });\n await this.setStateAsync('alarms.nextLabel', {\n val: next ? next.label || formatClock(next.hour, next.minute) : '',\n ack: true,\n });\n\n const wanted = new Set(list.map(a => a.id));\n for (const id of [...this.alarmObjIds]) {\n if (!wanted.has(id)) {\n await this.delObjectAsync(`alarms.items.${id}`, { recursive: true }).catch(() => {});\n this.alarmObjIds.delete(id);\n }\n }\n if (list.length) {\n await this.setObjectNotExistsAsync('alarms.items', {\n type: 'channel',\n common: { name: 'Alarms' },\n native: {},\n });\n }\n for (const a of list) {\n await this.ensureAlarmObject(a);\n }\n }\n\n /** Create (once) and update the `alarms.items.<id>.*` states for a single alarm. */\n private async ensureAlarmObject(a: AlarmInfo): Promise<void> {\n const base = `alarms.items.${a.id}`;\n if (!this.alarmObjIds.has(a.id)) {\n await this.setObjectNotExistsAsync(base, {\n type: 'channel',\n common: { name: a.label || `Alarm ${formatClock(a.hour, a.minute)}` },\n native: {},\n });\n const mk = (sub: string, common: ioBroker.StateCommon): Promise<unknown> =>\n this.setObjectNotExistsAsync(`${base}.${sub}`, { type: 'state', common, native: {} });\n await mk('label', { name: 'Label', type: 'string', role: 'text', read: true, write: false });\n await mk('room', { name: 'Room', type: 'string', role: 'text', read: true, write: false });\n await mk('time', { name: 'Time (HH:MM)', type: 'string', role: 'text', read: true, write: false });\n await mk('weekdays', {\n name: 'Weekdays (0=Sun..6=Sat, empty=once)',\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n });\n await mk('nextFireAt', { name: 'Next fire', type: 'number', role: 'value.time', read: true, write: false });\n await mk('enabled', {\n name: 'Enabled',\n type: 'boolean',\n role: 'switch.enable',\n read: true,\n write: true,\n def: true,\n });\n await mk('delete', {\n name: 'Delete this alarm',\n type: 'boolean',\n role: 'button',\n read: false,\n write: true,\n def: false,\n });\n this.alarmObjIds.add(a.id);\n }\n await this.setStateAsync(`${base}.label`, { val: a.label, ack: true });\n await this.setStateAsync(`${base}.room`, { val: a.room, ack: true });\n await this.setStateAsync(`${base}.time`, { val: formatClock(a.hour, a.minute), ack: true });\n await this.setStateAsync(`${base}.weekdays`, { val: a.weekdays.join(','), ack: true });\n await this.setStateAsync(`${base}.nextFireAt`, { val: a.nextFireAt, ack: true });\n await this.setStateAsync(`${base}.enabled`, { val: a.enabled, ack: true });\n }\n\n /** An alarm fired: record it, play the jingle (if any) and speak the announcement on the origin satellite. */\n private onAlarmFired(a: AlarmInfo): void {\n this.log.info(`Alarm fired: \"${a.label || formatClock(a.hour, a.minute)}\"${a.room ? ` (${a.room})` : ''}`);\n this.setStateAsync('alarms.lastFired', { val: a.label || formatClock(a.hour, a.minute), ack: true }).catch(\n () => {},\n );\n const announce = this.config.alarmAnnounce !== false;\n const lang = String(this.config.voiceLanguage || this.language || 'en');\n const ru = lang === 'ru';\n const de = lang === 'de';\n const pick = (rus: string, ger: string, eng: string): string => (ru ? rus : de ? ger : eng);\n const clock = formatClock(a.hour, a.minute);\n const msg = a.label\n ? pick(`Будильник: ${a.label}.`, `Wecker: ${a.label}.`, `Alarm: ${a.label}.`)\n : pick(`Будильник, ${clock}.`, `Wecker, es ist ${clock} Uhr.`, `Alarm, it is ${clock}.`);\n const target = this.announceTargetForSource(a.source);\n this.fireEffects(this.config.alarmSound || '', announce, msg, target);\n }\n\n /** Execute an alarm intent (set/query/cancel) from the NLU and return a spoken-style reply. */\n private executeAlarmIntent(intent: NluIntent, source: string): string {\n const mgr = this.alarms;\n if (!mgr) {\n return '';\n }\n const lang = String(this.config.voiceLanguage || this.language || 'en');\n const ru = lang === 'ru';\n const de = lang === 'de';\n const pick = (rus: string, ger: string, eng: string): string => (ru ? rus : de ? ger : eng);\n\n if (intent.action === 'alarmSet') {\n const info = mgr.add({\n label: intent.label || '',\n room: intent.room || '',\n source,\n hour: intent.hour ?? 0,\n minute: intent.minute ?? 0,\n weekdays: intent.weekdays || [],\n });\n const clock = formatClock(info.hour, info.minute);\n const rec = formatWeekdays(info.weekdays, lang);\n const when = rec ? ` (${rec})` : '';\n return pick(\n `Будильник на ${clock}${when} установлен.`,\n `Wecker auf ${clock} Uhr${when} gestellt.`,\n `Alarm set for ${clock}${when}.`,\n );\n }\n\n if (intent.action === 'alarmCancel') {\n let victims = mgr.list();\n if (intent.room) {\n victims = victims.filter(a => a.room === intent.room);\n }\n if (intent.label) {\n const l = intent.label.toLowerCase();\n const byLabel = victims.filter(a => a.label && a.label.toLowerCase().includes(l));\n if (byLabel.length) {\n victims = byLabel;\n }\n }\n if (!victims.length) {\n return pick('Будильников нет.', 'Es sind keine Wecker gestellt.', 'There are no alarms set.');\n }\n for (const a of victims) {\n mgr.cancel(a.id);\n }\n if (victims.length === 1) {\n return pick('Будильник удалён.', 'Wecker gelöscht.', 'Alarm deleted.');\n }\n return pick(\n `Удалено будильников: ${victims.length}.`,\n `${victims.length} Wecker gelöscht.`,\n `Deleted ${victims.length} alarms.`,\n );\n }\n\n // alarmQuery\n let list = mgr.list();\n if (intent.room) {\n list = list.filter(a => a.room === intent.room);\n }\n if (!list.length) {\n return pick('Будильников нет.', 'Es sind keine Wecker gestellt.', 'There are no alarms set.');\n }\n const parts = list.map(a => {\n const clock = formatClock(a.hour, a.minute);\n const rec = formatWeekdays(a.weekdays, lang);\n const off = a.enabled ? '' : pick(' (выкл.)', ' (aus)', ' (off)');\n const base = a.label ? `${a.label}: ${clock}` : clock;\n return rec ? `${base} ${rec}${off}` : `${base}${off}`;\n });\n return `${parts.join(', ')}.`;\n }\n\n /** LLM tools for alarms (set/list/cancel), appended to the MCP tool set. */\n private buildAlarmTools(): Tool[] {\n const summarize = (a: AlarmInfo): Record<string, unknown> => ({\n id: a.id,\n label: a.label,\n room: a.room,\n time: formatClock(a.hour, a.minute),\n weekdays: a.weekdays,\n enabled: a.enabled,\n nextFireAt: a.nextFireAt,\n });\n return [\n {\n name: 'set_alarm',\n description:\n 'Set an alarm / wake-up at a fixed clock time that announces on the satellite. hour 0-23, minute 0-59; weekdays is an optional array (0=Sunday..6=Saturday) for a recurring alarm (empty = one-shot at the next occurrence); label and room are optional.',\n parameters: {\n type: 'object',\n properties: {\n hour: { type: 'number', description: 'Hour 0-23' },\n minute: { type: 'number', description: 'Minute 0-59' },\n weekdays: {\n type: 'array',\n items: { type: 'number' },\n description: '0=Sunday..6=Saturday; omit/empty for a one-shot alarm',\n },\n label: { type: 'string' },\n room: { type: 'string' },\n },\n required: ['hour', 'minute'],\n additionalProperties: false,\n },\n run: (args): Promise<string> => {\n if (!this.alarms) {\n return Promise.resolve(JSON.stringify({ ok: false, error: 'alarms unavailable' }));\n }\n const hour = Number(args.hour);\n const minute = Number(args.minute);\n if (!Number.isFinite(hour) || !Number.isFinite(minute)) {\n return Promise.resolve(JSON.stringify({ ok: false, error: 'hour and minute are required' }));\n }\n const weekdays = Array.isArray(args.weekdays) ? (args.weekdays as unknown[]).map(Number) : [];\n const info = this.alarms.add({\n label: String((args.label as string) || ''),\n room: String((args.room as string) || ''),\n source: '',\n hour,\n minute,\n weekdays,\n });\n return Promise.resolve(JSON.stringify({ ok: true, data: summarize(info) }));\n },\n },\n {\n name: 'list_alarms',\n description: 'List the configured alarms with their time, recurrence and next fire.',\n parameters: { type: 'object', properties: {}, additionalProperties: false },\n run: (): Promise<string> =>\n Promise.resolve(JSON.stringify({ ok: true, data: (this.alarms?.list() || []).map(summarize) })),\n },\n {\n name: 'cancel_alarm',\n description: 'Delete an alarm by its id, or all alarms when no id is given.',\n parameters: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Alarm id from list_alarms; omit to delete all' },\n },\n additionalProperties: false,\n },\n run: (args): Promise<string> => {\n if (!this.alarms) {\n return Promise.resolve(JSON.stringify({ ok: false, error: 'alarms unavailable' }));\n }\n if (args.id && typeof args.id === 'string') {\n const ok = this.alarms.cancel(args.id);\n return Promise.resolve(JSON.stringify({ ok, data: { deleted: ok ? 1 : 0 } }));\n }\n const n = this.alarms.cancelAll();\n return Promise.resolve(JSON.stringify({ ok: true, data: { deleted: n } }));\n },\n },\n ];\n }\n\n // ── Long-term memory (roadmap #6) ───────────────────────────────────────\n\n /** Create the memory store and mirror it into `memory.*` (+ per-entry `memory.items.<id>.*`). */\n private async setupMemory(): Promise<void> {\n this.memory = new MemoryStore({\n log: this.log,\n onChange: list => void this.renderMemory(list).catch(e => this.log.debug(`renderMemory: ${e}`)),\n });\n this.subscribeStates('memory.add');\n this.subscribeStates('memory.forget');\n this.subscribeStates('memory.clearAll');\n this.subscribeStates('memory.items.*');\n await this.delObjectAsync('memory.items', { recursive: true }).catch(() => {});\n this.memoryObjIds.clear();\n await this.restoreMemory();\n }\n\n /** Restore facts persisted in `memory.list` across a restart. */\n private async restoreMemory(): Promise<void> {\n if (!this.memory) {\n return;\n }\n let arr: MemoryEntry[] = [];\n try {\n const st = await this.getStateAsync('memory.list');\n if (typeof st?.val === 'string' && st.val) {\n arr = JSON.parse(st.val) as MemoryEntry[];\n }\n } catch (e) {\n this.log.debug(`restoreMemory parse failed: ${(e as Error).message}`);\n }\n const n = this.memory.restore(arr);\n if (n) {\n this.log.info(`Restored ${n} remembered fact(s).`);\n } else {\n await this.renderMemory([]);\n }\n }\n\n /** Mirror the fact list into the summary states and the per-entry `memory.items.<id>` objects. */\n private async renderMemory(list: MemoryEntry[]): Promise<void> {\n await this.setStateAsync('memory.count', { val: list.length, ack: true });\n await this.setStateAsync('memory.list', { val: JSON.stringify(list), ack: true });\n\n const wanted = new Set(list.map(e => e.id));\n for (const id of [...this.memoryObjIds]) {\n if (!wanted.has(id)) {\n await this.delObjectAsync(`memory.items.${id}`, { recursive: true }).catch(() => {});\n this.memoryObjIds.delete(id);\n }\n }\n if (list.length) {\n await this.setObjectNotExistsAsync('memory.items', {\n type: 'channel',\n common: { name: 'Remembered facts' },\n native: {},\n });\n }\n for (const e of list) {\n await this.ensureMemoryObject(e);\n }\n }\n\n /** Create (once) and update the `memory.items.<id>.*` states for a single fact (text is editable). */\n private async ensureMemoryObject(e: MemoryEntry): Promise<void> {\n const base = `memory.items.${e.id}`;\n if (!this.memoryObjIds.has(e.id)) {\n await this.setObjectNotExistsAsync(base, {\n type: 'channel',\n common: { name: e.key || e.text.slice(0, 40) || 'Fact' },\n native: {},\n });\n const mk = (sub: string, common: ioBroker.StateCommon): Promise<unknown> =>\n this.setObjectNotExistsAsync(`${base}.${sub}`, { type: 'state', common, native: {} });\n await mk('text', { name: 'Fact', type: 'string', role: 'text', read: true, write: true });\n await mk('key', { name: 'Key/topic', type: 'string', role: 'text', read: true, write: false });\n await mk('source', { name: 'Source', type: 'string', role: 'text', read: true, write: false });\n await mk('createdAt', { name: 'Created', type: 'number', role: 'value.time', read: true, write: false });\n await mk('delete', {\n name: 'Forget this fact',\n type: 'boolean',\n role: 'button',\n read: false,\n write: true,\n def: false,\n });\n this.memoryObjIds.add(e.id);\n }\n await this.setStateAsync(`${base}.text`, { val: e.text, ack: true });\n await this.setStateAsync(`${base}.key`, { val: e.key, ack: true });\n await this.setStateAsync(`${base}.source`, { val: e.source, ack: true });\n await this.setStateAsync(`${base}.createdAt`, { val: e.createdAt, ack: true });\n }\n\n /** Compact system-prompt block of remembered facts, injected before each cloud-LLM call (retrieval = all). */\n private buildMemoryContext(): string {\n if (this.config.useLongTermMemory === false || !this.memory) {\n return '';\n }\n const lang = String(this.config.voiceLanguage || this.language || 'en');\n return buildMemoryPrompt(this.memory.list(), lang);\n }\n\n /** LLM tools for long-term memory (remember/list/forget), appended to the MCP tool set. */\n private buildMemoryTools(): Tool[] {\n const summarize = (e: MemoryEntry): Record<string, unknown> => ({\n id: e.id,\n text: e.text,\n key: e.key,\n });\n return [\n {\n name: 'remember',\n description:\n 'Store a durable fact about the user or household to recall in later conversations (e.g. names, preferences, where things are). Use a short \"key\" (e.g. \"daughter\", \"wifi\") to update an existing fact instead of duplicating it. Only store lasting facts, not transient state.',\n parameters: {\n type: 'object',\n properties: {\n text: { type: 'string', description: 'The fact to remember' },\n key: { type: 'string', description: 'Optional short topic key for dedup/update' },\n },\n required: ['text'],\n additionalProperties: false,\n },\n run: (args): Promise<string> => {\n if (!this.memory || typeof args.text !== 'string') {\n return Promise.resolve(JSON.stringify({ ok: false, error: 'memory is disabled' }));\n }\n const entry = this.memory.add({\n text: args.text,\n key: String((args.key as string) || ''),\n source: 'llm',\n });\n return Promise.resolve(\n entry\n ? JSON.stringify({ ok: true, data: summarize(entry) })\n : JSON.stringify({ ok: false, error: 'empty text' }),\n );\n },\n },\n {\n name: 'list_memories',\n description: 'List the durable facts currently remembered about the user/household.',\n parameters: { type: 'object', properties: {}, additionalProperties: false },\n run: (): Promise<string> =>\n Promise.resolve(JSON.stringify({ ok: true, data: (this.memory?.list() || []).map(summarize) })),\n },\n {\n name: 'forget',\n description:\n 'Forget a remembered fact by its id or its key. Use this when the user asks to forget something.',\n parameters: {\n type: 'object',\n properties: { idOrKey: { type: 'string', description: 'The fact id or key to forget' } },\n required: ['idOrKey'],\n additionalProperties: false,\n },\n run: (args): Promise<string> => {\n if (!this.memory) {\n return Promise.resolve(JSON.stringify({ ok: false, error: 'memory is disabled' }));\n }\n const n = this.memory.forget(String((args.idOrKey as string) || ''));\n return Promise.resolve(JSON.stringify({ ok: n > 0, data: { forgotten: n } }));\n },\n },\n ];\n }\n\n // ── Weather (read a user-selected weather adapter) ──────────────────────\n\n /**\n * Read the configured weather adapter's states and normalize them. `value` is the settings value\n * (`weatherInstance`): a state prefix that, for Open-Meteo, includes the location device\n * (`open-meteo-weather.0.Berlin`) and for others is just the instance (`weatherunderground.0`). Returns\n * a normalized report for known adapters, or a raw (filtered) state dump for unknown ones.\n */\n private async readWeather(\n value: string,\n ): Promise<{ report?: WeatherReport; raw?: StateValues; source?: string; error?: string }> {\n const root = value.trim();\n if (!root) {\n return { error: 'no weather source configured' };\n }\n const adapter = root.split('.')[0];\n const states: StateValues = {};\n try {\n const raw = await this.getForeignStatesAsync(`${root}.*`);\n for (const [id, st] of Object.entries(raw || {})) {\n states[id] = st?.val;\n }\n } catch (e) {\n return { error: `cannot read ${root}: ${(e as Error).message}` };\n }\n const report = buildWeatherReport(adapter, root, states);\n if (report) {\n return { report };\n }\n if (WEATHER_ADAPTERS[adapter]?.kind) {\n return { error: `weather adapter \"${adapter}\" selected but it has no data yet — start it once` };\n }\n // Unknown adapter: return a filtered raw dump so the LLM can still try.\n const weatherish =\n /(temp|wind|humid|rain|precip|cloud|pressure|forecast|current|state|condition|weather|snow|uv)/i;\n const dump: StateValues = {};\n let n = 0;\n for (const [id, v] of Object.entries(states)) {\n if (n >= 80) {\n break;\n }\n if ((typeof v === 'number' || typeof v === 'string') && weatherish.test(id)) {\n dump[id.slice(root.length + 1)] = v;\n n++;\n }\n }\n return Object.keys(dump).length ? { raw: dump, source: adapter } : { error: 'no weather data found' };\n }\n\n /** The LLM tool for weather questions (reads the configured weather adapter). */\n private buildWeatherTool(): Tool {\n return {\n name: 'get_weather',\n description:\n 'Get the current weather and forecast from the configured weather station. Use this for any question about the weather, the temperature outside, rain, wind, or the forecast. Optional \"when\": current/today, tomorrow, or week.',\n parameters: {\n type: 'object',\n properties: {\n when: {\n type: 'string',\n enum: ['current', 'today', 'tomorrow', 'week'],\n description: 'Which period',\n },\n },\n additionalProperties: false,\n },\n run: async (args): Promise<string> => {\n const value = (this.config.weatherInstance || '').trim();\n if (!value) {\n return JSON.stringify({\n ok: false,\n error: 'No weather source configured in the assistant settings.',\n });\n }\n const res = await this.readWeather(value);\n if (res.report) {\n return JSON.stringify({ ok: true, data: trimReport(res.report, (args.when as string) || '') });\n }\n if (res.raw) {\n return JSON.stringify({ ok: true, data: { source: res.source, states: res.raw } });\n }\n return JSON.stringify({ ok: false, error: res.error || 'no weather data' });\n },\n };\n }\n\n /**\n * List installed weather-adapter instances for the settings dropdown (selectSendTo). For Open-Meteo,\n * each configured location becomes its own option (the data is namespaced per location).\n */\n private async getWeatherInstances(): Promise<{ label: string; value: string }[]> {\n const options: { label: string; value: string }[] = [{ label: '—', value: '' }];\n const instances: Record<string, ioBroker.Object> = {};\n try {\n const view = await this.getObjectViewAsync('system', 'instance', {\n startkey: 'system.adapter.',\n endkey: 'system.adapter.香',\n });\n for (const row of view?.rows || []) {\n if (row.value) {\n instances[row.id] = row.value;\n }\n }\n } catch (e) {\n this.log.warn(`getWeatherInstances failed: ${(e as Error).message}`);\n return options;\n }\n for (const obj of Object.values(instances)) {\n const adapter = String((obj.common as { name?: string })?.name || '');\n const meta = WEATHER_ADAPTERS[adapter];\n if (!meta) {\n continue;\n }\n const instanceId = String(obj._id).replace('system.adapter.', '');\n if (meta.perLocationProbe) {\n // Adapter namespaces data per location — list each configured location as its own option.\n const marker = `.${meta.perLocationProbe.split('.')[0]}.`;\n let found = false;\n try {\n const rows = await this.getForeignStatesAsync(`${instanceId}.*.${meta.perLocationProbe}`);\n for (const id of Object.keys(rows || {})) {\n const loc = id.slice(instanceId.length + 1, id.indexOf(marker));\n if (loc) {\n options.push({\n label: `${meta.label}: ${loc.replace(/_/g, ' ')}`,\n value: `${instanceId}.${loc}`,\n });\n found = true;\n }\n }\n } catch {\n /* fall through to the instance-level option */\n }\n if (!found) {\n options.push({ label: `${meta.label} (${instanceId})`, value: instanceId });\n }\n } else {\n options.push({ label: `${meta.label} (${instanceId})`, value: instanceId });\n }\n }\n return options;\n }\n\n /** Flattened device list (name, type, room, state ids) for the admin per-device ACL component. */\n private async getDeviceList(lang?: ioBroker.Languages): Promise<DeviceListEntry[]> {\n if (!this.mcp) {\n return [];\n }\n const language = lang || this.language;\n try {\n const res = await this.mcp.callTool('list_devices', { language });\n const parsed = JSON.parse(res.text) as {\n data?: {\n rooms?: {\n roomName: string;\n devicesInRoom?: {\n deviceName?: string;\n deviceType?: string;\n controls?: Record<string, { stateId?: string; writable?: boolean }>;\n }[];\n }[];\n };\n };\n const out: DeviceListEntry[] = [];\n for (const room of parsed.data?.rooms || []) {\n for (const dev of room.devicesInRoom || []) {\n const controls = Object.values(dev.controls || {});\n const stateIds = controls.map(c => c.stateId).filter((x): x is string => !!x);\n const key = deviceKey(stateIds);\n // The multi-language editor needs the raw smartName map plus the language-independent\n // \"auto\" (parent/detector) name it falls back to; `name` is the resolved display name.\n const [name, smartName, autoName] = await Promise.all([\n this.resolveDeviceName(key, String(dev.deviceName ?? ''), language),\n this.rawSmartName(key),\n this.resolveParentName(key, String(dev.deviceName ?? ''), language),\n ]);\n out.push({\n key,\n name,\n smartName,\n autoName,\n type: String(dev.deviceType ?? ''),\n room: String(room.roomName ?? ''),\n stateIds,\n writableStateIds: controls\n .filter(c => c.writable)\n .map(c => c.stateId)\n .filter((x): x is string => !!x),\n });\n }\n }\n return out;\n } catch (e) {\n this.log.warn(`getDevices failed: ${(e as Error).message}`);\n return [];\n }\n }\n\n /** Extract a display name from `common.smartName` (string or `{lang}` map); '' if unset/disabled. */\n private smartNameOf(obj: ioBroker.Object | null | undefined, lang?: ioBroker.Languages): string {\n const sn = (obj?.common as { smartName?: unknown } | undefined)?.smartName;\n if (!sn || sn === 'ignore' || sn === false) {\n return '';\n }\n if (typeof sn === 'string') {\n return sn;\n }\n if (typeof sn === 'object') {\n const t = sn as Record<string, string>;\n const l = lang || this.language || 'en';\n return t[l] || t.en || t.de || '';\n }\n return '';\n }\n\n /** Resolve a `common.name` (string or translated map) to a display string for the given language. */\n private objectName(obj: ioBroker.Object | null | undefined, id: string, lang?: ioBroker.Languages): string {\n const n = obj?.common?.name;\n if (typeof n === 'string' && n) {\n return n;\n }\n if (n && typeof n === 'object') {\n const t = n as Record<string, string>;\n const l = lang || this.language || 'en';\n return t[l] || t.en || Object.values(t)[0] || id.split('.').pop() || id;\n }\n return id.split('.').pop() || id;\n }\n\n /**\n * Friendly device name, resolved the same way ioBroker.iot does (`Devices.tsx#resolveDeviceDisplay`):\n * the type-detector often names an alias control after its leaf state (e.g. \"SET\"), so walk one level\n * up to the enclosing channel/device/**folder** and use its name; if that parent is a channel/device/\n * folder, prefer an enclosing device's name. Falls back to the detector name on any miss.\n */\n private async resolveDeviceName(stateId: string, fallback: string, lang?: ioBroker.Languages): Promise<string> {\n // 1. User-edited smartName on the primary state wins over everything.\n try {\n const own = await this.getForeignObjectAsync(stateId);\n const sn = this.smartNameOf(own, lang);\n if (sn) {\n return sn;\n }\n } catch {\n /* fall through to parent walk-up */\n }\n // 2./3. iot-style parent walk-up.\n return this.resolveParentName(stateId, fallback, lang);\n }\n\n /** The \"auto\" name: walk up to the enclosing channel/device/folder (ignores smartName). */\n private async resolveParentName(stateId: string, fallback: string, lang?: ioBroker.Languages): Promise<string> {\n if (!stateId || !stateId.includes('.')) {\n return fallback;\n }\n const arr = stateId.split('.');\n arr.pop();\n const parentId = arr.join('.');\n if (!parentId) {\n return fallback;\n }\n let parent: ioBroker.Object | null | undefined;\n try {\n parent = await this.getForeignObjectAsync(parentId);\n } catch {\n return fallback;\n }\n if (!parent?.common?.name) {\n return fallback;\n }\n let name = this.objectName(parent, parentId, lang);\n if (parent.type === 'channel' || parent.type === 'device' || parent.type === 'folder') {\n arr.pop();\n const grandId = arr.join('.');\n if (grandId) {\n try {\n const grand = await this.getForeignObjectAsync(grandId);\n if (grand?.type === 'device' && grand.common?.name) {\n name = this.objectName(grand, grandId, lang);\n }\n } catch {\n /* keep parent name */\n }\n }\n }\n return name || fallback;\n }\n\n /** Raw `common.smartName` of a state (string | translated map | null) for the multi-language editor. */\n private async rawSmartName(stateId: string): Promise<string | Record<string, string> | null> {\n try {\n const obj = await this.getForeignObjectAsync(stateId);\n const sn = (obj?.common as { smartName?: unknown } | undefined)?.smartName;\n if (typeof sn === 'string') {\n return sn;\n }\n if (sn && typeof sn === 'object') {\n // Drop non-language meta keys (smartType/byON) for the editor's language map.\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(sn as Record<string, unknown>)) {\n if (typeof v === 'string' && k !== 'smartType' && k !== 'byON') {\n out[k] = v;\n }\n }\n return out;\n }\n } catch {\n /* ignore */\n }\n return null;\n }\n\n /**\n * Set (or clear, when `name` is empty) the friendly device name by writing `common.smartName` on the\n * device's primary state. An existing object-form smartName keeps its extra fields (smartType, byON);\n * a string smartName is replaced. Clearing sets it to '' so the auto (parent) name takes over again.\n */\n private async setDeviceSmartName(\n stateId?: string,\n name?: string,\n language?: string,\n ): Promise<{ ok: boolean; error?: string }> {\n if (!stateId) {\n return { ok: false, error: 'no stateId' };\n }\n try {\n const obj = await this.getForeignObjectAsync(stateId);\n if (!obj) {\n return { ok: false, error: `object ${stateId} not found` };\n }\n const trimmed = (name || '').trim();\n const lang = language || this.language || 'en';\n const sn = (obj.common as { smartName?: unknown } | undefined)?.smartName;\n // Always store as a language map so multiple languages coexist; keep smartType/byON if present.\n const map: Record<string, unknown> = {};\n if (sn && typeof sn === 'object') {\n Object.assign(map, sn);\n } else if (typeof sn === 'string' && sn && lang !== 'en') {\n map.en = sn; // preserve a legacy string name under 'en'\n }\n if (trimmed) {\n map[lang] = trimmed;\n } else {\n delete map[lang];\n }\n const langKeys = Object.keys(map).filter(k => k !== 'smartType' && k !== 'byON');\n // If nothing meaningful remains, clear smartName so the auto (parent) name takes over.\n const smartName = langKeys.length ? (map as ioBroker.StateCommon['smartName']) : '';\n await this.extendForeignObjectAsync(stateId, { common: { smartName } as ioBroker.StateCommon });\n this.log.info(`Device name for ${stateId} [${lang}] set to \"${trimmed}\"`);\n return { ok: true };\n } catch (e) {\n return { ok: false, error: (e as Error).message };\n }\n }\n\n /** Build the configured TTS engine (throws when no voice key is available). */\n private async buildTtsEngine(): Promise<TtsEngine> {\n const cfg = this.config;\n const mainApiKey = (await resolveApiKey(this, cfg)) || '';\n const creds = await resolveVoiceCredentials(this, cfg, mainApiKey);\n return createTtsEngine(cfg.ttsProvider || 'openai', this.voiceContext(cfg, creds));\n }\n\n /** True if backend TTS can run (a voice key is configured) — drives the Chat play button. */\n private async isTtsAvailable(): Promise<boolean> {\n try {\n await this.buildTtsEngine();\n return true;\n } catch {\n return false;\n }\n }\n\n /** Synthesize `text` to a base64 WAV via the configured TTS engine (used by the Chat play button). */\n private async synthesizeToWav(\n text: string,\n language?: string,\n ): Promise<{ audio?: string; mime?: string; error?: string }> {\n if (!text.trim()) {\n return { error: 'empty text' };\n }\n try {\n const tts = await this.buildTtsEngine();\n const lang = language || this.config.voiceLanguage || this.language || '';\n const { pcm, sampleRate } = await tts.synthesize(text, lang);\n return { audio: this.pcmToWav(pcm, sampleRate).toString('base64'), mime: 'audio/wav' };\n } catch (e) {\n return { error: (e as Error).message };\n }\n }\n\n /** Wrap mono 16-bit signed-LE PCM in a minimal 44-byte WAV header for browser playback. */\n private pcmToWav(pcm: Buffer, sampleRate: number): Buffer {\n const numChannels = 1;\n const bitsPerSample = 16;\n const byteRate = (sampleRate * numChannels * bitsPerSample) / 8;\n const blockAlign = (numChannels * bitsPerSample) / 8;\n const header = Buffer.alloc(44);\n header.write('RIFF', 0);\n header.writeUInt32LE(36 + pcm.length, 4);\n header.write('WAVE', 8);\n header.write('fmt ', 12);\n header.writeUInt32LE(16, 16);\n header.writeUInt16LE(1, 20); // PCM\n header.writeUInt16LE(numChannels, 22);\n header.writeUInt32LE(sampleRate, 24);\n header.writeUInt32LE(byteRate, 28);\n header.writeUInt16LE(blockAlign, 32);\n header.writeUInt16LE(bitsPerSample, 34);\n header.write('data', 36);\n header.writeUInt32LE(pcm.length, 40);\n return Buffer.concat([header, pcm]);\n }\n\n /** Load the available models for a provider (used by the settings model dropdown / selectSendTo). */\n private async getModels(msg: {\n provider?: AdapterConfig['provider'];\n apiKey?: string;\n credentialType?: 'manual' | 'manager';\n credentialId?: string;\n baseUrl?: string;\n }): Promise<string[]> {\n const cfg = this.config;\n const provider = msg.provider || cfg.provider || 'openai';\n const apiKey = await resolveApiKey(this, cfg, {\n credentialType: msg.credentialType,\n apiKey: msg.apiKey,\n credentialId: msg.credentialId,\n });\n if (!apiKey) {\n return [];\n }\n try {\n const agent = new LlmAgent({\n provider,\n apiKey,\n model: '',\n baseUrl: resolveProvider(provider, msg.baseUrl ?? cfg.baseUrl).baseUrl,\n maxTokens: 16,\n tools: [],\n log: this.log,\n });\n return await agent.listModels();\n } catch (e) {\n this.log.warn(`getModels failed: ${(e as Error).message}`);\n return [];\n }\n }\n\n /** Validate a provider + key from the settings dialog without persisting anything. */\n private async testApiConnection(msg: {\n provider?: AdapterConfig['provider'];\n apiKey?: string;\n credentialType?: 'manual' | 'manager';\n credentialId?: string;\n model?: string;\n baseUrl?: string;\n }): Promise<{ result?: string; error?: string }> {\n const cfg = this.config;\n const provider = msg.provider || cfg.provider || 'openai';\n const apiKey = await resolveApiKey(this, cfg, {\n credentialType: msg.credentialType,\n apiKey: msg.apiKey,\n credentialId: msg.credentialId,\n });\n if (!apiKey) {\n return { error: 'No API key / credential available.' };\n }\n const prov = resolveProvider(provider, msg.baseUrl || cfg.baseUrl);\n const agent = new LlmAgent({\n provider,\n apiKey,\n model: msg.model || cfg.model || prov.defaultModel,\n baseUrl: prov.baseUrl,\n maxTokens: 16,\n tools: [],\n log: this.log,\n });\n const res = await agent.testConnection();\n return res.ok ? { result: 'Connection OK' } : { error: res.error || 'unknown error' };\n }\n\n private async onUnload(callback: () => void): Promise<void> {\n try {\n this.stopRinging();\n } catch {\n // ignore\n }\n try {\n this.timers?.dispose();\n } catch {\n // ignore\n }\n try {\n this.alarms?.dispose();\n } catch {\n // ignore\n }\n try {\n await this.voice?.stop();\n } catch {\n // ignore\n }\n try {\n await this.wyoming?.stop();\n } catch {\n // ignore\n }\n try {\n await this.localLlm?.dispose();\n } catch {\n // ignore\n }\n try {\n await this.mcp?.close();\n } catch {\n // ignore\n } finally {\n callback();\n }\n }\n}\n\nif (require.main !== module) {\n // compact mode: export the factory\n module.exports = (options: Partial<AdapterOptions> | undefined) => new Assistant(options);\n} else {\n // started directly\n (() => new Assistant())();\n}\n"]}