cbf21f0c996fc984e7fe9c5fc20466c233ab00b3
[weathermon.git] / bin / weathermon-iio
1 #!/usr/bin/lua
2
3 require "uci"
4 cur = uci.cursor()
5
6 lfs = require "lfs"
7 json = require "json"
8 socket = require "socket"
9
10 require "wm_util"
11
12 function get_device_list(config_name)
13
14   local devices
15   devices = {}
16
17   cur.foreach(config_name, "device", function(s)
18     devices[#devices+1] = s[".name"]
19   end)
20
21   return devices
22
23 end
24
25 function get_device(config_name,device_name)
26
27   local device
28   device = {}
29   
30   cur.foreach(config_name, "device", function(s)
31     if s[".name"] == device_name then
32       device = s
33     end
34   end)  
35   
36   return device
37   
38 end
39
40 function find_device(name,subsystem)
41
42   local search_base
43
44   if subsystem == "iio" then
45     search_base = "/sys/bus/iio/devices"
46     for file in lfs.dir(search_base) do
47       if get_file_content(search_base.."/"..file.."/name") == name then
48         return search_base.."/"..file
49       end
50     end
51   elseif subsystem == "hwmon" then
52     search_base = "/sys/class/hwmon"
53     for file in lfs.dir(search_base) do
54       if get_file_content(search_base.."/"..file.."/device/name") == name then
55         return search_base.."/"..file.."/device"
56       end
57     end  
58   end
59   
60   return nil
61
62 end
63
64 function init_device(device,parameters,i2c_bus)
65
66   if not i2c_bus then
67     i2c_bus = 0
68   end
69
70   if device["module"] then
71     os.execute("modprobe "..device["module"])
72   end    
73
74   if device["type"] then
75
76     devtype = split(device["type"],":")
77     bus = devtype[1]
78     subsystem = devtype[2]
79     
80     if (bus == "i2c") and device["address"] and device["name"] then
81       pcall(function ()
82         local f = io.open("/sys/class/i2c-dev/i2c-"..i2c_bus.."/device/new_device","w")
83         io.output(f)
84         io.write(device["name"].." "..device["address"])
85         io.close(f)
86       end)  
87     end
88
89     device_path=find_device(device["name"],subsystem)
90
91     if device_path and device["set_param"] then
92       for key,record in pairs(device["set_param"]) do
93         setparam = split(record,":")
94         setpath = device_path.."/"..setparam[1]
95         pcall(function ()
96           local f = io.open(setpath,"w")
97           io.output(f)
98           io.write(setparam[2])
99           io.close(f)
100         end)  
101       end
102     end
103     
104     if device_path and device["parameter"] then
105     
106       for key,record in pairs(device["parameter"]) do
107       
108         getparam = split(record,":")
109         getparameter = {}
110         getparameter["path"] = device_path.."/"..getparam[1]
111         getparameter["name"] = getparam[2]
112         getscale = getparam[3]
113         getcorrection = getparam[4]
114         if not getscale then
115           getscale = 1
116         end  
117         if not getcorrection then
118           getcorrection = 0
119         end
120         getparameter["scale"] = tonumber(getscale)
121         getparameter["sensor"] = device["name"]:upper()
122         getparameter["correction"] = tonumber(getcorrection)
123       
124         parameters[#parameters+1] = getparameter
125        
126       end
127     
128     end
129     
130   end
131
132 end
133
134 function init(config_name)
135
136   local parameters= {}
137
138   i2c_bus = uci.get(config_name,"hardware","i2c_bus")
139
140   local devices = get_device_list(config_name)
141   
142   for key,devname in pairs(devices) do
143   
144     device = get_device(config_name,devname)
145     
146     if device then
147       init_device(device,parameters,i2c_bus)
148     end  
149   
150   end
151
152   return parameters
153
154 end
155
156 function get_parameter(parameter)
157   return tonumber(get_file_content(parameter["path"])) * parameter["scale"] + parameter["correction"]
158 end
159
160 function get_parameters(parameters)
161   local results = {}
162   for key,record in pairs(parameters) do
163     if not results[record["sensor"]] then 
164       results[record["sensor"]] = {}
165     end
166     results[record["sensor"]][record["name"]] = get_parameter(record)
167   end
168   return results
169 end
170
171 config_name = arg[1]
172 if not config_name then
173   config_name = "weathermon"
174 end  
175
176 web_id = uci.get(config_name,"web","devid")
177
178 parameters = init(config_name)
179
180 local delay = uci.get(config_name,"process","delay")
181
182 local working_dir = uci.get(config_name,"process","working_dir")
183 if working_dir then
184   lfs.mkdir(working_dir)
185 end
186
187 if not delay then
188   delay = 60
189 end
190
191 io.stdout:setvbuf('no')
192
193 while true do
194   if pcall(function () values = get_parameters(parameters) end) then
195     records = {}
196     records[web_id] = {}
197     for key,record in pairs(values) do
198       records[web_id][key] = record
199       records[web_id]["timestamp"] = os.date("%Y-%m-%dT%H:%M:%S")
200     end
201     for key,value in pairs(values) do
202       value["device"] = key
203       print(json.encode(value))
204     end
205   end  
206   socket.sleep(delay)
207 end
208