node-red-contrib-knx-ultimate 4.3.19 → 4.3.21

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,11 +6,21 @@
6
6
 
7
7
  # CHANGELOG
8
8
 
9
+ **Version 4.3.21** - June 2026<br/>
10
+
11
+ - KNXUltimate engine: updated to 5.5.9.<br/>
12
+
13
+ **Version 4.3.20** - June 2026<br/>
14
+
15
+ - KNX AI: new **Flow Builder** (BETA) tab in the AI web page — describe an automation in plain language and the AI generates a ready-to-import **Node-RED flow** (JSON) using KNX Ultimate nodes, the Philips Hue nodes and native Function/logic nodes, wired to your imported group addresses. Copy the JSON and paste it via Node-RED _Menu > Import_. Generated node ids, wiring and config-node references are validated and rewired server-side before output.<br/>
16
+ - KNX AI: added **Anthropic (Claude)** as an LLM provider alongside OpenAI-compatible and Ollama. Uses Claude's native Messages API; model and API key are configurable from the node (default `claude-opus-4-8`), with model auto-discovery.<br/>
17
+ - KNX AI: Flow Builder UI is fully localized (EN/IT/DE/FR/ES) and laid out side-by-side (prompt and generated JSON); minor sidebar fix so long menu labels are no longer truncated.<br/>
18
+
9
19
  **Version 4.3.19** - June 2026<br/>
10
20
 
11
21
  - Docs: reworked the multilingual **FAQ & Troubleshoot** wiki pages — rewrote the **ES/FR** pages in the clean concise style, removed a garbled machine-translated tail from the **IT** page, and deleted 5 orphan FAQ files not referenced in the navigation.<br/>
12
- - Docs: added a dedicated FAQ section about **Weinzierl (73x) KNX/IP interfaces** that may need *Suppress ACK request* (e.g. over VPN/high-latency links), in all 6 languages.<br/>
13
- - Editor: when a **Weinzierl** interface is selected from the discovery dropdown in the gateway config node, *Suppress ACK request* is now enabled automatically (it only enables it, never overrides a manual choice, and shows an info notification).<br/>
22
+ - Docs: added a dedicated FAQ section about **Weinzierl (73x) KNX/IP interfaces** that may need _Suppress ACK request_ (e.g. over VPN/high-latency links), in all 6 languages.<br/>
23
+ - Editor: when a **Weinzierl** interface is selected from the discovery dropdown in the gateway config node, _Suppress ACK request_ is now enabled automatically (it only enables it, never overrides a manual choice, and shows an info notification).<br/>
14
24
 
15
25
  **Version 4.3.18** - May 2026<br/>
16
26
 
@@ -112,9 +112,11 @@
112
112
  try { RED.sidebar.show("help"); } catch (error) { }
113
113
  const OPENAI_COMPAT_DEFAULT_CHAT_URL = "https://api.openai.com/v1/chat/completions";
114
114
  const OLLAMA_DEFAULT_CHAT_URL = "http://localhost:11434/api/chat";
115
+ const ANTHROPIC_DEFAULT_CHAT_URL = "https://api.anthropic.com/v1/messages";
115
116
  const OLLAMA_LIBRARY_URL = "https://ollama.com/library";
116
117
  const OPENAI_COMPAT_DEFAULT_MODELS = ["gpt-5.4", "gpt-4o-mini"];
117
118
  const OLLAMA_DEFAULT_MODEL = "llama3.1";
119
+ const ANTHROPIC_DEFAULT_MODEL = "claude-opus-4-8";
118
120
 
