homebridge-thermometer-am2320
Version:
AM2320 temperature/humidity sensor bridge for Homebridge: https://github.com/nfarina/homebridge"
137 lines • 4.91 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const lodash_1 = __importDefault(require("lodash"));
class AM2320 {
constructor(options) {
this.options = lodash_1.default.defaults({}, options, {
temperature: {
rate: 1.0
},
humidity: {
rate: 1.0
}
});
this.promise = null;
if ('i2cBusNo' in this.options)
this.options.i2cBusNo = parseInt(this.options.i2cBusNo);
if ('i2cAddress' in this.options)
this.options.i2cAddress = parseInt(this.options.i2cAddress);
console.log(`AM23280 sensor options: ${JSON.stringify(this.options)}`);
const i2c = require('i2c');
this.sensor = new i2c(this.options.i2cAddress, { device: '/dev/i2c-' + this.options.i2cBusNo });
var self = this;
setTimeout(() => {
self.promise = this.readSensorData(this.sensor);
self.promise.then((data) => {
console.log(`data = ${JSON.stringify(data, null, 2)}`);
}).catch((err) => {
console.log(`AM2320 read error: ${err}`);
}).then(() => {
self.promise = null;
});
}, 1000);
}
readRegister(wire) {
return new Promise((resolve, reject) => {
var counter = 0;
const i = setInterval(() => {
wire.readBytes(0x00, 8, (err, res) => {
if (err || res[0] == 0) {
if (++counter > 100) {
clearInterval(i);
reject(err);
}
}
else {
var t = (((res[4] & 0x7f) << 8) + res[5]) / 10.0;
t = ((res[4] & 0x80) >> 7) == 1 ? t * (-1) : t;
var h = ((res[2] << 8) + res[3]) / 10.0;
clearInterval(i);
resolve({ temperature: t, humidity: h });
}
});
}, 15);
});
}
wakeup(wire) {
return new Promise((resolve) => {
wire.writeByte(0x00, () => {
setTimeout(resolve, 15);
});
});
}
writeRegister(wire, bytes) {
return new Promise((resolve, reject) => {
wire.writeBytes(0x03, bytes, (err) => {
if (err) {
reject(err);
}
else {
setTimeout(resolve, 15);
}
});
});
}
// refresh sensor data
readSensorData(wire) {
var self = this;
return new Promise((resolve, reject) => {
if (wire.lastUpdate !== undefined) {
var diff = process.hrtime(wire.lastUpdate);
if (diff[0] < 30) {
resolve(wire.lastValue);
}
}
self.wakeup(wire).then(async () => {
return await self.writeRegister(wire, [0x00, 0x04]);
}).then(async () => {
return await self.readRegister(wire);
}).then((data) => {
wire.lastValue = data;
wire.lastUpdate = process.hrtime();
resolve(data);
}).catch((err) => {
reject(err);
});
});
}
getCurrentTemperature() {
var self = this;
return new Promise((resolve, reject) => {
if (!self.promise) {
self.promise = self.readSensorData(self.sensor);
}
self.promise.then((data) => {
console.log(`data(temp) = ${JSON.stringify(data, null, 2)}`);
resolve(data.temperature * self.options.temperature.rate);
}).catch((err) => {
console.log(`AM2320 read error: ${err}`);
reject(err);
}).then(() => {
self.promise = null;
});
});
}
getCurrentRelativeHumidity() {
var self = this;
return new Promise((resolve, reject) => {
if (!self.promise) {
self.promise = self.readSensorData(self.sensor);
}
self.promise.then((data) => {
console.log(`data(humi) = ${JSON.stringify(data, null, 2)}`);
resolve(data.humidity * self.options.humidity.rate);
}).catch((err) => {
console.log(`AM2320 read error: ${err}`);
reject(err);
}).then(() => {
self.promise = null;
});
});
}
}
exports.default = AM2320;
//# sourceMappingURL=sensor.js.map