UNPKG

homebridge-broadlink-rm-pro

Version:

Broadlink RM plugin (including the mini and pro) for homebridge with AC Pro and TV features

172 lines (136 loc) 7.62 kB
const { HomebridgePlatform } = require('./base'); const { assert } = require('chai'); const npmPackage = require('./package.json'); const Accessory = require('./accessories'); const checkForUpdates = require('./helpers/checkForUpdates'); const broadlink = require('./helpers/broadlink'); const { discoverDevices } = require('./helpers/getDevice'); const { createAccessory } = require('./helpers/accessoryCreator'); const classTypes = { 'air-conditioner': Accessory.AirCon, 'air-purifier': Accessory.AirPurifier, 'humidifier-dehumidifier': Accessory.HumidifierDehumidifier, 'learn-ir': Accessory.LearnCode, 'learn-code': Accessory.LearnCode, 'switch': Accessory.Switch, 'garage-door-opener': Accessory.GarageDoorOpener, 'lock': Accessory.Lock, 'switch-multi': Accessory.SwitchMulti, 'switch-multi-repeat': Accessory.SwitchMultiRepeat, 'switch-repeat': Accessory.SwitchRepeat, 'fan': Accessory.Fan, 'fanv1': Accessory.Fanv1, 'outlet': Accessory.Outlet, 'light': Accessory.Light, 'window': Accessory.Window, 'window-covering': Accessory.WindowCovering, 'tv': Accessory.TV, 'temperatureSensor': Accessory.TemperatureSensor, 'humiditySensor': Accessory.HumiditySensor, 'heater-cooler': Accessory.HeaterCooler } let homebridgeRef const BroadlinkRMPlatform = class extends HomebridgePlatform { constructor (log, config = {}) { super(log, config, homebridgeRef); } addAccessories (accessories) { const { config, log, logLevel } = this; this.discoverBroadlinkDevices(); this.showMessage(); setTimeout(() => checkForUpdates(log), 1800); if (!config.accessories) {config.accessories = []} // Add a Learn Code accessory if none exist in the config const learnIRAccessories = (config && config.accessories && Array.isArray(config.accessories)) ? config.accessories.filter((accessory) => (accessory.type === 'learn-ir' || accessory.type === 'learn-code')) : []; if (learnIRAccessories.length === 0) { if (!config.hideLearnButton) { const learnCodeAccessory = new Accessory.LearnCode(log, { name: 'Learn', scanFrequency: false }); accessories.push(learnCodeAccessory); } if (!config.hideScanFrequencyButton) { const scanFrequencyAccessory = new Accessory.LearnCode(log, { name: 'Scan Frequency', scanFrequency: true }); accessories.push(scanFrequencyAccessory); } } // Iterate through the config accessories let tvs = []; config.accessories.forEach((accessory) => { if (!accessory.type) {throw new Error(`Each accessory must be configured with a "type". e.g. "switch"`);} if (accessory.disabled) {return;} if (!classTypes[accessory.type]) {throw new Error(`homebridge-broadlink-rm doesn't support accessories of type "${accessory.type}".`);} const homeKitAccessory = new classTypes[accessory.type](log, accessory); if (classTypes[accessory.type] === classTypes.tv) { if(accessory.subType.toLowerCase() === 'stb'){homeKitAccessory.subType = homebridgeRef.hap.Accessory.Categories.TV_SET_TOP_BOX;} if(accessory.subType.toLowerCase() === 'receiver'){homeKitAccessory.subType = homebridgeRef.hap.Accessory.Categories.AUDIO_RECEIVER;} if(accessory.subType.toLowerCase() === 'stick'){homeKitAccessory.subType = homebridgeRef.hap.Accessory.Categories.TV_STREAMING_STICK;} if (logLevel <=1) {log(`\x1b[34m[DEBUG]\x1b[0m Adding Accessory ${accessory.type} (${accessory.subType})`);} tvs.push(homeKitAccessory); return; } if (logLevel <=1) {log(`\x1b[34m[DEBUG]\x1b[0m Adding Accessory ${accessory.type} (${accessory.subType})`);} accessories.push(homeKitAccessory); }); if (tvs.length > 0) { if (tvs.length > 0) { const TV = homebridgeRef.hap.Accessory.Categories.TELEVISION; homebridgeRef.publishExternalAccessories('homebridge-broadlink-rm', tvs.map(tv => createAccessory(tv, tv.name, TV, homebridgeRef, tv.subType))); log(''); log(`**************************************************************************************************************`); log(`You added TVs in your configuration!`); log(`Due to a HomeKit limitation you need to add any TVs to the Home app by using the Add Accessory function.`); log(`There you'll find your TVs and you can use the same PIN as you using for this HomeBridge instance.`); log(`**************************************************************************************************************`); log(''); } } } discoverBroadlinkDevices () { const { config, log, logLevel } = this; const { hosts } = config; if (!hosts) { if (logLevel <=2) {log(`\x1b[35m[INFO]\x1b[0m Automatically discovering Broadlink RM devices.`)} discoverDevices(true, log, logLevel, config.deviceDiscoveryTimeout); return; } discoverDevices(false, log, logLevel); if (logLevel <=2) {log(`\x1b[35m[INFO]\x1b[0m Automatic Broadlink RM device discovery has been disabled as the "hosts" option has been set.`)} assert.isArray(hosts, `\x1b[31m[CONFIG ERROR] \x1b[33mhosts\x1b[0m should be an array of objects.`) hosts.forEach((host) => { assert.isObject(host, `\x1b[31m[CONFIG ERROR] \x1b[0m Each item in the \x1b[33mhosts\x1b[0m array should be an object.`) const { address, isRFSupported, isRM4, mac } = host; assert(address, `\x1b[31m[CONFIG ERROR] \x1b[0m Each object in the \x1b[33mhosts\x1b[0m option should contain a value for \x1b[33maddress\x1b[0m (e.g. "192.168.1.23").`) assert(mac, `\x1b[31m[CONFIG ERROR] \x1b[0m Each object in the \x1b[33mhosts\x1b[0m option should contain a unique value for \x1b[33mmac\x1b[0m (e.g. "34:ea:34:e7:d7:28").`) //Create manual device type let deviceType = 0x2221; deviceType = isRFSupported ? (deviceType | 0x2) : deviceType; deviceType = isRM4 ? (deviceType | 0x4) : deviceType; broadlink.addDevice({ address, port: 80 }, mac.toLowerCase(), deviceType); }) } showMessage () { const { config, log } = this; if (config && (config.hideWelcomeMessage || config.isUnitTest || this.logLevel >=4)) { log(`\x1b[35m[INFO]\x1b[0m Running Homebridge Broadlink RM Plugin version \x1b[32m${npmPackage.version}\x1b[0m`) return } setTimeout(() => { log('') log(`**************************************************************************************************************`) log(`** Welcome to version \x1b[32m${npmPackage.version}\x1b[0m of the \x1b[34mHomebridge Broadlink RM Plugin\x1b[0m!`) log('** ') log(`** Find out what's in the latest release here: \x1b[4mhttps://github.com/kiwi-cam/homebridge-broadlink-rm/blob/master/CHANGELOG.md\x1b[0m`) log(`** `) log(`** If you like this plugin then please star it on GitHub or better yet`) log(`** buy me a drink using Paypal \x1b[4mhttps://paypal.me/kiwicamRM\x1b[0m.`) log(`**`) log(`** You can disable this message by adding "hideWelcomeMessage": true to the config (see config-sample.json).`) log(`**`) log(`**************************************************************************************************************`) log('') }, 1500) } } BroadlinkRMPlatform.setHomebridge = (homebridge) => { homebridgeRef = homebridge } module.exports = BroadlinkRMPlatform