node-red-contrib-knx-ultimate 6.3.30 → 6.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/nodes/knxUltimateAI.html +210 -82
  3. package/nodes/knxUltimateAI.js +2554 -1660
  4. package/nodes/knxUltimateAIHomeAssistant.html +38 -0
  5. package/nodes/knxUltimateAIHomeAssistant.js +152 -0
  6. package/nodes/locales/de/knxUltimateAI.html +19 -16
  7. package/nodes/locales/de/knxUltimateAI.json +40 -31
  8. package/nodes/locales/en/knxUltimateAI.html +27 -18
  9. package/nodes/locales/en/knxUltimateAI.json +40 -31
  10. package/nodes/locales/es/knxUltimateAI.html +19 -16
  11. package/nodes/locales/es/knxUltimateAI.json +40 -31
  12. package/nodes/locales/fr/knxUltimateAI.html +19 -16
  13. package/nodes/locales/fr/knxUltimateAI.json +40 -31
  14. package/nodes/locales/it/knxUltimateAI.html +27 -18
  15. package/nodes/locales/it/knxUltimateAI.json +40 -31
  16. package/nodes/locales/zh-CN/knxUltimateAI.html +19 -16
  17. package/nodes/locales/zh-CN/knxUltimateAI.json +40 -31
  18. package/nodes/plugins/knxUltimate-cerebrum-runtime-plugin.js +79 -0
  19. package/nodes/plugins/knxUltimateAI-vue/assets/app.css +1 -1
  20. package/nodes/plugins/knxUltimateAI-vue/assets/app.js +13 -4
  21. package/nodes/utils/knxAiCamera.js +4 -4
  22. package/nodes/utils/knxAiCatalogRetrieval.js +349 -0
  23. package/nodes/utils/knxAiCerebrum.js +406 -0
  24. package/nodes/utils/knxAiChatContext.js +43 -1
  25. package/nodes/utils/knxAiHomeMemory.js +555 -13
  26. package/nodes/utils/knxAiScheduler.js +4 -1
  27. package/nodes/utils/knxAiSemanticContext.js +662 -0
  28. package/package.json +5 -3
  29. package/resources/KNXAIChatAdapterMappings.js +31 -5
  30. package/resources/hueControllerProfiles.js +7614 -7622
@@ -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 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.
4
+ L'editor usa due schede orizzontali: **Assistente AI** contiene configurazione, conoscenza/contesto, provider e limiti; **Cerebrum (BETA)** 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)
@@ -12,6 +12,8 @@ L'editor usa due schede orizzontali: **Assistente AI** contiene configurazione,
12
12
 
13
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.
14
14
 
15
+ All'avvio del nodo, l'uscita 3 emette un breve messaggio di supervisione Cerebrum con `msg.boot = true`. Quando l'AI è attiva, il testo viene generato dal modello selezionato come test reale di inferenza; `msg.knxAi.llmTest` vale `passed`, mentre provider e modello indicano chi ha risposto. Se l'AI è disattivata o la chiamata fallisce, il messaggio di avvio viene comunque emesso con un fallback localizzato e trasparente e `llmTest` vale `disabled` o `failed`. Questo controllo non legge e non scrive sul bus KNX.
16
+
15
17
  ### Setup Doctor e primo avvio sicuro
16
18
  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
19
 
@@ -20,9 +22,9 @@ L'inventario mostra il numero esatto di segnali KNX con indirizzo di gruppo univ
20
22
  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
23
 
22
24
  ### 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.
25
+ L'accesso Web è disattivato per impostazione predefinita. Quando **Consenti all'AI di usare il Web** è attivo, il modello conversazionale decide da ogni richiesta corrente se servono informazioni pubbliche aggiornate e può scegliere il tool Web strutturato senza parole chiave, logiche specifiche per argomento o classificatori d'intento. Ogni turno utente o esecuzione di una pianificazione creata dall'utente può effettuare al massimo tre operazioni Web complessive. Tutte le operazioni Web esterne reali condividono il budget orario scorrevole configurato.
24
26
 
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.
27
+ KNX AI non avvia alcun ciclo fisso di polling Web in background. Se un dettaglio essenziale cambierebbe in modo sostanziale la risposta o la query—per esempio argomento, ambito, luogo, intervallo temporale o risultato desiderato—il modello pone una sola domanda concisa e non esegue operazioni Web finché l'utente non risponde. I controlli futuri o ricorrenti vengono creati soltanto da una richiesta esplicita in linguaggio naturale tramite lo scheduler.
26
28
 
27
29
  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
30
 
@@ -51,7 +53,12 @@ Se l'elaborazione dura più di 1,2 secondi, l'uscita 3 emette subito il messaggi
51
53
 
52
54
  Ogni richiesta chat LLM usa un timeout minimo di 30 minuti, indipendente dal provider. Non esiste un campo timeout da gestire nell'editor. È un'attesa massima, non un ritardo artificiale: i modelli più veloci terminano comunque appena la risposta è pronta. Se viene raggiunto anche questo limite, KNX AI segnala che il modello non ha completato la risposta e suggerisce di riprovare o ridurre il contesto del prompt.
53
55
 
