node-red-contrib-knx-ultimate 6.3.16 → 6.3.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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
- 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.
4
+ L'éditeur utilise deux onglets horizontaux : **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.
5
5
 
6
6
  ## Sorties
7
7
  1. **Résumé/Stats** (`msg.payload` JSON)
@@ -21,6 +21,12 @@ Envoyez `msg.topic` :
21
21
 
22
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
23
 
24
+ Si le traitement dure plus de 1,2 seconde, la sortie 3 émet immédiatement le message intermédiaire localisé « Je réfléchis… », avec `msg.knxAi.type = "thinking"` et `msg.knxAi.transient = true`. L’adaptateur de chat l’envoie au même utilisateur, puis la réponse finale arrive normalement dès qu’elle est prête. Ce message de progression n’est jamais enregistré dans le contexte de conversation ni dans la mémoire apprise.
25
+
26
+ Les requêtes Ollama et Bionic LM Studio utilisent automatiquement un délai minimal de 10 minutes ; les fournisseurs cloud conservent un minimum de 2 minutes. Aucun champ de délai n’est à gérer dans l’éditeur. Si même la limite locale est atteinte, KNX AI indique que le modèle n’a pas terminé et conseille de réessayer ou de réduire le contexte du prompt.
27
+
28
+ L’état du nœud sur le canvas est volontairement réservé à la dernière demande reçue et au message localisé « Je réfléchis… » pendant l’exécution du LLM. Les télégrammes KNX, mises à jour de la passerelle, débits de trafic, messages ready et résultats techniques ne l’écrasent jamais ; ils restent disponibles via les sorties, les journaux et les données de l’Assistant.
29
+
24
30
  Chaque session Ask/chat conserve ses 8 derniers échanges et jusqu'à 20 instructions explicites à long terme, séparées par `msg.knxAi.sessionId`, `msg.sessionId` ou l’ID de chat Telegram détecté. Les demandes telles que « Souviens-toi de ne pas employer le terme unknown » deviennent des instructions persistantes. Tous les nœuds KNX AI utilisant le même stockage partagent ce contexte en direct et le rechargent après un redémarrage de Node-RED depuis `knxultimatestorage/knxai/memory/knxai-chat-context.md`. Le fichier, écrit de façon atomique, est limité à 50 sessions et 512 Ko. Lorsque le contrôle KNX est activé, 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
31
  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
32
 
@@ -31,7 +37,7 @@ Lorsque l’utilisateur demande explicitement un état actuel ou actualisé, l
31
37
  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
38
 
33
39
  ### 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.
40
+ L’onglet **Adaptateurs de chat** charge ses mappages sélectionnables depuis `resources/KNXAIChatAdapterMappings.js`. Le choix d’un préréglage installe en interne deux mappages JavaScript synchrones prédéfinis : un avant le traitement de l’entrée par KNX AI et un avant l’émission sur la sortie 3. Les mappages restent masqués dans l’éditeur. Les erreurs de syntaxe et d’exécution sont interceptées et signalées sans arrêter Node-RED.
35
41
 
36
42
  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
43
 
@@ -42,31 +48,30 @@ Les paquets de caméra installés peuvent publier à l’exécution un adaptateu
42
48
 
43
49
  L’utilisateur peut demander une capture actuelle ou demander au modèle de vision ce qui est visible. Les préréglages Telegram et RedBot envoient l’image comme photo native avec une légende. L’utilisateur peut aussi créer des notifications persistantes pour un mouvement, le franchissement d’une ligne intelligente ou l’entrée dans une zone d’intrusion/de stationnement, avec une limitation facultative aux personnes détectées et à une ligne ou zone nommée précise. Ces règles sont stockées dans le même fichier `knxai-chat-context.md` et restaurées après les redémarrages de Node-RED. Les abonnements aux événements UniFi et les demandes de capture passent directement par le fournisseur détecté ; la sortie 4 de KNX AI et un câblage intermédiaire ne sont pas nécessaires.
44
50
 
45
- ## Intelligence domestique proactive et mémoire limitée
46
- 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.
51
+ ### Annonces avec TTS Ultimate
52
+ Lorsque le paquet facultatif `node-red-contrib-tts-ultimate` est installé, il apparaît parmi les adaptateurs détectés automatiquement. Le sélecteur recense tous les nœuds `ttsultimate` de tous les flows du projet, avec le flow, le nom du nœud et le lecteur configuré. Sélectionnez le nœud chargé des annonces du chat, puis déployez le flow.
47
53
 
48
- 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.
54
+ Seule une demande explicite dans le message de chat actuel peut créer une annonce. KNX AI envoie le texte exact directement au nœud choisi dans `msg.payload`, avec `msg.topic = "knx_ai_announcement"` ; aucun câblage intermédiaire n’est nécessaire. TTS Ultimate gère ensuite le lecteur Sonos configuré, la voix, le volume, le signal d’introduction et la file d’attente. Le contexte persistant, l’Éducation IA, le contenu des caméras et les événements déduits ne déclenchent jamais la parole de manière autonome.
49
55
 
