Qmotion Blinds

The iRule plug-in for VERA is really poor. In my case I have both VERA and iRule communicating directly with the Qconnect via the IP2SL.

VERA uses my LUA function above, and iRule sends the serial commands in Hex…

[quote=“wilme2, post:31, topic:179025”]The iRule plug-in for VERA is really poor. In my case I have both VERA and iRule communicating directly with the Qconnect via the IP2SL.

VERA uses my LUA function above, and iRule sends the serial commands in Hex…[/quote]

Thanks Wilme2,

For a beginner Z waver like myself, in your experience what would the easiest implementation involve the IP2SR or the Vera to Qconnect method?
I will also need remotec ZXT-120R for my split system, this doesn’t clash with any of the above does it?

Apologies, rookie questions but in the process of mapping out what I need!

I personally recommend the Vera to IP2SL to Qconnect to Qmotion blinds method.
And at the same time the iRule to IP2SL to Qconnect to Qmotion blinds method.

Meaning make the Qconnect IP addressable by connecting to it via the IP2SL. Then you can use any number of devices to send commands to the Qconnect via the IP2SL. I know some people on this board might prefer a direct connect between Vera and Qconnect, and hence if a plug-in gets built it might expect that direct connection, but I am definitely not in that camp. I prefer to IP enable Qconnect and then send commands via IP.

One of the devices you will use to control the blinds under this scenario will obviously be Vera. Then, if desired, your phones/tables running iRule or RoomieRemote would be another set of devices.

If you haven’t configured an ITach device before, there will be a learning curve, but these devices are essential to making devices with IR, RS232, or contact closure part of your automation strategy, and hence I think the time is well spent. I had the advantage of already having configured multiple IP2IR and IP2SL devices for my iRule remote control network, and had figured out how to create and modify the Hex commands sent by iRule, so I had the confidence to know it could be done.

I updated my function to take a single string as a parameter, and then parse it back to numerics. It is uglier, but now can be used with luup.call_delay()…

function MoveQMotionShades(ParamString)

	local shadeChar,openAmtChar = string.match(ParamString,"(%d+),(%d+)")
	local shadeNum = tonumber(shadeChar)
	local openAmtNum = tonumber(openAmtChar)
	local CommandtoSend

	if shadeNum == 1 then
		if openAmtNum == 100 		then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x01,0x01,0x00,0xFC) -- Channel 1 Up
		elseif openAmtNum == 75 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x01,0x04,0x00,0xF9) -- Channel 1 75% Up
		elseif openAmtNum == 50	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x01,0x08,0x00,0xF5) -- Channel 1 50% Up
		elseif openAmtNum == 25	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x01,0x0C,0x00,0xF1) -- Channel 1 25% Up
		elseif openAmtNum == 0 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x01,0x02,0x00,0xFF) -- Channel 1 Down
		end
	elseif shadeNum == 2 then
		if openAmtNum == 100 		then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x02,0x01,0x00,0xFF) -- Channel 1 Up
		elseif openAmtNum == 75 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x02,0x04,0x00,0xFA) -- Channel 1 75% Up
		elseif openAmtNum == 50	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x02,0x08,0x00,0xF6) -- Channel 1 50% Up
		elseif openAmtNum == 25	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x02,0x0C,0x00,0xF2) -- Channel 1 25% Up
		elseif openAmtNum == 0 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x02,0x02,0x00,0xFC) -- Channel 1 Down
		end
	elseif shadeNum == 3 then
		if openAmtNum == 100 		then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x03,0x01,0x00,0xFE) -- Channel 1 Up
		elseif openAmtNum == 75 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x03,0x04,0x00,0xFB) -- Channel 1 75% Up
		elseif openAmtNum == 50	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x03,0x08,0x00,0xF7) -- Channel 1 50% Up
		elseif openAmtNum == 25	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x03,0x0C,0x00,0xF3) -- Channel 1 25% Up
		elseif openAmtNum == 0 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x03,0x02,0x00,0xFD) -- Channel 1 Down
		end
	elseif shadeNum == 4 then
		if openAmtNum == 100 		then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x04,0x01,0x00,0xF9) -- Channel 1 Up
		elseif openAmtNum == 75 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x04,0x04,0x00,0xFC) -- Channel 1 75% Up
		elseif openAmtNum == 50	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x04,0x08,0x00,0xF0) -- Channel 1 50% Up
		elseif openAmtNum == 25	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x04,0x0C,0x00,0xF4) -- Channel 1 25% Up
		elseif openAmtNum == 0 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x04,0x02,0x00,0xFA) -- Channel 1 Down
		end
	end


	-- Connect and Send Command

	local socket = require("socket")
	host = "192.168.0.123"
	c = assert(socket.connect(host, 4999))
	c:settimeout(5)

	local sres, serr = c:send(CommandtoSend)
	print("Send:", sres, serr)
	local data, rerr = c:receive(5)
	luup.log (data)
	print ("Receive:", data, rerr)

	c:close()

