node-red-contrib-knx-ultimate 6.3.24 → 6.3.26
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 -1
- package/examples/IoT Bridge - Modbus Flex Adapter.json +361 -0
- package/examples/KNX AI - Conversational Control with Confirmation.json +4 -2
- package/examples/KNX AI - Summary Anomalies and Ask.json +4 -0
- package/examples/KNX AI - Telegrambot Direct Chat.json +7 -5
- package/nodes/knxUltimate-config.js +13 -4
- package/nodes/knxUltimateAI.html +310 -124
- package/nodes/knxUltimateAI.js +1742 -264
- package/nodes/knxUltimateIoTBridge.html +349 -20
- package/nodes/knxUltimateIoTBridge.js +474 -44
- package/nodes/locales/de/knxUltimateAI.html +33 -7
- package/nodes/locales/de/knxUltimateAI.json +34 -15
- package/nodes/locales/de/knxUltimateIoTBridge.html +28 -2
- package/nodes/locales/de/knxUltimateIoTBridge.json +20 -2
- package/nodes/locales/en/knxUltimateAI.html +33 -7
- package/nodes/locales/en/knxUltimateAI.json +34 -15
- package/nodes/locales/en/knxUltimateIoTBridge.html +28 -2
- package/nodes/locales/en/knxUltimateIoTBridge.json +20 -2
- package/nodes/locales/es/knxUltimateAI.html +33 -7
- package/nodes/locales/es/knxUltimateAI.json +34 -15
- package/nodes/locales/es/knxUltimateIoTBridge.html +28 -2
- package/nodes/locales/es/knxUltimateIoTBridge.json +20 -2
- package/nodes/locales/fr/knxUltimateAI.html +33 -7
- package/nodes/locales/fr/knxUltimateAI.json +34 -15
- package/nodes/locales/fr/knxUltimateIoTBridge.html +28 -2
- package/nodes/locales/fr/knxUltimateIoTBridge.json +20 -2
- package/nodes/locales/it/knxUltimateAI.html +33 -7
- package/nodes/locales/it/knxUltimateAI.json +34 -15
- package/nodes/locales/it/knxUltimateIoTBridge.html +28 -2
- package/nodes/locales/it/knxUltimateIoTBridge.json +20 -2
- package/nodes/locales/zh-CN/knxUltimateAI.html +33 -7
- package/nodes/locales/zh-CN/knxUltimateAI.json +34 -15
- package/nodes/locales/zh-CN/knxUltimateIoTBridge.html +28 -2
- package/nodes/locales/zh-CN/knxUltimateIoTBridge.json +20 -2
- package/nodes/plugins/knxUltimateAI-vue/assets/app.css +1 -1
- package/nodes/plugins/knxUltimateAI-vue/assets/app.js +4 -4
- package/nodes/utils/knxAiTelegramVoice.js +475 -0
- package/nodes/utils/knxAiWebAccess.js +631 -0
- package/package.json +3 -3
- package/resources/KNXAIChatAdapterMappings.js +96 -2
|
@@ -45,7 +45,8 @@ Le reste de cette aide décrit le mode classique **Passerelle IoT**.
|
|
|
45
45
|
## Champs de correspondance
|
|
46
46
|
|
|
47
47
|
- **Direction** — choisir KNX→IoT, IoT→KNX ou bidirectionnel.
|
|
48
|
-
- **Type de canal** — MQTT utilise la cible comme topic, REST comme URL de base
|
|
48
|
+
- **Type de canal** — MQTT utilise la cible comme topic, REST comme URL de base ; pour Modbus, **Target** est l'adresse de protocole à base zéro (0–65535).
|
|
49
|
+
- **Format Modbus / Unit ID / Zone / Type de donnée** — pour les nouvelles correspondances, choisissez **Compatible avec Flex Write**, puis l'unité, la zone mémoire et `bool`, `uint16` ou `int16`. En l'absence de format, l'ancien contrat scalaire reste actif afin de préserver les flows existants.
|
|
49
50
|
- **Échelle & offset** — appliqués pour KNX→IoT ; IoT→KNX applique la transformation inverse.
|
|
50
51
|
- **Template** — chaîne optionnelle remplaçant `{{value}}`, `{{ga}}`, `{{label}}`, `{{target}}`, `{{type}}`, `{{isoTimestamp}}`.
|
|
51
52
|
- **Timeout / Tentatives** — informations exposées sur le message pour aider les nœuds en aval à gérer les reprises.
|
|
@@ -88,7 +89,32 @@ Le reste de cette aide décrit le mode classique **Passerelle IoT**.
|
|
|
88
89
|
|
|
89
90
|
### Synchronisation de registre Modbus
|
|
90
91
|
|
|
91
|
-
|
|
92
|
+
La passerelle est un adaptateur de messages pour `node-red-contrib-modbus` ; elle n'ouvre pas de connexion TCP/série et n'interroge pas elle-même un appareil. Installez une version du paquet compatible avec votre runtime Node-RED, puis utilisez ses nœuds client et transport.
|
|
93
|
+
|
|
94
|
+
|Zone|Lecture|Écriture|Direction autorisée|
|
|
95
|
+
|--|--|--|--|
|
|
96
|
+
| Coil | FC1 | FC5 | Les deux directions |
|
|
97
|
+
| Discrete input | FC2 | — | Modbus → KNX uniquement |
|
|
98
|
+
| Holding register | FC3 | FC6 | Les deux directions |
|
|
99
|
+
| Input register | FC4 | — | Modbus → KNX uniquement |
|
|
100
|
+
|
|
101
|
+
Pour une nouvelle correspondance, sélectionnez `Format = Compatible avec Flex Write`. De KNX vers Modbus, la sortie 1 se raccorde directement à un nœud `modbus-flex-write` et émet :
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
msg.payload = {
|
|
105
|
+
value: 215,
|
|
106
|
+
fc: 6,
|
|
107
|
+
unitid: 1,
|
|
108
|
+
address: 9,
|
|
109
|
+
quantity: 1
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
`address` est toujours à base zéro : si le manuel de l'appareil désigne un holding register par `40010`, son adresse de protocole est généralement `9` ; vérifiez la convention du manuel. La passerelle prend en charge un bit ou un seul registre 16 bits par correspondance. Elle ne combine pas encore plusieurs mots, ne décode pas les valeurs 32 bits/float et ne gère pas l'ordre des octets/mots.
|
|
114
|
+
|
|
115
|
+
De Modbus vers KNX, reliez la sortie de données d'un nœud `modbus-flex-getter` ou `modbus-read` à l'entrée de la passerelle. Flex Getter fournit la requête (`fc`, `unitid`, `address`, `quantity`) dans `msg.modbusRequest` ; Modbus Read la conserve dans `msg.input.payload`. Le tableau de valeurs retourné peut se trouver dans `msg.payload` ou `msg.values`. La passerelle accepte les deux formes de message, associe toutes les correspondances Flex couvertes par la réponse et utilise le bon élément du tableau. Activez **Keep Msg Properties** sur Flex Getter. L'échelle et le décalage suivent `raw = KNX × échelle + décalage` ; le chemin entrant applique la transformation inverse.
|
|
116
|
+
|
|
117
|
+
`Lire les valeurs KNX au déploiement` lit uniquement KNX ; planifiez les lectures Modbus dans le flow Modbus externe. Les correspondances historiques (y compris celles sans `modbusMessageFormat`) continuent d'émettre l'ancien payload scalaire avec les métadonnées `msg.address`/`msg.modbusFunction` au premier niveau.
|
|
92
118
|
|
|
93
119
|
## Flow d’exemple
|
|
94
120
|
|
|
@@ -79,6 +79,10 @@
|
|
|
79
79
|
"target": "Cible",
|
|
80
80
|
"method": "Méthode HTTP",
|
|
81
81
|
"modbusFunction": "Fonction Modbus",
|
|
82
|
+
"modbusMessageFormat": "Format du message Modbus",
|
|
83
|
+
"modbusUnitId": "Unit ID",
|
|
84
|
+
"modbusArea": "Zone Modbus",
|
|
85
|
+
"modbusDataType": "Type de donnée",
|
|
82
86
|
"scale": "Échelle",
|
|
83
87
|
"offset": "Décalage",
|
|
84
88
|
"timeout": "Délai (ms)",
|
|
@@ -103,7 +107,7 @@
|
|
|
103
107
|
"target": "Topic, URL ou registre",
|
|
104
108
|
"target_mqtt": "Topic, ex. knx/light/salon",
|
|
105
109
|
"target_rest": "https://example/api/endpoint",
|
|
106
|
-
"target_modbus": "
|
|
110
|
+
"target_modbus": "Adresse à base zéro (ex. 0)",
|
|
107
111
|
"template": "{\"value\":{{value}}}",
|
|
108
112
|
"property": "Propriété/chemin optionnel",
|
|
109
113
|
"method": "POST",
|
|
@@ -114,7 +118,7 @@
|
|
|
114
118
|
"default": "Cible",
|
|
115
119
|
"mqtt": "Topic MQTT",
|
|
116
120
|
"rest": "URL REST",
|
|
117
|
-
"modbus": "
|
|
121
|
+
"modbus": "Adresse Modbus (base zéro)"
|
|
118
122
|
},
|
|
119
123
|
"method": {
|
|
120
124
|
"default": "Méthode HTTP",
|
|
@@ -125,6 +129,20 @@
|
|
|
125
129
|
"modbus": "Fonction Modbus"
|
|
126
130
|
}
|
|
127
131
|
},
|
|
132
|
+
"modbus": {
|
|
133
|
+
"formatLegacy": "Message scalaire historique",
|
|
134
|
+
"formatFlex": "Compatible avec Flex Write",
|
|
135
|
+
"areaCoil": "Coil (lecture FC1 / écriture FC5)",
|
|
136
|
+
"areaDiscreteInput": "Discrete input (lecture FC2 uniquement)",
|
|
137
|
+
"areaHoldingRegister": "Holding register (lecture FC3 / écriture FC6)",
|
|
138
|
+
"areaInputRegister": "Input register (lecture FC4 uniquement)",
|
|
139
|
+
"dataTypeBool": "Booléen",
|
|
140
|
+
"dataTypeUint16": "16 bits non signé",
|
|
141
|
+
"dataTypeInt16": "16 bits signé",
|
|
142
|
+
"zeroBasedHint": "Utilisez l’adresse de protocole à base zéro (0–65535), et non la référence 4xxxx indiquée dans certains manuels.",
|
|
143
|
+
"flexHint": "Flex émet msg.payload = {value,fc,unitid,address,quantity}, directement raccordable à modbus-flex-write.",
|
|
144
|
+
"readOnlyHint": "Les discrete inputs et input registers sont en lecture seule et acceptent uniquement Modbus → KNX."
|
|
145
|
+
},
|
|
128
146
|
"labels": {
|
|
129
147
|
"outputKnxToIoT": "Flux KNX → IoT",
|
|
130
148
|
"outputIoTToKnx": "Accusés IoT → KNX",
|
|
@@ -1,16 +1,33 @@
|
|
|
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 due schede orizzontali: **Assistente AI** contiene configurazione, conoscenza/contesto, provider e limiti; **Conversazioni e casa** contiene
|
|
4
|
+
L'editor usa due schede orizzontali: **Assistente AI** contiene configurazione, conoscenza/contesto, provider e limiti; **Conversazioni e casa** contiene i PIN di input e output della chat, casa proattiva e memoria limitata.
|
|
5
5
|
|
|
6
6
|
## Output
|
|
7
7
|
1. **Summary/Statistiche** (`msg.payload` JSON)
|
|
8
8
|
2. **Anomalie** (`msg.payload` JSON)
|
|
9
9
|
3. **Assistente AI** (`msg.payload` testo, con `msg.summary`)
|
|
10
10
|
4. **Operazioni KNX** (un messaggio Universal Mode per ogni lettura o scrittura validata)
|
|
11
|
+
5. **TTS Ultimate** (un messaggio di annuncio per ogni testo parlato scelto dal modello)
|
|
11
12
|
|
|
12
13
|
Ogni messaggio emesso dalle uscite 3 e 4 contiene anche una copia del messaggio originale in ingresso in `msg.inputMessage`. In questo modo payload, topic, metadati della chat e qualsiasi altra proprietà di ingresso restano disponibili per i nodi successivi. Gli errori di clonazione o di invio vengono intercettati e segnalati senza propagarsi al runtime di Node-RED.
|
|
13
14
|
|
|
15
|
+
### Setup Doctor e primo avvio sicuro
|
|
16
|
+
Il **Setup Doctor** automatico controlla gateway selezionato e importazione ETS, attivazione AI, provider, modello e chiave API, raggiungibilità del provider, collegamenti del flow, telecamere rilevate e collegamento TTS Ultimate opzionale. Il preflight del provider, senza costi, chiama soltanto l'endpoint che elenca i modelli: non invia mai una richiesta chat e non consuma token di inferenza. Telecamere e TTS sono opzionali, quindi non usarli non riduce la prontezza di base.
|
|
17
|
+
|
|
18
|
+
L'inventario mostra il numero esatto di segnali KNX con indirizzo di gruppo univoco, le aree/i gruppi ETS e una stima delle funzioni logiche. Non dichiara volutamente il numero di dispositivi fisici, perché non è ricavabile in modo affidabile dal CSV ETS. Il Setup Doctor legge l'ultimo flow di cui è stato eseguito il deploy: dopo modifiche a provider, modello, preset, gateway o collegamenti, esegui quindi il deploy prima di fare clic su **Aggiorna** per ripetere i controlli.
|
|
19
|
+
|
|
20
|
+
Invia `/start` o `/help` da una chat per ricevere sull'uscita chat (uscita 3) un benvenuto deterministico e localizzato, con statistiche personalizzate dell'impianto e fino a tre suggerimenti sicuri. Questo onboarding non chiama l'LLM, non legge o scrive KNX e non genera TTS. Con il preset Telegram, i suggerimenti appaiono come pulsanti della tastiera di risposta e vengono eseguiti solo dopo che l'utente ne seleziona o invia uno esplicitamente. Dopo questa selezione esplicita, un suggerimento iniziale può eseguire letture KNX esatte quando necessarie; restano invece inibiti scritture e routine KNX, azioni sulle telecamere, TTS, modifiche alla memoria persistente e apprendimento dei ruoli GA.
|
|
21
|
+
|
|
22
|
+
### Intelligenza Web
|
|
23
|
+
L'accesso Web è disattivato per impostazione predefinita. Quando **Consenti all'AI di usare il Web** è attivo, il modello conversazionale può scegliere il tool Web strutturato direttamente dalla richiesta corrente; non vengono usate parole chiave, logiche specifiche per argomento o classificatori d'intento. Ogni turno utente o ciclo proattivo può eseguire al massimo tre operazioni Web complessive. Tutte le operazioni Web esterne reali condividono il budget orario scorrevole configurato.
|
|
24
|
+
|
|
25
|
+
**Consenti controlli Web proattivi** è un opt-in separato. Richiede anche istruzioni esplicite scritte dall'utente in **Educazione AI**, rispetta l'intervallo minimo configurato e parte solo dopo che KNX AI ha appreso una chat destinataria da almeno una normale richiesta in chat. Senza entrambe le autorizzazioni non avviene alcuna operazione Web in background.
|
|
26
|
+
|
|
27
|
+
Ogni risposta basata sul Web contiene citazioni validate dal runtime con URL della fonte sanificato e ora di consultazione, oltre all'ora di pubblicazione quando disponibile. Il contenuto esterno è un dato non attendibile, mai un'istruzione, e non può sostituire le regole o i permessi dell'assistente. Sono accettate soltanto risorse HTTPS pubbliche e limitate; destinazioni private, locali, link-local e di metadata cloud, redirect non sicuri, navigazione autenticata e cookie vengono bloccati. Se nessuna fonte può essere verificata, KNX AI segnala il limite invece di generare una risposta priva di fonti.
|
|
28
|
+
|
|
29
|
+
Dopo che sono disponibili risultati Web verificati, il modello può comporre gli altri tool abilitati quando la chat corrente o Educazione AI lo autorizzano. L'accesso Web non amplia mai i permessi: disponibilità di telecamere, TTS e memoria, così come letture e scritture KNX, validazione locale ETS/DPT e conferma configurata per le scritture KNX, restano invariate. Le richieste Web espongono la query e l'IP pubblico del server ai siti esterni o al servizio di ricerca; dati KNX/ETS, contenuti delle telecamere, identificativi chat, memoria appresa e credenziali non vengono mai aggiunti automaticamente.
|
|
30
|
+
|
|
14
31
|
## Comandi (input)
|
|
15
32
|
Invia `msg.topic`:
|
|
16
33
|
- `summary` (o vuoto): emette subito la summary
|
|
@@ -43,11 +60,15 @@ Richieste come «Sto uscendo», «Buonanotte» o «Modalità cinema» possono co
|
|
|
43
60
|
### Richiesta di conferma per pulsanti chat
|
|
44
61
|
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.
|
|
45
62
|
|
|
46
|
-
###
|
|
47
|
-
La
|
|
63
|
+
### Adattatori messaggi ingresso/uscita
|
|
64
|
+
La sezione **Chat PIN Input e Output** carica le mappature selezionabili da `resources/KNXAIChatAdapterMappings.js`. Scegliendo un adattatore 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.
|
|
48
65
|
|
|
49
66
|
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`. La conferma usa una tastiera Telegram temporanea: premendo **Conferma** o **Annulla** viene inviato un normale messaggio localizzato attraverso lo stesso receiver, quindi non servono `telegram event` né collegamenti callback. I vecchi messaggi `callback_query` restano accettati. 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.
|
|
50
67
|
|
|
68
|
+
Con questo preset, un messaggio vocale Telegram (`msg.payload.type = "voice"`) viene gestito automaticamente solo quando **Provider** è impostato su **OpenAI-compatible**. Prima di scaricare qualsiasi dato, KNX AI verifica il provider, riutilizza **URL endpoint** e **API key** già configurati e deriva `/audio/transcriptions` e `/audio/speech` dalla stessa connessione. Il collegamento `msg.payload.weblink`, che contiene il token, viene usato soltanto per il download limitato e rimosso prima che il messaggio raggiunga gli output o l'LLM. L'audio OGG/Opus viene trascritto con il default integrato `gpt-4o-mini-transcribe`; a una richiesta elaborata correttamente risponde con un vocale Telegram OGG/Opus generato con `gpt-4o-mini-tts` e `alloy`, conservando la didascalia testuale e l'eventuale tastiera di conferma. Se è selezionato un altro provider, l'utente riceve un'indicazione localizzata per scegliere OpenAI-compatible oppure inviare testo. Se la sintesi non è disponibile, fallisce o supera il limite vocale, viene inviato come fallback il testo completo. L'audio scaricato e il testo della risposta vengono inviati allo stesso provider selezionato. Messaggi di testo, foto e vecchie mappature Telegram salvate restano compatibili.
|
|
69
|
+
|
|
70
|
+
La didascalia di ogni vocale nativo inizia con l'indicazione localizzata **Voce generata dall’IA**, visibile al destinatario Telegram.
|
|
71
|
+
|
|
51
72
|
Il preset incluso **RedBot / node-red-contrib-chatbot (Telegram)** segue il formato comune dei messaggi RedBot. Collega direttamente `chatbot-telegram-receive` a KNX AI e l'uscita 3 direttamente a `chatbot-telegram-send`; non serve un nodo callback separato perché RedBot converte i postback dei pulsanti inline in normali messaggi in ingresso. La mappatura d'ingresso legge `transport`, `chatId`, `type`, `content` e la lingua Telegram. Quella d'uscita conserva i dati di tracciamento RedBot `originalMessage`, `chat`, `api` e `client`, quindi emette un payload `message` oppure un payload `inline-buttons` con azioni `postback` per la conferma. RedBot resta una dipendenza opzionale separata.
|
|
52
73
|
|
|
53
74
|
### Adapter telecamera rilevati automaticamente
|
|
@@ -58,14 +79,14 @@ L'utente può chiedere uno snapshot aggiornato oppure domandare al modello visio
|
|
|
58
79
|
Ogni evento pubblicato da un adapter rilevato automaticamente viene normalizzato e aggiunto direttamente nel formato nativo compatto a righe di KNX AI a un file giornaliero `YYYY-MM-DD.knxctx` sotto `knxultimatestorage/knxai/adapter-history/<id-nodo>/`. L'archivio dei telegrammi KNX usa lo stesso formato compatto, senza serializzazione JSON intermedia. L'archivio conserva 10 giorni, garantisce più di 24 ore di storico e salva i metadati degli eventi, non le immagini. Gli archivi JSONL esistenti non vengono letti né migrati. I totali comprendono tutte le righe memorizzate nell'intervallo richiesto; i dettagli selezionati sono soltanto un campione pertinente.
|
|
59
80
|
|
|
60
81
|
### Annunci con TTS Ultimate
|
|
61
|
-
|
|
82
|
+
Collega l'uscita 5 a uno o più nodi `ttsultimate` del pacchetto opzionale `node-red-contrib-tts-ultimate`. I normali collegamenti di Node-RED determinano destinazione e fan-out; usa Link Out/Link In quando il nodo TTS si trova in un'altra scheda del flow. Il precedente selettore del nodo TTS e l'iniezione interna sono stati rimossi. Le posizioni delle uscite 1–4 restano invariate, ma nei flow aggiornati occorre collegare fisicamente l'uscita 5 prima che gli annunci vocali possano raggiungere TTS Ultimate.
|
|
62
83
|
|
|
63
|
-
Il modello decide se
|
|
84
|
+
Il modello decide se preparare un annuncio ragionando sulla richiesta corrente, sulle istruzioni persistenti della chat e sull'Educazione AI gestita dall'utente: non esistono intent per gli annunci né liste di frasi di attivazione. Valori KNX, eventi degli adapter, immagini e archivi restano dati e non diventano istruzioni, ma le indicazioni autorevoli dell'utente possono insegnare al modello come agire su quei dati. L'uscita 5 emette il testo esatto da pronunciare in `msg.payload`, imposta `msg.topic = "knx_ai_announcement"` e aggiunge `msg.knxAi.type = "tts_announcement"` insieme a `msg.knxAi.sourceNodeId`, `msg.knxAi.sessionId` e `msg.knxAi.reason`. TTS Ultimate gestisce poi player, voce, volume, hailing e coda.
|
|
64
85
|
|
|
65
86
|
### Riepilogo del contesto della chat
|
|
66
87
|
L'editor del nodo mostra una scheda compatta con le fonti disponibili alla chat: traffico KNX corrente e archiviato, eventi persistenti degli adapter, semantica ETS e progetto Node-RED, memoria di sessione e domestica, Educazione AI e telecamere rilevate. Mostra anche il contesto operativo massimo scelto dall'utente e il peso UTF-8 effettivo dell'ultimo prompt della chat; quando il provider comunica i token di input viene usato il valore esatto, altrimenti il conteggio è indicato come stima. La scheda elenca le directory assolute degli archivi KNX e degli eventi adapter e il formato giornaliero `YYYY-MM-DD.knxctx`.
|
|
67
88
|
|
|
68
|
-
Il modello riceve letture e scritture KNX, adapter telecamera, annunci TTS e memoria persistente come strumenti strutturati. Può sceglierli e combinarli semanticamente partendo dalla richiesta corrente e dalle indicazioni autorevoli apprese, senza routing per intent linguistici. Il runtime valida soltanto argomenti, disponibilità degli adapter e confini di sicurezza; le scritture KNX conservano validazione ETS/DPT locale e conferma configurata.
|
|
89
|
+
Il modello riceve letture e scritture KNX, adapter telecamera, annunci TTS e memoria persistente come strumenti strutturati. Può sceglierli e combinarli semanticamente partendo dalla richiesta corrente e dalle indicazioni autorevoli apprese, senza routing per intent linguistici. Il runtime valida soltanto argomenti, disponibilità degli adapter telecamera e confini di sicurezza; le scritture KNX conservano validazione ETS/DPT locale e conferma configurata.
|
|
69
90
|
|
|
70
91
|
### Modifica e backup dell'apprendimento CHAT
|
|
71
92
|
La scheda **Conversazioni e casa** nella configurazione Node-RED di KNX AI include il pulsante **Apri Apprendimento AI Chat**, che apre la Web UI Vue direttamente su questo editor per il nodo corrente.
|
|
@@ -133,10 +154,15 @@ Di seguito sono elencati tutti i campi presenti nell'editor del nodo KNX AI.
|
|
|
133
154
|
- **URL endpoint**: URL endpoint chat/completions.
|
|
134
155
|
- **API key**: chiave API (non necessaria con Ollama locale; opzionale per Bionic LM Studio, salvo autenticazione attiva sul server).
|
|
135
156
|
- **Modello**: ID/nome modello.
|
|
157
|
+
- **Consenti all'AI di usare il Web**: disattivato per impostazione predefinita. Permette al modello di scegliere semanticamente il tool Web generale e restituire fonti verificate e citate.
|
|
158
|
+
- **Consenti controlli Web proattivi**: opt-in separato per i controlli in background; richiede anche istruzioni esplicite scritte dall'utente in **Educazione AI**.
|
|
159
|
+
- **Intervallo minimo dei controlli proattivi**: tempo minimo tra i cicli proattivi; non ritarda le operazioni Web richieste durante un turno utente attivo.
|
|
160
|
+
- **Numero massimo di chiamate Web all'ora**: budget scorrevole condiviso dalle operazioni Web interattive e proattive. Ogni turno o ciclo può usare al massimo tre operazioni complessive.
|
|
161
|
+
- **Voce Telegram**: disponibile soltanto con il provider **OpenAI-compatible**. Riutilizza automaticamente endpoint e API key di quel provider con i default integrati `gpt-4o-mini-transcribe`, `gpt-4o-mini-tts` e `alloy`; non esistono impostazioni vocali separate.
|
|
136
162
|
- **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.
|
|
137
163
|
- **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.
|
|
138
164
|
- **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.
|
|
139
|
-
- **
|
|
165
|
+
- **Adattatore messaggi ingresso/uscita**: parte da **Nessun adattatore**. La selezione carica la coppia predefinita di mappature ingresso/uscita; entrambe restano nascoste nell'editor.
|
|
140
166
|
- **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.
|
|
141
167
|
- Gli estratti inclusi nel pacchetto da help, README, changelog, wiki ed esempi non vengono inviati nei prompt di Telegram, RedBot o CHAT personalizzate. Restano disponibili soltanto all'Assistente web per le domande tecniche sul pacchetto.
|
|
142
168
|
- Pulsante **Aggiorna**: interroga il provider e popola i modelli disponibili. Durante il caricamento l'icona ruota; il completamento corretto non mostra messaggi.
|
|
@@ -4,12 +4,14 @@
|
|
|
4
4
|
"sections": {
|
|
5
5
|
"groupAssistant": "Assistente AI",
|
|
6
6
|
"groupChatHome": "Conversazioni e casa",
|
|
7
|
-
"
|
|
7
|
+
"setupDoctor": "Setup Doctor",
|
|
8
|
+
"webIntelligence": "Intelligenza Web",
|
|
9
|
+
"detectedAdapters": "Nodi compatibili rilevati ed usati in chat",
|
|
8
10
|
"chatContextOverview": "Contesto disponibile alla chat",
|
|
9
11
|
"chatLearning": "Apprendimento AI Chat",
|
|
10
12
|
"quickSetup": "Configurazione assistente",
|
|
11
13
|
"llmConnection": "Connessione Assistente AI",
|
|
12
|
-
"chatAdapter": "
|
|
14
|
+
"chatAdapter": "Chat PIN Input e Output",
|
|
13
15
|
"homeIntelligence": "Educazione AI e memoria",
|
|
14
16
|
"advanced": "Provider e limiti"
|
|
15
17
|
},
|
|
@@ -27,10 +29,13 @@
|
|
|
27
29
|
"llmIncludeRaw": "Includi payload raw in hex",
|
|
28
30
|
"llmAllowKnxCommands": "Consenti all'AI di leggere stati KNX e comandare attuatori",
|
|
29
31
|
"llmRequireCommandConfirmation": "Chiedi conferma prima di inviare comandi KNX",
|
|
30
|
-
"
|
|
32
|
+
"webAccessEnabled": "Consenti all’AI di usare il Web",
|
|
33
|
+
"webProactiveEnabled": "Consenti controlli Web proattivi",
|
|
34
|
+
"webProactiveIntervalMinutes": "Intervallo minimo dei controlli proattivi",
|
|
35
|
+
"webMaxCallsPerHour": "Numero massimo di chiamate Web all’ora",
|
|
36
|
+
"chatAdapterPreset": "Adattatore messaggi ingresso/uscita",
|
|
31
37
|
"chatInputCode": "Mappatura ingresso (chat → KNX AI)",
|
|
32
38
|
"chatOutputCode": "Mappatura uscita (KNX AI → chat)",
|
|
33
|
-
"ttsUltimateNodeId": "Nodo TTS Ultimate per gli annunci",
|
|
34
39
|
"aiEducation": "Educazione AI (gestita dall'utente)",
|
|
35
40
|
"llmIncludeDocsSnippets": "Includi estratti documentazione (help/README/esempi)"
|
|
36
41
|
},
|
|
@@ -38,7 +43,8 @@
|
|
|
38
43
|
"summary": "Summary/Statistiche",
|
|
39
44
|
"anomalies": "Anomalie",
|
|
40
45
|
"assistant": "Assistente AI",
|
|
41
|
-
"knxCommands": "Operazioni KNX"
|
|
46
|
+
"knxCommands": "Operazioni KNX",
|
|
47
|
+
"ttsUltimate": "Annunci TTS Ultimate"
|
|
42
48
|
},
|
|
43
49
|
"selectlists": {
|
|
44
50
|
"llmProvider": {
|
|
@@ -55,12 +61,17 @@
|
|
|
55
61
|
"chatAdapter": {
|
|
56
62
|
"none": "Nessun adattatore"
|
|
57
63
|
},
|
|
58
|
-
"
|
|
59
|
-
"
|
|
60
|
-
"
|
|
64
|
+
"webProactiveInterval": {
|
|
65
|
+
"5": "5 minuti",
|
|
66
|
+
"10": "10 minuti",
|
|
67
|
+
"15": "15 minuti",
|
|
68
|
+
"30": "30 minuti",
|
|
69
|
+
"60": "1 ora",
|
|
70
|
+
"180": "3 ore"
|
|
61
71
|
}
|
|
62
72
|
},
|
|
63
73
|
"buttons": {
|
|
74
|
+
"refreshSetupDoctor": "Ricontrolla",
|
|
64
75
|
"refreshModels": "Aggiorna",
|
|
65
76
|
"installOllamaModel": "2) Installalo",
|
|
66
77
|
"ollamaLibrary": "Libreria modelli",
|
|
@@ -68,6 +79,18 @@
|
|
|
68
79
|
"openChatLearning": "Apri Apprendimento AI Chat"
|
|
69
80
|
},
|
|
70
81
|
"messages": {
|
|
82
|
+
"setupDoctorLoading": "Sto analizzando questo impianto…",
|
|
83
|
+
"setupDoctorUnavailable": "Setup Doctor non è temporaneamente disponibile.",
|
|
84
|
+
"setupDoctorPromptsTitle": "Prova il tuo impianto",
|
|
85
|
+
"setupDoctorPromptsHint": "Ogni suggerimento apre l’Assistant Web con una richiesta personalizzata e sicura. Nulla viene eseguito automaticamente.",
|
|
86
|
+
"setupDoctorDeployHint": "Setup Doctor legge l’ultimo flow distribuito. Fai Deploy delle modifiche e poi ricontrolla.",
|
|
87
|
+
"setupDoctorPass": "OK",
|
|
88
|
+
"setupDoctorWarn": "Controlla",
|
|
89
|
+
"setupDoctorFail": "Correggi",
|
|
90
|
+
"setupDoctorInfo": "Opzionale",
|
|
91
|
+
"webAccessHint": "Il modello sceglie semanticamente questo tool Web generale; non vengono usate parole chiave né classificatori d’intento. I siti esterni e il servizio di ricerca ricevono la query e l’IP pubblico del server. Dati privati KNX, telecamere, chat, memoria e credenziali non vengono mai aggiunti automaticamente.",
|
|
92
|
+
"webProactiveHint": "Questo opt-in separato richiede anche istruzioni esplicite in Educazione AI e una chat destinataria appresa da una normale richiesta. Il modello decide cosa controllare; restano valide le autorizzazioni degli altri strumenti e le conferme KNX.",
|
|
93
|
+
"webBudgetHint": "Il budget scorrevole conteggia le chiamate esterne reali della chat e dei controlli proattivi.",
|
|
71
94
|
"loadingModels": "Carico i modelli…",
|
|
72
95
|
"loadedModels": "Modelli caricati",
|
|
73
96
|
"lmStudioContextAvailable": "Contesto massimo del modello",
|
|
@@ -85,16 +108,13 @@
|
|
|
85
108
|
"installOllamaModelFailed": "Installazione modello Ollama non riuscita",
|
|
86
109
|
"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.",
|
|
87
110
|
"ollamaStartedAuto": "Server Ollama avviato automaticamente.",
|
|
88
|
-
"detectedAdaptersLoading": "Rilevamento
|
|
89
|
-
"detectedAdaptersNone": "Nessun
|
|
90
|
-
"detectedAdaptersUnavailable": "Il rilevamento
|
|
111
|
+
"detectedAdaptersLoading": "Rilevamento dei nodi compatibili installati…",
|
|
112
|
+
"detectedAdaptersNone": "Nessun nodo compatibile rilevato.",
|
|
113
|
+
"detectedAdaptersUnavailable": "Il rilevamento dei nodi compatibili non è momentaneamente disponibile.",
|
|
91
114
|
"detectedAdapterDetected": "Rilevato",
|
|
92
115
|
"detectedAdapterControllers": "Controller",
|
|
93
116
|
"detectedAdapterCameras": "Telecamere",
|
|
94
117
|
"detectedAdapterNodes": "Nodi",
|
|
95
|
-
"ttsUltimateUnknownFlow": "Flow senza nome",
|
|
96
|
-
"ttsUltimateUnavailable": "Nodo TTS Ultimate non disponibile",
|
|
97
|
-
"ttsUltimateHint": "Le richieste esplicite di annuncio della chat vengono inviate direttamente al nodo scelto; non servono collegamenti nel flow.",
|
|
98
118
|
"chatContextLoading": "Caricamento del riepilogo del contesto…",
|
|
99
119
|
"chatContextUnavailable": "Il riepilogo del contesto della chat non è momentaneamente disponibile.",
|
|
100
120
|
"chatLearningOpenHint": "Apri la Web UI direttamente nell’editor dell’apprendimento CHAT condiviso per visualizzare, modificare, copiare o salvare il suo file persistente.",
|
|
@@ -115,7 +135,6 @@
|
|
|
115
135
|
"chatContextSourceEtsProject": "Semantica ETS e inventario completo del progetto Node-RED.",
|
|
116
136
|
"chatContextSourceMemoryEducation": "Contesto di sessione, Educazione AI e memoria domestica limitata.",
|
|
117
137
|
"chatContextSourceCameras": "Telecamere rilevate e relative funzionalità disponibili.",
|
|
118
|
-
"chatContextSourceTtsUltimate": "Nodo TTS Ultimate selezionato per gli annunci.",
|
|
119
138
|
"chatContextSourceBadge": "Fonte",
|
|
120
139
|
"chatContextFileChatContext": "Turni persistenti, istruzioni e regole di notifica delle telecamere.",
|
|
121
140
|
"chatContextFileHomeMemory": "Educazione AI e memoria domestica appresa e limitata.",
|
|
@@ -45,7 +45,8 @@ Il resto di questo aiuto descrive la modalità classica **Bridge IoT**.
|
|
|
45
45
|
## Campi della mappatura
|
|
46
46
|
|
|
47
47
|
- **Direzione** — scegli KNX→IoT, IoT→KNX oppure bidirezionale.
|
|
48
|
-
- **Tipo canale** — per MQTT il target è il topic; per REST è l'URL base; per Modbus è
|
|
48
|
+
- **Tipo canale** — per MQTT il target è il topic; per REST è l'URL base; per Modbus **Target** è l'indirizzo di protocollo zero-based (0–65535).
|
|
49
|
+
- **Formato Modbus / Unit ID / Area / Tipo di dato** — per le nuove mappature scegli **Compatibile con Flex Write**, quindi imposta unità, area di memoria e `bool`, `uint16` o `int16`. Se il formato è assente resta attivo il contratto scalare legacy, così i flow esistenti continuano a funzionare.
|
|
49
50
|
- **Scala & Offset** — applicati su KNX→IoT; IoT→KNX usa la trasformazione inversa.
|
|
50
51
|
- **Template** — stringa opzionale con segnaposto `{{value}}`, `{{ga}}`, `{{label}}`, `{{target}}`, `{{type}}`, `{{isoTimestamp}}`.
|
|
51
52
|
- **Timeout / Tentativi** — campi informativi esposti nel messaggio in uscita per i nodi successivi.
|
|
@@ -88,7 +89,32 @@ Il resto di questo aiuto descrive la modalità classica **Bridge IoT**.
|
|
|
88
89
|
|
|
89
90
|
### Sincronizzazione Modbus
|
|
90
91
|
|
|
91
|
-
|
|
92
|
+
Il bridge è un adattatore di messaggi per `node-red-contrib-modbus`: non apre connessioni TCP/seriali e non interroga autonomamente il dispositivo. Installa una versione del pacchetto compatibile con il tuo runtime Node-RED, poi usa i suoi nodi client e di trasporto.
|
|
93
|
+
|
|
94
|
+
|Area|Lettura|Scrittura|Direzione ammessa|
|
|
95
|
+
|--|--|--|--|
|
|
96
|
+
| Coil | FC1 | FC5 | Entrambe le direzioni |
|
|
97
|
+
| Discrete input | FC2 | — | Solo Modbus → KNX |
|
|
98
|
+
| Holding register | FC3 | FC6 | Entrambe le direzioni |
|
|
99
|
+
| Input register | FC4 | — | Solo Modbus → KNX |
|
|
100
|
+
|
|
101
|
+
Per una nuova mappatura seleziona `Formato = Compatibile con Flex Write`. Da KNX a Modbus, l'output 1 si collega direttamente a un nodo `modbus-flex-write` ed emette:
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
msg.payload = {
|
|
105
|
+
value: 215,
|
|
106
|
+
fc: 6,
|
|
107
|
+
unitid: 1,
|
|
108
|
+
address: 9,
|
|
109
|
+
quantity: 1
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
`address` è sempre zero-based: se il manuale del dispositivo indica un holding register come `40010`, il relativo indirizzo di protocollo è comunemente `9`; verifica la convenzione nel manuale. Il bridge gestisce un bit o un singolo registro a 16 bit per mappatura. Al momento non combina più word, non decodifica valori a 32 bit/float e non gestisce l'ordine di byte/word.
|
|
114
|
+
|
|
115
|
+
Da Modbus a KNX, collega l'uscita dati di un nodo `modbus-flex-getter` o `modbus-read` all'ingresso del bridge. Flex Getter fornisce la richiesta (`fc`, `unitid`, `address`, `quantity`) in `msg.modbusRequest`; Modbus Read la conserva in `msg.input.payload`. L'array dei valori restituiti può trovarsi in `msg.payload` oppure in `msg.values`. Il bridge supporta entrambe le forme, abbina tutte le mappature Flex comprese nella risposta e usa l'elemento corretto dell'array. Abilita **Keep Msg Properties** su Flex Getter. Scala e offset seguono `raw = KNX × scala + offset`; in ingresso viene applicata la trasformazione inversa.
|
|
116
|
+
|
|
117
|
+
`Leggi valori KNX al deploy` legge soltanto KNX; pianifica le letture Modbus nel flow Modbus esterno. Le mappature legacy (comprese quelle senza `modbusMessageFormat`) continuano a emettere il precedente payload scalare con i metadati `msg.address`/`msg.modbusFunction` al livello principale.
|
|
92
118
|
|
|
93
119
|
## Flow di esempio
|
|
94
120
|
|
|
@@ -79,6 +79,10 @@
|
|
|
79
79
|
"target": "Target",
|
|
80
80
|
"method": "Metodo HTTP",
|
|
81
81
|
"modbusFunction": "Funzione Modbus",
|
|
82
|
+
"modbusMessageFormat": "Formato messaggio Modbus",
|
|
83
|
+
"modbusUnitId": "Unit ID",
|
|
84
|
+
"modbusArea": "Area Modbus",
|
|
85
|
+
"modbusDataType": "Tipo di dato",
|
|
82
86
|
"scale": "Scala",
|
|
83
87
|
"offset": "Offset",
|
|
84
88
|
"timeout": "Timeout (ms)",
|
|
@@ -103,7 +107,7 @@
|
|
|
103
107
|
"target": "Topic, URL o registro",
|
|
104
108
|
"target_mqtt": "Topic, es. knx/light/soggiorno",
|
|
105
109
|
"target_rest": "https://example/api/endpoint",
|
|
106
|
-
"target_modbus": "
|
|
110
|
+
"target_modbus": "Indirizzo zero-based (es. 0)",
|
|
107
111
|
"template": "{\"value\":{{value}}}",
|
|
108
112
|
"property": "Proprietà/percorso opzionale",
|
|
109
113
|
"method": "POST",
|
|
@@ -114,7 +118,7 @@
|
|
|
114
118
|
"default": "Target",
|
|
115
119
|
"mqtt": "Topic MQTT",
|
|
116
120
|
"rest": "URL REST",
|
|
117
|
-
"modbus": "
|
|
121
|
+
"modbus": "Indirizzo Modbus (zero-based)"
|
|
118
122
|
},
|
|
119
123
|
"method": {
|
|
120
124
|
"default": "Metodo HTTP",
|
|
@@ -125,6 +129,20 @@
|
|
|
125
129
|
"modbus": "Funzione Modbus"
|
|
126
130
|
}
|
|
127
131
|
},
|
|
132
|
+
"modbus": {
|
|
133
|
+
"formatLegacy": "Messaggio scalare legacy",
|
|
134
|
+
"formatFlex": "Compatibile con Flex Write",
|
|
135
|
+
"areaCoil": "Coil (lettura FC1 / scrittura FC5)",
|
|
136
|
+
"areaDiscreteInput": "Discrete input (lettura FC2, sola lettura)",
|
|
137
|
+
"areaHoldingRegister": "Holding register (lettura FC3 / scrittura FC6)",
|
|
138
|
+
"areaInputRegister": "Input register (lettura FC4, sola lettura)",
|
|
139
|
+
"dataTypeBool": "Booleano",
|
|
140
|
+
"dataTypeUint16": "16 bit senza segno",
|
|
141
|
+
"dataTypeInt16": "16 bit con segno",
|
|
142
|
+
"zeroBasedHint": "Usa l’indirizzo di protocollo zero-based (0–65535), non il riferimento 4xxxx riportato da alcuni manuali.",
|
|
143
|
+
"flexHint": "Flex emette msg.payload = {value,fc,unitid,address,quantity}, collegabile direttamente a modbus-flex-write.",
|
|
144
|
+
"readOnlyHint": "Discrete input e input register sono di sola lettura e possono usare solo Modbus → KNX."
|
|
145
|
+
},
|
|
128
146
|
"labels": {
|
|
129
147
|
"outputKnxToIoT": "Flusso KNX → IoT",
|
|
130
148
|
"outputIoTToKnx": "Ack IoT → KNX",
|
|
@@ -1,16 +1,33 @@
|
|
|
1
1
|
<script type="text/markdown" data-help-name="knxUltimateAI">
|
|
2
2
|
此节点会监听所选 KNX Ultimate 网关上的**所有 KNX 电报**,生成流量统计、检测异常,并可选调用 LLM。
|
|
3
3
|
|
|
4
|
-
编辑器使用两个水平标签页:**AI
|
|
4
|
+
编辑器使用两个水平标签页:**AI 助手**包含配置、知识/上下文以及提供商限制;**对话与家庭**包含聊天输入/输出端口、主动家庭和受限记忆。
|
|
5
5
|
|
|
6
6
|
## 输出
|
|
7
7
|
1. **摘要/统计**(`msg.payload` 为 JSON)
|
|
8
8
|
2. **异常**(`msg.payload` 为 JSON)
|
|
9
9
|
3. **AI 助手**(`msg.payload` 为文本,包含 `msg.summary`)
|
|
10
10
|
4. **KNX 操作**(每个通过验证的读取或写入输出一条 Universal Mode 消息)
|
|
11
|
+
5. **TTS Ultimate**(模型每选择一段语音播报,就输出一条播报消息)
|
|
11
12
|
|
|
12
13
|
输出 3 和输出 4 发出的每条消息还会在 `msg.inputMessage` 中包含原始输入消息的副本。因此,原始 payload、topic、聊天元数据及其他输入属性都可供后续节点使用。克隆或输出错误会被捕获并报告,不会传播到 Node-RED 运行时。
|
|
13
14
|
|
|
15
|
+
### Setup Doctor 与安全首次使用
|
|
16
|
+
自动 **Setup Doctor** 会检查所选网关和 ETS 导入、AI 是否启用、提供商、模型和 API 密钥、提供商连通性、Flow 连线、已检测摄像头以及可选的 TTS Ultimate 连接。它的免费提供商预检仅调用模型列表端点:绝不发送聊天请求,也不消耗推理 token。摄像头和 TTS 均为可选项,不使用它们不会降低核心就绪度。
|
|
17
|
+
|
|
18
|
+
设备清单会显示唯一 KNX 组地址信号的精确数量、ETS 区域/组以及逻辑功能的估算数量。它不会声称物理设备数量,因为无法从 ETS CSV 中可靠推导该数量。Setup Doctor 读取最近一次已部署的 Flow;因此,更改提供商、模型、预设、网关或连线后,必须先部署,再点击**刷新**重新检查。
|
|
19
|
+
|
|
20
|
+
从聊天发送 `/start` 或 `/help`,即可在聊天输出(输出 3)收到确定性且已本地化的欢迎消息,其中包含个性化的安装统计和最多三条安全建议。此引导过程不调用 LLM,不读写 KNX,也不生成 TTS。使用 Telegram 预设时,建议会显示为回复键盘按钮,仅在用户明确选择或发送其中一条后才会执行。在用户明确选择后,初始建议可在需要时执行精确的 KNX 读取;KNX 写入和例程、摄像头操作、TTS、持久记忆更改以及 GA 角色学习仍会被禁止。
|
|
21
|
+
|
|
22
|
+
### Web 智能
|
|
23
|
+
Web 访问默认关闭。启用**允许 AI 使用 Web**后,对话模型可直接根据当前请求选择结构化 Web 工具;不使用关键词、特定主题逻辑或意图分类器。每个用户回合或主动检查周期最多执行三次 Web 操作。所有真实外部 Web 操作共享已配置的滚动小时预算。
|
|
24
|
+
|
|
25
|
+
**允许主动 Web 检查**是独立授权。它还要求用户在 **AI 教育**中编写明确指令,遵守已配置的最短间隔,并且只有在 KNX AI 从至少一次普通聊天请求中记住接收方后才会启动。缺少任一授权时,都不会在后台执行 Web 操作。
|
|
26
|
+
|
|
27
|
+
每条基于 Web 的回答都包含由运行时验证的引用,其中包括已清理的来源 URL 和检索时间,并在可用时提供发布时间。外部内容是不受信任的数据,绝不是指令,也不能取代助手规则或权限。仅接受大小受限的公开 HTTPS 资源;私有、本地、链路本地及云元数据目标、不安全重定向、已认证浏览和 Cookie 都会被阻止。如果无法验证任何来源,KNX AI 会说明此限制,而不会生成无来源的回答。
|
|
28
|
+
|
|
29
|
+
获得已验证的 Web 结果后,如果当前聊天或 AI 教育已授权,模型可组合其他已启用工具。Web 访问绝不会扩大权限:摄像头、TTS 和记忆的可用性,以及 KNX 读写、本地 ETS/DPT 验证和已配置的 KNX 写入确认机制都保持不变。Web 请求会向外部网站或搜索服务公开查询内容及本服务器的公网 IP;KNX/ETS 数据、摄像头内容、聊天标识符、已学习记忆和凭据绝不会被自动加入。
|
|
30
|
+
|
|
14
31
|
## 命令(输入)
|
|
15
32
|
发送 `msg.topic`:
|
|
16
33
|
- `summary`(或空):立即输出摘要
|
|
@@ -43,11 +60,15 @@ Canvas 上的节点状态专门用于显示最近收到的请求,以及 LLM
|
|
|
43
60
|
### 用于聊天按钮的确认请求
|
|
44
61
|
计划等待确认时,输出 3 包含 `msg.knxAi.confirmationRequest`。该对象包括 `required`、`status`、`sessionId`、`expiresAt`、`commandCount`,以及 `actions` 中的两个项目。使用 `action.label` 作为 Telegram 按钮文本,使用 `action.callbackData` 作为回调,并将 `action.message` 发送回 KNX AI,即可在无需输入文本的情况下确认或取消。
|
|
45
62
|
|
|
46
|
-
###
|
|
47
|
-
|
|
63
|
+
### 输入/输出消息适配器
|
|
64
|
+
**聊天输入/输出端口**部分从 `resources/KNXAIChatAdapterMappings.js` 加载可选映射。选择适配器会在内部安装两段预定义的同步 JavaScript 映射:一段在 KNX AI 处理输入前运行,另一段在输出 3 发出消息前运行。这些映射在编辑器中始终保持隐藏。语法和执行错误会被捕获并报告,不会停止 Node-RED。
|
|
48
65
|
|
|
49
66
|
随附的 **windkh/node-red-contrib-telegrambot** 预设遵循该包的 receiver/sender 消息约定。把 `telegram receiver` 直接连接到 KNX AI,并把输出 3 直接连接到 `telegram sender`。确认操作使用一次性 Telegram 回复键盘:点击**确认**或**取消**后,会通过同一个 receiver 返回普通的本地化消息,因此不需要 `telegram event` 或 callback 连线。旧的 `callback_query` 消息仍可接受。输入映射会提取 `msg.payload.content`、`msg.payload.chatId` 和 Telegram 语言;输出映射会创建所需的 `msg.payload.chatId`、`type` 和 `content`,并在写入等待确认时从 `msg.knxAi.confirmationRequest` 添加 `options.reply_markup`。Telegram 包仍是独立的可选依赖项。
|
|
50
67
|
|
|
68
|
+
使用此预设时,只有将 **Provider** 设置为 **OpenAI-compatible**,Telegram 语音消息(`msg.payload.type = "voice"`)才会被自动处理。KNX AI 会在下载任何内容前验证提供商,直接复用其 **Endpoint URL** 和 **API key**,并从同一连接派生 `/audio/transcriptions` 与 `/audio/speech`。包含令牌的 `msg.payload.weblink` 仅用于受限下载,并会在消息到达输出或 LLM 之前删除。OGG/Opus 输入使用内置默认值 `gpt-4o-mini-transcribe` 转录;成功请求会收到由 `gpt-4o-mini-tts` 和 `alloy` 生成的原生 Telegram OGG/Opus 回复,同时保留文字说明和确认键盘。如果选择了其他提供商,用户会收到本地化提示,要求改选 OpenAI-compatible 或发送文字。如果语音合成不可用、失败或超过语音限制,则发送完整文字回复。下载的音频和生成的回复文本都会发送到同一个所选提供商。文字消息、照片以及较早保存的 Telegram 映射仍保持兼容。
|
|
69
|
+
|
|
70
|
+
每条原生语音回复的文字说明都会以本地化的 **AI 生成的语音** 提示开头,Telegram 收件人可以看到该提示。
|
|
71
|
+
|
|
51
72
|
随附的 **RedBot / node-red-contrib-chatbot (Telegram)** 预设遵循 RedBot 的通用消息格式。将 `chatbot-telegram-receive` 直接连接到 KNX AI,并将输出 3 直接连接到 `chatbot-telegram-send`;无需单独的 callback 节点,因为 RedBot 会把内联按钮的 postback 转换成普通入站消息。输入映射读取 `transport`、`chatId`、`type`、`content` 和 Telegram 语言。输出映射保留 RedBot 的 `originalMessage`、`chat`、`api` 和 `client` 跟踪数据,然后发送 `message` payload,或发送带有确认 `postback` 操作的 `inline-buttons` payload。RedBot 仍是独立的可选依赖项。
|
|
52
73
|
|
|
53
74
|
### 自动检测的摄像机适配器
|
|
@@ -58,14 +79,14 @@ Canvas 上的节点状态专门用于显示最近收到的请求,以及 LLM
|
|
|
58
79
|
自动检测到的适配器发布的每个事件都会被标准化,并以 KNX AI 原生紧凑行格式直接追加到 `knxultimatestorage/knxai/adapter-history/<节点ID>/` 下的每日 `YYYY-MM-DD.knxctx` 文件。KNX 报文存档使用相同的紧凑格式,不经过中间 JSON 序列化。存档保留 10 天,保证超过 24 小时的历史,只保存事件元数据,不保存图像。现有 JSONL 存档不会被读取或迁移。总数涵盖所请求区间内的全部存档行;选出的详情仅是相关样本。
|
|
59
80
|
|
|
60
81
|
### 使用 TTS Ultimate 播报
|
|
61
|
-
|
|
82
|
+
将输出 5 连接到可选软件包 `node-red-contrib-tts-ultimate` 中的一个或多个 `ttsultimate` 节点。目标和分发由普通 Node-RED 连线决定;如果 TTS 节点位于另一个 Flow 标签页,请使用 Link Out/Link In。原有的 TTS 节点选择器和内部注入已被移除。输出 1–4 的位置保持不变,但升级后的 Flow 必须实际连接输出 5,语音播报才能到达 TTS Ultimate。
|
|
62
83
|
|
|
63
|
-
模型会根据当前请求、持久聊天指令和用户管理的 AI
|
|
84
|
+
模型会根据当前请求、持久聊天指令和用户管理的 AI 教育自行判断是否准备播报;系统没有播报 intent,也没有触发短语列表。KNX 数值、适配器事件、图像和存档始终是数据而不是指令,但可信的用户指导可以教会模型如何处理这些数据。输出 5 在 `msg.payload` 中发送需要朗读的准确文本,设置 `msg.topic = "knx_ai_announcement"`,并添加 `msg.knxAi.type = "tts_announcement"`、`msg.knxAi.sourceNodeId`、`msg.knxAi.sessionId` 和 `msg.knxAi.reason`。之后由 TTS Ultimate 处理播放器、语音、音量、提示音和队列。
|
|
64
85
|
|
|
65
86
|
### 聊天上下文概览
|
|
66
87
|
节点编辑器会显示一张紧凑卡片,汇总聊天可用的来源:当前 KNX 流量、ETS 语义与 Node-RED 项目、会话和家庭记忆、AI 教育及检测到的摄像机。卡片还会显示用户选择的最大运行上下文和上次聊天提示词的实际 UTF-8 大小;提供商返回输入令牌数时使用精确值,否则明确标为估算值。卡片还会列出 `knxai-chat-context.knxctx`、`knxai-home-memory.md` 和 `knxai-config-<节点-id>.json`,以及 KNX 报文归档的绝对根目录、该节点专用目录和每日文件模式 `YYYY-MM-DD.knxctx`。这些路径会在运行时根据已配置网关实际使用的数据目录解析。
|
|
67
88
|
|
|
68
|
-
模型会把 KNX 读写、摄像机适配器、TTS 播报和持久记忆作为结构化工具。它可以依据当前请求和可信的已学习指导进行语义选择与组合,而不经过语言 intent
|
|
89
|
+
模型会把 KNX 读写、摄像机适配器、TTS 播报和持久记忆作为结构化工具。它可以依据当前请求和可信的已学习指导进行语义选择与组合,而不经过语言 intent 路由。运行时只验证工具参数、摄像机适配器可用性和安全边界;KNX 写入仍保留本地 ETS/DPT 校验和已配置的确认步骤。
|
|
69
90
|
|
|
70
91
|
### 编辑和备份聊天学习
|
|
71
92
|
Node-RED 的 KNX AI 配置中,**对话与家庭**选项卡包含**打开 AI 聊天学习**按钮;它会为当前节点直接打开 Vue Web UI 中的此编辑器。
|
|
@@ -127,10 +148,15 @@ Node-RED 的 KNX AI 配置中,**对话与家庭**选项卡包含**打开 AI
|
|
|
127
148
|
- **Endpoint URL**:chat/completions 接口 URL。
|
|
128
149
|
- **API key**:API Key(本地 Ollama 可不填;Bionic LM Studio 在未启用服务器身份验证时也可不填)。
|
|
129
150
|
- **Model**:模型 ID/名称。
|
|
151
|
+
- **允许 AI 使用 Web**:默认关闭。允许模型按语义选择通用 Web 工具,并返回已验证、已引用的来源。
|
|
152
|
+
- **允许主动 Web 检查**:用于后台检查的独立授权;还需要用户在 **AI 教育**中编写明确指令。
|
|
153
|
+
- **主动检查的最短间隔**:主动检查周期之间的最短时间;不会延迟用户活动回合中请求的 Web 操作。
|
|
154
|
+
- **每小时最多 Web 调用次数**:互动和主动 Web 操作共享的滚动预算。每个回合或周期最多使用三次操作。
|
|
155
|
+
- **Telegram 语音**:仅在选择 **OpenAI-compatible** 提供商时可用。它会自动复用该提供商的端点和 API 密钥,并使用内置默认值 `gpt-4o-mini-transcribe`、`gpt-4o-mini-tts` 和 `alloy`;不再提供单独的语音设置。
|
|
130
156
|
- **聊天模型兼容性**:所选模型必须支持已配置的 Chat Completions 端点。刷新模型列表时,会排除仅支持旧版 completions 的模型,例如 `gpt-3.5-turbo-instruct`。如果提供商拒绝自定义 temperature 值或令牌限制参数,KNX AI 会仅移除或替换不兼容字段后重试。
|
|
131
157
|
- **允许 AI 读取 KNX 状态并控制执行器**:启用输出 4,默认关闭。可以读取 ETS 目录中的精确对象;仅接受写入明确标记为 `command` 的对象。未知、DPT 不匹配、无效或数量过多的操作,以及向状态或中性对象的写入,都会在本地被拒绝。
|
|
132
158
|
- **发送 KNX 命令前请求确认**:默认启用。先显示已验证的修改,在同一聊天会话确认前不会发送任何 KNX 命令。有命令等待确认时,回复始终会使用当前请求的语言附加准确的确认或取消说明。命令会在输出前再次验证。
|
|
133
|
-
-
|
|
159
|
+
- **输入/输出消息适配器**:默认为**无适配器**。选择后会加载预定义的输入和输出映射;两者在编辑器中始终保持隐藏。
|
|
134
160
|
- **AI 教育**:仅由用户管理的权威指导,AI 可以读取但永远不能修改。主动通知及其条件、持续时间、静默时段和重复频率只能在这里定义。
|
|
135
161
|
- 软件包附带的帮助、README、更新日志、Wiki 和示例片段不会加入 Telegram、RedBot 或自定义 CHAT 的提示词;仅网页助手在回答软件包技术问题时仍可使用这些内容。
|
|
136
162
|
- **Refresh** 按钮:请求 provider 并加载可用模型 ID。加载期间图标会旋转;成功完成时不会显示额外消息。
|