+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 sqlcur = 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 = sqlcur:fetch ({}, "a")
+      local vals = {}
+      local maxval = -99999999
+      local minval =  99999999
+      local len
+      for k=width,1,-1 do
+        if row then
+          val = row["val"] * def["scale"]
+          row = sqlcur: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          
+      sqlcur:close()
+      minval = math.floor(minval)
+      maxval = math.ceil(maxval)
+      if height>2 then
+        local minvalstr = trim(tostring(minval))
+        local maxvalstr = trim(tostring(maxval))
+        len = math.max(string.len(minvalstr),string.len(maxvalstr))
+        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 = 3,height-1 do
+          write_command(conn,"widget_set "..pageid.." "..pageid..".place"..trim(tostring(k)).." "..trim(tostring(width-len+1)).." "..k.." \" "..string.rep("-",len-1).."\"")
+        end
+      else
+        len = 0
+      end    
+      local m = width
+      for k=1,width do
+        write_command(conn,"widget_del "..pageid.." "..pageid..".bar"..trim(tostring(k)))
+      end
+      for k = width-len,1,-1 do
+        val = vals[m]
+        if val then
+          h = math.floor(0.5+(val-minval)/(maxval-minval)*(height-1)*charheight)
+        else
+          h = 0
+        end  
+        write_command(conn,"widget_add "..pageid.." "..pageid..".bar"..trim(tostring(k)).." vbar")
+        write_command(conn,"widget_set "..pageid.." "..pageid..".bar"..trim(tostring(k)).." "..k.." "..height.." "..h)
+        m = m - 1
+      end
+    end
+  end
+end
+