end

And so now to call you send a string…

MoveQMotionShades("2,0")

I had an ah-ha moment today in another thread. http://forum.micasaverde.com/index.php/topic,11964.msg214086.html#msg214086

I have been having a lot of problems with the Qmotion shade in my kitchen not responding to open/close commands - not just via the Qconnect, but also the hand held remotes in close proximity. I also have an Oregon Scientific receiver on my kitchen counter, and a remote temp sensor just outside the window. Yesterday I tracked down the Qmotion frequency on the FCC website as they do not list it in any of their documentation - 433.92 MHZ. I bet the Oregon Scientific is the interference - that is the EXACT same frequency.

http://fccid.net/number.php?fcc=X6P-EX11059&id=398176#axzz3OvOQwzEn

On one hand, if you are using a RFXtrx433 with Vera - be careful if you order Qmotion shades due to possible interference. On the other hand, in theory with some work it should be possible to build support for the Qmotion shades into the RFXtrx Gateway, and hence control the shades from a RFXtrx433 without the $500 expense of buying a Qconnect like I did…

(Update Qmotion transmit/receive possibly encrypted : http://fccid.net/document.php?id=2156824#axzz3OvOQwzEn)

I added another 4 Qmotion blinds two weeks ago, and have updated the procedure below with all 15 channels (although I am only using 11). I also added in check of an associated device - meaning a window sensor - before I move any roller shade. If the window is closed, the command is sent, but if the window is open, nothing is transmitted. That way if the window is open, the shade can only be moved manually (well not via Vera anyway), but if closed they move the position dictated by Vera. You should customize as needed, of course…

function MoveQMotionShades(ParamString)

	local shadeChar,openAmtChar = string.match(ParamString,"(%d+),(%d+)")
	local shadeNum = tonumber(shadeChar)
	local openAmtNum = tonumber(openAmtChar)
	local CommandtoSend

	if shadeNum == 1 then
		local tripped = luup.variable_get( "urn:micasaverde-com:serviceId:SecuritySensor1", "Tripped", 26)
		if tripped == "0" then
			if openAmtNum == 100 		then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x01,0x01,0x00,0xFC) -- Channel 1 Up
			elseif openAmtNum == 75 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x01,0x04,0x00,0xF9) -- Channel 1 75% Up
			elseif openAmtNum == 50	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x01,0x08,0x00,0xF5) -- Channel 1 50% Up
			elseif openAmtNum == 25	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x01,0x0C,0x00,0xF1) -- Channel 1 25% Up
			elseif openAmtNum == 0 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x01,0x02,0x00,0xFF) -- Channel 1 Down
			end
		end
	elseif shadeNum == 2 then
		local tripped = luup.variable_get( "urn:micasaverde-com:serviceId:SecuritySensor1", "Tripped", 27)
		if tripped == "0" then
			if openAmtNum == 100 		then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x02,0x01,0x00,0xFF) -- Channel 2 Up
			elseif openAmtNum == 75 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x02,0x04,0x00,0xFA) -- Channel 2 75% Up
			elseif openAmtNum == 50	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x02,0x08,0x00,0xF6) -- Channel 2 50% Up
			elseif openAmtNum == 25	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x02,0x0C,0x00,0xF2) -- Channel 2 25% Up
			elseif openAmtNum == 0 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x02,0x02,0x00,0xFC) -- Channel 2 Down
			end
		end
	elseif shadeNum == 3 then
		local tripped = luup.variable_get( "urn:micasaverde-com:serviceId:SecuritySensor1", "Tripped", 28)
		if tripped == "0" then
			if openAmtNum == 100 		then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x03,0x01,0x00,0xFE) -- Channel 3 Up
			elseif openAmtNum == 75 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x03,0x04,0x00,0xFB) -- Channel 3 75% Up
			elseif openAmtNum == 50	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x03,0x08,0x00,0xF7) -- Channel 3 50% Up
			elseif openAmtNum == 25	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x03,0x0C,0x00,0xF3) -- Channel 3 25% Up
			elseif openAmtNum == 0 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x03,0x02,0x00,0xFD) -- Channel 3 Down
			end
		end
	elseif shadeNum == 4 then
		local tripped = luup.variable_get( "urn:micasaverde-com:serviceId:SecuritySensor1", "Tripped", 21)
		if tripped == "0" then
			if openAmtNum == 100 		then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x04,0x01,0x00,0xF9) -- Channel 4 Up
			elseif openAmtNum == 75 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x04,0x04,0x00,0xFC) -- Channel 4 75% Up
			elseif openAmtNum == 50	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x04,0x08,0x00,0xF0) -- Channel 4 50% Up
			elseif openAmtNum == 25	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x04,0x0C,0x00,0xF4) -- Channel 4 25% Up
			elseif openAmtNum == 0 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x04,0x02,0x00,0xFA) -- Channel 4 Down
			end
		end
	elseif shadeNum == 5 then
	-- Non-opening window, no need to check sensor
			if openAmtNum == 100 		then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x05,0x01,0x00,0xF8) -- Channel 5 Up
			elseif openAmtNum == 75 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x05,0x04,0x00,0xFD) -- Channel 5 75% Up
			elseif openAmtNum == 50	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x05,0x08,0x00,0xF1) -- Channel 5 50% Up
			elseif openAmtNum == 25	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x05,0x0C,0x00,0xF5) -- Channel 5 25% Up
			elseif openAmtNum == 0 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x05,0x02,0x00,0xFB) -- Channel 5 Down
			end
	elseif shadeNum == 6 then
		local tripped = luup.variable_get( "urn:micasaverde-com:serviceId:SecuritySensor1", "Tripped", 25)
		if tripped == "0" then
			if openAmtNum == 100 		then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x06,0x01,0x00,0xFB) -- Channel 6 Up
			elseif openAmtNum == 75 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x06,0x04,0x00,0xFE) -- Channel 6 75% Up
			elseif openAmtNum == 50	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x06,0x08,0x00,0xF2) -- Channel 6 50% Up
			elseif openAmtNum == 25	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x06,0x0C,0x00,0xF6) -- Channel 6 25% Up
			elseif openAmtNum == 0 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x06,0x02,0x00,0xF8) -- Channel 6 Down
			end
		end
	elseif shadeNum == 7 then
		local tripped = luup.variable_get( "urn:micasaverde-com:serviceId:SecuritySensor1", "Tripped", 22)
		if tripped == "0" then
			if openAmtNum == 100 		then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x07,0x01,0x00,0xFA) -- Channel 7 Up
			elseif openAmtNum == 75 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x07,0x04,0x00,0xFF) -- Channel 7 75% Up
			elseif openAmtNum == 50	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x07,0x08,0x00,0xF3) -- Channel 7 50% Up
			elseif openAmtNum == 25	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x07,0x0C,0x00,0xF7) -- Channel 7 25% Up
			elseif openAmtNum == 0 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x07,0x02,0x00,0xF9) -- Channel 7 Down
			end
		end
	elseif shadeNum == 8 then
		local tripped = luup.variable_get( "urn:micasaverde-com:serviceId:SecuritySensor1", "Tripped", 23)
		if tripped == "0" then
			if openAmtNum == 100 		then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x08,0x01,0x00,0xF5) -- Channel 8 Up
			elseif openAmtNum == 75 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x08,0x04,0x00,0xF0) -- Channel 8 75% Up
			elseif openAmtNum == 50	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x08,0x08,0x00,0xFC) -- Channel 8 50% Up
			elseif openAmtNum == 25	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x08,0x0C,0x00,0xF8) -- Channel 8 25% Up
			elseif openAmtNum == 0 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x08,0x02,0x00,0xF6) -- Channel 8 Down
			end
		end
	elseif shadeNum == 9 then
		local tripped = luup.variable_get( "urn:micasaverde-com:serviceId:SecuritySensor1", "Tripped", 23)
		if tripped == "0" then
			if openAmtNum == 100 		then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x09,0x01,0x00,0xF4) -- Channel 9 Up
			elseif openAmtNum == 75 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x09,0x04,0x00,0xF1) -- Channel 9 75% Up
			elseif openAmtNum == 50	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x09,0x08,0x00,0xFD) -- Channel 9 50% Up
			elseif openAmtNum == 25	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x09,0x0C,0x00,0xF9) -- Channel 9 25% Up
			elseif openAmtNum == 0 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x09,0x02,0x00,0xF7) -- Channel 9 Down
			end
		end
	elseif shadeNum == 10 then
		local tripped = luup.variable_get( "urn:micasaverde-com:serviceId:SecuritySensor1", "Tripped", 24)
		if tripped == "0" then
			if openAmtNum == 100 		then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x0A,0x01,0x00,0xF7) -- Channel 10/A Up
			elseif openAmtNum == 75 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x0A,0x04,0x00,0xF2) -- Channel 10/A 75% Up
			elseif openAmtNum == 50	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x0A,0x08,0x00,0xFE) -- Channel 10/A 50% Up
			elseif openAmtNum == 25	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x0A,0x0C,0x00,0xFA) -- Channel 10/A 25% Up
			elseif openAmtNum == 0 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x0A,0x02,0x00,0xF4) -- Channel 10/A Down
			end
		end
	elseif shadeNum == 11 then
		local tripped = luup.variable_get( "urn:micasaverde-com:serviceId:SecuritySensor1", "Tripped", 24)
		if tripped == "0" then
			if openAmtNum == 100 		then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x0B,0x01,0x00,0xF6) -- Channel 11/B Up
			elseif openAmtNum == 75 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x0B,0x04,0x00,0xF3) -- Channel 11/B 75% Up
			elseif openAmtNum == 50	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x0B,0x08,0x00,0xFF) -- Channel 11/B 50% Up
			elseif openAmtNum == 25	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x0B,0x0C,0x00,0xFB) -- Channel 11/B 25% Up
			elseif openAmtNum == 0 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x0B,0x02,0x00,0xF5) -- Channel 11/B Down
			end
		end
	elseif shadeNum == 12 then
	-- Future Use
			if openAmtNum == 100 		then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x0C,0x01,0x00,0xF1) -- Channel 12/C Up
			elseif openAmtNum == 75 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x0C,0x04,0x00,0xF4) -- Channel 12/C 75% Up
			elseif openAmtNum == 50	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x0C,0x08,0x00,0xF8) -- Channel 12/C 50% Up
			elseif openAmtNum == 25	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x0C,0x0C,0x00,0xFC) -- Channel 12/C 25% Up
			elseif openAmtNum == 0 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x0C,0x02,0x00,0xF2) -- Channel 12/C Down
			end
	elseif shadeNum == 13 then
	-- Future Use
			if openAmtNum == 100 		then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x0D,0x01,0x00,0xF0) -- Channel 13/D Up
			elseif openAmtNum == 75 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x0D,0x04,0x00,0xF5) -- Channel 13/D 75% Up
			elseif openAmtNum == 50	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x0D,0x08,0x00,0xF9) -- Channel 13/D 50% Up
			elseif openAmtNum == 25	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x0D,0x0C,0x00,0xFD) -- Channel 13/D 25% Up
			elseif openAmtNum == 0 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x0D,0x02,0x00,0xF3) -- Channel 13/D Down
			end
	elseif shadeNum == 14 then
	-- Future Use
			if openAmtNum == 100 		then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x0E,0x01,0x00,0xF3) -- Channel 14/E Up
			elseif openAmtNum == 75 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x0E,0x04,0x00,0xF6) -- Channel 14/E 75% Up
			elseif openAmtNum == 50	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x0E,0x08,0x00,0xFA) -- Channel 14/E 50% Up
			elseif openAmtNum == 25	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x0E,0x0C,0x00,0xFE) -- Channel 14/E 25% Up
			elseif openAmtNum == 0 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x0E,0x02,0x00,0xF0) -- Channel 14/E Down
			end
	elseif shadeNum == 15 then
