iobroker.assistant 1.4.2 → 1.4.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/build/main.js +36 -2
- package/build/main.js.map +1 -1
- package/io-package.json +14 -14
- package/package.json +1 -1
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';\nimport { AsyncLocalStorage } from 'node:async_hooks';\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 mentionsScript,\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 buildWeatherAnswer,\n trimReport,\n type WeatherReport,\n type StateValues,\n} from './lib/weather';\nimport { Journal, errorInfo, traceDirFor, type JournalOrigin } from './lib/journal';\nimport { LocalLlm, installLocalLlm, isLocalLlmInstalled, isHandoff, DEFAULT_LOCAL_MODEL_URL } from './lib/localLlm';\nimport { resolveApiKey, resolveVoiceCredentials, type LlmKey } 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 directYouTubeTarget,\n findPlayer,\n isNamedChannel,\n isPowerOn,\n parsePlayerRows,\n pickDevice,\n parseYouTubeCommand,\n pickBest,\n searchYouTube,\n spokenTitle,\n type YouTubeDevice,\n type YouTubeHit,\n type YouTubeKind,\n type YouTubePlayer,\n youtubeReply,\n} from './lib/youtube';\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 {\n WAKE_WORD_DIR,\n WAKE_WORD_ID_RE,\n WAKE_WORD_URL_PREFIX,\n loadWakeWord,\n microModelProblem,\n prepareWakeWord,\n type CustomWakeWord,\n} from './lib/voice/wakeWords';\nimport { confirmationTone } from './lib/voice/tone';\nimport {\n createSttEngine,\n createTtsEngine,\n listVoices,\n listSttModels,\n listTtsModels,\n type EngineContext,\n type VoiceCredentials,\n type SpeechProvider,\n} from './lib/voice/engines';\nimport { pcmFromResponse } from './lib/voice/openrouter';\nimport { MAX_TTS_CHARS, parseTtsMaxChars, spokenLengthHint } from './lib/voice/ttsCache';\nimport { CaptureStore, type DiscardedCapture } from './lib/voice/captures';\nimport { PiAgentHarness, PI_AGENT_TIMEOUT_SEC, composeInstructions } from './lib/piAgent';\nimport {\n SYSTEM_AI_ID,\n readSystemAi,\n resolveLlm,\n resolveSystemLlm,\n systemAiFingerprint,\n systemAiSelection,\n usesSystemAi,\n type ResolvedLlm,\n} from './lib/systemAi';\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 * How long the NLU device model stays valid. Building it costs a `list_devices` plus a name lookup per\n * device, and one spoken command needs it up to three times (STT hints, NLU, the cloud device list).\n * Enum and name changes drop it at once (see {@link ListCache.onClear}); the TTL only catches devices\n * that were added or renamed elsewhere.\n */\nconst NLU_DEVICES_TTL_MS = 60_000;\n\n/**\n * How long a question of the cloud model about a script keeps the next request of that source with the cloud model\n * (the reply, e.g. \"the kitchen light, every hour\", says nothing about a script). As long as pi-agent waits for a\n * confirmation by text.\n */\nconst SCRIPT_TOPIC_MS = 2 * 60_000;\n\n/** Why a request skips the local tiers: it names a script, or it answers a question about one. */\ntype CloudOnly = 'script' | 'scriptReply' | null;\n\n/** Default for `localLlmTimeoutSec`: after this the local model is stopped and the next tier answers. */\nconst LOCAL_LLM_TIMEOUT_SEC = 15;\n/**\n * Answer length cap of the local model. It answers small talk and general questions, mostly by voice, and\n * on a Raspberry Pi every token costs about a fifth of a second — 512 tokens would be a minute and a half.\n */\nconst LOCAL_LLM_MAX_TOKENS = 256;\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/** Fields of the Voice tab the voice test takes from the unsaved form (everything an STT or TTS engine is built from). */\n/** Transports whose answer is spoken by a satellite (and therefore cut at `ttsMaxChars`). */\nconst VOICE_TRANSPORTS: ReadonlySet<string> = new Set(['esphome', 'udp', 'native', 'wyoming']);\n\nconst VOICE_FORM_FIELDS = [\n 'voiceLanguage',\n 'sttProvider',\n 'sttModel',\n 'openrouterSttModel',\n 'voskModel',\n 'ttsProvider',\n 'ttsVoice',\n 'ttsModel',\n 'voiceCredentialType',\n 'voiceApiKey',\n 'voiceCredentialId',\n 'openrouterSpeechKey',\n 'openrouterCredentialId',\n 'openrouterTtsModel',\n 'openrouterVoice',\n 'azureSpeechKey',\n 'azureSpeechRegion',\n 'azureCredentialId',\n 'azureVoice',\n 'awsAccessKeyId',\n 'awsSecretAccessKey',\n 'awsRegion',\n 'awsCredentialId',\n 'awsVoice',\n 'piperVoice',\n];\n/** Of those, the protected ones: the browser never gets them, so an empty value there means \"keep the saved one\" */\nconst VOICE_FORM_SECRETS = ['voiceApiKey', 'openrouterSpeechKey', 'azureSpeechKey', 'awsSecretAccessKey'];\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/** How long a TV may take to report \"on\" after it was switched on for YouTube. */\nconst TV_POWER_TIMEOUT_MS = 30_000;\n/** How long youtube-remote may take to acknowledge a play command (it goes through Google's lounge). */\nconst YOUTUBE_ACK_TIMEOUT_MS = 8000;\n/** Pause before the play command is repeated once on a TV that just booted. */\nconst YOUTUBE_RETRY_MS = 5000;\n\n/** Outcome of {@link Assistant.playYouTube}: the reply to speak plus what was found. */\ninterface YouTubePlayResult {\n ok: boolean;\n text: string;\n player?: string;\n hit?: YouTubeHit;\n alternatives?: YouTubeHit[];\n poweringOn?: boolean;\n}\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', 'volumeSet']);\n\n/** An intent in one line for the request trace: \"level Rollo (Büro) = 30\", \"timerSet 300 s\", \"alarmSet 7:05\". */\nfunction describeIntent(intent: NluIntent): string {\n let text = intent.action;\n if (intent.device) {\n text += ` ${intent.device.name}${intent.device.room ? ` (${intent.device.room})` : ''}`;\n } else if (intent.room) {\n text += ` (${intent.room})`;\n }\n if (intent.value !== undefined) {\n text += ` = ${JSON.stringify(intent.value)}`;\n } else if (intent.durationSec !== undefined) {\n text += ` ${intent.durationSec} s`;\n } else if (intent.hour !== undefined) {\n text += ` ${intent.hour}:${String(intent.minute ?? 0).padStart(2, '0')}`;\n }\n if (intent.delaySec !== undefined) {\n text += ` in ${intent.delaySec} s`;\n } else if (intent.at) {\n text += ` at ${intent.at.day ? `+${intent.at.day}d ` : ''}${intent.at.hour}:${String(intent.at.minute).padStart(2, '0')}`;\n }\n return text;\n}\n\n/** A device command for later (\"in 2 Stunden\", \"um 22 Uhr\") — goes into the calendar, not to the device */\nfunction isDeferred(intent: NluIntent): boolean {\n return intent.delaySec !== undefined || !!intent.at;\n}\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 /** Provider \"pi-agent\": the cloud tier is a pi-agent instance instead of {@link agent}. */\n private piAgent: PiAgentHarness | null = null;\n /** The cloud LLM of the instance (own or system-wide settings); `null` without one. */\n private llm: ResolvedLlm | null = null;\n /** What of `system.ai` this instance depends on, while it takes the system-wide AI settings. */\n private systemAiWatch: { fingerprint: string; credentialId: string } | 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 /** The NLU device model of {@link getNluDevices}, shared by all callers (and concurrent requests). */\n private nluDevices: {\n key: string;\n at: number;\n result: Promise<{ rooms: string[]; devices: NluDevice[] }>;\n } | 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 /** Uploaded wake words (`assistant.0/wakewords/`), offered to every ESPHome satellite. */\n private readonly customWakeWords = new Map<string, CustomWakeWord>();\n /** Loads {@link customWakeWords} once from the file storage; later calls wait for the same load. */\n private customWakeWordsLoaded: Promise<void> | 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 /** Satellites whose `volume` state exists and is subscribed (see updateSatelliteVolume). */\n private readonly satVolumeEnsured = new Set<string>();\n /** Native (ioBroker) satellite state-id → sender instance id, so we can push announcements back to it. */\n private readonly nativeSatFrom = new Map<string, string>();\n /** Countdown timers / reminders (roadmap #2); mirrored into `timers.*` states. Null until onReady. */\n private timers: TimerManager | null = null;\n /** Per-timer `timers.items.<id>` channels currently rendered, so we can delete the ones that expire. */\n private readonly timerObjIds = new Set<string>();\n /** Alarms at a fixed clock time (roadmap #2); mirrored into `alarms.*` states. Null until onReady. */\n private alarms: AlarmManager | null = null;\n /** Per-alarm `alarms.items.<id>` channels currently rendered. */\n private readonly alarmObjIds = new Set<string>();\n /** 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 /** YouTube players from the configuration; the first one is the default. */\n private youtubePlayers: YouTubePlayer[] = [];\n /**\n * Where the request being answered came from, for the LLM tools: a tool only gets the model's\n * arguments, but \"play X\" from the bedroom satellite should go to the bedroom TV.\n */\n private readonly requestOrigin = new AsyncLocalStorage<{ source: string; room: string; voice: boolean }>();\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 // Provider \"pi-agent\": the adapter pi-agent is the cloud tier, with its own model, key and tools.\n const harness = provider === 'pi-agent';\n // Provider \"system\" (or no key of its own): provider, model and key of the system-wide AI settings.\n if (!localOnly && !harness && usesSystemAi(cfg)) {\n await this.watchSystemAi();\n }\n const resolved = localOnly || harness ? null : await resolveLlm(this, cfg);\n this.llm = resolved && !('error' in resolved) ? resolved : null;\n // speech of the same vendor reuses the key of the LLM\n const llmKey: LlmKey | null = this.llm ? { provider: this.llm.provider, apiKey: this.llm.apiKey } : null;\n await this.setupJournal();\n\n if (harness && !(cfg.piAgentInstance || '').trim()) {\n this.log.warn(\n 'Provider \"pi-agent\" without an instance — choose the pi-agent instance in the adapter settings.',\n );\n await this.setStateAsync('info.connection', { val: false, ack: true });\n return;\n }\n if (resolved && 'error' in resolved) {\n this.log.warn(resolved.error);\n await this.setStateAsync('info.connection', { val: false, ack: true });\n return;\n }\n if (this.llm?.system) {\n this.log.info(`LLM from the system-wide AI settings: ${this.llm.provider} · ${this.llm.model || 'auto'}`);\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 this.listCache.onClear = () => {\n this.nluDevices = null;\n };\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.calendarInstance || '').trim()) {\n tools.push(...this.buildCalendarTools());\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.youtubePlayers = parsePlayerRows(cfg.youtubePlayers);\n if (this.youtubePlayers.length) {\n // Before the tools are built: their descriptions carry the player names, which an instance\n // row only gets from its device.\n for (const player of this.youtubePlayers) {\n if (!(await this.resolveYouTubePlayer(player))) {\n this.log.warn(`YouTube: ${player.instance} has no paired TV yet — pair one in its settings.`);\n }\n }\n tools.push(...this.buildYouTubeTools());\n this.log.info(`YouTube players: ${this.youtubePlayers.map(p => p.name).join(', ')}.`);\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 (harness) {\n this.piAgent = new PiAgentHarness(\n this,\n cfg.piAgentInstance.trim(),\n Math.max(5, Number(cfg.piAgentTimeoutSec) || PI_AGENT_TIMEOUT_SEC) * 1000,\n );\n } else if (this.llm) {\n this.agent = new LlmAgent({\n provider: this.llm.provider,\n apiKey: this.llm.apiKey,\n model: this.llm.model,\n baseUrl: this.llm.baseUrl,\n systemPrompt: cfg.systemPrompt || '',\n maxTokens: cfg.maxTokens || 1024,\n tools: tools.map(t => this.journalTool(t)),\n log: this.log,\n trace: step => this.journal?.step(step),\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=${this.llm?.provider}, model=${this.agent.model || 'auto'}).`\n : this.piAgent\n ? `Assistant ready (cloud tier: ${this.piAgent.instance}).`\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(llmKey);\n }\n }\n\n if (cfg.wyomingEnabled) {\n await this.startWyoming(llmKey);\n }\n\n if (cfg.esphomeEnabled) {\n await this.startEsphome(llmKey);\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(llmKey: LlmKey | null): Promise<void> {\n const cfg = this.config;\n const creds = await resolveVoiceCredentials(this, cfg, llmKey);\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, audioMs) =>\n this.answer(question, 'wyoming', { transport: 'wyoming', sttMs, audioMs }),\n onSpoken: info => this.reportSpoken('wyoming', info),\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(llmKey: LlmKey | null): 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, llmKey);\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 await this.loadCustomWakeWords();\n for (const word of this.customWakeWords.values()) {\n this.serveWakeWord(word);\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 audioMs: origin.audioMs,\n vad: origin.vad,\n }),\n onSpoken: (device, info) => this.reportSpoken(device, info),\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, device) => this.followUpFor(device, answer),\n onDiscarded: cfg.esphomeSaveCaptures ? capture => this.keepCapture(capture) : undefined,\n externalWakeWords: () =>\n [...this.customWakeWords.values()].map(w => ({\n id: w.id,\n phrase: w.phrase,\n languages: w.languages,\n size: w.size,\n sha256: w.sha256,\n path: `${WAKE_WORD_URL_PREFIX}${w.id}.json`,\n })),\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 openrouter: (cfg.openrouterVoice || '').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 openrouterSttModel: (cfg.openrouterSttModel || '').trim(),\n openrouterTtsModel: (cfg.openrouterTtsModel || '').trim(),\n decodeAudio: audio => this.decodeAudioBufferToPcm(audio),\n ttsMaxChars: parseTtsMaxChars(cfg.ttsMaxChars),\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(llmKey: LlmKey | null): Promise<void> {\n const cfg = this.config;\n const creds = await resolveVoiceCredentials(this, cfg, llmKey);\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, {\n transport: 'udp',\n room: ctx.room,\n sttMs: ctx.sttMs,\n audioMs: ctx.audioMs,\n }),\n onSpoken: (device, info) => this.reportSpoken(device, info),\n expectsFollowUp: (answer, device) => this.followUpFor(device, answer),\n onVolume: (device, room, level) => {\n this.updateSatelliteVolume(device, room, level).catch(e =>\n this.log.debug(`satellite volume update failed: ${(e as Error).message}`),\n );\n },\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 /** A transport synthesised the reply to `source`'s latest request — the journal shows it with that request. */\n private reportSpoken(source: string, info: { ms: number; audioMs: number }): void {\n const cfg = this.config;\n const provider = cfg.ttsProvider || 'openai';\n const voices: Record<string, string | undefined> = {\n openai: cfg.ttsVoice || 'alloy',\n azure: cfg.azureVoice,\n aws: cfg.awsVoice,\n piper: cfg.piperVoice,\n openrouter: cfg.openrouterVoice,\n };\n this.journal?.spoken(source, {\n ...info,\n provider,\n fallback: cfg.ttsFallback || undefined,\n voice: (voices[provider] || '').trim() || undefined,\n });\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 creds = await resolveVoiceCredentials(this, cfg, await this.speechLlmKey());\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 const ms = Math.round((pcm.length / 2 / rate) * 1000);\n this.log.info(\n `Voice Q (${source}): (empty) — speech recognition returned no text for ${ms} ms of audio`,\n );\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 audioMs: Math.round((pcm.length / 2 / rate) * 1000),\n });\n if (!answer) {\n return { text, answer: '' };\n }\n const ttsStart = Date.now();\n const reply = await engines.tts.synthesize(answer, language);\n this.reportSpoken(source, {\n ms: Date.now() - ttsStart,\n audioMs: (reply.pcm.length / 2 / reply.sampleRate) * 1000,\n });\n const listen = this.followUpFor(source, answer);\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 openrouterSpeechKey?: string;\n openrouterCredentialId?: string;\n openrouterTtsModel?: 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 creds = await resolveVoiceCredentials(this, cfg, await this.speechLlmKey());\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 * Mirror the playback volume a UDP satellite reported into `satellites.<id>.volume`. The state only\n * appears for satellites that speak the `volume` message — an older one would never answer a write.\n */\n private async updateSatelliteVolume(device: string, room: string, level: number): Promise<void> {\n const id = await this.ensureSatelliteObjects(device, room);\n const stateId = `satellites.${id}.volume`;\n if (!this.satVolumeEnsured.has(id)) {\n await this.setObjectNotExistsAsync(stateId, {\n type: 'state',\n common: {\n name: 'Playback volume',\n type: 'number',\n role: 'level.volume',\n unit: '%',\n min: 0,\n max: 100,\n read: true,\n write: true,\n },\n native: {},\n });\n this.subscribeStates(stateId);\n this.satVolumeEnsured.add(id);\n }\n await this.setStateAsync(stateId, { val: level, ack: true });\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 // `custom` marks the uploaded ones, so the settings dialog can offer to delete them.\n const words = config.available.map(w => (this.customWakeWords.has(w.id) ? { ...w, custom: true } : w));\n await this.setStateAsync(`${base}.availableWakeWords`, {\n val: JSON.stringify({ max: config.max, words }),\n ack: true,\n });\n }\n\n /** Store for `esphomeSaveCaptures`, in the adapter's file storage (Admin → Files → assistant.N/captures). */\n private captureStore: CaptureStore | null = null;\n\n /** Keep a dropped ESPHome recording for diagnosis (`esphomeSaveCaptures`). Never blocks the voice pipeline. */\n private keepCapture(capture: DiscardedCapture): void {\n this.captureStore ||= new CaptureStore({\n write: async (path, data) => {\n await this.writeFileAsync(this.namespace, path, data);\n },\n list: async dir => {\n try {\n const entries = await this.readDirAsync(this.namespace, dir);\n return entries.filter(e => !e.isDir).map(e => e.file);\n } catch {\n return []; // nothing kept yet\n }\n },\n remove: async path => {\n await this.delFileAsync(this.namespace, path);\n },\n });\n this.captureStore\n .save(capture)\n .then(path => this.log.debug(`ESPHome ${capture.device}: recording kept as ${this.namespace}/${path}`))\n .catch(e => this.log.warn(`Could not keep the recording of ${capture.device}: ${(e as Error).message}`));\n }\n\n /** Read the uploaded wake words (`<instance>/wakewords/<id>.json` + `.tflite`) once. */\n private loadCustomWakeWords(): Promise<void> {\n this.customWakeWordsLoaded ||= (async () => {\n let entries: ioBroker.ReadDirResult[] = [];\n try {\n entries = await this.readDirAsync(this.namespace, WAKE_WORD_DIR);\n } catch {\n return; // nothing uploaded yet\n }\n for (const entry of entries) {\n const id = entry.file.replace(/\\.json$/, '');\n if (entry.isDir || !entry.file.endsWith('.json') || !WAKE_WORD_ID_RE.test(id)) {\n continue;\n }\n try {\n const config = await this.readStoredFile(`${WAKE_WORD_DIR}/${id}.json`, 'utf8');\n const model = await this.readStoredFile(`${WAKE_WORD_DIR}/${id}.tflite`, 'binary');\n const word = loadWakeWord(id, config, model);\n this.customWakeWords.set(id, word);\n // Uploaded before the upload checked the model: keep it, so it can be deleted in the dialog.\n const problem = microModelProblem(model);\n if (problem) {\n this.log.warn(\n `Custom wake word ${word.phrase} (${id}) cannot run on the device: ${problem}. Delete it in the satellite settings.`,\n );\n }\n } catch (e) {\n this.log.warn(`Custom wake word ${id} skipped: ${(e as Error).message}`);\n }\n }\n if (this.customWakeWords.size) {\n this.log.info(\n `Custom wake words: ${[...this.customWakeWords.values()].map(w => `${w.phrase} (${w.id})`).join(', ')}`,\n );\n }\n })();\n return this.customWakeWordsLoaded;\n }\n\n /**\n * Read a file from this instance's file storage as a Buffer. Depending on the backend and the file's\n * type it comes back as a Buffer or a string — `encoding` says how to read the latter.\n */\n private async readStoredFile(name: string, encoding: BufferEncoding): Promise<Buffer> {\n const res = (await this.readFileAsync(this.namespace, name)) as { file?: Buffer | string } | Buffer | string;\n const f = Buffer.isBuffer(res) || typeof res === 'string' ? res : res.file;\n if (f == null) {\n throw new Error(`${name} not found`);\n }\n return Buffer.isBuffer(f) ? f : Buffer.from(f, encoding);\n }\n\n private serveWakeWord(word: CustomWakeWord): void {\n this.media?.serve(`${WAKE_WORD_URL_PREFIX}${word.id}.json`, word.config, 'application/json');\n this.media?.serve(`${WAKE_WORD_URL_PREFIX}${word.id}.tflite`, word.model, 'application/octet-stream');\n }\n\n /**\n * Store an uploaded wake word and offer it to the connected satellites. It shows up in their wake\n * word list right away; a device downloads the model only when it is selected there.\n */\n private async addCustomWakeWord(\n message: Record<string, unknown>,\n ): Promise<{ id: string; phrase: string; languages: string[]; size: number; devices: number }> {\n await this.loadCustomWakeWords();\n const text = (value: unknown): string | undefined => (typeof value === 'string' ? value : undefined);\n const languages = (\n Array.isArray(message.languages)\n ? message.languages.map(String)\n : (text(message.languages) ?? '').split(/[,;\\s]+/)\n ).filter(Boolean);\n const word = prepareWakeWord(\n {\n model: Buffer.from(text(message.model) ?? '', 'base64'),\n fileName: text(message.fileName),\n config:\n message.config && typeof message.config === 'object'\n ? (message.config as Record<string, unknown>)\n : text(message.config),\n phrase: text(message.phrase),\n languages,\n },\n this.config.voiceLanguage || this.language || '',\n );\n if (!this.customWakeWords.has(word.id)) {\n await this.writeFileAsync(this.namespace, `${WAKE_WORD_DIR}/${word.id}.tflite`, word.model);\n await this.writeFileAsync(this.namespace, `${WAKE_WORD_DIR}/${word.id}.json`, word.config);\n this.customWakeWords.set(word.id, word);\n this.serveWakeWord(word);\n this.log.info(`Custom wake word uploaded: ${word.phrase} (${word.id}, ${word.size} bytes)`);\n }\n const devices = this.esphome?.refreshWakeWords() ?? 0;\n return { id: word.id, phrase: word.phrase, languages: word.languages, size: word.size, devices };\n }\n\n /**\n * Remove an uploaded wake word: it is no longer offered or served. A device that already downloaded\n * it keeps its copy — the ESPHome API cannot delete a model from a device.\n */\n private async deleteCustomWakeWord(id: string): Promise<void> {\n await this.loadCustomWakeWords();\n if (!WAKE_WORD_ID_RE.test(id) || !this.customWakeWords.has(id)) {\n throw new Error(`unknown wake word ${id}`);\n }\n for (const ext of ['json', 'tflite']) {\n await this.delFileAsync(this.namespace, `${WAKE_WORD_DIR}/${id}.${ext}`).catch(() => undefined);\n this.media?.unserve(`${WAKE_WORD_URL_PREFIX}${id}.${ext}`);\n }\n this.customWakeWords.delete(id);\n this.esphome?.refreshWakeWords();\n this.log.info(`Custom wake word deleted: ${id}`);\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 if (entity.kind === 'number') {\n // Objects from before float32() kept the raw float noise (step 0.0010000000474974513);\n // the device may also change its range with a firmware update.\n await this.syncNumberRange(id, entity);\n }\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 /** Bring min/max/step of an existing number control in line with what the device announces now. */\n private async syncNumberRange(id: string, entity: EsphomeEntity): Promise<void> {\n const obj = await this.getObjectAsync(id);\n if (!obj || obj.type !== 'state') {\n return;\n }\n const wanted = { min: entity.min, max: entity.max, step: entity.step };\n const common = obj.common;\n if (common.min !== wanted.min || common.max !== wanted.max || common.step !== wanted.step) {\n await this.extendObjectAsync(id, { common: wanted });\n }\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 let val = entity.value as ioBroker.StateValue;\n // The device says how many decimals of a measurement mean something; the rest is noise.\n if (\n entity.kind === 'sensor' &&\n typeof val === 'number' &&\n entity.decimals !== undefined &&\n entity.decimals >= 0\n ) {\n val = Number(val.toFixed(Math.min(entity.decimals, 10)));\n }\n await this.setStateAsync(base, { val, 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 const playMs = (pcm.length / 2 / sampleRate) * 1000;\n allowed.forEach(d => this.voice!.listen(d, playMs));\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 /** Vendor and key of the cloud LLM: speech of the same vendor (OpenAI, OpenRouter) reuses the key. */\n private async speechLlmKey(): Promise<LlmKey | null> {\n const provider = this.config.provider || 'openai';\n const llm =\n this.llm ?? (provider === 'none' || provider === 'pi-agent' ? null : await resolveLlm(this, this.config));\n return llm && !('error' in llm) ? { provider: llm.provider, apiKey: llm.apiKey } : null;\n }\n\n /**\n * Restart when the system-wide AI settings this instance takes change — also when they are still empty, so\n * setting them up in admin starts the instance. The credential is watched too: a new key needs no new id.\n */\n private async watchSystemAi(): Promise<void> {\n const native = await readSystemAi(this);\n const credentialId = systemAiSelection(native)?.credentialId || '';\n this.systemAiWatch = { fingerprint: systemAiFingerprint(native), credentialId };\n await this.subscribeForeignObjectsAsync(SYSTEM_AI_ID);\n if (credentialId) {\n await this.subscribeForeignObjectsAsync(credentialId);\n }\n }\n\n private onObjectChange(id: string, obj: ioBroker.Object | null | undefined): void {\n if (this.systemAiWatch && (id === SYSTEM_AI_ID || id === this.systemAiWatch.credentialId)) {\n // A credential has no fingerprint: a change of it is a new key.\n if (id === SYSTEM_AI_ID && systemAiFingerprint(obj?.native) === this.systemAiWatch.fingerprint) {\n return;\n }\n this.log.info(`The system-wide AI settings changed (${id}) — restarting.`);\n this.systemAiWatch = null;\n this.restart();\n return;\n }\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 // Playback volume of a UDP satellite — not acked here: the satellite reports the level it took.\n const satVolume = id.match(/\\.satellites\\.([^.]+)\\.volume$/);\n if (satVolume) {\n const device = this.satDeviceById.get(satVolume[1]) || satVolume[1];\n if (!this.voice?.volume(device, { level: Number(state.val) })) {\n this.log.warn(`Cannot set the volume of '${device}': it is not a registered UDP satellite.`);\n }\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 openrouterSpeechKey?: string;\n openrouterCredentialId?: string;\n openrouterTtsModel?: string;\n },\n );\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, voices, obj.callback);\n }\n return;\n }\n\n // STT/TTS model dropdowns (Vosk, OpenRouter): suggest model names for the selected provider.\n if (obj.command === 'getSttModels' || obj.command === 'getTtsModels') {\n const msg = (obj.message || {}) as {\n sttProvider?: SpeechProvider;\n ttsProvider?: SpeechProvider;\n language?: string;\n };\n const cfg = this.config;\n const language = msg.language || cfg.voiceLanguage || this.language || '';\n let models: string[] = [];\n try {\n models =\n obj.command === 'getSttModels'\n ? await listSttModels(msg.sttProvider || cfg.sttProvider || 'openai', language)\n : await listTtsModels(msg.ttsProvider || cfg.ttsProvider || 'openai');\n } catch (e) {\n this.log.warn(`${obj.command} failed: ${(e as Error).message}`);\n }\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, models, 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: find and play something on a configured YouTube player, the TV switched on first.\n // message = { query, kind?: 'channel'|'video'|'playlist', player? } → { ok, text, title?, id?, player? }\n // Settings: the \"Player\" column of the YouTube table (selectSendTo).\n if (obj.command === 'getYouTubeInstances') {\n const list = await this.getYouTubeInstances();\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, list, obj.callback);\n }\n return;\n }\n\n if (obj.command === 'playYouTube') {\n const m = (obj.message || {}) as { query?: string; kind?: string; player?: string };\n const kind = m.kind === 'channel' || m.kind === 'playlist' || m.kind === 'video' ? m.kind : 'auto';\n const res = String(m.query || '').trim()\n ? await this.playYouTube(String(m.query).trim(), kind, m.player)\n : { ok: false, text: 'no query given' };\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, this.youtubeResultData(res), 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 // Settings dialog / scripts: own wake words for the ESPHome satellites (microWakeWord models).\n // uploadWakeWord: { model: base64 .tflite, fileName?, config?: JSON text, phrase?, languages? }\n // → { ok, id, phrase, languages, size, devices } | { error }\n // deleteWakeWord: { id } → { ok } | { error }; listWakeWords → { wakeWords: [{id, phrase, …}] }\n if (obj.command === 'uploadWakeWord' || obj.command === 'deleteWakeWord' || obj.command === 'listWakeWords') {\n const m = (obj.message || {}) as Record<string, unknown>;\n let payload: Record<string, unknown>;\n try {\n if (obj.command === 'uploadWakeWord') {\n payload = { ok: true, ...(await this.addCustomWakeWord(m)) };\n } else if (obj.command === 'deleteWakeWord') {\n await this.deleteCustomWakeWord(typeof m.id === 'string' ? m.id : '');\n payload = { ok: true };\n } else {\n await this.loadCustomWakeWords();\n payload = {\n wakeWords: [...this.customWakeWords.values()].map(w => ({\n id: w.id,\n phrase: w.phrase,\n languages: w.languages,\n size: w.size,\n })),\n };\n }\n } catch (e) {\n payload = { error: (e as Error).message };\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 and the voice test of the settings: synthesize to speech (WAV) via the configured TTS engine,\n // or via the unsaved settings of the Voice tab (`config`).\n if (obj.command === 'tts') {\n const { text, language, config } = (obj.message || {}) as {\n text?: string;\n language?: string;\n config?: Record<string, unknown>;\n };\n const cfg = config ? this.withVoiceForm(config) : this.config;\n const result = await this.synthesizeToWav(String(text ?? ''), language, cfg);\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, result, obj.callback);\n }\n return;\n }\n\n // Voice test of the settings: recognize a recording with the (unsaved) speech-to-text settings.\n if (obj.command === 'stt') {\n const result = await this.transcribeForTest(\n (obj.message || {}) as {\n audio?: string;\n format?: string;\n language?: string;\n config?: Record<string, unknown>;\n },\n );\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 // Admin chat debug view: one request with every step of its processing (message = { id }).\n if (obj.command === 'getJournalTrace') {\n const id = String((obj.message as { id?: string } | undefined)?.id || '');\n const entry = this.journal?.get(id);\n const result = entry\n ? { entry, steps: await this.journal!.trace(id) }\n : { error: this.journal?.enabled ? 'unknown request' : 'journal disabled' };\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 const voice = VOICE_TRANSPORTS.has(origin.transport || '');\n return this.requestOrigin.run({ source, room: origin.room || '', voice }, () =>\n this.journal\n ? this.journal.run(question, source, origin, () => {\n this.traceSpeechInput(question, origin);\n return this.answerTracked(question, source);\n })\n : this.answerTracked(question, source),\n );\n }\n\n /** Speech recognition happened before the request: put it at the head of its trace. */\n private traceSpeechInput(question: string, origin: JournalOrigin): void {\n if (origin.sttMs === undefined) {\n return;\n }\n const cfg = this.config;\n const provider = cfg.sttProvider || 'openai';\n const audio = origin.audioMs !== undefined ? `, ${(origin.audioMs / 1000).toFixed(1)} s of audio` : '';\n this.journal?.step({\n stage: 'stt',\n title: `Speech recognition: ${provider}${audio}`,\n ms: origin.sttMs,\n data: {\n provider,\n fallback: cfg.sttFallback || undefined,\n model:\n (provider === 'openrouter' ? cfg.openrouterSttModel : cfg.sttModel || cfg.voskModel || '').trim() ||\n undefined,\n language: cfg.voiceLanguage || this.language || '',\n audioMs: origin.audioMs,\n wakeWord: origin.wakeWord,\n vad: origin.vad,\n transcript: question,\n },\n });\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 if (history.length) {\n this.journal?.step({\n stage: 'context',\n title: `Conversation context: ${history.length} earlier turn(s) of '${source}'`,\n data: history,\n });\n }\n const cloudOnly = this.cloudOnlyReason(question, source);\n const raw = await this.produceAnswer(question, history, source, cloudOnly);\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 keep it per source:\n // two satellites answered at the same time must not hand each other their mic-on.\n const followUp = /\\[\\[LISTEN\\]\\]/i.test(raw);\n this.followUps.set(source, followUp);\n // A script conversation goes on while the cloud model asks back: the reply goes to it as well.\n if (cloudOnly && followUp) {\n this.scriptTopics.set(source, Date.now());\n } else {\n this.scriptTopics.delete(source);\n }\n if (followUp) {\n this.journal?.note({ followUp: true });\n }\n let result = raw.replace(/\\s*\\[\\[(?:LISTEN|DONE)\\]\\]\\s*/gi, ' ').trim();\n // The LLM answers a switch command that worked with [[DONE]] alone (see doneHint): a beep on the satellite\n // instead of a sentence. Where nothing can beep (chat, Telegram), a short word. With more text, that is said.\n let toned = false;\n if (!result && /\\[\\[DONE\\]\\]/i.test(raw)) {\n toned = await this.playConfirmationTone(source);\n if (!toned) {\n result = this.doneText();\n }\n }\n this.journal?.step({\n stage: 'answer',\n title: toned\n ? 'Confirmed with a tone instead of words'\n : result\n ? `Answer: ${result.length} characters${followUp ? ', waits for a reply' : ''}`\n : 'No spoken answer',\n data: { answer: result, raw: raw !== result ? raw : undefined, followUp, tone: toned || undefined },\n });\n if (useCtx && (result || toned)) {\n this.context.add(source, question, result || this.doneText());\n }\n return result;\n }\n\n /**\n * System-prompt instruction for `confirmWithTone`: a switch command that worked is answered with [[DONE]]\n * alone, which becomes a beep on the satellite. Empty when the option (or voice) is off.\n */\n private doneHint(): string {\n if (!this.config.confirmWithTone || !this.config.voiceEnabled) {\n return '';\n }\n const lang = String(this.config.voiceLanguage || this.language || 'en');\n if (lang === 'ru') {\n return 'Если запрос был только командой включить, выключить или установить устройства на значение и всё получилось, ответь только управляющим маркером [[DONE]] (вместо фразы прозвучит короткий сигнал). На вопросы, при ошибках или если нужно что-то сообщить, отвечай как обычно.';\n }\n if (lang === 'de') {\n return 'Wenn die Anfrage nur ein Befehl war, Geräte ein- oder auszuschalten oder auf einen Wert zu stellen, und alles geklappt hat, antworte ausschließlich mit dem Steuer-Marker [[DONE]] (statt eines Satzes ertönt ein kurzer Bestätigungston). Bei Fragen, bei Fehlern oder wenn du etwas mitteilen musst, antworte normal.';\n }\n return 'If the request was only a command to switch devices on or off or to set them to a value, and everything worked, answer with the control marker [[DONE]] alone (a short beep plays instead of a sentence). For questions, errors or when you have something to tell, answer normally.';\n }\n\n /**\n * Length instruction for a request that came in by voice: the answer is cut at `ttsMaxChars` before it is\n * spoken, so the model is asked to stay within it. Empty for text requests (chat, Telegram, scripts) and\n * when the limit is off.\n */\n private spokenLengthHint(): string {\n if (!this.config.voiceEnabled || !this.requestOrigin.getStore()?.voice) {\n return '';\n }\n const limit = parseTtsMaxChars(this.config.ttsMaxChars) ?? MAX_TTS_CHARS;\n return spokenLengthHint(limit, String(this.config.voiceLanguage || this.language || 'en'));\n }\n\n /** What [[DONE]] says where no beep can be played */\n private doneText(): string {\n const lang = String(this.config.voiceLanguage || this.language || 'en');\n return lang === 'ru' ? 'Готово.' : lang === 'de' ? 'Erledigt.' : 'Done.';\n }\n\n /** Per source: whether its last {@link answer} asked the user something (LLM-signalled via [[LISTEN]]). */\n private readonly followUps = new Map<string, boolean>();\n\n /** Per source: when the cloud model last asked back about a script (see {@link cloudOnlyReason}). */\n private readonly scriptTopics = new Map<string, number>();\n\n /**\n * Whether a request skips routines, YouTube, the rule NLU and the local model: when it is about a script, or answers\n * a question the cloud model asked about one. Writing or changing a script is work for the cloud model, and the\n * rules would read its details as commands of their own (\"… that switches the kitchen light every hour\" was answered\n * with the time). Without a cloud tier the local ones are all there is, so nothing is skipped.\n */\n private cloudOnlyReason(question: string, source: string): CloudOnly {\n if (!this.agent && !this.piAgent) {\n return null;\n }\n if (mentionsScript(question)) {\n return 'script';\n }\n const since = this.scriptTopics.get(source);\n return since !== undefined && Date.now() - since < SCRIPT_TOPIC_MS ? 'scriptReply' : null;\n }\n\n /**\n * Should the satellite behind `source` re-open its mic after this reply? Primarily the LLM's own\n * [[LISTEN]] signal, with a question mark in the reply as the fallback (the NLU and the local tiers\n * cannot emit the marker, but they do ask \"Meinst du Büro oder Wohnzimmer?\").\n */\n private wantsFollowUp(source: string, answer: string): 'llm' | 'question' | null {\n if (!answer) {\n return null;\n }\n if (this.followUps.get(source)) {\n return 'llm';\n }\n return this.expectsFollowUp(answer) ? 'question' : null;\n }\n\n /** {@link wantsFollowUp} for a voice transport, logged, as the `listen` flag of the reply. */\n private followUpFor(source: string, answer: string): boolean {\n const why = this.wantsFollowUp(source, answer);\n if (why) {\n this.log.info(\n `→ mic-on to satellite '${source}' (${why === 'llm' ? 'LLM signalled a follow-up' : 'reply is a question'}).`,\n );\n }\n return !!why;\n }\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 /**\n * The tiers that answer without a model: routines, YouTube and the rule NLU. Null when none of them understood the\n * request.\n */\n private async answerLocally(question: string, source: string): Promise<string | null> {\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 this.journal?.step({ stage: 'routine', title: `Routine \"${routine.name}\" matched`, data: routine });\n await this.runRoutine(routine, source);\n return routine.reply;\n }\n if (this.routines.length) {\n this.journal?.step({\n stage: 'routine',\n title: `No routine matched (${this.routines.length} configured)`,\n data: { phrases: this.routines.map(r => ({ name: r.name, phrases: r.phrases })) },\n });\n }\n // Tier 0: rule-based NLU (device commands) — fastest, offline, free.\n if (!this.config.useLocalNlu) {\n this.journal?.step({ stage: 'nlu', title: 'Rule-based NLU is switched off (useLocalNlu)' });\n return null;\n }\n // \"Spiele den Kanal X ab\" first: the device NLU would find the TV in \"… auf dem Fernseher\" and\n // answer with its power state.\n const yt = this.youtubePlayers.length ? parseYouTubeCommand(question, this.youtubePlayers) : null;\n if (yt) {\n this.log.info(`YouTube request understood locally: ${yt.kind} \"${yt.query}\" (source='${source}').`);\n this.journal?.note({ tier: 'nlu', detail: `youtube ${yt.kind}` });\n const start = Date.now();\n const res = await this.playYouTube(yt.query, yt.kind, yt.player);\n this.journal?.step({\n stage: 'youtube',\n title: `YouTube ${yt.kind} \"${yt.query}\"${yt.player ? ` on \"${yt.player}\"` : ''}`,\n ms: Date.now() - start,\n data: { parsed: yt, result: res },\n });\n return res.text;\n }\n if (this.youtubePlayers.length) {\n this.journal?.step({ stage: 'youtube', title: 'Not a YouTube command' });\n }\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 this.journal?.step({\n stage: 'nlu',\n level: 'warn',\n title: `NLU gave up, the request goes on: ${(e as Error).message}`,\n data: errorInfo(e),\n });\n }\n return null;\n }\n\n private async produceAnswer(\n question: string,\n history: ConversationTurn[],\n source = '',\n cloudOnly: CloudOnly = null,\n ): 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 this.journal?.step({ stage: 'stop', title: `Stop word: silenced ${n} ringing timer/alarm(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 this.journal?.note({ tier: 'askReply', detail: asked || undefined });\n this.journal?.step({\n stage: 'askReply',\n title: `Reply to the open question \"${asked}\"`,\n data: { question: asked, reply: question },\n });\n return '';\n }\n }\n if (cloudOnly) {\n const why =\n cloudOnly === 'script'\n ? 'it is about a script'\n : 'it answers a question of the cloud model about a script';\n this.log.info(`Routines, NLU and local LLM skipped (source='${source}'): ${why}.`);\n this.journal?.step({\n stage: 'nlu',\n title: `Routines, NLU and local LLM skipped: ${why}`,\n data: { reason: cloudOnly },\n });\n } else {\n const local = await this.answerLocally(question, source);\n if (local !== null) {\n return local;\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 // With a cloud LLM it only goes first when asked to (`localLlmFirst`): on a Raspberry Pi a small model\n // needs 10–25 s, often only to hand off, and the cloud then starts from zero. By default it is the\n // fallback for when the cloud fails (see below).\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 // A script request does not even fall back to it: a model without tools cannot write a script.\n const useLocal = !cloudOnly && !!(this.config.useLocalLlm && this.localLlm);\n const cloud = !!(this.agent || this.piAgent);\n const localFirst = useLocal && (!cloud || !!this.config.localLlmFirst);\n if (localFirst && (!history.length || !cloud)) {\n const ans = await this.askLocalLlm(question, weather, source);\n if (ans) {\n return ans;\n }\n } else if (localFirst) {\n this.log.debug('Local LLM skipped (follow-up in an ongoing conversation → cloud LLM).');\n this.journal?.step({\n stage: 'localLlm',\n title: 'Local LLM skipped: follow-up in an ongoing conversation goes to the cloud LLM',\n });\n } else if (useLocal) {\n this.journal?.step({\n stage: 'localLlm',\n title: 'Local LLM not asked first: it is the fallback for when the cloud LLM fails (localLlmFirst)',\n });\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.piAgent) {\n return this.askPiAgent(this.piAgent, question, weather, source, useLocal && !localFirst);\n }\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 this.journal?.step({\n stage: 'none',\n level: 'warn',\n title: 'Nothing local understood the request and no LLM provider is configured',\n });\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 done = this.doneHint();\n const parts = [this.config.systemPrompt || '', followUp, done, 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. A spoken request\n // also gets the length limit, after the question: in the system prompt it would bust the prompt cache\n // every time voice and text requests alternate.\n const time = this.buildTimeContext();\n const lengthHint = this.spokenLengthHint();\n const questionForLlm = [time, weather, question, lengthHint].filter(Boolean).join('\\n\\n');\n this.journal?.note({\n tier: 'cloud',\n detail: `${this.llm?.provider || this.config.provider || 'openai'} · ${this.agent.model || 'auto'}`,\n });\n // What went into the prompt, piece by piece. The device list is only counted: the model's opening\n // step carries the whole system prompt, and with it the list.\n const deviceLines = ctx ? ctx.split('\\n').length - 1 : 0;\n this.journal?.step({\n stage: 'context',\n title: `Prompt: ${deviceLines} devices${mem ? ', memory' : ''}${weather ? ', weather' : ''}${followUp ? ', follow-up marker' : ''}${lengthHint ? ', length limit' : ''}`,\n data: {\n systemPrompt: this.config.systemPrompt || '',\n followUpHint: followUp || undefined,\n doneHint: done || undefined,\n lengthHint: lengthHint || undefined,\n memory: mem || undefined,\n devices: deviceLines,\n time,\n weather: weather || undefined,\n },\n });\n try {\n return await this.agent.ask(questionForLlm, sys, history);\n } catch (e) {\n // Offline, quota, outage: the local model is the fallback — unless it was already asked above.\n if (useLocal && !localFirst) {\n this.log.warn(`Cloud LLM failed (${(e as Error).message}) — asking the local LLM instead.`);\n this.journal?.step({\n stage: 'localLlm',\n level: 'warn',\n title: `Cloud LLM failed (${(e as Error).message}) — asking the local LLM instead`,\n });\n const ans = await this.askLocalLlm(question, weather, source);\n if (ans) {\n return ans;\n }\n }\n throw e;\n }\n }\n\n /**\n * Cloud tier through the adapter pi-agent: one pi-agent conversation per source. The style, the\n * follow-up marker, the memory and the device list are the instructions of that conversation (pi-agent\n * re-configures it only when they change); time, weather and presence change every turn and go in front\n * of the question. The history stays in pi-agent, so nothing of {@link ConversationStore} is sent.\n */\n private async askPiAgent(\n harness: PiAgentHarness,\n question: string,\n weather: string,\n source: string,\n localFallback: boolean,\n ): Promise<string> {\n const followUp = this.config.voiceEnabled ? this.followUpHint() : '';\n // The device list maps names to state ids, so pi-agent can act without searching first. It is the\n // first to go when the instructions get too long — pi-agent can still search.\n const { text: instructions, dropped } = composeInstructions(\n [this.config.systemPrompt || '', followUp, this.doneHint(), this.spokenLengthHint()],\n [this.buildMemoryContext(), await this.buildDeviceContext()],\n );\n if (dropped) {\n this.log.debug(`pi-agent: ${dropped} context block(s) left out, the instructions would be too long.`);\n }\n const text = [this.buildTimeContext(), weather, this.buildPresenceContext(), question]\n .filter(Boolean)\n .join('\\n\\n');\n this.log.info(`Cloud tier ${harness.instance} (source='${source}') — asking pi-agent…`);\n this.journal?.note({ tier: 'cloud', detail: harness.instance });\n try {\n // pi-agent asks its questions to confirm a write (\"… Say yes or no.\") in this language, not in the system\n // language: a satellite listening in Russian does not hear a German \"Ja\"\n const language = String(this.config.voiceLanguage || this.language || '');\n return await harness.ask({ text, conversation: source, instructions, language });\n } catch (e) {\n if (localFallback) {\n this.log.warn(`pi-agent failed (${(e as Error).message}) — asking the local LLM instead.`);\n const ans = await this.askLocalLlm(question, weather, source);\n if (ans) {\n return ans;\n }\n }\n throw e;\n }\n }\n\n /**\n * Ask the local model, bounded by `localLlmTimeoutSec`. Returns its answer, or null when it handed off,\n * timed out or failed — the caller then goes on to the next tier.\n */\n private async askLocalLlm(question: string, weather: string, source: string): Promise<string | null> {\n if (!this.localLlm) {\n return null;\n }\n const timeoutMs = Math.max(1, Number(this.config.localLlmTimeoutSec) || LOCAL_LLM_TIMEOUT_SEC) * 1000;\n const name = this.localLlmName();\n // The local model has no tools: without these lines it would invent the weather and guess who is\n // at home.\n const facts = [weather, this.buildPresenceContext()].filter(Boolean).join('\\n\\n');\n const prompt = facts ? `${facts}\\n\\n${question}` : question;\n const busy = this.localLlm.running;\n const data = { model: name, timeoutMs, system: this.localLlm.systemPrompt(), prompt };\n const start = Date.now();\n try {\n const ans = await this.localLlm.ask(prompt, timeoutMs);\n const ms = Date.now() - start;\n if (ans && !isHandoff(ans)) {\n this.log.info(`Answered by local LLM (source='${source}').`);\n this.journal?.note({ tier: 'localLlm', detail: name });\n this.journal?.step({\n stage: 'localLlm',\n title: `Local LLM ${name}: answered`,\n ms,\n data: { ...data, answer: ans },\n });\n return ans;\n }\n this.log.debug('Local LLM handed off.');\n this.journal?.step({\n stage: 'localLlm',\n title: busy\n ? `Local LLM ${name}: busy with another question → handed off`\n : `Local LLM ${name}: handed off`,\n ms,\n data: { ...data, answer: ans },\n });\n } catch (e) {\n this.log.info(`Local LLM gave no answer: ${(e as Error).message}`);\n this.journal?.step({\n stage: 'localLlm',\n level: 'warn',\n title: `Local LLM ${name}: ${(e as Error).message}`,\n ms: Date.now() - start,\n data: { ...data, error: errorInfo(e) },\n });\n }\n return null;\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 const lang = String(this.config.voiceLanguage || this.language || 'en');\n lines.push(...this.satelliteVolumeLines(lang));\n if (!lines.length) {\n return '';\n }\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 * The playback volume of every voice satellite as a line of the device list. Without it, \"Lautstärke auf 50\n * Prozent\" that the rules miss reaches the LLM (or pi-agent) with only the media devices of the room in view, and\n * the model turns those up instead of the speaker that heard the request. The scales differ per transport.\n */\n private satelliteVolumeLines(lang: string): string[] {\n const label = (satId: string): string =>\n lang === 'ru'\n ? `Громкость голосового спутника ${satId}`\n : lang === 'de'\n ? `Lautstärke des Sprachsatelliten ${satId}`\n : `Volume of the voice satellite ${satId}`;\n const lines: string[] = [];\n const seen = new Set<string>();\n for (const [satId, instance] of this.nativeSatFrom) {\n seen.add(satId);\n lines.push(`- ${label(satId)} (${satId}, level.volume 0-100): ${instance}.volume`);\n }\n for (const [satId, device] of this.satDeviceById) {\n if (seen.has(satId)) {\n continue;\n }\n const player = this.esphome?.entities(device).find(e => e.kind === 'mediaPlayer');\n if (player) {\n seen.add(satId);\n const id = `${this.namespace}.satellites.${satId}.controls.${player.objectId}.volume`;\n lines.push(`- ${label(satId)} (${satId}, level.volume 0-1): ${id}`);\n }\n }\n for (const satId of this.satVolumeEnsured) {\n if (!seen.has(satId)) {\n lines.push(\n `- ${label(satId)} (${satId}, level.volume 0-100): ${this.namespace}.satellites.${satId}.volume`,\n );\n }\n }\n return lines;\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 await fs.promises.rm(traceDirFor(file), { recursive: true, force: true }).catch(() => {});\n }\n }\n\n /**\n * Wrap the MCP connection so every state the pipeline reads or writes lands in the journal entry — and a\n * call the NLU makes directly, with its result, in the request's trace.\n */\n private journalMcp(mcp: InProcessMcp): InProcessMcp {\n return {\n listTools: () => mcp.listTools(),\n callTool: (name, args) =>\n this.journal\n ? this.journal.stateCall(name, args, () => mcp.callTool(name, args))\n : mcp.callTool(name, args),\n close: () => mcp.close(),\n };\n }\n\n /** Wrap an LLM tool so its calls (arguments, result, duration) land in the journal entry and its trace. */\n private journalTool(tool: Tool): Tool {\n return {\n ...tool,\n run: args => (this.journal ? this.journal.toolCall(tool.name, args, () => tool.run(args)) : tool.run(args)),\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: Math.min(this.config.maxTokens || LOCAL_LLM_MAX_TOKENS, LOCAL_LLM_MAX_TOKENS),\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 start = Date.now();\n const { rooms, devices } = await this.getNluDevices();\n const aliases = this.getNluAliases();\n const intents = new Nlu(rooms, devices, aliases, {\n weather: !!(this.config.weatherInstance || '').trim(),\n }).parseAll(question);\n const blockers = intents.map(i => this.nluBlocker(i, devices.length));\n this.journal?.step({\n stage: 'nlu',\n title: !intents.length\n ? `NLU: nothing recognised (${devices.length} devices, ${rooms.length} rooms known)`\n : blockers.some(Boolean)\n ? `NLU: ${intents.map(i => i.action).join(' + ')} — cannot run here: ${blockers.filter(Boolean).join('; ')}`\n : `NLU: ${intents.map(describeIntent).join(' + ')}`,\n level: intents.length && blockers.some(Boolean) ? 'warn' : undefined,\n ms: Date.now() - start,\n data: {\n devices: devices.length,\n rooms,\n aliases: aliases.length ? aliases : undefined,\n intents: intents.map((intent, i) => ({ ...intent, blockedBecause: blockers[i] || undefined })),\n },\n });\n if (!intents.length || blockers.some(Boolean)) {\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 const started = Date.now();\n try {\n const answer = await this.executeNluIntent(intent, source);\n answers.push(answer);\n this.journal?.step({\n stage: 'nlu',\n title: `Executed ${describeIntent(intent)}`,\n ms: Date.now() - started,\n data: { answer },\n });\n } catch (e) {\n failed = true;\n this.journal?.step({\n stage: 'nlu',\n level: 'error',\n title: `${describeIntent(intent)} failed: ${(e as Error).message}${answers.length ? '' : ' → the LLM takes over'}`,\n ms: Date.now() - started,\n data: errorInfo(e),\n });\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 // a command for later says when it will run — a beep would hide that\n intents.every(i => CONTROL_ACTIONS.has(i.action) && !isDeferred(i)) &&\n (await this.playConfirmationTone(source))\n ) {\n this.log.debug(`NLU confirmed with a tone instead of \"${answer}\".`);\n this.journal?.step({ stage: 'nlu', title: 'Confirmed with a tone instead of words', data: { answer } });\n return '';\n }\n return answer;\n }\n\n /**\n * Why this intent cannot run locally ('' = it can). Checked for **every** part of a combined command\n * before anything is executed: a missing manager, no known devices or disabled writes send the whole\n * utterance to the LLM (which can explain why) instead of silently doing nothing — or only half of it.\n */\n private nluBlocker(intent: NluIntent, deviceCount: number): string {\n switch (intent.action) {\n case 'timerSet':\n case 'timerQuery':\n case 'timerCancel':\n return this.timers ? '' : 'timers are not running';\n case 'alarmSet':\n case 'alarmQuery':\n case 'alarmCancel':\n return this.alarms ? '' : 'alarms are not running';\n case 'timeQuery':\n case 'dateQuery':\n return '';\n case 'weatherQuery':\n return (this.config.weatherInstance || '').trim() ? '' : 'no weather instance configured';\n case 'volumeSet':\n return this.voice || this.esphome || this.nativeSatFrom.size ? '' : 'no satellites';\n default:\n // Device intents; writes additionally require the coarse \"allow control\" toggle.\n if (!deviceCount) {\n return 'no devices known';\n }\n if (isDeferred(intent) && !(this.config.calendarInstance || '').trim()) {\n return 'a command for later needs a calendar (fullcalendar) instance in the settings';\n }\n return ['on', 'off', 'level', 'color'].includes(intent.action) && !this.config.allowWriteStates\n ? 'writing states is not allowed (allowWriteStates)'\n : '';\n }\n }\n\n /** Execute one intent that {@link nluBlocker} 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 case 'weatherQuery':\n return this.executeWeatherIntent(intent);\n case 'volumeSet':\n return this.executeVolumeIntent(intent, source);\n default:\n return isDeferred(intent) ? this.executeDeferredIntent(intent) : this.executeIntent(intent);\n }\n }\n\n /**\n * Send a message to the calendar instance (fullcalendar). Its answer `{error}` becomes an exception.\n *\n * @param command `addEvent`, `listEvents`, `deleteEvent`, …\n * @param message the parameters\n */\n private async calendarCall<T extends object>(command: string, message: Record<string, unknown>): Promise<T> {\n const instance = (this.config.calendarInstance || '').trim().replace(/^system\\.adapter\\./, '');\n if (!instance) {\n throw new Error('No calendar instance configured in the assistant settings');\n }\n const alive = await this.getForeignStateAsync(`system.adapter.${instance}.alive`);\n if (!alive?.val) {\n throw new Error(`The calendar ${instance} is not running`);\n }\n const res = (await this.sendToAsync(instance, command, message, { timeout: 10000 })) as\n (T & { error?: string }) | undefined;\n if (!res) {\n throw new Error(`The calendar ${instance} did not answer`);\n }\n if (res.error) {\n throw new Error(res.error);\n }\n return res;\n }\n\n /**\n * Whether the per-device ACL forbids writing this state: an explicit entry, else the default of the device\n * type (locks are read-only). States outside the device list are not restricted (like `set_state`).\n */\n private async writeForbidden(stateId: string): Promise<boolean> {\n const { devices } = await this.getNluDevices();\n const device = devices.find(d => Object.values(d.controls).includes(stateId));\n if (!device) {\n return false;\n }\n const entry = this.config.deviceAcl?.[deviceKey(Object.values(device.controls))];\n return entry ? entry.write === false : device.type === 'lock';\n }\n\n /** \"22:30\", \"morgen um 22:30\", \"30.10. um 7:00\" — when a planned command runs, for the spoken answer */\n private describeWhen(time: Date, lang: string): string {\n const pad = (n: number): string => String(n).padStart(2, '0');\n const clock = `${time.getHours()}:${pad(time.getMinutes())}`;\n const now = new Date();\n const days = Math.round(\n (new Date(time.getFullYear(), time.getMonth(), time.getDate()).getTime() -\n new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime()) /\n 86_400_000,\n );\n const date = `${pad(time.getDate())}.${pad(time.getMonth() + 1)}.`;\n if (lang === 'ru') {\n return days === 0 ? `в ${clock}` : days === 1 ? `завтра в ${clock}` : `${date} в ${clock}`;\n }\n if (lang === 'de') {\n return days === 0 ? `um ${clock}` : days === 1 ? `morgen um ${clock}` : `am ${date} um ${clock}`;\n }\n return days === 0 ? `at ${clock}` : days === 1 ? `tomorrow at ${clock}` : `on ${date} at ${clock}`;\n }\n\n /**\n * A device command for later (\"Licht in 2 Stunden aus\", \"выключи свет через 2 часа\"): one event in the calendar\n * (fullcalendar) per write — the calendar shows it, survives restarts and can be cancelled there.\n */\n private async executeDeferredIntent(intent: NluIntent): Promise<string> {\n const device = intent.device;\n if (!device || !intent.stateId) {\n throw new Error('deferred intent without a device');\n }\n const lang = String(this.config.voiceLanguage || this.language || 'en');\n const pick = (rus: string, ger: string, eng: string): string =>\n lang === 'ru' ? rus : lang === 'de' ? ger : eng;\n const room = intent.room || device.room;\n const where = room ? ` (${room})` : '';\n const dev = device.name;\n if (await this.writeForbidden(intent.stateId)) {\n return pick(\n `${dev}${where} только для чтения.`,\n `${dev}${where} ist schreibgeschützt.`,\n `${dev}${where} is read-only.`,\n );\n }\n\n let time: Date;\n if (intent.delaySec !== undefined) {\n time = new Date(Date.now() + intent.delaySec * 1000);\n } else {\n const { hour, minute, day } = intent.at!;\n const now = new Date();\n time = new Date(now.getFullYear(), now.getMonth(), now.getDate() + (day ?? 0), hour, minute, 0, 0);\n if (time.getTime() <= now.getTime()) {\n if (day !== undefined) {\n return pick(\n `${this.describeWhen(time, lang)} уже прошло.`,\n `${this.describeWhen(time, lang).replace(/^um /, '')} ist schon vorbei.`,\n `${this.describeWhen(time, lang).replace(/^at /, '')} has already passed.`,\n );\n }\n time.setDate(time.getDate() + 1); // \"um 7 Uhr\" after 7 o'clock: tomorrow\n }\n }\n\n const name = `${dev}${where}`;\n await this.calendarCall('addEvent', { oid: intent.stateId, value: intent.value, start: time.getTime(), name });\n // a dimmer with its own switch: the switch goes into the calendar, too\n if (intent.also) {\n await this.calendarCall('addEvent', {\n oid: intent.also.stateId,\n value: intent.also.value,\n start: time.getTime(),\n name,\n });\n }\n this.log.info(\n `Planned in the calendar: ${intent.stateId} = ${JSON.stringify(intent.value)} at ${time.toString()}`,\n );\n\n const when = this.describeWhen(time, lang);\n switch (intent.action) {\n case 'on':\n return pick(\n `Хорошо, ${when} включу: ${dev}${where}.`,\n `Okay, ${dev}${where} wird ${when} eingeschaltet.`,\n `Okay, ${dev}${where} will be turned on ${when}.`,\n );\n case 'off':\n return pick(\n `Хорошо, ${when} выключу: ${dev}${where}.`,\n `Okay, ${dev}${where} wird ${when} ausgeschaltet.`,\n `Okay, ${dev}${where} will be turned off ${when}.`,\n );\n case 'level':\n return pick(\n `Хорошо, ${when} поставлю ${dev}${where} на ${String(intent.value)} %.`,\n `Okay, ${dev}${where} wird ${when} auf ${String(intent.value)} % gestellt.`,\n `Okay, ${dev}${where} will be set to ${String(intent.value)} % ${when}.`,\n );\n default:\n return pick(\n `Хорошо, запланировано ${when}: ${dev}${where}.`,\n `Okay, für ${dev}${where} ${when} eingeplant.`,\n `Okay, planned for ${dev}${where} ${when}.`,\n );\n }\n }\n\n /**\n * LLM tools for the calendar (fullcalendar): plan a state change for later, list what is planned, cancel it.\n * Planning respects the same write rules as `set_state` (the coarse switch and the per-device ACL).\n */\n private buildCalendarTools(): Tool[] {\n const fail = (e: unknown): string => JSON.stringify({ ok: false, error: (e as Error).message });\n const tools: Tool[] = [\n {\n name: 'list_scheduled',\n description:\n 'List the planned events of the calendar (state changes at a time, also recurring ones), in local time of the house. Optional \"days\" ahead (default 1 = the next 24 hours) or a \"from\"/\"to\" range as local time \"YYYY-MM-DDTHH:mm\".',\n parameters: {\n type: 'object',\n properties: {\n days: { type: 'number', description: 'How many days ahead, default 1' },\n from: { type: 'string', description: 'Start, local time YYYY-MM-DDTHH:mm' },\n to: { type: 'string', description: 'End, local time YYYY-MM-DDTHH:mm' },\n },\n additionalProperties: false,\n },\n run: async (args): Promise<string> => {\n try {\n const res = await this.calendarCall<{ events: unknown[] }>('listEvents', {\n days: typeof args.days === 'number' ? args.days : 1,\n from: args.from,\n to: args.to,\n max: 50,\n });\n return JSON.stringify({ ok: true, events: res.events });\n } catch (e) {\n return fail(e);\n }\n },\n },\n ];\n if (!this.config.allowWriteStates) {\n return tools;\n }\n tools.push(\n {\n name: 'schedule_state',\n description:\n 'Plan a state change for later in the calendar: write \"value\" to state \"id\" after \"in_minutes\" or at \"at\" (local time of the house, \"YYYY-MM-DDTHH:mm\"). Use it for \"in 2 hours\", \"at 10 pm\", \"tomorrow morning\" — never set_state for something meant for later. With \"duration_minutes\" the state gets \"end_value\" after that time (for a boolean the opposite by default). Tell the user the planned time.',\n parameters: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'State ID' },\n value: { type: ['boolean', 'number', 'string'], description: 'Value to write' },\n in_minutes: { type: 'number', description: 'Delay in minutes from now' },\n at: { type: 'string', description: 'Local time YYYY-MM-DDTHH:mm' },\n duration_minutes: { type: 'number', description: 'Optional: write end_value this much later' },\n end_value: { type: ['boolean', 'number', 'string'], description: 'Value after the duration' },\n name: {\n type: 'string',\n description: 'Short title for the calendar, e.g. \"Licht Wohnzimmer aus\"',\n },\n },\n required: ['id', 'value'],\n additionalProperties: false,\n },\n run: async (args): Promise<string> => {\n try {\n const id = typeof args.id === 'string' ? args.id : '';\n if (await this.writeForbidden(id)) {\n return JSON.stringify({\n ok: false,\n error: `Writing \"${id}\" is not allowed: the device is read-only in the assistant settings.`,\n });\n }\n if (args.in_minutes === undefined && !args.at) {\n return JSON.stringify({ ok: false, error: 'Give \"in_minutes\" or \"at\"' });\n }\n const res = await this.calendarCall<{ id: string; start: string }>('addEvent', {\n oid: id,\n value: args.value,\n in: typeof args.in_minutes === 'number' ? Math.round(args.in_minutes * 60) : undefined,\n start: args.in_minutes === undefined ? args.at : undefined,\n duration:\n typeof args.duration_minutes === 'number'\n ? Math.round(args.duration_minutes * 60)\n : undefined,\n endValue: args.end_value,\n name: typeof args.name === 'string' ? args.name : undefined,\n });\n return JSON.stringify({ ok: true, eventId: res.id, start: res.start });\n } catch (e) {\n return fail(e);\n }\n },\n },\n {\n name: 'cancel_scheduled',\n description:\n 'Delete a planned event from the calendar, by its \"id\" from list_scheduled or schedule_state.',\n parameters: {\n type: 'object',\n properties: { id: { type: 'string', description: 'Event ID' } },\n required: ['id'],\n additionalProperties: false,\n },\n run: async (args): Promise<string> => {\n try {\n await this.calendarCall('deleteEvent', { id: typeof args.id === 'string' ? args.id : '' });\n return JSON.stringify({ ok: true });\n } catch (e) {\n return fail(e);\n }\n },\n },\n );\n return tools;\n }\n\n /**\n * Speak the weather straight from the configured adapter. Throws when the report has nothing for the\n * asked day (or the adapter has no mapper), so the question goes on to the LLM and its tool instead.\n */\n private async executeWeatherIntent(intent: NluIntent): Promise<string> {\n const res = await this.readWeather(this.config.weatherInstance || '');\n if (!res.report) {\n throw new Error(res.error || 'no weather report');\n }\n const lang = String(this.config.voiceLanguage || this.language || 'en');\n const text = buildWeatherAnswer(res.report, lang, intent.when);\n if (!text) {\n throw new Error(`the weather report has no data for '${intent.when || 'now'}'`);\n }\n return text;\n }\n\n /**\n * Change the playback volume of a satellite: the one in the named room, else the one that heard the\n * command. Each transport has its own knob — the native satellite's `volume` state, the media player\n * of an ESPHome device, the `volume` message of a UDP satellite.\n */\n private async executeVolumeIntent(intent: NluIntent, source: string): Promise<string> {\n const lang = String(this.config.voiceLanguage || this.language || 'en');\n const satId = intent.room ? this.resolveSatelliteId(intent.room) : this.announceTargetForSource(source);\n const absolute = typeof intent.value === 'number' ? intent.value : null;\n const delta = intent.delta || 0;\n const next = (current: number): number => Math.min(100, Math.max(0, Math.round(absolute ?? current + delta)));\n // 1 процент, 2 процента, 5 процентов (11–14 take the last form).\n const ruPercent = (n: number): string =>\n n % 100 > 10 && n % 100 < 20\n ? 'процентов'\n : n % 10 === 1\n ? 'процент'\n : n % 10 >= 2 && n % 10 <= 4\n ? 'процента'\n : 'процентов';\n const confirm = (level: number): string =>\n lang === 'ru'\n ? `Громкость ${level} ${ruPercent(level)}.`\n : lang === 'de'\n ? `Lautstärke ${level} Prozent.`\n : `Volume ${level} percent.`;\n if (satId) {\n const device = this.satDeviceById.get(satId) || satId;\n const instance = this.nativeSatFrom.get(satId);\n if (instance) {\n const stateId = `${instance}.volume`;\n const current = Number((await this.getForeignStateAsync(stateId))?.val ?? 50);\n const level = next(Number.isFinite(current) ? current : 50);\n await this.setForeignStateAsync(stateId, level);\n return confirm(level);\n }\n const player = this.esphome?.entities(device).find(e => e.kind === 'mediaPlayer');\n if (player) {\n const current = ((player.value as MediaPlayerValue | undefined)?.volume ?? 0.5) * 100;\n const level = next(current);\n if (this.esphome!.setEntity(device, player.objectId, level / 100)) {\n return confirm(level);\n }\n }\n // A UDP satellite works out a relative step itself (it knows its level) and reports the result.\n if (this.voice?.has(device)) {\n this.voice.volume(device, absolute !== null ? { level: absolute } : { delta });\n if (absolute !== null) {\n return confirm(next(0));\n }\n return lang === 'ru'\n ? delta > 0\n ? 'Сделала громче.'\n : 'Сделала тише.'\n : lang === 'de'\n ? delta > 0\n ? 'Etwas lauter.'\n : 'Etwas leiser.'\n : delta > 0\n ? 'A bit louder.'\n : 'A bit quieter.';\n }\n }\n return lang === 'ru'\n ? 'Я не знаю, громкость какой колонки изменить.'\n : lang === 'de'\n ? 'Ich weiß nicht, bei welchem Lautsprecher ich die Lautstärke ändern soll.'\n : \"I don't know which speaker's volume to change.\";\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 /**\n * Device model for the NLU: friendly name, room, type and controls (controlType → state id). Cached\n * for {@link NLU_DEVICES_TTL_MS}; requests arriving while it is being built wait for the same build.\n */\n private getNluDevices(): Promise<{ rooms: string[]; devices: NluDevice[] }> {\n if (!this.mcp) {\n return Promise.resolve({ 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 const now = Date.now();\n const hit = this.nluDevices;\n if (hit && hit.key === nluLang && now - hit.at < NLU_DEVICES_TTL_MS) {\n return hit.result;\n }\n const entry = { key: nluLang, at: now, result: this.buildNluDevices(nluLang) };\n this.nluDevices = entry;\n // An empty model is usually a failed build (the manager not ready yet) — don't keep it for a minute.\n void entry.result.then(r => {\n if (!r.devices.length && this.nluDevices === entry) {\n this.nluDevices = null;\n }\n });\n return entry.result;\n }\n\n private async buildNluDevices(nluLang: ioBroker.Languages): Promise<{ rooms: string[]; devices: NluDevice[] }> {\n if (!this.mcp) {\n return { rooms: [], devices: [] };\n }\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 start = Date.now();\n const deadline = start + 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 this.journal?.step({\n stage: 'state',\n title: `${stateId} confirmed by the device`,\n ms: Date.now() - start,\n data: { expected, state: last },\n });\n return true;\n }\n }\n this.journal?.step({\n stage: 'state',\n level: 'warn',\n title: `${stateId}: no confirmation within ${ACK_TIMEOUT_MS} ms`,\n ms: Date.now() - start,\n data: { expected, state: last },\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 // ── YouTube on the TV (youtube-remote players) ──────────────────────────\n\n /** The player a request means: the named one, else the one in the requesting room, else the first. */\n private youtubePlayerFor(name?: string): YouTubePlayer | null {\n return findPlayer(this.youtubePlayers, name, this.requestOrigin.getStore()?.room || '');\n }\n\n /**\n * Find the device of a row that names a youtube-remote instance. Done again before every command: the\n * device id comes from the TV's screen id, so pairing the TV again replaces the device while we run.\n * false = nothing is paired with that instance.\n */\n private async resolveYouTubePlayer(player: YouTubePlayer): Promise<boolean> {\n if (!player.instance) {\n return true;\n }\n let devices: YouTubeDevice[] = [];\n try {\n const objs = await this.getForeignObjectsAsync(`${player.instance}.*`, 'device');\n devices = Object.values(objs).map(o => ({ id: o._id, name: this.youtubeDeviceName(o) }));\n } catch (e) {\n this.log.debug(`YouTube: cannot read the devices of ${player.instance}: ${(e as Error).message}`);\n }\n const device = pickDevice(devices, player);\n player.base = device?.id || '';\n player.target = device ? `${device.id}.youtube` : '';\n if (device && !player.name) {\n player.name = device.name || player.instance;\n }\n return !!device;\n }\n\n /** Display name of an object, in the voice language if it is translated. */\n private youtubeDeviceName(obj: ioBroker.Object): string {\n const name = obj.common?.name;\n if (typeof name === 'string') {\n return name;\n }\n const lang = String(this.config.voiceLanguage || this.language || 'en') as ioBroker.Languages;\n return name?.[lang] || name?.en || obj._id.split('.').pop() || obj._id;\n }\n\n /**\n * Options of the \"Player\" column: every youtube-remote instance (it finds its TV itself), and for an\n * instance with several paired TVs also each of them, to pin a row to one.\n */\n private async getYouTubeInstances(): Promise<{ label: string; value: string }[]> {\n const options: { label: string; value: string }[] = [];\n let instances: string[] = [];\n try {\n const view = await this.getObjectViewAsync('system', 'instance', {\n startkey: 'system.adapter.youtube-remote.',\n endkey: 'system.adapter.youtube-remote.香',\n });\n instances = (view?.rows || []).map(r => r.id.replace(/^system\\.adapter\\./, '')).sort();\n } catch (e) {\n this.log.warn(`getYouTubeInstances failed: ${(e as Error).message}`);\n }\n for (const instance of instances) {\n const objs = await this.getForeignObjectsAsync(`${instance}.*`, 'device').catch(() => ({}));\n const devices = Object.values(objs)\n .map(o => ({ id: o._id, name: this.youtubeDeviceName(o) }))\n .sort((a, b) => a.id.localeCompare(b.id));\n const names = devices.map(d => d.name).join(', ');\n options.push({ label: names ? `${instance} (${names})` : `${instance} (no TV paired)`, value: instance });\n if (devices.length > 1) {\n for (const d of devices) {\n options.push({ label: `${instance} › ${d.name}`, value: d.id });\n }\n }\n }\n return options;\n }\n\n /**\n * Find `query` on YouTube and play it on a player, switching its TV on first. The search runs before\n * anything is switched: a TV woken for a channel that does not exist would be the worst outcome.\n *\n * A TV that has to boot takes 10–30 s, so in that case the reply comes right away and the rest runs\n * in the background ({@link playWhenTvIsOn}) — over voice, half a minute of silence reads as \"did not\n * hear me\". An already running TV is answered only after the player acknowledged the command.\n */\n private async playYouTube(\n query: string,\n kind: YouTubeKind | 'auto',\n playerName?: string,\n ): Promise<YouTubePlayResult> {\n const lang = String(this.config.voiceLanguage || this.language || 'en');\n const player = this.youtubePlayerFor(playerName);\n if (!player) {\n const names = this.youtubePlayers.map(p => p.name).join(', ');\n return { ok: false, text: youtubeReply(lang, 'unknownPlayer', { query: playerName, names }) };\n }\n if (!(await this.resolveYouTubePlayer(player))) {\n return {\n ok: false,\n player: player.name,\n text: youtubeReply(lang, 'noDevice', { instance: player.instance }),\n };\n }\n if (!this.config.allowWriteStates) {\n return { ok: false, player: player.name, text: youtubeReply(lang, 'noControl') };\n }\n let hit: YouTubeHit | null = null;\n let alternatives: YouTubeHit[] = [];\n // Unsaid kind: what is named like a channel is the channel (\"spiele Sailing OceanAir auf YouTube\"),\n // anything else a video search — a video search for a channel name finds some video about it.\n const searchKind: YouTubeKind = kind === 'auto' ? 'video' : kind;\n const direct = directYouTubeTarget(query, searchKind);\n if (direct) {\n hit = { kind: searchKind, id: direct, title: query };\n } else {\n try {\n if (kind === 'auto') {\n const channels = await searchYouTube(query, 'channel', { language: lang });\n hit = channels.find(h => isNamedChannel(h, query)) || null;\n alternatives = channels.filter(h => h !== hit).slice(0, 3);\n }\n if (!hit) {\n const hits = await searchYouTube(query, searchKind, { language: lang });\n hit = pickBest(hits, query);\n alternatives = hits.filter(h => h !== hit).slice(0, 3);\n }\n } catch (e) {\n this.log.warn(`YouTube search for \"${query}\" failed: ${(e as Error).message}`);\n return { ok: false, player: player.name, text: youtubeReply(lang, 'searchFailed') };\n }\n if (!hit) {\n return {\n ok: false,\n player: player.name,\n text: youtubeReply(lang, 'notFound', { kind: searchKind, query }),\n };\n }\n }\n const title = spokenTitle(hit);\n this.log.info(`YouTube: ${kind} \"${query}\" → ${hit.kind} ${hit.id} (${hit.title}) on ${player.name}.`);\n const reply = { kind: hit.kind, title, player: player.name };\n if ((await this.tvPower(player)) === 'off') {\n try {\n await this.switchTvOn(player);\n } catch (e) {\n this.log.warn(`YouTube: cannot switch ${player.power} on: ${(e as Error).message}`);\n }\n void this.playWhenTvIsOn(player, hit);\n return {\n ok: true,\n hit,\n alternatives,\n player: player.name,\n poweringOn: true,\n text: youtubeReply(lang, 'poweringOn', reply),\n };\n }\n if (await this.sendToYouTubePlayer(player, hit.id)) {\n return { ok: true, hit, alternatives, player: player.name, text: youtubeReply(lang, 'playing', reply) };\n }\n const instance = player.base.split('.').slice(0, 2).join('.');\n const alive = (await this.getForeignStateAsync(`system.adapter.${instance}.alive`).catch(() => null))?.val;\n return {\n ok: false,\n hit,\n player: player.name,\n text: alive ? youtubeReply(lang, 'noConfirm', reply) : youtubeReply(lang, 'adapterDown', { instance }),\n };\n }\n\n /**\n * Whether the TV of a player is on. `unknown` when there is nothing to tell it by: no power state, or\n * one that is a button — pressing a toggle button on a TV that is already on would switch it off.\n */\n private async tvPower(player: YouTubePlayer): Promise<'on' | 'off' | 'unknown'> {\n if (!player.power) {\n return 'unknown';\n }\n const obj = await this.getForeignObjectAsync(player.power).catch(() => null);\n if (!obj) {\n this.log.warn(`YouTube player ${player.name}: power state ${player.power} does not exist.`);\n return 'unknown';\n }\n const common = obj.common as ioBroker.StateCommon;\n if (common.read === false || String(common.role || '').startsWith('button')) {\n this.log.debug(`YouTube player ${player.name}: ${player.power} is a button, the TV state is unknown.`);\n return 'unknown';\n }\n const state = await this.getForeignStateAsync(player.power).catch(() => null);\n return isPowerOn(state?.val) ? 'on' : 'off';\n }\n\n /** Write \"on\" to the power state, in the type the state has. */\n private async switchTvOn(player: YouTubePlayer): Promise<void> {\n const obj = await this.getForeignObjectAsync(player.power);\n const type = (obj?.common as ioBroker.StateCommon | undefined)?.type;\n const val: ioBroker.StateValue = type === 'number' ? 1 : type === 'string' ? 'on' : true;\n await this.setForeignStateAsync(player.power, { val, ack: false });\n this.journal?.stateAccess('set_state', { id: player.power, value: val });\n this.log.info(`YouTube: switching ${player.name} on (${player.power} = ${JSON.stringify(val)}).`);\n }\n\n /**\n * After the TV was switched on: wait until its power state confirms (an `ack` from the TV adapter — our\n * own write already says `true`), give the TV its boot time, then play. The YouTube app is often not\n * reachable over the lounge right after boot, so a command that is not acknowledged is sent once more.\n */\n private async playWhenTvIsOn(player: YouTubePlayer, hit: YouTubeHit): Promise<void> {\n try {\n const until = Date.now() + TV_POWER_TIMEOUT_MS;\n let on = false;\n while (!on && Date.now() < until) {\n await this.delay(1000);\n const st = await this.getForeignStateAsync(player.power).catch(() => null);\n on = !!st?.ack && isPowerOn(st.val);\n }\n if (!on) {\n this.log.warn(\n `YouTube: ${player.power} did not report \"on\" within ${TV_POWER_TIMEOUT_MS / 1000} s — trying to play anyway.`,\n );\n }\n await this.delay(player.delaySec * 1000);\n let ok = await this.sendToYouTubePlayer(player, hit.id);\n if (!ok) {\n await this.delay(YOUTUBE_RETRY_MS);\n ok = await this.sendToYouTubePlayer(player, hit.id);\n }\n if (ok) {\n this.log.info(`YouTube: playing ${hit.id} (${hit.title}) on ${player.name}.`);\n } else {\n this.log.warn(\n `YouTube: ${player.name} did not take ${hit.id} after power-on. If the TV needs longer to start, raise its start delay.`,\n );\n }\n } catch (e) {\n this.log.warn(`YouTube: playing on ${player.name} failed: ${(e as Error).message}`);\n }\n }\n\n /**\n * Hand a video/playlist/channel id to the player and wait for its acknowledgement: youtube-remote acks\n * `youtube` (back to '') only once the TV took the command, and leaves it unacknowledged on failure.\n */\n private async sendToYouTubePlayer(player: YouTubePlayer, id: string): Promise<boolean> {\n await this.setForeignStateAsync(player.target, { val: id, ack: false });\n this.journal?.stateAccess('set_state', { id: player.target, value: id });\n const until = Date.now() + YOUTUBE_ACK_TIMEOUT_MS;\n while (Date.now() < until) {\n await this.delay(250);\n if ((await this.getForeignStateAsync(player.target).catch(() => null))?.ack) {\n return true;\n }\n }\n return false;\n }\n\n /** A play result as tool / sendTo data: without the internal objects, with the alternatives as titles. */\n private youtubeResultData(res: YouTubePlayResult): Record<string, unknown> {\n return {\n ok: res.ok,\n text: res.text,\n ...(res.player ? { player: res.player } : {}),\n ...(res.hit ? { kind: res.hit.kind, id: res.hit.id, title: res.hit.title } : {}),\n ...(res.hit?.channel ? { channel: res.hit.channel } : {}),\n ...(res.poweringOn ? { poweringOn: true } : {}),\n ...(res.alternatives?.length\n ? { otherResults: res.alternatives.map(h => ({ id: h.id, title: h.title })) }\n : {}),\n };\n }\n\n /**\n * LLM tools for the YouTube players: `play_youtube` (search + power-on + play) and `youtube_player`\n * (pause, skip, volume, what is playing). The configured names go into the descriptions, the model\n * cannot discover them otherwise.\n */\n private buildYouTubeTools(): Tool[] {\n const names = this.youtubePlayers.map((p, i) => (i === 0 ? `${p.name} (default)` : p.name)).join(', ');\n const playerParam = {\n type: 'string',\n description: `Player name or room: ${names}. Leave it out for the player in the room the user is in, else the default.`,\n };\n const play: Tool = {\n name: 'play_youtube',\n description:\n 'Play something from YouTube on the TV: finds the channel, video or playlist by name, switches ' +\n 'the TV on if it is off and starts playing. Use this for every \"play … on YouTube\", ' +\n '\"spiele den Kanal …\", \"zeig das Video …\" — never write the player states yourself. kind ' +\n '\"channel\" plays the newest uploads of a channel. The reply text of the result can be said as is; ' +\n 'otherResults are the next search hits, offer them if the user says it was the wrong one ' +\n '(pass the id as query to play one).',\n parameters: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description: 'Name of the channel, title of the video/playlist, a search phrase, or an id/URL',\n },\n kind: {\n type: 'string',\n enum: ['channel', 'video', 'playlist'],\n description: 'Leave it out if the user did not say: a channel of that name wins, else videos',\n },\n player: playerParam,\n },\n required: ['query'],\n additionalProperties: false,\n },\n run: async (args): Promise<string> => {\n const query = typeof args.query === 'string' ? args.query.trim() : '';\n if (!query) {\n return JSON.stringify({ ok: false, error: 'no query given' });\n }\n const kind =\n args.kind === 'channel' || args.kind === 'playlist' || args.kind === 'video' ? args.kind : 'auto';\n const player = typeof args.player === 'string' ? args.player : undefined;\n return JSON.stringify(this.youtubeResultData(await this.playYouTube(query, kind, player)));\n },\n };\n const control: Tool = {\n name: 'youtube_player',\n description:\n 'Control a YouTube player or ask what it plays: action play (resume), pause, next, previous, ' +\n 'volume (with \"volume\" 0-100), mute, unmute, or status (title, channel, play state, TV power).',\n parameters: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['play', 'pause', 'next', 'previous', 'volume', 'mute', 'unmute', 'status'],\n },\n volume: { type: 'number', description: 'Volume 0-100, only for action volume' },\n player: playerParam,\n },\n required: ['action'],\n additionalProperties: false,\n },\n run: async (args): Promise<string> => {\n const player = this.youtubePlayerFor(typeof args.player === 'string' ? args.player : undefined);\n if (!player) {\n return JSON.stringify({ ok: false, error: `unknown player, known are: ${names}` });\n }\n if (!(await this.resolveYouTubePlayer(player))) {\n return JSON.stringify({ ok: false, error: `no TV is paired with ${player.instance}` });\n }\n const action = typeof args.action === 'string' ? args.action : '';\n if (action === 'status') {\n const ids = ['title', 'artist', 'state', 'connected', 'volume'].map(s => `${player.base}.${s}`);\n const states: Record<string, ioBroker.State> = await this.getForeignStatesAsync(\n `${player.base}.*`,\n ).catch(() => ({}));\n const val = (i: number): unknown => states[ids[i]]?.val ?? null;\n const power = await this.tvPower(player);\n return JSON.stringify({\n ok: true,\n data: {\n player: player.name,\n title: val(0),\n channel: val(1),\n state: ({ 0: 'paused', 1: 'playing', 2: 'stopped' } as Record<string, string>)[\n String(val(2))\n ],\n connected: val(3),\n volume: val(4),\n ...(power !== 'unknown' ? { tv: power } : {}),\n },\n });\n }\n if (!this.config.allowWriteStates) {\n return JSON.stringify({ ok: false, error: 'device control is disabled in the settings' });\n }\n let id: string;\n let value: ioBroker.StateValue;\n if (action === 'volume') {\n const v = Number(args.volume);\n if (!Number.isFinite(v)) {\n return JSON.stringify({ ok: false, error: 'volume 0-100 needed' });\n }\n id = `${player.base}.volume`;\n value = Math.min(100, Math.max(0, Math.round(v)));\n } else if (action === 'mute' || action === 'unmute') {\n id = `${player.base}.muted`;\n value = action === 'mute';\n } else if (['play', 'pause', 'next', 'previous'].includes(action)) {\n id = `${player.base}.${action === 'previous' ? 'prev' : action}`;\n value = true;\n } else {\n return JSON.stringify({ ok: false, error: `unknown action '${action}'` });\n }\n await this.setForeignStateAsync(id, { val: value, ack: false });\n this.journal?.stateAccess('set_state', { id, value });\n return JSON.stringify({ ok: true, data: { player: player.name, [action]: value } });\n },\n };\n return [play, control];\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 [i, action] of routine.actions.entries()) {\n const start = Date.now();\n try {\n await this.runTriggerAction({ id: `routine:${routine.name}`, when: [] }, action, origin);\n this.journal?.step({\n stage: 'routine',\n title: `Routine action ${i + 1}/${routine.actions.length}`,\n ms: Date.now() - start,\n data: action,\n });\n } catch (e) {\n this.log.warn(`Routine '${routine.name}': an action failed — ${(e as Error).message}`);\n this.journal?.step({\n stage: 'routine',\n level: 'error',\n title: `Routine action ${i + 1}/${routine.actions.length} failed: ${(e as Error).message}`,\n ms: Date.now() - start,\n data: { action, error: errorInfo(e) },\n });\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 /**\n * The saved configuration with the speech settings of an unsaved form on top. Only the speech fields count,\n * and a key only when one was typed: protected fields never reach the browser, so they are empty there.\n * Without fallbacks: a test must show whether the chosen engine works, not whether the reserve does.\n */\n private withVoiceForm(form: Record<string, unknown>): AdapterConfig {\n const cfg: Record<string, unknown> = { ...this.config, sttFallback: '', ttsFallback: '' };\n for (const key of VOICE_FORM_FIELDS) {\n const value = form[key];\n if (typeof value !== 'string' || (VOICE_FORM_SECRETS.includes(key) && !value.trim())) {\n continue;\n }\n cfg[key] = value;\n }\n return cfg as unknown as AdapterConfig;\n }\n\n /** Build the TTS engine of a configuration (throws when no voice key is available). */\n private async buildTtsEngine(cfg: AdapterConfig = this.config): Promise<TtsEngine> {\n const creds = await resolveVoiceCredentials(this, cfg, await this.speechLlmKey());\n return createTtsEngine(cfg.ttsProvider || 'openai', this.voiceContext(cfg, creds));\n }\n\n /**\n * Speech recognition for the voice test of the settings: a recording of the browser, an uploaded file or the\n * test sentence the TTS just spoke. WAV is read directly, anything else goes through ffmpeg.\n */\n private async transcribeForTest(msg: {\n audio?: string;\n format?: string;\n language?: string;\n config?: Record<string, unknown>;\n }): Promise<{ text?: string; ms?: number; audioMs?: number; error?: string }> {\n try {\n if (!msg.audio) {\n return { error: 'no audio' };\n }\n const cfg = msg.config ? this.withVoiceForm(msg.config) : this.config;\n const data = Buffer.from(msg.audio, 'base64');\n const { pcm, sampleRate } =\n (msg.format || 'wav') === 'wav' && data.toString('latin1', 0, 4) === 'RIFF'\n ? pcmFromResponse(data, '')\n : await this.decodeAudioBufferToPcm(data);\n const creds = await resolveVoiceCredentials(this, cfg, await this.speechLlmKey());\n const stt = createSttEngine(cfg.sttProvider || 'openai', this.voiceContext(cfg, creds));\n const language = msg.language || cfg.voiceLanguage || this.language || '';\n const start = Date.now();\n const text = await stt.transcribe(pcm, sampleRate, language, await this.buildSttHints());\n return { text, ms: Date.now() - start, audioMs: Math.round((pcm.length / 2 / sampleRate) * 1000) };\n } catch (e) {\n return { error: (e as Error).message };\n }\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 cfg: AdapterConfig = this.config,\n ): Promise<{ audio?: string; mime?: string; sampleRate?: number; audioMs?: number; ms?: number; error?: string }> {\n if (!text.trim()) {\n return { error: 'empty text' };\n }\n try {\n const tts = await this.buildTtsEngine(cfg);\n const lang = language || cfg.voiceLanguage || this.language || '';\n const start = Date.now();\n const { pcm, sampleRate } = await tts.synthesize(text, lang);\n return {\n audio: this.pcmToWav(pcm, sampleRate).toString('base64'),\n mime: 'audio/wav',\n sampleRate,\n // a wrong rate shows up as an implausible length of the spoken text\n audioMs: Math.round((pcm.length / 2 / sampleRate) * 1000),\n ms: Date.now() - start,\n };\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 // `system`: the model is chosen in the system settings of admin\n if (provider === 'none' || provider === 'pi-agent' || provider === 'system') {\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 if (provider === 'pi-agent') {\n return { error: 'pi-agent has its own connection test in its instance settings.' };\n }\n if (provider === 'system') {\n const llm = await resolveSystemLlm(this, await readSystemAi(this), true);\n if ('error' in llm) {\n return { error: llm.error };\n }\n const res = await new LlmAgent({ ...llm, maxTokens: 16, tools: [], log: this.log }).testConnection();\n return res.ok\n ? { result: `Connection OK (${llm.provider} · ${llm.model || 'auto'})` }\n : { error: res.error || 'unknown error' };\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"]}
|
|
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';\nimport { AsyncLocalStorage } from 'node:async_hooks';\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 mentionsScript,\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 buildWeatherAnswer,\n trimReport,\n type WeatherReport,\n type StateValues,\n} from './lib/weather';\nimport { Journal, errorInfo, traceDirFor, type JournalOrigin } from './lib/journal';\nimport { LocalLlm, installLocalLlm, isLocalLlmInstalled, isHandoff, DEFAULT_LOCAL_MODEL_URL } from './lib/localLlm';\nimport { resolveApiKey, resolveVoiceCredentials, type LlmKey } 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 directYouTubeTarget,\n findPlayer,\n isNamedChannel,\n isPowerOn,\n parsePlayerRows,\n pickDevice,\n parseYouTubeCommand,\n pickBest,\n searchYouTube,\n spokenTitle,\n type YouTubeDevice,\n type YouTubeHit,\n type YouTubeKind,\n type YouTubePlayer,\n youtubeReply,\n} from './lib/youtube';\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 {\n WAKE_WORD_DIR,\n WAKE_WORD_ID_RE,\n WAKE_WORD_URL_PREFIX,\n loadWakeWord,\n microModelProblem,\n prepareWakeWord,\n type CustomWakeWord,\n} from './lib/voice/wakeWords';\nimport { confirmationTone } from './lib/voice/tone';\nimport {\n createSttEngine,\n createTtsEngine,\n listVoices,\n listSttModels,\n listTtsModels,\n type EngineContext,\n type VoiceCredentials,\n type SpeechProvider,\n} from './lib/voice/engines';\nimport { pcmFromResponse } from './lib/voice/openrouter';\nimport { MAX_TTS_CHARS, parseTtsMaxChars, spokenLengthHint } from './lib/voice/ttsCache';\nimport { CaptureStore, type DiscardedCapture } from './lib/voice/captures';\nimport { PiAgentHarness, PI_AGENT_TIMEOUT_SEC, composeInstructions } from './lib/piAgent';\nimport {\n SYSTEM_AI_ID,\n readSystemAi,\n resolveLlm,\n resolveSystemLlm,\n systemAiFingerprint,\n systemAiSelection,\n usesSystemAi,\n type ResolvedLlm,\n} from './lib/systemAi';\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 * How long the NLU device model stays valid. Building it costs a `list_devices` plus a name lookup per\n * device, and one spoken command needs it up to three times (STT hints, NLU, the cloud device list).\n * Enum and name changes drop it at once (see {@link ListCache.onClear}); the TTL only catches devices\n * that were added or renamed elsewhere.\n */\nconst NLU_DEVICES_TTL_MS = 60_000;\n\n/**\n * How long a question of the cloud model about a script keeps the next request of that source with the cloud model\n * (the reply, e.g. \"the kitchen light, every hour\", says nothing about a script). As long as pi-agent waits for a\n * confirmation by text.\n */\nconst SCRIPT_TOPIC_MS = 2 * 60_000;\n\n/** Why a request skips the local tiers: it names a script, or it answers a question about one. */\ntype CloudOnly = 'script' | 'scriptReply' | null;\n\n/** Default for `localLlmTimeoutSec`: after this the local model is stopped and the next tier answers. */\nconst LOCAL_LLM_TIMEOUT_SEC = 15;\n/**\n * Answer length cap of the local model. It answers small talk and general questions, mostly by voice, and\n * on a Raspberry Pi every token costs about a fifth of a second — 512 tokens would be a minute and a half.\n */\nconst LOCAL_LLM_MAX_TOKENS = 256;\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/** Fields of the Voice tab the voice test takes from the unsaved form (everything an STT or TTS engine is built from). */\n/** Transports whose answer is spoken by a satellite (and therefore cut at `ttsMaxChars`). */\nconst VOICE_TRANSPORTS: ReadonlySet<string> = new Set(['esphome', 'udp', 'native', 'wyoming']);\n\nconst VOICE_FORM_FIELDS = [\n 'voiceLanguage',\n 'sttProvider',\n 'sttModel',\n 'openrouterSttModel',\n 'voskModel',\n 'ttsProvider',\n 'ttsVoice',\n 'ttsModel',\n 'voiceCredentialType',\n 'voiceApiKey',\n 'voiceCredentialId',\n 'openrouterSpeechKey',\n 'openrouterCredentialId',\n 'openrouterTtsModel',\n 'openrouterVoice',\n 'azureSpeechKey',\n 'azureSpeechRegion',\n 'azureCredentialId',\n 'azureVoice',\n 'awsAccessKeyId',\n 'awsSecretAccessKey',\n 'awsRegion',\n 'awsCredentialId',\n 'awsVoice',\n 'piperVoice',\n];\n/** Of those, the protected ones: the browser never gets them, so an empty value there means \"keep the saved one\" */\nconst VOICE_FORM_SECRETS = ['voiceApiKey', 'openrouterSpeechKey', 'azureSpeechKey', 'awsSecretAccessKey'];\n\n/** An empty `ask` from the same caller is reported at most this often. */\nconst EMPTY_ASK_REPORT_MS = 60_000;\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/** How long a TV may take to report \"on\" after it was switched on for YouTube. */\nconst TV_POWER_TIMEOUT_MS = 30_000;\n/** How long youtube-remote may take to acknowledge a play command (it goes through Google's lounge). */\nconst YOUTUBE_ACK_TIMEOUT_MS = 8000;\n/** Pause before the play command is repeated once on a TV that just booted. */\nconst YOUTUBE_RETRY_MS = 5000;\n\n/** Outcome of {@link Assistant.playYouTube}: the reply to speak plus what was found. */\ninterface YouTubePlayResult {\n ok: boolean;\n text: string;\n player?: string;\n hit?: YouTubeHit;\n alternatives?: YouTubeHit[];\n poweringOn?: boolean;\n}\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', 'volumeSet']);\n\n/** An intent in one line for the request trace: \"level Rollo (Büro) = 30\", \"timerSet 300 s\", \"alarmSet 7:05\". */\nfunction describeIntent(intent: NluIntent): string {\n let text = intent.action;\n if (intent.device) {\n text += ` ${intent.device.name}${intent.device.room ? ` (${intent.device.room})` : ''}`;\n } else if (intent.room) {\n text += ` (${intent.room})`;\n }\n if (intent.value !== undefined) {\n text += ` = ${JSON.stringify(intent.value)}`;\n } else if (intent.durationSec !== undefined) {\n text += ` ${intent.durationSec} s`;\n } else if (intent.hour !== undefined) {\n text += ` ${intent.hour}:${String(intent.minute ?? 0).padStart(2, '0')}`;\n }\n if (intent.delaySec !== undefined) {\n text += ` in ${intent.delaySec} s`;\n } else if (intent.at) {\n text += ` at ${intent.at.day ? `+${intent.at.day}d ` : ''}${intent.at.hour}:${String(intent.at.minute).padStart(2, '0')}`;\n }\n return text;\n}\n\n/** A device command for later (\"in 2 Stunden\", \"um 22 Uhr\") — goes into the calendar, not to the device */\nfunction isDeferred(intent: NluIntent): boolean {\n return intent.delaySec !== undefined || !!intent.at;\n}\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 /** Provider \"pi-agent\": the cloud tier is a pi-agent instance instead of {@link agent}. */\n private piAgent: PiAgentHarness | null = null;\n /** The cloud LLM of the instance (own or system-wide settings); `null` without one. */\n private llm: ResolvedLlm | null = null;\n /** What of `system.ai` this instance depends on, while it takes the system-wide AI settings. */\n private systemAiWatch: { fingerprint: string; credentialId: string } | 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 /** The NLU device model of {@link getNluDevices}, shared by all callers (and concurrent requests). */\n private nluDevices: {\n key: string;\n at: number;\n result: Promise<{ rooms: string[]; devices: NluDevice[] }>;\n } | 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 /** Uploaded wake words (`assistant.0/wakewords/`), offered to every ESPHome satellite. */\n private readonly customWakeWords = new Map<string, CustomWakeWord>();\n /** Loads {@link customWakeWords} once from the file storage; later calls wait for the same load. */\n private customWakeWordsLoaded: Promise<void> | 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 /** Satellites whose `volume` state exists and is subscribed (see updateSatelliteVolume). */\n private readonly satVolumeEnsured = new Set<string>();\n /** Native (ioBroker) satellite state-id → sender instance id, so we can push announcements back to it. */\n private readonly nativeSatFrom = new Map<string, string>();\n /** Countdown timers / reminders (roadmap #2); mirrored into `timers.*` states. Null until onReady. */\n private timers: TimerManager | null = null;\n /** Per-timer `timers.items.<id>` channels currently rendered, so we can delete the ones that expire. */\n private readonly timerObjIds = new Set<string>();\n /** Alarms at a fixed clock time (roadmap #2); mirrored into `alarms.*` states. Null until onReady. */\n private alarms: AlarmManager | null = null;\n /** Per-alarm `alarms.items.<id>` channels currently rendered. */\n private readonly alarmObjIds = new Set<string>();\n /** 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 /** YouTube players from the configuration; the first one is the default. */\n private youtubePlayers: YouTubePlayer[] = [];\n /**\n * Where the request being answered came from, for the LLM tools: a tool only gets the model's\n * arguments, but \"play X\" from the bedroom satellite should go to the bedroom TV.\n */\n private readonly requestOrigin = new AsyncLocalStorage<{ source: string; room: string; voice: boolean }>();\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 // Provider \"pi-agent\": the adapter pi-agent is the cloud tier, with its own model, key and tools.\n const harness = provider === 'pi-agent';\n // Provider \"system\" (or no key of its own): provider, model and key of the system-wide AI settings.\n if (!localOnly && !harness && usesSystemAi(cfg)) {\n await this.watchSystemAi();\n }\n const resolved = localOnly || harness ? null : await resolveLlm(this, cfg);\n this.llm = resolved && !('error' in resolved) ? resolved : null;\n // speech of the same vendor reuses the key of the LLM\n const llmKey: LlmKey | null = this.llm ? { provider: this.llm.provider, apiKey: this.llm.apiKey } : null;\n await this.setupJournal();\n\n if (harness && !(cfg.piAgentInstance || '').trim()) {\n this.log.warn(\n 'Provider \"pi-agent\" without an instance — choose the pi-agent instance in the adapter settings.',\n );\n await this.setStateAsync('info.connection', { val: false, ack: true });\n return;\n }\n if (resolved && 'error' in resolved) {\n this.log.warn(resolved.error);\n await this.setStateAsync('info.connection', { val: false, ack: true });\n return;\n }\n if (this.llm?.system) {\n this.log.info(`LLM from the system-wide AI settings: ${this.llm.provider} · ${this.llm.model || 'auto'}`);\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 this.listCache.onClear = () => {\n this.nluDevices = null;\n };\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.calendarInstance || '').trim()) {\n tools.push(...this.buildCalendarTools());\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.youtubePlayers = parsePlayerRows(cfg.youtubePlayers);\n if (this.youtubePlayers.length) {\n // Before the tools are built: their descriptions carry the player names, which an instance\n // row only gets from its device.\n for (const player of this.youtubePlayers) {\n if (!(await this.resolveYouTubePlayer(player))) {\n this.log.warn(`YouTube: ${player.instance} has no paired TV yet — pair one in its settings.`);\n }\n }\n tools.push(...this.buildYouTubeTools());\n this.log.info(`YouTube players: ${this.youtubePlayers.map(p => p.name).join(', ')}.`);\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 (harness) {\n this.piAgent = new PiAgentHarness(\n this,\n cfg.piAgentInstance.trim(),\n Math.max(5, Number(cfg.piAgentTimeoutSec) || PI_AGENT_TIMEOUT_SEC) * 1000,\n );\n } else if (this.llm) {\n this.agent = new LlmAgent({\n provider: this.llm.provider,\n apiKey: this.llm.apiKey,\n model: this.llm.model,\n baseUrl: this.llm.baseUrl,\n systemPrompt: cfg.systemPrompt || '',\n maxTokens: cfg.maxTokens || 1024,\n tools: tools.map(t => this.journalTool(t)),\n log: this.log,\n trace: step => this.journal?.step(step),\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=${this.llm?.provider}, model=${this.agent.model || 'auto'}).`\n : this.piAgent\n ? `Assistant ready (cloud tier: ${this.piAgent.instance}).`\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(llmKey);\n }\n }\n\n if (cfg.wyomingEnabled) {\n await this.startWyoming(llmKey);\n }\n\n if (cfg.esphomeEnabled) {\n await this.startEsphome(llmKey);\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(llmKey: LlmKey | null): Promise<void> {\n const cfg = this.config;\n const creds = await resolveVoiceCredentials(this, cfg, llmKey);\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, audioMs) =>\n this.answer(question, 'wyoming', { transport: 'wyoming', sttMs, audioMs }),\n onSpoken: info => this.reportSpoken('wyoming', info),\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(llmKey: LlmKey | null): 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, llmKey);\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 await this.loadCustomWakeWords();\n for (const word of this.customWakeWords.values()) {\n this.serveWakeWord(word);\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 audioMs: origin.audioMs,\n vad: origin.vad,\n }),\n onSpoken: (device, info) => this.reportSpoken(device, info),\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, device) => this.followUpFor(device, answer),\n onDiscarded: cfg.esphomeSaveCaptures ? capture => this.keepCapture(capture) : undefined,\n externalWakeWords: () =>\n [...this.customWakeWords.values()].map(w => ({\n id: w.id,\n phrase: w.phrase,\n languages: w.languages,\n size: w.size,\n sha256: w.sha256,\n path: `${WAKE_WORD_URL_PREFIX}${w.id}.json`,\n })),\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 openrouter: (cfg.openrouterVoice || '').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 openrouterSttModel: (cfg.openrouterSttModel || '').trim(),\n openrouterTtsModel: (cfg.openrouterTtsModel || '').trim(),\n decodeAudio: audio => this.decodeAudioBufferToPcm(audio),\n ttsMaxChars: parseTtsMaxChars(cfg.ttsMaxChars),\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(llmKey: LlmKey | null): Promise<void> {\n const cfg = this.config;\n const creds = await resolveVoiceCredentials(this, cfg, llmKey);\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, {\n transport: 'udp',\n room: ctx.room,\n sttMs: ctx.sttMs,\n audioMs: ctx.audioMs,\n }),\n onSpoken: (device, info) => this.reportSpoken(device, info),\n expectsFollowUp: (answer, device) => this.followUpFor(device, answer),\n onVolume: (device, room, level) => {\n this.updateSatelliteVolume(device, room, level).catch(e =>\n this.log.debug(`satellite volume update failed: ${(e as Error).message}`),\n );\n },\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 /** A transport synthesised the reply to `source`'s latest request — the journal shows it with that request. */\n private reportSpoken(source: string, info: { ms: number; audioMs: number }): void {\n const cfg = this.config;\n const provider = cfg.ttsProvider || 'openai';\n const voices: Record<string, string | undefined> = {\n openai: cfg.ttsVoice || 'alloy',\n azure: cfg.azureVoice,\n aws: cfg.awsVoice,\n piper: cfg.piperVoice,\n openrouter: cfg.openrouterVoice,\n };\n this.journal?.spoken(source, {\n ...info,\n provider,\n fallback: cfg.ttsFallback || undefined,\n voice: (voices[provider] || '').trim() || undefined,\n });\n }\n\n /** Per caller of `ask`: when an empty question was last reported, and how many came since. */\n private readonly emptyAsks = new Map<string, { reportedAt: number; count: number }>();\n\n /**\n * An empty `ask` is rejected, and reported once a minute per caller. Field report (2026-11-03): a caller asked\n * with empty text every time an answer arrived — about once a second, each one a pi-agent request about \"only\n * the time\" (the time context was the whole question) and paid tokens. A script that asks on every change of\n * `text.response` loops exactly like that.\n */\n private reportEmptyAsk(from: string): void {\n const now = Date.now();\n const entry = this.emptyAsks.get(from) ?? { reportedAt: 0, count: 0 };\n entry.count++;\n if (now - entry.reportedAt >= EMPTY_ASK_REPORT_MS) {\n this.log.warn(\n `Ignoring an empty question from ${from} (sendTo \"ask\")${\n entry.count > 1 ? ` — ${entry.count} since the last report` : ''\n }. A script that asks whenever text.response changes keeps doing this in a loop.`,\n );\n entry.reportedAt = now;\n entry.count = 0;\n }\n this.emptyAsks.set(from, entry);\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 creds = await resolveVoiceCredentials(this, cfg, await this.speechLlmKey());\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 const ms = Math.round((pcm.length / 2 / rate) * 1000);\n this.log.info(\n `Voice Q (${source}): (empty) — speech recognition returned no text for ${ms} ms of audio`,\n );\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 audioMs: Math.round((pcm.length / 2 / rate) * 1000),\n });\n if (!answer) {\n return { text, answer: '' };\n }\n const ttsStart = Date.now();\n const reply = await engines.tts.synthesize(answer, language);\n this.reportSpoken(source, {\n ms: Date.now() - ttsStart,\n audioMs: (reply.pcm.length / 2 / reply.sampleRate) * 1000,\n });\n const listen = this.followUpFor(source, answer);\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 openrouterSpeechKey?: string;\n openrouterCredentialId?: string;\n openrouterTtsModel?: 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 creds = await resolveVoiceCredentials(this, cfg, await this.speechLlmKey());\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 * Mirror the playback volume a UDP satellite reported into `satellites.<id>.volume`. The state only\n * appears for satellites that speak the `volume` message — an older one would never answer a write.\n */\n private async updateSatelliteVolume(device: string, room: string, level: number): Promise<void> {\n const id = await this.ensureSatelliteObjects(device, room);\n const stateId = `satellites.${id}.volume`;\n if (!this.satVolumeEnsured.has(id)) {\n await this.setObjectNotExistsAsync(stateId, {\n type: 'state',\n common: {\n name: 'Playback volume',\n type: 'number',\n role: 'level.volume',\n unit: '%',\n min: 0,\n max: 100,\n read: true,\n write: true,\n },\n native: {},\n });\n this.subscribeStates(stateId);\n this.satVolumeEnsured.add(id);\n }\n await this.setStateAsync(stateId, { val: level, ack: true });\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 // `custom` marks the uploaded ones, so the settings dialog can offer to delete them.\n const words = config.available.map(w => (this.customWakeWords.has(w.id) ? { ...w, custom: true } : w));\n await this.setStateAsync(`${base}.availableWakeWords`, {\n val: JSON.stringify({ max: config.max, words }),\n ack: true,\n });\n }\n\n /** Store for `esphomeSaveCaptures`, in the adapter's file storage (Admin → Files → assistant.N/captures). */\n private captureStore: CaptureStore | null = null;\n\n /** Keep a dropped ESPHome recording for diagnosis (`esphomeSaveCaptures`). Never blocks the voice pipeline. */\n private keepCapture(capture: DiscardedCapture): void {\n this.captureStore ||= new CaptureStore({\n write: async (path, data) => {\n await this.writeFileAsync(this.namespace, path, data);\n },\n list: async dir => {\n try {\n const entries = await this.readDirAsync(this.namespace, dir);\n return entries.filter(e => !e.isDir).map(e => e.file);\n } catch {\n return []; // nothing kept yet\n }\n },\n remove: async path => {\n await this.delFileAsync(this.namespace, path);\n },\n });\n this.captureStore\n .save(capture)\n .then(path => this.log.debug(`ESPHome ${capture.device}: recording kept as ${this.namespace}/${path}`))\n .catch(e => this.log.warn(`Could not keep the recording of ${capture.device}: ${(e as Error).message}`));\n }\n\n /** Read the uploaded wake words (`<instance>/wakewords/<id>.json` + `.tflite`) once. */\n private loadCustomWakeWords(): Promise<void> {\n this.customWakeWordsLoaded ||= (async () => {\n let entries: ioBroker.ReadDirResult[] = [];\n try {\n entries = await this.readDirAsync(this.namespace, WAKE_WORD_DIR);\n } catch {\n return; // nothing uploaded yet\n }\n for (const entry of entries) {\n const id = entry.file.replace(/\\.json$/, '');\n if (entry.isDir || !entry.file.endsWith('.json') || !WAKE_WORD_ID_RE.test(id)) {\n continue;\n }\n try {\n const config = await this.readStoredFile(`${WAKE_WORD_DIR}/${id}.json`, 'utf8');\n const model = await this.readStoredFile(`${WAKE_WORD_DIR}/${id}.tflite`, 'binary');\n const word = loadWakeWord(id, config, model);\n this.customWakeWords.set(id, word);\n // Uploaded before the upload checked the model: keep it, so it can be deleted in the dialog.\n const problem = microModelProblem(model);\n if (problem) {\n this.log.warn(\n `Custom wake word ${word.phrase} (${id}) cannot run on the device: ${problem}. Delete it in the satellite settings.`,\n );\n }\n } catch (e) {\n this.log.warn(`Custom wake word ${id} skipped: ${(e as Error).message}`);\n }\n }\n if (this.customWakeWords.size) {\n this.log.info(\n `Custom wake words: ${[...this.customWakeWords.values()].map(w => `${w.phrase} (${w.id})`).join(', ')}`,\n );\n }\n })();\n return this.customWakeWordsLoaded;\n }\n\n /**\n * Read a file from this instance's file storage as a Buffer. Depending on the backend and the file's\n * type it comes back as a Buffer or a string — `encoding` says how to read the latter.\n */\n private async readStoredFile(name: string, encoding: BufferEncoding): Promise<Buffer> {\n const res = (await this.readFileAsync(this.namespace, name)) as { file?: Buffer | string } | Buffer | string;\n const f = Buffer.isBuffer(res) || typeof res === 'string' ? res : res.file;\n if (f == null) {\n throw new Error(`${name} not found`);\n }\n return Buffer.isBuffer(f) ? f : Buffer.from(f, encoding);\n }\n\n private serveWakeWord(word: CustomWakeWord): void {\n this.media?.serve(`${WAKE_WORD_URL_PREFIX}${word.id}.json`, word.config, 'application/json');\n this.media?.serve(`${WAKE_WORD_URL_PREFIX}${word.id}.tflite`, word.model, 'application/octet-stream');\n }\n\n /**\n * Store an uploaded wake word and offer it to the connected satellites. It shows up in their wake\n * word list right away; a device downloads the model only when it is selected there.\n */\n private async addCustomWakeWord(\n message: Record<string, unknown>,\n ): Promise<{ id: string; phrase: string; languages: string[]; size: number; devices: number }> {\n await this.loadCustomWakeWords();\n const text = (value: unknown): string | undefined => (typeof value === 'string' ? value : undefined);\n const languages = (\n Array.isArray(message.languages)\n ? message.languages.map(String)\n : (text(message.languages) ?? '').split(/[,;\\s]+/)\n ).filter(Boolean);\n const word = prepareWakeWord(\n {\n model: Buffer.from(text(message.model) ?? '', 'base64'),\n fileName: text(message.fileName),\n config:\n message.config && typeof message.config === 'object'\n ? (message.config as Record<string, unknown>)\n : text(message.config),\n phrase: text(message.phrase),\n languages,\n },\n this.config.voiceLanguage || this.language || '',\n );\n if (!this.customWakeWords.has(word.id)) {\n await this.writeFileAsync(this.namespace, `${WAKE_WORD_DIR}/${word.id}.tflite`, word.model);\n await this.writeFileAsync(this.namespace, `${WAKE_WORD_DIR}/${word.id}.json`, word.config);\n this.customWakeWords.set(word.id, word);\n this.serveWakeWord(word);\n this.log.info(`Custom wake word uploaded: ${word.phrase} (${word.id}, ${word.size} bytes)`);\n }\n const devices = this.esphome?.refreshWakeWords() ?? 0;\n return { id: word.id, phrase: word.phrase, languages: word.languages, size: word.size, devices };\n }\n\n /**\n * Remove an uploaded wake word: it is no longer offered or served. A device that already downloaded\n * it keeps its copy — the ESPHome API cannot delete a model from a device.\n */\n private async deleteCustomWakeWord(id: string): Promise<void> {\n await this.loadCustomWakeWords();\n if (!WAKE_WORD_ID_RE.test(id) || !this.customWakeWords.has(id)) {\n throw new Error(`unknown wake word ${id}`);\n }\n for (const ext of ['json', 'tflite']) {\n await this.delFileAsync(this.namespace, `${WAKE_WORD_DIR}/${id}.${ext}`).catch(() => undefined);\n this.media?.unserve(`${WAKE_WORD_URL_PREFIX}${id}.${ext}`);\n }\n this.customWakeWords.delete(id);\n this.esphome?.refreshWakeWords();\n this.log.info(`Custom wake word deleted: ${id}`);\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 if (entity.kind === 'number') {\n // Objects from before float32() kept the raw float noise (step 0.0010000000474974513);\n // the device may also change its range with a firmware update.\n await this.syncNumberRange(id, entity);\n }\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 /** Bring min/max/step of an existing number control in line with what the device announces now. */\n private async syncNumberRange(id: string, entity: EsphomeEntity): Promise<void> {\n const obj = await this.getObjectAsync(id);\n if (!obj || obj.type !== 'state') {\n return;\n }\n const wanted = { min: entity.min, max: entity.max, step: entity.step };\n const common = obj.common;\n if (common.min !== wanted.min || common.max !== wanted.max || common.step !== wanted.step) {\n await this.extendObjectAsync(id, { common: wanted });\n }\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 let val = entity.value as ioBroker.StateValue;\n // The device says how many decimals of a measurement mean something; the rest is noise.\n if (\n entity.kind === 'sensor' &&\n typeof val === 'number' &&\n entity.decimals !== undefined &&\n entity.decimals >= 0\n ) {\n val = Number(val.toFixed(Math.min(entity.decimals, 10)));\n }\n await this.setStateAsync(base, { val, 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 const playMs = (pcm.length / 2 / sampleRate) * 1000;\n allowed.forEach(d => this.voice!.listen(d, playMs));\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 /** Vendor and key of the cloud LLM: speech of the same vendor (OpenAI, OpenRouter) reuses the key. */\n private async speechLlmKey(): Promise<LlmKey | null> {\n const provider = this.config.provider || 'openai';\n const llm =\n this.llm ?? (provider === 'none' || provider === 'pi-agent' ? null : await resolveLlm(this, this.config));\n return llm && !('error' in llm) ? { provider: llm.provider, apiKey: llm.apiKey } : null;\n }\n\n /**\n * Restart when the system-wide AI settings this instance takes change — also when they are still empty, so\n * setting them up in admin starts the instance. The credential is watched too: a new key needs no new id.\n */\n private async watchSystemAi(): Promise<void> {\n const native = await readSystemAi(this);\n const credentialId = systemAiSelection(native)?.credentialId || '';\n this.systemAiWatch = { fingerprint: systemAiFingerprint(native), credentialId };\n await this.subscribeForeignObjectsAsync(SYSTEM_AI_ID);\n if (credentialId) {\n await this.subscribeForeignObjectsAsync(credentialId);\n }\n }\n\n private onObjectChange(id: string, obj: ioBroker.Object | null | undefined): void {\n if (this.systemAiWatch && (id === SYSTEM_AI_ID || id === this.systemAiWatch.credentialId)) {\n // A credential has no fingerprint: a change of it is a new key.\n if (id === SYSTEM_AI_ID && systemAiFingerprint(obj?.native) === this.systemAiWatch.fingerprint) {\n return;\n }\n this.log.info(`The system-wide AI settings changed (${id}) — restarting.`);\n this.systemAiWatch = null;\n this.restart();\n return;\n }\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 // Playback volume of a UDP satellite — not acked here: the satellite reports the level it took.\n const satVolume = id.match(/\\.satellites\\.([^.]+)\\.volume$/);\n if (satVolume) {\n const device = this.satDeviceById.get(satVolume[1]) || satVolume[1];\n if (!this.voice?.volume(device, { level: Number(state.val) })) {\n this.log.warn(`Cannot set the volume of '${device}': it is not a registered UDP satellite.`);\n }\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 openrouterSpeechKey?: string;\n openrouterCredentialId?: string;\n openrouterTtsModel?: string;\n },\n );\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, voices, obj.callback);\n }\n return;\n }\n\n // STT/TTS model dropdowns (Vosk, OpenRouter): suggest model names for the selected provider.\n if (obj.command === 'getSttModels' || obj.command === 'getTtsModels') {\n const msg = (obj.message || {}) as {\n sttProvider?: SpeechProvider;\n ttsProvider?: SpeechProvider;\n language?: string;\n };\n const cfg = this.config;\n const language = msg.language || cfg.voiceLanguage || this.language || '';\n let models: string[] = [];\n try {\n models =\n obj.command === 'getSttModels'\n ? await listSttModels(msg.sttProvider || cfg.sttProvider || 'openai', language)\n : await listTtsModels(msg.ttsProvider || cfg.ttsProvider || 'openai');\n } catch (e) {\n this.log.warn(`${obj.command} failed: ${(e as Error).message}`);\n }\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, models, 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: find and play something on a configured YouTube player, the TV switched on first.\n // message = { query, kind?: 'channel'|'video'|'playlist', player? } → { ok, text, title?, id?, player? }\n // Settings: the \"Player\" column of the YouTube table (selectSendTo).\n if (obj.command === 'getYouTubeInstances') {\n const list = await this.getYouTubeInstances();\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, list, obj.callback);\n }\n return;\n }\n\n if (obj.command === 'playYouTube') {\n const m = (obj.message || {}) as { query?: string; kind?: string; player?: string };\n const kind = m.kind === 'channel' || m.kind === 'playlist' || m.kind === 'video' ? m.kind : 'auto';\n const res = String(m.query || '').trim()\n ? await this.playYouTube(String(m.query).trim(), kind, m.player)\n : { ok: false, text: 'no query given' };\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, this.youtubeResultData(res), 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 // Settings dialog / scripts: own wake words for the ESPHome satellites (microWakeWord models).\n // uploadWakeWord: { model: base64 .tflite, fileName?, config?: JSON text, phrase?, languages? }\n // → { ok, id, phrase, languages, size, devices } | { error }\n // deleteWakeWord: { id } → { ok } | { error }; listWakeWords → { wakeWords: [{id, phrase, …}] }\n if (obj.command === 'uploadWakeWord' || obj.command === 'deleteWakeWord' || obj.command === 'listWakeWords') {\n const m = (obj.message || {}) as Record<string, unknown>;\n let payload: Record<string, unknown>;\n try {\n if (obj.command === 'uploadWakeWord') {\n payload = { ok: true, ...(await this.addCustomWakeWord(m)) };\n } else if (obj.command === 'deleteWakeWord') {\n await this.deleteCustomWakeWord(typeof m.id === 'string' ? m.id : '');\n payload = { ok: true };\n } else {\n await this.loadCustomWakeWords();\n payload = {\n wakeWords: [...this.customWakeWords.values()].map(w => ({\n id: w.id,\n phrase: w.phrase,\n languages: w.languages,\n size: w.size,\n })),\n };\n }\n } catch (e) {\n payload = { error: (e as Error).message };\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 and the voice test of the settings: synthesize to speech (WAV) via the configured TTS engine,\n // or via the unsaved settings of the Voice tab (`config`).\n if (obj.command === 'tts') {\n const { text, language, config } = (obj.message || {}) as {\n text?: string;\n language?: string;\n config?: Record<string, unknown>;\n };\n const cfg = config ? this.withVoiceForm(config) : this.config;\n const result = await this.synthesizeToWav(String(text ?? ''), language, cfg);\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, result, obj.callback);\n }\n return;\n }\n\n // Voice test of the settings: recognize a recording with the (unsaved) speech-to-text settings.\n if (obj.command === 'stt') {\n const result = await this.transcribeForTest(\n (obj.message || {}) as {\n audio?: string;\n format?: string;\n language?: string;\n config?: Record<string, unknown>;\n },\n );\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 // Admin chat debug view: one request with every step of its processing (message = { id }).\n if (obj.command === 'getJournalTrace') {\n const id = String((obj.message as { id?: string } | undefined)?.id || '');\n const entry = this.journal?.get(id);\n const result = entry\n ? { entry, steps: await this.journal!.trace(id) }\n : { error: this.journal?.enabled ? 'unknown request' : 'journal disabled' };\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 // Who sent it (javascript.0, telegram.0, admin.0 for the chat tab) — the way to find a script gone wrong.\n const caller = String(obj.from || '').replace(/^system\\.adapter\\./, '') || 'unknown';\n\n const question = String(text ?? '').trim();\n if (!question) {\n this.reportEmptyAsk(caller);\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, { error: 'empty question' }, obj.callback);\n }\n return;\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 this.log.info(`Q (${obj.command} from ${caller}): ${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 if (!question.trim()) {\n // Nothing to answer — and a model asked with nothing but the time context still costs a request.\n return Promise.resolve('');\n }\n const voice = VOICE_TRANSPORTS.has(origin.transport || '');\n return this.requestOrigin.run({ source, room: origin.room || '', voice }, () =>\n this.journal\n ? this.journal.run(question, source, origin, () => {\n this.traceSpeechInput(question, origin);\n return this.answerTracked(question, source);\n })\n : this.answerTracked(question, source),\n );\n }\n\n /** Speech recognition happened before the request: put it at the head of its trace. */\n private traceSpeechInput(question: string, origin: JournalOrigin): void {\n if (origin.sttMs === undefined) {\n return;\n }\n const cfg = this.config;\n const provider = cfg.sttProvider || 'openai';\n const audio = origin.audioMs !== undefined ? `, ${(origin.audioMs / 1000).toFixed(1)} s of audio` : '';\n this.journal?.step({\n stage: 'stt',\n title: `Speech recognition: ${provider}${audio}`,\n ms: origin.sttMs,\n data: {\n provider,\n fallback: cfg.sttFallback || undefined,\n model:\n (provider === 'openrouter' ? cfg.openrouterSttModel : cfg.sttModel || cfg.voskModel || '').trim() ||\n undefined,\n language: cfg.voiceLanguage || this.language || '',\n audioMs: origin.audioMs,\n wakeWord: origin.wakeWord,\n vad: origin.vad,\n transcript: question,\n },\n });\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 if (history.length) {\n this.journal?.step({\n stage: 'context',\n title: `Conversation context: ${history.length} earlier turn(s) of '${source}'`,\n data: history,\n });\n }\n const cloudOnly = this.cloudOnlyReason(question, source);\n const raw = await this.produceAnswer(question, history, source, cloudOnly);\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 keep it per source:\n // two satellites answered at the same time must not hand each other their mic-on.\n const followUp = /\\[\\[LISTEN\\]\\]/i.test(raw);\n this.followUps.set(source, followUp);\n // A script conversation goes on while the cloud model asks back: the reply goes to it as well.\n if (cloudOnly && followUp) {\n this.scriptTopics.set(source, Date.now());\n } else {\n this.scriptTopics.delete(source);\n }\n if (followUp) {\n this.journal?.note({ followUp: true });\n }\n let result = raw.replace(/\\s*\\[\\[(?:LISTEN|DONE)\\]\\]\\s*/gi, ' ').trim();\n // The LLM answers a switch command that worked with [[DONE]] alone (see doneHint): a beep on the satellite\n // instead of a sentence. Where nothing can beep (chat, Telegram), a short word. With more text, that is said.\n let toned = false;\n if (!result && /\\[\\[DONE\\]\\]/i.test(raw)) {\n toned = await this.playConfirmationTone(source);\n if (!toned) {\n result = this.doneText();\n }\n }\n this.journal?.step({\n stage: 'answer',\n title: toned\n ? 'Confirmed with a tone instead of words'\n : result\n ? `Answer: ${result.length} characters${followUp ? ', waits for a reply' : ''}`\n : 'No spoken answer',\n data: { answer: result, raw: raw !== result ? raw : undefined, followUp, tone: toned || undefined },\n });\n if (useCtx && (result || toned)) {\n this.context.add(source, question, result || this.doneText());\n }\n return result;\n }\n\n /**\n * System-prompt instruction for `confirmWithTone`: a switch command that worked is answered with [[DONE]]\n * alone, which becomes a beep on the satellite. Empty when the option (or voice) is off.\n */\n private doneHint(): string {\n if (!this.config.confirmWithTone || !this.config.voiceEnabled) {\n return '';\n }\n const lang = String(this.config.voiceLanguage || this.language || 'en');\n if (lang === 'ru') {\n return 'Если запрос был только командой включить, выключить или установить устройства на значение и всё получилось, ответь только управляющим маркером [[DONE]] (вместо фразы прозвучит короткий сигнал). На вопросы, при ошибках или если нужно что-то сообщить, отвечай как обычно.';\n }\n if (lang === 'de') {\n return 'Wenn die Anfrage nur ein Befehl war, Geräte ein- oder auszuschalten oder auf einen Wert zu stellen, und alles geklappt hat, antworte ausschließlich mit dem Steuer-Marker [[DONE]] (statt eines Satzes ertönt ein kurzer Bestätigungston). Bei Fragen, bei Fehlern oder wenn du etwas mitteilen musst, antworte normal.';\n }\n return 'If the request was only a command to switch devices on or off or to set them to a value, and everything worked, answer with the control marker [[DONE]] alone (a short beep plays instead of a sentence). For questions, errors or when you have something to tell, answer normally.';\n }\n\n /**\n * Length instruction for a request that came in by voice: the answer is cut at `ttsMaxChars` before it is\n * spoken, so the model is asked to stay within it. Empty for text requests (chat, Telegram, scripts) and\n * when the limit is off.\n */\n private spokenLengthHint(): string {\n if (!this.config.voiceEnabled || !this.requestOrigin.getStore()?.voice) {\n return '';\n }\n const limit = parseTtsMaxChars(this.config.ttsMaxChars) ?? MAX_TTS_CHARS;\n return spokenLengthHint(limit, String(this.config.voiceLanguage || this.language || 'en'));\n }\n\n /** What [[DONE]] says where no beep can be played */\n private doneText(): string {\n const lang = String(this.config.voiceLanguage || this.language || 'en');\n return lang === 'ru' ? 'Готово.' : lang === 'de' ? 'Erledigt.' : 'Done.';\n }\n\n /** Per source: whether its last {@link answer} asked the user something (LLM-signalled via [[LISTEN]]). */\n private readonly followUps = new Map<string, boolean>();\n\n /** Per source: when the cloud model last asked back about a script (see {@link cloudOnlyReason}). */\n private readonly scriptTopics = new Map<string, number>();\n\n /**\n * Whether a request skips routines, YouTube, the rule NLU and the local model: when it is about a script, or answers\n * a question the cloud model asked about one. Writing or changing a script is work for the cloud model, and the\n * rules would read its details as commands of their own (\"… that switches the kitchen light every hour\" was answered\n * with the time). Without a cloud tier the local ones are all there is, so nothing is skipped.\n */\n private cloudOnlyReason(question: string, source: string): CloudOnly {\n if (!this.agent && !this.piAgent) {\n return null;\n }\n if (mentionsScript(question)) {\n return 'script';\n }\n const since = this.scriptTopics.get(source);\n return since !== undefined && Date.now() - since < SCRIPT_TOPIC_MS ? 'scriptReply' : null;\n }\n\n /**\n * Should the satellite behind `source` re-open its mic after this reply? Primarily the LLM's own\n * [[LISTEN]] signal, with a question mark in the reply as the fallback (the NLU and the local tiers\n * cannot emit the marker, but they do ask \"Meinst du Büro oder Wohnzimmer?\").\n */\n private wantsFollowUp(source: string, answer: string): 'llm' | 'question' | null {\n if (!answer) {\n return null;\n }\n if (this.followUps.get(source)) {\n return 'llm';\n }\n return this.expectsFollowUp(answer) ? 'question' : null;\n }\n\n /** {@link wantsFollowUp} for a voice transport, logged, as the `listen` flag of the reply. */\n private followUpFor(source: string, answer: string): boolean {\n const why = this.wantsFollowUp(source, answer);\n if (why) {\n this.log.info(\n `→ mic-on to satellite '${source}' (${why === 'llm' ? 'LLM signalled a follow-up' : 'reply is a question'}).`,\n );\n }\n return !!why;\n }\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 /**\n * The tiers that answer without a model: routines, YouTube and the rule NLU. Null when none of them understood the\n * request.\n */\n private async answerLocally(question: string, source: string): Promise<string | null> {\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 this.journal?.step({ stage: 'routine', title: `Routine \"${routine.name}\" matched`, data: routine });\n await this.runRoutine(routine, source);\n return routine.reply;\n }\n if (this.routines.length) {\n this.journal?.step({\n stage: 'routine',\n title: `No routine matched (${this.routines.length} configured)`,\n data: { phrases: this.routines.map(r => ({ name: r.name, phrases: r.phrases })) },\n });\n }\n // Tier 0: rule-based NLU (device commands) — fastest, offline, free.\n if (!this.config.useLocalNlu) {\n this.journal?.step({ stage: 'nlu', title: 'Rule-based NLU is switched off (useLocalNlu)' });\n return null;\n }\n // \"Spiele den Kanal X ab\" first: the device NLU would find the TV in \"… auf dem Fernseher\" and\n // answer with its power state.\n const yt = this.youtubePlayers.length ? parseYouTubeCommand(question, this.youtubePlayers) : null;\n if (yt) {\n this.log.info(`YouTube request understood locally: ${yt.kind} \"${yt.query}\" (source='${source}').`);\n this.journal?.note({ tier: 'nlu', detail: `youtube ${yt.kind}` });\n const start = Date.now();\n const res = await this.playYouTube(yt.query, yt.kind, yt.player);\n this.journal?.step({\n stage: 'youtube',\n title: `YouTube ${yt.kind} \"${yt.query}\"${yt.player ? ` on \"${yt.player}\"` : ''}`,\n ms: Date.now() - start,\n data: { parsed: yt, result: res },\n });\n return res.text;\n }\n if (this.youtubePlayers.length) {\n this.journal?.step({ stage: 'youtube', title: 'Not a YouTube command' });\n }\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 this.journal?.step({\n stage: 'nlu',\n level: 'warn',\n title: `NLU gave up, the request goes on: ${(e as Error).message}`,\n data: errorInfo(e),\n });\n }\n return null;\n }\n\n private async produceAnswer(\n question: string,\n history: ConversationTurn[],\n source = '',\n cloudOnly: CloudOnly = null,\n ): 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 this.journal?.step({ stage: 'stop', title: `Stop word: silenced ${n} ringing timer/alarm(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 this.journal?.note({ tier: 'askReply', detail: asked || undefined });\n this.journal?.step({\n stage: 'askReply',\n title: `Reply to the open question \"${asked}\"`,\n data: { question: asked, reply: question },\n });\n return '';\n }\n }\n if (cloudOnly) {\n const why =\n cloudOnly === 'script'\n ? 'it is about a script'\n : 'it answers a question of the cloud model about a script';\n this.log.info(`Routines, NLU and local LLM skipped (source='${source}'): ${why}.`);\n this.journal?.step({\n stage: 'nlu',\n title: `Routines, NLU and local LLM skipped: ${why}`,\n data: { reason: cloudOnly },\n });\n } else {\n const local = await this.answerLocally(question, source);\n if (local !== null) {\n return local;\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 // With a cloud LLM it only goes first when asked to (`localLlmFirst`): on a Raspberry Pi a small model\n // needs 10–25 s, often only to hand off, and the cloud then starts from zero. By default it is the\n // fallback for when the cloud fails (see below).\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 // A script request does not even fall back to it: a model without tools cannot write a script.\n const useLocal = !cloudOnly && !!(this.config.useLocalLlm && this.localLlm);\n const cloud = !!(this.agent || this.piAgent);\n const localFirst = useLocal && (!cloud || !!this.config.localLlmFirst);\n if (localFirst && (!history.length || !cloud)) {\n const ans = await this.askLocalLlm(question, weather, source);\n if (ans) {\n return ans;\n }\n } else if (localFirst) {\n this.log.debug('Local LLM skipped (follow-up in an ongoing conversation → cloud LLM).');\n this.journal?.step({\n stage: 'localLlm',\n title: 'Local LLM skipped: follow-up in an ongoing conversation goes to the cloud LLM',\n });\n } else if (useLocal) {\n this.journal?.step({\n stage: 'localLlm',\n title: 'Local LLM not asked first: it is the fallback for when the cloud LLM fails (localLlmFirst)',\n });\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.piAgent) {\n return this.askPiAgent(this.piAgent, question, weather, source, useLocal && !localFirst);\n }\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 this.journal?.step({\n stage: 'none',\n level: 'warn',\n title: 'Nothing local understood the request and no LLM provider is configured',\n });\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 done = this.doneHint();\n const parts = [this.config.systemPrompt || '', followUp, done, 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. A spoken request\n // also gets the length limit, after the question: in the system prompt it would bust the prompt cache\n // every time voice and text requests alternate.\n const time = this.buildTimeContext();\n const lengthHint = this.spokenLengthHint();\n const questionForLlm = [time, weather, question, lengthHint].filter(Boolean).join('\\n\\n');\n this.journal?.note({\n tier: 'cloud',\n detail: `${this.llm?.provider || this.config.provider || 'openai'} · ${this.agent.model || 'auto'}`,\n });\n // What went into the prompt, piece by piece. The device list is only counted: the model's opening\n // step carries the whole system prompt, and with it the list.\n const deviceLines = ctx ? ctx.split('\\n').length - 1 : 0;\n this.journal?.step({\n stage: 'context',\n title: `Prompt: ${deviceLines} devices${mem ? ', memory' : ''}${weather ? ', weather' : ''}${followUp ? ', follow-up marker' : ''}${lengthHint ? ', length limit' : ''}`,\n data: {\n systemPrompt: this.config.systemPrompt || '',\n followUpHint: followUp || undefined,\n doneHint: done || undefined,\n lengthHint: lengthHint || undefined,\n memory: mem || undefined,\n devices: deviceLines,\n time,\n weather: weather || undefined,\n },\n });\n try {\n return await this.agent.ask(questionForLlm, sys, history);\n } catch (e) {\n // Offline, quota, outage: the local model is the fallback — unless it was already asked above.\n if (useLocal && !localFirst) {\n this.log.warn(`Cloud LLM failed (${(e as Error).message}) — asking the local LLM instead.`);\n this.journal?.step({\n stage: 'localLlm',\n level: 'warn',\n title: `Cloud LLM failed (${(e as Error).message}) — asking the local LLM instead`,\n });\n const ans = await this.askLocalLlm(question, weather, source);\n if (ans) {\n return ans;\n }\n }\n throw e;\n }\n }\n\n /**\n * Cloud tier through the adapter pi-agent: one pi-agent conversation per source. The style, the\n * follow-up marker, the memory and the device list are the instructions of that conversation (pi-agent\n * re-configures it only when they change); time, weather and presence change every turn and go in front\n * of the question. The history stays in pi-agent, so nothing of {@link ConversationStore} is sent.\n */\n private async askPiAgent(\n harness: PiAgentHarness,\n question: string,\n weather: string,\n source: string,\n localFallback: boolean,\n ): Promise<string> {\n const followUp = this.config.voiceEnabled ? this.followUpHint() : '';\n // The device list maps names to state ids, so pi-agent can act without searching first. It is the\n // first to go when the instructions get too long — pi-agent can still search.\n const { text: instructions, dropped } = composeInstructions(\n [this.config.systemPrompt || '', followUp, this.doneHint(), this.spokenLengthHint()],\n [this.buildMemoryContext(), await this.buildDeviceContext()],\n );\n if (dropped) {\n this.log.debug(`pi-agent: ${dropped} context block(s) left out, the instructions would be too long.`);\n }\n const text = [this.buildTimeContext(), weather, this.buildPresenceContext(), question]\n .filter(Boolean)\n .join('\\n\\n');\n this.log.info(`Cloud tier ${harness.instance} (source='${source}') — asking pi-agent…`);\n this.journal?.note({ tier: 'cloud', detail: harness.instance });\n try {\n // pi-agent asks its questions to confirm a write (\"… Say yes or no.\") in this language, not in the system\n // language: a satellite listening in Russian does not hear a German \"Ja\"\n const language = String(this.config.voiceLanguage || this.language || '');\n return await harness.ask({ text, conversation: source, instructions, language });\n } catch (e) {\n if (localFallback) {\n this.log.warn(`pi-agent failed (${(e as Error).message}) — asking the local LLM instead.`);\n const ans = await this.askLocalLlm(question, weather, source);\n if (ans) {\n return ans;\n }\n }\n throw e;\n }\n }\n\n /**\n * Ask the local model, bounded by `localLlmTimeoutSec`. Returns its answer, or null when it handed off,\n * timed out or failed — the caller then goes on to the next tier.\n */\n private async askLocalLlm(question: string, weather: string, source: string): Promise<string | null> {\n if (!this.localLlm) {\n return null;\n }\n const timeoutMs = Math.max(1, Number(this.config.localLlmTimeoutSec) || LOCAL_LLM_TIMEOUT_SEC) * 1000;\n const name = this.localLlmName();\n // The local model has no tools: without these lines it would invent the weather and guess who is\n // at home.\n const facts = [weather, this.buildPresenceContext()].filter(Boolean).join('\\n\\n');\n const prompt = facts ? `${facts}\\n\\n${question}` : question;\n const busy = this.localLlm.running;\n const data = { model: name, timeoutMs, system: this.localLlm.systemPrompt(), prompt };\n const start = Date.now();\n try {\n const ans = await this.localLlm.ask(prompt, timeoutMs);\n const ms = Date.now() - start;\n if (ans && !isHandoff(ans)) {\n this.log.info(`Answered by local LLM (source='${source}').`);\n this.journal?.note({ tier: 'localLlm', detail: name });\n this.journal?.step({\n stage: 'localLlm',\n title: `Local LLM ${name}: answered`,\n ms,\n data: { ...data, answer: ans },\n });\n return ans;\n }\n this.log.debug('Local LLM handed off.');\n this.journal?.step({\n stage: 'localLlm',\n title: busy\n ? `Local LLM ${name}: busy with another question → handed off`\n : `Local LLM ${name}: handed off`,\n ms,\n data: { ...data, answer: ans },\n });\n } catch (e) {\n this.log.info(`Local LLM gave no answer: ${(e as Error).message}`);\n this.journal?.step({\n stage: 'localLlm',\n level: 'warn',\n title: `Local LLM ${name}: ${(e as Error).message}`,\n ms: Date.now() - start,\n data: { ...data, error: errorInfo(e) },\n });\n }\n return null;\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 const lang = String(this.config.voiceLanguage || this.language || 'en');\n lines.push(...this.satelliteVolumeLines(lang));\n if (!lines.length) {\n return '';\n }\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 * The playback volume of every voice satellite as a line of the device list. Without it, \"Lautstärke auf 50\n * Prozent\" that the rules miss reaches the LLM (or pi-agent) with only the media devices of the room in view, and\n * the model turns those up instead of the speaker that heard the request. The scales differ per transport.\n */\n private satelliteVolumeLines(lang: string): string[] {\n const label = (satId: string): string =>\n lang === 'ru'\n ? `Громкость голосового спутника ${satId}`\n : lang === 'de'\n ? `Lautstärke des Sprachsatelliten ${satId}`\n : `Volume of the voice satellite ${satId}`;\n const lines: string[] = [];\n const seen = new Set<string>();\n for (const [satId, instance] of this.nativeSatFrom) {\n seen.add(satId);\n lines.push(`- ${label(satId)} (${satId}, level.volume 0-100): ${instance}.volume`);\n }\n for (const [satId, device] of this.satDeviceById) {\n if (seen.has(satId)) {\n continue;\n }\n const player = this.esphome?.entities(device).find(e => e.kind === 'mediaPlayer');\n if (player) {\n seen.add(satId);\n const id = `${this.namespace}.satellites.${satId}.controls.${player.objectId}.volume`;\n lines.push(`- ${label(satId)} (${satId}, level.volume 0-1): ${id}`);\n }\n }\n for (const satId of this.satVolumeEnsured) {\n if (!seen.has(satId)) {\n lines.push(\n `- ${label(satId)} (${satId}, level.volume 0-100): ${this.namespace}.satellites.${satId}.volume`,\n );\n }\n }\n return lines;\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 await fs.promises.rm(traceDirFor(file), { recursive: true, force: true }).catch(() => {});\n }\n }\n\n /**\n * Wrap the MCP connection so every state the pipeline reads or writes lands in the journal entry — and a\n * call the NLU makes directly, with its result, in the request's trace.\n */\n private journalMcp(mcp: InProcessMcp): InProcessMcp {\n return {\n listTools: () => mcp.listTools(),\n callTool: (name, args) =>\n this.journal\n ? this.journal.stateCall(name, args, () => mcp.callTool(name, args))\n : mcp.callTool(name, args),\n close: () => mcp.close(),\n };\n }\n\n /** Wrap an LLM tool so its calls (arguments, result, duration) land in the journal entry and its trace. */\n private journalTool(tool: Tool): Tool {\n return {\n ...tool,\n run: args => (this.journal ? this.journal.toolCall(tool.name, args, () => tool.run(args)) : tool.run(args)),\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: Math.min(this.config.maxTokens || LOCAL_LLM_MAX_TOKENS, LOCAL_LLM_MAX_TOKENS),\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 start = Date.now();\n const { rooms, devices } = await this.getNluDevices();\n const aliases = this.getNluAliases();\n const intents = new Nlu(rooms, devices, aliases, {\n weather: !!(this.config.weatherInstance || '').trim(),\n }).parseAll(question);\n const blockers = intents.map(i => this.nluBlocker(i, devices.length));\n this.journal?.step({\n stage: 'nlu',\n title: !intents.length\n ? `NLU: nothing recognised (${devices.length} devices, ${rooms.length} rooms known)`\n : blockers.some(Boolean)\n ? `NLU: ${intents.map(i => i.action).join(' + ')} — cannot run here: ${blockers.filter(Boolean).join('; ')}`\n : `NLU: ${intents.map(describeIntent).join(' + ')}`,\n level: intents.length && blockers.some(Boolean) ? 'warn' : undefined,\n ms: Date.now() - start,\n data: {\n devices: devices.length,\n rooms,\n aliases: aliases.length ? aliases : undefined,\n intents: intents.map((intent, i) => ({ ...intent, blockedBecause: blockers[i] || undefined })),\n },\n });\n if (!intents.length || blockers.some(Boolean)) {\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 const started = Date.now();\n try {\n const answer = await this.executeNluIntent(intent, source);\n answers.push(answer);\n this.journal?.step({\n stage: 'nlu',\n title: `Executed ${describeIntent(intent)}`,\n ms: Date.now() - started,\n data: { answer },\n });\n } catch (e) {\n failed = true;\n this.journal?.step({\n stage: 'nlu',\n level: 'error',\n title: `${describeIntent(intent)} failed: ${(e as Error).message}${answers.length ? '' : ' → the LLM takes over'}`,\n ms: Date.now() - started,\n data: errorInfo(e),\n });\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 // a command for later says when it will run — a beep would hide that\n intents.every(i => CONTROL_ACTIONS.has(i.action) && !isDeferred(i)) &&\n (await this.playConfirmationTone(source))\n ) {\n this.log.debug(`NLU confirmed with a tone instead of \"${answer}\".`);\n this.journal?.step({ stage: 'nlu', title: 'Confirmed with a tone instead of words', data: { answer } });\n return '';\n }\n return answer;\n }\n\n /**\n * Why this intent cannot run locally ('' = it can). Checked for **every** part of a combined command\n * before anything is executed: a missing manager, no known devices or disabled writes send the whole\n * utterance to the LLM (which can explain why) instead of silently doing nothing — or only half of it.\n */\n private nluBlocker(intent: NluIntent, deviceCount: number): string {\n switch (intent.action) {\n case 'timerSet':\n case 'timerQuery':\n case 'timerCancel':\n return this.timers ? '' : 'timers are not running';\n case 'alarmSet':\n case 'alarmQuery':\n case 'alarmCancel':\n return this.alarms ? '' : 'alarms are not running';\n case 'timeQuery':\n case 'dateQuery':\n return '';\n case 'weatherQuery':\n return (this.config.weatherInstance || '').trim() ? '' : 'no weather instance configured';\n case 'volumeSet':\n return this.voice || this.esphome || this.nativeSatFrom.size ? '' : 'no satellites';\n default:\n // Device intents; writes additionally require the coarse \"allow control\" toggle.\n if (!deviceCount) {\n return 'no devices known';\n }\n if (isDeferred(intent) && !(this.config.calendarInstance || '').trim()) {\n return 'a command for later needs a calendar (fullcalendar) instance in the settings';\n }\n return ['on', 'off', 'level', 'color'].includes(intent.action) && !this.config.allowWriteStates\n ? 'writing states is not allowed (allowWriteStates)'\n : '';\n }\n }\n\n /** Execute one intent that {@link nluBlocker} 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 case 'weatherQuery':\n return this.executeWeatherIntent(intent);\n case 'volumeSet':\n return this.executeVolumeIntent(intent, source);\n default:\n return isDeferred(intent) ? this.executeDeferredIntent(intent) : this.executeIntent(intent);\n }\n }\n\n /**\n * Send a message to the calendar instance (fullcalendar). Its answer `{error}` becomes an exception.\n *\n * @param command `addEvent`, `listEvents`, `deleteEvent`, …\n * @param message the parameters\n */\n private async calendarCall<T extends object>(command: string, message: Record<string, unknown>): Promise<T> {\n const instance = (this.config.calendarInstance || '').trim().replace(/^system\\.adapter\\./, '');\n if (!instance) {\n throw new Error('No calendar instance configured in the assistant settings');\n }\n const alive = await this.getForeignStateAsync(`system.adapter.${instance}.alive`);\n if (!alive?.val) {\n throw new Error(`The calendar ${instance} is not running`);\n }\n const res = (await this.sendToAsync(instance, command, message, { timeout: 10000 })) as\n (T & { error?: string }) | undefined;\n if (!res) {\n throw new Error(`The calendar ${instance} did not answer`);\n }\n if (res.error) {\n throw new Error(res.error);\n }\n return res;\n }\n\n /**\n * Whether the per-device ACL forbids writing this state: an explicit entry, else the default of the device\n * type (locks are read-only). States outside the device list are not restricted (like `set_state`).\n */\n private async writeForbidden(stateId: string): Promise<boolean> {\n const { devices } = await this.getNluDevices();\n const device = devices.find(d => Object.values(d.controls).includes(stateId));\n if (!device) {\n return false;\n }\n const entry = this.config.deviceAcl?.[deviceKey(Object.values(device.controls))];\n return entry ? entry.write === false : device.type === 'lock';\n }\n\n /** \"22:30\", \"morgen um 22:30\", \"30.10. um 7:00\" — when a planned command runs, for the spoken answer */\n private describeWhen(time: Date, lang: string): string {\n const pad = (n: number): string => String(n).padStart(2, '0');\n const clock = `${time.getHours()}:${pad(time.getMinutes())}`;\n const now = new Date();\n const days = Math.round(\n (new Date(time.getFullYear(), time.getMonth(), time.getDate()).getTime() -\n new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime()) /\n 86_400_000,\n );\n const date = `${pad(time.getDate())}.${pad(time.getMonth() + 1)}.`;\n if (lang === 'ru') {\n return days === 0 ? `в ${clock}` : days === 1 ? `завтра в ${clock}` : `${date} в ${clock}`;\n }\n if (lang === 'de') {\n return days === 0 ? `um ${clock}` : days === 1 ? `morgen um ${clock}` : `am ${date} um ${clock}`;\n }\n return days === 0 ? `at ${clock}` : days === 1 ? `tomorrow at ${clock}` : `on ${date} at ${clock}`;\n }\n\n /**\n * A device command for later (\"Licht in 2 Stunden aus\", \"выключи свет через 2 часа\"): one event in the calendar\n * (fullcalendar) per write — the calendar shows it, survives restarts and can be cancelled there.\n */\n private async executeDeferredIntent(intent: NluIntent): Promise<string> {\n const device = intent.device;\n if (!device || !intent.stateId) {\n throw new Error('deferred intent without a device');\n }\n const lang = String(this.config.voiceLanguage || this.language || 'en');\n const pick = (rus: string, ger: string, eng: string): string =>\n lang === 'ru' ? rus : lang === 'de' ? ger : eng;\n const room = intent.room || device.room;\n const where = room ? ` (${room})` : '';\n const dev = device.name;\n if (await this.writeForbidden(intent.stateId)) {\n return pick(\n `${dev}${where} только для чтения.`,\n `${dev}${where} ist schreibgeschützt.`,\n `${dev}${where} is read-only.`,\n );\n }\n\n let time: Date;\n if (intent.delaySec !== undefined) {\n time = new Date(Date.now() + intent.delaySec * 1000);\n } else {\n const { hour, minute, day } = intent.at!;\n const now = new Date();\n time = new Date(now.getFullYear(), now.getMonth(), now.getDate() + (day ?? 0), hour, minute, 0, 0);\n if (time.getTime() <= now.getTime()) {\n if (day !== undefined) {\n return pick(\n `${this.describeWhen(time, lang)} уже прошло.`,\n `${this.describeWhen(time, lang).replace(/^um /, '')} ist schon vorbei.`,\n `${this.describeWhen(time, lang).replace(/^at /, '')} has already passed.`,\n );\n }\n time.setDate(time.getDate() + 1); // \"um 7 Uhr\" after 7 o'clock: tomorrow\n }\n }\n\n const name = `${dev}${where}`;\n await this.calendarCall('addEvent', { oid: intent.stateId, value: intent.value, start: time.getTime(), name });\n // a dimmer with its own switch: the switch goes into the calendar, too\n if (intent.also) {\n await this.calendarCall('addEvent', {\n oid: intent.also.stateId,\n value: intent.also.value,\n start: time.getTime(),\n name,\n });\n }\n this.log.info(\n `Planned in the calendar: ${intent.stateId} = ${JSON.stringify(intent.value)} at ${time.toString()}`,\n );\n\n const when = this.describeWhen(time, lang);\n switch (intent.action) {\n case 'on':\n return pick(\n `Хорошо, ${when} включу: ${dev}${where}.`,\n `Okay, ${dev}${where} wird ${when} eingeschaltet.`,\n `Okay, ${dev}${where} will be turned on ${when}.`,\n );\n case 'off':\n return pick(\n `Хорошо, ${when} выключу: ${dev}${where}.`,\n `Okay, ${dev}${where} wird ${when} ausgeschaltet.`,\n `Okay, ${dev}${where} will be turned off ${when}.`,\n );\n case 'level':\n return pick(\n `Хорошо, ${when} поставлю ${dev}${where} на ${String(intent.value)} %.`,\n `Okay, ${dev}${where} wird ${when} auf ${String(intent.value)} % gestellt.`,\n `Okay, ${dev}${where} will be set to ${String(intent.value)} % ${when}.`,\n );\n default:\n return pick(\n `Хорошо, запланировано ${when}: ${dev}${where}.`,\n `Okay, für ${dev}${where} ${when} eingeplant.`,\n `Okay, planned for ${dev}${where} ${when}.`,\n );\n }\n }\n\n /**\n * LLM tools for the calendar (fullcalendar): plan a state change for later, list what is planned, cancel it.\n * Planning respects the same write rules as `set_state` (the coarse switch and the per-device ACL).\n */\n private buildCalendarTools(): Tool[] {\n const fail = (e: unknown): string => JSON.stringify({ ok: false, error: (e as Error).message });\n const tools: Tool[] = [\n {\n name: 'list_scheduled',\n description:\n 'List the planned events of the calendar (state changes at a time, also recurring ones), in local time of the house. Optional \"days\" ahead (default 1 = the next 24 hours) or a \"from\"/\"to\" range as local time \"YYYY-MM-DDTHH:mm\".',\n parameters: {\n type: 'object',\n properties: {\n days: { type: 'number', description: 'How many days ahead, default 1' },\n from: { type: 'string', description: 'Start, local time YYYY-MM-DDTHH:mm' },\n to: { type: 'string', description: 'End, local time YYYY-MM-DDTHH:mm' },\n },\n additionalProperties: false,\n },\n run: async (args): Promise<string> => {\n try {\n const res = await this.calendarCall<{ events: unknown[] }>('listEvents', {\n days: typeof args.days === 'number' ? args.days : 1,\n from: args.from,\n to: args.to,\n max: 50,\n });\n return JSON.stringify({ ok: true, events: res.events });\n } catch (e) {\n return fail(e);\n }\n },\n },\n ];\n if (!this.config.allowWriteStates) {\n return tools;\n }\n tools.push(\n {\n name: 'schedule_state',\n description:\n 'Plan a state change for later in the calendar: write \"value\" to state \"id\" after \"in_minutes\" or at \"at\" (local time of the house, \"YYYY-MM-DDTHH:mm\"). Use it for \"in 2 hours\", \"at 10 pm\", \"tomorrow morning\" — never set_state for something meant for later. With \"duration_minutes\" the state gets \"end_value\" after that time (for a boolean the opposite by default). Tell the user the planned time.',\n parameters: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'State ID' },\n value: { type: ['boolean', 'number', 'string'], description: 'Value to write' },\n in_minutes: { type: 'number', description: 'Delay in minutes from now' },\n at: { type: 'string', description: 'Local time YYYY-MM-DDTHH:mm' },\n duration_minutes: { type: 'number', description: 'Optional: write end_value this much later' },\n end_value: { type: ['boolean', 'number', 'string'], description: 'Value after the duration' },\n name: {\n type: 'string',\n description: 'Short title for the calendar, e.g. \"Licht Wohnzimmer aus\"',\n },\n },\n required: ['id', 'value'],\n additionalProperties: false,\n },\n run: async (args): Promise<string> => {\n try {\n const id = typeof args.id === 'string' ? args.id : '';\n if (await this.writeForbidden(id)) {\n return JSON.stringify({\n ok: false,\n error: `Writing \"${id}\" is not allowed: the device is read-only in the assistant settings.`,\n });\n }\n if (args.in_minutes === undefined && !args.at) {\n return JSON.stringify({ ok: false, error: 'Give \"in_minutes\" or \"at\"' });\n }\n const res = await this.calendarCall<{ id: string; start: string }>('addEvent', {\n oid: id,\n value: args.value,\n in: typeof args.in_minutes === 'number' ? Math.round(args.in_minutes * 60) : undefined,\n start: args.in_minutes === undefined ? args.at : undefined,\n duration:\n typeof args.duration_minutes === 'number'\n ? Math.round(args.duration_minutes * 60)\n : undefined,\n endValue: args.end_value,\n name: typeof args.name === 'string' ? args.name : undefined,\n });\n return JSON.stringify({ ok: true, eventId: res.id, start: res.start });\n } catch (e) {\n return fail(e);\n }\n },\n },\n {\n name: 'cancel_scheduled',\n description:\n 'Delete a planned event from the calendar, by its \"id\" from list_scheduled or schedule_state.',\n parameters: {\n type: 'object',\n properties: { id: { type: 'string', description: 'Event ID' } },\n required: ['id'],\n additionalProperties: false,\n },\n run: async (args): Promise<string> => {\n try {\n await this.calendarCall('deleteEvent', { id: typeof args.id === 'string' ? args.id : '' });\n return JSON.stringify({ ok: true });\n } catch (e) {\n return fail(e);\n }\n },\n },\n );\n return tools;\n }\n\n /**\n * Speak the weather straight from the configured adapter. Throws when the report has nothing for the\n * asked day (or the adapter has no mapper), so the question goes on to the LLM and its tool instead.\n */\n private async executeWeatherIntent(intent: NluIntent): Promise<string> {\n const res = await this.readWeather(this.config.weatherInstance || '');\n if (!res.report) {\n throw new Error(res.error || 'no weather report');\n }\n const lang = String(this.config.voiceLanguage || this.language || 'en');\n const text = buildWeatherAnswer(res.report, lang, intent.when);\n if (!text) {\n throw new Error(`the weather report has no data for '${intent.when || 'now'}'`);\n }\n return text;\n }\n\n /**\n * Change the playback volume of a satellite: the one in the named room, else the one that heard the\n * command. Each transport has its own knob — the native satellite's `volume` state, the media player\n * of an ESPHome device, the `volume` message of a UDP satellite.\n */\n private async executeVolumeIntent(intent: NluIntent, source: string): Promise<string> {\n const lang = String(this.config.voiceLanguage || this.language || 'en');\n const satId = intent.room ? this.resolveSatelliteId(intent.room) : this.announceTargetForSource(source);\n const absolute = typeof intent.value === 'number' ? intent.value : null;\n const delta = intent.delta || 0;\n const next = (current: number): number => Math.min(100, Math.max(0, Math.round(absolute ?? current + delta)));\n // 1 процент, 2 процента, 5 процентов (11–14 take the last form).\n const ruPercent = (n: number): string =>\n n % 100 > 10 && n % 100 < 20\n ? 'процентов'\n : n % 10 === 1\n ? 'процент'\n : n % 10 >= 2 && n % 10 <= 4\n ? 'процента'\n : 'процентов';\n const confirm = (level: number): string =>\n lang === 'ru'\n ? `Громкость ${level} ${ruPercent(level)}.`\n : lang === 'de'\n ? `Lautstärke ${level} Prozent.`\n : `Volume ${level} percent.`;\n if (satId) {\n const device = this.satDeviceById.get(satId) || satId;\n const instance = this.nativeSatFrom.get(satId);\n if (instance) {\n const stateId = `${instance}.volume`;\n const current = Number((await this.getForeignStateAsync(stateId))?.val ?? 50);\n const level = next(Number.isFinite(current) ? current : 50);\n await this.setForeignStateAsync(stateId, level);\n return confirm(level);\n }\n const player = this.esphome?.entities(device).find(e => e.kind === 'mediaPlayer');\n if (player) {\n const current = ((player.value as MediaPlayerValue | undefined)?.volume ?? 0.5) * 100;\n const level = next(current);\n if (this.esphome!.setEntity(device, player.objectId, level / 100)) {\n return confirm(level);\n }\n }\n // A UDP satellite works out a relative step itself (it knows its level) and reports the result.\n if (this.voice?.has(device)) {\n this.voice.volume(device, absolute !== null ? { level: absolute } : { delta });\n if (absolute !== null) {\n return confirm(next(0));\n }\n return lang === 'ru'\n ? delta > 0\n ? 'Сделала громче.'\n : 'Сделала тише.'\n : lang === 'de'\n ? delta > 0\n ? 'Etwas lauter.'\n : 'Etwas leiser.'\n : delta > 0\n ? 'A bit louder.'\n : 'A bit quieter.';\n }\n }\n return lang === 'ru'\n ? 'Я не знаю, громкость какой колонки изменить.'\n : lang === 'de'\n ? 'Ich weiß nicht, bei welchem Lautsprecher ich die Lautstärke ändern soll.'\n : \"I don't know which speaker's volume to change.\";\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 /**\n * Device model for the NLU: friendly name, room, type and controls (controlType → state id). Cached\n * for {@link NLU_DEVICES_TTL_MS}; requests arriving while it is being built wait for the same build.\n */\n private getNluDevices(): Promise<{ rooms: string[]; devices: NluDevice[] }> {\n if (!this.mcp) {\n return Promise.resolve({ 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 const now = Date.now();\n const hit = this.nluDevices;\n if (hit && hit.key === nluLang && now - hit.at < NLU_DEVICES_TTL_MS) {\n return hit.result;\n }\n const entry = { key: nluLang, at: now, result: this.buildNluDevices(nluLang) };\n this.nluDevices = entry;\n // An empty model is usually a failed build (the manager not ready yet) — don't keep it for a minute.\n void entry.result.then(r => {\n if (!r.devices.length && this.nluDevices === entry) {\n this.nluDevices = null;\n }\n });\n return entry.result;\n }\n\n private async buildNluDevices(nluLang: ioBroker.Languages): Promise<{ rooms: string[]; devices: NluDevice[] }> {\n if (!this.mcp) {\n return { rooms: [], devices: [] };\n }\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 start = Date.now();\n const deadline = start + 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 this.journal?.step({\n stage: 'state',\n title: `${stateId} confirmed by the device`,\n ms: Date.now() - start,\n data: { expected, state: last },\n });\n return true;\n }\n }\n this.journal?.step({\n stage: 'state',\n level: 'warn',\n title: `${stateId}: no confirmation within ${ACK_TIMEOUT_MS} ms`,\n ms: Date.now() - start,\n data: { expected, state: last },\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 // ── YouTube on the TV (youtube-remote players) ──────────────────────────\n\n /** The player a request means: the named one, else the one in the requesting room, else the first. */\n private youtubePlayerFor(name?: string): YouTubePlayer | null {\n return findPlayer(this.youtubePlayers, name, this.requestOrigin.getStore()?.room || '');\n }\n\n /**\n * Find the device of a row that names a youtube-remote instance. Done again before every command: the\n * device id comes from the TV's screen id, so pairing the TV again replaces the device while we run.\n * false = nothing is paired with that instance.\n */\n private async resolveYouTubePlayer(player: YouTubePlayer): Promise<boolean> {\n if (!player.instance) {\n return true;\n }\n let devices: YouTubeDevice[] = [];\n try {\n const objs = await this.getForeignObjectsAsync(`${player.instance}.*`, 'device');\n devices = Object.values(objs).map(o => ({ id: o._id, name: this.youtubeDeviceName(o) }));\n } catch (e) {\n this.log.debug(`YouTube: cannot read the devices of ${player.instance}: ${(e as Error).message}`);\n }\n const device = pickDevice(devices, player);\n player.base = device?.id || '';\n player.target = device ? `${device.id}.youtube` : '';\n if (device && !player.name) {\n player.name = device.name || player.instance;\n }\n return !!device;\n }\n\n /** Display name of an object, in the voice language if it is translated. */\n private youtubeDeviceName(obj: ioBroker.Object): string {\n const name = obj.common?.name;\n if (typeof name === 'string') {\n return name;\n }\n const lang = String(this.config.voiceLanguage || this.language || 'en') as ioBroker.Languages;\n return name?.[lang] || name?.en || obj._id.split('.').pop() || obj._id;\n }\n\n /**\n * Options of the \"Player\" column: every youtube-remote instance (it finds its TV itself), and for an\n * instance with several paired TVs also each of them, to pin a row to one.\n */\n private async getYouTubeInstances(): Promise<{ label: string; value: string }[]> {\n const options: { label: string; value: string }[] = [];\n let instances: string[] = [];\n try {\n const view = await this.getObjectViewAsync('system', 'instance', {\n startkey: 'system.adapter.youtube-remote.',\n endkey: 'system.adapter.youtube-remote.香',\n });\n instances = (view?.rows || []).map(r => r.id.replace(/^system\\.adapter\\./, '')).sort();\n } catch (e) {\n this.log.warn(`getYouTubeInstances failed: ${(e as Error).message}`);\n }\n for (const instance of instances) {\n const objs = await this.getForeignObjectsAsync(`${instance}.*`, 'device').catch(() => ({}));\n const devices = Object.values(objs)\n .map(o => ({ id: o._id, name: this.youtubeDeviceName(o) }))\n .sort((a, b) => a.id.localeCompare(b.id));\n const names = devices.map(d => d.name).join(', ');\n options.push({ label: names ? `${instance} (${names})` : `${instance} (no TV paired)`, value: instance });\n if (devices.length > 1) {\n for (const d of devices) {\n options.push({ label: `${instance} › ${d.name}`, value: d.id });\n }\n }\n }\n return options;\n }\n\n /**\n * Find `query` on YouTube and play it on a player, switching its TV on first. The search runs before\n * anything is switched: a TV woken for a channel that does not exist would be the worst outcome.\n *\n * A TV that has to boot takes 10–30 s, so in that case the reply comes right away and the rest runs\n * in the background ({@link playWhenTvIsOn}) — over voice, half a minute of silence reads as \"did not\n * hear me\". An already running TV is answered only after the player acknowledged the command.\n */\n private async playYouTube(\n query: string,\n kind: YouTubeKind | 'auto',\n playerName?: string,\n ): Promise<YouTubePlayResult> {\n const lang = String(this.config.voiceLanguage || this.language || 'en');\n const player = this.youtubePlayerFor(playerName);\n if (!player) {\n const names = this.youtubePlayers.map(p => p.name).join(', ');\n return { ok: false, text: youtubeReply(lang, 'unknownPlayer', { query: playerName, names }) };\n }\n if (!(await this.resolveYouTubePlayer(player))) {\n return {\n ok: false,\n player: player.name,\n text: youtubeReply(lang, 'noDevice', { instance: player.instance }),\n };\n }\n if (!this.config.allowWriteStates) {\n return { ok: false, player: player.name, text: youtubeReply(lang, 'noControl') };\n }\n let hit: YouTubeHit | null = null;\n let alternatives: YouTubeHit[] = [];\n // Unsaid kind: what is named like a channel is the channel (\"spiele Sailing OceanAir auf YouTube\"),\n // anything else a video search — a video search for a channel name finds some video about it.\n const searchKind: YouTubeKind = kind === 'auto' ? 'video' : kind;\n const direct = directYouTubeTarget(query, searchKind);\n if (direct) {\n hit = { kind: searchKind, id: direct, title: query };\n } else {\n try {\n if (kind === 'auto') {\n const channels = await searchYouTube(query, 'channel', { language: lang });\n hit = channels.find(h => isNamedChannel(h, query)) || null;\n alternatives = channels.filter(h => h !== hit).slice(0, 3);\n }\n if (!hit) {\n const hits = await searchYouTube(query, searchKind, { language: lang });\n hit = pickBest(hits, query);\n alternatives = hits.filter(h => h !== hit).slice(0, 3);\n }\n } catch (e) {\n this.log.warn(`YouTube search for \"${query}\" failed: ${(e as Error).message}`);\n return { ok: false, player: player.name, text: youtubeReply(lang, 'searchFailed') };\n }\n if (!hit) {\n return {\n ok: false,\n player: player.name,\n text: youtubeReply(lang, 'notFound', { kind: searchKind, query }),\n };\n }\n }\n const title = spokenTitle(hit);\n this.log.info(`YouTube: ${kind} \"${query}\" → ${hit.kind} ${hit.id} (${hit.title}) on ${player.name}.`);\n const reply = { kind: hit.kind, title, player: player.name };\n if ((await this.tvPower(player)) === 'off') {\n try {\n await this.switchTvOn(player);\n } catch (e) {\n this.log.warn(`YouTube: cannot switch ${player.power} on: ${(e as Error).message}`);\n }\n void this.playWhenTvIsOn(player, hit);\n return {\n ok: true,\n hit,\n alternatives,\n player: player.name,\n poweringOn: true,\n text: youtubeReply(lang, 'poweringOn', reply),\n };\n }\n if (await this.sendToYouTubePlayer(player, hit.id)) {\n return { ok: true, hit, alternatives, player: player.name, text: youtubeReply(lang, 'playing', reply) };\n }\n const instance = player.base.split('.').slice(0, 2).join('.');\n const alive = (await this.getForeignStateAsync(`system.adapter.${instance}.alive`).catch(() => null))?.val;\n return {\n ok: false,\n hit,\n player: player.name,\n text: alive ? youtubeReply(lang, 'noConfirm', reply) : youtubeReply(lang, 'adapterDown', { instance }),\n };\n }\n\n /**\n * Whether the TV of a player is on. `unknown` when there is nothing to tell it by: no power state, or\n * one that is a button — pressing a toggle button on a TV that is already on would switch it off.\n */\n private async tvPower(player: YouTubePlayer): Promise<'on' | 'off' | 'unknown'> {\n if (!player.power) {\n return 'unknown';\n }\n const obj = await this.getForeignObjectAsync(player.power).catch(() => null);\n if (!obj) {\n this.log.warn(`YouTube player ${player.name}: power state ${player.power} does not exist.`);\n return 'unknown';\n }\n const common = obj.common as ioBroker.StateCommon;\n if (common.read === false || String(common.role || '').startsWith('button')) {\n this.log.debug(`YouTube player ${player.name}: ${player.power} is a button, the TV state is unknown.`);\n return 'unknown';\n }\n const state = await this.getForeignStateAsync(player.power).catch(() => null);\n return isPowerOn(state?.val) ? 'on' : 'off';\n }\n\n /** Write \"on\" to the power state, in the type the state has. */\n private async switchTvOn(player: YouTubePlayer): Promise<void> {\n const obj = await this.getForeignObjectAsync(player.power);\n const type = (obj?.common as ioBroker.StateCommon | undefined)?.type;\n const val: ioBroker.StateValue = type === 'number' ? 1 : type === 'string' ? 'on' : true;\n await this.setForeignStateAsync(player.power, { val, ack: false });\n this.journal?.stateAccess('set_state', { id: player.power, value: val });\n this.log.info(`YouTube: switching ${player.name} on (${player.power} = ${JSON.stringify(val)}).`);\n }\n\n /**\n * After the TV was switched on: wait until its power state confirms (an `ack` from the TV adapter — our\n * own write already says `true`), give the TV its boot time, then play. The YouTube app is often not\n * reachable over the lounge right after boot, so a command that is not acknowledged is sent once more.\n */\n private async playWhenTvIsOn(player: YouTubePlayer, hit: YouTubeHit): Promise<void> {\n try {\n const until = Date.now() + TV_POWER_TIMEOUT_MS;\n let on = false;\n while (!on && Date.now() < until) {\n await this.delay(1000);\n const st = await this.getForeignStateAsync(player.power).catch(() => null);\n on = !!st?.ack && isPowerOn(st.val);\n }\n if (!on) {\n this.log.warn(\n `YouTube: ${player.power} did not report \"on\" within ${TV_POWER_TIMEOUT_MS / 1000} s — trying to play anyway.`,\n );\n }\n await this.delay(player.delaySec * 1000);\n let ok = await this.sendToYouTubePlayer(player, hit.id);\n if (!ok) {\n await this.delay(YOUTUBE_RETRY_MS);\n ok = await this.sendToYouTubePlayer(player, hit.id);\n }\n if (ok) {\n this.log.info(`YouTube: playing ${hit.id} (${hit.title}) on ${player.name}.`);\n } else {\n this.log.warn(\n `YouTube: ${player.name} did not take ${hit.id} after power-on. If the TV needs longer to start, raise its start delay.`,\n );\n }\n } catch (e) {\n this.log.warn(`YouTube: playing on ${player.name} failed: ${(e as Error).message}`);\n }\n }\n\n /**\n * Hand a video/playlist/channel id to the player and wait for its acknowledgement: youtube-remote acks\n * `youtube` (back to '') only once the TV took the command, and leaves it unacknowledged on failure.\n */\n private async sendToYouTubePlayer(player: YouTubePlayer, id: string): Promise<boolean> {\n await this.setForeignStateAsync(player.target, { val: id, ack: false });\n this.journal?.stateAccess('set_state', { id: player.target, value: id });\n const until = Date.now() + YOUTUBE_ACK_TIMEOUT_MS;\n while (Date.now() < until) {\n await this.delay(250);\n if ((await this.getForeignStateAsync(player.target).catch(() => null))?.ack) {\n return true;\n }\n }\n return false;\n }\n\n /** A play result as tool / sendTo data: without the internal objects, with the alternatives as titles. */\n private youtubeResultData(res: YouTubePlayResult): Record<string, unknown> {\n return {\n ok: res.ok,\n text: res.text,\n ...(res.player ? { player: res.player } : {}),\n ...(res.hit ? { kind: res.hit.kind, id: res.hit.id, title: res.hit.title } : {}),\n ...(res.hit?.channel ? { channel: res.hit.channel } : {}),\n ...(res.poweringOn ? { poweringOn: true } : {}),\n ...(res.alternatives?.length\n ? { otherResults: res.alternatives.map(h => ({ id: h.id, title: h.title })) }\n : {}),\n };\n }\n\n /**\n * LLM tools for the YouTube players: `play_youtube` (search + power-on + play) and `youtube_player`\n * (pause, skip, volume, what is playing). The configured names go into the descriptions, the model\n * cannot discover them otherwise.\n */\n private buildYouTubeTools(): Tool[] {\n const names = this.youtubePlayers.map((p, i) => (i === 0 ? `${p.name} (default)` : p.name)).join(', ');\n const playerParam = {\n type: 'string',\n description: `Player name or room: ${names}. Leave it out for the player in the room the user is in, else the default.`,\n };\n const play: Tool = {\n name: 'play_youtube',\n description:\n 'Play something from YouTube on the TV: finds the channel, video or playlist by name, switches ' +\n 'the TV on if it is off and starts playing. Use this for every \"play … on YouTube\", ' +\n '\"spiele den Kanal …\", \"zeig das Video …\" — never write the player states yourself. kind ' +\n '\"channel\" plays the newest uploads of a channel. The reply text of the result can be said as is; ' +\n 'otherResults are the next search hits, offer them if the user says it was the wrong one ' +\n '(pass the id as query to play one).',\n parameters: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description: 'Name of the channel, title of the video/playlist, a search phrase, or an id/URL',\n },\n kind: {\n type: 'string',\n enum: ['channel', 'video', 'playlist'],\n description: 'Leave it out if the user did not say: a channel of that name wins, else videos',\n },\n player: playerParam,\n },\n required: ['query'],\n additionalProperties: false,\n },\n run: async (args): Promise<string> => {\n const query = typeof args.query === 'string' ? args.query.trim() : '';\n if (!query) {\n return JSON.stringify({ ok: false, error: 'no query given' });\n }\n const kind =\n args.kind === 'channel' || args.kind === 'playlist' || args.kind === 'video' ? args.kind : 'auto';\n const player = typeof args.player === 'string' ? args.player : undefined;\n return JSON.stringify(this.youtubeResultData(await this.playYouTube(query, kind, player)));\n },\n };\n const control: Tool = {\n name: 'youtube_player',\n description:\n 'Control a YouTube player or ask what it plays: action play (resume), pause, next, previous, ' +\n 'volume (with \"volume\" 0-100), mute, unmute, or status (title, channel, play state, TV power).',\n parameters: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['play', 'pause', 'next', 'previous', 'volume', 'mute', 'unmute', 'status'],\n },\n volume: { type: 'number', description: 'Volume 0-100, only for action volume' },\n player: playerParam,\n },\n required: ['action'],\n additionalProperties: false,\n },\n run: async (args): Promise<string> => {\n const player = this.youtubePlayerFor(typeof args.player === 'string' ? args.player : undefined);\n if (!player) {\n return JSON.stringify({ ok: false, error: `unknown player, known are: ${names}` });\n }\n if (!(await this.resolveYouTubePlayer(player))) {\n return JSON.stringify({ ok: false, error: `no TV is paired with ${player.instance}` });\n }\n const action = typeof args.action === 'string' ? args.action : '';\n if (action === 'status') {\n const ids = ['title', 'artist', 'state', 'connected', 'volume'].map(s => `${player.base}.${s}`);\n const states: Record<string, ioBroker.State> = await this.getForeignStatesAsync(\n `${player.base}.*`,\n ).catch(() => ({}));\n const val = (i: number): unknown => states[ids[i]]?.val ?? null;\n const power = await this.tvPower(player);\n return JSON.stringify({\n ok: true,\n data: {\n player: player.name,\n title: val(0),\n channel: val(1),\n state: ({ 0: 'paused', 1: 'playing', 2: 'stopped' } as Record<string, string>)[\n String(val(2))\n ],\n connected: val(3),\n volume: val(4),\n ...(power !== 'unknown' ? { tv: power } : {}),\n },\n });\n }\n if (!this.config.allowWriteStates) {\n return JSON.stringify({ ok: false, error: 'device control is disabled in the settings' });\n }\n let id: string;\n let value: ioBroker.StateValue;\n if (action === 'volume') {\n const v = Number(args.volume);\n if (!Number.isFinite(v)) {\n return JSON.stringify({ ok: false, error: 'volume 0-100 needed' });\n }\n id = `${player.base}.volume`;\n value = Math.min(100, Math.max(0, Math.round(v)));\n } else if (action === 'mute' || action === 'unmute') {\n id = `${player.base}.muted`;\n value = action === 'mute';\n } else if (['play', 'pause', 'next', 'previous'].includes(action)) {\n id = `${player.base}.${action === 'previous' ? 'prev' : action}`;\n value = true;\n } else {\n return JSON.stringify({ ok: false, error: `unknown action '${action}'` });\n }\n await this.setForeignStateAsync(id, { val: value, ack: false });\n this.journal?.stateAccess('set_state', { id, value });\n return JSON.stringify({ ok: true, data: { player: player.name, [action]: value } });\n },\n };\n return [play, control];\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 [i, action] of routine.actions.entries()) {\n const start = Date.now();\n try {\n await this.runTriggerAction({ id: `routine:${routine.name}`, when: [] }, action, origin);\n this.journal?.step({\n stage: 'routine',\n title: `Routine action ${i + 1}/${routine.actions.length}`,\n ms: Date.now() - start,\n data: action,\n });\n } catch (e) {\n this.log.warn(`Routine '${routine.name}': an action failed — ${(e as Error).message}`);\n this.journal?.step({\n stage: 'routine',\n level: 'error',\n title: `Routine action ${i + 1}/${routine.actions.length} failed: ${(e as Error).message}`,\n ms: Date.now() - start,\n data: { action, error: errorInfo(e) },\n });\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 /**\n * The saved configuration with the speech settings of an unsaved form on top. Only the speech fields count,\n * and a key only when one was typed: protected fields never reach the browser, so they are empty there.\n * Without fallbacks: a test must show whether the chosen engine works, not whether the reserve does.\n */\n private withVoiceForm(form: Record<string, unknown>): AdapterConfig {\n const cfg: Record<string, unknown> = { ...this.config, sttFallback: '', ttsFallback: '' };\n for (const key of VOICE_FORM_FIELDS) {\n const value = form[key];\n if (typeof value !== 'string' || (VOICE_FORM_SECRETS.includes(key) && !value.trim())) {\n continue;\n }\n cfg[key] = value;\n }\n return cfg as unknown as AdapterConfig;\n }\n\n /** Build the TTS engine of a configuration (throws when no voice key is available). */\n private async buildTtsEngine(cfg: AdapterConfig = this.config): Promise<TtsEngine> {\n const creds = await resolveVoiceCredentials(this, cfg, await this.speechLlmKey());\n return createTtsEngine(cfg.ttsProvider || 'openai', this.voiceContext(cfg, creds));\n }\n\n /**\n * Speech recognition for the voice test of the settings: a recording of the browser, an uploaded file or the\n * test sentence the TTS just spoke. WAV is read directly, anything else goes through ffmpeg.\n */\n private async transcribeForTest(msg: {\n audio?: string;\n format?: string;\n language?: string;\n config?: Record<string, unknown>;\n }): Promise<{ text?: string; ms?: number; audioMs?: number; error?: string }> {\n try {\n if (!msg.audio) {\n return { error: 'no audio' };\n }\n const cfg = msg.config ? this.withVoiceForm(msg.config) : this.config;\n const data = Buffer.from(msg.audio, 'base64');\n const { pcm, sampleRate } =\n (msg.format || 'wav') === 'wav' && data.toString('latin1', 0, 4) === 'RIFF'\n ? pcmFromResponse(data, '')\n : await this.decodeAudioBufferToPcm(data);\n const creds = await resolveVoiceCredentials(this, cfg, await this.speechLlmKey());\n const stt = createSttEngine(cfg.sttProvider || 'openai', this.voiceContext(cfg, creds));\n const language = msg.language || cfg.voiceLanguage || this.language || '';\n const start = Date.now();\n const text = await stt.transcribe(pcm, sampleRate, language, await this.buildSttHints());\n return { text, ms: Date.now() - start, audioMs: Math.round((pcm.length / 2 / sampleRate) * 1000) };\n } catch (e) {\n return { error: (e as Error).message };\n }\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 cfg: AdapterConfig = this.config,\n ): Promise<{ audio?: string; mime?: string; sampleRate?: number; audioMs?: number; ms?: number; error?: string }> {\n if (!text.trim()) {\n return { error: 'empty text' };\n }\n try {\n const tts = await this.buildTtsEngine(cfg);\n const lang = language || cfg.voiceLanguage || this.language || '';\n const start = Date.now();\n const { pcm, sampleRate } = await tts.synthesize(text, lang);\n return {\n audio: this.pcmToWav(pcm, sampleRate).toString('base64'),\n mime: 'audio/wav',\n sampleRate,\n // a wrong rate shows up as an implausible length of the spoken text\n audioMs: Math.round((pcm.length / 2 / sampleRate) * 1000),\n ms: Date.now() - start,\n };\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 // `system`: the model is chosen in the system settings of admin\n if (provider === 'none' || provider === 'pi-agent' || provider === 'system') {\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 if (provider === 'pi-agent') {\n return { error: 'pi-agent has its own connection test in its instance settings.' };\n }\n if (provider === 'system') {\n const llm = await resolveSystemLlm(this, await readSystemAi(this), true);\n if ('error' in llm) {\n return { error: llm.error };\n }\n const res = await new LlmAgent({ ...llm, maxTokens: 16, tools: [], log: this.log }).testConnection();\n return res.ok\n ? { result: `Connection OK (${llm.provider} · ${llm.model || 'auto'})` }\n : { error: res.error || 'unknown error' };\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"]}
|