UNPKG

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
<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&nbsp&nbsp</b> <span style="color:red">&nbsp<i class="fa fa-youtube"></i>&nbsp</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>&nbspHue 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>