node-red-contrib-knx-ultimate 4.3.18 → 4.3.20
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 +12 -0
- package/nodes/knxUltimate-config.html +14 -0
- package/nodes/knxUltimateAI.html +15 -7
- package/nodes/knxUltimateAI.js +564 -2
- package/nodes/locales/de/knxUltimate-config.json +1 -0
- package/nodes/locales/de/knxUltimateAI.json +1 -0
- package/nodes/locales/en/knxUltimate-config.json +1 -0
- package/nodes/locales/en/knxUltimateAI.json +1 -0
- package/nodes/locales/es/knxUltimate-config.json +1 -0
- package/nodes/locales/es/knxUltimateAI.json +1 -0
- package/nodes/locales/fr/knxUltimate-config.json +1 -0
- package/nodes/locales/fr/knxUltimateAI.json +1 -0
- package/nodes/locales/it/knxUltimate-config.json +1 -0
- package/nodes/locales/it/knxUltimateAI.json +1 -0
- package/nodes/locales/zh-CN/knxUltimate-config.json +1 -0
- package/nodes/locales/zh-CN/knxUltimateAI.json +1 -0
- package/nodes/plugins/knxUltimateAI-vue/assets/app.css +1 -1
- package/nodes/plugins/knxUltimateAI-vue/assets/app.js +3 -3
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,18 @@
|
|
|
6
6
|
|
|
7
7
|
# CHANGELOG
|
|
8
8
|
|
|
9
|
+
**Version 4.3.20** - June 2026<br/>
|
|
10
|
+
|
|
11
|
+
- 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/>
|
|
12
|
+
- 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/>
|
|
13
|
+
- 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/>
|
|
14
|
+
|
|
15
|
+
**Version 4.3.19** - June 2026<br/>
|
|
16
|
+
|
|
17
|
+
- 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/>
|
|
18
|
+
- 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/>
|
|
19
|
+
- 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/>
|
|
20
|
+
|
|
9
21
|
**Version 4.3.18** - May 2026<br/>
|
|
10
22
|
|
|
11
23
|
- Bump Engine to 5.5.8
|
|
@@ -716,6 +716,20 @@
|
|
|
716
716
|
} catch (e) { }
|
|
717
717
|
$("#node-config-input-physAddr").val(`${prefix}.${rnd}`)
|
|
718
718
|
autoSelectEthernetInterfaceForHost({ force: true })
|
|
719
|
+
// Weinzierl KNX/IP Interfaces (e.g. 73x series) may not return the L_Data.req ACK
|
|
720
|
+
// in time, especially over VPN/high-latency links. Auto-enable "Suppress ACK request"
|
|
721
|
+
// when such an interface is detected by its friendly name. We only turn it on (never off),
|
|
722
|
+
// so a manual choice is never silently reverted.
|
|
723
|
+
try {
|
|
724
|
+
if (/weinzierl|\b73\d\b/i.test(String(gateway.name || ''))) {
|
|
725
|
+
const $ack = $("#node-config-input-suppressACKRequest")
|
|
726
|
+
if (!$ack.prop('checked')) {
|
|
727
|
+
$ack.prop('checked', true)
|
|
728
|
+
blinkBackgroundArray(["#node-config-input-suppressACKRequest"])
|
|
729
|
+
try { RED.notify(node._('knxUltimate-config.properties.weinzierl_ack_autoenabled'), { type: 'info', timeout: 6000 }) } catch (e) { }
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
} catch (e) { }
|
|
719
733
|
blinkBackgroundArray(["#node-config-input-host", "#node-config-input-port", "#node-config-input-name", "#node-config-input-physAddr"])
|
|
720
734
|
return false
|
|
721
735
|
},
|
package/nodes/knxUltimateAI.html
CHANGED
|
@@ -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
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
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
|
-
|
|
231
|
-
|
|
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>
|