From 3d8af53f1b0fde15ccb2ec381f4f907648f1d35a Mon Sep 17 00:00:00 2001 From: Roman Bazalevsky Date: Tue, 21 Jan 2020 13:52:04 +0300 Subject: [PATCH 1/1] =?utf8?q?=D0=93=D1=80=D0=B0=D1=84=D0=B8=D0=BA=D0=B8?= =?utf8?q?=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?utf8?q?=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D0=BE=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- bin/weather-lcd | 102 ++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 91 insertions(+), 11 deletions(-) diff --git a/bin/weather-lcd b/bin/weather-lcd index 69cd421..9ee87ba 100755 --- a/bin/weather-lcd +++ b/bin/weather-lcd @@ -12,6 +12,17 @@ if not config_name then end weather_file = uci.get(config_name,"process","dump_file") +weather_db = uci.get(config_name,"process","logdb") + +graph_duration = uci.get(config_name,"display","graph_duration") + +if graph_duration and not(weather_db == "") then + pcall(function () + local dbdriver = require "luasql.sqlite3" + local env = assert(dbdriver.sqlite3()) + log_con = assert(env:connect(weather_db)) + end) +end function round(num, numDecimalPlaces) local mult = 10^(numDecimalPlaces or 0) @@ -38,12 +49,15 @@ end function get_display_config() width = tonumber(uci.get(config_name,"display","width")) height = tonumber(uci.get(config_name,"display","height")) + charwidth = tonumber(uci.get(config_name,"display","charwidth")) + charheight = tonumber(uci.get(config_name,"display","charheight")) cols = tonumber(uci.get(config_name,"display","columns")) title = uci.get(config_name,"display","title") col_width = math.floor(width/cols) pages = {} pagetitles = {} + pagedurations = {} local page, def, line, col, pos @@ -53,6 +67,7 @@ function get_display_config() if not pagetitle then pagetitle = title end + local pageduration = s["duration"] if not (pagetitle=="") then line = 2 else @@ -83,6 +98,7 @@ function get_display_config() end pages[#pages+1] = page pagetitles[#pages] = pagetitle + pagedurations[#pages] = pageduration end) end @@ -96,7 +112,8 @@ end function write_command(conn,command) conn:send(command.."\n") - return(conn:receive()) + local str=conn:receive() + return str end function setup_pages(conn) @@ -106,16 +123,39 @@ function setup_pages(conn) local pageid = "page"..trim(tostring(i)) write_command(conn,"screen_add "..pageid) local pagetitle = pagetitles[i] + write_command(conn,"screen_set "..pageid.." -cursor off") if not(pagetitle == "") then - write_command(conn,"screen_set -name "..pagetitle) + write_command(conn,"screen_set "..pageid.." -name "..pagetitle) write_command(conn,"widget_add "..pageid.." "..pageid..".title title") write_command(conn,"widget_set "..pageid.." "..pageid..".title \"".. pagetitle.."\"") end + local pageduration = pagedurations[i] + if pageduration and not(pageduration == "") then + write_command(conn,"screen_set "..pageid.." -duration "..pageduration) + end for j,def in pairs(page) do defid = def["sensor"].."."..def["param"] write_command(conn,"widget_add "..pageid.." "..defid.." string") end end + if log_con then + for i,page in pairs(pages) do + for j,def in pairs(page) do + pageid = def["sensor"].."."..def["param"] + pagetitle = trim(def["label"])..", "..def["unit"] + write_command(conn,"screen_add "..pageid) + write_command(conn,"screen_set "..pageid.." -cursor off") + write_command(conn,"screen_set "..pageid.." -name "..pagetitle.." -duration "..graph_duration) + write_command(conn,"widget_add "..pageid.." "..pageid..".title title") + write_command(conn,"widget_set "..pageid.." "..pageid..".title \"".. pagetitle.."\"") + write_command(conn,"widget_add "..pageid.." "..pageid..".max string") + write_command(conn,"widget_add "..pageid.." "..pageid..".min string") + for k=1,width-def["pos"] do + write_command(conn,"widget_add "..pageid.." "..pageid..".bar"..trim(tostring(k)).." vbar") + end + end + end + end end function process_vals(vals) @@ -136,6 +176,47 @@ function process_vals(vals) end end +function process_graphs() + for i,page in pairs(pages) do + for j,def in pairs(page) do + local sensor = def["sensor"] + local param = def["param"] + local pageid = sensor.."."..param + local cur = assert (log_con:execute(string.format("select hour,avg(value) val from (select strftime('%%Y-%%m-%%d %%H',time_stamp)||':00' hour,value from log where sensor='%s' and param='%s') group by hour order by hour desc limit 24",sensor,param))) + local row = cur:fetch ({}, "a") + local vals = {} + local maxval = -99999999 + local minval = 99999999 + for k=width-def["pos"],1,-1 do + if row then + val = row["val"] + row = cur:fetch ({}, "a") + else + val = nil + end + vals[k] = val + if val and (val > maxval) then maxval = val; end + if val and (val < minval) then minval = val; end + end + minval = math.floor(minval) + minvalstr = trim(tostring(minval)) + maxval = math.ceil(maxval) + maxvalstr = trim(tostring(maxval)) + write_command(conn,"widget_set "..pageid.." "..pageid..".max "..trim(tostring(width-string.len(maxvalstr)+1)).." 2 "..maxvalstr) + write_command(conn,"widget_set "..pageid.." "..pageid..".min "..trim(tostring(width-string.len(minvalstr)+1)).." "..height.." "..minvalstr) + for k = 1,width-def["pos"] do + val = vals[k] + if val then + h = math.floor(0.5+(val-minval)/(maxval-minval)*(height-1)*charheight) + else + h = 0 + end + write_command(conn,"widget_set "..pageid.." "..pageid..".bar"..trim(tostring(k)).." "..k.." "..height.." "..h) + end + end + end +end + get_display_config() conn = connect_server() @@ -144,15 +225,14 @@ setup_pages(conn) while true do - pcall(function () - - vals = process_file() - process_vals(vals) + vals = process_file() + process_vals(vals) - os.execute("inotifywait -e MODIFY \""..weather_file.."\"") - socket.sleep(3) - - end) + if log_con then + process_graphs() + end + + os.execute("inotifywait -e MODIFY \""..weather_file.."\"") + socket.sleep(3) end - -- 2.34.1