54
- Per i provider locali, **Quantità contesto chat** permette di scegliere esplicitamente 4K, 8K, 16K oppure nessun limite KNX AI; 16K resta il valore predefinito. Con nessun limite KNX AI viene usata la finestra di contesto dichiarata o attiva del modello, senza oltrepassarne il massimo fisico. 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.
56
+ KNX AI non espone più alcun selettore applicativo per la grandezza del contesto. Il catalogo ETS selezionato completo resta nel nodo e il modello lo interroga tramite azioni di retrieval locale limitate; nel prompt entrano soltanto gli oggetti recuperati. La ricerca considera indirizzi esatti, nomi ETS, alias, gerarchia, aree, semantica, DPT ed etichette dei valori, con ordinamento insensibile agli accenti e tollerante ai refusi, oltre a ricerca esatta, navigazione per area e scoperta delle coppie comando/stato. Senza un intervallo esplicito, gli eventi KNX e adapter coprono gli ultimi 20 minuti. Help, README, wiki, esempi e changelog inclusi nel pacchetto non vengono mai incorporati: quando serve, il modello può consultare la documentazione pubblica su GitHub tramite il tool Web. I dati ETS recuperati, la richiesta corrente e le righe di archivio compaiono una sola volta; nel blocco di analisi restano soltanto aggregati derivati del bus. I sorgenti Function completi vengono aggiunti solo per una richiesta esplicita di revisione del codice Function. KNX AI non riprova una richiesta troppo grande compattando il prompt.
57
+
58
+ Prima di ogni richiesta a un modello locale, KNX AI riserva lo spazio per la risposta nella finestra attiva da 8K/16K. Limita automaticamente i turni di conversazione più recenti, le righe esatte degli archivi, la memoria domestica appresa, i risultati Web, le pianificazioni, i sorgenti Function richiesti, gli oggetti ETS recuperati e i metadati delle telecamere. È una costruzione preventiva del prompt, non un nuovo tentativo dopo un errore, e il catalogo ETS selezionato completo resta disponibile localmente tramite retrieval.
59
+
60
+ ### Accesso agli oggetti ETS
61
+ La sezione **Accesso agli oggetti ETS** riproduce il selettore degli indirizzi di gruppo del profilo MQTT di IoT Bridge. Puoi filtrare la lista importata, selezionare tutto o nulla e impostare la sola lettura sugli indirizzi visibili in blocco o riga per riga. Solo gli indirizzi selezionati sono disponibili al modello. Ogni indirizzo selezionato è attivo e leggibile; quelli in sola lettura restano visibili, ma la validazione locale rifiuta ogni `GroupValue_Write` verso di loro. Non esiste migrazione né fallback legacy: dopo l'aggiornamento devi aprire ogni nodo KNX AI esistente, salvare la selezione esplicita e fare Deploy; fino a quel momento il suo catalogo AI è vuoto.
55
62
 
56
63
  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.
57
64
 
@@ -85,7 +92,7 @@ I pacchetti di telecamere installati possono pubblicare a runtime un adapter per
85
92
 
86
93
  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.
87
94
 
88
- 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.
95
+ 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. Nel prompt entrano le righe esatte più recenti dell'intervallo fornito, limitate automaticamente alla finestra attiva del modello locale.
89
96
 
90
97
  ### Annunci con TTS Ultimate
91
98
  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.
@@ -93,27 +100,31 @@ Collega l'uscita 5 a uno o più nodi `ttsultimate` del pacchetto opzionale `node
93
100
  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.
94
101
 
95
102
  ### Riepilogo del contesto della chat
96
- 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, pianificazioni attive 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 i percorsi assoluti dei file delle pianificazioni, JSON autorevole e Markdown leggibile, oltre alle directory degli archivi KNX e degli eventi adapter e al formato giornaliero `YYYY-MM-DD.knxctx`. L'Educazione AI è salvata nella configurazione del nodo e quindi non ha un file di runtime separato.
103
+ L'editor del nodo mostra una scheda compatta con le fonti disponibili alla chat: eventi KNX e adapter degli ultimi 20 minuti o dell'intervallo esplicito, catalogo ETS selezionato completo ricercabile localmente con i soli oggetti recuperati aggiunti a ciascun prompt, sorgenti Function su richiesta, memoria di sessione e domestica, Educazione AI, pianificazioni attive e telecamere rilevate. Mostra anche il contesto operativo massimo dichiarato dal modello 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 i percorsi assoluti dei file delle pianificazioni, JSON autorevole e Markdown leggibile, oltre alle directory degli archivi KNX e degli eventi adapter e al formato giornaliero `YYYY-MM-DD.knxctx`. Il file di debug locale temporaneo `knxai-last-chat-prompt-<id-nodo>.txt` contiene l'ultimo testo esatto dei messaggi system/user, inclusi i risultati del retrieval e il sottoinsieme ETS recuperato, viene sovrascritto prima di ogni chiamata chat e non contiene API key né header HTTP. L'Educazione AI è salvata nella configurazione del nodo e quindi non ha un file di runtime separato.
97
104
 
98
- Il modello riceve letture e scritture KNX, adapter telecamera, annunci TTS, memoria persistente, accesso Web e pianificazioni/promemoria 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.
105
+ Il modello riceve retrieval locale del catalogo ETS, letture e scritture KNX, adapter telecamera, annunci TTS, memoria persistente, accesso Web e pianificazioni/promemoria come strumenti strutturati. Può sceglierli e combinarli semanticamente partendo dalla richiesta corrente e dalle indicazioni autorevoli apprese, senza routing per intent linguistici. Il retrieval del catalogo è deterministico e locale; il runtime valida argomenti, disponibilità degli adapter telecamera e confini di sicurezza, mentre le scritture KNX conservano la validazione completa ETS/DPT locale e la conferma configurata.
99
106
 
100
107
  ### Modifica e backup dell'apprendimento CHAT
101
- 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.
108
+ La scheda **Cerebrum (BETA)** 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.
102
109
 
103
- 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.
110
+ Nella UI web Vue, apri **Cerebrum → Apprendimento AI Chat** per esaminare il file condiviso esatto `knxai-chat-context.knxctx`. **File nativo** espone i record autorevoli modificabili; **Testo semplificato** spiega le stesse conversazioni, istruzioni apprese e sorveglianze telecamera in una vista localizzata di sola lettura. La copia segue la vista selezionata, mentre download e ripristino usano sempre il backup nativo completo. **Re-inizializza memoria**, protetto da una conferma esplicita, sostituisce il file 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. Il salvataggio valida e limita i record nativi V3, riscrive atomicamente il file e aggiorna tutti i nodi KNX AI attivi che condividono l’archivio. Un controllo di revisione protegge l’apprendimento più recente.
104
111
 
105
112
  È 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.
106
113
 
107
- ### Ruoli appresi dei group address KNX
108
- 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.
114
+ Apri **Cerebrum → Memoria Cerebrum** per esaminare il file condiviso `knxai-home-memory.md`. La vista **JSON** contiene i dati autorevoli modificabili, mentre **Testo semplificato** presenta le stesse abitudini, decisioni degli occupanti, stati, osservazioni, notifiche e oggetti conosciuti come spiegazione localizzata di sola lettura. Il browser ricorda la vista scelta. Il salvataggio valida il JSON; la copia segue la vista corrente, mentre download e ripristino restano backup completi. **Impostazioni** contiene soltanto l’import/export del backup rigoroso KNX AI e Cerebrum, che comprende configurazione, apprendimento chat, memoria della casa e file delle pianificazioni.
109
115
 
110
- 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.
116
+ ### Accesso agli oggetti ETS
117
+ L'accesso agli oggetti ETS è l'unica autorità operativa. Ogni indirizzo selezionato in **Accesso agli oggetti ETS** è attivo e leggibile; è anche scrivibile, a meno che sia marcato **Sola lettura**. Nessuna classificazione di ruolo dedotta viene inviata al modello della chat o usata per autorizzare una scrittura.
111
118
 
