diff --git a/src/Accessories/ControlUnit.ts b/src/Accessories/ControlUnit.ts index 2bcd7f4..f834729 100644 --- a/src/Accessories/ControlUnit.ts +++ b/src/Accessories/ControlUnit.ts @@ -35,6 +35,7 @@ export interface IControlUnitProps { api: any, log: any, homebridge: any, + isExternal: boolean, } /** @@ -47,6 +48,7 @@ export class ControlUnit implements IAccessory { //fields private log: any = {}; private displayName: string = ""; + private isExternal: boolean = false; //Service fields private televisionService: HAPNodeJS.Service | undefined; @@ -70,15 +72,16 @@ export class ControlUnit implements IAccessory { Api = props.api; Service = props.api.hap.Service; Characteristic = props.api.hap.Characteristic; - this.displayName = props.displayName; - this.name = this.displayName; + this.name = props.displayName; + this.displayName = props.isExternal ? `${props.displayName}-Remote` : props.displayName; + this.isExternal = props.isExternal; this.activities = props.activities; this.dataProvider = props.dataProvider; homebridge = props.homebridge; - this.platformAccessory = new homebridge.platformAccessory(this.name, this.generateUUID(), homebridge.hap.Accessory.Categories.TELEVISION); + this.platformAccessory = new homebridge.platformAccessory(this.displayName, this.generateUUID(), homebridge.hap.Accessory.Categories.TELEVISION); //Configure services this.configureTvService(); @@ -142,10 +145,12 @@ export class ControlUnit implements IAccessory { * Event handler for SET active characteristic */ private onSetAccessoryActive = async (value: any) => { - switch (value) { - case 0: this.dataProvider.powerOff(this.name); break; - //Turn on with first activity - case 1: this.dataProvider.powerOn(this.name, this.activities[0]); break; + if (!this.isExternal) { + switch (value) { + case 0: this.dataProvider.powerOff(this.name); break; + //Turn on with first activity + case 1: this.dataProvider.powerOn(this.name, this.activities[0]); break; + } } } @@ -154,13 +159,21 @@ export class ControlUnit implements IAccessory { */ private onGetAccessoryActive = async () => { //@ts-ignore - return this.dataProvider.getIsActive ? Characteristic.Active.Active : Characteristic.Active.Inactive + return this.dataProvider.getIsActive() ? Characteristic.Active.Active : Characteristic.Active.Inactive } /** * Event handler for SET remote key */ private onSetRemoteKey = async (key: any) => { + //Set the active identifier with every key press + let currentActivity: Activity = this.dataProvider.getIsActive(this.name)!; + let identifier: number = 0; + if (currentActivity) { + identifier = this.activities.findIndex(e => e.displayName === currentActivity.displayName); + } + this.televisionService!.setCharacteristic(Characteristic.ActiveIdentifier, identifier); + this.dataProvider.sendKeyPress(this.name, key); } @@ -168,7 +181,9 @@ export class ControlUnit implements IAccessory { * Event handler for SET active identifier characteristic */ private onSetActiveIdentifier = async (identifier: any) => { - this.dataProvider.startActivity(this.name, this.activities[identifier]); + if (!this.isExternal) { + this.dataProvider.startActivity(this.name, this.activities[identifier]); + } } /** diff --git a/src/DataProviders/HarmonyDataProvider.ts b/src/DataProviders/HarmonyDataProvider.ts index 75b1012..40d8684 100644 --- a/src/DataProviders/HarmonyDataProvider.ts +++ b/src/DataProviders/HarmonyDataProvider.ts @@ -221,6 +221,7 @@ class HarmonyDataProvider { public sendKeyPress = async (controlUnitName: string, key: any) => { if (this.states[controlUnitName]) { let commandName: string = ""; + let device: IDevice = this.getDeviceFromName(this.states[controlUnitName]!.currentActivity.controlDeviceId); switch (key) { case RemoteKey.ARROW_UP: { diff --git a/src/index.ts b/src/index.ts index cb21140..313dd6a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -27,6 +27,7 @@ class HarmonyMatrixPlatform { config: any = {}; api: any; externalAccessories: Array = []; + dataProvider: HarmonyDataProvider | null; constructor(log: any, config: any, api: any) { this.log = log; @@ -34,10 +35,14 @@ class HarmonyMatrixPlatform { this.api = api; this.log('INFO - Registering Harmony Matrix Platform'); this.api.on('didFinishLaunching', this.didFinishLaunching.bind(this)); + + this.dataProvider = null; + this.log("This is new"); } /** * Handler for didFinishLaunching + * Happens after constructor */ didFinishLaunching() { this.log(`Publishing external accessories`); @@ -96,7 +101,7 @@ class HarmonyMatrixPlatform { }); //construct data provider - let dataProvider = new HarmonyDataProvider({ + this.dataProvider = new HarmonyDataProvider({ hubAddress: hubIp, matrix: matrix, log: this.log @@ -135,23 +140,37 @@ class HarmonyMatrixPlatform { }); let controlUnit: ControlUnit = new ControlUnit({ - dataProvider: dataProvider, + dataProvider: this.dataProvider!, displayName: configControlUnit["DisplayName"], api: this.api, log: this.log, activities: activities, - homebridge: Homebridge + homebridge: Homebridge, + isExternal: false + }); + + let controlUnitExternal: ControlUnit = new ControlUnit({ + dataProvider: this.dataProvider!, + displayName: `${configControlUnit["DisplayName"]}`, + api: this.api, + log: this.log, + activities: activities, + homebridge: Homebridge, + isExternal: true }); //@ts-ignore let accessory = controlUnit as homebridge.platformAccessory; + //@ts-ignore + let externalAccessory = controlUnitExternal as homebridge.platformAccessory; //Add control unit controlUnits.push(accessory); + //Add to list of remotes + this.externalAccessories.push(externalAccessory); this.log(`INFO - Added ControlUnit`); }); - this.externalAccessories = controlUnits; callback(controlUnits); } } \ No newline at end of file