From 3f14bc340bb28734d6250862ab0b3e61eb194cce Mon Sep 17 00:00:00 2001 From: Tobias Rho Date: Thu, 10 May 2018 22:25:56 +0200 Subject: [PATCH 01/15] intial port of homebridge-bme280 to homebridge-bme680 --- .gitignore | 4 + README.md | 51 +- dist/CustomCharacteristic.js | 79 +++ dist/CustomCharacteristic.js.map | 1 + dist/lib/CustomCharacteristic.js | 65 ++ dist/lib/CustomCharacteristic.js.map | 1 + dist/sensor.js | 338 ++++++++++ dist/sensor.js.map | 1 + package.json | 11 +- sensor.js | 139 ----- .../CustomCharacteristic.ts | 5 +- src/sensor.ts | 421 +++++++++++++ src/typings/BME680.d.ts | 101 +++ src/typings/Constants.d.ts | 152 +++++ src/typings/GasSensor.d.ts | 72 +++ src/typings/HumiditySensor.d.ts | 43 ++ src/typings/TemperatureSensor.d.ts | 43 ++ src/typings/hap-nodejs.d.ts | 373 +++++++++++ tsconfig.json | 23 + yarn.lock | 579 ++++++++++++++++++ 20 files changed, 2349 insertions(+), 153 deletions(-) create mode 100644 dist/CustomCharacteristic.js create mode 100644 dist/CustomCharacteristic.js.map create mode 100644 dist/lib/CustomCharacteristic.js create mode 100644 dist/lib/CustomCharacteristic.js.map create mode 100644 dist/sensor.js create mode 100644 dist/sensor.js.map delete mode 100644 sensor.js rename lib/CustomCharacteristic.js => src/CustomCharacteristic.ts (96%) create mode 100644 src/sensor.ts create mode 100644 src/typings/BME680.d.ts create mode 100644 src/typings/Constants.d.ts create mode 100644 src/typings/GasSensor.d.ts create mode 100644 src/typings/HumiditySensor.d.ts create mode 100644 src/typings/TemperatureSensor.d.ts create mode 100644 src/typings/hap-nodejs.d.ts create mode 100644 tsconfig.json create mode 100644 yarn.lock diff --git a/.gitignore b/.gitignore index dfb9324..8bd2986 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,7 @@ node_modules/ package-lock.json publish.sh npm-debug.log +port_forward.sh +yarn-error.log +push.sh +lib/bsec_bme680 diff --git a/README.md b/README.md index caf9a03..ee654cc 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,23 @@ -# homebridge-bme280 +# homebridge-bme680 -[Bosch BME280](https://www.bosch-sensortec.com/bst/products/all_products/bme280) +EXPERIMENTAL FORK from https://github.com/rxseger/homebridge-bme280 +Relies on +* https://github.com/trho/bsec_bme680_linux (fork from https://github.com/alexh-name/bsec_bme680_linux with json output) which relies on the closed source BME680 driver by Bosch [BME680_driver](https://github.com/BoschSensortec/BME680_driver) to calculate IAQ (Indoor Air Quality) +* https://github.com/jorisvervuurt/jvsbme680 + + +Limitations: +* Only supports storage "fs" right now +* Only uses eve fake history service (https://github.com/simont77/fakegato-history): accessory does not show up in Home app, only in Eve app + +Uses heuristic factor to convert between Bosch BSEC IAQ (Indoor Air Quality) and Eve Co2 ppm: + +const FACTOR_BSEC_IAQ_EVE_PPM = (CO2_MAX_VALUE - PPM_OFFSET) / BSEC_IAQ_MAX; + +Concrete values: +const FACTOR_BSEC_IAQ_EVE_PPM = (3000 - 450) / 500; + +[Bosch BME680](https://www.bosch-sensortec.com/bst/products/all_products/bme680) temperature/humidity/barometric pressure sensor service plugin for [Homebridge](https://github.com/nfarina/homebridge). [![NPM Downloads](https://img.shields.io/npm/dm/homebridge-bme280.svg?style=flat)](https://npmjs.org/package/homebridge-bme280) @@ -13,23 +30,34 @@ Uses [bme280-sensor](https://www.npmjs.com/package/bme280-sensor) # Build Instructions -Detailed build instructions are available here. https://www.instructables.com/id/Connect-Your-RaspberryPI-to-the-BME280-Temperature/ +1. Init +npm install +2. Compile Typescript +npm compile + +TODO ## Installation + +Untested! + 1. Install Homebridge using `npm install -g homebridge` -2. Install this plugin `npm install -g homebridge-bme280` -3. Update your configuration file - see below for an example +2. Install this plugin `npm install -g trho/homebridge-bme680` +3. Compile bsec_bme680 executable by following https://github.com/trho/bsec_bme680_linux +4. *Copy bsec_bme680 to global node_modules/homebridge-bme680/lib* +5. *Copy bsec_iaq.config to homebridge storagePath (e.g. ~./homebridge)* +4. Update your configuration file - see below for an example -Connect the BME280 chip to the I2C bus +Connect the BME680 chip to the I2C bus ## Configuration -* `accessory`: "BME280" +* `accessory`: "BME680" * `name`: descriptive name * `name_temperature` (optional): descriptive name for the temperature sensor * `name_humidity` (optional): descriptive name for the humidity sensor * `refresh`: Optional, time interval for refreshing data in seconds, defaults to 60 seconds. * `options`: options for [bme280-sensor](https://www.npmjs.com/package/bme280-sensor) -* `spreadsheetId` ( optional ): Log data to a google sheet, this is part of the URL of your spreadsheet. ie the spreadsheet ID in the URL https://docs.google.com/spreadsheets/d/abc1234567/edit#gid=0 is "abc1234567". +* `spreadsheetId` ( optional ): Log data to a google sheet, this is part of the URL of your spreadsheet. ie the spreadsheet ID in the URL https://docs.google.com/spreadsheets/d/abc1234567/edit#gid=0 is "abc1234567". (TODO: not implemented, yet) If you get an I/O error, make sure the I2C address is correct (usually 0x76 or 0x77 depending on a jumper). @@ -38,10 +66,11 @@ Example configuration: ```json "accessories": [ { - "accessory": "BME280", + "accessory": "BME680", "name": "Sensor", "name_temperature": "Temperature", "name_humidity": "Humidity", + "name_air_quality": "Air Quality", "options": { "i2cBusNo": 1, "i2cAddress": "0x76" @@ -97,6 +126,10 @@ e. Copy the code you're given, paste it into the command-line prompt, and press * [homebridge-ds18b20](https://www.npmjs.com/package/homebridge-ds18b20) * [homebridge-dht-sensor](https://www.npmjs.com/package/homebridge-dht-sensor) * [homebridge-dht](https://www.npmjs.com/package/homebridge-dht) +* [bsec_bme680_linux fork] https://github.com/trho/bsec_bme680_linux +* https://github.com/rxseger/homebridge-bme280 +* https://github.com/jorisvervuurt/jvsbme680 + ## Credits * NorthernMan54 - Barometric Pressure and Device Polling diff --git a/dist/CustomCharacteristic.js b/dist/CustomCharacteristic.js new file mode 100644 index 0000000..346cc26 --- /dev/null +++ b/dist/CustomCharacteristic.js @@ -0,0 +1,79 @@ +(function (factory) { + if (typeof module === "object" && typeof module.exports === "object") { + var v = factory(require, exports); + if (v !== undefined) module.exports = v; + } + else if (typeof define === "function" && define.amd) { + define(["require", "exports"], factory); + } +})(function (require, exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var inherits = require('util').inherits; + var Service, Characteristic; + function initCustomCharacteristic(homebridge) { + Service = homebridge.hap.Service; + Characteristic = homebridge.hap.Characteristic; + var CustomCharacteristic = {}; + CustomCharacteristic.AtmosphericPressureLevel = function () { + Characteristic.call(this, 'Air Pressure', CustomCharacteristic.AtmosphericPressureLevel.UUID); + this.setProps({ + format: Characteristic.Formats.UINT8, + unit: "mbar", + minValue: 800, + maxValue: 1200, + minStep: 1, + perms: [Characteristic.Perms.READ, Characteristic.Perms.NOTIFY] + }); + this.value = this.getDefaultValue(); + }; + CustomCharacteristic.AtmosphericPressureLevel.UUID = 'E863F10F-079E-48FF-8F27-9C2605A29F52'; + inherits(CustomCharacteristic.AtmosphericPressureLevel, Characteristic); + // courtesy of https://github.com/robi-van-kinobi/homebridge-cubesensors + CustomCharacteristic.AtmosphericPressureSensor = function (displayName, subtype) { + Service.call(this, displayName, CustomCharacteristic.AtmosphericPressureSensor.UUID, subtype); + // Required Characteristics + this.addCharacteristic(CustomCharacteristic.AtmosphericPressureLevel); + // Optional Characteristics + this.addOptionalCharacteristic(Characteristic.StatusActive); + this.addOptionalCharacteristic(Characteristic.StatusFault); + this.addOptionalCharacteristic(Characteristic.StatusLowBattery); + this.addOptionalCharacteristic(Characteristic.StatusTampered); + this.addOptionalCharacteristic(Characteristic.Name); + }; + CustomCharacteristic.AtmosphericPressureSensor.UUID = 'B77831FD-D66A-46A4-B66D-FD7EE8DFE3CE'; + inherits(CustomCharacteristic.AtmosphericPressureSensor, Service); + CustomCharacteristic.ValvePosition = function () { + Characteristic.call(this, 'Valve position', 'E863F12E-079E-48FF-8F27-9C2605A29F52'); + this.setProps({ + format: Characteristic.Formats.UINT8, + unit: Characteristic.Units.PERCENTAGE, + perms: [Characteristic.Perms.READ, Characteristic.Perms.NOTIFY] + }); + this.value = this.getDefaultValue(); + }; + inherits(CustomCharacteristic.ValvePosition, Characteristic); + CustomCharacteristic.ProgramCommand = function () { + Characteristic.call(this, 'Program command', 'E863F12C-079E-48FF-8F27-9C2605A29F52'); + this.setProps({ + format: Characteristic.Formats.DATA, + perms: [Characteristic.Perms.WRITE, Characteristic.Perms.NOTIFY] + }); + this.value = this.getDefaultValue(); + }; + inherits(CustomCharacteristic.ProgramCommand, Characteristic); + CustomCharacteristic.ProgramData = function () { + Characteristic.call(this, 'Program data', 'E863F12F-079E-48FF-8F27-9C2605A29F52'); + this.setProps({ + format: Characteristic.Formats.DATA, + perms: [Characteristic.Perms.READ, Characteristic.Perms.NOTIFY] + }); + this.value = this.getDefaultValue(); + }; + inherits(CustomCharacteristic.ProgramData, Characteristic); + return CustomCharacteristic; + } + exports.initCustomCharacteristic = initCustomCharacteristic; + ; +}); +//# sourceMappingURL=CustomCharacteristic.js.map \ No newline at end of file diff --git a/dist/CustomCharacteristic.js.map b/dist/CustomCharacteristic.js.map new file mode 100644 index 0000000..bef3dd2 --- /dev/null +++ b/dist/CustomCharacteristic.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CustomCharacteristic.js","sourceRoot":"","sources":["../src/CustomCharacteristic.ts"],"names":[],"mappings":";;;;;;;;;;;IAAA,IAAI,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC;IAExC,IAAI,OAAO,EAAE,cAAc,CAAC;IAE5B,kCAAyC,UAAU;QACjD,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC;QACjC,cAAc,GAAG,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC;QAE/C,IAAI,oBAAoB,GAAO,EAAE,CAAC;QAIlC,oBAAoB,CAAC,wBAAwB,GAAG;YAC9C,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,oBAAoB,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;YAC9F,IAAI,CAAC,QAAQ,CAAC;gBACZ,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,KAAK;gBACpC,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,GAAG;gBACb,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE,CAAC;gBACV,KAAK,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC;aAChE,CAAC,CAAC;YACH,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACtC,CAAC,CAAC;QACF,oBAAoB,CAAC,wBAAwB,CAAC,IAAI,GAAG,sCAAsC,CAAC;QAC5F,QAAQ,CAAC,oBAAoB,CAAC,wBAAwB,EAAE,cAAc,CAAC,CAAC;QAGxE,wEAAwE;QACxE,oBAAoB,CAAC,yBAAyB,GAAG,UAAS,WAAW,EAAE,OAAO;YAC5E,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,oBAAoB,CAAC,yBAAyB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAE9F,2BAA2B;YAC3B,IAAI,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,wBAAwB,CAAC,CAAC;YAEtE,2BAA2B;YAC3B,IAAI,CAAC,yBAAyB,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;YAC5D,IAAI,CAAC,yBAAyB,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;YAC3D,IAAI,CAAC,yBAAyB,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;YAChE,IAAI,CAAC,yBAAyB,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;YAC9D,IAAI,CAAC,yBAAyB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QACtD,CAAC,CAAC;QACF,oBAAoB,CAAC,yBAAyB,CAAC,IAAI,GAAG,sCAAsC,CAAC;QAC7F,QAAQ,CAAC,oBAAoB,CAAC,yBAAyB,EAAE,OAAO,CAAC,CAAC;QAElE,oBAAoB,CAAC,aAAa,GAAG;YACnC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,EAAE,sCAAsC,CAAC,CAAC;YACpF,IAAI,CAAC,QAAQ,CAAC;gBACZ,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,KAAK;gBACpC,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,UAAU;gBACrC,KAAK,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC;aAChE,CAAC,CAAC;YACH,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACtC,CAAC,CAAC;QACF,QAAQ,CAAC,oBAAoB,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;QAE7D,oBAAoB,CAAC,cAAc,GAAG;YACpC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,EAAE,sCAAsC,CAAC,CAAC;YACrF,IAAI,CAAC,QAAQ,CAAC;gBACZ,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,IAAI;gBACnC,KAAK,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC;aACjE,CAAC,CAAC;YACH,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACtC,CAAC,CAAC;QACF,QAAQ,CAAC,oBAAoB,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;QAE9D,oBAAoB,CAAC,WAAW,GAAG;YACjC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,sCAAsC,CAAC,CAAC;YAClF,IAAI,CAAC,QAAQ,CAAC;gBACZ,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,IAAI;gBACnC,KAAK,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC;aAChE,CAAC,CAAC;YACH,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACtC,CAAC,CAAC;QACF,QAAQ,CAAC,oBAAoB,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAG3D,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IA1ED,4DA0EC;IAAA,CAAC"} \ No newline at end of file diff --git a/dist/lib/CustomCharacteristic.js b/dist/lib/CustomCharacteristic.js new file mode 100644 index 0000000..cefc790 --- /dev/null +++ b/dist/lib/CustomCharacteristic.js @@ -0,0 +1,65 @@ +var inherits = require('util').inherits; +var Service, Characteristic; +module.exports = function (homebridge) { + Service = homebridge.hap.Service; + Characteristic = homebridge.hap.Characteristic; + var CustomCharacteristic = {}; + CustomCharacteristic.AtmosphericPressureLevel = function () { + Characteristic.call(this, 'Air Pressure', CustomCharacteristic.AtmosphericPressureLevel.UUID); + this.setProps({ + format: Characteristic.Formats.UINT8, + unit: "mbar", + minValue: 800, + maxValue: 1200, + minStep: 1, + perms: [Characteristic.Perms.READ, Characteristic.Perms.NOTIFY] + }); + this.value = this.getDefaultValue(); + }; + CustomCharacteristic.AtmosphericPressureLevel.UUID = 'E863F10F-079E-48FF-8F27-9C2605A29F52'; + inherits(CustomCharacteristic.AtmosphericPressureLevel, Characteristic); + // courtesy of https://github.com/robi-van-kinobi/homebridge-cubesensors + CustomCharacteristic.AtmosphericPressureSensor = function (displayName, subtype) { + Service.call(this, displayName, CustomCharacteristic.AtmosphericPressureSensor.UUID, subtype); + // Required Characteristics + this.addCharacteristic(CustomCharacteristic.AtmosphericPressureLevel); + // Optional Characteristics + this.addOptionalCharacteristic(Characteristic.StatusActive); + this.addOptionalCharacteristic(Characteristic.StatusFault); + this.addOptionalCharacteristic(Characteristic.StatusLowBattery); + this.addOptionalCharacteristic(Characteristic.StatusTampered); + this.addOptionalCharacteristic(Characteristic.Name); + }; + CustomCharacteristic.AtmosphericPressureSensor.UUID = 'B77831FD-D66A-46A4-B66D-FD7EE8DFE3CE'; + inherits(CustomCharacteristic.AtmosphericPressureSensor, Service); + CustomCharacteristic.ValvePosition = function () { + Characteristic.call(this, 'Valve position', 'E863F12E-079E-48FF-8F27-9C2605A29F52'); + this.setProps({ + format: Characteristic.Formats.UINT8, + unit: Characteristic.Units.PERCENTAGE, + perms: [Characteristic.Perms.READ, Characteristic.Perms.NOTIFY] + }); + this.value = this.getDefaultValue(); + }; + inherits(CustomCharacteristic.ValvePosition, Characteristic); + CustomCharacteristic.ProgramCommand = function () { + Characteristic.call(this, 'Program command', 'E863F12C-079E-48FF-8F27-9C2605A29F52'); + this.setProps({ + format: Characteristic.Formats.DATA, + perms: [Characteristic.Perms.WRITE, Characteristic.Perms.NOTIFY] + }); + this.value = this.getDefaultValue(); + }; + inherits(CustomCharacteristic.ProgramCommand, Characteristic); + CustomCharacteristic.ProgramData = function () { + Characteristic.call(this, 'Program data', 'E863F12F-079E-48FF-8F27-9C2605A29F52'); + this.setProps({ + format: Characteristic.Formats.DATA, + perms: [Characteristic.Perms.READ, Characteristic.Perms.NOTIFY] + }); + this.value = this.getDefaultValue(); + }; + inherits(CustomCharacteristic.ProgramData, Characteristic); + return CustomCharacteristic; +}; +//# sourceMappingURL=CustomCharacteristic.js.map \ No newline at end of file diff --git a/dist/lib/CustomCharacteristic.js.map b/dist/lib/CustomCharacteristic.js.map new file mode 100644 index 0000000..075f602 --- /dev/null +++ b/dist/lib/CustomCharacteristic.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CustomCharacteristic.js","sourceRoot":"","sources":["../../src/lib/CustomCharacteristic.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/sensor.js b/dist/sensor.js new file mode 100644 index 0000000..d538b67 --- /dev/null +++ b/dist/sensor.js @@ -0,0 +1,338 @@ +(function (factory) { + if (typeof module === "object" && typeof module.exports === "object") { + var v = factory(require, exports); + if (v !== undefined) module.exports = v; + } + else if (typeof define === "function" && define.amd) { + define(["require", "exports", "./CustomCharacteristic", "child_process", "util"], factory); + } +})(function (require, exports) { + 'use strict'; + Object.defineProperty(exports, "__esModule", { value: true }); + const CustomCharacteristic_1 = require("./CustomCharacteristic"); + const child_process_1 = require("child_process"); + const util_1 = require("util"); + const path = require('path'); + //const bme280_sensor = require('bme280-sensor'); + //var debug = require('debug')('BME280'); + const bme680_sensor = require('jvsbme680'); + var logger = require("mcuiot-logger").logger; + const moment = require('moment'); + var os = require("os"); + var hostname = os.hostname(); + let Service; + let Characteristic; + var CustomCharacteristic; + var FakeGatoHistoryService; + let EveAirQualityPpmCharacteristic; + let EveAirQualityUnknownCharacteristic; + const REFRESH_TIME_IN_MINUTES = 5; + const CO2_MAX_VALUE = 3000; // I am assuming that iaq 500 ~ 3000 ppm + const BSEC_IAQ_MAX = 500; + const PPM_OFFSET = 450; + let homebridgeRef; + // Heuristic factor to convert between Bosch BSEC IAQ (Indoor Air Quality) and Eve Co2 ppm. + const FACTOR_BSEC_IAQ_EVE_PPM = (CO2_MAX_VALUE - PPM_OFFSET) / BSEC_IAQ_MAX; + module.exports = (homebridge) => { + homebridgeRef = homebridge; + Service = homebridge.hap.Service; + Characteristic = homebridge.hap.Characteristic; + CustomCharacteristic = CustomCharacteristic_1.initCustomCharacteristic(homebridge); + FakeGatoHistoryService = require('fakegato-history')(homebridge); + homebridge.registerAccessory('homebridge-bme680', 'BME680', BME680Plugin); + // see https://github.com/skrollme/homebridge-eveatmo/issues/1 + EveAirQualityPpmCharacteristic = function () { + Characteristic.call(this, 'Air Quality in ppm', 'E863F10B-079E-48FF-8F27-9C2605A29F52'); + this.setProps({ + format: Characteristic.Formats.FLOAT, + maxValue: CO2_MAX_VALUE, + minValue: 450, + minStep: 1, + perms: [Characteristic.Perms.READ, Characteristic.Perms.NOTIFY] + }); + this.value = this.getDefaultValue(); + }; + util_1.inherits(EveAirQualityPpmCharacteristic, Characteristic); + EveAirQualityPpmCharacteristic.UUID = 'E863F10B-079E-48FF-8F27-9C2605A29F52'; + EveAirQualityUnknownCharacteristic = function () { + Characteristic.call(this, 'Air Quality in ppm', 'E863F132-079E-48FF-8F27-9C2605A29F52'); + this.setProps({ + format: Characteristic.Formats.FLOAT, + maxValue: CO2_MAX_VALUE, + minValue: 450, + minStep: 1, + perms: [Characteristic.Perms.READ, Characteristic.Perms.NOTIFY] + }); + this.value = this.getDefaultValue(); + }; + util_1.inherits(EveAirQualityUnknownCharacteristic, Characteristic); + EveAirQualityUnknownCharacteristic.UUID = 'E863F132-079E-48FF-8F27-9C2605A29F52'; + }; + class BME680Plugin { + constructor(log, config) { + this.log = log; + this.polling = false; + this.log = log; + this.name = config.name; + this.name_temperature = config.name_temperature || this.name; + this.name_humidity = config.name_humidity || this.name; + this.name_air_quality = config.name_air_quality || this.name; + this.log("temp & hum names: " + + this.name_temperature + "," + + this.name_humidity); + this.refresh = config['refresh'] || REFRESH_TIME_IN_MINUTES * 60; + this.options = config.options || {}; + this.spreadsheetId = config['spreadsheetId']; + if (this.spreadsheetId) { + this.log_event_counter = 59; + this.logger = new logger(this.spreadsheetId); + } + if ('i2cBusNo' in this.options) + this.options.i2cBusNo = parseInt(this.options.i2cBusNo); + if ('i2cAddress' in this.options) + this.options.i2cAddress = parseInt(this.options.i2cAddress); + this.log(`bme680 sensor options: ${JSON.stringify(this.options)}`); + try { + // Creates an instance of `BME680`. + // uses default i2c address [i2cAddress='0x76'] See I2C address (see `Constants.I2CAddress` for valid values) + // Constants.I2CAddress.I2CA_PRIMARY + this.log("init bme680 sensor ..."); + // TODO: consider this.options.i2cAddress + this.sensor = new bme680_sensor.BME680(); + this.log("initialized bme680 sensor"); + } + catch (ex) { + this.log("bme680 initialization failed:", ex); + } + this.devicePolling.bind(this); + this.informationService = new Service.AccessoryInformation(undefined, undefined, undefined); + this.informationService + .setCharacteristic(Characteristic.Manufacturer, "Bosch") + .setCharacteristic(Characteristic.Model, "RPI-BME680") + .setCharacteristic(Characteristic.SerialNumber, hostname + "-" + hostname) + .setCharacteristic(Characteristic.FirmwareRevision, require('./../package.json').version); + this.temperatureService = new Service.TemperatureSensor(this.name_temperature, /*TRHO*/ undefined, undefined); + this.temperatureService + .getCharacteristic(Characteristic.CurrentTemperature) + .setProps({ + minValue: -100, + maxValue: 100 + }); + this.temperatureService + .addCharacteristic(CustomCharacteristic.AtmosphericPressureLevel); + this.humidityService = new Service.HumiditySensor(this.name_humidity, undefined, undefined); + this.airQualitySensor = new Service.AirQualitySensor(this.name_air_quality, undefined, undefined); + this.airQualitySensor + .addCharacteristic(EveAirQualityPpmCharacteristic); + this.airQualitySensor + .addCharacteristic(EveAirQualityUnknownCharacteristic); + // Used for showing BSEC IAQ value: + this.airQualitySensor + .addCharacteristic(Characteristic.VOCDensity); + this.airQualitySensor + .getCharacteristic(Characteristic.VOCDensity) + .setProps({ + minValue: 0, + maxValue: 50 + }); + this.airQualitySensor.log = this.log; + this.temperatureService.log = this.log; + this.loggingService = new FakeGatoHistoryService("room", this.temperatureService, { + storage: 'fs', + disableTimer: true, + filename: this.name + ".json" + }); + this.spawnIAQProcess(); + } + ensurePolling() { + if (this.polling) { + return; + } + this.polling = true; + this.devicePolling(); + setInterval(this.devicePolling.bind(this), this.refresh * 1000); + } + devicePolling() { + debug("Polling BME680: " + new Date(Date.now()).toLocaleString()); + if (this.sensor) { + this.sensor.read() + .then(data => { + let defaultIAQ = 50; + const event = { + time: moment().unix(), + temp: roundInt(data.temperature), + pressure: roundInt(data.pressure), + humidity: roundInt(data.humidity), + ppm: PPM_OFFSET // UNKNOWN + }; + if (this.iaqData) { + // IAQ -> eve ppm + event.ppm = PPM_OFFSET + this.iaqData.iaq * FACTOR_BSEC_IAQ_EVE_PPM; + this.log(`iaq: ${this.iaqData.iaq}, eve quality: ${event.ppm} ppm`); + } + this.log(event); + this.loggingService.addEntry(event); + if (this.spreadsheetId) { + this.log_event_counter = this.log_event_counter + 1; + if (this.log_event_counter > 59) { + this.logger.storeBME(this.name, 0, roundInt(data.temperature), roundInt(data.humidity), roundInt(data.pressure)); + this.log_event_counter = 0; + } + } + let qualityDescription; + let homeKitQuality; + let ppm = event.ppm; + // if (iaq >= 0 && iaq < 50) { + // homeKitQuality = 1; + // qualityDescription = "good"; + // } else if (iaq >= 50 && iaq < 100) { + // homeKitQuality = 2; + // qualityDescription = "average"; + // } else if (iaq >= 100 && iaq < 150) { + // homeKitQuality = 3; + // qualityDescription = "little bad"; + // } else if (iaq >= 150 && iaq < 200) { + // homeKitQuality = 4; + // qualityDescription = "bad"; + // } else if (iaq >= 200 && iaq < 300) { + // homeKitQuality = 4; + // qualityDescription = "worse"; + // } else if (iaq >= 300) { + // homeKitQuality = 5; + // qualityDescription = "very bad"; + // } + if (ppm >= 450 && ppm < 700) { + homeKitQuality = 1; + qualityDescription = "good"; + } + else if (ppm >= 700 && ppm < 1100) { + homeKitQuality = 2; + qualityDescription = "average"; + } + else if (ppm >= 1100 && ppm < 1600) { + homeKitQuality = 3; + qualityDescription = "little bad"; + } + else if (ppm >= 1600 && ppm < 2100) { + homeKitQuality = 4; + qualityDescription = "bad"; + } + else if (ppm >= 2100) { + homeKitQuality = 5; + } + this.log(`iaq: ${homeKitQuality} ${qualityDescription}`); + this.temperatureService + .setCharacteristic(Characteristic.CurrentTemperature, roundInt(data.temperature)); + this.temperatureService + .setCharacteristic(CustomCharacteristic.AtmosphericPressureLevel, roundInt(data.pressure)); + this.humidityService + .setCharacteristic(Characteristic.CurrentRelativeHumidity, roundInt(data.humidity)); + this.airQualitySensor + .setCharacteristic(EveAirQualityPpmCharacteristic, roundInt(event.ppm)); + if (this.iaqData) { + this.airQualitySensor + .setCharacteristic(Characteristic.VOCDensity, roundInt(this.iaqData.iaq)); + } + // Characteristic.AirQuality.UNKNOWN = 0; + // Characteristic.AirQuality.EXCELLENT = 1; + // Characteristic.AirQuality.GOOD = 2; + // Characteristic.AirQuality.FAIR = 3; + // Characteristic.AirQuality.INFERIOR = 4; + // Characteristic.AirQuality.POOR = 5; + this.airQualitySensor + .setCharacteristic(Characteristic.AirQuality, homeKitQuality); // 1(EXCELLENT) 2 (GOOD) 3 (FAIR) 4 (INFERIOR ) 5 (POOR) + }) + .catch(err => { + this.log(`BME read error: ${err}`); + debug(err.stack); + if (this.spreadsheetId) { + this.logger.storeBME(this.name, 1, -999, -999, -999); + } + }); + } + else { + this.log("Error: bme680 Not Initalized"); + } + } + getServices() { + return [this.informationService, this.temperatureService, this.humidityService, this.airQualitySensor, this.loggingService]; + } + /** + * + * IAQ Index Air Quality + 0 – 50 good10 + 51 – 100 average + 101 – 150 little bad + 151 – 200 bad + 201 – 300 worse + 301 – 500 very bad + + * + * Using Eve Room, the measured gas concentration of VOCs is converted into equivalent + CO2 concentration that is easy to read. The Eve app displays current and historical + measurements in ppm. Values are displayed in different colors and divided into + “Excellent” (450-700 ppm), “Good” (700-1100 ppm), “Acceptable“ (1100-1600 ppm), + “Moderate” (1600-2100 ppm), and “Poor” (above 2100 ppm). Depending on the + ventilation and number of people in the room, users should try to keep air quality at + an “Excellent” or “Good” level. + * + * @returns + * @memberof BME680Plugin + */ + spawnIAQProcess() { + if (this.iaqProcess) { + return; + } + this.log(process.cwd()); + // ensure that bsec_iaq.config is located in storagePath (e.g. ~./homebridge) and is writable ( for bsec_iaq.state): + this.iaqProcess = child_process_1.spawn(__dirname + '/../lib/bsec_bme680', [], { + cwd: homebridgeRef.user.storagePath(), + env: process.env + }); + this.iaqProcess.stderr.setEncoding('utf8'); + this.iaqProcess.stdin.setDefaultEncoding('utf8'); + this.iaqProcess.stdout.setEncoding('utf8'); + this.iaqProcess.once('error', (error) => { + this.cleanup(); + this.log("iaqProcess: ERROR"); + debugger; + this.log(error); + }); + this.iaqProcess.stderr.once('data', (data) => { + this.cleanup(); + this.log("iaqProcess: ERROR: stderr"); + debugger; + this.log(data); + }); + this.iaqProcess.stdout.on('data', (data) => { + try { + this.iaqData = JSON.parse(data); + this.ensurePolling(); + } + catch (e) { + this.log("unable to parse iaq result: " + e); + } + }); + this.iaqProcess.once('exit', () => { + this.cleanup(); + }); + } + /** + * Cleanup after the iaq process has exited. + * + */ + cleanup() { + if (this.iaqProcess) { + this.iaqProcess.removeAllListeners(); + this.iaqProcess = null; + } + } + } + function roundInt(string) { + return Math.round(parseFloat(string) * 10) / 10; + } + function debug(val) { + global.console.debug(val); + } +}); +//# sourceMappingURL=sensor.js.map \ No newline at end of file diff --git a/dist/sensor.js.map b/dist/sensor.js.map new file mode 100644 index 0000000..0dcde74 --- /dev/null +++ b/dist/sensor.js.map @@ -0,0 +1 @@ +{"version":3,"file":"sensor.js","sourceRoot":"","sources":["../src/sensor.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 586b499..6adff6d 100644 --- a/package.json +++ b/package.json @@ -2,8 +2,9 @@ "name": "homebridge-bme280", "version": "1.2.1", "description": "BME280 temperature/humidity/pressure sensor bridge for Homebridge: https://github.com/nfarina/homebridge\"", - "main": "sensor.js", + "main": "dist/sensor.js", "scripts": { + "compile": "tsc", "test": "echo \"Error: no test specified\" && exit 1" }, "repository": { @@ -12,7 +13,7 @@ }, "keywords": [ "homebridge-plugin", - "bme280", + "bme680", "temperature", "humidity", "pressure", @@ -29,10 +30,14 @@ }, "homepage": "https://github.com/rxseger/homebridge-bme280#readme", "dependencies": { + "@types/node": "^8.0.30", "bme280-sensor": "^0.0.8", "debug": "^2.2.0", + "fakegato-history": "0.5.1", + "hap-nodejs": "^0.4.43", + "jvsbme680": "1.0.4", "mcuiot-logger": "^0.0.7", "moment": "^2.18.1", - "fakegato-history": "^0.3.5" + "typescript": "2.8.3" } } diff --git a/sensor.js b/sensor.js deleted file mode 100644 index c50d8c5..0000000 --- a/sensor.js +++ /dev/null @@ -1,139 +0,0 @@ -'use strict'; - -const bme280_sensor = require('bme280-sensor'); -var debug = require('debug')('BME280'); -var logger = require("mcuiot-logger").logger; -const moment = require('moment'); -var os = require("os"); -var hostname = os.hostname(); - -let Service, Characteristic; -var CustomCharacteristic; -var FakeGatoHistoryService; - -module.exports = (homebridge) => { - Service = homebridge.hap.Service; - Characteristic = homebridge.hap.Characteristic; - CustomCharacteristic = require('./lib/CustomCharacteristic.js')(homebridge); - FakeGatoHistoryService = require('fakegato-history')(homebridge); - - homebridge.registerAccessory('homebridge-bme280', 'BME280', BME280Plugin); -}; - -class BME280Plugin { - constructor(log, config) { - this.log = log; - this.name = config.name; - this.name_temperature = config.name_temperature || this.name; - this.name_humidity = config.name_humidity || this.name; - this.refresh = config['refresh'] || 60; // Update every minute - this.options = config.options || {}; - this.spreadsheetId = config['spreadsheetId']; - if (this.spreadsheetId) { - this.log_event_counter = 59; - this.logger = new logger(this.spreadsheetId); - } - - this.init = false; - this.data = {}; - if ('i2cBusNo' in this.options) this.options.i2cBusNo = parseInt(this.options.i2cBusNo); - if ('i2cAddress' in this.options) this.options.i2cAddress = parseInt(this.options.i2cAddress); - this.log(`BME280 sensor options: ${JSON.stringify(this.options)}`); - - try { - this.sensor = new bme280_sensor(this.options); - } catch (ex) { - this.log("BME280 initialization failed:", ex); - } - - if (this.sensor) - this.sensor.init() - .then(result => { - this.log(`BME280 initialization succeeded`); - this.init = true; - - this.devicePolling.bind(this); - }) - .catch(err => this.log(`BME280 initialization failed: ${err} `)); - - - this.informationService = new Service.AccessoryInformation(); - - this.informationService - .setCharacteristic(Characteristic.Manufacturer, "Bosch") - .setCharacteristic(Characteristic.Model, "RPI-BME280") - .setCharacteristic(Characteristic.SerialNumber, hostname + "-" + hostname) - .setCharacteristic(Characteristic.FirmwareRevision, require('./package.json').version); - - this.temperatureService = new Service.TemperatureSensor(this.name_temperature); - - this.temperatureService - .getCharacteristic(Characteristic.CurrentTemperature) - .setProps({ - minValue: -100, - maxValue: 100 - }); - // .on('get', this.getCurrentTemperature.bind(this)); - - this.temperatureService - .addCharacteristic(CustomCharacteristic.AtmosphericPressureLevel); - - this.humidityService = new Service.HumiditySensor(this.name_humidity); - - setInterval(this.devicePolling.bind(this), this.refresh * 1000); - - this.temperatureService.log = this.log; - this.loggingService = new FakeGatoHistoryService("weather", this.temperatureService); - - } - - devicePolling() { - debug("Polling BME280"); - if (this.sensor) { - this.sensor.readSensorData() - .then(data => { - this.log(`data(temp) = ${JSON.stringify(data, null, 2)}`); - - this.loggingService.addEntry({ - time: moment().unix(), - temp: roundInt(data.temperature_C), - pressure: roundInt(data.pressure_hPa), - humidity: roundInt(data.humidity) - }); - - if (this.spreadsheetId) { - this.log_event_counter = this.log_event_counter + 1; - if (this.log_event_counter > 59) { - this.logger.storeBME(this.name, 0, roundInt(data.temperature_C), roundInt(data.humidity), roundInt(data.pressure_hPa)); - this.log_event_counter = 0; - } - } - this.temperatureService - .setCharacteristic(Characteristic.CurrentTemperature, roundInt(data.temperature_C)); - this.temperatureService - .setCharacteristic(CustomCharacteristic.AtmosphericPressureLevel, roundInt(data.pressure_hPa)); - this.humidityService - .setCharacteristic(Characteristic.CurrentRelativeHumidity, roundInt(data.humidity)); - - }) - .catch(err => { - this.log(`BME read error: ${err}`); - debug(err.stack); - if (this.spreadsheetId) { - this.logger.storeBME(this.name, 1, -999, -999, -999); - } - - }); - } else { - this.log("Error: BME280 Not Initalized"); - } - } - - getServices() { - return [this.informationService, this.temperatureService, this.humidityService, this.loggingService] - } -} - -function roundInt(string) { - return Math.round(parseFloat(string) * 10) / 10; -} diff --git a/lib/CustomCharacteristic.js b/src/CustomCharacteristic.ts similarity index 96% rename from lib/CustomCharacteristic.js rename to src/CustomCharacteristic.ts index 397a284..d485dc4 100644 --- a/lib/CustomCharacteristic.js +++ b/src/CustomCharacteristic.ts @@ -1,11 +1,12 @@ var inherits = require('util').inherits; + var Service, Characteristic; -module.exports = function(homebridge) { +export function initCustomCharacteristic(homebridge) { Service = homebridge.hap.Service; Characteristic = homebridge.hap.Characteristic; - var CustomCharacteristic = {}; + var CustomCharacteristic:any = {}; diff --git a/src/sensor.ts b/src/sensor.ts new file mode 100644 index 0000000..363b807 --- /dev/null +++ b/src/sensor.ts @@ -0,0 +1,421 @@ +'use strict'; +import { initCustomCharacteristic } from "./CustomCharacteristic"; +import { EventEmitter } from "events"; +import { spawn, exec, ChildProcess } from "child_process"; +import { inherits } from "util"; +const path = require('path'); + +//const bme280_sensor = require('bme280-sensor'); +//var debug = require('debug')('BME280'); +const bme680_sensor = require('jvsbme680'); +var logger = require("mcuiot-logger").logger; +const moment = require('moment'); +var os = require("os"); +var hostname = os.hostname(); + + +let Service: HAPNodeJS.Service; +let Characteristic: HAPNodeJS.Characteristic; +var CustomCharacteristic; +var FakeGatoHistoryService; + +let EveAirQualityPpmCharacteristic; +let EveAirQualityUnknownCharacteristic; + +const REFRESH_TIME_IN_MINUTES = 5; + +const CO2_MAX_VALUE = 3000; // I am assuming that iaq 500 ~ 3000 ppm +const BSEC_IAQ_MAX = 500; +const PPM_OFFSET = 450; + +let homebridgeRef; + +// Heuristic factor to convert between Bosch BSEC IAQ (Indoor Air Quality) and Eve Co2 ppm. +const FACTOR_BSEC_IAQ_EVE_PPM = (CO2_MAX_VALUE - PPM_OFFSET) / BSEC_IAQ_MAX; + +module.exports = (homebridge) => { + homebridgeRef = homebridge; + Service = homebridge.hap.Service; + Characteristic = homebridge.hap.Characteristic; + CustomCharacteristic = initCustomCharacteristic(homebridge); + FakeGatoHistoryService = require('fakegato-history')(homebridge); + + homebridge.registerAccessory('homebridge-bme680', 'BME680', BME680Plugin); + + + // see https://github.com/skrollme/homebridge-eveatmo/issues/1 + EveAirQualityPpmCharacteristic = function () { + Characteristic.call(this, 'Air Quality in ppm', 'E863F10B-079E-48FF-8F27-9C2605A29F52'); + this.setProps({ + format: Characteristic.Formats.FLOAT, + maxValue: CO2_MAX_VALUE, + minValue: 450, + minStep: 1, + perms: [Characteristic.Perms.READ, Characteristic.Perms.NOTIFY] + }); + this.value = this.getDefaultValue(); + }; + + inherits(EveAirQualityPpmCharacteristic, Characteristic); + + (EveAirQualityPpmCharacteristic).UUID = 'E863F10B-079E-48FF-8F27-9C2605A29F52'; + + + EveAirQualityUnknownCharacteristic = function () { + Characteristic.call(this, 'Air Quality in ppm', 'E863F132-079E-48FF-8F27-9C2605A29F52'); + this.setProps({ + format: Characteristic.Formats.FLOAT, + maxValue: CO2_MAX_VALUE, + minValue: 450, + minStep: 1, + perms: [Characteristic.Perms.READ, Characteristic.Perms.NOTIFY] + }); + this.value = this.getDefaultValue(); + }; + + inherits(EveAirQualityUnknownCharacteristic, Characteristic); + (EveAirQualityUnknownCharacteristic).UUID = 'E863F132-079E-48FF-8F27-9C2605A29F52'; +} + +class BME680Plugin { + + + iaqProcess: ChildProcess; + loggingService: any; + airQualitySensor: any; //AirQualitySensor; + humidityService: any;//HAPNodeJS.Service.HumiditySensor; + temperatureService: any; + informationService: any; + sensor: BME680; + // data: {}; + logger: any; + log_event_counter: number; + name: string; + name_temperature: string; + name_humidity: string; + name_air_quality: string; + refresh: number; + options: any; + spreadsheetId: any; + + iaqData: IAQResult; + + polling = false; + + constructor(private log, config) { + this.log = log; + this.name = config.name; + this.name_temperature = config.name_temperature || this.name; + this.name_humidity = config.name_humidity || this.name; + this.name_air_quality = config.name_air_quality || this.name; + this.log("temp & hum names: " + + this.name_temperature + "," + + this.name_humidity); + + this.refresh = config['refresh'] || REFRESH_TIME_IN_MINUTES * 60; + this.options = config.options || {}; + this.spreadsheetId = config['spreadsheetId']; + if (this.spreadsheetId) { + this.log_event_counter = 59; + this.logger = new logger(this.spreadsheetId); + } + + if ('i2cBusNo' in this.options) this.options.i2cBusNo = parseInt(this.options.i2cBusNo); + if ('i2cAddress' in this.options) this.options.i2cAddress = parseInt(this.options.i2cAddress); + this.log(`bme680 sensor options: ${JSON.stringify(this.options)}`); + + try { + // Creates an instance of `BME680`. + // uses default i2c address [i2cAddress='0x76'] See I2C address (see `Constants.I2CAddress` for valid values) + // Constants.I2CAddress.I2CA_PRIMARY + this.log("init bme680 sensor ..."); + // TODO: consider this.options.i2cAddress + this.sensor = new bme680_sensor.BME680(); + this.log("initialized bme680 sensor") + } catch (ex) { + this.log("bme680 initialization failed:", ex); + } + this.devicePolling.bind(this); + + this.informationService = new Service.AccessoryInformation(undefined, undefined, undefined); + + this.informationService + .setCharacteristic(Characteristic.Manufacturer, "Bosch") + .setCharacteristic(Characteristic.Model, "RPI-BME680") + .setCharacteristic(Characteristic.SerialNumber, hostname + "-" + hostname) + .setCharacteristic(Characteristic.FirmwareRevision, require('./../package.json').version); + + this.temperatureService = new Service.TemperatureSensor(this.name_temperature, /*TRHO*/undefined, undefined); + + this.temperatureService + .getCharacteristic(Characteristic.CurrentTemperature) + .setProps({ + minValue: -100, + maxValue: 100 + }); + + this.temperatureService + .addCharacteristic(CustomCharacteristic.AtmosphericPressureLevel); + + this.humidityService = new Service.HumiditySensor(this.name_humidity, undefined, undefined); + + this.airQualitySensor = new Service.AirQualitySensor(this.name_air_quality, undefined, undefined); + + this.airQualitySensor + .addCharacteristic(EveAirQualityPpmCharacteristic); + + this.airQualitySensor + .addCharacteristic(EveAirQualityUnknownCharacteristic); + + // Used for showing BSEC IAQ value: + this.airQualitySensor + .addCharacteristic(Characteristic.VOCDensity); + this.airQualitySensor + .getCharacteristic(Characteristic.VOCDensity) + .setProps({ + minValue: 0, + maxValue: 50 + }); + + this.airQualitySensor.log = this.log; + + this.temperatureService.log = this.log; + this.loggingService = new FakeGatoHistoryService("room", this.temperatureService, + { + storage: 'fs', + disableTimer: true, // timer is not triggered? + filename: this.name + ".json" + }); + this.spawnIAQProcess(); + + } + + + + private ensurePolling() { + if (this.polling) { + return; + } + this.polling = true; + this.devicePolling(); + setInterval(this.devicePolling.bind(this), this.refresh * 1000); + } + + devicePolling() { + debug("Polling BME680: " + new Date(Date.now()).toLocaleString()); + if (this.sensor) { + this.sensor.read() + .then(data => { + let defaultIAQ = 50; + const event: RoomEvent = { + time: moment().unix(), + temp: roundInt(data.temperature), + pressure: roundInt(data.pressure), + humidity: roundInt(data.humidity), + ppm: PPM_OFFSET // UNKNOWN + }; + + if (this.iaqData) { + // IAQ -> eve ppm + event.ppm = PPM_OFFSET + this.iaqData.iaq * FACTOR_BSEC_IAQ_EVE_PPM; + this.log(`iaq: ${this.iaqData.iaq}, eve quality: ${event.ppm} ppm`); + } + this.log(event); + + this.loggingService.addEntry(event); + + if (this.spreadsheetId) { + this.log_event_counter = this.log_event_counter + 1; + if (this.log_event_counter > 59) { + this.logger.storeBME(this.name, 0, roundInt(data.temperature), roundInt(data.humidity), roundInt(data.pressure)); + this.log_event_counter = 0; + } + } + let qualityDescription; + let homeKitQuality; + let ppm = event.ppm; + + // if (iaq >= 0 && iaq < 50) { + // homeKitQuality = 1; + // qualityDescription = "good"; + // } else if (iaq >= 50 && iaq < 100) { + // homeKitQuality = 2; + // qualityDescription = "average"; + // } else if (iaq >= 100 && iaq < 150) { + // homeKitQuality = 3; + // qualityDescription = "little bad"; + // } else if (iaq >= 150 && iaq < 200) { + // homeKitQuality = 4; + // qualityDescription = "bad"; + // } else if (iaq >= 200 && iaq < 300) { + // homeKitQuality = 4; + // qualityDescription = "worse"; + // } else if (iaq >= 300) { + // homeKitQuality = 5; + // qualityDescription = "very bad"; + // } + + if (ppm >= 450 && ppm < 700) { + homeKitQuality = 1; + qualityDescription = "good"; + } else if (ppm >= 700 && ppm < 1100) { + homeKitQuality = 2; + qualityDescription = "average"; + } else if (ppm >= 1100 && ppm < 1600) { + homeKitQuality = 3; + qualityDescription = "little bad"; + } else if (ppm >= 1600 && ppm < 2100) { + homeKitQuality = 4; + qualityDescription = "bad"; + } else if (ppm >= 2100) { + homeKitQuality = 5; + } + + this.log(`iaq: ${homeKitQuality} ${qualityDescription}`) + this.temperatureService + .setCharacteristic(Characteristic.CurrentTemperature, roundInt(data.temperature)); + this.temperatureService + .setCharacteristic(CustomCharacteristic.AtmosphericPressureLevel, roundInt(data.pressure)); + this.humidityService + .setCharacteristic(Characteristic.CurrentRelativeHumidity, roundInt(data.humidity)); + this.airQualitySensor + .setCharacteristic(EveAirQualityPpmCharacteristic, roundInt(event.ppm)); + + if (this.iaqData) { + this.airQualitySensor + .setCharacteristic(Characteristic.VOCDensity, roundInt(this.iaqData.iaq)); + } + + // Characteristic.AirQuality.UNKNOWN = 0; + // Characteristic.AirQuality.EXCELLENT = 1; + // Characteristic.AirQuality.GOOD = 2; + // Characteristic.AirQuality.FAIR = 3; + // Characteristic.AirQuality.INFERIOR = 4; + // Characteristic.AirQuality.POOR = 5; + this.airQualitySensor + .setCharacteristic(Characteristic.AirQuality, homeKitQuality); // 1(EXCELLENT) 2 (GOOD) 3 (FAIR) 4 (INFERIOR ) 5 (POOR) + }) + .catch(err => { + this.log(`BME read error: ${err}`); + debug(err.stack); + if (this.spreadsheetId) { + this.logger.storeBME(this.name, 1, -999, -999, -999); + } + + }); + } else { + this.log("Error: bme680 Not Initalized"); + } + } + + getServices() { + return [this.informationService, this.temperatureService, this.humidityService, this.airQualitySensor, this.loggingService] + } + + + /** + * + * IAQ Index Air Quality + 0 – 50 good10 + 51 – 100 average + 101 – 150 little bad + 151 – 200 bad + 201 – 300 worse + 301 – 500 very bad + + * + * Using Eve Room, the measured gas concentration of VOCs is converted into equivalent + CO2 concentration that is easy to read. The Eve app displays current and historical + measurements in ppm. Values are displayed in different colors and divided into + “Excellent” (450-700 ppm), “Good” (700-1100 ppm), “Acceptable“ (1100-1600 ppm), + “Moderate” (1600-2100 ppm), and “Poor” (above 2100 ppm). Depending on the + ventilation and number of people in the room, users should try to keep air quality at + an “Excellent” or “Good” level. + * + * @returns + * @memberof BME680Plugin + */ + spawnIAQProcess() { + if (this.iaqProcess) { + return; + } + + this.log(process.cwd()) + + // ensure that bsec_iaq.config is located in storagePath (e.g. ~./homebridge) and is writable ( for bsec_iaq.state): + this.iaqProcess = spawn(__dirname + '/../lib/bsec_bme680', [], + { + cwd: homebridgeRef.user.storagePath(), + env: process.env + } + ); + this.iaqProcess.stderr.setEncoding('utf8'); + this.iaqProcess.stdin.setDefaultEncoding('utf8'); + this.iaqProcess.stdout.setEncoding('utf8'); + + this.iaqProcess.once('error', (error) => { + this.cleanup(); + this.log("iaqProcess: ERROR"); + debugger; + this.log(error); + }); + + this.iaqProcess.stderr.once('data', (data) => { + this.cleanup(); + this.log("iaqProcess: ERROR: stderr"); + debugger; + this.log(data); + }); + + this.iaqProcess.stdout.on('data', (data: string) => { + try { + this.iaqData = JSON.parse(data); + this.ensurePolling(); + } catch (e) { + this.log("unable to parse iaq result: " + e); + } + }); + + this.iaqProcess.once('exit', () => { + this.cleanup(); + }); + } + + /** + * Cleanup after the iaq process has exited. + * + */ + private cleanup() { + if (this.iaqProcess) { + this.iaqProcess.removeAllListeners(); + this.iaqProcess = null; + } + } + +} + +function roundInt(string) { + return Math.round(parseFloat(string) * 10) / 10; +} + + +function debug(val: any) { + global.console.debug(val); +} + +interface IAQResult { + "iaq": number; + "iaq_accuracy": number; + "temperature": number; + "humidity": number; + "pressure": number; + "gas_pressure": number; + "bsec_status": number; +} +interface RoomEvent { + time: number; + temp: number; + pressure: number; + humidity: number; + ppm: number; +} diff --git a/src/typings/BME680.d.ts b/src/typings/BME680.d.ts new file mode 100644 index 0000000..0cbce6b --- /dev/null +++ b/src/typings/BME680.d.ts @@ -0,0 +1,101 @@ +// Type definitions for lib/BME680.js +// Project: [LIBRARY_URL_HERE] +// Definitions by: [YOUR_NAME_HERE] <[YOUR_URL_HERE]> +// Definitions: https://github.com/borisyankov/DefinitelyTyped + +/** + * `BME680` class. + * + * @class BME680 + * @extends {EventEmitter} + */ +declare interface BME680 { + + /** + * + * @param i2cAddress? + */ + new (i2cAddress? : string); + + /** + * Sets the IIR filter size (see `Constants.FilterSize` for valid values). + * + * @param {number} filterSize The filter size. + * @returns {Promise} A promise that is resolved when the filter size has been set successfully. + * @memberof BME680 + * @param filterSize + * @return + */ + setFilterSize(filterSize : number): Promise; + + /** + * Reads the sensor data. + * + * @param {boolean} [requireHeatStable=true] A value that indicates whether heat should be stable before reading the sensor data. + * @returns {Promise} A promise that is resolved with an object containing the sensor data. + * @memberof BME680 + * @param requireHeatStable? + * @return + */ + read(requireHeatStable? : boolean): Promise; + + /** + * Performs a soft reset. + * + * @returns {Promise} A promise that is resolved when the soft reset has been performed successfully. + * @memberof BME680 + * @return + */ + reset(): Promise; + + /** + * Kills the Python process. + * + * @param {boolean} [performReset=false] A value that indicates whether a soft reset should be performed. + * @returns {Promise} A promise that is resolved when the Python process has been killed successfully. + * @memberof BME680 + * @param performReset? + * @return + */ + kill(performReset? : boolean): Promise; + + /** + * Sends a command to the Python process. + * + * @private + * @param {string} component The component. + * @param {string} command The command. + * @param {object} [parameters={}] The parameters (optional). + * @returns {Promise} A promise that is resolved with the response data (if available) when the command has finished successfully. + * @memberof BME680 + * @param component + * @param command + * @param parameters? + * @return + */ + _sendCommand(component : string, command : string, parameters? : any): any; + + /** + * Spawns a new Python process (if none is currently running). + * + * @private + * @memberof BME680 + */ + _spawnPythonProcess(): void; + + /** + * Cleanup after the Python process has exited. + * + * @private + * @memberof BME680 + */ + _cleanup(): void; +} + + +declare interface BME680Result { + temperature:number; + pressure:number; + humidity:number; + gas_resistance:number; +} \ No newline at end of file diff --git a/src/typings/Constants.d.ts b/src/typings/Constants.d.ts new file mode 100644 index 0000000..291087a --- /dev/null +++ b/src/typings/Constants.d.ts @@ -0,0 +1,152 @@ +// Type definitions for lib/Constants.js +// Project: [LIBRARY_URL_HERE] +// Definitions by: [YOUR_NAME_HERE] <[YOUR_URL_HERE]> +// Definitions: https://github.com/borisyankov/DefinitelyTyped + +/** + * `Constants` class. + * + * @class Constants + */ +declare interface Constants { + + /** + * + * @return + */ + new (): Constants; +} + + +/** + * + */ +declare namespace Constants{ + + /** + * + */ + namespace I2CAddress{ + + /** + * + */ + export var I2CA_PRIMARY : string; + + /** + * + */ + export var I2CA_SECONDARY : string; + + /** + * + * @param val + * @return + */ + function hasValue(val : any): boolean; + } + + /** + * + */ + namespace OversamplingRate{ + + /** + * + */ + export var OSR_0X : number; + + /** + * + */ + export var OSR_1X : number; + + /** + * + */ + export var OSR_2X : number; + + /** + * + */ + export var OSR_4X : number; + + /** + * + */ + export var OSR_8X : number; + + /** + * + */ + export var OSR_16X : number; + + /** + * + * @param val + * @return + */ + function hasValue(val : any): boolean; + } + + /** + * + */ + namespace FilterSize{ + + /** + * + */ + export var FS_0 : number; + + /** + * + */ + export var FS_1 : number; + + /** + * + */ + export var FS_3 : number; + + /** + * + */ + export var FS_7 : number; + + /** + * + */ + export var FS_15 : number; + + /** + * + */ + export var FS_31 : number; + + /** + * + */ + export var FS_63 : number; + + /** + * + */ + export var FS_127 : number; + + /** + * + * @param val + * @return + */ + function hasValue(val : any): boolean; + } + + /** + * + * @param obj + * @param val + * @return + */ + function _hasValue(obj : any, val : any): boolean; +} diff --git a/src/typings/GasSensor.d.ts b/src/typings/GasSensor.d.ts new file mode 100644 index 0000000..13f238a --- /dev/null +++ b/src/typings/GasSensor.d.ts @@ -0,0 +1,72 @@ +// Type definitions for lib/GasSensor.js +// Project: [LIBRARY_URL_HERE] +// Definitions by: [YOUR_NAME_HERE] <[YOUR_URL_HERE]> +// Definitions: https://github.com/borisyankov/DefinitelyTyped + +/** + * `GasSensor` class. + * An instance of this class can be accessed via `bme680.gasSensor`. + * + * @class GasSensor + */ +declare interface GasSensor { + + /** + * + * @param bme680 + */ + new (bme680 : any); + + /** + * Enables the gas sensor. + * + * @returns {Promise} A promise that is resolved when the gas sensor has been enabled successfully. + * @memberof GasSensor + * @return + */ + enable(): Promise; + + /** + * Disables the gas sensor. + * + * @returns {Promise} A promise that is resolved when the gas sensor has been disabled successfully. + * @memberof GasSensor + * @return + */ + disable(): Promise; + + /** + * Sets the heater temperature. + * + * @param {number} heaterTemperature The heater temperature (between 200 and 400 degrees Celsius). + * @returns {Promise} A promise that is resolved when the heater temperature has been set successfully. + * @memberof GasSensor + * @param heaterTemperature + * @return + */ + setHeaterTemperature(heaterTemperature : number): Promise; + + /** + * Sets the heater duration. + * + * @param {number} heaterDuration The heater duration (between 1 and 4032 milliseconds). + * @returns {Promise} A promise that is resolved when the heater duration has been set successfully. + * @memberof GasSensor + * @param heaterDuration + * @return + */ + setHeaterDuration(heaterDuration : number): Promise; + + /** + * Reads the sensor value. + * + * @returns {Promise} A promise that is resolved with the gas resistance (Ohms). + * @memberof GasSensor + * @return + */ + read(): Promise; +} + +export interface GasResult { + // TODO +} \ No newline at end of file diff --git a/src/typings/HumiditySensor.d.ts b/src/typings/HumiditySensor.d.ts new file mode 100644 index 0000000..4a54739 --- /dev/null +++ b/src/typings/HumiditySensor.d.ts @@ -0,0 +1,43 @@ +// Type definitions for lib/HumiditySensor.js +// Project: [LIBRARY_URL_HERE] +// Definitions by: [YOUR_NAME_HERE] <[YOUR_URL_HERE]> +// Definitions: https://github.com/borisyankov/DefinitelyTyped + +/** + * `HumiditySensor` class. + * An instance of this class can be accessed via `bme680.humiditySensor`. + * + * @class HumiditySensor + */ +declare interface HumiditySensor { + + /** + * + * @param bme680 + */ + new (bme680 : any); + + /** + * Sets the oversampling rate (see `Constants.OversamplingRate` for valid values). + * + * @param {number} oversamplingRate The oversampling rate. + * @returns {Promise} A promise that is resolved when the oversampling rate has been set successfully. + * @memberof HumiditySensor + * @param oversamplingRate + * @return + */ + setOversamplingRate(oversamplingRate : number): Promise; + + /** + * Reads the sensor value. + * + * @returns {Promise} A promise that is resolved with the humidity (%RH). + * @memberof HumiditySensor + * @return + */ + read(): Promise; +} + +export interface HumidityResult { + // TODO +} \ No newline at end of file diff --git a/src/typings/TemperatureSensor.d.ts b/src/typings/TemperatureSensor.d.ts new file mode 100644 index 0000000..835602a --- /dev/null +++ b/src/typings/TemperatureSensor.d.ts @@ -0,0 +1,43 @@ +// Type definitions for lib/TemperatureSensor.js +// Project: [LIBRARY_URL_HERE] +// Definitions by: [YOUR_NAME_HERE] <[YOUR_URL_HERE]> +// Definitions: https://github.com/borisyankov/DefinitelyTyped + +/** + * `TemperatureSensor` class. + * An instance of this class can be accessed via `bme680.temperatureSensor`. + * + * @class TemperatureSensor + */ +declare interface TemperatureSensor { + + /** + * + * @param bme680 + */ + new (bme680 : any); + + /** + * Sets the oversampling rate (see `Constants.OversamplingRate` for valid values). + * + * @param {number} oversamplingRate The oversampling rate. + * @returns {Promise} A promise that is resolved when the oversampling rate has been set successfully. + * @memberof TemperatureSensor + * @param oversamplingRate + * @return + */ + setOversamplingRate(oversamplingRate : number): Promise; + + /** + * Reads the sensor value. + * + * @returns {Promise} A promise that is resolved with the temperature (degrees C). + * @memberof TemperatureSensor + * @return + */ + read(): Promise; +} + +export interface TemperatureResult { + // TODO +} diff --git a/src/typings/hap-nodejs.d.ts b/src/typings/hap-nodejs.d.ts new file mode 100644 index 0000000..6efd85e --- /dev/null +++ b/src/typings/hap-nodejs.d.ts @@ -0,0 +1,373 @@ +// copied from https://github.com/KhaosT/HAP-NodeJS/blob/master/index.d.ts +declare namespace HAPNodeJS { + + export interface uuid { + generate(data: string): string; + isValid(UUID: string): boolean; + unparse(bug: string, offset: number): string; + } + + type EventService = "characteristic-change" | "service-configurationChange" + + export interface IEventEmitterAccessory { + addListener(event: EventService, listener: Function): this; + on(event: EventService, listener: Function): this; + once(event: EventService, listener: Function): this; + removeListener(event: EventService, listener: Function): this; + removeAllListeners(event?: EventService): this; + setMaxListeners(n: number): this; + getMaxListeners(): number; + listeners(event: EventService): Function[]; + emit(event: EventService, ...args: any[]): boolean; + listenerCount(type: string): number; + } + + export interface Service extends IEventEmitterAccessory { + new (displayName: string, UUID: string, subtype: string): Service; + + displayName: string; + UUID: string; + subtype: string; + iid: string; + characteristics: Characteristic[]; + optionalCharacteristics: Characteristic[]; + + addCharacteristic(characteristic: Characteristic | Function): Characteristic; + removeCharacteristic(characteristic: Characteristic): void; + getCharacteristic(name: string | Function): Characteristic; + testCharacteristic(name: string): boolean; + setCharacteristic(name: string | Function, value: string): Service; + updateCharacteristic(name: string, value: string): Service; + addOptionalCharacteristic(characteristic: Characteristic | Function): void; + getCharacteristicByIID(iid: string): Characteristic; + + toHAP(opt: any): JSON; + + AccessoryInformation: Service; + AirPurifier: Service; + AirQualitySensor: Service; + BatteryService: Service; + CameraControl: Service; + CameraRTPStreamManagement: Service; + CarbonDioxideSensor: Service; + CarbonMonoxideSensor: Service; + ContactSensor: Service; + Door: Service; + Doorbell: Service; + Fan: Service; + Fanv2: Service; + FilterMaintenance: Service; + GarageDoorOpener: Service; + HeaterCooler: Service; + HumidifierDehumidifier: Service; + HumiditySensor: Service; + LeakSensor: Service; + LightSensor: Service; + Lightbulb: Service; + LockManagement: Service; + LockMechanism: Service; + Microphone: Service; + MotionSensor: Service; + OccupancySensor: Service; + Outlet: Service; + SecuritySystem: Service; + Slat: Service; + SmokeSensor: Service; + Speaker: Service; + StatefulProgrammableSwitch: Service; + StatelessProgrammableSwitch: Service; + Switch: Service; + TemperatureSensor: Service; + Thermostat: Service; + Window: Service; + WindowCovering: Service; + } + + export interface CameraSource { + + } + + type EventAccessory = "service-configurationChange" | "service-characteristic-change" | "identify" + + export interface IEventEmitterAccessory { + addListener(event: EventAccessory, listener: Function): this; + on(event: EventAccessory, listener: Function): this; + once(event: EventAccessory, listener: Function): this; + removeListener(event: EventAccessory, listener: Function): this; + removeAllListeners(event?: EventAccessory): this; + setMaxListeners(n: number): this; + getMaxListeners(): number; + listeners(event: EventAccessory): Function[]; + emit(event: EventAccessory, ...args: any[]): boolean; + listenerCount(type: string): number; + } + + export interface CharacteristicProps { + format: Characteristic.Formats; + unit: Characteristic.Units, + minValue: number, + maxValue: number, + minStep: number, + perms: Characteristic.Perms[] + } + + type EventCharacteristic = "get" | "set" + + export interface IEventEmitterCharacteristic { + addListener(event: EventCharacteristic, listener: Function): this; + on(event: EventCharacteristic, listener: Function): this; + once(event: EventCharacteristic, listener: Function): this; + removeListener(event: EventCharacteristic, listener: Function): this; + removeAllListeners(event?: EventCharacteristic): this; + setMaxListeners(n: number): this; + getMaxListeners(): number; + listeners(event: EventCharacteristic): Function[]; + emit(event: EventCharacteristic, ...args: any[]): boolean; + listenerCount(type: string): number; + } + + export interface Characteristic extends IEventEmitterCharacteristic { + new (displayName: string, UUID: string, props?: CharacteristicProps): Characteristic; + + Formats: typeof Characteristic.Formats; + Units: typeof Characteristic.Units; + Perms: typeof Characteristic.Perms; + + setProps(props: CharacteristicProps): Characteristic + getValue(callback?: (error: Error, value: boolean | string | number) => void, context?: any, connectionID?: string): void; + setValue(newValue: boolean | string | number, callback?: (error: Error) => void, context?: any, connectionID?: string): Characteristic; + updateValue(newValue: boolean | string | number, callback?: () => void, context?: any): Characteristic; + getDefaultValue(): boolean | string | number; + toHAP(opt: any): JSON; + + AccessoryFlags: Characteristic; + Active: Characteristic; + AdministratorOnlyAccess: Characteristic; + AirParticulateDensity: Characteristic; + AirParticulateSize: Characteristic; + AirQuality: Characteristic; + AppMatchingIdentifier: Characteristic; + AudioFeedback: Characteristic; + BatteryLevel: Characteristic; + Brightness: Characteristic; + CarbonDioxideDetected: Characteristic; + CarbonDioxideLevel: Characteristic; + CarbonDioxidePeakLevel: Characteristic; + CarbonMonoxideDetected: Characteristic; + CarbonMonoxideLevel: Characteristic; + CarbonMonoxidePeakLevel: Characteristic; + ChargingState: Characteristic; + ContactSensorState: Characteristic; + CoolingThresholdTemperature: Characteristic; + CurrentAirPurifierState: Characteristic; + CurrentAmbientLightLevel: Characteristic; + CurrentDoorState: Characteristic; + CurrentFanState: Characteristic; + CurrentHeaterCoolerState: Characteristic; + CurrentHeatingCoolingState: Characteristic; + CurrentHorizontalTiltAngle: Characteristic; + CurrentHumidifierDehumidifierState: Characteristic; + CurrentPosition: Characteristic; + CurrentRelativeHumidity: Characteristic; + CurrentSlatState: Characteristic; + CurrentTemperature: Characteristic; + CurrentTiltAngle: Characteristic; + CurrentVerticalTiltAngle: Characteristic; + DigitalZoom: Characteristic; + FilterChangeIndication: Characteristic; + FilterLifeLevel: Characteristic; + FirmwareRevision: Characteristic; + HardwareRevision: Characteristic; + HeatingThresholdTemperature: Characteristic; + HoldPosition: Characteristic; + Hue: Characteristic; + Identify: Characteristic; + ImageMirroring: Characteristic; + ImageRotation: Characteristic; + LeakDetected: Characteristic; + LockControlPoint: Characteristic; + LockCurrentState: Characteristic; + LockLastKnownAction: Characteristic; + LockManagementAutoSecurityTimeout: Characteristic; + LockPhysicalControls: Characteristic; + LockTargetState: Characteristic; + Logs: Characteristic; + Manufacturer: Characteristic; + Model: Characteristic; + Mute: Characteristic; + MotionDetected: Characteristic; + Name: Characteristic; + NightVision: Characteristic; + NitrogenDioxideDensity: Characteristic; + ObstructionDetected: Characteristic; + OccupancyDetected: Characteristic; + On: Characteristic; + OpticalZoom: Characteristic; + OutletInUse: Characteristic; + OzoneDensity: Characteristic; + PairSetup: Characteristic; + PairVerify: Characteristic; + PairingFeatures: Characteristic; + PairingPairings: Characteristic; + PM10Density: Characteristic; + PM2_5Density: Characteristic; + PositionState: Characteristic; + ProgrammableSwitchEvent: Characteristic; + ProgrammableSwitchOutputState: Characteristic; + RelativeHumidityDehumidifierThreshold: Characteristic; + RelativeHumidityHumidifierThreshold: Characteristic; + ResetFilterIndication: Characteristic; + RotationDirection: Characteristic; + RotationSpeed: Characteristic; + Saturation: Characteristic; + SecuritySystemAlarmType: Characteristic; + SecuritySystemCurrentState: Characteristic; + SecuritySystemTargetState: Characteristic; + SelectedStreamConfiguration: Characteristic; + SerialNumber: Characteristic; + SetupEndpoints: Characteristic; + SlatType: Characteristic; + SmokeDetected: Characteristic; + SoftwareRevision: Characteristic; + StatusActive: Characteristic; + StatusFault: Characteristic; + StatusJammed: Characteristic; + StatusLowBattery: Characteristic; + StatusTampered: Characteristic; + StreamingStatus: Characteristic; + SulphurDioxideDensity: Characteristic; + SupportedAudioStreamConfiguration: Characteristic; + SupportedRTPConfiguration: Characteristic; + SupportedVideoStreamConfiguration: Characteristic; + SwingMode: Characteristic; + TargetAirPurifierState: Characteristic; + TargetAirQuality: Characteristic; + TargetDoorState: Characteristic; + TargetFanState: Characteristic; + TargetHeaterCoolerState: Characteristic; + TargetHeatingCoolingState: Characteristic; + TargetHorizontalTiltAngle: Characteristic; + TargetHumidifierDehumidifierState: Characteristic; + TargetPosition: Characteristic; + TargetRelativeHumidity: Characteristic; + TargetSlatState: Characteristic; + TargetTemperature: Characteristic; + TargetTiltAngle: Characteristic; + TargetVerticalTiltAngle: Characteristic; + TemperatureDisplayUnits: Characteristic; + Version: Characteristic; + VOCDensity: Characteristic; + Volume: Characteristic; + WaterLevel: Characteristic; + } + + + module Characteristic { + export enum Formats { + BOOL, + INT, + FLOAT, + STRING, + ARRAY, // unconfirmed + DICTIONARY, // unconfirmed + UINT8, + UINT16, + UINT32, + UINT64, + DATA, // unconfirmed + TLV8 + } + + export enum Units { + // HomeKit only defines Celsius, for Fahrenheit, it requires iOS app to do the conversion. + CELSIUS, + PERCENTAGE, + ARC_DEGREE, + LUX, + SECONDS + } + + export enum Perms { + READ, + WRITE, + NOTIFY, + HIDDEN + } + } + + export interface PublishInfo { + port: number; + username: string; + pincode: string; + category: number; + } + + export interface Accessory extends IEventEmitterAccessory { + new (displayName: string, UUID: string): Accessory; + displayName: string; + username: string; + pincode: string; + UUID: string; + aid: string; + bridged: boolean; + bridgedAccessories: Accessory[]; + reachable: boolean; + category: Accessory.Categories; + services: Service[]; + cameraSource: CameraSource; + Categories: typeof Accessory.Categories + addService(service: Service | Function): Service; + removeService(service: Service): void; + getService(name: string | Function): Service; + updateReachability(reachable: boolean): void; + addBridgedAccessory(accessory: Accessory, deferUpdate: boolean): Accessory; + addBridgedAccessories(accessories: Accessory[]): void + removeBridgedAccessory(accessory: Accessory, deferUpdate: boolean): void; + removeBridgedAccessories(accessories: Accessory[]): void; + getCharacteristicByIID(iid: string): Characteristic; + getBridgedAccessoryByAID(aid: string): Accessory; + findCharacteristic(aid: string, iid: string): Accessory; + configureCameraSource(cameraSource: CameraSource): void; + toHAP(opt: any): JSON; + publish(info: PublishInfo, allowInsecureRequest: boolean): void; + destroy(): void; + } + + module Accessory { + export enum Categories { + OTHER = 1, + BRIDGE = 2, + FAN = 3, + GARAGE_DOOR_OPENER = 4, + LIGHTBULB = 5, + DOOR_LOCK = 6, + OUTLET = 7, + SWITCH = 8, + THERMOSTAT = 9, + SENSOR = 10, + ALARM_SYSTEM = 11, + DOOR = 12, + WINDOW = 13, + WINDOW_COVERING = 14, + PROGRAMMABLE_SWITCH = 15, + RANGE_EXTENDER = 16, + CAMERA = 17 + } + } + + export interface HAPNodeJS { + init(storagePath?: string): void, + uuid: uuid, + Accessory: Accessory, + Service: any, + Characteristic: any + } + + +} + +declare var hapNodeJS: HAPNodeJS.HAPNodeJS; + +declare module "hap-nodejs" { + export = hapNodeJS; +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..8b176db --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "outDir": "./dist/", + "sourceMap": true, + "declaration": false, + "rootDir": "src", + "moduleResolution": "node", + "target": "es2015", + "module": "umd", + "types": [ + // add node as an option + "node" + ], + "typeRoots": [ + "node_modules/hap-nodejs", + "@types/node" + ], + "lib": [ + "es2017" + ] + } +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..36e89a7 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,579 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@types/node@^8.0.30": + version "8.10.12" + resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.12.tgz#dcb66f6de39074a296534bd1a256a3c6a1c8f5b5" + +ajv@^5.1.0: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + +array-flatten@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +async@~2.1.4: + version "2.1.5" + resolved "https://registry.yarnpkg.com/async/-/async-2.1.5.tgz#e587c68580994ac67fc56ff86d3ac56bdbe810bc" + dependencies: + lodash "^4.14.0" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + +aws4@^1.6.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" + +base64url@2.0.0, base64url@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base64url/-/base64url-2.0.0.tgz#eac16e03ea1438eff9423d69baa36262ed1f70bb" + +bcrypt-pbkdf@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + +bindings@^1.2.1, bindings@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.0.tgz#b346f6ecf6a95f5a815c5839fc7cdb22502f1ed7" + +bme280-sensor@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/bme280-sensor/-/bme280-sensor-0.0.8.tgz#797338067e70c2b33d0249c1530e576b494d2bdb" + dependencies: + i2c-bus "^1.1.1" + +bonjour-hap@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour-hap/-/bonjour-hap-3.5.0.tgz#acbd2d173901c979cc6e6350df5d1ec1bdad0f6f" + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + +boom@4.x.x: + version "4.3.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" + dependencies: + hoek "4.x.x" + +boom@5.x.x: + version "5.2.0" + resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" + dependencies: + hoek "4.x.x" + +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + +buffer-shims@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +combined-stream@1.0.6, combined-stream@~1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" + dependencies: + delayed-stream "~1.0.0" + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +cryptiles@3.x.x: + version "3.1.2" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" + dependencies: + boom "5.x.x" + +curve25519-n@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/curve25519-n/-/curve25519-n-1.2.0.tgz#63ccdb827c12909c2bb3dd9516d5745c7ff3e5e9" + dependencies: + bindings "~1.3.0" + nan "^2.8.0" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +debug@^2.2.0: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + dependencies: + ms "2.0.0" + +decimal.js@^7.2.3: + version "7.5.1" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-7.5.1.tgz#cf4cf5eeb9faa24fc4ee6af361faebb7bfcca2ce" + +deep-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + +dns-packet@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + dependencies: + buffer-indexof "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +ecdsa-sig-formatter@1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz#4bc926274ec3b5abb5016e7e1d60921ac262b2a1" + dependencies: + base64url "^2.0.0" + safe-buffer "^5.0.1" + +ed25519-hap@^0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/ed25519-hap/-/ed25519-hap-0.0.5.tgz#90325fd3d489efcc6a81a7948758a1ca644af0d8" + dependencies: + bindings "^1.2.1" + nan "^2.10.0" + +extend@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + +fakegato-history@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/fakegato-history/-/fakegato-history-0.5.1.tgz#e69448025425cdb54058f8bf8b665d1eb4421c37" + dependencies: + debug "^2.2.0" + google-auth-library "^0.10.0" + googleapis "^18.0.0" + moment "*" + +fast-deep-equal@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + +fast-srp-hap@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fast-srp-hap/-/fast-srp-hap-1.0.1.tgz#377124d196bc6a5157aae5b37bf5fa35bb4ad2d9" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" + dependencies: + asynckit "^0.4.0" + combined-stream "1.0.6" + mime-types "^2.1.12" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" + +google-auth-library@^0.10.0, google-auth-library@~0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-0.10.0.tgz#6e15babee85fd1dd14d8d128a295b6838d52136e" + dependencies: + gtoken "^1.2.1" + jws "^3.1.4" + lodash.noop "^3.0.1" + request "^2.74.0" + +google-p12-pem@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/google-p12-pem/-/google-p12-pem-0.1.2.tgz#33c46ab021aa734fa0332b3960a9a3ffcb2f3177" + dependencies: + node-forge "^0.7.1" + +googleapis@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/googleapis/-/googleapis-18.0.0.tgz#76c7c8b7e3fadb61eac44389a9beaee9240ddf01" + dependencies: + async "~2.1.4" + google-auth-library "~0.10.0" + string-template "~1.0.0" + +gtoken@^1.2.1: + version "1.2.3" + resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-1.2.3.tgz#5509571b8afd4322e124cf66cf68115284c476d8" + dependencies: + google-p12-pem "^0.1.0" + jws "^3.0.0" + mime "^1.4.1" + request "^2.72.0" + +hap-nodejs@^0.4.43: + version "0.4.43" + resolved "https://registry.yarnpkg.com/hap-nodejs/-/hap-nodejs-0.4.43.tgz#6cfd07e7dc2f53d558468072aa6c076e90d833f5" + dependencies: + bonjour-hap "^3.5.0" + buffer-shims "^1.0.0" + curve25519-n "^1.2.0" + debug "^2.2.0" + decimal.js "^7.2.3" + ed25519-hap "^0.0.5" + fast-srp-hap "^1.0.1" + ip "^1.1.3" + node-persist "^0.0.11" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + +har-validator@~5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" + dependencies: + ajv "^5.1.0" + har-schema "^2.0.0" + +hawk@~6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" + dependencies: + boom "4.x.x" + cryptiles "3.x.x" + hoek "4.x.x" + sntp "2.x.x" + +hoek@4.x.x: + version "4.2.1" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +i2c-bus@^1.1.1: + version "1.2.5" + resolved "https://registry.yarnpkg.com/i2c-bus/-/i2c-bus-1.2.5.tgz#65bf78ce6a020d53f6617b13e67196b0ad26449f" + dependencies: + bindings "~1.3.0" + nan "~2.8.0" + +ip@^1.1.0, ip@^1.1.3: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +jvsbme680@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/jvsbme680/-/jvsbme680-1.0.4.tgz#6abac10c49e342dc7ab9082c6bc2d7a4417559fc" + +jwa@^1.1.4: + version "1.1.5" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.1.5.tgz#a0552ce0220742cd52e153774a32905c30e756e5" + dependencies: + base64url "2.0.0" + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.9" + safe-buffer "^5.0.1" + +jws@^3.0.0, jws@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.1.4.tgz#f9e8b9338e8a847277d6444b1464f61880e050a2" + dependencies: + base64url "^2.0.0" + jwa "^1.1.4" + safe-buffer "^5.0.1" + +lodash.noop@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash.noop/-/lodash.noop-3.0.1.tgz#38188f4d650a3a474258439b96ec45b32617133c" + +lodash@^4.14.0: + version "4.17.10" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" + +mcuiot-logger@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mcuiot-logger/-/mcuiot-logger-0.0.7.tgz#bee190b874d741afbc8c6bee6ada25d86862cd8a" + dependencies: + google-auth-library "^0.10.0" + googleapis "^18.0.0" + +mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + +mime-types@^2.1.12, mime-types@~2.1.17: + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + dependencies: + mime-db "~1.33.0" + +mime@^1.4.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +mkdirp@~0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +moment@*, moment@^2.18.1: + version "2.22.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.1.tgz#529a2e9bf973f259c9643d237fda84de3a26e8ad" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +nan@^2.10.0, nan@^2.8.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" + +nan@~2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" + +node-forge@^0.7.1: + version "0.7.5" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" + +node-persist@^0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/node-persist/-/node-persist-0.0.11.tgz#d66eba3ebef620f079530fa7b13076a906665874" + dependencies: + mkdirp "~0.5.1" + q "~1.1.1" + +oauth-sign@~0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +q@~1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/q/-/q-1.1.2.tgz#6357e291206701d99f197ab84e57e8ad196f2a89" + +qs@~6.5.1: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + +request@^2.72.0, request@^2.74.0: + version "2.85.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + hawk "~6.0.2" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + stringstream "~0.0.5" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + +sntp@2.x.x: + version "2.1.0" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" + dependencies: + hoek "4.x.x" + +sshpk@^1.7.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.1.tgz#130f5975eddad963f1d56f92b9ac6c51fa9f83eb" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +string-template@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string-template/-/string-template-1.0.0.tgz#9e9f2233dc00f218718ec379a28a5673ecca8b96" + +stringstream@~0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +thunky@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.2.tgz#a862e018e3fb1ea2ec3fce5d55605cf57f247371" + +tough-cookie@~2.3.3: + version "2.3.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" + dependencies: + punycode "^1.4.1" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +typescript@2.8.3: + version "2.8.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.3.tgz#5d817f9b6f31bb871835f4edf0089f21abe6c170" + +uuid@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" From dc06346450c155a18617c34516df0ba5c5c6d62b Mon Sep 17 00:00:00 2001 From: Tobias Rho Date: Thu, 10 May 2018 22:34:27 +0200 Subject: [PATCH 02/15] improved documentation --- README.md | 8 +++++--- dist/sensor.js | 3 +-- dist/sensor.js.map | 2 +- src/sensor.ts | 5 ++--- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index ee654cc..91e3ba7 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ # homebridge-bme680 -EXPERIMENTAL FORK from https://github.com/rxseger/homebridge-bme280 -Relies on +EXPERIMENTAL fork from https://github.com/rxseger/homebridge-bme280 offering initial bme680 support for homebridge. + +Uses * https://github.com/trho/bsec_bme680_linux (fork from https://github.com/alexh-name/bsec_bme680_linux with json output) which relies on the closed source BME680 driver by Bosch [BME680_driver](https://github.com/BoschSensortec/BME680_driver) to calculate IAQ (Indoor Air Quality) * https://github.com/jorisvervuurt/jvsbme680 - Limitations: * Only supports storage "fs" right now * Only uses eve fake history service (https://github.com/simont77/fakegato-history): accessory does not show up in Home app, only in Eve app @@ -83,6 +83,8 @@ This plugin creates two services: TemperatureSensor and HumiditySensor. ## Optional - Enable access to Google Sheets to log data +TODO: not implemented, yet + This presumes you already have a google account, and have access to google drive/sheets already Step 1: Turn on the Drive API diff --git a/dist/sensor.js b/dist/sensor.js index d538b67..cdf1ea8 100644 --- a/dist/sensor.js +++ b/dist/sensor.js @@ -13,8 +13,6 @@ const child_process_1 = require("child_process"); const util_1 = require("util"); const path = require('path'); - //const bme280_sensor = require('bme280-sensor'); - //var debug = require('debug')('BME280'); const bme680_sensor = require('jvsbme680'); var logger = require("mcuiot-logger").logger; const moment = require('moment'); @@ -26,6 +24,7 @@ var FakeGatoHistoryService; let EveAirQualityPpmCharacteristic; let EveAirQualityUnknownCharacteristic; + // TODO: make configurable const REFRESH_TIME_IN_MINUTES = 5; const CO2_MAX_VALUE = 3000; // I am assuming that iaq 500 ~ 3000 ppm const BSEC_IAQ_MAX = 500; diff --git a/dist/sensor.js.map b/dist/sensor.js.map index 0dcde74..40370ef 100644 --- a/dist/sensor.js.map +++ b/dist/sensor.js.map @@ -1 +1 @@ -{"version":3,"file":"sensor.js","sourceRoot":"","sources":["../src/sensor.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sensor.js","sourceRoot":"","sources":["../src/sensor.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/sensor.ts b/src/sensor.ts index 363b807..51985e4 100644 --- a/src/sensor.ts +++ b/src/sensor.ts @@ -5,8 +5,6 @@ import { spawn, exec, ChildProcess } from "child_process"; import { inherits } from "util"; const path = require('path'); -//const bme280_sensor = require('bme280-sensor'); -//var debug = require('debug')('BME280'); const bme680_sensor = require('jvsbme680'); var logger = require("mcuiot-logger").logger; const moment = require('moment'); @@ -22,6 +20,7 @@ var FakeGatoHistoryService; let EveAirQualityPpmCharacteristic; let EveAirQualityUnknownCharacteristic; +// TODO: make configurable const REFRESH_TIME_IN_MINUTES = 5; const CO2_MAX_VALUE = 3000; // I am assuming that iaq 500 ~ 3000 ppm @@ -183,7 +182,7 @@ class BME680Plugin { this.loggingService = new FakeGatoHistoryService("room", this.temperatureService, { storage: 'fs', - disableTimer: true, // timer is not triggered? + disableTimer: true, // timer is not triggered. Therefore disabling timer service an relying own interval filename: this.name + ".json" }); this.spawnIAQProcess(); From 23cf4cdd00e4853d0c3db4cf29e8d6c073b02fd1 Mon Sep 17 00:00:00 2001 From: Tobias Rho Date: Thu, 10 May 2018 22:41:27 +0200 Subject: [PATCH 03/15] fixed iaq maxValue in fake VOCDensity characteristic --- README.md | 1 + dist/sensor.js | 6 ++++-- dist/sensor.js.map | 2 +- src/sensor.ts | 8 +++++--- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 91e3ba7..d7d8bb5 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ EXPERIMENTAL fork from https://github.com/rxseger/homebridge-bme280 offering ini Uses * https://github.com/trho/bsec_bme680_linux (fork from https://github.com/alexh-name/bsec_bme680_linux with json output) which relies on the closed source BME680 driver by Bosch [BME680_driver](https://github.com/BoschSensortec/BME680_driver) to calculate IAQ (Indoor Air Quality) * https://github.com/jorisvervuurt/jvsbme680 +* The original IAQ value (0-500) is shown as a fake VOCDensity characteristic without available history Limitations: * Only supports storage "fs" right now diff --git a/dist/sensor.js b/dist/sensor.js index cdf1ea8..b845afd 100644 --- a/dist/sensor.js +++ b/dist/sensor.js @@ -125,14 +125,15 @@ .addCharacteristic(EveAirQualityPpmCharacteristic); this.airQualitySensor .addCharacteristic(EveAirQualityUnknownCharacteristic); - // Used for showing BSEC IAQ value: + // Fake VOCDensity sensor used for showing BSEC IAQ value (0-500) + // There is no history support for this value this.airQualitySensor .addCharacteristic(Characteristic.VOCDensity); this.airQualitySensor .getCharacteristic(Characteristic.VOCDensity) .setProps({ minValue: 0, - maxValue: 50 + maxValue: 500 }); this.airQualitySensor.log = this.log; this.temperatureService.log = this.log; @@ -228,6 +229,7 @@ .setCharacteristic(Characteristic.CurrentRelativeHumidity, roundInt(data.humidity)); this.airQualitySensor .setCharacteristic(EveAirQualityPpmCharacteristic, roundInt(event.ppm)); + // Optional if (this.iaqData) { this.airQualitySensor .setCharacteristic(Characteristic.VOCDensity, roundInt(this.iaqData.iaq)); diff --git a/dist/sensor.js.map b/dist/sensor.js.map index 40370ef..8d994f6 100644 --- a/dist/sensor.js.map +++ b/dist/sensor.js.map @@ -1 +1 @@ -{"version":3,"file":"sensor.js","sourceRoot":"","sources":["../src/sensor.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sensor.js","sourceRoot":"","sources":["../src/sensor.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/sensor.ts b/src/sensor.ts index 51985e4..00806a4 100644 --- a/src/sensor.ts +++ b/src/sensor.ts @@ -166,14 +166,15 @@ class BME680Plugin { this.airQualitySensor .addCharacteristic(EveAirQualityUnknownCharacteristic); - // Used for showing BSEC IAQ value: + // Fake VOCDensity sensor used for showing BSEC IAQ value (0-500) + // There is no history support for this value this.airQualitySensor .addCharacteristic(Characteristic.VOCDensity); this.airQualitySensor .getCharacteristic(Characteristic.VOCDensity) .setProps({ minValue: 0, - maxValue: 50 + maxValue: 500 }); this.airQualitySensor.log = this.log; @@ -182,7 +183,7 @@ class BME680Plugin { this.loggingService = new FakeGatoHistoryService("room", this.temperatureService, { storage: 'fs', - disableTimer: true, // timer is not triggered. Therefore disabling timer service an relying own interval + disableTimer: true, // timer is not triggered; therefore disabling timer and relying own interval updates filename: this.name + ".json" }); this.spawnIAQProcess(); @@ -280,6 +281,7 @@ class BME680Plugin { this.airQualitySensor .setCharacteristic(EveAirQualityPpmCharacteristic, roundInt(event.ppm)); + // Optional if (this.iaqData) { this.airQualitySensor .setCharacteristic(Characteristic.VOCDensity, roundInt(this.iaqData.iaq)); From 10d20670ee7ee30f640d0dfed72bf8b5bc6095b0 Mon Sep 17 00:00:00 2001 From: Tobias Rho Date: Thu, 10 May 2018 22:44:26 +0200 Subject: [PATCH 04/15] improved error handling for bsec_bme680 process --- dist/sensor.js | 6 ++---- dist/sensor.js.map | 2 +- src/sensor.ts | 6 ++---- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/dist/sensor.js b/dist/sensor.js index b845afd..f843cfa 100644 --- a/dist/sensor.js +++ b/dist/sensor.js @@ -295,14 +295,12 @@ this.iaqProcess.stdout.setEncoding('utf8'); this.iaqProcess.once('error', (error) => { this.cleanup(); - this.log("iaqProcess: ERROR"); - debugger; + this.log("ERROR: bsec_bme680 failed"); this.log(error); }); this.iaqProcess.stderr.once('data', (data) => { this.cleanup(); - this.log("iaqProcess: ERROR: stderr"); - debugger; + this.log("ERROR: bsec_bme680 does not run without errors, ensure that bsec_iaq.config is in the homebridge storagePath (e.g. ~./homebridge) and the directory is writable"); this.log(data); }); this.iaqProcess.stdout.on('data', (data) => { diff --git a/dist/sensor.js.map b/dist/sensor.js.map index 8d994f6..dfbb547 100644 --- a/dist/sensor.js.map +++ b/dist/sensor.js.map @@ -1 +1 @@ -{"version":3,"file":"sensor.js","sourceRoot":"","sources":["../src/sensor.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sensor.js","sourceRoot":"","sources":["../src/sensor.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/sensor.ts b/src/sensor.ts index 00806a4..7db3683 100644 --- a/src/sensor.ts +++ b/src/sensor.ts @@ -356,15 +356,13 @@ class BME680Plugin { this.iaqProcess.once('error', (error) => { this.cleanup(); - this.log("iaqProcess: ERROR"); - debugger; + this.log("ERROR: bsec_bme680 failed"); this.log(error); }); this.iaqProcess.stderr.once('data', (data) => { this.cleanup(); - this.log("iaqProcess: ERROR: stderr"); - debugger; + this.log("ERROR: bsec_bme680 does not run without errors, ensure that bsec_iaq.config is in the homebridge storagePath (e.g. ~./homebridge) and the directory is writable"); this.log(data); }); From fa47a7acbe45b328524fab7eb77dcaaa5bf2de4d Mon Sep 17 00:00:00 2001 From: Tobias Rho Date: Thu, 10 May 2018 22:51:29 +0200 Subject: [PATCH 05/15] updated package.json to trho/homebridge-bme680 --- package.json | 11 +++++------ yarn.lock | 17 ----------------- 2 files changed, 5 insertions(+), 23 deletions(-) diff --git a/package.json b/package.json index 6adff6d..c053dec 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "homebridge-bme280", + "name": "homebridge-bme680", "version": "1.2.1", - "description": "BME280 temperature/humidity/pressure sensor bridge for Homebridge: https://github.com/nfarina/homebridge\"", + "description": "BME680 temperature/humidity/pressure sensor bridge for Homebridge: https://github.com/nfarina/homebridge\"", "main": "dist/sensor.js", "scripts": { "compile": "tsc", @@ -9,7 +9,7 @@ }, "repository": { "type": "git", - "url": "git://github.com/rxseger/homebridge-bme280.git" + "url": "git://github.com/trho/homebridge-bme680" }, "keywords": [ "homebridge-plugin", @@ -22,16 +22,15 @@ "author": "rxserger", "license": "MIT", "bugs": { - "url": "https://github.com/rxseger/homebridge-bme280/issues" + "url": "https://github.com/trho/homebridge-bme680/issues" }, "engines": { "node": ">=6.0.0", "homebridge": ">=0.2.0" }, - "homepage": "https://github.com/rxseger/homebridge-bme280#readme", + "homepage": "https://github.com/trho/homebridge-bme680#readme", "dependencies": { "@types/node": "^8.0.30", - "bme280-sensor": "^0.0.8", "debug": "^2.2.0", "fakegato-history": "0.5.1", "hap-nodejs": "^0.4.43", diff --git a/yarn.lock b/yarn.lock index 36e89a7..b21a4b0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -59,12 +59,6 @@ bindings@^1.2.1, bindings@~1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.0.tgz#b346f6ecf6a95f5a815c5839fc7cdb22502f1ed7" -bme280-sensor@^0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/bme280-sensor/-/bme280-sensor-0.0.8.tgz#797338067e70c2b33d0249c1530e576b494d2bdb" - dependencies: - i2c-bus "^1.1.1" - bonjour-hap@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/bonjour-hap/-/bonjour-hap-3.5.0.tgz#acbd2d173901c979cc6e6350df5d1ec1bdad0f6f" @@ -321,13 +315,6 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" -i2c-bus@^1.1.1: - version "1.2.5" - resolved "https://registry.yarnpkg.com/i2c-bus/-/i2c-bus-1.2.5.tgz#65bf78ce6a020d53f6617b13e67196b0ad26449f" - dependencies: - bindings "~1.3.0" - nan "~2.8.0" - ip@^1.1.0, ip@^1.1.3: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" @@ -448,10 +435,6 @@ nan@^2.10.0, nan@^2.8.0: version "2.10.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" -nan@~2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" - node-forge@^0.7.1: version "0.7.5" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" From 4bec739e3f493b55bb7080f9064f44931a0f0d88 Mon Sep 17 00:00:00 2001 From: Tobias Rho Date: Thu, 10 May 2018 22:54:10 +0200 Subject: [PATCH 06/15] added bsec_bme680 installation hint --- lib/bsec_bme680.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 lib/bsec_bme680.md diff --git a/lib/bsec_bme680.md b/lib/bsec_bme680.md new file mode 100644 index 0000000..acbdaa2 --- /dev/null +++ b/lib/bsec_bme680.md @@ -0,0 +1 @@ +Copy compiled bsec_bme680 executable to this directory. \ No newline at end of file From f5dd54ae279eb07ebe0cc91131298687d0207727 Mon Sep 17 00:00:00 2001 From: Tobias Rho Date: Thu, 10 May 2018 22:57:08 +0200 Subject: [PATCH 07/15] improved documentation --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d7d8bb5..5f8e68c 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Uses Limitations: * Only supports storage "fs" right now -* Only uses eve fake history service (https://github.com/simont77/fakegato-history): accessory does not show up in Home app, only in Eve app +* Since it is based on the [fakegato-history](https://github.com/simont77/fakegato-history) library the accessory only shows up in the Eve app and not in Apple Home. Uses heuristic factor to convert between Bosch BSEC IAQ (Indoor Air Quality) and Eve Co2 ppm: From 93c70c84f09531ce5298e91c0931dda19762dbda Mon Sep 17 00:00:00 2001 From: Tobias Rho Date: Thu, 10 May 2018 22:58:43 +0200 Subject: [PATCH 08/15] added name_air_quality property documentation --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5f8e68c..dd7170b 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,7 @@ Connect the BME680 chip to the I2C bus * `name`: descriptive name * `name_temperature` (optional): descriptive name for the temperature sensor * `name_humidity` (optional): descriptive name for the humidity sensor +* `name_air_quality` (optional): descriptive name for the air quality sensor * `refresh`: Optional, time interval for refreshing data in seconds, defaults to 60 seconds. * `options`: options for [bme280-sensor](https://www.npmjs.com/package/bme280-sensor) * `spreadsheetId` ( optional ): Log data to a google sheet, this is part of the URL of your spreadsheet. ie the spreadsheet ID in the URL https://docs.google.com/spreadsheets/d/abc1234567/edit#gid=0 is "abc1234567". (TODO: not implemented, yet) From 5bf789e604cd7dff4c6b8f1c1bf17c5418294af9 Mon Sep 17 00:00:00 2001 From: Tobias Rho Date: Thu, 10 May 2018 23:45:18 +0200 Subject: [PATCH 09/15] improved documentation / credits --- README.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index dd7170b..a7d8378 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,17 @@ # homebridge-bme680 -EXPERIMENTAL fork from https://github.com/rxseger/homebridge-bme280 offering initial bme680 support for homebridge. +EXPERIMENTAL fork from https://github.com/rxseger/homebridge-bme280 providing initial bme680 support for homebridge. Uses * https://github.com/trho/bsec_bme680_linux (fork from https://github.com/alexh-name/bsec_bme680_linux with json output) which relies on the closed source BME680 driver by Bosch [BME680_driver](https://github.com/BoschSensortec/BME680_driver) to calculate IAQ (Indoor Air Quality) * https://github.com/jorisvervuurt/jvsbme680 * The original IAQ value (0-500) is shown as a fake VOCDensity characteristic without available history +Tested with Pimoroni's BME680 breakout board (https://shop.pimoroni.com/collections/electronics/products/bme680) + Limitations: -* Only supports storage "fs" right now +* Only supports storage "fs", yet +* i2c address is not configurable, yet * Since it is based on the [fakegato-history](https://github.com/simont77/fakegato-history) library the accessory only shows up in the Eve app and not in Apple Home. Uses heuristic factor to convert between Bosch BSEC IAQ (Indoor Air Quality) and Eve Co2 ppm: @@ -136,8 +139,11 @@ e. Copy the code you're given, paste it into the command-line prompt, and press ## Credits +* * NorthernMan54 - Barometric Pressure and Device Polling * simont77 - History Service +* alexh-name - C wrapper for BME680 sensor BSEC library +* jorisvervuurt - Node.js module for Pimoroni's BME680 Breakout ## License From 3c400b093996fda7e851dca09534e37a8b3889bd Mon Sep 17 00:00:00 2001 From: Tobias Rho Date: Sat, 12 May 2018 01:08:04 +0200 Subject: [PATCH 10/15] use only one sensor implementation at once (bsec or jvsbme680), added temperature and humidity compensation values when using bsec library --- README.md | 6 +- dist/sensor.js | 274 ++++++++++++++++++++++------------------ dist/sensor.js.map | 2 +- src/sensor.ts | 262 ++++++++++++++++++++++---------------- src/typings/BME680.d.ts | 2 +- 5 files changed, 312 insertions(+), 234 deletions(-) diff --git a/README.md b/README.md index a7d8378..4f3e146 100644 --- a/README.md +++ b/README.md @@ -48,9 +48,8 @@ Untested! 1. Install Homebridge using `npm install -g homebridge` 2. Install this plugin `npm install -g trho/homebridge-bme680` 3. Compile bsec_bme680 executable by following https://github.com/trho/bsec_bme680_linux -4. *Copy bsec_bme680 to global node_modules/homebridge-bme680/lib* -5. *Copy bsec_iaq.config to homebridge storagePath (e.g. ~./homebridge)* -4. Update your configuration file - see below for an example +4. *Copy bsec_bme680 and bsec_iaq.config to homebridge storagePath (e.g. ~./homebridge)* +5. Update your configuration file - see below for an example Connect the BME680 chip to the I2C bus @@ -76,6 +75,7 @@ Example configuration: "name_temperature": "Temperature", "name_humidity": "Humidity", "name_air_quality": "Air Quality", + "useBsecLib": true, "options": { "i2cBusNo": 1, "i2cAddress": "0x76" diff --git a/dist/sensor.js b/dist/sensor.js index f843cfa..88d92c0 100644 --- a/dist/sensor.js +++ b/dist/sensor.js @@ -18,6 +18,10 @@ const moment = require('moment'); var os = require("os"); var hostname = os.hostname(); + // https://forums.pimoroni.com/t/bme680-observed-gas-ohms-readings/6608/4 + // compensation: + let bsecIAQTempCompensation = -0.4; // or 0.7 ? + let bsecIAQHumidityCompensation = 4.0; let Service; let Characteristic; var CustomCharacteristic; @@ -71,8 +75,32 @@ constructor(log, config) { this.log = log; this.polling = false; + /** + * + * IAQ Index Air Quality + 0 – 50 good10 + 51 – 100 average + 101 – 150 little bad + 151 – 200 bad + 201 – 300 worse + 301 – 500 very bad + + * + * Using Eve Room, the measured gas concentration of VOCs is converted into equivalent + CO2 concentration that is easy to read. The Eve app displays current and historical + measurements in ppm. Values are displayed in different colors and divided into + “Excellent” (450-700 ppm), “Good” (700-1100 ppm), “Acceptable“ (1100-1600 ppm), + “Moderate” (1600-2100 ppm), and “Poor” (above 2100 ppm). Depending on the + ventilation and number of people in the room, users should try to keep air quality at + an “Excellent” or “Good” level. + * + * @returns + * @memberof BME680Plugin + */ + this.readCounter = 0; this.log = log; this.name = config.name; + this.useBsecLib = config.useBsecLib || false; this.name_temperature = config.name_temperature || this.name; this.name_humidity = config.name_humidity || this.name; this.name_air_quality = config.name_air_quality || this.name; @@ -97,7 +125,9 @@ // Constants.I2CAddress.I2CA_PRIMARY this.log("init bme680 sensor ..."); // TODO: consider this.options.i2cAddress - this.sensor = new bme680_sensor.BME680(); + if (!this.useBsecLib) { + this.sensor = new bme680_sensor.BME680(); + } this.log("initialized bme680 sensor"); } catch (ex) { @@ -142,7 +172,16 @@ disableTimer: true, filename: this.name + ".json" }); - this.spawnIAQProcess(); + if (this.useBsecLib) { + this.spawnIAQProcess(); + } + else { + this.ensurePolling(); + } + } + toPpm(gas_resistance) { + // dummy implementation + return PPM_OFFSET + (CO2_MAX_VALUE - PPM_OFFSET) * gas_resistance / 1000000; } ensurePolling() { if (this.polling) { @@ -152,141 +191,129 @@ this.devicePolling(); setInterval(this.devicePolling.bind(this), this.refresh * 1000); } - devicePolling() { - debug("Polling BME680: " + new Date(Date.now()).toLocaleString()); - if (this.sensor) { - this.sensor.read() - .then(data => { - let defaultIAQ = 50; - const event = { + read() { + if (this.iaqData) { + return Promise.resolve(this.bsecResultsToEvent()); + } + else { + return this.sensor.read().then(data => { + debug("Polling BME680: " + new Date(Date.now()).toLocaleString()); + debug(data); + return { time: moment().unix(), temp: roundInt(data.temperature), pressure: roundInt(data.pressure), humidity: roundInt(data.humidity), - ppm: PPM_OFFSET // UNKNOWN + ppm: this.toPpm(data.gasResistance) // UNKNOWN }; - if (this.iaqData) { - // IAQ -> eve ppm - event.ppm = PPM_OFFSET + this.iaqData.iaq * FACTOR_BSEC_IAQ_EVE_PPM; - this.log(`iaq: ${this.iaqData.iaq}, eve quality: ${event.ppm} ppm`); - } - this.log(event); - this.loggingService.addEntry(event); - if (this.spreadsheetId) { - this.log_event_counter = this.log_event_counter + 1; - if (this.log_event_counter > 59) { - this.logger.storeBME(this.name, 0, roundInt(data.temperature), roundInt(data.humidity), roundInt(data.pressure)); - this.log_event_counter = 0; - } - } - let qualityDescription; - let homeKitQuality; - let ppm = event.ppm; - // if (iaq >= 0 && iaq < 50) { - // homeKitQuality = 1; - // qualityDescription = "good"; - // } else if (iaq >= 50 && iaq < 100) { - // homeKitQuality = 2; - // qualityDescription = "average"; - // } else if (iaq >= 100 && iaq < 150) { - // homeKitQuality = 3; - // qualityDescription = "little bad"; - // } else if (iaq >= 150 && iaq < 200) { - // homeKitQuality = 4; - // qualityDescription = "bad"; - // } else if (iaq >= 200 && iaq < 300) { - // homeKitQuality = 4; - // qualityDescription = "worse"; - // } else if (iaq >= 300) { - // homeKitQuality = 5; - // qualityDescription = "very bad"; - // } - if (ppm >= 450 && ppm < 700) { - homeKitQuality = 1; - qualityDescription = "good"; - } - else if (ppm >= 700 && ppm < 1100) { - homeKitQuality = 2; - qualityDescription = "average"; - } - else if (ppm >= 1100 && ppm < 1600) { - homeKitQuality = 3; - qualityDescription = "little bad"; - } - else if (ppm >= 1600 && ppm < 2100) { - homeKitQuality = 4; - qualityDescription = "bad"; - } - else if (ppm >= 2100) { - homeKitQuality = 5; - } - this.log(`iaq: ${homeKitQuality} ${qualityDescription}`); - this.temperatureService - .setCharacteristic(Characteristic.CurrentTemperature, roundInt(data.temperature)); - this.temperatureService - .setCharacteristic(CustomCharacteristic.AtmosphericPressureLevel, roundInt(data.pressure)); - this.humidityService - .setCharacteristic(Characteristic.CurrentRelativeHumidity, roundInt(data.humidity)); - this.airQualitySensor - .setCharacteristic(EveAirQualityPpmCharacteristic, roundInt(event.ppm)); - // Optional - if (this.iaqData) { - this.airQualitySensor - .setCharacteristic(Characteristic.VOCDensity, roundInt(this.iaqData.iaq)); - } - // Characteristic.AirQuality.UNKNOWN = 0; - // Characteristic.AirQuality.EXCELLENT = 1; - // Characteristic.AirQuality.GOOD = 2; - // Characteristic.AirQuality.FAIR = 3; - // Characteristic.AirQuality.INFERIOR = 4; - // Characteristic.AirQuality.POOR = 5; - this.airQualitySensor - .setCharacteristic(Characteristic.AirQuality, homeKitQuality); // 1(EXCELLENT) 2 (GOOD) 3 (FAIR) 4 (INFERIOR ) 5 (POOR) - }) - .catch(err => { - this.log(`BME read error: ${err}`); - debug(err.stack); - if (this.spreadsheetId) { - this.logger.storeBME(this.name, 1, -999, -999, -999); - } }); } - else { - this.log("Error: bme680 Not Initalized"); - } + } + bsecResultsToEvent() { + return { + time: moment().unix(), + temp: roundInt(this.iaqData.raw_temperature + bsecIAQTempCompensation), + humidity: roundInt(this.iaqData.raw_humidity + bsecIAQHumidityCompensation), + pressure: roundInt(this.iaqData.pressure), + ppm: PPM_OFFSET + this.iaqData.iaq * FACTOR_BSEC_IAQ_EVE_PPM + }; + } + devicePolling() { + this.read().then((event) => { + this.log(event); + this.loggingService.addEntry(event); + if (this.spreadsheetId) { + this.log_event_counter = this.log_event_counter + 1; + if (this.log_event_counter > 59) { + this.logger.storeBME(this.name, 0, event.temp, event.humidity, event.pressure); + this.log_event_counter = 0; + } + } + let qualityDescription; + let homeKitQuality; + let ppm = event.ppm; + // if (iaq >= 0 && iaq < 50) { + // homeKitQuality = 1; + // qualityDescription = "good"; + // } else if (iaq >= 50 && iaq < 100) { + // homeKitQuality = 2; + // qualityDescription = "average"; + // } else if (iaq >= 100 && iaq < 150) { + // homeKitQuality = 3; + // qualityDescription = "little bad"; + // } else if (iaq >= 150 && iaq < 200) { + // homeKitQuality = 4; + // qualityDescription = "bad"; + // } else if (iaq >= 200 && iaq < 300) { + // homeKitQuality = 4; + // qualityDescription = "worse"; + // } else if (iaq >= 300) { + // homeKitQuality = 5; + // qualityDescription = "very bad"; + // } + if (ppm >= 450 && ppm < 700) { + homeKitQuality = 1; + qualityDescription = "good"; + } + else if (ppm >= 700 && ppm < 1100) { + homeKitQuality = 2; + qualityDescription = "average"; + } + else if (ppm >= 1100 && ppm < 1600) { + homeKitQuality = 3; + qualityDescription = "little bad"; + } + else if (ppm >= 1600 && ppm < 2100) { + homeKitQuality = 4; + qualityDescription = "bad"; + } + else if (ppm >= 2100) { + homeKitQuality = 5; + } + this.log(`iaq: ${homeKitQuality} ${qualityDescription}`); + this.updateSensors(event); + // Optional + if (this.iaqData) { + this.airQualitySensor + .setCharacteristic(Characteristic.VOCDensity, roundInt(this.iaqData.iaq)); + } + // Characteristic.AirQuality.UNKNOWN = 0; + // Characteristic.AirQuality.EXCELLENT = 1; + // Characteristic.AirQuality.GOOD = 2; + // Characteristic.AirQuality.FAIR = 3; + // Characteristic.AirQuality.INFERIOR = 4; + // Characteristic.AirQuality.POOR = 5; + this.airQualitySensor + .setCharacteristic(Characteristic.AirQuality, homeKitQuality); // 1(EXCELLENT) 2 (GOOD) 3 (FAIR) 4 (INFERIOR ) 5 (POOR) + }) + .catch(err => { + this.log(`BME read error: ${err}`); + debug(err.stack); + if (this.spreadsheetId) { + this.logger.storeBME(this.name, 1, -999, -999, -999); + } + }); + } + updateSensors(event) { + this.temperatureService + .setCharacteristic(Characteristic.CurrentTemperature, event.temp); + this.temperatureService + .setCharacteristic(CustomCharacteristic.AtmosphericPressureLevel, event.pressure); + this.humidityService + .setCharacteristic(Characteristic.CurrentRelativeHumidity, event.humidity); + this.airQualitySensor + .setCharacteristic(EveAirQualityPpmCharacteristic, event.ppm); } getServices() { return [this.informationService, this.temperatureService, this.humidityService, this.airQualitySensor, this.loggingService]; } - /** - * - * IAQ Index Air Quality - 0 – 50 good10 - 51 – 100 average - 101 – 150 little bad - 151 – 200 bad - 201 – 300 worse - 301 – 500 very bad - - * - * Using Eve Room, the measured gas concentration of VOCs is converted into equivalent - CO2 concentration that is easy to read. The Eve app displays current and historical - measurements in ppm. Values are displayed in different colors and divided into - “Excellent” (450-700 ppm), “Good” (700-1100 ppm), “Acceptable“ (1100-1600 ppm), - “Moderate” (1600-2100 ppm), and “Poor” (above 2100 ppm). Depending on the - ventilation and number of people in the room, users should try to keep air quality at - an “Excellent” or “Good” level. - * - * @returns - * @memberof BME680Plugin - */ spawnIAQProcess() { if (this.iaqProcess) { return; } this.log(process.cwd()); // ensure that bsec_iaq.config is located in storagePath (e.g. ~./homebridge) and is writable ( for bsec_iaq.state): - this.iaqProcess = child_process_1.spawn(__dirname + '/../lib/bsec_bme680', [], { + this.iaqProcess = child_process_1.spawn(homebridgeRef.user.storagePath() + '/bsec_bme680', [], { cwd: homebridgeRef.user.storagePath(), env: process.env }); @@ -306,6 +333,11 @@ this.iaqProcess.stdout.on('data', (data) => { try { this.iaqData = JSON.parse(data); + this.readCounter++; + if (this.readCounter % 10 == 0) { // log and push every ~ 30 sec + this.updateSensors(this.bsecResultsToEvent()); + this.log(`${this.iaqData.raw_temperature} (${roundInt(this.iaqData.raw_temperature + bsecIAQTempCompensation)}) C, ${this.iaqData.raw_humidity} (${roundInt(this.iaqData.raw_humidity + bsecIAQHumidityCompensation)}) %RH, ${this.iaqData.iaq} IAQ`); + } this.ensurePolling(); } catch (e) { @@ -328,7 +360,7 @@ } } function roundInt(string) { - return Math.round(parseFloat(string) * 10) / 10; + return Math.round(parseFloat(string) * 100) / 100; } function debug(val) { global.console.debug(val); diff --git a/dist/sensor.js.map b/dist/sensor.js.map index dfbb547..c0c3736 100644 --- a/dist/sensor.js.map +++ b/dist/sensor.js.map @@ -1 +1 @@ -{"version":3,"file":"sensor.js","sourceRoot":"","sources":["../src/sensor.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sensor.js","sourceRoot":"","sources":["../src/sensor.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/sensor.ts b/src/sensor.ts index 7db3683..d35747b 100644 --- a/src/sensor.ts +++ b/src/sensor.ts @@ -11,6 +11,11 @@ const moment = require('moment'); var os = require("os"); var hostname = os.hostname(); + // https://forums.pimoroni.com/t/bme680-observed-gas-ohms-readings/6608/4 + // compensation: + let bsecIAQTempCompensation = -0.4; // or 0.7 ? + let bsecIAQHumidityCompensation = 4.0; + let Service: HAPNodeJS.Service; let Characteristic: HAPNodeJS.Characteristic; @@ -79,6 +84,12 @@ module.exports = (homebridge) => { class BME680Plugin { + useBsecLib: any; + toPpm(gas_resistance: number): number { + // dummy implementation + return PPM_OFFSET + (CO2_MAX_VALUE - PPM_OFFSET) * gas_resistance / 1000000; + } + iaqProcess: ChildProcess; loggingService: any; airQualitySensor: any; //AirQualitySensor; @@ -104,6 +115,8 @@ class BME680Plugin { constructor(private log, config) { this.log = log; this.name = config.name; + this.useBsecLib = config.useBsecLib || false; + this.name_temperature = config.name_temperature || this.name; this.name_humidity = config.name_humidity || this.name; this.name_air_quality = config.name_air_quality || this.name; @@ -129,7 +142,9 @@ class BME680Plugin { // Constants.I2CAddress.I2CA_PRIMARY this.log("init bme680 sensor ..."); // TODO: consider this.options.i2cAddress - this.sensor = new bme680_sensor.BME680(); + if (!this.useBsecLib) { + this.sensor = new bme680_sensor.BME680(); + } this.log("initialized bme680 sensor") } catch (ex) { this.log("bme680 initialization failed:", ex); @@ -186,7 +201,11 @@ class BME680Plugin { disableTimer: true, // timer is not triggered; therefore disabling timer and relying own interval updates filename: this.name + ".json" }); - this.spawnIAQProcess(); + if (this.useBsecLib) { + this.spawnIAQProcess(); + } else { + this.ensurePolling(); + } } @@ -201,114 +220,130 @@ class BME680Plugin { setInterval(this.devicePolling.bind(this), this.refresh * 1000); } - devicePolling() { - debug("Polling BME680: " + new Date(Date.now()).toLocaleString()); - if (this.sensor) { - this.sensor.read() - .then(data => { - let defaultIAQ = 50; - const event: RoomEvent = { - time: moment().unix(), - temp: roundInt(data.temperature), - pressure: roundInt(data.pressure), - humidity: roundInt(data.humidity), - ppm: PPM_OFFSET // UNKNOWN - }; - - if (this.iaqData) { - // IAQ -> eve ppm - event.ppm = PPM_OFFSET + this.iaqData.iaq * FACTOR_BSEC_IAQ_EVE_PPM; - this.log(`iaq: ${this.iaqData.iaq}, eve quality: ${event.ppm} ppm`); - } - this.log(event); - - this.loggingService.addEntry(event); - - if (this.spreadsheetId) { - this.log_event_counter = this.log_event_counter + 1; - if (this.log_event_counter > 59) { - this.logger.storeBME(this.name, 0, roundInt(data.temperature), roundInt(data.humidity), roundInt(data.pressure)); - this.log_event_counter = 0; - } - } - let qualityDescription; - let homeKitQuality; - let ppm = event.ppm; - - // if (iaq >= 0 && iaq < 50) { - // homeKitQuality = 1; - // qualityDescription = "good"; - // } else if (iaq >= 50 && iaq < 100) { - // homeKitQuality = 2; - // qualityDescription = "average"; - // } else if (iaq >= 100 && iaq < 150) { - // homeKitQuality = 3; - // qualityDescription = "little bad"; - // } else if (iaq >= 150 && iaq < 200) { - // homeKitQuality = 4; - // qualityDescription = "bad"; - // } else if (iaq >= 200 && iaq < 300) { - // homeKitQuality = 4; - // qualityDescription = "worse"; - // } else if (iaq >= 300) { - // homeKitQuality = 5; - // qualityDescription = "very bad"; - // } - - if (ppm >= 450 && ppm < 700) { - homeKitQuality = 1; - qualityDescription = "good"; - } else if (ppm >= 700 && ppm < 1100) { - homeKitQuality = 2; - qualityDescription = "average"; - } else if (ppm >= 1100 && ppm < 1600) { - homeKitQuality = 3; - qualityDescription = "little bad"; - } else if (ppm >= 1600 && ppm < 2100) { - homeKitQuality = 4; - qualityDescription = "bad"; - } else if (ppm >= 2100) { - homeKitQuality = 5; - } - - this.log(`iaq: ${homeKitQuality} ${qualityDescription}`) - this.temperatureService - .setCharacteristic(Characteristic.CurrentTemperature, roundInt(data.temperature)); - this.temperatureService - .setCharacteristic(CustomCharacteristic.AtmosphericPressureLevel, roundInt(data.pressure)); - this.humidityService - .setCharacteristic(Characteristic.CurrentRelativeHumidity, roundInt(data.humidity)); - this.airQualitySensor - .setCharacteristic(EveAirQualityPpmCharacteristic, roundInt(event.ppm)); - - // Optional - if (this.iaqData) { - this.airQualitySensor - .setCharacteristic(Characteristic.VOCDensity, roundInt(this.iaqData.iaq)); - } - - // Characteristic.AirQuality.UNKNOWN = 0; - // Characteristic.AirQuality.EXCELLENT = 1; - // Characteristic.AirQuality.GOOD = 2; - // Characteristic.AirQuality.FAIR = 3; - // Characteristic.AirQuality.INFERIOR = 4; - // Characteristic.AirQuality.POOR = 5; - this.airQualitySensor - .setCharacteristic(Characteristic.AirQuality, homeKitQuality); // 1(EXCELLENT) 2 (GOOD) 3 (FAIR) 4 (INFERIOR ) 5 (POOR) - }) - .catch(err => { - this.log(`BME read error: ${err}`); - debug(err.stack); - if (this.spreadsheetId) { - this.logger.storeBME(this.name, 1, -999, -999, -999); - } - - }); + read(): Promise { + if (this.iaqData) { + return Promise.resolve( + this.bsecResultsToEvent()); } else { - this.log("Error: bme680 Not Initalized"); + return this.sensor.read().then(data => { + debug("Polling BME680: " + new Date(Date.now()).toLocaleString()); + debug(data); + return { + time: moment().unix(), + temp: roundInt(data.temperature), + pressure: roundInt(data.pressure), + humidity: roundInt(data.humidity), + ppm: this.toPpm(data.gasResistance) // UNKNOWN + }; + }); } } + private bsecResultsToEvent(): RoomEvent { + + return { + time: moment().unix(), + temp: roundInt(this.iaqData.raw_temperature + bsecIAQTempCompensation), + humidity: roundInt(this.iaqData.raw_humidity + bsecIAQHumidityCompensation), + pressure: roundInt(this.iaqData.pressure), + ppm: PPM_OFFSET + this.iaqData.iaq * FACTOR_BSEC_IAQ_EVE_PPM + }; + } + + devicePolling() { + + this.read().then((event) => { + this.log(event); + + this.loggingService.addEntry(event); + + if (this.spreadsheetId) { + this.log_event_counter = this.log_event_counter + 1; + if (this.log_event_counter > 59) { + this.logger.storeBME(this.name, 0, event.temp, event.humidity, event.pressure); + this.log_event_counter = 0; + } + } + let qualityDescription; + let homeKitQuality; + let ppm = event.ppm; + + // if (iaq >= 0 && iaq < 50) { + // homeKitQuality = 1; + // qualityDescription = "good"; + // } else if (iaq >= 50 && iaq < 100) { + // homeKitQuality = 2; + // qualityDescription = "average"; + // } else if (iaq >= 100 && iaq < 150) { + // homeKitQuality = 3; + // qualityDescription = "little bad"; + // } else if (iaq >= 150 && iaq < 200) { + // homeKitQuality = 4; + // qualityDescription = "bad"; + // } else if (iaq >= 200 && iaq < 300) { + // homeKitQuality = 4; + // qualityDescription = "worse"; + // } else if (iaq >= 300) { + // homeKitQuality = 5; + // qualityDescription = "very bad"; + // } + + if (ppm >= 450 && ppm < 700) { + homeKitQuality = 1; + qualityDescription = "good"; + } else if (ppm >= 700 && ppm < 1100) { + homeKitQuality = 2; + qualityDescription = "average"; + } else if (ppm >= 1100 && ppm < 1600) { + homeKitQuality = 3; + qualityDescription = "little bad"; + } else if (ppm >= 1600 && ppm < 2100) { + homeKitQuality = 4; + qualityDescription = "bad"; + } else if (ppm >= 2100) { + homeKitQuality = 5; + } + + this.log(`iaq: ${homeKitQuality} ${qualityDescription}`) + this.updateSensors(event); + + // Optional + if (this.iaqData) { + this.airQualitySensor + .setCharacteristic(Characteristic.VOCDensity, roundInt(this.iaqData.iaq)); + } + + // Characteristic.AirQuality.UNKNOWN = 0; + // Characteristic.AirQuality.EXCELLENT = 1; + // Characteristic.AirQuality.GOOD = 2; + // Characteristic.AirQuality.FAIR = 3; + // Characteristic.AirQuality.INFERIOR = 4; + // Characteristic.AirQuality.POOR = 5; + this.airQualitySensor + .setCharacteristic(Characteristic.AirQuality, homeKitQuality); // 1(EXCELLENT) 2 (GOOD) 3 (FAIR) 4 (INFERIOR ) 5 (POOR) + }) + .catch(err => { + this.log(`BME read error: ${err}`); + debug(err.stack); + if (this.spreadsheetId) { + this.logger.storeBME(this.name, 1, -999, -999, -999); + } + + }); + } + + private updateSensors(event: RoomEvent) { + this.temperatureService + .setCharacteristic(Characteristic.CurrentTemperature, event.temp); + this.temperatureService + .setCharacteristic(CustomCharacteristic.AtmosphericPressureLevel, event.pressure); + this.humidityService + .setCharacteristic(Characteristic.CurrentRelativeHumidity, event.humidity); + this.airQualitySensor + .setCharacteristic(EveAirQualityPpmCharacteristic, event.ppm); + + } + getServices() { return [this.informationService, this.temperatureService, this.humidityService, this.airQualitySensor, this.loggingService] } @@ -336,6 +371,9 @@ class BME680Plugin { * @returns * @memberof BME680Plugin */ + + readCounter = 0; + spawnIAQProcess() { if (this.iaqProcess) { return; @@ -344,7 +382,7 @@ class BME680Plugin { this.log(process.cwd()) // ensure that bsec_iaq.config is located in storagePath (e.g. ~./homebridge) and is writable ( for bsec_iaq.state): - this.iaqProcess = spawn(__dirname + '/../lib/bsec_bme680', [], + this.iaqProcess = spawn(homebridgeRef.user.storagePath() + '/bsec_bme680', [], { cwd: homebridgeRef.user.storagePath(), env: process.env @@ -369,6 +407,11 @@ class BME680Plugin { this.iaqProcess.stdout.on('data', (data: string) => { try { this.iaqData = JSON.parse(data); + this.readCounter++; + if (this.readCounter % 10 == 0) { // log and push every ~ 30 sec + this.updateSensors(this.bsecResultsToEvent()); + this.log(`${this.iaqData.raw_temperature} (${roundInt(this.iaqData.raw_temperature+ bsecIAQTempCompensation)}) C, ${this.iaqData.raw_humidity} (${roundInt(this.iaqData.raw_humidity+ bsecIAQHumidityCompensation)}) %RH, ${this.iaqData.iaq} IAQ`); + } this.ensurePolling(); } catch (e) { this.log("unable to parse iaq result: " + e); @@ -394,7 +437,7 @@ class BME680Plugin { } function roundInt(string) { - return Math.round(parseFloat(string) * 10) / 10; + return Math.round(parseFloat(string) * 100) / 100; } @@ -405,6 +448,8 @@ function debug(val: any) { interface IAQResult { "iaq": number; "iaq_accuracy": number; + "raw_temperature": number; + "raw_humidity": number; "temperature": number; "humidity": number; "pressure": number; @@ -418,3 +463,4 @@ interface RoomEvent { humidity: number; ppm: number; } + diff --git a/src/typings/BME680.d.ts b/src/typings/BME680.d.ts index 0cbce6b..be9ac60 100644 --- a/src/typings/BME680.d.ts +++ b/src/typings/BME680.d.ts @@ -97,5 +97,5 @@ declare interface BME680Result { temperature:number; pressure:number; humidity:number; - gas_resistance:number; + gasResistance:number; } \ No newline at end of file From 83ce338c286944d680618477e09ddc10aca39fa2 Mon Sep 17 00:00:00 2001 From: Tobias Rho Date: Sat, 12 May 2018 17:07:16 +0200 Subject: [PATCH 11/15] version 0.0.0, reduced update intervals, use mean values instead of raw sensor values, added temperatur and humidity compensations --- History.md | 10 +++++ dist/sensor.js | 67 +++++++++++++++++++++++++------ dist/sensor.js.map | 2 +- package.json | 2 +- src/sensor.ts | 98 +++++++++++++++++++++++++++++++++++----------- 5 files changed, 141 insertions(+), 38 deletions(-) create mode 100644 History.md diff --git a/History.md b/History.md new file mode 100644 index 0000000..6dc97b6 --- /dev/null +++ b/History.md @@ -0,0 +1,10 @@ +### v0.0.2 +* Reduced characteristic service updates (temperatur, humidity, IAQ, pressure) interval to 1 minute and history update interval to 10 min +* Calculate mean temperatur, humidity, IAQ, pressure value from last 20 measurement in a minute interval +* Added temperatur and humidity compensation when reading IAQ values with heated sensor with bsec_bme680 library + * see also kvaruni's comment on callibration & compensation: + * https://forums.pimoroni.com/t/bme680-observed-gas-ohms-readings/6608/5 + + +### v0.0.1 +* Initial version, forked from https://github.com/rxseger/homebridge-bme280 \ No newline at end of file diff --git a/dist/sensor.js b/dist/sensor.js index 88d92c0..78f35ee 100644 --- a/dist/sensor.js +++ b/dist/sensor.js @@ -18,9 +18,11 @@ const moment = require('moment'); var os = require("os"); var hostname = os.hostname(); - // https://forums.pimoroni.com/t/bme680-observed-gas-ohms-readings/6608/4 - // compensation: - let bsecIAQTempCompensation = -0.4; // or 0.7 ? + // temperatur and humidity compensation when reading IAQ values with heated sensor: + // see also kvaruni's comment on callibration & compensation: + // https://forums.pimoroni.com/t/bme680-observed-gas-ohms-readings/6608/5 + // TODO: make configurable: + let bsecIAQTempCompensation = -0.5; // or 0.7 ? let bsecIAQHumidityCompensation = 4.0; let Service; let Characteristic; @@ -29,7 +31,7 @@ let EveAirQualityPpmCharacteristic; let EveAirQualityUnknownCharacteristic; // TODO: make configurable - const REFRESH_TIME_IN_MINUTES = 5; + const REFRESH_TIME_IN_MINUTES = 10; const CO2_MAX_VALUE = 3000; // I am assuming that iaq 500 ~ 3000 ppm const BSEC_IAQ_MAX = 500; const PPM_OFFSET = 450; @@ -75,6 +77,7 @@ constructor(log, config) { this.log = log; this.polling = false; + this.MAX_MEASUREMENT_COUNT = 20; // collect data for 1 min (3*20 sec) /** * * IAQ Index Air Quality @@ -189,7 +192,12 @@ } this.polling = true; this.devicePolling(); - setInterval(this.devicePolling.bind(this), this.refresh * 1000); + let now = new Date(); + let firstPollAlignedWithHour = this.refresh - (now.getMinutes() * 60 + now.getSeconds()) % (this.refresh); + this.log(`starting first poll in ${Math.round(firstPollAlignedWithHour / 60)} min, ${firstPollAlignedWithHour % 60} sec`); + setTimeout(() => { + setInterval(this.devicePolling.bind(this), this.refresh * 1000); + }, firstPollAlignedWithHour); } read() { if (this.iaqData) { @@ -204,7 +212,7 @@ temp: roundInt(data.temperature), pressure: roundInt(data.pressure), humidity: roundInt(data.humidity), - ppm: this.toPpm(data.gasResistance) // UNKNOWN + ppm: this.toPpm(data.gasResistance) // heuristic }; }); } @@ -220,8 +228,15 @@ } devicePolling() { this.read().then((event) => { - this.log(event); - this.loggingService.addEntry(event); + if (this.aggMeasurements) { + this.log(this.aggMeasurements); + this.aggMeasurements.time = moment().unix(); + this.loggingService.addEntry(this.aggMeasurements); + } + else { + this.log(event); + this.loggingService.addEntry(event); + } if (this.spreadsheetId) { this.log_event_counter = this.log_event_counter + 1; if (this.log_event_counter > 59) { @@ -271,7 +286,12 @@ homeKitQuality = 5; } this.log(`iaq: ${homeKitQuality} ${qualityDescription}`); - this.updateSensors(event); + if (this.aggMeasurements) { + this.updateSensors(this.aggMeasurements); + } + else { + this.updateSensors(event); + } // Optional if (this.iaqData) { this.airQualitySensor @@ -304,6 +324,29 @@ this.airQualitySensor .setCharacteristic(EveAirQualityPpmCharacteristic, event.ppm); } + aggregateMeasurements(event) { + if (!this.sumsMeasurements) { + this.sumsMeasurements = event; + } + else { + this.sumsMeasurements.temp += event.temp; + this.sumsMeasurements.humidity += event.humidity; + this.sumsMeasurements.pressure += event.pressure; + this.sumsMeasurements.ppm += event.ppm; + } + if (this.readCounter % this.MAX_MEASUREMENT_COUNT == 0) { // log and push aggregated values every ~ 30 sec + this.sumsMeasurements.time = event.time; + this.sumsMeasurements.temp = roundInt(this.sumsMeasurements.temp / this.MAX_MEASUREMENT_COUNT); + this.sumsMeasurements.humidity = roundInt(this.sumsMeasurements.humidity / this.MAX_MEASUREMENT_COUNT); + this.sumsMeasurements.pressure = roundInt(this.sumsMeasurements.pressure / this.MAX_MEASUREMENT_COUNT); + this.sumsMeasurements.ppm = roundInt(this.sumsMeasurements.ppm / this.MAX_MEASUREMENT_COUNT); + this.aggMeasurements = this.sumsMeasurements; + let agg = this.aggMeasurements; + this.sumsMeasurements = undefined; + this.updateSensors(this.aggMeasurements); + this.log(`last: ${agg.temp} (raw: ${this.iaqData.raw_temperature}, comp: ${roundInt(this.iaqData.raw_temperature + bsecIAQTempCompensation)}) C, ${agg.humidity} (raw: ${this.iaqData.raw_humidity}, comp: ${roundInt(this.iaqData.raw_humidity + bsecIAQHumidityCompensation)}) %RH, ${agg.ppm} ppm, IAQ: ${this.iaqData.iaq} IAQ, IAQ accuray: ${this.iaqData.iaq_accuracy}`); + } + } getServices() { return [this.informationService, this.temperatureService, this.humidityService, this.airQualitySensor, this.loggingService]; } @@ -334,10 +377,8 @@ try { this.iaqData = JSON.parse(data); this.readCounter++; - if (this.readCounter % 10 == 0) { // log and push every ~ 30 sec - this.updateSensors(this.bsecResultsToEvent()); - this.log(`${this.iaqData.raw_temperature} (${roundInt(this.iaqData.raw_temperature + bsecIAQTempCompensation)}) C, ${this.iaqData.raw_humidity} (${roundInt(this.iaqData.raw_humidity + bsecIAQHumidityCompensation)}) %RH, ${this.iaqData.iaq} IAQ`); - } + const event = this.bsecResultsToEvent(); + this.aggregateMeasurements(event); this.ensurePolling(); } catch (e) { diff --git a/dist/sensor.js.map b/dist/sensor.js.map index c0c3736..95d72e6 100644 --- a/dist/sensor.js.map +++ b/dist/sensor.js.map @@ -1 +1 @@ -{"version":3,"file":"sensor.js","sourceRoot":"","sources":["../src/sensor.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sensor.js","sourceRoot":"","sources":["../src/sensor.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index c053dec..e9ac2da 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homebridge-bme680", - "version": "1.2.1", + "version": "0.0.2", "description": "BME680 temperature/humidity/pressure sensor bridge for Homebridge: https://github.com/nfarina/homebridge\"", "main": "dist/sensor.js", "scripts": { diff --git a/src/sensor.ts b/src/sensor.ts index d35747b..c0d65de 100644 --- a/src/sensor.ts +++ b/src/sensor.ts @@ -11,10 +11,12 @@ const moment = require('moment'); var os = require("os"); var hostname = os.hostname(); - // https://forums.pimoroni.com/t/bme680-observed-gas-ohms-readings/6608/4 - // compensation: - let bsecIAQTempCompensation = -0.4; // or 0.7 ? - let bsecIAQHumidityCompensation = 4.0; +// temperatur and humidity compensation when reading IAQ values with heated sensor: +// see also kvaruni's comment on callibration & compensation: +// https://forums.pimoroni.com/t/bme680-observed-gas-ohms-readings/6608/5 +// TODO: make configurable: +let bsecIAQTempCompensation = -0.5; // or 0.7 ? +let bsecIAQHumidityCompensation = 4.0; let Service: HAPNodeJS.Service; @@ -26,7 +28,7 @@ let EveAirQualityPpmCharacteristic; let EveAirQualityUnknownCharacteristic; // TODO: make configurable -const REFRESH_TIME_IN_MINUTES = 5; +const REFRESH_TIME_IN_MINUTES = 10; const CO2_MAX_VALUE = 3000; // I am assuming that iaq 500 ~ 3000 ppm const BSEC_IAQ_MAX = 500; @@ -217,7 +219,14 @@ class BME680Plugin { } this.polling = true; this.devicePolling(); - setInterval(this.devicePolling.bind(this), this.refresh * 1000); + + let now = new Date(); + let firstPollAlignedWithHour = this.refresh - (now.getMinutes() * 60 + now.getSeconds()) % (this.refresh); + this.log(`starting first poll in ${Math.round(firstPollAlignedWithHour / 60)} min, ${firstPollAlignedWithHour % 60} sec`); + setTimeout(() => { + setInterval(this.devicePolling.bind(this), this.refresh * 1000); + }, firstPollAlignedWithHour); + } read(): Promise { @@ -233,7 +242,7 @@ class BME680Plugin { temp: roundInt(data.temperature), pressure: roundInt(data.pressure), humidity: roundInt(data.humidity), - ppm: this.toPpm(data.gasResistance) // UNKNOWN + ppm: this.toPpm(data.gasResistance) // heuristic }; }); } @@ -253,9 +262,15 @@ class BME680Plugin { devicePolling() { this.read().then((event) => { - this.log(event); - this.loggingService.addEntry(event); + if (this.aggMeasurements) { + this.log(this.aggMeasurements); + this.aggMeasurements.time = moment().unix(); + this.loggingService.addEntry(this.aggMeasurements); + } else { + this.log(event); + this.loggingService.addEntry(event); + } if (this.spreadsheetId) { this.log_event_counter = this.log_event_counter + 1; @@ -305,7 +320,11 @@ class BME680Plugin { } this.log(`iaq: ${homeKitQuality} ${qualityDescription}`) - this.updateSensors(event); + if (this.aggMeasurements) { + this.updateSensors(this.aggMeasurements); + } else { + this.updateSensors(event); + } // Optional if (this.iaqData) { @@ -332,7 +351,13 @@ class BME680Plugin { }); } + MAX_MEASUREMENT_COUNT = 20; // collect data for 1 min (3*20 sec) + + aggMeasurements: RoomEvent; + sumsMeasurements: RoomEvent; + private updateSensors(event: RoomEvent) { + this.temperatureService .setCharacteristic(Characteristic.CurrentTemperature, event.temp); this.temperatureService @@ -344,6 +369,33 @@ class BME680Plugin { } + private aggregateMeasurements(event: RoomEvent) { + if (!this.sumsMeasurements) { + this.sumsMeasurements = event; + } else { + this.sumsMeasurements.temp += event.temp; + this.sumsMeasurements.humidity += event.humidity; + this.sumsMeasurements.pressure += event.pressure; + this.sumsMeasurements.ppm += event.ppm; + } + if (this.readCounter % this.MAX_MEASUREMENT_COUNT == 0) { // log and push aggregated values every ~ 30 sec + this.sumsMeasurements.time = event.time; + this.sumsMeasurements.temp = roundInt(this.sumsMeasurements.temp / this.MAX_MEASUREMENT_COUNT); + this.sumsMeasurements.humidity = roundInt(this.sumsMeasurements.humidity / this.MAX_MEASUREMENT_COUNT); + this.sumsMeasurements.pressure = roundInt(this.sumsMeasurements.pressure / this.MAX_MEASUREMENT_COUNT); + this.sumsMeasurements.ppm = roundInt(this.sumsMeasurements.ppm / this.MAX_MEASUREMENT_COUNT); + this.aggMeasurements = this.sumsMeasurements; + + let agg = this.aggMeasurements; + this.sumsMeasurements = undefined; + + this.updateSensors(this.aggMeasurements); + this.log(`last: ${agg.temp} (raw: ${this.iaqData.raw_temperature}, comp: ${roundInt(this.iaqData.raw_temperature + bsecIAQTempCompensation)}) C, ${agg.humidity} (raw: ${this.iaqData.raw_humidity}, comp: ${roundInt(this.iaqData.raw_humidity + bsecIAQHumidityCompensation)}) %RH, ${agg.ppm} ppm, IAQ: ${this.iaqData.iaq} IAQ, IAQ accuray: ${this.iaqData.iaq_accuracy}`); + } + + + } + getServices() { return [this.informationService, this.temperatureService, this.humidityService, this.airQualitySensor, this.loggingService] } @@ -408,10 +460,10 @@ class BME680Plugin { try { this.iaqData = JSON.parse(data); this.readCounter++; - if (this.readCounter % 10 == 0) { // log and push every ~ 30 sec - this.updateSensors(this.bsecResultsToEvent()); - this.log(`${this.iaqData.raw_temperature} (${roundInt(this.iaqData.raw_temperature+ bsecIAQTempCompensation)}) C, ${this.iaqData.raw_humidity} (${roundInt(this.iaqData.raw_humidity+ bsecIAQHumidityCompensation)}) %RH, ${this.iaqData.iaq} IAQ`); - } + + const event = this.bsecResultsToEvent(); + this.aggregateMeasurements(event); + this.ensurePolling(); } catch (e) { this.log("unable to parse iaq result: " + e); @@ -446,15 +498,15 @@ function debug(val: any) { } interface IAQResult { - "iaq": number; - "iaq_accuracy": number; - "raw_temperature": number; - "raw_humidity": number; - "temperature": number; - "humidity": number; - "pressure": number; - "gas_pressure": number; - "bsec_status": number; + iaq: number; + iaq_accuracy: number; + raw_temperature: number; + raw_humidity: number; + temperature: number; + humidity: number; + pressure: number; + gas_pressure: number; + bsec_status: number; } interface RoomEvent { time: number; From aa670c53bf293b40728edc17313ad1eb57da0fca Mon Sep 17 00:00:00 2001 From: Tobias Rho Date: Sat, 12 May 2018 20:18:10 +0200 Subject: [PATCH 12/15] improved documentation --- README.md | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 4f3e146..cdb42ed 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,6 @@ temperature/humidity/barometric pressure sensor service plugin for [Homebridge]( [![NPM Downloads](https://img.shields.io/npm/dm/homebridge-bme280.svg?style=flat)](https://npmjs.org/package/homebridge-bme280) * Display of temperature, humidity and Barometric Pressure from a BME280 connected to a RaspberryPI. -* Archives results every hour to a google spreadsheet * Support the graphing feature of the Eve app for trends Uses [bme280-sensor](https://www.npmjs.com/package/bme280-sensor) @@ -63,7 +62,6 @@ Connect the BME680 chip to the I2C bus * `options`: options for [bme280-sensor](https://www.npmjs.com/package/bme280-sensor) * `spreadsheetId` ( optional ): Log data to a google sheet, this is part of the URL of your spreadsheet. ie the spreadsheet ID in the URL https://docs.google.com/spreadsheets/d/abc1234567/edit#gid=0 is "abc1234567". (TODO: not implemented, yet) -If you get an I/O error, make sure the I2C address is correct (usually 0x76 or 0x77 depending on a jumper). Example configuration: @@ -74,17 +72,23 @@ Example configuration: "name": "Sensor", "name_temperature": "Temperature", "name_humidity": "Humidity", - "name_air_quality": "Air Quality", "useBsecLib": true, - "options": { - "i2cBusNo": 1, - "i2cAddress": "0x76" - } + "name_air_quality": "Air Quality", + "useBsecLib": true } ] ``` -This plugin creates two services: TemperatureSensor and HumiditySensor. +The option "useBsecLib" only works if you placed compiled bsec_bme680 in homebridge storagePath. +By omitting this option this plugin relies on jvsbme680's sensor readings. In this case IAQ is just a dummy value. +There is an advantage using this simpler solution: +The temperature and humidity readings are much more precise in this case and no callibration & compensation is necessary in this case. +Once the compensation is this configurable I will elaborate this further. +For now see kvaruni's comment on callibration & compensation for gas readings: +https://forums.pimoroni.com/t/bme680-observed-gas-ohms-readings/6608/5 + + +This plugin creates three services: TemperatureSensor, HumiditySensor and AirQualitySensor. ## Optional - Enable access to Google Sheets to log data From 0a1fea8737b3a8f4f8176b93110a5b91bcff1e66 Mon Sep 17 00:00:00 2001 From: Tobias Rho Date: Sun, 13 May 2018 11:59:48 +0200 Subject: [PATCH 13/15] version 0.0.3: fixed history update scheduling --- History.md | 4 +++- dist/sensor.js | 50 ++++++++++++++++++++++++++------------------- dist/sensor.js.map | 2 +- package.json | 2 +- src/sensor.ts | 51 +++++++++++++++++++++++++++------------------- 5 files changed, 64 insertions(+), 45 deletions(-) diff --git a/History.md b/History.md index 6dc97b6..1b30f7e 100644 --- a/History.md +++ b/History.md @@ -1,3 +1,6 @@ +### v0.0.3 +* fixed history update scheduling + ### v0.0.2 * Reduced characteristic service updates (temperatur, humidity, IAQ, pressure) interval to 1 minute and history update interval to 10 min * Calculate mean temperatur, humidity, IAQ, pressure value from last 20 measurement in a minute interval @@ -5,6 +8,5 @@ * see also kvaruni's comment on callibration & compensation: * https://forums.pimoroni.com/t/bme680-observed-gas-ohms-readings/6608/5 - ### v0.0.1 * Initial version, forked from https://github.com/rxseger/homebridge-bme280 \ No newline at end of file diff --git a/dist/sensor.js b/dist/sensor.js index 78f35ee..ee10e4a 100644 --- a/dist/sensor.js +++ b/dist/sensor.js @@ -22,7 +22,7 @@ // see also kvaruni's comment on callibration & compensation: // https://forums.pimoroni.com/t/bme680-observed-gas-ohms-readings/6608/5 // TODO: make configurable: - let bsecIAQTempCompensation = -0.5; // or 0.7 ? + let bsecIAQTempCompensation = -0.35; // or 0.7 ? let bsecIAQHumidityCompensation = 4.0; let Service; let Characteristic; @@ -136,7 +136,7 @@ catch (ex) { this.log("bme680 initialization failed:", ex); } - this.devicePolling.bind(this); + this.updateHistoryAndCurrentServices.bind(this); this.informationService = new Service.AccessoryInformation(undefined, undefined, undefined); this.informationService .setCharacteristic(Characteristic.Manufacturer, "Bosch") @@ -191,13 +191,19 @@ return; } this.polling = true; - this.devicePolling(); + //this.devicePolling(); + this.scheduleUpdate(); + } + scheduleUpdate() { let now = new Date(); let firstPollAlignedWithHour = this.refresh - (now.getMinutes() * 60 + now.getSeconds()) % (this.refresh); - this.log(`starting first poll in ${Math.round(firstPollAlignedWithHour / 60)} min, ${firstPollAlignedWithHour % 60} sec`); + this.log(`scheduled history update in ${Math.round(firstPollAlignedWithHour / 60)} min, ${firstPollAlignedWithHour % 60} sec`); + // update sensors, but not history: + this.updateHistoryAndCurrentServices(false); setTimeout(() => { - setInterval(this.devicePolling.bind(this), this.refresh * 1000); - }, firstPollAlignedWithHour); + this.updateHistoryAndCurrentServices(); + this.scheduleUpdate(); + }, firstPollAlignedWithHour * 1000); } read() { if (this.iaqData) { @@ -226,22 +232,24 @@ ppm: PPM_OFFSET + this.iaqData.iaq * FACTOR_BSEC_IAQ_EVE_PPM }; } - devicePolling() { + updateHistoryAndCurrentServices(updateHistory = true) { this.read().then((event) => { - if (this.aggMeasurements) { - this.log(this.aggMeasurements); - this.aggMeasurements.time = moment().unix(); - this.loggingService.addEntry(this.aggMeasurements); - } - else { - this.log(event); - this.loggingService.addEntry(event); - } - if (this.spreadsheetId) { - this.log_event_counter = this.log_event_counter + 1; - if (this.log_event_counter > 59) { - this.logger.storeBME(this.name, 0, event.temp, event.humidity, event.pressure); - this.log_event_counter = 0; + if (updateHistory) { + if (this.aggMeasurements) { + this.log(this.aggMeasurements); + this.aggMeasurements.time = moment().unix(); + this.loggingService.addEntry(this.aggMeasurements); + } + else { + this.log(event); + this.loggingService.addEntry(event); + } + if (this.spreadsheetId) { + this.log_event_counter = this.log_event_counter + 1; + if (this.log_event_counter > 59) { + this.logger.storeBME(this.name, 0, event.temp, event.humidity, event.pressure); + this.log_event_counter = 0; + } } } let qualityDescription; diff --git a/dist/sensor.js.map b/dist/sensor.js.map index 95d72e6..01cc1af 100644 --- a/dist/sensor.js.map +++ b/dist/sensor.js.map @@ -1 +1 @@ -{"version":3,"file":"sensor.js","sourceRoot":"","sources":["../src/sensor.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sensor.js","sourceRoot":"","sources":["../src/sensor.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index e9ac2da..c1780f9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homebridge-bme680", - "version": "0.0.2", + "version": "0.0.3", "description": "BME680 temperature/humidity/pressure sensor bridge for Homebridge: https://github.com/nfarina/homebridge\"", "main": "dist/sensor.js", "scripts": { diff --git a/src/sensor.ts b/src/sensor.ts index c0d65de..4cbbee3 100644 --- a/src/sensor.ts +++ b/src/sensor.ts @@ -15,7 +15,7 @@ var hostname = os.hostname(); // see also kvaruni's comment on callibration & compensation: // https://forums.pimoroni.com/t/bme680-observed-gas-ohms-readings/6608/5 // TODO: make configurable: -let bsecIAQTempCompensation = -0.5; // or 0.7 ? +let bsecIAQTempCompensation = -0.35; // or 0.7 ? let bsecIAQHumidityCompensation = 4.0; @@ -151,7 +151,7 @@ class BME680Plugin { } catch (ex) { this.log("bme680 initialization failed:", ex); } - this.devicePolling.bind(this); + this.updateHistoryAndCurrentServices.bind(this); this.informationService = new Service.AccessoryInformation(undefined, undefined, undefined); @@ -218,15 +218,22 @@ class BME680Plugin { return; } this.polling = true; - this.devicePolling(); + //this.devicePolling(); + this.scheduleUpdate(); + } + + private scheduleUpdate() { let now = new Date(); let firstPollAlignedWithHour = this.refresh - (now.getMinutes() * 60 + now.getSeconds()) % (this.refresh); - this.log(`starting first poll in ${Math.round(firstPollAlignedWithHour / 60)} min, ${firstPollAlignedWithHour % 60} sec`); - setTimeout(() => { - setInterval(this.devicePolling.bind(this), this.refresh * 1000); - }, firstPollAlignedWithHour); + this.log(`scheduled history update in ${Math.round(firstPollAlignedWithHour / 60)} min, ${firstPollAlignedWithHour % 60} sec`); + // update sensors, but not history: + this.updateHistoryAndCurrentServices(false); + setTimeout(() => { + this.updateHistoryAndCurrentServices(); + this.scheduleUpdate(); + }, firstPollAlignedWithHour * 1000); } read(): Promise { @@ -259,24 +266,26 @@ class BME680Plugin { }; } - devicePolling() { + updateHistoryAndCurrentServices(updateHistory = true) { this.read().then((event) => { - if (this.aggMeasurements) { - this.log(this.aggMeasurements); - this.aggMeasurements.time = moment().unix(); - this.loggingService.addEntry(this.aggMeasurements); - } else { - this.log(event); - this.loggingService.addEntry(event); - } + if (updateHistory) { + if (this.aggMeasurements) { + this.log(this.aggMeasurements); + this.aggMeasurements.time = moment().unix(); + this.loggingService.addEntry(this.aggMeasurements); + } else { + this.log(event); + this.loggingService.addEntry(event); + } - if (this.spreadsheetId) { - this.log_event_counter = this.log_event_counter + 1; - if (this.log_event_counter > 59) { - this.logger.storeBME(this.name, 0, event.temp, event.humidity, event.pressure); - this.log_event_counter = 0; + if (this.spreadsheetId) { + this.log_event_counter = this.log_event_counter + 1; + if (this.log_event_counter > 59) { + this.logger.storeBME(this.name, 0, event.temp, event.humidity, event.pressure); + this.log_event_counter = 0; + } } } let qualityDescription; From a892711d3692a39e46270506268ba712e0d5f007 Mon Sep 17 00:00:00 2001 From: Tobias Rho Date: Sun, 13 May 2018 12:13:22 +0200 Subject: [PATCH 14/15] version 0.0.4: temperature and humidity compensation configurable in config.json --- History.md | 9 ++++++--- README.md | 2 ++ dist/sensor.js | 25 +++++++++++++++---------- dist/sensor.js.map | 2 +- package.json | 2 +- src/sensor.ts | 29 +++++++++++++++++------------ 6 files changed, 42 insertions(+), 27 deletions(-) diff --git a/History.md b/History.md index 1b30f7e..3af7928 100644 --- a/History.md +++ b/History.md @@ -1,10 +1,13 @@ +### v0.0.4 +* temperature and humidity compensation configurable in config.json + ### v0.0.3 * fixed history update scheduling ### v0.0.2 -* Reduced characteristic service updates (temperatur, humidity, IAQ, pressure) interval to 1 minute and history update interval to 10 min -* Calculate mean temperatur, humidity, IAQ, pressure value from last 20 measurement in a minute interval -* Added temperatur and humidity compensation when reading IAQ values with heated sensor with bsec_bme680 library +* Reduced characteristic service updates (temperature, humidity, IAQ, pressure) interval to 1 minute and history update interval to 10 min +* Calculate mean temperature, humidity, IAQ, pressure value from last 20 measurement in a minute interval +* Added temperature and humidity compensation when reading IAQ values with heated sensor with bsec_bme680 library * see also kvaruni's comment on callibration & compensation: * https://forums.pimoroni.com/t/bme680-observed-gas-ohms-readings/6608/5 diff --git a/README.md b/README.md index cdb42ed..086765c 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,8 @@ Example configuration: "name_temperature": "Temperature", "name_humidity": "Humidity", "useBsecLib": true, + "bsecTempCompensation": -0.35, + "bsecHumidityCompensation": 4.0, "name_air_quality": "Air Quality", "useBsecLib": true } diff --git a/dist/sensor.js b/dist/sensor.js index ee10e4a..96a6113 100644 --- a/dist/sensor.js +++ b/dist/sensor.js @@ -18,12 +18,6 @@ const moment = require('moment'); var os = require("os"); var hostname = os.hostname(); - // temperatur and humidity compensation when reading IAQ values with heated sensor: - // see also kvaruni's comment on callibration & compensation: - // https://forums.pimoroni.com/t/bme680-observed-gas-ohms-readings/6608/5 - // TODO: make configurable: - let bsecIAQTempCompensation = -0.35; // or 0.7 ? - let bsecIAQHumidityCompensation = 4.0; let Service; let Characteristic; var CustomCharacteristic; @@ -76,6 +70,12 @@ class BME680Plugin { constructor(log, config) { this.log = log; + // temperature and humidity compensation when reading IAQ values with heated sensor: + // see also kvaruni's comment on callibration & compensation: + // https://forums.pimoroni.com/t/bme680-observed-gas-ohms-readings/6608/5 + // TODO: make configurable: + this.bsecTempCompensation = -0.35; // or 0.7 ? + this.bsecHumidityCompensation = 4.0; this.polling = false; this.MAX_MEASUREMENT_COUNT = 20; // collect data for 1 min (3*20 sec) /** @@ -104,6 +104,11 @@ this.log = log; this.name = config.name; this.useBsecLib = config.useBsecLib || false; + this.bsecTempCompensation = config.bsecTempCompensation || 0; + this.bsecHumidityCompensation = config.bsecHumidityCompensation || 0; + if (config.bsecTempCompensation) { + this.log(`Compensations: ${this.bsecTempCompensation} C, ${this.bsecHumidityCompensation} %RH`); + } this.name_temperature = config.name_temperature || this.name; this.name_humidity = config.name_humidity || this.name; this.name_air_quality = config.name_air_quality || this.name; @@ -197,7 +202,7 @@ scheduleUpdate() { let now = new Date(); let firstPollAlignedWithHour = this.refresh - (now.getMinutes() * 60 + now.getSeconds()) % (this.refresh); - this.log(`scheduled history update in ${Math.round(firstPollAlignedWithHour / 60)} min, ${firstPollAlignedWithHour % 60} sec`); + this.log(`scheduled history update in ${Math.floor(firstPollAlignedWithHour / 60)} min, ${firstPollAlignedWithHour % 60} sec`); // update sensors, but not history: this.updateHistoryAndCurrentServices(false); setTimeout(() => { @@ -226,8 +231,8 @@ bsecResultsToEvent() { return { time: moment().unix(), - temp: roundInt(this.iaqData.raw_temperature + bsecIAQTempCompensation), - humidity: roundInt(this.iaqData.raw_humidity + bsecIAQHumidityCompensation), + temp: roundInt(this.iaqData.raw_temperature + this.bsecTempCompensation), + humidity: roundInt(this.iaqData.raw_humidity + this.bsecHumidityCompensation), pressure: roundInt(this.iaqData.pressure), ppm: PPM_OFFSET + this.iaqData.iaq * FACTOR_BSEC_IAQ_EVE_PPM }; @@ -352,7 +357,7 @@ let agg = this.aggMeasurements; this.sumsMeasurements = undefined; this.updateSensors(this.aggMeasurements); - this.log(`last: ${agg.temp} (raw: ${this.iaqData.raw_temperature}, comp: ${roundInt(this.iaqData.raw_temperature + bsecIAQTempCompensation)}) C, ${agg.humidity} (raw: ${this.iaqData.raw_humidity}, comp: ${roundInt(this.iaqData.raw_humidity + bsecIAQHumidityCompensation)}) %RH, ${agg.ppm} ppm, IAQ: ${this.iaqData.iaq} IAQ, IAQ accuray: ${this.iaqData.iaq_accuracy}`); + this.log(`last: ${agg.temp} (raw: ${this.iaqData.raw_temperature}, comp: ${roundInt(this.iaqData.raw_temperature + this.bsecTempCompensation)}) C, ${agg.humidity} (raw: ${this.iaqData.raw_humidity}, comp: ${roundInt(this.iaqData.raw_humidity + this.bsecHumidityCompensation)}) %RH, ${agg.ppm} ppm, IAQ: ${this.iaqData.iaq} IAQ, IAQ accuray: ${this.iaqData.iaq_accuracy}`); } } getServices() { diff --git a/dist/sensor.js.map b/dist/sensor.js.map index 01cc1af..143a57c 100644 --- a/dist/sensor.js.map +++ b/dist/sensor.js.map @@ -1 +1 @@ -{"version":3,"file":"sensor.js","sourceRoot":"","sources":["../src/sensor.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sensor.js","sourceRoot":"","sources":["../src/sensor.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index c1780f9..80d4ea6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homebridge-bme680", - "version": "0.0.3", + "version": "0.0.4", "description": "BME680 temperature/humidity/pressure sensor bridge for Homebridge: https://github.com/nfarina/homebridge\"", "main": "dist/sensor.js", "scripts": { diff --git a/src/sensor.ts b/src/sensor.ts index 4cbbee3..82fc7d7 100644 --- a/src/sensor.ts +++ b/src/sensor.ts @@ -11,13 +11,6 @@ const moment = require('moment'); var os = require("os"); var hostname = os.hostname(); -// temperatur and humidity compensation when reading IAQ values with heated sensor: -// see also kvaruni's comment on callibration & compensation: -// https://forums.pimoroni.com/t/bme680-observed-gas-ohms-readings/6608/5 -// TODO: make configurable: -let bsecIAQTempCompensation = -0.35; // or 0.7 ? -let bsecIAQHumidityCompensation = 4.0; - let Service: HAPNodeJS.Service; let Characteristic: HAPNodeJS.Characteristic; @@ -86,12 +79,19 @@ module.exports = (homebridge) => { class BME680Plugin { - useBsecLib: any; toPpm(gas_resistance: number): number { // dummy implementation return PPM_OFFSET + (CO2_MAX_VALUE - PPM_OFFSET) * gas_resistance / 1000000; } + + // temperature and humidity compensation when reading IAQ values with heated sensor: +// see also kvaruni's comment on callibration & compensation: +// https://forums.pimoroni.com/t/bme680-observed-gas-ohms-readings/6608/5 +// TODO: make configurable: + bsecTempCompensation = -0.35; // or 0.7 ? + bsecHumidityCompensation = 4.0; + useBsecLib: boolean; iaqProcess: ChildProcess; loggingService: any; airQualitySensor: any; //AirQualitySensor; @@ -118,6 +118,11 @@ class BME680Plugin { this.log = log; this.name = config.name; this.useBsecLib = config.useBsecLib || false; + this.bsecTempCompensation = config.bsecTempCompensation || 0; + this.bsecHumidityCompensation = config.bsecHumidityCompensation || 0; + if(config.bsecTempCompensation) { + this.log(`Compensations: ${this.bsecTempCompensation} C, ${this.bsecHumidityCompensation} %RH`); + } this.name_temperature = config.name_temperature || this.name; this.name_humidity = config.name_humidity || this.name; @@ -226,7 +231,7 @@ class BME680Plugin { private scheduleUpdate() { let now = new Date(); let firstPollAlignedWithHour = this.refresh - (now.getMinutes() * 60 + now.getSeconds()) % (this.refresh); - this.log(`scheduled history update in ${Math.round(firstPollAlignedWithHour / 60)} min, ${firstPollAlignedWithHour % 60} sec`); + this.log(`scheduled history update in ${Math.floor(firstPollAlignedWithHour / 60)} min, ${firstPollAlignedWithHour % 60} sec`); // update sensors, but not history: this.updateHistoryAndCurrentServices(false); @@ -259,8 +264,8 @@ class BME680Plugin { return { time: moment().unix(), - temp: roundInt(this.iaqData.raw_temperature + bsecIAQTempCompensation), - humidity: roundInt(this.iaqData.raw_humidity + bsecIAQHumidityCompensation), + temp: roundInt(this.iaqData.raw_temperature + this.bsecTempCompensation), + humidity: roundInt(this.iaqData.raw_humidity + this.bsecHumidityCompensation), pressure: roundInt(this.iaqData.pressure), ppm: PPM_OFFSET + this.iaqData.iaq * FACTOR_BSEC_IAQ_EVE_PPM }; @@ -399,7 +404,7 @@ class BME680Plugin { this.sumsMeasurements = undefined; this.updateSensors(this.aggMeasurements); - this.log(`last: ${agg.temp} (raw: ${this.iaqData.raw_temperature}, comp: ${roundInt(this.iaqData.raw_temperature + bsecIAQTempCompensation)}) C, ${agg.humidity} (raw: ${this.iaqData.raw_humidity}, comp: ${roundInt(this.iaqData.raw_humidity + bsecIAQHumidityCompensation)}) %RH, ${agg.ppm} ppm, IAQ: ${this.iaqData.iaq} IAQ, IAQ accuray: ${this.iaqData.iaq_accuracy}`); + this.log(`last: ${agg.temp} (raw: ${this.iaqData.raw_temperature}, comp: ${roundInt(this.iaqData.raw_temperature + this.bsecTempCompensation)}) C, ${agg.humidity} (raw: ${this.iaqData.raw_humidity}, comp: ${roundInt(this.iaqData.raw_humidity + this.bsecHumidityCompensation)}) %RH, ${agg.ppm} ppm, IAQ: ${this.iaqData.iaq} IAQ, IAQ accuray: ${this.iaqData.iaq_accuracy}`); } From 5b28df72776119fe6c429adb465bc212f62edef8 Mon Sep 17 00:00:00 2001 From: trho Date: Fri, 27 Dec 2019 23:22:15 +0100 Subject: [PATCH 15/15] Set theme jekyll-theme-minimal --- _config.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 _config.yml diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..2f7efbe --- /dev/null +++ b/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-minimal \ No newline at end of file