homebridge-eveatmo
Version:
Homebridge plugin which adds a Netatmo weatherstation as HomeKit device and tries to act like Elgato Eve Room/Weather
118 lines (97 loc) • 3.21 kB
JavaScript
'use strict';
var homebridge;
var Characteristic;
var Formats;
var Perms;
module.exports = function (pHomebridge) {
if (pHomebridge && !homebridge) {
homebridge = pHomebridge;
Characteristic = homebridge.hap.Characteristic;
Formats = homebridge.hap.Formats;
Perms = homebridge.hap.Perms;
}
class AQExtra1Characteristic extends Characteristic {
constructor() {
super('AQX1', 'E863F10B-079E-48FF-8F27-9C2605A29F52');
this.setProps({
format: Formats.UINT16,
perms: [
Perms.PAIRED_READ,
Perms.HIDDEN,
],
});
}
}
class AQExtra2Characteristic extends Characteristic {
constructor() {
super('AQX2', 'E863F132-079E-48FF-8F27-9C2605A29F52');
this.setProps({
format: Formats.DATA,
perms: [
Perms.PAIRED_READ,
Perms.HIDDEN,
],
});
}
}
class EveatmoRoomAirqualityService extends homebridge.hap.Service.AirQualitySensor {
constructor(accessory) {
super(accessory.name + ' Room Main'); // ROOM
this.accessory = accessory;
this.getCharacteristic(Characteristic.AirQuality)
.on('get', this.getAirQuality.bind(this))
.eventEnabled = true;
// extra characteristic for stock home.app
var co2LevelCharacteristic = this.getCharacteristic(Characteristic.CarbonDioxideLevel) ||
this.addCharacteristic(Characteristic.CarbonDioxideLevel);
co2LevelCharacteristic.on('get', this.getAQExtra1.bind(this))
.eventEnabled = true;
this.addCharacteristic(AQExtra1Characteristic)
.on('get', this.getAQExtra1.bind(this));
this.addCharacteristic(AQExtra2Characteristic)
.on('get', this.getAQExtra2.bind(this));
}
transformCO2ToAirQuality() {
var level = this.accessory.co2;
var quality = Characteristic.AirQuality.UNKNOWN;
if (level > 2100) {
quality = Characteristic.AirQuality.POOR;
} else if (level > 1600) {
quality = Characteristic.AirQuality.INFERIOR;
} else if (level > 1100) {
quality = Characteristic.AirQuality.FAIR;
} else if (level > 700) {
quality = Characteristic.AirQuality.GOOD;
} else if (level >= 400) {
quality = Characteristic.AirQuality.EXCELLENT;
}
return quality;
}
updateCharacteristics() {
this.getCharacteristic(Characteristic.AirQuality)
.updateValue(this.transformCO2ToAirQuality());
this.getCharacteristic(Characteristic.CarbonDioxideLevel)
.updateValue(this.accessory.co2);
this.getCharacteristic(AQExtra1Characteristic)
.updateValue(this.accessory.co2);
this.getCharacteristic(AQExtra2Characteristic)
.updateValue('');
}
getAirQuality(callback) {
this.accessory.refreshData((err) => {
callback(err, this.transformCO2ToAirQuality());
});
}
getAQExtra1(callback) {
this.accessory.refreshData((err) => {
callback(err, this.accessory.co2);
});
}
getAQExtra2(callback) {
this.accessory.refreshData((err) => {
callback(err, '');
});
}
}
return EveatmoRoomAirqualityService;
};