node-red-contrib-knx-ultimate 6.2.0 → 6.2.1

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.
@@ -2,14 +2,19 @@
2
2
  "knxUltimateAI": {
3
3
  "title": "KNX AI (Traffic Analyzer)",
4
4
  "sections": {
5
- "quickSetup": "Schnelleinrichtung",
6
- "capture": "Capture",
7
- "storage": "Speicher & Zusammenfassung",
8
- "detection": "Erkennung & Warnungen",
5
+ "groupAssistant": "KI-Assistent",
6
+ "groupChatHome": "Gespräche & Zuhause",
7
+ "groupKnxAnalysis": "KNX-Verkehrsanalyse",
8
+ "quickSetup": "Assistent einrichten",
9
+ "capture": "Bus-Telegrammeingang",
10
+ "storage": "KNX-Verlauf & Zusammenfassungen",
11
+ "detection": "Anomalien & Muster",
9
12
  "llmConnection": "KI-Assistent-Verbindung",
10
- "llmContext": "KI-Assistent-Kontext",
11
- "chatAdapter": "Chat-Adapter",
12
- "advanced": "Erweiterte KI"
13
+ "llmContext": "KI-Wissen & Kontext",
14
+ "chatAdapter": "Chat-Kanäle",
15
+ "homeIntelligence": "Proaktives Zuhause & Gedächtnis",
16
+ "homeIntelligenceAdvanced": "Erweiterte proaktive Einstellungen",
17
+ "advanced": "Anbieter & Grenzen"
13
18
  },
14
19
  "properties": {
15
20
  "server": "Gateway",
@@ -46,6 +51,14 @@
46
51
  "chatAdapterPreset": "Adapter-Vorlage",
47
52
  "chatInputCode": "Eingangszuordnung (Chat → KNX AI)",
48
53
  "chatOutputCode": "Ausgangszuordnung (KNX AI → Chat)",
54
+ "proactiveEnabled": "Proaktive Hausbenachrichtigungen aktivieren",
55
+ "proactiveRecipient": "Hauptempfänger / Chat-ID",
56
+ "proactiveOpenMinutes": "Nach Offenstand benachrichtigen (Minuten)",
57
+ "proactiveCooldownMinutes": "Wiederholsperre (Minuten)",
58
+ "proactiveQuietStart": "Beginn der Ruhezeit",
59
+ "proactiveQuietEnd": "Ende der Ruhezeit",
60
+ "homeMemoryMaxKb": "Maximale Hausgedächtnisdatei (KB)",
61
+ "aiEducation": "KI-Erziehung (vom Benutzer verwaltet)",
49
62
  "llmIncludeDocsSnippets": "Include documentation snippets (help/README/examples)",
50
63
  "llmDocsLanguage": "Docs language"
51
64
  },
@@ -69,7 +82,9 @@
69
82
  "llmBaseUrl": "https://api.openai.com/v1/chat/completions (or your compatible endpoint)",
70
83
  "llmApiKey": "Paste API key (starts with sk-)",
71
84
  "llmModel": "e.g. gpt-4o-mini",
72
- "llmSystemPrompt": "Optional. Leave empty for default."
85
+ "llmSystemPrompt": "Optional. Leave empty for default.",
86
+ "proactiveRecipient": "Optional: Telegram-Chat-ID; andernfalls wird die letzte Chat-Sitzung gespeichert",
87
+ "aiEducation": "Beispiel: Zwischen 23:00 und 07:00 nicht benachrichtigen. Der Rollladen im Büro darf nachts offen bleiben."
73
88
  },
74
89
  "messages": {
75
90
  "ollamaNotSupported": "Ollama local mode: API key not required. Default endpoint is http://localhost:11434/api/chat.",
@@ -80,7 +95,10 @@
80
95
  "ollamaInstallSteps": "1) Open the model library and copy the model name (for example llama3.1). 2) Put the name in the Model field and click Install it.",
81
96
  "ollamaStartedAuto": "Ollama server started automatically.",
82
97
  "chatAdapterIntro": "Wählen Sie eine Vorlage, um den Code für Ein- und Ausgang einzufügen. Die Liste wird aus der mitgelieferten Chat-Adapter-Datei geladen; der erzeugte Code bleibt bearbeitbar.",
83
- "chatAdapterCodeHelp": "Zuordnungen laufen synchron. Geben Sie msg zurück, um fortzufahren, oder keinen Wert, um die Nachricht zu verwerfen. Fehler werden abgefangen und gemeldet, ohne Node-RED anzuhalten."
98
+ "chatAdapterCodeHelp": "Zuordnungen laufen synchron. Geben Sie msg zurück, um fortzufahren, oder keinen Wert, um die Nachricht zu verwerfen. Fehler werden abgefangen und gemeldet, ohne Node-RED anzuhalten.",
99
+ "homeIntelligenceIntro": "Der Node erstellt ein mehrsprachiges semantisches ETS-Modell und kann den Chat benachrichtigen, wenn ein zuverlässig erkannter Rollladen, ein Fenster oder eine Tür offen bleibt. Er sendet niemals selbstständig einen KNX-Befehl.",
100
+ "aiEducationHelp": "Nur der Benutzer kann diesen Abschnitt bearbeiten. Die KI liest ihn als verbindliche Vorgabe; gelernte Erinnerungen können ihn niemals überschreiben. Maximal 16.000 Zeichen.",
101
+ "homeMemoryLimitHelp": "Das Markdown-Gedächtnis wird alle 15 Minuten atomar neu geschrieben und bleibt stets auf 64 bis 1.024 KB begrenzt. Alte Beobachtungen werden vor Gewohnheiten und semantischen Objekten entfernt."
84
102
  },