50
- La référence apprise partagée est chargée au démarrage depuis `<userDir>/knxai/memory/knxai-home-memory.md`, réécrite atomiquement toutes les 15 minutes et toujours strictement limitée à 5 Mo. 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.
56
+ ### Aperçu du contexte du chat
57
+ L’éditeur du nœud affiche une carte compacte résumant les sources disponibles pour le chat : trafic KNX actuel, sémantique ETS et projet Node-RED, mémoire de session et de la maison, Éducation IA, caméras détectées et documentation pertinente. Elle répertorie aussi `knxai-chat-context.md`, `knxai-home-memory.md` et `knxai-config-<id-nœud>.json`, ainsi que la racine absolue de l’archive des télégrammes KNX, le dossier propre au nœud et le format quotidien `YYYY-MM-DD.jsonl`. Les chemins sont déterminés à l’exécution depuis le répertoire de données réellement utilisé par la passerelle configurée.
51
58
 
52
- ## Exemple pratique de configuration
53
- Cet exemple crée un assistant concis qui signale les ouvertures importantes, tout en acceptant que le volet du bureau reste ouvert :
59
+ ## Intelligence domestique proactive guidée par l’Éducation et mémoire limitée
60
+ À partir de la hiérarchie ETS, des noms, rôles et DPT, le nœud crée un modèle sémantique déterministe. Il n’existe ni interrupteur séparé ni paramètres proactifs avancés. Une notification n’est évaluée que si le LLM est actif et si **Éducation IA** la demande explicitement. L’Éducation définit seule les conditions, la durée, les heures silencieuses et la répétition. Sans règle explicite, ou si le LLM ne peut pas l’évaluer, aucun message n’est envoyé.
61
+
62
+ La dernière session de chat est mémorisée comme propriétaire et reçoit les messages spontanés. La sortie 3 émet `msg.knxAi.type = "proactive_notification"` et `msg.inputMessage` conserve la session pour l’adaptateur de chat. Une limite stricte de trois notifications proactives par heure évite les rafales. La sortie 4 n’est jamais utilisée de façon proactive et KNX n’est jamais modifié de manière autonome.
54
63
 
55
- | Champ de l’éditeur | Valeur d’exemple | Résultat |
56
- |---|---|---|
57
- | **Activer les notifications domestiques proactives** (`proactiveEnabled`) | activé | Le nœud évalue les états ouverts de volet/fenêtre/porte reconnus avec fiabilité. |
58
- | **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. |
59
- | **Notifier après ouverture** (`proactiveOpenMinutes`) | `120` | Une notification potentielle est évaluée après deux heures. |
60
- | **Début / fin des heures silencieuses** | `23:00` / `07:00` | Aucun message proactif n’est émis pendant la nuit. |
61
- | **Délai de répétition** (`proactiveCooldownMinutes`) | `360` | Le même objet ne peut pas notifier à nouveau pendant six heures. |
64
+ La référence apprise partagée est chargée au démarrage depuis `<userDir>/knxai/memory/knxai-home-memory.md`, réécrite atomiquement toutes les 15 minutes et toujours strictement limitée à 5 Mo. 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.
62
65
 
63
- Exemple pour **Éducation IA** (`aiEducation`) :
66
+ ## Exemple pratique de configuration
67
+ Placez toute la politique de notification dans **Éducation IA** (`aiEducation`) :
64
68
 
65
69
  ```text
66
70
  Appelle-moi Alex et réponds dans la même langue que moi.
67
71
  Réponds brièvement, sauf si je demande des détails techniques.
72
+ Préviens mon dernier chat lorsqu’un volet, une fenêtre ou une porte reste ouvert au moins 120 minutes.
73
+ Ne me préviens pas entre 23:00 et 07:00 et ne répète pas la même alerte avant six heures.
68
74
  Le volet du bureau peut rester ouvert le jour : ne m’envoie pas de notification.
69
- Préviens-moi lorsqu’un autre volet, une fenêtre ou une porte reste ouvert anormalement longtemps.
70
75
  Si « lumière du salon » est ambigu, demande-moi quel éclairage je veux dire.
71
76
  N’affirme jamais qu’un actionneur a changé avant confirmation par un objet d’état KNX.
72
77
  ```
@@ -93,46 +98,20 @@ Voici tous les champs tels qu'affichés dans l'éditeur KNX AI.
93
98
  - **Topic** : topic de base utilisé dans les sorties.
94
99
  - Bouton **Open KNX AI Web** : ouvre le dashboard web (`/knxUltimateAI/sidebar/page`).
95
100
 
96
- 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.
97
-
98
- ### Analysis
99
- - **Analysis window (seconds)** : fenêtre principale pour résumé/débits.
100
- - **History window (seconds)** : fenêtre de rétention de l'historique interne.
101
- - **Archiver aussi sur disque les telegrammes captures** : stocke aussi les télégrammes dans `knxultimatestorage/knxai/history/<node-id>/YYYY-MM-DD.jsonl`, en plus de la RAM.
102
- - **Retention de l'archive disque (jours)** : nombre de jours conservés sur disque avant suppression automatique des anciens fichiers.
103
- - **Max stored events** : nombre maximal de télégrammes en mémoire.
104
- - **Auto emit summary (seconds, 0=off)** : intervalle périodique d'émission du résumé.
105
- - **Top list size** : nombre de group addresses/sources dans le top.
106
-
107
101
  ### Assistant IA
