homebridge-meraki-control
Version:
Homebridge plugin to control Meraki devices.
82 lines (70 loc) • 2.67 kB
JavaScript
import EventEmitter from 'events';
import ImpulseGenerator from './impulsegenerator.js';
import { ApiUrls } from './constants.js';
import { withLock } from './utils.js';
class MerakiMr extends EventEmitter {
constructor(config) {
super();
const networkId = config.networkId;
this.logDebug = config.logDebug;
this.firstRun = true;
this.wirelessUrl = ApiUrls.MrSsids.replace('networkId', networkId);
this.client = config.client;
//lock flags
this.locks = false;
this.impulseGenerator = new ImpulseGenerator()
.on('connect', () => withLock(this, async () => {
await this.connect();
}))
.on('state', (state) => {
this.emit(state ? 'success' : 'warn', `Impulse generator ${state ? 'started' : 'stopped'}`);
});
};
async checkDeviceState(ssidsData) {
if (this.logDebug) this.emit('debug', `Requesting SSIDs status.`);
try {
const ssids = [];
for (const ssid of ssidsData) {
//push exposed ssid to array
const obj = {
'number': ssid.number,
'name': ssid.name ?? `WiFi ${ssid.number}`,
'state': ssid.enabled ?? false
};
ssids.push(obj);
};
const ssidsCount = ssids.length;
if (this.logDebug) this.emit('debug', `Found: ${ssidsCount} exposed SSIDs.`);
if (ssidsCount === 0) {
this.emit('warn', `Found: ${ssidsCount} ssids.`);
return false;
}
//emit device info and state
if (this.firstRun) {
this.emit('deviceInfo', ssidsCount);
this.firstRun = false;
}
this.emit('deviceState', ssids);
return true;
} catch (error) {
throw new Error(`Requesting SSIDs status error: ${error}`);
};
};
async connect() {
if (this.logDebug) this.emit('debug', `Requesting data.`);
try {
//ap ssids states
const ssidsData = await this.client.get(this.wirelessUrl);
if (this.logDebug) this.emit('debug', `Data: ${JSON.stringify(ssidsData.data, null, 2)}`);
const state = await this.checkDeviceState(ssidsData.data);
return state;
} catch (error) {
throw new Error(`Requesting data error: ${error}`);
};
};
async send(url, payload) {
await this.client.put(url, payload);
return true;
};
};
export default MerakiMr;