node-red-contrib-knx-ultimate 6.3.4 → 6.3.6
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 +6 -2
- package/nodes/knxUltimateHueController.html +1 -1
- package/nodes/locales/de/knxUltimateHueController.html +3 -1
- package/nodes/locales/en/knxUltimateHueController.html +3 -1
- package/nodes/locales/es/knxUltimateHueController.html +3 -1
- package/nodes/locales/fr/knxUltimateHueController.html +3 -1
- package/nodes/locales/it/knxUltimateHueController.html +3 -1
- package/nodes/locales/zh-CN/knxUltimateHueController.html +3 -1
- package/package.json +2 -2
- package/resources/hueControllerProfiles.js +37 -134
package/CHANGELOG.md
CHANGED
|
@@ -6,9 +6,13 @@
|
|
|
6
6
|
|
|
7
7
|
# CHANGELOG
|
|
8
8
|
|
|
9
|
-
**Version 6.3.
|
|
9
|
+
**Version 6.3.6** - August 2026<br/>
|
|
10
10
|
|
|
11
|
-
- **HUE Controller**:
|
|
11
|
+
- **HUE Controller**: grouped lights now always show the complete Light mapping editor when KNX is configured, without checking child-light capabilities.<br/>
|
|
12
|
+
|
|
13
|
+
**Version 6.3.5** - August 2026<br/>
|
|
14
|
+
|
|
15
|
+
- **HUE Controller**: fixed Light mapping tabs being blocked by the Hue resource-readiness check and false-success Locate requests. Editor and Locate failures now show a red Node-RED message.<br/>
|
|
12
16
|
|
|
13
17
|
**Version 6.3.2** - August 2026<br/>
|
|
14
18
|
|
|
@@ -826,7 +826,7 @@ When no **KNX Gateway** is selected (including **none** and **Add new...**), the
|
|
|
826
826
|
|
|
827
827
|
For a single light, the **Dim**, **Tunable White**, **RGB/HSV**, and native-effects sections are enabled from the live capabilities reported by the selected Hue API v2 light resource. A light that exposes `dimming`, `color_temperature`, or `color` therefore shows the corresponding KNX mappings automatically.
|
|
828
828
|
|
|
829
|
-
|
|
829
|
+
The Light editor renders saved mappings immediately without waiting for the runtime Hue resource cache. Current capabilities load in the background; if that request fails, the saved mappings and pin selector remain available and a fixed red Node-RED error reports the failure.
|
|
830
830
|
|
|
831
831
|
Locate and the Light mapping container initialize before optional Effects and tab widgets. A saved KNX gateway remains valid if Node-RED temporarily exposes an empty selector while the editor starts. Browser-side failures and a rejected initial Locate command produce a fixed red Node-RED error with the technical detail instead of leaving the editor silent.
|
|
832
832
|
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<p>Unterstützt werden Leuchten und Leuchtengruppen, Steckdosen, Taster, Tap dial, Bewegungs- und Kamerabewegungsressourcen, Kontakte, Lichtstärke, Temperatur, Luftfeuchtigkeit, Szenen, Batterie, Zigbee-Verbindung und Softwareupdate.</p>
|
|
9
9
|
<p>Wenn kein <strong>KNX-Gateway</strong> ausgewählt ist (einschließlich <code>none</code> und <em>Neu hinzufügen...</em>), werden die KNX-Zuordnungsfelder ausgeblendet; die Auswahl der Hue-Ressource und reine Flow-Optionen bleiben verfügbar.</p>
|
|
10
10
|
<p>Bei einer einzelnen Leuchte richten sich die Bereiche <strong>Dimmen</strong>, <strong>Abstimmbares Weiß</strong>, <strong>RGB/HSV</strong> und native Effekte nach den Live-Fähigkeiten der ausgewählten Hue-API-v2-Ressource. Die zugehörigen KNX-Zuordnungen erscheinen automatisch, wenn die Leuchte <code>dimming</code>, <code>color_temperature</code> oder <code>color</code> bereitstellt.</p>
|
|
11
|
-
<p>
|
|
11
|
+
<p>Der Leuchteneditor zeigt gespeicherte Zuordnungen sofort an, ohne auf den Hue-Ressourcencache der Runtime zu warten. Aktuelle Fähigkeiten werden im Hintergrund geladen; schlägt die Anfrage fehl, bleiben Zuordnungen und Pin-Auswahl verfügbar und eine feste rote Node-RED-Fehlermeldung meldet den Fehler.</p>
|
|
12
12
|
<p>Locate und der Leuchten-Zuordnungsbereich werden vor den optionalen Effekt- und Register-Widgets initialisiert. Ein gespeichertes KNX-Gateway bleibt gültig, wenn Node-RED beim Start des Editors vorübergehend einen leeren Selektor anzeigt. Browserseitige Fehler und ein abgewiesener erster Locate-Befehl erzeugen eine feste rote Node-RED-Fehlermeldung mit dem technischen Detail, statt den Editor still zu lassen.</p>
|
|
13
13
|
<p>Wenn ein Gateway ausgewählt ist, akzeptieren die Zuordnungsfelder eine KNX-Gruppenadresse oder einen importierten ETS-Namen; passende Datenpunkte werden von diesem Gateway geladen.</p>
|
|
14
14
|
<p>Der Migrationsbutton wird nur angezeigt, wenn der Node-RED-Editor mindestens einen Legacy-HUE-Knoten in den aktuellen Flows erkennt. Derselbe kontrastreiche orange Button mit weißer Beschriftung steht unter dem Deprecated-Hinweis in jedem Legacy-HUE-Editor bereit.</p>
|
|
@@ -42,6 +42,8 @@
|
|
|
42
42
|
|
|
43
43
|
<p>Dieser Node steuert HUE-Leuchten (einzeln oder gruppiert) und ordnet Befehle/Zustände KNX-Gruppenadressen zu.</p>
|
|
44
44
|
|
|
45
|
+
<p><strong>Leuchtengruppen:</strong> wenn ein KNX-Gateway konfiguriert ist, zeigt die Auswahl eines <code>grouped_light</code> immer die vollständigen Zuordnungen für Schalten, Dimmen, Tunable White, RGB/HSV, Effekte und Verhalten. Der Editor schränkt diese Felder nicht anhand der aktuell enthaltenen Leuchten ein.</p>
|
|
46
|
+
|
|
45
47
|
**Allgemein**
|
|
46
48
|
|
|
47
49
|
| Eigenschaft | Beschreibung |
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<p>Supported functions: lights and grouped lights, plugs, buttons, Tap dial, motion and camera motion, contacts, light level, temperature, humidity, scenes, battery, Zigbee connectivity, and device software update.</p>
|
|
9
9
|
<p>When no <strong>KNX Gateway</strong> is selected (including <code>none</code> and <em>Add new...</em>), KNX mapping fields are hidden while Hue resource selection and flow-only options remain available.</p>
|
|
10
10
|
<p>For a single light, the <strong>Dim</strong>, <strong>Tunable White</strong>, <strong>RGB/HSV</strong>, and native-effects sections follow the live capabilities reported by the selected Hue API v2 resource. The corresponding KNX mappings appear automatically when the light exposes <code>dimming</code>, <code>color_temperature</code>, or <code>color</code>.</p>
|
|
11
|
-
<p>
|
|
11
|
+
<p>The Light editor renders saved mappings immediately without waiting for the runtime Hue resource cache. Current capabilities load in the background; if that request fails, the saved mappings and pin selector remain available and a fixed red Node-RED error reports the failure.</p>
|
|
12
12
|
<p>Locate and the Light mapping container initialize before optional Effects and tab widgets. A saved KNX gateway remains valid if Node-RED temporarily exposes an empty selector while the editor starts. Browser-side failures and a rejected initial Locate command produce a fixed red Node-RED error with the technical detail instead of leaving the editor silent.</p>
|
|
13
13
|
<p>When a gateway is selected, mapping fields accept a KNX group address or an imported ETS name; matching datapoints are loaded from that gateway.</p>
|
|
14
14
|
<p>The migration button is shown only when the Node-RED editor detects at least one legacy HUE node in the current flows. The same high-contrast orange button with white text is available below the deprecation notice in every legacy HUE editor.</p>
|
|
@@ -42,6 +42,8 @@
|
|
|
42
42
|
|
|
43
43
|
<p>This node controls Philips Hue lights (single or grouped) and maps their commands/states to KNX.</p>
|
|
44
44
|
|
|
45
|
+
<p><strong>Grouped lights:</strong> when a KNX gateway is configured, selecting a <code>grouped_light</code> always displays the complete Switch, Dim, Tunable White, RGB/HSV, Effects and Behaviour mappings. The editor does not restrict these fields according to the group's current child lights.</p>
|
|
46
|
+
|
|
45
47
|
**General**
|
|
46
48
|
|
|
47
49
|
|Property|Description|
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<p>Admite luces y grupos de luces, enchufes, botones, Tap dial, movimiento y movimiento de cámara, contactos, nivel de luz, temperatura, humedad, escenas, batería, conectividad Zigbee y actualización de software.</p>
|
|
9
9
|
<p>Cuando no hay ningún <strong>Gateway KNX</strong> seleccionado (incluidos <code>none</code> y <em>Añadir nuevo...</em>), se ocultan los campos de mapeo KNX; la selección del recurso Hue y las opciones exclusivas del flujo siguen disponibles.</p>
|
|
10
10
|
<p>Para una luz individual, las secciones <strong>Regulación</strong>, <strong>Blanco regulable</strong>, <strong>RGB/HSV</strong> y efectos nativos siguen las capacidades en vivo declaradas por el recurso Hue API v2 seleccionado. Los mapeos KNX correspondientes aparecen automáticamente cuando la luz expone <code>dimming</code>, <code>color_temperature</code> o <code>color</code>.</p>
|
|
11
|
-
<p>
|
|
11
|
+
<p>El editor de Luz muestra inmediatamente los mapeos guardados sin esperar a la caché de recursos Hue del runtime. Las capacidades actuales se cargan en segundo plano; si la solicitud falla, los mapeos y el selector de pines siguen disponibles y un error rojo fijo de Node-RED informa del fallo.</p>
|
|
12
12
|
<p>Locate y el contenedor de mapeo de Luz se inicializan antes que los widgets opcionales de Efectos y pestañas. Un gateway KNX guardado sigue siendo válido si Node-RED muestra temporalmente un selector vacío al iniciar el editor. Los fallos del navegador y un primer comando Locate rechazado generan un error rojo fijo de Node-RED con el detalle técnico, en lugar de dejar el editor en silencio.</p>
|
|
13
13
|
<p>Cuando hay un gateway seleccionado, los campos de mapeo aceptan una dirección de grupo KNX o un nombre importado de ETS; los datapoints compatibles se cargan desde ese gateway.</p>
|
|
14
14
|
<p>El botón de migración solo aparece cuando el editor de Node-RED detecta al menos un nodo HUE legacy en los flujos actuales. El mismo botón naranja de alto contraste con texto blanco está disponible bajo el aviso de obsolescencia de cada editor HUE legacy.</p>
|
|
@@ -42,6 +42,8 @@
|
|
|
42
42
|
|
|
43
43
|
<p> Este nodo controla las luces de Hue Philips (single o agrupada) y mapea sus comandos/estados a KNX. </p>
|
|
44
44
|
|
|
45
|
+
<p><strong>Grupos de luces:</strong> cuando hay una pasarela KNX configurada, al seleccionar un <code>grouped_light</code> siempre se muestran todas las asignaciones de Interruptor, Regulación, Blanco ajustable, RGB/HSV, Efectos y Comportamiento. El editor no limita estos campos según las luces incluidas actualmente en el grupo.</p>
|
|
46
|
+
|
|
45
47
|
**General**
|
|
46
48
|
|
|
47
49
|
| Propiedad | Descripción |
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<p>Fonctions prises en charge : lampes et groupes, prises, boutons, Tap dial, mouvement et mouvement de caméra, contacts, niveau de lumière, température, humidité, scènes, batterie, connectivité Zigbee et mise à jour logicielle.</p>
|
|
9
9
|
<p>Lorsqu'aucune <strong>Passerelle KNX</strong> n'est sélectionnée (y compris <code>none</code> et <em>Ajouter...</em>), les champs de mappage KNX sont masqués ; la sélection de la ressource Hue et les options réservées au flow restent disponibles.</p>
|
|
10
10
|
<p>Pour une lampe individuelle, les sections <strong>Variation</strong>, <strong>Blanc réglable</strong>, <strong>RGB/HSV</strong> et effets natifs suivent les capacités live déclarées par la ressource Hue API v2 sélectionnée. Les mappages KNX correspondants apparaissent automatiquement lorsque la lampe expose <code>dimming</code>, <code>color_temperature</code> ou <code>color</code>.</p>
|
|
11
|
-
<p>
|
|
11
|
+
<p>L'éditeur Lampe affiche immédiatement les mappages enregistrés sans attendre le cache de ressources Hue de la runtime. Les capacités actuelles sont chargées en arrière-plan ; si la requête échoue, les mappages et le sélecteur de broches restent disponibles et une erreur Node-RED rouge et fixe signale l'échec.</p>
|
|
12
12
|
<p>Locate et le conteneur de mappage Lampe sont initialisés avant les widgets facultatifs Effets et onglets. Une passerelle KNX enregistrée reste valide si Node-RED affiche temporairement un sélecteur vide au démarrage de l'éditeur. Les erreurs du navigateur et le rejet de la première commande Locate produisent une erreur Node-RED rouge et fixe avec le détail technique, au lieu de laisser l'éditeur silencieux.</p>
|
|
13
13
|
<p>Lorsqu'une passerelle est sélectionnée, les champs de mappage acceptent une adresse de groupe KNX ou un nom importé d'ETS ; les datapoints compatibles sont chargés depuis cette passerelle.</p>
|
|
14
14
|
<p>Le bouton de migration apparaît uniquement lorsque l'éditeur Node-RED détecte au moins un nœud HUE legacy dans les flows actuels. Le même bouton orange à contraste élevé avec texte blanc est disponible sous l'avis d'obsolescence de chaque éditeur HUE legacy.</p>
|
|
@@ -42,6 +42,8 @@
|
|
|
42
42
|
|
|
43
43
|
<p> Ce nœud contrôle les lumières de Hue Philips (simple ou groupées) et mappe leurs commandes / états à KNX. </p>
|
|
44
44
|
|
|
45
|
+
<p><strong>Groupes de lampes :</strong> lorsqu'une passerelle KNX est configurée, la sélection d'un <code>grouped_light</code> affiche toujours toutes les associations Interrupteur, Variation, Blanc réglable, RGB/HSV, Effets et Comportement. L'éditeur ne limite pas ces champs selon les lampes actuellement présentes dans le groupe.</p>
|
|
46
|
+
|
|
45
47
|
**Général**
|
|
46
48
|
|
|
47
49
|
| Propriété | Description |
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<p>Funzioni supportate: luci e gruppi di luci, prese, pulsanti, Tap dial, movimento e movimento telecamera, contatti, livello luce, temperatura, umidità, scene, batteria, connettività Zigbee e aggiornamento software.</p>
|
|
9
9
|
<p>Quando non è selezionato alcun <strong>Gateway KNX</strong> (inclusi <code>none</code> e <em>Aggiungi nuovo...</em>), i campi di mappatura KNX vengono nascosti, mentre la selezione della risorsa Hue e le opzioni per il solo flow restano disponibili.</p>
|
|
10
10
|
<p>Per una luce singola, le sezioni <strong>Dimmer</strong>, <strong>Bianco regolabile</strong>, <strong>RGB/HSV</strong> ed effetti nativi seguono le capacità live dichiarate dalla risorsa Hue API v2 selezionata. Le relative mappature KNX appaiono automaticamente quando la luce espone <code>dimming</code>, <code>color_temperature</code> o <code>color</code>.</p>
|
|
11
|
-
<p>
|
|
11
|
+
<p>L'editor Luce mostra subito le mappature salvate senza attendere la cache delle risorse Hue del runtime. Le capability correnti vengono caricate in background; se la richiesta fallisce, mappature e selettore dei pin restano disponibili e un errore Node-RED rosso e fisso segnala il problema.</p>
|
|
12
12
|
<p>Locate e il contenitore delle mappature Luce vengono inizializzati prima dei widget opzionali Effetti e schede. Un gateway KNX salvato resta valido se Node-RED mostra temporaneamente un selettore vuoto durante l'avvio dell'editor. Gli errori del browser e il rifiuto del primo comando Locate producono un errore Node-RED rosso e fisso con il dettaglio tecnico, invece di lasciare l'editor silenzioso.</p>
|
|
13
13
|
<p>Quando è selezionato un gateway, nei campi di mappatura puoi digitare un indirizzo di gruppo KNX o un nome importato da ETS; i datapoint compatibili vengono caricati da quel gateway.</p>
|
|
14
14
|
<p>Il pulsante di migrazione compare solo quando l'editor Node-RED rileva almeno un nodo HUE legacy nei flow correnti. Lo stesso pulsante arancione ad alto contrasto con testo bianco è disponibile sotto l'avviso di deprecazione in ogni editor HUE legacy.</p>
|
|
@@ -42,6 +42,8 @@
|
|
|
42
42
|
|
|
43
43
|
<p>Questo nodo controlla le luci HUE (singole o raggruppate) e mappa comandi/stati su KNX.</p>
|
|
44
44
|
|
|
45
|
+
<p><strong>Gruppi di luci:</strong> quando è configurato un gateway KNX, selezionando un <code>grouped_light</code> vengono sempre mostrate tutte le mappature Switch, Dim, Tunable White, RGB/HSV, Effetti e Comportamento. L'editor non limita questi campi in base alle luci attualmente incluse nel gruppo.</p>
|
|
46
|
+
|
|
45
47
|
**Generale**
|
|
46
48
|
|
|
47
49
|
| Proprietà | Descrizione |
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<p>支持灯和灯组、插座、按钮、Tap dial、运动和摄像机运动、接触、光照度、温度、湿度、场景、电池、Zigbee 连接和设备软件更新。</p>
|
|
9
9
|
<p>未选择<strong>KNX 网关</strong>时(包括 <code>none</code> 和“新增...”),KNX 映射字段会隐藏,而 Hue 资源选择和仅用于流程的选项仍然可用。</p>
|
|
10
10
|
<p>对于单灯,<strong>调光</strong>、<strong>可调白光</strong>、<strong>RGB/HSV</strong> 和原生效果部分会根据所选 Hue API v2 资源实时报告的能力显示。当灯具提供 <code>dimming</code>、<code>color_temperature</code> 或 <code>color</code> 时,相应的 KNX 映射会自动出现。</p>
|
|
11
|
-
<p
|
|
11
|
+
<p>灯光编辑器会立即显示已保存的映射,而无需等待运行时 Hue 资源缓存。当前能力在后台加载;如果请求失败,映射和引脚选择器仍然可用,并由固定的红色 Node-RED 错误消息报告失败。</p>
|
|
12
12
|
<p>Locate 和灯光映射容器会先于可选的效果与选项卡控件初始化。如果编辑器启动时 Node-RED 暂时显示空的网关选择值,已保存的 KNX 网关仍保持有效。浏览器端错误或首次 Locate 命令被拒绝时,Node-RED 会显示固定的红色错误消息和技术详情,而不会让编辑器无提示地保持沉默。</p>
|
|
13
13
|
<p>选择网关后,映射字段可输入 KNX 组地址或从 ETS 导入的名称;兼容的数据点会从该网关加载。</p>
|
|
14
14
|
<p>仅当 Node-RED 编辑器在当前流程中检测到至少一个旧版 HUE 节点时,才会显示迁移按钮。每个旧版 HUE 编辑器的弃用提示下方也提供带白色文字的相同高对比度橙色按钮。</p>
|
|
@@ -42,6 +42,8 @@
|
|
|
42
42
|
|
|
43
43
|
<p>此节点使您可以控制飞利浦色调灯和分组的灯光,还可以将此灯的状态发送到KNX巴士。</p>
|
|
44
44
|
|
|
45
|
+
<p><strong>灯组:</strong>配置 KNX 网关后,选择 <code>grouped_light</code> 将始终显示完整的开关、调光、可调白光、RGB/HSV、效果和行为映射。编辑器不会根据灯组当前包含的灯具限制这些字段。</p>
|
|
46
|
+
|
|
45
47
|
**一般的**
|
|
46
48
|
|
|
47
49
|
|属性|描述|
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"engines": {
|
|
4
4
|
"node": ">=20.18.1"
|
|
5
5
|
},
|
|
6
|
-
"version": "6.3.
|
|
6
|
+
"version": "6.3.6",
|
|
7
7
|
"description": "KNX Ultimate is the most advanced KNX integration for Node-RED, providing secure KNX/IP communication, routing, ETS project import, Philips Hue, Matter Controller and Matter Bridge (control matter device via KNX and expose KNX GA via Matter), MQTT, diagnostics with AI, virtual devices, and powerful automation nodes. Build professional, reliable, and scalable smart home and building automation projects with minimal effort.",
|
|
8
8
|
"files": [
|
|
9
9
|
"nodes/",
|
|
@@ -149,4 +149,4 @@
|
|
|
149
149
|
"vite": "^7.3.6",
|
|
150
150
|
"vue": "^3.5.41"
|
|
151
151
|
}
|
|
152
|
-
}
|
|
152
|
+
}
|
|
@@ -1238,14 +1238,7 @@
|
|
|
1238
1238
|
$hueDeviceInput.val(initialHueDeviceRaw);
|
|
1239
1239
|
updateTabsVisibility();
|
|
1240
1240
|
if (getJsonPromise !== undefined) getJsonPromise.abort();
|
|
1241
|
-
|
|
1242
|
-
// while it bootstraps this mature editor. Reading the select here
|
|
1243
|
-
// would therefore query an inexistent bridge and return `{}` even
|
|
1244
|
-
// though the selected light has dimming, colour or tunable-white
|
|
1245
|
-
// capabilities. Resolve the real persisted config-node ID through
|
|
1246
|
-
// the same helper used by resource discovery and Locate instead.
|
|
1247
|
-
const capabilityServerId = resolveHueServerValue({ allowStored: true });
|
|
1248
|
-
const capabilityResourceId = initialHueDeviceRaw.split("#")[0];
|
|
1241
|
+
const selectedHueResourceType = String(initialHueDeviceRaw.split("#")[1] || '').trim().toLowerCase();
|
|
1249
1242
|
const applyHueCapabilities = (data) => {
|
|
1250
1243
|
let oLight = data || {};
|
|
1251
1244
|
const effects = (oLight && oLight.effects && Array.isArray(oLight.effects.status_values))
|
|
@@ -1380,20 +1373,35 @@
|
|
|
1380
1373
|
$("#node-input-specifySwitchOnBrightness").val(node.specifySwitchOnBrightness).trigger('change');
|
|
1381
1374
|
$("#node-input-enableDayNightLighting").val(node.enableDayNightLighting).trigger('change');
|
|
1382
1375
|
};
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1376
|
+
if (selectedHueResourceType === "grouped_light") {
|
|
1377
|
+
// A Hue group represents an aggregate control surface. Its
|
|
1378
|
+
// editor must remain complete and deterministic regardless of
|
|
1379
|
+
// the capabilities exposed by its current child lights.
|
|
1380
|
+
applyHueCapabilities({ type: "grouped_light" });
|
|
1381
|
+
} else {
|
|
1382
|
+
// HUE Controller temporarily selects Node-RED's `_ADD_` sentinel
|
|
1383
|
+
// while it bootstraps this mature editor. Reading the select here
|
|
1384
|
+
// would therefore query an inexistent bridge and return `{}` even
|
|
1385
|
+
// though the selected light has dimming, colour or tunable-white
|
|
1386
|
+
// capabilities. Resolve the real persisted config-node ID through
|
|
1387
|
+
// the same helper used by resource discovery and Locate instead.
|
|
1388
|
+
const capabilityServerId = resolveHueServerValue({ allowStored: true });
|
|
1389
|
+
const capabilityResourceId = initialHueDeviceRaw.split("#")[0];
|
|
1390
|
+
getJsonPromise = $.getJSON(`knxUltimateGetLightObject?id=${encodeURIComponent(capabilityResourceId)}&serverId=${encodeURIComponent(capabilityServerId)}&_=${Date.now()}`, (data) => {
|
|
1391
|
+
try {
|
|
1392
|
+
applyHueCapabilities(data);
|
|
1393
|
+
} catch (error) {
|
|
1394
|
+
notifyEditorError(error, 'capabilities');
|
|
1395
|
+
}
|
|
1396
|
+
}).fail((xhr, textStatus, errorThrown) => {
|
|
1397
|
+
if (textStatus === 'abort') return;
|
|
1398
|
+
const detail = xhr && xhr.responseJSON && xhr.responseJSON.error
|
|
1399
|
+
? xhr.responseJSON.error
|
|
1400
|
+
: (errorThrown || textStatus || 'Unable to load Hue capabilities');
|
|
1401
|
+
notifyEditorError(new Error(detail), 'capabilities request');
|
|
1402
|
+
});
|
|
1403
|
+
setTimeout(function () { if (getJsonPromise !== undefined) getJsonPromise.abort(); }, 10000);
|
|
1404
|
+
}
|
|
1397
1405
|
}
|
|
1398
1406
|
// Show/Hide the div of the color at swich on
|
|
1399
1407
|
if (node.specifySwitchOnBrightness === "yes") {
|
|
@@ -1607,11 +1615,6 @@
|
|
|
1607
1615
|
}
|
|
1608
1616
|
|
|
1609
1617
|
function Go() {
|
|
1610
|
-
if (typeof node.__stopHueConnectionWait === 'function') {
|
|
1611
|
-
node.__stopHueConnectionWait();
|
|
1612
|
-
}
|
|
1613
|
-
$("#waitWindow").hide();
|
|
1614
|
-
$("#mainWindow").show();
|
|
1615
1618
|
// $.post("banana", { func: "getNameAndTime" }, function (data) {
|
|
1616
1619
|
// //alert(data.body); // John
|
|
1617
1620
|
// }, "json");
|
|
@@ -1641,104 +1644,16 @@
|
|
|
1641
1644
|
// HUE Controller owns a device-first picker covering every supported
|
|
1642
1645
|
// Hue API v2 resource. onEditPrepare installs the mature Light-only
|
|
1643
1646
|
// autocomplete, so let the wrapper restore its unified source after
|
|
1644
|
-
// this
|
|
1647
|
+
// this initialization completes.
|
|
1645
1648
|
if (typeof node.__configureHueControllerDeviceControl === 'function') {
|
|
1646
1649
|
node.__configureHueControllerDeviceControl();
|
|
1647
1650
|
}
|
|
1648
1651
|
}
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
//
|
|
1652
|
-
//
|
|
1653
|
-
|
|
1654
|
-
// `this`; keeping the state in this closure avoids a TypeError and makes
|
|
1655
|
-
// cancellation deterministic when the editor is closed or remounted.
|
|
1656
|
-
const HUE_CONNECTION_POLL_MS = 500;
|
|
1657
|
-
const HUE_CONNECTION_MAX_ATTEMPTS = 20;
|
|
1658
|
-
const HUE_CONNECTION_EMPTY_SERVER_VALUES = new Set(['', 'none', '_add_', '__none__', '__null__', 'null', 'undefined']);
|
|
1659
|
-
let hueConnectionAttempts = 0;
|
|
1660
|
-
let hueConnectionTimer = null;
|
|
1661
|
-
let hueConnectionGeneration = 0;
|
|
1662
|
-
|
|
1663
|
-
const resolveConnectionHueServerId = () => {
|
|
1664
|
-
const domValue = $("#node-input-serverHue").val();
|
|
1665
|
-
if (domValue !== undefined && domValue !== null) {
|
|
1666
|
-
const normalized = String(domValue).trim();
|
|
1667
|
-
return HUE_CONNECTION_EMPTY_SERVER_VALUES.has(normalized.toLowerCase()) ? '' : normalized;
|
|
1668
|
-
}
|
|
1669
|
-
const storedValue = node.serverHue === undefined || node.serverHue === null
|
|
1670
|
-
? ''
|
|
1671
|
-
: String(node.serverHue).trim();
|
|
1672
|
-
return HUE_CONNECTION_EMPTY_SERVER_VALUES.has(storedValue.toLowerCase()) ? '' : storedValue;
|
|
1673
|
-
};
|
|
1674
|
-
|
|
1675
|
-
const stopHueConnectionWait = () => {
|
|
1676
|
-
hueConnectionGeneration += 1;
|
|
1677
|
-
if (hueConnectionTimer !== null) {
|
|
1678
|
-
clearTimeout(hueConnectionTimer);
|
|
1679
|
-
hueConnectionTimer = null;
|
|
1680
|
-
}
|
|
1681
|
-
};
|
|
1682
|
-
node.__stopHueConnectionWait = stopHueConnectionWait;
|
|
1683
|
-
|
|
1684
|
-
const finishHueConnectionTimeout = () => {
|
|
1685
|
-
stopHueConnectionWait();
|
|
1686
|
-
hueConnectionAttempts = 0;
|
|
1687
|
-
$("#waitWindow").hide();
|
|
1688
|
-
$("#mainWindow").show();
|
|
1689
|
-
$("#tabs").hide();
|
|
1690
|
-
const message = node._("knxUltimateHueLight.connection_timeout")
|
|
1691
|
-
|| "The Hue Bridge is not ready yet. Check its configuration, deploy and retry.";
|
|
1692
|
-
RED.notify(message, "error");
|
|
1693
|
-
};
|
|
1694
|
-
|
|
1695
|
-
const checkConnection = (generation) => {
|
|
1696
|
-
if (generation !== hueConnectionGeneration) return;
|
|
1697
|
-
const hueServerId = resolveConnectionHueServerId();
|
|
1698
|
-
if (!hueServerId || $("#node-input-serverHue").val() === undefined) {
|
|
1699
|
-
Go();
|
|
1700
|
-
return;
|
|
1701
|
-
}
|
|
1702
|
-
if (hueConnectionTimer !== null) clearTimeout(hueConnectionTimer);
|
|
1703
|
-
hueConnectionTimer = setTimeout(() => {
|
|
1704
|
-
hueConnectionTimer = null;
|
|
1705
|
-
if (generation !== hueConnectionGeneration) return;
|
|
1706
|
-
hueConnectionAttempts += 1;
|
|
1707
|
-
if (hueConnectionAttempts > HUE_CONNECTION_MAX_ATTEMPTS) {
|
|
1708
|
-
finishHueConnectionTimeout();
|
|
1709
|
-
return;
|
|
1710
|
-
}
|
|
1711
|
-
$.getJSON(`knxultimateCheckHueConnected?serverId=${encodeURIComponent(hueServerId)}&_=${Date.now()}`)
|
|
1712
|
-
.done((data) => {
|
|
1713
|
-
if (generation !== hueConnectionGeneration) return;
|
|
1714
|
-
if (data && data.ready === true) Go();
|
|
1715
|
-
else checkConnection(generation);
|
|
1716
|
-
})
|
|
1717
|
-
.fail(() => {
|
|
1718
|
-
if (generation === hueConnectionGeneration) checkConnection(generation);
|
|
1719
|
-
});
|
|
1720
|
-
}, HUE_CONNECTION_POLL_MS);
|
|
1721
|
-
};
|
|
1722
|
-
|
|
1723
|
-
const startHueConnectionWait = () => {
|
|
1724
|
-
stopHueConnectionWait();
|
|
1725
|
-
hueConnectionAttempts = 0;
|
|
1726
|
-
const hueServerId = resolveConnectionHueServerId();
|
|
1727
|
-
if (!hueServerId) {
|
|
1728
|
-
Go();
|
|
1729
|
-
return;
|
|
1730
|
-
}
|
|
1731
|
-
$("#waitWindow").show();
|
|
1732
|
-
$("#mainWindow").hide();
|
|
1733
|
-
const generation = hueConnectionGeneration;
|
|
1734
|
-
checkConnection(generation);
|
|
1735
|
-
};
|
|
1736
|
-
|
|
1737
|
-
$("#node-input-serverHue")
|
|
1738
|
-
.off("change.knxUltimateHueControllerConnectionWait")
|
|
1739
|
-
.on("change.knxUltimateHueControllerConnectionWait", startHueConnectionWait);
|
|
1740
|
-
startHueConnectionWait();
|
|
1741
|
-
// ################################################################
|
|
1652
|
+
// Do not gate the Light editor on the runtime resource cache. The
|
|
1653
|
+
// selected device and its saved capabilities are sufficient to render
|
|
1654
|
+
// the mappings immediately; the fresh capability request inside
|
|
1655
|
+
// onEditPrepare updates them asynchronously and reports any failure.
|
|
1656
|
+
Go();
|
|
1742
1657
|
|
|
1743
1658
|
},
|
|
1744
1659
|
|
|
@@ -1781,10 +1696,6 @@
|
|
|
1781
1696
|
this.effectRules = serialized;
|
|
1782
1697
|
this.updateLocalStateFromKNXWrite = $("#node-input-updateLocalStateFromKNXWrite").is(":checked"); // Starting from v 4.1.31
|
|
1783
1698
|
this._cachedHueLightDevices = [];
|
|
1784
|
-
if (typeof this.__stopHueConnectionWait === 'function') {
|
|
1785
|
-
try { this.__stopHueConnectionWait(); } catch (error) { /* empty */ }
|
|
1786
|
-
this.__stopHueConnectionWait = null;
|
|
1787
|
-
}
|
|
1788
1699
|
if (typeof this.__stopHueLocateSession === 'function') {
|
|
1789
1700
|
try { this.__stopHueLocateSession(); } catch (error) { /* empty */ }
|
|
1790
1701
|
this.__stopHueLocateSession = null;
|
|
@@ -1804,10 +1715,6 @@
|
|
|
1804
1715
|
//RED.sidebar.show("help");
|
|
1805
1716
|
|
|
1806
1717
|
this._cachedHueLightDevices = [];
|
|
1807
|
-
if (typeof this.__stopHueConnectionWait === 'function') {
|
|
1808
|
-
try { this.__stopHueConnectionWait(); } catch (error) { /* empty */ }
|
|
1809
|
-
this.__stopHueConnectionWait = null;
|
|
1810
|
-
}
|
|
1811
1718
|
if (typeof this.__stopHueLocateSession === 'function') {
|
|
1812
1719
|
try { this.__stopHueLocateSession(); } catch (error) { /* empty */ }
|
|
1813
1720
|
this.__stopHueLocateSession = null;
|
|
@@ -1824,10 +1731,6 @@
|
|
|
1824
1731
|
}
|
|
1825
1732
|
},
|
|
1826
1733
|
oneditclose: function () {
|
|
1827
|
-
if (typeof this.__stopHueConnectionWait === 'function') {
|
|
1828
|
-
try { this.__stopHueConnectionWait(); } catch (error) { /* empty */ }
|
|
1829
|
-
this.__stopHueConnectionWait = null;
|
|
1830
|
-
}
|
|
1831
1734
|
if (typeof this.__stopHueLocateSession === 'function') {
|
|
1832
1735
|
try { this.__stopHueLocateSession(); } catch (error) { /* empty */ }
|
|
1833
1736
|
}
|
|
@@ -9221,7 +9124,7 @@
|
|
|
9221
9124
|
// Form fragments are mounted inside #hue-controller-profile-editor. The two
|
|
9222
9125
|
// config-node fields remain owned by the outer Controller template.
|
|
9223
9126
|
const PROFILE_TEMPLATES = {
|
|
9224
|
-
"light": "<!-- Canonical private HUE Controller template: light. -->\n<div class=\"form-row hue-legacy-controller-notice\" role=\"note\" style=\"box-sizing:border-box; padding:10px 12px; margin-bottom:14px; border-left:4px solid #d79b00; background:#fff8df; color:#4d3a00;\">\n <i class=\"fa fa-exclamation-triangle\" aria-hidden=\"true\" style=\"color:#a15c00; margin-right:6px;\"></i>\n <span data-i18n=\"node-red-contrib-knx-ultimate/knxUltimateHueController:knxUltimateHueController.legacy_node_notice\"></span>\n </div>\n <div class=\"form-row\" style=\"margin-bottom:10px;\">\n <span style=\"color:#ff0000\"><i class=\"fa fa-youtube\"></i></span> <a target=\"_blank\" href=\"https://www.youtube.com/playlist?list=PL9Yh1bjbLAYrU8PsVhW4xzEug2WtVFv3E\"><b>KNX-Ultimate video tutorials (YouTube playlist)</b></a>\n </div>\n <div id=\"waitWindow\">\n <br/><br/>\n <p align=\"center\">\n <i class=\"fa-solid fa-hourglass-start fa-spin-pulse fa-2x\"></i><br/><br/>\n <span data-i18n=\"knxUltimateHueLight.connection_wait\"></span>\n </p>\n </div>\n <div id=\"mainWindow\" hidden>\n <div class=\"form-row\">\n <b><span data-i18n=\"knxUltimateHueLight.title\"></span></b>  <span style=\"color:red\"    <i class=\"fa fa-youtube\"></i></span> <a\n target=\"_blank\" href=\"https://youtu.be/jjEUI1J8bkA\"><u><span data-i18n=\"common.youtube_sample\"></span></u></a>\n <br />\n <br />\n <label for=\"node-input-server\">\n <img\n src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAKnRFWHRDcmVhdGlvbiBUaW1lAEZyIDYgQXVnIDIwMTAgMjE6NTI6MTkgKzAxMDD84aS8AAAAB3RJTUUH3gYYCicNV+4WIQAAAAlwSFlzAAALEgAACxIB0t1+/AAAAARnQU1BAACxjwv8YQUAAACUSURBVHjaY2CgFZg5c+Z/ZEyWAZ8+f/6/ZsWs/xoamqMGkGrA6Wla/1+fVARjEBuGsSoGmY4eZSCNL59d/g8DIDbIAHR14OgFGQByKjIGKX5+6/T///8gGMQGiV1+/B0Fg70GIkD+RMYgxf/O5/7//2MSmAZhkBi6OrgB6Bg5DGB4ajr3f2xqsYYLSDE2THJUDg0AAAqyDVd4tp4YAAAAAElFTkSuQmCC\"></img>\n <span data-i18n=\"common.knx_gw\"></span>\n </label>\n <input type=\"text\" id=\"node-input-server\" />\n </div>\n\n <div class=\"form-row\">\n <label for=\"node-input-serverHue\">\n <img\n src=\"data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAEKADAAQAAAABAAAAEAAAAAA0VXHyAAABFUlEQVQ4EZWSsWoCQRCG1yiENEFEi6QSkjqWWoqFoBYJ+Br6JHkMn8Iibd4ihQpaJIhWNkry/ZtdGZY78Qa+m39nZ+dm9s4550awglNBluS/gVtAX6KgDclf68w2OThgfR9iT/jnoEv4TtByDThWTCDKW4SSZTf/zj9/eZbN+izTDuKGimu0vPF8B/YN8aC8LmcOj/AAn9CFTEs70Js/oGqy79C69bqJ5XbQI2kGO5N8QL9D08S8zBtBF5ZaVsznpCMoqJnVdjTpb1Db0fwIWmQV6BLXzFOYgA6/gDVfQN9bBWp2J2hdWDPoBV5FrKnAJutHikk/CHHR8i7x4iG7qQ720IYvu3GFbpHjx3pFrOFYkA354z/5bkK826phyAAAAABJRU5ErkJggg==\" />\n <span data-i18n=\"common.hue_bridge\"></span>\n </label>\n <input type=\"text\" id=\"node-input-serverHue\" />\n </div>\n\n <br />\n <p>\n <b><span data-i18n=\"common.philips_hue\"></span></b>\n </p>\n\n <div class=\"form-row\">\n <label for=\"node-input-name\">\n <i class=\"fa fa-play-circle\"></i> <span data-i18n=\"common.name\"></span>\n </label>\n <input type=\"text\" id=\"node-input-name\" placeholder=\"Enter your hue device name\"\n style=\"flex:1 1 240px; min-width:240px; max-width:240px;\" />\n <button type=\"button\" class=\"red-ui-button hue-refresh-devices\"\n style=\"margin-left:6px; color:#1b7d33; border-color:#1b7d33;\" title=\"Refresh Hue devices\">\n <i class=\"fa fa-sync\"></i>\n </button>\n <button type=\"button\" class=\"red-ui-button hue-locate-device\"\n style=\"margin-left:6px; color:#ff9800; border-color:#ff9800;\" title=\"Locate selected Hue device\">\n <i class=\"fa fa-play\"></i>\n </button>\n <span class=\"hue-devices-loading\" style=\"margin-left:6px; display:none; color:#1b7d33;\">\n <i class=\"fa fa-circle-notch fa-spin\"></i>\n </span>\n <input type=\"hidden\" id=\"node-input-hueDevice\" />\n </div>\n\n <br />\n\n <div id=\"tabs\" style=\"display:none; width: 900px;\">\n <ul>\n <li><a href=\"#tabs-1\"><i class=\"fa-solid fa-toggle-on\"></i> <span data-i18n=\"knxUltimateHueLight.tabs.switch\"></span></a></li>\n <li><a href=\"#tabs-2\"><i class=\"fa-solid fa-arrow-up-wide-short\"></i> <span data-i18n=\"knxUltimateHueLight.tabs.dim\"></span></a></li>\n <li><a href=\"#tabs-3\"><i class=\"fa-solid fa-temperature-quarter\"></i> <span data-i18n=\"knxUltimateHueLight.tabs.tunable_white\"></span></a></li>\n <li><a href=\"#tabs-4\"><i class=\"fa-solid fa-palette\"></i> <span data-i18n=\"knxUltimateHueLight.tabs.rgb_hsv\"></span></a></li>\n <li><a href=\"#tabs-5\"><i class=\"fa-solid fa-heart-circle-check\"></i> <span data-i18n=\"knxUltimateHueLight.tabs.effects\"></span></a></li>\n <li><a href=\"#tabs-6\"><i class=\"fa-solid fa-code-merge\"></i> <span data-i18n=\"knxUltimateHueLight.tabs.behaviour\"></span></a></li>\n </ul>\n <div id=\"tabs-1\">\n <p>\n <div class=\"form-row\">\n <label for=\"node-input-nameLightSwitch\" style=\"width:110px;\"><i class=\"fa fa-play-circle-o\"></i> <span data-i18n=\"knxUltimateHueLight.control\"></span></label>\n\n <label for=\"node-input-GALightSwitch\" style=\"width:20px;\"><span data-i18n=\"common.ga\"></span></label>\n <input type=\"text\" id=\"node-input-GALightSwitch\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightSwitch\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightSwitch\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightSwitch\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightSwitch\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-nameLightState\" style=\"width:110px;\"><i class=\"fa fa-question-circle\"></i> <span data-i18n=\"knxUltimateHueLight.status\"></span></label>\n\n <label for=\"node-input-GALightState\" style=\"width:20px;\"><span data-i18n=\"common.ga\"></span></label>\n <input type=\"text\" id=\"node-input-GALightState\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightState\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightState\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightState\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightState\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n </p>\n </div>\n <div id=\"tabs-2\">\n <p>\n <img src=\"resources/node-red-contrib-knx-ultimate/dim.png\" style=\"width: 900px;\">\n <div class=\"form-row\">\n <label for=\"node-input-nameLightDIM\" style=\"width:110px;\"><i class=\"fa fa-play-circle-o\"></i> Control dim</label>\n\n <label for=\"node-input-GALightDIM\" style=\"width:20px;\"><span data-i18n=\"common.ga\"></span></label>\n <input type=\"text\" id=\"node-input-GALightDIM\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightDIM\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightDIM\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightDIM\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightDIM\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-nameLightBrightness\" style=\"width:110px;\"><i class=\"fa fa-play-circle-o\"></i> Control\n %</label>\n\n <label for=\"node-input-GALightBrightness\" style=\"width:20px;\"><span data-i18n=\"common.ga\"></span></label>\n <input type=\"text\" id=\"node-input-GALightBrightness\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightBrightness\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightBrightness\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightBrightness\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightBrightness\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n\n <div class=\"form-row\">\n <label for=\"node-input-nameLightBrightnessState\" style=\"width:110px;\"><i class=\"fa fa-question-circle\"></i> Status %</label>\n\n <label for=\"node-input-GALightBrightnessState\" style=\"width:20px;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-GALightState\"></span></label>\n <input type=\"text\" id=\"node-input-GALightBrightnessState\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightBrightnessState\"\n style=\"width:40px; margin-left: 0px; text-align: right;\">DPT</label>\n <select id=\"node-input-dptLightBrightnessState\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightBrightnessState\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightBrightnessState\"\n style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-dimSpeed\" style=\"width:260px\">\n <i class=\"fa fa-bolt\"></i> Dim Speed (ms)\n </label>\n <input type=\"text\" id=\"node-input-dimSpeed\" placeholder='Default is 5000' style=\"width:210px\">\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-minDimLevelLight\" style=\"width:260px;\">\n <i class=\"fa fa-clone\"></i> Min Dim Brightness\n </label>\n <select id=\"node-input-minDimLevelLight\">\n <option value=\"useHueLightLevel\" data-i18n=\"knxUltimateHueLight.use_min_brightness\"></option>\n </select>\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-maxDimLevelLight\" style=\"width:260px;\">\n <i class=\"fa fa-clone\"></i> Max Dim Brightness\n </label>\n <select id=\"node-input-maxDimLevelLight\"></select>\n </div>\n </p>\n </div>\n <div id=\"tabs-3\">\n <p>\n <img src=\"resources/node-red-contrib-knx-ultimate/tunablewhite.png\" style=\"width: 900px;\">\n <div class=\"form-row\">\n <label for=\"node-input-nameLightKelvinDIM\" style=\"width:110px;\"><i class=\"fa fa-play-circle-o\"></i> Control dim</label>\n\n <label for=\"node-input-GALightKelvinDIM\" style=\"width:20px;\"><span data-i18n=\"common.ga\"></span></label>\n <input type=\"text\" id=\"node-input-GALightKelvinDIM\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightKelvinDIM\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightKelvinDIM\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightKelvinDIM\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightKelvinDIM\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-nameLightKelvinPercentage\" style=\"width:110px;\"><i class=\"fa fa-play-circle-o\"></i> Control\n %</label>\n\n <label for=\"node-input-GALightKelvinPercentage\" style=\"width:20px;\"><span data-i18n=\"common.ga\"></span></label>\n <input type=\"text\" id=\"node-input-GALightKelvinPercentage\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightKelvinPercentage\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightKelvinPercentage\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightKelvinPercentage\"\n style=\"width:50px; margin-left: 0px; text-align: right;\">Name</label>\n <input type=\"text\" id=\"node-input-nameLightKelvinPercentage\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-nameLightKelvinPercentageState\" style=\"width:110px;\"><i class=\"fa fa-question-circle\"></i> Status\n %</label>\n\n <label for=\"node-input-GALightKelvinPercentageState\" style=\"width:20px;\"><span data-i18n=\"common.ga\"></span></label>\n <input type=\"text\" id=\"node-input-GALightKelvinPercentageState\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightKelvinPercentageState\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightKelvinPercentageState\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightKelvinPercentageState\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightKelvinPercentageState\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-nameLightKelvin\" style=\"width:110px;\"><i class=\"fa fa-play-circle-o\"></i> Control\n Kelvin</label>\n\n <label for=\"node-input-GALightKelvin\" style=\"width:20px;\"><span data-i18n=\"common.ga\"></span></label>\n <input type=\"text\" id=\"node-input-GALightKelvin\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightKelvin\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightKelvin\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightKelvin\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightKelvin\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-nameLightKelvinState\" style=\"width:110px;\"><i class=\"fa fa-question-circle\"></i> Status\n Kelvin</label>\n <label for=\"node-input-GALightKelvinState\" style=\"width:20px;\"><span data-i18n=\"common.ga\"></span></label>\n <input type=\"text\" id=\"node-input-GALightKelvinState\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightKelvinState\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightKelvinState\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightKelvinState\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightKelvinState\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n <div class=\"form-row\">\n <label style=\"width:170px\" for=\"node-input-invertDimTunableWhiteDirection\">\n <i class=\"fa fa-shuffle\"></i> Invert dim direction\n </label>\n <input type=\"checkbox\" id=\"node-input-invertDimTunableWhiteDirection\"\n style=\"display:inline-block; width:auto; vertical-align:top;\" />\n </div>\n </p>\n </div>\n <div id=\"tabs-4\">\n <p>\n <img src=\"resources/node-red-contrib-knx-ultimate/rgb.png\" style=\"width: 900px;\">\n <p><b> RGB section</b></p>\n <div class=\"form-row\">\n <label for=\"node-input-nameLightColor\" style=\"width:110px;\"><i class=\"fa fa-play-circle-o\"></i> Control rgb</label>\n\n <label for=\"node-input-GALightColor\" style=\"width:20px;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-GALightState\"></span></label>\n <input type=\"text\" id=\"node-input-GALightColor\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightColor\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightColor\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightColor\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightColor\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-nameLightColorState\" style=\"width:110px;\"><i class=\"fa fa-question-circle\"></i> Status rgb</label>\n\n <label for=\"node-input-GALightColorState\" style=\"width:20px;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-GALightState\"></span></label>\n <input type=\"text\" id=\"node-input-GALightColorState\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightColorState\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightColorState\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightColorState\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightColorState\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n\n <p><b> HSV section</b></p>\n <!-- // HSV Color change\n // nameLightHSV_H_DIM: { value: \"\" },\n // GALightHSV_H_DIM: { value: \"\" },\n // dptLightHSV_H_DIM: { value: \"\" }, -->\n <div class=\"form-row\">\n <label for=\"node-input-nameLightHSV_H_DIM\" style=\"width:110px;\"><i class=\"fa fa-play-circle-o\"></i> Control H dim</label>\n\n <label for=\"node-input-GALightHSV_H_DIM\" style=\"width:20px;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-GALightState\"></span></label>\n <input type=\"text\" id=\"node-input-GALightHSV_H_DIM\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightHSV_H_DIM\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightHSV_H_DIM\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightHSV_H_DIM\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightHSV_H_DIM\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-nameLightHSV_H_State\" style=\"width:110px;\"><i class=\"fa fa-question-circle\"></i> Status H %</label>\n\n <label for=\"node-input-GALightHSV_H_State\" style=\"width:20px;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-GALightState\"></span></label>\n <input type=\"text\" id=\"node-input-GALightHSV_H_State\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightHSV_H_State\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightHSV_H_State\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightHSV_H_State\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightHSV_H_State\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n\n <!-- // HSV Saturation change\n nameLightHSV_S_DIM: { value: \"\" },\n GALightHSV_S_DIM: { value: \"\" },\n dptLightHSV_S_DIM: { value: \"\" },\n nameLightHSV_S_State: { value: \"\" },\n GALightHSV_S_State: { value: \"\" },\n dptLightHSV_S_State: { value: \"\" }, -->\n <div class=\"form-row\">\n <label for=\"node-input-nameLightHSV_S_DIM\" style=\"width:110px;\"><i class=\"fa fa-play-circle-o\"></i> Control S dim</label>\n\n <label for=\"node-input-GALightHSV_S_DIM\" style=\"width:20px;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-GALightState\"></span></label>\n <input type=\"text\" id=\"node-input-GALightHSV_S_DIM\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightHSV_S_DIM\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightHSV_S_DIM\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightHSV_S_DIM\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightHSV_S_DIM\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-nameLightHSV_S_State\" style=\"width:110px;\"><i class=\"fa fa-question-circle\"></i> Status S %</label>\n\n <label for=\"node-input-GALightHSV_S_State\" style=\"width:20px;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-GALightState\"></span></label>\n <input type=\"text\" id=\"node-input-GALightHSV_S_State\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightHSV_S_State\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightHSV_S_State\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightHSV_S_State\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightHSV_S_State\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n\n <!-- // HSV V Brightness change\n nameLightHSV_V_DIM: { value: \"\" },\n GALightHSV_V_DIM: { value: \"\" },\n dptLightHSV_V_DIM: { value: \"\" },\n nameLightHSV_V_State: { value: \"\" },\n GALightHSV_V_State: { value: \"\" },\n dptLightHSV_V_State: { value: \"\" }, -->\n <div class=\"form-row\">\n <label for=\"node-input-HSVDimSpeed\" style=\"width:260px\">\n <i class=\"fa fa-bolt\"></i> Dim Speed (ms)\n </label>\n <input type=\"text\" id=\"node-input-HSVDimSpeed\" placeholder='Default is 5000' style=\"width:210px\">\n </div>\n\n </p>\n </div>\n <div id=\"tabs-5\">\n <p>\n <div class=\"form-tips\" style=\"margin-bottom:6px;\">\n <i class=\"fa fa-circle-info\" style=\"color:forestgreen; margin-right:4px;\"></i>\n <span data-i18n=\"knxUltimateHueLight.effect_base_label\"></span>\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-nameLightBlink\" style=\"width:110px;\"><i class=\"fa fa-play-circle-o\"></i> Blink</label>\n\n <label for=\"node-input-GALightBlink\" style=\"width:20px;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-GALightState\"></span></label>\n <input type=\"text\" id=\"node-input-GALightBlink\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightBlink\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightBlink\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightBlink\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightBlink\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n\n <div id=\"divColorCycle\">\n <div class=\"form-row\">\n <label for=\"node-input-nameLightColorCycle\" style=\"width:110px;\"><i class=\"fa fa-play-circle-o\"></i> Color\n Cycle</label>\n\n <label for=\"node-input-GALightColorCycle\" style=\"width:20px;\"><span data-i18n=\"common.ga\"></span></label>\n <input type=\"text\" id=\"node-input-GALightColorCycle\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightColorCycle\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightColorCycle\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightColorCycle\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightColorCycle\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n </div>\n\n <hr style=\"margin:12px 0;\">\n\n <div id=\"divHueEffectsContainer\">\n <div class=\"form-tips\" style=\"margin-bottom:6px;\">\n <i class=\"fa fa-circle-info\" style=\"color:forestgreen; margin-right:4px;\"></i>\n <span data-i18n=\"knxUltimateHueLight.effect_native_label\"></span>\n </div>\n <div id=\"divHueEffectsNoSupport\" class=\"form-tips\" data-i18n=\"knxUltimateHueLight.effect_not_supported\" style=\"display:none;\"></div>\n <div id=\"divHueEffectsContent\" style=\"display:none;\">\n <div class=\"form-row\">\n <label for=\"node-input-nameLightEffect\" style=\"width:110px;\"><i class=\"fa fa-wand-magic-sparkles\"></i> <span data-i18n=\"knxUltimateHueLight.effect_command\"></span></label>\n\n <label for=\"node-input-GALightEffect\" style=\"width:20px;\"><span data-i18n=\"common.ga\"></span></label>\n <input type=\"text\" id=\"node-input-GALightEffect\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightEffect\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightEffect\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightEffect\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightEffect\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n\n <div class=\"form-row\">\n <label for=\"node-input-nameLightEffectStatus\" style=\"width:110px;\"><i class=\"fa fa-circle-info\"></i> <span data-i18n=\"knxUltimateHueLight.effect_status\"></span></label>\n\n <label for=\"node-input-GALightEffectStatus\" style=\"width:20px;\"><span data-i18n=\"common.ga\"></span></label>\n <input type=\"text\" id=\"node-input-GALightEffectStatus\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightEffectStatus\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightEffectStatus\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightEffectStatus\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightEffectStatus\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n\n <div class=\"form-row\" id=\"divEffectMappings\">\n <label style=\"width:110px;\"><i class=\"fa fa-list-check\"></i> <span data-i18n=\"knxUltimateHueLight.effect_mapping\"></span></label>\n <div style=\"margin-left:5px; width: calc(100% - 120px);\">\n <input type=\"hidden\" id=\"node-input-effectRules\">\n <ol id=\"node-input-effect-rule-container\" style=\"margin:0; padding:0;\"></ol>\n <div style=\"margin-top:5px;\">\n <button type=\"button\" id=\"node-input-effect-autofill\" class=\"red-ui-button\"><span data-i18n=\"knxUltimateHueLight.effect_autofill\"></span></button>\n </div>\n <div class=\"form-tips\">\n <i class=\"fa fa-circle-info\" style=\"color:forestgreen; margin-right:4px;\"></i>\n <span data-i18n=\"knxUltimateHueLight.effect_tip\"></span>\n </div>\n <div class=\"form-tips\">\n <i class=\"fa fa-circle-info\" style=\"color:forestgreen; margin-right:4px;\"></i>\n <span data-i18n=\"knxUltimateHueLight.effect_tip_status\"></span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </p>\n </div>\n <div id=\"tabs-6\">\n <p>\n <div class=\"form-row\">\n <label style=\"width:260px;\" for=\"node-input-readStatusAtStartup\"><i class=\"fa fa-question-circle\"></i> <span data-i18n=\"knxUltimateHueLight.read_status_startup\"></span></label>\n <select id=\"node-input-readStatusAtStartup\">\n <option value=\"no\" data-i18n=\"knxUltimateHueLight.opt_no\"></option>\n <option value=\"yes\" data-i18n=\"knxUltimateHueLight.opt_yes_emit\"></option>\n </select>\n </div>\n <div class=\"form-row\" id=\"divUpdateKNXBrightnessStatusOnHUEOnOff\">\n <label style=\"width:260px;\" for=\"node-input-updateKNXBrightnessStatusOnHUEOnOff\">\n <i class=\"fa fa-tag\"></i> <span data-i18n=\"knxUltimateHueLight.knx_brightness_status\"></span>\n </label>\n <select id=\"node-input-updateKNXBrightnessStatusOnHUEOnOff\">\n <option value=\"onhueoff\" data-i18n=\"knxUltimateHueLight.knx_brightness_onhueoff\"></option>\n <option value=\"no\" data-i18n=\"knxUltimateHueLight.knx_brightness_no\"></option>\n </select>\n </div>\n <div class=\"form-row\">\n <label style=\"width:260px;\" for=\"node-input-updateLocalStateFromKNXWrite\">\n <i class=\"fa fa-database\"></i> <span data-i18n=\"knxUltimateHueLight.update_local_state_from_knx_write\"></span>\n </label>\n <input type=\"checkbox\" id=\"node-input-updateLocalStateFromKNXWrite\" style=\"display:inline-block; width:auto; vertical-align:top;\" />\n </div>\n <div class=\"form-tips\" style=\"margin-left:260px;\" data-i18n=\"knxUltimateHueLight.update_local_state_from_knx_write_hint\"></div><br/>\n <div id =\"divBehaviourBrightness\">\n <div class=\"form-row\">\n <label for=\"node-input-specifySwitchOnBrightness\" style=\"width:260px;\">\n <i class=\"fa fa-tag\"></i> <span data-i18n=\"knxUltimateHueLight.switch_on_behaviour\"></span>\n </label>\n <select id=\"node-input-specifySwitchOnBrightness\">\n <option value=\"no\" data-i18n=\"knxUltimateHueLight.none\"></option>\n <option value=\"temperature\" data-i18n=\"knxUltimateHueLight.select_temperature_brightness\"></option>\n <option value=\"yes\" data-i18n=\"knxUltimateHueLight.select_color\"></option>\n </select>\n </div>\n\n <div class=\"form-row\" id=\"divColorsAtSwitchOn\">\n <label for=\"node-input-colorAtSwitchOnDayTime\" style=\"width:260px\">\n </label>\n <input type=\"hidden\" id=\"node-input-colorAtSwitchOnDayTime\">\n <input type=\"color\" id=\"colorPickerDay\" style=\"width:260px\">\n <button id=\"getColorAtSwitchOnDayTimeButton\" type=\"button\" class=\"red-ui-button\"><span data-i18n=\"knxUltimateHueLight.get_current\"></span></button>\n </div>\n <div class=\"form-row\" id=\"divTemperatureAtSwitchOn\" hidden>\n <label for=\"node-input-colorAtSwitchOnDayTime\" style=\"width:260px\">\n </label>\n <select style=\"width:12%;\" id=\"comboTemperatureAtSwitchOn\"></select>\n <select style=\"width:25%;\" id=\"comboBrightnessAtSwitchOn\"></select>\n </div>\n\n <div id=\"divCCSBoxAtNightLighting\">\n <div class=\"form-row\">\n <label for=\"node-input-enableDayNightLighting\" style=\"width:260px;\">\n <i class=\"fa fa-clone\"></i> <span data-i18n=\"knxUltimateHueLight.night_lighting\"></span>\n </label>\n <select id=\"node-input-enableDayNightLighting\">\n <option value=\"no\" data-i18n=\"knxUltimateHueLight.no_night_lighting\"></option>\n <!-- <option value=\"temperature\">Select temperature and brightness</option>\n <option value=\"yes\">Select color</option> -->\n </select>\n </div>\n\n <div id=\"divEnableDayNightLighting\">\n\n <div class=\"form-row\" id=\"divColorsAtSwitchOnNightTime\">\n <label for=\"node-input-colorAtSwitchOnNightTime\" style=\"width:260px\"></label>\n <input type=\"hidden\" id=\"node-input-colorAtSwitchOnNightTime\">\n <input type=\"color\" id=\"colorPickerNight\" style=\"width:260px\">\n <button id=\"getColorAtSwitchOnNightTimeButton\" type=\"button\" class=\"red-ui-button\"><span data-i18n=\"knxUltimateHueLight.get_current\"></span></button>\n </div>\n <div class=\"form-row\" id=\"divTemperatureAtSwitchOnNightTime\" hidden>\n <label for=\"node-input-colorAtSwitchOnNightTime\" style=\"width:260px\"></label>\n <select style=\"width:25%;\" id=\"comboTemperatureAtSwitchOnNightTime\"></select>\n <select style=\"width:25%;\" id=\"comboBrightnessAtSwitchOnNightTime\"></select>\n </div>\n\n <div class=\"form-row\">\n <label for=\"node-input-nameDaylightSensor\" style=\"width:110px;\"><i class=\"fa fa-clock-o\"></i>\n <span data-i18n=\"knxUltimateHueLight.day_night\"></span></label>\n <label for=\"node-input-GADaylightSensor\" style=\"width:20px;\"><span data-i18n=\"common.ga\"></span></label>\n <input type=\"text\" id=\"node-input-GADaylightSensor\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptDaylightSensor\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptDaylightSensor\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameDaylightSensor\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-name\"></span></label>\n <input type=\"text\" id=\"node-input-nameDaylightSensor\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n <div class=\"form-row\">\n <label style=\"width:170px\" for=\"node-input-invertDayNight\">\n <i class=\"fa fa-shuffle\"></i> <span data-i18n=\"knxUltimateHueLight.invert_day_night\"></span>\n </label>\n <input type=\"checkbox\" id=\"node-input-invertDayNight\"\n style=\"display:inline-block; width:auto; vertical-align:top;\" />\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-restoreDayMode\" style=\"width:260px;\">\n <i class=\"fa fa-circle\"></i> <span data-i18n=\"knxUltimateHueLight.override_night_mode\"></span>\n </label>\n <select id=\"node-input-restoreDayMode\">\n <option value=\"no\" data-i18n=\"knxUltimateHueLight.override_no\"></option>\n <option value=\"setDayByFastSwitchLightSingle\" data-i18n=\"knxUltimateHueLight.override_set_day_fast_this\"></option>\n <option value=\"setDayByFastSwitchLightALL\" data-i18n=\"knxUltimateHueLight.override_set_day_fast_all\"></option>\n </select>\n </div>\n </div>\n </div>\n <br/>\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-enableNodePINS\" style=\"width:260px;\">\n <i class=\"fa fa-circle\"></i> <span data-i18n=\"knxUltimateHueLight.node_pins\"></span>\n </label>\n <select id=\"node-input-enableNodePINS\">\n <option value=\"no\" data-i18n=\"knxUltimateHueLight.node_pins_hide\"></option>\n <option value=\"yes\" data-i18n=\"knxUltimateHueLight.node_pins_show\"></option>\n </select>\n </div>\n </p>\n </div>\n </div>\n </div>\n<br />",
|
|
9127
|
+
"light": "<!-- Canonical private HUE Controller template: light. -->\n<div class=\"form-row hue-legacy-controller-notice\" role=\"note\" style=\"box-sizing:border-box; padding:10px 12px; margin-bottom:14px; border-left:4px solid #d79b00; background:#fff8df; color:#4d3a00;\">\n <i class=\"fa fa-exclamation-triangle\" aria-hidden=\"true\" style=\"color:#a15c00; margin-right:6px;\"></i>\n <span data-i18n=\"node-red-contrib-knx-ultimate/knxUltimateHueController:knxUltimateHueController.legacy_node_notice\"></span>\n </div>\n <div class=\"form-row\" style=\"margin-bottom:10px;\">\n <span style=\"color:#ff0000\"><i class=\"fa fa-youtube\"></i></span> <a target=\"_blank\" href=\"https://www.youtube.com/playlist?list=PL9Yh1bjbLAYrU8PsVhW4xzEug2WtVFv3E\"><b>KNX-Ultimate video tutorials (YouTube playlist)</b></a>\n </div>\n <div id=\"mainWindow\">\n <div class=\"form-row\">\n <b><span data-i18n=\"knxUltimateHueLight.title\"></span></b>  <span style=\"color:red\"    <i class=\"fa fa-youtube\"></i></span> <a\n target=\"_blank\" href=\"https://youtu.be/jjEUI1J8bkA\"><u><span data-i18n=\"common.youtube_sample\"></span></u></a>\n <br />\n <br />\n <label for=\"node-input-server\">\n <img\n src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAKnRFWHRDcmVhdGlvbiBUaW1lAEZyIDYgQXVnIDIwMTAgMjE6NTI6MTkgKzAxMDD84aS8AAAAB3RJTUUH3gYYCicNV+4WIQAAAAlwSFlzAAALEgAACxIB0t1+/AAAAARnQU1BAACxjwv8YQUAAACUSURBVHjaY2CgFZg5c+Z/ZEyWAZ8+f/6/ZsWs/xoamqMGkGrA6Wla/1+fVARjEBuGsSoGmY4eZSCNL59d/g8DIDbIAHR14OgFGQByKjIGKX5+6/T///8gGMQGiV1+/B0Fg70GIkD+RMYgxf/O5/7//2MSmAZhkBi6OrgB6Bg5DGB4ajr3f2xqsYYLSDE2THJUDg0AAAqyDVd4tp4YAAAAAElFTkSuQmCC\"></img>\n <span data-i18n=\"common.knx_gw\"></span>\n </label>\n <input type=\"text\" id=\"node-input-server\" />\n </div>\n\n <div class=\"form-row\">\n <label for=\"node-input-serverHue\">\n <img\n src=\"data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAEKADAAQAAAABAAAAEAAAAAA0VXHyAAABFUlEQVQ4EZWSsWoCQRCG1yiENEFEi6QSkjqWWoqFoBYJ+Br6JHkMn8Iibd4ihQpaJIhWNkry/ZtdGZY78Qa+m39nZ+dm9s4550awglNBluS/gVtAX6KgDclf68w2OThgfR9iT/jnoEv4TtByDThWTCDKW4SSZTf/zj9/eZbN+izTDuKGimu0vPF8B/YN8aC8LmcOj/AAn9CFTEs70Js/oGqy79C69bqJ5XbQI2kGO5N8QL9D08S8zBtBF5ZaVsznpCMoqJnVdjTpb1Db0fwIWmQV6BLXzFOYgA6/gDVfQN9bBWp2J2hdWDPoBV5FrKnAJutHikk/CHHR8i7x4iG7qQ720IYvu3GFbpHjx3pFrOFYkA354z/5bkK826phyAAAAABJRU5ErkJggg==\" />\n <span data-i18n=\"common.hue_bridge\"></span>\n </label>\n <input type=\"text\" id=\"node-input-serverHue\" />\n </div>\n\n <br />\n <p>\n <b><span data-i18n=\"common.philips_hue\"></span></b>\n </p>\n\n <div class=\"form-row\">\n <label for=\"node-input-name\">\n <i class=\"fa fa-play-circle\"></i> <span data-i18n=\"common.name\"></span>\n </label>\n <input type=\"text\" id=\"node-input-name\" placeholder=\"Enter your hue device name\"\n style=\"flex:1 1 240px; min-width:240px; max-width:240px;\" />\n <button type=\"button\" class=\"red-ui-button hue-refresh-devices\"\n style=\"margin-left:6px; color:#1b7d33; border-color:#1b7d33;\" title=\"Refresh Hue devices\">\n <i class=\"fa fa-sync\"></i>\n </button>\n <button type=\"button\" class=\"red-ui-button hue-locate-device\"\n style=\"margin-left:6px; color:#ff9800; border-color:#ff9800;\" title=\"Locate selected Hue device\">\n <i class=\"fa fa-play\"></i>\n </button>\n <span class=\"hue-devices-loading\" style=\"margin-left:6px; display:none; color:#1b7d33;\">\n <i class=\"fa fa-circle-notch fa-spin\"></i>\n </span>\n <input type=\"hidden\" id=\"node-input-hueDevice\" />\n </div>\n\n <br />\n\n <div id=\"tabs\" style=\"display:none; width: 900px;\">\n <ul>\n <li><a href=\"#tabs-1\"><i class=\"fa-solid fa-toggle-on\"></i> <span data-i18n=\"knxUltimateHueLight.tabs.switch\"></span></a></li>\n <li><a href=\"#tabs-2\"><i class=\"fa-solid fa-arrow-up-wide-short\"></i> <span data-i18n=\"knxUltimateHueLight.tabs.dim\"></span></a></li>\n <li><a href=\"#tabs-3\"><i class=\"fa-solid fa-temperature-quarter\"></i> <span data-i18n=\"knxUltimateHueLight.tabs.tunable_white\"></span></a></li>\n <li><a href=\"#tabs-4\"><i class=\"fa-solid fa-palette\"></i> <span data-i18n=\"knxUltimateHueLight.tabs.rgb_hsv\"></span></a></li>\n <li><a href=\"#tabs-5\"><i class=\"fa-solid fa-heart-circle-check\"></i> <span data-i18n=\"knxUltimateHueLight.tabs.effects\"></span></a></li>\n <li><a href=\"#tabs-6\"><i class=\"fa-solid fa-code-merge\"></i> <span data-i18n=\"knxUltimateHueLight.tabs.behaviour\"></span></a></li>\n </ul>\n <div id=\"tabs-1\">\n <p>\n <div class=\"form-row\">\n <label for=\"node-input-nameLightSwitch\" style=\"width:110px;\"><i class=\"fa fa-play-circle-o\"></i> <span data-i18n=\"knxUltimateHueLight.control\"></span></label>\n\n <label for=\"node-input-GALightSwitch\" style=\"width:20px;\"><span data-i18n=\"common.ga\"></span></label>\n <input type=\"text\" id=\"node-input-GALightSwitch\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightSwitch\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightSwitch\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightSwitch\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightSwitch\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-nameLightState\" style=\"width:110px;\"><i class=\"fa fa-question-circle\"></i> <span data-i18n=\"knxUltimateHueLight.status\"></span></label>\n\n <label for=\"node-input-GALightState\" style=\"width:20px;\"><span data-i18n=\"common.ga\"></span></label>\n <input type=\"text\" id=\"node-input-GALightState\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightState\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightState\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightState\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightState\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n </p>\n </div>\n <div id=\"tabs-2\">\n <p>\n <img src=\"resources/node-red-contrib-knx-ultimate/dim.png\" style=\"width: 900px;\">\n <div class=\"form-row\">\n <label for=\"node-input-nameLightDIM\" style=\"width:110px;\"><i class=\"fa fa-play-circle-o\"></i> Control dim</label>\n\n <label for=\"node-input-GALightDIM\" style=\"width:20px;\"><span data-i18n=\"common.ga\"></span></label>\n <input type=\"text\" id=\"node-input-GALightDIM\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightDIM\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightDIM\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightDIM\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightDIM\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-nameLightBrightness\" style=\"width:110px;\"><i class=\"fa fa-play-circle-o\"></i> Control\n %</label>\n\n <label for=\"node-input-GALightBrightness\" style=\"width:20px;\"><span data-i18n=\"common.ga\"></span></label>\n <input type=\"text\" id=\"node-input-GALightBrightness\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightBrightness\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightBrightness\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightBrightness\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightBrightness\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n\n <div class=\"form-row\">\n <label for=\"node-input-nameLightBrightnessState\" style=\"width:110px;\"><i class=\"fa fa-question-circle\"></i> Status %</label>\n\n <label for=\"node-input-GALightBrightnessState\" style=\"width:20px;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-GALightState\"></span></label>\n <input type=\"text\" id=\"node-input-GALightBrightnessState\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightBrightnessState\"\n style=\"width:40px; margin-left: 0px; text-align: right;\">DPT</label>\n <select id=\"node-input-dptLightBrightnessState\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightBrightnessState\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightBrightnessState\"\n style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-dimSpeed\" style=\"width:260px\">\n <i class=\"fa fa-bolt\"></i> Dim Speed (ms)\n </label>\n <input type=\"text\" id=\"node-input-dimSpeed\" placeholder='Default is 5000' style=\"width:210px\">\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-minDimLevelLight\" style=\"width:260px;\">\n <i class=\"fa fa-clone\"></i> Min Dim Brightness\n </label>\n <select id=\"node-input-minDimLevelLight\">\n <option value=\"useHueLightLevel\" data-i18n=\"knxUltimateHueLight.use_min_brightness\"></option>\n </select>\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-maxDimLevelLight\" style=\"width:260px;\">\n <i class=\"fa fa-clone\"></i> Max Dim Brightness\n </label>\n <select id=\"node-input-maxDimLevelLight\"></select>\n </div>\n </p>\n </div>\n <div id=\"tabs-3\">\n <p>\n <img src=\"resources/node-red-contrib-knx-ultimate/tunablewhite.png\" style=\"width: 900px;\">\n <div class=\"form-row\">\n <label for=\"node-input-nameLightKelvinDIM\" style=\"width:110px;\"><i class=\"fa fa-play-circle-o\"></i> Control dim</label>\n\n <label for=\"node-input-GALightKelvinDIM\" style=\"width:20px;\"><span data-i18n=\"common.ga\"></span></label>\n <input type=\"text\" id=\"node-input-GALightKelvinDIM\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightKelvinDIM\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightKelvinDIM\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightKelvinDIM\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightKelvinDIM\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-nameLightKelvinPercentage\" style=\"width:110px;\"><i class=\"fa fa-play-circle-o\"></i> Control\n %</label>\n\n <label for=\"node-input-GALightKelvinPercentage\" style=\"width:20px;\"><span data-i18n=\"common.ga\"></span></label>\n <input type=\"text\" id=\"node-input-GALightKelvinPercentage\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightKelvinPercentage\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightKelvinPercentage\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightKelvinPercentage\"\n style=\"width:50px; margin-left: 0px; text-align: right;\">Name</label>\n <input type=\"text\" id=\"node-input-nameLightKelvinPercentage\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-nameLightKelvinPercentageState\" style=\"width:110px;\"><i class=\"fa fa-question-circle\"></i> Status\n %</label>\n\n <label for=\"node-input-GALightKelvinPercentageState\" style=\"width:20px;\"><span data-i18n=\"common.ga\"></span></label>\n <input type=\"text\" id=\"node-input-GALightKelvinPercentageState\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightKelvinPercentageState\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightKelvinPercentageState\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightKelvinPercentageState\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightKelvinPercentageState\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-nameLightKelvin\" style=\"width:110px;\"><i class=\"fa fa-play-circle-o\"></i> Control\n Kelvin</label>\n\n <label for=\"node-input-GALightKelvin\" style=\"width:20px;\"><span data-i18n=\"common.ga\"></span></label>\n <input type=\"text\" id=\"node-input-GALightKelvin\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightKelvin\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightKelvin\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightKelvin\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightKelvin\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-nameLightKelvinState\" style=\"width:110px;\"><i class=\"fa fa-question-circle\"></i> Status\n Kelvin</label>\n <label for=\"node-input-GALightKelvinState\" style=\"width:20px;\"><span data-i18n=\"common.ga\"></span></label>\n <input type=\"text\" id=\"node-input-GALightKelvinState\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightKelvinState\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightKelvinState\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightKelvinState\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightKelvinState\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n <div class=\"form-row\">\n <label style=\"width:170px\" for=\"node-input-invertDimTunableWhiteDirection\">\n <i class=\"fa fa-shuffle\"></i> Invert dim direction\n </label>\n <input type=\"checkbox\" id=\"node-input-invertDimTunableWhiteDirection\"\n style=\"display:inline-block; width:auto; vertical-align:top;\" />\n </div>\n </p>\n </div>\n <div id=\"tabs-4\">\n <p>\n <img src=\"resources/node-red-contrib-knx-ultimate/rgb.png\" style=\"width: 900px;\">\n <p><b> RGB section</b></p>\n <div class=\"form-row\">\n <label for=\"node-input-nameLightColor\" style=\"width:110px;\"><i class=\"fa fa-play-circle-o\"></i> Control rgb</label>\n\n <label for=\"node-input-GALightColor\" style=\"width:20px;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-GALightState\"></span></label>\n <input type=\"text\" id=\"node-input-GALightColor\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightColor\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightColor\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightColor\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightColor\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-nameLightColorState\" style=\"width:110px;\"><i class=\"fa fa-question-circle\"></i> Status rgb</label>\n\n <label for=\"node-input-GALightColorState\" style=\"width:20px;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-GALightState\"></span></label>\n <input type=\"text\" id=\"node-input-GALightColorState\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightColorState\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightColorState\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightColorState\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightColorState\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n\n <p><b> HSV section</b></p>\n <!-- // HSV Color change\n // nameLightHSV_H_DIM: { value: \"\" },\n // GALightHSV_H_DIM: { value: \"\" },\n // dptLightHSV_H_DIM: { value: \"\" }, -->\n <div class=\"form-row\">\n <label for=\"node-input-nameLightHSV_H_DIM\" style=\"width:110px;\"><i class=\"fa fa-play-circle-o\"></i> Control H dim</label>\n\n <label for=\"node-input-GALightHSV_H_DIM\" style=\"width:20px;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-GALightState\"></span></label>\n <input type=\"text\" id=\"node-input-GALightHSV_H_DIM\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightHSV_H_DIM\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightHSV_H_DIM\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightHSV_H_DIM\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightHSV_H_DIM\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-nameLightHSV_H_State\" style=\"width:110px;\"><i class=\"fa fa-question-circle\"></i> Status H %</label>\n\n <label for=\"node-input-GALightHSV_H_State\" style=\"width:20px;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-GALightState\"></span></label>\n <input type=\"text\" id=\"node-input-GALightHSV_H_State\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightHSV_H_State\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightHSV_H_State\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightHSV_H_State\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightHSV_H_State\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n\n <!-- // HSV Saturation change\n nameLightHSV_S_DIM: { value: \"\" },\n GALightHSV_S_DIM: { value: \"\" },\n dptLightHSV_S_DIM: { value: \"\" },\n nameLightHSV_S_State: { value: \"\" },\n GALightHSV_S_State: { value: \"\" },\n dptLightHSV_S_State: { value: \"\" }, -->\n <div class=\"form-row\">\n <label for=\"node-input-nameLightHSV_S_DIM\" style=\"width:110px;\"><i class=\"fa fa-play-circle-o\"></i> Control S dim</label>\n\n <label for=\"node-input-GALightHSV_S_DIM\" style=\"width:20px;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-GALightState\"></span></label>\n <input type=\"text\" id=\"node-input-GALightHSV_S_DIM\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightHSV_S_DIM\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightHSV_S_DIM\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightHSV_S_DIM\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightHSV_S_DIM\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-nameLightHSV_S_State\" style=\"width:110px;\"><i class=\"fa fa-question-circle\"></i> Status S %</label>\n\n <label for=\"node-input-GALightHSV_S_State\" style=\"width:20px;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-GALightState\"></span></label>\n <input type=\"text\" id=\"node-input-GALightHSV_S_State\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightHSV_S_State\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightHSV_S_State\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightHSV_S_State\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightHSV_S_State\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n\n <!-- // HSV V Brightness change\n nameLightHSV_V_DIM: { value: \"\" },\n GALightHSV_V_DIM: { value: \"\" },\n dptLightHSV_V_DIM: { value: \"\" },\n nameLightHSV_V_State: { value: \"\" },\n GALightHSV_V_State: { value: \"\" },\n dptLightHSV_V_State: { value: \"\" }, -->\n <div class=\"form-row\">\n <label for=\"node-input-HSVDimSpeed\" style=\"width:260px\">\n <i class=\"fa fa-bolt\"></i> Dim Speed (ms)\n </label>\n <input type=\"text\" id=\"node-input-HSVDimSpeed\" placeholder='Default is 5000' style=\"width:210px\">\n </div>\n\n </p>\n </div>\n <div id=\"tabs-5\">\n <p>\n <div class=\"form-tips\" style=\"margin-bottom:6px;\">\n <i class=\"fa fa-circle-info\" style=\"color:forestgreen; margin-right:4px;\"></i>\n <span data-i18n=\"knxUltimateHueLight.effect_base_label\"></span>\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-nameLightBlink\" style=\"width:110px;\"><i class=\"fa fa-play-circle-o\"></i> Blink</label>\n\n <label for=\"node-input-GALightBlink\" style=\"width:20px;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-GALightState\"></span></label>\n <input type=\"text\" id=\"node-input-GALightBlink\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightBlink\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightBlink\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightBlink\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightBlink\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n\n <div id=\"divColorCycle\">\n <div class=\"form-row\">\n <label for=\"node-input-nameLightColorCycle\" style=\"width:110px;\"><i class=\"fa fa-play-circle-o\"></i> Color\n Cycle</label>\n\n <label for=\"node-input-GALightColorCycle\" style=\"width:20px;\"><span data-i18n=\"common.ga\"></span></label>\n <input type=\"text\" id=\"node-input-GALightColorCycle\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightColorCycle\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightColorCycle\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightColorCycle\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightColorCycle\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n </div>\n\n <hr style=\"margin:12px 0;\">\n\n <div id=\"divHueEffectsContainer\">\n <div class=\"form-tips\" style=\"margin-bottom:6px;\">\n <i class=\"fa fa-circle-info\" style=\"color:forestgreen; margin-right:4px;\"></i>\n <span data-i18n=\"knxUltimateHueLight.effect_native_label\"></span>\n </div>\n <div id=\"divHueEffectsNoSupport\" class=\"form-tips\" data-i18n=\"knxUltimateHueLight.effect_not_supported\" style=\"display:none;\"></div>\n <div id=\"divHueEffectsContent\" style=\"display:none;\">\n <div class=\"form-row\">\n <label for=\"node-input-nameLightEffect\" style=\"width:110px;\"><i class=\"fa fa-wand-magic-sparkles\"></i> <span data-i18n=\"knxUltimateHueLight.effect_command\"></span></label>\n\n <label for=\"node-input-GALightEffect\" style=\"width:20px;\"><span data-i18n=\"common.ga\"></span></label>\n <input type=\"text\" id=\"node-input-GALightEffect\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightEffect\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightEffect\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightEffect\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightEffect\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n\n <div class=\"form-row\">\n <label for=\"node-input-nameLightEffectStatus\" style=\"width:110px;\"><i class=\"fa fa-circle-info\"></i> <span data-i18n=\"knxUltimateHueLight.effect_status\"></span></label>\n\n <label for=\"node-input-GALightEffectStatus\" style=\"width:20px;\"><span data-i18n=\"common.ga\"></span></label>\n <input type=\"text\" id=\"node-input-GALightEffectStatus\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptLightEffectStatus\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptLightEffectStatus\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameLightEffectStatus\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-name\"></span></label>\n <input type=\"text\" id=\"node-input-nameLightEffectStatus\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n\n <div class=\"form-row\" id=\"divEffectMappings\">\n <label style=\"width:110px;\"><i class=\"fa fa-list-check\"></i> <span data-i18n=\"knxUltimateHueLight.effect_mapping\"></span></label>\n <div style=\"margin-left:5px; width: calc(100% - 120px);\">\n <input type=\"hidden\" id=\"node-input-effectRules\">\n <ol id=\"node-input-effect-rule-container\" style=\"margin:0; padding:0;\"></ol>\n <div style=\"margin-top:5px;\">\n <button type=\"button\" id=\"node-input-effect-autofill\" class=\"red-ui-button\"><span data-i18n=\"knxUltimateHueLight.effect_autofill\"></span></button>\n </div>\n <div class=\"form-tips\">\n <i class=\"fa fa-circle-info\" style=\"color:forestgreen; margin-right:4px;\"></i>\n <span data-i18n=\"knxUltimateHueLight.effect_tip\"></span>\n </div>\n <div class=\"form-tips\">\n <i class=\"fa fa-circle-info\" style=\"color:forestgreen; margin-right:4px;\"></i>\n <span data-i18n=\"knxUltimateHueLight.effect_tip_status\"></span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </p>\n </div>\n <div id=\"tabs-6\">\n <p>\n <div class=\"form-row\">\n <label style=\"width:260px;\" for=\"node-input-readStatusAtStartup\"><i class=\"fa fa-question-circle\"></i> <span data-i18n=\"knxUltimateHueLight.read_status_startup\"></span></label>\n <select id=\"node-input-readStatusAtStartup\">\n <option value=\"no\" data-i18n=\"knxUltimateHueLight.opt_no\"></option>\n <option value=\"yes\" data-i18n=\"knxUltimateHueLight.opt_yes_emit\"></option>\n </select>\n </div>\n <div class=\"form-row\" id=\"divUpdateKNXBrightnessStatusOnHUEOnOff\">\n <label style=\"width:260px;\" for=\"node-input-updateKNXBrightnessStatusOnHUEOnOff\">\n <i class=\"fa fa-tag\"></i> <span data-i18n=\"knxUltimateHueLight.knx_brightness_status\"></span>\n </label>\n <select id=\"node-input-updateKNXBrightnessStatusOnHUEOnOff\">\n <option value=\"onhueoff\" data-i18n=\"knxUltimateHueLight.knx_brightness_onhueoff\"></option>\n <option value=\"no\" data-i18n=\"knxUltimateHueLight.knx_brightness_no\"></option>\n </select>\n </div>\n <div class=\"form-row\">\n <label style=\"width:260px;\" for=\"node-input-updateLocalStateFromKNXWrite\">\n <i class=\"fa fa-database\"></i> <span data-i18n=\"knxUltimateHueLight.update_local_state_from_knx_write\"></span>\n </label>\n <input type=\"checkbox\" id=\"node-input-updateLocalStateFromKNXWrite\" style=\"display:inline-block; width:auto; vertical-align:top;\" />\n </div>\n <div class=\"form-tips\" style=\"margin-left:260px;\" data-i18n=\"knxUltimateHueLight.update_local_state_from_knx_write_hint\"></div><br/>\n <div id =\"divBehaviourBrightness\">\n <div class=\"form-row\">\n <label for=\"node-input-specifySwitchOnBrightness\" style=\"width:260px;\">\n <i class=\"fa fa-tag\"></i> <span data-i18n=\"knxUltimateHueLight.switch_on_behaviour\"></span>\n </label>\n <select id=\"node-input-specifySwitchOnBrightness\">\n <option value=\"no\" data-i18n=\"knxUltimateHueLight.none\"></option>\n <option value=\"temperature\" data-i18n=\"knxUltimateHueLight.select_temperature_brightness\"></option>\n <option value=\"yes\" data-i18n=\"knxUltimateHueLight.select_color\"></option>\n </select>\n </div>\n\n <div class=\"form-row\" id=\"divColorsAtSwitchOn\">\n <label for=\"node-input-colorAtSwitchOnDayTime\" style=\"width:260px\">\n </label>\n <input type=\"hidden\" id=\"node-input-colorAtSwitchOnDayTime\">\n <input type=\"color\" id=\"colorPickerDay\" style=\"width:260px\">\n <button id=\"getColorAtSwitchOnDayTimeButton\" type=\"button\" class=\"red-ui-button\"><span data-i18n=\"knxUltimateHueLight.get_current\"></span></button>\n </div>\n <div class=\"form-row\" id=\"divTemperatureAtSwitchOn\" hidden>\n <label for=\"node-input-colorAtSwitchOnDayTime\" style=\"width:260px\">\n </label>\n <select style=\"width:12%;\" id=\"comboTemperatureAtSwitchOn\"></select>\n <select style=\"width:25%;\" id=\"comboBrightnessAtSwitchOn\"></select>\n </div>\n\n <div id=\"divCCSBoxAtNightLighting\">\n <div class=\"form-row\">\n <label for=\"node-input-enableDayNightLighting\" style=\"width:260px;\">\n <i class=\"fa fa-clone\"></i> <span data-i18n=\"knxUltimateHueLight.night_lighting\"></span>\n </label>\n <select id=\"node-input-enableDayNightLighting\">\n <option value=\"no\" data-i18n=\"knxUltimateHueLight.no_night_lighting\"></option>\n <!-- <option value=\"temperature\">Select temperature and brightness</option>\n <option value=\"yes\">Select color</option> -->\n </select>\n </div>\n\n <div id=\"divEnableDayNightLighting\">\n\n <div class=\"form-row\" id=\"divColorsAtSwitchOnNightTime\">\n <label for=\"node-input-colorAtSwitchOnNightTime\" style=\"width:260px\"></label>\n <input type=\"hidden\" id=\"node-input-colorAtSwitchOnNightTime\">\n <input type=\"color\" id=\"colorPickerNight\" style=\"width:260px\">\n <button id=\"getColorAtSwitchOnNightTimeButton\" type=\"button\" class=\"red-ui-button\"><span data-i18n=\"knxUltimateHueLight.get_current\"></span></button>\n </div>\n <div class=\"form-row\" id=\"divTemperatureAtSwitchOnNightTime\" hidden>\n <label for=\"node-input-colorAtSwitchOnNightTime\" style=\"width:260px\"></label>\n <select style=\"width:25%;\" id=\"comboTemperatureAtSwitchOnNightTime\"></select>\n <select style=\"width:25%;\" id=\"comboBrightnessAtSwitchOnNightTime\"></select>\n </div>\n\n <div class=\"form-row\">\n <label for=\"node-input-nameDaylightSensor\" style=\"width:110px;\"><i class=\"fa fa-clock-o\"></i>\n <span data-i18n=\"knxUltimateHueLight.day_night\"></span></label>\n <label for=\"node-input-GADaylightSensor\" style=\"width:20px;\"><span data-i18n=\"common.ga\"></span></label>\n <input type=\"text\" id=\"node-input-GADaylightSensor\" placeholder=\"Ex: 1/1/1\"\n style=\"width:70px;margin-left: 5px; text-align: left;\">\n\n <label for=\"node-input-dptDaylightSensor\" style=\"width:40px; margin-left: 0px; text-align: right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptDaylightSensor\" style=\"width:140px;\"></select>\n\n <label for=\"node-input-nameDaylightSensor\" style=\"width:50px; margin-left: 0px; text-align: right;\"><span\n data-i18n=\"knxUltimateHueLight.node-input-name\"></span></label>\n <input type=\"text\" id=\"node-input-nameDaylightSensor\" style=\"width:190px;margin-left: 5px; text-align: left;\">\n </div>\n <div class=\"form-row\">\n <label style=\"width:170px\" for=\"node-input-invertDayNight\">\n <i class=\"fa fa-shuffle\"></i> <span data-i18n=\"knxUltimateHueLight.invert_day_night\"></span>\n </label>\n <input type=\"checkbox\" id=\"node-input-invertDayNight\"\n style=\"display:inline-block; width:auto; vertical-align:top;\" />\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-restoreDayMode\" style=\"width:260px;\">\n <i class=\"fa fa-circle\"></i> <span data-i18n=\"knxUltimateHueLight.override_night_mode\"></span>\n </label>\n <select id=\"node-input-restoreDayMode\">\n <option value=\"no\" data-i18n=\"knxUltimateHueLight.override_no\"></option>\n <option value=\"setDayByFastSwitchLightSingle\" data-i18n=\"knxUltimateHueLight.override_set_day_fast_this\"></option>\n <option value=\"setDayByFastSwitchLightALL\" data-i18n=\"knxUltimateHueLight.override_set_day_fast_all\"></option>\n </select>\n </div>\n </div>\n </div>\n <br/>\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-enableNodePINS\" style=\"width:260px;\">\n <i class=\"fa fa-circle\"></i> <span data-i18n=\"knxUltimateHueLight.node_pins\"></span>\n </label>\n <select id=\"node-input-enableNodePINS\">\n <option value=\"no\" data-i18n=\"knxUltimateHueLight.node_pins_hide\"></option>\n <option value=\"yes\" data-i18n=\"knxUltimateHueLight.node_pins_show\"></option>\n </select>\n </div>\n </p>\n </div>\n </div>\n </div>\n<br />",
|
|
9225
9128
|
"plug": "<!-- Canonical private HUE Controller template: plug. -->\n<div class=\"form-row hue-legacy-controller-notice\" role=\"note\" style=\"box-sizing:border-box; padding:10px 12px; margin-bottom:14px; border-left:4px solid #d79b00; background:#fff8df; color:#4d3a00;\">\n <i class=\"fa fa-exclamation-triangle\" aria-hidden=\"true\" style=\"color:#a15c00; margin-right:6px;\"></i>\n <span data-i18n=\"node-red-contrib-knx-ultimate/knxUltimateHueController:knxUltimateHueController.legacy_node_notice\"></span>\n </div>\n <div class=\"form-row\" style=\"margin-bottom:10px;\">\n <span style=\"color:#ff0000\"><i class=\"fa fa-youtube\"></i></span> <a target=\"_blank\" href=\"https://www.youtube.com/playlist?list=PL9Yh1bjbLAYrU8PsVhW4xzEug2WtVFv3E\"><b>KNX-Ultimate video tutorials (YouTube playlist)</b></a>\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-server\">\n <img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAKnRFWHRDcmVhdGlvbiBUaW1lAEZyIDYgQXVnIDIwMTAgMjE6NTI6MTkgKzAxMDD84aS8AAAAB3RJTUUH3gYYCicNV+4WIQAAAAlwSFlzAAALEgAACxIB0t1+/AAAAARnQU1BAACxjwv8YQUAAACUSURBVHjaY2CgFZg5c+Z/ZEyWAZ8+f/6/ZsWs/xoamqMGkGrA6Wla/1+fVARjEBuGsSoGmY4eZSCNL59d/g8DIDbIAHR14OgFGQByKjIGKX5+6/T///8gGMQGiV1+/B0Fg70GIkD+RMYgxf/O5/7//2MSmAZhkBi6OrgB6Bg5DGB4ajr3f2xqsYYLSDE2THJUDg0AAAqyDVd4tp4YAAAAAElFTkSuQmCC\" />\n <span data-i18n=\"common.knx_gw\"></span>\n </label>\n <input type=\"text\" id=\"node-input-server\">\n </div>\n\n <div class=\"form-row\">\n <label for=\"node-input-serverHue\">\n <img src=\"data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAEKADAAQAAAABAAAAEAAAAAA0VXHyAAABFUlEQVQ4EZWSsWoCQRCG1yiENEFEi6QSkjqWWoqFoBYJ+Br6JHkMn8Iibd4ihQpaJIhWNkry/ZtdGZY78Qa+m39nZ+dm9s4550awglNBluS/gVtAX6KgDclf68w2OThgfR9iT/jnoEv4TtByDThWTCDKW4SSZTf/zj9/eZbN+izTDuKGimu0vPF8B/YN8aC8LmcOj/AAn9CFTEs70Js/oGqy79C69bqJ5XbQI2kGO5N8QL9D08S8zBtBF5ZaVsznpCMoqJnVdjTpb1Db0fwIWmQV6BLXzFOYgA6/gDVfQN9bBWp2J2hdWDPoBV5FrKnAJutHikk/CHHR8i7x4iG7qQ720IYvu3GFbpHjx3pFrOFYkA354z/5bkK826phyAAAAABJRU5ErkJggg==\"/>\n <span data-i18n=\"common.hue_bridge\"></span>\n </label>\n <input type=\"text\" id=\"node-input-serverHue\">\n </div>\n\n <div class=\"form-row hue-requires-bridge\">\n <label for=\"node-input-name\">\n <i class=\"fa fa-tag\"></i> <span data-i18n=\"common.name\"></span>\n </label>\n <input type=\"text\" id=\"node-input-name\" placeholder=\"Hue plug name\" style=\"flex:1 1 240px; min-width:240px; max-width:240px;\">\n <button type=\"button\" class=\"red-ui-button hue-refresh-devices\" style=\"margin-left:6px; color:#1b7d33; border-color:#1b7d33;\">\n <i class=\"fa fa-sync\"></i>\n </button>\n <span class=\"hue-devices-loading\" style=\"margin-left:6px; display:none; color:#1b7d33;\">\n <i class=\"fa fa-circle-notch fa-spin\"></i>\n </span>\n </div>\n\n <div id=\"tabs\">\n <ul>\n <li><a href=\"#tabs-1\"><i class=\"fa-solid fa-toggle-on\"></i> <span data-i18n=\"knxUltimateHuePlug.tabs.switch\"></span></a></li>\n <li><a href=\"#tabs-2\"><i class=\"fa-solid fa-gear\"></i> <span data-i18n=\"knxUltimateHuePlug.tabs.behaviour\"></span></a></li>\n </ul>\n\n <div id=\"tabs-1\">\n <div class=\"form-tips hue-form-tip hue-knx-section\">\n <i class=\"fa fa-circle-info\"></i>\n <span data-i18n=\"knxUltimateHuePlug.switch_info\"></span>\n </div>\n <div class=\"form-row hue-knx-section\">\n <label for=\"node-input-namePlugSwitch\" style=\"width:120px;\">\n <i class=\"fa fa-play-circle\"></i> <span data-i18n=\"knxUltimateHuePlug.switch_control\"></span>\n </label>\n <label for=\"node-input-GAPlugSwitch\" style=\"width:20px;\"><span data-i18n=\"common.ga\"></span></label>\n <input type=\"text\" id=\"node-input-GAPlugSwitch\" placeholder=\"1/1/1\" style=\"width:80px; text-align:left;\">\n <label for=\"node-input-dptPlugSwitch\" style=\"width:40px; text-align:right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptPlugSwitch\" style=\"width:140px;\"></select>\n <label for=\"node-input-namePlugSwitch\" style=\"width:60px; text-align:right;\"><span data-i18n=\"knxUltimateHuePlug.node-input-name\"></span></label>\n <input type=\"text\" id=\"node-input-namePlugSwitch\" style=\"width:200px; text-align:left;\">\n </div>\n\n <div class=\"form-row hue-knx-section\">\n <label for=\"node-input-namePlugState\" style=\"width:120px;\">\n <i class=\"fa fa-circle-info\"></i> <span data-i18n=\"knxUltimateHuePlug.switch_status\"></span>\n </label>\n <label for=\"node-input-GAPlugState\" style=\"width:20px;\"><span data-i18n=\"common.ga\"></span></label>\n <input type=\"text\" id=\"node-input-GAPlugState\" placeholder=\"1/1/2\" style=\"width:80px; text-align:left;\">\n <label for=\"node-input-dptPlugState\" style=\"width:40px; text-align:right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptPlugState\" style=\"width:140px;\"></select>\n <label for=\"node-input-namePlugState\" style=\"width:60px; text-align:right;\"><span data-i18n=\"knxUltimateHuePlug.node-input-name\"></span></label>\n <input type=\"text\" id=\"node-input-namePlugState\" style=\"width:200px; text-align:left;\">\n </div>\n\n <div class=\"form-tips hue-form-tip hue-knx-section\">\n <i class=\"fa fa-circle-info\"></i>\n <span data-i18n=\"knxUltimateHuePlug.power_state_info\"></span>\n </div>\n <div class=\"form-row hue-knx-section\">\n <label for=\"node-input-namePlugPowerState\" style=\"width:120px;\">\n <i class=\"fa fa-bolt\"></i> <span data-i18n=\"knxUltimateHuePlug.power_state\"></span>\n </label>\n <label for=\"node-input-GAPlugPowerState\" style=\"width:20px;\"><span data-i18n=\"common.ga\"></span></label>\n <input type=\"text\" id=\"node-input-GAPlugPowerState\" placeholder=\"1/1/3\" style=\"width:80px; text-align:left;\">\n <label for=\"node-input-dptPlugPowerState\" style=\"width:40px; text-align:right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptPlugPowerState\" style=\"width:140px;\"></select>\n <label for=\"node-input-namePlugPowerState\" style=\"width:60px; text-align:right;\"><span data-i18n=\"knxUltimateHuePlug.node-input-name\"></span></label>\n <input type=\"text\" id=\"node-input-namePlugPowerState\" style=\"width:200px; text-align:left;\">\n </div>\n </div>\n\n <div id=\"tabs-2\">\n <div class=\"form-row\">\n <label for=\"node-input-readStatusAtStartup\" style=\"width:220px;\">\n <i class=\"fa fa-question-circle\"></i> <span data-i18n=\"knxUltimateHuePlug.read_status_startup\"></span>\n </label>\n <select id=\"node-input-readStatusAtStartup\" style=\"width:120px;\">\n <option value=\"yes\" data-i18n=\"knxUltimateHuePlug.opt_yes_emit\"></option>\n <option value=\"no\" data-i18n=\"knxUltimateHuePlug.opt_no\"></option>\n </select>\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-enableNodePINS\" style=\"width:220px;\">\n <i class=\"fa fa-code\"></i> <span data-i18n=\"knxUltimateHuePlug.node_pins\"></span>\n </label>\n <select id=\"node-input-enableNodePINS\" style=\"width:120px;\">\n <option value=\"no\" data-i18n=\"knxUltimateHuePlug.node_pins_hide\"></option>\n <option value=\"yes\" data-i18n=\"knxUltimateHuePlug.node_pins_show\"></option>\n </select>\n <div class=\"form-tips hue-form-tip\" style=\"margin-left:4px; display:none;\">\n <i class=\"fa fa-circle-info\"></i>\n <span data-i18n=\"knxUltimateHuePlug.node_pins_help\"></span>\n </div>\n </div>\n </div>\n </div>\n\n <input type=\"hidden\" id=\"node-input-hueDevice\">",
|
|
9226
9129
|
"button": "<!-- Canonical private HUE Controller template: button. -->\n<div class=\"form-row hue-legacy-controller-notice\" role=\"note\" style=\"box-sizing:border-box; padding:10px 12px; margin-bottom:14px; border-left:4px solid #d79b00; background:#fff8df; color:#4d3a00;\">\n <i class=\"fa fa-exclamation-triangle\" aria-hidden=\"true\" style=\"color:#a15c00; margin-right:6px;\"></i>\n <span data-i18n=\"node-red-contrib-knx-ultimate/knxUltimateHueController:knxUltimateHueController.legacy_node_notice\"></span>\n </div>\n <div class=\"form-row\" style=\"margin-bottom:10px;\">\n <span style=\"color:#ff0000\"><i class=\"fa fa-youtube\"></i></span> <a target=\"_blank\" href=\"https://www.youtube.com/playlist?list=PL9Yh1bjbLAYrU8PsVhW4xzEug2WtVFv3E\"><b>KNX-Ultimate video tutorials (YouTube playlist)</b></a>\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-server\">\n <img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAKnRFWHRDcmVhdGlvbiBUaW1lAEZyIDYgQXVnIDIwMTAgMjE6NTI6MTkgKzAxMDD84aS8AAAAB3RJTUUH3gYYCicNV+4WIQAAAAlwSFlzAAALEgAACxIB0t1+/AAAAARnQU1BAACxjwv8YQUAAACUSURBVHjaY2CgFZg5c+Z/ZEyWAZ8+f/6/ZsWs/xoamqMGkGrA6Wla/1+fVARjEBuGsSoGmY4eZSCNL59d/g8DIDbIAHR14OgFGQByKjIGKX5+6/T///8gGMQGiV1+/B0Fg70GIkD+RMYgxf/O5/7//2MSmAZhkBi6OrgB6Bg5DGB4ajr3f2xqsYYLSDE2THJUDg0AAAqyDVd4tp4YAAAAAElFTkSuQmCC\" />\n <span data-i18n=\"common.knx_gw\"></span>\n </label>\n <input type=\"text\" id=\"node-input-server\">\n </div>\n\n <div class=\"form-row\">\n <label for=\"node-input-serverHue\">\n <img src=\"data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAEKADAAQAAAABAAAAEAAAAAA0VXHyAAABFUlEQVQ4EZWSsWoCQRCG1yiENEFEi6QSkjqWWoqFoBYJ+Br6JHkMn8Iibd4ihQpaJIhWNkry/ZtdGZY78Qa+m39nZ+dm9s4550awglNBluS/gVtAX6KgDclf68w2OThgfR9iT/jnoEv4TtByDThWTCDKW4SSZTf/zj9/eZbN+izTDuKGimu0vPF8B/YN8aC8LmcOj/AAn9CFTEs70Js/oGqy79C69bqJ5XbQI2kGO5N8QL9D08S8zBtBF5ZaVsznpCMoqJnVdjTpb1Db0fwIWmQV6BLXzFOYgA6/gDVfQN9bBWp2J2hdWDPoBV5FrKnAJutHikk/CHHR8i7x4iG7qQ720IYvu3GFbpHjx3pFrOFYkA354z/5bkK826phyAAAAABJRU5ErkJggg==\"/>\n <span data-i18n=\"common.hue_bridge\"></span>\n </label>\n <input type=\"text\" id=\"node-input-serverHue\">\n </div>\n\n <div class=\"form-row hue-requires-bridge\">\n <label for=\"node-input-name\">\n <i class=\"fa fa-tag\"></i> <span data-i18n=\"knxUltimateHueButton.hue_sensor\"></span>\n </label>\n <input type=\"text\" id=\"node-input-name\" placeholder=\"Hue button\" style=\"flex:1 1 240px; min-width:240px; max-width:240px;\">\n <button type=\"button\" class=\"red-ui-button hue-refresh-devices\" style=\"margin-left:6px; color:#1b7d33; border-color:#1b7d33;\">\n <i class=\"fa fa-sync\"></i>\n </button>\n <span class=\"hue-devices-loading\" style=\"margin-left:6px; display:none; color:#1b7d33;\">\n <i class=\"fa fa-circle-notch fa-spin\"></i>\n </span>\n </div>\n\n <div id=\"hue-button-tabs\">\n <ul>\n <li><a href=\"#hue-button-tab-switch\"><i class=\"fa fa-toggle-on\"></i> <span data-i18n=\"knxUltimateHueButton.tabs.switch\"></span></a></li>\n <li><a href=\"#hue-button-tab-dim\"><i class=\"fa fa-sun\"></i> <span data-i18n=\"knxUltimateHueButton.tabs.dim\"></span></a></li>\n <li><a href=\"#hue-button-tab-behaviour\"><i class=\"fa fa-gear\"></i> <span data-i18n=\"knxUltimateHueButton.tabs.behaviour\"></span></a></li>\n </ul>\n\n <div id=\"hue-button-tab-switch\">\n <div class=\"form-tips hue-form-tip hue-knx-section\">\n <i class=\"fa fa-circle-info\"></i>\n <span data-i18n=\"knxUltimateHueButton.switch_info\"></span>\n </div>\n <div class=\"form-row hue-knx-section\">\n <label for=\"node-input-GAshort_release\" style=\"width:70px;\"><span data-i18n=\"common.ga\"></span></label>\n <input type=\"text\" id=\"node-input-GAshort_release\" style=\"width:80px; text-align:left;\" placeholder=\"1/1/1\">\n <label for=\"node-input-dptshort_release\" style=\"width:40px; text-align:right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptshort_release\" style=\"width:120px;\"></select>\n <label for=\"node-input-nameshort_release\" style=\"width:50px; text-align:right;\"><span data-i18n=\"common.name\"></span></label>\n <input type=\"text\" id=\"node-input-nameshort_release\" style=\"flex:1 1 140px; min-width:120px; text-align:left;\" placeholder=\"Switch action\">\n </div>\n <div class=\"form-row hue-knx-section hue-status-row\">\n <label for=\"node-input-GAshort_releaseStatus\" style=\"width:70px;\"><span data-i18n=\"knxUltimateHueButton.switch_status\"></span></label>\n <input type=\"text\" id=\"node-input-GAshort_releaseStatus\" style=\"width:80px; text-align:left;\" placeholder=\"1/1/2\">\n <label for=\"node-input-dptshort_releaseStatus\" style=\"width:40px; text-align:right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptshort_releaseStatus\" style=\"width:120px;\"></select>\n <label for=\"node-input-nameshort_releaseStatus\" style=\"width:50px; text-align:right;\"><span data-i18n=\"common.name\"></span></label>\n <input type=\"text\" id=\"node-input-nameshort_releaseStatus\" style=\"flex:1 1 140px; min-width:120px; text-align:left;\" placeholder=\"Switch status\">\n </div>\n </div>\n\n <div id=\"hue-button-tab-dim\">\n <div class=\"form-tips hue-form-tip hue-knx-section\">\n <i class=\"fa fa-circle-info\"></i>\n <span data-i18n=\"knxUltimateHueButton.dim_info\"></span>\n </div>\n <div class=\"form-row hue-knx-section\">\n <label for=\"node-input-GArepeat\" style=\"width:70px;\"><span data-i18n=\"common.ga\"></span></label>\n <input type=\"text\" id=\"node-input-GArepeat\" style=\"width:80px; text-align:left;\" placeholder=\"1/1/3\">\n <label for=\"node-input-dptrepeat\" style=\"width:40px; text-align:right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptrepeat\" style=\"width:120px;\"></select>\n <label for=\"node-input-nameDim\" style=\"width:50px; text-align:right;\"><span data-i18n=\"common.name\"></span></label>\n <input type=\"text\" id=\"node-input-nameDim\" style=\"flex:1 1 140px; min-width:120px; text-align:left;\" placeholder=\"Dim action\">\n </div>\n </div>\n\n <div id=\"hue-button-tab-behaviour\">\n <div class=\"form-tips hue-form-tip\">\n <i class=\"fa fa-circle-info\"></i>\n <span data-i18n=\"knxUltimateHueButton.behaviour_info\"></span>\n </div>\n <div class=\"form-row\">\n <input type=\"checkbox\" id=\"node-input-toggleValues\" style=\"width:auto;\">\n <label for=\"node-input-toggleValues\" style=\"flex:1 1 auto;\">\n <span data-i18n=\"knxUltimateHueButton.toggle_values\"></span>\n </label>\n </div>\n <div class=\"form-row hue-status-row\" style=\"margin-left:24px;\">\n <span data-i18n=\"knxUltimateHueButton.toggle_values_hint\"></span>\n </div>\n <div class=\"hue-fixed-values\" style=\"margin-top:8px;\">\n <div class=\"form-row\">\n <label for=\"node-input-switchSend\" style=\"width:130px;\"><span data-i18n=\"knxUltimateHueButton.switch_send\"></span></label>\n <input type=\"text\" id=\"node-input-switchSend\" style=\"width:160px;\">\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-dimSend\" style=\"width:130px;\"><span data-i18n=\"knxUltimateHueButton.dim_send\"></span></label>\n <input type=\"text\" id=\"node-input-dimSend\" style=\"width:160px;\">\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"form-tips hue-form-tip hue-output-info\" style=\"display:none;\">\n <i class=\"fa fa-circle-info\"></i>\n <span data-i18n=\"knxUltimateHueButton.output_info\"></span>\n </div>\n\n <input type=\"hidden\" id=\"node-input-hueDevice\">",
|
|
9227
9130
|
"relative_rotary": "<!-- Canonical private HUE Controller template: relative_rotary. -->\n<div class=\"form-row hue-legacy-controller-notice\" role=\"note\" style=\"box-sizing:border-box; padding:10px 12px; margin-bottom:14px; border-left:4px solid #d79b00; background:#fff8df; color:#4d3a00;\">\n <i class=\"fa fa-exclamation-triangle\" aria-hidden=\"true\" style=\"color:#a15c00; margin-right:6px;\"></i>\n <span data-i18n=\"node-red-contrib-knx-ultimate/knxUltimateHueController:knxUltimateHueController.legacy_node_notice\"></span>\n </div>\n <div class=\"form-row\" style=\"margin-bottom:10px;\">\n <span style=\"color:#ff0000\"><i class=\"fa fa-youtube\"></i></span> <a target=\"_blank\" href=\"https://www.youtube.com/playlist?list=PL9Yh1bjbLAYrU8PsVhW4xzEug2WtVFv3E\"><b>KNX-Ultimate video tutorials (YouTube playlist)</b></a>\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-server\">\n <img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAKnRFWHRDcmVhdGlvbiBUaW1lAEZyIDYgQXVnIDIwMTAgMjE6NTI6MTkgKzAxMDD84aS8AAAAB3RJTUUH3gYYCicNV+4WIQAAAAlwSFlzAAALEgAACxIB0t1+/AAAAARnQU1BAACxjwv8YQUAAACUSURBVHjaY2CgFZg5c+Z/ZEyWAZ8+f/6/ZsWs/xoamqMGkGrA6Wla/1+fVARjEBuGsSoGmY4eZSCNL59d/g8DIDbIAHR14OgFGQByKjIGKX5+6/T///8gGMQGiV1+/B0Fg70GIkD+RMYgxf/O5/7//2MSmAZhkBi6OrgB6Bg5DGB4ajr3f2xqsYYLSDE2THJUDg0AAAqyDVd4tp4YAAAAAElFTkSuQmCC\" />\n <span data-i18n=\"common.knx_gw\"></span>\n </label>\n <input type=\"text\" id=\"node-input-server\">\n </div>\n\n <div class=\"form-row\">\n <label for=\"node-input-serverHue\">\n <img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAEKADAAQAAAABAAAAEAAAAAA0VXHyAAABFUlEQVQ4EZWSsWoCQRCG1yiENEFEi6QSkjqWWoqFoBYJ+Br6JHkMn8Iibd4ihQpaJIhWNkry/ZtdGZY78Qa+m39nZ+dm9s4550awglNBluS/gVtAX6KgDclf68w2OThgfR9iT/jnoEv4TtByDThWTCDKW4SSZTf/zj9/eZbN+izTDuKGimu0vPF8B/YN8aC8LmcOj/AAn9CFTEs70Js/oGqy79C69bqJ5XbQI2kGO5N8QL9D08S8zBtBF5ZaVsznpCMoqJnVdjTpb1Db0fwIWmQV6BLXzFOYgA6/gDVfQN9bBWp2J2hdWDPoBV5FrKnAJutHikk/CHHR8i7x4iG7qQ720IYvu3GFbpHjx3pFrOFYkA354z/5bkK826phyAAAAABJRU5ErkJggg==\"/>\n <span data-i18n=\"common.hue_bridge\"></span>\n </label>\n <input type=\"text\" id=\"node-input-serverHue\">\n </div>\n\n <div class=\"form-row hue-requires-bridge\">\n <label for=\"node-input-name\">\n <i class=\"fa fa-rotate-right\"></i> <span data-i18n=\"knxUltimateHueTapDial.hue_device\"></span>\n </label>\n <input type=\"text\" id=\"node-input-name\" placeholder=\"Hue Tap dial\" style=\"flex:1 1 240px; min-width:240px; max-width:240px;\">\n <button type=\"button\" class=\"red-ui-button hue-refresh-devices\" style=\"margin-left:6px; color:#1b7d33; border-color:#1b7d33;\">\n <i class=\"fa fa-sync\"></i>\n </button>\n <span class=\"hue-devices-loading\" style=\"margin-left:6px; display:none; color:#1b7d33;\">\n <i class=\"fa fa-circle-notch fa-spin\"></i>\n </span>\n </div>\n\n <div id=\"hue-tapdial-tabs\">\n <ul>\n <li><a href=\"#hue-tapdial-tab-mapping\"><i class=\"fa fa-map\"></i> <span data-i18n=\"knxUltimateHueTapDial.tabs.mapping\"></span></a></li>\n <li><a href=\"#hue-tapdial-tab-behaviour\"><i class=\"fa fa-gear\"></i> <span data-i18n=\"knxUltimateHueTapDial.tabs.behaviour\"></span></a></li>\n </ul>\n\n <div id=\"hue-tapdial-tab-mapping\">\n <div class=\"form-tips hue-form-tip hue-knx-section\">\n <i class=\"fa fa-circle-info\"></i>\n <span data-i18n=\"knxUltimateHueTapDial.mapping_info\"></span>\n </div>\n <div class=\"form-row hue-knx-section\">\n <label for=\"node-input-GArepeat\" style=\"width:70px;\"><span data-i18n=\"common.ga\"></span></label>\n <input type=\"text\" id=\"node-input-GArepeat\" placeholder=\"1/1/1\" style=\"width:80px; text-align:left;\">\n <label for=\"node-input-dptrepeat\" style=\"width:40px; text-align:right;\"><span data-i18n=\"common.dpt\"></span></label>\n <select id=\"node-input-dptrepeat\" style=\"width:130px;\"></select>\n <label for=\"node-input-namerepeat\" style=\"width:50px; text-align:right;\"><span data-i18n=\"common.name\"></span></label>\n <input type=\"text\" id=\"node-input-namerepeat\" style=\"flex:1 1 140px; min-width:120px; text-align:left;\" placeholder=\"Rotation\">\n </div>\n </div>\n\n <div id=\"hue-tapdial-tab-behaviour\">\n <div class=\"form-tips hue-form-tip\">\n <i class=\"fa fa-circle-info\"></i>\n <span data-i18n=\"knxUltimateHueTapDial.behaviour_info\"></span>\n </div>\n <div class=\"form-row\">\n <label for=\"node-input-enableNodePINS\" style=\"width:220px;\">\n <i class=\"fa fa-code\"></i> <span data-i18n=\"knxUltimateHueTapDial.node_pins\"></span>\n </label>\n <select id=\"node-input-enableNodePINS\" style=\"width:200px;\">\n <option value=\"yes\" data-i18n=\"knxUltimateHueTapDial.node_pins_show\"></option>\n <option value=\"no\" data-i18n=\"knxUltimateHueTapDial.node_pins_hide\"></option>\n </select>\n </div>\n </div>\n </div>\n\n <div class=\"form-tips hue-form-tip hue-output-info\" style=\"display:none;\">\n <i class=\"fa fa-circle-info\"></i>\n <span data-i18n=\"knxUltimateHueTapDial.output_info\"></span>\n </div>\n\n <input type=\"hidden\" id=\"node-input-hueDevice\">",
|