108
102
  - **Enable LLM assistant** : active les fonctions Ask/chat.
109
- - **Provider** : backend LLM (OpenAI-compatible ou Ollama).
103
+ - **Provider** : backend LLM (OpenAI-compatible, Anthropic, Ollama ou Bionic LM Studio).
110
104
  - **Endpoint URL** : URL endpoint chat/completions.
111
- - **API key** : clé API (non requise avec Ollama local).
105
+ - **API key** : clé API (non requise avec Ollama local ; facultative pour Bionic LM Studio sauf si l’authentification du serveur est activée).
112
106
  - **Model** : ID/nom du modèle.
113
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.
114
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.
115
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.
116
- - **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.
117
- - **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.
118
- - **Mappage de sortie (KNX AI → chat)** : JavaScript synchrone appliqué uniquement aux messages de la sortie 3 dans l’éditeur JavaScript jaune.
119
- - **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.
120
- - **Destinataire principal / ID de chat** : destination facultative des messages spontanés ; sinon la dernière session Ask est mémorisée.
121
- - **Notifier après ouverture (minutes)** : seuil de durée avant d'envisager une notification proactive ; 120 minutes par défaut.
122
- - **Début / fin des heures silencieuses** : intervalle quotidien pendant lequel les messages proactifs sont supprimés.
123
- - **Éducation de l’IA** : consignes autoritaires gérées uniquement par l'utilisateur, lues par l'IA et jamais modifiées.
124
- - **Délai de répétition (minutes)** : intervalle minimal avant qu'un même objet puisse notifier à nouveau ; 360 minutes par défaut.
125
- - 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.
126
- - **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.
127
- - Les extraits pertinents de l’aide, du README et des exemples sont toujours inclus automatiquement.
128
- - **Docs language** : langue préférée des extraits de documentation inclus automatiquement.
110
+ - **Préréglage d’adaptateur** : utilise **Aucun adaptateur** par défaut. La sélection charge la paire prédéfinie de mappages entrée/sortie ; les deux restent masqués dans l’éditeur.
111
+ - **Éducation de l’IA** : consignes autoritaires gérées uniquement par l'utilisateur, lues par l'IA et jamais modifiées. C’est le seul endroit où demander des notifications proactives et définir leurs conditions, durée, heures silencieuses et répétition.
112
+ - Les extraits pertinents de l’aide, du README et des exemples sont toujours inclus automatiquement ; leur langue est déterminée à partir de la demande de l’utilisateur, avec des replis automatiques sur toutes les langues prises en charge.
129
113
  - 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.
130
114
 
131
- ### Advanced
132
- - **Analysis window (seconds)** : fenêtre principale pour résumé/débits.
133
- - **Max stored events** : nombre maximal de télégrammes en mémoire.
134
- - **Top list size** : nombre de group addresses/sources dans le top.
135
-
136
115
  ### Démarrage rapide Ollama (local)
137
116
  - Choisir **Provider = Ollama**.
138
117
  - Endpoint par défaut : `http://localhost:11434/api/chat`.
@@ -143,6 +122,13 @@ KNX AI écoute automatiquement les télégrammes `GroupValue_Write`, `GroupValue
143
122
  - Si l'installation échoue avec une erreur de connexion, vérifier qu'Ollama est lancé (app desktop ou `ollama serve`).
144
123
  - Si Node-RED tourne dans Docker, utiliser `host.docker.internal` au lieu de `localhost` dans l'endpoint.
145
124
 
125
+ ### Démarrage rapide Bionic LM Studio (local)
126
+ - Choisir **Provider = Bionic LM Studio**.
127
+ - Démarrer le serveur API LM Studio depuis la page **Developer** ou avec `lms server start`.
128
+ - Endpoint par défaut : `http://localhost:1234/v1/chat/completions`.
129
+ - Cliquer sur **Refresh** pour charger tous les modèles exposés par `/v1/models` ; le premier est sélectionné si aucun modèle n’est configuré.
130
+ - La clé API est facultative sauf si l’authentification est activée dans les paramètres du serveur LM Studio. Dans Docker, remplacer `localhost` par `host.docker.internal`.
131
+
146
132
  ## Note sécurité
147
133
  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.
148
134
  </script>
@@ -5,40 +5,17 @@
5
5
  "groupAssistant": "Assistant IA",
6
6
  "groupChatHome": "Conversations et maison",
7
7
  "detectedAdapters": "Adaptateurs détectés automatiquement",
8
- "groupKnxAnalysis": "Analyse du trafic KNX",
8
+ "chatContextOverview": "Aperçu du contexte du chat",
9
9
  "quickSetup": "Configurer l'assistant",
10
- "capture": "Télégrammes du bus",
11
- "storage": "Historique et résumés KNX",
12
- "detection": "Anomalies et motifs",
13
10
  "llmConnection": "Connexion Assistant IA",
