node-red-contrib-knx-ultimate 6.2.0 → 6.2.2
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 +14 -4
- package/examples/KNX AI - Telegrambot Direct Chat.json +18 -0
- package/nodes/knxUltimateAI.html +361 -251
- package/nodes/knxUltimateAI.js +491 -17
- package/nodes/locales/de/knxUltimateAI.html +50 -31
- package/nodes/locales/de/knxUltimateAI.json +27 -9
- package/nodes/locales/en/knxUltimateAI.html +54 -30
- package/nodes/locales/en/knxUltimateAI.json +27 -9
- package/nodes/locales/es/knxUltimateAI.html +50 -31
- package/nodes/locales/es/knxUltimateAI.json +27 -9
- package/nodes/locales/fr/knxUltimateAI.html +50 -31
- package/nodes/locales/fr/knxUltimateAI.json +27 -9
- package/nodes/locales/it/knxUltimateAI.html +54 -30
- package/nodes/locales/it/knxUltimateAI.json +27 -9
- package/nodes/locales/zh-CN/knxUltimateAI.html +50 -31
- package/nodes/locales/zh-CN/knxUltimateAI.json +27 -9
- package/nodes/utils/knxAiHomeMemory.js +507 -0
- package/package.json +2 -2
|
@@ -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
|
-
|
|
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` :
|
|
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.
|
|
@@ -53,10 +87,7 @@ Voici tous les champs tels qu'affichés dans l'éditeur KNX AI.
|
|
|
53
87
|
- **Topic** : topic de base utilisé dans les sorties.
|
|
54
88
|
- Bouton **Open KNX AI Web** : ouvre le dashboard web (`/knxUltimateAI/sidebar/page`).
|
|
55
89
|
|
|
56
|
-
|
|
57
|
-
- **Capture GroupValue_Write** : capture les télégrammes Write.
|
|
58
|
-
- **Capture GroupValue_Response** : capture les télégrammes Response.
|
|
59
|
-
- **Capture GroupValue_Read** : capture les télégrammes Read.
|
|
90
|
+
KNX AI écoute automatiquement les télégrammes `GroupValue_Write`, `GroupValue_Response` et `GroupValue_Read`. L'analyse des motifs et anomalies est toujours initialisée avec les valeurs intégrées par défaut ; aucune configuration des événements du bus ou de la détection n'est nécessaire.
|
|
60
91
|
|
|
61
92
|
### Analysis
|
|
62
93
|
- **Analysis window (seconds)** : fenêtre principale pour résumé/débits.
|
|
@@ -66,16 +97,6 @@ Voici tous les champs tels qu'affichés dans l'éditeur KNX AI.
|
|
|
66
97
|
- **Max stored events** : nombre maximal de télégrammes en mémoire.
|
|
67
98
|
- **Auto emit summary (seconds, 0=off)** : intervalle périodique d'émission du résumé.
|
|
68
99
|
- **Top list size** : nombre de group addresses/sources dans le top.
|
|
69
|
-
- **Detect simple patterns (A -> B)** : active la détection de transitions/patterns.
|
|
70
|
-
- **Pattern max lag (ms)** : écart temporel max pour corrélation des patterns.
|
|
71
|
-
- **Pattern min occurrences** : occurrences minimales avant signalement.
|
|
72
|
-
|
|
73
|
-
### Anomalies
|
|
74
|
-
- **Rate window (seconds)** : fenêtre glissante pour contrôles de débit.
|
|
75
|
-
- **Max overall telegrams/sec (0=off)** : seuil sur le bus global.
|
|
76
|
-
- **Max telegrams/sec per GA (0=off)** : seuil par group address.
|
|
77
|
-
- **Flap window (seconds)** : fenêtre de détection flapping/changements rapides.
|
|
78
|
-
- **Max changes per GA in window (0=off)** : nombre max de changements autorisés.
|
|
79
100
|
|
|
80
101
|
### Assistant IA
|
|
81
102
|
- **Enable LLM assistant** : active les fonctions Ask/chat.
|
|
@@ -84,30 +105,28 @@ Voici tous les champs tels qu'affichés dans l'éditeur KNX AI.
|
|
|
84
105
|
- **API key** : clé API (non requise avec Ollama local).
|
|
85
106
|
- **Model** : ID/nom du modèle.
|
|
86
107
|
- **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.
|
|
87
|
-
- **System prompt** : instruction système globale pour l'analyse KNX (Advanced).
|
|
88
108
|
- **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.
|
|
89
109
|
- **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.
|
|
90
|
-
- **Préréglage d’adaptateur** :
|
|
91
|
-
- **Mappage d’entrée (chat → KNX AI)** : JavaScript synchrone exécuté avant le traitement de la commande d’entrée.
|
|
92
|
-
- **Mappage de sortie (KNX AI → chat)** : JavaScript synchrone appliqué uniquement aux messages de la sortie 3.
|
|
110
|
+
- **Préréglage d’adaptateur** : utilise **Aucun adaptateur** par défaut. Les éditeurs JavaScript restent masqués jusqu’à la sélection d’un adaptateur, puis les mappages entrée/sortie modifiables sont chargés et affichés.
|
|
111
|
+
- **Mappage d’entrée (chat → KNX AI)** : JavaScript synchrone exécuté avant le traitement de la commande d’entrée dans l’éditeur JavaScript vert.
|
|
112
|
+
- **Mappage de sortie (KNX AI → chat)** : JavaScript synchrone appliqué uniquement aux messages de la sortie 3 dans l’éditeur JavaScript jaune.
|
|
113
|
+
- **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.
|
|
114
|
+
- **Destinataire principal / ID de chat** : destination facultative des messages spontanés ; sinon la dernière session Ask est mémorisée.
|
|
115
|
+
- **Notifier après ouverture (minutes)** : seuil de durée avant d'envisager une notification proactive ; 120 minutes par défaut.
|
|
116
|
+
- **Début / fin des heures silencieuses** : intervalle quotidien pendant lequel les messages proactifs sont supprimés.
|
|
117
|
+
- **Éducation de l’IA** : consignes autoritaires gérées uniquement par l'utilisateur, lues par l'IA et jamais modifiées.
|
|
118
|
+
- **Délai de répétition (minutes)** : intervalle minimal avant qu'un même objet puisse notifier à nouveau ; 360 minutes par défaut.
|
|
119
|
+
- **Taille maximale du fichier mémoire domestique (KB)** : limite stricte de 64 à 1 024 KB ; 256 KB par défaut.
|
|
93
120
|
- 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
|
-
- **Include raw payload hex** : inclut le payload hex brut dans le prompt.
|
|
95
121
|
- **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.
|
|
96
|
-
-
|
|
97
|
-
- **Docs language** : langue préférée des
|
|
98
|
-
- Bouton **Refresh** : interroge le provider et charge les modèles disponibles.
|
|
122
|
+
- Les extraits pertinents de l’aide, du README et des exemples sont toujours inclus automatiquement.
|
|
123
|
+
- **Docs language** : langue préférée des extraits de documentation inclus automatiquement.
|
|
124
|
+
- Bouton **Refresh** : interroge le provider et charge les modèles disponibles. Son icône tourne pendant le chargement ; une réussite ne produit volontairement aucun message.
|
|
99
125
|
|
|
100
126
|
### Advanced
|
|
101
127
|
- **Analysis window (seconds)** : fenêtre principale pour résumé/débits.
|
|
102
128
|
- **Max stored events** : nombre maximal de télégrammes en mémoire.
|
|
103
129
|
- **Top list size** : nombre de group addresses/sources dans le top.
|
|
104
|
-
- **Pattern max lag (ms)** : écart temporel max pour corrélation des patterns.
|
|
105
|
-
- **Pattern min occurrences** : occurrences minimales avant signalement.
|
|
106
|
-
- **Rate window (seconds)** : fenêtre glissante pour contrôles de débit.
|
|
107
|
-
- **Max overall telegrams/sec (0=off)** : seuil sur le bus global.
|
|
108
|
-
- **Max telegrams/sec per GA (0=off)** : seuil par group address.
|
|
109
|
-
- **Flap window (seconds)** : fenêtre de détection flapping/changements rapides.
|
|
110
|
-
- **Max changes per GA in window (0=off)** : nombre max de changements autorisés.
|
|
111
130
|
|
|
112
131
|
### Démarrage rapide Ollama (local)
|
|
113
132
|
- Choisir **Provider = Ollama**.
|
|
@@ -2,14 +2,19 @@
|
|
|
2
2
|
"knxUltimateAI": {
|
|
3
3
|
"title": "KNX AI (Traffic Analyzer)",
|
|
4
4
|
"sections": {
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
"
|
|
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": "
|
|
11
|
-
"chatAdapter": "
|
|
12
|
-
"
|
|
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
|
-
|
|
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
|
|
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.
|
|
@@ -54,9 +92,7 @@ Di seguito sono elencati tutti i campi presenti nell'editor del nodo KNX AI.
|
|
|
54
92
|
- Pulsante **Open KNX AI Web**: apre la dashboard web completa (`/knxUltimateAI/sidebar/page`).
|
|
55
93
|
|
|
56
94
|
### Cattura
|
|
57
|
-
|
|
58
|
-
- **Cattura GroupValue_Response**: cattura telegrammi di risposta.
|
|
59
|
-
- **Cattura GroupValue_Read**: cattura telegrammi di lettura.
|
|
95
|
+
KNX AI ascolta automaticamente i telegrammi `GroupValue_Write`, `GroupValue_Response` e `GroupValue_Read`. L'analisi di pattern e anomalie viene sempre inizializzata con i valori predefiniti interni, quindi non occorre configurare i tipi di telegramma o il rilevamento.
|
|
60
96
|
|
|
61
97
|
### Analisi
|
|
62
98
|
- **Finestra analisi (secondi)**: finestra principale per summary/rate.
|
|
@@ -66,16 +102,6 @@ Di seguito sono elencati tutti i campi presenti nell'editor del nodo KNX AI.
|
|
|
66
102
|
- **Eventi massimi in memoria**: numero massimo di telegrammi mantenuti in RAM.
|
|
67
103
|
- **Invia summary automatico (secondi, 0=off)**: intervallo di emissione summary periodica.
|
|
68
104
|
- **Dimensione lista Top**: numero di group address/sorgenti nella classifica summary.
|
|
69
|
-
- **Rileva pattern semplici (A -> B)**: abilita rilevamento transizioni/pattern.
|
|
70
|
-
- **Ritardo massimo pattern (ms)**: differenza temporale massima per correlare pattern.
|
|
71
|
-
- **Occorrenze minime pattern**: soglia minima prima di segnalare un pattern.
|
|
72
|
-
|
|
73
|
-
### Anomalie
|
|
74
|
-
- **Finestra rate (secondi)**: finestra scorrevole per i controlli di rate.
|
|
75
|
-
- **Max telegrammi/sec totale (0=off)**: soglia telegrammi/s sull'intero BUS.
|
|
76
|
-
- **Max telegrammi/sec per GA (0=off)**: soglia telegrammi/s per singolo group address.
|
|
77
|
-
- **Finestra flap (secondi)**: finestra temporale per rilevare flapping/cambi rapidi.
|
|
78
|
-
- **Max cambi per GA nella finestra (0=off)**: massimo numero di cambi consentiti.
|
|
79
105
|
|
|
80
106
|
### Assistente AI
|
|
81
107
|
- **Abilita assistente LLM**: abilita funzioni Ask/chat.
|
|
@@ -84,30 +110,28 @@ Di seguito sono elencati tutti i campi presenti nell'editor del nodo KNX AI.
|
|
|
84
110
|
- **API key**: chiave API (non necessaria con Ollama locale).
|
|
85
111
|
- **Modello**: ID/nome modello.
|
|
86
112
|
- **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.
|
|
87
|
-
- **Prompt di sistema**: istruzione globale del comportamento analisi KNX (Advanced).
|
|
88
113
|
- **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.
|
|
89
114
|
- **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.
|
|
90
|
-
- **Preset adattatore**:
|
|
91
|
-
- **Mappatura ingresso (chat → KNX AI)**: JavaScript sincrono applicato prima dell'elaborazione del comando in ingresso.
|
|
92
|
-
- **Mappatura uscita (KNX AI → chat)**: JavaScript sincrono applicato solo ai messaggi dell'uscita 3.
|
|
115
|
+
- **Preset adattatore**: parte da **Nessun adattatore**. Gli editor JavaScript restano nascosti finché non viene selezionato un adattatore; la selezione carica e mostra la coppia di mappature ingresso/uscita modificabile.
|
|
116
|
+
- **Mappatura ingresso (chat → KNX AI)**: JavaScript sincrono applicato prima dell'elaborazione del comando in ingresso. Usa l'editor JavaScript verde.
|
|
117
|
+
- **Mappatura uscita (KNX AI → chat)**: JavaScript sincrono applicato solo ai messaggi dell'uscita 3. Usa l'editor JavaScript giallo.
|
|
118
|
+
- **Abilita notifiche domestiche proattive**: rilevatore opzionale per stati aperti affidabili di persiane/finestre/porte; non scrive mai autonomamente su KNX.
|
|
119
|
+
- **Destinatario principale / chat ID**: destinazione opzionale dei messaggi spontanei; altrimenti viene ricordata l'ultima sessione Ask.
|
|
120
|
+
- **Avvisa dopo apertura (minuti)**: soglia di durata dell'apertura prima di valutare una notifica proattiva; 120 minuti per default.
|
|
121
|
+
- **Inizio / fine ore silenziose**: intervallo giornaliero in cui i messaggi proattivi sono sospesi.
|
|
122
|
+
- **Educazione AI**: istruzioni autorevoli gestite soltanto dall'utente, lette dall'AI e mai modificate.
|
|
123
|
+
- **Cooldown ripetizione (minuti)**: intervallo minimo prima che lo stesso oggetto possa generare un altro avviso; 360 minuti per default.
|
|
124
|
+
- **Dimensione massima memoria domestica (KB)**: limite rigido da 64 a 1.024 KB; 256 KB per default.
|
|
93
125
|
- 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
|
-
- **Includi payload raw in hex**: include payload raw esadecimale nel prompt.
|
|
95
126
|
- **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.
|
|
96
|
-
-
|
|
97
|
-
- **Lingua documentazione**: lingua preferita per gli estratti
|
|
98
|
-
- Pulsante **Aggiorna**: interroga il provider e popola i modelli disponibili.
|
|
127
|
+
- Gli estratti pertinenti di help, README ed esempi vengono sempre inclusi automaticamente.
|
|
128
|
+
- **Lingua documentazione**: lingua preferita per gli estratti documentali inclusi automaticamente.
|
|
129
|
+
- Pulsante **Aggiorna**: interroga il provider e popola i modelli disponibili. Durante il caricamento l'icona ruota; il completamento corretto non mostra messaggi.
|
|
99
130
|
|
|
100
131
|
### Advanced
|
|
101
132
|
- **Finestra analisi (secondi)**: finestra principale per summary/rate.
|
|
102
133
|
- **Eventi massimi in memoria**: numero massimo di telegrammi mantenuti in RAM.
|
|
103
134
|
- **Dimensione lista Top**: numero di group address/sorgenti nella classifica summary.
|
|
104
|
-
- **Ritardo massimo pattern (ms)**: differenza temporale massima per correlare pattern.
|
|
105
|
-
- **Occorrenze minime pattern**: soglia minima prima di segnalare un pattern.
|
|
106
|
-
- **Finestra rate (secondi)**: finestra scorrevole per i controlli di rate.
|
|
107
|
-
- **Max telegrammi/sec totale (0=off)**: soglia telegrammi/s sull'intero BUS.
|
|
108
|
-
- **Max telegrammi/sec per GA (0=off)**: soglia telegrammi/s per singolo group address.
|
|
109
|
-
- **Finestra flap (secondi)**: finestra temporale per rilevare flapping/cambi rapidi.
|
|
110
|
-
- **Max cambi per GA nella finestra (0=off)**: massimo numero di cambi consentiti.
|
|
111
135
|
|
|
112
136
|
### Setup rapido Ollama (locale)
|
|
113
137
|
- Seleziona **Provider = Ollama**.
|
|
@@ -2,14 +2,19 @@
|
|
|
2
2
|
"knxUltimateAI": {
|
|
3
3
|
"title": "KNX AI (Analisi Traffico)",
|
|
4
4
|
"sections": {
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
"
|
|
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",
|
|
9
12
|
"llmConnection": "Connessione Assistente AI",
|
|
10
|
-
"llmContext": "
|
|
11
|
-
"chatAdapter": "
|
|
12
|
-
"
|
|
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"
|
|
13
18
|
},
|
|
14
19
|
"properties": {
|
|
15
20
|
"server": "Gateway",
|
|
@@ -46,6 +51,14 @@
|
|
|
46
51
|
"chatAdapterPreset": "Preset adattatore",
|
|
47
52
|
"chatInputCode": "Mappatura ingresso (chat → KNX AI)",
|
|
48
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)",
|
|
49
62
|
"llmIncludeDocsSnippets": "Includi estratti documentazione (help/README/esempi)",
|
|
50
63
|
"llmDocsLanguage": "Lingua documentazione"
|
|
51
64
|
},
|
|
@@ -82,13 +95,18 @@
|
|
|
82
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.",
|
|
83
96
|
"ollamaStartedAuto": "Server Ollama avviato automaticamente.",
|
|
84
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.",
|
|
85
|
-
"chatAdapterCodeHelp": "Le mappature sono sincrone. Restituisci msg per continuare oppure nessun valore per scartarlo. Gli errori vengono intercettati e segnalati senza arrestare Node-RED."
|
|
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."
|
|
86
102
|
},
|
|
87
103
|
"placeholder": {
|
|
88
104
|
"llmBaseUrl": "https://api.openai.com/v1/chat/completions (o endpoint compatibile)",
|
|
89
105
|
"llmApiKey": "Incolla la chiave (inizia con sk-)",
|
|
90
106
|
"llmModel": "es. gpt-4o-mini",
|
|
91
|
-
"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."
|
|
92
110
|
},
|
|
93
111
|
"sidebar": {
|
|
94
112
|
"ui": {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<script type="text/markdown" data-help-name="knxUltimateAI">
|
|
2
2
|
此节点会监听所选 KNX Ultimate 网关上的**所有 KNX 电报**,生成流量统计、检测异常,并可选调用 LLM。
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
编辑器使用三个主要折叠面板:**AI 助手**包含配置、知识/上下文以及提供商限制;**对话与家庭**包含聊天渠道、主动家庭和受限记忆;**KNX 总线流量分析**包含总线报文、历史/摘要以及异常/模式。打开一个主要面板即可同时看到其中全部相关选项。已保存字段的 ID 和值保持不变。
|
|
5
5
|
|
|
6
6
|
## 输出
|
|
7
7
|
1. **摘要/统计**(`msg.payload` 为 JSON)
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
## 命令(输入)
|
|
15
15
|
发送 `msg.topic`:
|
|
16
16
|
- `summary`(或空):立即输出摘要
|
|
17
|
-
- `reset
|
|
17
|
+
- `reset`:清空内部历史、计数器和已学习的家庭记忆;AI 教育保持不变
|
|
18
18
|
- `ask`:向已配置的 LLM 提问
|
|
19
19
|
- `confirm` / `cancel`:无需再次调用 LLM,即可确认或取消待处理的 KNX 命令
|
|
20
20
|
- `clear_chat`:清除当前会话的对话记忆
|
|
@@ -35,6 +35,40 @@
|
|
|
35
35
|
|
|
36
36
|
随附的 **windkh/node-red-contrib-telegrambot** 预设遵循该包的 receiver/sender 消息约定。把 `telegram receiver` 直接连接到 KNX AI,并把输出 3 直接连接到 `telegram sender`。如需内联确认按钮,还要把配置为 `callback_query` 的 `telegram event` 连接到同一个 KNX AI 输入。输入映射会提取 `msg.payload.content`、`msg.payload.chatId` 和 Telegram 语言;输出映射会创建所需的 `msg.payload.chatId`、`type` 和 `content`,并在写入等待确认时从 `msg.knxAi.confirmationRequest` 添加 `options.reply_markup`。Telegram 包仍是独立的可选依赖项。
|
|
37
37
|
|
|
38
|
+
## 主动家庭智能与有限记忆
|
|
39
|
+
**对话与家庭**中的**主动家庭与记忆**子部分以可选方式启用主动通知。节点会根据 ETS 层级、名称、角色和 DPT,使用意大利语、英语、德语、法语、西班牙语和中文术语,为卷帘、窗户、门、照明、温度、气候、占用和报警建立确定性的语义模型。首个主动检测器只监视可靠识别且非命令的卷帘/窗户/门状态。超过配置的打开时间且当前不在静默时段时,输出 3 会发送本地化消息,并设置 `msg.knxAi.type = "proactive_notification"`。节点绝不会主动使用输出 4,也不会自行修改 KNX;用户之后提出的任何操作仍须经过正常的校验与确认。
|
|
40
|
+
|
|
41
|
+
最近一次聊天会话会被记为主人,也可以通过**主要接收者 / 聊天 ID**明确指定。合成的 `msg.inputMessage` 会保留接收者,使 Telegram 适配器能够发送主动通知。冷却时间和每小时最多三条主动通知可防止消息泛滥。
|
|
42
|
+
|
|
43
|
+
学习到的参考文件会在启动时从 `<userDir>/knxai/memory/knxai-home-memory-<node-id>.md` 加载,每 15 分钟以原子方式重写,并严格限制在可配置的 64–1,024 KB(默认 256 KB)。最多保留 120 条重要观察、80 条聚合习惯、80 条通知和 300 个 ETS 语义对象,绝不会保存无限的原始报文流。较旧且优先级较低的项目会先被删除。**AI 教育**最多 16,000 个字符,并且始终来自节点配置:AI 可以将其作为权威指导读取,但不能修改或覆盖。如果已填写 AI 教育但 LLM 无法进行评估,候选通知会被抑制,以免违反用户指导。
|
|
44
|
+
|
|
45
|
+
## 实用配置示例
|
|
46
|
+
此示例创建一个简洁的助手:它会报告重要的长时间开启状态,但允许书房卷帘保持开启。
|
|
47
|
+
|
|
48
|
+
| 编辑器字段 | 示例值 | 结果 |
|
|
49
|
+
|---|---|---|
|
|
50
|
+
| **启用主动家庭通知** (`proactiveEnabled`) | 启用 | 节点评估可靠识别的卷帘、窗户和门开启状态。 |
|
|
51
|
+
| **主要接收者 / 聊天 ID** (`proactiveRecipient`) | `123456789` | 主动消息发送到该聊天;留空则记住最近一次 Ask 会话。 |
|
|
52
|
+
| **开启多久后通知** (`proactiveOpenMinutes`) | `120` | 开启两小时后评估是否需要通知。 |
|
|
53
|
+
| **静默时间开始 / 结束** | `23:00` / `07:00` | 夜间不会发送主动消息。 |
|
|
54
|
+
| **重复冷却时间** (`proactiveCooldownMinutes`) | `360` | 同一对象六小时内不会再次通知。 |
|
|
55
|
+
| **家庭记忆文件上限** (`homeMemoryMaxKb`) | `256` | 此节点的 Markdown 参考文件始终小于 256 KB。 |
|
|
56
|
+
|
|
57
|
+
**AI 教育** (`aiEducation`) 示例:
|
|
58
|
+
|
|
59
|
+
```text
|
|
60
|
+
称呼我为 Alex,并使用与我相同的语言回答。
|
|
61
|
+
除非我要求技术细节,否则回答要简短。
|
|
62
|
+
书房卷帘白天可以保持开启:不要因此通知我。
|
|
63
|
+
其他卷帘、窗户或门异常长时间开启时请通知我。
|
|
64
|
+
如果“客厅灯”指向多个灯,请先询问我具体是哪一个。
|
|
65
|
+
在 KNX 状态对象确认之前,绝不要声称执行器已经改变。
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
使用这些设置后,客厅卷帘开启 120 分钟时,输出 3 可以发送本地化的 `proactive_notification`;而书房卷帘的候选通知会根据 AI 教育被抑制。如果 Alex 随后要求关闭客厅卷帘,KNX AI 会准备准确的 ETS 命令,但在输出 4 前仍执行正常的验证与确认。
|
|
69
|
+
|
|
70
|
+
请使用清晰的 ETS 层级和对象名称,并正确设置状态/命令角色。AI 教育可以个性化决策和措辞,但不能虚构组地址、更改 DPT 或绕过 KNX 验证。
|
|
71
|
+
|
|
38
72
|
## 快速工作流程:KNX 控制
|
|
39
73
|
1. 将 ETS CSV 导入网关,并配置 LLM 提供商、模型和凭据。
|
|
40
74
|
2. 启用 **LLM 助手**和 **读取 KNX 状态并控制执行器**;保持确认选项启用。
|
|
@@ -53,10 +87,7 @@
|
|
|
53
87
|
- **Topic**:节点输出使用的基础 topic。
|
|
54
88
|
- **Open KNX AI Web** 按钮:打开网页仪表板(`/knxUltimateAI/sidebar/page`)。
|
|
55
89
|
|
|
56
|
-
|
|
57
|
-
- **Capture GroupValue_Write**:抓取 Write 电报。
|
|
58
|
-
- **Capture GroupValue_Response**:抓取 Response 电报。
|
|
59
|
-
- **Capture GroupValue_Read**:抓取 Read 电报。
|
|
90
|
+
KNX AI 会自动监听 `GroupValue_Write`、`GroupValue_Response` 和 `GroupValue_Read` 报文。模式和异常分析始终使用内置默认值初始化,无需配置总线事件或检测参数。
|
|
60
91
|
|
|
61
92
|
### Analysis
|
|
62
93
|
- **Analysis window (seconds)**:摘要/速率统计主窗口。
|
|
@@ -66,16 +97,6 @@
|
|
|
66
97
|
- **Max stored events**:内存中保留的最大电报数量。
|
|
67
98
|
- **Auto emit summary (seconds, 0=off)**:周期性输出摘要间隔。
|
|
68
99
|
- **Top list size**:摘要中 top 组地址/来源数量。
|
|
69
|
-
- **Detect simple patterns (A -> B)**:启用组地址转移/模式检测。
|
|
70
|
-
- **Pattern max lag (ms)**:模式关联允许的最大时间差。
|
|
71
|
-
- **Pattern min occurrences**:报告模式前的最小出现次数。
|
|
72
|
-
|
|
73
|
-
### Anomalies
|
|
74
|
-
- **Rate window (seconds)**:异常速率检查滑动窗口。
|
|
75
|
-
- **Max overall telegrams/sec (0=off)**:全总线 telegram/s 阈值。
|
|
76
|
-
- **Max telegrams/sec per GA (0=off)**:单组地址 telegram/s 阈值。
|
|
77
|
-
- **Flap window (seconds)**:抖动/快速变化检测窗口。
|
|
78
|
-
- **Max changes per GA in window (0=off)**:窗口内允许的最大变化次数。
|
|
79
100
|
|
|
80
101
|
### AI 助手
|
|
81
102
|
- **Enable LLM assistant**:启用 Ask/chat 功能。
|
|
@@ -84,30 +105,28 @@
|
|
|
84
105
|
- **API key**:API Key(本地 Ollama 可不填)。
|
|
85
106
|
- **Model**:模型 ID/名称。
|
|
86
107
|
- **聊天模型兼容性**:所选模型必须支持已配置的 Chat Completions 端点。刷新模型列表时,会排除仅支持旧版 completions 的模型,例如 `gpt-3.5-turbo-instruct`。如果提供商拒绝自定义 temperature 值或令牌限制参数,KNX AI 会仅移除或替换不兼容字段后重试。
|
|
87
|
-
- **System prompt**:KNX 分析全局系统提示词(Advanced)。
|
|
88
108
|
- **允许 AI 读取 KNX 状态并控制执行器**:启用输出 4,默认关闭。可以读取 ETS 目录中的精确对象;仅接受写入明确标记为 `command` 的对象。未知、DPT 不匹配、无效或数量过多的操作,以及向状态或中性对象的写入,都会在本地被拒绝。
|
|
89
109
|
- **发送 KNX 命令前请求确认**:默认启用。先显示已验证的修改,在同一聊天会话确认前不会发送任何 KNX 命令。有命令等待确认时,回复始终会使用当前请求的语言附加准确的确认或取消说明。命令会在输出前再次验证。
|
|
90
|
-
-
|
|
91
|
-
- **输入映射(聊天 → KNX AI)**:在处理输入命令前运行的同步 JavaScript
|
|
92
|
-
- **输出映射(KNX AI → 聊天)**:仅应用于输出 3 消息的同步 JavaScript
|
|
110
|
+
- **适配器预设**:默认为**无适配器**。选择适配器前会隐藏 JavaScript 编辑器;选择后会加载并显示可编辑的输入和输出映射。
|
|
111
|
+
- **输入映射(聊天 → KNX AI)**:在处理输入命令前运行的同步 JavaScript,使用绿色 JavaScript 编辑器。
|
|
112
|
+
- **输出映射(KNX AI → 聊天)**:仅应用于输出 3 消息的同步 JavaScript,使用黄色 JavaScript 编辑器。
|
|
113
|
+
- **启用主动家庭通知**:可选检测器,仅处理可靠识别的卷帘、窗户和门开启状态;绝不会自主写入 KNX。
|
|
114
|
+
- **主要接收者 / 聊天 ID**:主动消息的可选目标;未填写时记住最近一次 Ask 会话。
|
|
115
|
+
- **开启多久后通知(分钟)**:考虑发送主动通知前的开启时长阈值;默认 120 分钟。
|
|
116
|
+
- **静默时间开始 / 结束**:每天禁止主动消息的时间段。
|
|
117
|
+
- **AI 教育**:仅由用户管理的权威指导,AI 可以读取但永远不能修改。
|
|
118
|
+
- **重复冷却时间(分钟)**:同一对象再次通知前的最短间隔;默认 360 分钟。
|
|
119
|
+
- **家庭记忆文件上限(KB)**:64 到 1,024 KB 的硬限制;默认 256 KB。
|
|
93
120
|
- 如果启用了磁盘归档,**Ask** 默认会查询该归档:若问题里写了明确日期/时间范围就按其查询,否则默认查询最近 24 小时并补上当前 RAM 事件。
|
|
94
|
-
- **Include raw payload hex**:在提示词中包含原始十六进制 payload。
|
|
95
121
|
- **包含 Node-RED 项目清单**:在提示词中加入整个 Node-RED 项目的节点清单,不仅包含 KNX 节点,也包含 function/change/inject/template 等在内且带有 KNX 逻辑或组地址的有用节点。
|
|
96
|
-
-
|
|
97
|
-
- **Docs language
|
|
98
|
-
- **Refresh** 按钮:请求 provider 并加载可用模型 ID
|
|
122
|
+
- 相关的帮助、README 和示例片段始终会自动包含。
|
|
123
|
+
- **Docs language**:自动包含的文档片段所使用的首选语言。
|
|
124
|
+
- **Refresh** 按钮:请求 provider 并加载可用模型 ID。加载期间图标会旋转;成功完成时不会显示额外消息。
|
|
99
125
|
|
|
100
126
|
### Advanced
|
|
101
127
|
- **Analysis window (seconds)**:摘要/速率统计主窗口。
|
|
102
128
|
- **Max stored events**:内存中保留的最大电报数量。
|
|
103
129
|
- **Top list size**:摘要中 top 组地址/来源数量。
|
|
104
|
-
- **Pattern max lag (ms)**:模式关联允许的最大时间差。
|
|
105
|
-
- **Pattern min occurrences**:报告模式前的最小出现次数。
|
|
106
|
-
- **Rate window (seconds)**:异常速率检查滑动窗口。
|
|
107
|
-
- **Max overall telegrams/sec (0=off)**:全总线 telegram/s 阈值。
|
|
108
|
-
- **Max telegrams/sec per GA (0=off)**:单组地址 telegram/s 阈值。
|
|
109
|
-
- **Flap window (seconds)**:抖动/快速变化检测窗口。
|
|
110
|
-
- **Max changes per GA in window (0=off)**:窗口内允许的最大变化次数。
|
|
111
130
|
|
|
112
131
|
### Ollama 快速配置(本地)
|
|
113
132
|
- 选择 **Provider = Ollama**。
|
|
@@ -2,14 +2,19 @@
|
|
|
2
2
|
"knxUltimateAI": {
|
|
3
3
|
"title": "KNX AI (Traffic Analyzer)",
|
|
4
4
|
"sections": {
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
"
|
|
5
|
+
"groupAssistant": "AI 助手",
|
|
6
|
+
"groupChatHome": "对话与家庭",
|
|
7
|
+
"groupKnxAnalysis": "KNX 总线流量分析",
|
|
8
|
+
"quickSetup": "助手配置",
|
|
9
|
+
"capture": "总线报文输入",
|
|
10
|
+
"storage": "KNX 历史与摘要",
|
|
11
|
+
"detection": "异常与模式",
|
|
9
12
|
"llmConnection": "AI 助手连接",
|
|
10
|
-
"llmContext": "AI
|
|
11
|
-
"chatAdapter": "
|
|
12
|
-
"
|
|
13
|
+
"llmContext": "AI 知识与上下文",
|
|
14
|
+
"chatAdapter": "聊天渠道",
|
|
15
|
+
"homeIntelligence": "主动家庭与记忆",
|
|
16
|
+
"homeIntelligenceAdvanced": "高级主动通知设置",
|
|
17
|
+
"advanced": "提供商与限制"
|
|
13
18
|
},
|
|
14
19
|
"properties": {
|
|
15
20
|
"server": "Gateway",
|
|
@@ -46,6 +51,14 @@
|
|
|
46
51
|
"chatAdapterPreset": "适配器预设",
|
|
47
52
|
"chatInputCode": "输入映射(聊天 → KNX AI)",
|
|
48
53
|
"chatOutputCode": "输出映射(KNX AI → 聊天)",
|
|
54
|
+
"proactiveEnabled": "启用主动家庭通知",
|
|
55
|
+
"proactiveRecipient": "主要接收者 / 聊天 ID",
|
|
56
|
+
"proactiveOpenMinutes": "保持打开多少分钟后通知",
|
|
57
|
+
"proactiveCooldownMinutes": "重复通知冷却时间(分钟)",
|
|
58
|
+
"proactiveQuietStart": "静默时段开始",
|
|
59
|
+
"proactiveQuietEnd": "静默时段结束",
|
|
60
|
+
"homeMemoryMaxKb": "家庭记忆文件最大值(KB)",
|
|
61
|
+
"aiEducation": "AI 教育(由用户管理)",
|
|
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": "选择预设即可插入输入和输出映射代码。列表从随包提供的聊天适配器文件加载;生成的代码仍可编辑。",
|
|
77
|
-
"chatAdapterCodeHelp": "映射同步运行。返回 msg 以继续,或不返回值以丢弃消息。错误会被捕获并报告,不会停止 Node-RED。"
|
|
90
|
+
"chatAdapterCodeHelp": "映射同步运行。返回 msg 以继续,或不返回值以丢弃消息。错误会被捕获并报告,不会停止 Node-RED。",
|
|
91
|
+
"homeIntelligenceIntro": "节点会创建多语言 ETS 语义模型,并在可靠识别的卷帘、窗户或门长时间保持打开时主动通知聊天。它绝不会自行发送 KNX 命令。",
|
|
92
|
+
"aiEducationHelp": "只有用户可以编辑此部分。AI 会把它作为权威指导读取,但学习到的记忆绝不能覆盖它。最多 16,000 个字符。",
|
|
93
|
+
"homeMemoryLimitHelp": "Markdown 记忆每 15 分钟以原子方式重写,并始终限制在 64 到 1,024 KB。达到限制时会先删除较旧的观察,再删除习惯和语义对象。"
|
|
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": "可选:Telegram 聊天 ID;留空则记住最近一次聊天会话",
|
|
101
|
+
"aiEducation": "示例:23:00 到 07:00 之间不要通知我。书房卷帘夜间可以保持打开。"
|
|
84
102
|
},
|
|
85
103
|
"sidebar": {
|
|
86
104
|
"ui": {
|