node-red-contrib-knx-ultimate
Version:
Control your KNX and KNX Secure intallation via Node-Red! A bunch of KNX nodes, with integrated Philips HUE control and ETS group address importer. Easy to use and highly configurable.
239 lines (195 loc) • 10.1 kB
HTML
<script type="text/javascript" src="resources/node-red-contrib-knx-ultimate/11f26b4500.js"></script>
<script type="text/javascript" src="resources/node-red-contrib-knx-ultimate/htmlUtils.js"></script>
<script type="text/javascript">
RED.nodes.registerType('knxUltimateHueTapDial', {
category: "KNX Ultimate",
color: '#C0C7E9',
defaults: {
//buttonState: {value: true},
server: { type: "knxUltimate-config", required: false },
serverHue: { type: "hue-config", required: true },
name: { value: "" },
namerepeat: { value: "" },
GArepeat: { value: "" },
dptrepeat: { value: "" },
hueDevice: { value: "" }
},
inputs: 0,
outputs: 1,
icon: "node-hue-icon.svg",
label: function () {
return (this.name);
},
paletteLabel: "Hue Tap Dial",
// button: {
// enabled: function() {
// // return whether or not the button is enabled, based on the current
// // configuration of the node
// return !this.changed
// },
// visible: function() {
// // return whether or not the button is visible, based on the current
// // configuration of the node
// return this.hasButton
// },
// //toggle: "buttonState",
// onclick: function() {}
// },
oneditprepare: function () {
// Go to the help panel
try {
RED.sidebar.show("help");
} catch (error) { }
var node = this;
var oNodeServer = RED.nodes.node($("#node-input-server").val()); // Store the config-node
var oNodeServerHue = RED.nodes.node($("#node-input-serverHue").val()); // Store the config-node
// 19/02/2020 Used to get the server sooner als deploy.
$("#node-input-server").change(function () {
try {
oNodeServer = RED.nodes.node($(this).val());
} catch (error) { }
});
// 19/02/2020 Used to get the server sooner als deploy.
$("#node-input-serverHue").change(function () {
try {
oNodeServerHue = RED.nodes.node($(this).val());
} catch (error) { }
});
// DPT repeat
// ########################
$.getJSON('knxUltimateDpts?serverId=' + $("#node-input-server").val(), (data) => {
data.forEach(dpt => {
if (dpt.value.startsWith("3.007") || dpt.value.startsWith("5.001") || dpt.value.startsWith("232.600")) {
$("#node-input-dptrepeat").append($("<option></option>")
.attr("value", dpt.value)
.text(dpt.text))
}
});
$("#node-input-dptrepeat").val(this.dptrepeat)
})
// Autocomplete suggestion with ETS csv File
$("#node-input-GArepeat").autocomplete({
minLength: 0,
source: function (request, response) {
$.getJSON("knxUltimatecsv?nodeID=" + oNodeServer.id, (data) => {
response($.map(data, function (value, key) {
var sSearch = (value.ga + " (" + value.devicename + ") DPT" + value.dpt);
if (htmlUtilsfullCSVSearch(sSearch, request.term)) {
if (value.dpt.startsWith('5.001') || value.dpt.startsWith('3.007') || value.dpt.startsWith("232.600")) {
return {
label: value.ga + " # " + value.devicename + " # " + value.dpt, // Label for Display
value: value.ga // Value
}
} else { return null; }
} else {
return null;
}
}));
});
}, select: function (event, ui) {
// Sets Datapoint and device name automatically
var sDevName = ui.item.label.split("#")[1].trim();
try {
sDevName = sDevName.substr(sDevName.indexOf(")") + 1).trim();
} catch (error) {
}
$('#node-input-namerepeat').val(sDevName);
var optVal = $("#node-input-dptrepeat option:contains('" + ui.item.label.split("#")[2].trim() + "')").attr('value');
// Select the option value
$("#node-input-dptrepeat").val(optVal);
}
}).focus(function () {
$(this).autocomplete('search', $(this).val() + 'exactmatch');
});
try { if (oNodeServer && oNodeServer.id) KNX_enableSecureFormatting($("#node-input-GArepeat"), oNodeServer.id); } catch (e) {}
// Autocomplete suggestion with HUE
$("#node-input-name").autocomplete({
minLength: 0,
source: function (request, response) {
$.getJSON("KNXUltimateGetResourcesHUE?rtype=relative_rotary&serverId=" + oNodeServerHue.id, (data) => {
response($.map(data.devices, function (value, key) {
//alert(JSON.stringify(value) + " "+ key)
var sSearch = (value.name);
if (htmlUtilsfullCSVSearch(sSearch, request.term)) {
return {
hueDevice: value.id, // Label for Display
value: value.name // Value
}
} else {
return null;
}
}));
});
}, select: function (event, ui) {
// Sets the fields
$('#node-input-hueDevice').val(ui.item.hueDevice);
}
}).focus(function () {
$(this).autocomplete('search', $(this).val() + 'exactmatch');
});
// ########################
},
oneditsave: function () {
// Return to the info tab
try {
RED.sidebar.show("info");
} catch (error) { }
},
oneditcancel: function () {
// Return to the info tab
try {
RED.sidebar.show("info");
} catch (error) { }
}
})
</script>
<script type="text/html" data-template-name="knxUltimateHueTapDial">
<div class="form-row">
<b><span data-i18n="knxUltimateHueTapDial.title"></span></b>  <span style="color:red"
 <i class="fa fa-youtube"></i></span> <a target="_blank" href="https://youtu.be/jjEUI1J8bkA"><u><span data-i18n="common.youtube_sample"></span></u></a>