14
- "llmContext": "Connaissances et contexte IA",
15
11
  "chatAdapter": "Canaux de chat",
16
- "homeIntelligence": "Maison proactive et mémoire",
17
- "homeIntelligenceAdvanced": "Paramètres proactifs avancés",
12
+ "homeIntelligence": "Éducation IA et mémoire",
18
13
  "advanced": "Fournisseur et limites"
19
14
  },
20
15
  "properties": {
21
16
  "server": "Gateway",
22
17
  "name": "Name",
23
18
  "topic": "Topic",
24
- "notifywrite": "Capture GroupValue_Write",
25
- "notifyresponse": "Capture GroupValue_Response",
26
- "notifyreadrequest": "Capture GroupValue_Read",
27
- "analysisWindowSec": "Analysis window (seconds)",
28
- "historyWindowSec": "History window (seconds)",
29
- "historyStoreToDisk": "Archiver aussi sur disque les telegrammes captures",
30
- "historyStoreRetentionDays": "Retention de l'archive disque (jours)",
31
- "maxEvents": "Max stored events",
32
- "emitIntervalSec": "Auto emit summary (seconds, 0=off)",
33
- "topN": "Top list size",
34
- "enablePattern": "Detect simple patterns (A -> B)",
35
- "patternMaxLagMs": "Pattern max lag (ms)",
36
- "patternMinCount": "Pattern min occurrences",
37
- "rateWindowSec": "Rate window (seconds)",
38
- "maxTelegramPerSecOverall": "Max overall telegrams/sec (0=off)",
39
- "maxTelegramPerSecPerGA": "Max telegrams/sec per GA (0=off)",
40
- "flapWindowSec": "Flap window (seconds)",
41
- "flapMaxChanges": "Max changes per GA in window (0=off)",
42
19
  "llmEnabled": "Enable LLM assistant",
43
20
  "llmProvider": "Provider",
44
21
  "llmBaseUrl": "Endpoint URL",
@@ -46,21 +23,14 @@
46
23
  "llmModel": "Model",
47
24
  "llmSystemPrompt": "System prompt",
48
25
  "llmIncludeRaw": "Include raw payload hex",
49
- "llmIncludeFlowContext": "Inclure l'inventaire du projet Node-RED",
50
26
  "llmAllowKnxCommands": "Autoriser l’IA à lire les états KNX et commander les actionneurs",
51
27
  "llmRequireCommandConfirmation": "Demander confirmation avant d’envoyer les commandes KNX",
52
28
  "chatAdapterPreset": "Préréglage d’adaptateur",
53
29
  "chatInputCode": "Mappage d’entrée (chat → KNX AI)",
54
30
  "chatOutputCode": "Mappage de sortie (KNX AI → chat)",
55
- "proactiveEnabled": "Activer les notifications domestiques proactives",
56
- "proactiveRecipient": "Destinataire principal / ID de chat",
57
- "proactiveOpenMinutes": "Notifier après ouverture (minutes)",
58
- "proactiveCooldownMinutes": "Délai avant répétition (minutes)",
59
- "proactiveQuietStart": "Début des heures silencieuses",
60
- "proactiveQuietEnd": "Fin des heures silencieuses",
31
+ "ttsUltimateNodeId": "Nœud TTS Ultimate pour les annonces",
61
32
  "aiEducation": "Éducation IA (gérée par l'utilisateur)",
62
- "llmIncludeDocsSnippets": "Include documentation snippets (help/README/examples)",
63
- "llmDocsLanguage": "Docs language"
33
+ "llmIncludeDocsSnippets": "Include documentation snippets (help/README/examples)"
64
34
  },
65
35
  "outputs": {
66
36
  "summary": "Résumé/Stats",
@@ -72,13 +42,23 @@
72
42
  "llmProvider": {
73
43
  "openai_compat": "OpenAI-compatible (chat/completions)",
74
44
  "anthropic": "Anthropic (Claude)",
75
- "ollama": "Ollama (local, beta)"
45
+ "ollama": "Ollama (local)",
46
+ "lmstudio": "Bionic LM Studio"
76
47
  },
77
48
  "chatAdapter": {
78
49
  "none": "Aucun adaptateur"
50
+ },
51
+ "ttsUltimate": {
52
+ "select": "Sélectionner un nœud TTS Ultimate",
53
+ "none": "Aucun nœud TTS Ultimate trouvé"
79
54
  }
80
55
  },
