NEWS
Onkyo NET/USB Steuerung
-
nachdem es ja einen gut funktionierenden Onkyo.vis Adapter gibt (danke an Eisbaeeer), vermisse ich noch die Steuerung für NET/USB.
Man kann zwar die Quelle Net/USB auswählen und auch noch Home-Media aber ich möchte nun auch noch durch meine Datenbank browsen.
Über die RemoteApps funktioniert das ganze ja schon. Ich hätte es aber auch gern in ioBroker.
Ich habe mir nun mal Eisbaeeer Script für CCU.io genommen und versucht es iobrokerfähig zu machen. Das klappt auch schon ganz gut.
`var io = require('socket.io-client'), net = require('net'), debug = true, onkyoSettingsIP = '192.168.1.177', onkyoSettingsport = 60128, socketOnkyo, onkyoConnected = 'false', objects = {}, datapoints = {}, onkyoID = 'javascript.0.Onkyo.', socket = io.connect("127.0.0.1", { port: 8082 }); connectOnkyo(); function connectOnkyo() { //Hier wird der Socket zum Receiver geöffnet if (debug == true) { log("adapter onkyo starting connect to:"+onkyoSettingsIP+" "+onkyoSettingsport); } socketOnkyo = net.connect({port: onkyoSettingsport, host: onkyoSettingsIP}, function() { onkyoConnected = 'true'; setState(onkyoID + "Onkyo_Connect_Status",true); log("adapter onkyo connected to Receiver: "+ onkyoSettingsIP); // log("adapter onkyo debug is set to: "+ onkyoSettings.debug); //Wenn Du noch was senden willst musst (initialisierung?) dann so: //socketOnkyo.write("HIER_DEN_STRING"); //socketOnkyo.write("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211MVLQSTN\x0D"); }); } //Wird aufgerufen wenn der Socket zum Onkyo geschlossen wird socketOnkyo.on('close', function () { log("adapter onkyo disconnected from Receiver"); }); //Wird aufgerufen wenn Daten auf dem Socket vom Onkyo kommen: socketOnkyo.on('data', function (data) { //hier z.B den String vom Onkyo zerpflücken: chunk = data.toString().slice(9); chunk = chunk.substr(9,3); string = data.toString().slice(9); string = string.substr(12,80); //Logger | Debug if (debug == true) { log("adapter Onkyo Event Receiver raw:"+data.toString()); log("adapter Onkyo Event Receiver chunk:"+chunk.toString()); log("adapter Onkyo Event Receiver string:"+string); } //usw... //z.B. ne CCU.IO Variable setzen //setState(ID,WERT); also setState(onkyoSettings.firstId+5,"10"); //Onkyo_NET/USB_Artist_Name_Info if (chunk == 'NAT') { setState(onkyoID + "Onkyo_NET/USB_Artist_Name_Info",string); } //Onkyo_NET/USB_Time_Info if (chunk == 'NTM') { setState(onkyoID + "Onkyo_NET/USB_Time_Info",string); } //Onkyo_NET/USB_Album_Name_Info if (chunk == 'NAL') { setState(onkyoID + "Onkyo_NET/USB_Album_Name_Info",string); } //Onkyo_NET/USB_Track_Info if (chunk == 'NTR') { setState(onkyoID + "Onkyo_NET/USB_Track_Info",string); } //Onkyo_NET/USB_Track_Info if (chunk == 'NTI') { setState(onkyoID + "Onkyo_NET/USB_Track_Info1",string); } //Onkyo_Volume_Zone1 if (chunk == 'MVL') { string = parseInt(string, 16); //convert hex to decimal - backward: string = string.toString(16); setState(onkyoID + "Onkyo_Volume_Zone1",string); } //Onkyo_Volume_Zone2 if (chunk == 'ZVL') { string = parseInt(string, 16); //convert hex to decimal setState(onkyoID + "Onkyo_Volume_Zone2",string); } //Onkyo_Tuning_Zone1 if (chunk == 'TUN') { string = parseInt(string) / 100; //set dot for decimal setState(onkyoID + "Onkyo_Tuning_Zone1",string); } //Onkyo_Tuning_Zone2 if (chunk == 'TUZ') { string = parseInt(string) / 100; //set dot for decimal setState(onkyoID + "Onkyo_Tuning_Zone2",string); } //Onkyo_Internet_Radio_Preset_Zone1 if (chunk == 'NPR') { string = parseInt(string, 16); //convert hex to decimal setState(onkyoID + "Onkyo_Internet_Radio_Preset_Zone1",string); } //Onkyo_Internet_Radio_Preset_Zone2 if (chunk == 'NPZ') { string = parseInt(string, 16); //convert hex to decimal setState(onkyoID + "Onkyo_Internet_Radio_Preset_Zone2",string); } //Onkyo_Input_Select_Zone1 (hex) if (chunk == 'SLI') { string = string.substr(0,2) setState(onkyoID + "Onkyo_Input_Select_Zone1",string); } //Onkyo_Input_Select_Zone2 (hex) if (chunk == 'SLZ') { string = string.substr(0,2) setState(onkyoID + "Onkyo_Input_Select_Zone2",string); } //Onkyo_Audio_Mute_Zone1 if (chunk == 'AMT') { string = parseInt(string); //convert string to integer if (string == '1') { setState(onkyoID + "Onkyo_Audio_Mute_Zone1",true); } if (string == '0') { setState(onkyoID + "Onkyo_Audio_Mute_Zone1",false); } } //Onkyo_Audio_Mute_Zone2 if (chunk == 'ZMT') { string = parseInt(string); //convert string to integer if (string == '1') { setState(onkyoID + "Onkyo_Audio_Mute_Zone2",true); } if (string == '0') { setState(onkyoID + "Onkyo_Audio_Mute_Zone2",false); } } //Onkyo_Tuner_Preset_Zone1 if (chunk == 'PRS') { string = parseInt(string, 16); //convert hex to decimal setState(onkyoID + "Onkyo_Tuner_Preset_Zone1",string); } //Onkyo_Tuner_Preset_Zone2 if (chunk == 'PRZ') { string = parseInt(string, 16); //convert hex to decimal setState(onkyoID + "Onkyo_Tuner_Preset_Zone2",string); } //Onkyo_Power_Zone1 if (chunk == 'PWR') { string = parseInt(string); //convert string to integer if (string == '1') { setState(onkyoID + "Onkyo_Power_Zone1",true); } if (string == '0') { setState(onkyoID + "Onkyo_Power_Zone1",false); } } //Onkyo_Power_Zone2 if (chunk == 'ZPW') { string = parseInt(string); //convert string to integer if (string == '1') { setState(onkyoID + "Onkyo_Power_Zone2",true); } if (string == '0') { setState(onkyoID + "Onkyo_Power_Zone2",false); } } //Navigation bei Netzwerk Modus if (chunk == 'NLT') { var string_nlt = string.substr(22,40); setState(onkyoID + "Onkyo_NET_NAVIGATION",string_nlt); //String zerlegen fuer Navigation var string_nlt_nav = string.substr(6,2); //2 digits navigation string_nlt_nav = parseInt(string_nlt_nav, 16) + 1; //this start at zero, we need start at one and convert hex to decimal var string_nlt_nav_summ = string.substr(10,2); //2 digits navigation summary string_nlt_nav_summ = parseInt(string_nlt_nav_summ, 16); //convert hex to decimal setState(onkyoID + "Onkyo_NET_POSITION_SUMM",string_nlt_nav+"/"+string_nlt_nav_summ); } //Rückgabe NSL-U0 ibs U9 in Variable schreiben if (chunk == 'NLS') { var string_nls = string.substr(0,2); var string_menu = string.substr(3,40); var string_cursor = string.substr(0,1); //Cursor var string_position = string.substr(1,1); //Cursor position var string_update = string.substr(2,1); //Cursor position update (clear list) if (debug == true) { log("adapter Onkyo Event Receiver NLS:"+string_nls); } //Clear Menu when update is need if (string_update == 'P') { setState(onkyoID + "Onkyo_NET-MENU-1",""); setState(onkyoID + "Onkyo_NET-MENU-2",""); setState(onkyoID + "Onkyo_NET-MENU-3",""); setState(onkyoID + "Onkyo_NET-MENU-4",""); setState(onkyoID + "Onkyo_NET-MENU-5",""); setState(onkyoID + "Onkyo_NET-MENU-6",""); setState(onkyoID + "Onkyo_NET-MENU-7",""); setState(onkyoID + "Onkyo_NET-MENU-8",""); setState(onkyoID + "Onkyo_NET-MENU-9",""); } //Set Curso position in var if (string_cursor == 'C') { string_position = parseInt(string_position) + 1; setState(onkyoID + "Onkyo_NET_POSITION",string_position) } //Debug if (debug == true) { log("adapter Onkyo Nav: "+string_cursor+" "+string_position+" "+string_update); } switch (string_nls) { case "U0": setState(onkyoID + "Onkyo_NET-MENU-0",string_menu); break; case "U1": setState(onkyoID + "Onkyo_NET-MENU-1",string_menu); break; case "U2": setState(onkyoID + "Onkyo_NET-MENU-2",string_menu); break; case "U3": setState(onkyoID + "Onkyo_NET-MENU-3",string_menu); break; case "U4": setState(onkyoID + "Onkyo_NET-MENU-4",string_menu); break; case "U5": setState(onkyoID + "Onkyo_NET-MENU-5",string_menu); break; case "U6": setState(onkyoID + "Onkyo_NET-MENU-6",string_menu); break; case "U7": setState(onkyoID + "Onkyo_NET-MENU-7",string_menu); break; case "U8": setState(onkyoID + "Onkyo_NET-MENU-8",string_menu); break; case "U9": setState(onkyoID + "Onkyo_NET-MENU-9",string_menu); break; //default: //alert('Default case'); //break; } } //Listening Mode if (chunk == 'LMD') { string = string.substr(0,2) setState(onkyoID + "Onkyo_Listening_Mode",string); } //Audio information if (chunk == 'IFA') { setState(onkyoID + "Onkyo_Audio_Information",string); } //Video information if (chunk == 'IFV') { setState(onkyoID + "Onkyo_Video_Information",string); } //Net Play Status if (chunk == 'NST') { var nst_play = string.substr(0,1); //Play status var nst_repeat = string.substr(1,1); //Repeat status var nst_shuffle = string.substr(2,1); //Shuffle status setState(onkyoID + "Onkyo_NET_Play_Status",nst_play); setState(onkyoID + "Onkyo_NET_Repeat_Status",nst_repeat); setState(onkyoID + "Onkyo_NET_Shuffle_Status",nst_shuffle); } }); //Wird beim Socket Fehler aufgerugen socketOnkyo.on('error', function (data) { if (debug == true) { log("adapter onkyo ERROR Connection Receiver:" +data.toString()); } setState(onkyoID + "Onkyo_Connect_Status",false); onkyoConnected = 'false'; //Neuen connect in 10sec initiieren (geht nur einmalig, deshalb setinterval onkyoreconnect) activityTimeout = setTimeout(function () { connectOnkyo(); }, 10000); }); //Wird aufgerufen bei Connect zu iobroker socket.on('connect', function () { log("adapter onkyo connected to iobroker"); }); //Wird aufgerufen bei disconnect zu iobroker socket.on('disconnect', function () { log("adapter onkyo disconnected from iobroker"); }); //Wird aufgerufen bei Änderungen von Objekten in iobroker. Hier musst Du nach den für Dich interessanten IDs suchen, z.B. Deine eigenen ID´s. socket.on('event', function (obj) { if (!obj || !obj[0]) { return; } //ID des geänderten Objektes var id = obj[0]; //Wert des geänderten Objektes var val = obj[1]; //Timestamp der letzten Änderung var ts = obj[2]; //ACKnowledge der letzten Änderung var ack = obj[3]; //z.B. wenn ID = javascript.0.Onkyo.Onkyo_Command ODER javascript.0.Onkyo.Onkyo_NET/USB_Artist_Name_Info dann mach etwas //if (obj[0] == javascript.0.Onkyo.Onkyo_Command || obj[0] == javascript.0.Onkyo.Onkyo_NET/USB_Artist_Name_Info) { //if (obj[0] == onkyoSettings.firstId || obj[0] == onkyoSettings.ccuID) { if (obj[0] == onkyoID + "Onkyo_Command" || obj[0] == onkyoID + "Onkyo_Volume_Zone1" || obj[0] == onkyoID + "Onkyo_Volume_Zone2" || obj[0] == onkyoID + "Onkyo_Tuning_Zone1" || obj[0] == onkyoID + "Onkyo_Tuning_Zone2" || obj[0] == onkyoID + "Onkyo_Internet_Radio_Preset_Zone1" || obj[0] == onkyoID + "Onkyo_Internet_Radio_Preset_Zone2" || obj[0] == onkyoID + "Onkyo_Input_Select_Zone1" || obj[0] == onkyoID + "Onkyo_Input_Select_Zone2" || obj[0] == onkyoID + "Onkyo_Audio_Mute_Zone1" || obj[0] == onkyoID + "Onkyo_Audio_Mute_Zone2" || obj[0] == onkyoID + "Onkyo_Tuner_Preset_Zone1" || obj[0] == onkyoID + "Onkyo_Tuner_Preset_Zone2" || obj[0] == onkyoID + "Onkyo_Power_Zone1" || obj[0] == onkyoID + "Onkyo_Power_Zone2" ) { //if (obj[0] == onkyoSettings.firstId) { //logger.info("adapter onkyo Event (hier hat sich bei der 100100 (firstID) was geändert): "+id+" "+val+" "+ts+" "+ack+" "+obj); if (debug == true) { log("adapter Onkyo Event: "+id+" "+val+" "+ts+" "+ack+" "+obj); } //Änderung der ersten ID 100101 und Wert ungleich "" //if (id == onkyoSettings.firstId && val != "" || id == onkyoSettings.ccuId && val != "") { if (id == onkyoID + "Onkyo_Command" && val != "") { //Array bauen und die Erste onkyoSettings.firstId einlesen var myarray = val.split (','); if (debug == true) { log("adapter Onkyo myArray:"+myarray); log("adapter Onkyo myArray:"+myarray.length); for( var i=0 ; i < myarray.length ; i++ ) { log("adapter Onkyo myArray:"+myarray[i]); } } //Einen String für den Onkyo zusammenbasteln for( var i=0 ; i < myarray.length ; i++ ) { command = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211"+myarray[i]+"\x0D"); socketOnkyo.write(command); sleep(50); //Variablen wieder zurücksetzen setState(id, ""); } } //MVL in hex if (id == onkyoID + "Onkyo_Volume_Zone1" && ack != true) { //convert decimal to hex var new_val = parseInt(val); //string to integer new_val = decimalToHex(new_val).toUpperCase(); //call function decimalToHex(); command = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211MVL"+new_val+"\x0D"); if (debug == true) { log("adapter Onkyo send:"+command); } socketOnkyo.write(command); //Variablen wieder zurücksetzen //setState(id, ""); } //ZVL in hex if (id == onkyoID + "Onkyo_Volume_Zone2" && obj[3] != true) { //convert decimal to hex var new_val = parseInt(val); //string to integer new_val = decimalToHex(new_val).toUpperCase(); //call function decimalToHex(); command = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211ZVL"+new_val+"\x0D"); if (onkyoSettings.debug == true) { log("adapter Onkyo send:"+command); } socketOnkyo.write(command); //Variablen wieder zurücksetzen //setState(id, ""); } //TUN if (id == onkyoID + "Onkyo_Tuning_Zone1" && ack != true) { //String zerlegen, damit TUNDIRECT verwendet werden kann val1 = val.substr(0,1); val2 = val.substr(1,1); val3 = val.substr(2,1); val4 = val.substr(4,1); val5 = val.substr(5,1); command1 = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211SLI24\x0D"); command2 = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211TUNDIRECT\x0D"); command3 = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211TUN"+val1+"\x0D"); command4 = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211TUN"+val2+"\x0D"); command5 = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211TUN"+val3+"\x0D"); command6 = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211TUN"+val4+"\x0D"); command7 = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211TUN"+val5+"\x0D"); socketOnkyo.write(command1); sleep(50); socketOnkyo.write(command2); sleep(50); socketOnkyo.write(command3); sleep(50); socketOnkyo.write(command4); sleep(50); socketOnkyo.write(command5); sleep(50); socketOnkyo.write(command6); sleep(50); socketOnkyo.write(command7); //Variablen wieder zurücksetzen //setState(id, ""); //Debug if (debug == true) { log("adapter Onkyo send:"+val); log("adapter Onkyo send:"+command1); log("adapter Onkyo send:"+command2); log("adapter Onkyo send:"+command3); log("adapter Onkyo send:"+command4); log("adapter Onkyo send:"+command5); log("adapter Onkyo send:"+command6); log("adapter Onkyo send:"+command7); } } //TUZ if (id == onkyoID + "Onkyo_Tuning_Zone2" && ack != true) { //String zerlegen, damit TUNDIRECT verwendet werden kann val1 = val.substr(0,1); val2 = val.substr(1,1); val3 = val.substr(2,1); val4 = val.substr(4,1); val5 = val.substr(5,1); command1 = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211SLZ24\x0D"); command2 = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211TUNDIRECT\x0D"); command3 = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211TUN"+val1+"\x0D"); command4 = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211TUN"+val2+"\x0D"); command5 = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211TUN"+val3+"\x0D"); command6 = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211TUN"+val4+"\x0D"); command7 = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211TUN"+val5+"\x0D"); socketOnkyo.write(command1); sleep(50); socketOnkyo.write(command2); sleep(50); socketOnkyo.write(command3); sleep(50); socketOnkyo.write(command4); sleep(50); socketOnkyo.write(command5); sleep(50); socketOnkyo.write(command6); sleep(50); socketOnkyo.write(command7); //Variablen wieder zurücksetzen //setState(id, ""); //Debug if (debug == true) { log("adapter Onkyo send:"+val); log("adapter Onkyo send:"+command1); log("adapter Onkyo send:"+command2); log("adapter Onkyo send:"+command3); log("adapter Onkyo send:"+command4); log("adapter Onkyo send:"+command5); log("adapter Onkyo send:"+command6); log("adapter Onkyo send:"+command7); } } //NPR in hex if (id == onkyoID + "Onkyo_Internet_Radio_Preset_Zone1" && ack != true) { //convert decimal to hex var new_val = parseInt(val); //string to integer new_val = decimalToHex(new_val).toUpperCase(); //call function decimalToHex(); command1 = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211SLI2B\x0D"); command2 = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211NPR"+new_val+"\x0D"); if (debug == true) { log("adapter Onkyo send:"+command1); log("adapter Onkyo send:"+command2); } socketOnkyo.write(command1); sleep(50); socketOnkyo.write(command2); } //NPZ in hex if (id == onkyoID + "Onkyo_Internet_Radio_Preset_Zone2" && ack != true) { //convert decimal to hex var new_val = parseInt(val); //string to integer new_val = decimalToHex(new_val).toUpperCase(); //call function decimalToHex(); command1 = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211SLZ2B\x0D"); command2 = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211NPZ"+new_val+"\x0D"); if (debug == true) { log("adapter Onkyo send:"+command1); log("adapter Onkyo send:"+command2); } socketOnkyo.write(command1); sleep(50); socketOnkyo.write(command2); } //SLI if (id == onkyoID + "Onkyo_Input_Select_Zone1" && ack != true) { command = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211SLI"+val+"\x0D"); if (debug == true) { log("adapter Onkyo send:"+command); } socketOnkyo.write(command); //Variablen wieder zurücksetzen //setState(id, ""); } //SLZ if (id == onkyoID + "Onkyo_Input_Select_Zone2" && ack != true) { command = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211SLZ"+val+"\x0D"); if (debug == true) { log("adapter Onkyo send:"+command); } socketOnkyo.write(command); //Variablen wieder zurücksetzen //setState(id, ""); } //AMT if (id == onkyoID + "Onkyo_Audio_Mute_Zone1" && ack != true) { //add support of "true|false" if (val == true) { val = '01'; } if (val == false) { val = '00'; } command = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211AMT"+val+"\x0D"); if (debug == true) { log("adapter Onkyo send:"+command); } socketOnkyo.write(command); } //ZMT if (id == onkyoID + "Onkyo_Audio_Mute_Zone2" && ack != true) { //add support of "true|false" if (val == true) { val = '01'; } if (val == false) { val = '00'; } command = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211ZMT"+val+"\x0D"); if (debug == true) { log("adapter Onkyo send:"+command); } socketOnkyo.write(command); } //PRS in hex if (id == onkyoID + "Onkyo_Tuner_Preset_Zone1" && ack != true) { //convert decimal to hex var new_val = parseInt(val); //string to integer new_val = decimalToHex(new_val).toUpperCase(); //call function decimalToHex(); command1 = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211SLI24\x0D"); command2 = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211PRS"+new_val+"\x0D"); if (debug == true) { log("adapter Onkyo send:"+command1); log("adapter Onkyo send:"+command2); } socketOnkyo.write(command1); sleep(50); socketOnkyo.write(command2); } //PRZ in hex if (id == onkyoID + "Onkyo_Tuner_Preset_Zone2" && ack != true) { //convert decimal to hex var new_val = parseInt(val); //string to integer new_val = decimalToHex(new_val).toUpperCase(); //call function decimalToHex(); command1 = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211SLZ24\x0D"); command2 = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211PRZ"+new_val+"\x0D"); if (debug == true) { log("adapter Onkyo send:"+command1); log("adapter Onkyo send:"+command2); } socketOnkyo.write(command1); sleep(50); socketOnkyo.write(command2); } //PWR if (id == onkyoID + "Onkyo_Power_Zone1" && ack != true) { //add support of "true|false" if (val == true) { val = '01'; } if (val == false) { val = '00'; } command = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211PWR"+val+"\x0D"); //init after power on command1 = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211MVLQSTN\x0D"); command2 = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211AMTQSTN\x0D"); command3 = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211LMDQSTN\x0D"); command4 = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211IFAQSTN\x0D"); command5 = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211IFVQSTN\x0D"); command6 = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211SLIQSTN\x0D"); if (debug == true) { log("adapter Onkyo send:"+command); } socketOnkyo.write(command); sleep(50); socketOnkyo.write(command1); sleep(50); socketOnkyo.write(command2); sleep(50); socketOnkyo.write(command3); sleep(50); socketOnkyo.write(command4); sleep(50); socketOnkyo.write(command5); sleep(50); socketOnkyo.write(command6); } //ZPW if (id == onkyoID + "Onkyo_Power_Zone2" && ack != true) { //add support of "true|false" if (val == true) { val = '1'; } if (val == false) { val = '0'; } command = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211ZPW0"+val+"\x0D"); command1 = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211ZVLQSTN\x0D"); command2 = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211ZMTQSTN\x0D"); command3 = new Buffer("ISCP\x00\x00\x00\x10\x00\x00\x00\x08\x01\x00\x00\x00\x211SLZQSTN\x0D"); if (debug == true) { log("adapter Onkyo send:"+command); } socketOnkyo.write(command); sleep(50); socketOnkyo.write(command1); sleep(50); socketOnkyo.write(command2); sleep(50); socketOnkyo.write(command3); } } }); //Ende des Adapters function stop() { log("adapter onkyo terminating"); socketOnkyo.end; setTimeout(function () { process.exit(); }, 250); } //Bei Unix SIGINT -->ende // process.on('SIGINT', function () { // stop(); //}); //Bei Unix SIGTERM -->ende //process.on('SIGTERM', function () { // stop(); //}); function setObject(id, obj) { objects[id] = obj; if (obj.Value) { datapoints[obj.Name] = [obj.Value]; } socket.emit("setObject", id, obj); } function setState(id, val) { datapoints[id] = [val]; log("adapter onkyo setState "+id+" "+val); socket.emit("setState", [id,val,null,true]); } function decimalToHex(d, padding) { var hex = Number(d).toString(16); padding = typeof (padding) === "undefined" || padding === null ? padding = 2 : padding; while (hex.length < padding) { hex = "0" + hex; } return hex; } function onkyoReconnect() { if (onkyoConnected != 'true'){ connectOnkyo(); } } function sleep(milliseconds) { var start = new Date().getTime(); for (var i = 0; i < 1e7; i++) { if ((new Date().getTime() - start) > milliseconds){ break; } } } function OnkyoInit() { createState(onkyoID + "Onkyo_Command"); createState(onkyoID + "Onkyo_NET/USB_Artist_Name_Info"); createState(onkyoID + "Onkyo_NET/USB_Time_Info"); createState(onkyoID + "Onkyo_NET/USB_Album_Name_Info"); createState(onkyoID + "Onkyo_NET/USB_Track_Info"); createState(onkyoID + "Onkyo_NET/USB_Track_Info1"); createState(onkyoID + "Onkyo_Volume_Zone1"); createState(onkyoID + "Onkyo_Volume_Zone2"); createState(onkyoID + "Onkyo_Tuning_Zone1"); createState(onkyoID + "Onkyo_Tuning_Zone2"); createState(onkyoID + "Onkyo_Internet_Radio_Preset_Zone1"); createState(onkyoID + "Onkyo_Internet_Radio_Preset_Zone2"); createState(onkyoID + "Onkyo_Input_Select_Zone1"); createState(onkyoID + "Onkyo_Input_Select_Zone2"); createState(onkyoID + "Onkyo_Audio_Mute_Zone1"); createState(onkyoID + "Onkyo_Audio_Mute_Zone2"); createState(onkyoID + "Onkyo_Tuner_Preset_Zone1"); createState(onkyoID + "Onkyo_Tuner_Preset_Zone2"); createState(onkyoID + "Onkyo_Power_Zone1"); createState(onkyoID + "Onkyo_Power_Zone2"); createState(onkyoID + "Onkyo_NET-MENU-0"); createState(onkyoID + "Onkyo_NET-MENU-1"); createState(onkyoID + "Onkyo_NET-MENU-2"); createState(onkyoID + "Onkyo_NET-MENU-3"); createState(onkyoID + "Onkyo_NET-MENU-4"); createState(onkyoID + "Onkyo_NET-MENU-5"); createState(onkyoID + "Onkyo_NET-MENU-6"); createState(onkyoID + "Onkyo_NET-MENU-7"); createState(onkyoID + "Onkyo_NET-MENU-8"); createState(onkyoID + "Onkyo_NET-MENU-9"); //Showing the actual position in NET-Mode createState(onkyoID + "Onkyo_NET_NAVIGATION"); //Point to navigation position in NET-Mode createState(onkyoID + "Onkyo_NET_POSITION"); //Point to navigation position in NET-Mode createState(onkyoID + "Onkyo_NET_POSITION_SUMM"); createState(onkyoID + "Onkyo_Listening_Mode"); createState(onkyoID + "Onkyo_Audio_Information"); createState(onkyoID + "Onkyo_Video_Information"); createState(onkyoID + "Onkyo_NET_Play_Status"); createState(onkyoID + "Onkyo_NET_Repeat_Status"); createState(onkyoID + "Onkyo_NET_Shuffle_Status"); createState(onkyoID + "Onkyo_Connect_Status"); log("adapter onkyo objects inserted"); } log("adapter onkyo start"); OnkyoInit() setInterval(onkyoReconnect,10000);` wenn ich nun den Befehl "NLA" mit den entsprechendan Params ""Izzzzllxxxx----""an den Onkyo sende sollte ich eigendlich informationen bekommen... wobei zzzz -> sequence number (0000-FFFF); ll -> number of layer (00-FF); xxxx -> index number (0000-FFFF : 1st to 65536th Item [4 HEX digits] ); ---- -> not used wenn ich nun folgendes Sende: [http://192.168.1.142/onkyo.php?command=NLA](http://192.168.1.142/onkyo.php?command=NLA) & params=l0000000000---- bekomme ich als Antwort: script.js.common.test_Onkyo: adapter Onkyo Event Receiver raw:ISCP!1NLTF300000000090000FFFF00NE im iobroker-log das ist aber nicht die Antwort die kommen sollte...[/i][/i]
-
ich bin ein wenig weiter…
die Navigation geht doch...
mit folgendem Befehl komme ich dierekt in command: NSV param:110, dabei steht 11-> Home-Media, 0-> Acountinfo nein (bei mir ist passwort schon im AVR hinterlegt)
damit bekomme ich dann folgende Einträre in meine Menüliste:
Onkyo_NET-MENU-0: TABLET
Onkyo_NET-MENU-1: GOTHAM-CITY
Onkyo_NET-MENU-2: FRITZ-NAS
soweit so gut... Gotham-City ist mein Home-Server! jetzt kann ich mit command: NLS param:L1 eine bene tiefen in Gotham-City browsen und so geht das dann weiter... Problem dabei ist, dass nur 10 Menüpunkte zu verfügung stehen...
Es gibt aber noch command: NLA
param: "Lzzzzllxxxxyyyy"
"specifiy to get the listed data (from Network Control Only) zzzz -> sequence number (0000-FFFF) ll -> number of layer (00-FF) xxxx -> index of start item (0000-FFFF : 1st to 65536th Item [4 HEX digits] ) yyyy -> number of items (0000-FFFF : 1 to 65536 Items [4 HEX digits] )"
param: "Izzzzllxxxx–--"
"select the listed item (from Network Control Only) zzzz -> sequence number (0000-FFFF) ll -> number of layer (00-FF) xxxx -> index number (0000-FFFF : 1st to 65536th Item [4 HEX digits] ) ---- -> not used"
als Antwort erwartet ich ("NLA" - NET/USB List Info(All item, need processing XML data, for Network Control Only))
Schema: "tzzzzsurr<…..>"
"t -> responce type 'X' : XML zzzz -> sequence number (0000-FFFF) s -> status 'S' : success, 'E' : error u -> UI type '0' : List, '1' : Menu, '2' : Playback, '3' : Popup, '4' : Keyboard, ""5"" : Menu List rr -> reserved <.....> : XML data ( [CR] and [LF] are removed ) If s='S', <response status/ok""=""><items offset/xxxx""/totalitems/yyyy""="">…</items></response> If s='E', xxxx : index of 1st item (0000-FFFF : 1st to 65536th Item [4 HEX digits] ) yyyy : number of items (0000-FFFF : 1 to 65536 Items [4 HEX digits] ) aa : Icon ID '29' : Folder, '2A' : Folder X, '2B' : Server, '2C' : Server X, '2D' : Title, '2E' : Title X, '2F' : Program, '31' : USB, '36' : Play, '37' : MultiAccount, for Spotify '38' : Account, '39' : Album, '3A' : Playlist, '3B' : Playlist-C, '3C' : starred, '3D' : What'sNew, '3E' : Artist, '3F' : Track, '40' : unstarred, '41' : Play, '43' : Search, '44' : Folder for AUPEO! '42' : Program bbb...bbb : Title "
die frage ist nur, wie wird die Antwort zurückgegeben? jeder Tag in der xml einzeln oder als komplette?
EDIT:
Kann es sein das der string der zurückkommt nicht richtig codoert ist?
-
Ich mache jetzt seit 2 Wochen "try and error" und komm nicht weiter…
Ich habe nun auch schon erfolgreich den Adapter von Eisbaeeer umgeschrieben damit die NET/USB-Menüpunkte wieder vorhanden sind
aber auch damit komme ich nicht an eine Liste aller unterordner. Auch der Kontakt zum Onkyo-Support blieb erfoglos, die habe keine
Ahnung von diesem Protokoll war die lapidare Antwort...
Das es gehen muss, davon bin ich überzeugt, denn die original Onkyo Remute3 App kann es ja auch...
Ich habe aber keine Idee mehr wie es noch funktionieren soll/kann...
auch lässt sich die eiscp-commands.json im node-eiscp nicht mehr auf den neusten Stand der eiscp-commands.yaml bringen.
Es läuft immr auf einen Fehler hinaus...
svenilee@Gotham-City:/opt/iobroker/node_modules/iobroker.onkyo-vis/node_modules/eiscp$ node eiscp-commands-convert.js /opt/iobroker/node_modules/iobroker.onkyo-vis/node_modules/eiscp/eiscp-commands.yaml:5 description: System Power Command ^^^^^ SyntaxError: Unexpected identifier at createScript (vm.js:56:10) at Object.runInThisContext (vm.js:97:10) at Module._compile (module.js:549:28) at Object.Module._extensions..js (module.js:586:10) at Module.load (module.js:494:32) at tryModuleLoad (module.js:453:12) at Function.Module._load (module.js:445:3) at Module.require (module.js:504:17) at require (internal/module.js:20:19) at Object. <anonymous>(/opt/iobroker/node_modules/iobroker.onkyo-vis/node_modules/eiscp/eiscp-commands-convert.js:22:11)</anonymous>
Hat eventuell noch jemand einen Tipp für mich?