homebridge-eveatmo
Version:
Homebridge plugin which adds a Netatmo weatherstation as HomeKit device and tries to act like Elgato Eve Room/Weather
98 lines (83 loc) • 3.21 kB
JavaScript
'use strict';
/* eslint-disable-next-line @typescript-eslint/no-require-imports */
var NetatmoDevice = require('../lib/netatmo-device');
var homebridge;
var EveatmoRoomAccessory;
var EveatmoWeatherAccessory;
var EveatmoRainAccessory;
var EveatmoWindAccessory;
module.exports = function (pHomebridge) {
if (pHomebridge && !homebridge) {
homebridge = pHomebridge;
/* eslint-disable @typescript-eslint/no-require-imports */
EveatmoRoomAccessory = require('../accessory/eveatmo-room-accessory')(homebridge);
EveatmoWeatherAccessory = require('../accessory/eveatmo-weather-accessory')(homebridge);
EveatmoRainAccessory = require('../accessory/eveatmo-rain-accessory')(homebridge);
EveatmoWindAccessory = require('../accessory/eveatmo-wind-accessory')(homebridge);
/* eslint-enable @typescript-eslint/no-require-imports */
}
class WeatherstationDeviceType extends NetatmoDevice {
constructor(log, api, config) {
super(log, api, config);
this.log.debug('Creating Weatherstation Devices');
this.deviceType = 'weatherstation';
}
loadDeviceData(callback) {
this.api.getStationsData((err, devices) => {
if (err) {
callback(err);
return;
}
var deviceMap = {};
devices.forEach((device) => {
deviceMap[device._id] = device;
device._name = this.buildDeviceName(device, this.config.module_suffix);
if (device.modules) {
device.modules.forEach((module) => {
module._name = this.buildModuleName(device, module, this.config.module_suffix);
deviceMap[module._id] = module;
});
}
});
this.log.debug('Setting cache with key: ' + this.deviceType);
this.cache.set(this.deviceType, deviceMap);
this.deviceData = deviceMap;
if (this.accessories) {
this.accessories.forEach((accessory) => {
accessory.notifyUpdate(this.deviceData);
});
}
callback(null, this.deviceData);
});
}
buildAccessory(deviceData) {
if (deviceData.type === 'NAMain') { // Basestation
return new EveatmoRoomAccessory(deviceData, this);
} else if (deviceData.type === 'NAModule4') { // Indoor
return new EveatmoRoomAccessory(deviceData, this);
} else if (deviceData.type === 'NAModule1') { // Outdoor
return new EveatmoWeatherAccessory(deviceData, this);
} else if (deviceData.type === 'NAModule3') { // Rain
return new EveatmoRainAccessory(deviceData, this);
} else if (deviceData.type === 'NAModule2') { // Wind
return new EveatmoWindAccessory(deviceData, this);
}
return false;
}
buildDeviceName(device, suffix) {
if (suffix !== '') {
return device.module_name + ' ' + suffix;
} else {
return device.station_name + ' ' + device.module_name;
}
}
buildModuleName(device, module, suffix) {
if (suffix !== '') {
return module.module_name + ' ' + suffix;
} else {
return device.station_name + ' ' + module.module_name;
}
}
}
return WeatherstationDeviceType;
};