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.
271 lines (231 loc) • 11.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('knxUltimateHueContactSensor', {
category: 'KNX Ultimate',
color: '#C0C7E9',
defaults: {
//buttonState: {value: true},
server: { type: 'knxUltimate-config', required: false },
serverHue: { type: 'hue-config', required: true },
name: { value: '' },
namecontact: { value: '' },
GAcontact: { value: '' },
dptcontact: { value: '' },
hueDevice: { value: '' },
},
inputs: 0,
outputs: 1,
icon: 'node-hue-icon.svg',
label: function () {
return (this.name || 'Hue Contact Sensor')
},
paletteLabel: 'Hue Contact 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) {
}
})
// 31/03/2020 Search Helper
function fullSearch(sourceText, searchString) {
// This searches for all words in a string
var aSearchWords = searchString.toLowerCase().split(' ')
var i = 0
for (let index = 0; index < aSearchWords.length; index++) {
if (sourceText.toLowerCase().indexOf(aSearchWords[index]) > -1) i += 1
}
return i == aSearchWords.length
}
// DPT
// ########################
$.getJSON('knxUltimateDpts?serverId=' + $('#node-input-server').val(), (data) => {
data.forEach(dpt => {
if (dpt.value.startsWith('1.')) {
$('#node-input-dptcontact').append($('<option></option>')
.attr('value', dpt.value)
.text(dpt.text))
}
})
$('#node-input-dptcontact').val(this.dptcontact)
})
// Autocomplete suggestion with ETS csv File
$('#node-input-GAcontact').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 + ' 1.')) {
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-namecontact').val(sDevName)
var optVal = $('#node-input-dptcontact option:contains(\'' + ui.item.label.split('#')[2].trim() + '\')').attr('value')
// Select the option value
$('#node-input-dptcontact').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=contact&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="knxUltimateHueContactSensor">
<div class="form-row">
<b>HUE Motion 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-regular fa-door-open fa-shake 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-namecontact" style="width:100px;"><i class="fa fa-play-circle-o"></i> Contact</span></label>
<label for="node-input-GAcontact" style="width:20px;">GA</label>
<input type="text" id="node-input-GAcontact" placeholder="Ex: 1/1/1"
style="width:70px;margin-left: 5px; text-align: left;">
<label for="node-input-dptcontact" style="width:40px; margin-left: 0px; text-align: right;">DPT</label>
<select id="node-input-dptcontact" style="width:140px;"></select>
<label for="node-input-namecontact" style="width:50px; margin-left: 0px; text-align: right;">Name</label>
<input type="text" id="node-input-namecontact" style="width:200px;margin-left: 5px; text-align: left;">
</div>
<br />
<br />
<br />
</script>
<script type="text/markdown" data-help-name="knxUltimateHueContactSensor">
<p>This node lets you get the events from your HUE contact sensor.</p>
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.
**General**
|Property|Description|
|--|--|
| KNX GW | Select the KNX gateway to be used |
| HUE Bridge | Select the HUE Bridge to be used |
| Hue Sensor | HUE contact sensor to be used. The avaiable contact sensors start showing up while you're typing.|
|Property|Description|
|--|--|
| Contact | As soon as a contact sensor is being open/closed, a *true* KNX value is sent to this group address, otherwise *false* is sent. |
### Outputs
1. Standard output
: payload (boolean) : 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 device so you can use it for whatever you want.
</script>