yamaha-yxc-nodejs
Version:
NodeJS API to control your YAMAHA Musiccast devices
1,286 lines (1,275 loc) • 38.7 kB
JavaScript
/**
* The Yamaha YXC Module Constructor.
* @constructor
* @param {string} ip - The ip of the yamaha receiver.
* @param {number} requestTimeout - timeout of request
*/
const request = require("@root/request");
const simpleSSDP = require("simple-ssdp");
const http = require("http");
var reyxcControl =
/<yamaha:X_yxcControlURL>*.YamahaExtendedControl.*<\/yamaha:X_yxcControlURL>/i; // instead query to MusicCast, because YSP soundbar is not returning MusicCast! it is "TV Peripheral"
// var reYamahaModelDesc = /<modelDescription>*.MusicCast.*<\/modelDescription>/i;
var reFriendlyName = /<friendlyName>([^<]*)<\/friendlyName>/;
var reModelName = /<modelName>([^<]*)<\/modelName>/i;
var reUniqueID = /<serialNumber>([^<]*)<\/serialNumber>/i; //same as getDeviceInfo:system_id
var reDevId = /<UDN>uuid:([^-]+-){4}([^<]*)<\/UDN>/i; //same as getDeviceInfo:system_id
class YamahaYXC {
constructor(ip, requestTimeout) {
//for testing
let ipparts = [];
if (ip) {
ipparts = ip.split(":");
}
this.ip = null || ipparts[0];
this.port = null || ipparts[1];
this.requestTimeout = requestTimeout;
this.catchRequestErrors = true;
}
//-------------- general Communication ---------------------------
async SendReqToDevice(cmd, method, body) {
let ip = this.ip;
if (this.port) ip = ip + ":" + this.port;
const req = {
method,
body,
uri: "http://" + ip + "/YamahaExtendedControl/v1" + cmd,
headers: {
"X-AppName": "MusicCast/1.0",
"X-AppPort": "41100",
},
};
if (this.requestTimeout) req.timeout = this.requestTimeout;
try {
const resp = await request(req);
if (resp.headers["content-type"] === "application/json") {
return Promise.resolve(JSON.parse(resp.body));
} else {
return Promise.resolve(resp.body);
}
} catch (error) {
return Promise.reject(error);
}
}
async SendGetToDevice(cmd) {
return await this.SendReqToDevice(cmd, "GET");
}
async SendPostToDevice(cmd, data) {
return await this.SendReqToDevice(cmd, "POST", data);
}
//------ DISCOVERY FUNCTIONS
async discoverSSDP(timeout) {
const p = new Promise(async function (resolve, reject) {
const devices = [];
// Create and configure simpleSSDP object
const ssdp = new simpleSSDP({
device_name: "MusicCast NodeJS Interface",
port: 8000,
location: "/xml/description.xml",
product: "Musiccast",
product_version: "2.0",
});
// Start
ssdp.start();
// Event: service discovered
ssdp.on("discover", (data) => {
if (data["st"] == "urn:schemas-upnp-org:device:MediaRenderer:1") {
//console.log('got data', data['address']);
var isFound = false;
if (devices.length == 0) devices.push(data);
for (let i = 0; i < devices.length; i++) {
if (devices[i].address === data.address) {
isFound = true;
break;
}
}
if (!isFound) {
devices.push(data);
}
}
});
// Event: error
ssdp.on("error", (err) => {
console.log(err);
reject("error in ssdp", e);
return;
});
// Discover all services on the local network
ssdp.discover();
// Stop after 6 seconds
await new Promise((cb) => setTimeout(cb, timeout || 5000));
// console.table(devices);
ssdp.stop(() => {
console.log("SSDP stopped");
});
resolve(devices);
});
return await p;
}
async getXML(ssdpheader) {
const urladdr = new URL(ssdpheader);
const options = {
hostname: urladdr.hostname,
port: urladdr.port,
path: urladdr.pathname,
method: "GET",
};
const p = new Promise((resolve, reject) => {
const req = http.request(options, (res) => {
res.setEncoding("utf8");
if (res.statusCode !== 200) {
throw Error(`HTTP request Failed. Status Code: ${res.statusCode}`);
}
// cumulate data
let responseBody = ""; // let body = []
res.on("data", (chunk) => {
responseBody += chunk; //body.push(chunk)
});
// resolve on end
res.on("end", () => {
try {
reyxcControl.test(responseBody);
} catch (error) {
reject(error);
}
var model = reModelName.exec(responseBody);
var name = reFriendlyName.exec(responseBody);
var sysid = reUniqueID.exec(responseBody);
var devid = reDevId.exec(responseBody);
resolve([
name[1],
model[1],
sysid[1],
String(devid[2]).toUpperCase(),
]);
});
});
// reject on request error
req.on("error", (err) => {
// This is not a "Second reject", just a different sort of failure
reject(err);
});
//always necessary
req.end();
});
return await p;
}
//new function returning an array of all found devices
async discover(timeout) {
try {
const foundDevices = await this.discoverSSDP(timeout);
const musicdevices = [];
try {
await Promise.all(
foundDevices.map(async (device) => {
const deviceinfo = await this.getXML(device.location);
musicdevices.push({
ip: device.address,
model: deviceinfo[0],
name: deviceinfo[1],
systemId: deviceinfo[2],
deviceId: deviceinfo[3],
});
})
);
return Promise.resolve(musicdevices);
} catch (error) {
return Promise.reject(error);
}
} catch (error) {
return Promise.reject(error);
}
}
//-------------Zone related comands----------
async power(on, zone) {
try {
const command =
"/" +
this.getZone(zone) +
"/setPower?power=" +
(on === "on" || on === true || on === "true" ? "on" : "standby");
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async powerOn(zone) {
try {
const command = "/" + this.getZone(zone) + "/setPower?power=on";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async powerOff(zone) {
try {
const command = "/" + this.getZone(zone) + "/setPower?power=standby";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async sleep(val, zone) {
if (val < 30) val = "0";
else if (val < 60) val = "30";
else if (val < 90) val = "60";
else if (val < 120) val = "90";
else val = "120";
try {
const command = "/" + this.getZone(zone) + "/setSleep?sleep=" + val;
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async setVolumeTo(to, zone) {
try {
const command = "/" + this.getZone(zone) + "/setVolume?volume=" + to;
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async mute(on, zone) {
try {
const command =
"/" +
this.getZone(zone) +
"/setMute?enable=" +
(on === "true" || on === true ? "true" : "false");
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async muteOn(zone) {
try {
const command = "/" + this.getZone(zone) + "/setMute?enable=true";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async muteOff(zone) {
try {
const command = "/" + this.getZone(zone) + "/setMute?enable=false";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async setInput(input, zone, mode) {
if (mode == null || mode == "undefined") {
mode = "";
} else {
mode = "&mode=" + mode;
}
//check for correct input in calling program
try {
const command =
"/" + this.getZone(zone) + "/setInput?input=" + input + mode;
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async setSound(input, zone) {
//check for correct input in calling program
try {
const command =
"/" + this.getZone(zone) + "/setSoundProgram?program=" + input;
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async surround(on, zone) {
try {
const command =
"/" +
this.getZone(zone) +
"/set3dSurround?enable=" +
(on ? "true" : "false");
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async surroundOn(zone) {
try {
const command = "/" + this.getZone(zone) + "/set3dSurround?enable=true";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async surroundOff(zone) {
try {
const command = "/" + this.getZone(zone) + "/set3dSurround?enable=false";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async setDirect(on, zone) {
try {
const command =
"/" +
this.getZone(zone) +
"/setDirect?enable=" +
(on ? "true" : "false");
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async setPureDirect(on, zone) {
try {
const command =
"/" +
this.getZone(zone) +
"/setPureDirect?enable=" +
(on ? "true" : "false");
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async setEnhancer(on, zone) {
try {
const command =
"/" +
this.getZone(zone) +
"/setEnhancer?enable=" +
(on ? "true" : "false");
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async setClearVoice(on, zone) {
try {
const command =
"/" +
this.getZone(zone) +
"/setClearVoice?enable=" +
(on ? "true" : "false");
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async setBassTo(val, zone) {
try {
const command =
"/" + this.getZone(zone) + "/setToneControl?mode=manual&bass=" + val;
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async setTrebleTo(val, zone) {
try {
const command =
"/" + this.getZone(zone) + "/setToneControl?mode=manual&treble=" + val;
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async setEqualizer(low, mid, high, zone) {
try {
const command =
"/" +
this.getZone(zone) +
"/setEqualizer?mode=manual&low=" +
low +
"&mid=" +
mid +
"&high=" +
high;
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async setBalance(val, zone) {
try {
const command = "/" + this.getZone(zone) + "/setBalance?value=" + val;
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async setSubwooferVolumeTo(val, zone) {
try {
const command =
"/" + this.getZone(zone) + "/setSubwooferVolume?volume=" + val;
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async setBassExtension(on, zone) {
try {
const command =
"/" +
this.getZone(zone) +
"/setBassExtension?enable=" +
(on ? "true" : "false");
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
//get commands
async getSignalInfo(zone) {
try {
const command = "/" + this.getZone(zone) + "/getSignalInfo";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async getStatus(zone) {
try {
const command = "/" + this.getZone(zone) + "/getStatus";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async getSoundProgramList(zone) {
try {
const command = "/" + this.getZone(zone) + "/getSoundProgramList";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
//------------ NetUSB commands --------------
async getPresetInfo() {
try {
const command = "/netusb/getPresetInfo";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async getSettings() {
try {
const command = "/netusb/getSettings";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async getRecentInfo() {
try {
const command = "/netusb/getRecentInfo";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async clearRecentInfo() {
try {
const command = "/netusb/clearRecentInfo";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async setNetPlayback(val) {
if (!val || val == "play") val = "play";
else if (val == "stop") val = "stop";
else if (val == "pause") val = "pause";
else if (val == "play_pause") val = "play_pause";
else if (val == "previous") val = "previous";
else if (val == "next") val = "next";
else if (val == "frw_start") val = "fast_reverse_start";
else if (val == "frw_end") val = "fast_reverse_end";
else if (val == "ffw_start") val = "fast_forward_start";
else if (val == "ffw_end") val = "fast_forward_end";
try {
const command = "/netusb/setPlayback?playback=" + val;
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async toggleNetRepeat() {
try {
const command = "/netusb/toggleRepeat";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async toggleNetShuffle() {
try {
const command = "/netusb/toggleShuffle";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async storePreset(val) {
if (!val) throw new Error("preset val must be specified");
try {
const command = "/netusb/storePreset?num=" + val;
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async clearPreset(val) {
if (!val) throw new Error("preset val must be specified");
try {
const command = "/netusb/clearPreset?num=" + val;
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async recallPreset(val, zone) {
if (!val) val = "1";
try {
const command =
"/netusb/recallPreset?zone=" + this.getZone(zone) + "&num=" + val;
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async recallRecentItem(val, zone) {
if (!val) val = "1";
try {
const command =
"/netusb/recallRecentItem?zone=" + this.getZone(zone) + "&num=" + val;
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async stopNet() {
try {
const command = "/netusb/setPlayback?playback=stop";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async pauseNet() {
try {
const command = "/netusb/setPlayback?playback=pause";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async playNet() {
try {
const command = "/netusb/setPlayback?playback=play";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async nextNet() {
try {
const command = "/netusb/setPlayback?playback=next";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async prevNet() {
try {
const command = "/netusb/setPlayback?playback=previous";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async frwNet(state) {
try {
let on;
if (state === "1" || state === true || state === 1 || state === "true") {
on = 1;
} else {
on = 0;
}
const command =
"/netusb/setDirect?playback=" +
(on ? "fast_reverse_start" : "fast_reverse_end");
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async ffwNet(state) {
let on;
if (state === "1" || state === true || state === 1 || state === "true") {
on = 1;
} else {
on = 0;
}
try {
const command =
"/netusb/setDirect?playback=" +
(on ? "fast_forward_start" : "fast_forward_end");
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
//----------- NETUSB list info -------------
async getListInfo(input, index, size, lang) {
if (size == null || size == "undefined") {
size = "8";
}
if (lang == null || lang == "undefined") {
lang = "";
} else {
lang = "&lang=" + lang;
}
try {
const command =
"/netusb/getListInfo?input=" +
input +
"&index=" +
index +
"&size=" +
size +
lang;
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async setListControl(listId, type, index, zone) {
if (index == null || index == "undefined") {
index = "";
} else {
index = "&index=" + index;
}
if (zone == null || zone == "undefined") {
zone = "";
} else {
zone = "&zone=" + zone;
}
try {
const command =
"/netusb/setListControl?list_id=" +
listId +
"&type=" +
type +
index +
zone;
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
//----------- NETUSB musiccast playlists ------------
async getMCPlaylists() {
try {
const command = "/netusb/getMcPlaylistName";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async getMCPlaylistContent(bank, index) {
try {
const command = "/netusb/getMcPlaylist?bank=" + bank + "&index=" + index;
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async startMCPlaylistEn(bank, index, zone) {
try {
const command =
"/netusb/manageMcPlaylist?bank=" +
bank +
"&type=play&index=" +
index +
"&zone=" +
this.getZone(zone);
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
//------------ NETUSB + CD + Tuner commands ------------
async getPlayInfo(val) {
try {
let command;
if (val === "cd") {
command = "/cd/getPlayInfo";
} else if (val === "tuner") {
command = "/tuner/getPlayInfo";
} else {
command = "/netusb/getPlayInfo";
}
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
//------------ NETUSB + CD commands ------------
async toggleRepeat(val) {
try {
let command;
if (val === "cd") {
command = "/cd/toggleRepeat";
} else {
command = "/netusb/toggleRepeat";
}
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async toggleShuffle(val) {
try {
let command;
if (val === "cd") {
command = "/cd/toggleShuffle";
} else {
command = "/netusb/toggleShuffle";
}
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async setPlayback(val, where) {
if (!val || val == "play") val = "play";
else if (val == "stop") val = "stop";
else if (val == "pause") val = "pause";
else if (val == "play_pause") val = "play_pause";
else if (val == "previous") val = "previous";
else if (val == "next") val = "next";
else if (val == "frw_start") val = "fast_reverse_start";
else if (val == "frw_end") val = "fast_reverse_end";
else if (val == "ffw_start") val = "fast_forward_start";
else if (val == "ffw_end") val = "fast_forward_end";
try {
let command;
if (where === "cd") {
command = "/cd/setPlayback?playback=" + val;
} else {
command = "/netusb/setPlayback?playback=" + val;
}
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
//------------ CD commands ------------
async setCDPlayback(val) {
if (!val || val == "play") val = "play";
else if (val == "stop") val = "stop";
else if (val == "pause") val = "pause";
else if (val == "play_pause") val = "play_pause";
else if (val == "previous") val = "previous";
else if (val == "next") val = "next";
else if (val == "frw_start") val = "fast_reverse_start";
else if (val == "frw_end") val = "fast_reverse_end";
else if (val == "ffw_start") val = "fast_forward_start";
else if (val == "ffw_end") val = "fast_forward_end";
try {
const command = "/cd/setPlayback?playback=" + val;
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async toggleTray() {
try {
const command = "/cd/toggleTray";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async toggleCDRepeat() {
try {
const command = "/cd/toggleRepeat";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async toggleCDShuffle() {
try {
const command = "/cd/toggleShuffle";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async stopCD() {
try {
const command = "/cd/setPlayback?playback=stop";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async pauseCD() {
try {
const command = "/cd/setPlayback?playback=stop";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async playCD() {
try {
const command = "/cd/setPlayback?playback=play";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async nextCD() {
try {
const command = "/cd/setPlayback?playback=next";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async prevCD() {
try {
const command = "/cd/setPlayback?playback=previous";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async frwCD(state) {
let on;
if (state === "1" || state === true || state === 1 || state === "true") {
on = 1;
} else {
on = 0;
}
try {
const command =
"/cd/setDirect?playback=" +
(on ? "fast_reverse_start" : "fast_reverse_end");
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async ffwCD(state) {
var on;
if (state === "1" || state === true || state === 1 || state === "true") {
on = 1;
} else {
on = 0;
}
try {
const command =
"/cd/setDirect?playback=" +
(on ? "fast_forward_start" : "fast_forward_end");
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
//-------------System commands------
async getDeviceInfo() {
try {
const command = "/system/getDeviceInfo";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async getFeatures() {
try {
const command = "/system/getFeatures";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async getNetworkStatus() {
try {
const command = "/system/getNetworkStatus";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async getFuncStatus() {
try {
const command = "/system/getFuncStatus";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async getNameText(zone) {
try {
const command = "/system/getNameText?id=" + zone;
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async getLocationInfo() {
try {
const command = "/system/getLocationInfo";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async setAutoPowerStandby(state, zone) {
let on;
if (state === "1" || state === true || state === 1 || state === "true") {
on = 1;
} else {
on = 0;
}
try {
const command =
"/system/setAutoPowerStandby?enable=" + (on ? "true" : "false");
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async setHdmiOut1(state, zone) {
let on;
if (state === "1" || state === true || state === 1 || state === "true") {
on = 1;
} else {
on = 0;
}
try {
const command = "/system/setHdmiOut1?enable=" + (on ? "true" : "false");
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async setHdmiOut2(state, zone) {
let on;
if (state === "1" || state === true || state === 1 || state === "true") {
on = 1;
} else {
on = 0;
}
try {
const command = "/system/setHdmiOut2?enable=" + (on ? "true" : "false");
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async setPartyMode(on) {
try {
const command = "/system/setPartyMode?enable=" + (on ? "true" : "false");
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
//----------- advanced ------------
async setLinkControl(control, zone) {
try {
const command =
"/" + this.getZone(zone) + "/setLinkControl?control=" + control;
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async setLinkAudioDelay(delay, zone) {
try {
const command =
"/" + this.getZone(zone) + "/setLinkAudioDelay?delay=" + delay;
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async setLinkAudioQuality(mode, zone) {
try {
const command =
"/" + this.getZone(zone) + "/setLinkAudioQuality?delay=" + mode;
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async getDistributionInfo() {
try {
const command = "/dist/getDistributionInfo";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async setServerInfo(data) {
try {
const command = "/dist/setServerInfo";
const result = await this.SendPostToDevice(command, data);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async setClientInfo(data) {
try {
const command = "/dist/setClientInfo";
const result = await this.SendPostToDevice(command, data);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async startDistribution(num) {
try {
const command = "/dist/startDistribution?num=" + num;
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async stopDistribution() {
try {
const command = "/dist/stopDistribution";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async setGroupName(name) {
try {
const command = "/dist/setGroupName";
const result = await this.SendPostToDevice(command, data);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
//----------- Tuner ------------
async getTunerPresetInfo(band) {
try {
const command = "/tuner/getPresetInfo?band=" + band;
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async getTunerPlayInfo() {
try {
const command = "/tuner/getPlayInfo";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async setBand(band) {
try {
const command = "/tuner/setBand?band=" + band;
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async setFreqDirect(band, freq) {
try {
const command =
"/tuner/setFreq?band=" + band + "&tuning=direct&num=" + freq;
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async switchPresetTuner(direction) {
try {
const command = "/tuner/switchPreset?dir=" + direction;
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async setDabService(direction) {
try {
const command = "/tuner/setDabService?dir=" + direction;
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
//----------- Clock ------------
async getClockSettings() {
try {
const command = "/clock/getSettings";
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async setClockAutoSync(state) {
let on;
if (state === "1" || state === true || state === 1 || state === "true") {
on = 1;
} else {
on = 0;
}
try {
const command = "/clock/setAutoSync?enable=" + (on ? "true" : "false");
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async setClockDateTime(datetime) {
try {
const command = "/clock/setDateAndTime?date_time=" + datetime;
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async setClockFormat(format) {
try {
const command = "/clock/setClockFormat?format=" + format;
const result = await this.SendGetToDevice(command);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
async setAlarmSettings(data) {
try {
const command = "/clock/SetAlarmSettings";
const result = await this.SendPostToDevice(command, data);
return Promise.resolve(result);
} catch (error) {
return Promise.reject(error);
}
}
// ---- zone number to string
getZone(zone) {
if (!zone) return "main";
if (zone.length == 1) {
zone = zone.replace("/^1", "main");
zone = zone.replace("/^2", "zone2");
zone = zone.replace("/^3", "zone3");
zone = zone.replace("/^4", "zone4");
}
switch (zone) {
case 1:
zone = "main";
break;
case 2:
case 3:
case 4:
zone = "zone" + zone;
}
return zone;
}
}
module.exports = YamahaYXC;