IoT Control Center compatibility
IoT Control Center compatibility

file:a/mqtt.lua -> file:b/mqtt.lua
-- mqtt.lua -- -- mqtt.lua --
   
print ("Trying to connect to MQTT host " .. mqttConfig.host .. ":" .. mqttConfig.port) print ("Trying to connect to MQTT host " .. mqttConfig.host .. ":" .. mqttConfig.port)
   
local status1 = 1 local status1 = 1
local gpio12 = 6 local gpio12 = 6
gpio.mode(gpio12, gpio.OUTPUT) gpio.mode(gpio12, gpio.OUTPUT)
--gpio.write(gpio12, gpio.LOW) -- OFF --gpio.write(gpio12, gpio.LOW) -- OFF
gpio.write(gpio12, gpio.HIGH) -- ON gpio.write(gpio12, gpio.HIGH) -- ON
   
local status2 = 1 local status2 = 1
local gpio13 = 7 local gpio13 = 7
gpio.mode(gpio13, gpio.OUTPUT) gpio.mode(gpio13, gpio.OUTPUT)
--gpio.write(gpio13, gpio.LOW) -- OFF --gpio.write(gpio13, gpio.LOW) -- OFF
gpio.write(gpio13, gpio.HIGH) -- ON gpio.write(gpio13, gpio.HIGH) -- ON
   
-- initiate the mqtt client and set keepalive timer to 120sec -- initiate the mqtt client and set keepalive timer to 120sec
local mqtt = mqtt.Client(device, 120, mqttConfig.user, mqttConfig.pass, 1) local mqtt = mqtt.Client(device, 120, mqttConfig.user, mqttConfig.pass, 1)
   
mqtt:on("connect", function(con) mqtt:on("connect", function(con)
print ("\tConnected to " .. mqttConfig.host .. ":" .. mqttConfig.port .. " MQTT broker\n") print ("\tConnected to " .. mqttConfig.host .. ":" .. mqttConfig.port .. " MQTT broker\n")
end) end)
mqtt:on("offline", function(con) mqtt:on("offline", function(con)
print ("\tDisconected from " .. mqttConfig.host .. ":" .. mqttConfig.port .. " MQTT broker, reconnecting\n") print ("\tDisconected from " .. mqttConfig.host .. ":" .. mqttConfig.port .. " MQTT broker, reconnecting\n")
end) end)
   