-- Future Use
			if openAmtNum == 100 		then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x0F,0x01,0x00,0xF2) -- Channel 15/F Up
			elseif openAmtNum == 75 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x0F,0x04,0x00,0xF7) -- Channel 15/F 75% Up
			elseif openAmtNum == 50	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x0F,0x08,0x00,0xFB) -- Channel 15/F 50% Up
			elseif openAmtNum == 25	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x0F,0x0C,0x00,0xFF) -- Channel 15/F 25% Up
			elseif openAmtNum == 0 	then CommandtoSend= string.char(0x01,0x07,0x00,0x05,0x01,0x0F,0x02,0x00,0xF1) -- Channel 15/F Down
			end
	end


	-- Connect and Send Command

	local socket = require("socket")
	host = "192.168.0.123"
	c = assert(socket.connect(host, 4999))
	c:settimeout(5)

	local sres, serr = c:send(CommandtoSend)
	print("Send:", sres, serr)
	local data, rerr = c:receive(5)
	luup.log (data)
	print ("Receive:", data, rerr)

	c:close()

end

As before it is called as

MoveQMotionShades ("10,25")

or if you want a delay

luup.call_delay("MoveQMotionShades",40,"10,25")

And this is designed to work with a Global Cache iTach IP2SL connected to a Qmotion Qconnect via custom serial cable. This config allows Vera control via IP, as well as control via other applications like iRule custom remote controls.

