node-red-contrib-knx-ultimate 6.1.1 → 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.
- package/CHANGELOG.md +17 -2
- package/examples/KNX AI - Conversational Control with Confirmation.json +374 -0
- package/examples/KNX AI - Telegrambot Direct Chat.json +239 -0
- package/nodes/commonFunctions.js +0 -174
- package/nodes/knxUltimateAI.html +359 -85
- package/nodes/knxUltimateAI.js +1762 -63
- package/nodes/locales/de/knxUltimateAI.html +80 -3
- package/nodes/locales/de/knxUltimateAI.json +39 -8
- package/nodes/locales/en/knxUltimateAI.html +84 -3
- package/nodes/locales/en/knxUltimateAI.json +39 -8
- package/nodes/locales/es/knxUltimateAI.html +80 -3
- package/nodes/locales/es/knxUltimateAI.json +39 -8
- package/nodes/locales/fr/knxUltimateAI.html +80 -3
- package/nodes/locales/fr/knxUltimateAI.json +39 -8
- package/nodes/locales/it/knxUltimateAI.html +84 -3
- package/nodes/locales/it/knxUltimateAI.json +39 -8
- package/nodes/locales/zh-CN/knxUltimateAI.html +80 -3
- package/nodes/locales/zh-CN/knxUltimateAI.json +39 -8
- package/nodes/utils/knxAiHomeMemory.js +507 -0
- package/nodes/utils/sysLogger.js +0 -109
- package/package.json +1 -2
- package/resources/KNXAIChatAdapterMappings.js +87 -0
- package/nodes/plugins/knxUltimateMonitor-sidebar-plugin.html +0 -922
|
@@ -2,12 +2,19 @@
|
|
|
2
2
|
"knxUltimateAI": {
|
|
3
3
|
"title": "KNX AI (Traffic Analyzer)",
|
|
4
4
|
"sections": {
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
"
|
|
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",
|
|
8
12
|
"llmConnection": "Conexion del Asistente IA",
|
|
9
|
-
"llmContext": "
|
|
10
|
-
"
|
|
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"
|
|
11
18
|
},
|
|
12
19
|
"properties": {
|
|
13
20
|
"server": "Gateway",
|
|
@@ -39,19 +46,36 @@
|
|
|
39
46
|
"llmSystemPrompt": "System prompt",
|
|
40
47
|
"llmIncludeRaw": "Include raw payload hex",
|
|
41
48
|
"llmIncludeFlowContext": "Incluir inventario del proyecto Node-RED",
|
|
49
|
+
"llmAllowKnxCommands": "Permitir que la IA lea estados KNX y controle actuadores",
|
|
50
|
+
"llmRequireCommandConfirmation": "Pedir confirmación antes de enviar comandos KNX",
|
|
51
|
+
"chatAdapterPreset": "Preajuste del adaptador",
|
|
52
|
+
"chatInputCode": "Mapeo de entrada (chat → KNX AI)",
|
|
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)",
|
|
42
62
|
"llmIncludeDocsSnippets": "Include documentation snippets (help/README/examples)",
|
|
43
63
|
"llmDocsLanguage": "Docs language"
|
|
44
64
|
},
|
|
45
65
|
"outputs": {
|
|
46
66
|
"summary": "Resumen/Estadísticas",
|
|
47
67
|
"anomalies": "Anomalías",
|
|
48
|
-
"assistant": "Asistente IA"
|
|
68
|
+
"assistant": "Asistente IA",
|
|
69
|
+
"knxCommands": "Operaciones KNX"
|
|
49
70
|
},
|
|
50
71
|
"selectlists": {
|
|
51
72
|
"llmProvider": {
|
|
52
73
|
"openai_compat": "OpenAI-compatible (chat/completions)",
|
|
53
74
|
"anthropic": "Anthropic (Claude)",
|
|
54
75
|
"ollama": "Ollama (local, beta)"
|
|
76
|
+
},
|
|
77
|
+
"chatAdapter": {
|
|
78
|
+
"none": "Sin adaptador"
|
|
55
79
|
}
|
|
56
80
|
},
|
|
57
81
|
"messages": {
|
|
@@ -61,13 +85,20 @@
|
|
|
61
85
|
"installedOllamaModel": "Ollama model installed",
|
|
62
86
|
"installOllamaModelFailed": "Failed to install Ollama model",
|
|
63
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.",
|
|
64
|
-
"ollamaStartedAuto": "Ollama server started automatically."
|
|
88
|
+
"ollamaStartedAuto": "Ollama server started automatically.",
|
|
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.",
|
|
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."
|
|
65
94
|
},
|
|
66
95
|
"placeholder": {
|
|
67
96
|
"llmBaseUrl": "https://api.openai.com/v1/chat/completions (or your compatible endpoint)",
|
|
68
97
|
"llmApiKey": "Paste API key (starts with sk-)",
|
|
69
98
|
"llmModel": "e.g. gpt-4o-mini",
|
|
70
|
-
"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."
|
|
71
102
|
},
|
|
72
103
|
"sidebar": {
|
|
73
104
|
"ui": {
|
|
@@ -1,18 +1,82 @@
|
|
|
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
|
+
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
|
+
|
|
4
6
|
## Sorties
|
|
5
7
|
1. **Résumé/Stats** (`msg.payload` JSON)
|
|
6
8
|
2. **Anomalies** (`msg.payload` JSON)
|
|
7
9
|
3. **Assistant IA** (`msg.payload` texte, avec `msg.summary`)
|
|
10
|
+
4. **Opérations KNX** (un message Universal Mode par lecture ou écriture validée)
|
|
11
|
+
|
|
12
|
+
Chaque message émis par les sorties 3 et 4 contient également une copie du message d'entrée original dans `msg.inputMessage`. Le payload, le topic, les métadonnées du chat et toutes les autres propriétés d'entrée restent ainsi disponibles pour les nœuds suivants. Les erreurs de clonage ou d'envoi sont interceptées et signalées sans se propager au runtime Node-RED.
|
|
8
13
|
|
|
9
14
|
## Commandes (entrée)
|
|
10
15
|
Envoyez `msg.topic` :
|
|
11
16
|
- `summary` (ou vide) : envoie le résumé immédiatement
|
|
12
|
-
- `reset` :
|
|
17
|
+
- `reset` : efface l'historique, les compteurs et la mémoire domestique apprise ; l'Éducation de l'IA reste inchangée
|
|
13
18
|
- `ask` : envoie une question au LLM configuré
|
|
19
|
+
- `confirm` / `cancel` : confirme ou annule les commandes KNX en attente sans rappeler le LLM
|
|
20
|
+
- `clear_chat` : efface la mémoire de conversation de la session courante
|
|
21
|
+
|
|
22
|
+
Pour `ask`, mettez la question dans `msg.prompt` (recommandé), `msg.payload` (chaîne), ou les champs Telegram courants `msg.payload.content` / `msg.payload.text`.
|
|
23
|
+
|
|
24
|
+
Lorsque le contrôle KNX est activé, les échanges récents sont conservés en RAM par `msg.knxAi.sessionId`, `msg.sessionId` ou ID de chat Telegram détecté. Reliez la sortie 3 au nœud d'envoi du chat et la sortie 4 à un nœud KNX Ultimate en **mode universel**. Avec la confirmation active, la première réponse affiche GA, DPT et payload sans émettre d’écriture ; la même session doit répondre `CONFIRMER` ou `ANNULER` dans les 5 minutes. Une nouvelle demande remplace tout plan précédent. Chaque commande confirmée contient `msg.destination`, `msg.dpt`, `msg.payload` et `msg.event = "GroupValue_Write"`.
|
|
25
|
+
Pour les écritures DPT 1.xxx, les équivalents sûrs produits par l’IA `true`/`false`, `1`/`0` et `on`/`off` sont normalisés en véritables booléens avant la validation locale et la sortie.
|
|
26
|
+
|
|
27
|
+
### Lectures KNX actualisées
|
|
28
|
+
Lorsque l’utilisateur demande explicitement un état actuel ou actualisé, l’IA peut interroger les objets exacts du catalogue ETS importé, y compris les objets d’état et autres objets en lecture seule. La sortie 4 émet `msg.destination`, `msg.dpt`, `msg.event = "GroupValue_Read"` et `msg.readstatus = true`. Le nœud attend jusqu’à 6 secondes chaque `GroupValue_Response` ou écriture récente, puis renvoie les valeurs décodées sur la sortie 3 et les détails dans `msg.knxAi.readResults`. Les lectures ne nécessitent jamais de confirmation et ne sont jamais transformées en écritures.
|
|
29
|
+
|
|
30
|
+
### Demande de confirmation pour les boutons du chat
|
|
31
|
+
Lorsqu'un plan est en attente, la sortie 3 contient `msg.knxAi.confirmationRequest`. L'objet comprend `required`, `status`, `sessionId`, `expiresAt`, `commandCount` et deux éléments dans `actions`. Utilisez `action.label` comme texte du bouton Telegram, `action.callbackData` comme callback et renvoyez `action.message` à KNX AI pour confirmer ou annuler sans saisir de texte.
|
|
32
|
+
|
|
33
|
+
### Préréglages d’adaptateur de chat
|
|
34
|
+
L’onglet **Adaptateurs de chat** charge ses mappages sélectionnables depuis `resources/KNXAIChatAdapterMappings.js`. Le choix d’un préréglage insère deux mappages JavaScript synchrones et modifiables dans des zones de texte pleine largeur : un avant le traitement de l’entrée par KNX AI et un avant l’émission sur la sortie 3. Renvoyez `msg` pour continuer ou aucune valeur pour écarter le message. Les erreurs de syntaxe et d’exécution sont interceptées et signalées sans arrêter Node-RED.
|
|
35
|
+
|
|
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
|
+
|
|
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.
|
|
14
71
|
|
|
15
|
-
|
|
72
|
+
## Workflow rapide : contrôle KNX
|
|
73
|
+
1. Importez le CSV ETS dans la passerelle et configurez le fournisseur, le modèle et les identifiants LLM.
|
|
74
|
+
2. Activez **Assistant LLM** et **lecture des états KNX et commande des actionneurs** ; laissez la confirmation activée.
|
|
75
|
+
3. Connectez l'entrée du chat à KNX AI en conservant un identifiant de session/chat stable.
|
|
76
|
+
4. Connectez la sortie 3 à la réponse du chat et la sortie 4 à KNX Ultimate en **mode universel**.
|
|
77
|
+
5. L'utilisateur envoie une demande ; les états actuels sont lus immédiatement, tandis que les écritures affichent d'abord GA, DPT et valeur sans écrire sur le bus.
|
|
78
|
+
6. Dans les 5 minutes, le même chat répond exactement `CONFIRMER` ou `ANNULER`.
|
|
79
|
+
7. Seul `CONFIRMER` revalide et émet les commandes sur la sortie 4 ; vérifiez l'exécution avec une GA d'état KNX.
|
|
16
80
|
|
|
17
81
|
## Champs de configuration
|
|
18
82
|
Voici tous les champs tels qu'affichés dans l'éditeur KNX AI.
|
|
@@ -53,7 +117,20 @@ Voici tous les champs tels qu'affichés dans l'éditeur KNX AI.
|
|
|
53
117
|
- **Endpoint URL** : URL endpoint chat/completions.
|
|
54
118
|
- **API key** : clé API (non requise avec Ollama local).
|
|
55
119
|
- **Model** : ID/nom du modèle.
|
|
120
|
+
- **Compatibilité du modèle de chat** : le modèle sélectionné doit prendre en charge l'endpoint Chat Completions configuré. Les anciens modèles réservés aux completions, comme `gpt-3.5-turbo-instruct`, sont exclus lors de l'actualisation de la liste. Si le fournisseur refuse une valeur de température personnalisée ou le paramètre de limite de tokens, KNX AI réessaie en supprimant ou remplaçant uniquement le champ incompatible.
|
|
56
121
|
- **System prompt** : instruction système globale pour l'analyse KNX (Advanced).
|
|
122
|
+
- **Autoriser l’IA à lire les états KNX et commander les actionneurs** : active la sortie 4 et reste désactivé par défaut. Les objets exacts du catalogue ETS peuvent être lus ; seules les écritures vers des objets classés `command` sont acceptées. Les opérations inconnues, avec DPT discordant, invalides ou trop nombreuses, ainsi que les écritures vers des objets d'état ou neutres, sont rejetées localement.
|
|
123
|
+
- **Demander confirmation avant d’envoyer les commandes KNX** : activé par défaut. Affiche d'abord les modifications validées et n'émet aucune commande tant que la même session de chat ne les confirme pas. Lorsque des commandes attendent une confirmation, la réponse ajoute toujours les instructions exactes de confirmation ou d'annulation dans la langue de la demande courante. Les commandes sont à nouveau validées juste avant la sortie.
|
|
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.
|
|
125
|
+
- **Mappage d’entrée (chat → KNX AI)** : JavaScript synchrone exécuté avant le traitement de la commande d’entrée.
|
|
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.
|
|
57
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.
|
|
58
135
|
- **Include raw payload hex** : inclut le payload hex brut dans le prompt.
|
|
59
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.
|
|
@@ -84,5 +161,5 @@ Voici tous les champs tels qu'affichés dans l'éditeur KNX AI.
|
|
|
84
161
|
- Si Node-RED tourne dans Docker, utiliser `host.docker.internal` au lieu de `localhost` dans l'endpoint.
|
|
85
162
|
|
|
86
163
|
## Note sécurité
|
|
87
|
-
Si le LLM est activé, le contexte trafic KNX peut être envoyé à l'endpoint configuré. Pour un usage strictement on-premise, utilisez un provider local.
|
|
164
|
+
Si le LLM est activé, le contexte trafic KNX peut être envoyé à l'endpoint configuré. Pour un usage strictement on-premise, utilisez un provider local. Une commande émise en sortie 4 a passé la validation locale et a été transmise au flow, sans prouver son exécution par l'actionneur. Utilisez une GA d'état KNX pour la confirmation.
|
|
88
165
|
</script>
|
|
@@ -2,12 +2,19 @@
|
|
|
2
2
|
"knxUltimateAI": {
|
|
3
3
|
"title": "KNX AI (Traffic Analyzer)",
|
|
4
4
|
"sections": {
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
"
|
|
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",
|
|
8
12
|
"llmConnection": "Connexion Assistant IA",
|
|
9
|
-
"llmContext": "
|
|
10
|
-
"
|
|
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"
|
|
11
18
|
},
|
|
12
19
|
"properties": {
|
|
13
20
|
"server": "Gateway",
|
|
@@ -39,19 +46,36 @@
|
|
|
39
46
|
"llmSystemPrompt": "System prompt",
|
|
40
47
|
"llmIncludeRaw": "Include raw payload hex",
|
|
41
48
|
"llmIncludeFlowContext": "Inclure l'inventaire du projet Node-RED",
|
|
49
|
+
"llmAllowKnxCommands": "Autoriser l’IA à lire les états KNX et commander les actionneurs",
|
|
50
|
+
"llmRequireCommandConfirmation": "Demander confirmation avant d’envoyer les commandes KNX",
|
|
51
|
+
"chatAdapterPreset": "Préréglage d’adaptateur",
|
|
52
|
+
"chatInputCode": "Mappage d’entrée (chat → KNX AI)",
|
|
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)",
|
|
42
62
|
"llmIncludeDocsSnippets": "Include documentation snippets (help/README/examples)",
|
|
43
63
|
"llmDocsLanguage": "Docs language"
|
|
44
64
|
},
|
|
45
65
|
"outputs": {
|
|
46
66
|
"summary": "Résumé/Stats",
|
|
47
67
|
"anomalies": "Anomalies",
|
|
48
|
-
"assistant": "Assistant IA"
|
|
68
|
+
"assistant": "Assistant IA",
|
|
69
|
+
"knxCommands": "Opérations KNX"
|
|
49
70
|
},
|
|
50
71
|
"selectlists": {
|
|
51
72
|
"llmProvider": {
|
|
52
73
|
"openai_compat": "OpenAI-compatible (chat/completions)",
|
|
53
74
|
"anthropic": "Anthropic (Claude)",
|
|
54
75
|
"ollama": "Ollama (local, beta)"
|
|
76
|
+
},
|
|
77
|
+
"chatAdapter": {
|
|
78
|
+
"none": "Aucun adaptateur"
|
|
55
79
|
}
|
|
56
80
|
},
|
|
57
81
|
"messages": {
|
|
@@ -61,13 +85,20 @@
|
|
|
61
85
|
"installedOllamaModel": "Ollama model installed",
|
|
62
86
|
"installOllamaModelFailed": "Failed to install Ollama model",
|
|
63
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.",
|
|
64
|
-
"ollamaStartedAuto": "Ollama server started automatically."
|
|
88
|
+
"ollamaStartedAuto": "Ollama server started automatically.",
|
|
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.",
|
|
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."
|
|
65
94
|
},
|
|
66
95
|
"placeholder": {
|
|
67
96
|
"llmBaseUrl": "https://api.openai.com/v1/chat/completions (or your compatible endpoint)",
|
|
68
97
|
"llmApiKey": "Paste API key (starts with sk-)",
|
|
69
98
|
"llmModel": "e.g. gpt-4o-mini",
|
|
70
|
-
"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."
|
|
71
102
|
},
|
|
72
103
|
"sidebar": {
|
|
73
104
|
"ui": {
|
|
@@ -1,18 +1,86 @@
|
|
|
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
|
+
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
|
+
|
|
4
6
|
## Output
|
|
5
7
|
1. **Summary/Statistiche** (`msg.payload` JSON)
|
|
6
8
|
2. **Anomalie** (`msg.payload` JSON)
|
|
7
9
|
3. **Assistente AI** (`msg.payload` testo, con `msg.summary`)
|
|
10
|
+
4. **Operazioni KNX** (un messaggio Universal Mode per ogni lettura o scrittura validata)
|
|
11
|
+
|
|
12
|
+
Ogni messaggio emesso dalle uscite 3 e 4 contiene anche una copia del messaggio originale in ingresso in `msg.inputMessage`. In questo modo payload, topic, metadati della chat e qualsiasi altra proprietà di ingresso restano disponibili per i nodi successivi. Gli errori di clonazione o di invio vengono intercettati e segnalati senza propagarsi al runtime di Node-RED.
|
|
8
13
|
|
|
9
14
|
## Comandi (input)
|
|
10
15
|
Invia `msg.topic`:
|
|
11
16
|
- `summary` (o vuoto): emette subito la summary
|
|
12
|
-
- `reset`: azzera storico e
|
|
17
|
+
- `reset`: azzera storico, contatori e memoria domestica appresa; Educazione AI resta invariata
|
|
13
18
|
- `ask`: invia una domanda all'LLM configurato
|
|
19
|
+
- `confirm` / `cancel`: conferma o annulla i comandi KNX in attesa senza richiamare l'LLM
|
|
20
|
+
- `clear_chat`: azzera la memoria della conversazione per la sessione corrente
|
|
21
|
+
|
|
22
|
+
Per `ask`, passa la domanda in `msg.prompt` (consigliato), in `msg.payload` (stringa), oppure nei comuni campi Telegram `msg.payload.content` / `msg.payload.text`.
|
|
23
|
+
|
|
24
|
+
Quando il controllo KNX è abilitato, i turni recenti sono conservati in RAM per `msg.knxAi.sessionId`, `msg.sessionId` o per il chat ID Telegram rilevato. Collega l'uscita 3 al nodo di risposta della chat e l'uscita 4 a un nodo KNX Ultimate configurato in **Modalità Universale**. Con la conferma attiva, la prima risposta mostra GA, DPT e payload delle scritture senza emetterle; la stessa sessione deve poi rispondere `CONFERMA`/`ANNULLA` entro 5 minuti. Una nuova richiesta sostituisce l'eventuale piano precedente. Ogni comando confermato contiene `msg.destination`, `msg.dpt`, `msg.payload` e `msg.event = "GroupValue_Write"`.
|
|
25
|
+
Per le scritture DPT 1.xxx, gli equivalenti sicuri prodotti dall'AI `true`/`false`, `1`/`0` e `on`/`off` vengono normalizzati in un vero booleano prima della validazione locale e dell'uscita.
|
|
26
|
+
|
|
27
|
+
### Letture KNX aggiornate
|
|
28
|
+
Quando l'utente chiede esplicitamente uno stato attuale o aggiornato, l'AI può interrogare gli oggetti esatti del catalogo ETS importato, compresi gli oggetti di stato e di sola lettura. L'uscita 4 emette `msg.destination`, `msg.dpt`, `msg.event = "GroupValue_Read"` e `msg.readstatus = true`. Il nodo attende fino a 6 secondi ogni `GroupValue_Response` o scrittura fresca, poi restituisce i valori decodificati sull'uscita 3 e i dettagli in `msg.knxAi.readResults`. Le letture non richiedono mai conferma e non vengono mai trasformate in scritture.
|
|
29
|
+
|
|
30
|
+
### Richiesta di conferma per pulsanti chat
|
|
31
|
+
Quando un piano è in attesa, l'uscita 3 contiene `msg.knxAi.confirmationRequest`. L'oggetto include `required`, `status`, `sessionId`, `expiresAt`, `commandCount` e due elementi in `actions`. Usa `action.label` per il testo del pulsante Telegram, `action.callbackData` per il callback e reinvia `action.message` al nodo KNX AI per confermare o annullare senza digitare testo.
|
|
32
|
+
|
|
33
|
+
### Preset adattatori chat
|
|
34
|
+
La tab **Adattatori chat** carica le mappature selezionabili da `resources/KNXAIChatAdapterMappings.js`. Scegliendo un preset vengono inserite due mappature JavaScript sincrone e modificabili in caselle di testo a larghezza piena: una eseguita prima che KNX AI elabori l'ingresso e una prima dell'emissione sull'uscita 3. Restituisci `msg` per continuare oppure nessun valore per scartare il messaggio. Errori di sintassi o esecuzione vengono intercettati e segnalati senza arrestare Node-RED.
|
|
35
|
+
|
|
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
|
+
|
|
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.
|
|
14
75
|
|
|
15
|
-
|
|
76
|
+
## Workflow rapido: controllo KNX
|
|
77
|
+
1. Importa il CSV ETS nel gateway e configura provider, modello e credenziali LLM.
|
|
78
|
+
2. Abilita **Assistente LLM** e **lettura stati e controllo attuatori KNX**; lascia attiva la conferma.
|
|
79
|
+
3. Collega l'ingresso della chat al nodo KNX AI mantenendo un ID sessione/chat stabile.
|
|
80
|
+
4. Collega l'uscita 3 alla risposta della chat e l'uscita 4 a KNX Ultimate in **Modalità Universale**.
|
|
81
|
+
5. L'utente invia una richiesta; gli stati aggiornati vengono letti subito, mentre per le scritture l'AI mostra prima GA, DPT e valore senza scrivere sul bus.
|
|
82
|
+
6. Entro 5 minuti, la stessa chat risponde esattamente `CONFERMA` oppure `ANNULLA`.
|
|
83
|
+
7. Solo `CONFERMA` rivalida ed emette i comandi sull'uscita 4; verifica l'esecuzione tramite una GA di stato.
|
|
16
84
|
|
|
17
85
|
## Campi di configurazione
|
|
18
86
|
Di seguito sono elencati tutti i campi presenti nell'editor del nodo KNX AI.
|
|
@@ -53,7 +121,20 @@ Di seguito sono elencati tutti i campi presenti nell'editor del nodo KNX AI.
|
|
|
53
121
|
- **URL endpoint**: URL endpoint chat/completions.
|
|
54
122
|
- **API key**: chiave API (non necessaria con Ollama locale).
|
|
55
123
|
- **Modello**: ID/nome modello.
|
|
124
|
+
- **Compatibilità modello chat**: il modello selezionato deve supportare l'endpoint Chat Completions configurato. I modelli legacy disponibili solo tramite completions, come `gpt-3.5-turbo-instruct`, vengono esclusi quando si aggiorna la lista. Se il provider rifiuta un valore personalizzato di temperature o il parametro del limite token, KNX AI riprova rimuovendo o sostituendo soltanto il campo incompatibile.
|
|
56
125
|
- **Prompt di sistema**: istruzione globale del comportamento analisi KNX (Advanced).
|
|
126
|
+
- **Consenti all'AI di leggere stati KNX e comandare attuatori**: abilita l'uscita 4 ed è disattivato per default. Gli oggetti esatti del catalogo ETS possono essere letti; le scritture sono accettate solo per gli oggetti classificati come `command`. Operazioni sconosciute, con DPT discordante, non valide o eccessive e scritture verso oggetti di stato/neutrali vengono rifiutate localmente.
|
|
127
|
+
- **Chiedi conferma prima di inviare comandi KNX**: attivo per default. Mostra prima le modifiche validate e non emette comandi KNX finché la stessa sessione chat non le conferma. Quando ci sono comandi in attesa, la risposta aggiunge sempre le istruzioni esatte per confermare o annullare nella lingua della richiesta corrente. I comandi vengono validati nuovamente subito prima dell'uscita.
|
|
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.
|
|
129
|
+
- **Mappatura ingresso (chat → KNX AI)**: JavaScript sincrono applicato prima dell'elaborazione del comando in ingresso.
|
|
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.
|
|
57
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.
|
|
58
139
|
- **Includi payload raw in hex**: include payload raw esadecimale nel prompt.
|
|
59
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.
|
|
@@ -84,5 +165,5 @@ Di seguito sono elencati tutti i campi presenti nell'editor del nodo KNX AI.
|
|
|
84
165
|
- Se Node-RED gira in Docker, usa `host.docker.internal` al posto di `localhost` nell'endpoint.
|
|
85
166
|
|
|
86
167
|
## Nota sicurezza
|
|
87
|
-
Se l'LLM è abilitato, il contesto traffico KNX può essere inviato all'endpoint configurato. Per privacy on-prem, usa provider locali.
|
|
168
|
+
Se l'LLM è abilitato, il contesto traffico KNX può essere inviato all'endpoint configurato. Per privacy on-prem, usa provider locali. Un comando emesso sull'uscita 4 ha superato la validazione locale ed è stato inoltrato al flow, ma non prova che l'attuatore lo abbia eseguito. Per la conferma usa una GA di stato KNX.
|
|
88
169
|
</script>
|
|
@@ -2,12 +2,19 @@
|
|
|
2
2
|
"knxUltimateAI": {
|
|
3
3
|
"title": "KNX AI (Analisi Traffico)",
|
|
4
4
|
"sections": {
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
"
|
|
5
|
+
"groupAssistant": "Assistente AI",
|
|
6
|
+
"groupChatHome": "Conversazioni e casa",
|
|
7
|
+
"groupKnxAnalysis": "Analisi traffico KNX",
|
|
8
|
+
"quickSetup": "Configurazione assistente",
|
|
9
|
+
"capture": "Telegrammi dal bus",
|
|
10
|
+
"storage": "Storico e riepiloghi KNX",
|
|
11
|
+
"detection": "Anomalie e pattern",
|
|
8
12
|
"llmConnection": "Connessione Assistente AI",
|
|
9
|
-
"llmContext": "
|
|
10
|
-
"
|
|
13
|
+
"llmContext": "Conoscenza e contesto AI",
|
|
14
|
+
"chatAdapter": "Canali chat",
|
|
15
|
+
"homeIntelligence": "Casa proattiva e memoria",
|
|
16
|
+
"homeIntelligenceAdvanced": "Impostazioni proattive avanzate",
|
|
17
|
+
"advanced": "Provider e limiti"
|
|
11
18
|
},
|
|
12
19
|
"properties": {
|
|
13
20
|
"server": "Gateway",
|
|
@@ -39,19 +46,36 @@
|
|
|
39
46
|
"llmSystemPrompt": "Prompt di sistema",
|
|
40
47
|
"llmIncludeRaw": "Includi payload raw in hex",
|
|
41
48
|
"llmIncludeFlowContext": "Includi inventario del progetto Node-RED",
|
|
49
|
+
"llmAllowKnxCommands": "Consenti all'AI di leggere stati KNX e comandare attuatori",
|
|
50
|
+
"llmRequireCommandConfirmation": "Chiedi conferma prima di inviare comandi KNX",
|
|
51
|
+
"chatAdapterPreset": "Preset adattatore",
|
|
52
|
+
"chatInputCode": "Mappatura ingresso (chat → KNX AI)",
|
|
53
|
+
"chatOutputCode": "Mappatura uscita (KNX AI → chat)",
|
|
54
|
+
"proactiveEnabled": "Abilita notifiche domestiche proattive",
|
|
55
|
+
"proactiveRecipient": "Destinatario principale / chat ID",
|
|
56
|
+
"proactiveOpenMinutes": "Avvisa dopo apertura (minuti)",
|
|
57
|
+
"proactiveCooldownMinutes": "Intervallo prima di ripetere (minuti)",
|
|
58
|
+
"proactiveQuietStart": "Inizio ore silenziose",
|
|
59
|
+
"proactiveQuietEnd": "Fine ore silenziose",
|
|
60
|
+
"homeMemoryMaxKb": "Dimensione massima memoria casa (KB)",
|
|
61
|
+
"aiEducation": "Educazione AI (gestita dall'utente)",
|
|
42
62
|
"llmIncludeDocsSnippets": "Includi estratti documentazione (help/README/esempi)",
|
|
43
63
|
"llmDocsLanguage": "Lingua documentazione"
|
|
44
64
|
},
|
|
45
65
|
"outputs": {
|
|
46
66
|
"summary": "Summary/Statistiche",
|
|
47
67
|
"anomalies": "Anomalie",
|
|
48
|
-
"assistant": "Assistente AI"
|
|
68
|
+
"assistant": "Assistente AI",
|
|
69
|
+
"knxCommands": "Operazioni KNX"
|
|
49
70
|
},
|
|
50
71
|
"selectlists": {
|
|
51
72
|
"llmProvider": {
|
|
52
73
|
"openai_compat": "Compatibile OpenAI (chat/completions)",
|
|
53
74
|
"anthropic": "Anthropic (Claude)",
|
|
54
75
|
"ollama": "Ollama (locale, beta)"
|
|
76
|
+
},
|
|
77
|
+
"chatAdapter": {
|
|
78
|
+
"none": "Nessun adattatore"
|
|
55
79
|
}
|
|
56
80
|
},
|
|
57
81
|
"buttons": {
|
|
@@ -69,13 +93,20 @@
|
|
|
69
93
|
"installedOllamaModel": "Modello Ollama installato",
|
|
70
94
|
"installOllamaModelFailed": "Installazione modello Ollama non riuscita",
|
|
71
95
|
"ollamaInstallSteps": "1) Apri la libreria, scegli un modello e copiane il nome (es. llama3.1). 2) Inserisci il nome nel campo Modello e clicca Installalo.",
|
|
72
|
-
"ollamaStartedAuto": "Server Ollama avviato automaticamente."
|
|
96
|
+
"ollamaStartedAuto": "Server Ollama avviato automaticamente.",
|
|
97
|
+
"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.",
|
|
98
|
+
"chatAdapterCodeHelp": "Le mappature sono sincrone. Restituisci msg per continuare oppure nessun valore per scartarlo. Gli errori vengono intercettati e segnalati senza arrestare Node-RED.",
|
|
99
|
+
"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.",
|
|
100
|
+
"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.",
|
|
101
|
+
"homeMemoryLimitHelp": "La memoria Markdown viene riscritta atomicamente ogni 15 minuti ed è sempre limitata tra 64 e 1.024 KB. Le osservazioni vecchie vengono eliminate prima delle abitudini e degli oggetti semantici."
|
|
73
102
|
},
|
|
74
103
|
"placeholder": {
|
|
75
104
|
"llmBaseUrl": "https://api.openai.com/v1/chat/completions (o endpoint compatibile)",
|
|
76
105
|
"llmApiKey": "Incolla la chiave (inizia con sk-)",
|
|
77
106
|
"llmModel": "es. gpt-4o-mini",
|
|
78
|
-
"llmSystemPrompt": "Opzionale. Lascia vuoto per default."
|
|
107
|
+
"llmSystemPrompt": "Opzionale. Lascia vuoto per default.",
|
|
108
|
+
"proactiveRecipient": "Opzionale: chat ID Telegram; altrimenti viene ricordata l'ultima sessione chat",
|
|
109
|
+
"aiEducation": "Esempio: non avvisarmi tra le 23:00 e le 07:00. La persiana dello studio può restare aperta di notte."
|
|
79
110
|
},
|
|
80
111
|
"sidebar": {
|
|
81
112
|
"ui": {
|