-- on receive message -- on receive message
mqtt:on("message", function(conn, topic, data) mqtt:on("message", function(conn, topic, message)
   
print ("\tReceived topic : " .. topic .. " / data : " .. data) print ("\tReceived topic : " .. topic .. " / message : " .. message)
   
if (topic == prefix .. device .. "/toggle1/control") then local msg = cjson.decode(message)
if data == "1" then  
  -- catch json errors
  local json, msg = pcall(function()
  return cjson.decode(message)
  end)
   
  if json then
   
  else
  print("\tError parsing JSON : " .. message)
  return
  end
   
  if (topic == prefix .. device .. "/toggle1/data") then
  if msg.status == "1" then
print "\t\tReceived message ON@Relay1" print "\t\tReceived message ON@Relay1"
gpio.write(gpio12, gpio.HIGH) gpio.write(gpio12, gpio.HIGH)
status1 = 1 status1 = 1
elseif data == "0" then elseif msg.status == "0" then
print "\t\tReceived message OFF@Relay1" print "\t\tReceived message OFF@Relay1"
gpio.write(gpio12, gpio.LOW) gpio.write(gpio12, gpio.LOW)
status1 = 0 status1 = 0
end end
-- publish status to be in sync with all devices connected -- publish status confirmation to be in sync with all devices connected
mqtt:publish(prefix .. device .. "/toggle1/status", "{\"status\":" .. status1 .. "}", 1, 0, function(conn) mqtt:publish(prefix .. device .. "/toggle1/confirm", "{\"status\":" .. status1 .. "}", 1, 0, function(conn)
end) end)
elseif topic == prefix .. device .. "/toggle2/control" then elseif topic == prefix .. device .. "/toggle2/data" then
if data == "1" then if msg.status == "1" then
print "\t\tReceived message ON@Relay2" print "\t\tReceived message ON@Relay2"
gpio.write(gpio13, gpio.HIGH) gpio.write(gpio13, gpio.HIGH)
status2 = 1 status2 = 1
elseif data == "0" then elseif msg.status == "0" then
print "\t\tReceived message OFF@Relay2" print "\t\tReceived message OFF@Relay2"
gpio.write(gpio13, gpio.LOW) gpio.write(gpio13, gpio.LOW)
status2 = 0 status2 = 0
end end
-- publish status to be in sync with all devices connected -- publish status confirmation to be in sync with all devices connected
mqtt:publish(prefix .. device .. "/toggle2/status", "{\"status\":" .. status2 .. "}", 1, 0, function(conn) mqtt:publish(prefix .. device .. "/toggle2/confirm", "{\"status\":" .. status2 .. "}", 1, 0, function(conn)
end) end)
else elseif topic == prefix .. "/device" then
local list = {} print('\tNew request from IoT Control Center: clientId="' .. clientId .. '"');
local k = 0  
for v in string.gmatch(topic, "([^/]+)") do  
list[k] = v  
k = k + 1  
end  
local id = list[1]  
local msg = cjson.decode(data)  
print('\tNew request from IoT Manager: id="' .. id .. '", command="' .. msg.command .. '", param="' .. msg.param .. '"');  
   
if msg.command == "getPages" then -- check clientId's privileges here
mqtt:publish(prefix .. device .. "/response", '{"pages" : [{"pageId" : 10, "pageName" : "Page 1"}, {"pageId" : 20, "pageName" : "Page 2"}]}', 1, 0, function(conn)  
end) mqtt:publish(prefix .. device .. "/device", '{"pages" : [{"pageId" : 10, "pageName" : "Page 1"}, {"pageId" : 20, "pageName" : "Page 2"}]}', 1, 0, function(conn)
elseif msg.command == "getPageById" then end)
if (msg.param == "10" or msg.param == "0") then  
msg = '{"id":"1", "page": "Page 1", "pageId": 10, "widget":"toggle", "descr":"Relay 1", "topic":"' .. prefix .. device ..'/toggle1"}' msg = '{"pageName": "Dogs heating", "pageId": 10, "widget":"toggle", "title":"Mara", "topic":"' .. prefix .. device ..'/toggle1", "checked":' .. status1 ..', "template": "template-1", "icon": "ion-ios-paw", "class4": "bg-green", "order" : 10}'
mqtt:publish(prefix .. device .. "/config", msg, 1, 0, function(conn) mqtt:publish(prefix .. device .. "/toggle1/config", msg, 1, 0, function(conn)
end) end)
mqtt:publish(prefix .. device .. "/toggle1/status", "{\"status\":" .. status1 .. "}", 1, 0, function(conn) mqtt:publish(prefix .. device .. "/toggle1/confirm", "{\"status\":" .. status1 .. "}", 1, 0, function(conn)
end) end)
end  
if (msg.param == "20" or msg.param == "0") then msg = '{"pageName": "Dogs heating", "pageId": 10, "widget":"toggle", "title":"Linda", "topic":"' .. prefix .. device ..'/toggle2", "checked":' .. status2 ..', "template": "template-1", "icon": "ion-ios-paw", "class4": "bg-green", "order" : 20}'
msg = '{"id":"2", "page": "Page 2", "pageId": 20, "widget":"toggle", "descr":"Relay 2", "topic":"' .. prefix .. device ..'/toggle2"}' mqtt:publish(prefix .. device .. "/toggle2/config", msg, 1, 1, function(conn)
mqtt:publish(prefix .. device .. "/config", msg, 1, 1, function(conn) end)
end) mqtt:publish(prefix .. device .. "/toggle2/confirm", "{\"status\":" .. status2 .. "}", 1, 0, function(conn)
mqtt:publish(prefix .. device .. "/toggle2/status", "{\"status\":" .. status2 .. "}", 1, 0, function(conn) end)
end)  
end  
end  
end end
end) end)
   
mqtt:connect(mqttConfig.host, mqttConfig.port, mqttConfig.secure, 1, function(conn) mqtt:connect(mqttConfig.host, mqttConfig.port, mqttConfig.secure, 1, function(conn)
print ("\tConnected to " .. mqttConfig.host .. ":" .. mqttConfig.port .. " MQTT broker\n") print ("\tConnected to " .. mqttConfig.host .. ":" .. mqttConfig.port .. " MQTT broker\n")
-- subscribe topic with qos = 1 -- subscribe topic with qos = 1
mqtt:subscribe({[prefix .. "/+/+/control"]=1, [prefix .. "/+/request"]=1}, function(conn) mqtt:subscribe({[prefix .. "/+/+/data"]=1, [prefix .. "/device"]=1}, function(conn)
end) end)
end) end)
   
comments