DB "canary" added - with fail/restart when connection dropped
[weathermon.git] / bin / weather-lcd
index 49fd5e37c7fdc3a454f2f0ed67bbd9eaa918b16e..d3283ca588677f44ef1b67292be6c69fdb432ff8 100755 (executable)
@@ -19,7 +19,7 @@ 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())
+      env = assert(dbdriver.sqlite3())
       log_con = assert(env:connect(weather_db))
     end)  
 end
@@ -153,15 +153,16 @@ function setup_pages(conn)
         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,"screen_set "..pageid.." -cursor off -name "..pagetitle.." -duration "..graph_duration)
         write_command(conn,"widget_add "..pageid.." "..pageid..".title title")
+        if height>2 then
+          write_command(conn,"widget_add "..pageid.." "..pageid..".max string")
+          write_command(conn,"widget_add "..pageid.." "..pageid..".min string")
+          for k = 3,height-1 do
+            write_command(conn,"widget_add "..pageid.." "..pageid..".place"..trim(tostring(k)).." string")
+          end
+        end  
         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
@@ -192,15 +193,16 @@ function process_graphs()
       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 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
-      for k=width-def["pos"],1,-1 do
+      local len
+      for k=width,1,-1 do
         if row then
-          val = row["val"]
-          row = cur:fetch ({}, "a")
+          val = row["val"] * def["scale"]
+          row = sqlcur:fetch ({}, "a")
         else
           val = nil  
         end  
@@ -208,20 +210,35 @@ function process_graphs()
         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)
-      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 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
@@ -235,14 +252,19 @@ setup_pages(conn)
 
 while true do
 
-  vals = process_file()
-  process_vals(vals)
+--  pcall( function ()
 
-  if log_con then
-    process_graphs()
-  end  
+      vals = process_file()
+      process_vals(vals)
+
+      if weather_db then
+        process_graphs()
+      end  
       
-  os.execute("inotifywait -e MODIFY \""..weather_file.."\"")
-  socket.sleep(3)
+      os.execute("inotifywait -e MODIFY \""..weather_file.."\"")
+  
+--    end)
+
+    socket.sleep(3)
   
 end