--- /dev/null
+#!/usr/bin/lua
+
+socket = require "socket"
+json = require "json"
+require "uci"
+cur = uci.cursor()
+require "wm_util"
+
+config_name = arg[1]
+if not config_name then
+ config_name = "weathermon"
+end
+
+weather_file = uci.get(config_name,"process","dump_file")
+
+function round(num, numDecimalPlaces)
+ local mult = 10^(numDecimalPlaces or 0)
+ return math.floor(num * mult + 0.5) / mult
+end
+
+function trim(s)
+ return (s:gsub("^%s*(.-)%s*$", "%1"))
+end
+
+function lpad(s, l, c)
+ local res = string.rep(c or ' ', l - #s) .. s
+ return res, res ~= s
+end
+
+function process_file()
+ txt = get_file_content(weather_file)
+ data = json.decode(txt)
+ for k,v in pairs(data) do
+ return v
+ end
+end
+
+function get_display_config()
+ width = tonumber(uci.get(config_name,"display","width"))
+ height = tonumber(uci.get(config_name,"display","height"))
+ cols = tonumber(uci.get(config_name,"display","columns"))
+ title = uci.get(config_name,"display","title")
+ col_width = math.floor(width/cols)
+
+ pages = {}
+ pagetitles = {}
+
+ local page, def, line, col, pos
+
+ cur.foreach(config_name,"display", function(s)
+ page = {}
+ local pagetitle = s["title"]
+ if not pagetitle then
+ pagetitle = title
+ end
+ if not (pagetitle=="") then
+ line = 2
+ else
+ line = 1
+ end
+ col = 1
+ pos = 0
+ for k,v in pairs(s["parameter"]) do
+ def = {}
+ if not(v == "") then
+ v = split(v,":")
+ def["sensor"] = v[1]
+ def["param"] = v[2]
+ def["label"] = v[3]
+ def["unit"] = v[4]
+ def["scale"] = tonumber(v[5])
+ def["round"] = tonumber(v[6])
+ def["pos"] = tonumber(v[7])
+ def["line"] = line
+ def["col"] = col
+ page[#page+1] = def
+ end
+ col = col + 1
+ if col > cols then
+ col = 1
+ line = line + 1
+ end
+ end
+ pages[#pages+1] = page
+ pagetitles[#pages] = pagetitle
+ end)
+
+end
+
+function connect_server()
+ local ip = uci.get(config_name,"display","server")
+ local port = uci.get(config_name,"display","port")
+ conn = socket.connect(ip,port)
+ return conn
+end
+
+function write_command(conn,command)
+ conn:send(command.."\n")
+ return(conn:receive())
+end
+
+function setup_pages(conn)
+ write_command(conn,"hello")
+ write_command(conn,"client_set -name weathermon")
+ for i,page in pairs(pages) do
+ local pageid = "page"..trim(tostring(i))
+ write_command(conn,"screen_add "..pageid)
+ local pagetitle = pagetitles[i]
+ if not(pagetitle == "") then
+ write_command(conn,"screen_set -name "..pagetitle)
+ write_command(conn,"widget_add "..pageid.." "..pageid..".title title")
+ write_command(conn,"widget_set "..pageid.." "..pageid..".title \"".. pagetitle.."\"")
+ end
+ for j,def in pairs(page) do
+ defid = def["sensor"].."."..def["param"]
+ write_command(conn,"widget_add "..pageid.." "..defid.." string")
+ end
+ end
+end
+
+function process_vals(vals)
+ for i,page in pairs(pages) do
+ local pageid = "page"..trim(tostring(i))
+ for j,def in pairs(page) do
+ val = vals[def["sensor"]][def["param"]]
+ if val then
+ val = round(val * def["scale"], def["round"])
+ end
+ defid = def["sensor"].."."..def["param"]
+ val = lpad(tostring(val),def["pos"]).." "..def["unit"]
+ if not(def["label"] == "") then
+ val = def["label"]..": "..val
+ end
+ write_command(conn,"widget_set "..pageid.." "..defid.." "..trim(tostring((def["col"]-1)*col_width+1)).." "..def["line"].." \""..val.."\"")
+ end
+ end
+end
+
+get_display_config()
+
+conn = connect_server()
+
+setup_pages(conn)
+
+while true do
+
+ pcall(function ()
+
+ vals = process_file()
+ process_vals(vals)
+
+ os.execute("inotifywait -e MODIFY \""..weather_file.."\"")
+ socket.sleep(3)
+
+ end)
+
+end
+