Графики изменения параметров.
authorRoman Bazalevsky <rvb@rvb.name>
Tue, 21 Jan 2020 10:52:04 +0000 (13:52 +0300)
committerRoman Bazalevsky <rvb@rvb.name>
Tue, 21 Jan 2020 10:52:04 +0000 (13:52 +0300)
bin/weather-lcd

index 69cd421134a33e6e9e529eeae101a0d61a9fc7ea..9ee87ba529f4a7007dab6997818cf61889698e3f 100755 (executable)
@@ -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
-