112
119
  ## Intelligenza domestica proattiva guidata dall'Educazione e memoria limitata
113
120
  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à.
114
121
 
115
122
  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.
116
123
 
124
+ Cerebrum apprende anche pattern temporali limitati fra giorni feriali e fine settimana, ricavati dalle scritture KNX e dai cambi di stato HUE, Matter o Home Assistant. Un pattern diventa utilizzabile solo dopo almeno otto osservazioni coerenti, distribuite su sei date distinte e su un intervallo minimo di 14 giorni, con confidenza non inferiore a 0,70. Telegrammi ripetuti nella stessa giornata non possono anticipare la richiesta di conferma. Se **Educazione AI** chiede esplicitamente a Cerebrum di anticipare le abitudini apprese, può inviare un suggerimento fino a 30 minuti prima dell'orario abituale. Il suggerimento non è mai un'esecuzione: le azioni KNX e Home Assistant richiedono ancora il normale percorso di autorizzazione e conferma, e resta valido il limite globale di tre messaggi proattivi all'ora.
125
+
126
+ Cerebrum osserva passivamente, tramite un hook runtime, gli output limitati e sanificati dei nodi utili di logica Node-RED, HUE, Matter e degli eventi Home Assistant; non servono collegamenti di monitoraggio aggiuntivi. Credenziali, header di autorizzazione, contenuti multimediali opachi e payload binari vengono scartati. Per lo stato Home Assistant live, aggiungi **Cerebrum Home Assistant** e collega `Cerebrum Home Assistant → API (ha-api) → Cerebrum Home Assistant`. Setup Doctor rileva l'add-on Home Assistant e indica il prossimo passaggio mancante.
127
+
117
128
  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.
118
129
 
119
130
  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.
@@ -167,12 +178,10 @@ Di seguito sono elencati tutti i campi presenti nell'editor del nodo KNX AI.
167
178
  - **Modello**: ID/nome modello.
168
179
  - **Impegno di ragionamento**: preferenza indipendente dal provider per i modelli che espongono il controllo dell’impegno di ragionamento. **Automatico** non invia alcuna preferenza e conserva il valore predefinito del modello/provider. Le scelte esplicite sono `none`, `minimal`, `low`, `medium`, `high`, `xhigh` e `max`; il supporto dipende dal protocollo di richiesta e dal modello, e KNX AI riprova senza la preferenza se viene rifiutata.
169
180
  - **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.
170
- - **Consenti controlli Web proattivi**: opt-in separato per i controlli in background; richiede anche istruzioni esplicite scritte dall'utente in **Educazione AI**.
171
- - **Intervallo minimo dei controlli proattivi**: tempo minimo tra i cicli proattivi; non ritarda le operazioni Web richieste durante un turno utente attivo.
172
- - **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.
181
+ - **Numero massimo di chiamate Web all'ora**: budget scorrevole condiviso dalle conversazioni e dalle pianificazioni create dall'utente. Ogni turno o esecuzione pianificata può usare al massimo tre operazioni complessive.
173
182
  - **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.
174
183
  - **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.
175
- - **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.
184
+ - **Consenti all'AI di leggere stati KNX e comandare attuatori**: abilita l'uscita 4 ed è disattivato per default. Ogni oggetto ETS selezionato può essere letto; ogni oggetto selezionato non marcato **Sola lettura** può essere scritto. Operazioni sconosciute, con DPT discordante, non valide o eccessive e scritture verso oggetti in sola lettura vengono rifiutate localmente.
176
185
  - **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.
177
186
  - **Adattatore messaggi ingresso/uscita**: parte da **Nessun adattatore**. La selezione carica la coppia predefinita di mappature ingresso/uscita; entrambe restano nascoste nell'editor.
178
187
  - **Educazione AI**: istruzioni fisse e autorevoli del nodo, modificate soltanto dall'utente e applicate con Deploy. Il modello le legge ma non le scrive mai. Qui vanno le regole proattive domestiche permanenti; fatti e preferenze richiesti in chat vanno nella memoria appresa, mentre pianificazioni, promemoria, monitoraggi e comandi futuri, singoli o ricorrenti, vanno nello scheduler semantico senza frasi di attivazione né routing per intent.
@@ -187,7 +196,7 @@ Di seguito sono elencati tutti i campi presenti nell'editor del nodo KNX AI.
187
196
  - **2) Installalo**: scarica e installa localmente il modello (esempio `llama3.1`).
188
197
  - Durante refresh/installazione, KNX AI prova anche ad avviare automaticamente il server Ollama quando possibile.
189
198
  - Se l'installazione fallisce per errore di connessione, verifica che Ollama sia avviato (app desktop o `ollama serve`).
190
- - Il contesto massimo dichiarato da `/api/show` resta informativo. KNX AI invia come `num_ctx` il budget scelto di 4K, 8K o 16K; con nessun limite KNX AI usa il contesto dichiarato dal modello, senza mai oltrepassarne il massimo fisico. Ogni fonte di contesto viene limitata proporzionalmente senza rimuovere capacità dell'agente.
199
+ - Il contesto massimo dichiarato da `/api/show` viene usato direttamente come `num_ctx`. KNX AI non applica un budget inferiore e invia il prompt operativo deduplicato senza compattazione basata sulla dimensione, senza oltrepassare il massimo fisico dichiarato dal modello.
191
200
  - Se Node-RED gira in Docker, usa `host.docker.internal` al posto di `localhost` nell'endpoint.
192
201
 
193
202
  ### Setup rapido Bionic LM Studio (locale)
@@ -195,7 +204,7 @@ Di seguito sono elencati tutti i campi presenti nell'editor del nodo KNX AI.
195
204
  - Avvia il server API di LM Studio dalla pagina **Developer** oppure con `lms server start`.
196
205
  - Endpoint predefinito: `http://localhost:1234/v1/chat/completions`.
197
206
  - Premi **Aggiorna** per caricare tutti i modelli esposti da `/v1/models`; se non è configurato un modello viene selezionato il primo.
198
- - 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. KNX AI usa il budget prompt scelto di 4K, 8K o 16K, oppure la finestra dichiarata o attiva del modello quando è selezionato nessun limite KNX AI, senza oltrepassarne il massimo fisico; ragionamento, KNX, routine, telecamere e TTS restano disponibili.
207
+ - 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. Tutto il contesto disponibile viene inviato senza un budget applicativo; se non entra nella finestra attiva, la richiesta fallisce esplicitamente.
199
208
  - La API key è opzionale, salvo autenticazione attiva nelle impostazioni del server LM Studio. In Docker sostituisci `localhost` con `host.docker.internal`.