81
56
  "messages": {
57
+ "lmStudioContextAvailable": "Contexte maximal du modèle",
58
+ "lmStudioContextLoading": "Chargement du modèle avec son contexte maximal",
59
+ "lmStudioContextConfigured": "Contexte maximal du modèle configuré",
60
+ "lmStudioContextFailed": "Impossible de configurer le contexte du modèle",
61
+ "lmStudioContextCurrentlyLoaded": "actuellement chargé",
82
62
  "ollamaNotSupported": "Ollama local mode: API key not required. Default endpoint is http://localhost:11434/api/chat.",
83
63
  "ollamaNoModels": "No local Ollama model found. Install one or pick one from the library.",
84
64
  "installingOllamaModel": "Starting Ollama and installing model…",
@@ -92,18 +72,41 @@
92
72
  "detectedAdapterDetected": "Détecté",
93
73
  "detectedAdapterControllers": "Contrôleurs",
94
74
  "detectedAdapterCameras": "Caméras",
75
+ "detectedAdapterNodes": "Nœuds",
76
+ "ttsUltimateUnknownFlow": "Flow sans nom",
77
+ "ttsUltimateUnavailable": "Nœud TTS Ultimate indisponible",
78
+ "ttsUltimateHint": "Les demandes explicites d’annonce du chat sont envoyées directement au nœud sélectionné ; aucun câblage de flow n’est nécessaire.",
79
+ "chatContextLoading": "Chargement du résumé du contexte du chat…",
80
+ "chatContextUnavailable": "Le résumé du contexte du chat est temporairement indisponible.",
81
+ "chatContextIntro": "Le chat reçoit automatiquement ces sources. Les chemins ci-dessous sont ceux réellement utilisés par cette installation Node-RED.",
82
+ "chatContextSourcesTitle": "Sources incluses",
83
+ "chatContextFilesTitle": "Fichiers de contexte persistants",
84
+ "chatContextDirectoriesTitle": "Archive des télégrammes KNX",
85
+ "chatContextSourceKnxTraffic": "Résumé KNX actuel, anomalies, topologie et télégrammes sélectionnés.",
86
+ "chatContextSourceEtsProject": "Sémantique ETS et inventaire complet du projet Node-RED.",
87
+ "chatContextSourceMemoryEducation": "Contexte de session, Éducation IA et mémoire domestique limitée.",
88
+ "chatContextSourceCamerasDocs": "Caméras détectées et extraits pertinents de l'aide, du README et des exemples.",
89
+ "chatContextSourceTtsUltimate": "Nœud TTS Ultimate sélectionné pour les annonces.",
90
+ "chatContextSourceBadge": "Source",
91
+ "chatContextFileChatContext": "Tours de conversation persistants, instructions et règles de notification des caméras.",
92
+ "chatContextFileHomeMemory": "Éducation IA et mémoire domestique apprise et limitée.",
93
+ "chatContextFileAssistantConfig": "Configuration persistante de l'Assistant web et zones sémantiques de ce nœud.",
94
+ "chatContextFileBadge": "Fichier",
95
+ "chatContextDirectoryRoot": "Racine de l'archive des télégrammes",
96
+ "chatContextDirectoryNode": "Archive des télégrammes de ce nœud",
97
+ "chatContextDirectoryBadge": "KNX",
98
+ "chatContextTelegramPattern": "Fichiers quotidiens",
95
99
  "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.",
96
100
  "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.",
97
- "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.",
98
- "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."
101
+ "homeIntelligenceIntro": "Le nœud crée un modèle ETS sémantique multilingue. Les notifications proactives ne sont envisagées que si l'Éducation IA les demande explicitement ; il n'envoie jamais de commande KNX de manière autonome.",
102
+ "aiEducationHelp": "Seul l'utilisateur peut modifier cette section. Utilisez-la pour définir toute règle de notification proactive, notamment les conditions, la durée, les heures silencieuses et la répétition. L'IA la lit comme une consigne faisant autorité et la mémoire apprise ne peut jamais l'écraser. Maximum 16 000 caractères."
99
103
  },
100
104
  "placeholder": {
101
105
  "llmBaseUrl": "https://api.openai.com/v1/chat/completions (or your compatible endpoint)",
102
106
  "llmApiKey": "Paste API key (starts with sk-)",
103
107
  "llmModel": "e.g. gpt-4o-mini",
104
108
  "llmSystemPrompt": "Optional. Leave empty for default.",
105
- "proactiveRecipient": "Facultatif : ID de chat Telegram ; sinon la dernière session de chat est mémorisée",
106
- "aiEducation": "Exemple : ne pas me notifier entre 23:00 et 07:00. Le volet du bureau peut rester ouvert la nuit."
109
+ "aiEducation": "Exemple : notifier mon dernier chat si une fenêtre reste ouverte 30 minutes. Ne pas me notifier entre 23:00 et 07:00."
107
110
  },