85
103
  "sidebar": {
86
104
  "ui": {
@@ -1,7 +1,7 @@
1
1
  <script type="text/markdown" data-help-name="knxUltimateAI">
2
2
  This node listens to **all KNX telegrams** from the selected KNX Ultimate gateway, builds traffic statistics, detects anomalies, and can optionally query an LLM.
3
3
 
4
- The editor sections use the same left-hand vertical tabs as the Matter nodes. **Quick setup** contains only the common AI choices (enable, provider, credentials, model, KNX state reads/actuator control and confirmation); technical settings are grouped by topic in the other tabs.
4
+ The editor uses three main accordion sections: **AI assistant** contains setup, knowledge/context and provider limits; **Conversations & home** contains chat channels, proactive home and bounded memory; **KNX traffic analysis** contains bus telegram input, history/summaries and anomalies/patterns. Opening a main section shows all of its related options together. Saved field IDs and values remain unchanged.
5
5
 
6
6
  ## Outputs
7
7
  1. **Summary/Stats** (`msg.payload` JSON)
@@ -14,7 +14,7 @@ Every message emitted by outputs 3 and 4 also contains a clone of the original i
14
14
  ## Commands (input)
15
15
  Send `msg.topic`:
16
16
  - `summary` (or empty): emit summary immediately
17
- - `reset`: clear internal history/counters
17
+ - `reset`: clear internal history, counters and learned home memory; AI Education remains unchanged
18
18
  - `ask`: send a question to the configured LLM
19
19
  - `confirm` / `cancel`: confirm or cancel pending KNX commands without calling the LLM
20
20
  - `clear_chat`: clear the conversation memory for the current session
@@ -35,6 +35,44 @@ The **Chat adapters** tab loads its selectable mappings from `resources/KNXAICha
35
35
 
36
36
  The included **windkh/node-red-contrib-telegrambot** preset follows the package's receiver/sender contract. Connect a `telegram receiver` directly to KNX AI, output 3 directly to a `telegram sender`, and—when inline confirmation buttons are required—connect a `telegram event` configured for `callback_query` to the same KNX AI input. The input mapping extracts `msg.payload.content`, `msg.payload.chatId`, and the Telegram language. The output mapping creates the required `msg.payload.chatId`, `type`, and `content`, adding `options.reply_markup` from `msg.knxAi.confirmationRequest` when writes await confirmation. The Telegram package remains a separate optional dependency.
37
37
 
38
+ ## Proactive home intelligence and bounded memory
39
+ The **Proactive home & memory** subsection inside **Conversations & home** enables opt-in proactive notifications. From ETS hierarchy, names, roles and DPTs, the node builds a deterministic semantic model for covers, windows, doors, lights, temperature, climate, occupancy and alarms using Italian, English, German, French, Spanish and Chinese terms. The first proactive detector watches only reliably recognized non-command cover/window/door states. After the configured open duration and outside quiet hours, output 3 emits a localized message with `msg.knxAi.type = "proactive_notification"`. It never emits output 4 or changes KNX autonomously; a subsequent user request still uses the normal validation and confirmation workflow.
40
+
41
+ The most recent chat session is remembered as the owner, or **Primary recipient / chat ID** can set it explicitly. A synthetic `msg.inputMessage` preserves this recipient so the Telegram adapter can send an unsolicited notification. Cooldown and a maximum of three proactive messages per hour prevent flooding.
42
+
43
+ The learned reference is loaded at startup from `<userDir>/knxai/memory/knxai-home-memory-<node-id>.md`, rewritten atomically every 15 minutes and hard-capped to the configured 64–1,024 KB (256 KB by default). It stores at most 120 significant observations, 80 aggregate habits, 80 notifications and 300 semantic ETS objects—never a raw unlimited telegram stream. Older low-priority entries are removed first. **AI Education** is limited to 16,000 characters and always comes from the node configuration: the AI can read it as authoritative guidance but cannot modify or overwrite it. When Education is present but the LLM cannot evaluate it, the candidate notification is suppressed rather than risking a contradiction.
44
+
45
+ ## Practical configuration example
46
+ This example creates a concise assistant that notifies the owner about relevant openings but accepts that the office cover may stay open:
47
+
48
+ | Editor field | Example value | Result |
49
+ |---|---|---|
50
+ | **Enable proactive home notifications** (`proactiveEnabled`) | enabled | The node evaluates reliably recognized open cover/window/door states. |
51
+ | **Primary recipient / chat ID** (`proactiveRecipient`) | `123456789` | Unsolicited messages go to this chat. Leave it empty to remember the most recent Ask session. |
52
+ | **Notify after open** (`proactiveOpenMinutes`) | `120` | A candidate notification is considered after two hours. |
53
+ | **Quiet hours start / end** | `23:00` / `07:00` | No proactive message is emitted during the night. |
54
+ | **Repeat cooldown** (`proactiveCooldownMinutes`) | `360` | The same object cannot notify again for six hours. |
55
+ | **Maximum home-memory file** (`homeMemoryMaxKb`) | `256` | The per-node Markdown reference can never exceed 256 KB. |
56
+
57
+ Example for **AI Education** (`aiEducation`):
58
+
59
+ ```text
60
+ Call me Alex and answer in the same language I use.
61
+ Keep replies short unless I ask for technical details.
62
+ The office cover may remain open during the day: do not notify me about it.
63
+ Notify me when another cover, window, or door remains open unusually long.
64
+ When "living-room light" is ambiguous, ask which light I mean.
65
+ Never say that an actuator changed until a KNX status object confirms it.
66
+ ```
67
+
68
+ With these settings:
69
+
70
+ 1. If the living-room cover status remains open for 120 minutes outside quiet hours, output 3 can emit a localized `proactive_notification`.
71
+ 2. If the office cover remains open, the LLM reads Education and suppresses that candidate notification.
72
+ 3. If Alex later asks to close the living-room cover, KNX AI prepares the exact ETS command and still follows normal validation and confirmation before output 4.
73
+
74
+ Use descriptive ETS hierarchy/object names and correct status/command roles. Education can personalize decisions and wording, but it cannot authorize an invented group address, change a DPT, or bypass KNX validation.
75
+
38
76
  ## Quick workflow: KNX control
39
77
  1. Import the ETS CSV into the gateway and configure the LLM provider, model, and credentials.
40
78
  2. Enable **LLM assistant** and **KNX state reads and actuator control**; leave confirmation enabled.
@@ -90,6 +128,13 @@ All fields exposed in the KNX AI editor are listed below.
90
128
  - **Adapter preset**: Loads an input/output mapping pair from the packaged chat-adapter file. Selecting a preset intentionally replaces both mapping text boxes; they remain editable afterwards.
91
129
  - **Input mapping (chat → KNX AI)**: Synchronous JavaScript applied before input command processing.
92
130
  - **Output mapping (KNX AI → chat)**: Synchronous JavaScript applied only to messages on output 3.
131
+ - **Enable proactive home notifications**: Opt-in detector for reliably recognized open cover/window/door states; it never writes autonomously to KNX.
132
+ - **Primary recipient / chat ID**: Optional destination for unsolicited chat messages; otherwise the most recent Ask session is remembered.
133
+ - **Notify after open (minutes)**: Open-duration threshold before a proactive notification can be considered.
134
+ - **Quiet hours start / end**: Daily interval in which proactive messages are suppressed.
135
+ - **AI Education**: User-only, authoritative guidance read by the AI and never modified by it.
136
+ - **Repeat cooldown (minutes)**: Minimum interval before the same object may notify again.
137
+ - **Maximum home-memory file (KB)**: Hard size limit from 64 to 1,024 KB; 256 KB by default.
93
138
  - If disk archive is enabled, **Ask** uses the archive by default: explicit dates/ranges are honored, otherwise the assistant searches the last 24 hours plus current RAM events.
94
139
  - **Include raw payload hex**: Include raw telegram hex in prompt.
95
140
  - **Include Node-RED project inventory**: Include the whole Node-RED project inventory in the prompt, including KNX nodes and other useful nodes such as function/change/inject/template when they contain KNX-related logic or group addresses.
@@ -2,14 +2,19 @@
2
2
  "knxUltimateAI": {
3
3
  "title": "KNX AI (Traffic Analyzer)",
4
4
  "sections": {
5
- "quickSetup": "Quick setup",
6
- "capture": "Capture",
7
- "storage": "Storage & Summary",
8
- "detection": "Detection & Alerts",
5
+ "groupAssistant": "AI assistant",
6
+ "groupChatHome": "Conversations & home",
7
+ "groupKnxAnalysis": "KNX traffic analysis",
8
+ "quickSetup": "Assistant setup",
9
+ "capture": "Bus telegram input",
10
+ "storage": "KNX history & summaries",
11
+ "detection": "Anomalies & patterns",
9
12
  "llmConnection": "AI Assistant Connection",
10
- "llmContext": "AI Assistant Context",
11
- "chatAdapter": "Chat adapters",
12
- "advanced": "Advanced AI"
13
+ "llmContext": "AI knowledge & context",
14
+ "chatAdapter": "Chat channels",
15
+ "homeIntelligence": "Proactive home & memory",
16
+ "homeIntelligenceAdvanced": "Advanced proactive settings",
17
+ "advanced": "Provider & limits"
13
18
  },
14
19
  "properties": {
15
20
  "server": "Gateway",
@@ -46,6 +51,14 @@
46
51
  "chatAdapterPreset": "Adapter preset",
47
52
  "chatInputCode": "Input mapping (chat → KNX AI)",
48
53
  "chatOutputCode": "Output mapping (KNX AI → chat)",
54
+ "proactiveEnabled": "Enable proactive home notifications",
55
+ "proactiveRecipient": "Primary recipient / chat ID",
56
+ "proactiveOpenMinutes": "Notify after open (minutes)",
57
+ "proactiveCooldownMinutes": "Repeat cooldown (minutes)",
58
+ "proactiveQuietStart": "Quiet hours start",
59
+ "proactiveQuietEnd": "Quiet hours end",
60
+ "homeMemoryMaxKb": "Maximum home-memory file (KB)",
61
+ "aiEducation": "AI Education (user managed)",
49
62
  "llmIncludeDocsSnippets": "Include documentation snippets (help/README/examples)",
50
63
  "llmDocsLanguage": "Docs language"
51
64
  },
@@ -82,13 +95,18 @@
82
95
  "ollamaInstallSteps": "1) Open the model library and copy the model name (for example llama3.1). 2) Put the name in the Model field and click Install it.",
83
96
  "ollamaStartedAuto": "Ollama server started automatically.",
84
97
  "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.",
85
- "chatAdapterCodeHelp": "Mappings run synchronously. Return msg to continue or return no value to discard it. Errors are caught and reported without stopping Node-RED."
98
+ "chatAdapterCodeHelp": "Mappings run synchronously. Return msg to continue or return no value to discard it. Errors are caught and reported without stopping Node-RED.",
99
+ "homeIntelligenceIntro": "The node builds a multilingual semantic ETS model and can notify the chat when a reliably recognized cover, window, or door remains open. It never sends a KNX command proactively.",
100
+ "aiEducationHelp": "Only the user can edit this section. The AI reads it as authoritative guidance, but learned-memory updates can never overwrite it. Maximum 16,000 characters.",
101
+ "homeMemoryLimitHelp": "The Markdown memory is rewritten atomically every 15 minutes and is always capped between 64 and 1,024 KB. Old observations are pruned before habits and semantic objects."
86
102
  },
87
103
  "placeholder": {
88
104
  "llmBaseUrl": "https://api.openai.com/v1/chat/completions (or your compatible endpoint)",
89
105
  "llmApiKey": "Paste API key (starts with sk-)",
90
106
  "llmModel": "e.g. gpt-4o-mini",
91
- "llmSystemPrompt": "Optional. Leave empty for default."
107
+ "llmSystemPrompt": "Optional. Leave empty for default.",
108
+ "proactiveRecipient": "Optional: Telegram chat ID; otherwise the most recent chat session is remembered",
109
+ "aiEducation": "Example: Do not notify me between 23:00 and 07:00. The office shutter may remain open at night."
92
110
  },
93
111
  "sidebar": {
94
112
  "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
- Las secciones del editor utilizan las mismas pestañas verticales a la izquierda que los nodos Matter. **Configuración rápida** contiene solo las opciones habituales de AI (activación, proveedor, credenciales, modelo, lectura de estados/control de actuadores KNX y confirmación); los parámetros técnicos se agrupan por tema en las demás pestañas.
4
+ El editor utiliza tres secciones principales en acordeón: **Asistente IA** contiene configuración, conocimiento/contexto y límites del proveedor; **Conversaciones y hogar** contiene canales de chat, hogar proactivo y memoria limitada; **Análisis del tráfico KNX** contiene telegramas del bus, historial/resúmenes y anomalías/patrones. Al abrir una sección principal se muestran juntas todas sus opciones. Los ID y valores guardados permanecen intactos.
5
5
 
6
6
  ## Salidas
7
7
  1. **Resumen/Estadísticas** (`msg.payload` JSON)
@@ -14,7 +14,7 @@ Cada mensaje emitido por las salidas 3 y 4 también contiene una copia del mensa
14
14
  ## Comandos (entrada)
15
15
  Envía `msg.topic`:
16
16
  - `summary` (o vacío): emite el resumen inmediatamente
17
- - `reset`: limpia historial y contadores internos
17
+ - `reset`: borra el historial, los contadores y la memoria del hogar aprendida; la Educación de la IA permanece sin cambios
18
18
  - `ask`: envía una pregunta al LLM configurado
19
19
  - `confirm` / `cancel`: confirma o cancela los comandos KNX pendientes sin volver a llamar al LLM
20
20
  - `clear_chat`: borra la memoria de conversación de la sesión actual
@@ -35,6 +35,40 @@ La pestaña **Adaptadores de chat** carga sus mapeos seleccionables desde `resou
35
35
 
36
36
  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
37
 
38
+ ## Inteligencia doméstica proactiva y memoria limitada
39
+ La subsección **Hogar proactivo y memoria** dentro de **Conversaciones y hogar** activa las notificaciones proactivas de forma opcional. A partir de la jerarquía ETS, nombres, roles y DPT, el nodo crea un modelo semántico determinista para persianas, ventanas, puertas, luces, temperatura, clima, presencia y alarmas usando términos italianos, ingleses, alemanes, franceses, españoles y chinos. El primer detector proactivo vigila únicamente estados que no sean de comando de persianas/ventanas/puertas reconocidos con suficiente fiabilidad. Tras el tiempo abierto configurado y fuera de las horas silenciosas, la salida 3 emite un mensaje localizado con `msg.knxAi.type = "proactive_notification"`. Nunca emite por la salida 4 ni modifica KNX de manera autónoma; una solicitud posterior del usuario sigue pasando por la validación y confirmación normales.
40
+
41
+ La última sesión de chat se recuerda como propietario, o **Destinatario principal / ID de chat** permite definirla explícitamente. Un `msg.inputMessage` sintético conserva el destinatario para que el adaptador de Telegram pueda enviar una notificación espontánea. El tiempo de espera y el máximo de tres notificaciones proactivas por hora evitan inundar el chat.
42
+
43
+ La referencia aprendida se carga al arrancar desde `<userDir>/knxai/memory/knxai-home-memory-<node-id>.md`, se reescribe atómicamente cada 15 minutos y queda estrictamente limitada entre 64 y 1.024 KB configurables (256 KB de forma predeterminada). 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.
44
+
45
+ ## Ejemplo práctico de configuración
46
+ Este ejemplo crea un asistente conciso que avisa sobre aperturas importantes, pero acepta que la persiana del despacho permanezca abierta:
47
+
48
+ | Campo del editor | Valor de ejemplo | Resultado |
49
+ |---|---|---|
50
+ | **Activar notificaciones proactivas del hogar** (`proactiveEnabled`) | activado | El nodo evalúa estados abiertos fiables de persianas, ventanas y puertas. |
51
+ | **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. |
52
+ | **Avisar después de abierta** (`proactiveOpenMinutes`) | `120` | Se evalúa una posible notificación después de dos horas. |
53
+ | **Inicio / fin de horas silenciosas** | `23:00` / `07:00` | No se emiten mensajes proactivos durante la noche. |
54
+ | **Tiempo de espera de repetición** (`proactiveCooldownMinutes`) | `360` | El mismo objeto no vuelve a avisar durante seis horas. |
55
+ | **Archivo máximo de memoria del hogar** (`homeMemoryMaxKb`) | `256` | La referencia Markdown de este nodo permanece por debajo de 256 KB. |
56
+
57
+ Ejemplo para **Educación IA** (`aiEducation`):
58
+
59
+ ```text
60
+ Llámame Alex y responde en el mismo idioma que uso.
61
+ Responde brevemente, salvo que pida detalles técnicos.
62
+ La persiana del despacho puede permanecer abierta durante el día: no me avises.
63
+ Avísame si otra persiana, ventana o puerta permanece abierta demasiado tiempo.
64
+ Si «luz del salón» es ambiguo, pregúntame a qué luz me refiero.
65
+ Nunca afirmes que un actuador cambió hasta que lo confirme un objeto de estado KNX.
66
+ ```
67
+
68
+ Con estos ajustes, la salida 3 puede emitir una `proactive_notification` localizada después de 120 minutos para la persiana del salón, mientras que Educación suprime el aviso de la persiana del despacho. Si Alex pide después cerrar la persiana del salón, KNX AI prepara el comando ETS exacto, pero mantiene la validación y confirmación normales antes de la salida 4.
69
+
70
+ Usa jerarquías y nombres de objetos ETS descriptivos, con roles de estado/comando correctos. Educación personaliza decisiones y texto, pero no puede inventar una dirección de grupo, cambiar un DPT ni evitar la validación KNX.
71
+
38
72
  ## Flujo rápido: control KNX
39
73
  1. Importa el CSV de ETS en el gateway y configura el proveedor, el modelo y las credenciales LLM.
40
74
  2. Activa **Asistente LLM** y **lectura de estados KNX y control de actuadores**; deja activada la confirmación.
@@ -90,6 +124,13 @@ Aquí tienes todos los campos tal como se muestran en el editor de KNX AI.
90
124
  - **Preajuste del adaptador**: carga una pareja de mapeos entrada/salida desde el archivo de adaptadores de chat incluido. La selección sustituye intencionadamente ambos cuadros de texto; el código sigue siendo editable.
91
125
  - **Mapeo de entrada (chat → KNX AI)**: JavaScript síncrono aplicado antes de procesar el comando de entrada.
92
126
  - **Mapeo de salida (KNX AI → chat)**: JavaScript síncrono aplicado solo a los mensajes de la salida 3.
127
+ - **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.
128
+ - **Destinatario principal / ID de chat**: destino opcional de mensajes espontáneos; de lo contrario se recuerda la última sesión Ask.
129
+ - **Avisar después de abierta (minutos)**: umbral de duración antes de considerar una notificación proactiva.
130
+ - **Inicio / fin de horas silenciosas**: intervalo diario en el que se suprimen los mensajes proactivos.
131
+ - **Educación de la IA**: instrucciones vinculantes gestionadas solo por el usuario, leídas por la IA y nunca modificadas.
132
+ - **Tiempo de espera de repetición (minutos)**: intervalo mínimo antes de que el mismo objeto pueda volver a avisar.
133
+ - **Archivo máximo de memoria del hogar (KB)**: límite estricto de 64 a 1.024 KB; 256 KB por defecto.
93
134
  - 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.
94
135
  - **Include raw payload hex**: incluye payload hex raw en el prompt.
95
136
  - **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.
@@ -2,14 +2,19 @@
2
2
  "knxUltimateAI": {
3
3
  "title": "KNX AI (Traffic Analyzer)",
4
4
  "sections": {
5
- "quickSetup": "Configuracion rapida",
6
- "capture": "Capture",
7
- "storage": "Historial y Resumen",
8
- "detection": "Deteccion y Alertas",
5
+ "groupAssistant": "Asistente IA",
6
+ "groupChatHome": "Conversaciones y hogar",
7
+ "groupKnxAnalysis": "Análisis del tráfico KNX",
8
+ "quickSetup": "Configurar el asistente",
9
+ "capture": "Telegramas del bus",
10
+ "storage": "Historial y resúmenes KNX",
11
+ "detection": "Anomalías y patrones",
9
12
  "llmConnection": "Conexion del Asistente IA",
10
- "llmContext": "Contexto del Asistente IA",
11
- "chatAdapter": "Adaptadores de chat",
12
- "advanced": "IA avanzada"
13
+ "llmContext": "Conocimiento y contexto IA",
14
+ "chatAdapter": "Canales de chat",
15
+ "homeIntelligence": "Hogar proactivo y memoria",
16
+ "homeIntelligenceAdvanced": "Ajustes proactivos avanzados",
17
+ "advanced": "Proveedor y límites"
13
18
  },
14
19
  "properties": {
15
20
  "server": "Gateway",
@@ -46,6 +51,14 @@
46
51
  "chatAdapterPreset": "Preajuste del adaptador",
47
52
  "chatInputCode": "Mapeo de entrada (chat → KNX AI)",
48
53
  "chatOutputCode": "Mapeo de salida (KNX AI → chat)",
54
+ "proactiveEnabled": "Activar notificaciones domésticas proactivas",
55
+ "proactiveRecipient": "Destinatario principal / ID de chat",
56
+ "proactiveOpenMinutes": "Avisar tras permanecer abierto (minutos)",
57
+ "proactiveCooldownMinutes": "Espera antes de repetir (minutos)",
58
+ "proactiveQuietStart": "Inicio de horas silenciosas",
59
+ "proactiveQuietEnd": "Fin de horas silenciosas",
60
+ "homeMemoryMaxKb": "Tamaño máximo de memoria del hogar (KB)",
61
+ "aiEducation": "Educación IA (gestionada por el usuario)",
49
62
  "llmIncludeDocsSnippets": "Include documentation snippets (help/README/examples)",
50
63
  "llmDocsLanguage": "Docs language"
51
64
  },
@@ -74,13 +87,18 @@
74
87
  "ollamaInstallSteps": "1) Open the model library and copy the model name (for example llama3.1). 2) Put the name in the Model field and click Install it.",
75
88
  "ollamaStartedAuto": "Ollama server started automatically.",
76
89
  "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.",
77
- "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."
90
+ "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.",
91
+ "homeIntelligenceIntro": "El nodo crea un modelo ETS semántico multilingüe y puede avisar al chat cuando una persiana, ventana o puerta reconocida con suficiente fiabilidad permanece abierta. Nunca envía por sí solo un comando KNX.",
92
+ "aiEducationHelp": "Solo el usuario puede editar esta sección. La IA la lee como una instrucción autoritativa, pero la memoria aprendida nunca puede sobrescribirla. Máximo 16.000 caracteres.",
93
+ "homeMemoryLimitHelp": "La memoria Markdown se reescribe atómicamente cada 15 minutos y siempre queda limitada entre 64 y 1.024 KB. Las observaciones antiguas se eliminan antes que los hábitos y los objetos semánticos."
78
94
  },
79
95
  "placeholder": {
80
96
  "llmBaseUrl": "https://api.openai.com/v1/chat/completions (or your compatible endpoint)",
81
97
  "llmApiKey": "Paste API key (starts with sk-)",
82
98
  "llmModel": "e.g. gpt-4o-mini",
83
- "llmSystemPrompt": "Optional. Leave empty for default."
99
+ "llmSystemPrompt": "Optional. Leave empty for default.",
100
+ "proactiveRecipient": "Opcional: ID de chat de Telegram; si no, se recuerda la última sesión de chat",
101
+ "aiEducation": "Ejemplo: no avisarme entre las 23:00 y las 07:00. La persiana del despacho puede quedar abierta de noche."
84
102
  },
85
103
  "sidebar": {
86
104
  "ui": {
@@ -1,7 +1,7 @@
1
1
  <script type="text/markdown" data-help-name="knxUltimateAI">
2
2
  Ce nœud écoute **tous les télégrammes KNX** du gateway KNX Ultimate sélectionné, produit des statistiques de trafic, détecte des anomalies et peut interroger un LLM de façon optionnelle.
3
3
 
4
- Les sections de l'éditeur utilisent les mêmes onglets verticaux à gauche que les nœuds Matter. **Configuration rapide** ne contient que les choix AI courants (activation, fournisseur, identifiants, modèle, lecture des états/commande des actionneurs KNX et confirmation) ; les paramètres techniques sont regroupés par thème dans les autres onglets.
4
+ L'éditeur utilise trois sections principales en accordéon : **Assistant IA** contient la configuration, les connaissances/le contexte et les limites du fournisseur ; **Conversations et maison** contient les canaux de chat, la maison proactive et la mémoire limitée ; **Analyse du trafic KNX** contient les télégrammes du bus, l'historique/les résumés et les anomalies/motifs. L'ouverture d'une section principale affiche ensemble toutes ses options. Les identifiants et valeurs enregistrés restent inchangés.
5
5
 
6
6
  ## Sorties
7
7
  1. **Résumé/Stats** (`msg.payload` JSON)
@@ -14,7 +14,7 @@ Chaque message émis par les sorties 3 et 4 contient également une copie du mes
14
14
  ## Commandes (entrée)
15
15
  Envoyez `msg.topic` :
16
16
  - `summary` (ou vide) : envoie le résumé immédiatement
17
- - `reset` : vide l'historique/compteurs internes
17
+ - `reset` : efface l'historique, les compteurs et la mémoire domestique apprise ; l'Éducation de l'IA reste inchangée
18
18
  - `ask` : envoie une question au LLM configuré
19
19
  - `confirm` / `cancel` : confirme ou annule les commandes KNX en attente sans rappeler le LLM
20
20
  - `clear_chat` : efface la mémoire de conversation de la session courante
@@ -35,6 +35,40 @@ L’onglet **Adaptateurs de chat** charge ses mappages sélectionnables depuis `
35
35
 
36
36
  Le préréglage inclus **windkh/node-red-contrib-telegrambot** suit le contrat receiver/sender du paquet. Connectez directement un `telegram receiver` à KNX AI et la sortie 3 à un `telegram sender`. Pour les boutons de confirmation inline, connectez aussi un `telegram event` configuré pour `callback_query` à la même entrée KNX AI. Le mappage d’entrée extrait `msg.payload.content`, `msg.payload.chatId` et la langue Telegram. Le mappage de sortie crée `msg.payload.chatId`, `type` et `content`, puis ajoute `options.reply_markup` depuis `msg.knxAi.confirmationRequest` lorsqu’une écriture attend confirmation. Le paquet Telegram reste une dépendance optionnelle distincte.
37
37
 
38
+ ## Intelligence domestique proactive et mémoire limitée
39
+ La sous-section **Maison proactive et mémoire** de **Conversations et maison** active les notifications proactives sur choix de l’utilisateur. À partir de la hiérarchie ETS, des noms, rôles et DPT, le nœud crée un modèle sémantique déterministe pour les volets, fenêtres, portes, éclairages, températures, climat, présence et alarmes avec des termes italiens, anglais, allemands, français, espagnols et chinois. Le premier détecteur proactif surveille uniquement les états hors commande de volets/fenêtres/portes reconnus avec une fiabilité suffisante. Après la durée d’ouverture configurée et hors heures silencieuses, la sortie 3 émet un message localisé avec `msg.knxAi.type = "proactive_notification"`. Il n’émet jamais sur la sortie 4 et ne modifie jamais KNX de façon autonome ; une demande ultérieure de l’utilisateur passe toujours par la validation et la confirmation normales.
40
+
41
+ La dernière session de chat est mémorisée comme propriétaire, ou **Destinataire principal / ID de chat** permet de la définir explicitement. Un `msg.inputMessage` synthétique conserve le destinataire afin que l’adaptateur Telegram puisse envoyer une notification spontanée. Le délai de répétition et la limite de trois notifications proactives par heure évitent les rafales.
42
+
43
+ La référence apprise est chargée au démarrage depuis `<userDir>/knxai/memory/knxai-home-memory-<node-id>.md`, réécrite atomiquement toutes les 15 minutes et strictement limitée entre 64 et 1 024 Ko configurables (256 Ko par défaut). Elle conserve au maximum 120 observations importantes, 80 habitudes agrégées, 80 notifications et 300 objets ETS sémantiques, jamais un flux illimité de télégrammes bruts. Les éléments anciens et moins prioritaires sont supprimés en premier. **Éducation IA** est limitée à 16 000 caractères et provient toujours de la configuration du nœud : l’IA peut la lire comme une consigne faisant autorité, mais ne peut ni la modifier ni l’écraser. Si cette Éducation est présente mais que le LLM ne peut pas l’évaluer, la notification candidate est supprimée plutôt que de risquer de la contredire.
44
+
45
+ ## Exemple pratique de configuration
46
+ Cet exemple crée un assistant concis qui signale les ouvertures importantes, tout en acceptant que le volet du bureau reste ouvert :
47
+
48
+ | Champ de l’éditeur | Valeur d’exemple | Résultat |
49
+ |---|---|---|
50
+ | **Activer les notifications domestiques proactives** (`proactiveEnabled`) | activé | Le nœud évalue les états ouverts de volet/fenêtre/porte reconnus avec fiabilité. |
51
+ | **Destinataire principal / ID de chat** (`proactiveRecipient`) | `123456789` | Les messages spontanés vont vers ce chat ; laissez vide pour mémoriser la dernière session Ask. |
52
+ | **Notifier après ouverture** (`proactiveOpenMinutes`) | `120` | Une notification potentielle est évaluée après deux heures. |
53
+ | **Début / fin des heures silencieuses** | `23:00` / `07:00` | Aucun message proactif n’est émis pendant la nuit. |
54
+ | **Délai de répétition** (`proactiveCooldownMinutes`) | `360` | Le même objet ne peut pas notifier à nouveau pendant six heures. |
55
+ | **Taille maximale du fichier mémoire** (`homeMemoryMaxKb`) | `256` | La référence Markdown de ce nœud reste sous 256 Ko. |
56
+
57
+ Exemple pour **Éducation IA** (`aiEducation`) :
58
+
59
+ ```text
60
+ Appelle-moi Alex et réponds dans la même langue que moi.
61
+ Réponds brièvement, sauf si je demande des détails techniques.
62
+ Le volet du bureau peut rester ouvert le jour : ne m’envoie pas de notification.
63
+ Préviens-moi lorsqu’un autre volet, une fenêtre ou une porte reste ouvert anormalement longtemps.
64
+ Si « lumière du salon » est ambigu, demande-moi quel éclairage je veux dire.
65
+ N’affirme jamais qu’un actionneur a changé avant confirmation par un objet d’état KNX.
66
+ ```
67
+
68
+ Avec ces réglages, la sortie 3 peut émettre une `proactive_notification` localisée après 120 minutes pour le volet du salon, tandis que l’Éducation supprime la notification du volet du bureau. Si Alex demande ensuite de fermer le volet du salon, KNX AI prépare la commande ETS exacte, mais conserve la validation et la confirmation normales avant la sortie 4.
69
+
70
+ Utilisez des hiérarchies et noms d’objet ETS explicites, avec des rôles état/commande corrects. L’Éducation personnalise les décisions et la formulation, mais ne peut ni inventer une adresse de groupe, ni changer un DPT, ni contourner la validation KNX.
71
+
38
72
  ## Workflow rapide : contrôle KNX
39
73
  1. Importez le CSV ETS dans la passerelle et configurez le fournisseur, le modèle et les identifiants LLM.
40
74
  2. Activez **Assistant LLM** et **lecture des états KNX et commande des actionneurs** ; laissez la confirmation activée.
@@ -90,6 +124,13 @@ Voici tous les champs tels qu'affichés dans l'éditeur KNX AI.
90
124
  - **Préréglage d’adaptateur** : charge une paire de mappages entrée/sortie depuis le fichier d’adaptateurs de chat fourni. La sélection remplace volontairement les deux zones de texte ; le code reste ensuite modifiable.
91
125
  - **Mappage d’entrée (chat → KNX AI)** : JavaScript synchrone exécuté avant le traitement de la commande d’entrée.
92
126
  - **Mappage de sortie (KNX AI → chat)** : JavaScript synchrone appliqué uniquement aux messages de la sortie 3.
127
+ - **Activer les notifications domestiques proactives** : détecteur optionnel des états ouverts de volet/fenêtre/porte reconnus de façon fiable ; il n'écrit jamais de manière autonome sur KNX.
128
+ - **Destinataire principal / ID de chat** : destination facultative des messages spontanés ; sinon la dernière session Ask est mémorisée.
129
+ - **Notifier après ouverture (minutes)** : seuil de durée avant d'envisager une notification proactive.
130
+ - **Début / fin des heures silencieuses** : intervalle quotidien pendant lequel les messages proactifs sont supprimés.
131
+ - **Éducation de l’IA** : consignes autoritaires gérées uniquement par l'utilisateur, lues par l'IA et jamais modifiées.
132
+ - **Délai de répétition (minutes)** : intervalle minimal avant qu'un même objet puisse notifier à nouveau.
133
+ - **Taille maximale du fichier mémoire domestique (KB)** : limite stricte de 64 à 1 024 KB ; 256 KB par défaut.
93
134
  - Si l'archive disque est active, **Ask** l'utilise par défaut : les dates/plages explicites sont respectées, sinon l'assistant cherche sur les dernières 24 heures plus les événements RAM courants.
94
135
  - **Include raw payload hex** : inclut le payload hex brut dans le prompt.
95
136
  - **Inclure l'inventaire du projet Node-RED** : inclut dans le prompt l'inventaire de tout le projet Node-RED, avec les nœuds KNX et d'autres nœuds utiles comme function/change/inject/template lorsqu'ils contiennent de la logique KNX ou des adresses de groupe.
@@ -2,14 +2,19 @@
2
2
  "knxUltimateAI": {
3
3
  "title": "KNX AI (Traffic Analyzer)",
4
4
  "sections": {
5
- "quickSetup": "Configuration rapide",
6
- "capture": "Capture",
7
- "storage": "Historique et Resume",
8
- "detection": "Detection et Alertes",
5
+ "groupAssistant": "Assistant IA",
6
+ "groupChatHome": "Conversations et maison",
7
+ "groupKnxAnalysis": "Analyse du trafic KNX",
8
+ "quickSetup": "Configurer l'assistant",
9
+ "capture": "Télégrammes du bus",
10
+ "storage": "Historique et résumés KNX",
11
+ "detection": "Anomalies et motifs",
9
12
  "llmConnection": "Connexion Assistant IA",
10
- "llmContext": "Contexte Assistant IA",
11
- "chatAdapter": "Adaptateurs de chat",
12
- "advanced": "IA avancee"
13
+ "llmContext": "Connaissances et contexte IA",
14
+ "chatAdapter": "Canaux de chat",
15
+ "homeIntelligence": "Maison proactive et mémoire",
16
+ "homeIntelligenceAdvanced": "Paramètres proactifs avancés",
17
+ "advanced": "Fournisseur et limites"
13
18
  },
14
19
  "properties": {
15
20
  "server": "Gateway",
@@ -46,6 +51,14 @@
46
51
  "chatAdapterPreset": "Préréglage d’adaptateur",
47
52
  "chatInputCode": "Mappage d’entrée (chat → KNX AI)",
48
53
  "chatOutputCode": "Mappage de sortie (KNX AI → chat)",
54
+ "proactiveEnabled": "Activer les notifications domestiques proactives",
55
+ "proactiveRecipient": "Destinataire principal / ID de chat",
56
+ "proactiveOpenMinutes": "Notifier après ouverture (minutes)",
57
+ "proactiveCooldownMinutes": "Délai avant répétition (minutes)",
58
+ "proactiveQuietStart": "Début des heures silencieuses",
59
+ "proactiveQuietEnd": "Fin des heures silencieuses",
60
+ "homeMemoryMaxKb": "Taille maximale de la mémoire maison (Ko)",
61
+ "aiEducation": "Éducation IA (gérée par l'utilisateur)",
49
62
  "llmIncludeDocsSnippets": "Include documentation snippets (help/README/examples)",
50
63
  "llmDocsLanguage": "Docs language"
51
64
  },
@@ -74,13 +87,18 @@
74
87
  "ollamaInstallSteps": "1) Open the model library and copy the model name (for example llama3.1). 2) Put the name in the Model field and click Install it.",
75
88
  "ollamaStartedAuto": "Ollama server started automatically.",
76
89
  "chatAdapterIntro": "Choisissez un préréglage pour insérer son code de mappage d’entrée et de sortie. La liste est chargée depuis le fichier d’adaptateurs de chat fourni ; le code généré reste modifiable.",
77
- "chatAdapterCodeHelp": "Les mappages s’exécutent de façon synchrone. Renvoyez msg pour continuer ou aucune valeur pour l’écarter. Les erreurs sont interceptées et signalées sans arrêter Node-RED."
90
+ "chatAdapterCodeHelp": "Les mappages s’exécutent de façon synchrone. Renvoyez msg pour continuer ou aucune valeur pour l’écarter. Les erreurs sont interceptées et signalées sans arrêter Node-RED.",
91
+ "homeIntelligenceIntro": "Le nœud crée un modèle ETS sémantique multilingue et peut avertir le chat lorsqu'un volet, une fenêtre ou une porte reconnu avec suffisamment de fiabilité reste ouvert. Il n'envoie jamais de commande KNX de manière autonome.",
92
+ "aiEducationHelp": "Seul l'utilisateur peut modifier cette section. L'IA la lit comme une consigne faisant autorité, mais la mémoire apprise ne peut jamais l'écraser. Maximum 16 000 caractères.",
93
+ "homeMemoryLimitHelp": "La mémoire Markdown est réécrite atomiquement toutes les 15 minutes et reste toujours limitée entre 64 et 1 024 Ko. Les anciennes observations sont supprimées avant les habitudes et les objets sémantiques."
78
94
  },
79
95
  "placeholder": {
80
96
  "llmBaseUrl": "https://api.openai.com/v1/chat/completions (or your compatible endpoint)",
81
97
  "llmApiKey": "Paste API key (starts with sk-)",
82
98
  "llmModel": "e.g. gpt-4o-mini",
83
- "llmSystemPrompt": "Optional. Leave empty for default."
99
+ "llmSystemPrompt": "Optional. Leave empty for default.",
100
+ "proactiveRecipient": "Facultatif : ID de chat Telegram ; sinon la dernière session de chat est mémorisée",
101
+ "aiEducation": "Exemple : ne pas me notifier entre 23:00 et 07:00. Le volet du bureau peut rester ouvert la nuit."
84
102
  },
85
103
  "sidebar": {
86
104
  "ui": {
@@ -1,7 +1,7 @@
1
1
  <script type="text/markdown" data-help-name="knxUltimateAI">
2
2
  Questo nodo ascolta **tutti i telegrammi KNX** dal gateway KNX Ultimate selezionato, costruisce statistiche di traffico, rileva anomalie e può interrogare opzionalmente un LLM.
3
3
 
4
- Le sezioni dell'editor utilizzano le stesse tab verticali a sinistra dei nodi Matter. **Configurazione rapida** contiene soltanto le scelte AI più comuni (abilitazione, provider, credenziali, modello, lettura stati/comando attuatori KNX e conferma); i parametri tecnici sono raggruppati per argomento nelle altre tab.
4
+ L'editor usa tre sezioni principali ad accordion: **Assistente AI** contiene configurazione, conoscenza/contesto, provider e limiti; **Conversazioni e casa** contiene canali chat, casa proattiva e memoria limitata; **Analisi traffico KNX** contiene telegrammi dal bus, storico/riepiloghi e anomalie/pattern. Aprendo una sezione principale vengono mostrate insieme tutte le opzioni relative. ID e valori salvati dei campi restano invariati.
5
5
 
6
6
  ## Output
7
7
  1. **Summary/Statistiche** (`msg.payload` JSON)
@@ -14,7 +14,7 @@ Ogni messaggio emesso dalle uscite 3 e 4 contiene anche una copia del messaggio
14
14
  ## Comandi (input)
15
15
  Invia `msg.topic`:
16
16
  - `summary` (o vuoto): emette subito la summary
17
- - `reset`: azzera storico e contatori interni
17
+ - `reset`: azzera storico, contatori e memoria domestica appresa; Educazione AI resta invariata
18
18
  - `ask`: invia una domanda all'LLM configurato
19
19
  - `confirm` / `cancel`: conferma o annulla i comandi KNX in attesa senza richiamare l'LLM
20
20
  - `clear_chat`: azzera la memoria della conversazione per la sessione corrente
@@ -35,6 +35,44 @@ La tab **Adattatori chat** carica le mappature selezionabili da `resources/KNXAI
35
35
 
36
36
  Il preset incluso **windkh/node-red-contrib-telegrambot** segue il contratto receiver/sender del pacchetto. Collega direttamente un `telegram receiver` a KNX AI e l'uscita 3 direttamente a un `telegram sender`; per usare i pulsanti inline di conferma, collega allo stesso ingresso KNX AI anche un `telegram event` configurato come `callback_query`. La mappatura d'ingresso estrae `msg.payload.content`, `msg.payload.chatId` e la lingua Telegram. Quella d'uscita crea i campi richiesti `msg.payload.chatId`, `type` e `content`, aggiungendo `options.reply_markup` da `msg.knxAi.confirmationRequest` quando una scrittura attende conferma. Il pacchetto Telegram resta una dipendenza opzionale separata.
37
37
 
38
+ ## Intelligenza domestica proattiva e memoria limitata
39
+ La sottosezione **Casa proattiva e memoria** dentro **Conversazioni e casa** abilita le notifiche proattive su scelta dell'utente. Da gerarchia ETS, nomi, ruoli e DPT, il nodo crea un modello semantico deterministico per persiane, finestre, porte, luci, temperatura, clima, presenza e allarmi usando termini italiani, inglesi, tedeschi, francesi, spagnoli e cinesi. Il primo rilevatore proattivo osserva soltanto stati non di comando di persiane/finestre/porte riconosciuti con sufficiente affidabilità. Dopo il tempo di apertura configurato e fuori dalle ore silenziose, l'uscita 3 emette un messaggio localizzato con `msg.knxAi.type = "proactive_notification"`. Non emette mai l'uscita 4 e non modifica autonomamente KNX; un'eventuale richiesta successiva dell'utente passa sempre dalla normale validazione e conferma.
40
+
41
+ L'ultima sessione chat viene ricordata come proprietario, oppure **Destinatario principale / chat ID** consente di impostarla esplicitamente. Un `msg.inputMessage` sintetico conserva il destinatario affinché l'adattatore Telegram possa inviare una notifica spontanea. Il cooldown e il limite di tre notifiche proattive all'ora evitano messaggi ripetuti.
42
+
43
+ Il riferimento appreso viene caricato all'avvio da `<userDir>/knxai/memory/knxai-home-memory-<node-id>.md`, riscritto atomicamente ogni 15 minuti e limitato rigidamente tra 64 e 1.024 KB configurabili (256 KB per default). Conserva al massimo 120 osservazioni significative, 80 abitudini aggregate, 80 notifiche e 300 oggetti ETS semantici, mai un flusso illimitato di telegrammi raw. Gli elementi vecchi e meno importanti vengono eliminati per primi. **Educazione AI** è limitata a 16.000 caratteri e proviene sempre dalla configurazione del nodo: l'AI può leggerla come istruzione autorevole, ma non può modificarla o sovrascriverla. Se l'Educazione è presente ma l'LLM non riesce a valutarla, la notifica candidata viene soppressa invece di rischiare di contraddirla.
44
+
45
+ ## Esempio pratico di configurazione
46
+ Questo esempio crea un assistente conciso che avvisa il proprietario delle aperture importanti, ma accetta che la persiana dello studio possa rimanere aperta:
47
+
48
+ | Campo dell'editor | Valore di esempio | Risultato |
49
+ |---|---|---|
50
+ | **Abilita notifiche domestiche proattive** (`proactiveEnabled`) | attivo | Il nodo valuta gli stati aperti di persiane, finestre e porte riconosciuti con affidabilità. |
51
+ | **Destinatario principale / chat ID** (`proactiveRecipient`) | `123456789` | I messaggi spontanei vengono inviati a questa chat. Lascia vuoto per ricordare l'ultima sessione Ask. |
52
+ | **Avvisa dopo apertura** (`proactiveOpenMinutes`) | `120` | Dopo due ore viene valutata una possibile notifica. |
53
+ | **Inizio / fine ore silenziose** | `23:00` / `07:00` | Durante la notte non vengono emessi messaggi proattivi. |
54
+ | **Intervallo prima di ripetere** (`proactiveCooldownMinutes`) | `360` | Lo stesso oggetto non può generare un altro avviso per sei ore. |
55
+ | **Dimensione massima memoria casa** (`homeMemoryMaxKb`) | `256` | Il riferimento Markdown del singolo nodo non può superare 256 KB. |
56
+
57
+ Esempio per **Educazione AI** (`aiEducation`):
58
+
59
+ ```text
60
+ Chiamami Massimo e rispondi nella stessa lingua che uso.
61
+ Mantieni le risposte brevi, salvo quando chiedo dettagli tecnici.
62
+ La persiana dello studio può restare aperta durante il giorno: non avvisarmi.
63
+ Avvisami quando un'altra persiana, finestra o porta rimane aperta insolitamente a lungo.
64
+ Quando "luce soggiorno" è ambiguo, chiedimi quale luce intendo.
65
+ Non dire mai che un attuatore è cambiato finché un oggetto di stato KNX non lo conferma.
66
+ ```
67
+
68
+ Con queste impostazioni:
69
+
70
+ 1. Se lo stato della persiana del soggiorno rimane aperto per 120 minuti fuori dalle ore silenziose, l'uscita 3 può emettere una `proactive_notification` localizzata.
71
+ 2. Se rimane aperta la persiana dello studio, l'LLM legge l'Educazione e sopprime quella notifica candidata.
72
+ 3. Se Massimo chiede poi di chiudere la persiana del soggiorno, KNX AI prepara il comando ETS esatto e applica comunque la normale validazione e conferma prima dell'uscita 4.
73
+
74
+ Usa gerarchie e nomi oggetto ETS descrittivi, con ruoli di stato/comando corretti. L'Educazione può personalizzare decisioni e formulazione, ma non può autorizzare un group address inventato, cambiare un DPT o aggirare la validazione KNX.
75
+
38
76
  ## Workflow rapido: controllo KNX
39
77
  1. Importa il CSV ETS nel gateway e configura provider, modello e credenziali LLM.
40
78
  2. Abilita **Assistente LLM** e **lettura stati e controllo attuatori KNX**; lascia attiva la conferma.
@@ -90,6 +128,13 @@ Di seguito sono elencati tutti i campi presenti nell'editor del nodo KNX AI.
90
128
  - **Preset adattatore**: carica una coppia di mappature ingresso/uscita dal file degli adattatori chat incluso. La selezione sostituisce intenzionalmente entrambe le caselle di testo; il codice resta modificabile.
91
129
  - **Mappatura ingresso (chat → KNX AI)**: JavaScript sincrono applicato prima dell'elaborazione del comando in ingresso.
92
130
  - **Mappatura uscita (KNX AI → chat)**: JavaScript sincrono applicato solo ai messaggi dell'uscita 3.
131
+ - **Abilita notifiche domestiche proattive**: rilevatore opzionale per stati aperti affidabili di persiane/finestre/porte; non scrive mai autonomamente su KNX.
132
+ - **Destinatario principale / chat ID**: destinazione opzionale dei messaggi spontanei; altrimenti viene ricordata l'ultima sessione Ask.
133
+ - **Avvisa dopo apertura (minuti)**: soglia di durata dell'apertura prima di valutare una notifica proattiva.
134
+ - **Inizio / fine ore silenziose**: intervallo giornaliero in cui i messaggi proattivi sono sospesi.
135
+ - **Educazione AI**: istruzioni autorevoli gestite soltanto dall'utente, lette dall'AI e mai modificate.
136
+ - **Cooldown ripetizione (minuti)**: intervallo minimo prima che lo stesso oggetto possa generare un altro avviso.
137
+ - **Dimensione massima memoria domestica (KB)**: limite rigido da 64 a 1.024 KB; 256 KB per default.
93
138
  - Se l'archivio su disco e' attivo, **Ask** lo usa di default: rispetta date/intervalli espliciti e, se non presenti, cerca nelle ultime 24 ore piu' gli eventi correnti in RAM.
94
139
  - **Includi payload raw in hex**: include payload raw esadecimale nel prompt.
95
140
  - **Includi inventario del progetto Node-RED**: include nel prompt l'inventario dell'intero progetto Node-RED, compresi nodi KNX e altri nodi utili come function/change/inject/template quando contengono logica KNX o group address.