Aller au contenu

Messages recommandés

Posté(e)

Allez je suis bon prince, avant de partir en vacance je vous file la version 1.0.3 en PJ :60:

Attention ce n'est pas un VD. Mettez les scripts LUA sur les bons boutons. Si ça marche chez vous, j'updaterai le 1er post et je passerai à  la v1.1.0 pour développer de nouvelles fonctionnalités.

 

Je rappelle le change log :

--  Update refresh data : set to 2 min
--  Improved sending commands and receiving status
--  Improved questions results
--  Added source
--  All scripts are updated

Onkyo_TX-NR626_v1.0.3_scripts_lua_only.zip

Posté(e)

Installé, l'état est correctement remonté une fois, j'avais bien le status de l'ampli à  On et le son correctement remonté, puis d'un seul coup c'est retombé à  Off alors que l'ampli est toujours allumé et sur BD :/

Quand je debug, j'ai:

 

 

[DEBUG] 23:53:28: Start process #8, please wait...
[DEBUG] 23:53:28: Request POWER status, #0 please wait...
[DEBUG] 23:53:28: POWER status command successufully transmited.
[DEBUG] 23:53:28: Result's lenght : 27 string
[DEBUG] 23:53:28: Result fail, retry process, #0 please wait...
[DEBUG] 23:53:28: Result's lenght : 48 string
[DEBUG] 23:53:28: Result fail, retry process, #1 please wait...
[DEBUG] 23:53:28: Result's lenght : 27 string
[DEBUG] 23:53:28: Result fail, retry process, #2 please wait...
[DEBUG] 23:53:28: Result's lenght : 48 string
[DEBUG] 23:53:28: Result fail, retry process, #3 please wait...
[DEBUG] 23:53:28: Result's lenght : 49 string
[DEBUG] 23:53:28: Result fail, retry process, #4 please wait...
[DEBUG] 23:53:28: Power is OFF
[DEBUG] 23:53:29: Process #8 is finish!
Posté(e)

Roh punaise, prêt à  partir au ski et cédric qui me dit.. "ça marche pas" !! Rrrrrr

 

Bon tu vas me modifier cette partie dans le main loop :

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

en ça

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));
			local test = string.find(result, "!1");
      			local aff_test = fibaro:debug(result:sub(test,test + 4));
      		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

Tu regardes le debug et tu pastes ici pour voir ce qui cloche.

Sinon je serais sur Orleans vers 8h si tout va bien :) Allez les gars To SHUSSS on y crois, on va trouver :P

Posté(e)

Bon, j'ai modifié le code, allumé mon ampli manuellement, et au bout de quelques secondes l'état est correctement remonté:

 

 

[DEBUG] 13:40:45: Start process #2, please wait...
[DEBUG] 13:40:45: Request POWER status, #0 please wait...
[DEBUG] 13:40:45: POWER status command successufully transmited.
[DEBUG] 13:40:45: Result's lenght : 27 string
[DEBUG] 13:40:45: !1NLS
[DEBUG] 13:40:45: Result fail, retry process, #0 please wait...
[DEBUG] 13:40:45: Result's lenght : 26 string
[DEBUG] 13:40:45: !1PWR
[DEBUG] 13:40:45: PWR01
[DEBUG] 13:40:45: Result OK : PWR1
[DEBUG] 13:40:45: Power is ON
[DEBUG] 13:40:45: Request Volume level, #0 please wait...
[DEBUG] 13:40:45: Request VOLUME level command successufully transmited.
[DEBUG] 13:40:46: Result's lenght : 0 string
[DEBUG] 13:40:46: Result fail, retry process, #0 please wait...
[DEBUG] 13:40:46: Result's lenght : 0 string
[DEBUG] 13:40:46: Result fail, retry process, #1 please wait...
[DEBUG] 13:40:47: Result's lenght : 0 string
[DEBUG] 13:40:47: Result fail, retry process, #2 please wait...
[DEBUG] 13:40:47: Result's lenght : 0 string
[DEBUG] 13:40:47: Result fail, retry process, #3 please wait...
[DEBUG] 13:40:47: Result's lenght : 26 string
[DEBUG] 13:40:47: Result OK : MVL10MVL0A
[DEBUG] 13:40:47: Volume is 10
[DEBUG] 13:40:47: Request Source, #0 please wait...
[DEBUG] 13:40:47: Request SOURCE command successufully transmited.
[DEBUG] 13:40:48: Result's lenght : 26 string
[DEBUG] 13:40:48: Result OK : SLI16SLI10
[DEBUG] 13:40:48: Source selected is BD/DVD
[DEBUG] 13:40:48: Process #2 is finish!

 

 

 

Par contre ensuite j'ai passé l'ampli sur GAME manuellement et changé le volume, toujours manuellement, pour voir si l'état remontait correctement. Là  par contre l'état passe à  Off et j'ai ça dans le debug:

 

 

