node-red-contrib-knx-ultimate 6.3.22 → 6.3.25
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 +19 -0
- package/examples/IoT Bridge - Modbus Flex Adapter.json +361 -0
- package/examples/KNX AI - Telegrambot Direct Chat.json +1 -17
- package/nodes/knxUltimate-config.js +13 -4
- package/nodes/knxUltimateAI.html +142 -15
- package/nodes/knxUltimateAI.js +734 -163
- package/nodes/knxUltimateIoTBridge.html +349 -20
- package/nodes/knxUltimateIoTBridge.js +474 -44
- package/nodes/locales/de/knxUltimateAI.html +26 -8
- package/nodes/locales/de/knxUltimateAI.json +11 -1
- package/nodes/locales/de/knxUltimateIoTBridge.html +28 -2
- package/nodes/locales/de/knxUltimateIoTBridge.json +20 -2
- package/nodes/locales/en/knxUltimateAI.html +26 -8
- package/nodes/locales/en/knxUltimateAI.json +11 -1
- package/nodes/locales/en/knxUltimateIoTBridge.html +28 -2
- package/nodes/locales/en/knxUltimateIoTBridge.json +20 -2
- package/nodes/locales/es/knxUltimateAI.html +26 -8
- package/nodes/locales/es/knxUltimateAI.json +11 -1
- package/nodes/locales/es/knxUltimateIoTBridge.html +28 -2
- package/nodes/locales/es/knxUltimateIoTBridge.json +20 -2
- package/nodes/locales/fr/knxUltimateAI.html +26 -8
- package/nodes/locales/fr/knxUltimateAI.json +11 -1
- package/nodes/locales/fr/knxUltimateIoTBridge.html +28 -2
- package/nodes/locales/fr/knxUltimateIoTBridge.json +20 -2
- package/nodes/locales/it/knxUltimateAI.html +26 -8
- package/nodes/locales/it/knxUltimateAI.json +11 -1
- package/nodes/locales/it/knxUltimateIoTBridge.html +28 -2
- package/nodes/locales/it/knxUltimateIoTBridge.json +20 -2
- package/nodes/locales/zh-CN/knxUltimateAI.html +26 -8
- package/nodes/locales/zh-CN/knxUltimateAI.json +11 -1
- 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/knxAiChatContext.js +181 -84
- package/nodes/utils/knxAiEventHistory.js +275 -0
- package/package.json +3 -3
- package/resources/KNXAIChatAdapterMappings.js +14 -12
|
@@ -25,9 +25,13 @@ Se l'elaborazione dura più di 1,2 secondi, l'uscita 3 emette subito il messaggi
|
|
|
25
25
|
|
|
26
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
27
|
|
|
28
|
+
Per i provider locali, **Quantità contesto chat** permette di scegliere esplicitamente 4K, 8K o 16K; 16K resta il valore predefinito. La scelta limita proporzionalmente i dati KNX, memoria, progetto Node-RED e adapter forniti al modello, mantenendo completo il contratto degli strumenti dell’agente. Nessuna funzione viene abilitata o disabilitata in base a formulazioni, parole chiave o intent linguistici.
|
|
29
|
+
|
|
28
30
|
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
31
|
|
|
30
|
-
Ogni sessione Ask/chat conserva gli ultimi 8 turni e fino a 20 istruzioni
|
|
32
|
+
Ogni sessione Ask/chat conserva gli ultimi 8 turni e fino a 20 istruzioni a lungo termine scelte dal modello, separate per `msg.knxAi.sessionId`, `msg.sessionId` o chat ID Telegram rilevato. È il modello a decidere semanticamente quando il significato di una conversazione vada ricordato o dimenticato tramite lo strumento di memoria strutturato: non esistono liste di parole chiave o intent linguistici. 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.knxctx`. 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"`.
|
|
33
|
+
La memoria recente della sessione viene collocata immediatamente accanto alla richiesta corrente, così i modelli locali mantengono fatti forniti dall'utente, come nome preferito o lingua, anche dentro un prompt KNX molto grande. Il modello può rendere persistenti fatti, preferenze e istruzioni durevoli tramite `memoryActions`; resta una scelta semantica dello strumento, senza classificatori di frasi o routing per intent. Credenziali, codici di sicurezza e API key non devono mai essere appresi.
|
|
34
|
+
|
|
31
35
|
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.
|
|
32
36
|
|
|
33
37
|
### Letture KNX aggiornate
|
|
@@ -42,24 +46,38 @@ Quando un piano è in attesa, l'uscita 3 contiene `msg.knxAi.confirmationRequest
|
|
|
42
46
|
### Preset adattatori chat
|
|
43
47
|
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.
|
|
44
48
|
|
|
45
|
-
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
|
|
49
|
+
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.
|
|
46
50
|
|
|
47
51
|
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.
|
|
48
52
|
|
|
49
53
|
### Adapter telecamera rilevati automaticamente
|
|
50
54
|
I pacchetti di telecamere installati possono pubblicare a runtime un adapter per KNX AI. Non esistono selettori né nodi telecamera da collegare a KNX AI: adapter, controller e telecamere disponibili vengono rilevati automaticamente e inseriti nel contesto della chat. `node-red-contrib-unifi-ultimate` è il primo provider supportato; altri pacchetti, come `hikvision-ultimate`, possono registrarsi tramite lo stesso contratto indipendente dal produttore.
|
|
51
55
|
|
|
52
|
-
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.
|
|
56
|
+
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.knxctx` 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.
|
|
53
57
|
|
|
54
|
-
Ogni evento pubblicato da un adapter rilevato automaticamente viene normalizzato e aggiunto a un file giornaliero `YYYY-MM-DD.
|
|
58
|
+
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.
|
|
55
59
|
|
|
56
60
|
### Annunci con TTS Ultimate
|
|
57
61
|
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.
|
|
58
62
|
|
|
59
|
-
|
|
63
|
+
Il modello decide se usare questo adapter 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. KNX AI invia il testo scelto direttamente al nodo come `msg.payload`, con `msg.topic = "knx_ai_announcement"`; non servono collegamenti intermedi nel flow. TTS Ultimate gestisce poi player Sonos, voce, volume, hailing e coda.
|
|
60
64
|
|
|
61
65
|
### Riepilogo del contesto della chat
|
|
62
|
-
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 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.
|
|
66
|
+
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
|
+
|
|
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.
|
|
69
|
+
|
|
70
|
+
### Modifica e backup dell'apprendimento CHAT
|
|
71
|
+
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.
|
|
72
|
+
|
|
73
|
+
Nella UI web Vue, apri **Impostazioni → Apprendimento AI Chat** per visualizzare e modificare il file condiviso esatto `knxai-chat-context.knxctx` e il suo percorso assoluto. Il file può essere copiato, scaricato come backup o ripristinato da un altro file `.knxctx`. **Re-inizializza memoria**, protetto da una conferma esplicita, lo sostituisce con un nuovo contesto vuoto e cancella sessioni, istruzioni, sorveglianze telecamera e conferme chat pendenti in ogni nodo KNX AI che usa lo stesso archivio. I record nativi separati da tabulazioni `KNXAI_CHAT_CONTEXT 3` sono autorevoli e direttamente modificabili: `SESSION` contiene record `INSTRUCTION`, `TURN` e `CAMERA_WATCH` fino a `END_SESSION`. Il salvataggio valida e limita questi record, riscrive atomicamente il file e aggiorna il contesto attivo di ogni nodo KNX AI che usa lo stesso archivio. Un controllo di revisione impedisce di sovrascrivere o azzerare l'apprendimento cambiato dopo il caricamento nell'editor.
|
|
74
|
+
|
|
75
|
+
È supportato soltanto il formato nativo V3. I precedenti file Markdown/JSON V2 e Base64 V1 non vengono volutamente letti, importati né migrati; il vecchio file `.md` resta intatto e KNX AI avvia un nuovo contesto `.knxctx`. Restano validi i limiti di 50 sessioni e 512 KB.
|
|
76
|
+
|
|
77
|
+
### Ruoli appresi dei group address KNX
|
|
78
|
+
Il ruolo `neutral` indica un'incertezza iniziale, non un divieto permanente di controllo. Il modello può usare lo strumento strutturato `gaRoleActions` per imparare che un group address ETS esatto è un oggetto di comando, stato o neutro partendo dall'insegnamento autorevole dell'utente, dalle indicazioni persistenti della chat, dall'Educazione AI o da una semantica inequivocabile del progetto ETS. Non servono parole chiave né intent di ruolo; se le prove sono ambigue, il modello chiede un chiarimento invece di imparare.
|
|
79
|
+
|
|
80
|
+
Ruolo, motivazione e prova appresi vengono salvati per nodo in `<userDir>/knxai/config/knxai-config-<id-nodo>.json` e sincronizzati nella memoria semantica domestica limitata. Un ruolo appreso come `command` può rendere valida una scrittura già nella stessa risposta e resta disponibile dopo il riavvio; il modello può anche dimenticarlo e ripristinare la classificazione automatica. L'apprendimento non può inventare un GA, cambiarne il DPT ETS, aggirare la validazione del payload o saltare la conferma di scrittura configurata.
|
|
63
81
|
|
|
64
82
|
## Intelligenza domestica proattiva guidata dall'Educazione e memoria limitata
|
|
65
83
|
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à.
|
|
@@ -131,7 +149,7 @@ Di seguito sono elencati tutti i campi presenti nell'editor del nodo KNX AI.
|
|
|
131
149
|
- **2) Installalo**: scarica e installa localmente il modello (esempio `llama3.1`).
|
|
132
150
|
- Durante refresh/installazione, KNX AI prova anche ad avviare automaticamente il server Ollama quando possibile.
|
|
133
151
|
- Se l'installazione fallisce per errore di connessione, verifica che Ollama sia avviato (app desktop o `ollama serve`).
|
|
134
|
-
- Il contesto massimo dichiarato da `/api/show` resta informativo. KNX AI invia
|
|
152
|
+
- Il contesto massimo dichiarato da `/api/show` resta informativo. KNX AI invia come `num_ctx` il budget scelto di 4K, 8K o 16K (oppure il massimo del modello se inferiore) e limita proporzionalmente ogni fonte di contesto senza rimuovere capacità dell'agente.
|
|
135
153
|
- Se Node-RED gira in Docker, usa `host.docker.internal` al posto di `localhost` nell'endpoint.
|
|
136
154
|
|
|
137
155
|
### Setup rapido Bionic LM Studio (locale)
|
|
@@ -139,7 +157,7 @@ Di seguito sono elencati tutti i campi presenti nell'editor del nodo KNX AI.
|
|
|
139
157
|
- Avvia il server API di LM Studio dalla pagina **Developer** oppure con `lms server start`.
|
|
140
158
|
- Endpoint predefinito: `http://localhost:1234/v1/chat/completions`.
|
|
141
159
|
- Premi **Aggiorna** per caricare tutti i modelli esposti da `/v1/models`; se non è configurato un modello viene selezionato il primo.
|
|
142
|
-
- Se un modello è già caricato, KNX AI conserva la lunghezza del contesto attiva. KNX AI non carica mai un modello Bionic inattivo tramite l'API di gestione: la prima richiesta chat lascia che Bionic lo carichi JIT con i valori predefiniti salvati per il modello. Indipendentemente dal contesto dichiarato da Bionic, KNX AI
|
|
160
|
+
- Se un modello è già caricato, KNX AI conserva la lunghezza del contesto attiva. KNX AI non carica mai un modello Bionic inattivo tramite l'API di gestione: la prima richiesta chat lascia che Bionic lo carichi JIT con i valori predefiniti salvati per il modello. Indipendentemente dal contesto dichiarato da Bionic, KNX AI usa il budget prompt scelto di 4K, 8K o 16K e mantiene disponibili ragionamento, KNX, routine, telecamere e TTS.
|
|
143
161
|
- La API key è opzionale, salvo autenticazione attiva nelle impostazioni del server LM Studio. In Docker sostituisci `localhost` con `host.docker.internal`.
|
|
144
162
|
|
|
145
163
|
## Nota sicurezza
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"groupChatHome": "Conversazioni e casa",
|
|
7
7
|
"detectedAdapters": "Adapter rilevati automaticamente",
|
|
8
8
|
"chatContextOverview": "Contesto disponibile alla chat",
|
|
9
|
+
"chatLearning": "Apprendimento AI Chat",
|
|
9
10
|
"quickSetup": "Configurazione assistente",
|
|
10
11
|
"llmConnection": "Connessione Assistente AI",
|
|
11
12
|
"chatAdapter": "Canali chat",
|
|
@@ -21,6 +22,7 @@
|
|
|
21
22
|
"llmBaseUrl": "URL endpoint",
|
|
22
23
|
"llmApiKey": "API key",
|
|
23
24
|
"llmModel": "Modello",
|
|
25
|
+
"llmPromptContextTokens": "Quantità contesto chat",
|
|
24
26
|
"llmSystemPrompt": "Prompt di sistema",
|
|
25
27
|
"llmIncludeRaw": "Includi payload raw in hex",
|
|
26
28
|
"llmAllowKnxCommands": "Consenti all'AI di leggere stati KNX e comandare attuatori",
|
|
@@ -45,6 +47,11 @@
|
|
|
45
47
|
"ollama": "Ollama (locale)",
|
|
46
48
|
"lmstudio": "Bionic LM Studio"
|
|
47
49
|
},
|
|
50
|
+
"promptContext": {
|
|
51
|
+
"small": "Ridotto (4K, più veloce)",
|
|
52
|
+
"medium": "Medio (8K)",
|
|
53
|
+
"full": "Completo (16K)"
|
|
54
|
+
},
|
|
48
55
|
"chatAdapter": {
|
|
49
56
|
"none": "Nessun adattatore"
|
|
50
57
|
},
|
|
@@ -57,7 +64,8 @@
|
|
|
57
64
|
"refreshModels": "Aggiorna",
|
|
58
65
|
"installOllamaModel": "2) Installalo",
|
|
59
66
|
"ollamaLibrary": "Libreria modelli",
|
|
60
|
-
"downloadOllamaModel": "1) Scarica il modello"
|
|
67
|
+
"downloadOllamaModel": "1) Scarica il modello",
|
|
68
|
+
"openChatLearning": "Apri Apprendimento AI Chat"
|
|
61
69
|
},
|
|
62
70
|
"messages": {
|
|
63
71
|
"loadingModels": "Carico i modelli…",
|
|
@@ -69,6 +77,7 @@
|
|
|
69
77
|
"lmStudioContextFailed": "Impossibile configurare il contesto del modello",
|
|
70
78
|
"lmStudioContextCurrentlyLoaded": "attualmente caricato",
|
|
71
79
|
"localContextBudget": "Budget contesto KNX AI",
|
|
80
|
+
"promptContextHint": "Controlla la quantità di contesto KNX, memoria, progetto e adapter inviata ai modelli locali. Non abilita o disabilita strumenti e non usa intent linguistici.",
|
|
72
81
|
"ollamaNotSupported": "Modalita locale Ollama: API key non richiesta. Endpoint predefinito: http://localhost:11434/api/chat.",
|
|
73
82
|
"ollamaNoModels": "Nessun modello Ollama locale trovato. Installa un modello o scegli dalla libreria.",
|
|
74
83
|
"installingOllamaModel": "Avvio Ollama e installo il modello…",
|
|
@@ -88,6 +97,7 @@
|
|
|
88
97
|
"ttsUltimateHint": "Le richieste esplicite di annuncio della chat vengono inviate direttamente al nodo scelto; non servono collegamenti nel flow.",
|
|
89
98
|
"chatContextLoading": "Caricamento del riepilogo del contesto…",
|
|
90
99
|
"chatContextUnavailable": "Il riepilogo del contesto della chat non è momentaneamente disponibile.",
|
|
100
|
+
"chatLearningOpenHint": "Apri la Web UI direttamente nell’editor dell’apprendimento CHAT condiviso per visualizzare, modificare, copiare o salvare il suo file persistente.",
|
|
91
101
|
"chatContextIntro": "La chat riceve automaticamente queste fonti. I percorsi sottostanti sono quelli effettivi usati da questa installazione Node-RED.",
|
|
92
102
|
"chatContextLimitLabel": "Contesto operativo massimo",
|
|
93
103
|
"chatContextProviderManaged": "gestito dal provider/modello selezionato",
|
|
@@ -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",
|
|
@@ -25,9 +25,13 @@
|
|
|
25
25
|
|
|
26
26
|
Ollama 和 Bionic LM Studio 请求会自动使用至少 10 分钟的超时时间;云端提供商仍使用至少 2 分钟。编辑器中无需维护超时字段。即使达到本地模型限制,KNX AI 也会说明模型未完成响应,并建议重试或缩减提示上下文。
|
|
27
27
|
|
|
28
|
+
对于本地提供商,**聊天上下文量**可明确选择 4K、8K 或 16K;默认仍为 16K。该选择会按比例限制发送给模型的 KNX、记忆、Node-RED 项目和适配器数据,同时保留完整的代理工具协议。任何能力都不会因措辞、关键词或语言 intent 而被启用或禁用。
|
|
29
|
+
|
|
28
30
|
Canvas 上的节点状态专门用于显示最近收到的请求,以及 LLM 运行期间本地化的“我正在思考…”状态。KNX 报文、网关更新、流量速率、ready 消息和技术结果绝不会覆盖该状态;这些信息仍可通过节点输出、日志和助手数据查看。
|
|
29
31
|
|
|
30
|
-
每个 Ask/聊天会话都会保留最近 8 轮对话和最多 20
|
|
32
|
+
每个 Ask/聊天会话都会保留最近 8 轮对话和最多 20 条由模型选择的长期指令,并按 `msg.knxAi.sessionId`、`msg.sessionId` 或检测到的 Telegram 聊天 ID 隔离。模型通过结构化记忆工具,按语义判断一段对话的含义应被记住还是遗忘;系统不使用语言关键词或 intent 列表。使用相同存储的所有 KNX AI 节点实时共享此上下文,并在 Node-RED 重启后从 `knxultimatestorage/knxai/memory/knxai-chat-context.knxctx` 重新加载。该文件采用原子写入,最多保存 50 个会话且不超过 512 KB。启用 KNX 控制后,将输出 3 连接到聊天发送节点,将输出 4 连接到配置为**通用模式**的 KNX Ultimate 节点。启用确认后,第一条回复会显示 GA、DPT 和 payload,但不会发送写入;同一会话必须在 5 分钟内回复“确认”或“取消”。新请求会替换旧的待处理计划。每条已确认命令都包含 `msg.destination`、`msg.dpt`、`msg.payload` 和 `msg.event = "GroupValue_Write"`。
|
|
33
|
+
最近的会话记忆会紧邻当前请求放置,使本地模型即使面对很大的 KNX 提示,也能保留用户提供的事实,例如首选姓名或语言。模型可以通过 `memoryActions` 持久保存耐久的事实、偏好和指令;这仍是没有短语分类器或 intent 路由的语义工具选择。凭据、安全代码和 API 密钥绝不能被学习。
|
|
34
|
+
|
|
31
35
|
对于 DPT 1.xxx 写入,AI 生成的安全等价值 `true`/`false`、`1`/`0` 和 `on`/`off` 会在本地校验和输出前统一转换为真正的布尔值。
|
|
32
36
|
|
|
33
37
|
### 最新 KNX 读取
|
|
@@ -42,24 +46,38 @@ Canvas 上的节点状态专门用于显示最近收到的请求,以及 LLM
|
|
|
42
46
|
### 聊天适配器预设
|
|
43
47
|
**聊天适配器**选项卡从 `resources/KNXAIChatAdapterMappings.js` 加载可选映射。选择预设会在内部安装两段预定义的同步 JavaScript 映射:一段在 KNX AI 处理输入前运行,另一段在输出 3 发出消息前运行。这些映射在编辑器中始终保持隐藏。语法和执行错误会被捕获并报告,不会停止 Node-RED。
|
|
44
48
|
|
|
45
|
-
随附的 **windkh/node-red-contrib-telegrambot** 预设遵循该包的 receiver/sender 消息约定。把 `telegram receiver` 直接连接到 KNX AI,并把输出 3 直接连接到 `telegram sender
|
|
49
|
+
随附的 **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 包仍是独立的可选依赖项。
|
|
46
50
|
|
|
47
51
|
随附的 **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 仍是独立的可选依赖项。
|
|
48
52
|
|
|
49
53
|
### 自动检测的摄像机适配器
|
|
50
54
|
已安装的摄像机软件包可以在运行时向 KNX AI 发布适配器。无需选择器,也无需将摄像机节点连接到 KNX AI:可用的适配器、控制器和摄像机会被自动检测并加入聊天上下文。`node-red-contrib-unifi-ultimate` 是首个受支持的提供方;`hikvision-ultimate` 等其他软件包可通过同一套厂商无关协议注册。
|
|
51
55
|
|
|
52
|
-
用户可以请求当前快照,或询问视觉模型画面中可见的内容。Telegram 和 RedBot 预设会把图像作为带说明文字的原生照片发送。用户还可以为移动、智能越线或进入入侵/徘徊区域创建持久通知,并可按检测到的人员以及指定名称的线或区域进行限制。这些规则保存在同一个 `knxai-chat-context.
|
|
56
|
+
用户可以请求当前快照,或询问视觉模型画面中可见的内容。Telegram 和 RedBot 预设会把图像作为带说明文字的原生照片发送。用户还可以为移动、智能越线或进入入侵/徘徊区域创建持久通知,并可按检测到的人员以及指定名称的线或区域进行限制。这些规则保存在同一个 `knxai-chat-context.knxctx` 文件中,并在 Node-RED 重启后恢复。UniFi 事件订阅和快照请求直接通过检测到的提供方完成;不会使用 KNX AI 输出 4,也不需要中间 Flow 连线。
|
|
53
57
|
|
|
54
|
-
|
|
58
|
+
自动检测到的适配器发布的每个事件都会被标准化,并以 KNX AI 原生紧凑行格式直接追加到 `knxultimatestorage/knxai/adapter-history/<节点ID>/` 下的每日 `YYYY-MM-DD.knxctx` 文件。KNX 报文存档使用相同的紧凑格式,不经过中间 JSON 序列化。存档保留 10 天,保证超过 24 小时的历史,只保存事件元数据,不保存图像。现有 JSONL 存档不会被读取或迁移。总数涵盖所请求区间内的全部存档行;选出的详情仅是相关样本。
|
|
55
59
|
|
|
56
60
|
### 使用 TTS Ultimate 播报
|
|
57
61
|
安装可选软件包 `node-red-contrib-tts-ultimate` 后,它会显示在自动检测的适配器中。选择器会列出项目所有 Flow 中的全部 `ttsultimate` 节点,并显示 Flow、节点名称和已配置的播放器。请选择负责聊天播报的节点,然后部署 Flow。
|
|
58
62
|
|
|
59
|
-
|
|
63
|
+
模型会根据当前请求、持久聊天指令和用户管理的 AI 教育自行判断是否使用此适配器;系统没有播报 intent,也没有触发短语列表。KNX 数值、适配器事件、图像和存档始终是数据而不是指令,但可信的用户指导可以教会模型如何处理这些数据。KNX AI 会将选定文本作为 `msg.payload` 直接发送到所选节点,并设置 `msg.topic = "knx_ai_announcement"`;之后由 TTS Ultimate 处理 Sonos 播放器、语音、音量、提示音和队列。
|
|
60
64
|
|
|
61
65
|
### 聊天上下文概览
|
|
62
|
-
节点编辑器会显示一张紧凑卡片,汇总聊天可用的来源:当前 KNX 流量、ETS 语义与 Node-RED 项目、会话和家庭记忆、AI
|
|
66
|
+
节点编辑器会显示一张紧凑卡片,汇总聊天可用的来源:当前 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
|
+
|
|
68
|
+
模型会把 KNX 读写、摄像机适配器、TTS 播报和持久记忆作为结构化工具。它可以依据当前请求和可信的已学习指导进行语义选择与组合,而不经过语言 intent 路由。运行时只验证工具参数、适配器可用性和安全边界;KNX 写入仍保留本地 ETS/DPT 校验和已配置的确认步骤。
|
|
69
|
+
|
|
70
|
+
### 编辑和备份聊天学习
|
|
71
|
+
Node-RED 的 KNX AI 配置中,**对话与家庭**选项卡包含**打开 AI 聊天学习**按钮;它会为当前节点直接打开 Vue Web UI 中的此编辑器。
|
|
72
|
+
|
|
73
|
+
在 Vue Web UI 中打开**设置 → AI 聊天学习**,即可查看和编辑准确的共享文件 `knxai-chat-context.knxctx` 及其绝对路径。可复制该文件、下载备份,或从另一个 `.knxctx` 文件恢复。**重新初始化记忆**操作受明确确认保护;它会用新的空白上下文替换该文件,并清除使用同一存储的所有 KNX AI 节点中的已保存会话、指令、摄像机监视和待处理聊天确认。以制表符分隔的原生 `KNXAI_CHAT_CONTEXT 3` 记录是权威数据,并可直接编辑:`SESSION` 包含 `INSTRUCTION`、`TURN` 和 `CAMERA_WATCH` 记录,直至 `END_SESSION`。保存时会验证并限制这些记录、以原子方式重写文件,并立即更新所有相关节点的活动上下文。修订检查会拒绝覆盖或重置编辑器加载后又发生变化的学习内容。
|
|
74
|
+
|
|
75
|
+
仅支持原生 V3 格式。旧版 Markdown/JSON V2 和 Base64 V1 文件不会被读取、导入或迁移;旧的 `.md` 文件保持不变,KNX AI 会启动新的 `.knxctx` 上下文。仍保留 50 个会话和 512 KB 的限制。
|
|
76
|
+
|
|
77
|
+
### 学习到的 KNX 组地址角色
|
|
78
|
+
`neutral` 角色表示初始不确定性,而不是永久禁止控制。模型可以使用结构化工具 `gaRoleActions`,根据可信的用户教学、持久聊天指导、AI 教育或明确无歧义的 ETS 项目语义,学习某个准确的 ETS 组地址属于命令、状态或中性对象。无需固定关键词或角色 intent;如果证据不明确,模型会先询问澄清,而不会擅自学习。
|
|
79
|
+
|
|
80
|
+
学习到的角色、原因和证据会按节点保存到 `<userDir>/knxai/config/knxai-config-<节点-id>.json`,并同步到受限的家庭语义记忆。学习为 `command` 的角色可以在同一条回复中使写入通过验证,并在重启后继续可用;模型也可以忘记它并恢复自动分类。学习过程不能虚构 GA、修改其 ETS DPT、绕过 payload 校验或跳过已配置的写入确认。
|
|
63
81
|
|
|
64
82
|
## 由 AI 教育驱动的主动家庭智能与有限记忆
|
|
65
83
|
节点会根据 ETS 层级、名称、角色和 DPT 建立确定性的语义模型。不再提供单独的开关或高级主动通知设置。只有启用 LLM 且 **AI 教育**明确要求时,系统才会评估通知。条件、持续时间、静默时段和重复频率完全由 AI 教育定义。没有明确规则或 LLM 无法评估时,不会发送任何消息。
|
|
@@ -125,7 +143,7 @@ Canvas 上的节点状态专门用于显示最近收到的请求,以及 LLM
|
|
|
125
143
|
- **2) Install it**:在本机下载并安装模型(例如 `llama3.1`)。
|
|
126
144
|
- 在刷新/安装模型时,KNX AI 也会在可能情况下尝试自动启动 Ollama 服务。
|
|
127
145
|
- 若安装因连接错误失败,请确认 Ollama 已运行(桌面应用或 `ollama serve`)。
|
|
128
|
-
- `/api/show` 报告的最大上下文仅用于显示。KNX AI
|
|
146
|
+
- `/api/show` 报告的最大上下文仅用于显示。KNX AI 会将所选的 4K、8K 或 16K 预算作为 `num_ctx` 发送(若模型最大值更小则使用该值),并按比例限制每个上下文来源,同时保留代理能力。
|
|
129
147
|
- 若 Node-RED 运行在 Docker 中,endpoint 请使用 `host.docker.internal` 替代 `localhost`。
|
|
130
148
|
|
|
131
149
|
### Bionic LM Studio 快速配置(本地)
|
|
@@ -133,7 +151,7 @@ Canvas 上的节点状态专门用于显示最近收到的请求,以及 LLM
|
|
|
133
151
|
- 在 LM Studio 的 **Developer** 页面启动 API 服务,或运行 `lms server start`。
|
|
134
152
|
- 默认 endpoint:`http://localhost:1234/v1/chat/completions`。
|
|
135
153
|
- 点击 **Refresh** 加载 `/v1/models` 提供的全部模型;未配置模型时会自动选择第一个。
|
|
136
|
-
- 如果模型已加载,KNX AI 会保留其当前上下文长度。KNX AI 不会通过管理 API 加载未运行的 Bionic 模型:首次聊天请求会让 Bionic 根据该模型已保存的默认值进行 JIT 加载。无论 Bionic 报告的上下文是多少,KNX AI
|
|
154
|
+
- 如果模型已加载,KNX AI 会保留其当前上下文长度。KNX AI 不会通过管理 API 加载未运行的 Bionic 模型:首次聊天请求会让 Bionic 根据该模型已保存的默认值进行 JIT 加载。无论 Bionic 报告的上下文是多少,KNX AI 都会使用所选的 4K、8K 或 16K 提示预算,并保留推理、KNX、例程、摄像头和 TTS 能力。
|
|
137
155
|
- 除非在 LM Studio 服务设置中启用了身份验证,否则 API Key 可留空。在 Docker 中请将 `localhost` 替换为 `host.docker.internal`。
|
|
138
156
|
|
|
139
157
|
## 安全说明
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"groupChatHome": "对话与家庭",
|
|
7
7
|
"detectedAdapters": "自动检测到的适配器",
|
|
8
8
|
"chatContextOverview": "聊天上下文概览",
|
|
9
|
+
"chatLearning": "AI 聊天学习",
|
|
9
10
|
"quickSetup": "助手配置",
|
|
10
11
|
"llmConnection": "AI 助手连接",
|
|
11
12
|
"chatAdapter": "聊天渠道",
|
|
@@ -21,6 +22,7 @@
|
|
|
21
22
|
"llmBaseUrl": "Endpoint URL",
|
|
22
23
|
"llmApiKey": "API key",
|
|
23
24
|
"llmModel": "Model",
|
|
25
|
+
"llmPromptContextTokens": "聊天上下文量",
|
|
24
26
|
"llmSystemPrompt": "System prompt",
|
|
25
27
|
"llmIncludeRaw": "Include raw payload hex",
|
|
26
28
|
"llmAllowKnxCommands": "允许 AI 读取 KNX 状态并控制执行器",
|
|
@@ -45,6 +47,11 @@
|
|
|
45
47
|
"ollama": "Ollama(本地)",
|
|
46
48
|
"lmstudio": "Bionic LM Studio"
|
|
47
49
|
},
|
|
50
|
+
"promptContext": {
|
|
51
|
+
"small": "精简(4K,更快)",
|
|
52
|
+
"medium": "中等(8K)",
|
|
53
|
+
"full": "完整(16K)"
|
|
54
|
+
},
|
|
48
55
|
"chatAdapter": {
|
|
49
56
|
"none": "无适配器"
|
|
50
57
|
},
|
|
@@ -61,6 +68,7 @@
|
|
|
61
68
|
"lmStudioContextFailed": "无法配置模型上下文",
|
|
62
69
|
"lmStudioContextCurrentlyLoaded": "当前已加载",
|
|
63
70
|
"localContextBudget": "KNX AI 上下文预算",
|
|
71
|
+
"promptContextHint": "控制发送给本地模型的 KNX、记忆、项目和适配器上下文量。它不会启用或禁用工具,也不使用 intent 路由。",
|
|
64
72
|
"ollamaNotSupported": "Ollama local mode: API key not required. Default endpoint is http://localhost:11434/api/chat.",
|
|
65
73
|
"ollamaNoModels": "No local Ollama model found. Install one or pick one from the library.",
|
|
66
74
|
"installingOllamaModel": "Starting Ollama and installing model…",
|
|
@@ -80,6 +88,7 @@
|
|
|
80
88
|
"ttsUltimateHint": "聊天中的明确播报请求会直接发送到所选节点,无需在 Flow 中额外连线。",
|
|
81
89
|
"chatContextLoading": "正在加载聊天上下文摘要…",
|
|
82
90
|
"chatContextUnavailable": "聊天上下文摘要暂时不可用。",
|
|
91
|
+
"chatLearningOpenHint": "直接在 Web UI 中打开共享 CHAT 学习编辑器,以查看、编辑、复制或备份其持久文件。",
|
|
83
92
|
"chatContextIntro": "聊天会自动接收这些来源。以下路径是此 Node-RED 安装实际使用的路径。",
|
|
84
93
|
"chatContextLimitLabel": "最大运行上下文",
|
|
85
94
|
"chatContextProviderManaged": "由所选提供商/模型管理",
|
|
@@ -172,7 +181,8 @@
|
|
|
172
181
|
"buttons": {
|
|
173
182
|
"installOllamaModel": "2) Install it",
|
|
174
183
|
"ollamaLibrary": "Model library",
|
|
175
|
-
"downloadOllamaModel": "1) Download model"
|
|
184
|
+
"downloadOllamaModel": "1) Download model",
|
|
185
|
+
"openChatLearning": "打开 AI 聊天学习"
|
|
176
186
|
}
|
|
177
187
|
}
|
|
178
188
|
}
|
|
@@ -45,7 +45,8 @@ KNX 总线的值会发布到 MQTT,可写的数据点接受来自 Home Assistan
|
|
|
45
45
|
## 映射字段
|
|
46
46
|
|
|
47
47
|
- **方向** — 选择 KNX→IoT、IoT→KNX 或双向。
|
|
48
|
-
- **通道类型** — MQTT 将目标视为主题;REST 将其视为基础 URL
|
|
48
|
+
- **通道类型** — MQTT 将目标视为主题;REST 将其视为基础 URL;对于 Modbus,**目标**是从零开始的协议地址(0–65535)。
|
|
49
|
+
- **Modbus 格式 / Unit ID / 区域 / 数据类型** — 新映射请选择**兼容 Flex Write**,然后选择单元、内存区域以及 `bool`、`uint16` 或 `int16`。如果没有格式字段,则继续使用旧版标量协议,现有 Flow 不受影响。
|
|
49
50
|
- **缩放 & 偏移** — 应用于 KNX→IoT;在 IoT→KNX 时使用逆向变换。
|
|
50
51
|
- **模板** — 可选字符串,可替换 `{{value}}`、`{{ga}}`、`{{label}}`、`{{target}}`、`{{type}}`、`{{isoTimestamp}}`。
|
|
51
52
|
- **超时 / 重试** — 信息字段,用于告知下游节点应如何处理重试和时间窗口。
|
|
@@ -88,7 +89,32 @@ KNX 总线的值会发布到 MQTT,可写的数据点接受来自 Home Assistan
|
|
|
88
89
|
|
|
89
90
|
### Modbus 寄存器同步
|
|
90
91
|
|
|
91
|
-
|
|
92
|
+
本桥接节点是 `node-red-contrib-modbus` 的消息适配器;它本身不会打开 TCP/串行连接,也不会轮询设备。请安装与你的 Node-RED 运行环境兼容的该软件包版本,然后使用其中的客户端和传输节点。
|
|
93
|
+
|
|
94
|
+
|区域|读取|写入|允许的方向|
|
|
95
|
+
|--|--|--|--|
|
|
96
|
+
| 线圈 | FC1 | FC5 | 双向 |
|
|
97
|
+
| 离散输入 | FC2 | — | 仅 Modbus → KNX |
|
|
98
|
+
| 保持寄存器 | FC3 | FC6 | 双向 |
|
|
99
|
+
| 输入寄存器 | FC4 | — | 仅 Modbus → KNX |
|
|
100
|
+
|
|
101
|
+
对于新映射,请选择`格式 = 兼容 Flex Write`。从 KNX 到 Modbus 时,输出 1 可直接连接到 `modbus-flex-write` 节点,并输出:
|
|
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` 始终从零开始:如果设备手册将某个保持寄存器标为 `40010`,其协议地址通常为 `9`;请确认该手册采用的规则。每条映射支持一个位或一个 16 位寄存器。目前不会组合多个字、解码 32 位/浮点值,也不处理字节/字顺序。
|
|
114
|
+
|
|
115
|
+
从 Modbus 到 KNX 时,将 `modbus-flex-getter` 或 `modbus-read` 节点的数据输出连接到桥接输入。Flex Getter 在 `msg.modbusRequest` 中提供请求(`fc`、`unitid`、`address`、`quantity`);Modbus Read 则将请求保留在 `msg.input.payload` 中。返回的值数组可以位于 `msg.payload` 或 `msg.values`。桥接节点支持这两种消息形式,会匹配该响应覆盖的所有 Flex 映射,并使用正确的数组元素。请在 Flex Getter 上启用 **Keep Msg Properties**。缩放和偏移遵循 `raw = KNX × 缩放 + 偏移`;输入路径应用逆变换。
|
|
116
|
+
|
|
117
|
+
`部署时读取 KNX 数值`只读取 KNX;Modbus 读取应在外部 Modbus Flow 中安排。旧版映射(包括没有 `modbusMessageFormat` 的映射)仍会输出之前的标量 payload,并在顶层保留 `msg.address`/`msg.modbusFunction` 元数据。
|
|
92
118
|
|
|
93
119
|
## 示例 Flow
|
|
94
120
|
|
|
@@ -79,6 +79,10 @@
|
|
|
79
79
|
"target": "目标",
|
|
80
80
|
"method": "HTTP 方法",
|
|
81
81
|
"modbusFunction": "Modbus 功能",
|
|
82
|
+
"modbusMessageFormat": "Modbus 消息格式",
|
|
83
|
+
"modbusUnitId": "Unit ID",
|
|
84
|
+
"modbusArea": "Modbus 区域",
|
|
85
|
+
"modbusDataType": "数据类型",
|
|
82
86
|
"scale": "缩放",
|
|
83
87
|
"offset": "偏移",
|
|
84
88
|
"timeout": "超时 (ms)",
|
|
@@ -103,7 +107,7 @@
|
|
|
103
107
|
"target": "主题、URL 或寄存器",
|
|
104
108
|
"target_mqtt": "主题,例如 knx/light/living",
|
|
105
109
|
"target_rest": "https://example/api/endpoint",
|
|
106
|
-
"target_modbus": "
|
|
110
|
+
"target_modbus": "从零开始的地址(如 0)",
|
|
107
111
|
"template": "{\"value\":{{value}}}",
|
|
108
112
|
"property": "可选属性/路径",
|
|
109
113
|
"method": "POST",
|
|
@@ -114,7 +118,7 @@
|
|
|
114
118
|
"default": "目标",
|
|
115
119
|
"mqtt": "MQTT 主题",
|
|
116
120
|
"rest": "REST URL",
|
|
117
|
-
"modbus": "Modbus
|
|
121
|
+
"modbus": "Modbus 地址(从零开始)"
|
|
118
122
|
},
|
|
119
123
|
"method": {
|
|
120
124
|
"default": "HTTP 方法",
|
|
@@ -125,6 +129,20 @@
|
|
|
125
129
|
"modbus": "Modbus 功能"
|
|
126
130
|
}
|
|
127
131
|
},
|
|
132
|
+
"modbus": {
|
|
133
|
+
"formatLegacy": "旧版标量消息",
|
|
134
|
+
"formatFlex": "兼容 Flex Write",
|
|
135
|
+
"areaCoil": "线圈(FC1 读取 / FC5 写入)",
|
|
136
|
+
"areaDiscreteInput": "离散输入(FC2 读取,只读)",
|
|
137
|
+
"areaHoldingRegister": "保持寄存器(FC3 读取 / FC6 写入)",
|
|
138
|
+
"areaInputRegister": "输入寄存器(FC4 读取,只读)",
|
|
139
|
+
"dataTypeBool": "布尔值",
|
|
140
|
+
"dataTypeUint16": "16 位无符号整数",
|
|
141
|
+
"dataTypeInt16": "16 位有符号整数",
|
|
142
|
+
"zeroBasedHint": "请使用从零开始的协议地址(0–65535),不要使用某些手册中标注的 4xxxx 引用编号。",
|
|
143
|
+
"flexHint": "Flex 输出 msg.payload = {value,fc,unitid,address,quantity},可直接连接到 modbus-flex-write。",
|
|
144
|
+
"readOnlyHint": "离散输入和输入寄存器为只读,只能使用 Modbus → KNX。"
|
|
145
|
+
},
|
|
128
146
|
"labels": {
|
|
129
147
|
"outputKnxToIoT": "KNX → IoT 流",
|
|
130
148
|
"outputIoTToKnx": "IoT → KNX 确认",
|