108
111
  "sidebar": {
109
112
  "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
- 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.
4
+ L'editor usa due schede orizzontali: **Assistente AI** contiene configurazione, conoscenza/contesto, provider e limiti; **Conversazioni e casa** contiene canali chat, casa proattiva e memoria limitata.
5
5
 
6
6
  ## Output
7
7
  1. **Summary/Statistiche** (`msg.payload` JSON)
@@ -21,6 +21,12 @@ Invia `msg.topic`:
21
21
 
22
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
23
 
24
+ Se l'elaborazione dura più di 1,2 secondi, l'uscita 3 emette subito il messaggio intermedio localizzato «Sto pensando…», con `msg.knxAi.type = "thinking"` e `msg.knxAi.transient = true`. L'adattatore chat lo invia allo stesso utente, mentre la risposta finale arriva normalmente appena pronta. Questo messaggio di avanzamento non viene mai salvato nel contesto della conversazione né nella memoria appresa.
25
+
26
+ Le richieste Ollama e Bionic LM Studio usano automaticamente un timeout minimo di 10 minuti; i provider cloud mantengono un minimo di 2 minuti. Non esiste un campo timeout da gestire nell'editor. Se viene raggiunto anche il limite locale, KNX AI segnala che il modello non ha completato la risposta e suggerisce di riprovare o ridurre il contesto del prompt.
27
+
28
+ Lo stato del nodo sul canvas è riservato intenzionalmente all'ultima richiesta in ingresso e al messaggio localizzato «Sto pensando…» mentre l'LLM è in esecuzione. Telegrammi KNX, aggiornamenti del gateway, frequenze del traffico, messaggi ready e risultati tecnici non lo sovrascrivono mai; restano disponibili tramite uscite, log e dati dell'Assistente.
29
+
24
30
  Ogni sessione Ask/chat conserva gli ultimi 8 turni e fino a 20 istruzioni esplicite a lungo termine, separate per `msg.knxAi.sessionId`, `msg.sessionId` o chat ID Telegram rilevato. Richieste come «Ricordati di non usare il termine unknown» diventano istruzioni persistenti. Tutti i nodi KNX AI che usano lo stesso storage condividono questo context in tempo reale e lo ricaricano dopo un riavvio di Node-RED da `knxultimatestorage/knxai/memory/knxai-chat-context.md`. Il file, scritto atomicamente, è limitato a 50 sessioni e 512 KB. Quando il controllo KNX è abilitato, 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
31
  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
32
 
@@ -31,7 +37,7 @@ Quando l'utente chiede esplicitamente uno stato attuale o aggiornato, l'AI può
31
37
  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
38
 
33
39
  ### 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.
40
+ La tab **Adattatori chat** carica le mappature selezionabili da `resources/KNXAIChatAdapterMappings.js`. Scegliendo un preset vengono installate internamente due mappature JavaScript sincrone predefinite: una eseguita prima che KNX AI elabori l'ingresso e una prima dell'emissione sull'uscita 3. Le mappature restano nascoste nell'editor. Errori di sintassi o esecuzione vengono intercettati e segnalati senza arrestare Node-RED.
35
41
 
36
42
  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
43
 
@@ -42,38 +48,39 @@ I pacchetti di telecamere installati possono pubblicare a runtime un adapter per
42
48
 
43
49
  L'utente può chiedere uno snapshot aggiornato oppure domandare al modello vision che cosa è visibile. I preset Telegram e RedBot inviano l'immagine come foto nativa con didascalia. L'utente può anche creare notifiche persistenti per movimento, attraversamento di una linea intelligente o ingresso in una zona di intrusione/stazionamento, limitandole facoltativamente alle persone rilevate e a una linea o zona nominata esatta. Le regole vengono salvate nello stesso file `knxai-chat-context.md` e ripristinate dopo i riavvii di Node-RED. Le sottoscrizioni agli eventi UniFi e le richieste snapshot avvengono direttamente tramite il provider rilevato: l'uscita 4 di KNX AI non è coinvolta e non servono collegamenti intermedi nel flow.
44
50
 
45
- ## Intelligenza domestica proattiva e memoria limitata
46
- 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.
51
+ ### Annunci con TTS Ultimate
52
+ Quando è installato il pacchetto opzionale `node-red-contrib-tts-ultimate`, questo compare tra gli adapter rilevati automaticamente. Il selettore elenca tutti i nodi `ttsultimate` presenti in tutti i flow del progetto, indicando flow, nome del nodo e player configurato. Scegli il nodo che deve gestire gli annunci della chat e fai il deploy del flow.
47
53
 
48
- 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.
54
+ Solo una richiesta esplicita nel messaggio corrente della chat può creare un annuncio. KNX AI invia il testo esatto direttamente al nodo scelto come `msg.payload`, con `msg.topic = "knx_ai_announcement"`; non servono collegamenti intermedi nel flow. TTS Ultimate gestisce poi il player Sonos configurato, voce, volume, hailing e coda. Contesto persistente, Educazione AI, contenuto delle telecamere ed eventi dedotti non attivano mai autonomamente la voce.
49
55
 
50
- Il riferimento appreso condiviso viene caricato all'avvio da `<userDir>/knxai/memory/knxai-home-memory.md`, riscritto atomicamente ogni 15 minuti e sempre limitato rigidamente a 5 MB. 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.
56
+ ### Riepilogo del contesto della chat
57
+ L'editor del nodo mostra una scheda compatta con le fonti disponibili alla chat: traffico KNX corrente, semantica ETS e progetto Node-RED, memoria di sessione e domestica, Educazione AI, telecamere rilevate e documentazione pertinente. Elenca inoltre `knxai-chat-context.md`, `knxai-home-memory.md` e `knxai-config-<id-nodo>.json`, insieme alla radice assoluta dell'archivio telegrammi KNX, alla cartella specifica del nodo e al formato giornaliero `YYYY-MM-DD.jsonl`. I percorsi vengono risolti a runtime dalla directory dati realmente usata dal gateway configurato.
51
58
 
52
- ## Esempio pratico di configurazione
53
- Questo esempio crea un assistente conciso che avvisa il proprietario delle aperture importanti, ma accetta che la persiana dello studio possa rimanere aperta:
59
+ ## Intelligenza domestica proattiva guidata dall'Educazione e memoria limitata
60
+ 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 rilevatore proattivo osserva soltanto stati non di comando di persiane, finestre e porte riconosciuti con sufficiente affidabilità.
61
+
62
+ Non esistono un interruttore o impostazioni proattive avanzate separate. Una condizione viene valutata soltanto quando l'LLM è attivo e **Educazione AI** richiede esplicitamente quella notifica. L'Educazione è l'unica policy per condizioni, durata dell'apertura, ore silenziose e ripetizione. L'AI riceve durata attuale, data/ora locale e storico recente delle notifiche; decide se avvisare e quando rivalutare la stessa apertura. Senza una regola esplicita nell'Educazione, o se l'LLM non riesce a valutarla, non viene inviato alcun messaggio.
54
63
 
55
- | Campo dell'editor | Valore di esempio | Risultato |
56
- |---|---|---|
57
- | **Abilita notifiche domestiche proattive** (`proactiveEnabled`) | attivo | Il nodo valuta gli stati aperti di persiane, finestre e porte riconosciuti con affidabilità. |
58
- | **Destinatario principale / chat ID** (`proactiveRecipient`) | `123456789` | I messaggi spontanei vengono inviati a questa chat. Lascia vuoto per ricordare l'ultima sessione Ask. |
59
- | **Avvisa dopo apertura** (`proactiveOpenMinutes`) | `120` | Dopo due ore viene valutata una possibile notifica. |
60
- | **Inizio / fine ore silenziose** | `23:00` / `07:00` | Durante la notte non vengono emessi messaggi proattivi. |
61
- | **Intervallo prima di ripetere** (`proactiveCooldownMinutes`) | `360` | Lo stesso oggetto non può generare un altro avviso per sei ore. |
64
+ L'ultima sessione chat viene ricordata come proprietario e riceve i messaggi spontanei. L'uscita 3 emette un messaggio localizzato con `msg.knxAi.type = "proactive_notification"`; un `msg.inputMessage` sintetico conserva la sessione per l'adattatore chat. Un limite rigido di tre notifiche proattive all'ora evita abusi. Il nodo non emette mai l'uscita 4 e non modifica autonomamente KNX; un'eventuale richiesta successiva passa sempre dalla normale validazione e conferma.
62
65
 
63
- Esempio per **Educazione AI** (`aiEducation`):
66
+ Il riferimento appreso condiviso viene caricato all'avvio da `<userDir>/knxai/memory/knxai-home-memory.md`, riscritto atomicamente ogni 15 minuti e sempre limitato rigidamente a 5 MB. 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.
67
+
68
+ ## Esempio pratico di configurazione
69
+ Inserisci l'intera policy di notifica in **Educazione AI** (`aiEducation`):
64
70
 
65
71
  ```text
66
72
  Chiamami Massimo e rispondi nella stessa lingua che uso.
67
73
  Mantieni le risposte brevi, salvo quando chiedo dettagli tecnici.
74
+ Avvisa la mia ultima chat quando una persiana, finestra o porta resta aperta per almeno 120 minuti.
75
+ Non avvisarmi tra le 23:00 e le 07:00 e non ripetere lo stesso avviso prima di sei ore.
68
76
  La persiana dello studio può restare aperta durante il giorno: non avvisarmi.
69
- Avvisami quando un'altra persiana, finestra o porta rimane aperta insolitamente a lungo.
70
77
  Quando "luce soggiorno" è ambiguo, chiedimi quale luce intendo.
71
78
  Non dire mai che un attuatore è cambiato finché un oggetto di stato KNX non lo conferma.
72
79
  ```
73
80
 
74
- Con queste impostazioni:
81
+ Con questa Educazione:
75
82
 
76
- 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.
83
+ 1. Se lo stato della persiana del soggiorno rimane aperto per 120 minuti fuori dalle ore silenziose indicate, l'uscita 3 può emettere una `proactive_notification` localizzata verso l'ultima sessione chat.
77
84
  2. Se rimane aperta la persiana dello studio, l'LLM legge l'Educazione e sopprime quella notifica candidata.
78
85
  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.
79
86
 
@@ -97,47 +104,20 @@ Di seguito sono elencati tutti i campi presenti nell'editor del nodo KNX AI.
97
104
  - **Topic**: topic base usato negli output del nodo.
98
105
  - Pulsante **Open KNX AI Web**: apre la dashboard web completa (`/knxUltimateAI/sidebar/page`).
99
106
 
100
- ### Cattura
101
- 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.
102
-
103
- ### Analisi
104
- - **Finestra analisi (secondi)**: finestra principale per summary/rate.
105
- - **Finestra storico (secondi)**: finestra di retention dello storico interno telegrammi.
106
- - **Archivia anche i telegrammi catturati su disco**: salva i telegrammi anche in `knxultimatestorage/knxai/history/<node-id>/YYYY-MM-DD.jsonl`, oltre che in RAM.
107
- - **Retention archivio su disco (giorni)**: numero di giorni mantenuti su disco prima della cancellazione automatica dei file piu' vecchi.
108
- - **Eventi massimi in memoria**: numero massimo di telegrammi mantenuti in RAM.
109
- - **Invia summary automatico (secondi, 0=off)**: intervallo di emissione summary periodica.
110
- - **Dimensione lista Top**: numero di group address/sorgenti nella classifica summary.
111
-
112
107
  ### Assistente AI
113
108
  - **Abilita assistente LLM**: abilita funzioni Ask/chat.
114
- - **Provider**: backend LLM (OpenAI-compatible o Ollama).
109
+ - **Provider**: backend LLM (OpenAI-compatible, Anthropic, Ollama o Bionic LM Studio).
115
110
  - **URL endpoint**: URL endpoint chat/completions.
116
- - **API key**: chiave API (non necessaria con Ollama locale).
111
+ - **API key**: chiave API (non necessaria con Ollama locale; opzionale per Bionic LM Studio, salvo autenticazione attiva sul server).
117
112
  - **Modello**: ID/nome modello.
118
113
  - **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.
119
114
  - **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.
120
115
  - **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.
121
- - **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.
122
- - **Mappatura ingresso (chat → KNX AI)**: JavaScript sincrono applicato prima dell'elaborazione del comando in ingresso. Usa l'editor JavaScript verde.
123
- - **Mappatura uscita (KNX AI → chat)**: JavaScript sincrono applicato solo ai messaggi dell'uscita 3. Usa l'editor JavaScript giallo.
124
- - **Abilita notifiche domestiche proattive**: rilevatore opzionale per stati aperti affidabili di persiane/finestre/porte; non scrive mai autonomamente su KNX.
125
- - **Destinatario principale / chat ID**: destinazione opzionale dei messaggi spontanei; altrimenti viene ricordata l'ultima sessione Ask.
126
- - **Avvisa dopo apertura (minuti)**: soglia di durata dell'apertura prima di valutare una notifica proattiva; 120 minuti per default.
127
- - **Inizio / fine ore silenziose**: intervallo giornaliero in cui i messaggi proattivi sono sospesi.
128
- - **Educazione AI**: istruzioni autorevoli gestite soltanto dall'utente, lette dall'AI e mai modificate.
129
- - **Cooldown ripetizione (minuti)**: intervallo minimo prima che lo stesso oggetto possa generare un altro avviso; 360 minuti per default.
130
- - 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.
131
- - **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.
132
- - Gli estratti pertinenti di help, README ed esempi vengono sempre inclusi automaticamente.
133
- - **Lingua documentazione**: lingua preferita per gli estratti documentali inclusi automaticamente.
116
+ - **Preset adattatore**: parte da **Nessun adattatore**. La selezione carica la coppia predefinita di mappature ingresso/uscita; entrambe restano nascoste nell'editor.
117
+ - **Educazione AI**: istruzioni autorevoli gestite soltanto dall'utente, lette dall'AI e mai modificate. È anche l'unico punto in cui richiedere notifiche proattive e definirne condizioni, durata, ore silenziose e ripetizione.
118
+ - Gli estratti pertinenti di help, README ed esempi vengono sempre inclusi automaticamente; la lingua viene ricavata dalla richiesta dell'utente, con fallback automatici fra tutte le lingue supportate.
134
119
  - Pulsante **Aggiorna**: interroga il provider e popola i modelli disponibili. Durante il caricamento l'icona ruota; il completamento corretto non mostra messaggi.
135
120
 
136
- ### Advanced
137
- - **Finestra analisi (secondi)**: finestra principale per summary/rate.
138
- - **Eventi massimi in memoria**: numero massimo di telegrammi mantenuti in RAM.
139
- - **Dimensione lista Top**: numero di group address/sorgenti nella classifica summary.
140
-
141
121
  ### Setup rapido Ollama (locale)
142
122
  - Seleziona **Provider = Ollama**.
143
123
  - Endpoint predefinito: `http://localhost:11434/api/chat`.
@@ -148,6 +128,13 @@ KNX AI ascolta automaticamente i telegrammi `GroupValue_Write`, `GroupValue_Resp
148
128
  - Se l'installazione fallisce per errore di connessione, verifica che Ollama sia avviato (app desktop o `ollama serve`).
149
129
  - Se Node-RED gira in Docker, usa `host.docker.internal` al posto di `localhost` nell'endpoint.
150
130
 
131
+ ### Setup rapido Bionic LM Studio (locale)
132
+ - Seleziona **Provider = Bionic LM Studio**.
133
+ - Avvia il server API di LM Studio dalla pagina **Developer** oppure con `lms server start`.
134
+ - Endpoint predefinito: `http://localhost:1234/v1/chat/completions`.
135
+ - Premi **Aggiorna** per caricare tutti i modelli esposti da `/v1/models`; se non è configurato un modello viene selezionato il primo.
136
+ - La API key è opzionale, salvo autenticazione attiva nelle impostazioni del server LM Studio. In Docker sostituisci `localhost` con `host.docker.internal`.
137
+
151
138
  ## Nota sicurezza
152
139
  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.
153
140
  </script>