node-red-contrib-knx-ultimate 6.3.15 → 6.3.17
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 +8 -0
- package/nodes/knxUltimateAI.html +99 -0
- package/nodes/knxUltimateAI.js +736 -27
- package/nodes/locales/de/knxUltimateAI.html +5 -0
- package/nodes/locales/de/knxUltimateAI.json +7 -0
- package/nodes/locales/en/knxUltimateAI.html +5 -0
- package/nodes/locales/en/knxUltimateAI.json +7 -0
- package/nodes/locales/es/knxUltimateAI.html +5 -0
- package/nodes/locales/es/knxUltimateAI.json +7 -0
- package/nodes/locales/fr/knxUltimateAI.html +5 -0
- package/nodes/locales/fr/knxUltimateAI.json +7 -0
- package/nodes/locales/it/knxUltimateAI.html +5 -0
- package/nodes/locales/it/knxUltimateAI.json +7 -0
- package/nodes/locales/zh-CN/knxUltimateAI.html +5 -0
- package/nodes/locales/zh-CN/knxUltimateAI.json +7 -0
- package/nodes/utils/knxAiCamera.js +302 -0
- package/nodes/utils/knxAiChatContext.js +85 -5
- package/package.json +1 -1
- package/resources/KNXAIChatAdapterMappings.js +64 -1
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,14 @@
|
|
|
6
6
|
|
|
7
7
|
# CHANGELOG
|
|
8
8
|
|
|
9
|
+
**Version 6.3.17** - August 2026<br/>
|
|
10
|
+
|
|
11
|
+
- **KNX AI — unified Assistant context for chat channels**: Telegram, RedBot and custom chat adapters now receive the same complete KNX analysis context as the web Assistant, including the full relevant traffic selection, summaries, areas, learned home memory, Node-RED flow context, Function-node source and documentation snippets enabled by the node configuration. The chat-specific ETS catalog, camera capabilities, persistent conversation context, command validation and confirmation safeguards remain layered on top.<br/>
|
|
12
|
+
|
|
13
|
+
**Version 6.3.16** - August 2026<br/>
|
|
14
|
+
|
|
15
|
+
- **KNX AI — automatically detected camera adapters**: installed camera suites can now register vendor-neutral camera catalogs, connectivity state, snapshots and smart events directly in the KNX AI chat runtime, without selectors or camera-node wiring. The “Conversations & home” editor section shows every detected adapter together with its registered controllers and cameras. `node-red-contrib-unifi-ultimate` is the first provider: users can request or visually analyze a current Protect snapshot and create persistent Telegram/RedBot notifications for motion, smart line crossings and intrusion/loiter zones. Generic smart-detection rules now correctly distinguish classified people, animals, vehicles, faces, license plates and packages from unclassified motion, and match classifications across Protect smart zones, lines and loiter zones. Chat snapshots no longer force full-HD; the provider chooses a supported quality and retries only transient failures at standard quality. An offline camera is identified explicitly before Chat AI proposes an unavailable snapshot. Camera rules share `knxai-chat-context.md` and survive Node-RED restarts; Telegram adapters emit snapshots as native photos. Existing `node-red-contrib-telegrambot` presets saved before image support are upgraded at runtime for snapshot replies, including explicit JPEG filename and MIME metadata. The same registry contract is ready for packages such as `hikvision-ultimate`.<br/>
|
|
16
|
+
|
|
9
17
|
**Version 6.3.15** - August 2026<br/>
|
|
10
18
|
|
|
11
19
|
- **KNX AI — persistent shared CHAT context**: every Ask/chat session now reloads its bounded recent conversation and explicit long-term user instructions after Node-RED restarts. Requests such as “remember not to use the term unknown” are retained per session in the atomically written shared file `knxultimatestorage/knxai/memory/knxai-chat-context.md`, independently from home intelligence memory and even when KNX actuator control is disabled. All KNX AI nodes using the same storage share one live context; the file keeps up to 8 recent turns and 20 durable instructions per session, 50 sessions total, and a 512 KB hard limit. `clear_chat` removes only the selected shared session and `reset` clears the shared context.<br/>
|
package/nodes/knxUltimateAI.html
CHANGED
|
@@ -99,6 +99,53 @@
|
|
|
99
99
|
display: block;
|
|
100
100
|
}
|
|
101
101
|
|
|
102
|
+
#knx-ai-detected-adapters-panel {
|
|
103
|
+
margin: 0 0 18px;
|
|
104
|
+
padding: 12px 14px;
|
|
105
|
+
border: 1px solid var(--red-ui-form-input-border-color, #ccc);
|
|
106
|
+
border-radius: 4px;
|
|
107
|
+
background: var(--red-ui-secondary-background, #f7f7f7);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
#knx-ai-detected-adapters-panel>h4 {
|
|
111
|
+
margin: 0 0 9px;
|
|
112
|
+
font-size: 14px;
|
|
113
|
+
font-weight: 600;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.knx-ai-detected-adapter {
|
|
117
|
+
display: flex;
|
|
118
|
+
align-items: center;
|
|
119
|
+
gap: 8px;
|
|
120
|
+
padding: 7px 0;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.knx-ai-detected-adapter+.knx-ai-detected-adapter {
|
|
124
|
+
border-top: 1px solid var(--red-ui-form-input-border-color, #ddd);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.knx-ai-detected-adapter-main {
|
|
128
|
+
flex: 1 1 auto;
|
|
129
|
+
min-width: 0;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.knx-ai-detected-adapter-package,
|
|
133
|
+
.knx-ai-detected-adapter-counts,
|
|
134
|
+
#knx-ai-detected-adapters-status {
|
|
135
|
+
color: var(--red-ui-secondary-text-color, #777);
|
|
136
|
+
font-size: 12px;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.knx-ai-detected-adapter-badge {
|
|
140
|
+
flex: 0 0 auto;
|
|
141
|
+
padding: 2px 7px;
|
|
142
|
+
border-radius: 10px;
|
|
143
|
+
color: #256029;
|
|
144
|
+
background: #dff0d8;
|
|
145
|
+
font-size: 11px;
|
|
146
|
+
font-weight: 600;
|
|
147
|
+
}
|
|
148
|
+
|
|
102
149
|
@media (max-width: 900px) {
|
|
103
150
|
#knx-ai-ollama-install-row>label {
|
|
104
151
|
width: 100% !important;
|
|
@@ -407,6 +454,53 @@
|
|
|
407
454
|
};
|
|
408
455
|
configureChatAdapterPicker.call(node);
|
|
409
456
|
|
|
457
|
+
const renderDetectedAdapters = (adapters) => {
|
|
458
|
+
const $list = $("#knx-ai-detected-adapters-list");
|
|
459
|
+
const $status = $("#knx-ai-detected-adapters-status");
|
|
460
|
+
if (!$list.length) return;
|
|
461
|
+
$list.empty();
|
|
462
|
+
const entries = Array.isArray(adapters) ? adapters : [];
|
|
463
|
+
if (!entries.length) {
|
|
464
|
+
$status.text(t("knxUltimateAI.messages.detectedAdaptersNone", "No automatic adapter detected.")).show();
|
|
465
|
+
return;
|
|
466
|
+
}
|
|
467
|
+
$status.hide();
|
|
468
|
+
entries.forEach(function (adapter) {
|
|
469
|
+
if (!adapter || !adapter.id) return;
|
|
470
|
+
const providerCount = Number(adapter.providerCount) || 0;
|
|
471
|
+
const cameraCount = Number(adapter.cameraCount) || 0;
|
|
472
|
+
const $row = $("<div></div>").addClass("knx-ai-detected-adapter");
|
|
473
|
+
const $main = $("<div></div>").addClass("knx-ai-detected-adapter-main");
|
|
474
|
+
$("<div></div>").text(adapter.title || adapter.id).appendTo($main);
|
|
475
|
+
if (adapter.packageName) {
|
|
476
|
+
$("<div></div>").addClass("knx-ai-detected-adapter-package").text(adapter.packageName).appendTo($main);
|
|
477
|
+
}
|
|
478
|
+
$("<div></div>")
|
|
479
|
+
.addClass("knx-ai-detected-adapter-counts")
|
|
480
|
+
.text(t("knxUltimateAI.messages.detectedAdapterControllers", "Controllers") + ": " + providerCount + " · " + t("knxUltimateAI.messages.detectedAdapterCameras", "Cameras") + ": " + cameraCount)
|
|
481
|
+
.appendTo($main);
|
|
482
|
+
$main.appendTo($row);
|
|
483
|
+
$("<span></span>")
|
|
484
|
+
.addClass("knx-ai-detected-adapter-badge")
|
|
485
|
+
.text(t("knxUltimateAI.messages.detectedAdapterDetected", "Detected"))
|
|
486
|
+
.appendTo($row);
|
|
487
|
+
$row.appendTo($list);
|
|
488
|
+
});
|
|
489
|
+
};
|
|
490
|
+
$.ajax({
|
|
491
|
+
url: "knxUltimateAI/adapters",
|
|
492
|
+
type: "GET",
|
|
493
|
+
data: nodeId ? { nodeId: nodeId } : {}
|
|
494
|
+
})
|
|
495
|
+
.done(function (data) {
|
|
496
|
+
renderDetectedAdapters(data && data.adapters);
|
|
497
|
+
})
|
|
498
|
+
.fail(function () {
|
|
499
|
+
$("#knx-ai-detected-adapters-status")
|
|
500
|
+
.text(t("knxUltimateAI.messages.detectedAdaptersUnavailable", "Automatic adapter detection is temporarily unavailable."))
|
|
501
|
+
.show();
|
|
502
|
+
});
|
|
503
|
+
|
|
410
504
|
const updateProactiveVisibility = () => {
|
|
411
505
|
const enabled = $("#node-input-proactiveEnabled").is(":checked");
|
|
412
506
|
$("#knx-ai-proactive-settings").toggle(enabled);
|
|
@@ -678,6 +772,11 @@
|
|
|
678
772
|
|
|
679
773
|
<h3><i class="fa fa-comments"></i> <span data-i18n="knxUltimateAI.sections.groupChatHome"></span></h3>
|
|
680
774
|
<div>
|
|
775
|
+
<div id="knx-ai-detected-adapters-panel">
|
|
776
|
+
<h4><i class="fa fa-puzzle-piece"></i> <span data-i18n="knxUltimateAI.sections.detectedAdapters"></span></h4>
|
|
777
|
+
<div id="knx-ai-detected-adapters-status" data-i18n="knxUltimateAI.messages.detectedAdaptersLoading"></div>
|
|
778
|
+
<div id="knx-ai-detected-adapters-list"></div>
|
|
779
|
+
</div>
|
|
681
780
|
<div class="knx-ai-accordion-subsection">
|
|
682
781
|
<h4><i class="fa fa-plug"></i> <span data-i18n="knxUltimateAI.sections.chatAdapter"></span></h4>
|
|
683
782
|
<div class="knx-ai-accordion-mount" id="knx-ai-mount-chat-adapter"></div>
|