[DEBUG] 13:44:54: Start process #4, please wait...
[DEBUG] 13:44:54: Request POWER status, #0 please wait...
[DEBUG] 13:44:54: POWER status command successufully transmited.
[DEBUG] 13:44:54: Result's lenght : 27 string
[DEBUG] 13:44:54: !1NLS
[DEBUG] 13:44:54: Result fail, retry process, #0 please wait...
[DEBUG] 13:44:54: Result's lenght : 48 string
[DEBUG] 13:44:54: !1NLT
[DEBUG] 13:44:54: Result fail, retry process, #1 please wait...
[DEBUG] 13:44:54: Result's lenght : 27 string
[DEBUG] 13:44:54: !1NLS
[DEBUG] 13:44:54: Result fail, retry process, #2 please wait...
[DEBUG] 13:44:54: Result's lenght : 48 string
[DEBUG] 13:44:54: !1NLS
[DEBUG] 13:44:54: Result fail, retry process, #3 please wait...
[DEBUG] 13:44:54: Result's lenght : 49 string
[DEBUG] 13:44:54: !1NLS
[DEBUG] 13:44:54: Result fail, retry process, #4 please wait...
[DEBUG] 13:44:54: Power is OFF
[DEBUG] 13:44:54: Process #4 is finish!
 

 

 

:( Mais bon, profites de tes vacances, y'a pas urgence ;-)

Posté(e)

Bon, pas encore rentré àla maison mais de retour sur les ondes... Je réfléchis àune amélioration possible et te propose ça fin de semaine.

@Domodial

Ça marche chez toi cette version ?

Posté(e)

Bonjour,

 

Code testé avec un TX-NR525, fonctionne niquel!

Par contre lorsque l'on éteint l'ampli, la carte réseau n'est plus alimenté, donc impossible de le rallumer via l'application... Il faudra regarder si dans les réglages de l'ampli il y a possibilité de modifier cela pour ce modèle.

 

Domadoo à  fait une vidéo de présentation: 

 

Et un article devrait bientôt sortir sur le blog.

 

Merci beaucoup pour le partage en tout cas! C'est vraiment du bon boulot!

Posté(e)

Oh con ! Domadoo qui publie un billet sur mon VD ! Mais bon c'est con, ça marche pas chez cédric... mais je suis de retour devant mon ordi, héhéhéhé !

 

Pour le TX NR525 il faut dans les paramètres activer le Hybrid standby, tu mets dans Network Setup , Network Standby à  ON. Normalement tu dois pouvoir le commander, même éteint !

Posté(e)

Tiens cédric, testes ça dans le main loop ce soir si t'as le temps :

-------------------------------------------------------------
-- 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.");
    	fibaro:sleep(50);
		-- amplifier sould return the string sent if success
    	while (cmd == nil and retry < _maxRetryProcess) do
			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.");
    	fibaro:sleep(50);
		-- amplifier sould return the string sent if success
    	while (cmd == nil and retry < _maxRetryProcess) do
			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.");
    	fibaro:sleep(50);
		-- amplifier sould return the string sent if success
    	while (cmd == nil and retry < _maxRetryProcess) do
			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

Si ça ne fonctionne pas, il faudra faire un petit teamviewer que je vois exactement ce qu'il se passe ! Ici ça marche impeccable, du 1er coup.

Posté(e)

@ Krikroff

J'ai besoin de ton aide sur un truc.

Je récupère les infos audio avec une commande qui me retourne une phrase : "HDMI 2,DTS,48 kHz,5.1 ch,DTS,5.1 ch,\0x1A\r\n"

Comment je peux faire pour récupérer tout ce qui est entre la avant-avant dernière virgule et la dernière virgule. Bien sur l'ensemble des textes peut changer mais ils sont toujours séparé par des virgules et j'ai toujours àla fin \0x1A\r\n.

Posté(e)

Benjy penche toi sur les regex ;).

 

Mais je te préviens que c'est la merde ^^.

 

Ou alors la solution la plus simple tu l'appelle dans une fonction genre et tu peux récupérer chaque résultat.

 

Mais pour moi le mieux est le regex:

 

http://lua-users.org/wiki/PatternsTutorial

https://www.easyuo.com/openeuo/wiki/index.php/Lua_Patterns_and_Captures_%28Regular_Expressions%29

http://www.wellho.net/mouth/2383_Lua-Regular-Expressions.html

http://www.lua.org/pil/20.2.html

http://www.computercraft.info/forums2/index.php?/topic/13621-patterns-regex-in-lua-tutorial/
 

Posté(e)

Arf Shad, je connais tout ça déjàmais justement je cherchais une façon simple de traiter la réponse sans fonction compliquée.

Posté(e)

Bah voilàquand tu veux :) Pil poil ce qu'il me fallait, je cherchais justement àfaire un tableau avec une boucle for.. .mais si c'est tout fait alors autant l'utiliser :)

×
×
  • Créer...