node-red-contrib-knx-ultimate 6.3.16 → 6.3.18
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/CHANGELOG.md +11 -0
- package/examples/KNX AI - Conversational Control with Confirmation.json +0 -20
- package/examples/KNX AI - Summary Anomalies and Ask.json +0 -17
- package/examples/KNX AI - Telegrambot Direct Chat.json +3 -29
- package/nodes/knxUltimateAI.html +458 -206
- package/nodes/knxUltimateAI.js +1191 -163
- package/nodes/locales/de/knxUltimateAI.html +34 -48
- package/nodes/locales/de/knxUltimateAI.json +42 -39
- package/nodes/locales/en/knxUltimateAI.html +38 -51
- package/nodes/locales/en/knxUltimateAI.json +42 -39
- package/nodes/locales/es/knxUltimateAI.html +34 -48
- package/nodes/locales/es/knxUltimateAI.json +42 -39
- package/nodes/locales/fr/knxUltimateAI.html +34 -48
- package/nodes/locales/fr/knxUltimateAI.json +42 -39
- package/nodes/locales/it/knxUltimateAI.html +38 -51
- package/nodes/locales/it/knxUltimateAI.json +42 -39
- package/nodes/locales/zh-CN/knxUltimateAI.html +34 -48
- package/nodes/locales/zh-CN/knxUltimateAI.json +42 -39
- package/package.json +1 -1
|
@@ -5,40 +5,17 @@
|
|
|
5
5
|
"groupAssistant": "AI assistant",
|
|
6
6
|
"groupChatHome": "Conversations & home",
|
|
7
7
|
"detectedAdapters": "Automatically detected adapters",
|
|
8
|
-
"
|
|
8
|
+
"chatContextOverview": "Chat context overview",
|
|
9
9
|
"quickSetup": "Assistant setup",
|
|
10
|
-
"capture": "Bus telegram input",
|
|
11
|
-
"storage": "KNX history & summaries",
|
|
12
|
-
"detection": "Anomalies & patterns",
|
|
13
10
|
"llmConnection": "AI Assistant Connection",
|
|
14
|
-
"llmContext": "AI knowledge & context",
|
|
15
11
|
"chatAdapter": "Chat channels",
|
|
16
|
-
"homeIntelligence": "
|
|
17
|
-
"homeIntelligenceAdvanced": "Advanced proactive settings",
|
|
12
|
+
"homeIntelligence": "AI Education & memory",
|
|
18
13
|
"advanced": "Provider & limits"
|
|
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": "Also archive captured telegrams to disk",
|
|
30
|
-
"historyStoreRetentionDays": "Disk archive retention (days)",
|
|
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": "Include Node-RED project inventory",
|
|
50
26
|
"llmAllowKnxCommands": "Allow AI to read KNX states and control actuators",
|
|
51
27
|
"llmRequireCommandConfirmation": "Ask for confirmation before sending KNX commands",
|
|
52
28
|
"chatAdapterPreset": "Adapter preset",
|
|
53
29
|
"chatInputCode": "Input mapping (chat → KNX AI)",
|
|
54
30
|
"chatOutputCode": "Output mapping (KNX AI → chat)",
|
|
55
|
-
"
|
|
56
|
-
"proactiveRecipient": "Primary recipient / chat ID",
|
|
57
|
-
"proactiveOpenMinutes": "Notify after open (minutes)",
|
|
58
|
-
"proactiveCooldownMinutes": "Repeat cooldown (minutes)",
|
|
59
|
-
"proactiveQuietStart": "Quiet hours start",
|
|
60
|
-
"proactiveQuietEnd": "Quiet hours end",
|
|
31
|
+
"ttsUltimateNodeId": "TTS Ultimate announcement node",
|
|
61
32
|
"aiEducation": "AI Education (user managed)",
|
|
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": "Summary/Stats",
|
|
@@ -72,10 +42,15 @@
|
|
|
72
42
|
"llmProvider": {
|
|
73
43
|
"openai_compat": "OpenAI-compatible (chat/completions)",
|
|
74
44
|
"anthropic": "Anthropic (Claude)",
|
|
75
|
-
"ollama": "Ollama (local
|
|
45
|
+
"ollama": "Ollama (local)",
|
|
46
|
+
"lmstudio": "Bionic LM Studio"
|
|
76
47
|
},
|
|
77
48
|
"chatAdapter": {
|
|
78
49
|
"none": "No adapter"
|
|
50
|
+
},
|
|
51
|
+
"ttsUltimate": {
|
|
52
|
+
"select": "Select a TTS Ultimate node",
|
|
53
|
+
"none": "No TTS Ultimate node found"
|
|
79
54
|
}
|
|
80
55
|
},
|
|
81
56
|
"buttons": {
|
|
@@ -87,6 +62,11 @@
|
|
|
87
62
|
"messages": {
|
|
88
63
|
"loadingModels": "Loading models…",
|
|
89
64
|
"loadedModels": "Models loaded",
|
|
65
|
+
"lmStudioContextAvailable": "Maximum model context",
|
|
66
|
+
"lmStudioContextLoading": "Loading the model with its maximum context",
|
|
67
|
+
"lmStudioContextConfigured": "Maximum model context configured",
|
|
68
|
+
"lmStudioContextFailed": "Unable to configure the model context",
|
|
69
|
+
"lmStudioContextCurrentlyLoaded": "currently loaded",
|
|
90
70
|
"ollamaNotSupported": "Ollama local mode: API key not required. Default endpoint is http://localhost:11434/api/chat.",
|
|
91
71
|
"ollamaNoModels": "No local Ollama model found. Install one or pick one from the library.",
|
|
92
72
|
"installingOllamaModel": "Starting Ollama and installing model…",
|
|
@@ -100,18 +80,41 @@
|
|
|
100
80
|
"detectedAdapterDetected": "Detected",
|
|
101
81
|
"detectedAdapterControllers": "Controllers",
|
|
102
82
|
"detectedAdapterCameras": "Cameras",
|
|
83
|
+
"detectedAdapterNodes": "Nodes",
|
|
84
|
+
"ttsUltimateUnknownFlow": "Flow without name",
|
|
85
|
+
"ttsUltimateUnavailable": "Unavailable TTS Ultimate node",
|
|
86
|
+
"ttsUltimateHint": "Explicit chat announcement requests are sent directly to the selected node; no flow wiring is required.",
|
|
87
|
+
"chatContextLoading": "Loading chat context summary…",
|
|
88
|
+
"chatContextUnavailable": "The chat context summary is temporarily unavailable.",
|
|
89
|
+
"chatContextIntro": "The chat automatically receives these sources. The paths below are the actual paths used by this Node-RED installation.",
|
|
90
|
+
"chatContextSourcesTitle": "Included sources",
|
|
91
|
+
"chatContextFilesTitle": "Persistent context files",
|
|
92
|
+
"chatContextDirectoriesTitle": "KNX telegram archive",
|
|
93
|
+
"chatContextSourceKnxTraffic": "Live KNX summary, anomalies, topology and selected telegrams.",
|
|
94
|
+
"chatContextSourceEtsProject": "ETS semantics and the full Node-RED project inventory.",
|
|
95
|
+
"chatContextSourceMemoryEducation": "Session context, AI Education and bounded home memory.",
|
|
96
|
+
"chatContextSourceCamerasDocs": "Detected cameras and relevant help, README and example snippets.",
|
|
97
|
+
"chatContextSourceTtsUltimate": "Selected TTS Ultimate announcement target.",
|
|
98
|
+
"chatContextSourceBadge": "Source",
|
|
99
|
+
"chatContextFileChatContext": "Persistent conversation turns, instructions and camera notification rules.",
|
|
100
|
+
"chatContextFileHomeMemory": "AI Education and bounded learned home memory.",
|
|
101
|
+
"chatContextFileAssistantConfig": "Persistent web Assistant configuration and semantic areas for this node.",
|
|
102
|
+
"chatContextFileBadge": "File",
|
|
103
|
+
"chatContextDirectoryRoot": "Telegram archive root",
|
|
104
|
+
"chatContextDirectoryNode": "This node's telegram archive",
|
|
105
|
+
"chatContextDirectoryBadge": "KNX",
|
|
106
|
+
"chatContextTelegramPattern": "Daily files",
|
|
103
107
|
"chatAdapterIntro": "Choose a mapping preset to insert its input and output code. The list is loaded from the packaged chat-adapter mappings file; the generated code remains editable.",
|
|
104
108
|
"chatAdapterCodeHelp": "Mappings run synchronously. Return msg to continue or return no value to discard it. Errors are caught and reported without stopping Node-RED.",
|
|
105
|
-
"homeIntelligenceIntro": "The node builds a multilingual semantic ETS model
|
|
106
|
-
"aiEducationHelp": "Only the user can edit this section. The AI reads it as authoritative guidance
|
|
109
|
+
"homeIntelligenceIntro": "The node builds a multilingual semantic ETS model. Proactive notifications are considered only when AI Education explicitly requests them; it never sends a KNX command proactively.",
|
|
110
|
+
"aiEducationHelp": "Only the user can edit this section. Use it to define any proactive notification policy, including conditions, duration, quiet hours and repetition. The AI reads it as authoritative guidance and learned memory can never overwrite it. Maximum 16,000 characters."
|
|
107
111
|
},
|
|
108
112
|
"placeholder": {
|
|
109
113
|
"llmBaseUrl": "https://api.openai.com/v1/chat/completions (or your compatible endpoint)",
|
|
110
114
|
"llmApiKey": "Paste API key (starts with sk-)",
|
|
111
115
|
"llmModel": "e.g. gpt-4o-mini",
|
|
112
116
|
"llmSystemPrompt": "Optional. Leave empty for default.",
|
|
113
|
-
"
|
|
114
|
-
"aiEducation": "Example: Do not notify me between 23:00 and 07:00. The office shutter may remain open at night."
|
|
117
|
+
"aiEducation": "Example: Notify my most recent chat if a window stays open for 30 minutes. Do not notify me between 23:00 and 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
|
Este nodo escucha **todos los telegramas KNX** del gateway KNX Ultimate seleccionado, genera estadísticas de tráfico, detecta anomalías y puede consultar opcionalmente un LLM.
|
|
3
3
|
|
|
4
|
-
El editor utiliza
|
|
4
|
+
El editor utiliza dos pestañas horizontales: **Asistente IA** contiene configuración, conocimiento/contexto y límites del proveedor; **Conversaciones y hogar** contiene canales de chat, hogar proactivo y memoria limitada.
|
|
5
5
|
|
|
6
6
|
## Salidas
|
|
7
7
|
1. **Resumen/Estadísticas** (`msg.payload` JSON)
|
|
@@ -21,6 +21,12 @@ Envía `msg.topic`:
|
|
|
21
21
|
|
|
22
22
|
Para `ask`, envía la pregunta en `msg.prompt` (recomendado), `msg.payload` (string), o los campos comunes de Telegram `msg.payload.content` / `msg.payload.text`.
|
|
23
23
|
|
|
24
|
+
Si el procesamiento tarda más de 1,2 segundos, la salida 3 emite inmediatamente el mensaje intermedio localizado «Estoy pensando…», con `msg.knxAi.type = "thinking"` y `msg.knxAi.transient = true`. El adaptador de chat lo envía al mismo usuario y la respuesta final llega normalmente en cuanto está lista. Este mensaje de progreso nunca se guarda en el contexto de conversación ni en la memoria aprendida.
|
|
25
|
+
|
|
26
|
+
Las solicitudes de Ollama y Bionic LM Studio usan automáticamente un tiempo de espera mínimo de 10 minutos; los proveedores cloud mantienen un mínimo de 2 minutos. No hay ningún campo de tiempo de espera que gestionar en el editor. Si también se alcanza el límite local, KNX AI indica que el modelo no terminó y recomienda volver a intentarlo o reducir el contexto del prompt.
|
|
27
|
+
|
|
28
|
+
El estado del nodo en el canvas está reservado deliberadamente para la última solicitud recibida y el mensaje localizado «Estoy pensando…» mientras se ejecuta el LLM. Los telegramas KNX, las actualizaciones del gateway, las tasas de tráfico, los mensajes ready y los resultados técnicos nunca lo sobrescriben; siguen disponibles mediante las salidas, los registros y los datos del Asistente.
|
|
29
|
+
|
|
24
30
|
Cada sesión Ask/chat conserva sus últimos 8 turnos y hasta 20 instrucciones explícitas a largo plazo, separadas por `msg.knxAi.sessionId`, `msg.sessionId` o el ID de chat Telegram detectado. Solicitudes como «Recuerda no usar el término unknown» se convierten en instrucciones persistentes. Todos los nodos KNX AI que usan el mismo almacenamiento comparten este contexto en tiempo real y lo recargan tras reiniciar Node-RED desde `knxultimatestorage/knxai/memory/knxai-chat-context.md`. El archivo se escribe de forma atómica y está limitado a 50 sesiones y 512 KB. Cuando el control KNX está habilitado, conecta la salida 3 al nodo emisor del chat y la salida 4 a un nodo KNX Ultimate en **modo universal**. Con la confirmación activa, la primera respuesta muestra GA, DPT y payload sin emitir escrituras; la misma sesión debe responder `CONFIRMAR` o `CANCELAR` en 5 minutos. Una solicitud nueva sustituye cualquier plan anterior. Cada comando confirmado contiene `msg.destination`, `msg.dpt`, `msg.payload` y `msg.event = "GroupValue_Write"`.
|
|
25
31
|
Para las escrituras DPT 1.xxx, los equivalentes seguros producidos por la IA `true`/`false`, `1`/`0` y `on`/`off` se normalizan a booleanos reales antes de la validación local y la salida.
|
|
26
32
|
|
|
@@ -31,7 +37,7 @@ Cuando el usuario solicita explícitamente un estado actual o actualizado, la IA
|
|
|
31
37
|
Mientras un plan está pendiente, la salida 3 contiene `msg.knxAi.confirmationRequest`. El objeto incluye `required`, `status`, `sessionId`, `expiresAt`, `commandCount` y dos elementos en `actions`. Usa `action.label` como texto del botón de Telegram, `action.callbackData` como callback y devuelve `action.message` a KNX AI para confirmar o cancelar sin escribir texto.
|
|
32
38
|
|
|
33
39
|
### Preajustes del adaptador de chat
|
|
34
|
-
La pestaña **Adaptadores de chat** carga sus mapeos seleccionables desde `resources/KNXAIChatAdapterMappings.js`. Al elegir un preajuste se
|
|
40
|
+
La pestaña **Adaptadores de chat** carga sus mapeos seleccionables desde `resources/KNXAIChatAdapterMappings.js`. Al elegir un preajuste se instalan internamente dos mapeos JavaScript síncronos predefinidos: uno antes de que KNX AI procese la entrada y otro antes de emitir por la salida 3. Los mapeos permanecen ocultos en el editor. Los errores de sintaxis y ejecución se capturan y notifican sin detener Node-RED.
|
|
35
41
|
|
|
36
42
|
El preajuste incluido **windkh/node-red-contrib-telegrambot** sigue el contrato receiver/sender del paquete. Conecta directamente un `telegram receiver` a KNX AI y la salida 3 a un `telegram sender`. Para los botones inline de confirmación, conecta también un `telegram event` configurado como `callback_query` a la misma entrada KNX AI. El mapeo de entrada extrae `msg.payload.content`, `msg.payload.chatId` y el idioma de Telegram. El mapeo de salida crea `msg.payload.chatId`, `type` y `content`, y añade `options.reply_markup` desde `msg.knxAi.confirmationRequest` cuando una escritura espera confirmación. El paquete Telegram sigue siendo una dependencia opcional separada.
|
|
37
43
|
|
|
@@ -42,31 +48,30 @@ Los paquetes de cámaras instalados pueden publicar en tiempo de ejecución un a
|
|
|
42
48
|
|
|
43
49
|
El usuario puede pedir una captura actual o preguntar al modelo de visión qué se ve. Los preajustes de Telegram y RedBot envían la imagen como foto nativa con pie. También se pueden crear notificaciones persistentes por movimiento, cruce de una línea inteligente o entrada en una zona de intrusión/merodeo, limitadas opcionalmente a personas detectadas y a una línea o zona concreta por nombre. Estas reglas se guardan en el mismo archivo `knxai-chat-context.md` y se restauran después de reiniciar Node-RED. Las suscripciones a eventos UniFi y las solicitudes de captura se realizan directamente a través del proveedor detectado; no interviene la salida 4 de KNX AI ni hace falta cableado intermedio en el flujo.
|
|
44
50
|
|
|
45
|
-
|
|
46
|
-
|
|
51
|
+
### Anuncios con TTS Ultimate
|
|
52
|
+
Cuando está instalado el paquete opcional `node-red-contrib-tts-ultimate`, aparece entre los adaptadores detectados automáticamente. El selector muestra todos los nodos `ttsultimate` de todos los flows del proyecto, con el flow, el nombre del nodo y el reproductor configurado. Elige el nodo que gestionará los anuncios del chat y despliega el flow.
|
|
47
53
|
|
|
48
|
-
|
|
54
|
+
Solo una solicitud explícita en el mensaje de chat actual puede crear un anuncio. KNX AI envía el texto exacto directamente al nodo elegido como `msg.payload`, con `msg.topic = "knx_ai_announcement"`; no hace falta cableado intermedio en el flow. TTS Ultimate gestiona después el reproductor Sonos configurado, la voz, el volumen, el aviso inicial y la cola. El contexto persistente, la Educación IA, el contenido de las cámaras y los eventos inferidos nunca activan la voz por sí solos.
|
|
49
55
|
|
|
50
|
-
|
|
56
|
+
### Resumen del contexto del chat
|
|
57
|
+
El editor del nodo muestra una tarjeta compacta con las fuentes disponibles para el chat: tráfico KNX actual, semántica ETS y proyecto Node-RED, memoria de sesión y del hogar, Educación IA, cámaras detectadas y documentación relevante. También enumera `knxai-chat-context.md`, `knxai-home-memory.md` y `knxai-config-<id-nodo>.json`, junto con la raíz absoluta del archivo de telegramas KNX, la carpeta específica del nodo y el patrón diario `YYYY-MM-DD.jsonl`. Las rutas se resuelven en tiempo de ejecución desde el directorio de datos que usa realmente la pasarela configurada.
|
|
51
58
|
|
|
52
|
-
##
|
|
53
|
-
|
|
59
|
+
## Inteligencia doméstica proactiva guiada por Educación y memoria limitada
|
|
60
|
+
A partir de la jerarquía ETS, nombres, roles y DPT, el nodo crea un modelo semántico determinista. No existe un interruptor separado ni ajustes proactivos avanzados. Una notificación solo se evalúa si el LLM está activo y **Educación IA** la solicita explícitamente. Educación es la única política para condiciones, duración, horas silenciosas y repetición. Sin una regla explícita, o si el LLM no puede evaluarla, no se envía ningún mensaje.
|
|
61
|
+
|
|
62
|
+
La última sesión de chat se recuerda como propietario y recibe los mensajes espontáneos. La salida 3 emite `msg.knxAi.type = "proactive_notification"` y `msg.inputMessage` conserva la sesión para el adaptador de chat. Un límite estricto de tres notificaciones proactivas por hora evita inundar el chat. La salida 4 nunca se usa de forma proactiva y KNX no se modifica de manera autónoma.
|
|
54
63
|
|
|
55
|
-
|
|
56
|
-
|---|---|---|
|
|
57
|
-
| **Activar notificaciones proactivas del hogar** (`proactiveEnabled`) | activado | El nodo evalúa estados abiertos fiables de persianas, ventanas y puertas. |
|
|
58
|
-
| **Destinatario principal / ID de chat** (`proactiveRecipient`) | `123456789` | Los mensajes espontáneos van a este chat; déjalo vacío para recordar la última sesión Ask. |
|
|
59
|
-
| **Avisar después de abierta** (`proactiveOpenMinutes`) | `120` | Se evalúa una posible notificación después de dos horas. |
|
|
60
|
-
| **Inicio / fin de horas silenciosas** | `23:00` / `07:00` | No se emiten mensajes proactivos durante la noche. |
|
|
61
|
-
| **Tiempo de espera de repetición** (`proactiveCooldownMinutes`) | `360` | El mismo objeto no vuelve a avisar durante seis horas. |
|
|
64
|
+
La referencia aprendida compartida se carga al arrancar desde `<userDir>/knxai/memory/knxai-home-memory.md`, se reescribe atómicamente cada 15 minutos y siempre queda estrictamente limitada a 5 MB. Conserva como máximo 120 observaciones importantes, 80 hábitos agregados, 80 notificaciones y 300 objetos ETS semánticos, nunca un flujo ilimitado de telegramas raw. Los elementos antiguos y de menor prioridad se eliminan primero. **Educación IA** está limitada a 16.000 caracteres y siempre procede de la configuración del nodo: la IA puede leerla como instrucción autoritativa, pero no modificarla ni sobrescribirla. Si existe Educación pero el LLM no puede evaluarla, la notificación candidata se suprime en lugar de arriesgarse a contradecirla.
|
|
62
65
|
|
|
63
|
-
Ejemplo
|
|
66
|
+
## Ejemplo práctico de configuración
|
|
67
|
+
Escribe toda la política de notificación en **Educación IA** (`aiEducation`):
|
|
64
68
|
|
|
65
69
|
```text
|
|
66
70
|
Llámame Alex y responde en el mismo idioma que uso.
|
|
67
71
|
Responde brevemente, salvo que pida detalles técnicos.
|
|
72
|
+
Avisa a mi último chat si una persiana, ventana o puerta sigue abierta al menos 120 minutos.
|
|
73
|
+
No me avises entre las 23:00 y las 07:00 ni repitas la misma alerta antes de seis horas.
|
|
68
74
|
La persiana del despacho puede permanecer abierta durante el día: no me avises.
|
|
69
|
-
Avísame si otra persiana, ventana o puerta permanece abierta demasiado tiempo.
|
|
70
75
|
Si «luz del salón» es ambiguo, pregúntame a qué luz me refiero.
|
|
71
76
|
Nunca afirmes que un actuador cambió hasta que lo confirme un objeto de estado KNX.
|
|
72
77
|
```
|
|
@@ -93,46 +98,20 @@ Aquí tienes todos los campos tal como se muestran en el editor de KNX AI.
|
|
|
93
98
|
- **Topic**: topic base usado en las salidas del nodo.
|
|
94
99
|
- Botón **Open KNX AI Web**: abre el dashboard web (`/knxUltimateAI/sidebar/page`).
|
|
95
100
|
|
|
96
|
-
KNX AI escucha automáticamente los telegramas `GroupValue_Write`, `GroupValue_Response` y `GroupValue_Read`. El análisis de patrones y anomalías siempre se inicializa con los valores predeterminados internos, por lo que no es necesario configurar los eventos del bus ni la detección.
|
|
97
|
-
|
|
98
|
-
### Analysis
|
|
99
|
-
- **Analysis window (seconds)**: ventana principal para resumen/rate.
|
|
100
|
-
- **History window (seconds)**: ventana de retención del historial interno.
|
|
101
|
-
- **Archivar tambien en disco los telegramas capturados**: guarda los telegramas tambien en `knxultimatestorage/knxai/history/<node-id>/YYYY-MM-DD.jsonl`, ademas de la RAM.
|
|
102
|
-
- **Retencion del archivo en disco (dias)**: numero de dias que se conservan los archivos antes de borrarse automaticamente.
|
|
103
|
-
- **Max stored events**: número máximo de telegramas en memoria.
|
|
104
|
-
- **Auto emit summary (seconds, 0=off)**: intervalo periódico de resumen.
|
|
105
|
-
- **Top list size**: cantidad de group addresses/fuentes en el top.
|
|
106
|
-
|
|
107
101
|
### Asistente IA
|
|
108
102
|
- **Enable LLM assistant**: habilita funciones Ask/chat.
|
|
109
|
-
- **Provider**: backend LLM (OpenAI-compatible
|
|
103
|
+
- **Provider**: backend LLM (OpenAI-compatible, Anthropic, Ollama o Bionic LM Studio).
|
|
110
104
|
- **Endpoint URL**: URL endpoint chat/completions.
|
|
111
|
-
- **API key**: clave API (no requerida con Ollama local).
|
|
105
|
+
- **API key**: clave API (no requerida con Ollama local; opcional para Bionic LM Studio salvo que la autenticación del servidor esté activada).
|
|
112
106
|
- **Model**: ID/nombre de modelo.
|
|
113
107
|
- **Compatibilidad del modelo de chat**: el modelo seleccionado debe admitir el endpoint Chat Completions configurado. Los modelos antiguos disponibles solo mediante completions, como `gpt-3.5-turbo-instruct`, se excluyen al actualizar la lista. Si el proveedor rechaza un valor personalizado de temperatura o el parámetro de límite de tokens, KNX AI vuelve a intentarlo eliminando o sustituyendo únicamente el campo incompatible.
|
|
114
108
|
- **Permitir que la IA lea estados KNX y controle actuadores**: habilita la salida 4 y está desactivado por defecto. Los objetos exactos del catálogo ETS se pueden leer; solo se aceptan escrituras hacia objetos clasificados como `command`. Las operaciones desconocidas, con DPT distinto, inválidas o excesivas, y las escrituras hacia objetos de estado o neutrales, se rechazan localmente.
|
|
115
109
|
- **Pedir confirmación antes de enviar comandos KNX**: activado por defecto. Muestra primero los cambios validados y no emite comandos hasta que la misma sesión de chat los confirme. Cuando hay comandos pendientes, la respuesta añade siempre las instrucciones exactas para confirmar o cancelar en el idioma de la solicitud actual. Los comandos se validan de nuevo justo antes de la salida.
|
|
116
|
-
- **Preajuste del adaptador**: usa **Sin adaptador** por defecto.
|
|
117
|
-
- **
|
|
118
|
-
-
|
|
119
|
-
- **Activar notificaciones proactivas del hogar**: detector opcional de estados abiertos de persiana/ventana/puerta reconocidos de forma fiable; nunca escribe de manera autónoma en KNX.
|
|
120
|
-
- **Destinatario principal / ID de chat**: destino opcional de mensajes espontáneos; de lo contrario se recuerda la última sesión Ask.
|
|
121
|
-
- **Avisar después de abierta (minutos)**: umbral de duración antes de considerar una notificación proactiva; 120 minutos por defecto.
|
|
122
|
-
- **Inicio / fin de horas silenciosas**: intervalo diario en el que se suprimen los mensajes proactivos.
|
|
123
|
-
- **Educación de la IA**: instrucciones vinculantes gestionadas solo por el usuario, leídas por la IA y nunca modificadas.
|
|
124
|
-
- **Tiempo de espera de repetición (minutos)**: intervalo mínimo antes de que el mismo objeto pueda volver a avisar; 360 minutos por defecto.
|
|
125
|
-
- Si el archivo en disco esta activo, **Ask** lo usa por defecto: respeta fechas/rangos explicitos y, si no los indicas, busca en las ultimas 24 horas mas los eventos actuales en RAM.
|
|
126
|
-
- **Incluir inventario del proyecto Node-RED**: incluye en el prompt el inventario de todo el proyecto Node-RED, con nodos KNX y otros nodos utiles como function/change/inject/template cuando contienen logica KNX o direcciones de grupo.
|
|
127
|
-
- Los fragmentos pertinentes de la ayuda, README y ejemplos se incluyen siempre de forma automática.
|
|
128
|
-
- **Docs language**: idioma preferido para los fragmentos de documentación incluidos automáticamente.
|
|
110
|
+
- **Preajuste del adaptador**: usa **Sin adaptador** por defecto. La selección carga el par predefinido de mapeos de entrada y salida; ambos permanecen ocultos en el editor.
|
|
111
|
+
- **Educación de la IA**: instrucciones vinculantes gestionadas solo por el usuario, leídas por la IA y nunca modificadas. Es el único lugar donde solicitar notificaciones proactivas y definir sus condiciones, duración, horas silenciosas y repetición.
|
|
112
|
+
- Los fragmentos pertinentes de la ayuda, README y ejemplos se incluyen siempre de forma automática; el idioma se detecta a partir de la solicitud del usuario, con alternativas automáticas entre todos los idiomas compatibles.
|
|
129
113
|
- Botón **Refresh**: consulta el provider y carga los modelos disponibles. El icono gira durante la carga; una finalización correcta no muestra ningún mensaje.
|
|
130
114
|
|
|
131
|
-
### Advanced
|
|
132
|
-
- **Analysis window (seconds)**: ventana principal para resumen/rate.
|
|
133
|
-
- **Max stored events**: número máximo de telegramas en memoria.
|
|
134
|
-
- **Top list size**: cantidad de group addresses/fuentes en el top.
|
|
135
|
-
|
|
136
115
|
### Configuración rápida de Ollama (local)
|
|
137
116
|
- Selecciona **Provider = Ollama**.
|
|
138
117
|
- Endpoint por defecto: `http://localhost:11434/api/chat`.
|
|
@@ -143,6 +122,13 @@ KNX AI escucha automáticamente los telegramas `GroupValue_Write`, `GroupValue_R
|
|
|
143
122
|
- Si la instalación falla con error de conexión, verifica que Ollama esté ejecutándose (app de escritorio o `ollama serve`).
|
|
144
123
|
- Si Node-RED se ejecuta en Docker, usa `host.docker.internal` en lugar de `localhost` en el endpoint.
|
|
145
124
|
|
|
125
|
+
### Configuración rápida de Bionic LM Studio (local)
|
|
126
|
+
- Selecciona **Provider = Bionic LM Studio**.
|
|
127
|
+
- Inicia el servidor API de LM Studio desde la página **Developer** o con `lms server start`.
|
|
128
|
+
- Endpoint por defecto: `http://localhost:1234/v1/chat/completions`.
|
|
129
|
+
- Pulsa **Refresh** para cargar todos los modelos expuestos por `/v1/models`; si no hay un modelo configurado se selecciona el primero.
|
|
130
|
+
- La clave API es opcional salvo que la autenticación esté activada en los ajustes del servidor LM Studio. En Docker, sustituye `localhost` por `host.docker.internal`.
|
|
131
|
+
|
|
146
132
|
## Nota de seguridad
|
|
147
133
|
Si el LLM está habilitado, el contexto de tráfico KNX puede enviarse al endpoint configurado. Para privacidad on-premise, usa proveedores locales. Un comando emitido por la salida 4 superó la validación local y fue enviado al flow, pero no confirma que el actuador lo ejecutara. Usa una GA de estado KNX para confirmarlo.
|
|
148
134
|
</script>
|
|
@@ -5,40 +5,17 @@
|
|
|
5
5
|
"groupAssistant": "Asistente IA",
|
|
6
6
|
"groupChatHome": "Conversaciones y hogar",
|
|
7
7
|
"detectedAdapters": "Adaptadores detectados automáticamente",
|
|
8
|
-
"
|
|
8
|
+
"chatContextOverview": "Resumen del contexto del chat",
|
|
9
9
|
"quickSetup": "Configurar el asistente",
|
|
10
|
-
"capture": "Telegramas del bus",
|
|
11
|
-
"storage": "Historial y resúmenes KNX",
|
|
12
|
-
"detection": "Anomalías y patrones",
|
|
13
10
|
"llmConnection": "Conexion del Asistente IA",
|
|
14
|
-
"llmContext": "Conocimiento y contexto IA",
|
|
15
11
|
"chatAdapter": "Canales de chat",
|
|
16
|
-
"homeIntelligence": "
|
|
17
|
-
"homeIntelligenceAdvanced": "Ajustes proactivos avanzados",
|
|
12
|
+
"homeIntelligence": "Educación IA y memoria",
|
|
18
13
|
"advanced": "Proveedor y límites"
|
|
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": "Archivar tambien en disco los telegramas capturados",
|
|
30
|
-
"historyStoreRetentionDays": "Retencion del archivo en disco (dias)",
|
|
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": "Incluir inventario del proyecto Node-RED",
|
|
50
26
|
"llmAllowKnxCommands": "Permitir que la IA lea estados KNX y controle actuadores",
|
|
51
27
|
"llmRequireCommandConfirmation": "Pedir confirmación antes de enviar comandos KNX",
|
|
52
28
|
"chatAdapterPreset": "Preajuste del adaptador",
|
|
53
29
|
"chatInputCode": "Mapeo de entrada (chat → KNX AI)",
|
|
54
30
|
"chatOutputCode": "Mapeo de salida (KNX AI → chat)",
|
|
55
|
-
"
|
|
56
|
-
"proactiveRecipient": "Destinatario principal / ID de chat",
|
|
57
|
-
"proactiveOpenMinutes": "Avisar tras permanecer abierto (minutos)",
|
|
58
|
-
"proactiveCooldownMinutes": "Espera antes de repetir (minutos)",
|
|
59
|
-
"proactiveQuietStart": "Inicio de horas silenciosas",
|
|
60
|
-
"proactiveQuietEnd": "Fin de horas silenciosas",
|
|
31
|
+
"ttsUltimateNodeId": "Nodo TTS Ultimate para anuncios",
|
|
61
32
|
"aiEducation": "Educación IA (gestionada por el usuario)",
|
|
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": "Resumen/Estadísticas",
|
|
@@ -72,13 +42,23 @@
|
|
|
72
42
|
"llmProvider": {
|
|
73
43
|
"openai_compat": "OpenAI-compatible (chat/completions)",
|
|
74
44
|
"anthropic": "Anthropic (Claude)",
|
|
75
|
-
"ollama": "Ollama (local
|
|
45
|
+
"ollama": "Ollama (local)",
|
|
46
|
+
"lmstudio": "Bionic LM Studio"
|
|
76
47
|
},
|
|
77
48
|
"chatAdapter": {
|
|
78
49
|
"none": "Sin adaptador"
|
|
50
|
+
},
|
|
51
|
+
"ttsUltimate": {
|
|
52
|
+
"select": "Seleccionar un nodo TTS Ultimate",
|
|
53
|
+
"none": "No se encontró ningún nodo TTS Ultimate"
|
|
79
54
|
}
|
|
80
55
|
},
|
|
81
56
|
"messages": {
|
|
57
|
+
"lmStudioContextAvailable": "Contexto máximo del modelo",
|
|
58
|
+
"lmStudioContextLoading": "Cargando el modelo con su contexto máximo",
|
|
59
|
+
"lmStudioContextConfigured": "Contexto máximo del modelo configurado",
|
|
60
|
+
"lmStudioContextFailed": "No se pudo configurar el contexto del modelo",
|
|
61
|
+
"lmStudioContextCurrentlyLoaded": "cargado actualmente",
|
|
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": "Detectado",
|
|
93
73
|
"detectedAdapterControllers": "Controladores",
|
|
94
74
|
"detectedAdapterCameras": "Cámaras",
|
|
75
|
+
"detectedAdapterNodes": "Nodos",
|
|
76
|
+
"ttsUltimateUnknownFlow": "Flow sin nombre",
|
|
77
|
+
"ttsUltimateUnavailable": "Nodo TTS Ultimate no disponible",
|
|
78
|
+
"ttsUltimateHint": "Las solicitudes explícitas de anuncio del chat se envían directamente al nodo elegido; no hace falta cableado en el flow.",
|
|
79
|
+
"chatContextLoading": "Cargando el resumen del contexto del chat…",
|
|
80
|
+
"chatContextUnavailable": "El resumen del contexto del chat no está disponible temporalmente.",
|
|
81
|
+
"chatContextIntro": "El chat recibe automáticamente estas fuentes. Las rutas siguientes son las que usa realmente esta instalación de Node-RED.",
|
|
82
|
+
"chatContextSourcesTitle": "Fuentes incluidas",
|
|
83
|
+
"chatContextFilesTitle": "Archivos de contexto persistentes",
|
|
84
|
+
"chatContextDirectoriesTitle": "Archivo de telegramas KNX",
|
|
85
|
+
"chatContextSourceKnxTraffic": "Resumen KNX actual, anomalías, topología y telegramas seleccionados.",
|
|
86
|
+
"chatContextSourceEtsProject": "Semántica ETS e inventario completo del proyecto Node-RED.",
|
|
87
|
+
"chatContextSourceMemoryEducation": "Contexto de sesión, Educación IA y memoria doméstica limitada.",
|
|
88
|
+
"chatContextSourceCamerasDocs": "Cámaras detectadas y fragmentos relevantes de la ayuda, README y ejemplos.",
|
|
89
|
+
"chatContextSourceTtsUltimate": "Nodo TTS Ultimate seleccionado para los anuncios.",
|
|
90
|
+
"chatContextSourceBadge": "Fuente",
|
|
91
|
+
"chatContextFileChatContext": "Turnos persistentes, instrucciones y reglas de notificación de cámaras.",
|
|
92
|
+
"chatContextFileHomeMemory": "Educación IA y memoria doméstica aprendida y limitada.",
|
|
93
|
+
"chatContextFileAssistantConfig": "Configuración persistente del Asistente web y áreas semánticas de este nodo.",
|
|
94
|
+
"chatContextFileBadge": "Archivo",
|
|
95
|
+
"chatContextDirectoryRoot": "Raíz del archivo de telegramas",
|
|
96
|
+
"chatContextDirectoryNode": "Archivo de telegramas de este nodo",
|
|
97
|
+
"chatContextDirectoryBadge": "KNX",
|
|
98
|
+
"chatContextTelegramPattern": "Archivos diarios",
|
|
95
99
|
"chatAdapterIntro": "Elige un preajuste para insertar su código de mapeo de entrada y salida. La lista se carga desde el archivo de adaptadores de chat incluido; el código generado sigue siendo editable.",
|
|
96
100
|
"chatAdapterCodeHelp": "Los mapeos se ejecutan de forma síncrona. Devuelve msg para continuar o ningún valor para descartarlo. Los errores se capturan y notifican sin detener Node-RED.",
|
|
97
|
-
"homeIntelligenceIntro": "El nodo crea un modelo ETS semántico multilingüe
|
|
98
|
-
"aiEducationHelp": "Solo el usuario puede editar esta sección. La IA la lee como una instrucción autoritativa
|
|
101
|
+
"homeIntelligenceIntro": "El nodo crea un modelo ETS semántico multilingüe. Las notificaciones proactivas solo se consideran cuando la Educación IA las solicita explícitamente; nunca envía por sí solo un comando KNX.",
|
|
102
|
+
"aiEducationHelp": "Solo el usuario puede editar esta sección. Úsala para definir cualquier regla de notificación proactiva, incluidas las condiciones, la duración, las horas silenciosas y la repetición. La IA la lee como una instrucción autoritativa y la memoria aprendida nunca puede sobrescribirla. Máximo 16.000 caracteres."
|
|
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
|
-
"
|
|
106
|
-
"aiEducation": "Ejemplo: no avisarme entre las 23:00 y las 07:00. La persiana del despacho puede quedar abierta de noche."
|
|
109
|
+
"aiEducation": "Ejemplo: avisa a mi último chat si una ventana sigue abierta 30 minutos. No me avises entre las 23:00 y las 07:00."
|
|
107
110
|
},
|
|
108
111
|
"sidebar": {
|
|
109
112
|
"ui": {
|