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.
- package/CHANGELOG.md +21 -0
- package/nodes/knxUltimateAI.html +210 -82
- package/nodes/knxUltimateAI.js +2554 -1660
- package/nodes/knxUltimateAIHomeAssistant.html +38 -0
- package/nodes/knxUltimateAIHomeAssistant.js +152 -0
- package/nodes/locales/de/knxUltimateAI.html +19 -16
- package/nodes/locales/de/knxUltimateAI.json +40 -31
- package/nodes/locales/en/knxUltimateAI.html +27 -18
- package/nodes/locales/en/knxUltimateAI.json +40 -31
- package/nodes/locales/es/knxUltimateAI.html +19 -16
- package/nodes/locales/es/knxUltimateAI.json +40 -31
- package/nodes/locales/fr/knxUltimateAI.html +19 -16
- package/nodes/locales/fr/knxUltimateAI.json +40 -31
- package/nodes/locales/it/knxUltimateAI.html +27 -18
- package/nodes/locales/it/knxUltimateAI.json +40 -31
- package/nodes/locales/zh-CN/knxUltimateAI.html +19 -16
- package/nodes/locales/zh-CN/knxUltimateAI.json +40 -31
- package/nodes/plugins/knxUltimate-cerebrum-runtime-plugin.js +79 -0
- package/nodes/plugins/knxUltimateAI-vue/assets/app.css +1 -1
- package/nodes/plugins/knxUltimateAI-vue/assets/app.js +13 -4
- package/nodes/utils/knxAiCamera.js +4 -4
- package/nodes/utils/knxAiCatalogRetrieval.js +349 -0
- package/nodes/utils/knxAiCerebrum.js +406 -0
- package/nodes/utils/knxAiChatContext.js +43 -1
- package/nodes/utils/knxAiHomeMemory.js +555 -13
- package/nodes/utils/knxAiScheduler.js +4 -1
- package/nodes/utils/knxAiSemanticContext.js +662 -0
- package/package.json +5 -3
- package/resources/KNXAIChatAdapterMappings.js +31 -5
- package/resources/hueControllerProfiles.js +7614 -7622
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
<script type="text/javascript">
|
|
2
|
+
RED.nodes.registerType('knxUltimateAIHomeAssistant', {
|
|
3
|
+
category: "KNX Ultimate AI",
|
|
4
|
+
color: '#41BDF5',
|
|
5
|
+
defaults: {
|
|
6
|
+
name: { value: "Cerebrum Home Assistant" },
|
|
7
|
+
requestTimeoutMs: { value: 15000, validate: RED.validators.number() }
|
|
8
|
+
},
|
|
9
|
+
inputs: 1,
|
|
10
|
+
outputs: 1,
|
|
11
|
+
outputLabels: function () { return "ha-api request"; },
|
|
12
|
+
icon: "font-awesome/fa-home",
|
|
13
|
+
label: function () { return this.name || "Cerebrum Home Assistant"; },
|
|
14
|
+
paletteLabel: "Cerebrum Home Assistant"
|
|
15
|
+
});
|
|
16
|
+
</script>
|
|
17
|
+
|
|
18
|
+
<script type="text/html" data-template-name="knxUltimateAIHomeAssistant">
|
|
19
|
+
<div class="form-row">
|
|
20
|
+
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
|
|
21
|
+
<input type="text" id="node-input-name">
|
|
22
|
+
</div>
|
|
23
|
+
<div class="form-row">
|
|
24
|
+
<label for="node-input-requestTimeoutMs"><i class="fa fa-clock-o"></i> API timeout</label>
|
|
25
|
+
<input type="number" id="node-input-requestTimeoutMs" min="3000" max="60000" step="1000">
|
|
26
|
+
</div>
|
|
27
|
+
<div class="form-tips">
|
|
28
|
+
Connect this node's output to a Home Assistant <b>API</b> node (<code>ha-api</code>), then connect the API output back to this node's input. Home Assistant event nodes may also feed this input so Cerebrum can observe their state changes.
|
|
29
|
+
</div>
|
|
30
|
+
</script>
|
|
31
|
+
|
|
32
|
+
<script type="text/html" data-help-name="knxUltimateAIHomeAssistant">
|
|
33
|
+
<p>Connects Cerebrum to the Home Assistant Node-RED API node without storing Home Assistant credentials in KNX Ultimate.</p>
|
|
34
|
+
<h3>Required round trip</h3>
|
|
35
|
+
<p><code>Cerebrum Home Assistant → API (ha-api) → Cerebrum Home Assistant</code></p>
|
|
36
|
+
<p>The bridge sends dynamic WebSocket requests under <code>msg.payload</code>, correlates the returned message and exposes entity, state, service and event capabilities to the in-process Cerebrum registry.</p>
|
|
37
|
+
<p>Writes are only a provider capability. KNX AI must still apply its normal proposal, validation and confirmation policy before a Home Assistant service call can be executed.</p>
|
|
38
|
+
</script>
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
const {
|
|
2
|
+
getKnxAiHomeAutomationRegistry,
|
|
3
|
+
normalizeKnxAiHomeAutomationEvent
|
|
4
|
+
} = require('./utils/knxAiCerebrum')
|
|
5
|
+
|
|
6
|
+
const HOME_ASSISTANT_ADAPTER_ID = 'home-assistant'
|
|
7
|
+
const DEFAULT_REQUEST_TIMEOUT_MS = 15000
|
|
8
|
+
|
|
9
|
+
module.exports = function (RED) {
|
|
10
|
+
function knxUltimateAIHomeAssistant (config) {
|
|
11
|
+
RED.nodes.createNode(this, config)
|
|
12
|
+
const node = this
|
|
13
|
+
const registry = getKnxAiHomeAutomationRegistry()
|
|
14
|
+
const requestTimeoutMs = Math.max(3000, Math.min(60000, Number(config.requestTimeoutMs) || DEFAULT_REQUEST_TIMEOUT_MS))
|
|
15
|
+
const pendingRequests = new Map()
|
|
16
|
+
const listeners = new Set()
|
|
17
|
+
let requestSequence = 0
|
|
18
|
+
let closing = false
|
|
19
|
+
|
|
20
|
+
node.name = config.name || 'Cerebrum Home Assistant'
|
|
21
|
+
|
|
22
|
+
const updateStatus = ({ fill = 'grey', shape = 'ring', text = '' } = {}) => {
|
|
23
|
+
try { node.status({ fill, shape, text }) } catch (error) { /* ignore */ }
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const notifyEvent = event => {
|
|
27
|
+
listeners.forEach(listener => {
|
|
28
|
+
try { listener(event) } catch (error) { /* ignore */ }
|
|
29
|
+
})
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const sendApiRequest = data => new Promise((resolve, reject) => {
|
|
33
|
+
if (closing) return reject(new Error('Cerebrum Home Assistant is closing'))
|
|
34
|
+
requestSequence += 1
|
|
35
|
+
const requestId = `${node.id}:${Date.now()}:${requestSequence}`
|
|
36
|
+
const timer = setTimeout(() => {
|
|
37
|
+
pendingRequests.delete(requestId)
|
|
38
|
+
updateStatus({ fill: 'yellow', shape: 'ring', text: 'ha-api timeout' })
|
|
39
|
+
reject(new Error('Home Assistant ha-api request timed out; verify the round-trip wiring'))
|
|
40
|
+
}, requestTimeoutMs)
|
|
41
|
+
pendingRequests.set(requestId, { resolve, reject, timer })
|
|
42
|
+
node.send({
|
|
43
|
+
payload: {
|
|
44
|
+
protocol: 'websocket',
|
|
45
|
+
data,
|
|
46
|
+
location: 'payload',
|
|
47
|
+
locationType: 'msg'
|
|
48
|
+
},
|
|
49
|
+
knxAiCerebrum: {
|
|
50
|
+
requestId,
|
|
51
|
+
adapterId: HOME_ASSISTANT_ADAPTER_ID,
|
|
52
|
+
providerId: node.id,
|
|
53
|
+
direction: 'request'
|
|
54
|
+
}
|
|
55
|
+
})
|
|
56
|
+
updateStatus({ fill: 'blue', shape: 'dot', text: 'querying ha-api' })
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
const provider = {
|
|
60
|
+
id: node.id,
|
|
61
|
+
adapterId: HOME_ASSISTANT_ADAPTER_ID,
|
|
62
|
+
title: node.name,
|
|
63
|
+
capabilities: ['entities', 'events', 'services', 'states'],
|
|
64
|
+
listEntities: () => sendApiRequest({ type: 'get_states' }).then(result => Array.isArray(result) ? result : []),
|
|
65
|
+
getEntity: entityId => sendApiRequest({ type: 'get_states' }).then(result => {
|
|
66
|
+
const requested = String(entityId || '').trim().toLowerCase()
|
|
67
|
+
return (Array.isArray(result) ? result : []).find(entity => String(entity && entity.entity_id || '').trim().toLowerCase() === requested) || null
|
|
68
|
+
}),
|
|
69
|
+
listServices: () => sendApiRequest({ type: 'get_services' }),
|
|
70
|
+
callService: ({ domain, service, serviceData, target, authorization } = {}) => {
|
|
71
|
+
const safeDomain = String(domain || '').trim()
|
|
72
|
+
const safeService = String(service || '').trim()
|
|
73
|
+
if (!safeDomain || !safeService) return Promise.reject(new Error('Home Assistant domain and service are required'))
|
|
74
|
+
if (!authorization || authorization.confirmed !== true || authorization.source !== 'knxUltimateAI') {
|
|
75
|
+
return Promise.reject(new Error('Home Assistant service calls require an explicit KNX AI confirmation authorization'))
|
|
76
|
+
}
|
|
77
|
+
return sendApiRequest({
|
|
78
|
+
type: 'call_service',
|
|
79
|
+
domain: safeDomain,
|
|
80
|
+
service: safeService,
|
|
81
|
+
service_data: serviceData && typeof serviceData === 'object' ? serviceData : {},
|
|
82
|
+
target: target && typeof target === 'object' ? target : {}
|
|
83
|
+
})
|
|
84
|
+
},
|
|
85
|
+
subscribe: listener => {
|
|
86
|
+
if (typeof listener !== 'function') return () => {}
|
|
87
|
+
listeners.add(listener)
|
|
88
|
+
return () => listeners.delete(listener)
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
registry.registerAdapter({
|
|
93
|
+
id: HOME_ASSISTANT_ADAPTER_ID,
|
|
94
|
+
title: 'Home Assistant',
|
|
95
|
+
packageName: 'node-red-contrib-home-assistant-websocket',
|
|
96
|
+
capabilities: provider.capabilities
|
|
97
|
+
})
|
|
98
|
+
registry.registerProvider(provider)
|
|
99
|
+
|
|
100
|
+
node.on('input', function (msg, send, done) {
|
|
101
|
+
try {
|
|
102
|
+
const metadata = msg && msg.knxAiCerebrum && typeof msg.knxAiCerebrum === 'object' ? msg.knxAiCerebrum : {}
|
|
103
|
+
const requestId = String(metadata.requestId || '')
|
|
104
|
+
const pending = requestId ? pendingRequests.get(requestId) : null
|
|
105
|
+
if (pending) {
|
|
106
|
+
clearTimeout(pending.timer)
|
|
107
|
+
pendingRequests.delete(requestId)
|
|
108
|
+
if (msg && msg.error) pending.reject(new Error(String(msg.error.message || msg.error)))
|
|
109
|
+
else pending.resolve(msg ? msg.payload : undefined)
|
|
110
|
+
updateStatus({ fill: 'green', shape: 'dot', text: 'ha-api ready' })
|
|
111
|
+
if (typeof done === 'function') done()
|
|
112
|
+
return
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const event = normalizeKnxAiHomeAutomationEvent(msg, {
|
|
116
|
+
adapterId: HOME_ASSISTANT_ADAPTER_ID,
|
|
117
|
+
providerId: node.id
|
|
118
|
+
})
|
|
119
|
+
if (event) {
|
|
120
|
+
notifyEvent(event)
|
|
121
|
+
updateStatus({ fill: 'green', shape: 'dot', text: event.entityId || event.eventType })
|
|
122
|
+
}
|
|
123
|
+
if (typeof done === 'function') done()
|
|
124
|
+
} catch (error) {
|
|
125
|
+
updateStatus({ fill: 'red', shape: 'dot', text: error.message || String(error) })
|
|
126
|
+
if (typeof done === 'function') done(error)
|
|
127
|
+
else node.error(error, msg)
|
|
128
|
+
}
|
|
129
|
+
})
|
|
130
|
+
|
|
131
|
+
node.on('close', function (done) {
|
|
132
|
+
closing = true
|
|
133
|
+
registry.unregisterProvider(node.id)
|
|
134
|
+
pendingRequests.forEach(pending => {
|
|
135
|
+
clearTimeout(pending.timer)
|
|
136
|
+
pending.reject(new Error('Cerebrum Home Assistant node closed'))
|
|
137
|
+
})
|
|
138
|
+
pendingRequests.clear()
|
|
139
|
+
listeners.clear()
|
|
140
|
+
if (typeof done === 'function') done()
|
|
141
|
+
})
|
|
142
|
+
|
|
143
|
+
updateStatus({ fill: 'yellow', shape: 'ring', text: 'wire output → ha-api → input' })
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
RED.nodes.registerType('knxUltimateAIHomeAssistant', knxUltimateAIHomeAssistant)
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
module.exports.__test = {
|
|
150
|
+
DEFAULT_REQUEST_TIMEOUT_MS,
|
|
151
|
+
HOME_ASSISTANT_ADAPTER_ID
|
|
152
|
+
}
|
|
@@ -20,9 +20,9 @@ Das Inventar meldet die exakte Anzahl eindeutiger KNX-Gruppenadress-Signale, die
|
|
|
20
20
|
Sende `/start` oder `/help` in einem Chat, um am Chat-Ausgang (Ausgang 3) eine deterministische, lokalisierte Begrüßung mit personalisierten Anlagenstatistiken und bis zu drei sicheren Vorschlägen zu erhalten. Dieses Onboarding ruft weder das LLM auf noch liest oder schreibt es KNX oder erzeugt TTS. Mit dem Telegram-Preset erscheinen die Vorschläge als Antworttastatur und werden erst ausgeführt, nachdem der Benutzer einen davon ausdrücklich auswählt oder sendet. Nach dieser ausdrücklichen Auswahl darf ein Startvorschlag bei Bedarf exakte KNX-Leseoperationen ausführen; KNX-Schreiboperationen und -Routinen, Kameraaktionen, TTS, Änderungen am dauerhaften Gedächtnis und das Lernen von GA-Rollen bleiben unterdrückt.
|
|
21
21
|
|
|
22
22
|
### Web-Intelligenz
|
|
23
|
-
Der Webzugriff ist standardmäßig deaktiviert. Wenn **Der KI die Nutzung des Webs erlauben** aktiviert ist,
|
|
23
|
+
Der Webzugriff ist standardmäßig deaktiviert. Wenn **Der KI die Nutzung des Webs erlauben** aktiviert ist, entscheidet das Konversationsmodell bei jeder aktuellen Anfrage, ob neue öffentliche Informationen benötigt werden, und kann das strukturierte Web-Tool ohne Schlüsselwörter, themenspezifische Logik oder Intent-Klassifikatoren auswählen. Jeder Benutzerdialog oder Lauf einer vom Benutzer erstellten geplanten Aufgabe darf insgesamt höchstens drei Web-Operationen ausführen. Alle echten externen Web-Operationen teilen sich das konfigurierte gleitende Stundenbudget.
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
KNX AI startet keinen festen Web-Polling-Zyklus im Hintergrund. Würde ein wesentliches Detail die Antwort oder Anfrage erheblich verändern—etwa Thema, Umfang, Ort, Zeitfenster oder gewünschtes Ergebnis—stellt das Modell eine kurze Rückfrage und führt bis zur Antwort des Benutzers keine Web-Operation aus. Zukünftige oder wiederkehrende Prüfungen entstehen nur aus einer ausdrücklichen natürlichsprachlichen Anfrage über den Scheduler.
|
|
26
26
|
|
|
27
27
|
Jede Web-gestützte Antwort enthält laufzeitvalidierte Quellenangaben mit bereinigter Quell-URL und Abrufzeit sowie, sofern vorhanden, der Veröffentlichungszeit. Externe Inhalte sind nicht vertrauenswürdige Daten, niemals Anweisungen, und können Regeln oder Berechtigungen des Assistenten nicht überschreiben. Zulässig sind nur begrenzte öffentliche HTTPS-Ressourcen; private, lokale, Link-Local- und Cloud-Metadaten-Ziele, unsichere Weiterleitungen, authentifiziertes Browsing und Cookies werden blockiert. Kann keine Quelle verifiziert werden, meldet KNX AI diese Einschränkung, statt eine unbelegte Antwort zu erzeugen.
|
|
28
28
|
|
|
@@ -51,7 +51,12 @@ Dauert die Verarbeitung länger als 1,2 Sekunden, sendet Ausgang 3 sofort die lo
|
|
|
51
51
|
|
|
52
52
|
Jede LLM-Chat-Anfrage verwendet unabhängig vom Anbieter ein Mindest-Timeout von 30 Minuten. Im Editor muss kein Timeout-Feld gepflegt werden. Dies ist eine maximale Wartezeit, keine künstliche Verzögerung: Schnellere Modelle sind weiterhin fertig, sobald ihre Antwort bereitsteht. Wird selbst dieses Limit erreicht, meldet KNX AI, dass das Modell die Antwort nicht abgeschlossen hat, und empfiehlt einen neuen Versuch oder einen kleineren Prompt-Kontext.
|
|
53
53
|
|
|
54
|
-
|
|
54
|
+
KNX AI bietet keine anwendungsseitige Auswahl der Kontextgröße mehr. Der vollständige ausgewählte ETS-Katalog bleibt im Node und wird vom Modell über begrenzte lokale Retrieval-Aktionen abgefragt; nur gefundene Objekte gelangen in den Prompt. Die Suche umfasst exakte Adressen, ETS-Namen, Aliase, Hierarchie, Bereiche, Semantik, DPTs und Wertbezeichnungen mit akzentunabhängiger, fehlertoleranter Rangfolge sowie exakte Abfrage, Bereichsnavigation und die Suche nach zusammengehörigen Befehls-/Statusobjekten. Ohne expliziten Zeitraum umfassen KNX- und Adapterereignisse die letzten 20 Minuten. Mitgelieferte Hilfe, README, Wiki, Beispiele und Changelog werden nie eingebettet; bei Bedarf kann das Modell die öffentliche GitHub-Dokumentation über das Web-Werkzeug abrufen. Abgerufene ETS-Daten, die aktuelle Anfrage und Archivzeilen erscheinen jeweils nur einmal; im Analyseblock bleiben nur abgeleitete Bus-Aggregate. Vollständiger Function-Quelltext wird nur bei einer ausdrücklichen Function-Codeprüfung hinzugefügt. KNX AI wiederholt übergroße Anfragen nicht mit einem komprimierten Prompt.
|
|
55
|
+
|
|
56
|
+
Vor jeder Anfrage an ein lokales Modell reserviert KNX AI Antwortplatz im aktiven 8K-/16K-Fenster. Die neuesten Gesprächsrunden, exakten Archivzeilen, das gelernte Hausgedächtnis, Web-Ergebnisse, Zeitpläne, angeforderter Function-Quelltext, abgerufene ETS-Objekte und Kamerametadaten werden automatisch begrenzt. Dies ist eine vorbeugende Prompt-Erstellung und kein erneuter Versuch nach einem Größenfehler; der vollständige ausgewählte ETS-Katalog bleibt lokal per Retrieval verfügbar.
|
|
57
|
+
|
|
58
|
+
### Zugriff auf ETS-Objekte
|
|
59
|
+
Dieser Abschnitt übernimmt den Gruppenadress-Selektor des MQTT-Profils der IoT Bridge. Die importierte Liste kann gefiltert, vollständig ausgewählt oder abgewählt und für sichtbare Zeilen einzeln oder gesammelt auf Nur-Lesen gesetzt werden. Nur ausgewählte Adressen stehen dem Modell zur Verfügung. Jede ausgewählte Adresse ist aktiv und lesbar; Nur-Lesen-Adressen bleiben sichtbar, aber die lokale Validierung blockiert jedes `GroupValue_Write` auf sie. Es gibt weder Migration noch Legacy-Fallback: Nach dem Update muss jeder vorhandene KNX-AI-Knoten geöffnet, ausdrücklich konfiguriert, gespeichert und bereitgestellt werden; bis dahin ist sein AI-Katalog leer.
|
|
55
60
|
|
|
56
61
|
Der Node-Status im Canvas ist bewusst ausschließlich für die letzte eingehende Anfrage und den lokalisierten Zustand „Ich denke nach…“ während der LLM-Ausführung reserviert. KNX-Telegramme, Gateway-Aktualisierungen, Verkehrsraten, Bereitschaftsmeldungen und technische Ergebnisse überschreiben ihn nie; sie bleiben über Ausgänge, Logs und Assistentendaten verfügbar.
|
|
57
62
|
|
|
@@ -85,7 +90,7 @@ Installierte Kamerapakete können KNX AI zur Laufzeit einen Kamera-Adapter berei
|
|
|
85
90
|
|
|
86
91
|
Der Benutzer kann einen aktuellen Snapshot anfordern oder das Vision-Modell nach dem sichtbaren Inhalt fragen. Die Telegram- und RedBot-Vorlagen senden das Bild als natives Foto mit Bildunterschrift. Außerdem lassen sich dauerhafte Benachrichtigungen für Bewegung, das Überqueren einer intelligenten Linie oder das Betreten einer Einbruchs-/Verweilzone erstellen, optional auf erkannte Personen und eine genau benannte Linie oder Zone begrenzt. Diese Regeln werden in derselben Datei `knxai-chat-context.knxctx` gespeichert und nach einem Neustart von Node-RED wiederhergestellt. UniFi-Ereignisse und Snapshot-Anfragen laufen direkt über den erkannten Anbieter; Ausgang 4 von KNX AI und zusätzliche Flow-Verkabelung sind nicht erforderlich.
|
|
87
92
|
|
|
88
|
-
Jedes von einem automatisch erkannten Adapter veröffentlichte Ereignis wird normalisiert und direkt im kompakten zeilenbasierten KNX-AI-Nativformat in eine tägliche Datei `YYYY-MM-DD.knxctx` unter `knxultimatestorage/knxai/adapter-history/<node-id>/` geschrieben. Das KNX-Telegrammarchiv verwendet dasselbe kompakte Format ohne zwischenzeitliche JSON-Serialisierung. Das Archiv bewahrt 10 Tage auf, garantiert mehr als 24 Stunden Historie und speichert Ereignismetadaten, jedoch keine Snapshot-Bilder. Vorhandene JSONL-Archive werden weder gelesen noch migriert.
|
|
93
|
+
Jedes von einem automatisch erkannten Adapter veröffentlichte Ereignis wird normalisiert und direkt im kompakten zeilenbasierten KNX-AI-Nativformat in eine tägliche Datei `YYYY-MM-DD.knxctx` unter `knxultimatestorage/knxai/adapter-history/<node-id>/` geschrieben. Das KNX-Telegrammarchiv verwendet dasselbe kompakte Format ohne zwischenzeitliche JSON-Serialisierung. Das Archiv bewahrt 10 Tage auf, garantiert mehr als 24 Stunden Historie und speichert Ereignismetadaten, jedoch keine Snapshot-Bilder. Vorhandene JSONL-Archive werden weder gelesen noch migriert. Der Prompt verwendet die neuesten exakten Zeilen des gelieferten Zeitraums, automatisch begrenzt auf das aktive lokale Modellfenster.
|
|
89
94
|
|
|
90
95
|
### Ansagen mit TTS Ultimate
|
|
91
96
|
Verbinden Sie Ausgang 5 mit einem oder mehreren `ttsultimate`-Nodes aus dem optionalen Paket `node-red-contrib-tts-ultimate`. Die normale Node-RED-Verkabelung bestimmt Ziel und Verteilung; liegt der TTS-Node auf einer anderen Flow-Registerkarte, verwenden Sie Link Out/Link In. Die bisherige TTS-Node-Auswahl und die interne Einspeisung wurden entfernt. Die Positionen der Ausgänge 1–4 bleiben unverändert, aktualisierte Flows müssen Ausgang 5 jedoch physisch verbinden, bevor Sprachansagen TTS Ultimate erreichen.
|
|
@@ -93,9 +98,11 @@ Verbinden Sie Ausgang 5 mit einem oder mehreren `ttsultimate`-Nodes aus dem opti
|
|
|
93
98
|
Das Modell entscheidet anhand der aktuellen Anfrage, persistenter Chat-Anweisungen und der benutzerverwalteten KI-Erziehung, ob es eine Ansage vorbereitet; es gibt weder einen Ansage-Intent noch eine Liste von Auslösephrasen. KNX-Werte, Adapterereignisse, Kamerainhalte und Archive bleiben Daten statt Anweisungen, während vertrauenswürdige Benutzervorgaben dem Modell den Umgang mit diesen Daten beibringen können. Ausgang 5 gibt den exakt zu sprechenden Text in `msg.payload` aus, setzt `msg.topic = "knx_ai_announcement"` und ergänzt `msg.knxAi.type = "tts_announcement"` sowie `msg.knxAi.sourceNodeId`, `msg.knxAi.sessionId` und `msg.knxAi.reason`. TTS Ultimate verwaltet anschließend Player, Stimme, Lautstärke, Hailing und Warteschlange.
|
|
94
99
|
|
|
95
100
|
### Übersicht des Chat-Kontexts
|
|
96
|
-
Der Node-Editor zeigt eine kompakte Karte mit den für den Chat verfügbaren Quellen:
|
|
101
|
+
Der Node-Editor zeigt eine kompakte Karte mit den für den Chat verfügbaren Quellen: KNX- und Adapterereignissen der letzten 20 Minuten oder eines expliziten Zeitraums, dem vollständigen lokal durchsuchbaren ETS-Katalog, von dem nur abgerufene Objekte in den jeweiligen Prompt gelangen, Function-Quelltext bei Bedarf, Sitzungs- und Hausgedächtnis, KI-Erziehung, aktiven Plänen und erkannten Kameras. Sie zeigt außerdem den vom Modell gemeldeten maximalen operativen Kontext und die tatsächliche UTF-8-Größe des letzten Chat-Prompts; gemeldete Eingabe-Token des Anbieters werden exakt verwendet, andernfalls wird der Tokenwert als Schätzung gekennzeichnet. Aufgeführt werden auch die absoluten Pfade der verbindlichen JSON-/lesbaren Markdown-Planungsdateien sowie die KNX-Telegramm- und Adapterereignisarchive mit dem Tagesdateimuster `YYYY-MM-DD.knxctx`. Die KI-Erziehung wird in der Node-Konfiguration gespeichert und hat daher keine eigene Laufzeitdatei.
|
|
97
102
|
|
|
98
|
-
Das Modell erhält KNX-Lese-/Schreiboperationen, Kamera-Adapter, TTS-Ansagen, persistenten Speicher, Webzugriff und Pläne/Erinnerungen als strukturierte Werkzeuge. Es kann sie anhand der aktuellen Anfrage und vertrauenswürdiger gelernter Vorgaben semantisch auswählen und kombinieren, ohne sprachliches Intent-Routing. Die Laufzeit prüft
|
|
103
|
+
Das Modell erhält lokale ETS-Katalogsuche, KNX-Lese-/Schreiboperationen, Kamera-Adapter, TTS-Ansagen, persistenten Speicher, Webzugriff und Pläne/Erinnerungen als strukturierte Werkzeuge. Es kann sie anhand der aktuellen Anfrage und vertrauenswürdiger gelernter Vorgaben semantisch auswählen und kombinieren, ohne sprachliches Intent-Routing. Die Katalogsuche ist deterministisch und lokal; die Laufzeit prüft Argumente, die Verfügbarkeit von Kamera-Adaptern und Sicherheitsgrenzen, während KNX-Schreibvorgänge die vollständige lokale ETS-/DPT-Prüfung und die konfigurierte Bestätigung behalten.
|
|
104
|
+
|
|
105
|
+
Die temporäre lokale Debugdatei `knxai-last-chat-prompt-<node-id>.txt` enthält den letzten exakten System-/Benutzer-Prompttext, wird vor jedem Chataufruf überschrieben und enthält keine API-Schlüssel oder HTTP-Header.
|
|
99
106
|
|
|
100
107
|
### CHAT-Lernen bearbeiten und sichern
|
|
101
108
|
Die Registerkarte **Gespräche & Zuhause** in der Node-RED-Konfiguration von KNX AI enthält die Schaltfläche **KI-Chat-Lernen öffnen**. Sie öffnet die Vue-Weboberfläche für den aktuellen Node direkt in diesem Editor.
|
|
@@ -104,10 +111,8 @@ Die Registerkarte **Gespräche & Zuhause** in der Node-RED-Konfiguration von KNX
|
|
|
104
111
|
|
|
105
112
|
Nur das native V3-Format wird unterstützt. Frühere Markdown/JSON-V2- und Base64-V1-Dateien werden absichtlich weder gelesen noch importiert oder migriert; die alte `.md`-Datei bleibt unverändert und KNX AI beginnt mit einem neuen `.knxctx`-Kontext. Die Grenzen von 50 Sitzungen und 512 KB gelten weiterhin.
|
|
106
113
|
|
|
107
|
-
###
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
Gelernte Rolle, Begründung und Beleg werden pro Node in `<userDir>/knxai/config/knxai-config-<node-id>.json` gespeichert und in das begrenzte semantische Hausgedächtnis synchronisiert. Eine als `command` gelernte Rolle kann bereits in derselben Antwort einen Schreibvorgang validieren und bleibt nach einem Neustart verfügbar; das Modell kann sie auch vergessen und die automatische Klassifizierung wiederherstellen. Das Lernen kann keine GA erfinden, ihren ETS-DPT ändern, die Payload-Prüfung umgehen oder die konfigurierte Schreibbestätigung überspringen.
|
|
114
|
+
### ETS-Objektzugriff
|
|
115
|
+
Der ETS-Objektzugriff ist die einzige operative Autorität. Jede unter **ETS-Objektzugriff** ausgewählte Adresse ist aktiv und lesbar; sie ist auch schreibbar, sofern sie nicht als **Nur Lesen** markiert ist. Es wird keine abgeleitete Rollenklassifizierung an das Chatmodell gesendet oder zur Freigabe eines Schreibvorgangs verwendet.
|
|
111
116
|
|
|
112
117
|
## Durch KI-Erziehung gesteuerte proaktive Hausintelligenz und begrenztes Gedächtnis
|
|
113
118
|
Aus ETS-Hierarchie, Namen, Rollen und DPTs erstellt der Node ein deterministisches semantisches Modell. Es gibt keinen separaten Schalter und keine erweiterten proaktiven Einstellungen. Eine Benachrichtigung wird nur bewertet, wenn das LLM aktiv ist und die **KI-Erziehung** sie ausdrücklich verlangt. Ausschließlich die Erziehung bestimmt Bedingungen, Offenzeit, Ruhezeiten und Wiederholung. Ohne eine ausdrückliche Regel oder bei fehlgeschlagener LLM-Auswertung wird nichts gesendet.
|
|
@@ -161,12 +166,10 @@ Hier sind alle Felder aufgeführt, wie sie im KNX-AI-Editor sichtbar sind.
|
|
|
161
166
|
- **Model**: Modell-ID/Name.
|
|
162
167
|
- **Denkaufwand**: Anbieterunabhängige Vorgabe für Modelle, die eine Steuerung des Denkaufwands anbieten. **Automatisch** sendet keine Vorgabe und behält den Modell-/Anbieterstandard bei. Explizit wählbar sind `none`, `minimal`, `low`, `medium`, `high`, `xhigh` und `max`; die Unterstützung hängt von Anfrageprotokoll und Modell ab. Wird der Wert abgelehnt, versucht KNX AI es ohne diese Vorgabe erneut.
|
|
163
168
|
- **Der KI die Nutzung des Webs erlauben**: Standardmäßig deaktiviert. Das Modell darf das allgemeine Web-Tool semantisch auswählen und verifizierte, zitierte Quellen zurückgeben.
|
|
164
|
-
- **
|
|
165
|
-
- **Mindestintervall für proaktive Prüfungen**: Mindestzeit zwischen proaktiven Zyklen; Web-Operationen in einem aktiven Benutzerturn werden dadurch nicht verzögert.
|
|
166
|
-
- **Maximale Web-Aufrufe pro Stunde**: Gleitendes Budget für interaktive und proaktive Web-Operationen. Jeder Turn oder Zyklus darf insgesamt höchstens drei Operationen verwenden.
|
|
169
|
+
- **Maximale Web-Aufrufe pro Stunde**: Gleitendes Budget für Unterhaltungen und vom Benutzer erstellte geplante Aufgaben. Jeder Turn oder geplante Lauf darf insgesamt höchstens drei Operationen verwenden.
|
|
167
170
|
- **Telegram-Sprache**: Nur mit dem Provider **OpenAI-compatible** verfügbar. Endpunkt und API-Schlüssel dieses Providers werden automatisch mit den integrierten Standards `gpt-4o-mini-transcribe`, `gpt-4o-mini-tts` und `alloy` verwendet; separate Spracheinstellungen gibt es nicht.
|
|
168
171
|
- **Chatmodell-Kompatibilität**: Das ausgewählte Modell muss den konfigurierten Chat-Completions-Endpunkt unterstützen. Ältere reine Completions-Modelle wie `gpt-3.5-turbo-instruct` werden beim Aktualisieren der Modellliste ausgeschlossen. Lehnt der Anbieter einen benutzerdefinierten Temperaturwert oder den Token-Limit-Parameter ab, wiederholt KNX AI die Anfrage und entfernt oder ersetzt nur das inkompatible Feld.
|
|
169
|
-
- **KI darf KNX-Zustände lesen und Aktoren steuern**: Aktiviert Ausgang 4 und ist standardmäßig aus.
|
|
172
|
+
- **KI darf KNX-Zustände lesen und Aktoren steuern**: Aktiviert Ausgang 4 und ist standardmäßig aus. Jedes ausgewählte ETS-Objekt darf gelesen werden; jedes ausgewählte Objekt ohne Markierung **Nur Lesen** darf geschrieben werden. Unbekannte, DPT-falsche, ungültige oder überzählige Operationen sowie Schreiboperationen auf Nur-Lesen-Objekte werden lokal abgewiesen.
|
|
170
173
|
- **Vor dem Senden von KNX-Befehlen bestätigen lassen**: Standardmäßig aktiv. Zeigt zuerst die validierten Änderungen und sendet nichts, bis dieselbe Chat-Sitzung bestätigt. Wenn Befehle auf Bestätigung warten, fügt die Antwort immer die genauen Anweisungen zum Bestätigen oder Abbrechen in der Sprache der aktuellen Anfrage hinzu. Vor der Ausgabe werden die Befehle erneut validiert.
|
|
171
174
|
- **Adapter für Ein-/Ausgangsnachrichten**: Standardmäßig ist **Kein Adapter** gewählt. Die Auswahl lädt das vordefinierte Paar aus Ein- und Ausgangszuordnung; beide bleiben im Editor verborgen.
|
|
172
175
|
- **KI-Erziehung**: Feste, verbindliche Node-Vorgaben, die nur der Benutzer bearbeitet und mit Deploy anwendet. Das Modell liest, aber schreibt sie niemals. Dauerhafte proaktive Hausregeln gehören hierher; im Chat angeforderte Fakten und Präferenzen gehen in das gelernte Gedächtnis, einmalige oder wiederkehrende Pläne, Erinnerungen, Überwachungen und zukünftige Befehle in den semantischen Scheduler – ohne Auslösephrasen oder Intent-Routing.
|
|
@@ -181,7 +184,7 @@ Hier sind alle Felder aufgeführt, wie sie im KNX-AI-Editor sichtbar sind.
|
|
|
181
184
|
- **2) Install it**: lädt und installiert das Modell lokal (z. B. `llama3.1`).
|
|
182
185
|
- Beim Refresh/Install versucht KNX AI zusätzlich, den Ollama-Server automatisch zu starten.
|
|
183
186
|
- Bei Installationsfehlern mit Verbindungsproblem prüfen, ob Ollama läuft (Desktop-App oder `ollama serve`).
|
|
184
|
-
- Der von `/api/show` gemeldete maximale Kontext
|
|
187
|
+
- Der von `/api/show` gemeldete maximale Kontext wird direkt als `num_ctx` verwendet. KNX AI wendet kein kleineres Prompt-Budget an und sendet den deduplizierten operativen Prompt ohne größenabhängige Komprimierung, niemals über das gemeldete physische Maximum hinaus.
|
|
185
188
|
- Wenn Node-RED in Docker läuft, im Endpoint `host.docker.internal` statt `localhost` verwenden.
|
|
186
189
|
|
|
187
190
|
### Bionic LM Studio Schnellstart (lokal)
|
|
@@ -189,7 +192,7 @@ Hier sind alle Felder aufgeführt, wie sie im KNX-AI-Editor sichtbar sind.
|
|
|
189
192
|
- Den LM-Studio-API-Server auf der Seite **Developer** oder mit `lms server start` starten.
|
|
190
193
|
- Standard-Endpoint: `http://localhost:1234/v1/chat/completions`.
|
|
191
194
|
- Mit **Refresh** alle von `/v1/models` bereitgestellten Modelle laden; ist kein Modell konfiguriert, wird das erste ausgewählt.
|
|
192
|
-
- Ist ein Modell bereits geladen, behält KNX AI dessen aktive Kontextlänge bei. KNX AI lädt ein inaktives Bionic-Modell niemals über die Verwaltungs-API: Die erste Chat-Anfrage lässt Bionic das Modell per JIT mit den gespeicherten modellspezifischen Standardwerten laden.
|
|
195
|
+
- Ist ein Modell bereits geladen, behält KNX AI dessen aktive Kontextlänge bei. KNX AI lädt ein inaktives Bionic-Modell niemals über die Verwaltungs-API: Die erste Chat-Anfrage lässt Bionic das Modell per JIT mit den gespeicherten modellspezifischen Standardwerten laden. Der gesamte verfügbare Prompt-Kontext wird ohne Anwendungsbudget gesendet; passt er nicht in das aktive Modellfenster, schlägt die Anfrage ausdrücklich fehl.
|
|
193
196
|
- Der API-Schlüssel ist optional, sofern die Authentifizierung in den LM-Studio-Servereinstellungen nicht aktiviert ist. In Docker `localhost` durch `host.docker.internal` ersetzen.
|
|
194
197
|
|
|
195
198
|
## Sicherheitshinweis
|
|
@@ -3,13 +3,15 @@
|
|
|
3
3
|
"title": "KNX AI (Traffic Analyzer)",
|
|
4
4
|
"sections": {
|
|
5
5
|
"groupAssistant": "KI-Assistent",
|
|
6
|
-
"groupChatHome": "
|
|
6
|
+
"groupChatHome": "Cerebrum (BETA)",
|
|
7
7
|
"setupDoctor": "Setup Doctor",
|
|
8
8
|
"webIntelligence": "Web-Intelligenz",
|
|
9
9
|
"detectedAdapters": "Erkannte und im Chat verwendete kompatible Nodes",
|
|
10
10
|
"chatContextOverview": "Übersicht des Chat-Kontexts",
|
|
11
11
|
"chatLearning": "KI-Chat-Lernen",
|
|
12
|
+
"cerebrumMemory": "Cerebrum-Speicher",
|
|
12
13
|
"quickSetup": "Assistent einrichten",
|
|
14
|
+
"etsAccess": "Zugriff auf ETS-Objekte",
|
|
13
15
|
"llmConnection": "KI-Assistent-Verbindung",
|
|
14
16
|
"chatAdapter": "Chat-Pins für Ein- und Ausgang",
|
|
15
17
|
"homeIntelligence": "KI-Erziehung & Gedächtnis",
|
|
@@ -25,20 +27,17 @@
|
|
|
25
27
|
"llmApiKey": "API key",
|
|
26
28
|
"llmModel": "Model",
|
|
27
29
|
"llmReasoningEffort": "Denkaufwand",
|
|
28
|
-
"
|
|
30
|
+
"llmLocalContextTokens": "Lokales Kontextfenster",
|
|
29
31
|
"llmSystemPrompt": "System prompt",
|
|
30
32
|
"llmIncludeRaw": "Include raw payload hex",
|
|
31
33
|
"llmAllowKnxCommands": "KI darf KNX-Zustände lesen und Aktoren steuern",
|
|
32
34
|
"llmRequireCommandConfirmation": "Vor dem Senden von KNX-Befehlen bestätigen lassen",
|
|
33
35
|
"webAccessEnabled": "Der KI die Nutzung des Webs erlauben",
|
|
34
|
-
"webProactiveEnabled": "Proaktive Web-Prüfungen erlauben",
|
|
35
|
-
"webProactiveIntervalMinutes": "Mindestintervall für proaktive Prüfungen",
|
|
36
36
|
"webMaxCallsPerHour": "Maximale Web-Aufrufe pro Stunde",
|
|
37
37
|
"chatAdapterPreset": "Adapter für Ein-/Ausgangsnachrichten",
|
|
38
38
|
"chatInputCode": "Eingangszuordnung (Chat → KNX AI)",
|
|
39
39
|
"chatOutputCode": "Ausgangszuordnung (KNX AI → Chat)",
|
|
40
|
-
"aiEducation": "KI-Erziehung (vom Benutzer verwaltet)"
|
|
41
|
-
"llmIncludeDocsSnippets": "Include documentation snippets (help/README/examples)"
|
|
40
|
+
"aiEducation": "KI-Erziehung (vom Benutzer verwaltet)"
|
|
42
41
|
},
|
|
43
42
|
"outputs": {
|
|
44
43
|
"summary": "Zusammenfassung/Statistik",
|
|
@@ -49,17 +48,11 @@
|
|
|
49
48
|
},
|
|
50
49
|
"selectlists": {
|
|
51
50
|
"llmProvider": {
|
|
52
|
-
"openai_compat": "OpenAI
|
|
51
|
+
"openai_compat": "OpenAI / OpenAI-kompatibel",
|
|
53
52
|
"anthropic": "Anthropic (Claude)",
|
|
54
53
|
"ollama": "Ollama (lokal)",
|
|
55
54
|
"lmstudio": "Bionic LM Studio"
|
|
56
55
|
},
|
|
57
|
-
"promptContext": {
|
|
58
|
-
"small": "Klein (4K, schneller)",
|
|
59
|
-
"medium": "Mittel (8K)",
|
|
60
|
-
"full": "Vollständig (16K)",
|
|
61
|
-
"unlimited": "Kein KNX-AI-Limit (Modellkontext verwenden)"
|
|
62
|
-
},
|
|
63
56
|
"reasoningEffort": {
|
|
64
57
|
"default": "Automatisch (Modell-/Anbieterstandard)",
|
|
65
58
|
"none": "Keiner",
|
|
@@ -70,16 +63,18 @@
|
|
|
70
63
|
"xhigh": "Sehr hoch",
|
|
71
64
|
"max": "Maximal"
|
|
72
65
|
},
|
|
66
|
+
"localContext": {
|
|
67
|
+
"maximum": "Maximum",
|
|
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": "Kein Adapter"
|
|
75
|
-
},
|
|
76
|
-
"webProactiveInterval": {
|
|
77
|
-
"5": "5 Minuten",
|
|
78
|
-
"10": "10 Minuten",
|
|
79
|
-
"15": "15 Minuten",
|
|
80
|
-
"30": "30 Minuten",
|
|
81
|
-
"60": "1 Stunde",
|
|
82
|
-
"180": "3 Stunden"
|
|
83
78
|
}
|
|
84
79
|
},
|
|
85
80
|
"placeholder": {
|
|
@@ -99,18 +94,25 @@
|
|
|
99
94
|
"setupDoctorWarn": "Prüfen",
|
|
100
95
|
"setupDoctorFail": "Beheben",
|
|
101
96
|
"setupDoctorInfo": "Optional",
|
|
102
|
-
"webAccessHint": "Das Modell wählt dieses allgemeine Web-Tool semantisch
|
|
103
|
-
"
|
|
104
|
-
"webBudgetHint": "Das gleitende Budget zählt echte externe Aufrufe aus Chat und proaktiven Prüfungen.",
|
|
97
|
+
"webAccessHint": "Das Modell wählt dieses allgemeine Web-Tool semantisch für jede klare Chat- oder geplante Anfrage. Fehlt ein wesentlicher Umfang, fragt es vor der Suche beim Benutzer nach; Hintergrund-Polling, Schlüsselwörter oder Intent-Klassifikatoren werden nicht verwendet. Externe Websites und der Suchdienst erhalten die Anfrage und die öffentliche IP dieses Servers. Private KNX-, Kamera-, Chat-, Speicher- und Zugangsdaten werden nie automatisch hinzugefügt.",
|
|
98
|
+
"webBudgetHint": "Das gleitende Budget zählt echte externe Aufrufe aus Unterhaltungen und vom Benutzer erstellten geplanten Aufgaben.",
|
|
105
99
|
"lmStudioContextAvailable": "Maximaler Modellkontext",
|
|
106
100
|
"lmStudioContextLoading": "Aktiver Modellkontext wird geprüft",
|
|
107
101
|
"lmStudioContextInactive": "Modell inaktiv; bei der ersten Anfrage werden die Bionic-Standardwerte verwendet",
|
|
108
102
|
"lmStudioContextConfigured": "Aktiver Modellkontext",
|
|
109
103
|
"lmStudioContextFailed": "Der Modellkontext konnte nicht konfiguriert werden",
|
|
110
104
|
"lmStudioContextCurrentlyLoaded": "derzeit geladen",
|
|
111
|
-
"
|
|
112
|
-
"
|
|
105
|
+
"etsAccessHint": "Wähle die für KNX AI verfügbaren Gruppenadressen. Jede ausgewählte Adresse ist aktiv und lesbar; jede ausgewählte Adresse ohne Markierung Nur Lesen ist schreibbar. Cloud-Anbieter erhalten den vollständigen ausgewählten semantischen ETS-Katalog; lokale Modelle erhalten so viel, wie in das gewählte Kontextfenster passt, und können fehlende Details lokal abrufen.",
|
|
106
|
+
"etsFilterPlaceholder": "Nach Name, GA oder DPT filtern…",
|
|
107
|
+
"etsSelected": "ausgewählt",
|
|
108
|
+
"etsReadOnly": "Nur lesen",
|
|
109
|
+
"etsReadOnlyBulk": "Nur lesen für angezeigte Adressen",
|
|
110
|
+
"etsNoGateway": "Wähle ein KNX-Gateway aus.",
|
|
111
|
+
"etsNoGa": "Keine Gruppenadressen gefunden. Importiere die ETS-Liste im KNX-Gateway.",
|
|
112
|
+
"etsCsvError": "Die Gruppenadressliste konnte nicht vom Gateway geladen werden.",
|
|
113
113
|
"reasoningEffortHint": "Optionale Vorgabe für Modelle, die einen Denkaufwand unterstützen. Automatisch sendet keine Vorgabe; lehnt der Anbieter oder das Modell den gewählten Wert ab, versucht KNX AI es ohne diesen erneut.",
|
|
114
|
+
"localContextBudget": "Lokales Kontextfenster",
|
|
115
|
+
"localContextHint": "Legt den maximalen Kontext nur für lokale Modelle fest. Maximum verwendet das bekannte Kontextfenster des ausgewählten Modells; nicht verfügbare Größen werden ausgeblendet. Cloud-Anbieter ignorieren diese Auswahl und erhalten den vollständigen ausgewählten semantischen ETS-Katalog.",
|
|
114
116
|
"ollamaNotSupported": "Ollama local mode: API key not required. Default endpoint is http://localhost:11434/api/chat.",
|
|
115
117
|
"ollamaNoModels": "No local Ollama model found. Install one or pick one from the library.",
|
|
116
118
|
"installingOllamaModel": "Starting Ollama and installing model…",
|
|
@@ -128,6 +130,7 @@
|
|
|
128
130
|
"chatContextLoading": "Zusammenfassung des Chat-Kontexts wird geladen…",
|
|
129
131
|
"chatContextUnavailable": "Die Zusammenfassung des Chat-Kontexts ist vorübergehend nicht verfügbar.",
|
|
130
132
|
"chatLearningOpenHint": "Öffnet die Weboberfläche direkt im gemeinsamen CHAT-Lerneditor, um die persistente Datei anzuzeigen, zu bearbeiten, zu kopieren oder zu sichern.",
|
|
133
|
+
"cerebrumMemoryOpenHint": "Öffnet den lesbaren Cerebrum-Speicher für gelernte Gewohnheiten, Entscheidungen der Bewohner und zwischengespeicherte Hauszustände.",
|
|
131
134
|
"chatContextIntro": "Der Chat erhält diese Quellen automatisch. Die folgenden Pfade werden von dieser Node-RED-Installation tatsächlich verwendet.",
|
|
132
135
|
"chatContextLimitLabel": "Maximaler operativer Kontext",
|
|
133
136
|
"chatContextProviderManaged": "vom ausgewählten Anbieter/Modell verwaltet",
|
|
@@ -140,9 +143,9 @@
|
|
|
140
143
|
"chatContextSourcesTitle": "Enthaltene Quellen",
|
|
141
144
|
"chatContextFilesTitle": "Dauerhafte Kontextdateien",
|
|
142
145
|
"chatContextDirectoriesTitle": "KNX-Telegrammarchiv",
|
|
143
|
-
"chatContextSourceKnxTraffic": "
|
|
144
|
-
"chatContextSourceAdapterHistory": "
|
|
145
|
-
"chatContextSourceEtsProject": "ETS-
|
|
146
|
+
"chatContextSourceKnxTraffic": "Abgeleitete KNX-Analyse plus die neuesten exakten Ereignisse aus dem standardmäßigen 20-Minuten- oder expliziten Zeitraum, automatisch an das aktive lokale Modellfenster angepasst.",
|
|
147
|
+
"chatContextSourceAdapterHistory": "Neueste exakte Adapterereignisse aus demselben Zeitraum, automatisch an das aktive lokale Modellfenster angepasst.",
|
|
148
|
+
"chatContextSourceEtsProject": "Vollständiger ausgewählter semantischer ETS-Katalog für Cloud-Modelle. Lokale Modelle erhalten den vollständigen Katalog, wenn er in das Fenster passt, andernfalls einen fenstergroßen Index und die vom Modell angeforderten exakten Details. Function-Quelltext nur bei ausdrücklicher Codeprüfung.",
|
|
146
149
|
"chatContextSourceMemoryEducation": "Sitzungskontext, KI-Erziehung, begrenztes Hausgedächtnis und aktive Pläne.",
|
|
147
150
|
"chatContextSourceCameras": "Erkannte Kameras und ihre verfügbaren Funktionen.",
|
|
148
151
|
"chatContextSourceBadge": "Quelle",
|
|
@@ -150,7 +153,8 @@
|
|
|
150
153
|
"chatContextFileHomeMemory": "Nur begrenztes gelerntes Hausgedächtnis; die KI-Erziehung bleibt in der Node-Eigenschaft.",
|
|
151
154
|
"chatContextFileSchedules": "Verbindlicher dauerhafter Laufzeitstatus der Pläne und Erinnerungen dieses Nodes.",
|
|
152
155
|
"chatContextFileSchedulesReadable": "Erzeugte menschenlesbare Ansicht der Pläne und Erinnerungen dieses Nodes.",
|
|
153
|
-
"chatContextFileAssistantConfig": "Dauerhafte Konfiguration
|
|
156
|
+
"chatContextFileAssistantConfig": "Dauerhafte Cerebrum-Konfiguration und semantische Bereiche dieses Nodes.",
|
|
157
|
+
"chatContextFileLastChatPrompt": "Temporäre lokale Kopie der letzten System- und Benutzernachricht an das Chatmodell; wird bei jeder Chatanfrage überschrieben.",
|
|
154
158
|
"chatContextFileBadge": "Datei",
|
|
155
159
|
"chatContextDirectoryRoot": "Stammverzeichnis des Telegrammarchivs",
|
|
156
160
|
"chatContextDirectoryNode": "Telegrammarchiv dieses Nodes",
|
|
@@ -216,7 +220,12 @@
|
|
|
216
220
|
"installOllamaModel": "2) Install it",
|
|
217
221
|
"ollamaLibrary": "Model library",
|
|
218
222
|
"downloadOllamaModel": "1) Download model",
|
|
219
|
-
"openChatLearning": "KI-Chat-Lernen öffnen"
|
|
223
|
+
"openChatLearning": "KI-Chat-Lernen öffnen",
|
|
224
|
+
"openCerebrumMemory": "Cerebrum-Speicher öffnen",
|
|
225
|
+
"etsSelectAll": "Alle auswählen",
|
|
226
|
+
"etsSelectNone": "Alle abwählen",
|
|
227
|
+
"etsReadOnlyAll": "Nur lesen setzen",
|
|
228
|
+
"etsReadOnlyNone": "Nur lesen entfernen"
|
|
220
229
|
}
|
|
221
230
|
}
|
|
222
231
|
}
|