node-red-contrib-knx-ultimate
Version:
Control your KNX 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.
274 lines (224 loc) • 11.3 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('knxUltimateHueTemperatureSensor', {
category: "KNX Ultimate",
color: '#C0C7E9',
defaults: {
//buttonState: {value: true},
server: { type: "knxUltimate-config", required: false },
serverHue: { type: "hue-config", required: true },
name: { value: "" },
nametemperaturesensor: { value: "" },
GAtemperaturesensor: { value: "" },
dpttemperaturesensor: { value: "" },
readStatusAtStartup: { value: "yes" },
hueDevice: { value: "" }
},
inputs: 0,
outputs: 1,
icon: "node-hue-icon.svg",
label: function () {
return (this.name);
},
paletteLabel: "Hue Temperature Sensor",
// 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
// ########################
$.getJSON('knxUltimateDpts?serverId=' + $("#node-input-server").val(), (data) => {
data.forEach(dpt => {
if (dpt.value.startsWith("9.001")) {
$("#node-input-dpttemperaturesensor").append($("<option></option>")
.attr("value", dpt.value)
.text(dpt.text))
}
});
$("#node-input-dpttemperaturesensor").val(this.dpttemperaturesensor)
})
// Autocomplete suggestion with ETS csv File
$("#node-input-GAtemperaturesensor").autocomplete({
minLength: 0,
source: function (request, response) {
//$.getJSON("csv", request, function( data, status, xhr ) {
$.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 + " 9.001")) {
return {
label: value.ga + " # " + value.devicename + " # " + value.dpt, // Label for Display
value: value.ga // Value
}
} 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-nametemperaturesensor').val(sDevName);
var optVal = $("#node-input-dpttemperaturesensor option:contains('" + ui.item.label.split("#")[2].trim() + "')").attr('value');
// Select the option value
$("#node-input-dpttemperaturesensor").val(optVal);
}
}).focus(function () {
$(this).autocomplete('search', $(this).val() + 'exactmatch');
});
// ########################
// Autocomplete suggestion with HUE
$("#node-input-name").autocomplete({
minLength: 0,
source: function (request, response) {
$.getJSON("KNXUltimateGetResourcesHUE?rtype=temperature&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="knxUltimateHueTemperatureSensor">
<div class="form-row">
<b>HUE Temperature Sensor node</b>  <span style="color:red"
 <i class="fa fa-youtube"></i></span> <a target="_blank" href="https://youtu.be/jjEUI1J8bkA"><u>Youtube sample</u></a>
<br />
<br />
<p align="center">
<i class="fa-solid fa-temperature-full fa-beat 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>
KNX GW
</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=="/>
HUE Bridge
</label>
<input type="text" id="node-input-serverHue" />
</div>
<br/>
<p>
<b>Philips HUE</b>
</p>
<div class="form-row">
<label for="node-input-hueDevice" >
<i class="fa fa-play-circle"></i> Hue Sensor</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-nametemperaturesensor" style="width:100px;"><i class="fa fa-play-circle-o"></i> Temp °C</span></label>
<label for="node-input-GAtemperaturesensor" style="width:20px;">GA</label>
<input type="text" id="node-input-GAtemperaturesensor" placeholder="Ex: 1/1/1" style="width:70px;margin-left: 5px; text-align: left;">
<label for="node-input-dpttemperaturesensor" style="width:40px; margin-left: 0px; text-align: right;">DPT</label>
<select id="node-input-dpttemperaturesensor" style="width:140px;"></select>
<label for="node-input-nametemperaturesensor" style="width:50px; margin-left: 0px; text-align: right;">Name</label>
<input type="text" id="node-input-nametemperaturesensor" style="width:200px;margin-left: 5px; text-align: left;">
</div>
<br/>
<div class="form-row">
<label style="width:180px" for="node-input-readStatusAtStartup"><i class="fa fa-play-circle"></i> Read status at startup</label>
<select id="node-input-readStatusAtStartup">
<option value="no">No</option>
<option value="yes">Yes, and emit KNX telegrams.</option>
</select>
</div>
<br/>
<br/>
<br/>
</script>
<script type="text/markdown" data-help-name="knxUltimateHueTemperatureSensor">
<p>This node lets you get the events from your HUE temperature device. Here you can get the HUE temperature events, that represents a celsius value, evetytime the ambient temp changes. Start typing in the GA field, the name or group address of your KNX device, the avaiable devices start showing up while you're typing.</p>
**General**
|Property|Description|
|--|--|
| KNX GW | Select the KNX gateway to be used |
| HUE Bridge | Select the HUE Bridge to be used |
| Hue Sensor | HUE sensor to be used. The avaiable buttons start showing up while you're typing.|
| Read status at startup | Read the status at startup and emit the event to the KNX bus at startup/reconnection.
(Default "no")|
**KNX**
|Property|Description|
|--|--|
| Temp | temperature value, in Celsius degrees |
### Outputs
1. Standard output
: payload (integer) : the standard output of the command.
### Details
`msg.payload` is used as the payload of the published message.
It contains the detailed event sent by your Hue devicem so you can use it for whatever you want.
</script>