200
209
 
201
210
  ## Nota sicurezza
@@ -3,13 +3,15 @@
3
3
  "title": "KNX AI (Analisi Traffico)",
4
4
  "sections": {
5
5
  "groupAssistant": "Assistente AI",
6
- "groupChatHome": "Conversazioni e casa",
6
+ "groupChatHome": "Cerebrum (BETA)",
7
7
  "setupDoctor": "Setup Doctor",
8
8
  "webIntelligence": "Intelligenza Web",
9
9
  "detectedAdapters": "Nodi compatibili rilevati ed usati in chat",
10
10
  "chatContextOverview": "Contesto disponibile alla chat",
11
11
  "chatLearning": "Apprendimento AI Chat",
12
+ "cerebrumMemory": "Memoria Cerebrum",
12
13
  "quickSetup": "Configurazione assistente",
14
+ "etsAccess": "Accesso agli oggetti ETS",
13
15
  "llmConnection": "Connessione Assistente AI",
14
16
  "chatAdapter": "Chat PIN Input e Output",
15
17
  "homeIntelligence": "Educazione AI e memoria",
@@ -25,20 +27,17 @@
25
27
  "llmApiKey": "API key",
26
28
  "llmModel": "Modello",
27
29
  "llmReasoningEffort": "Impegno di ragionamento",
28
- "llmPromptContextTokens": "Quantità contesto chat",
30
+ "llmLocalContextTokens": "Finestra contesto locale",
29
31
  "llmSystemPrompt": "Prompt di sistema",
30
32
  "llmIncludeRaw": "Includi payload raw in hex",
31
33
  "llmAllowKnxCommands": "Consenti all'AI di leggere stati KNX e comandare attuatori",
32
34
  "llmRequireCommandConfirmation": "Chiedi conferma prima di inviare comandi KNX",
33
35
  "webAccessEnabled": "Consenti all’AI di usare il Web",
34
- "webProactiveEnabled": "Consenti controlli Web proattivi",
35
- "webProactiveIntervalMinutes": "Intervallo minimo dei controlli proattivi",
36
36
  "webMaxCallsPerHour": "Numero massimo di chiamate Web all’ora",
37
37
  "chatAdapterPreset": "Adattatore messaggi ingresso/uscita",
38
38
  "chatInputCode": "Mappatura ingresso (chat → KNX AI)",
39
39
  "chatOutputCode": "Mappatura uscita (KNX AI → chat)",
40
- "aiEducation": "Educazione AI (gestita dall'utente)",
41
- "llmIncludeDocsSnippets": "Includi estratti documentazione (help/README/esempi)"
40
+ "aiEducation": "Educazione AI (gestita dall'utente)"
42
41
  },
43
42
  "outputs": {
44
43
  "summary": "Summary/Statistiche",
@@ -49,17 +48,11 @@
49
48
  },
50
49
  "selectlists": {
51
50
  "llmProvider": {
52
- "openai_compat": "Compatibile OpenAI (chat/completions)",
51
+ "openai_compat": "OpenAI / compatibile OpenAI",
53
52
  "anthropic": "Anthropic (Claude)",
54
53
  "ollama": "Ollama (locale)",
55
54
  "lmstudio": "Bionic LM Studio"
56
55
  },
57
- "promptContext": {
58
- "small": "Ridotto (4K, più veloce)",
59
- "medium": "Medio (8K)",
60
- "full": "Completo (16K)",
61
- "unlimited": "Nessun limite KNX AI (usa il contesto del modello)"
62
- },
63
56
  "reasoningEffort": {
64
57
  "default": "Automatico (predefinito del modello/provider)",
65
58
  "none": "Nessuno",
@@ -70,16 +63,18 @@
70
63
  "xhigh": "Molto alto",
71
64
  "max": "Massimo"
72
65
  },
66
+ "localContext": {
67
+ "maximum": "Massimo",
68
+ "k4": "4K",
69
+ "k8": "8K",
70
+ "k16": "16K",
71
+ "k32": "32K",
72
+ "k64": "64K",
73
+ "k128": "128K",
74
+ "k256": "256K"
75
+ },
73
76
  "chatAdapter": {
74
77
  "none": "Nessun adattatore"
75
- },
76
- "webProactiveInterval": {
77
- "5": "5 minuti",
78
- "10": "10 minuti",
79
- "15": "15 minuti",
80
- "30": "30 minuti",
81
- "60": "1 ora",
82
- "180": "3 ore"
83
78
  }
84
79
  },
85
80
  "buttons": {
@@ -88,7 +83,12 @@
88
83
  "installOllamaModel": "2) Installalo",
89
84
  "ollamaLibrary": "Libreria modelli",
90
85
  "downloadOllamaModel": "1) Scarica il modello",
91
- "openChatLearning": "Apri Apprendimento AI Chat"
86
+ "openChatLearning": "Apri Apprendimento AI Chat",
87
+ "openCerebrumMemory": "Apri memoria Cerebrum",
88
+ "etsSelectAll": "Seleziona tutti",
89
+ "etsSelectNone": "Deseleziona tutti",
90
+ "etsReadOnlyAll": "Imposta sola lettura",
91
+ "etsReadOnlyNone": "Togli sola lettura"
92
92
  },
