#!/usr/bin/lua
local json = require("json")
+local signal = require("posix.signal")
require "wm_util"
end
end
+function unlock_db(file)
+
+ print("Unlocking DB "..file)
+ os.execute("sqlite3 -readonly \""..file.."\" \".backup /tmp/weathermon.db\"")
+ os.execute("mv /tmp/weathermon.db \""..file.."\"")
+
+end
+
function submitValue(type,id,param,val)
val = tonumber(val)
url = url:gsub("//","//"..web_user..":"..web_pass.."@",1)
end
- local result,code = http.request ({
- url=url, create=function()
- local req_sock = socket.tcp()
- req_sock:settimeout(web_timeout)
- return req_sock
- end})
+ local result,code = http.request (url)
- if code ~= 200 and backlog_con then
+ if code ~= 200 and backlogdb then
printLog("writing record to backlog...")
+ local backlog_con = assert(env:connect(backlogdb))
+ backlog_con:execute('BEGIN TRANSACTION')
backlog_con:execute(string.format("INSERT INTO queue(time_stamp,sensor_id,sensor,param,value) VALUES (datetime('now','localtime'),'%s','%s','%s',%f)",id,type,param,val))
+ local n,err = backlog_con:execute('COMMIT TRANSACTION')
+ backlog_con:close()
+
+ if err == "LuaSQL: database is locked" then
+ unlock_db(backlogdb);
+ end
+
end
end
if logdb then
+ print(logdb)
+ local log_con = assert(env:connect(logdb))
+ log_con:execute('BEGIN TRANSACTION')
log_con:execute(string.format("INSERT INTO log(time_stamp,sensor_id,sensor,param,value) VALUES (datetime('now','localtime'),'%s','%s','%s',%f)",id,type,param,val))
+ local n,err = log_con:execute('COMMIT TRANSACTION')
+ log_con:close()
+
+ print(n,err)
+
+ if err == "LuaSQL: database is locked" then
+ unlock_db(logdb);
+ end
+
end
end
end
if not (sensor_type==nil or sensor_id==nil or sensor_type=='' or sensor_id=='') then
- if next(sensor)==nil then
- sensor["command"]="alarm"
- end
local record = {}
for k,v in pairs(sensor) do
storeRecord(sensor_id,sensor_type,k,v)
return '{'..name..'}'
end
end)
- mqtt_client:publish(mqtt_path,v)
+ if not mqtt_client:socket() then
+ mqtt_client:reconnect()
+ end
+ mqtt_client:publish(mqtt_path,v,0,false)
mqtt_client:loop()
end
end
return '{'..name..'}'
end
end)
- mqtt_client:publish(mqtt_path,v)
+ if not mqtt_client:socket() then
+ mqtt_client:reconnect()
+ end
+ mqtt_client:publish(mqtt_path,v,0,false)
mqtt_client:loop()
end
end
return '{'..name..'}'
end
end)
- mqtt_client:publish(mqtt_path,msg_body)
+ if not mqtt_client:socket() then
+ mqtt_client:reconnect()
+ end
+ mqtt_client:publish(mqtt_path,msg_body,0,false)
mqtt_client:loop()
end
if alarm_exec then
getConfig(arg[1])
+signal.signal(signal.SIGTERM, function(signum)
+
+ printLog("Terminating...")
+ local pids = get_children()
+ for k,v in pairs(pids) do
+ printLog("Terminating subprocess "..tostring(v).."...")
+ signal.kill(v,signal.SIGTERM)
+ end
+ printLog("Exiting...")
+ os.exit(0)
+
+end)
+
if backlogdb or logdb then
local dbdriver = require "luasql.sqlite3"
env = assert(dbdriver.sqlite3())
if not file_exists(backlogdb) then
touch(backlogdb)
end
- backlog_con = assert(env:connect(backlogdb))
+ local backlog_con = assert(env:connect(backlogdb))
backlog_con:execute("CREATE TABLE queue(time_stamp datetime,sensor_id varchar(16),sensor varchar(16),param varchar(16),value float)")
+ backlog_con:close()
end
if logdb then
if not file_exists(logdb) then
touch(logdb)
end
- log_con = assert(env:connect(logdb))
+ local log_con = assert(env:connect(logdb))
log_con:execute("CREATE TABLE log(time_stamp datetime,sensor_id varchar(16),sensor varchar(16),param varchar(16),value float)")
log_con:execute("CREATE INDEX log_idx ON log(sensor_id,sensor,param,time_stamp)")
+ log_con:close()
end
if web_url then
http = require("socket.http")
- socket = require("socket")
+ http.TIMEOUT = web_timeout
end
if mqtt_host then
break
end
- pcall(function ()
+-- pcall(function ()
printLog("Received: "..line)
if startswith(line,'{') then
io.close(f)
end)
end
- end)
+-- end)
end