cedriclocqueneux Posté(e) le 20 février 2014 Signaler Posté(e) le 20 février 2014 Je viens de tester ce device, c'est tip top ! Les contrôles fonctionnent parfaitement. Par contre ce n'est pas le cas de la remontée d'état: j'ai allumé l'ampli avec la HC2, l'état était bien à On, puis le Main Loop a dà» me le remettre à Off, et volume à 0, avec source inconnue. C'est comme s'il n'arrivait pas à lire l'état et que du coup il me mettait tout à 0. Pourtant l'ampli était bien allumé et en fonctionnement. Bon, ce n'est pas un 626, mais un 616, je pense que les commandes doivent être les mêmes, pourtant.
Domodial Posté(e) le 20 février 2014 Signaler Posté(e) le 20 février 2014 Comment ajouter un bouton de source "Game" ? Car dans le fichier excel je n'ai pas trouvé. Je vois qu'il faut connaitre la valeur de ISCP\0\0\0\16\0\0\0\11\1\0\0\0!1COMMAND\r A partir de quoi faire ce bouton source ? Merci
cedriclocqueneux Posté(e) le 20 février 2014 Signaler Posté(e) le 20 février 2014 (modifié) Comment ajouter un bouton de source "Game" ? Car dans le fichier excel je n'ai pas trouvé. Je vois qu'il faut connaitre la valeur de ISCP\0\0\0\16\0\0\0\11\1\0\0\0!1COMMAND\r A partir de quoi faire ce bouton source ? Merci Faut que tu cherches le code correspondant dans ce fichier http://www.wyerd.co.uk/images/onkyo_cmds.xls Il explique ici en début de post comment créer la commande qu'on veut: http://forum.fibaro.com/viewtopic.php?t=2974&highlight=onkyo Cédric, merci de ne pas citer le message précédent ! Modifié le 20 février 2014 par moicphil Modération
BenjyNet Posté(e) le 20 février 2014 Auteur Signaler Posté(e) le 20 février 2014 @Krikroff Et bien ça donne rien de visible, à cause de l'echappement \ On ne voit que ISCP mais c'est normal ça a toujours été le cas. D'ailleurs il n'existerait pas un string.quelquechose qui permettrait de le voir ce message ? Je pense que c'est faisable parce que dans sockit je le vois genre ISCP.........!1PWR01. @cedricloqueneux Ah c'est pas normal ça. Par contre t'as bien attendu 5min ? c'est le polling pour le rafraîchissement du VD. La version 1.0.2 a été rapidement développé à l'aide du code de Krikroff j'ai peut être merdé quelque part, comme je ne suis pas codeur, c'est pas très simple pour moi tout ça @Domodial Attend la version 1.1.0, t'auras ce qu'il faut pour les entrées ou sinon tu mets à la place de COMMAND -> 03
BenjyNet Posté(e) le 20 février 2014 Auteur Signaler Posté(e) le 20 février 2014 @cedricloqueneux Hum tu pourrais m'expliquer ça... Moi je fais une photo pareille, c'est même pas la peine que je rentre àla maison
Domodial Posté(e) le 20 février 2014 Signaler Posté(e) le 20 février 2014 lol !!! (moi pareil je me fais lyncher)
cedriclocqueneux Posté(e) le 20 février 2014 Signaler Posté(e) le 20 février 2014 J'ai eu la chance que ma femme m'accompagne l'année dernière, donc elle a vu comment se passait Vegas. Elle sait que c'est de la déconnade, et elle me fait confiance ;-) Ca flatte juste un peu l'égo de se faire prendre en photo avec quelques donzelles ;-)
BenjyNet Posté(e) le 20 février 2014 Auteur Signaler Posté(e) le 20 février 2014 Bon, je me fais chier avec ce code 1.1.0 Je ne comprends absolument pas pourquoi ça ne fonctionne pas si je passe une commande ***QSTN ! Bordel !
Krikroff Posté(e) le 20 février 2014 Signaler Posté(e) le 20 février 2014 Pourquoi + 3 ? local cmd_length = tostring(string.len(cmd) + 3); J'aurais fait un + 1 sans trop me poser la question en fait ...
BenjyNet Posté(e) le 20 février 2014 Auteur Signaler Posté(e) le 20 février 2014 Parce que la taille de la commande c'est !1PWR01\n et comme je transmets PWR01 ça fait bien 5 + 3 soit 8 caractères. Bon je viens de voir aussi que j'ai merdé dans la compréhension des communications...ça se voit que je suis une pipe en anglais ? within ça veut dire "dans" et pas "apres". Faut que je regarde donc dans les 50ms si la réponse est bonne sur un changement d'état. Autre chose, en utilisant sokit (pour ceux qui ne connaissent pas ça permet de voir ce qui est envoyé en tcp/udp) je me suis aperçu que l'ampli envoyait parfois 2 réponses en même temps genre : ISCP............!1NLSC0C...ISCP............!1PWR01... et comme je check la position 19-21 forcément que ça ne marche pas !! Il faut que je fasse un string.match sur la réponse pour avoir quelque chose de cohérent ! Vive le boulet ! Bien mais tout ça c'est sur la gestion des retours d'état. Mais je ne comprends toujours pas pourquoi faire ça, ça marche _tcpSocket:write("ISCP\0\0\0\16\0\0\0\8\1\0\0\0!1PWR01\r") _tcpSocket:write("ISCP\0\0\0\16\0\0\0\10\1\0\0\0!1PWRQSTN\r") et pas ça -- Edit code below to send command (if you know it !) ------------- local command = "PWRQSTN"; -- command to PowerOn receiver local msg_cmd = "PowerOn receiver"; -- What should the command do ? local flag_debug = true; -- activate/deactivate debug messages ------------------------------------------------------------------- local cmd_length = tostring(string.len(command) + 3); bytes, errorCode = _tcpSocket:write(string.format("ISCP\0\0\0\16\0\0\0\%s\1\0\0\0!1%s\r", cmd_length, command));
BenjyNet Posté(e) le 20 février 2014 Auteur Signaler Posté(e) le 20 février 2014 @cedriclocqueneux T'as vérifié alors si le VD se mettais àjour ou pas en attendant 5min ?
BenjyNet Posté(e) le 20 février 2014 Auteur Signaler Posté(e) le 20 février 2014 Tiens j'ai une question bête : Est-ce qu'on peut ouvrir un tcp socket sur la HC2 et le laisser constamment ouvert sachant que l'ampli sur un changement d'état envoie automatiquement le nouvel état ? ou alors Vaut-il mieux intéroger l'ampli et récupérer sa réponse puis fermer le socket ? Avis d'un expert reseau ?
cedriclocqueneux Posté(e) le 20 février 2014 Signaler Posté(e) le 20 février 2014 @cedriclocqueneux T'as vérifié alors si le VD se mettais à jour ou pas en attendant 5min ? Je regarde ce soir, suis encore au taf, là . Mais quand j'ai essayé ce matin avant de partir, l'état s'est remis à off tout seul, sans doute après une interrogation de l'ampli, donc j'ai bien dà» attendre les 5min, je pense. Mais je reteste ce soir pour confirmer.
BenjyNet Posté(e) le 20 février 2014 Auteur Signaler Posté(e) le 20 février 2014 Ok ça marche, je serais sur le tchat si tu veux échanger en live. Je pourrais t'expliquer comment observer les trames tcp avec sokit pour débuger ça.
Krikroff Posté(e) le 20 février 2014 Signaler Posté(e) le 20 février 2014 @Benjy, c'est bien pour cela que je te proposais parsePowerState = function(str) if (str ~= nil and string.len(str) == 24) then local r = str:match('!1PWR(.+)\r'); if (r ~= nil) then return tonumber(r); end end return 0; end Sinon, tu es sur de toi pour le 5+3 ? c'est étrange que le ! et \n soit pris en compte pour le la taille puisque ce sont des "marqueurs" fixes ? Pour le socket ouvert en permanence oui c'est faisable, déjà fait pour le pioneer avant de revenir en arrière car comme ici c'est une surcouche Fibaro ce n'est pas optimisé (ressources) et dans mon cas le nombre de connexion était limité. C'est un truc que nous pourrons faire je pense avec la V4...
BenjyNet Posté(e) le 20 février 2014 Auteur Signaler Posté(e) le 20 février 2014 Oui pour ton code effectivement même si je pense que le \n perturbera si l'on a plusieurs réponses à la suite. Pour le format du message, regarde là dessus : Data size is the size of the eiSCP data et le data est constitué de !1XXXXX\r donc dans le cas de PWR01 ça fait bien 8 non (5+3) ?
Krikroff Posté(e) le 20 février 2014 Signaler Posté(e) le 20 février 2014 Pour traiter toutes les lignes avec la fonction, il faut avant faire un split sur \r . Le raisonnement semble juste pour eISCP
BenjyNet Posté(e) le 20 février 2014 Auteur Signaler Posté(e) le 20 février 2014 Bon quel boulet déjà la commande n'était pas bonne ! C'est "ISCP\0\0\0\16\0\0\0\10\1\0\0\0\!1PWR01\0x1A\r\n" si on veut tous les éléments. Je viens de retester, en mettant le message en "dur" genre _tcpSocket:write("ISCP\0\0\0\16\0\0\0\12\1\0\0\0\!1PWRQSTN\0x1A\r\n") ça passe ; mais si je fais dynamique local cmd = "PWRQSTN"; local cmd_length = "12"; _tcpSocket:write(string.format("ISCP\0\0\0\16\0\0\0\%s\1\0\0\0\!1%s\0x1A\r\n", cmd_length, cmd)); bah ça passe plus ! Allez savoir ! Edit, si je mets le premier %s en dur ça ne passe pas non plus. Donc le problème est sur le 2e %s. Pourquoi ça passerai avec PWR01 et pas PWRQSTN ?
Krikroff Posté(e) le 20 février 2014 Signaler Posté(e) le 20 février 2014 C'est peut être le string.format qui débloque tu devrais essayer avec une simple concaténation pour voir avec des ... A voir aussi utiliser string.char pour former le message, il faudrait que j'essaie ... Envoyé de mon iPhone àl'aide de Tapatalk
cedriclocqueneux Posté(e) le 20 février 2014 Signaler Posté(e) le 20 février 2014 Bon, je te confirme que ça ne fonctionne pas chez moi. Quand je lance le debug du Main Loop, j'obtiens ça: [DEBUG] 19:46:01: Start process #150, please wait...[DEBUG] 19:46:01: Request POWER status, #0 please wait...[DEBUG] 19:46:01: POWER status command successufully transmited.[DEBUG] 19:46:01: Check result of command : NLT[DEBUG] 19:46:01: Result fail, retry process, #0 please wait...[DEBUG] 19:46:01: Check result of command : NLS[DEBUG] 19:46:01: Result fail, retry process, #1 please wait...[DEBUG] 19:46:01: Check result of command : NLS[DEBUG] 19:46:01: Result fail, retry process, #2 please wait...[DEBUG] 19:46:02: Check result of command : NLS[DEBUG] 19:46:02: Result fail, retry process, #3 please wait...[DEBUG] 19:46:02: Check result of command : NLS[DEBUG] 19:46:02: Result fail, retry process, #4 please wait...[DEBUG] 19:46:02: Power is OFF[DEBUG] 19:46:02: Process #150 is finish! Du coup ça me passe l'état à Off, alors que l'ampli est bien allumé :/
BenjyNet Posté(e) le 20 février 2014 Auteur Signaler Posté(e) le 20 février 2014 Tu es sur quelle entrée làcédric ? Si t'es sur le NET change et met toi sur l'entrée BD/DVD et regarde le debug. J'ai un soucis avec le NET, ça envoie des infos en continu et c'est difficile àrécupérer. Il faut que j'améliore ça.
cedriclocqueneux Posté(e) le 20 février 2014 Signaler Posté(e) le 20 février 2014 Sur BD/DVD ça avait l'air de tenir. Là je suis passé manuellement sur GAME ave cal télécommande, et j'ai ça: [DEBUG] 21:43:06: Request POWER status, #0 please wait...[DEBUG] 21:43:06: POWER status command successufully transmited.[DEBUG] 21:43:07: Check result of command : PWR[DEBUG] 21:43:07: Result OK : PWR01[DEBUG] 21:43:07: Power is ON[DEBUG] 21:43:07: Request Volume level, #0 please wait...[DEBUG] 21:43:07: Request Volume level command successufully transmited.[DEBUG] 21:43:07: Check result of command :[DEBUG] 21:43:07: Result fail, retry process, #0 please wait...[DEBUG] 21:43:07: Check result of command :[DEBUG] 21:43:07: Result fail, retry process, #1 please wait...[DEBUG] 21:43:08: Check result of command :[DEBUG] 21:43:08: Result fail, retry process, #2 please wait...[DEBUG] 21:43:08: Check result of command :[DEBUG] 21:43:08: Result fail, retry process, #3 please wait...[DEBUG] 21:43:08: Check result of command :[DEBUG] 21:43:08: Result fail, retry process, #4 please wait...[ERROR] 21:43:08: line 205: attempt to concatenate field 'volume' (a nil value) L'état reste à On, c'est déjà une bonne chose, par contre l'entrée est vierge (GAME est peut être pas implémenté ?), par contre le niveau du son ne remonte pas correctement, j'ai une erreur
BenjyNet Posté(e) le 20 février 2014 Auteur Signaler Posté(e) le 20 février 2014 Bon, j'ai un gros bug sur le message de retour, effectivement vous pouvez avoir des soucis. En tout cas, je tiens à vous dire que c'est cool de vous avoir avec des ONKYO. Je peux comme ça avoir des retours sur ce qui marche ou pas et adapter aux plus grands monde ! Encore merci pour votre patience... Edit : Pour toi cédric, tu vas pas être content, mais j'ai pour le moment implémenté que mes entrées mais ça va venir patiente un peu...
cedriclocqueneux Posté(e) le 20 février 2014 Signaler Posté(e) le 20 février 2014 Pas de soucis ;-) Si on peut t'aider en faisant les tests de notre côté, c'est déjàca. Pour le contrôle, déjà, ça fonctionne, c'est déjàune très bonne chose. Pour le reste, ça va venir ;-)
BenjyNet Posté(e) le 20 février 2014 Auteur Signaler Posté(e) le 20 février 2014 Cadeau de la nuit : le main-loop en v1.0.3 (ça marche chez moi, àvoir chez vous) ------------------------------------------------------------- -- Plugin for Onkyo TX-NR626 receiver -- Use port 60128 -- Version 1.0.3 (02-21-2014) -- Author : Jean-christophe Vermandé modified by BenjyNet ------------------------------------------------------------- -- Change log 1.0.2 to 1.0.3 : -- Update refresh data : set to 2 min -- Improved sending commands and receiving status -- Improved questions results -- Added source --------------------------------------------------------c[_]- fibaro:debug('Start process Main Loop v1.0.3'); local _deviceIp = fibaro:get(fibaro:getSelfId(), "IPAddress"); local _devicePort = fibaro:get(fibaro:getSelfId(), "TCPPort"); local _maxRetryProcess = 5; -- Polling time (value in milliseconds) local _polling = 2*60*1000; local _trace = true; device = device or { id = fibaro:getSelfId(), name = "Onkyo TX-NR626", power = 0, volume = 0, source = "unknow", }; function trace(value) if (_trace) then return fibaro:debug(tostring(value)); end end function getPowerState(retry) local retry = retry or 0; local cmd = nil; --notify user fibaro:debug("Request POWER status, #" .. retry .. " please wait..."); --send packet bytes, errorCode = _tcpSocket:write("ISCP\0\0\0\16\0\0\0\12\1\0\0\0\!1PWRQSTN\0x1A\r\n"); -- check for error if errorCode == 0 then fibaro:debug("POWER status command successufully transmited."); -- amplifier sould return the string sent if success while (cmd == nil and retry < _maxRetryProcess) do fibaro:sleep(60); local result = _tcpSocket:read(); -- check if result is equal than command to confirm success fibaro:debug("Result's lenght : " .. result:len() .. " " .. type(result)); cmd = string.match(result, "PWR%d%d"); if (cmd ~= nil) then fibaro:debug(cmd); local pwr_value = tonumber(cmd:sub(4,5)); fibaro:debug("Result OK : PWR" .. pwr_value); return pwr_value; else fibaro:debug("Result fail, retry process, #" .. retry .. " please wait..."); retry = retry + 1; end end return nil; else if retry < _maxRetryProcess then fibaro:debug("Retry process, please wait..."); fibaro:sleep(2000); return getPowerState(retry + 1); end return nil; end end function getVolumeLevel(retry) local retry = retry or 0; local cmd = nil; --notify user fibaro:debug("Request Volume level, #" .. retry .. " please wait..."); --send packet bytes, errorCode = _tcpSocket:write("ISCP\0\0\0\16\0\0\0\12\1\0\0\0\!1MVLQSTN\0x1A\r\n"); -- check for error if errorCode == 0 then fibaro:debug("Request VOLUME level command successufully transmited."); -- amplifier sould return the string sent if success while (cmd == nil and retry < _maxRetryProcess) do fibaro:sleep(60); local result = _tcpSocket:read(); -- check if result is equal than command to confirm success fibaro:debug("Result's lenght : " .. result:len() .. " " .. type(result)); cmd = string.match(result, "MVL.."); if (cmd ~= nil) then local vol_value = tonumber(cmd:sub(4, 5), 16); fibaro:debug("Result OK : MVL" .. vol_value .. cmd); return vol_value; else fibaro:debug("Result fail, retry process, #" .. retry .. " please wait..."); retry = retry + 1; end end return nil; else if retry < _maxRetryProcess then fibaro:debug("Retry process, please wait..."); fibaro:sleep(2000); return getVolumeLevel(retry + 1); end return nil; end end function getSource(retry) local retry = retry or 0; local cmd = nil; --notify user fibaro:debug("Request Source, #" .. retry .. " please wait..."); --send packet bytes, errorCode = _tcpSocket:write("ISCP\0\0\0\16\0\0\0\12\1\0\0\0\!1SLIQSTN\0x1A\r\n"); -- check for error if errorCode == 0 then fibaro:debug("Request SOURCE command successufully transmited."); -- amplifier sould return the string sent if success while (cmd == nil and retry < _maxRetryProcess) do fibaro:sleep(60); local result = _tcpSocket:read(); -- check if result is equal than command to confirm success fibaro:debug("Result's lenght : " .. result:len() .. " " .. type(result)); cmd = string.match(result, "SLI.."); if (cmd ~= nil) then local src_value = tonumber(cmd:sub(4, 5), 16); fibaro:debug("Result OK : SLI" .. src_value .. cmd); local input = nil; if (src_value == 01) then input = "CBL/SAT"; elseif (src_value == 02) then input = "GAME"; elseif (src_value == 03) then input = "AUX"; elseif (src_value == 04) then input = "CEDRIC - STOP TO PLAY !"; elseif (src_value == 05) then input = "PC"; elseif (src_value == 16) then input = "BD/DVD"; elseif (src_value == 34) then input = "PHONO"; elseif (src_value == 35) then input = "TV/CD"; elseif (src_value == 36) then input = "TUNER - FM"; elseif (src_value == 37) then input = "TUNER - AM"; elseif (src_value == 41) then input = "FRONT USB"; elseif (src_value == 43) then input = "NET"; end return (input); else fibaro:debug("Result fail, retry process, #" .. retry .. " please wait..."); retry = retry + 1; end end return nil; else if retry < _maxRetryProcess then fibaro:debug("Retry process, please wait..."); fibaro:sleep(2000); return getSource(retry + 1); end return nil; end end function refreshInterface() if (device.power == true) then fibaro:call(device.id, "setProperty", "ui.lblPowerStatus.value", "ON"); -- update UI volume if (device.volume ~= nil) then fibaro:call(device.id, "setProperty", "ui.VolumeSlider.value", device.volume); end -- update UI input if (device.source ~= nil) then fibaro:call(device.id, "setProperty", "ui.lblInput.value", device.source); end else fibaro:call(device.id, "setProperty", "ui.lblPowerStatus.value", "OFF"); fibaro:call(device.id, "setProperty", "ui.lblInput.value", "unknown"); fibaro:call(device.id, "setProperty", "ui.VolumeSlider.value", "0"); end return true; end function main() -- prepare a global counter if (_count == nil) then trace("HC2 start script at " .. os.date()); _count = 0; end --notify begin of process trace("Start process #".._count..", please wait..."); --open the socket if (_tcpSocket == nil) then _tcpSocket = Net.FTcpSocket(_deviceIp, _devicePort); --set the read timeout _tcpSocket:setReadTimeout(500); end -- Query power status local power = getPowerState(); if (power == 1) then device.power = true; trace("Power is ON"); -- Query volume device.volume = getVolumeLevel(); trace("Volume is "..device.volume); -- Query source device.source = getSource(); trace("Source selected is "..device.source); else device.power = false; trace("Power is OFF"); end -- call refresh interface to repaint UI refreshInterface(); -- dispose socket if (_tcpSocket ~= nil) then -- close socket _tcpSocket:disconnect(); -- destroy object _tcpSocket = nil; end --notify end of process trace("Process #".._count.." is finish!"); -- increment global counter _count = _count + 1; end -- Start main loop process main(); -- Sleep fibaro:sleep(_polling); -- EOF Main loop
Messages recommandés