69cd421134a33e6e9e529eeae101a0d61a9fc7ea
[weathermon.git] / bin / weather-lcd
1 #!/usr/bin/lua
2
3 socket = require "socket"
4 json = require "json"
5 require "uci"
6 cur = uci.cursor()
7 require "wm_util"
8
9 config_name = arg[1]
10 if not config_name then
11   config_name = "weathermon"
12 end  
13
14 weather_file = uci.get(config_name,"process","dump_file")
15
16 function round(num, numDecimalPlaces)
17   local mult = 10^(numDecimalPlaces or 0)
18   return math.floor(num * mult + 0.5) / mult
19 end
20
21 function trim(s)
22   return (s:gsub("^%s*(.-)%s*$", "%1"))
23 end
24
25 function lpad(s, l, c)
26   local res = string.rep(c or ' ', l - #s) .. s
27   return res, res ~= s
28 end
29
30 function process_file()
31   txt = get_file_content(weather_file)
32   data = json.decode(txt)
33   for k,v in pairs(data) do
34     return v
35   end
36 end
37
38 function get_display_config()
39   width  = tonumber(uci.get(config_name,"display","width"))
40   height = tonumber(uci.get(config_name,"display","height"))
41   cols   = tonumber(uci.get(config_name,"display","columns"))
42   title  = uci.get(config_name,"display","title")
43   col_width = math.floor(width/cols)
44   
45   pages = {}
46   pagetitles = {}
47   
48   local page, def, line, col, pos
49   
50   cur.foreach(config_name,"display", function(s) 
51       page = {}
52       local pagetitle = s["title"]
53       if not pagetitle then
54         pagetitle = title
55       end
56       if not (pagetitle=="") then
57         line = 2
58       else
59         line = 1
60       end
61       col = 1
62       pos = 0
63       for k,v in pairs(s["parameter"]) do
64         def = {}
65         if not(v == "") then
66           v = split(v,":")
67           def["sensor"] = v[1]
68           def["param"] = v[2]
69           def["label"] = v[3]
70           def["unit"] = v[4]
71           def["scale"] = tonumber(v[5])
72           def["round"] = tonumber(v[6])
73           def["pos"] = tonumber(v[7])
74           def["line"] = line
75           def["col"] = col
76           page[#page+1] = def
77         end
78         col = col + 1
79         if col > cols then
80           col = 1
81           line = line + 1
82         end
83       end
84       pages[#pages+1] = page
85       pagetitles[#pages] = pagetitle
86     end)
87
88 end
89
90 function connect_server()
91   local ip = uci.get(config_name,"display","server")
92   local port = uci.get(config_name,"display","port")
93   conn = socket.connect(ip,port)
94   return conn
95 end
96
97 function write_command(conn,command)
98   conn:send(command.."\n")
99   return(conn:receive())
100 end
101
102 function setup_pages(conn)
103   write_command(conn,"hello")
104   write_command(conn,"client_set -name weathermon")
105   for i,page in pairs(pages) do
106     local pageid = "page"..trim(tostring(i))
107     write_command(conn,"screen_add "..pageid)
108     local pagetitle = pagetitles[i]
109     if not(pagetitle == "") then
110       write_command(conn,"screen_set -name "..pagetitle)
111       write_command(conn,"widget_add "..pageid.." "..pageid..".title title")
112       write_command(conn,"widget_set "..pageid.." "..pageid..".title \"".. pagetitle.."\"")
113     end
114     for j,def in pairs(page) do
115       defid = def["sensor"].."."..def["param"]
116       write_command(conn,"widget_add "..pageid.." "..defid.." string")
117     end
118   end
119 end
120
121 function process_vals(vals)
122   for i,page in pairs(pages) do
123     local pageid = "page"..trim(tostring(i))
124     for j,def in pairs(page) do
125       val = vals[def["sensor"]][def["param"]]
126       if val then
127         val = round(val * def["scale"], def["round"])
128       end
129       defid = def["sensor"].."."..def["param"]
130       val = lpad(tostring(val),def["pos"]).." "..def["unit"]
131       if not(def["label"] == "") then
132         val = def["label"]..": "..val
133       end
134       write_command(conn,"widget_set "..pageid.." "..defid.." "..trim(tostring((def["col"]-1)*col_width+1)).." "..def["line"].." \""..val.."\"")
135     end
136   end
137 end  
138
139 get_display_config()
140
141 conn = connect_server()
142
143 setup_pages(conn)
144
145 while true do
146
147   pcall(function ()
148
149       vals = process_file()
150       process_vals(vals)
151
152       os.execute("inotifywait -e MODIFY \""..weather_file.."\"")
153       socket.sleep(3)
154   
155     end)
156   
157 end
158