93
93
  "messages": {
94
94
  "setupDoctorLoading": "Sto analizzando questo impianto…",
@@ -100,9 +100,8 @@
100
100
  "setupDoctorWarn": "Controlla",
101
101
  "setupDoctorFail": "Correggi",
102
102
  "setupDoctorInfo": "Opzionale",
103
- "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.",
104
- "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.",
105
- "webBudgetHint": "Il budget scorrevole conteggia le chiamate esterne reali della chat e dei controlli proattivi.",
103
+ "webAccessHint": "Il modello sceglie semanticamente questo tool Web generale per ogni richiesta chiara della chat o pianificata. Se manca un dettaglio essenziale, chiede chiarimenti all’utente prima della ricerca; non vengono usati polling in background, parole chiave o 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.",
104
+ "webBudgetHint": "Il budget scorrevole conteggia le chiamate esterne reali delle conversazioni e delle pianificazioni create dall’utente.",
106
105
  "loadingModels": "Carico i modelli…",
107
106
  "loadedModels": "Modelli caricati",
108
107
  "lmStudioContextAvailable": "Contesto massimo del modello",
@@ -111,9 +110,17 @@
111
110
  "lmStudioContextConfigured": "Contesto attivo del modello",
112
111
  "lmStudioContextFailed": "Impossibile configurare il contesto del modello",
113
112
  "lmStudioContextCurrentlyLoaded": "attualmente caricato",
114
- "localContextBudget": "Budget contesto KNX AI",
115
- "promptContextHint": "Controlla la quantità di contesto KNX, memoria, progetto e adapter inviata ai modelli locali. Scegli “Nessun limite KNX AI” per usare la finestra dichiarata o attiva del modello. Non abilita o disabilita strumenti e non usa intent linguistici.",
113
+ "etsAccessHint": "Seleziona gli indirizzi di gruppo disponibili a KNX AI. Ogni indirizzo selezionato è attivo e leggibile; ogni indirizzo selezionato non marcato Sola lettura è scrivibile. I provider cloud ricevono l'intero catalogo ETS semantico selezionato; i modelli locali ricevono ciò che entra nella finestra di contesto scelta e possono recuperare localmente i dettagli mancanti.",
114
+ "etsFilterPlaceholder": "Filtra per nome, GA o DPT…",
115
+ "etsSelected": "selezionati",
116
+ "etsReadOnly": "Sola lettura",
117
+ "etsReadOnlyBulk": "Sola lettura per gli indirizzi mostrati",
118
+ "etsNoGateway": "Seleziona un gateway KNX.",
119
+ "etsNoGa": "Nessun indirizzo di gruppo trovato. Importa la lista ETS nel gateway KNX.",
120
+ "etsCsvError": "Impossibile caricare la lista degli indirizzi di gruppo dal gateway.",
116
121
  "reasoningEffortHint": "Preferenza facoltativa per i modelli che supportano l'impegno di ragionamento. Automatico non invia alcuna preferenza; se il provider o il modello rifiuta il valore scelto, KNX AI riprova senza di esso.",
122
+ "localContextBudget": "Finestra contesto locale",
123
+ "localContextHint": "Imposta il contesto massimo inviato soltanto ai modelli locali. Massimo usa la finestra nota del modello selezionato; le dimensioni non disponibili vengono nascoste quando il limite del modello è noto. I provider cloud ignorano questa selezione e ricevono l'intero catalogo ETS semantico selezionato.",
117
124
  "ollamaNotSupported": "Modalita locale Ollama: API key non richiesta. Endpoint predefinito: http://localhost:11434/api/chat.",
118
125
  "ollamaNoModels": "Nessun modello Ollama locale trovato. Installa un modello o scegli dalla libreria.",
119
126
  "installingOllamaModel": "Avvio Ollama e installo il modello…",
@@ -131,6 +138,7 @@
131
138
  "chatContextLoading": "Caricamento del riepilogo del contesto…",
132
139
  "chatContextUnavailable": "Il riepilogo del contesto della chat non è momentaneamente disponibile.",
133
140
  "chatLearningOpenHint": "Apri la Web UI direttamente nell’editor dell’apprendimento CHAT condiviso per visualizzare, modificare, copiare o salvare il suo file persistente.",
141
+ "cerebrumMemoryOpenHint": "Apri la memoria Cerebrum leggibile dall’utente per esaminare o modificare abitudini, decisioni degli occupanti e stati della casa.",
134
142
  "chatContextIntro": "La chat riceve automaticamente queste fonti. I percorsi sottostanti sono quelli effettivi usati da questa installazione Node-RED.",
135
143
  "chatContextLimitLabel": "Contesto operativo massimo",
136
144
  "chatContextProviderManaged": "gestito dal provider/modello selezionato",
@@ -143,9 +151,9 @@
143
151
  "chatContextSourcesTitle": "Fonti incluse",
144
152
  "chatContextFilesTitle": "File persistenti di contesto",
145
153
  "chatContextDirectoriesTitle": "Archivio telegrammi KNX",
146
- "chatContextSourceKnxTraffic": "Riepilogo KNX corrente, anomalie, topologia e telegrammi selezionati.",
147
- "chatContextSourceAdapterHistory": "Storico giornaliero persistente degli eventi degli adapter rilevati, comprese le rilevazioni delle telecamere.",
148
- "chatContextSourceEtsProject": "Semantica ETS e inventario completo del progetto Node-RED.",
154
+ "chatContextSourceKnxTraffic": "Analisi KNX derivata più gli eventi esatti più recenti dell’intervallo predefinito di 20 minuti o di quello esplicito, limitati automaticamente alla finestra attiva del modello locale.",
155
+ "chatContextSourceAdapterHistory": "Eventi adapter esatti più recenti dello stesso intervallo, limitati automaticamente alla finestra attiva del modello locale.",
156
+ "chatContextSourceEtsProject": "Catalogo ETS semantico selezionato completo per i modelli cloud. I modelli locali ricevono il catalogo completo quando entra nella finestra; altrimenti ricevono un manifest dimensionato e i dettagli esatti richiesti dal modello. Sorgenti Function solo per revisioni esplicite del codice.",
149
157
  "chatContextSourceMemoryEducation": "Contesto di sessione, Educazione AI, memoria domestica limitata e pianificazioni attive.",
150
158
  "chatContextSourceCameras": "Telecamere rilevate e relative funzionalità disponibili.",
151
159
  "chatContextSourceBadge": "Fonte",
@@ -153,7 +161,8 @@
153
161
  "chatContextFileHomeMemory": "Solo memoria domestica appresa e limitata; l'Educazione AI resta nella proprietà del nodo.",
154
162
  "chatContextFileSchedules": "Stato di runtime persistente e autorevole delle pianificazioni e dei promemoria di questo nodo.",
155
163
  "chatContextFileSchedulesReadable": "Vista leggibile generata delle pianificazioni e dei promemoria di questo nodo.",
156
- "chatContextFileAssistantConfig": "Configurazione persistente dell'Assistente web e aree semantiche di questo nodo.",
164
+ "chatContextFileAssistantConfig": "Configurazione persistente di Cerebrum e aree semantiche di questo nodo.",
165
+ "chatContextFileLastChatPrompt": "Copia locale temporanea degli ultimi messaggi system e user inviati al modello chat; viene sovrascritta a ogni richiesta.",
157
166
  "chatContextFileBadge": "File",
158
167
  "chatContextDirectoryRoot": "Radice archivio telegrammi",
159
168
  "chatContextDirectoryNode": "Archivio telegrammi di questo nodo",
@@ -20,9 +20,9 @@
20
20
  从聊天发送 `/start` 或 `/help`,即可在聊天输出(输出 3)收到确定性且已本地化的欢迎消息,其中包含个性化的安装统计和最多三条安全建议。此引导过程不调用 LLM,不读写 KNX,也不生成 TTS。使用 Telegram 预设时,建议会显示为回复键盘按钮,仅在用户明确选择或发送其中一条后才会执行。在用户明确选择后,初始建议可在需要时执行精确的 KNX 读取;KNX 写入和例程、摄像头操作、TTS、持久记忆更改以及 GA 角色学习仍会被禁止。
21
21
 
22
22
  ### Web 智能
23
- Web 访问默认关闭。启用**允许 AI 使用 Web**后,对话模型可直接根据当前请求选择结构化 Web 工具;不使用关键词、特定主题逻辑或意图分类器。每个用户回合或主动检查周期最多执行三次 Web 操作。所有真实外部 Web 操作共享已配置的滚动小时预算。
23
+ Web 访问默认关闭。启用**允许 AI 使用 Web**后,对话模型会针对每个当前请求判断是否需要最新的公开信息,并可在不使用关键词、特定主题逻辑或意图分类器的情况下选择结构化 Web 工具。每个用户回合或用户创建的计划任务执行最多进行三次 Web 操作。所有真实外部 Web 操作共享已配置的滚动小时预算。
24
24
 
25
- **允许主动 Web 检查**是独立授权。它还要求用户在 **AI 教育**中编写明确指令,遵守已配置的最短间隔,并且只有在 KNX AI 从至少一次普通聊天请求中记住接收方后才会启动。缺少任一授权时,都不会在后台执行 Web 操作。
25
+ KNX AI 不会启动固定的后台 Web 轮询。如果某个关键细节会实质性改变回答或查询,例如主题、范围、地点、时间窗口或期望结果,模型会提出一个简短的澄清问题,并在用户回答前不执行任何 Web 操作。未来或周期性检查只能通过用户明确的自然语言请求由调度器创建。
26
26
 
27
27
  每条基于 Web 的回答都包含由运行时验证的引用,其中包括已清理的来源 URL 和检索时间,并在可用时提供发布时间。外部内容是不受信任的数据,绝不是指令,也不能取代助手规则或权限。仅接受大小受限的公开 HTTPS 资源;私有、本地、链路本地及云元数据目标、不安全重定向、已认证浏览和 Cookie 都会被阻止。如果无法验证任何来源,KNX AI 会说明此限制,而不会生成无来源的回答。
28
28
 
@@ -51,7 +51,12 @@ Web 访问默认关闭。启用**允许 AI 使用 Web**后,对话模型可直
51
51
 
52
52
  每个 LLM 聊天请求都使用与提供商无关的至少 30 分钟超时。编辑器中无需维护超时字段。这是最长等待时间,并非人为延迟;较快的模型仍会在响应准备好后立即完成。即使达到此限制,KNX AI 也会说明模型未完成响应,并建议重试或缩减提示上下文。
53
53
 
54
- 对于本地提供商,**聊天上下文量**可明确选择 4K、8K、16K 或无 KNX AI 限制;默认仍为 16K。选择无 KNX AI 限制时,将使用模型声明或当前启用的上下文窗口,但不会超过模型的物理上限。该选择会按比例限制发送给模型的 KNX、记忆、Node-RED 项目和适配器数据,同时保留完整的代理工具协议。任何能力都不会因措辞、关键词或语言 intent 而被启用或禁用。
54
+ KNX AI 不再提供应用级上下文大小选项。完整的已选 ETS 目录保留在节点内,由模型通过有界的本地检索动作查询;只有检索到的对象才进入提示词。搜索覆盖精确地址、ETS 名称、别名、层级、区域、语义、DPT 和数值标签,并支持忽略重音、容忍拼写错误的排序,以及精确查询、区域浏览和命令/状态配对发现。未明确指定时间范围时,KNX 与适配器事件仅覆盖最近 20 分钟。随包提供的帮助、README、Wiki、示例和变更日志不会嵌入提示词;需要时,模型可通过 Web 工具查询 GitHub 上的公开文档。检索到的 ETS 数据、当前请求和存档行各只出现一次,分析块仅保留派生的总线聚合信息。只有用户明确要求审查 Function 代码时,才加入完整的 Function 源码。KNX AI 不会通过压缩提示词来重试超大请求。
55
+
56
+ 每次向本地模型发起请求前,KNX AI 都会在当前 8K/16K 窗口中预留回答空间。系统会自动限制最近的对话轮次、精确存档行、已学习的家庭记忆、Web 结果、计划任务、按需提供的 Function 源码、已检索的 ETS 对象和摄像机元数据。这是在请求前构建有界提示词,并非发生超限错误后的重试;完整的已选 ETS 目录仍可通过本地检索使用。
57
+
58
+ ### ETS 对象访问
59
+ 此部分复用 IoT Bridge MQTT 配置中的组地址选择器。可以筛选导入列表、全选或全不选,并对当前显示的地址批量或逐行设置只读。只有选中的地址可供模型使用。每个选中的地址都处于活动状态且可读取;只读地址仍然可见,但本地验证会拒绝对其执行任何 `GroupValue_Write`。不存在迁移或旧版回退:升级后必须打开每个现有 KNX AI 节点,保存明确选择并部署;在此之前,其 AI 目录为空。
55
60
 
56
61
  Canvas 上的节点状态专门用于显示最近收到的请求,以及 LLM 运行期间本地化的“我正在思考…”状态。KNX 报文、网关更新、流量速率、ready 消息和技术结果绝不会覆盖该状态;这些信息仍可通过节点输出、日志和助手数据查看。
57
62
 
@@ -85,7 +90,7 @@ Canvas 上的节点状态专门用于显示最近收到的请求,以及 LLM
85
90
 
86
91
  用户可以请求当前快照,或询问视觉模型画面中可见的内容。Telegram 和 RedBot 预设会把图像作为带说明文字的原生照片发送。用户还可以为移动、智能越线或进入入侵/徘徊区域创建持久通知,并可按检测到的人员以及指定名称的线或区域进行限制。这些规则保存在同一个 `knxai-chat-context.knxctx` 文件中,并在 Node-RED 重启后恢复。UniFi 事件订阅和快照请求直接通过检测到的提供方完成;不会使用 KNX AI 输出 4,也不需要中间 Flow 连线。
87
92
 
88
- 自动检测到的适配器发布的每个事件都会被标准化,并以 KNX AI 原生紧凑行格式直接追加到 `knxultimatestorage/knxai/adapter-history/<节点ID>/` 下的每日 `YYYY-MM-DD.knxctx` 文件。KNX 报文存档使用相同的紧凑格式,不经过中间 JSON 序列化。存档保留 10 天,保证超过 24 小时的历史,只保存事件元数据,不保存图像。现有 JSONL 存档不会被读取或迁移。总数涵盖所请求区间内的全部存档行;选出的详情仅是相关样本。
93
+ 自动检测到的适配器发布的每个事件都会被标准化,并以 KNX AI 原生紧凑行格式直接追加到 `knxultimatestorage/knxai/adapter-history/<节点ID>/` 下的每日 `YYYY-MM-DD.knxctx` 文件。KNX 报文存档使用相同的紧凑格式,不经过中间 JSON 序列化。存档保留 10 天,保证超过 24 小时的历史,只保存事件元数据,不保存图像。现有 JSONL 存档不会被读取或迁移。提示词会使用所提供时间范围内最新的精确行,并自动适配本地模型的活动窗口。
89
94
 
90
95
  ### 使用 TTS Ultimate 播报
91
96
  将输出 5 连接到可选软件包 `node-red-contrib-tts-ultimate` 中的一个或多个 `ttsultimate` 节点。目标和分发由普通 Node-RED 连线决定;如果 TTS 节点位于另一个 Flow 标签页,请使用 Link Out/Link In。原有的 TTS 节点选择器和内部注入已被移除。输出 1–4 的位置保持不变,但升级后的 Flow 必须实际连接输出 5,语音播报才能到达 TTS Ultimate。
@@ -93,9 +98,11 @@ Canvas 上的节点状态专门用于显示最近收到的请求,以及 LLM
93
98
  模型会根据当前请求、持久聊天指令和用户管理的 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 处理播放器、语音、音量、提示音和队列。
94
99
 
95
100
  ### 聊天上下文概览
96
- 节点编辑器会显示一张紧凑卡片,汇总聊天可用的来源:当前 KNX 流量、ETS 语义与 Node-RED 项目、会话和家庭记忆、AI 教育、活动计划及检测到的摄像机。卡片还会显示用户选择的最大运行上下文和上次聊天提示词的实际 UTF-8 大小;提供商返回输入令牌数时使用精确值,否则明确标为估算值。卡片还会列出权威 JSON 计划文件和易读 Markdown 计划文件的绝对路径,以及 KNX 报文与适配器事件归档和每日文件模式 `YYYY-MM-DD.knxctx`。AI 教育保存在节点配置中,因此没有单独的运行时文件。
101
+ 节点编辑器会显示一张紧凑卡片,汇总聊天可用的来源:默认最近 20 分钟或明确时间范围内的 KNX 与适配器事件、可在本地完整检索且每次仅把已检索对象加入提示词的 ETS 目录、按需加入的 Function 源码、会话和家庭记忆、AI 教育、活动计划及检测到的摄像机。卡片还会显示模型报告的最大运行上下文和上次聊天提示词的实际 UTF-8 大小;提供商返回输入令牌数时使用精确值,否则明确标为估算值。卡片还会列出权威 JSON 计划文件和易读 Markdown 计划文件的绝对路径,以及 KNX 报文与适配器事件归档和每日文件模式 `YYYY-MM-DD.knxctx`。AI 教育保存在节点配置中,因此没有单独的运行时文件。
97
102
 
98
- 模型会把 KNX 读写、摄像机适配器、TTS 播报、持久记忆、Web 访问以及计划/提醒作为结构化工具。它可以依据当前请求和可信的已学习指导进行语义选择与组合,而不经过语言意图路由。运行时只验证工具参数、摄像机适配器可用性和安全边界;KNX 写入仍保留本地 ETS/DPT 校验和已配置的确认步骤。
103
+ 模型会把本地 ETS 目录检索、KNX 读写、摄像机适配器、TTS 播报、持久记忆、Web 访问以及计划/提醒作为结构化工具。它可以依据当前请求和可信的已学习指导进行语义选择与组合,而不经过语言意图路由。目录检索是确定性的本地操作;运行时验证工具参数、摄像机适配器可用性和安全边界,KNX 写入仍保留完整的本地 ETS/DPT 校验和已配置的确认步骤。
104
+
105
+ 临时本地调试文件 `knxai-last-chat-prompt-<节点ID>.txt` 包含最近一次发送的精确 system/user 提示文本,会在每次聊天调用前覆盖,且不包含 API 密钥或 HTTP 标头。
99
106
 
100
107
  ### 编辑和备份聊天学习
101
108
  Node-RED 的 KNX AI 配置中,**对话与家庭**选项卡包含**打开 AI 聊天学习**按钮;它会为当前节点直接打开 Vue Web UI 中的此编辑器。
@@ -104,10 +111,8 @@ Node-RED 的 KNX AI 配置中,**对话与家庭**选项卡包含**打开 AI
104
111
 
105
112
  仅支持原生 V3 格式。旧版 Markdown/JSON V2 和 Base64 V1 文件不会被读取、导入或迁移;旧的 `.md` 文件保持不变,KNX AI 会启动新的 `.knxctx` 上下文。仍保留 50 个会话和 512 KB 的限制。
106
113
 
107
- ### 学习到的 KNX 组地址角色
108
- `neutral` 角色表示初始不确定性,而不是永久禁止控制。模型可以使用结构化工具 `gaRoleActions`,根据可信的用户教学、持久聊天指导、AI 教育或明确无歧义的 ETS 项目语义,学习某个准确的 ETS 组地址属于命令、状态或中性对象。无需固定关键词或角色 intent;如果证据不明确,模型会先询问澄清,而不会擅自学习。
109
-
110
- 学习到的角色、原因和证据会按节点保存到 `<userDir>/knxai/config/knxai-config-<节点-id>.json`,并同步到受限的家庭语义记忆。学习为 `command` 的角色可以在同一条回复中使写入通过验证,并在重启后继续可用;模型也可以忘记它并恢复自动分类。学习过程不能虚构 GA、修改其 ETS DPT、绕过 payload 校验或跳过已配置的写入确认。
114
+ ### ETS 对象访问
115
+ ETS 对象访问是唯一的操作权限依据。**ETS 对象访问**中选中的每个地址都处于活动状态且可读取;除非标记为**只读**,否则也可写入。聊天模型不会收到任何推断出的角色分类,写入授权也不再依赖角色。
111
116
 
112
117
  ## 由 AI 教育驱动的主动家庭智能与有限记忆
113
118
  节点会根据 ETS 层级、名称、角色和 DPT 建立确定性的语义模型。不再提供单独的开关或高级主动通知设置。只有启用 LLM 且 **AI 教育**明确要求时,系统才会评估通知。条件、持续时间、静默时段和重复频率完全由 AI 教育定义。没有明确规则或 LLM 无法评估时,不会发送任何消息。
@@ -161,12 +166,10 @@ Node-RED 的 KNX AI 配置中,**对话与家庭**选项卡包含**打开 AI
161
166
  - **Model**:模型 ID/名称。
162
167
  - **推理强度**:适用于支持推理强度控制的模型,且不依赖具体提供商。选择**自动**时不发送偏好,并保留模型/提供商的默认值。可明确选择 `none`、`minimal`、`low`、`medium`、`high`、`xhigh` 或 `max`;实际支持情况取决于请求协议和模型。如果该值被拒绝,KNX AI 会在不发送此偏好的情况下重试。
163
168
  - **允许 AI 使用 Web**:默认关闭。允许模型按语义选择通用 Web 工具,并返回已验证、已引用的来源。
164
- - **允许主动 Web 检查**:用于后台检查的独立授权;还需要用户在 **AI 教育**中编写明确指令。
165
- - **主动检查的最短间隔**:主动检查周期之间的最短时间;不会延迟用户活动回合中请求的 Web 操作。
166
- - **每小时最多 Web 调用次数**:互动和主动 Web 操作共享的滚动预算。每个回合或周期最多使用三次操作。
169
+ - **每小时最多 Web 调用次数**:对话和用户创建的计划任务共享滚动预算。每个回合或计划任务执行最多使用三次操作。
167
170
  - **Telegram 语音**:仅在选择 **OpenAI-compatible** 提供商时可用。它会自动复用该提供商的端点和 API 密钥,并使用内置默认值 `gpt-4o-mini-transcribe`、`gpt-4o-mini-tts` 和 `alloy`;不再提供单独的语音设置。
168
171
  - **聊天模型兼容性**:所选模型必须支持已配置的 Chat Completions 端点。刷新模型列表时,会排除仅支持旧版 completions 的模型,例如 `gpt-3.5-turbo-instruct`。如果提供商拒绝自定义 temperature 值或令牌限制参数,KNX AI 会仅移除或替换不兼容字段后重试。
169
- - **允许 AI 读取 KNX 状态并控制执行器**:启用输出 4,默认关闭。可以读取 ETS 目录中的精确对象;仅接受写入明确标记为 `command` 的对象。未知、DPT 不匹配、无效或数量过多的操作,以及向状态或中性对象的写入,都会在本地被拒绝。
172
+ - **允许 AI 读取 KNX 状态并控制执行器**:启用输出 4,默认关闭。所有选中的 ETS 对象都可读取;所有未标记为**只读**的选中对象都可写入。未知、DPT 不匹配、无效或数量过多的操作,以及向只读对象的写入,都会在本地被拒绝。
170
173
  - **发送 KNX 命令前请求确认**:默认启用。先显示已验证的修改,在同一聊天会话确认前不会发送任何 KNX 命令。有命令等待确认时,回复始终会使用当前请求的语言附加准确的确认或取消说明。命令会在输出前再次验证。
171
174
  - **输入/输出消息适配器**:默认为**无适配器**。选择后会加载预定义的输入和输出映射;两者在编辑器中始终保持隐藏。
172
175
  - **AI 教育**:固定且权威的节点指导,仅由用户修改并通过 Deploy 应用。模型会读取,但绝不会写入。长期主动家庭策略在这里定义;聊天中要求记住的事实和偏好进入学习记忆,一次性或周期性的计划、提醒、监测和未来命令进入语义调度器,无需触发短语或 intent 路由。
@@ -181,7 +184,7 @@ Node-RED 的 KNX AI 配置中,**对话与家庭**选项卡包含**打开 AI
181
184
  - **2) Install it**:在本机下载并安装模型(例如 `llama3.1`)。