Just to clarify guys…

We are talking about Qmotion blinds where you can tilt them via the proposed solutions here. Qmotion show cased a solution last year where they will offer blinds which can be lowered/raised and also tilted at the same time and all motorized. This solution is not on the market yet.

All the code I have seen here was just to open or close the blinds which implies they are either shades to lower or raise them… or they are blinds which are always manually raised or lowered and the motorization only applies to tilt them.

Did I get this right here?

Everything I have posted here is for their roller shades or honeycomb shades. So just raise and lower (with 3 intermediate positions).

Thank you for the clarification.

I just purchased 8 motorized blinds with a qsync was abit nervous going the qconnect route as im not tech savy in coding or making my own cable. I see you mentioned wireshark may be able to sniff code. How hard is it to setup to see if anything is readable over the wifi network? I could give it it a try.

I don’t have much experience with Wireshark sniffing - I have it installed on my laptop and use it for work - but really just to be able to read traces I get sent by another team (reviewing SIP headers to correct VOIP problems). That said - it is easy to setup- you just pick a interface (wi-fi device) and hit start. If the data is an HTTP call, I think you will see it in all of its glory - if some other type of communication I am not sure what you will get…

Too bad they didn’t just create an API for Qsync and publish it. Maybe they will at some point - I would rather use straight IP instead of having to do the serial encapsulation into HTTP and add the Itach IP to serial device. (Course, now that I have that serial conversion done, it works great…)

