neeo_driver_squeezebox
Version:
This driver adds Squeezebox / Logitech Media Server support to NEEO
106 lines (97 loc) • 3.64 kB
JavaScript
const neeoapi = require('neeo-sdk');
const http = require('http');
const settings = require('./settings')();
const SqueezeServer = require('../squeeze/server');
const adpaterName = 'squeezebox-adapter';
/**
* Gets the brain either from environment variable or settings.
* If both are not specified, discover one brian.
*/
function dealWithBrainIp(callback) {
const brainIp = process.env.BRAINIP;
if (!callback) {
throw '[ADAPTER] Callback missing!';
}
if (brainIp) {
console.log('[ADAPTER] use NEEO Brain IP from env variable', brainIp);
callback(brainIp);
} else {
if (settings.neeo.brainIp) {
console.log('[ADAPTER] use NEEO Brain IP from settings variable', settings.neeo.brainIp);
callback(settings.neeo.brainIp);
return;
}
console.log('[ADAPTER] discover one NEEO Brain...');
neeoapi.discoverOneBrain()
.then((brain) => {
console.log('[ADAPTER] Brain discovered:', brain.name);
callback(brain);
});
}
};
function setAdapterDeviceId(device) {
const deviceId = device.deviceidentifier;
console.log(`[BRAIN] Adapter name is ${deviceId}`);
return new Promise((resolve, reject) => {
http.get({
host: settings.neeo.brainIp,
port: 3000,
path: '/v1/projects/home/devices',
headers: {
'Content-Type': 'application/json'
}
}, function(response) {
const { statusCode } = response;
var error;
if (statusCode !== 200) {
error = new Error('[HTTP REQUEST] Request Failed.\n' + `Status Code: ${statusCode}`);
}
if (error) {
console.log('[HTTP REQUEST] Problem with request: ' + error.message);
response.resume();
reject(error);
}
var body = '';
response.on('data', function(d) {
body += d;
});
response.on('end', function() {
var parsed = JSON.parse(body);
var selected = parsed.find(x => x.details.adapterName === adpaterName);
if (selected) {
var adapterDeviceId = selected.adapterDeviceId;
console.log(`[BRAIN] Adapter device id is ${adapterDeviceId}`);
// controller.ready();
resolve(adapterDeviceId);
}
else{
console.log(`[BRAIN] Driver not installed yet, please use the NEEO app to search for "${device.devicename}"`);
}
return;
});
});
});
}
/**
* @function startSqueezeBoxDriver Starts the driver to be discovered by the brain
*/
function startSqueezeBoxDriver( brain, devices ) {
console.log('- Start server');
return neeoapi.startServer({
brain,
port: settings.neeo.driverPort,
name: adpaterName,
devices
})
.then(() => {
console.log('# READY! use the NEEO app to search for "SqueezeBox".');
devices.forEach( device => {
setAdapterDeviceId( device );
})
})
.catch((error) => {
console.error('ERROR!', error.message);
process.exit(1);
});
}
module.exports.startDriver = ( devices ) => dealWithBrainIp( brain => startSqueezeBoxDriver( brain, devices ) );