Author Topic: Qmotion Blinds  (Read 29304 times)

Offline wilme2

  • Hero Member
  • *****
  • Posts: 1226
  • Karma: +29/-13
Re: Qmotion Blinds
« Reply #30 on: October 22, 2014, 10:39:56 am »
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...
Long Live UI5!  (OK finally made the switch to UI7 in January 2018, and am pretty happy....)

Offline bcr83

  • Newbie
  • *
  • Posts: 8
  • Karma: +0/-0
Re: Qmotion Blinds
« Reply #31 on: October 22, 2014, 09:08:19 pm »
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...

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!

Offline wilme2

  • Hero Member
  • *****
  • Posts: 1226
  • Karma: +29/-13
Re: Qmotion Blinds
« Reply #32 on: October 24, 2014, 02:17:58 pm »
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.
« Last Edit: October 24, 2014, 02:27:02 pm by wilme2 »
Long Live UI5!  (OK finally made the switch to UI7 in January 2018, and am pretty happy....)

Offline wilme2

  • Hero Member
  • *****
  • Posts: 1226
  • Karma: +29/-13
Re: Qmotion Blinds
« Reply #33 on: November 07, 2014, 12:34:33 pm »
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()...

Code: [Select]
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...

Code: [Select]
MoveQMotionShades("2,0")
Long Live UI5!  (OK finally made the switch to UI7 in January 2018, and am pretty happy....)

Offline wilme2

  • Hero Member
  • *****
  • Posts: 1226
  • Karma: +29/-13
Re: Qmotion Blinds
« Reply #34 on: January 16, 2015, 02:47:26 pm »
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)
« Last Edit: January 16, 2015, 03:18:28 pm by wilme2 »
Long Live UI5!  (OK finally made the switch to UI7 in January 2018, and am pretty happy....)

Offline wilme2

  • Hero Member
  • *****
  • Posts: 1226
  • Karma: +29/-13
Re: Qmotion Blinds
« Reply #35 on: April 03, 2015, 11:11:08 am »
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...

Code: [Select]
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
Code: [Select]
MoveQMotionShades ("10,25")
or if you want a delay
Code: [Select]
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.
« Last Edit: April 03, 2015, 11:17:05 am by wilme2 »
Long Live UI5!  (OK finally made the switch to UI7 in January 2018, and am pretty happy....)

Offline Pseudomizer

  • Sr. Member
  • ****
  • Posts: 376
  • Karma: +8/-1
Re: Qmotion Blinds
« Reply #36 on: April 03, 2015, 02:29:27 pm »
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?
Vera 3, RFWC5AW, 2 x LFM-20, FS20Z, 3 x YRD220ZW619KWKD, 2 x FI9826W, FI9828P, 2 x NEST Gen2, EVL-3CG, 11 x BR30, 3 x A19 Hue, Media Srv, 18 x ZW4004, 8 x ZW3003, 12 x ZW2002, IP2IR Cache, 2 x DSC24, ZWN-SC7, 4 x PIR-ZWAVE2, DSB05-ZWUS, RS100-HC, ECO-TILT-US, Ribu1C, 3 x GE12721, 2 x Echo, ZW078-A

Offline wilme2

  • Hero Member
  • *****
  • Posts: 1226
  • Karma: +29/-13
Re: Qmotion Blinds
« Reply #37 on: April 03, 2015, 03:51:15 pm »
Everything I have posted here is for their roller shades or honeycomb shades.  So just raise and lower (with 3 intermediate positions).
Long Live UI5!  (OK finally made the switch to UI7 in January 2018, and am pretty happy....)

Offline Pseudomizer

  • Sr. Member
  • ****
  • Posts: 376
  • Karma: +8/-1
Re: Qmotion Blinds
« Reply #38 on: April 03, 2015, 03:52:26 pm »
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.
Vera 3, RFWC5AW, 2 x LFM-20, FS20Z, 3 x YRD220ZW619KWKD, 2 x FI9826W, FI9828P, 2 x NEST Gen2, EVL-3CG, 11 x BR30, 3 x A19 Hue, Media Srv, 18 x ZW4004, 8 x ZW3003, 12 x ZW2002, IP2IR Cache, 2 x DSC24, ZWN-SC7, 4 x PIR-ZWAVE2, DSB05-ZWUS, RS100-HC, ECO-TILT-US, Ribu1C, 3 x GE12721, 2 x Echo, ZW078-A

Offline Javelin

  • Full Member
  • ***
  • Posts: 146
  • Karma: +1/-0
Re: Qmotion Blinds
« Reply #39 on: July 28, 2015, 04:43:02 am »
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.

Offline wilme2

  • Hero Member
  • *****
  • Posts: 1226
  • Karma: +29/-13
Re: Qmotion Blinds
« Reply #40 on: July 29, 2015, 12:11:36 pm »
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...)
« Last Edit: July 29, 2015, 02:37:24 pm by wilme2 »
Long Live UI5!  (OK finally made the switch to UI7 in January 2018, and am pretty happy....)

Offline Javelin

  • Full Member
  • ***
  • Posts: 146
  • Karma: +1/-0
Re: Qmotion Blinds
« Reply #41 on: August 01, 2015, 02:37:36 am »
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.
« Last Edit: August 21, 2015, 10:27:03 pm by Javelin »

Offline Javelin

  • Full Member
  • ***
  • Posts: 146
  • Karma: +1/-0
Re: Qmotion Blinds
« Reply #42 on: September 04, 2015, 07:38:35 am »
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.


Offline wilme2

  • Hero Member
  • *****
  • Posts: 1226
  • Karma: +29/-13
Re: Qmotion Blinds
« Reply #43 on: September 04, 2015, 10:32:58 am »
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...
Long Live UI5!  (OK finally made the switch to UI7 in January 2018, and am pretty happy....)

Offline mzpost

  • Sr. Member
  • ****
  • Posts: 254
  • Karma: +2/-1
Re: Qmotion Blinds
« Reply #44 on: September 17, 2015, 01:36:45 pm »
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.