Cool Ill post back if I find anything when it arrives in 3 weeks.

I sent a email to qmotion support asking about api and recived a postive reply.

We are currently working towards a two way solution-if you look for us at CEDIA you should be able to have more details on it then! Thank you for your support of our products.

Hooked up qsync and had alook with wireshark on my laptop I was able to find this on the IP.

Should I try hooking the qsync to my latop and making a hotspot for my android phone to connect to instead of trying to monitor it through the main 24 port switch? and router?

I can see command received in the hex data when I fire off 4 blinds.

I guess 192.168.0.7 is the Qsync? So looks like we are not seeing the call to the QSync, but instead we are seeing the response coming back after it receives a command (which is broadcast to the whole subnet, I think)…

So what we really want to capture is the message from the phone to the QSync…

I’ve been told that qmotion are launching zwave blind in October. Once it’s launched in the USA it should then be available in other regions as well.

That would be cool - and certainly would help them in the market…

What they launched was Zigbee. I met with QMotion at CEDIA yesterday (http://forum.micasaverde.com/index.php/topic,34270.0.html).

I am short on time today, but if you are thinking about ordering QMotion in the next few days I would hold off. They have cool things that are not yet available…

What they launched was Zigbee. I met with QMotion at CEDIA yesterday (http://forum.micasaverde.com/index.php/topic,34270.0.html).

I am short on time today, but if you are thinking about ordering QMotion in the next few days I would hold off. They have cool things that are not yet available…[/quote]

Hopefully a product for backwards compatibility for people who already spent 1000s on the blinds…

What they launched was Zigbee. I met with QMotion at CEDIA yesterday (http://forum.micasaverde.com/index.php/topic,34270.0.html).

I am short on time today, but if you are thinking about ordering QMotion in the next few days I would hold off. They have cool things that are not yet available…[/quote]

Hopefully a product for backwards compatibility for people who already spent 1000s on the blinds…[/quote]
They told me $50 per zigbeee retrofit for new motor and that includes new batteries. Course they thought I was a dealer, so there might be mark-up!

Sent from my SM-G900V using Tapatalk

Is zigbee helpful for vera as we use zwave… or will new vera most likely support zigbee?