homebridge-denon-speaker
Version:
Denon and Marantz AVR support as Speaker for Homebridge: https://github.com/nfarina/homebridge
269 lines • 9.13 kB
JavaScript
;
/**
* created by stfnhmplr on 28.01.16.
* control your Denon AVR via http with node.js
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.DenonStatusLite = exports.DenonLib = void 0;
const axios_1 = __importDefault(require("axios"));
const xml2js_1 = require("xml2js");
class DenonLib {
constructor(ip) {
this.url_status_lite = '/goform/formMainZone_MainZoneXmlStatusLite.xml';
this.url_status = '/goform/formMainZone_MainZoneXml.xml';
this.url_post = '/goform/formiPhoneAppDirect.xml';
this.ip = ip;
}
/**
* Returns the friendly avr name
* @param callback
*/
async getModelInfo() {
let modelInfo = {
name: "",
brand: ""
};
await axios_1.default.get('http://' + this.ip + this.url_status)
.then((response) => {
let xml = '';
xml2js_1.parseString(xml + response.data, function (err, result) {
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() {
let name = "";
await axios_1.default.get('http://' + this.ip + this.url_status)
.then((response) => {
var xml = '';
xml2js_1.parseString(xml + response.data, function (err, result) {
name = result.item.FriendlyName[0].value[0];
});
})
.catch((error) => {
return Promise.reject(error);
});
return name;
}
;
/**
* Returns the avr brand
* @param callback
*/
async getBrand() {
let brand = "";
var xml = '';
await axios_1.default.get('http://' + this.ip + this.url_status)
.then((response) => {
xml2js_1.parseString(xml + response.data, function (err, result) {
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() {
let powerState = false;
await axios_1.default.get('http://' + this.ip + this.url_status_lite)
.then((response) => {
var xml = '';
xml2js_1.parseString(xml + response.data, function (err, result) {
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) {
const stringWantedPowerState = (wantedPowerState) ? 'ON' : 'OFF';
await axios_1.default.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() {
let muteState = false;
await axios_1.default.get('http://' + this.ip + this.url_status_lite)
.then((response) => {
var xml = '';
xml2js_1.parseString(xml + response.data, function (err, result) {
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) {
let stringWantedMuteState = (wantedMuteState) ? 'ON' : 'OFF';
await axios_1.default.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) {
var vol = (+wantedVolumeState - 80).toFixed(1); //volume fix
await axios_1.default.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() {
let volumeState = 0;
await axios_1.default.get('http://' + this.ip + this.url_status)
.then((response) => {
var xml = '';
xml2js_1.parseString(xml + response.data, function (err, result) {
volumeState = (result.item.MasterVolume[0].value[0]) + 80;
});
})
.catch((error) => {
return Promise.reject(error);
});
return volumeState;
}
;
async getStatusLite() {
let statusLite = new DenonStatusLite();
await axios_1.default.get('http://' + this.ip + this.url_status_lite)
.then((response) => {
var xml = '';
xml2js_1.parseString(xml + response.data, function (err, result) {
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;
}
}
exports.DenonLib = DenonLib;
class DenonStatusLite {
constructor() {
this.toString = () => {
return `DenonStatusLite (power: ${this.powerState}, input: ${this.inputSelected}, volume: ${this.volumeState}, mute: ${this.muteState})`;
};
this.powerState = false;
this.inputSelected = "";
this.volumeState = 52;
this.muteState = false;
}
}
exports.DenonStatusLite = DenonStatusLite;
//# sourceMappingURL=denon-lib.js.map