node-red-contrib-knx-ultimate 6.3.17 → 6.3.19

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.
@@ -5,40 +5,17 @@
5
5
  "groupAssistant": "Assistente AI",
6
6
  "groupChatHome": "Conversazioni e casa",
7
7
  "detectedAdapters": "Adapter rilevati automaticamente",
8
- "groupKnxAnalysis": "Analisi traffico KNX",
8
+ "chatContextOverview": "Contesto disponibile alla chat",
9
9
  "quickSetup": "Configurazione assistente",
10
- "capture": "Telegrammi dal bus",
11
- "storage": "Storico e riepiloghi KNX",
12
- "detection": "Anomalie e pattern",
13
10
  "llmConnection": "Connessione Assistente AI",
14
- "llmContext": "Conoscenza e contesto AI",
15
11
  "chatAdapter": "Canali chat",
16
- "homeIntelligence": "Casa proattiva e memoria",
17
- "homeIntelligenceAdvanced": "Impostazioni proattive avanzate",
12
+ "homeIntelligence": "Educazione AI e memoria",
18
13
  "advanced": "Provider e limiti"
19
14
  },
20
15
  "properties": {
21
16
  "server": "Gateway",
22
17
  "name": "Nome",
23
18
  "topic": "Topic",
24
- "notifywrite": "Cattura GroupValue_Write",
25
- "notifyresponse": "Cattura GroupValue_Response",
26
- "notifyreadrequest": "Cattura GroupValue_Read",
27
- "analysisWindowSec": "Finestra analisi (secondi)",
28
- "historyWindowSec": "Finestra storico (secondi)",
29
- "historyStoreToDisk": "Archivia anche i telegrammi catturati su disco",
30
- "historyStoreRetentionDays": "Retention archivio su disco (giorni)",
31
- "maxEvents": "Eventi massimi in memoria",
32
- "emitIntervalSec": "Invia summary automatico (secondi, 0=off)",
33
- "topN": "Dimensione lista Top",
34
- "enablePattern": "Rileva pattern semplici (A -> B)",
35
- "patternMaxLagMs": "Ritardo massimo pattern (ms)",
36
- "patternMinCount": "Occorrenze minime pattern",
37
- "rateWindowSec": "Finestra rate (secondi)",
38
- "maxTelegramPerSecOverall": "Max telegrammi/sec totale (0=off)",
39
- "maxTelegramPerSecPerGA": "Max telegrammi/sec per GA (0=off)",
40
- "flapWindowSec": "Finestra flap (secondi)",
41
- "flapMaxChanges": "Max cambi per GA nella finestra (0=off)",
42
19
  "llmEnabled": "Abilita assistente LLM",
43
20
  "llmProvider": "Provider",
44
21
  "llmBaseUrl": "URL endpoint",
@@ -46,21 +23,14 @@
46
23
  "llmModel": "Modello",
47
24
  "llmSystemPrompt": "Prompt di sistema",
48
25
  "llmIncludeRaw": "Includi payload raw in hex",
49
- "llmIncludeFlowContext": "Includi inventario del progetto Node-RED",
50
26
  "llmAllowKnxCommands": "Consenti all'AI di leggere stati KNX e comandare attuatori",
51
27
  "llmRequireCommandConfirmation": "Chiedi conferma prima di inviare comandi KNX",
52
28
  "chatAdapterPreset": "Preset adattatore",
53
29
  "chatInputCode": "Mappatura ingresso (chat → KNX AI)",
54
30
  "chatOutputCode": "Mappatura uscita (KNX AI → chat)",
55
- "proactiveEnabled": "Abilita notifiche domestiche proattive",
56
- "proactiveRecipient": "Destinatario principale / chat ID",
57
- "proactiveOpenMinutes": "Avvisa dopo apertura (minuti)",
58
- "proactiveCooldownMinutes": "Intervallo prima di ripetere (minuti)",
59
- "proactiveQuietStart": "Inizio ore silenziose",
60
- "proactiveQuietEnd": "Fine ore silenziose",
31
+ "ttsUltimateNodeId": "Nodo TTS Ultimate per gli annunci",
61
32
  "aiEducation": "Educazione AI (gestita dall'utente)",
62
- "llmIncludeDocsSnippets": "Includi estratti documentazione (help/README/esempi)",
63
- "llmDocsLanguage": "Lingua documentazione"
33
+ "llmIncludeDocsSnippets": "Includi estratti documentazione (help/README/esempi)"
64
34
  },
65
35
  "outputs": {
66
36
  "summary": "Summary/Statistiche",
@@ -72,10 +42,15 @@
72
42
  "llmProvider": {
73
43
  "openai_compat": "Compatibile OpenAI (chat/completions)",
74
44
  "anthropic": "Anthropic (Claude)",
75
- "ollama": "Ollama (locale, beta)"
45
+ "ollama": "Ollama (locale)",
46
+ "lmstudio": "Bionic LM Studio"
76
47
  },
77
48
  "chatAdapter": {
78
49
  "none": "Nessun adattatore"
50
+ },
51
+ "ttsUltimate": {
52
+ "select": "Seleziona un nodo TTS Ultimate",
53
+ "none": "Nessun nodo TTS Ultimate trovato"
79
54
  }
80
55
  },
