Qmotion Blinds

To clarify what components are needed?

Global Cache? which one
Qconnect box? the rs232 one?

Trying to get a idea of cost involved as always with home-automation.

What I bought:

  1. Qconnect. (List $488, I paid $415) There is only one model, but it can be connected to via RS232, RS485, or dry contact closure.
  2. Global Cache IP2SL - ($91 on Amazon or slighly more for the PoE model)
  3. DB9 to RJ45 (still for RS232, but the Qconnect only accepts RS232 via RJ45) cable to connect the two devices above- you have to make one - the instructions are in the Qconnect manual. I used this $3.50 adapter to make it easy. [url=http://www.altex.com/Modular-Adapter-Kit-DB9-Female-RJ-45-8P8C-MA9F-8-P140560.aspx]http://www.altex.com/Modular-Adapter-Kit-DB9-Female-RJ-45-8P8C-MA9F-8-P140560.aspx[/url]
  4. two cat 5 patch cables, one to connect the RJ45 on the adapter above to the RJ45 on the Qconnect (carrying RS232) and one to connect the IP2SL to my ethernet switch.

So outside of the blinds themselves, I have about $520 plus tax into the integration…

As I previously mentioned I am using iRule for manual shade control. That is part of why I like using an IP2SL instead of directly connecting the Qconnect to Vera (which is theoretically possible via a USB to DB9 adapter that is then connected to the DB9 to RJ45 adapater) - I can control the blinds from multiple systems.

For automation, of course, Vera moves the blinds. Here is my current PLEG logic to open them at first light (20 minutes before sunrise), and close a little after sundown (15 minutes after sunset):

Schedules:
Name On Type On Time On Days Random On Delay Off After Type Off Time Off Days Random Off Delay
MorningBlindsOpen Weekly -00:20:00r 1,2,3,4,5,6,7 None Weekly -00:19:00r 1,2,3,4,5,6,7 None
NightBlindsClose Weekly +00:15:00t 1,2,3,4,5,6,7 None Weekly +00:16:00t 1,2,3,4,5,6,7 None

Conditions:
Name Repeat Expression
BlindsNeedClosing No NightBlindsClose
BlindsNeedOpening No MorningBlindsOpen

Actions:
Actions for Condition: BlindsNeedClosing

LUA:

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

local sres, serr = c:send(string.char(0x01,0x07,0x00,0x05,0x01,0x01,0x02,0x00,0xFF))-- Channel 1 down
print("Send:", sres, serr)
local data, rerr = c:receive(300)
luup.log (data)
print ("Receive:", data, rerr)

local sres, serr = c:send(string.char(0x01,0x07,0x00,0x05,0x01,0x02,0x02,0x00,0xFC))-- Channel 2 down
print("Send:", sres, serr)
local data, rerr = c:receive(300)
luup.log (data)
print ("Receive:", data, rerr)

local sres, serr = c:send(string.char(0x01,0x07,0x00,0x05,0x01,0x03,0x02,0x00,0xFD))-- Channel 3 down
print("Send:", sres, serr)
local data, rerr = c:receive(300)
luup.log (data)
print ("Receive:", data, rerr)

local sres, serr = c:send(string.char(0x01,0x07,0x00,0x05,0x01,0x04,0x02,0x00,0xFA))-- Channel 4 down
print("Send:", sres, serr)
local data, rerr = c:receive(300)
luup.log (data)
print ("Receive:", data, rerr)

c:close()

Actions for Condition: BlindsNeedOpening

LUA:

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

local sres, serr = c:send(string.char(0x01,0x07,0x00,0x05,0x01,0x01,0x01,0x00,0xFC))-- Channel 1 up
print("Send:", sres, serr)
local data, rerr = c:receive(300)
luup.log (data)
print ("Receive:", data, rerr)

local sres, serr = c:send(string.char(0x01,0x07,0x00,0x05,0x01,0x02,0x01,0x00,0xFF))-- Channel 2 up
print("Send:", sres, serr)
local data, rerr = c:receive(300)
luup.log (data)
print ("Receive:", data, rerr)

local sres, serr = c:send(string.char(0x01,0x07,0x00,0x05,0x01,0x03,0x01,0x00,0xFE))-- Channel 3 up
print("Send:", sres, serr)
local data, rerr = c:receive(300)
luup.log (data)
print ("Receive:", data, rerr)

local sres, serr = c:send(string.char(0x01,0x07,0x00,0x05,0x01,0x04,0x01,0x00,0xF9))-- Channel 4 up
print("Send:", sres, serr)
local data, rerr = c:receive(300)
luup.log (data)
print ("Receive:", data, rerr)

c:close()

Thanks for the clear answers wilme2 cant wait to do this once I finish painting my arcs!

I have been a little disappointed with the range of the QMotion remote controls/receivers. All of my shades so far are on one floor, and there is a wall-mounted 7 channel remote right in the middle, so no more than 20-25 feet away from any of the shades - and sometimes one of the shades will refuse to respond to the command. You have to pull the remote out of its holder and get close to the shade to make it go. This happens maybe 25% of the time when manually moving shades.

The QConnect does a lot better, it has more power than the hand-held remotes. But still, sometimes I will come downstairs in the morning and one of the shades is still closed. Sadly enough the suggestion is to try again - I pulled this quote out of the Qrelay manual.

4. If the shade responds unreliably to one command, send another command 5 seconds later. ? If the transmitter is a Qconnect, this may be able to be programmed into the system that controls it.

So I call the scene twice after a few seconds of delay…

Still, I am happy with the investment and especially the lack of wires on automated shades, but I may have some tweaking to do to get the RF just right…

I wanted to clean up the lua a little - didn’t make sense to have to copy and paste the whole code each time I wanted to adjust the shades via PLEG, so I wrote it into a function below. This can be used in the main Startup LUA for traditional scenes and/or in PLEGs Statup LUA for use in PLEG.

So in Startup LUA I have:

function MoveQMotionShades(shadeNum, openAmtNum)
	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

	print (commandtoSend)

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

which means the call to close shade on channel 1 is as simple as:

MoveQMotionShades(1,0)

Hi,

I am in Australia and also about to install 8 Qmotion blinds and was a little disappointed they have no Zwave solution.

The dealer did advise that there were developments coming potentially involving voice commands??

I am trying to work out if I go the Irule road with the Vera plug in and control all future Zwave devices and IR device (Split system and Qmotion)

Or - use the method included here with the DB9 to RJ45 and IP2Sl. I think I would also need the remotec device for my Split system…?

Can anyone here with experience advise what is the best route to go down??

Thanks in advance

[quote=“bcr83, post:27, topic:179025”]Hi,

I am in Australia and also about to install 8 Qmotion blinds and was a little disappointed they have no Zwave solution.

The dealer did advise that there were developments coming potentially involving voice commands??

I am trying to work out if I go the Irule road with the Vera plug in and control all future Zwave devices and IR device (Split system and Qmotion)

Or - use the method included here with the DB9 to RJ45 and IP2Sl. I think I would also need the remotec device for my Split system…?

Can anyone here with experience advise what is the best route to go down??

Thanks in advance[/quote]

Which plug-in are you referencing?

[quote=“wilme2, post:28, topic:179025”][quote=“bcr83, post:27, topic:179025”]Hi,

I am in Australia and also about to install 8 Qmotion blinds and was a little disappointed they have no Zwave solution.

The dealer did advise that there were developments coming potentially involving voice commands??

I am trying to work out if I go the Irule road with the Vera plug in and control all future Zwave devices and IR device (Split system and Qmotion)

Or - use the method included here with the DB9 to RJ45 and IP2Sl. I think I would also need the remotec device for my Split system…?

Can anyone here with experience advise what is the best route to go down??

Thanks in advance[/quote]

Which plug-in are you referencing?[/quote]

Hi, There is a plug in available through Irule for $25 that links iIrule to an existing Vera controller allowing you to take control of z wave devices through the iIrule app as well as blinds (I am not sure on this?)

I’ve actually read an outside forum page where a lot of members have said the supporting modules for irule particularly Vera do not work well together, sonos etc are fine however scene creation and more detailed levels of control are not available though the plugin.
Apologies typing this on the phone!

I’ve started some work on adapting the Somfy plugin to be used with QMotion, I’m still getting my head around Luup but can’t quite follow the walk through for Somfy for where the Serial Hex code goes for actions. The Somfy commands are mentioned at the beginning but don’t appear anywhere later ???

Any pointers to a basic Luup/plugin that sends serial hex commands would be appreciated.

Gus…

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.