optimizations
[nodemcu-iot-mqtt-relay.git] / mqtt.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
-- mqtt.lua --
 
local prefix = "/IoTmanager"
local device = "/relay01"
 
local mqttConfig = {}
mqttConfig.host = '192.168.0.50'
mqttConfig.port = '9443'
mqttConfig.user = 'iot'
mqttConfig.pass = 'iot'
mqttConfig.secure = 1
 
print ("Trying to connect to MQTT host " .. mqttConfig.host .. ":" .. mqttConfig.port)
 
local status1 = 1
local gpio12 = 6
gpio.mode(gpio12, gpio.OUTPUT)
--gpio.write(gpio12, gpio.LOW) -- OFF
gpio.write(gpio12, gpio.HIGH) -- ON
 
local status2 = 1
local gpio13 = 7
gpio.mode(gpio13, gpio.OUTPUT)
--gpio.write(gpio13, gpio.LOW) -- OFF
gpio.write(gpio13, gpio.HIGH) -- ON
 
-- initiate the mqtt client and set keepalive timer to 120sec
local mqtt = mqtt.Client(device, 120, mqttConfig.user, mqttConfig.pass, 1)
 
mqtt:on("connect", function(con)
    print ("\tConnected to " .. mqttConfig.host .. ":" .. mqttConfig.port .. " MQTT broker\n")
end)
mqtt:on("offline", function(con)
    print ("\tDisconected from " .. mqttConfig.host .. ":" .. mqttConfig.port .. " MQTT broker, reconnecting\n")
end)
 
-- on receive message
mqtt:on("message", function(conn, topic, data)
 
    print ("\tReceived topic : " .. topic .. " / data : " .. data)
 
    if (topic == prefix .. device .. "/toggle1/control") then
        if data == "1" then
            print "\t\tReceived message ON@Relay1"
            gpio.write(gpio12, gpio.HIGH)
            status1 = 1
        elseif data == "0" then
            print "\t\tReceived message OFF@Relay1"
            gpio.write(gpio12, gpio.LOW)
            status1 = 0
        end
    elseif topic == prefix .. device .. "/toggle2/control" then
        if data == "1" then
            print "\t\tReceived message ON@Relay2"
            gpio.write(gpio13, gpio.HIGH)
            status2 = 1
        elseif data == "0" then
            print "\t\tReceived message OFF@Relay2"
            gpio.write(gpio13, gpio.LOW)
            status2 = 0
        end
    else
        -- to parse client ID from topic
        local id = 1
        msg = cjson.decode(data)
        print('\tNew request from IoT Manager: id="' .. id .. '", command="' .. msg.command .. '", param="' .. msg.param .. '"');
        
        if msg.command == "getPages" then
            mqtt:publish(prefix .. device .. "/response", '{"pages" : [{"pageId" : 10, "pageName" : "Page 1"}, {"pageId" : 20, "pageName" : "Page 2"}]}', 1, 1, function(conn)    
            end)
        elseif msg.command == "getPageById" then
            --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"}'
                mqtt:publish(prefix .. device .. "/config", msg, 1, 1, function(conn)
                end)
                mqtt:publish(prefix .. device .. "/toggle1/status", "{\"status\":" .. status1 .. "}", 1, 1, function(conn)
                end)
            --end
            --if (msg.param == 20 or msg.param == 0) then
                msg = '{"id":"2", "page": "Page 2", "pageId": 20, "widget":"toggle", "descr":"Relay 2", "topic":"' .. prefix .. device ..'/toggle2"}'
                mqtt:publish(prefix .. device .. "/config", msg, 1, 1, function(conn)
                end)
                mqtt:publish(prefix .. device .. "/toggle2/status", "{\"status\":" .. status2 .. "}", 1, 1, function(conn)
                end)
            --end
        end
    end
end)
 
mqtt:connect(mqttConfig.host, mqttConfig.port, mqttConfig.secure, 1, function(conn) 
    print ("\tConnected to " .. mqttConfig.host .. ":" .. mqttConfig.port .. " MQTT broker\n")
    -- subscribe topic with qos = 1
    mqtt:subscribe({[prefix .. "/+/+/control"]=1, [prefix .. "/+/request"]=1}, function(conn)
    end)
end)
 
comments