81
56
  "buttons": {
@@ -87,6 +62,11 @@
87
62
  "messages": {
88
63
  "loadingModels": "Carico i modelli…",
89
64
  "loadedModels": "Modelli caricati",
65
+ "lmStudioContextAvailable": "Contesto massimo del modello",
66
+ "lmStudioContextLoading": "Caricamento del modello con il contesto massimo",
67
+ "lmStudioContextConfigured": "Contesto massimo del modello configurato",
68
+ "lmStudioContextFailed": "Impossibile configurare il contesto del modello",
69
+ "lmStudioContextCurrentlyLoaded": "attualmente caricato",
90
70
  "ollamaNotSupported": "Modalita locale Ollama: API key non richiesta. Endpoint predefinito: http://localhost:11434/api/chat.",
91
71
  "ollamaNoModels": "Nessun modello Ollama locale trovato. Installa un modello o scegli dalla libreria.",
92
72
  "installingOllamaModel": "Avvio Ollama e installo il modello…",
@@ -100,18 +80,41 @@
100
80
  "detectedAdapterDetected": "Rilevato",
101
81
  "detectedAdapterControllers": "Controller",
102
82
  "detectedAdapterCameras": "Telecamere",
83
+ "detectedAdapterNodes": "Nodi",
84
+ "ttsUltimateUnknownFlow": "Flow senza nome",
85
+ "ttsUltimateUnavailable": "Nodo TTS Ultimate non disponibile",
86
+ "ttsUltimateHint": "Le richieste esplicite di annuncio della chat vengono inviate direttamente al nodo scelto; non servono collegamenti nel flow.",
87
+ "chatContextLoading": "Caricamento del riepilogo del contesto…",
88
+ "chatContextUnavailable": "Il riepilogo del contesto della chat non è momentaneamente disponibile.",
89
+ "chatContextIntro": "La chat riceve automaticamente queste fonti. I percorsi sottostanti sono quelli effettivi usati da questa installazione Node-RED.",
90
+ "chatContextSourcesTitle": "Fonti incluse",
91
+ "chatContextFilesTitle": "File persistenti di contesto",
92
+ "chatContextDirectoriesTitle": "Archivio telegrammi KNX",
93
+ "chatContextSourceKnxTraffic": "Riepilogo KNX corrente, anomalie, topologia e telegrammi selezionati.",
94
+ "chatContextSourceEtsProject": "Semantica ETS e inventario completo del progetto Node-RED.",
95
+ "chatContextSourceMemoryEducation": "Contesto di sessione, Educazione AI e memoria domestica limitata.",
96
+ "chatContextSourceCamerasDocs": "Telecamere rilevate ed estratti pertinenti da help, README ed esempi.",
97
+ "chatContextSourceTtsUltimate": "Nodo TTS Ultimate selezionato per gli annunci.",
98
+ "chatContextSourceBadge": "Fonte",
99
+ "chatContextFileChatContext": "Turni persistenti, istruzioni e regole di notifica delle telecamere.",
100
+ "chatContextFileHomeMemory": "Educazione AI e memoria domestica appresa e limitata.",
101
+ "chatContextFileAssistantConfig": "Configurazione persistente dell'Assistente web e aree semantiche di questo nodo.",
102
+ "chatContextFileBadge": "File",
103
+ "chatContextDirectoryRoot": "Radice archivio telegrammi",
104
+ "chatContextDirectoryNode": "Archivio telegrammi di questo nodo",
105
+ "chatContextDirectoryBadge": "KNX",
106
+ "chatContextTelegramPattern": "File giornalieri",
103
107
  "chatAdapterIntro": "Scegli un preset per inserire il codice di mappatura in ingresso e in uscita. La lista viene caricata dal file degli adattatori chat incluso nel pacchetto; il codice generato resta modificabile.",
104
108
  "chatAdapterCodeHelp": "Le mappature sono sincrone. Restituisci msg per continuare oppure nessun valore per scartarlo. Gli errori vengono intercettati e segnalati senza arrestare Node-RED.",
105
- "homeIntelligenceIntro": "Il nodo crea un modello ETS semantico multilingue e può avvisare la chat quando una persiana, finestra o porta riconosciuta con sufficiente affidabilità rimane aperta. Non invia mai autonomamente comandi KNX.",
106
- "aiEducationHelp": "Solo l'utente può modificare questa sezione. L'AI la legge come istruzione autorevole, ma la memoria appresa non può mai sovrascriverla. Massimo 16.000 caratteri."
109
+ "homeIntelligenceIntro": "Il nodo crea un modello ETS semantico multilingue. Le notifiche proattive vengono valutate solo quando l'Educazione AI le richiede esplicitamente; non invia mai autonomamente comandi KNX.",
110
+ "aiEducationHelp": "Solo l'utente può modificare questa sezione. Usala per definire ogni regola di notifica proattiva, comprese condizioni, durata, ore silenziose e ripetizione. L'AI la legge come istruzione autorevole e la memoria appresa non può mai sovrascriverla. Massimo 16.000 caratteri."
107
111
  },
108
112
  "placeholder": {
109
113
  "llmBaseUrl": "https://api.openai.com/v1/chat/completions (o endpoint compatibile)",
110
114
  "llmApiKey": "Incolla la chiave (inizia con sk-)",
111
115
  "llmModel": "es. gpt-4o-mini",
112
116
  "llmSystemPrompt": "Opzionale. Lascia vuoto per default.",
113
- "proactiveRecipient": "Opzionale: chat ID Telegram; altrimenti viene ricordata l'ultima sessione chat",
114
- "aiEducation": "Esempio: non avvisarmi tra le 23:00 e le 07:00. La persiana dello studio può restare aperta di notte."
117
+ "aiEducation": "Esempio: avvisa la mia ultima chat se una finestra resta aperta per 30 minuti. Non avvisarmi tra le 23:00 e le 07:00."
115
118
  },
116
119
  "sidebar": {
117
120
  "ui": {
@@ -1,7 +1,7 @@
1
1
  <script type="text/markdown" data-help-name="knxUltimateAI">
2
2
  此节点会监听所选 KNX Ultimate 网关上的**所有 KNX 电报**,生成流量统计、检测异常,并可选调用 LLM。
3
3
 
4
- 编辑器使用三个主要折叠面板:**AI 助手**包含配置、知识/上下文以及提供商限制;**对话与家庭**包含聊天渠道、主动家庭和受限记忆;**KNX 总线流量分析**包含总线报文、历史/摘要以及异常/模式。打开一个主要面板即可同时看到其中全部相关选项。已保存字段的 ID 和值保持不变。
4
+ 编辑器使用两个水平标签页:**AI 助手**包含配置、知识/上下文以及提供商限制;**对话与家庭**包含聊天渠道、主动家庭和受限记忆。
5
5
 
6
6
  ## 输出
7
7
  1. **摘要/统计**(`msg.payload` 为 JSON)
@@ -21,17 +21,26 @@
21
21
 
22
22
  `ask` 的问题建议放在 `msg.prompt`,也可放在 `msg.payload`(字符串)或常见 Telegram 字段 `msg.payload.content` / `msg.payload.text`。
23
23
 
24
+ 如果处理时间超过 1.2 秒,输出 3 会立即发送本地化的中间消息“我正在思考…”,并设置 `msg.knxAi.type = "thinking"` 和 `msg.knxAi.transient = true`。聊天适配器会将其发送给同一用户,最终答案准备好后仍会正常送达。此进度消息绝不会写入对话上下文或学习记忆。
25
+
26
+ Ollama 和 Bionic LM Studio 请求会自动使用至少 10 分钟的超时时间;云端提供商仍使用至少 2 分钟。编辑器中无需维护超时字段。即使达到本地模型限制,KNX AI 也会说明模型未完成响应,并建议重试或缩减提示上下文。
27
+
28
+ Canvas 上的节点状态专门用于显示最近收到的请求,以及 LLM 运行期间本地化的“我正在思考…”状态。KNX 报文、网关更新、流量速率、ready 消息和技术结果绝不会覆盖该状态;这些信息仍可通过节点输出、日志和助手数据查看。
29
+
24
30
  每个 Ask/聊天会话都会保留最近 8 轮对话和最多 20 条明确的长期指令,并按 `msg.knxAi.sessionId`、`msg.sessionId` 或检测到的 Telegram 聊天 ID 隔离。像“请记住不要在回答中使用 unknown 这个词”这样的请求会成为持久指令。使用相同存储的所有 KNX AI 节点实时共享此上下文,并在 Node-RED 重启后从 `knxultimatestorage/knxai/memory/knxai-chat-context.md` 重新加载。该文件采用原子写入,最多保存 50 个会话且不超过 512 KB。启用 KNX 控制后,将输出 3 连接到聊天发送节点,将输出 4 连接到配置为**通用模式**的 KNX Ultimate 节点。启用确认后,第一条回复会显示 GA、DPT 和 payload,但不会发送写入;同一会话必须在 5 分钟内回复“确认”或“取消”。新请求会替换旧的待处理计划。每条已确认命令都包含 `msg.destination`、`msg.dpt`、`msg.payload` 和 `msg.event = "GroupValue_Write"`。
25
31
  对于 DPT 1.xxx 写入,AI 生成的安全等价值 `true`/`false`、`1`/`0` 和 `on`/`off` 会在本地校验和输出前统一转换为真正的布尔值。
26
32
 
27
33
  ### 最新 KNX 读取
28
34
  当用户明确要求当前或最新状态时,AI 可以查询已导入 ETS 目录中的精确对象,包括状态对象和其他只读对象。输出 4 会发送 `msg.destination`、`msg.dpt`、`msg.event = "GroupValue_Read"` 和 `msg.readstatus = true`。节点会为每个 `GroupValue_Response` 或最新写入等待最多 6 秒,然后在输出 3 返回解码值,并在 `msg.knxAi.readResults` 中提供详细信息。读取从不需要确认,也绝不会转换为写入。
29
35
 
36
+ ### 多步骤对话例行程序
37
+ “我要离家”“晚安”或“影院模式”等请求可以在不增加编辑器选项的情况下,根据当前状态协调例行程序。第一次 LLM 处理仅接受精确的 ETS 读取(最多 20 个);KNX AI 发送读取,并把最新的 GA/DPT/值结果交给隔离的第二次规划处理。第二次处理最多可准备 12 个已验证写入,但不能再次发起读取循环。启用确认时,整个计划只需一次本地化确认;确认前不会发送任何写入或所请求的 TTS 播报。确认后,每个写入都会重新验证、按顺序转发,并在最多 4 秒内观察总线上匹配的即时反馈。最终回复会区分已观察到反馈的操作与没有即时反馈的操作,但不会把后者报告为设备故障。详细信息位于 `msg.knxAi.routine`、`readResults`、`verifiedCount` 和 `unverifiedCount`。
38
+
30
39
  ### 用于聊天按钮的确认请求
31
40
  计划等待确认时,输出 3 包含 `msg.knxAi.confirmationRequest`。该对象包括 `required`、`status`、`sessionId`、`expiresAt`、`commandCount`,以及 `actions` 中的两个项目。使用 `action.label` 作为 Telegram 按钮文本,使用 `action.callbackData` 作为回调,并将 `action.message` 发送回 KNX AI,即可在无需输入文本的情况下确认或取消。
32
41
 
33
42
  ### 聊天适配器预设
34
- **聊天适配器**选项卡从 `resources/KNXAIChatAdapterMappings.js` 加载可选映射。选择预设会在全宽文本框中插入两段可编辑的同步 JavaScript 映射:一段在 KNX AI 处理输入前运行,另一段在输出 3 发出消息前运行。返回 `msg` 以继续,或不返回值以丢弃消息。语法和执行错误会被捕获并报告,不会停止 Node-RED。
43
+ **聊天适配器**选项卡从 `resources/KNXAIChatAdapterMappings.js` 加载可选映射。选择预设会在内部安装两段预定义的同步 JavaScript 映射:一段在 KNX AI 处理输入前运行,另一段在输出 3 发出消息前运行。这些映射在编辑器中始终保持隐藏。语法和执行错误会被捕获并报告,不会停止 Node-RED。
35
44
 
36
45
  随附的 **windkh/node-red-contrib-telegrambot** 预设遵循该包的 receiver/sender 消息约定。把 `telegram receiver` 直接连接到 KNX AI,并把输出 3 直接连接到 `telegram sender`。如需内联确认按钮,还要把配置为 `callback_query` 的 `telegram event` 连接到同一个 KNX AI 输入。输入映射会提取 `msg.payload.content`、`msg.payload.chatId` 和 Telegram 语言;输出映射会创建所需的 `msg.payload.chatId`、`type` 和 `content`,并在写入等待确认时从 `msg.knxAi.confirmationRequest` 添加 `options.reply_markup`。Telegram 包仍是独立的可选依赖项。
37
46
 
@@ -42,31 +51,30 @@
42
51
 
43
52
  用户可以请求当前快照,或询问视觉模型画面中可见的内容。Telegram 和 RedBot 预设会把图像作为带说明文字的原生照片发送。用户还可以为移动、智能越线或进入入侵/徘徊区域创建持久通知,并可按检测到的人员以及指定名称的线或区域进行限制。这些规则保存在同一个 `knxai-chat-context.md` 文件中,并在 Node-RED 重启后恢复。UniFi 事件订阅和快照请求直接通过检测到的提供方完成;不会使用 KNX AI 输出 4,也不需要中间 Flow 连线。
44
53
 
45
- ## 主动家庭智能与有限记忆
46
- **对话与家庭**中的**主动家庭与记忆**子部分以可选方式启用主动通知。节点会根据 ETS 层级、名称、角色和 DPT,使用意大利语、英语、德语、法语、西班牙语和中文术语,为卷帘、窗户、门、照明、温度、气候、占用和报警建立确定性的语义模型。首个主动检测器只监视可靠识别且非命令的卷帘/窗户/门状态。超过配置的打开时间且当前不在静默时段时,输出 3 会发送本地化消息,并设置 `msg.knxAi.type = "proactive_notification"`。节点绝不会主动使用输出 4,也不会自行修改 KNX;用户之后提出的任何操作仍须经过正常的校验与确认。
54
+ ### 使用 TTS Ultimate 播报
55
+ 安装可选软件包 `node-red-contrib-tts-ultimate` 后,它会显示在自动检测的适配器中。选择器会列出项目所有 Flow 中的全部 `ttsultimate` 节点,并显示 Flow、节点名称和已配置的播放器。请选择负责聊天播报的节点,然后部署 Flow。
47
56
 
48
- 最近一次聊天会话会被记为主人,也可以通过**主要接收者 / 聊天 ID**明确指定。合成的 `msg.inputMessage` 会保留接收者,使 Telegram 适配器能够发送主动通知。冷却时间和每小时最多三条主动通知可防止消息泛滥。
57
+ 只有当前聊天消息中的明确请求才能创建播报。KNX AI 会将准确文本作为 `msg.payload` 直接发送到所选节点,并设置 `msg.topic = "knx_ai_announcement"`;无需在 Flow 中增加中间连线。之后由 TTS Ultimate 处理已配置的 Sonos 播放器、语音、音量、提示音和队列。持久上下文、AI 教育、摄像机内容和推断事件绝不会自行触发语音。
49
58
 
50
- 共享的学习参考文件会在启动时从 `<userDir>/knxai/memory/knxai-home-memory.md` 加载,每 15 分钟以原子方式重写,并始终严格限制为 5 MB。最多保留 120 条重要观察、80 条聚合习惯、80 条通知和 300 个 ETS 语义对象,绝不会保存无限的原始报文流。较旧且优先级较低的项目会先被删除。**AI 教育**最多 16,000 个字符,并且始终来自节点配置:AI 可以将其作为权威指导读取,但不能修改或覆盖。如果已填写 AI 教育但 LLM 无法进行评估,候选通知会被抑制,以免违反用户指导。
59
+ ### 聊天上下文概览
60
+ 节点编辑器会显示一张紧凑卡片,汇总聊天可用的来源:当前 KNX 流量、ETS 语义与 Node-RED 项目、会话和家庭记忆、AI 教育、检测到的摄像机及相关文档。卡片还会列出 `knxai-chat-context.md`、`knxai-home-memory.md` 和 `knxai-config-<节点-id>.json`,以及 KNX 报文归档的绝对根目录、该节点专用目录和每日文件模式 `YYYY-MM-DD.jsonl`。这些路径会在运行时根据已配置网关实际使用的数据目录解析。
51
61
 
52
- ## 实用配置示例
53
- 此示例创建一个简洁的助手:它会报告重要的长时间开启状态,但允许书房卷帘保持开启。
62
+ ## 由 AI 教育驱动的主动家庭智能与有限记忆
63
+ 节点会根据 ETS 层级、名称、角色和 DPT 建立确定性的语义模型。不再提供单独的开关或高级主动通知设置。只有启用 LLM 且 **AI 教育**明确要求时,系统才会评估通知。条件、持续时间、静默时段和重复频率完全由 AI 教育定义。没有明确规则或 LLM 无法评估时,不会发送任何消息。
54
64
 
55
- | 编辑器字段 | 示例值 | 结果 |
56
- |---|---|---|
57
- | **启用主动家庭通知** (`proactiveEnabled`) | 启用 | 节点评估可靠识别的卷帘、窗户和门开启状态。 |
58
- | **主要接收者 / 聊天 ID** (`proactiveRecipient`) | `123456789` | 主动消息发送到该聊天;留空则记住最近一次 Ask 会话。 |
59
- | **开启多久后通知** (`proactiveOpenMinutes`) | `120` | 开启两小时后评估是否需要通知。 |
60
- | **静默时间开始 / 结束** | `23:00` / `07:00` | 夜间不会发送主动消息。 |
61
- | **重复冷却时间** (`proactiveCooldownMinutes`) | `360` | 同一对象六小时内不会再次通知。 |
65
+ 最近一次聊天会话会被记为主人并接收主动消息。输出 3 会设置 `msg.knxAi.type = "proactive_notification"`,`msg.inputMessage` 为聊天适配器保留该会话。每小时最多三条主动通知可防止消息泛滥。节点绝不会主动使用输出 4,也不会自行修改 KNX。
62
66
 
63
- **AI 教育** (`aiEducation`) 示例:
67
+ 共享的学习参考文件会在启动时从 `<userDir>/knxai/memory/knxai-home-memory.md` 加载,每 15 分钟以原子方式重写,并始终严格限制为 5 MB。最多保留 120 条重要观察、80 条聚合习惯、80 条通知和 300 个 ETS 语义对象,绝不会保存无限的原始报文流。较旧且优先级较低的项目会先被删除。**AI 教育**最多 16,000 个字符,并且始终来自节点配置:AI 可以将其作为权威指导读取,但不能修改或覆盖。如果已填写 AI 教育但 LLM 无法进行评估,候选通知会被抑制,以免违反用户指导。
68
+
69
+ ## 实用配置示例
70
+ 请将完整的通知策略写入 **AI 教育** (`aiEducation`):
64
71
 
65
72
  ```text
66
73
  称呼我为 Alex,并使用与我相同的语言回答。
67
74
  除非我要求技术细节,否则回答要简短。
75
+ 卷帘、窗户或门保持打开至少 120 分钟时,通知我最近的聊天。
76
+ 23:00 到 07:00 之间不要通知,同一提醒在六小时内不要重复。
68
77
  书房卷帘白天可以保持开启:不要因此通知我。
69
- 其他卷帘、窗户或门异常长时间开启时请通知我。
70
78
  如果“客厅灯”指向多个灯,请先询问我具体是哪一个。
71
79
  在 KNX 状态对象确认之前,绝不要声称执行器已经改变。
72
80
  ```
@@ -93,46 +101,20 @@
93
101
  - **Topic**:节点输出使用的基础 topic。
94
102
  - **Open KNX AI Web** 按钮:打开网页仪表板(`/knxUltimateAI/sidebar/page`)。
95
103
 
96
- KNX AI 会自动监听 `GroupValue_Write`、`GroupValue_Response` 和 `GroupValue_Read` 报文。模式和异常分析始终使用内置默认值初始化,无需配置总线事件或检测参数。
97
-
98
- ### Analysis
99
- - **Analysis window (seconds)**:摘要/速率统计主窗口。
100
- - **History window (seconds)**:内部历史保留窗口。
101
- - **同时将捕获的报文归档到磁盘**:除了 RAM,还会把报文保存到 `knxultimatestorage/knxai/history/<node-id>/YYYY-MM-DD.jsonl`。
102
- - **磁盘归档保留天数**:归档文件在磁盘上保留的天数,超期后旧文件会自动删除。
103
- - **Max stored events**:内存中保留的最大电报数量。
104
- - **Auto emit summary (seconds, 0=off)**:周期性输出摘要间隔。
105
- - **Top list size**:摘要中 top 组地址/来源数量。
106
-
107
104
  ### AI 助手
108
105
  - **Enable LLM assistant**:启用 Ask/chat 功能。
109
- - **Provider**:LLM 后端(OpenAI-compatible 或 Ollama)。
106
+ - **Provider**:LLM 后端(OpenAI-compatible、Anthropic、Ollama 或 Bionic LM Studio)。
110
107
  - **Endpoint URL**:chat/completions 接口 URL。
111
- - **API key**:API Key(本地 Ollama 可不填)。
108
+ - **API key**:API Key(本地 Ollama 可不填;Bionic LM Studio 在未启用服务器身份验证时也可不填)。
112
109
  - **Model**:模型 ID/名称。
113
110
  - **聊天模型兼容性**:所选模型必须支持已配置的 Chat Completions 端点。刷新模型列表时,会排除仅支持旧版 completions 的模型,例如 `gpt-3.5-turbo-instruct`。如果提供商拒绝自定义 temperature 值或令牌限制参数,KNX AI 会仅移除或替换不兼容字段后重试。
114
111
  - **允许 AI 读取 KNX 状态并控制执行器**:启用输出 4,默认关闭。可以读取 ETS 目录中的精确对象;仅接受写入明确标记为 `command` 的对象。未知、DPT 不匹配、无效或数量过多的操作,以及向状态或中性对象的写入,都会在本地被拒绝。
115
112
  - **发送 KNX 命令前请求确认**:默认启用。先显示已验证的修改,在同一聊天会话确认前不会发送任何 KNX 命令。有命令等待确认时,回复始终会使用当前请求的语言附加准确的确认或取消说明。命令会在输出前再次验证。
116
- - **适配器预设**:默认为**无适配器**。选择适配器前会隐藏 JavaScript 编辑器;选择后会加载并显示可编辑的输入和输出映射。
117
- - **输入映射(聊天 → KNX AI)**:在处理输入命令前运行的同步 JavaScript,使用绿色 JavaScript 编辑器。
118
- - **输出映射(KNX AI → 聊天)**:仅应用于输出 3 消息的同步 JavaScript,使用黄色 JavaScript 编辑器。
119
- - **启用主动家庭通知**:可选检测器,仅处理可靠识别的卷帘、窗户和门开启状态;绝不会自主写入 KNX。
120
- - **主要接收者 / 聊天 ID**:主动消息的可选目标;未填写时记住最近一次 Ask 会话。
121
- - **开启多久后通知(分钟)**:考虑发送主动通知前的开启时长阈值;默认 120 分钟。
122
- - **静默时间开始 / 结束**:每天禁止主动消息的时间段。
123
- - **AI 教育**:仅由用户管理的权威指导,AI 可以读取但永远不能修改。
124
- - **重复冷却时间(分钟)**:同一对象再次通知前的最短间隔;默认 360 分钟。
125
- - 如果启用了磁盘归档,**Ask** 默认会查询该归档:若问题里写了明确日期/时间范围就按其查询,否则默认查询最近 24 小时并补上当前 RAM 事件。
126
- - **包含 Node-RED 项目清单**:在提示词中加入整个 Node-RED 项目的节点清单,不仅包含 KNX 节点,也包含 function/change/inject/template 等在内且带有 KNX 逻辑或组地址的有用节点。
127
- - 相关的帮助、README 和示例片段始终会自动包含。
128
- - **Docs language**:自动包含的文档片段所使用的首选语言。
113
+ - **适配器预设**:默认为**无适配器**。选择后会加载预定义的输入和输出映射;两者在编辑器中始终保持隐藏。
114
+ - **AI 教育**:仅由用户管理的权威指导,AI 可以读取但永远不能修改。主动通知及其条件、持续时间、静默时段和重复频率只能在这里定义。
115
+ - 相关的帮助、README 和示例片段始终会自动包含;系统会从用户请求中自动识别语言,并在所有受支持语言之间自动回退。
129
116
  - **Refresh** 按钮:请求 provider 并加载可用模型 ID。加载期间图标会旋转;成功完成时不会显示额外消息。
130
117
 
131
- ### Advanced
132
- - **Analysis window (seconds)**:摘要/速率统计主窗口。
133
- - **Max stored events**:内存中保留的最大电报数量。
134
- - **Top list size**:摘要中 top 组地址/来源数量。
135
-
136
118
  ### Ollama 快速配置(本地)
137
119
  - 选择 **Provider = Ollama**。
138
120
  - 默认 endpoint:`http://localhost:11434/api/chat`。
@@ -143,6 +125,13 @@ KNX AI 会自动监听 `GroupValue_Write`、`GroupValue_Response` 和 `GroupValu
143
125
  - 若安装因连接错误失败,请确认 Ollama 已运行(桌面应用或 `ollama serve`)。
144
126
  - 若 Node-RED 运行在 Docker 中,endpoint 请使用 `host.docker.internal` 替代 `localhost`。
145
127
 
128
+ ### Bionic LM Studio 快速配置(本地)
129
+ - 选择 **Provider = Bionic LM Studio**。
130
+ - 在 LM Studio 的 **Developer** 页面启动 API 服务,或运行 `lms server start`。
131
+ - 默认 endpoint:`http://localhost:1234/v1/chat/completions`。
132
+ - 点击 **Refresh** 加载 `/v1/models` 提供的全部模型;未配置模型时会自动选择第一个。
133
+ - 除非在 LM Studio 服务设置中启用了身份验证,否则 API Key 可留空。在 Docker 中请将 `localhost` 替换为 `host.docker.internal`。
134
+
146
135
  ## 安全说明
147
136
  启用 LLM 后,KNX 流量上下文可能发送到所配置的 endpoint。若需严格本地化,请使用本地 provider。输出 4 上的命令仅表示已通过本地验证并转发到 flow,并不能证明执行器已执行;需要确认时请使用 KNX 状态 GA。
148
137
  </script>
@@ -5,40 +5,17 @@
5
5
  "groupAssistant": "AI 助手",
6
6
  "groupChatHome": "对话与家庭",
7
7
  "detectedAdapters": "自动检测到的适配器",
8
- "groupKnxAnalysis": "KNX 总线流量分析",
8
+ "chatContextOverview": "聊天上下文概览",
9
9
  "quickSetup": "助手配置",
10
- "capture": "总线报文输入",
11
- "storage": "KNX 历史与摘要",
12
- "detection": "异常与模式",
13
10
  "llmConnection": "AI 助手连接",
14
- "llmContext": "AI 知识与上下文",
15
11
  "chatAdapter": "聊天渠道",
16
- "homeIntelligence": "主动家庭与记忆",
17
- "homeIntelligenceAdvanced": "高级主动通知设置",
12
+ "homeIntelligence": "AI 教育与记忆",
18
13
  "advanced": "提供商与限制"
19
14
  },
20
15
  "properties": {
21
16
  "server": "Gateway",
22
17
  "name": "Name",
23
18
  "topic": "Topic",
24
- "notifywrite": "Capture GroupValue_Write",
25
- "notifyresponse": "Capture GroupValue_Response",
26
- "notifyreadrequest": "Capture GroupValue_Read",
27
- "analysisWindowSec": "Analysis window (seconds)",
28
- "historyWindowSec": "History window (seconds)",
29
- "historyStoreToDisk": "同时将捕获的报文归档到磁盘",
30
- "historyStoreRetentionDays": "磁盘归档保留天数",
31
- "maxEvents": "Max stored events",
32
- "emitIntervalSec": "Auto emit summary (seconds, 0=off)",
33
- "topN": "Top list size",
34
- "enablePattern": "Detect simple patterns (A -> B)",
35
- "patternMaxLagMs": "Pattern max lag (ms)",
36
- "patternMinCount": "Pattern min occurrences",
37
- "rateWindowSec": "Rate window (seconds)",
38
- "maxTelegramPerSecOverall": "Max overall telegrams/sec (0=off)",
39
- "maxTelegramPerSecPerGA": "Max telegrams/sec per GA (0=off)",
40
- "flapWindowSec": "Flap window (seconds)",
41
- "flapMaxChanges": "Max changes per GA in window (0=off)",
42
19
  "llmEnabled": "Enable LLM assistant",
43
20
  "llmProvider": "Provider",
44
21
  "llmBaseUrl": "Endpoint URL",
@@ -46,21 +23,14 @@
46
23
  "llmModel": "Model",
47
24
  "llmSystemPrompt": "System prompt",
48
25
  "llmIncludeRaw": "Include raw payload hex",
49
- "llmIncludeFlowContext": "包含 Node-RED 项目清单",
50
26
  "llmAllowKnxCommands": "允许 AI 读取 KNX 状态并控制执行器",
51
27
  "llmRequireCommandConfirmation": "发送 KNX 命令前请求确认",
52
28
  "chatAdapterPreset": "适配器预设",
53
29
  "chatInputCode": "输入映射(聊天 → KNX AI)",
54
30
  "chatOutputCode": "输出映射(KNX AI → 聊天)",
55
- "proactiveEnabled": "启用主动家庭通知",
56
- "proactiveRecipient": "主要接收者 / 聊天 ID",
57
- "proactiveOpenMinutes": "保持打开多少分钟后通知",
58
- "proactiveCooldownMinutes": "重复通知冷却时间(分钟)",
59
- "proactiveQuietStart": "静默时段开始",
60
- "proactiveQuietEnd": "静默时段结束",
31
+ "ttsUltimateNodeId": "用于播报的 TTS Ultimate 节点",
61
32
  "aiEducation": "AI 教育(由用户管理)",
62
- "llmIncludeDocsSnippets": "Include documentation snippets (help/README/examples)",
63
- "llmDocsLanguage": "Docs language"
33
+ "llmIncludeDocsSnippets": "Include documentation snippets (help/README/examples)"
64
34
  },
65
35
  "outputs": {
66
36
  "summary": "摘要/统计",
@@ -72,13 +42,23 @@
72
42
  "llmProvider": {
73
43
  "openai_compat": "OpenAI-compatible (chat/completions)",
74
44
  "anthropic": "Anthropic (Claude)",
75
- "ollama": "Ollama (local, beta)"
45
+ "ollama": "Ollama(本地)",
46
+ "lmstudio": "Bionic LM Studio"
76
47
  },
77
48
  "chatAdapter": {
78
49
  "none": "无适配器"
50
+ },
51
+ "ttsUltimate": {
52
+ "select": "选择 TTS Ultimate 节点",
53
+ "none": "未找到 TTS Ultimate 节点"
79
54
  }
80
55
  },
81
56
  "messages": {
57
+ "lmStudioContextAvailable": "模型最大上下文",
58
+ "lmStudioContextLoading": "正在以最大上下文加载模型",
59
+ "lmStudioContextConfigured": "已配置模型最大上下文",
60
+ "lmStudioContextFailed": "无法配置模型上下文",
61
+ "lmStudioContextCurrentlyLoaded": "当前已加载",
82
62
  "ollamaNotSupported": "Ollama local mode: API key not required. Default endpoint is http://localhost:11434/api/chat.",
83
63
  "ollamaNoModels": "No local Ollama model found. Install one or pick one from the library.",
84
64
  "installingOllamaModel": "Starting Ollama and installing model…",
@@ -92,18 +72,41 @@
92
72
  "detectedAdapterDetected": "已检测",
93
73
  "detectedAdapterControllers": "控制器",
94
74
  "detectedAdapterCameras": "摄像机",
75
+ "detectedAdapterNodes": "节点",
76
+ "ttsUltimateUnknownFlow": "未命名 Flow",
77
+ "ttsUltimateUnavailable": "TTS Ultimate 节点不可用",
78
+ "ttsUltimateHint": "聊天中的明确播报请求会直接发送到所选节点,无需在 Flow 中额外连线。",
79
+ "chatContextLoading": "正在加载聊天上下文摘要…",
80
+ "chatContextUnavailable": "聊天上下文摘要暂时不可用。",
81
+ "chatContextIntro": "聊天会自动接收这些来源。以下路径是此 Node-RED 安装实际使用的路径。",
82
+ "chatContextSourcesTitle": "包含的来源",
83
+ "chatContextFilesTitle": "持久化上下文文件",
84
+ "chatContextDirectoriesTitle": "KNX 报文归档",
85
+ "chatContextSourceKnxTraffic": "当前 KNX 摘要、异常、拓扑和选定报文。",
86
+ "chatContextSourceEtsProject": "ETS 语义和完整的 Node-RED 项目清单。",
87
+ "chatContextSourceMemoryEducation": "会话上下文、AI 教育和有界家庭记忆。",
88
+ "chatContextSourceCamerasDocs": "检测到的摄像机以及相关帮助、README 和示例片段。",
89
+ "chatContextSourceTtsUltimate": "已选择用于播报的 TTS Ultimate 节点。",
90
+ "chatContextSourceBadge": "来源",
91
+ "chatContextFileChatContext": "持久化对话轮次、指令和摄像机通知规则。",
92
+ "chatContextFileHomeMemory": "AI 教育和有界的家庭学习记忆。",
93
+ "chatContextFileAssistantConfig": "此节点的持久化 Web 助手配置和语义区域。",
94
+ "chatContextFileBadge": "文件",
95
+ "chatContextDirectoryRoot": "报文归档根目录",
96
+ "chatContextDirectoryNode": "此节点的报文归档",
97
+ "chatContextDirectoryBadge": "KNX",
98
+ "chatContextTelegramPattern": "每日文件",
95
99
  "chatAdapterIntro": "选择预设即可插入输入和输出映射代码。列表从随包提供的聊天适配器文件加载;生成的代码仍可编辑。",
96
100
  "chatAdapterCodeHelp": "映射同步运行。返回 msg 以继续,或不返回值以丢弃消息。错误会被捕获并报告,不会停止 Node-RED。",
97
- "homeIntelligenceIntro": "节点会创建多语言 ETS 语义模型,并在可靠识别的卷帘、窗户或门长时间保持打开时主动通知聊天。它绝不会自行发送 KNX 命令。",
98
- "aiEducationHelp": "只有用户可以编辑此部分。AI 会把它作为权威指导读取,但学习到的记忆绝不能覆盖它。最多 16,000 个字符。"
101
+ "homeIntelligenceIntro": "节点会创建多语言 ETS 语义模型。只有 AI 教育明确要求时,才会考虑主动通知;节点绝不会自行发送 KNX 命令。",
102
+ "aiEducationHelp": "只有用户可以编辑此部分。请在这里定义所有主动通知规则,包括条件、持续时间、静默时段和重复频率。AI 会将其作为权威指导,学习到的记忆绝不能覆盖它。最多 16,000 个字符。"
99
103
  },
100
104
  "placeholder": {
101
105
  "llmBaseUrl": "https://api.openai.com/v1/chat/completions (or your compatible endpoint)",
102
106
  "llmApiKey": "Paste API key (starts with sk-)",
103
107
  "llmModel": "e.g. gpt-4o-mini",
104
108
  "llmSystemPrompt": "Optional. Leave empty for default.",
105
- "proactiveRecipient": "可选:Telegram 聊天 ID;留空则记住最近一次聊天会话",
106
- "aiEducation": "示例:23:00 到 07:00 之间不要通知我。书房卷帘夜间可以保持打开。"
109
+ "aiEducation": "示例:窗户保持打开 30 分钟时通知我最近的聊天;23:00 到 07:00 之间不要通知。"
107
110
  },
108
111
  "sidebar": {
109
112
  "ui": {
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "engines": {
4
4
  "node": ">=20.18.1"
5
5
  },
6
- "version": "6.3.17",
6
+ "version": "6.3.19",
7
7
  "description": "KNX Ultimate is the most advanced KNX integration for Node-RED, providing secure KNX/IP communication, routing, ETS project import, Philips Hue, Matter Controller and Matter Bridge (control matter device via KNX and expose KNX GA via Matter), MQTT, diagnostics with AI, virtual devices, and powerful automation nodes. Build professional, reliable, and scalable smart home and building automation projects with minimal effort.",
8
8
  "files": [
9
9
  "nodes/",