<br />
<br />
<p align="center">
<i class="fa-solid fa-circle-notch fa-spin fa-4x"></i>
</p>
<br />
<label for="node-input-server" >
<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"></img>
<span data-i18n="common.knx_gw"></span>
</label>
<input type="text" id="node-input-server" />
</div>
<div class="form-row">
<label for="node-input-serverHue">
<img src="data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAEKADAAQAAAABAAAAEAAAAAA0VXHyAAABFUlEQVQ4EZWSsWoCQRCG1yiENEFEi6QSkjqWWoqFoBYJ+Br6JHkMn8Iibd4ihQpaJIhWNkry/ZtdGZY78Qa+m39nZ+dm9s4550awglNBluS/gVtAX6KgDclf68w2OThgfR9iT/jnoEv4TtByDThWTCDKW4SSZTf/zj9/eZbN+izTDuKGimu0vPF8B/YN8aC8LmcOj/AAn9CFTEs70Js/oGqy79C69bqJ5XbQI2kGO5N8QL9D08S8zBtBF5ZaVsznpCMoqJnVdjTpb1Db0fwIWmQV6BLXzFOYgA6/gDVfQN9bBWp2J2hdWDPoBV5FrKnAJutHikk/CHHR8i7x4iG7qQ720IYvu3GFbpHjx3pFrOFYkA354z/5bkK826phyAAAAABJRU5ErkJggg=="/>
<span data-i18n="common.hue_bridge"></span>
</label>
<input type="text" id="node-input-serverHue" />
</div>
<br/>
<p>
<b><span data-i18n="common.philips_hue"></span></b>
</p>
<div class="form-row">
<label for="node-input-hueDevice" >
<i class="fa fa-play-circle"></i> Hue Device</label>
<input type="text" id="node-input-name" placeholder="Enter your hue device name" />
<input type="hidden" id="node-input-hueDevice" />
</div>
<br/>
<p>
<b>KNX</b>
</p>
<div class="form-row">
<label for="node-input-namerepeat" style="width:100px;"><i class="fa fa-play-circle-o"></i> Rotate</span></label>
<label for="node-input-GArepeat" style="width:20px;"><span data-i18n="common.ga"></span></label>
<input type="text" id="node-input-GArepeat" placeholder="Ex: 1/1/1" style="width:70px;margin-left: 5px; text-align: left;">
<label for="node-input-dptrepeat" style="width:40px; margin-left: 0px; text-align: right;"><span data-i18n="common.dpt"></span></label>
<select id="node-input-dptrepeat" style="width:140px;"></select>
<label for="node-input-namerepeat" style="width:50px; margin-left: 0px; text-align: right;"><span data-i18n="common.name"></span></label>
<input type="text" id="node-input-namerepeat" style="width:200px;margin-left: 5px; text-align: left;">
</div>
<br/>
<br/>
<br/>
</script>