so, der für mich ausreichende Stand ist der unten angehängte. Ist vielleicht nicht optimal, aber mir reicht es.
Das Initialisieren läuft nun beim Drücken eines Knopfes.
Bei mir gibt es nur eine Gruppe pro Client. Daher ist mein Script darauf ausgelegt.
Es kann per Dropdown einen Host vorgeben und dessen Lautstärke ändern und die aus der response vorgegebenen Streams wechseln. Nach der Aktion wird wieder das Init ausgeführt.
die beiden Dropdowns habe ich per Binding bestückt:
EDIT: host_selected korrigiert:
Volume javascript.0.snapcast.ui.host_selected
Wert/Text {javascript.0.snapcast.snapserver_response.Groups.host_ids_list} / {javascript.0.snapcast.snapserver_response.Groups.hosts_list}
Stream javascript.0.snapcast.ui.stream_id_selected
Wert/Text {javascript.0.snapcast.snapserver_response.Streams.streamsArray}
Ich persönlich habe nur zwei Streams. Einen, der vom MPD gesteuert wird, und einen, den ich manuell bestücke.
[image: 1582709578764-snapcast.jpg]
[image: 1582709848072-states.jpg]
var server = 'http://snapcast-server:1780/jsonrpc'; // IP
var top_realm = 'snapcast';
var fq_top_realm = 'javascript.0.' + top_realm;
var realm = fq_top_realm + '.snapserver_response';
var body_sent = {"id":"1","jsonrpc":"2.0","method":"Server.GetStatus"}
createState(fq_top_realm, {'name':'Snapcast', 'type':'string', 'read':true, 'write':true, 'role':'state', 'def':'' });
let update_state = fq_top_realm+'.update';
createState(update_state, {'name':'Stream ', 'type':'string', 'read':true, 'write':true, 'role':'state', 'def':'' });
let delete_state = fq_top_realm+'.delete';
createState(delete_state, {'name':'Stream ', 'type':'string', 'read':true, 'write':true, 'role':'state', 'def':'' });
let html_state = fq_top_realm+'.html';
createState(html_state, {'name':'Stream ', 'type':'string', 'read':true, 'write':true, 'role':'state', 'def':'' });
let ui_state = fq_top_realm+ '.ui';
createState(ui_state, {'name':'ui', 'type':'string', 'read':true, 'write':true, 'role':'state', 'def':'' });
let volume_percent_selected = fq_top_realm + '.ui.Volume_percent_selected';
createState(volume_percent_selected, {'name':'selected Volume', 'type':'number', 'read':true, 'write':true, 'role':'state', 'def':0 });
let stream_id_selected = fq_top_realm + '.ui.stream_id_selected';
createState(stream_id_selected, {'name':'Stream Id', 'type':'string', 'read':true, 'write':true, 'role':'state', 'def':0 });
let group_id_selected = fq_top_realm + '.ui.group_id_selected';
createState(group_id_selected, {'name':'group Id', 'type':'string', 'read':true, 'write':true, 'role':'state', 'def':0 });
let host_selected = fq_top_realm + '.ui.host_selected';
createState(host_selected, {'name':'selected Host', 'type':'string', 'read':true, 'write':true, 'role':'state', 'def':'' },
function() {
//setState (groups_array_state , {val: groups});
setState (host_selected , '');
});
on({ id: host_selected
} , function (obj) {
var lst = [];
var lst1 = [];
$("[id=*clientid*]").each (function (id) {
lst.push(id);
//setState (html_state,'<br>'+lst.join(";")+'<br><br>'+ lst1.join("<br>"));
if (getState(id).val === obj.state.val){
setState (group_id_selected, getState(id.replace( 'Client' + getState(id.replace('.clientid', '.client_count_nbr')).val+'.clientid', 'groupid')).val);
setState (volume_percent_selected, getState(id.replace('.clientid', '.config.volume.percent')).val );
setState (stream_id_selected, getState(id.replace( 'Client' + getState(id.replace('.clientid', '.client_count_nbr')).val+'.clientid', 'stream_id')).val);
}
})
});
on({ id: volume_percent_selected
} , function (obj) {
var setVolume_body = {"id":8,"jsonrpc":"2.0","method":"Client.SetVolume","params":{"id": getState (host_selected).val,"volume":{"muted":false,"percent": obj.state.val}}}
request.post({
url: server,
headers: {'Content-Type': 'application/json'},
json: setVolume_body
},
function(error, response, body) {
setState(update_state, '');
}
);
});
on({ id: stream_id_selected
} , function (obj) {
var setVolume_body = {"id":4,"jsonrpc":"2.0","method":"Group.SetStream","params":{"id":getState (group_id_selected).val,"stream_id":obj.state.val}}
request.post({
url: server,
headers: {'Content-Type': 'application/json'},
json: setVolume_body
},
function(error, response, body) {
setState(update_state, '');
}
);
});
function renderJSON(obj) {
'use strict';
var keys = [],
retValue = "";
for (var key in obj) {
if (typeof obj[key] === 'object') {
retValue += "<div class='tree'>" + key;
retValue += renderJSON(obj[key]);
retValue += "</div>";
} else {
retValue += "<div class='tree'>" + key + " = " + obj[key] + "</div>";
}
keys.push(key);
}
return retValue;
}
on({ id: delete_state,
change: 'any'
} , function (obj) {
// hier mit dem Inhalt des Objektes (obj.state.val)
// löschen aller Werte (Gruppen, Streams, usw.)
$("[id="+realm+"]").each(function (id) {
deleteState(id);
})
});
on({ id: update_state,
change: 'any'
} , function (obj) {
// Init
request.post({
url: server,
headers: {'Content-Type': 'application/json'},
json: body_sent
},
function(error, response, body) {
let streams_array = [];
for (let i in body.result.server.streams) {
let stream = body.result.server.streams[i];
let state = realm + '.Streams.' + stream.id;
streams_array.push(stream.id);
createState(state, {'name':'Stream ' + i, 'type':'string', 'read':true, 'write':true, 'role':'state', 'def':'' },
function() {
setState (state, stream.uri.raw);
let state1 = state + '.status';
createState(state1 , {'name':'Status', 'type':'string', 'read':true, 'write':true, 'role':'state', 'def':'' },
function() {
setState (state1, stream.status);
});
});
}
let server_state = realm + '.Server';
// server.host.arch
let server_arch_state = server_state +'.host.arch';
createState(server_arch_state, {'name':'Server', 'type':'string', 'read':true, 'write':true, 'role':'state'},
function() {
setState (server_arch_state , body.result.server.server.host.arch);
}
);
// server.host.ip
let server_ip_state = server_state +'.host.ip';
createState(server_ip_state, {'name':'Server', 'type':'string', 'read':true, 'write':true, 'role':'state'},
function() {
setState (server_ip_state , body.result.server.server.host.ip);
}
);
// server.host.mac
let server_mac_state = server_state +'.host.mac';
createState(server_mac_state, {'name':'Server', 'type':'string', 'read':true, 'write':true, 'role':'state'},
function() {
setState (server_mac_state , body.result.server.server.host.mac);
}
);
// server.host.name
let server_clientname_state = server_state +'.host.name';
createState(server_clientname_state, {'name':'Server', 'type':'string', 'read':true, 'write':true, 'role':'state'},
function() {
setState (server_clientname_state , body.result.server.server.host.name);
}
);
// server_server.host.os
let server_os_state = server_state +'.host.os';
createState(server_os_state, {'name':'Server', 'type':'string', 'read':true, 'write':true, 'role':'state'},
function() {
setState (server_os_state , body.result.server.server.host.os);
}
);
// snapserver.controlProtocolVersion
let server_snapserver_controlProtocolVersion = server_state +'.snapserver.controlProtocolVersion';
createState(server_snapserver_controlProtocolVersion, {'name':'Server', 'type':'number', 'read':true, 'write':true, 'role':'state'},
function() {
setState (server_snapserver_controlProtocolVersion , body.result.server.server.snapserver.controlProtocolVersion);
}
);
// snapserver.name
let server_snapserver_name = server_state +'.snapserver.name';
createState(server_snapserver_name, {'name':'Server', 'type':'string', 'read':true, 'write':true, 'role':'state'},
function() {
setState (server_snapserver_name , body.result.server.server.snapserver.name);
}
);
// snapserver.protocolVersion
let server_snapserver_protocolVersion = server_state +'.snapserver.protocolVersion';
createState(server_snapserver_protocolVersion, {'name':'Server', 'type':'number', 'read':true, 'write':true, 'role':'state'},
function() {
setState (server_snapserver_protocolVersion , body.result.server.server.snapserver.protocolVersion);
}
);
// snapserver.version
let server_snapserver_version = server_state +'.snapserver.version';
createState(server_snapserver_version, {'name':'Server', 'type':'string', 'read':true, 'write':true, 'role':'state'},
function() {
setState (server_snapserver_version , body.result.server.server.snapserver.version);
}
);
let host_names_array = [];
let host_ids_array = [];
for (let i in body.result.server.groups) {
let group = body.result.server.groups[i];
let group_state = realm + '.Groups.Group' + i;
createState(group_state, {'name':'Gruppe ' + i, 'type':'string', 'read':true, 'write':true, 'role':'state', 'def':'' },
function() {
// group_id
let group_id_state = group_state +'.groupid';
createState(group_id_state, {'name':'Group ID', 'type':'string', 'read':true, 'write':true, 'role':'state'},
function() {
setState (group_id_state , group.id);
}
);
// group_muted
let group_muted_state = group_state +'.muted';
createState(group_muted_state, {'name':'Group ' + i, 'type':'boolean', 'read':true, 'write':true, 'role':'state'},
function() {
setState (group_muted_state , group.muted);
}
);
// group_name
let group_name_state = group_state +'.name';
createState(group_name_state, {'name':'Group ' + i, 'type':'string', 'read':true, 'write':true, 'role':'state'},
function() {
setState (group_name_state , group.name);
}
);
// group_stream_id
let group_stream_id_state = group_state +'.stream_id';
createState(group_stream_id_state, {'name':'Group ' + i, 'type':'string', 'read':true, 'write':true, 'role':'state'},
function() {
setState (group_stream_id_state , group.stream_id);
}
);
for (let j in group.clients) {
let client = group.clients[j];
let client_state = group_state + '.Client' + j;
host_names_array.push(client.host.name);
host_ids_array.push(client.id);
createState(client_state, {'name':'Client ' + j, 'type':'string', 'read':true, 'write':true, 'role':'state', 'def':'' },
function() {
// client.id
let id_state = client_state +'.clientid';
createState(id_state, {'name':'Client ' + j, 'type':'string', 'read':true, 'write':true, 'role':'state'},
function() {
setState (id_state , client.id);
}
);
// client.id
let client_count_nbr_state = client_state +'.client_count_nbr';
createState(client_count_nbr_state, {'name':'Client ' + j, 'type':'string', 'read':true, 'write':true, 'role':'state'},
function() {
setState (client_count_nbr_state , j);
}
);
// client.config.instance
let instance_state = client_state +'.config.instance';
createState(instance_state, {'name':'Client ' + j, 'type':'number', 'read':true, 'write':true, 'role':'state'},
function() {
setState (instance_state , client.config.instance);
}
);
// client.config.latency
let latency_state = client_state +'.config.latency';
createState(latency_state, {'name':'Client ' + j, 'type':'number', 'read':true, 'write':true, 'role':'state'},
function() {
setState (latency_state , client.config.latency);
}
);
// client.config.name
let name_state = client_state +'.config.name';
createState(name_state, {'name':'Client ' + j, 'type':'string', 'read':true, 'write':true, 'role':'state'},
function() {
setState (name_state , client.config.name);
}
);
// client.config.volume.muted
let muted_state = client_state +'.config.volume.muted';
createState(muted_state, {'name':'Client ' + j, 'type':'boolean', 'read':true, 'write':true, 'role':'state'},
function() {
setState (muted_state , client.config.volume.muted);
}
);
// client.config.volume.percent
let percent_state = client_state +'.config.volume.percent';
createState(percent_state, {'name':'Client ' + j, 'type':'number', 'read':true, 'write':true, 'role':'state'},
function() {
setState (percent_state , client.config.volume.percent);
}
);
// client.connected
let connected_state = client_state +'.connected';
createState(connected_state, {'name':'Client ' + j, 'type':'boolean', 'read':true, 'write':true, 'role':'state'},
function() {
setState (connected_state , client.connected);
}
);
// client.host.arch
let arch_state = client_state +'.host.arch';
createState(arch_state, {'name':'Client ' + j, 'type':'string', 'read':true, 'write':true, 'role':'state'},
function() {
setState (arch_state , client.host.arch);
}
);
// client.host.ip
let ip_state = client_state +'.host.ip';
createState(ip_state, {'name':'Client ' + j, 'type':'string', 'read':true, 'write':true, 'role':'state'},
function() {
setState (ip_state , client.host.ip);
}
);
// client.host.mac
let mac_state = client_state +'.host.mac';
createState(mac_state, {'name':'Client ' + j, 'type':'string', 'read':true, 'write':true, 'role':'state'},
function() {
setState (mac_state , client.host.mac);
}
);
// client.host.name
let clientname_state = client_state +'.host.name';
createState(clientname_state, {'name':'Client ' + j, 'type':'string', 'read':true, 'write':true, 'role':'state'},
function() {
setState (clientname_state , client.host.name);
}
);
// client.host.os
let os_state = client_state +'.host.os';
createState(os_state, {'name':'Client ' + j, 'type':'string', 'read':true, 'write':true, 'role':'state'},
function() {
setState (os_state , client.host.os);
}
);
// client.lastSeen.sec
let lastseen_sec_state = client_state +'.lastSeen.sec';
createState(lastseen_sec_state, {'name':'Client ' + j, 'type':'number', 'read':true, 'write':true, 'role':'state'},
function() {
setState (lastseen_sec_state , client.lastSeen.sec);
}
);
// client.lastSeen.usec
let lastseen_usec_state = client_state +'.lastSeen.usec';
createState(lastseen_usec_state, {'name':'Client ' + j, 'type':'number', 'read':true, 'write':true, 'role':'state'},
function() {
setState (lastseen_usec_state , client.lastSeen.usec);
}
);
// client.snapclient.name
let snapclient_name_state = client_state +'.snapclient.name';
createState(snapclient_name_state, {'name':'Client ' + j, 'type':'string', 'read':true, 'write':true, 'role':'state'},
function() {
setState (snapclient_name_state , client.snapclient.name);
}
);
// client.snapclient.protocolVersion
let snapclient_protocolVersion_state = client_state +'.snapclient.protocolVersion';
createState(snapclient_protocolVersion_state, {'name':'Client ' + j, 'type':'number', 'read':true, 'write':true, 'role':'state'},
function() {
setState (snapclient_protocolVersion_state , client.snapclient.protocolVersion);
}
);
// client.snapclient.version
let snapclient_version_state = client_state +'.snapclient.version';
createState(snapclient_version_state, {'name':'Client ' + j, 'type':'string', 'read':true, 'write':true, 'role':'state'},
function() {
setState (snapclient_version_state , client.snapclient.version);
}
);
}
);
}
let host_ids_list_state = realm + '.Groups.host_ids_list';
createState(host_ids_list_state, {'name':'connected hosts', 'type':'string', 'read':true, 'write':true, 'role':'state', 'def':'' },
function() {
//setState (groups_array_state , {val: groups});
setState (host_ids_list_state , host_ids_array.join(";"));
});
let hosts_list_state = realm + '.Groups.hosts_list';
createState(hosts_list_state, {'name':'connected hosts', 'type':'string', 'read':true, 'write':true, 'role':'state', 'def':'' },
function() {
//setState (groups_array_state , {val: groups});
setState (hosts_list_state , host_names_array.join(";"));
});
}
);
}
let streams_array_state= realm + '.Streams.streamsArray';
createState(streams_array_state, {'name':'Stream ', 'type':'string', 'read':true, 'write':true, 'role':'state', 'def':'' },
function() {
//für arrays (type:array):
//setState (groups_array_state , {val: groups});
setState (streams_array_state , streams_array.join(";"));
});
setState (html_state,'<pre>'+ JSON.stringify(body.result, null, 2) + '</pre>');
//setState (html_state,renderJSON(body.result));
});
});