119
121
  $("#knx-ai-accordion").accordion({
120
122
  header: "h3",
@@ -214,6 +216,10 @@
214
216
  const isOpenAiDefaultUrl = (value) => normalizeUrl(value) === normalizeUrl(OPENAI_COMPAT_DEFAULT_CHAT_URL);
215
217
  const isOllamaDefaultUrl = (value) => normalizeUrl(value) === normalizeUrl(OLLAMA_DEFAULT_CHAT_URL);
216
218
  const isOpenAiDefaultModel = (value) => OPENAI_COMPAT_DEFAULT_MODELS.indexOf(String(value || "").trim().toLowerCase()) >= 0;
219
+ const DEFAULT_CHAT_URLS = [OPENAI_COMPAT_DEFAULT_CHAT_URL, OLLAMA_DEFAULT_CHAT_URL, ANTHROPIC_DEFAULT_CHAT_URL];
220
+ const DEFAULT_MODELS = OPENAI_COMPAT_DEFAULT_MODELS.concat([OLLAMA_DEFAULT_MODEL, ANTHROPIC_DEFAULT_MODEL]);
221
+ const isAnyDefaultUrl = (value) => DEFAULT_CHAT_URLS.some((u) => normalizeUrl(u) === normalizeUrl(value));
222
+ const isAnyDefaultModel = (value) => DEFAULT_MODELS.indexOf(String(value || "").trim().toLowerCase()) >= 0;
217
223
 
218
224
  const applyProviderDefaults = (provider) => {
219
225
  const $baseUrl = $("#node-input-llmBaseUrl");
@@ -221,14 +227,15 @@
221
227
  const currentBaseUrl = String($baseUrl.val() || "").trim();
222
228
  const currentModel = String($model.val() || "").trim();
223
229
 
224
- if (provider === "ollama") {
225
- if (!currentBaseUrl || isOpenAiDefaultUrl(currentBaseUrl)) $baseUrl.val(OLLAMA_DEFAULT_CHAT_URL);
226
- if (!currentModel || isOpenAiDefaultModel(currentModel)) $model.val(OLLAMA_DEFAULT_MODEL);
227
- return;
228
- }
230
+ const urlByProvider = { ollama: OLLAMA_DEFAULT_CHAT_URL, anthropic: ANTHROPIC_DEFAULT_CHAT_URL, openai_compat: OPENAI_COMPAT_DEFAULT_CHAT_URL };
231
+ const modelByProvider = { ollama: OLLAMA_DEFAULT_MODEL, anthropic: ANTHROPIC_DEFAULT_MODEL, openai_compat: OPENAI_COMPAT_DEFAULT_MODELS[0] };
232
+ const targetUrl = urlByProvider[provider] || OPENAI_COMPAT_DEFAULT_CHAT_URL;
233
+ const targetModel = modelByProvider[provider] || OPENAI_COMPAT_DEFAULT_MODELS[0];
229
234
 
230
- if (!currentBaseUrl || isOllamaDefaultUrl(currentBaseUrl)) $baseUrl.val(OPENAI_COMPAT_DEFAULT_CHAT_URL);
231
- if (!currentModel || String(currentModel).trim().toLowerCase() === OLLAMA_DEFAULT_MODEL) $model.val(OPENAI_COMPAT_DEFAULT_MODELS[0]);
235
+ // Only overwrite when the field is empty or still holds another provider's default,
236
+ // so a user's custom base URL / model is never clobbered when switching providers.
237
+ if (!currentBaseUrl || isAnyDefaultUrl(currentBaseUrl)) $baseUrl.val(targetUrl);
238
+ if (!currentModel || isAnyDefaultModel(currentModel)) $model.val(targetModel);
232
239
  };
233
240
 
234
241
  const refreshModels = () => {
@@ -461,6 +468,7 @@
461
468
  <label style="width:290px" for="node-input-llmProvider"><i class="fa fa-cog"></i> <span data-i18n="knxUltimateAI.properties.llmProvider"></span></label>
462
469
  <select style="width:100%" id="node-input-llmProvider">
463
470
  <option value="openai_compat" data-i18n="knxUltimateAI.selectlists.llmProvider.openai_compat"></option>
471
+ <option value="anthropic" data-i18n="knxUltimateAI.selectlists.llmProvider.anthropic"></option>
464
472
  <option value="ollama" data-i18n="knxUltimateAI.selectlists.llmProvider.ollama"></option>
465
473
  </select>
466
474
  </div>