182
185
  - 在刷新/安装模型时,KNX AI 也会在可能情况下尝试自动启动 Ollama 服务。
183
186
  - 若安装因连接错误失败,请确认 Ollama 已运行(桌面应用或 `ollama serve`)。
184
- - `/api/show` 报告的最大上下文仅用于显示。KNX AI 会将所选的 4K、8K 或 16K 预算作为 `num_ctx` 发送;选择无 KNX AI 限制时,则使用模型声明的上下文,但不会超过其物理上限。每个上下文来源仍会按比例受限,同时保留代理能力。
187
+ - `/api/show` 报告的最大上下文会直接作为 `num_ctx` 使用。KNX AI 不应用更小的提示预算,并发送去重后的运行提示词,不进行基于大小的压缩,同时不会超过模型声明的物理上限。
185
188
  - 若 Node-RED 运行在 Docker 中,endpoint 请使用 `host.docker.internal` 替代 `localhost`。
186
189
 
187
190
  ### Bionic LM Studio 快速配置(本地)
@@ -189,7 +192,7 @@ Node-RED 的 KNX AI 配置中,**对话与家庭**选项卡包含**打开 AI
189
192
  - 在 LM Studio 的 **Developer** 页面启动 API 服务,或运行 `lms server start`。
190
193
  - 默认 endpoint:`http://localhost:1234/v1/chat/completions`。
191
194
  - 点击 **Refresh** 加载 `/v1/models` 提供的全部模型;未配置模型时会自动选择第一个。
192
- - 如果模型已加载,KNX AI 会保留其当前上下文长度。KNX AI 不会通过管理 API 加载未运行的 Bionic 模型:首次聊天请求会让 Bionic 根据该模型已保存的默认值进行 JIT 加载。KNX AI 会使用所选的 4K、8K 或 16K 提示预算;选择无 KNX AI 限制时,则使用模型声明或当前启用的上下文窗口,但不会超过其物理上限。推理、KNX、例程、摄像头和 TTS 能力保持可用。
195
+ - 如果模型已加载,KNX AI 会保留其当前上下文长度。KNX AI 不会通过管理 API 加载未运行的 Bionic 模型:首次聊天请求会让 Bionic 根据该模型已保存的默认值进行 JIT 加载。所有可用提示上下文都不受应用预算限制;如果无法放入当前窗口,请求会明确失败。
193
196
  - 除非在 LM Studio 服务设置中启用了身份验证,否则 API Key 可留空。在 Docker 中请将 `localhost` 替换为 `host.docker.internal`。
194
197
 
195
198
  ## 安全说明