UNPKG

homebridge-meraki-control

Version:
82 lines (70 loc) 2.67 kB
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;