node-red-contrib-knx-ultimate 7.1.0-beta.2 → 7.1.2
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 +9 -0
- package/README.md +5 -1
- package/nodes/knxUltimateAI.html +1820 -0
- package/nodes/knxUltimateAI.js +16797 -0
- package/nodes/knxUltimateAIHomeAssistant.html +40 -0
- package/nodes/knxUltimateAIHomeAssistant.js +152 -0
- package/nodes/knxUltimateHueController.html +1 -1
- package/nodes/knxUltimateMatterBridge.html +2 -2
- package/nodes/knxUltimateMatterControllerDevice.html +2 -2
- package/nodes/locales/de/knxUltimateAI.html +5 -0
- package/nodes/locales/de/knxUltimateAI.json +231 -0
- package/nodes/locales/de/knxUltimateUtility.json +8 -0
- package/nodes/locales/en/knxUltimateAI.html +5 -0
- package/nodes/locales/en/knxUltimateAI.json +234 -0
- package/nodes/locales/en/knxUltimateUtility.json +8 -0
- package/nodes/locales/es/knxUltimateAI.html +5 -0
- package/nodes/locales/es/knxUltimateAI.json +231 -0
- package/nodes/locales/es/knxUltimateUtility.json +9 -1
- package/nodes/locales/fr/knxUltimateAI.html +5 -0
- package/nodes/locales/fr/knxUltimateAI.json +231 -0
- package/nodes/locales/fr/knxUltimateUtility.json +8 -0
- package/nodes/locales/it/knxUltimateAI.html +5 -0
- package/nodes/locales/it/knxUltimateAI.json +234 -0
- package/nodes/locales/it/knxUltimateUtility.json +8 -0
- package/nodes/locales/zh-CN/knxUltimateAI.html +5 -0
- package/nodes/locales/zh-CN/knxUltimateAI.json +231 -0
- package/nodes/locales/zh-CN/knxUltimateUtility.json +8 -0
- package/nodes/plugins/knxUltimate-cerebrum-runtime-plugin.js +79 -0
- package/nodes/plugins/knxUltimate-migration-notice-plugin.html +19 -0
- package/nodes/plugins/knxUltimateAI-vue/assets/app.css +1 -0
- package/nodes/plugins/knxUltimateAI-vue/assets/app.js +13 -0
- package/nodes/plugins/knxUltimateAI-vue/assets/chunk-html2canvas.esm.js +5 -0
- package/nodes/plugins/knxUltimateAI-vue/assets/chunk-index.es.js +5 -0
- package/nodes/plugins/knxUltimateAI-vue/assets/chunk-jspdf.es.min.js +79 -0
- package/nodes/plugins/knxUltimateAI-vue/assets/chunk-purify.es.js +3 -0
- package/nodes/plugins/knxUltimateAI-vue/index.html +13 -0
- package/nodes/plugins/knxUltimateViewer-vue/assets/app.js +2 -2
- package/nodes/utils/knxAiCamera.js +302 -0
- package/nodes/utils/knxAiCatalogRetrieval.js +349 -0
- package/nodes/utils/knxAiCerebrum.js +406 -0
- package/nodes/utils/knxAiChatContext.js +496 -0
- package/nodes/utils/knxAiEventHistory.js +521 -0
- package/nodes/utils/knxAiHomeMemory.js +1021 -0
- package/nodes/utils/knxAiScheduler.js +445 -0
- package/nodes/utils/knxAiSemanticContext.js +662 -0
- package/nodes/utils/knxAiTelegramVoice.js +545 -0
- package/nodes/utils/knxAiWebAccess.js +631 -0
- package/package.json +17 -9
- package/resources/KNXAIChatAdapterMappings.js +416 -0
- package/resources/hueControllerMigrationDialog.js +3 -0
- package/resources/knxUtilityMigration.js +3 -0
- package/resources/legacyMigrationNotice.js +143 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<script type="text/javascript">
|
|
2
|
+
RED.nodes.registerType('knxUltimateAIHomeAssistant', {
|
|
3
|
+
category: 'deprecated',
|
|
4
|
+
color: '#41BDF5',
|
|
5
|
+
defaults: {
|
|
6
|
+
name: { value: "Legacy Home Assistant bridge" },
|
|
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 || "Legacy Home Assistant bridge"; },
|
|
14
|
+
paletteLabel: "Legacy Home Assistant bridge"
|
|
15
|
+
});
|
|
16
|
+
try { RED.palette.remove('knxUltimateAIHomeAssistant'); } catch (error) { }
|
|
17
|
+
</script>
|
|
18
|
+
|
|
19
|
+
<script type="text/html" data-template-name="knxUltimateAIHomeAssistant">
|
|
20
|
+
<div class="form-tips" style="margin-bottom:10px;"><b>Legacy node:</b> for new installations use the Home Assistant bridge included with <a href="https://github.com/Supergiovane/node-red-contrib-cerebrum-ultimate#readme" target="_blank"><b>Cerebrum Ultimate</b></a>.</div>
|
|
21
|
+
<div class="form-row">
|
|
22
|
+
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
|
|
23
|
+
<input type="text" id="node-input-name">
|
|
24
|
+
</div>
|
|
25
|
+
<div class="form-row">
|
|
26
|
+
<label for="node-input-requestTimeoutMs"><i class="fa fa-clock-o"></i> API timeout</label>
|
|
27
|
+
<input type="number" id="node-input-requestTimeoutMs" min="3000" max="60000" step="1000">
|
|
28
|
+
</div>
|
|
29
|
+
<div class="form-tips">
|
|
30
|
+
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.
|
|
31
|
+
</div>
|
|
32
|
+
</script>
|
|
33
|
+
|
|
34
|
+
<script type="text/html" data-help-name="knxUltimateAIHomeAssistant">
|
|
35
|
+
<p>Connects Cerebrum to the Home Assistant Node-RED API node without storing Home Assistant credentials in KNX Ultimate.</p>
|
|
36
|
+
<h3>Required round trip</h3>
|
|
37
|
+
<p><code>Cerebrum Home Assistant → API (ha-api) → Cerebrum Home Assistant</code></p>
|
|
38
|
+
<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>
|
|
39
|
+
<p>Writes are only a provider capability. Cerebrum Ultimate must still apply its normal proposal, validation and confirmation policy before a Home Assistant service call can be executed.</p>
|
|
40
|
+
</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 Cerebrum Ultimate 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
|
+
}
|
|
@@ -305,7 +305,7 @@
|
|
|
305
305
|
};
|
|
306
306
|
|
|
307
307
|
RED.nodes.registerType('knxUltimateHueController', {
|
|
308
|
-
category: 'KNX Ultimate
|
|
308
|
+
category: 'KNX Ultimate',
|
|
309
309
|
color: '#C0C7E9',
|
|
310
310
|
defaults: buildDefaults(),
|
|
311
311
|
// catalogDefaults is consumed by the Cerebrum Ultimate catalog. It intentionally
|
|
@@ -134,7 +134,7 @@
|
|
|
134
134
|
});
|
|
135
135
|
|
|
136
136
|
RED.nodes.registerType('knxUltimateMatterBridge', {
|
|
137
|
-
category: '
|
|
137
|
+
category: 'deprecated',
|
|
138
138
|
color: '#8FB1FA',
|
|
139
139
|
defaults: gaDefaults,
|
|
140
140
|
inputs: 0,
|
|
@@ -672,4 +672,4 @@ section directly below, with copyable examples filtered to the selected device t
|
|
|
672
672
|
|
|
673
673
|
- input: `msg.payload = { function: "onoff", value: true }` updates the Matter state without the KNX bus
|
|
674
674
|
- output: every command from a Matter controller is forwarded as `msg` (topic = device name, payload = value, `msg.matter` = raw command)
|
|
675
|
-
</script>
|
|
675
|
+
</script>
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
(function () {
|
|
10
10
|
|
|
11
11
|
RED.nodes.registerType("knxUltimateMatterControllerDevice", {
|
|
12
|
-
category: "
|
|
12
|
+
category: "deprecated",
|
|
13
13
|
color: "#8FB1FA",
|
|
14
14
|
defaults: {
|
|
15
15
|
//buttonState: {value: true},
|
|
@@ -2834,4 +2834,4 @@ _Basic Matter effects_
|
|
|
2834
2834
|
The Dimming function works in **KNX mode `start` and`stop` ** . To start dimming, send only one "start" KNX telegram. To stop dimming, send a "stop" KNX telegram. Please**remember that** , when you set your wall swiches properties.
|
|
2835
2835
|
|
|
2836
2836
|
<br/>
|
|
2837
|
-
</script>
|
|
2837
|
+
</script>
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
<script type="text/html" data-help-name="knxUltimateAI">
|
|
2
|
+
<p><b>Dies ist ein ausgeblendeter Legacy-Knoten, der nur für vorhandene Flows erhalten bleibt.</b></p>
|
|
3
|
+
<p>Für neue Installationen verwenden Sie den eigenständigen Knoten <b>Cerebrum Ultimate</b> aus <code>node-red-contrib-cerebrum-ultimate</code>. Er ersetzt diesen Knoten und verwendet KNX Ultimate als optionale kompatible Integration.</p>
|
|
4
|
+
<p><a href="https://github.com/Supergiovane/node-red-contrib-cerebrum-ultimate#readme" target="_blank">Dokumentation zu Cerebrum Ultimate öffnen</a>.</p>
|
|
5
|
+
</script>
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
{
|
|
2
|
+
"knxUltimateAI": {
|
|
3
|
+
"title": "Legacy-KI-Knoten — Cerebrum Ultimate verwenden",
|
|
4
|
+
"sections": {
|
|
5
|
+
"groupAssistant": "KI-Assistent",
|
|
6
|
+
"groupChatHome": "Cerebrum (BETA)",
|
|
7
|
+
"setupDoctor": "Setup Doctor",
|
|
8
|
+
"webIntelligence": "Web-Intelligenz",
|
|
9
|
+
"detectedAdapters": "Erkannte und im Chat verwendete kompatible Nodes",
|
|
10
|
+
"chatContextOverview": "Übersicht des Chat-Kontexts",
|
|
11
|
+
"chatLearning": "KI-Chat-Lernen",
|
|
12
|
+
"cerebrumMemory": "Cerebrum-Speicher",
|
|
13
|
+
"quickSetup": "Assistent einrichten",
|
|
14
|
+
"etsAccess": "Zugriff auf ETS-Objekte",
|
|
15
|
+
"llmConnection": "KI-Assistent-Verbindung",
|
|
16
|
+
"chatAdapter": "Chat-Pins für Ein- und Ausgang",
|
|
17
|
+
"homeIntelligence": "KI-Erziehung & Gedächtnis",
|
|
18
|
+
"advanced": "Anbieter & Grenzen"
|
|
19
|
+
},
|
|
20
|
+
"properties": {
|
|
21
|
+
"server": "Gateway",
|
|
22
|
+
"name": "Name",
|
|
23
|
+
"topic": "Topic",
|
|
24
|
+
"llmEnabled": "Enable LLM assistant",
|
|
25
|
+
"llmProvider": "Provider",
|
|
26
|
+
"llmBaseUrl": "Endpoint URL",
|
|
27
|
+
"llmApiKey": "API key",
|
|
28
|
+
"llmModel": "Model",
|
|
29
|
+
"llmReasoningEffort": "Denkaufwand",
|
|
30
|
+
"llmLocalContextTokens": "Lokales Kontextfenster",
|
|
31
|
+
"llmSystemPrompt": "System prompt",
|
|
32
|
+
"llmIncludeRaw": "Include raw payload hex",
|
|
33
|
+
"llmAllowKnxCommands": "KI darf KNX-Zustände lesen und Aktoren steuern",
|
|
34
|
+
"llmRequireCommandConfirmation": "Vor dem Senden von KNX-Befehlen bestätigen lassen",
|
|
35
|
+
"webAccessEnabled": "Der KI die Nutzung des Webs erlauben",
|
|
36
|
+
"webMaxCallsPerHour": "Maximale Web-Aufrufe pro Stunde",
|
|
37
|
+
"chatAdapterPreset": "Adapter für Ein-/Ausgangsnachrichten",
|
|
38
|
+
"chatInputCode": "Eingangszuordnung (Chat → Cerebrum Ultimate)",
|
|
39
|
+
"chatOutputCode": "Ausgangszuordnung (Cerebrum Ultimate → Chat)",
|
|
40
|
+
"aiEducation": "KI-Erziehung (vom Benutzer verwaltet)"
|
|
41
|
+
},
|
|
42
|
+
"outputs": {
|
|
43
|
+
"summary": "Zusammenfassung/Statistik",
|
|
44
|
+
"anomalies": "Anomalien",
|
|
45
|
+
"assistant": "KI-Assistent",
|
|
46
|
+
"knxCommands": "KNX-Operationen",
|
|
47
|
+
"ttsUltimate": "TTS-Ultimate-Ansagen"
|
|
48
|
+
},
|
|
49
|
+
"selectlists": {
|
|
50
|
+
"llmProvider": {
|
|
51
|
+
"openai_compat": "OpenAI / OpenAI-kompatibel",
|
|
52
|
+
"anthropic": "Anthropic (Claude)",
|
|
53
|
+
"ollama": "Ollama (lokal)",
|
|
54
|
+
"lmstudio": "Bionic LM Studio"
|
|
55
|
+
},
|
|
56
|
+
"reasoningEffort": {
|
|
57
|
+
"default": "Automatisch (Modell-/Anbieterstandard)",
|
|
58
|
+
"none": "Keiner",
|
|
59
|
+
"minimal": "Minimal",
|
|
60
|
+
"low": "Niedrig",
|
|
61
|
+
"medium": "Mittel",
|
|
62
|
+
"high": "Hoch",
|
|
63
|
+
"xhigh": "Sehr hoch",
|
|
64
|
+
"max": "Maximal"
|
|
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
|
+
},
|
|
76
|
+
"chatAdapter": {
|
|
77
|
+
"none": "Kein Adapter"
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
"placeholder": {
|
|
81
|
+
"llmBaseUrl": "https://api.openai.com/v1/chat/completions (or your compatible endpoint)",
|
|
82
|
+
"llmApiKey": "Paste API key (starts with sk-)",
|
|
83
|
+
"llmModel": "e.g. gpt-4o-mini",
|
|
84
|
+
"llmSystemPrompt": "Optional. Leave empty for default.",
|
|
85
|
+
"aiEducation": "Beispiel: Antworte knapp. Benachrichtige meinen letzten Chat, wenn ein Fenster 30 Minuten offen bleibt; zwischen 23:00 und 07:00 keine Meldungen."
|
|
86
|
+
},
|
|
87
|
+
"messages": {
|
|
88
|
+
"setupDoctorLoading": "Diese Installation wird analysiert…",
|
|
89
|
+
"setupDoctorUnavailable": "Setup Doctor ist vorübergehend nicht verfügbar.",
|
|
90
|
+
"setupDoctorPromptsTitle": "Installation ausprobieren",
|
|
91
|
+
"setupDoctorPromptsHint": "Jeder Vorschlag öffnet den Web-Assistenten mit einer personalisierten, sicheren Anfrage. Nichts wird automatisch ausgeführt.",
|
|
92
|
+
"setupDoctorDeployHint": "Setup Doctor liest den zuletzt bereitgestellten Flow. Änderungen bereitstellen und danach erneut prüfen.",
|
|
93
|
+
"setupDoctorPass": "OK",
|
|
94
|
+
"setupDoctorWarn": "Prüfen",
|
|
95
|
+
"setupDoctorFail": "Beheben",
|
|
96
|
+
"setupDoctorInfo": "Optional",
|
|
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.",
|
|
99
|
+
"lmStudioContextAvailable": "Maximaler Modellkontext",
|
|
100
|
+
"lmStudioContextLoading": "Aktiver Modellkontext wird geprüft",
|
|
101
|
+
"lmStudioContextInactive": "Modell inaktiv; bei der ersten Anfrage werden die Bionic-Standardwerte verwendet",
|
|
102
|
+
"lmStudioContextConfigured": "Aktiver Modellkontext",
|
|
103
|
+
"lmStudioContextFailed": "Der Modellkontext konnte nicht konfiguriert werden",
|
|
104
|
+
"lmStudioContextCurrentlyLoaded": "derzeit geladen",
|
|
105
|
+
"etsAccessHint": "Wähle die für Cerebrum Ultimate 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
|
+
"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 Cerebrum Ultimate 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.",
|
|
116
|
+
"ollamaNotSupported": "Ollama local mode: API key not required. Default endpoint is http://localhost:11434/api/chat.",
|
|
117
|
+
"ollamaNoModels": "No local Ollama model found. Install one or pick one from the library.",
|
|
118
|
+
"installingOllamaModel": "Starting Ollama and installing model…",
|
|
119
|
+
"installedOllamaModel": "Ollama model installed",
|
|
120
|
+
"installOllamaModelFailed": "Failed to install Ollama model",
|
|
121
|
+
"ollamaInstallSteps": "1) Open the model library and copy the model name (for example llama3.1). 2) Put the name in the Model field and click Install it.",
|
|
122
|
+
"ollamaStartedAuto": "Ollama server started automatically.",
|
|
123
|
+
"detectedAdaptersLoading": "Installierte kompatible Nodes werden erkannt…",
|
|
124
|
+
"detectedAdaptersNone": "Kein kompatibler Node erkannt.",
|
|
125
|
+
"detectedAdaptersUnavailable": "Die Erkennung kompatibler Nodes ist vorübergehend nicht verfügbar.",
|
|
126
|
+
"detectedAdapterDetected": "Erkannt",
|
|
127
|
+
"detectedAdapterControllers": "Controller",
|
|
128
|
+
"detectedAdapterCameras": "Kameras",
|
|
129
|
+
"detectedAdapterNodes": "Nodes",
|
|
130
|
+
"chatContextLoading": "Zusammenfassung des Chat-Kontexts wird geladen…",
|
|
131
|
+
"chatContextUnavailable": "Die Zusammenfassung des Chat-Kontexts ist vorübergehend nicht verfügbar.",
|
|
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.",
|
|
134
|
+
"chatContextIntro": "Der Chat erhält diese Quellen automatisch. Die folgenden Pfade werden von dieser Node-RED-Installation tatsächlich verwendet.",
|
|
135
|
+
"chatContextLimitLabel": "Maximaler operativer Kontext",
|
|
136
|
+
"chatContextProviderManaged": "vom ausgewählten Anbieter/Modell verwaltet",
|
|
137
|
+
"chatContextTokens": "Token",
|
|
138
|
+
"chatContextLastPromptLabel": "Tatsächliche Größe des letzten Chat-Prompts",
|
|
139
|
+
"chatContextLastPromptUnavailable": "bis zur ersten Chat-Anfrage nicht verfügbar",
|
|
140
|
+
"chatContextExactInputTokens": "vom Anbieter gemessene Eingabe-Token",
|
|
141
|
+
"chatContextEstimatedInputTokens": "geschätzte Eingabe-Token",
|
|
142
|
+
"chatContextImages": "Bilder",
|
|
143
|
+
"chatContextSourcesTitle": "Enthaltene Quellen",
|
|
144
|
+
"chatContextFilesTitle": "Dauerhafte Kontextdateien",
|
|
145
|
+
"chatContextDirectoriesTitle": "KNX-Telegrammarchiv",
|
|
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.",
|
|
149
|
+
"chatContextSourceMemoryEducation": "Sitzungskontext, KI-Erziehung, begrenztes Hausgedächtnis und aktive Pläne.",
|
|
150
|
+
"chatContextSourceCameras": "Erkannte Kameras und ihre verfügbaren Funktionen.",
|
|
151
|
+
"chatContextSourceBadge": "Quelle",
|
|
152
|
+
"chatContextFileChatContext": "Dauerhafte Gesprächsverläufe, Anweisungen und Regeln für Kamerabenachrichtigungen.",
|
|
153
|
+
"chatContextFileHomeMemory": "Nur begrenztes gelerntes Hausgedächtnis; die KI-Erziehung bleibt in der Node-Eigenschaft.",
|
|
154
|
+
"chatContextFileSchedules": "Verbindlicher dauerhafter Laufzeitstatus der Pläne und Erinnerungen dieses Nodes.",
|
|
155
|
+
"chatContextFileSchedulesReadable": "Erzeugte menschenlesbare Ansicht der Pläne und Erinnerungen dieses Nodes.",
|
|
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.",
|
|
158
|
+
"chatContextFileBadge": "Datei",
|
|
159
|
+
"chatContextDirectoryRoot": "Stammverzeichnis des Telegrammarchivs",
|
|
160
|
+
"chatContextDirectoryNode": "Telegrammarchiv dieses Nodes",
|
|
161
|
+
"chatContextDirectoryBadge": "KNX",
|
|
162
|
+
"chatContextDirectoryAdapterRoot": "Stammverzeichnis des Adapterereignisarchivs",
|
|
163
|
+
"chatContextDirectoryAdapterNode": "Adapterereignisarchiv dieses Nodes",
|
|
164
|
+
"chatContextDirectoryAdapterBadge": "Adapter",
|
|
165
|
+
"chatContextTelegramPattern": "Tagesdateien",
|
|
166
|
+
"chatAdapterIntro": "Wählen Sie eine Vorlage, um den Code für Ein- und Ausgang einzufügen. Die Liste wird aus der mitgelieferten Chat-Adapter-Datei geladen; der erzeugte Code bleibt bearbeitbar.",
|
|
167
|
+
"chatAdapterCodeHelp": "Zuordnungen laufen synchron. Geben Sie msg zurück, um fortzufahren, oder keinen Wert, um die Nachricht zu verwerfen. Fehler werden abgefangen und gemeldet, ohne Node-RED anzuhalten.",
|
|
168
|
+
"homeIntelligenceIntro": "Der Node erstellt ein mehrsprachiges semantisches ETS-Modell. Proaktive Benachrichtigungen werden nur berücksichtigt, wenn die KI-Erziehung sie ausdrücklich verlangt; der Node sendet niemals selbstständig einen KNX-Befehl.",
|
|
169
|
+
"aiEducationHelp": "Nur der Benutzer kann diese Node-Eigenschaft bearbeiten. Verwenden Sie sie für dauerhafte Vorgaben und Regeln für proaktive Benachrichtigungen, einschließlich Bedingungen, Dauer, Ruhezeiten und Wiederholung. Das Modell liest sie als verbindliche Vorgabe, schreibt sie aber niemals. Im Chat angeforderte Fakten und Präferenzen werden im gelernten Chat-Gedächtnis gespeichert; einmalige oder wiederkehrende Pläne, Erinnerungen, Überwachungen und zukünftige Befehle speichert der semantische Scheduler. Es sind weder Auslösephrasen noch Intent-Routing erforderlich. Maximal 16.000 Zeichen."
|
|
170
|
+
},
|
|
171
|
+
"sidebar": {
|
|
172
|
+
"ui": {
|
|
173
|
+
"refreshNodeList": "Knotenliste aktualisieren",
|
|
174
|
+
"refreshSummary": "Zusammenfassung aktualisieren",
|
|
175
|
+
"auto": "Auto",
|
|
176
|
+
"sections": {
|
|
177
|
+
"summary": "Zusammenfassung",
|
|
178
|
+
"anomalies": "Anomalien",
|
|
179
|
+
"ask": "Fragen"
|
|
180
|
+
},
|
|
181
|
+
"empty": {
|
|
182
|
+
"noNodes": "Keine Cerebrum Ultimate-Knoten gefunden.",
|
|
183
|
+
"noAnomalies": "Keine Anomalien."
|
|
184
|
+
},
|
|
185
|
+
"chat": {
|
|
186
|
+
"placeholder": "Stelle eine Frage zum KNX-Verkehr…",
|
|
187
|
+
"send": "Senden",
|
|
188
|
+
"pending": "Ich denke nach…",
|
|
189
|
+
"llmDisabled": "LLM in der Knoten-Konfiguration deaktiviert",
|
|
190
|
+
"emptyAnswer": "(leere Antwort)"
|
|
191
|
+
},
|
|
192
|
+
"status": {
|
|
193
|
+
"ready": "Bereit",
|
|
194
|
+
"loadingNodes": "Lade Knoten…",
|
|
195
|
+
"loading": "Laden…",
|
|
196
|
+
"asking": "Frage…"
|
|
197
|
+
},
|
|
198
|
+
"errors": {
|
|
199
|
+
"loadNodes": "Knoten konnten nicht geladen werden",
|
|
200
|
+
"loadState": "Status konnte nicht geladen werden",
|
|
201
|
+
"askFailed": "Anfrage fehlgeschlagen"
|
|
202
|
+
}
|
|
203
|
+
},
|
|
204
|
+
"summary": {
|
|
205
|
+
"noData": "Keine Daten verfügbar.",
|
|
206
|
+
"header": {
|
|
207
|
+
"gateway": "Gateway: {{gatewayName}}",
|
|
208
|
+
"updated": "Aktualisiert: {{at}}"
|
|
209
|
+
},
|
|
210
|
+
"analysisWindowLine": "Analysefenster: {{seconds}}s",
|
|
211
|
+
"statsLine": "Telegramme: {{telegrams}} · Rate: {{rate}}/s · Echoed: {{echoed}} · Unbekannte DPT: {{unknownDpt}}",
|
|
212
|
+
"topGAsTitle": "Top-Gruppenadressen:",
|
|
213
|
+
"eventsTitle": "Ereignisse:",
|
|
214
|
+
"patternsTitle": "Muster (wiederkehrende Sequenzen):",
|
|
215
|
+
"patternItem": "{{from}} → {{to}} ({{count}} mal innerhalb von {{withinMs}}ms)"
|
|
216
|
+
}
|
|
217
|
+
},
|
|
218
|
+
"buttons": {
|
|
219
|
+
"refreshSetupDoctor": "Erneut prüfen",
|
|
220
|
+
"installOllamaModel": "2) Install it",
|
|
221
|
+
"ollamaLibrary": "Model library",
|
|
222
|
+
"downloadOllamaModel": "1) Download model",
|
|
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"
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
@@ -10,6 +10,14 @@
|
|
|
10
10
|
"migration_success": "Der Download der Flow-Sicherung wurde gestartet. {{count}} Knoten in KNX Utility konvertiert. Prüfen Sie das Ergebnis und klicken Sie auf Deploy, um es anzuwenden. Mit Rückgängig können Sie die Konvertierung aufheben.",
|
|
11
11
|
"migration_backup_failed": "Die Flow-Sicherung konnte nicht gestartet werden. Es wurden keine Knoten konvertiert:",
|
|
12
12
|
"migration_failed": "Konvertierung in KNX Utility fehlgeschlagen:",
|
|
13
|
+
"startup_migration": {
|
|
14
|
+
"title": "Veraltete KNX Ultimate-Knoten",
|
|
15
|
+
"message": "Veraltete Knoten in deinen Flows und Subflows gefunden: HUE: {{hue}}; KNX-Utility: {{knx}}. Diese Knoten funktionieren weiterhin, sind aber in der Palette ausgeblendet. Migriere sie zu HUE Controller und KNX Utility. Bei jeder Migration wird eine Sicherung der Flows heruntergeladen; prüfe das Ergebnis vor dem Deploy.",
|
|
16
|
+
"hue_button": "HUE migrieren ({{count}})",
|
|
17
|
+
"knx_button": "KNX migrieren ({{count}})",
|
|
18
|
+
"later": "Später",
|
|
19
|
+
"unavailable": "Das Migrationstool ist nicht verfügbar. Starte Node-RED neu und lade anschließend den Editor neu."
|
|
20
|
+
},
|
|
13
21
|
"locale": "de",
|
|
14
22
|
"function": "Funktion",
|
|
15
23
|
"gateway": "KNX-Gateway",
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
<script type="text/html" data-help-name="knxUltimateAI">
|
|
2
|
+
<p><b>This is a hidden legacy node retained only for existing flows.</b></p>
|
|
3
|
+
<p>For new installations use the standalone <b>Cerebrum Ultimate</b> node from <code>node-red-contrib-cerebrum-ultimate</code>. It replaces this node and uses KNX Ultimate as an optional compatible integration.</p>
|
|
4
|
+
<p><a href="https://github.com/Supergiovane/node-red-contrib-cerebrum-ultimate#readme" target="_blank">Open the Cerebrum Ultimate documentation</a>.</p>
|
|
5
|
+
</script>
|