homebridge-denon-speaker
Version:
Denon and Marantz AVR support as Speaker for Homebridge: https://github.com/nfarina/homebridge
283 lines (257 loc) • 9.27 kB
text/typescript
/**
* created by stfnhmplr on 28.01.16.
* control your Denon AVR via http with node.js
*/
import axios, { AxiosResponse } from 'axios';
import { parseString } from 'xml2js';
export class DenonLib {
private readonly ip: string;
private readonly url_status_lite = '/goform/formMainZone_MainZoneXmlStatusLite.xml';
private readonly url_status = '/goform/formMainZone_MainZoneXml.xml';
private readonly url_post = '/goform/formiPhoneAppDirect.xml'
constructor(ip: string) {
this.ip = ip;
}
/**
* Returns the friendly avr name
* @param callback
*/
async getModelInfo():Promise<any> {
let modelInfo = {
name: "",
brand: ""
};
await axios.get('http://' + this.ip + this.url_status)
.then((response: AxiosResponse) => {
let xml = '';
parseString(xml + response.data, function (err: any, result: any) {
modelInfo.name = result.item.FriendlyName[0].value[0];
modelInfo.brand = result.item.BrandId[0].value[0];
});
})
.catch((error) => {
return Promise.reject(error);
});
return modelInfo;
}
/**
* Returns the friendly avr name
* @param callback
*/
async getName(): Promise<string> {
let name: string = "";
await axios.get('http://' + this.ip + this.url_status)
.then((response: AxiosResponse) => {
var xml = '';
parseString(xml + response.data, function (err: any, result: any) {
name = result.item.FriendlyName[0].value[0];
});
})
.catch((error) => {
return Promise.reject(error);
});
return name;
};
/**
* Returns the avr brand
* @param callback
*/
async getBrand(): Promise<string> {
let brand = "";
var xml = '';
await axios.get('http://' + this.ip + this.url_status)
.then((response: AxiosResponse) => {
parseString(xml + response.data, function (err: any, result: any) {
brand = result.item.BrandId[0].value[0];
});
})
.catch((error) => {
return Promise.reject(error);
});
return brand;
};
/**
* Returns the current power state of the avr
* @param callback
*/
async getPowerState(): Promise<boolean> {
let powerState = false;
await axios.get('http://' + this.ip + this.url_status_lite)
.then((response: AxiosResponse) => {
var xml = '';
parseString(xml + response.data, function (err: any, result: any) {
powerState = (result.item.Power[0].value[0] == 'ON');
});
})
.catch((error) => {
return Promise.reject(error);
});
return powerState;
};
/**
* sets the power state of the avr
* @param powerState - true or false
* @param callback
*/
async setPowerState(wantedPowerState: boolean) {
const stringWantedPowerState = (wantedPowerState) ? 'ON' : 'OFF';
await axios.get('http://' + this.ip + '/MainZone/index.put.asp?cmd0=PutZone_OnOff/' + stringWantedPowerState)
.catch((error) => {
return Promise.reject(error);
});
return wantedPowerState;
};
/**
* Returns the current mute state of the avr
* @returns Promise<boolean>
*/
async getMuteState(): Promise<boolean> {
let muteState = false;
await axios.get('http://' + this.ip + this.url_status_lite)
.then((response: AxiosResponse) => {
var xml = '';
parseString(xml + response.data, function (err: any, result: any) {
muteState = (result.item.Mute[0].value[0] == 'ON');
console.log(result)
console.log('DenonLib getMuteState: ' + muteState)
});
})
.catch((error) => {
return Promise.reject(error);
})
return muteState;
};
/**
* set the mute state of the avr
* @param muteState
* @param callback
*/
async setMuteState(wantedMuteState: boolean): Promise<boolean> {
let stringWantedMuteState = (wantedMuteState) ? 'ON' : 'OFF';
await axios.get('http://' + this.ip + '/MainZone/index.put.asp?cmd0=PutVolumeMute/' + stringWantedMuteState)
.catch((error) => {
return Promise.reject(error);
})
return wantedMuteState;
};
/**
* Returns the current input of the avr
* @param callback (String)
*/
/*
async getInput() {
request.get('http://' + this.ip + this.url_status_lite, function (error: any, response: any, body: any) {
var xml = '';
if (!error && response.statusCode === 200) {
parseString(xml + body, function (err: any, result: any) {
callback(null, result.item.InputFuncSelect[0].value[0]);
});
} else {
callback(error);
}
});
};
*/
/**
* sets the input to xxx
* possible values are
* 'CD', 'SPOTIFY', 'CBL/SAT', 'DVD', 'BD', 'GAME', 'GAME2', 'AUX1',
'MPLAY', 'USB/IPOD', 'TUNER', 'NETWORK', 'TV', 'IRADIO', 'SAT/CBL', 'DOCK',
'IPOD', 'NET/USB', 'RHAPSODY', 'PANDORA', 'LASTFM', 'IRP', 'FAVORITES', 'SERVER'
* @param input String
* @param callback
*/
/*
async setInput(input: any, callback: any) {
request.get('http://' + this.ip + '/goform/formiPhoneAppDirect.xml?SI' + input, function (error: any, response: any, body: any) {
if (!error && response.statusCode === 200) {
callback(null);
} else {
callback(error)
}
})
};
*/
/**
* Returns the current Surround Mode
* @param callback
*/
/*
async getSurroundMode(callback: any) {
request.get('http://' + this.ip + this.url_status, function (error: any, response: any, body: any) {
var xml = '';
if (!error && response.statusCode === 200) {
parseString(xml + body, function (err: any, result: any) {
callback(null, result.item.selectSurround[0].value[0]);
});
} else {
callback(error);
}
});
};
*/
/**
* Set the playback volume
* the volume fix sets the volume to the volume the display shows
* @param volume integer
* @param callback
*/
async setVolume(wantedVolumeState: number): Promise<number> {
var vol = (+wantedVolumeState - 80).toFixed(1); //volume fix
await axios.get('http://' + this.ip + '/goform/formiPhoneAppVolume.xml?1+' + vol)
.catch((error) => {
return Promise.reject(error);
});
return wantedVolumeState;
};
/**
* Returns the current volume of the avr (with volume fix)
* @param callback
*/
async getVolume(): Promise<number> {
let volumeState: number = 0;
await axios.get('http://' + this.ip + this.url_status)
.then((response: AxiosResponse) => {
var xml = '';
parseString(xml + response.data, function (err: any, result: any) {
volumeState = (result.item.MasterVolume[0].value[0]) + 80;
});
})
.catch((error) => {
return Promise.reject(error);
});
return volumeState;
};
async getStatusLite(): Promise<DenonStatusLite> {
let statusLite: DenonStatusLite = new DenonStatusLite();
await axios.get('http://' + this.ip + this.url_status_lite)
.then((response: AxiosResponse) => {
var xml = '';
parseString(xml + response.data, function (err: any, result: any) {
statusLite.powerState = (result.item.Power[0].value[0] == 'ON');
statusLite.inputSelected = result.item.InputFuncSelect[0].value[0];
statusLite.volumeState = parseInt(result.item.MasterVolume[0].value[0]) + 80;
statusLite.muteState = (result.item.Mute[0].value[0] == 'on');
});
})
.catch((error) => {
return Promise.reject(error);
});
return statusLite;
}
}
export class DenonStatusLite {
powerState: boolean;
inputSelected: string;
volumeState: number;
muteState: boolean;
constructor() {
this.powerState = false;
this.inputSelected = "";
this.volumeState = 52;
this.muteState = false;
}
public toString = () : string => {
return `DenonStatusLite (power: ${this.powerState}, input: ${this.inputSelected}, volume: ${this.volumeState}, mute: ${this.muteState})`;
}
}