iobroker.assistant 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/admin/custom/.vite/manifest.json +91 -87
- package/admin/custom/assets/Components-C6qcpaRC.js +1 -0
- package/admin/custom/assets/{_virtual_mf-localSharedImportMap___mfe_internal__ConfigCustomAssistant__mf_owner__1-DcAGnE2z.js → _virtual_mf-localSharedImportMap___mfe_internal__ConfigCustomAssistant__mf_owner__1-A4gakomR.js} +1 -1
- package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__198531368674860__loadShare___mf_0_emotion_mf_1_react__loadShare__.js-CzBMxGFr.js → _virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__201375093093590__loadShare___mf_0_emotion_mf_1_react__loadShare__.js-BkH7fzDw.js} +1 -1
- package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__198531368674860__loadShare___mf_0_emotion_mf_1_styled__loadShare__.js-1XsLCK2M.js → _virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__201375093093590__loadShare___mf_0_emotion_mf_1_styled__loadShare__.js-CwqmfMvn.js} +1 -1
- package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__198531368674860__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-CMv8bcyA.js → _virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__201375093093590__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-BMuLYe6f.js} +80 -97
- package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__198531368674860__loadShare__shared-3mzaJWDF.js → _virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__201375093093590__loadShare__shared-BxjZmnpc.js} +2 -2
- package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__201375093093590__prebuild___mf_0_iobroker_mf_1_json_mf_2_config__prebuild__-TM4l0OYm.js +122 -0
- package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__198531368674860__prebuild__react_mf_1_jsx_mf_2_runtime__prebuild__-B_v57Qfr.js → _virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__201375093093590__prebuild__react_mf_1_jsx_mf_2_runtime__prebuild__-M61rjtmp.js} +1 -1
- package/admin/custom/assets/{dist-DiU1y0R9.js → dist-B3E7IYuQ.js} +1 -1
- package/admin/custom/assets/helpers-DE61bb74.js +1 -0
- package/admin/custom/assets/{hostInit-MshDicd1.js → hostInit-4roC4hEj.js} +1 -1
- package/admin/custom/assets/{lib-DjwHKtRi.js → lib-CchzgTUs.js} +1 -1
- package/admin/custom/assets/{mf-entry-bootstrap-0-7c1ddf47.js → mf-entry-bootstrap-0-4806bbe4.js} +2 -2
- package/admin/custom/assets/{pendingShares-CaJDCKLB.js → pendingShares-DLlv8yFY.js} +2 -2
- package/admin/custom/assets/prod-ChPGnyiA.js +15 -0
- package/admin/custom/assets/rolldown-runtime-COiEfhsA.js +1 -0
- package/admin/custom/assets/utils-Bi7ATSfV.js +4 -0
- package/admin/custom/customComponents.js +2 -2
- package/admin/custom/i18n/de.json +25 -0
- package/admin/custom/i18n/en.json +25 -0
- package/admin/custom/i18n/es.json +25 -0
- package/admin/custom/i18n/fr.json +25 -0
- package/admin/custom/i18n/it.json +25 -0
- package/admin/custom/i18n/nl.json +25 -0
- package/admin/custom/i18n/pl.json +25 -0
- package/admin/custom/i18n/pt.json +25 -0
- package/admin/custom/i18n/ru.json +25 -0
- package/admin/custom/i18n/uk.json +25 -0
- package/admin/custom/i18n/zh-cn.json +25 -0
- package/admin/custom/index.html +2 -2
- package/admin/custom/mf-manifest.json +1 -1
- package/admin/custom/mf-stats.json +1 -1
- package/admin/i18n/de.json +3 -1
- package/admin/i18n/en.json +3 -1
- package/admin/i18n/es.json +3 -1
- package/admin/i18n/fr.json +3 -1
- package/admin/i18n/it.json +3 -1
- package/admin/i18n/nl.json +3 -1
- package/admin/i18n/pl.json +3 -1
- package/admin/i18n/pt.json +3 -1
- package/admin/i18n/ru.json +3 -1
- package/admin/i18n/uk.json +3 -1
- package/admin/i18n/zh-cn.json +3 -1
- package/admin/jsonConfig.json +13 -0
- package/build/lib/journal.js +273 -0
- package/build/lib/journal.js.map +1 -0
- package/build/lib/voice/esphome.js +9 -1
- package/build/lib/voice/esphome.js.map +1 -1
- package/build/lib/voice/voiceServer.js +3 -1
- package/build/lib/voice/voiceServer.js.map +1 -1
- package/build/lib/voice/wyoming.js +3 -1
- package/build/lib/voice/wyoming.js.map +1 -1
- package/build/main.js +146 -12
- package/build/main.js.map +1 -1
- package/io-package.json +36 -1
- package/package.json +7 -7
- package/admin/custom/assets/Components-7BDDNrGP.js +0 -1
- package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__198531368674860__prebuild___mf_0_iobroker_mf_1_json_mf_2_config__prebuild__-DS8oaQQt.js +0 -122
- package/admin/custom/assets/helpers-Dot7vgQQ.js +0 -1
- package/admin/custom/assets/rolldown-runtime-Dd_uD5pT.js +0 -1
- package/admin/custom/assets/utils-towTPKqG.js +0 -4
package/build/main.js.map
CHANGED
|
@@ -1 +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, effectiveApiKey, 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 {\n WEATHER_ADAPTERS,\n buildWeatherReport,\n buildWeatherPrompt,\n trimReport,\n type WeatherReport,\n type StateValues,\n} 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 { PendingQuestions, ANY_SOURCE, ASK_TIMEOUT_MS } from './lib/ask';\nimport { PresenceTracker, buildPresencePrompt, parsePresenceRows, type PresenceInfo } from './lib/presence';\nimport { describeTargets, findTarget, isBroadcast, parseTargetRows, type TargetGroup } from './lib/targets';\nimport { matchRoutine, parseRoutineRows, type Routine } from './lib/routines';\nimport {\n bypassesDnd,\n cleanupNotificationText,\n flattenNotification,\n parseSeverity,\n toneFor,\n type Severity,\n} from './lib/notifications';\nimport {\n TriggerEngine,\n effectiveActions,\n parseTriggerRows,\n type TriggerAction,\n type TriggerDef,\n type TriggerResponseRule,\n type TriggerStatus,\n} from './lib/triggers';\nimport { VoiceServer } from './lib/voice/voiceServer';\nimport { WyomingServer } from './lib/voice/wyoming';\nimport { EsphomeSatellites, type TimerEvent, type WakeWordConfig } from './lib/voice/esphome';\nimport {\n MEDIA_COMMANDS,\n type EsphomeEntity,\n type MediaPlayerValue,\n type UpdateInfo,\n} from './lib/voice/esphomeEntities';\nimport { MediaServer } from './lib/voice/mediaServer';\nimport { confirmationTone } from './lib/voice/tone';\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/**\n * How long a rendered weather context line stays valid. Weather adapters refresh every few minutes at best,\n * so re-reading their whole state tree on every single request would be pure overhead.\n */\nconst WEATHER_CTX_TTL = 5 * 60 * 1000;\n\n/**\n * The replies the assistant speaks verbatim, whatever the question was. They are pre-synthesised into\n * the TTS cache at startup; everything else is cached on first use.\n */\n/** How long to wait for a device to confirm a write, and how often to look. */\nconst ACK_TIMEOUT_MS = 2000;\nconst ACK_POLL_MS = 150;\n\n/**\n * Did the device end up with the value we asked for? Compared loosely: a dimmer told `30` may report\n * `30.0`, a switch told `true` may report `1`, and a lamp told 100 % may settle at 99 % — insisting on\n * strict equality would report a failure for a command that plainly worked.\n */\nfunction valuesMatch(actual: unknown, expected: unknown): boolean {\n if (actual === expected) {\n return true;\n }\n if (typeof expected === 'boolean' || typeof actual === 'boolean') {\n return Boolean(actual) === Boolean(expected);\n }\n const a = Number(actual);\n const b = Number(expected);\n if (Number.isFinite(a) && Number.isFinite(b)) {\n return Math.abs(a - b) <= Math.max(1, Math.abs(b) * 0.02);\n }\n return String(actual).trim().toLowerCase() === String(expected).trim().toLowerCase();\n}\n\n/**\n * ioBroker role for a measurement, derived from its unit — a `value.temperature` shows up with the right\n * icon and in the right place in vis, where a bare `value` is just a number.\n */\nfunction sensorRole(entity: { unit?: string }): string {\n const unit = (entity.unit || '').trim().toLowerCase();\n if (unit === '°c' || unit === '°f' || unit === 'k') {\n return 'value.temperature';\n }\n if (unit === '%') {\n return 'value.humidity'; // the only percentage a voice box reports is its humidity\n }\n if (unit === 'lx' || unit === 'lux') {\n return 'value.brightness';\n }\n if (unit === 'hpa' || unit === 'mbar' || unit === 'pa') {\n return 'value.pressure';\n }\n if (unit === 'ppm' || unit === 'ppb') {\n return 'value.co2';\n }\n if (unit === 'db' || unit === 'dba') {\n return 'value.volume';\n }\n return 'value';\n}\n\n/** Heading for a category answer, so \"18 °C, 21 °C\" says what it is about. */\nconst CATEGORY_LABELS: Record<string, { de: string; en: string; ru: string }> = {\n temperature: { de: 'Temperatur', en: 'Temperature', ru: 'Температура' },\n humidity: { de: 'Luftfeuchtigkeit', en: 'Humidity', ru: 'Влажность' },\n illuminance: { de: 'Helligkeit', en: 'Brightness', ru: 'Освещённость' },\n pressure: { de: 'Luftdruck', en: 'Pressure', ru: 'Давление' },\n airQuality: { de: 'Luftqualität', en: 'Air quality', ru: 'Качество воздуха' },\n};\n\n/**\n * Put a word to an air-quality number, because the number alone means nothing when spoken. Only for\n * the IAQ scale (0–500, unitless or labelled IAQ) — a CO₂ value in ppm is a different scale and is\n * better left unlabelled than labelled wrongly. Thresholds from the BME680/BSEC IAQ classification,\n * as used by the Python original.\n */\nfunction iaqLabel(value: unknown, unit: string, lang: string): string {\n const iaq = Number(value);\n const u = unit.trim().toLowerCase();\n if (!Number.isFinite(iaq) || (u !== '' && u !== 'iaq')) {\n return '';\n }\n const scale: [number, string, string, string][] = [\n [50, 'sehr gut', 'excellent', 'отлично'],\n [100, 'gut', 'good', 'хорошо'],\n [150, 'mäßig', 'moderate', 'умеренно'],\n [200, 'schlecht', 'poor', 'плохо'],\n [300, 'sehr schlecht', 'very poor', 'очень плохо'],\n [Number.POSITIVE_INFINITY, 'extrem schlecht', 'extremely poor', 'крайне плохо'],\n ];\n const row = scale.find(([limit]) => iaq <= limit);\n if (!row) {\n return '';\n }\n return lang === 'ru' ? row[3] : lang === 'de' ? row[1] : row[2];\n}\n\n/** NLU actions that only switch something; their success is what the confirmation tone replaces. */\nconst CONTROL_ACTIONS = new Set(['on', 'off', 'level', 'color']);\n\nconst FIXED_REPLIES: Record<'de' | 'en' | 'ru', string[]> = {\n de: ['Ok.', 'Erledigt.'],\n en: ['Okay.', 'Done.'],\n ru: ['Хорошо.', 'Готово.'],\n};\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 /** Cloud LLM; `null` with provider \"none\" (local tiers only) or before `onReady` finished. */\n private agent: LlmAgent | null = null;\n /** Set once `onReady` initialised the pipeline — with or without a cloud {@link agent}. */\n private ready = false;\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 /** ESPHome voice satellites we dial out to (only when esphomeEnabled); null otherwise. */\n private esphome: EsphomeSatellites | null = null;\n /** Serves spoken replies to ESPHome satellites over HTTP; null unless those are enabled. */\n private media: MediaServer | null = null;\n /** Short-term per-source conversation memory (in-memory, TTL) for follow-up questions. */\n private readonly context = new ConversationStore();\n /** Questions the assistant asked and is waiting for an answer to (`askUser`), keyed by source. */\n private readonly pending = new PendingQuestions();\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 /** Satellite ids that already have the wake-word states — only ESPHome devices report any. */\n private readonly satWakeWordStatesEnsured = new Set<string>();\n /** Timers already mirrored onto the ESPHome satellites, so we can tell a cancel from an update. */\n private mirroredTimers = new Map<string, TimerInfo>();\n /** Per satellite: resolves once its control objects exist, so state writes can wait for them. */\n private readonly satControlsReady = new Map<string, Promise<void>>();\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 /** Proactive triggers (roadmap A2); mirrored into `triggers.*` states. Null until onReady. */\n private triggers: TriggerEngine | null = null;\n /** Per-trigger `triggers.items.<id>` channels currently rendered. */\n private readonly triggerObjIds = new Set<string>();\n /** Foreign states the loaded triggers watch (exactly what we subscribed to). */\n private readonly triggerStateIds = new Set<string>();\n /** Master switch (`triggers.enabled`): false suppresses every trigger's effect. */\n private triggersEnabled = true;\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 /** Phrase-triggered macros from the configuration (\"Gute Nacht\" → five actions). */\n private routines: Routine[] = [];\n /** Named announcement targets (roadmap B2): groups of rooms and people, from the configuration. */\n private announceTargets: TargetGroup[] = [];\n /** Who is at home (roadmap B1); mirrored into `presence.*`. Null until onReady. */\n private presence: PresenceTracker | null = null;\n /** Satellites currently set to Do-Not-Disturb, by state id (mirrors `satellites.<id>.dnd`). */\n private readonly dndById = new Map<string, boolean>();\n /** Global Do-Not-Disturb (`dnd`): suppresses every announcement except priority/alert ones. */\n private globalDnd = false;\n /** Cached weather context line (see `buildWeatherContext`); `key` = source + language. */\n private weatherCtx: { key: string; ts: number; text: string } | null = null;\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 // Provider \"none\": no cloud LLM at all — only the local tiers (routines, rule-based NLU, timers,\n // alarms, the local model) answer. The ioBroker tools are still built: the NLU switches through them.\n const provider = cfg.provider || 'openai';\n const localOnly = provider === 'none';\n const apiKey = localOnly ? '' : effectiveApiKey(cfg.provider, await resolveApiKey(this, cfg));\n\n if (!localOnly && !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 if (cfg.voiceEnabled) {\n // Only useful with satellites: without voice there is nothing to speak on.\n tools.push(this.buildAnnounceTool());\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 if (provider !== 'none') {\n const prov = resolveProvider(provider, cfg.baseUrl);\n this.agent = new LlmAgent({\n provider,\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 }\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.ready = 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 // Spoken system notifications + Do-Not-Disturb (per satellite: see ensureSatelliteObjects).\n this.subscribeStates('notify.text');\n this.subscribeStates('notify.alert');\n this.subscribeStates('dnd');\n this.globalDnd = (await this.getStateAsync('dnd'))?.val === true;\n if (this.globalDnd) {\n this.log.info('Do-Not-Disturb is on — only alerts will be announced.');\n }\n await this.setupTimers();\n await this.setupAlarms();\n if (cfg.useLongTermMemory !== false) {\n await this.setupMemory();\n }\n this.routines = parseRoutineRows(cfg.routines, { warn: message => this.log.warn(message) });\n if (this.routines.length) {\n this.log.info(`Routines: ${this.routines.map(r => r.name).join(', ')}.`);\n }\n this.announceTargets = parseTargetRows(cfg.announceTargets);\n if (this.announceTargets.length) {\n this.log.info(\n `Announcement targets: ${this.announceTargets.map(t => `${t.name} (${t.kind})`).join(', ')}.`,\n );\n }\n await this.setupPresence();\n await this.setupTriggers();\n this.log.info(\n this.agent\n ? `Assistant ready (provider=${cfg.provider}, model=${this.agent.model || 'auto'}).`\n : 'Assistant ready without an LLM provider — answering locally only.',\n );\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 if (cfg.esphomeEnabled) {\n await this.startEsphome(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 this.declarePort('tcpPort', cfg.wyomingPort || 10700, cfg.bind);\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 /**\n * Connect to the configured ESPHome voice satellites (ThirdReality V&M Assistant, HA Voice PE,\n * linux-voice-assistant). The adapter is the client here — the devices listen on TCP 6053 — and the\n * spoken reply is handed over as a URL, so the little media server comes up together with them.\n */\n private async startEsphome(mainApiKey: string): Promise<void> {\n const cfg = this.config;\n const devices = (cfg.esphomeDevices || []).filter(d => d?.ip?.trim());\n if (!devices.length) {\n this.log.warn('ESPHome satellites are enabled, but no device is configured.');\n return;\n }\n\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(`ESPHome satellites not started — ${(e as Error).message}. Check the Voice tab settings.`);\n return;\n }\n\n try {\n const media = new MediaServer({\n port: cfg.esphomeMediaPort || 8099,\n bindAddress: cfg.bind || '0.0.0.0',\n log: this.log,\n });\n await media.start();\n this.media = media;\n this.declarePort('tcpPort', media.port, cfg.bind);\n } catch (e) {\n this.log.error(`ESPHome satellites not started — media server failed: ${(e as Error).message}`);\n this.media = null;\n return;\n }\n\n this.esphome = new EsphomeSatellites({\n devices,\n language,\n stt,\n tts,\n answer: (question, origin) => this.answerVoice(question, origin.device),\n getHints: () => this.buildSttHints(),\n media: this.media,\n mediaHost: (cfg.esphomeMediaHost || '').trim(),\n silenceMs: cfg.esphomeSilenceMs || 0,\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 onWakeWords: (device, room, config) => {\n this.updateSatelliteWakeWords(device, room, config).catch(e =>\n this.log.debug(`satellite wake word update failed: ${(e as Error).message}`),\n );\n },\n onEntities: (device, room, entities) => {\n this.createSatelliteControls(device, room, entities).catch(e =>\n this.log.debug(`satellite control objects failed: ${(e as Error).message}`),\n );\n },\n onEntityState: (device, room, entity) => {\n this.updateSatelliteControl(device, room, entity).catch(e =>\n this.log.debug(`satellite control update failed: ${(e as Error).message}`),\n );\n },\n expectsFollowUp: answer => this.expectsFollowUp(answer),\n });\n await this.esphome.start();\n this.log.info(\n `ESPHome satellites: ${devices.length} device(s), STT=${cfg.sttProvider || 'openai'}, TTS=${cfg.ttsProvider || 'openai'}.`,\n );\n if (!this.voice && !this.wyoming) {\n this.warmupEngines(stt, tts, language); // nobody warmed the engines up yet\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 sttFallback: cfg.sttFallback || '',\n ttsFallback: cfg.ttsFallback || '',\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.declarePort('udpPort', cfg.port || 7775, cfg.bind, 4); // dgram 'udp4' socket\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)\n .then(() => this.warmTtsCache(tts, lang))\n .catch(e => this.log.warn(`TTS warm-up failed: ${(e as Error).message}`));\n } else {\n void this.warmTtsCache(tts, lang);\n }\n }\n\n /**\n * Pre-synthesise the handful of replies the assistant says verbatim, so the first one of the day is\n * not a cloud round-trip. Everything else lands in the cache on first use anyway — this only covers\n * the fixed strings, which are the ones that repeat forever.\n */\n private async warmTtsCache(tts: TtsEngine, lang: string): Promise<void> {\n const phrases = FIXED_REPLIES[lang === 'ru' ? 'ru' : lang === 'de' ? 'de' : 'en'];\n await tts.warm?.(phrases, lang).catch(e => this.log.debug(`TTS cache warm-up: ${(e as Error).message}`));\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 = await this.ensureSatelliteObjects(device, room);\n const base = `satellites.${id}`;\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 * Create the object tree for one satellite and return its (sanitised) state id, without touching\n * any value. Callers that only need somewhere to hang a child object use this rather than\n * {@link updateSatelliteState} — going through that would write `status`, and a wake-word or\n * settings update arriving mid-announcement would knock the satellite back to `idle`.\n */\n private async ensureSatelliteObjects(device: string, room: string): Promise<string> {\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 await this.setObjectNotExistsAsync(`${base}.dnd`, {\n type: 'state',\n common: {\n name: 'Do-Not-Disturb: suppress announcements on this satellite (alerts still play)',\n type: 'boolean',\n role: 'switch.mode.silent',\n read: true,\n write: true,\n def: false,\n },\n native: {},\n });\n this.subscribeStates(`${base}.tts`);\n this.subscribeStates(`${base}.dnd`);\n // A satellite that was silenced before the restart stays silenced.\n const dnd = await this.getStateAsync(`${base}.dnd`);\n this.dndById.set(id, dnd?.val === true);\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 return id;\n }\n\n /**\n * Publish a satellite's wake-word configuration and let it be changed from ioBroker.\n *\n * Only ESPHome satellites have this: the wake word runs on the device, and the ESPHome API lets the\n * controller pick which of the built-in models listen. `wakeWords` is writable and takes a\n * comma-separated list of ids; the device stores the choice itself, so it survives a restart of the\n * adapter and is read back from the device rather than mirrored optimistically.\n */\n private async updateSatelliteWakeWords(device: string, room: string, config: WakeWordConfig): Promise<void> {\n const id = await this.ensureSatelliteObjects(device, room);\n const base = `satellites.${id}`;\n\n if (!this.satWakeWordStatesEnsured.has(id)) {\n await this.setObjectNotExistsAsync(`${base}.wakeWords`, {\n type: 'state',\n common: {\n name: 'Active wake words (comma-separated ids)',\n type: 'string',\n role: 'text',\n read: true,\n write: true,\n def: '',\n },\n native: {},\n });\n await this.setObjectNotExistsAsync(`${base}.availableWakeWords`, {\n type: 'state',\n common: {\n name: 'Wake words this device offers',\n type: 'string',\n role: 'json',\n read: true,\n write: false,\n def: '[]',\n },\n native: {},\n });\n this.subscribeStates(`${base}.wakeWords`);\n this.satWakeWordStatesEnsured.add(id);\n }\n await this.setStateAsync(`${base}.wakeWords`, { val: config.active.join(','), ack: true });\n await this.setStateAsync(`${base}.availableWakeWords`, {\n val: JSON.stringify({ max: config.max, words: config.available }),\n ack: true,\n });\n }\n\n /**\n * Mirror everything an ESPHome satellite exposes besides the voice pipeline into\n * `satellites.<id>.controls.*` — microphone gain and volume, noise suppression, wake-word and\n * stop-word sensitivities, the mute and thinking-sound switches, its media player and its firmware\n * update entity. Which of these exist is up to the device, so the objects are built from what it\n * announced rather than from a hard-coded list.\n *\n * The compound entities get a small folder instead of a single state, because one value cannot\n * carry them: a media player has a state, a volume and a mute flag, and a firmware entity has two\n * versions plus progress.\n */\n private createSatelliteControls(device: string, room: string, entities: EsphomeEntity[]): Promise<void> {\n if (!entities.length) {\n return Promise.resolve();\n }\n // Publish the promise *before* awaiting anything: the device starts pushing entity states while\n // these objects are still being created, and those writes have to wait for it.\n const satId = this.satelliteStateId(device, room);\n const task = this.buildSatelliteControls(satId, device, room, entities);\n this.satControlsReady.set(satId, task);\n return task;\n }\n\n /** The actual object creation behind {@link createSatelliteControls}. */\n private async buildSatelliteControls(\n satId: string,\n device: string,\n room: string,\n entities: EsphomeEntity[],\n ): Promise<void> {\n await this.ensureSatelliteObjects(device, room); // make sure the parent objects exist\n const base = `satellites.${satId}.controls`;\n await this.setObjectNotExistsAsync(base, {\n type: 'channel',\n common: { name: 'Device settings' },\n native: {},\n });\n\n for (const entity of entities) {\n const id = `${base}.${entity.objectId}`;\n const name = entity.name || entity.objectId;\n if (entity.kind === 'mediaPlayer') {\n await this.setObjectNotExistsAsync(id, { type: 'channel', common: { name }, native: {} });\n await this.ensureState(`${id}.state`, 'Playback state', 'string', 'media.state', false);\n await this.ensureState(`${id}.volume`, 'Volume (0…1)', 'number', 'level.volume', true);\n await this.ensureState(\n `${id}.command`,\n `Command (${Object.keys(MEDIA_COMMANDS).join(', ')})`,\n 'string',\n 'text',\n true,\n );\n await this.ensureState(`${id}.muted`, 'Muted', 'boolean', 'media.mute', false);\n this.subscribeStates(`${id}.volume`);\n this.subscribeStates(`${id}.command`);\n } else if (entity.kind === 'update') {\n await this.setObjectNotExistsAsync(id, { type: 'channel', common: { name }, native: {} });\n await this.ensureState(`${id}.currentVersion`, 'Installed version', 'string', 'text', false);\n await this.ensureState(`${id}.latestVersion`, 'Available version', 'string', 'text', false);\n await this.ensureState(`${id}.inProgress`, 'Update running', 'boolean', 'indicator', false);\n await this.ensureState(`${id}.progress`, 'Update progress', 'number', 'value', false);\n await this.ensureState(`${id}.install`, 'Install the update', 'boolean', 'button', true);\n this.subscribeStates(`${id}.install`);\n } else if (entity.kind === 'event') {\n await this.setObjectNotExistsAsync(id, {\n type: 'state',\n common: {\n name: `${name} (last event)`,\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n def: '',\n ...(entity.eventTypes?.length\n ? { states: Object.fromEntries(entity.eventTypes.map(t => [t, t])) }\n : {}),\n },\n native: {},\n });\n } else if (entity.kind === 'sensor' || entity.kind === 'binarySensor' || entity.kind === 'textSensor') {\n // What the box measures about its room (temperature, presence, a status text). Read-only,\n // so there is nothing to subscribe to — the device pushes the values.\n const common: ioBroker.StateCommon =\n entity.kind === 'sensor'\n ? {\n name,\n type: 'number',\n role: sensorRole(entity),\n read: true,\n write: false,\n unit: entity.unit || undefined,\n }\n : entity.kind === 'binarySensor'\n ? { name, type: 'boolean', role: 'indicator', read: true, write: false, def: false }\n : { name, type: 'string', role: 'text', read: true, write: false, def: '' };\n await this.setObjectNotExistsAsync(id, { type: 'state', common, native: {} });\n } else {\n const common: ioBroker.StateCommon =\n entity.kind === 'switch'\n ? { name, type: 'boolean', role: 'switch', read: true, write: true, def: false }\n : entity.kind === 'select'\n ? {\n name,\n type: 'string',\n role: 'text',\n read: true,\n write: true,\n def: '',\n states: Object.fromEntries((entity.options || []).map(o => [o, o])),\n }\n : {\n name,\n type: 'number',\n role: 'level',\n read: true,\n write: true,\n min: entity.min,\n max: entity.max,\n step: entity.step,\n unit: entity.unit || undefined,\n };\n await this.setObjectNotExistsAsync(id, { type: 'state', common, native: {} });\n this.subscribeStates(id);\n }\n }\n this.satDeviceById.set(satId, device);\n // Now that the objects exist, publish the values the device already reported. Anything that\n // arrived while we were still creating objects was skipped, so this is what fills those in.\n for (const entity of entities) {\n if (entity.value !== undefined) {\n await this.writeSatelliteControl(satId, entity);\n }\n }\n this.log.debug(`Satellite ${device}: ${entities.length} control object(s) under ${base}`);\n }\n\n /** Small helper so the control objects above stay readable. */\n private async ensureState(\n id: string,\n name: string,\n type: ioBroker.CommonType,\n role: string,\n write: boolean,\n ): Promise<void> {\n await this.setObjectNotExistsAsync(id, {\n type: 'state',\n common: { name, type, role, read: true, write },\n native: {},\n });\n }\n\n /**\n * A device pushed a new value for one of its entities.\n *\n * The device starts reporting states while {@link buildSatelliteControls} is still creating the\n * objects, so this waits for that to finish. Before the entities have even been announced there is\n * nothing to wait on and nothing to write into — the value is kept in the registry and published by\n * the initial sync at the end of the build.\n */\n private async updateSatelliteControl(device: string, room: string, entity: EsphomeEntity): Promise<void> {\n const satId = this.satelliteStateId(device, room);\n const ready = this.satControlsReady.get(satId);\n if (!ready) {\n return;\n }\n await ready;\n await this.writeSatelliteControl(satId, entity);\n }\n\n /** Write one entity's current value into its state(s). Always acked — this is the device talking. */\n private async writeSatelliteControl(satId: string, entity: EsphomeEntity): Promise<void> {\n const base = `satellites.${satId}.controls.${entity.objectId}`;\n if (entity.kind === 'mediaPlayer') {\n const v = entity.value as MediaPlayerValue;\n await this.setStateAsync(`${base}.state`, { val: v.state, ack: true });\n await this.setStateAsync(`${base}.volume`, { val: v.volume, ack: true });\n await this.setStateAsync(`${base}.muted`, { val: v.muted, ack: true });\n } else if (entity.kind === 'update') {\n const v = entity.value as UpdateInfo;\n await this.setStateAsync(`${base}.currentVersion`, { val: v.currentVersion, ack: true });\n await this.setStateAsync(`${base}.latestVersion`, { val: v.latestVersion, ack: true });\n await this.setStateAsync(`${base}.inProgress`, { val: v.inProgress, ack: true });\n await this.setStateAsync(`${base}.progress`, { val: v.progress, ack: true });\n } else {\n await this.setStateAsync(base, { val: entity.value as ioBroker.StateValue, ack: true });\n }\n }\n\n /**\n * Apply a write to any `satellites.<id>.controls.*` state. Like the wake words, nothing is acked\n * here: the device reports the value it actually took and {@link updateSatelliteControl} writes\n * that, so a clamped or rejected write never leaves ioBroker showing a value the device ignored.\n */\n private setSatelliteControl(satId: string, path: string, value: ioBroker.StateValue): void {\n const device = this.satDeviceById.get(satId) || satId;\n if (!this.esphome) {\n this.log.warn(`Cannot write ${path} on ${device}: ESPHome satellites are not enabled.`);\n return;\n }\n // Compound entities address a leaf: `<objectId>.volume`, `<objectId>.install`, …\n const [objectId, leaf] = path.split('.');\n let payload: unknown = value;\n if (leaf === 'install') {\n if (!value) {\n return; // button released\n }\n payload = 'install';\n } else if (leaf === 'volume' || leaf === 'command') {\n payload = value;\n } else if (leaf) {\n return; // read-only leaf of a compound entity\n }\n if (!this.esphome.setEntity(device, objectId, payload)) {\n this.log.warn(`Writing ${objectId} on ${device} was rejected — see the warning above.`);\n }\n }\n\n /**\n * Apply a write to `satellites.<id>.wakeWords`. The state is *not* acked here: the device echoes its\n * new configuration back and {@link updateSatelliteWakeWords} writes the acked value, so what ioBroker\n * shows is always what the device actually does — including when it rejected or trimmed the list.\n */\n private async setSatelliteWakeWords(satId: string, value: string): Promise<void> {\n const device = this.satDeviceById.get(satId) || satId;\n const ids = value\n .split(/[,;]/)\n .map(s => s.trim())\n .filter(Boolean);\n if (!this.esphome) {\n this.log.warn(`Cannot set wake words on ${device}: ESPHome satellites are not enabled.`);\n return;\n }\n if (!this.esphome.setWakeWords(device, ids)) {\n this.log.warn(`Cannot set wake words: satellite ${device} is not connected.`);\n // Put the last known value back, so the state does not keep showing a change that never happened.\n const known = this.esphome.wakeWords(device);\n if (known) {\n await this.setStateAsync(`satellites.${satId}.wakeWords`, {\n val: known.active.join(','),\n ack: true,\n });\n }\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 * With `opts.listen` the satellite re-opens its microphone afterwards, for the answer to a question\n * (`askUser`); `opts.priority` plays even on a satellite set to Do-Not-Disturb (an alert does, see\n * {@link notify}). Returns how many channels the announcement reached — 0 means nobody heard it.\n */\n private async announceToSatellites(\n value: string,\n target: string | null,\n opts: { listen?: boolean; priority?: boolean; onlyWhenHome?: boolean } = {},\n ): Promise<number> {\n const listen = opts.listen === true;\n let v = value.trim();\n if (!v) {\n return 0;\n }\n // A name may stand for one satellite, a room, or a configured group/person — resolve it before\n // spending a TTS call on a target that does not exist.\n const targets = this.resolveTargets(target);\n if (targets && !targets.length) {\n this.log.warn(`Announcement not delivered — '${String(target)}' is no known satellite, room or group.`);\n return 0;\n }\n // Checked before the text is synthesised, so talking to an empty house costs neither an LLM nor a\n // TTS call.\n if (opts.onlyWhenHome && this.emptyHouse()) {\n this.log.debug('Announcement held back — nobody is at home.');\n return 0;\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 let priority = opts.priority === true;\n if (v.startsWith('!')) {\n priority = true;\n v = v.slice(1).trim();\n if (!v) {\n return 0;\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 0;\n }\n\n let delivered = 0;\n if (targets === null) {\n delivered = await this.deliverPcm(pcm, sampleRate, null, priority, listen);\n } else {\n // Synthesised once, handed to each member: a group of three speakers is one TTS call.\n for (const id of targets) {\n delivered += await this.deliverPcm(pcm, sampleRate, id, priority, listen);\n }\n }\n this.log.info(\n `Announce → ${targets ? targets.join(', ') : 'all satellites'} (${delivered} channel(s)${listen ? ', mic on' : ''}): ${isAudio ? v : `\"${v}\"`}`,\n );\n if (!delivered) {\n this.log.warn('Announcement not delivered — no satellites registered (native or UDP).');\n }\n return delivered;\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 * `listen` asks the satellite to re-open its microphone when the clip has played, so the answer to a\n * question is captured without a wake word. Each transport has its own way: ESPHome carries it in the\n * announce request (`start_conversation`), UDP gets a `listen` control message, and a native satellite\n * receives the flag in the announce message.\n */\n private async deliverPcm(\n pcm: Buffer,\n sampleRate: number,\n targetId: string | null,\n priority: boolean,\n listen = false,\n ): Promise<number> {\n let delivered = 0;\n if (this.silenced(targetId, priority)) {\n this.log.debug(`Announcement suppressed — Do-Not-Disturb (${targetId || 'all satellites'}).`);\n return 0;\n }\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 [satId, from] of nativeTargets) {\n if (this.silenced(satId, priority)) {\n continue;\n }\n this.sendTo(from, 'announce', {\n audio: pcm.toString('base64'),\n sampleRate,\n format: 'pcm',\n priority,\n listen,\n });\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 // Addressed per device rather than broadcast, so one silenced satellite in the house does not\n // silence the others — and so the count reflects who actually got it (announce() itself only\n // warns when nobody is registered, and askUser needs to know whether the question was heard).\n const allowed = this.voice\n .devices()\n .filter(d => (!device || d === device) && !this.isDeviceSilenced(d, priority));\n if (allowed.length) {\n try {\n await Promise.all(allowed.map(d => this.voice!.announce(d, pcm, sampleRate)));\n delivered += allowed.length;\n if (listen) {\n allowed.forEach(d => this.voice!.listen(d));\n }\n } catch (e) {\n this.log.debug(`UDP announce failed: ${(e as Error).message}`);\n }\n }\n }\n // ── ESPHome satellites: they fetch the clip from the media server by URL ──\n if (this.esphome && !(targetId && this.nativeSatFrom.has(targetId))) {\n const device = targetId ? this.satDeviceById.get(targetId) || targetId : null;\n const allowed = this.esphome\n .devices()\n .filter(d => (!device || d === device) && !this.isDeviceSilenced(d, priority));\n try {\n const counts = await Promise.all(allowed.map(d => this.esphome!.announce(d, pcm, sampleRate, listen)));\n delivered += counts.reduce((sum, n) => sum + n, 0);\n } catch (e) {\n this.log.debug(`ESPHome announce failed: ${(e as Error).message}`);\n }\n }\n return delivered;\n }\n\n /**\n * Do-Not-Disturb check by satellite state id (`null` = the broadcast itself). A priority announcement\n * — an `alert` notification or a text starting with `!` — is never suppressed; that is the whole point\n * of the flag, and a water leak has to be heard at night.\n */\n private silenced(satId: string | null, priority: boolean): boolean {\n if (priority) {\n return false;\n }\n if (this.globalDnd) {\n return true;\n }\n return satId ? this.dndById.get(satId) === true : false;\n }\n\n /** Same check, for a transport that knows its satellites by device name rather than by state id. */\n private isDeviceSilenced(device: string, priority: boolean): boolean {\n if (priority) {\n return false;\n }\n for (const [satId, dev] of this.satDeviceById) {\n if (dev === device) {\n return this.silenced(satId, priority);\n }\n }\n return this.globalDnd;\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 // Priority like the jingle above: a timer the user set themselves is not an unsolicited\n // announcement, and hearing the gong followed by silence would be worse than either.\n await this.announceToSatellites(message, target, { priority: true }).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 // Priority, for the same reason as in startRing: the jingle already bypasses Do-Not-Disturb.\n await this.announceToSatellites(text, targetId, { priority: true });\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) {\n return;\n }\n // Trigger-watched states are routed first and regardless of `ack`: a device confirms its value with\n // ack:true, which the filter below drops — and those are exactly the changes a trigger reacts to.\n if (this.triggerStateIds.has(id)) {\n await this.triggers?.onStateChange(id, state.val);\n }\n // Presence states come from devices too (a phone ping, the residents adapter), so they are\n // read here for the same reason — and one state may well be watched by both.\n this.presence?.update(id, state.val ?? null);\n if (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 // Pick which wake words listen on an ESPHome satellite (comma-separated ids).\n const satWake = id.match(/\\.satellites\\.([^.]+)\\.wakeWords$/);\n if (satWake) {\n await this.setSatelliteWakeWords(satWake[1], String(state.val ?? ''));\n return;\n }\n\n // Device settings: mic gain/volume, noise suppression, sensitivities, media player, firmware.\n const satControl = id.match(/\\.satellites\\.([^.]+)\\.controls\\.(.+)$/);\n if (satControl) {\n this.setSatelliteControl(satControl[1], satControl[2], state.val ?? null);\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 // System notifications: `notify.text` (severity notify) and `notify.alert` (urgent, ignores DND).\n if (id.endsWith('.notify.text') || id.endsWith('.notify.alert')) {\n const alert = id.endsWith('.notify.alert');\n const text = String(state.val ?? '');\n await this.setStateAsync(alert ? 'notify.alert' : 'notify.text', { val: '', ack: true });\n await this.notify(text, alert ? 'alert' : 'notify');\n return;\n }\n\n // Do-Not-Disturb: globally and per satellite.\n if (id.endsWith('.dnd') && !id.includes('.satellites.')) {\n this.globalDnd = !!state.val;\n this.log.info(`Do-Not-Disturb ${this.globalDnd ? 'on' : 'off'} (all satellites).`);\n await this.setStateAsync('dnd', { val: this.globalDnd, ack: true });\n return;\n }\n const satDnd = id.match(/\\.satellites\\.([^.]+)\\.dnd$/);\n if (satDnd) {\n this.dndById.set(satDnd[1], !!state.val);\n this.log.info(`Do-Not-Disturb ${state.val ? 'on' : 'off'} for satellite '${satDnd[1]}'.`);\n await this.setStateAsync(`satellites.${satDnd[1]}.dnd`, { val: !!state.val, ack: true });\n return;\n }\n\n // Trigger controls: the master switch, the per-trigger enable switch and its test button.\n if (id.endsWith('.triggers.enabled')) {\n this.triggersEnabled = !!state.val;\n this.log.info(`Triggers ${this.triggersEnabled ? 'enabled' : 'disabled'} via triggers.enabled.`);\n await this.setStateAsync('triggers.enabled', { val: this.triggersEnabled, ack: true });\n return;\n }\n const triggerEnable = id.match(/\\.triggers\\.items\\.([^.]+)\\.enabled$/);\n if (triggerEnable) {\n if (this.triggers?.setEnabled(triggerEnable[1], !!state.val)) {\n this.log.info(`Trigger ${triggerEnable[1]} ${state.val ? 'enabled' : 'disabled'}.`);\n }\n return;\n }\n const triggerFire = id.match(/\\.triggers\\.items\\.([^.]+)\\.fire$/);\n if (triggerFire) {\n // Ack the button back to false right away, so it can be pressed again while the trigger runs\n // (a trigger that asks a question keeps us here for up to a minute).\n await this.setStateAsync(`triggers.items.${triggerFire[1]}.fire`, { val: false, ack: true });\n if (state.val && !(await this.triggers?.fireNow(triggerFire[1]))) {\n this.log.warn(`Trigger ${triggerFire[1]} not found.`);\n }\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.ready) {\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 / settings: which wake words an ESPHome satellite offers and which are listening.\n // message = { device? } — omitted means every connected one.\n if (obj.command === 'getWakeWords') {\n const m = (obj.message || {}) as { device?: string };\n const devices = m.device ? [m.device] : this.esphome?.devices() || [];\n const payload = this.esphome\n ? { devices: devices.map(d => ({ device: d, ...(this.esphome?.wakeWords(d) || {}) })) }\n : { error: 'ESPHome satellites are not enabled' };\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, payload, obj.callback);\n }\n return;\n }\n\n // Scripts: choose the active wake words. message = { device, wakeWords: string[] | \"a,b\" }.\n if (obj.command === 'setWakeWords') {\n const m = (obj.message || {}) as { device?: string; wakeWords?: string[] | string };\n const ids = (Array.isArray(m.wakeWords) ? m.wakeWords : String(m.wakeWords ?? '').split(/[,;]/))\n .map(s => String(s).trim())\n .filter(Boolean);\n let payload: Record<string, unknown>;\n if (!this.esphome) {\n payload = { error: 'ESPHome satellites are not enabled' };\n } else if (!m.device) {\n payload = { error: 'device is required' };\n } else if (!this.esphome.setWakeWords(m.device, ids)) {\n payload = { error: `satellite ${m.device} is not connected` };\n } else {\n payload = { ok: true };\n }\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, payload, obj.callback);\n }\n return;\n }\n\n // Scripts: everything an ESPHome satellite exposes besides the voice pipeline.\n // message = { device? }; without a device, every connected one is listed.\n if (obj.command === 'getControls') {\n const m = (obj.message || {}) as { device?: string };\n const devices = m.device ? [m.device] : this.esphome?.devices() || [];\n const payload = this.esphome\n ? { devices: devices.map(d => ({ device: d, entities: this.esphome?.entities(d) || [] })) }\n : { error: 'ESPHome satellites are not enabled' };\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, payload, obj.callback);\n }\n return;\n }\n\n // Scripts: write one of them. message = { device, control: 'mic_volume', value: 2000 }.\n if (obj.command === 'setControl') {\n const m = (obj.message || {}) as { device?: string; control?: string; value?: unknown };\n let payload: Record<string, unknown>;\n if (!this.esphome) {\n payload = { error: 'ESPHome satellites are not enabled' };\n } else if (!m.device || !m.control) {\n payload = { error: 'device and control are required' };\n } else if (!this.esphome.setEntity(m.device, m.control, m.value)) {\n payload = { error: `${m.control} on ${m.device} rejected the value (see the log)` };\n } else {\n payload = { ok: true };\n }\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(\n obj.from,\n obj.command,\n { error: this.ready ? 'translating needs an LLM provider' : 'agent not ready' },\n obj.callback,\n );\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 // A notification routed here by the ioBroker notification-manager.\n if (obj.command === 'sendNotification') {\n const result = await this.handleSystemNotification(obj.message);\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, result, obj.callback);\n }\n return;\n }\n\n // Speak a system notification: sendTo('assistant.0', 'notify', { text, severity, target }).\n if (obj.command === 'notify') {\n const msg = (obj.message || {}) as {\n text?: string;\n severity?: string;\n target?: string;\n room?: string;\n onlyWhenHome?: boolean;\n };\n const text = String(msg.text ?? '');\n let result: { spoken?: number; error?: string };\n if (!text.trim()) {\n result = { error: 'no text provided' };\n } else {\n const where = (msg.target || msg.room || '').trim();\n const ids = this.resolveTargets(where);\n const target = where || null;\n result =\n ids && !ids.length\n ? { error: `unknown satellite, room or group '${where}'` }\n : {\n spoken: await this.notify(\n text,\n parseSeverity(msg.severity),\n target,\n msg.onlyWhenHome === true,\n ),\n };\n }\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, result, obj.callback);\n }\n return;\n }\n\n // Trigger management for scripts: list them, run one now, enable/disable one.\n if (obj.command === 'listTriggers') {\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, { triggers: this.triggers?.list() ?? [] }, obj.callback);\n }\n return;\n }\n if (obj.command === 'fireTrigger' || obj.command === 'setTriggerEnabled') {\n const msg = (obj.message || {}) as { id?: string; enabled?: boolean };\n const tid = String(msg.id ?? '').trim();\n let result: { ok: boolean; error?: string };\n if (!tid) {\n result = { ok: false, error: 'no trigger id provided' };\n } else if (obj.command === 'fireTrigger') {\n const ok = (await this.triggers?.fireNow(tid)) === true;\n result = ok ? { ok } : { ok, error: `unknown trigger '${tid}'` };\n } else {\n const ok = this.triggers?.setEnabled(tid, msg.enabled !== false) === true;\n result = ok ? { ok } : { ok, error: `unknown trigger '${tid}'` };\n }\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, result, obj.callback);\n }\n return;\n }\n\n // The other direction: ask the user something and hand the answer back to the caller.\n // sendTo('assistant.0', 'askUser', { question, room|target|source, timeoutMs }, cb)\n if (obj.command === 'askUser') {\n const result = await this.askUser(\n (obj.message || {}) as {\n question?: string;\n text?: string;\n target?: string;\n room?: string;\n source?: string | string[];\n timeoutMs?: number;\n },\n );\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, result, 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.ready) {\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 // An open question from `askUser` claims the next utterance of that source as its answer — before\n // any tier sees it, because the NLU would read a bare \"yes\"/\"the kitchen\" as a command of its own.\n // We stay silent (empty reply): whoever asked decides what to say about the answer.\n if (this.pending.has(source)) {\n const asked = this.pending.question(source);\n if (this.pending.deliver(source, question)) {\n this.log.info(`Answer to \"${asked}\" from source '${source || 'any'}': ${question}`);\n return '';\n }\n }\n // A routine is a macro the user wrote down, so it wins over everything that interprets: the NLU\n // would find \"Licht\" in \"Gute Nacht, Licht aus\" and do half of it, and the LLM would cost a\n // round-trip for a decision that has already been made.\n const routine = matchRoutine(question, this.routines);\n if (routine) {\n this.log.info(`Routine '${routine.name}' triggered (source='${source}').`);\n await this.runRoutine(routine, source);\n return routine.reply;\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 // Current weather from the configured adapter — prepended to the user turn of BOTH LLM tiers so\n // \"how's the weather?\" is answered from real data (the local model has no tools and would otherwise\n // invent a forecast; the cloud model saves a get_weather round-trip). Cached, see buildWeatherContext.\n const weather = await this.buildWeatherContext();\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. Without a cloud LLM there is nobody to hand\n // follow-ups to, so the local model takes them too.\n if (this.config.useLocalLlm && this.localLlm && (!history.length || !this.agent)) {\n try {\n // The local model has no tools: without these lines it would invent the weather and guess\n // who is at home.\n const facts = [weather, this.buildPresenceContext()].filter(Boolean).join('\\n\\n');\n const ans = await this.localLlm.ask(facts ? `${facts}\\n\\n${question}` : 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 // Provider \"none\": no tier further down. Say so instead of failing — over voice an error is\n // read out as a technical message.\n this.log.info(`No local tier could answer and no LLM provider is configured (source='${source}').`);\n return this.localOnlyFallback();\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 || 'auto'}] (source='${source}', context=${history.length} turn(s)${mem ? ', memory' : ''}${weather ? ', weather' : ''}${this.presence?.configured ? ', presence' : ''}) — running tool loop…`,\n );\n // Prepend the current date/time (and the weather line, if a source is configured) to the user turn —\n // cache-safe, see buildTimeContext. The stored history keeps the untouched question.\n const questionForLlm = [this.buildTimeContext(), weather, question].filter(Boolean).join('\\n\\n');\n return this.agent.ask(questionForLlm, sys, history);\n }\n\n /** Reply when nothing local understood the request and there is no cloud LLM (provider \"none\"). */\n private localOnlyFallback(): string {\n const lang = String(this.config.voiceLanguage || this.language || 'en');\n if (lang === 'ru') {\n return 'Извини, этого я не поняла. Без облачной языковой модели я понимаю только простые команды для устройств, таймеры и будильники.';\n }\n if (lang === 'de') {\n return 'Das habe ich leider nicht verstanden. Ohne Cloud-Sprachmodell verstehe ich nur einfache Gerätebefehle, Timer und Wecker.';\n }\n return \"Sorry, I didn't understand that. Without a cloud language model I only understand simple device commands, timers and alarms.\";\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 /**\n * List a port we listen on in the host's used-resources registry (js-controller ≥ 8), so the admin shows it\n * as occupied when someone configures another instance. `common.declareUsedResources` is set because the\n * controller would otherwise derive a TCP port from `native.port` — ours is the UDP satellite port and is\n * usually not open at all. Nothing to free on shutdown: the host unblocks our entries when the process exits\n * and drops them on the next start. Best effort — the registry is a hint, it must never keep a server down.\n */\n private declarePort(type: 'tcpPort' | 'udpPort', port: number, bind: string, family?: 4): void {\n const api = this as unknown as {\n supportsFeature(feature: string): boolean;\n registerUsedResource?(\n type: 'tcpPort' | 'udpPort',\n data: { port: number; bind?: string; family?: 4 | 6 },\n ): Promise<void>;\n };\n if (!api.registerUsedResource || !api.supportsFeature('CONTROLLER_USED_RESOURCES')) {\n return;\n }\n // A wildcard bind is left out: \"not named\" means every address, which is what 0.0.0.0/:: occupies.\n const data: { port: number; bind?: string; family?: 4 | 6 } = { port };\n if (bind && bind !== '0.0.0.0' && bind !== '::') {\n data.bind = bind;\n }\n if (family) {\n data.family = family;\n }\n api.registerUsedResource(type, data).catch(e =>\n this.log.debug(`could not register ${type} ${port}: ${(e as Error).message}`),\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 /**\n * Run the rule-based NLU; returns a response string if it produced executable intents, else null.\n * A combined command (\"Schalte A an und setze B auf 30 %\", \"Schalte A und B an\") yields several\n * intents: they are all checked up front and only then executed in order, so an utterance is never\n * half-executed here and then handed to the LLM, which would repeat the parts already done.\n */\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 intents = new Nlu(rooms, devices, this.getNluAliases()).parseAll(question);\n if (!intents.length || !intents.every(i => this.canExecuteNlu(i, devices.length))) {\n return null; // nothing matched, or one part cannot run here → let the LLM answer the whole thing\n }\n const answers: string[] = [];\n let failed = false;\n for (const intent of intents) {\n try {\n answers.push(await this.executeNluIntent(intent, source));\n } catch (e) {\n failed = true;\n // Nothing executed yet → hand the whole utterance to the LLM. Afterwards a state has already\n // been written and the LLM would repeat it, so report the failed part instead of bailing out.\n if (!answers.length) {\n throw e;\n }\n this.log.warn(`NLU intent '${intent.action}' failed: ${(e as Error).message}`);\n answers.push(this.nluFailureText(intent));\n }\n }\n if (intents.length > 1) {\n this.log.debug(`NLU handled a combined command (${intents.length} parts).`);\n }\n const answer = answers.filter(Boolean).join(' ');\n // A switch command that worked needs no sentence: a beep says the same thing a second earlier.\n // Only for voice (a chat reads its answer), only for control intents (a query's answer IS the\n // information), and only when nothing failed (an error has to be spoken).\n if (\n this.config.confirmWithTone &&\n answer &&\n !failed &&\n intents.every(i => CONTROL_ACTIONS.has(i.action)) &&\n (await this.playConfirmationTone(source))\n ) {\n this.log.debug(`NLU confirmed with a tone instead of \"${answer}\".`);\n return '';\n }\n return answer;\n }\n\n /**\n * Can this intent run locally at all? Checked for **every** part of a combined command before anything\n * is executed: a missing manager, no known devices or disabled writes send the whole utterance to the\n * LLM (which can explain why) instead of silently doing nothing — or only half of it.\n */\n private canExecuteNlu(intent: NluIntent, deviceCount: number): boolean {\n switch (intent.action) {\n case 'timerSet':\n case 'timerQuery':\n case 'timerCancel':\n return !!this.timers;\n case 'alarmSet':\n case 'alarmQuery':\n case 'alarmCancel':\n return !!this.alarms;\n case 'timeQuery':\n case 'dateQuery':\n return true;\n default:\n // Device intents; writes additionally require the coarse \"allow control\" toggle.\n return (\n deviceCount > 0 &&\n (!['on', 'off', 'level', 'color'].includes(intent.action) || !!this.config.allowWriteStates)\n );\n }\n }\n\n /** Execute one intent that {@link canExecuteNlu} accepted, and return its spoken answer. */\n private async executeNluIntent(intent: NluIntent, source: string): Promise<string> {\n switch (intent.action) {\n case 'timerSet':\n case 'timerQuery':\n case 'timerCancel':\n return this.executeTimerIntent(intent, source);\n case 'alarmSet':\n case 'alarmQuery':\n case 'alarmCancel':\n return this.executeAlarmIntent(intent, source);\n case 'timeQuery':\n case 'dateQuery':\n return this.executeTimeIntent(intent);\n default:\n return this.executeIntent(intent);\n }\n }\n\n /** Localized \"this part did not work\" sentence for a failed part of a combined command. */\n private nluFailureText(intent: NluIntent): string {\n const lang = String(this.config.voiceLanguage || this.language || 'en');\n const what = intent.device?.name ? ` (${intent.device.name})` : '';\n return lang === 'ru'\n ? `Одну команду${what} выполнить не удалось.`\n : lang === 'de'\n ? `Ein Befehl${what} hat nicht funktioniert.`\n : `One command${what} did not work.`;\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 // Category query (\"how is the air in here\") — same idea, but reports measurements.\n if (intent.action === 'categoryQuery') {\n return this.executeCategoryQuery(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 if (!(await this.writeConfirmed(intent.stateId, intent.value))) {\n return pick(\n `${dev}${where} не ответило.`,\n `${dev}${where} hat nicht reagiert.`,\n `${dev}${where} did not respond.`,\n );\n }\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 /**\n * Answer a question about a kind of measurement: read every device of that kind (optionally in one\n * room) and name the values. One device gives a short sentence, several give a list — \"wie warm ist\n * es überall\" is one question, not five.\n *\n * Air quality additionally gets a word for the number, because an IAQ of 85 means nothing to anyone\n * (the scale and the wording come from the Python original, `core/hannah/iobroker.py` `_iaq_label`).\n */\n private async executeCategoryQuery(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 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(d => d.stateId && acl[d.key]?.read !== false);\n if (!list.length) {\n return pick('Нет подходящих датчиков.', 'Keine passenden Sensoren gefunden.', 'No matching sensors found.');\n }\n\n let states: { id?: string; value?: unknown }[] = [];\n try {\n const res = await mcp.callTool('get_states', { ids: list.map(d => d.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(st => [st.id, st.value]));\n\n const parts: string[] = [];\n for (const device of list) {\n const value = valueById.get(device.stateId);\n if (value === undefined || value === null) {\n continue; // a sensor without a reading adds nothing to a spoken answer\n }\n let unit = '';\n try {\n const obj = await this.getForeignObjectAsync(device.stateId);\n unit = (obj?.common as { unit?: string } | undefined)?.unit || '';\n } catch {\n /* no unit */\n }\n let text = this.describeValue(value, lang, unit);\n if (intent.category === 'airQuality') {\n const label = iaqLabel(value, unit, lang);\n if (label) {\n text = `${text} (${label})`;\n }\n }\n // In one room the room name is already given; across rooms it is the useful half.\n const where = intent.room ? device.name : device.room || device.name;\n parts.push(`${where}: ${text}`);\n }\n if (!parts.length) {\n return pick('Нет данных.', 'Dazu liegen keine Werte vor.', 'There are no readings for that.');\n }\n const where = intent.room ? ` (${intent.room})` : '';\n const heading = CATEGORY_LABELS[intent.category || '']?.[ru ? 'ru' : de ? 'de' : 'en'] || '';\n return `${heading}${where}: ${parts.join(', ')}.`;\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 => {\n this.mirrorTimer(t, 'finished');\n this.onTimerFired(t);\n },\n onChange: list => {\n this.mirrorTimerList(list);\n void this.renderTimers(list).catch(e => this.log.debug(`renderTimers: ${e}`));\n },\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 /**\n * Push the active timer list to the ESPHome satellites, which show a running timer on their own LED\n * ring and ring it themselves (feature flag TIMERS). The device keeps its own copy, so it only needs\n * the transitions: a timer it has not seen is `started`, one that vanished without firing was\n * `cancelled`, and {@link mirrorTimer} reports `finished` from the fire callback.\n *\n * A timer is mirrored to the satellite it was set from, or broadcast when it came from elsewhere\n * (chat, telegram, a script) — otherwise setting a timer by text would leave every speaker silent.\n */\n private mirrorTimerList(list: TimerInfo[]): void {\n if (!this.esphome) {\n return;\n }\n const live = new Map(list.map(t => [t.id, t]));\n for (const [id, previous] of this.mirroredTimers) {\n if (!live.has(id)) {\n this.mirrorTimer(previous, 'cancelled');\n }\n }\n for (const timer of list) {\n this.mirrorTimer(timer, this.mirroredTimers.has(timer.id) ? 'updated' : 'started');\n }\n this.mirroredTimers = live;\n }\n\n /** Send one timer transition to the satellite it belongs to (or all, when its origin is not one). */\n private mirrorTimer(timer: TimerInfo, type: TimerEvent['type']): void {\n if (!this.esphome) {\n return;\n }\n const known = this.esphome.devices();\n const target = known.includes(timer.source) ? timer.source : null;\n const event: TimerEvent = {\n type,\n id: timer.id,\n name: timer.label || '',\n totalSeconds: timer.duration,\n secondsLeft: Math.max(0, Math.round((timer.fireAt - Date.now()) / 1000)),\n active: type === 'started' || type === 'updated',\n };\n this.esphome.timerEvent(target, event);\n if (type === 'cancelled' || type === 'finished') {\n this.mirroredTimers.delete(timer.id);\n }\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 /**\n * Resolve an announcement target to satellite state ids: `null` means every satellite (an empty name\n * or `all`), an empty array means the name is unknown — the caller decides whether that is an error\n * (`askUser`) or a warning (an announcement).\n *\n * A concrete satellite or room wins over a configured group of the same name, so naming a group after\n * a room can never make that room's speaker unreachable (the rule comes from the Python original,\n * `core/main.py:717`).\n */\n private resolveTargets(target: string | null | undefined): string[] | null {\n if (isBroadcast(target)) {\n return null;\n }\n const wanted = String(target).trim();\n const direct = this.resolveSatelliteId(wanted);\n if (direct) {\n return [direct];\n }\n const group = findTarget(wanted, this.announceTargets);\n if (!group) {\n return [];\n }\n const ids = [...new Set(group.members.map(m => this.resolveSatelliteId(m)).filter((id): id is string => !!id))];\n if (!ids.length) {\n this.log.warn(`Target '${group.name}' has no known satellite among: ${group.members.join(', ')}`);\n } else if (ids.length < group.members.length) {\n this.log.debug(`Target '${group.name}' → ${ids.join(', ')} (some members are not known satellites)`);\n }\n return ids;\n }\n\n /**\n * Resolve what a caller named — a satellite state id (`satellites.kitchen`, `kitchen`), a room name or\n * a device name — to a known satellite state id, or null if we have never seen it. Rooms resolve like\n * ids because a satellite's state id *is* its sanitised room name (see {@link satelliteStateId}).\n */\n private resolveSatelliteId(nameOrId: string): string | null {\n const raw = (nameOrId || '').trim();\n if (!raw) {\n return null;\n }\n const bare = raw.replace(`${this.namespace}.`, '').replace(/^satellites\\./, '');\n const id = this.satelliteStateId(bare, '');\n if (this.satDeviceById.has(id) || this.nativeSatFrom.has(id)) {\n return id;\n }\n // Not an id — maybe the device name behind one.\n return this.announceTargetForSource(raw);\n }\n\n /**\n * Ask the user something and wait for the answer: speak the question on the target satellite(s), have\n * them re-open the microphone, and resolve with whatever is said next there — the utterance is routed\n * to the caller instead of to the NLU/LLM (see {@link PendingQuestions}).\n *\n * `target`/`room` pick a satellite (omit both → every satellite, first answer wins). `source` instead\n * arms a text channel (e.g. `'chat'`, `'telegram:Max'`) without speaking anything: there the caller\n * sends the question itself and we only claim the reply.\n *\n * This is what the proactive triggers (roadmap A2) will use, and it is available to scripts:\n * `sendTo('assistant.0', 'askUser', { question: 'Fenster schließen?', room: 'Küche' }, cb)`.\n */\n private async askUser(msg: {\n question?: string;\n text?: string;\n target?: string;\n room?: string;\n source?: string | string[];\n timeoutMs?: number;\n }): Promise<{ question?: string; answer?: string; timeout?: boolean; error?: string }> {\n const question = String(msg.question ?? msg.text ?? '').trim();\n if (!question) {\n return { error: 'no question provided' };\n }\n const timeoutMs = Math.max(1000, Number(msg.timeoutMs) || ASK_TIMEOUT_MS);\n\n // Text channel: arm the named sources only — the caller does its own output.\n const sources = (Array.isArray(msg.source) ? msg.source : msg.source ? [msg.source] : [])\n .map(s => String(s).trim())\n .filter(Boolean);\n if (sources.length) {\n this.log.info(`askUser (waiting on ${sources.join(', ')}, ${timeoutMs} ms): ${question}`);\n const answer = await this.pending.ask(sources, question, timeoutMs);\n return answer === null ? { question, timeout: true } : { question, answer };\n }\n\n // Voice: resolve the target before arming, so a typo doesn't leave a question hanging. A group\n // or a person resolves to several satellites — the question is asked on all of them and the\n // first answer counts, which is what asking a room full of speakers means.\n const target = (msg.target || msg.room || '').trim();\n const targetIds = this.resolveTargets(target);\n if (targetIds && !targetIds.length) {\n return { error: `unknown satellite, room or group '${target}'` };\n }\n const keys = targetIds ? targetIds.map(id => this.satDeviceById.get(id) || id) : [ANY_SOURCE];\n this.log.info(\n `askUser → ${targetIds ? targetIds.join(', ') : 'all satellites'} (${timeoutMs} ms): ${question}`,\n );\n if (!(await this.announceToSatellites(question, target || null, { listen: true }))) {\n return { error: 'question not asked — no satellite reachable' };\n }\n // Armed only now, on purpose: the answer cannot arrive before the device has played the question,\n // so arming earlier would just risk claiming an utterance that was never meant as the answer.\n const answer = await this.pending.ask(keys, question, timeoutMs);\n if (answer === null) {\n this.log.info(`askUser: no answer within ${timeoutMs} ms.`);\n return { question, timeout: true };\n }\n return { question, answer };\n }\n\n /**\n * Wait for the device to confirm a write, if the user asked for that (`verifyWrites`). ioBroker's\n * convention is that a command is written with `ack:false` and the device echoes the value back with\n * `ack:true` once it really happened — so without this check the assistant reports success for a\n * lamp that never answered.\n *\n * Polled rather than subscribed: a one-off poll of one state is cheap, while a temporary\n * subscription would have to be registered, routed through `onStateChange` and torn down again for\n * every single command. Returns true when it is confirmed — and also when verification is switched\n * off or impossible, because a check that cannot run must not turn into a false alarm.\n */\n private async writeConfirmed(stateId: string | undefined, expected: unknown): Promise<boolean> {\n if (!this.config.verifyWrites || !stateId) {\n return true;\n }\n const deadline = Date.now() + ACK_TIMEOUT_MS;\n let last: ioBroker.State | null | undefined;\n while (Date.now() < deadline) {\n await this.delay(ACK_POLL_MS);\n last = await this.getForeignStateAsync(stateId).catch(() => null);\n if (last?.ack && valuesMatch(last.val, expected)) {\n this.log.debug(`write to ${stateId} confirmed by the device.`);\n return true;\n }\n }\n this.log.warn(\n `No confirmation for ${stateId} within ${ACK_TIMEOUT_MS} ms ` +\n `(last: ${JSON.stringify(last?.val)}, ack=${String(last?.ack)}). ` +\n 'If this device never acknowledges, switch \"Verify device feedback\" off.',\n );\n return false;\n }\n\n /**\n * Play the confirmation beep on the satellite a command came from. Returns false when there is nowhere\n * to play it (a text channel, or no satellite reachable) — the caller then speaks the reply instead,\n * because a confirmation nobody hears is worse than one that costs a TTS call.\n */\n private async playConfirmationTone(source: string): Promise<boolean> {\n const target = this.announceTargetForSource(source);\n if (!target) {\n return false; // chat/telegram/unknown origin: there is no speaker to beep on\n }\n const { pcm, sampleRate } = confirmationTone();\n // Priority: this is the answer to something the user just asked for, not an unsolicited noise.\n const delivered = await this.deliverPcm(pcm, sampleRate, target, true);\n return delivered > 0;\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 // ── Announcements by name (roadmap B2) ──────────────────────────────────\n\n /**\n * Tool that lets the model speak somewhere instead of answering: \"tell Denis dinner is ready\", \"let\n * everyone upstairs know\". Without it a model can read and switch states but has no way to make a\n * speaker say something, so the configured groups and people would only be reachable from scripts.\n *\n * The configured names go into the description, because the model cannot discover them otherwise.\n */\n private buildAnnounceTool(): Tool {\n const named = describeTargets(this.announceTargets);\n return {\n name: 'announce',\n description:\n `Speak a message out loud on a voice satellite — use it when the user asks you to tell ` +\n `somebody something, or to announce something in a room. Not for answering the user: your ` +\n `normal reply is already spoken. \"target\" is a room, a satellite name${\n named ? `, or one of the configured ${named}` : ''\n }; leave it out to announce everywhere.`,\n parameters: {\n type: 'object',\n properties: {\n text: { type: 'string', description: 'What to say, as one spoken sentence' },\n target: { type: 'string', description: 'Room, satellite, group or person (empty = all)' },\n },\n required: ['text'],\n additionalProperties: false,\n },\n run: async (args): Promise<string> => {\n // The arguments come from the model, so a non-string is simply not a text.\n const text = typeof args.text === 'string' ? args.text.trim() : '';\n if (!text) {\n return JSON.stringify({ ok: false, error: 'no text given' });\n }\n const target = typeof args.target === 'string' ? args.target.trim() : '';\n const spoken = await this.announceToSatellites(text, target || null);\n return spoken\n ? JSON.stringify({ ok: true, data: { spoken } })\n : JSON.stringify({\n ok: false,\n error: target\n ? `nothing was played — '${target}' is no known satellite, room or group, or it is offline`\n : 'nothing was played — no satellite is reachable',\n });\n },\n };\n }\n\n // ── Presence: who is at home (roadmap B1) ───────────────────────────────\n\n /**\n * Build the presence tracker from the configured states, subscribe to them and mirror the result into\n * `presence.*`. The values are read once up front, because a presence state only reports when it\n * changes — without that, the assistant would believe nobody is home until the first person moves.\n */\n private async setupPresence(): Promise<void> {\n const entries = parsePresenceRows(this.config.presence);\n this.presence = new PresenceTracker({\n entries,\n log: this.log,\n onChange: list => void this.renderPresence(list).catch(e => this.log.debug(`renderPresence: ${e}`)),\n onArrival: who => {\n this.setStateAsync('presence.lastArrival', { val: who.name, ack: true }).catch(() => {});\n },\n onDeparture: who => {\n this.setStateAsync('presence.lastDeparture', { val: who.name, ack: true }).catch(() => {});\n },\n });\n if (!entries.length) {\n return;\n }\n for (const id of this.presence.stateIds()) {\n await this.subscribeForeignStatesAsync(id).catch(e =>\n this.log.warn(`presence: cannot watch '${id}': ${(e as Error).message}`),\n );\n const st = await this.getForeignStateAsync(id).catch(() => null);\n this.presence.update(id, st?.val ?? null);\n }\n await this.renderPresence(this.presence.list());\n this.log.info(\n `Presence: ${entries.length} source(s) configured, ${this.presence.home().length} at home right now.`,\n );\n }\n\n /** Mirror who is at home into `presence.{anyoneHome,count,list}`. */\n private async renderPresence(list: PresenceInfo[]): Promise<void> {\n const home = list.filter(p => p.home === true && p.kind !== 'pet');\n await this.setStateAsync('presence.anyoneHome', { val: home.length > 0, ack: true });\n await this.setStateAsync('presence.count', { val: home.length, ack: true });\n await this.setStateAsync('presence.list', { val: JSON.stringify(list), ack: true });\n }\n\n /**\n * Who is at home, as one line for the user turn — never for the (prompt-cached) system prompt: it\n * changes with every arrival and would bust the cache, device list included. Empty when no presence\n * source is configured or nothing is known yet.\n */\n private buildPresenceContext(): string {\n if (!this.presence?.configured) {\n return '';\n }\n return buildPresencePrompt(this.presence.list(), String(this.config.voiceLanguage || this.language || 'en'));\n }\n\n /**\n * Should an announcement that asked to be spoken only to an occupied house be held back? With no\n * presence source configured the answer is no — \"nobody configured\" must not read as \"nobody home\",\n * or the feature would silence every announcement the moment someone ticks the box.\n */\n private emptyHouse(): boolean {\n return this.presence?.configured === true && !this.presence.anyoneHome();\n }\n\n // ── System notifications (roadmap A3) ───────────────────────────────────\n\n /**\n * Speak a system notification. The text is cleaned of ioBroker's origin prefixes and — unless the\n * severity is `direct` or rewording is switched off — reworded by the LLM into one spoken sentence\n * with a tone matching the severity, because the raw texts are written for a log viewer.\n *\n * An `alert` is delivered as a **priority** announcement, so it is heard even on a satellite set to\n * Do-Not-Disturb; everything else respects DND. Returns how many channels it reached.\n */\n private async notify(\n raw: string,\n severity: Severity,\n target: string | null = null,\n onlyWhenHome = false,\n ): Promise<number> {\n const clean = cleanupNotificationText(raw);\n if (!clean) {\n return 0;\n }\n let text = clean;\n if (severity !== 'direct' && this.config.notifyRephrase !== false && this.agent) {\n text = await this.agent.rewordNotification(\n clean,\n toneFor(severity),\n this.config.voiceLanguage || this.language || '',\n this.config.systemPrompt,\n );\n }\n this.log.info(`Notification (${severity}): ${text}`);\n this.setStateAsync('notify.last', { val: text, ack: true }).catch(() => {});\n return this.announceToSatellites(text, target, { priority: bypassesDnd(severity), onlyWhenHome });\n }\n\n /**\n * Handle a notification routed here by the ioBroker notification-manager (`sendNotification` message,\n * advertised through `common.supportedMessages.notifications`). Answers `{ sent }`, which tells the\n * manager whether it may mark the notification as handled — so we only claim it when it was actually\n * spoken somewhere.\n *\n * The payload shape belongs to the notification-manager and is parsed defensively\n * ({@link flattenNotification}): a changed field degrades the spoken sentence, it never throws.\n */\n private async handleSystemNotification(message: unknown): Promise<{ sent: boolean }> {\n const flat = flattenNotification(message, String(this.config.voiceLanguage || this.language || 'en'));\n if (!flat.text) {\n this.log.warn('Notification from the notification-manager had nothing to speak.');\n return { sent: false };\n }\n this.log.debug(`Notification (${flat.severity}) from category '${flat.category}': ${flat.text}`);\n const delivered = await this.notify(flat.text, flat.severity);\n return { sent: delivered > 0 };\n }\n\n // ── Proactive triggers (roadmap A2) ─────────────────────────────────────\n\n /**\n * Build the trigger engine from the configured definitions, mirror it into `triggers.*` and subscribe\n * to exactly the foreign states the conditions reference — nothing broader, because a wildcard\n * subscription on a busy system would wake this adapter for every state in the house.\n */\n private async setupTriggers(): Promise<void> {\n this.triggers = new TriggerEngine({\n now: () => Date.now(),\n log: this.log,\n getState: async id => {\n const st = await this.getForeignStateAsync(id).catch(() => null);\n return st?.val ?? undefined;\n },\n execute: def => this.executeTrigger(def),\n onChange: status => void this.renderTriggers(status).catch(e => this.log.debug(`renderTriggers: ${e}`)),\n });\n this.subscribeStates('triggers.enabled');\n this.subscribeStates('triggers.items.*');\n // Per-trigger objects are rebuilt from the configuration, so drop whatever a previous run left.\n await this.delObjectAsync('triggers.items', { recursive: true }).catch(() => {});\n this.triggerObjIds.clear();\n\n const master = await this.getStateAsync('triggers.enabled');\n this.triggersEnabled = master?.val !== false;\n const persisted = await this.readTriggerStatus();\n this.triggers.load(this.getTriggerDefs());\n if (persisted.length) {\n this.triggers.restore(persisted);\n }\n await this.syncTriggerSubscriptions();\n // Remember the current values before the first change arrives, so a device that re-reports an\n // unchanged value right after the start does not look like a transition.\n await this.triggers.prime();\n const n = this.triggers.list().length;\n if (n) {\n this.log.info(\n `Triggers: ${n} loaded, watching ${this.triggerStateIds.size} state(s)${this.triggersEnabled ? '' : ' — all suppressed by triggers.enabled'}.`,\n );\n }\n }\n\n /** The configured triggers, with the table's JSON columns parsed (see {@link parseTriggerRows}). */\n private getTriggerDefs(): TriggerDef[] {\n return parseTriggerRows(this.config.triggers, {\n rephraseDefault: this.config.triggerRephrase === true,\n warn: message => this.log.warn(message),\n });\n }\n\n /** Subscribe to the states the loaded triggers watch, and drop subscriptions nothing watches any more. */\n private async syncTriggerSubscriptions(): Promise<void> {\n const wanted = new Set(this.triggers?.stateIds() ?? []);\n // A presence source may be the same state a trigger watches — dropping the subscription here would\n // silently stop the presence updates too.\n const keep = new Set(this.presence?.stateIds() ?? []);\n for (const id of [...this.triggerStateIds]) {\n if (!wanted.has(id)) {\n if (!keep.has(id)) {\n await this.unsubscribeForeignStatesAsync(id).catch(() => {});\n }\n this.triggerStateIds.delete(id);\n }\n }\n for (const id of wanted) {\n if (!this.triggerStateIds.has(id)) {\n await this.subscribeForeignStatesAsync(id).catch(e =>\n this.log.warn(`trigger: cannot watch '${id}': ${(e as Error).message}`),\n );\n this.triggerStateIds.add(id);\n }\n }\n }\n\n /** Live status (enabled flag, last fire) persisted in `triggers.list`, so a restart keeps both. */\n private async readTriggerStatus(): Promise<TriggerStatus[]> {\n try {\n const st = await this.getStateAsync('triggers.list');\n if (typeof st?.val === 'string' && st.val) {\n const arr = JSON.parse(st.val);\n return Array.isArray(arr) ? (arr as TriggerStatus[]) : [];\n }\n } catch (e) {\n this.log.debug(`readTriggerStatus failed: ${(e as Error).message}`);\n }\n return [];\n }\n\n /** Mirror the trigger status into the summary states and the per-trigger `triggers.items.<id>` objects. */\n private async renderTriggers(status: TriggerStatus[]): Promise<void> {\n await this.setStateAsync('triggers.count', { val: status.length, ack: true });\n await this.setStateAsync('triggers.list', { val: JSON.stringify(status), ack: true });\n\n const wanted = new Set(status.map(t => t.id));\n for (const id of [...this.triggerObjIds]) {\n if (!wanted.has(id)) {\n await this.delObjectAsync(`triggers.items.${id}`, { recursive: true }).catch(() => {});\n this.triggerObjIds.delete(id);\n }\n }\n if (status.length) {\n await this.setObjectNotExistsAsync('triggers.items', {\n type: 'channel',\n common: { name: 'Triggers' },\n native: {},\n });\n }\n for (const t of status) {\n await this.ensureTriggerObject(t);\n }\n }\n\n /** Create (once) and update the `triggers.items.<id>.*` states for a single trigger. */\n private async ensureTriggerObject(t: TriggerStatus): Promise<void> {\n const base = `triggers.items.${t.id}`;\n if (!this.triggerObjIds.has(t.id)) {\n await this.setObjectNotExistsAsync(base, {\n type: 'channel',\n common: { name: t.name || t.id },\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('name', { name: 'Name', type: 'string', role: 'text', read: true, write: false });\n await mk('lastFired', { name: 'Last fired', type: 'number', role: 'value.time', read: true, write: false });\n await mk('nextFireAt', {\n name: 'Next scheduled fire (time triggers)',\n type: 'number',\n role: 'value.time',\n read: true,\n write: false,\n });\n await mk('pendingUntil', {\n name: 'Pending delay runs at (0 = nothing pending)',\n type: 'number',\n role: 'value.time',\n read: true,\n write: false,\n });\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('fire', {\n name: 'Run this trigger now (ignores cooldown and delay)',\n type: 'boolean',\n role: 'button',\n read: false,\n write: true,\n def: false,\n });\n this.triggerObjIds.add(t.id);\n }\n await this.setStateAsync(`${base}.name`, { val: t.name, ack: true });\n await this.setStateAsync(`${base}.lastFired`, { val: t.lastFired, ack: true });\n await this.setStateAsync(`${base}.nextFireAt`, { val: t.nextFireAt, ack: true });\n await this.setStateAsync(`${base}.pendingUntil`, { val: t.pendingUntil, ack: true });\n await this.setStateAsync(`${base}.enabled`, { val: t.enabled, ack: true });\n }\n\n /**\n * Run a trigger: either ask the user and act on the answer, or run its actions. The master switch\n * (`triggers.enabled`) is checked here rather than in the engine, so the schedule keeps running and\n * only the visible/audible effect is suppressed.\n */\n private async executeTrigger(def: TriggerDef): Promise<void> {\n if (!this.triggersEnabled) {\n this.log.debug(`trigger '${def.id}' suppressed — triggers.enabled is off`);\n return;\n }\n this.setStateAsync('triggers.lastFired', { val: def.name || def.id, ack: true }).catch(() => {});\n if (def.ask) {\n await this.askTrigger(def);\n return;\n }\n for (const action of effectiveActions(def)) {\n await this.runTriggerAction(def, action);\n }\n }\n\n /**\n * Where a trigger speaks or asks. Empty (or Hannah's `all`, which people copy from its examples) means\n * every satellite; a configured room we do not know is worth a warning, because announcing everywhere\n * instead of in one room is the kind of surprise that should not stay silent in the log.\n */\n private triggerTarget(def: TriggerDef, room: string | undefined): string | null {\n if (isBroadcast(room)) {\n return null;\n }\n const wanted = String(room).trim();\n const ids = this.resolveTargets(wanted);\n if (ids && !ids.length) {\n this.log.warn(`trigger '${def.id}': '${wanted}' is no known satellite, room or group — using all of them`);\n return null;\n }\n return wanted;\n }\n\n /** Ask the trigger's question, then let the first matching response rule decide what happens. */\n private async askTrigger(def: TriggerDef): Promise<void> {\n const question = await this.triggerText(def, def.ask || '');\n const target = this.triggerTarget(def, def.room);\n const result = await this.askUser({ question, target: target || undefined });\n if (result.error) {\n this.log.warn(`trigger '${def.id}': could not ask — ${result.error}`);\n return;\n }\n if (result.timeout || !result.answer) {\n this.log.info(`trigger '${def.id}': no answer — nothing done`);\n return;\n }\n const rules = def.onResponse || [];\n let fallback: TriggerResponseRule | undefined;\n for (const rule of rules) {\n const want = (rule.match || '').trim();\n if (!want) {\n fallback ??= rule; // a rule without a category is the \"didn't understand\" case\n continue;\n }\n if (!this.agent) {\n this.log.warn(`trigger '${def.id}': no LLM to match the answer against '${want}'`);\n break;\n }\n if (await this.agent.classify(result.answer, want)) {\n this.log.info(`trigger '${def.id}': answer matched '${want}'`);\n await this.runTriggerAction(def, rule);\n return;\n }\n }\n if (fallback) {\n await this.runTriggerAction(def, fallback);\n } else {\n this.log.info(`trigger '${def.id}': answer \"${result.answer}\" matched no rule`);\n }\n }\n\n /** Speak a trigger's `say` and/or write its `setState` — shared by the actions and the response rules. */\n private async runTriggerAction(\n def: TriggerDef,\n action: TriggerAction | TriggerResponseRule,\n fallbackTarget: string | null = null,\n ): Promise<void> {\n const say = (action.say || '').trim();\n if (say) {\n const room = 'room' in action ? action.room : def.room;\n // A routine speaks where it was asked for, unless the action names a room of its own.\n const target = this.triggerTarget(def, room) ?? fallbackTarget;\n await this.announceToSatellites(await this.triggerText(def, say), target);\n }\n const write = action.setState;\n if (write?.id) {\n // Deliberately gated: someone who switched device control off does not expect a trigger to\n // write states behind that setting.\n if (!this.config.allowWriteStates) {\n this.log.warn(\n `trigger '${def.id}': not writing ${write.id} — device control is disabled in the settings`,\n );\n return;\n }\n try {\n await this.setForeignStateAsync(write.id, { val: write.value, ack: false });\n this.log.info(`trigger '${def.id}': ${write.id} = ${JSON.stringify(write.value)}`);\n } catch (e) {\n this.log.warn(`trigger '${def.id}': cannot write ${write.id}: ${(e as Error).message}`);\n }\n }\n }\n\n /**\n * Run a routine's actions. They are {@link TriggerAction}s, so this borrows the trigger executor — a\n * routine really is a trigger whose condition is a spoken phrase. A failing action is logged and the\n * rest still runs: most of a \"good night\" is better than none of it.\n */\n private async runRoutine(routine: Routine, source: string): Promise<void> {\n const origin = this.announceTargetForSource(source);\n for (const action of routine.actions) {\n try {\n await this.runTriggerAction({ id: `routine:${routine.name}`, when: [] }, action, origin);\n } catch (e) {\n this.log.warn(`Routine '${routine.name}': an action failed — ${(e as Error).message}`);\n }\n }\n }\n\n /** A trigger's text, optionally reworded by the LLM so a recurring announcement doesn't sound canned. */\n private async triggerText(def: TriggerDef, text: string): Promise<string> {\n if (!def.rephrase || !this.agent || !text) {\n return text;\n }\n return this.agent.rephrase(text, this.config.voiceLanguage || this.language || '', this.config.systemPrompt);\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 /**\n * Compact current-weather line for the LLM, prepended to the user turn (never to the prompt-cached\n * system prompt — the values change constantly and would bust the cache, incl. the large device list,\n * on every call). Cached for {@link WEATHER_CTX_TTL}; the cache key carries source + language so a\n * settings change takes effect at once. Returns '' when no source is configured, the adapter has no\n * data yet, or it has no mapper (unknown adapters stay tool-only — a raw state dump is no prompt line).\n */\n private async buildWeatherContext(): Promise<string> {\n const value = (this.config.weatherInstance || '').trim();\n if (!value) {\n return '';\n }\n const lang = String(this.config.voiceLanguage || this.language || 'en');\n const key = `${value}|${lang}`;\n const now = Date.now();\n if (this.weatherCtx && this.weatherCtx.key === key && now - this.weatherCtx.ts < WEATHER_CTX_TTL) {\n return this.weatherCtx.text;\n }\n let text = '';\n try {\n const res = await this.readWeather(value);\n if (res.report) {\n text = buildWeatherPrompt(res.report, lang);\n } else if (res.error) {\n this.log.debug(`Weather context skipped: ${res.error}`);\n }\n } catch (e) {\n this.log.debug(`Weather context failed: ${(e as Error).message}`);\n }\n // Cache the empty result too — a missing/unmapped source must not re-read the tree every request.\n this.weatherCtx = { key, ts: now, text };\n return text;\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 if (provider === 'none') {\n return [];\n }\n const apiKey = effectiveApiKey(\n provider,\n await resolveApiKey(this, cfg, {\n credentialType: msg.credentialType,\n apiKey: msg.apiKey,\n credentialId: msg.credentialId,\n }),\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 if (provider === 'none') {\n return { error: 'No LLM provider selected.' };\n }\n const apiKey = effectiveApiKey(\n provider,\n await resolveApiKey(this, cfg, {\n credentialType: msg.credentialType,\n apiKey: msg.apiKey,\n credentialId: msg.credentialId,\n }),\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 // Resolve open questions with null instead of leaving their callers waiting for a timeout.\n this.pending.cancelAll();\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 this.triggers?.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.esphome?.stop();\n } catch {\n // ignore\n }\n try {\n await this.media?.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"]}
|
|
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, effectiveApiKey, 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 {\n WEATHER_ADAPTERS,\n buildWeatherReport,\n buildWeatherPrompt,\n trimReport,\n type WeatherReport,\n type StateValues,\n} from './lib/weather';\nimport { Journal, type JournalOrigin } from './lib/journal';\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 { PendingQuestions, ANY_SOURCE, ASK_TIMEOUT_MS } from './lib/ask';\nimport { PresenceTracker, buildPresencePrompt, parsePresenceRows, type PresenceInfo } from './lib/presence';\nimport { describeTargets, findTarget, isBroadcast, parseTargetRows, type TargetGroup } from './lib/targets';\nimport { matchRoutine, parseRoutineRows, type Routine } from './lib/routines';\nimport {\n bypassesDnd,\n cleanupNotificationText,\n flattenNotification,\n parseSeverity,\n toneFor,\n type Severity,\n} from './lib/notifications';\nimport {\n TriggerEngine,\n effectiveActions,\n parseTriggerRows,\n type TriggerAction,\n type TriggerDef,\n type TriggerResponseRule,\n type TriggerStatus,\n} from './lib/triggers';\nimport { VoiceServer } from './lib/voice/voiceServer';\nimport { WyomingServer } from './lib/voice/wyoming';\nimport { EsphomeSatellites, type TimerEvent, type WakeWordConfig } from './lib/voice/esphome';\nimport {\n MEDIA_COMMANDS,\n type EsphomeEntity,\n type MediaPlayerValue,\n type UpdateInfo,\n} from './lib/voice/esphomeEntities';\nimport { MediaServer } from './lib/voice/mediaServer';\nimport { confirmationTone } from './lib/voice/tone';\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/**\n * How long a rendered weather context line stays valid. Weather adapters refresh every few minutes at best,\n * so re-reading their whole state tree on every single request would be pure overhead.\n */\nconst WEATHER_CTX_TTL = 5 * 60 * 1000;\n\n/**\n * The replies the assistant speaks verbatim, whatever the question was. They are pre-synthesised into\n * the TTS cache at startup; everything else is cached on first use.\n */\n/** How long to wait for a device to confirm a write, and how often to look. */\nconst ACK_TIMEOUT_MS = 2000;\nconst ACK_POLL_MS = 150;\n\n/**\n * Did the device end up with the value we asked for? Compared loosely: a dimmer told `30` may report\n * `30.0`, a switch told `true` may report `1`, and a lamp told 100 % may settle at 99 % — insisting on\n * strict equality would report a failure for a command that plainly worked.\n */\nfunction valuesMatch(actual: unknown, expected: unknown): boolean {\n if (actual === expected) {\n return true;\n }\n if (typeof expected === 'boolean' || typeof actual === 'boolean') {\n return Boolean(actual) === Boolean(expected);\n }\n const a = Number(actual);\n const b = Number(expected);\n if (Number.isFinite(a) && Number.isFinite(b)) {\n return Math.abs(a - b) <= Math.max(1, Math.abs(b) * 0.02);\n }\n return String(actual).trim().toLowerCase() === String(expected).trim().toLowerCase();\n}\n\n/**\n * ioBroker role for a measurement, derived from its unit — a `value.temperature` shows up with the right\n * icon and in the right place in vis, where a bare `value` is just a number.\n */\nfunction sensorRole(entity: { unit?: string }): string {\n const unit = (entity.unit || '').trim().toLowerCase();\n if (unit === '°c' || unit === '°f' || unit === 'k') {\n return 'value.temperature';\n }\n if (unit === '%') {\n return 'value.humidity'; // the only percentage a voice box reports is its humidity\n }\n if (unit === 'lx' || unit === 'lux') {\n return 'value.brightness';\n }\n if (unit === 'hpa' || unit === 'mbar' || unit === 'pa') {\n return 'value.pressure';\n }\n if (unit === 'ppm' || unit === 'ppb') {\n return 'value.co2';\n }\n if (unit === 'db' || unit === 'dba') {\n return 'value.volume';\n }\n return 'value';\n}\n\n/** Heading for a category answer, so \"18 °C, 21 °C\" says what it is about. */\nconst CATEGORY_LABELS: Record<string, { de: string; en: string; ru: string }> = {\n temperature: { de: 'Temperatur', en: 'Temperature', ru: 'Температура' },\n humidity: { de: 'Luftfeuchtigkeit', en: 'Humidity', ru: 'Влажность' },\n illuminance: { de: 'Helligkeit', en: 'Brightness', ru: 'Освещённость' },\n pressure: { de: 'Luftdruck', en: 'Pressure', ru: 'Давление' },\n airQuality: { de: 'Luftqualität', en: 'Air quality', ru: 'Качество воздуха' },\n};\n\n/**\n * Put a word to an air-quality number, because the number alone means nothing when spoken. Only for\n * the IAQ scale (0–500, unitless or labelled IAQ) — a CO₂ value in ppm is a different scale and is\n * better left unlabelled than labelled wrongly. Thresholds from the BME680/BSEC IAQ classification,\n * as used by the Python original.\n */\nfunction iaqLabel(value: unknown, unit: string, lang: string): string {\n const iaq = Number(value);\n const u = unit.trim().toLowerCase();\n if (!Number.isFinite(iaq) || (u !== '' && u !== 'iaq')) {\n return '';\n }\n const scale: [number, string, string, string][] = [\n [50, 'sehr gut', 'excellent', 'отлично'],\n [100, 'gut', 'good', 'хорошо'],\n [150, 'mäßig', 'moderate', 'умеренно'],\n [200, 'schlecht', 'poor', 'плохо'],\n [300, 'sehr schlecht', 'very poor', 'очень плохо'],\n [Number.POSITIVE_INFINITY, 'extrem schlecht', 'extremely poor', 'крайне плохо'],\n ];\n const row = scale.find(([limit]) => iaq <= limit);\n if (!row) {\n return '';\n }\n return lang === 'ru' ? row[3] : lang === 'de' ? row[1] : row[2];\n}\n\n/** NLU actions that only switch something; their success is what the confirmation tone replaces. */\nconst CONTROL_ACTIONS = new Set(['on', 'off', 'level', 'color']);\n\nconst FIXED_REPLIES: Record<'de' | 'en' | 'ru', string[]> = {\n de: ['Ok.', 'Erledigt.'],\n en: ['Okay.', 'Done.'],\n ru: ['Хорошо.', 'Готово.'],\n};\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 /** Cloud LLM; `null` with provider \"none\" (local tiers only) or before `onReady` finished. */\n private agent: LlmAgent | null = null;\n /** Set once `onReady` initialised the pipeline — with or without a cloud {@link agent}. */\n private ready = false;\n private mcp: InProcessMcp | null = null;\n /** Who asked what and how it was answered (admin chat); null until `onReady` read the config. */\n private journal: Journal | 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 /** ESPHome voice satellites we dial out to (only when esphomeEnabled); null otherwise. */\n private esphome: EsphomeSatellites | null = null;\n /** Serves spoken replies to ESPHome satellites over HTTP; null unless those are enabled. */\n private media: MediaServer | null = null;\n /** Short-term per-source conversation memory (in-memory, TTL) for follow-up questions. */\n private readonly context = new ConversationStore();\n /** Questions the assistant asked and is waiting for an answer to (`askUser`), keyed by source. */\n private readonly pending = new PendingQuestions();\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 /** Satellite ids that already have the wake-word states — only ESPHome devices report any. */\n private readonly satWakeWordStatesEnsured = new Set<string>();\n /** Timers already mirrored onto the ESPHome satellites, so we can tell a cancel from an update. */\n private mirroredTimers = new Map<string, TimerInfo>();\n /** Per satellite: resolves once its control objects exist, so state writes can wait for them. */\n private readonly satControlsReady = new Map<string, Promise<void>>();\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 /** Proactive triggers (roadmap A2); mirrored into `triggers.*` states. Null until onReady. */\n private triggers: TriggerEngine | null = null;\n /** Per-trigger `triggers.items.<id>` channels currently rendered. */\n private readonly triggerObjIds = new Set<string>();\n /** Foreign states the loaded triggers watch (exactly what we subscribed to). */\n private readonly triggerStateIds = new Set<string>();\n /** Master switch (`triggers.enabled`): false suppresses every trigger's effect. */\n private triggersEnabled = true;\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 /** Phrase-triggered macros from the configuration (\"Gute Nacht\" → five actions). */\n private routines: Routine[] = [];\n /** Named announcement targets (roadmap B2): groups of rooms and people, from the configuration. */\n private announceTargets: TargetGroup[] = [];\n /** Who is at home (roadmap B1); mirrored into `presence.*`. Null until onReady. */\n private presence: PresenceTracker | null = null;\n /** Satellites currently set to Do-Not-Disturb, by state id (mirrors `satellites.<id>.dnd`). */\n private readonly dndById = new Map<string, boolean>();\n /** Global Do-Not-Disturb (`dnd`): suppresses every announcement except priority/alert ones. */\n private globalDnd = false;\n /** Cached weather context line (see `buildWeatherContext`); `key` = source + language. */\n private weatherCtx: { key: string; ts: number; text: string } | null = null;\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 // Provider \"none\": no cloud LLM at all — only the local tiers (routines, rule-based NLU, timers,\n // alarms, the local model) answer. The ioBroker tools are still built: the NLU switches through them.\n const provider = cfg.provider || 'openai';\n const localOnly = provider === 'none';\n const apiKey = localOnly ? '' : effectiveApiKey(cfg.provider, await resolveApiKey(this, cfg));\n await this.setupJournal();\n\n if (!localOnly && !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 = this.journalMcp(\n await createInProcessMcp({\n adapter: this,\n language: this.language,\n allowSetState: cfg.allowWriteStates,\n allowObjectChange: cfg.allowObjectChange,\n }),\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 if (cfg.voiceEnabled) {\n // Only useful with satellites: without voice there is nothing to speak on.\n tools.push(this.buildAnnounceTool());\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 if (provider !== 'none') {\n const prov = resolveProvider(provider, cfg.baseUrl);\n this.agent = new LlmAgent({\n provider,\n apiKey,\n model: cfg.model || prov.defaultModel,\n baseUrl: prov.baseUrl,\n systemPrompt: cfg.systemPrompt || '',\n maxTokens: cfg.maxTokens || 1024,\n tools: tools.map(t => this.journalTool(t)),\n log: this.log,\n });\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.ready = 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 // Spoken system notifications + Do-Not-Disturb (per satellite: see ensureSatelliteObjects).\n this.subscribeStates('notify.text');\n this.subscribeStates('notify.alert');\n this.subscribeStates('dnd');\n this.globalDnd = (await this.getStateAsync('dnd'))?.val === true;\n if (this.globalDnd) {\n this.log.info('Do-Not-Disturb is on — only alerts will be announced.');\n }\n await this.setupTimers();\n await this.setupAlarms();\n if (cfg.useLongTermMemory !== false) {\n await this.setupMemory();\n }\n this.routines = parseRoutineRows(cfg.routines, { warn: message => this.log.warn(message) });\n if (this.routines.length) {\n this.log.info(`Routines: ${this.routines.map(r => r.name).join(', ')}.`);\n }\n this.announceTargets = parseTargetRows(cfg.announceTargets);\n if (this.announceTargets.length) {\n this.log.info(\n `Announcement targets: ${this.announceTargets.map(t => `${t.name} (${t.kind})`).join(', ')}.`,\n );\n }\n await this.setupPresence();\n await this.setupTriggers();\n this.log.info(\n this.agent\n ? `Assistant ready (provider=${cfg.provider}, model=${this.agent.model || 'auto'}).`\n : 'Assistant ready without an LLM provider — answering locally only.',\n );\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 if (cfg.esphomeEnabled) {\n await this.startEsphome(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, sttMs) => this.answer(question, 'wyoming', { transport: 'wyoming', sttMs }),\n getHints: () => this.buildSttHints(),\n log: this.log,\n });\n await this.wyoming.start();\n this.declarePort('tcpPort', cfg.wyomingPort || 10700, cfg.bind);\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 /**\n * Connect to the configured ESPHome voice satellites (ThirdReality V&M Assistant, HA Voice PE,\n * linux-voice-assistant). The adapter is the client here — the devices listen on TCP 6053 — and the\n * spoken reply is handed over as a URL, so the little media server comes up together with them.\n */\n private async startEsphome(mainApiKey: string): Promise<void> {\n const cfg = this.config;\n const devices = (cfg.esphomeDevices || []).filter(d => d?.ip?.trim());\n if (!devices.length) {\n this.log.warn('ESPHome satellites are enabled, but no device is configured.');\n return;\n }\n\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(`ESPHome satellites not started — ${(e as Error).message}. Check the Voice tab settings.`);\n return;\n }\n\n try {\n const media = new MediaServer({\n port: cfg.esphomeMediaPort || 8099,\n bindAddress: cfg.bind || '0.0.0.0',\n log: this.log,\n });\n await media.start();\n this.media = media;\n this.declarePort('tcpPort', media.port, cfg.bind);\n } catch (e) {\n this.log.error(`ESPHome satellites not started — media server failed: ${(e as Error).message}`);\n this.media = null;\n return;\n }\n\n this.esphome = new EsphomeSatellites({\n devices,\n language,\n stt,\n tts,\n answer: (question, origin) =>\n this.answerVoice(question, origin.device, {\n transport: 'esphome',\n room: origin.room,\n wakeWord: origin.wakeWord,\n sttMs: origin.sttMs,\n }),\n getHints: () => this.buildSttHints(),\n media: this.media,\n mediaHost: (cfg.esphomeMediaHost || '').trim(),\n silenceMs: cfg.esphomeSilenceMs || 0,\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 onWakeWords: (device, room, config) => {\n this.updateSatelliteWakeWords(device, room, config).catch(e =>\n this.log.debug(`satellite wake word update failed: ${(e as Error).message}`),\n );\n },\n onEntities: (device, room, entities) => {\n this.createSatelliteControls(device, room, entities).catch(e =>\n this.log.debug(`satellite control objects failed: ${(e as Error).message}`),\n );\n },\n onEntityState: (device, room, entity) => {\n this.updateSatelliteControl(device, room, entity).catch(e =>\n this.log.debug(`satellite control update failed: ${(e as Error).message}`),\n );\n },\n expectsFollowUp: answer => this.expectsFollowUp(answer),\n });\n await this.esphome.start();\n this.log.info(\n `ESPHome satellites: ${devices.length} device(s), STT=${cfg.sttProvider || 'openai'}, TTS=${cfg.ttsProvider || 'openai'}.`,\n );\n if (!this.voice && !this.wyoming) {\n this.warmupEngines(stt, tts, language); // nobody warmed the engines up yet\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 sttFallback: cfg.sttFallback || '',\n ttsFallback: cfg.ttsFallback || '',\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) =>\n this.answerVoice(question, ctx.device, { transport: 'udp', room: ctx.room, sttMs: ctx.sttMs }),\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.declarePort('udpPort', cfg.port || 7775, cfg.bind, 4); // dgram 'udp4' socket\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)\n .then(() => this.warmTtsCache(tts, lang))\n .catch(e => this.log.warn(`TTS warm-up failed: ${(e as Error).message}`));\n } else {\n void this.warmTtsCache(tts, lang);\n }\n }\n\n /**\n * Pre-synthesise the handful of replies the assistant says verbatim, so the first one of the day is\n * not a cloud round-trip. Everything else lands in the cache on first use anyway — this only covers\n * the fixed strings, which are the ones that repeat forever.\n */\n private async warmTtsCache(tts: TtsEngine, lang: string): Promise<void> {\n const phrases = FIXED_REPLIES[lang === 'ru' ? 'ru' : lang === 'de' ? 'de' : 'en'];\n await tts.warm?.(phrases, lang).catch(e => this.log.debug(`TTS cache warm-up: ${(e as Error).message}`));\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, origin: JournalOrigin = {}): 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, { satellite: source, ...origin });\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 /** Wake word the satellite detected (journal only). */\n wakeWord?: 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 sttStart = Date.now();\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 transport: 'native',\n room,\n wakeWord: typeof msg.wakeWord === 'string' ? msg.wakeWord : undefined,\n sttMs: Date.now() - sttStart,\n });\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 = await this.ensureSatelliteObjects(device, room);\n const base = `satellites.${id}`;\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 * Create the object tree for one satellite and return its (sanitised) state id, without touching\n * any value. Callers that only need somewhere to hang a child object use this rather than\n * {@link updateSatelliteState} — going through that would write `status`, and a wake-word or\n * settings update arriving mid-announcement would knock the satellite back to `idle`.\n */\n private async ensureSatelliteObjects(device: string, room: string): Promise<string> {\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 await this.setObjectNotExistsAsync(`${base}.dnd`, {\n type: 'state',\n common: {\n name: 'Do-Not-Disturb: suppress announcements on this satellite (alerts still play)',\n type: 'boolean',\n role: 'switch.mode.silent',\n read: true,\n write: true,\n def: false,\n },\n native: {},\n });\n this.subscribeStates(`${base}.tts`);\n this.subscribeStates(`${base}.dnd`);\n // A satellite that was silenced before the restart stays silenced.\n const dnd = await this.getStateAsync(`${base}.dnd`);\n this.dndById.set(id, dnd?.val === true);\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 return id;\n }\n\n /**\n * Publish a satellite's wake-word configuration and let it be changed from ioBroker.\n *\n * Only ESPHome satellites have this: the wake word runs on the device, and the ESPHome API lets the\n * controller pick which of the built-in models listen. `wakeWords` is writable and takes a\n * comma-separated list of ids; the device stores the choice itself, so it survives a restart of the\n * adapter and is read back from the device rather than mirrored optimistically.\n */\n private async updateSatelliteWakeWords(device: string, room: string, config: WakeWordConfig): Promise<void> {\n const id = await this.ensureSatelliteObjects(device, room);\n const base = `satellites.${id}`;\n\n if (!this.satWakeWordStatesEnsured.has(id)) {\n await this.setObjectNotExistsAsync(`${base}.wakeWords`, {\n type: 'state',\n common: {\n name: 'Active wake words (comma-separated ids)',\n type: 'string',\n role: 'text',\n read: true,\n write: true,\n def: '',\n },\n native: {},\n });\n await this.setObjectNotExistsAsync(`${base}.availableWakeWords`, {\n type: 'state',\n common: {\n name: 'Wake words this device offers',\n type: 'string',\n role: 'json',\n read: true,\n write: false,\n def: '[]',\n },\n native: {},\n });\n this.subscribeStates(`${base}.wakeWords`);\n this.satWakeWordStatesEnsured.add(id);\n }\n await this.setStateAsync(`${base}.wakeWords`, { val: config.active.join(','), ack: true });\n await this.setStateAsync(`${base}.availableWakeWords`, {\n val: JSON.stringify({ max: config.max, words: config.available }),\n ack: true,\n });\n }\n\n /**\n * Mirror everything an ESPHome satellite exposes besides the voice pipeline into\n * `satellites.<id>.controls.*` — microphone gain and volume, noise suppression, wake-word and\n * stop-word sensitivities, the mute and thinking-sound switches, its media player and its firmware\n * update entity. Which of these exist is up to the device, so the objects are built from what it\n * announced rather than from a hard-coded list.\n *\n * The compound entities get a small folder instead of a single state, because one value cannot\n * carry them: a media player has a state, a volume and a mute flag, and a firmware entity has two\n * versions plus progress.\n */\n private createSatelliteControls(device: string, room: string, entities: EsphomeEntity[]): Promise<void> {\n if (!entities.length) {\n return Promise.resolve();\n }\n // Publish the promise *before* awaiting anything: the device starts pushing entity states while\n // these objects are still being created, and those writes have to wait for it.\n const satId = this.satelliteStateId(device, room);\n const task = this.buildSatelliteControls(satId, device, room, entities);\n this.satControlsReady.set(satId, task);\n return task;\n }\n\n /** The actual object creation behind {@link createSatelliteControls}. */\n private async buildSatelliteControls(\n satId: string,\n device: string,\n room: string,\n entities: EsphomeEntity[],\n ): Promise<void> {\n await this.ensureSatelliteObjects(device, room); // make sure the parent objects exist\n const base = `satellites.${satId}.controls`;\n await this.setObjectNotExistsAsync(base, {\n type: 'channel',\n common: { name: 'Device settings' },\n native: {},\n });\n\n for (const entity of entities) {\n const id = `${base}.${entity.objectId}`;\n const name = entity.name || entity.objectId;\n if (entity.kind === 'mediaPlayer') {\n await this.setObjectNotExistsAsync(id, { type: 'channel', common: { name }, native: {} });\n await this.ensureState(`${id}.state`, 'Playback state', 'string', 'media.state', false);\n await this.ensureState(`${id}.volume`, 'Volume (0…1)', 'number', 'level.volume', true);\n await this.ensureState(\n `${id}.command`,\n `Command (${Object.keys(MEDIA_COMMANDS).join(', ')})`,\n 'string',\n 'text',\n true,\n );\n await this.ensureState(`${id}.muted`, 'Muted', 'boolean', 'media.mute', false);\n this.subscribeStates(`${id}.volume`);\n this.subscribeStates(`${id}.command`);\n } else if (entity.kind === 'update') {\n await this.setObjectNotExistsAsync(id, { type: 'channel', common: { name }, native: {} });\n await this.ensureState(`${id}.currentVersion`, 'Installed version', 'string', 'text', false);\n await this.ensureState(`${id}.latestVersion`, 'Available version', 'string', 'text', false);\n await this.ensureState(`${id}.inProgress`, 'Update running', 'boolean', 'indicator', false);\n await this.ensureState(`${id}.progress`, 'Update progress', 'number', 'value', false);\n await this.ensureState(`${id}.install`, 'Install the update', 'boolean', 'button', true);\n this.subscribeStates(`${id}.install`);\n } else if (entity.kind === 'event') {\n await this.setObjectNotExistsAsync(id, {\n type: 'state',\n common: {\n name: `${name} (last event)`,\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n def: '',\n ...(entity.eventTypes?.length\n ? { states: Object.fromEntries(entity.eventTypes.map(t => [t, t])) }\n : {}),\n },\n native: {},\n });\n } else if (entity.kind === 'sensor' || entity.kind === 'binarySensor' || entity.kind === 'textSensor') {\n // What the box measures about its room (temperature, presence, a status text). Read-only,\n // so there is nothing to subscribe to — the device pushes the values.\n const common: ioBroker.StateCommon =\n entity.kind === 'sensor'\n ? {\n name,\n type: 'number',\n role: sensorRole(entity),\n read: true,\n write: false,\n unit: entity.unit || undefined,\n }\n : entity.kind === 'binarySensor'\n ? { name, type: 'boolean', role: 'indicator', read: true, write: false, def: false }\n : { name, type: 'string', role: 'text', read: true, write: false, def: '' };\n await this.setObjectNotExistsAsync(id, { type: 'state', common, native: {} });\n } else {\n const common: ioBroker.StateCommon =\n entity.kind === 'switch'\n ? { name, type: 'boolean', role: 'switch', read: true, write: true, def: false }\n : entity.kind === 'select'\n ? {\n name,\n type: 'string',\n role: 'text',\n read: true,\n write: true,\n def: '',\n states: Object.fromEntries((entity.options || []).map(o => [o, o])),\n }\n : {\n name,\n type: 'number',\n role: 'level',\n read: true,\n write: true,\n min: entity.min,\n max: entity.max,\n step: entity.step,\n unit: entity.unit || undefined,\n };\n await this.setObjectNotExistsAsync(id, { type: 'state', common, native: {} });\n this.subscribeStates(id);\n }\n }\n this.satDeviceById.set(satId, device);\n // Now that the objects exist, publish the values the device already reported. Anything that\n // arrived while we were still creating objects was skipped, so this is what fills those in.\n for (const entity of entities) {\n if (entity.value !== undefined) {\n await this.writeSatelliteControl(satId, entity);\n }\n }\n this.log.debug(`Satellite ${device}: ${entities.length} control object(s) under ${base}`);\n }\n\n /** Small helper so the control objects above stay readable. */\n private async ensureState(\n id: string,\n name: string,\n type: ioBroker.CommonType,\n role: string,\n write: boolean,\n ): Promise<void> {\n await this.setObjectNotExistsAsync(id, {\n type: 'state',\n common: { name, type, role, read: true, write },\n native: {},\n });\n }\n\n /**\n * A device pushed a new value for one of its entities.\n *\n * The device starts reporting states while {@link buildSatelliteControls} is still creating the\n * objects, so this waits for that to finish. Before the entities have even been announced there is\n * nothing to wait on and nothing to write into — the value is kept in the registry and published by\n * the initial sync at the end of the build.\n */\n private async updateSatelliteControl(device: string, room: string, entity: EsphomeEntity): Promise<void> {\n const satId = this.satelliteStateId(device, room);\n const ready = this.satControlsReady.get(satId);\n if (!ready) {\n return;\n }\n await ready;\n await this.writeSatelliteControl(satId, entity);\n }\n\n /** Write one entity's current value into its state(s). Always acked — this is the device talking. */\n private async writeSatelliteControl(satId: string, entity: EsphomeEntity): Promise<void> {\n const base = `satellites.${satId}.controls.${entity.objectId}`;\n if (entity.kind === 'mediaPlayer') {\n const v = entity.value as MediaPlayerValue;\n await this.setStateAsync(`${base}.state`, { val: v.state, ack: true });\n await this.setStateAsync(`${base}.volume`, { val: v.volume, ack: true });\n await this.setStateAsync(`${base}.muted`, { val: v.muted, ack: true });\n } else if (entity.kind === 'update') {\n const v = entity.value as UpdateInfo;\n await this.setStateAsync(`${base}.currentVersion`, { val: v.currentVersion, ack: true });\n await this.setStateAsync(`${base}.latestVersion`, { val: v.latestVersion, ack: true });\n await this.setStateAsync(`${base}.inProgress`, { val: v.inProgress, ack: true });\n await this.setStateAsync(`${base}.progress`, { val: v.progress, ack: true });\n } else {\n await this.setStateAsync(base, { val: entity.value as ioBroker.StateValue, ack: true });\n }\n }\n\n /**\n * Apply a write to any `satellites.<id>.controls.*` state. Like the wake words, nothing is acked\n * here: the device reports the value it actually took and {@link updateSatelliteControl} writes\n * that, so a clamped or rejected write never leaves ioBroker showing a value the device ignored.\n */\n private setSatelliteControl(satId: string, path: string, value: ioBroker.StateValue): void {\n const device = this.satDeviceById.get(satId) || satId;\n if (!this.esphome) {\n this.log.warn(`Cannot write ${path} on ${device}: ESPHome satellites are not enabled.`);\n return;\n }\n // Compound entities address a leaf: `<objectId>.volume`, `<objectId>.install`, …\n const [objectId, leaf] = path.split('.');\n let payload: unknown = value;\n if (leaf === 'install') {\n if (!value) {\n return; // button released\n }\n payload = 'install';\n } else if (leaf === 'volume' || leaf === 'command') {\n payload = value;\n } else if (leaf) {\n return; // read-only leaf of a compound entity\n }\n if (!this.esphome.setEntity(device, objectId, payload)) {\n this.log.warn(`Writing ${objectId} on ${device} was rejected — see the warning above.`);\n }\n }\n\n /**\n * Apply a write to `satellites.<id>.wakeWords`. The state is *not* acked here: the device echoes its\n * new configuration back and {@link updateSatelliteWakeWords} writes the acked value, so what ioBroker\n * shows is always what the device actually does — including when it rejected or trimmed the list.\n */\n private async setSatelliteWakeWords(satId: string, value: string): Promise<void> {\n const device = this.satDeviceById.get(satId) || satId;\n const ids = value\n .split(/[,;]/)\n .map(s => s.trim())\n .filter(Boolean);\n if (!this.esphome) {\n this.log.warn(`Cannot set wake words on ${device}: ESPHome satellites are not enabled.`);\n return;\n }\n if (!this.esphome.setWakeWords(device, ids)) {\n this.log.warn(`Cannot set wake words: satellite ${device} is not connected.`);\n // Put the last known value back, so the state does not keep showing a change that never happened.\n const known = this.esphome.wakeWords(device);\n if (known) {\n await this.setStateAsync(`satellites.${satId}.wakeWords`, {\n val: known.active.join(','),\n ack: true,\n });\n }\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 * With `opts.listen` the satellite re-opens its microphone afterwards, for the answer to a question\n * (`askUser`); `opts.priority` plays even on a satellite set to Do-Not-Disturb (an alert does, see\n * {@link notify}). Returns how many channels the announcement reached — 0 means nobody heard it.\n */\n private async announceToSatellites(\n value: string,\n target: string | null,\n opts: { listen?: boolean; priority?: boolean; onlyWhenHome?: boolean } = {},\n ): Promise<number> {\n const listen = opts.listen === true;\n let v = value.trim();\n if (!v) {\n return 0;\n }\n // A name may stand for one satellite, a room, or a configured group/person — resolve it before\n // spending a TTS call on a target that does not exist.\n const targets = this.resolveTargets(target);\n if (targets && !targets.length) {\n this.log.warn(`Announcement not delivered — '${String(target)}' is no known satellite, room or group.`);\n return 0;\n }\n // Checked before the text is synthesised, so talking to an empty house costs neither an LLM nor a\n // TTS call.\n if (opts.onlyWhenHome && this.emptyHouse()) {\n this.log.debug('Announcement held back — nobody is at home.');\n return 0;\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 let priority = opts.priority === true;\n if (v.startsWith('!')) {\n priority = true;\n v = v.slice(1).trim();\n if (!v) {\n return 0;\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 0;\n }\n\n let delivered = 0;\n if (targets === null) {\n delivered = await this.deliverPcm(pcm, sampleRate, null, priority, listen);\n } else {\n // Synthesised once, handed to each member: a group of three speakers is one TTS call.\n for (const id of targets) {\n delivered += await this.deliverPcm(pcm, sampleRate, id, priority, listen);\n }\n }\n this.log.info(\n `Announce → ${targets ? targets.join(', ') : 'all satellites'} (${delivered} channel(s)${listen ? ', mic on' : ''}): ${isAudio ? v : `\"${v}\"`}`,\n );\n if (!delivered) {\n this.log.warn('Announcement not delivered — no satellites registered (native or UDP).');\n }\n return delivered;\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 * `listen` asks the satellite to re-open its microphone when the clip has played, so the answer to a\n * question is captured without a wake word. Each transport has its own way: ESPHome carries it in the\n * announce request (`start_conversation`), UDP gets a `listen` control message, and a native satellite\n * receives the flag in the announce message.\n */\n private async deliverPcm(\n pcm: Buffer,\n sampleRate: number,\n targetId: string | null,\n priority: boolean,\n listen = false,\n ): Promise<number> {\n let delivered = 0;\n if (this.silenced(targetId, priority)) {\n this.log.debug(`Announcement suppressed — Do-Not-Disturb (${targetId || 'all satellites'}).`);\n return 0;\n }\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 [satId, from] of nativeTargets) {\n if (this.silenced(satId, priority)) {\n continue;\n }\n this.sendTo(from, 'announce', {\n audio: pcm.toString('base64'),\n sampleRate,\n format: 'pcm',\n priority,\n listen,\n });\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 // Addressed per device rather than broadcast, so one silenced satellite in the house does not\n // silence the others — and so the count reflects who actually got it (announce() itself only\n // warns when nobody is registered, and askUser needs to know whether the question was heard).\n const allowed = this.voice\n .devices()\n .filter(d => (!device || d === device) && !this.isDeviceSilenced(d, priority));\n if (allowed.length) {\n try {\n await Promise.all(allowed.map(d => this.voice!.announce(d, pcm, sampleRate)));\n delivered += allowed.length;\n if (listen) {\n allowed.forEach(d => this.voice!.listen(d));\n }\n } catch (e) {\n this.log.debug(`UDP announce failed: ${(e as Error).message}`);\n }\n }\n }\n // ── ESPHome satellites: they fetch the clip from the media server by URL ──\n if (this.esphome && !(targetId && this.nativeSatFrom.has(targetId))) {\n const device = targetId ? this.satDeviceById.get(targetId) || targetId : null;\n const allowed = this.esphome\n .devices()\n .filter(d => (!device || d === device) && !this.isDeviceSilenced(d, priority));\n try {\n const counts = await Promise.all(allowed.map(d => this.esphome!.announce(d, pcm, sampleRate, listen)));\n delivered += counts.reduce((sum, n) => sum + n, 0);\n } catch (e) {\n this.log.debug(`ESPHome announce failed: ${(e as Error).message}`);\n }\n }\n return delivered;\n }\n\n /**\n * Do-Not-Disturb check by satellite state id (`null` = the broadcast itself). A priority announcement\n * — an `alert` notification or a text starting with `!` — is never suppressed; that is the whole point\n * of the flag, and a water leak has to be heard at night.\n */\n private silenced(satId: string | null, priority: boolean): boolean {\n if (priority) {\n return false;\n }\n if (this.globalDnd) {\n return true;\n }\n return satId ? this.dndById.get(satId) === true : false;\n }\n\n /** Same check, for a transport that knows its satellites by device name rather than by state id. */\n private isDeviceSilenced(device: string, priority: boolean): boolean {\n if (priority) {\n return false;\n }\n for (const [satId, dev] of this.satDeviceById) {\n if (dev === device) {\n return this.silenced(satId, priority);\n }\n }\n return this.globalDnd;\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 // Priority like the jingle above: a timer the user set themselves is not an unsolicited\n // announcement, and hearing the gong followed by silence would be worse than either.\n await this.announceToSatellites(message, target, { priority: true }).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 // Priority, for the same reason as in startRing: the jingle already bypasses Do-Not-Disturb.\n await this.announceToSatellites(text, targetId, { priority: true });\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) {\n return;\n }\n // Trigger-watched states are routed first and regardless of `ack`: a device confirms its value with\n // ack:true, which the filter below drops — and those are exactly the changes a trigger reacts to.\n if (this.triggerStateIds.has(id)) {\n await this.triggers?.onStateChange(id, state.val);\n }\n // Presence states come from devices too (a phone ping, the residents adapter), so they are\n // read here for the same reason — and one state may well be watched by both.\n this.presence?.update(id, state.val ?? null);\n if (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 // Pick which wake words listen on an ESPHome satellite (comma-separated ids).\n const satWake = id.match(/\\.satellites\\.([^.]+)\\.wakeWords$/);\n if (satWake) {\n await this.setSatelliteWakeWords(satWake[1], String(state.val ?? ''));\n return;\n }\n\n // Device settings: mic gain/volume, noise suppression, sensitivities, media player, firmware.\n const satControl = id.match(/\\.satellites\\.([^.]+)\\.controls\\.(.+)$/);\n if (satControl) {\n this.setSatelliteControl(satControl[1], satControl[2], state.val ?? null);\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 // System notifications: `notify.text` (severity notify) and `notify.alert` (urgent, ignores DND).\n if (id.endsWith('.notify.text') || id.endsWith('.notify.alert')) {\n const alert = id.endsWith('.notify.alert');\n const text = String(state.val ?? '');\n await this.setStateAsync(alert ? 'notify.alert' : 'notify.text', { val: '', ack: true });\n await this.notify(text, alert ? 'alert' : 'notify');\n return;\n }\n\n // Do-Not-Disturb: globally and per satellite.\n if (id.endsWith('.dnd') && !id.includes('.satellites.')) {\n this.globalDnd = !!state.val;\n this.log.info(`Do-Not-Disturb ${this.globalDnd ? 'on' : 'off'} (all satellites).`);\n await this.setStateAsync('dnd', { val: this.globalDnd, ack: true });\n return;\n }\n const satDnd = id.match(/\\.satellites\\.([^.]+)\\.dnd$/);\n if (satDnd) {\n this.dndById.set(satDnd[1], !!state.val);\n this.log.info(`Do-Not-Disturb ${state.val ? 'on' : 'off'} for satellite '${satDnd[1]}'.`);\n await this.setStateAsync(`satellites.${satDnd[1]}.dnd`, { val: !!state.val, ack: true });\n return;\n }\n\n // Trigger controls: the master switch, the per-trigger enable switch and its test button.\n if (id.endsWith('.triggers.enabled')) {\n this.triggersEnabled = !!state.val;\n this.log.info(`Triggers ${this.triggersEnabled ? 'enabled' : 'disabled'} via triggers.enabled.`);\n await this.setStateAsync('triggers.enabled', { val: this.triggersEnabled, ack: true });\n return;\n }\n const triggerEnable = id.match(/\\.triggers\\.items\\.([^.]+)\\.enabled$/);\n if (triggerEnable) {\n if (this.triggers?.setEnabled(triggerEnable[1], !!state.val)) {\n this.log.info(`Trigger ${triggerEnable[1]} ${state.val ? 'enabled' : 'disabled'}.`);\n }\n return;\n }\n const triggerFire = id.match(/\\.triggers\\.items\\.([^.]+)\\.fire$/);\n if (triggerFire) {\n // Ack the button back to false right away, so it can be pressed again while the trigger runs\n // (a trigger that asks a question keeps us here for up to a minute).\n await this.setStateAsync(`triggers.items.${triggerFire[1]}.fire`, { val: false, ack: true });\n if (state.val && !(await this.triggers?.fireNow(triggerFire[1]))) {\n this.log.warn(`Trigger ${triggerFire[1]} not found.`);\n }\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.ready) {\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 / settings: which wake words an ESPHome satellite offers and which are listening.\n // message = { device? } — omitted means every connected one.\n if (obj.command === 'getWakeWords') {\n const m = (obj.message || {}) as { device?: string };\n const devices = m.device ? [m.device] : this.esphome?.devices() || [];\n const payload = this.esphome\n ? { devices: devices.map(d => ({ device: d, ...(this.esphome?.wakeWords(d) || {}) })) }\n : { error: 'ESPHome satellites are not enabled' };\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, payload, obj.callback);\n }\n return;\n }\n\n // Scripts: choose the active wake words. message = { device, wakeWords: string[] | \"a,b\" }.\n if (obj.command === 'setWakeWords') {\n const m = (obj.message || {}) as { device?: string; wakeWords?: string[] | string };\n const ids = (Array.isArray(m.wakeWords) ? m.wakeWords : String(m.wakeWords ?? '').split(/[,;]/))\n .map(s => String(s).trim())\n .filter(Boolean);\n let payload: Record<string, unknown>;\n if (!this.esphome) {\n payload = { error: 'ESPHome satellites are not enabled' };\n } else if (!m.device) {\n payload = { error: 'device is required' };\n } else if (!this.esphome.setWakeWords(m.device, ids)) {\n payload = { error: `satellite ${m.device} is not connected` };\n } else {\n payload = { ok: true };\n }\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, payload, obj.callback);\n }\n return;\n }\n\n // Scripts: everything an ESPHome satellite exposes besides the voice pipeline.\n // message = { device? }; without a device, every connected one is listed.\n if (obj.command === 'getControls') {\n const m = (obj.message || {}) as { device?: string };\n const devices = m.device ? [m.device] : this.esphome?.devices() || [];\n const payload = this.esphome\n ? { devices: devices.map(d => ({ device: d, entities: this.esphome?.entities(d) || [] })) }\n : { error: 'ESPHome satellites are not enabled' };\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, payload, obj.callback);\n }\n return;\n }\n\n // Scripts: write one of them. message = { device, control: 'mic_volume', value: 2000 }.\n if (obj.command === 'setControl') {\n const m = (obj.message || {}) as { device?: string; control?: string; value?: unknown };\n let payload: Record<string, unknown>;\n if (!this.esphome) {\n payload = { error: 'ESPHome satellites are not enabled' };\n } else if (!m.device || !m.control) {\n payload = { error: 'device and control are required' };\n } else if (!this.esphome.setEntity(m.device, m.control, m.value)) {\n payload = { error: `${m.control} on ${m.device} rejected the value (see the log)` };\n } else {\n payload = { ok: true };\n }\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(\n obj.from,\n obj.command,\n { error: this.ready ? 'translating needs an LLM provider' : 'agent not ready' },\n obj.callback,\n );\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 // A notification routed here by the ioBroker notification-manager.\n if (obj.command === 'sendNotification') {\n const result = await this.handleSystemNotification(obj.message);\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, result, obj.callback);\n }\n return;\n }\n\n // Speak a system notification: sendTo('assistant.0', 'notify', { text, severity, target }).\n if (obj.command === 'notify') {\n const msg = (obj.message || {}) as {\n text?: string;\n severity?: string;\n target?: string;\n room?: string;\n onlyWhenHome?: boolean;\n };\n const text = String(msg.text ?? '');\n let result: { spoken?: number; error?: string };\n if (!text.trim()) {\n result = { error: 'no text provided' };\n } else {\n const where = (msg.target || msg.room || '').trim();\n const ids = this.resolveTargets(where);\n const target = where || null;\n result =\n ids && !ids.length\n ? { error: `unknown satellite, room or group '${where}'` }\n : {\n spoken: await this.notify(\n text,\n parseSeverity(msg.severity),\n target,\n msg.onlyWhenHome === true,\n ),\n };\n }\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, result, obj.callback);\n }\n return;\n }\n\n // Trigger management for scripts: list them, run one now, enable/disable one.\n if (obj.command === 'listTriggers') {\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, { triggers: this.triggers?.list() ?? [] }, obj.callback);\n }\n return;\n }\n if (obj.command === 'fireTrigger' || obj.command === 'setTriggerEnabled') {\n const msg = (obj.message || {}) as { id?: string; enabled?: boolean };\n const tid = String(msg.id ?? '').trim();\n let result: { ok: boolean; error?: string };\n if (!tid) {\n result = { ok: false, error: 'no trigger id provided' };\n } else if (obj.command === 'fireTrigger') {\n const ok = (await this.triggers?.fireNow(tid)) === true;\n result = ok ? { ok } : { ok, error: `unknown trigger '${tid}'` };\n } else {\n const ok = this.triggers?.setEnabled(tid, msg.enabled !== false) === true;\n result = ok ? { ok } : { ok, error: `unknown trigger '${tid}'` };\n }\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, result, obj.callback);\n }\n return;\n }\n\n // The other direction: ask the user something and hand the answer back to the caller.\n // sendTo('assistant.0', 'askUser', { question, room|target|source, timeoutMs }, cb)\n if (obj.command === 'askUser') {\n const result = await this.askUser(\n (obj.message || {}) as {\n question?: string;\n text?: string;\n target?: string;\n room?: string;\n source?: string | string[];\n timeoutMs?: number;\n },\n );\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, result, obj.callback);\n }\n return;\n }\n\n // Admin chat: the journal of the last hours (message = { since?: ms }), and wiping it.\n if (obj.command === 'getJournal') {\n const since = Number((obj.message as { since?: number } | undefined)?.since) || 0;\n const result = this.journal?.enabled\n ? { enabled: true, entries: this.journal.list(since) }\n : { enabled: false, entries: [] };\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, result, obj.callback);\n }\n return;\n }\n if (obj.command === 'clearJournal') {\n this.journal?.clear();\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, { ok: true }, 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.ready) {\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 // `journaled`: the admin chat gets this exchange from the journal and must not add it twice.\n this.sendTo(obj.from, obj.command, { answer, journaled: !!this.journal?.enabled }, obj.callback);\n }\n } catch (e) {\n this.log.error(`Assistant error: ${(e as Error).message}`);\n if (obj.callback) {\n this.sendTo(\n obj.from,\n obj.command,\n { error: (e as Error).message, journaled: !!this.journal?.enabled },\n obj.callback,\n );\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 answer(question: string, source = '', origin: JournalOrigin = {}): Promise<string> {\n return this.journal\n ? this.journal.run(question, source, origin, () => this.answerTracked(question, source))\n : this.answerTracked(question, source);\n }\n\n private async answerTracked(question: string, source: string): 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 if (this.lastFollowUp) {\n this.journal?.note({ followUp: true });\n }\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 this.journal?.note({ tier: 'stop' });\n const lang = String(this.config.voiceLanguage || this.language || 'en');\n return lang === 'ru' ? 'Хорошо.' : lang === 'de' ? 'Ok.' : 'Okay.';\n }\n // An open question from `askUser` claims the next utterance of that source as its answer — before\n // any tier sees it, because the NLU would read a bare \"yes\"/\"the kitchen\" as a command of its own.\n // We stay silent (empty reply): whoever asked decides what to say about the answer.\n if (this.pending.has(source)) {\n const asked = this.pending.question(source);\n if (this.pending.deliver(source, question)) {\n this.log.info(`Answer to \"${asked}\" from source '${source || 'any'}': ${question}`);\n this.journal?.note({ tier: 'askReply', detail: asked || undefined });\n return '';\n }\n }\n // A routine is a macro the user wrote down, so it wins over everything that interprets: the NLU\n // would find \"Licht\" in \"Gute Nacht, Licht aus\" and do half of it, and the LLM would cost a\n // round-trip for a decision that has already been made.\n const routine = matchRoutine(question, this.routines);\n if (routine) {\n this.log.info(`Routine '${routine.name}' triggered (source='${source}').`);\n this.journal?.note({ tier: 'routine', detail: routine.name });\n await this.runRoutine(routine, source);\n return routine.reply;\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 // Current weather from the configured adapter — prepended to the user turn of BOTH LLM tiers so\n // \"how's the weather?\" is answered from real data (the local model has no tools and would otherwise\n // invent a forecast; the cloud model saves a get_weather round-trip). Cached, see buildWeatherContext.\n const weather = await this.buildWeatherContext();\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. Without a cloud LLM there is nobody to hand\n // follow-ups to, so the local model takes them too.\n if (this.config.useLocalLlm && this.localLlm && (!history.length || !this.agent)) {\n try {\n // The local model has no tools: without these lines it would invent the weather and guess\n // who is at home.\n const facts = [weather, this.buildPresenceContext()].filter(Boolean).join('\\n\\n');\n const ans = await this.localLlm.ask(facts ? `${facts}\\n\\n${question}` : question);\n if (ans && !isHandoff(ans)) {\n this.log.info(`Answered by local LLM (source='${source}').`);\n this.journal?.note({ tier: 'localLlm', detail: this.localLlmName() });\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 // Provider \"none\": no tier further down. Say so instead of failing — over voice an error is\n // read out as a technical message.\n this.log.info(`No local tier could answer and no LLM provider is configured (source='${source}').`);\n this.journal?.note({ tier: 'none' });\n return this.localOnlyFallback();\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 || 'auto'}] (source='${source}', context=${history.length} turn(s)${mem ? ', memory' : ''}${weather ? ', weather' : ''}${this.presence?.configured ? ', presence' : ''}) — running tool loop…`,\n );\n // Prepend the current date/time (and the weather line, if a source is configured) to the user turn —\n // cache-safe, see buildTimeContext. The stored history keeps the untouched question.\n const questionForLlm = [this.buildTimeContext(), weather, question].filter(Boolean).join('\\n\\n');\n this.journal?.note({\n tier: 'cloud',\n detail: `${this.config.provider || 'openai'} · ${this.agent.model || 'auto'}`,\n });\n return this.agent.ask(questionForLlm, sys, history);\n }\n\n /** Reply when nothing local understood the request and there is no cloud LLM (provider \"none\"). */\n private localOnlyFallback(): string {\n const lang = String(this.config.voiceLanguage || this.language || 'en');\n if (lang === 'ru') {\n return 'Извини, этого я не поняла. Без облачной языковой модели я понимаю только простые команды для устройств, таймеры и будильники.';\n }\n if (lang === 'de') {\n return 'Das habe ich leider nicht verstanden. Ohne Cloud-Sprachmodell verstehe ich nur einfache Gerätebefehle, Timer und Wecker.';\n }\n return \"Sorry, I didn't understand that. Without a cloud language model I only understand simple device commands, timers and alarms.\";\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 /**\n * List a port we listen on in the host's used-resources registry (js-controller ≥ 8), so the admin shows it\n * as occupied when someone configures another instance. `common.declareUsedResources` is set because the\n * controller would otherwise derive a TCP port from `native.port` — ours is the UDP satellite port and is\n * usually not open at all. Nothing to free on shutdown: the host unblocks our entries when the process exits\n * and drops them on the next start. Best effort — the registry is a hint, it must never keep a server down.\n */\n private declarePort(type: 'tcpPort' | 'udpPort', port: number, bind: string, family?: 4): void {\n const api = this as unknown as {\n supportsFeature(feature: string): boolean;\n registerUsedResource?(\n type: 'tcpPort' | 'udpPort',\n data: { port: number; bind?: string; family?: 4 | 6 },\n ): Promise<void>;\n };\n if (!api.registerUsedResource || !api.supportsFeature('CONTROLLER_USED_RESOURCES')) {\n return;\n }\n // A wildcard bind is left out: \"not named\" means every address, which is what 0.0.0.0/:: occupies.\n const data: { port: number; bind?: string; family?: 4 | 6 } = { port };\n if (bind && bind !== '0.0.0.0' && bind !== '::') {\n data.bind = bind;\n }\n if (family) {\n data.family = family;\n }\n api.registerUsedResource(type, data).catch(e =>\n this.log.debug(`could not register ${type} ${port}: ${(e as Error).message}`),\n );\n }\n\n /**\n * Open the conversation journal (shown in the admin chat). Every new or finished entry is mirrored to\n * `journal.last` as JSON — the chat subscribes to it, which is what makes the view live.\n */\n private async setupJournal(): Promise<void> {\n const hours = Math.max(0, Math.min(168, Number(this.config.journalHours ?? 24) || 0));\n const file = path.join(this.instanceDataDir(), 'journal.json');\n // Also in io-package `instanceObjects`; created here for instances that predate it.\n await this.setObjectNotExistsAsync('journal', {\n type: 'channel',\n common: { name: 'Conversation journal' },\n native: {},\n });\n await this.setObjectNotExistsAsync('journal.last', {\n type: 'state',\n common: {\n name: 'Latest journal entry (JSON; written when a request starts and when it is answered)',\n type: 'string',\n role: 'json',\n read: true,\n write: false,\n def: '',\n },\n native: {},\n });\n this.journal = new Journal({\n hours,\n file,\n log: this.log,\n onChange: entry => {\n this.setStateAsync('journal.last', { val: JSON.stringify(entry), ack: true }).catch(() => {});\n },\n });\n if (hours) {\n await this.journal.load();\n } else {\n // Switched off: do not keep what was recorded while it was on.\n await fs.promises.rm(file, { force: true }).catch(() => {});\n }\n }\n\n /** Wrap the MCP connection so every state the pipeline reads or writes lands in the journal entry. */\n private journalMcp(mcp: InProcessMcp): InProcessMcp {\n return {\n listTools: () => mcp.listTools(),\n callTool: (name, args) => {\n this.journal?.stateAccess(name, args);\n return mcp.callTool(name, args);\n },\n close: () => mcp.close(),\n };\n }\n\n /** Wrap an LLM tool so its calls (arguments, result, duration) land in the journal entry. */\n private journalTool(tool: Tool): Tool {\n return {\n ...tool,\n run: async args => {\n const start = Date.now();\n try {\n const result = await tool.run(args);\n this.journal?.tool(tool.name, args, Date.now() - start, result);\n return result;\n } catch (e) {\n this.journal?.tool(tool.name, args, Date.now() - start, undefined, (e as Error).message);\n throw e;\n }\n },\n };\n }\n\n /** Short name of the local model for the journal (\"qwen2.5-1.5b-instruct-q4_k_m\"). */\n private localLlmName(): string {\n const url = (this.config.localLlmModelUrl || '').trim() || DEFAULT_LOCAL_MODEL_URL;\n return (url.split(/[/\\\\]/).pop() || url).replace(/\\?.*$/, '').replace(/\\.gguf$/i, '');\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 /**\n * Run the rule-based NLU; returns a response string if it produced executable intents, else null.\n * A combined command (\"Schalte A an und setze B auf 30 %\", \"Schalte A und B an\") yields several\n * intents: they are all checked up front and only then executed in order, so an utterance is never\n * half-executed here and then handed to the LLM, which would repeat the parts already done.\n */\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 intents = new Nlu(rooms, devices, this.getNluAliases()).parseAll(question);\n if (!intents.length || !intents.every(i => this.canExecuteNlu(i, devices.length))) {\n return null; // nothing matched, or one part cannot run here → let the LLM answer the whole thing\n }\n this.journal?.note({ tier: 'nlu', detail: intents.map(i => i.action).join(' + ') });\n const answers: string[] = [];\n let failed = false;\n for (const intent of intents) {\n try {\n answers.push(await this.executeNluIntent(intent, source));\n } catch (e) {\n failed = true;\n // Nothing executed yet → hand the whole utterance to the LLM. Afterwards a state has already\n // been written and the LLM would repeat it, so report the failed part instead of bailing out.\n if (!answers.length) {\n throw e;\n }\n this.log.warn(`NLU intent '${intent.action}' failed: ${(e as Error).message}`);\n answers.push(this.nluFailureText(intent));\n }\n }\n if (intents.length > 1) {\n this.log.debug(`NLU handled a combined command (${intents.length} parts).`);\n }\n const answer = answers.filter(Boolean).join(' ');\n // A switch command that worked needs no sentence: a beep says the same thing a second earlier.\n // Only for voice (a chat reads its answer), only for control intents (a query's answer IS the\n // information), and only when nothing failed (an error has to be spoken).\n if (\n this.config.confirmWithTone &&\n answer &&\n !failed &&\n intents.every(i => CONTROL_ACTIONS.has(i.action)) &&\n (await this.playConfirmationTone(source))\n ) {\n this.log.debug(`NLU confirmed with a tone instead of \"${answer}\".`);\n return '';\n }\n return answer;\n }\n\n /**\n * Can this intent run locally at all? Checked for **every** part of a combined command before anything\n * is executed: a missing manager, no known devices or disabled writes send the whole utterance to the\n * LLM (which can explain why) instead of silently doing nothing — or only half of it.\n */\n private canExecuteNlu(intent: NluIntent, deviceCount: number): boolean {\n switch (intent.action) {\n case 'timerSet':\n case 'timerQuery':\n case 'timerCancel':\n return !!this.timers;\n case 'alarmSet':\n case 'alarmQuery':\n case 'alarmCancel':\n return !!this.alarms;\n case 'timeQuery':\n case 'dateQuery':\n return true;\n default:\n // Device intents; writes additionally require the coarse \"allow control\" toggle.\n return (\n deviceCount > 0 &&\n (!['on', 'off', 'level', 'color'].includes(intent.action) || !!this.config.allowWriteStates)\n );\n }\n }\n\n /** Execute one intent that {@link canExecuteNlu} accepted, and return its spoken answer. */\n private async executeNluIntent(intent: NluIntent, source: string): Promise<string> {\n switch (intent.action) {\n case 'timerSet':\n case 'timerQuery':\n case 'timerCancel':\n return this.executeTimerIntent(intent, source);\n case 'alarmSet':\n case 'alarmQuery':\n case 'alarmCancel':\n return this.executeAlarmIntent(intent, source);\n case 'timeQuery':\n case 'dateQuery':\n return this.executeTimeIntent(intent);\n default:\n return this.executeIntent(intent);\n }\n }\n\n /** Localized \"this part did not work\" sentence for a failed part of a combined command. */\n private nluFailureText(intent: NluIntent): string {\n const lang = String(this.config.voiceLanguage || this.language || 'en');\n const what = intent.device?.name ? ` (${intent.device.name})` : '';\n return lang === 'ru'\n ? `Одну команду${what} выполнить не удалось.`\n : lang === 'de'\n ? `Ein Befehl${what} hat nicht funktioniert.`\n : `One command${what} did not work.`;\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 // Category query (\"how is the air in here\") — same idea, but reports measurements.\n if (intent.action === 'categoryQuery') {\n return this.executeCategoryQuery(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 if (!(await this.writeConfirmed(intent.stateId, intent.value))) {\n return pick(\n `${dev}${where} не ответило.`,\n `${dev}${where} hat nicht reagiert.`,\n `${dev}${where} did not respond.`,\n );\n }\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 /**\n * Answer a question about a kind of measurement: read every device of that kind (optionally in one\n * room) and name the values. One device gives a short sentence, several give a list — \"wie warm ist\n * es überall\" is one question, not five.\n *\n * Air quality additionally gets a word for the number, because an IAQ of 85 means nothing to anyone\n * (the scale and the wording come from the Python original, `core/hannah/iobroker.py` `_iaq_label`).\n */\n private async executeCategoryQuery(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 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(d => d.stateId && acl[d.key]?.read !== false);\n if (!list.length) {\n return pick('Нет подходящих датчиков.', 'Keine passenden Sensoren gefunden.', 'No matching sensors found.');\n }\n\n let states: { id?: string; value?: unknown }[] = [];\n try {\n const res = await mcp.callTool('get_states', { ids: list.map(d => d.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(st => [st.id, st.value]));\n\n const parts: string[] = [];\n for (const device of list) {\n const value = valueById.get(device.stateId);\n if (value === undefined || value === null) {\n continue; // a sensor without a reading adds nothing to a spoken answer\n }\n let unit = '';\n try {\n const obj = await this.getForeignObjectAsync(device.stateId);\n unit = (obj?.common as { unit?: string } | undefined)?.unit || '';\n } catch {\n /* no unit */\n }\n let text = this.describeValue(value, lang, unit);\n if (intent.category === 'airQuality') {\n const label = iaqLabel(value, unit, lang);\n if (label) {\n text = `${text} (${label})`;\n }\n }\n // In one room the room name is already given; across rooms it is the useful half.\n const where = intent.room ? device.name : device.room || device.name;\n parts.push(`${where}: ${text}`);\n }\n if (!parts.length) {\n return pick('Нет данных.', 'Dazu liegen keine Werte vor.', 'There are no readings for that.');\n }\n const where = intent.room ? ` (${intent.room})` : '';\n const heading = CATEGORY_LABELS[intent.category || '']?.[ru ? 'ru' : de ? 'de' : 'en'] || '';\n return `${heading}${where}: ${parts.join(', ')}.`;\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 => {\n this.mirrorTimer(t, 'finished');\n this.onTimerFired(t);\n },\n onChange: list => {\n this.mirrorTimerList(list);\n void this.renderTimers(list).catch(e => this.log.debug(`renderTimers: ${e}`));\n },\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 /**\n * Push the active timer list to the ESPHome satellites, which show a running timer on their own LED\n * ring and ring it themselves (feature flag TIMERS). The device keeps its own copy, so it only needs\n * the transitions: a timer it has not seen is `started`, one that vanished without firing was\n * `cancelled`, and {@link mirrorTimer} reports `finished` from the fire callback.\n *\n * A timer is mirrored to the satellite it was set from, or broadcast when it came from elsewhere\n * (chat, telegram, a script) — otherwise setting a timer by text would leave every speaker silent.\n */\n private mirrorTimerList(list: TimerInfo[]): void {\n if (!this.esphome) {\n return;\n }\n const live = new Map(list.map(t => [t.id, t]));\n for (const [id, previous] of this.mirroredTimers) {\n if (!live.has(id)) {\n this.mirrorTimer(previous, 'cancelled');\n }\n }\n for (const timer of list) {\n this.mirrorTimer(timer, this.mirroredTimers.has(timer.id) ? 'updated' : 'started');\n }\n this.mirroredTimers = live;\n }\n\n /** Send one timer transition to the satellite it belongs to (or all, when its origin is not one). */\n private mirrorTimer(timer: TimerInfo, type: TimerEvent['type']): void {\n if (!this.esphome) {\n return;\n }\n const known = this.esphome.devices();\n const target = known.includes(timer.source) ? timer.source : null;\n const event: TimerEvent = {\n type,\n id: timer.id,\n name: timer.label || '',\n totalSeconds: timer.duration,\n secondsLeft: Math.max(0, Math.round((timer.fireAt - Date.now()) / 1000)),\n active: type === 'started' || type === 'updated',\n };\n this.esphome.timerEvent(target, event);\n if (type === 'cancelled' || type === 'finished') {\n this.mirroredTimers.delete(timer.id);\n }\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 /**\n * Resolve an announcement target to satellite state ids: `null` means every satellite (an empty name\n * or `all`), an empty array means the name is unknown — the caller decides whether that is an error\n * (`askUser`) or a warning (an announcement).\n *\n * A concrete satellite or room wins over a configured group of the same name, so naming a group after\n * a room can never make that room's speaker unreachable (the rule comes from the Python original,\n * `core/main.py:717`).\n */\n private resolveTargets(target: string | null | undefined): string[] | null {\n if (isBroadcast(target)) {\n return null;\n }\n const wanted = String(target).trim();\n const direct = this.resolveSatelliteId(wanted);\n if (direct) {\n return [direct];\n }\n const group = findTarget(wanted, this.announceTargets);\n if (!group) {\n return [];\n }\n const ids = [...new Set(group.members.map(m => this.resolveSatelliteId(m)).filter((id): id is string => !!id))];\n if (!ids.length) {\n this.log.warn(`Target '${group.name}' has no known satellite among: ${group.members.join(', ')}`);\n } else if (ids.length < group.members.length) {\n this.log.debug(`Target '${group.name}' → ${ids.join(', ')} (some members are not known satellites)`);\n }\n return ids;\n }\n\n /**\n * Resolve what a caller named — a satellite state id (`satellites.kitchen`, `kitchen`), a room name or\n * a device name — to a known satellite state id, or null if we have never seen it. Rooms resolve like\n * ids because a satellite's state id *is* its sanitised room name (see {@link satelliteStateId}).\n */\n private resolveSatelliteId(nameOrId: string): string | null {\n const raw = (nameOrId || '').trim();\n if (!raw) {\n return null;\n }\n const bare = raw.replace(`${this.namespace}.`, '').replace(/^satellites\\./, '');\n const id = this.satelliteStateId(bare, '');\n if (this.satDeviceById.has(id) || this.nativeSatFrom.has(id)) {\n return id;\n }\n // Not an id — maybe the device name behind one.\n return this.announceTargetForSource(raw);\n }\n\n /**\n * Ask the user something and wait for the answer: speak the question on the target satellite(s), have\n * them re-open the microphone, and resolve with whatever is said next there — the utterance is routed\n * to the caller instead of to the NLU/LLM (see {@link PendingQuestions}).\n *\n * `target`/`room` pick a satellite (omit both → every satellite, first answer wins). `source` instead\n * arms a text channel (e.g. `'chat'`, `'telegram:Max'`) without speaking anything: there the caller\n * sends the question itself and we only claim the reply.\n *\n * This is what the proactive triggers (roadmap A2) will use, and it is available to scripts:\n * `sendTo('assistant.0', 'askUser', { question: 'Fenster schließen?', room: 'Küche' }, cb)`.\n */\n private async askUser(msg: {\n question?: string;\n text?: string;\n target?: string;\n room?: string;\n source?: string | string[];\n timeoutMs?: number;\n }): Promise<{ question?: string; answer?: string; timeout?: boolean; error?: string }> {\n const question = String(msg.question ?? msg.text ?? '').trim();\n if (!question) {\n return { error: 'no question provided' };\n }\n const timeoutMs = Math.max(1000, Number(msg.timeoutMs) || ASK_TIMEOUT_MS);\n\n // Text channel: arm the named sources only — the caller does its own output.\n const sources = (Array.isArray(msg.source) ? msg.source : msg.source ? [msg.source] : [])\n .map(s => String(s).trim())\n .filter(Boolean);\n if (sources.length) {\n this.log.info(`askUser (waiting on ${sources.join(', ')}, ${timeoutMs} ms): ${question}`);\n const answer = await this.pending.ask(sources, question, timeoutMs);\n return answer === null ? { question, timeout: true } : { question, answer };\n }\n\n // Voice: resolve the target before arming, so a typo doesn't leave a question hanging. A group\n // or a person resolves to several satellites — the question is asked on all of them and the\n // first answer counts, which is what asking a room full of speakers means.\n const target = (msg.target || msg.room || '').trim();\n const targetIds = this.resolveTargets(target);\n if (targetIds && !targetIds.length) {\n return { error: `unknown satellite, room or group '${target}'` };\n }\n const keys = targetIds ? targetIds.map(id => this.satDeviceById.get(id) || id) : [ANY_SOURCE];\n this.log.info(\n `askUser → ${targetIds ? targetIds.join(', ') : 'all satellites'} (${timeoutMs} ms): ${question}`,\n );\n if (!(await this.announceToSatellites(question, target || null, { listen: true }))) {\n return { error: 'question not asked — no satellite reachable' };\n }\n // Armed only now, on purpose: the answer cannot arrive before the device has played the question,\n // so arming earlier would just risk claiming an utterance that was never meant as the answer.\n const answer = await this.pending.ask(keys, question, timeoutMs);\n if (answer === null) {\n this.log.info(`askUser: no answer within ${timeoutMs} ms.`);\n return { question, timeout: true };\n }\n return { question, answer };\n }\n\n /**\n * Wait for the device to confirm a write, if the user asked for that (`verifyWrites`). ioBroker's\n * convention is that a command is written with `ack:false` and the device echoes the value back with\n * `ack:true` once it really happened — so without this check the assistant reports success for a\n * lamp that never answered.\n *\n * Polled rather than subscribed: a one-off poll of one state is cheap, while a temporary\n * subscription would have to be registered, routed through `onStateChange` and torn down again for\n * every single command. Returns true when it is confirmed — and also when verification is switched\n * off or impossible, because a check that cannot run must not turn into a false alarm.\n */\n private async writeConfirmed(stateId: string | undefined, expected: unknown): Promise<boolean> {\n if (!this.config.verifyWrites || !stateId) {\n return true;\n }\n const deadline = Date.now() + ACK_TIMEOUT_MS;\n let last: ioBroker.State | null | undefined;\n while (Date.now() < deadline) {\n await this.delay(ACK_POLL_MS);\n last = await this.getForeignStateAsync(stateId).catch(() => null);\n if (last?.ack && valuesMatch(last.val, expected)) {\n this.log.debug(`write to ${stateId} confirmed by the device.`);\n return true;\n }\n }\n this.log.warn(\n `No confirmation for ${stateId} within ${ACK_TIMEOUT_MS} ms ` +\n `(last: ${JSON.stringify(last?.val)}, ack=${String(last?.ack)}). ` +\n 'If this device never acknowledges, switch \"Verify device feedback\" off.',\n );\n return false;\n }\n\n /**\n * Play the confirmation beep on the satellite a command came from. Returns false when there is nowhere\n * to play it (a text channel, or no satellite reachable) — the caller then speaks the reply instead,\n * because a confirmation nobody hears is worse than one that costs a TTS call.\n */\n private async playConfirmationTone(source: string): Promise<boolean> {\n const target = this.announceTargetForSource(source);\n if (!target) {\n return false; // chat/telegram/unknown origin: there is no speaker to beep on\n }\n const { pcm, sampleRate } = confirmationTone();\n // Priority: this is the answer to something the user just asked for, not an unsolicited noise.\n const delivered = await this.deliverPcm(pcm, sampleRate, target, true);\n return delivered > 0;\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 // ── Announcements by name (roadmap B2) ──────────────────────────────────\n\n /**\n * Tool that lets the model speak somewhere instead of answering: \"tell Denis dinner is ready\", \"let\n * everyone upstairs know\". Without it a model can read and switch states but has no way to make a\n * speaker say something, so the configured groups and people would only be reachable from scripts.\n *\n * The configured names go into the description, because the model cannot discover them otherwise.\n */\n private buildAnnounceTool(): Tool {\n const named = describeTargets(this.announceTargets);\n return {\n name: 'announce',\n description:\n `Speak a message out loud on a voice satellite — use it when the user asks you to tell ` +\n `somebody something, or to announce something in a room. Not for answering the user: your ` +\n `normal reply is already spoken. \"target\" is a room, a satellite name${\n named ? `, or one of the configured ${named}` : ''\n }; leave it out to announce everywhere.`,\n parameters: {\n type: 'object',\n properties: {\n text: { type: 'string', description: 'What to say, as one spoken sentence' },\n target: { type: 'string', description: 'Room, satellite, group or person (empty = all)' },\n },\n required: ['text'],\n additionalProperties: false,\n },\n run: async (args): Promise<string> => {\n // The arguments come from the model, so a non-string is simply not a text.\n const text = typeof args.text === 'string' ? args.text.trim() : '';\n if (!text) {\n return JSON.stringify({ ok: false, error: 'no text given' });\n }\n const target = typeof args.target === 'string' ? args.target.trim() : '';\n const spoken = await this.announceToSatellites(text, target || null);\n return spoken\n ? JSON.stringify({ ok: true, data: { spoken } })\n : JSON.stringify({\n ok: false,\n error: target\n ? `nothing was played — '${target}' is no known satellite, room or group, or it is offline`\n : 'nothing was played — no satellite is reachable',\n });\n },\n };\n }\n\n // ── Presence: who is at home (roadmap B1) ───────────────────────────────\n\n /**\n * Build the presence tracker from the configured states, subscribe to them and mirror the result into\n * `presence.*`. The values are read once up front, because a presence state only reports when it\n * changes — without that, the assistant would believe nobody is home until the first person moves.\n */\n private async setupPresence(): Promise<void> {\n const entries = parsePresenceRows(this.config.presence);\n this.presence = new PresenceTracker({\n entries,\n log: this.log,\n onChange: list => void this.renderPresence(list).catch(e => this.log.debug(`renderPresence: ${e}`)),\n onArrival: who => {\n this.setStateAsync('presence.lastArrival', { val: who.name, ack: true }).catch(() => {});\n },\n onDeparture: who => {\n this.setStateAsync('presence.lastDeparture', { val: who.name, ack: true }).catch(() => {});\n },\n });\n if (!entries.length) {\n return;\n }\n for (const id of this.presence.stateIds()) {\n await this.subscribeForeignStatesAsync(id).catch(e =>\n this.log.warn(`presence: cannot watch '${id}': ${(e as Error).message}`),\n );\n const st = await this.getForeignStateAsync(id).catch(() => null);\n this.presence.update(id, st?.val ?? null);\n }\n await this.renderPresence(this.presence.list());\n this.log.info(\n `Presence: ${entries.length} source(s) configured, ${this.presence.home().length} at home right now.`,\n );\n }\n\n /** Mirror who is at home into `presence.{anyoneHome,count,list}`. */\n private async renderPresence(list: PresenceInfo[]): Promise<void> {\n const home = list.filter(p => p.home === true && p.kind !== 'pet');\n await this.setStateAsync('presence.anyoneHome', { val: home.length > 0, ack: true });\n await this.setStateAsync('presence.count', { val: home.length, ack: true });\n await this.setStateAsync('presence.list', { val: JSON.stringify(list), ack: true });\n }\n\n /**\n * Who is at home, as one line for the user turn — never for the (prompt-cached) system prompt: it\n * changes with every arrival and would bust the cache, device list included. Empty when no presence\n * source is configured or nothing is known yet.\n */\n private buildPresenceContext(): string {\n if (!this.presence?.configured) {\n return '';\n }\n return buildPresencePrompt(this.presence.list(), String(this.config.voiceLanguage || this.language || 'en'));\n }\n\n /**\n * Should an announcement that asked to be spoken only to an occupied house be held back? With no\n * presence source configured the answer is no — \"nobody configured\" must not read as \"nobody home\",\n * or the feature would silence every announcement the moment someone ticks the box.\n */\n private emptyHouse(): boolean {\n return this.presence?.configured === true && !this.presence.anyoneHome();\n }\n\n // ── System notifications (roadmap A3) ───────────────────────────────────\n\n /**\n * Speak a system notification. The text is cleaned of ioBroker's origin prefixes and — unless the\n * severity is `direct` or rewording is switched off — reworded by the LLM into one spoken sentence\n * with a tone matching the severity, because the raw texts are written for a log viewer.\n *\n * An `alert` is delivered as a **priority** announcement, so it is heard even on a satellite set to\n * Do-Not-Disturb; everything else respects DND. Returns how many channels it reached.\n */\n private async notify(\n raw: string,\n severity: Severity,\n target: string | null = null,\n onlyWhenHome = false,\n ): Promise<number> {\n const clean = cleanupNotificationText(raw);\n if (!clean) {\n return 0;\n }\n let text = clean;\n if (severity !== 'direct' && this.config.notifyRephrase !== false && this.agent) {\n text = await this.agent.rewordNotification(\n clean,\n toneFor(severity),\n this.config.voiceLanguage || this.language || '',\n this.config.systemPrompt,\n );\n }\n this.log.info(`Notification (${severity}): ${text}`);\n this.setStateAsync('notify.last', { val: text, ack: true }).catch(() => {});\n return this.announceToSatellites(text, target, { priority: bypassesDnd(severity), onlyWhenHome });\n }\n\n /**\n * Handle a notification routed here by the ioBroker notification-manager (`sendNotification` message,\n * advertised through `common.supportedMessages.notifications`). Answers `{ sent }`, which tells the\n * manager whether it may mark the notification as handled — so we only claim it when it was actually\n * spoken somewhere.\n *\n * The payload shape belongs to the notification-manager and is parsed defensively\n * ({@link flattenNotification}): a changed field degrades the spoken sentence, it never throws.\n */\n private async handleSystemNotification(message: unknown): Promise<{ sent: boolean }> {\n const flat = flattenNotification(message, String(this.config.voiceLanguage || this.language || 'en'));\n if (!flat.text) {\n this.log.warn('Notification from the notification-manager had nothing to speak.');\n return { sent: false };\n }\n this.log.debug(`Notification (${flat.severity}) from category '${flat.category}': ${flat.text}`);\n const delivered = await this.notify(flat.text, flat.severity);\n return { sent: delivered > 0 };\n }\n\n // ── Proactive triggers (roadmap A2) ─────────────────────────────────────\n\n /**\n * Build the trigger engine from the configured definitions, mirror it into `triggers.*` and subscribe\n * to exactly the foreign states the conditions reference — nothing broader, because a wildcard\n * subscription on a busy system would wake this adapter for every state in the house.\n */\n private async setupTriggers(): Promise<void> {\n this.triggers = new TriggerEngine({\n now: () => Date.now(),\n log: this.log,\n getState: async id => {\n const st = await this.getForeignStateAsync(id).catch(() => null);\n return st?.val ?? undefined;\n },\n execute: def => this.executeTrigger(def),\n onChange: status => void this.renderTriggers(status).catch(e => this.log.debug(`renderTriggers: ${e}`)),\n });\n this.subscribeStates('triggers.enabled');\n this.subscribeStates('triggers.items.*');\n // Per-trigger objects are rebuilt from the configuration, so drop whatever a previous run left.\n await this.delObjectAsync('triggers.items', { recursive: true }).catch(() => {});\n this.triggerObjIds.clear();\n\n const master = await this.getStateAsync('triggers.enabled');\n this.triggersEnabled = master?.val !== false;\n const persisted = await this.readTriggerStatus();\n this.triggers.load(this.getTriggerDefs());\n if (persisted.length) {\n this.triggers.restore(persisted);\n }\n await this.syncTriggerSubscriptions();\n // Remember the current values before the first change arrives, so a device that re-reports an\n // unchanged value right after the start does not look like a transition.\n await this.triggers.prime();\n const n = this.triggers.list().length;\n if (n) {\n this.log.info(\n `Triggers: ${n} loaded, watching ${this.triggerStateIds.size} state(s)${this.triggersEnabled ? '' : ' — all suppressed by triggers.enabled'}.`,\n );\n }\n }\n\n /** The configured triggers, with the table's JSON columns parsed (see {@link parseTriggerRows}). */\n private getTriggerDefs(): TriggerDef[] {\n return parseTriggerRows(this.config.triggers, {\n rephraseDefault: this.config.triggerRephrase === true,\n warn: message => this.log.warn(message),\n });\n }\n\n /** Subscribe to the states the loaded triggers watch, and drop subscriptions nothing watches any more. */\n private async syncTriggerSubscriptions(): Promise<void> {\n const wanted = new Set(this.triggers?.stateIds() ?? []);\n // A presence source may be the same state a trigger watches — dropping the subscription here would\n // silently stop the presence updates too.\n const keep = new Set(this.presence?.stateIds() ?? []);\n for (const id of [...this.triggerStateIds]) {\n if (!wanted.has(id)) {\n if (!keep.has(id)) {\n await this.unsubscribeForeignStatesAsync(id).catch(() => {});\n }\n this.triggerStateIds.delete(id);\n }\n }\n for (const id of wanted) {\n if (!this.triggerStateIds.has(id)) {\n await this.subscribeForeignStatesAsync(id).catch(e =>\n this.log.warn(`trigger: cannot watch '${id}': ${(e as Error).message}`),\n );\n this.triggerStateIds.add(id);\n }\n }\n }\n\n /** Live status (enabled flag, last fire) persisted in `triggers.list`, so a restart keeps both. */\n private async readTriggerStatus(): Promise<TriggerStatus[]> {\n try {\n const st = await this.getStateAsync('triggers.list');\n if (typeof st?.val === 'string' && st.val) {\n const arr = JSON.parse(st.val);\n return Array.isArray(arr) ? (arr as TriggerStatus[]) : [];\n }\n } catch (e) {\n this.log.debug(`readTriggerStatus failed: ${(e as Error).message}`);\n }\n return [];\n }\n\n /** Mirror the trigger status into the summary states and the per-trigger `triggers.items.<id>` objects. */\n private async renderTriggers(status: TriggerStatus[]): Promise<void> {\n await this.setStateAsync('triggers.count', { val: status.length, ack: true });\n await this.setStateAsync('triggers.list', { val: JSON.stringify(status), ack: true });\n\n const wanted = new Set(status.map(t => t.id));\n for (const id of [...this.triggerObjIds]) {\n if (!wanted.has(id)) {\n await this.delObjectAsync(`triggers.items.${id}`, { recursive: true }).catch(() => {});\n this.triggerObjIds.delete(id);\n }\n }\n if (status.length) {\n await this.setObjectNotExistsAsync('triggers.items', {\n type: 'channel',\n common: { name: 'Triggers' },\n native: {},\n });\n }\n for (const t of status) {\n await this.ensureTriggerObject(t);\n }\n }\n\n /** Create (once) and update the `triggers.items.<id>.*` states for a single trigger. */\n private async ensureTriggerObject(t: TriggerStatus): Promise<void> {\n const base = `triggers.items.${t.id}`;\n if (!this.triggerObjIds.has(t.id)) {\n await this.setObjectNotExistsAsync(base, {\n type: 'channel',\n common: { name: t.name || t.id },\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('name', { name: 'Name', type: 'string', role: 'text', read: true, write: false });\n await mk('lastFired', { name: 'Last fired', type: 'number', role: 'value.time', read: true, write: false });\n await mk('nextFireAt', {\n name: 'Next scheduled fire (time triggers)',\n type: 'number',\n role: 'value.time',\n read: true,\n write: false,\n });\n await mk('pendingUntil', {\n name: 'Pending delay runs at (0 = nothing pending)',\n type: 'number',\n role: 'value.time',\n read: true,\n write: false,\n });\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('fire', {\n name: 'Run this trigger now (ignores cooldown and delay)',\n type: 'boolean',\n role: 'button',\n read: false,\n write: true,\n def: false,\n });\n this.triggerObjIds.add(t.id);\n }\n await this.setStateAsync(`${base}.name`, { val: t.name, ack: true });\n await this.setStateAsync(`${base}.lastFired`, { val: t.lastFired, ack: true });\n await this.setStateAsync(`${base}.nextFireAt`, { val: t.nextFireAt, ack: true });\n await this.setStateAsync(`${base}.pendingUntil`, { val: t.pendingUntil, ack: true });\n await this.setStateAsync(`${base}.enabled`, { val: t.enabled, ack: true });\n }\n\n /**\n * Run a trigger: either ask the user and act on the answer, or run its actions. The master switch\n * (`triggers.enabled`) is checked here rather than in the engine, so the schedule keeps running and\n * only the visible/audible effect is suppressed.\n */\n private async executeTrigger(def: TriggerDef): Promise<void> {\n if (!this.triggersEnabled) {\n this.log.debug(`trigger '${def.id}' suppressed — triggers.enabled is off`);\n return;\n }\n this.setStateAsync('triggers.lastFired', { val: def.name || def.id, ack: true }).catch(() => {});\n if (def.ask) {\n await this.askTrigger(def);\n return;\n }\n for (const action of effectiveActions(def)) {\n await this.runTriggerAction(def, action);\n }\n }\n\n /**\n * Where a trigger speaks or asks. Empty (or Hannah's `all`, which people copy from its examples) means\n * every satellite; a configured room we do not know is worth a warning, because announcing everywhere\n * instead of in one room is the kind of surprise that should not stay silent in the log.\n */\n private triggerTarget(def: TriggerDef, room: string | undefined): string | null {\n if (isBroadcast(room)) {\n return null;\n }\n const wanted = String(room).trim();\n const ids = this.resolveTargets(wanted);\n if (ids && !ids.length) {\n this.log.warn(`trigger '${def.id}': '${wanted}' is no known satellite, room or group — using all of them`);\n return null;\n }\n return wanted;\n }\n\n /** Ask the trigger's question, then let the first matching response rule decide what happens. */\n private async askTrigger(def: TriggerDef): Promise<void> {\n const question = await this.triggerText(def, def.ask || '');\n const target = this.triggerTarget(def, def.room);\n const result = await this.askUser({ question, target: target || undefined });\n if (result.error) {\n this.log.warn(`trigger '${def.id}': could not ask — ${result.error}`);\n return;\n }\n if (result.timeout || !result.answer) {\n this.log.info(`trigger '${def.id}': no answer — nothing done`);\n return;\n }\n const rules = def.onResponse || [];\n let fallback: TriggerResponseRule | undefined;\n for (const rule of rules) {\n const want = (rule.match || '').trim();\n if (!want) {\n fallback ??= rule; // a rule without a category is the \"didn't understand\" case\n continue;\n }\n if (!this.agent) {\n this.log.warn(`trigger '${def.id}': no LLM to match the answer against '${want}'`);\n break;\n }\n if (await this.agent.classify(result.answer, want)) {\n this.log.info(`trigger '${def.id}': answer matched '${want}'`);\n await this.runTriggerAction(def, rule);\n return;\n }\n }\n if (fallback) {\n await this.runTriggerAction(def, fallback);\n } else {\n this.log.info(`trigger '${def.id}': answer \"${result.answer}\" matched no rule`);\n }\n }\n\n /** Speak a trigger's `say` and/or write its `setState` — shared by the actions and the response rules. */\n private async runTriggerAction(\n def: TriggerDef,\n action: TriggerAction | TriggerResponseRule,\n fallbackTarget: string | null = null,\n ): Promise<void> {\n const say = (action.say || '').trim();\n if (say) {\n const room = 'room' in action ? action.room : def.room;\n // A routine speaks where it was asked for, unless the action names a room of its own.\n const target = this.triggerTarget(def, room) ?? fallbackTarget;\n await this.announceToSatellites(await this.triggerText(def, say), target);\n }\n const write = action.setState;\n if (write?.id) {\n // Deliberately gated: someone who switched device control off does not expect a trigger to\n // write states behind that setting.\n if (!this.config.allowWriteStates) {\n this.log.warn(\n `trigger '${def.id}': not writing ${write.id} — device control is disabled in the settings`,\n );\n return;\n }\n try {\n await this.setForeignStateAsync(write.id, { val: write.value, ack: false });\n this.journal?.stateAccess('set_state', { id: write.id, value: write.value });\n this.log.info(`trigger '${def.id}': ${write.id} = ${JSON.stringify(write.value)}`);\n } catch (e) {\n this.log.warn(`trigger '${def.id}': cannot write ${write.id}: ${(e as Error).message}`);\n }\n }\n }\n\n /**\n * Run a routine's actions. They are {@link TriggerAction}s, so this borrows the trigger executor — a\n * routine really is a trigger whose condition is a spoken phrase. A failing action is logged and the\n * rest still runs: most of a \"good night\" is better than none of it.\n */\n private async runRoutine(routine: Routine, source: string): Promise<void> {\n const origin = this.announceTargetForSource(source);\n for (const action of routine.actions) {\n try {\n await this.runTriggerAction({ id: `routine:${routine.name}`, when: [] }, action, origin);\n } catch (e) {\n this.log.warn(`Routine '${routine.name}': an action failed — ${(e as Error).message}`);\n }\n }\n }\n\n /** A trigger's text, optionally reworded by the LLM so a recurring announcement doesn't sound canned. */\n private async triggerText(def: TriggerDef, text: string): Promise<string> {\n if (!def.rephrase || !this.agent || !text) {\n return text;\n }\n return this.agent.rephrase(text, this.config.voiceLanguage || this.language || '', this.config.systemPrompt);\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 /**\n * Compact current-weather line for the LLM, prepended to the user turn (never to the prompt-cached\n * system prompt — the values change constantly and would bust the cache, incl. the large device list,\n * on every call). Cached for {@link WEATHER_CTX_TTL}; the cache key carries source + language so a\n * settings change takes effect at once. Returns '' when no source is configured, the adapter has no\n * data yet, or it has no mapper (unknown adapters stay tool-only — a raw state dump is no prompt line).\n */\n private async buildWeatherContext(): Promise<string> {\n const value = (this.config.weatherInstance || '').trim();\n if (!value) {\n return '';\n }\n const lang = String(this.config.voiceLanguage || this.language || 'en');\n const key = `${value}|${lang}`;\n const now = Date.now();\n if (this.weatherCtx && this.weatherCtx.key === key && now - this.weatherCtx.ts < WEATHER_CTX_TTL) {\n return this.weatherCtx.text;\n }\n let text = '';\n try {\n const res = await this.readWeather(value);\n if (res.report) {\n text = buildWeatherPrompt(res.report, lang);\n } else if (res.error) {\n this.log.debug(`Weather context skipped: ${res.error}`);\n }\n } catch (e) {\n this.log.debug(`Weather context failed: ${(e as Error).message}`);\n }\n // Cache the empty result too — a missing/unmapped source must not re-read the tree every request.\n this.weatherCtx = { key, ts: now, text };\n return text;\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 if (provider === 'none') {\n return [];\n }\n const apiKey = effectiveApiKey(\n provider,\n await resolveApiKey(this, cfg, {\n credentialType: msg.credentialType,\n apiKey: msg.apiKey,\n credentialId: msg.credentialId,\n }),\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 if (provider === 'none') {\n return { error: 'No LLM provider selected.' };\n }\n const apiKey = effectiveApiKey(\n provider,\n await resolveApiKey(this, cfg, {\n credentialType: msg.credentialType,\n apiKey: msg.apiKey,\n credentialId: msg.credentialId,\n }),\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 // Resolve open questions with null instead of leaving their callers waiting for a timeout.\n this.pending.cancelAll();\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 this.triggers?.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.esphome?.stop();\n } catch {\n // ignore\n }\n try {\n await this.media?.stop();\n } catch {\n // ignore\n }\n try {\n await this.localLlm?.dispose();\n } catch {\n // ignore\n }\n try {\n await this.journal?.flush();\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"]}
|