NEWS
snapcast und HTTP-API
-
Hi zusammen,
ich bin gerade dabei ein kleines Multiroom-System mit Snapcast aufzubauen.Das funktioniert bisher mit einem Server, zwei Clients und zwei Fifo-Gruppen super. Nun möchte ich das gerne noch in die Vis einbinden und die Gruppen und Clients steuern. Dafür gibt es ja eine API, die auch über Postman erreichbar ist.
POST -> http://snapcast-server:1780/jsonrpc
{"id":1,"jsonrpc":"2.0","method":"Server.GetStatus"}Jetzt kommt da natürlich ne ordentliche JSON-Datei zurück. Wie würdet ihr da jetzt weiter vorgehen? Soll ich mir ein eigenen Adapter dafür bauen? Oder ist es besser, sowas wie socket.io zu benutzen? Wobei mir da etwas der Horizont fehlt, um das sinnvoll zu bestücken.
Also grundsätzlich fehlt mir ehrlich gesagt, das Knowhow, um den richtigen/besten Weg zu finden.
Eigentlich steht in dem Status schon drin, welche Gruppen es gibt und welche Clients gerade wo angemeldet sind. Und die weiteren API-Requests sind ja auch selbsterklärend. Aber wie packe ich das jetzt am Besten in sinnvolle Stati und Objekte?
Ich bin für jeden Tipp dankbar.
Also schon mal liebe Grüße -
so, ich bin einen Schritt weiter gekommen.
ich habe den Javascript Adapter installiert und konnte schonmal die API ansprechen:var server = 'http://snapcast-server:1780/jsonrpc'; // IP var body_sent = {"id":"1","jsonrpc":"2.0","method":"Server.GetStatus"} request.post({ url: server, headers: {'Content-Type': 'application/json'}, json: body_sent }, function(error, response, body) { log(JSON.stringify(body)); } );
-
Die states habe ich jetzt erstmal angelegt. Für Audio habe ich eine eigene view angelegt. Aber wie starte ich das script, sobald der Knopf 'navigation - view' gedrückt wird?
var realm = 'snapcast'; var server = 'http://snapcast-server:1780/jsonrpc'; // IP var body_sent = {"id":"1","jsonrpc":"2.0","method":"Server.GetStatus"} // löschen aller Werte (Gruppen, Streams, usw.) $("[id=javascript.0."+realm+"]").each(function (id) { deleteState(id); }) // Init request.post({ url: server, headers: {'Content-Type': 'application/json'}, json: body_sent }, function(error, response, body) { for (let i in body.result.server.streams) { let stream = body.result.server.streams[i]; let state = realm + '.Streams.' + 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); } ); for (let i in body.result.server.groups) { let group = body.result.server.groups[i]; let group_state = realm + '.Groups.' + group.id; createState(group_state, {'name':'Gruppe ' + i, 'type':'string', 'read':true, 'write':true, 'role':'state', 'def':'' }, function() { // 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.id; createState(client_state, {'name':'Client ' + j, 'type':'string', 'read':true, 'write':true, 'role':'state', 'def':'' }, function() { // 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); } ); } ); } } ); } } );
-
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.
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)); }); });