node-red-contrib-knx-ultimate 6.3.32 → 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 CHANGED
@@ -6,6 +6,15 @@
6
6
 
7
7
  # CHANGELOG
8
8
 
9
+ **Version 6.4.1** - September 2026<br/>
10
+
11
+ - **KNX AI — safe Cerebrum startup delivery**: corrected the RedBot Telegram envelope used by startup and other proactive messages after a Node-RED restart. Its synthetic chat context now fulfils RedBot's synchronous context contract instead of returning `undefined`, preventing `chat-platform` from raising an uncaught `sourceCode` error and terminating Node-RED. Saved RedBot adapter code is hardened at runtime as well. Schedule persistence now passes the generated Markdown filename to the atomic writer under the correct `filePath` key, removing the accompanying undefined-path warning.<br/>
12
+ - **KNX AI — Cerebrum (BETA)**: renamed the Web Assistant area to Cerebrum and introduced a passive home-automation intelligence layer that studies KNX telegrams, useful Node-RED flow events and the registered HUE, Matter and Home Assistant adapters. Cerebrum maintains bounded current-state and observation context locally, learns only repeated patterns spanning distinct days and asks the occupant for confirmation or correction through the Assistant output before a habit can become predictive. Confirmed habits remain subject to the exact ETS/DPT permissions: group addresses marked read-only are never written.<br/>
13
+ - **Cerebrum — Home Assistant adapter**: added the `Cerebrum Home Assistant` node and the shared runtime registry. When Node-RED is running as a Home Assistant add-on, Setup Doctor detects whether the required `ha-api` round trip is present and tells the user to add it when missing. Entity states, events and service capabilities are exposed to Cerebrum through bounded, vendor-neutral records without retaining raw messages, secrets or binary payloads.<br/>
14
+ - **Cerebrum — supervised startup**: every KNX AI node now asks its configured model to generate a short startup reassurance on the Assistant output. The message carries `msg.boot = true` for simple flow filtering and falls back to a localized deterministic notice if the provider is unavailable.<br/>
15
+ - **KNX AI Web — Cerebrum workspace and readable memory**: reorganized the Web navigation into Cerebrum submenus, removed the separate KNX AI node selector and bound the workspace directly to the node that opened it. Cerebrum Memory now offers an editable authoritative JSON view and a read-only simplified view; AI Chat Learning offers the equivalent editable native `.knxctx` view and localized simplified view. Copy follows the visible representation, while save, restore, download and concurrency checks continue to protect the complete authoritative files.<br/>
16
+ - **Cerebrum — complete import/export**: the Settings page now contains only import/export and its versioned backup includes AI configuration, chat learning, home memory, schedules and the readable schedules companion file, with validation and rollback-safe restoration.<br/>
17
+
9
18
  **Version 6.3.32** - August 2026<br/>
10
19
 
11
20
  - **KNX AI**: AI-first chat with complete cloud ETS context, selectable local windows and guided retrieval; selected ETS access is now the sole read/write authority, with no neutral role.<br/>
@@ -873,7 +873,7 @@
873
873
  .text(String(prompt.text))
874
874
  .on("click", function (evt) {
875
875
  evt.preventDefault();
876
- openKnxAiWebPage("assistant", String(prompt.text));
876
+ openKnxAiWebPage("cerebrum", String(prompt.text));
877
877
  })
878
878
  .appendTo($prompts);
879
879
  });
@@ -1004,7 +1004,7 @@
1004
1004
  homeMemory: t("knxUltimateAI.messages.chatContextFileHomeMemory", "Bounded learned home memory only; AI Education remains in the node property."),
1005
1005
  schedules: t("knxUltimateAI.messages.chatContextFileSchedules", "Authoritative structured plans and reminders for this node."),
1006
1006
  schedulesReadable: t("knxUltimateAI.messages.chatContextFileSchedulesReadable", "Human-readable plans and reminders generated from the scheduler state."),
1007
- assistantConfig: t("knxUltimateAI.messages.chatContextFileAssistantConfig", "Persistent web Assistant configuration and semantic areas for this node."),
1007
+ assistantConfig: t("knxUltimateAI.messages.chatContextFileAssistantConfig", "Persistent Cerebrum configuration and semantic areas for this node."),
1008
1008
  lastChatPrompt: t("knxUltimateAI.messages.chatContextFileLastChatPrompt", "Temporary local copy of the latest system and user messages sent to the chat model; overwritten on every chat request.")
1009
1009
  };
1010
1010
  (Array.isArray(overview.files) ? overview.files : []).forEach(function (item) {
@@ -1082,10 +1082,14 @@
1082
1082
  const params = new URLSearchParams();
1083
1083
  if (nodeId) params.set("nodeId", nodeId);
1084
1084
  if (view === "chat-learning") {
1085
- params.set("tab", "settings");
1086
- params.set("settingsTab", "learning");
1087
- } else if (view === "assistant") {
1088
- params.set("tab", "assistant");
1085
+ params.set("tab", "cerebrum");
1086
+ params.set("cerebrumTab", "learning");
1087
+ } else if (view === "cerebrum-memory") {
1088
+ params.set("tab", "cerebrum");
1089
+ params.set("cerebrumTab", "memory");
1090
+ } else if (view === "cerebrum") {
1091
+ params.set("tab", "cerebrum");
1092
+ params.set("cerebrumTab", "conversation");
1089
1093
  if (prompt) params.set("prompt", String(prompt));
1090
1094
  }
1091
1095
  const accessToken = resolveAccessToken();
@@ -1105,6 +1109,11 @@
1105
1109
  openKnxAiWebPage("chat-learning");
1106
1110
  });
1107
1111
 
1112
+ $("#knx-ai-open-cerebrum-memory").on("click", function (evt) {
1113
+ evt.preventDefault();
1114
+ openKnxAiWebPage("cerebrum-memory");
1115
+ });
1116
+
1108
1117
  const setRefreshModelsBusy = (busy) => {
1109
1118
  const $button = $("#knx-ai-refreshModels");
1110
1119
  $button.prop("disabled", !!busy);
@@ -1590,6 +1599,11 @@
1590
1599
  <button type="button" class="red-ui-button" id="knx-ai-open-chat-learning">
1591
1600
  <i class="fa fa-external-link"></i> <span data-i18n="knxUltimateAI.buttons.openChatLearning"></span>
1592
1601
  </button>
1602
+ <h4 style="margin-top:14px;"><i class="fa fa-database"></i> <span data-i18n="knxUltimateAI.sections.cerebrumMemory"></span></h4>
1603
+ <p class="knx-ai-chat-learning-link-copy" data-i18n="knxUltimateAI.messages.cerebrumMemoryOpenHint"></p>
1604
+ <button type="button" class="red-ui-button" id="knx-ai-open-cerebrum-memory">
1605
+ <i class="fa fa-external-link"></i> <span data-i18n="knxUltimateAI.buttons.openCerebrumMemory"></span>
1606
+ </button>
1593
1607
  </div>
1594
1608
  <div id="knx-ai-detected-adapters-panel">
1595
1609
  <h4><i class="fa fa-puzzle-piece"></i> <span data-i18n="knxUltimateAI.sections.detectedAdapters"></span></h4>