-
Notifications
You must be signed in to change notification settings - Fork 0
/
_init.lua
111 lines (73 loc) · 3.14 KB
/
_init.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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
-- file: init.lua
local config = require("config")
local initd = require("initd")
local wireless = require("wireless")
local sntpd = require("sntpd")
local mqttd = require("mqttd")
local rf = require("rf")
-- switch ack and qos definitions
local switches = {}
switches["home/lamps/switch1/set"] = {["ack"]="home/lamps/switch1", ["qos"]=0}
switches["home/lamps/switch2/set"] = {["ack"]="home/lamps/switch2", ["qos"]=0}
switches["home/lamps/switch3/set"] = {["ack"]="home/lamps/switch3", ["qos"]=0}
switches["home/lamps/switch4/set"] = {["ack"]="home/lamps/switch4", ["qos"]=0}
switches["home/lamps/switch5/set"] = {["ack"]="home/lamps/switch5", ["qos"]=0}
switches["home/lamps/switch6/set"] = {["ack"]="home/lamps/switch6", ["qos"]=0}
switches["home/lamps/switch7/set"] = {["ack"]="home/lamps/switch7", ["qos"]=0}
switches["home/lamps/switch8/set"] = {["ack"]="home/lamps/switch8", ["qos"]=0}
subscriptions = {}
-- build subscriptions table
for key,value in pairs(switches) do subscriptions[key] = value["qos"] end
-- MQTT message handler
function mqtt_handler(client, topic, payload)
print("\n\tMQTT Topic: "..topic.." Payload: "..payload.." Heap: "..node.heap())
local decoded = sjson.decode(payload)
rf.switch(decoded.addr, decoded.unit, decoded.onoff)
mqttd.publish(switches[topic]["ack"], payload, function() print("\n\tMQTT - PUBACK") end)
end
-- sampling of AM2320 and node statistics
function sample()
if wireless.is_ready() == true and mqttd.is_ready() == true then
local rh, t = am2320.read()
local sec, _, _ = rtctime.get()
local payload = "{ \"temp\":"..(t)..", \"RH\":"..(rh)..", \"epoch\":"..sec.." }"
mqttd.publish("home/environment/am2320", payload, function() print("\n\tMQTT - PUBACK") end)
print("\n\tMQTT Publish: "..payload.." Heap: "..node.heap())
payload = "{ \"dice\":"..node.random(6)..", \"rssi\":"..wifi.sta.getrssi()..", \"epoch\":"..sec.." }"
mqttd.publish("nodemcu/system", payload, function() print("\n\tMQTT - PUBACK") end)
print("\n\tMQTT Payload: "..payload.." Heap: "..node.heap())
else
--
end
end
function report_boot()
if wireless.is_ready() == true and mqttd.is_ready() == true and sntpd.is_ready() == true then
local sec, _, _ = rtctime.get()
local _, boot = node.bootreason()
local payload = "{ \"reason\":"..boot..", \"epoch\":"..sec.." }"
mqttd.publish("nodemcu/boot", payload, function() print("\n\tMQTT - PUBACK") end)
print("\n\tMQTT Payload: "..payload.." Heap: "..node.heap())
else
--
end
end
function done()
-- clean up the heap
fsm = nil
subscriptions = nil
config.free()
collectgarbage()
--for k,v in pairs(package.loaded) do print(k,v) end
report_boot()
sample_tmr:start()
end
i2c.setup(0, config.I2C.sda, config.I2C.scl, config.I2C.speed)
am2320.setup()
rf.start(config.RF)
fsm = {}
fsm[3] = { fnc=wireless.start, arg={ config.WIFI }, assert=wireless.is_ready, run=1}
fsm[2] = { fnc=sntpd.start, arg={ config.SNTP }, assert=sntpd.is_ready, run=1}
fsm[1] = { fnc=mqttd.start, arg={ config.MQTT, subscriptions, mqtt_handler }, assert=mqttd.is_ready, run=1}
initd.start(fsm, done)
sample_tmr = tmr.create()
sample_tmr:register(60 * 1000, tmr.ALARM_AUTO, function (t) sample() end)