@St0g1e - first of all, thank you very much for your work on this API at https://github.com/st0g1e/roon-extension-ws-player. It has been incredibly helpful as I was working through this.
But back on topic. If I read your intent of using “get_zones()”, you are looking for a way to have a list of active zones that updates automatically as zones are added and removed. If that is correct, then this is something I was also looking for.
Below is what I came up with using a different approach than you had in your code. The resulting variables “zoneList” and “zoneStatus” are JSON arrays that can be fed to a web socket channels/subscriptions/feeds whatever.
The array “zoneList” always has the current list of the zones that Roon knows about and it updates as zones are added and removed. It is an array of “zone_id”, “output_id”, and “display_name”.
The array “zoneStatus” always has the current status of the zones that Roon knows about and it too updates as zones are changed, added and removed. It is the full array that is provided by the Roon API.
Is this helpful?
(NOTE: this is my first publicly posted javascript. If you have suggestions for improvement, let me know.)
// Setup general variables
const listenPort = 8080;
var core;
var zoneStatus = [];
var zoneList = [];
// Setup Express
var express = require('express');
var http = require('http');
var app = express();
app.use(express.static('public'));
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
// Setup Socket IO
var server = http.createServer(app);
var io = require('socket.io').listen(server);
server.listen(listenPort, function() {
console.log('Listening on port ' + listenPort);
})
// Setup Roon
var RoonApi = require("node-roon-api");
var RoonApiStatus = require("node-roon-api-status");
var RoonApiTransport = require("node-roon-api-transport");
var roon = new RoonApi({
extension_id: 'com.pluggemi.roon.ws.api',
display_name: "Web Socket API",
display_version: "1.0.0",
publisher: 'Mike Plugge',
email: 'masked',
website: 'masked',
core_paired: function(core_) {
core = core_;
transport = core_.services.RoonApiTransport;
transport.subscribe_zones(function(response, data){
if (response == "Subscribed") {
for ( x in data.zones ) {
var zone_id = data.zones[x].zone_id;
var display_name = data.zones[x].display_name;
for (y in data.zones[x].outputs){
var output_id = data.zones[x].outputs[y].output_id;
}
item = {};
item ["zone_id"] = zone_id;
item ["output_id"] = output_id;
item ["display_name"] = display_name;
zoneList.push(item);
zoneStatus.push(data.zones[x])
}
io.emit("zoneList", zoneList);
io.emit("zoneStatus", zoneStatus);
}
else if (response == "Changed") {
if (data.zones_added){
for ( x in data.zones_added ) {
var zone_id = data.zones_added[x].zone_id;
var display_name = data.zones_added[x].display_name;
for (y in data.zones_added[x].outputs){
var output_id = data.zones_added[x].outputs[y].output_id;
}
item = {};
item ["zone_id"] = zone_id;
item ["output_id"] = output_id;
item ["display_name"] = display_name;
zoneList.push(item);
zoneStatus.push(data.zones_added[x])
}
io.emit("zoneList", zoneList);
io.emit("zoneStatus", zoneStatus);
}
else if (data.zones_removed){
for (x in data.zones_removed) {
zoneList = zoneList.filter(function(zone){
return zone.zone_id != data.zones_removed[x];
});
zoneStatus = zoneStatus.filter(function(zone){
return zone.zone_id != data.zones_removed[x];
});
}
io.emit("zoneList", zoneList);
io.emit("zoneStatus", zoneStatus);
}
else if (data.zones_changed){
for (x in data.zones_changed){
for (y in zoneStatus){
if (zoneStatus[y].zone_id == data.zones_changed[x].zone_id){
zoneStatus[y] = data.zones_changed[x];
}
}
}
io.emit("zoneStatus", zoneStatus);
}
else {
console.log("Unknown transport response: " + response + " : " + data);
}
}
});
},
core_unpaired: function(core) {}
});
var svc_status = new RoonApiStatus(roon);
roon.init_services({
required_services: [ RoonApiTransport],
provided_services: [ svc_status ]
});
svc_status.set_status("Extenstion enabled", false);
roon.start_discovery();
// Web Socket
io.on('connection', function(socket){
io.emit("zoneList", zoneList);
io.emit("zoneStatus", zoneStatus);
});
// Web Routes
app.get('/', function(req, res){
res.sendFile(__dirname + '/public/index.html');
});