From d7787c79c09a2a03dcc5f0f77a893d14594fc6b2 Mon Sep 17 00:00:00 2001 From: Raoul <79988187+raoulvm@users.noreply.github.com> Date: Fri, 7 Apr 2023 13:17:34 +0200 Subject: [PATCH] v0.4.3 fix knxd DPT type conversion for DPT5.001 --- CHANGELOG.md | 10 +- README.md | 79 ++++++--- knx_config.json | 7 +- knx_config.json.md | 4 - lib/addins/GiraAwningActuator.js | 248 +++++++++++++------------- lib/addins/GiraJalousieActuator.js | 274 ++++++++++++++--------------- lib/customServiceAPI.js | 6 +- package-lock.json | 85 --------- package.json | 2 +- 9 files changed, 329 insertions(+), 386 deletions(-) delete mode 100644 package-lock.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f1b5f9..ae136fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,12 @@ # Changelog + +## 0.4.3 +- merged PR #198 (Update WindowCoveringTilt.js) by @EyeOfTheStorm +- merged PR #204 (Update GarageDoorOpenerAdvanced.js) by @christof-fersch +- fix knxd DPT type conversion, was overrun by #194 (Fixes for knxjs integration) in the case that handlers with `KNXObjects` were present. +- accordingly update GiraJalousieActuator +- removed the documentation of the built-in web server, as the most functionality is either gone (restart homebridge) and/or covered by the homebridge GUI now (webserver is still there but will be removed) + ## 0.4.2 - fix undefined variable name @@ -31,7 +39,7 @@ Example in the config file (e.g. in Homebridge GUI): } ] ``` -- quite a while back @jendrik found some issues and fixed them. They have been in the master branch ever since but not properly honored or published in a release. +- quite a while back @jendrik found some issues and fixed them. They have been in the master branch ever since but not properly honored or published in a release. PR #194 also contain sthe fixes for using `knxjs` instead of the `eibd` module to talk to other KNX routers than `knxd` ## 0.3.27 - @CyberChris79 found a breaking change in HAP-nodeJS (the HAP protocol implementation which homebridge is build on) which broke the tiny web server that can display HAP Services and such (see https://github.com/snowdd1/homebridge-knx#looking-up-service-types-and-characteristics) *Note to self: the webserver implementation is ugly and has grown too much for kind-of inline code in index.js* diff --git a/README.md b/README.md index 0377d58..7256409 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# homebridge-knx Version 0.3 +# homebridge-knx Version 0.4 [![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url][![Dependency status][david-dm-image]][david-dm-url] KNX platform shim for homebridge. @@ -8,19 +8,61 @@ Please also visit [homebridge github homepage](https://github.com/nfarina/homebr Latest to homebridge-knx changes can be found in the [CHANGELOG.md](CHANGELOG.md) -### This can only be used with homebridge >=0.4.28 and Node >=10.19.0 +### This can only be used with homebridge >=1.0 and Node >=10.19.0 ### Prerequisites -This node module requires a running (and properly configured) **knx daemon (knxd)**. You can find the latest version [here](https://github.com/knxd/knxd). +This node module requires either + - a running (and properly configured) **knx daemon (knxd)**. You can find the latest version [here](https://github.com/knxd/knxd). + - another KNX router which can be reached by KNX multicasts. + I cannot support the knxd. Please address issues directly at the [knxd issue pages](https://github.com/knxd/knxd/issues). It might help to search the existing issues, as your problem might have been solved already. ### Installation and running -- Install homebridge first, [see there](https://github.com/nfarina/homebridge); nfarina recommends a global install as super user. It's a server tool, so we can safely assume that the person that installes it is sufficiently priviledged to do so. `sudo npm install -g homebridge` -- then install this package to `` directory you want; If you installed homebridge globally I recommend to do so with homebridge-knx: `sudo npm install -g homebridge-knx` -- configure homebridge and its plugins. You might start by copying the [`KNX-sample-config.json`](https://github.com/snowdd1/homebridge-knx/blob/master/KNX-sample-config.json) to a new folder `.homebridge` in your user folder (on a default installation raspberry, it's `/home/pi`) and rename it to config.json -- Then put the configuration file*knx_config.json* into `~/.homebridge`, and adapt them to your needs (knxd address and some test devices in `knx_config.json`). You do not need a `platform` section in `config.json`any more! +- Install homebridge first, from [https://homebridge.io/](https://homebridge.io/); +- Once you have your instance running (without any devices yet), go to the `Plugins` tab and type `knx` in the search box +- `homebridge-knx` should be within the top five hits (yes, there are alternatives), please check the name before installing +- Then put the configuration file *knx_config.json* into `~/.homebridge` (or another folder to your liking, but it should be reaadable and writable by user `homebridge` or group `homebridge` which is created by the homebridge installer), and adapt them to your needs (knxd address and some test devices in `knx_config.json`) - Eliminate everything (especially all group addresses) that might harm your KNX installation. Sending bus telegrams to your alarm device might wake the neighbourhood unpleasantly! -- when done, start homebridge with `homebridge`. If you have chosen a local install, go to the homebridge folder and do a `bin/homebridge --plugin-path /homebridge-knx` with the path to the homebridge-knx installation. +- If you used the dfeault paths (~/.homebridge/knx_config.json) you can just restart homebridge using the GUI +- If you didn't, or want to use child bridges for more accessories (than 149) you need to configure homebridge (using the GUI e.g.). The following sample is from my test installation + +```json +{ + "bridge": { + "name": "Homebridge 17AF", + "username": "0E:0B:9B:24:17:AD", + "port": 51485, + "pin": "880-83-869", + "advertiser": "avahi" + }, + "accessories": [], + "platforms": [ + { + "name": "Config", + "port": 8581, + "auth": "form", + "theme": "auto", + "tempUnits": "c", + "lang": "en", + "platform": "config" + }, + { + "name": "KNX", + "platform": "KNX", + "config_path": "/home/pi/homebridge/dg-knx_config.json" + }, + { + "name": "KNX", + "platform": "KNX", + "config_path": "/home/pi/homebridge/og-knx_config.json", + "_bridge": { + "username": "0E:0B:9B:24:17:00", + "port": 51490 + } + } + ] +} +``` # Assumptions @@ -35,31 +77,14 @@ Float | DPT9 # knx_config.json -See the [complete Doc!](https://github.com/snowdd1/homebridge-knx/blob/plugin-2.0/knx_config.json.md). +See the [complete Doc!](https://github.com/snowdd1/homebridge-knx/blob/master/knx_config.json.md). # Add-ins -Add-in (aka "handlers") can change the default behavior. [See the article](https://github.com/snowdd1/homebridge-knx/blob/plugin-2.0/handler-add-in.md) +Add-in (aka "handlers") can change the default behavior. [See the article](https://github.com/snowdd1/homebridge-knx/blob/master/handler-add-in.md) Happy testing! -# Removing stale accessories from homebridge cache -The new (well, 1/2016) API of homebridge allows homebridge to cache the accessories for platforms that can add or remove accessories during runtime. As a next step in evolution, homebridge-knx already connects to that API. - -**Allow homebridge-knx to start the webserver by adding `"AllowWebserver":true,` at the beginning of your knx_config.json!** - -As a consequence remain devices, that homebridge-knx does not reconnnect to at start-up, stale and unreachable in HomeKit. To remove those shadows from HomeKit, use the little web server at `:18081/list`. You might change the web server port with `"WebserverPort":18082` or whatever port suits you. - -![image](https://cloud.githubusercontent.com/assets/11786396/19836160/5d1ddcde-9e98-11e6-8dc2-e621aceb1055.png) -Clicking on the `delete from cache` link will **only** remove the devices from the current homebridge instance and their cache, **not** from the *knx_config.json*, that means they will be rediscovered upon next startup as new device in the default room! - -# Looking up service types and characteristics -If you have the webserver enabled (see above), you can get an auto-generated web-page with all the service types and their characteristics from homebridge. See the links at the bottom of your server's list page. - - -# Killing homebridge -Deprecated. Use the homebridge GUI to do that. - [npm-url]: https://npmjs.org/package/homebridge-knx [downloads-image]: http://img.shields.io/npm/dm/homebridge-knx.svg diff --git a/knx_config.json b/knx_config.json index 98a5285..5d40c7b 100644 --- a/knx_config.json +++ b/knx_config.json @@ -2,8 +2,6 @@ "knxconnection": "knxd", "knxd_ip": "192.168.178.212", "knxd_port": 6720, - "AllowWebserver": true, - "WebserverPort": 18082, "Devices": [ { "DeviceName": "Arbeitszimmerlampe", @@ -68,7 +66,7 @@ } ] }, - { + { "DeviceName": "TestDevice", "hint": "Sample to show characteristics without KNX addresses", "Services": [ @@ -89,5 +87,4 @@ } ], "GroupAddresses": [] - -} +} \ No newline at end of file diff --git a/knx_config.json.md b/knx_config.json.md index ce973a3..d5fa116 100644 --- a/knx_config.json.md +++ b/knx_config.json.md @@ -6,8 +6,6 @@ homebridge-knx expects the following structure in the `knx_config.json`: "knxconnection": "knxjs", "knxd_ip": "192.168.1.1", "knxd_port": 6720, - "AllowWebserver": true, - "AllowKillHomebridge": false, "Devices": [ ] } @@ -15,8 +13,6 @@ homebridge-knx expects the following structure in the `knx_config.json`: `knxconnection` if set to "knxjs" then [javascript based knx multicast](https://www.npmjs.com/package/knx) routing is used, set to any other value or non-existent will default to knxd `192.168.1.1` has to be changed to your [knxd](https://github.com/knxd/knxd) installation, and `6720` to the port you are using (6720 is default). `platform` and `name` have become obsolete. -`AllowWebserver`: if set to true, homebridge-knx will start a tiny webserver on port 18081 to allow the removal of devices from homebridge cache (and the running instance). Enable for debugging, disable for secure productive operation! -`AllowKillHomebridge`: if set to true, you'll get a link at the tiny web browser allowing to force a shutdown of homebridge by throwing an exception. You should reset that to false after debugging, because it allows anyone with access to the webserver to shut down your homebridge instance. `Devices` is an array of objects, each representing an *homekit accessory*. diff --git a/lib/addins/GiraAwningActuator.js b/lib/addins/GiraAwningActuator.js index f3f9dea..e56944c 100644 --- a/lib/addins/GiraAwningActuator.js +++ b/lib/addins/GiraAwningActuator.js @@ -18,139 +18,139 @@ var log = require('debug')('GiraAwningActuator'); */ class GiraAwningActuator extends HandlerPattern { - /******************************************************************************************************************* - * onKNXValueChange is invoked if a Bus value for one of the bound addresses is received - * - */ - onKNXValueChange(field, oldValue, knxValue) { - // value for HomeKit - var newValue; - log('INFO: onKNXValueChange(' + field + ", "+ oldValue + ", "+ knxValue+ ")"); - if (field==="TargetPosition") { - // TargetPosition is DPT5.001 Percentage (0..100) - // need to convert to (0..100) first - // Homekit is using %-open, meaning 0% is closed/down - - newValue = knxValue; - - if (newValue>this.myAPI.getValue("CurrentPosition")) { - // newValue is higher, awning's moving out - this.myAPI.setValue("PositionState", 1); // - } else if (newValuelastPos) { - // newValue is higher, shutter's moving up - this.myAPI.setValue("PositionState", 1); //up - } else if (newValue this.myAPI.getValue("CurrentPosition")) { + // newValue is higher, awning's moving out + this.myAPI.setValue("PositionState", 1); // + } else if (newValue < this.myAPI.getValue("CurrentPosition")) { + // newValue is higher, shutter's moving in + this.myAPI.setValue("PositionState", 0); // + } + this.myAPI.setValue("TargetPosition", newValue); + if (this.timer) { + // avoid resetting Target Position through a timer + clearTimeout(this.timer); + this.timer = undefined; + } + this.lastCommand = 'target'; + } else if (field === "CurrentPosition") { + // Current Position is sent by the actuator if the Movement has stopped a new postion is reached + + // CurrentPosition is DPT5.001 Percentage (0..100) + // need to convert to (0..100) first + // Homekit is using %-open, meaning 0% is closed/down + newValue = knxValue; + + this.myAPI.setValue("CurrentPosition", newValue); // inform homekit + this.myAPI.setValue("PositionState", 2); //stopped + + if (this.lastCommand === 'move') { + // return to stopped immediately, and set the Target to Current + this.myAPI.setValue("TargetPosition", this.myAPI.getValue("CurrentPosition")); + } else { + if (!this.timeout) { + this.timeout = this.myAPI.getLocalConstant("TimeOutSecs") * 1000 || 60000; + } + if (this.timer) { + clearTimeout(this.timer); // start a new one + } + this.timer = setTimeout(function () { + log('Idle Timer reached! Assume motion stopped and target position was not used, so we set it to current position'); + this.myAPI.setValue("TargetPosition", this.myAPI.getValue("CurrentPosition")); + this.timer = undefined; + }.bind(this), this.timeout); + } + } else if (field === "ShutterMove") { + // this isn't a characteristic, we need this extra object to catch switch use, too + // The actuator is lowering the rolling shutters if a 1 is received, and + // raises on a 0 + this.lastCommand = 'move'; + switch (knxValue) { + case 0: + this.myAPI.setValue("TargetPosition", 0); // in position, so home shows "closing" + this.myAPI.setValue("PositionState", 0); //up + break; + case 1: + this.myAPI.setValue("TargetPosition", 100); // out position, so home shows "opening" + this.myAPI.setValue("PositionState", 1); //down + break; + } // switch + } //if + } // onBusValueChange + + /******************************************************************************************************************* + * onHKValueChange is invoked if HomeKit is changing characteristic values + * + */ + onHKValueChange(field, oldValue, newValue) { + // homekit will only send a TargetPosition value, so we do not care about (non-) potential others + if (field === "TargetPosition") { + log('INFO: onHKValueChange(' + field + ", " + oldValue + ", " + newValue + ")"); + // update the PositionState characteristic: + // get the last current Position + var lastPos = this.myAPI.getValue("CurrentPosition"); + if (newValue > lastPos) { + // newValue is higher, shutter's moving up + this.myAPI.setValue("PositionState", 1); //up + } else if (newValue < lastPos) { + // newValue is higher, shutter's moving down + this.myAPI.setValue("PositionState", 0); //down + } + var knxValue = (newValue * 255 / 100); + log('INFO: onHKValueChange after calc (' + knxValue + ")"); + this.myAPI.knxWrite("TargetPosition", knxValue, "DPT5"); // send the new position to the KNX bus + } + + } // onHKValueChange } // class -module.exports= GiraAwningActuator; +module.exports = GiraAwningActuator; + - /* ********************************************************************************************************************** * The config for that should look like: LocalConstants is now used in this sample * Reverse keyword is not allowed for custom handlers * * "Services": [{ - "ServiceType": "WindowCovering", - "Handler": "GiraAwningActuator", - "ServiceName": "Porch Awning", - "Characteristics": [{ - "Type": "TargetPosition", - "Set": "1/2/3", - "Listen": "1/2/4", - "DPT": "DPT5.001" - }, - { - "Type": "CurrentPosition", - "Set": "1/3/1", - "Listen": "1/3/2" - }, - { - "Type": "PositionState" - }], - "KNXObjects": [{ - "Type": "ShutterMove", - "Listen": "1/2/1", - "DPT": "DPT1" - }], - "KNX-ReadRequests": ["1/2/4", - "1/3/2"], - "LocalConstants": {"TimeOutSecs": 60} + "ServiceType": "WindowCovering", + "Handler": "GiraAwningActuator", + "ServiceName": "Porch Awning", + "Characteristics": [{ + "Type": "TargetPosition", + "Set": "1/2/3", + "Listen": "1/2/4", + "DPT": "DPT5.001" + }, + { + "Type": "CurrentPosition", + "Set": "1/3/1", + "Listen": "1/3/2" + }, + { + "Type": "PositionState" + }], + "KNXObjects": [{ + "Type": "ShutterMove", + "Listen": "1/2/1", + "DPT": "DPT1" + }], + "KNX-ReadRequests": ["1/2/4", + "1/3/2"], + "LocalConstants": {"TimeOutSecs": 60} }] * * diff --git a/lib/addins/GiraJalousieActuator.js b/lib/addins/GiraJalousieActuator.js index 341323a..2a4a333 100644 --- a/lib/addins/GiraJalousieActuator.js +++ b/lib/addins/GiraJalousieActuator.js @@ -17,152 +17,152 @@ var log = require('debug')('GiraJalousieActuator'); */ class GiraJalousieActuator extends HandlerPattern { - /******************************************************************************************************************* - * onKNXValueChange is invoked if a Bus value for one of the bound addresses is received - * - */ - onKNXValueChange(field, oldValue, knxValue) { - // value for HomeKit - var newValue; - log('INFO: onKNXValueChange(' + field + ", "+ oldValue + ", "+ knxValue+ ")"); - if (field==="TargetPosition") { - - /* If deadzone is still set, we ignore the update to avoid jitter in the iOS app */ - - if (!this.deadzone) { - - // TargetPosition is DPT5.001 Percentage (0..100) - // need to convert to (0..100) first - // Homekit is using %-open, meaning 0% is closed/down - - newValue = 100 - knxValue; - - if (newValue>this.myAPI.getValue("CurrentPosition")) { - // newValue is higher, shutter's moving down - this.myAPI.setValue("PositionState", 0); //down - } else if (newValuelastPos) { - // newValue is higher, shutter's moving down - this.myAPI.setValue("PositionState", 0); //down - } else if (newValue this.myAPI.getValue("CurrentPosition")) { + // newValue is higher, shutter's moving down + this.myAPI.setValue("PositionState", 1); //down + } else if (newValue < this.myAPI.getValue("CurrentPosition")) { + // newValue is higher, shutter's moving up + this.myAPI.setValue("PositionState", 0); //up + } + this.myAPI.setValue("TargetPosition", newValue); + if (this.timer) { + // avoid resetting Target Position through a timer + clearTimeout(this.timer); + this.timer = undefined; + } + this.lastCommand = 'target'; + } + } else if (field === "CurrentPosition") { + // Current Position is sent by the actuator if the Movement has stopped a new postion is reached + + // CurrentPosition is DPT5.001 Percentage (0..100) + // need to convert to (0..100) first + // Homekit is using %-open, meaning 0% is closed/down + newValue = 100 - knxValue; + + this.myAPI.setValue("CurrentPosition", newValue); // inform homekit + this.myAPI.setValue("PositionState", 2); //stopped + + if (this.lastCommand === 'move') { + // return to stopped immediately, and set the Target to Current + this.myAPI.setValue("TargetPosition", this.myAPI.getValue("CurrentPosition")); + } else { + if (!this.timeout) { + this.timeout = this.myAPI.getLocalConstant("TimeOutSecs") * 1000 || 60000; + } + if (this.timer) { + clearTimeout(this.timer); // start a new one + } + this.timer = setTimeout(function () { + log('Idle Timer reached! Assume motion stopped and target position was not used, so we set it to current position'); + this.myAPI.setValue("TargetPosition", this.myAPI.getValue("CurrentPosition")); + this.timer = undefined; + }.bind(this), this.timeout); + } + } else if (field === "ShutterMove") { + // this isn't a characteristic, we need this extra object to catch switch use, too + // The actuator is lowering the rolling shutters if a 1 is received, and + // raises on a 0 + this.lastCommand = 'move'; + switch (knxValue) { + case 0: + this.myAPI.setValue("TargetPosition", 100); // top position, so home shows "opening" + this.myAPI.setValue("PositionState", 1); //up + break; + case 1: + this.myAPI.setValue("TargetPosition", 0); // low position, so home shows "closing" + this.myAPI.setValue("PositionState", 0); //down + break; + } // switch + } //if + } // onBusValueChange + + /******************************************************************************************************************* + * onHKValueChange is invoked if HomeKit is changing characteristic values + * + */ + onHKValueChange(field, oldValue, newValue) { + // homekit will only send a TargetPosition value, so we do not care about (non-) potential others + let that = this; + if (field === "TargetPosition") { + log('INFO: onHKValueChange(' + field + ", " + oldValue + ", " + newValue + ")"); + // update the PositionState characteristic: + // get the last current Position + var lastPos = this.myAPI.getValue("CurrentPosition"); + if (newValue > lastPos) { + // newValue is higher, shutter's moving up + this.myAPI.setValue("PositionState", 1); //up + } else if (newValue < lastPos) { + // newValue is higher, shutter's moving down + this.myAPI.setValue("PositionState", 0); //down + } + var knxValue = (100 - newValue); + log('INFO: onHKValueChange after calc (' + knxValue + ")"); + if (that.deadzone) { + clearTimeout(that.deadzone); // remove existing timer + } + that.deadzone = setTimeout(function () { + that.deadzone = undefined; + }, 500); // 500ms dead zone for TargetPosition updates from the bus + this.myAPI.knxWrite("TargetPosition", knxValue, "DPT5.001"); // send the new position to the KNX bus + } + + } // onHKValueChange } // class -module.exports= GiraJalousieActuator; +module.exports = GiraJalousieActuator; + - /* ********************************************************************************************************************** * The config for that should look like: LocalConstants is now used in this sample * Reverse keyword is not allowed for custom handlers * * "Services": [{ - "ServiceType": "WindowCovering", - "Handler": "GiraJalousieActuator", - "ServiceName": "Rolling Shutter", - "Characteristics": [{ - "Type": "TargetPosition", - "Set": "1/2/3", - "Listen": "1/2/4", - "DPT": "DPT5.001" - }, - { - "Type": "CurrentPosition", - "Set": "1/3/1", - "Listen": "1/3/2" - }, - { - "Type": "PositionState" - }], - "KNXObjects": [{ - "Type": "ShutterMove", - "Listen": "1/2/1", - "DPT": "DPT1" - }], - "KNX-ReadRequests": ["1/2/4", - "1/3/2"], - "LocalConstants": {"TimeOutSecs": 60} + "ServiceType": "WindowCovering", + "Handler": "GiraJalousieActuator", + "ServiceName": "Rolling Shutter", + "Characteristics": [{ + "Type": "TargetPosition", + "Set": "1/2/3", + "Listen": "1/2/4", + "DPT": "DPT5.001" + }, + { + "Type": "CurrentPosition", + "Set": "1/3/1", + "Listen": "1/3/2" + }, + { + "Type": "PositionState" + }], + "KNXObjects": [{ + "Type": "ShutterMove", + "Listen": "1/2/1", + "DPT": "DPT1" + }], + "KNX-ReadRequests": ["1/2/4", + "1/3/2"], + "LocalConstants": {"TimeOutSecs": 60} }] * * diff --git a/lib/customServiceAPI.js b/lib/customServiceAPI.js index 61a7481..6723ad5 100644 --- a/lib/customServiceAPI.js +++ b/lib/customServiceAPI.js @@ -114,8 +114,9 @@ class customServiceAPI { }.bind(this)); } // bind to KNX bus events - } + this.characteristicsList[name].getDPT = () => { return dptype } // create a getDPT method for the pseudo object + } /** * Sets a homekit value for a local characteristic @@ -360,7 +361,8 @@ class customServiceAPI { * @private */ knxbusEventCatcher(characteristicName, val, src, dest) { - if ((!this.serviceKNX.globs.knxconnection || this.serviceKNX.globs.knxconnection !== 'knxjs') && this.characteristicsList[characteristicName].getDPT() === 'DPT5.001') { + var temp = this.characteristicsList[characteristicName]; + if ((!this.serviceKNX.globs.knxconnection || this.serviceKNX.globs.knxconnection !== 'knxjs') && temp.getDPT() === 'DPT5.001') { // convert 0..255 to 0..100 for HK val = val * 100 / 255; } diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 8bad35c..0000000 --- a/package-lock.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "name": "homebridge-knx", - "version": "0.3.27", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@types/node": { - "version": "6.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-6.14.10.tgz", - "integrity": "sha512-pF4HjZGSog75kGq7B1InK/wt/N08BuPATo+7HRfv7gZUzccebwv/fmWVGs/j6LvSiLWpCuGGhql51M/wcQsNzA==" - }, - "binary-parser": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/binary-parser/-/binary-parser-1.1.5.tgz", - "integrity": "sha1-ciTWGk4vp7Wu3mn+Tw6moJAreeg=" - }, - "binary-protocol": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/binary-protocol/-/binary-protocol-0.0.0.tgz", - "integrity": "sha1-ZU4tbCB8HS7qpl1dais+ulmu024=", - "requires": { - "bluebird": "~2.2.2" - } - }, - "bluebird": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.2.2.tgz", - "integrity": "sha1-8b8Fq8iHz5pwOIYjfChhCkOx8RQ=" - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "eibd": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/eibd/-/eibd-0.5.0.tgz", - "integrity": "sha512-lMXE54WdfAqFporf5plCm5pmFkoaZ137TCTe7Q/CC7uEfv++2GUk58K439F/pFQINWoGUF8xzLtfEx29dXA3cw==" - }, - "ipaddr.js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.2.0.tgz", - "integrity": "sha1-irpJyRknmVhb3WQ+DMtQ6K53e6Q=" - }, - "knx": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/knx/-/knx-2.3.7.tgz", - "integrity": "sha512-k5jJESq1jFHXwACRKmSzKRP10xd7Qx0qxB865sewzSpD6VFyGeoNxb3L/MbHm+4bDg/52Ai6d2M9ysKKFO17gQ==", - "requires": { - "@types/node": "^6.14.4", - "binary-parser": "1.1.5", - "binary-protocol": "0.0.0", - "ipaddr.js": "1.2.0", - "log-driver": "1.2.7", - "machina": "^4.0.2" - } - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - }, - "log-driver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", - "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==" - }, - "machina": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/machina/-/machina-4.0.2.tgz", - "integrity": "sha512-OOlFrW1rd783S6tF36v5Ie/TM64gfvSl9kYLWL2cPA31J71HHWW3XrgSe1BZSFAPkh8532CMJMLv/s9L2aopiA==", - "requires": { - "lodash": "^4.17.5" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } -} diff --git a/package.json b/package.json index b095924..d86507c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homebridge-knx", - "version": "0.4.2", + "version": "0.4.3", "description": "homebridge shim for KNX home automation.", "main": "index.js", "scripts": {