Aller au contenu
BenjyNet

Ampli Onkyo Et Hc2

Recommended Posts

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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é par moicphil
Modération

Partager ce message


Lien à poster
Partager sur d’autres sites

@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

Partager ce message


Lien à poster
Partager sur d’autres sites

@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 :)

Partager ce message


Lien à poster
Partager sur d’autres sites

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 ;-)

Partager ce message


Lien à poster
Partager sur d’autres sites

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 !

Partager ce message


Lien à poster
Partager sur d’autres sites

Pourquoi + 3 ?

local cmd_length = tostring(string.len(cmd) + 3);

J'aurais fait un + 1 sans trop me poser la question en fait ...

Partager ce message


Lien à poster
Partager sur d’autres sites

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));

Partager ce message


Lien à poster
Partager sur d’autres sites

@cedriclocqueneux

T'as vérifié alors si le VD se mettais àjour ou pas en attendant 5min ?

Partager ce message


Lien à poster
Partager sur d’autres sites

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 ?

Partager ce message


Lien à poster
Partager sur d’autres sites

@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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

@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...

Partager ce message


Lien à poster
Partager sur d’autres sites

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 :

gallery_11_7_65709.jpg

 

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) ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Pour traiter toutes les lignes avec la fonction, il faut avant faire un split sur \r .

 

Le raisonnement semble juste pour eISCP ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

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 ?

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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é :/

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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...

Partager ce message


Lien à poster
Partager sur d’autres sites

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 ;-)

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

×