![]() |
|
filter alarm table - Printable Version +- LogicMachine Forum (https://forum.logicmachine.net) +-- Forum: LogicMachine eco-system (https://forum.logicmachine.net/forumdisplay.php?fid=1) +--- Forum: Scripting (https://forum.logicmachine.net/forumdisplay.php?fid=8) +--- Thread: filter alarm table (/showthread.php?tid=3165) Pages:
1
2
|
filter alarm table - Frank68 - 12.02.2021 Hello I should only select alarms from the previous month and then export them to a csv file and send the whole thing via email. But I thought about the query, I'm using the following code. Code: --My (smtps) username !IMPORTANT!
user = 'report@test.com'
--My (smtps) password !IMPORTANT!
password = 'xxxxxx'
--Sender for e-mail
from = '<' .. user .. '>'
alias_from = 'Do not Reply '
--Recipient for e-mail
to = '<xxxx@xxxx.com>'
alias_to = to
--Subject for e-mail
subjectpart1 = 'Lista Allarmi Mese'
subjectpart2 = 'E-Mail inviata in automatico dal WebServer'
--Message on bottom of email (will only be showed when client don't understand attachment)
epilogue = 'End of message'
-- vedere come filtrare mese se 1 prendere 12 e anno -1
----------------------------------------------------------------
if (os.date('%m')==1) then
mp=12
yr=os.date('%Y')-1
else
mp=os.date('%m')-1
yr=os.date('%Y')
end
------------------------------------------------------------------
--log('MESE ' ..mp .. ' ANNO ' ..yr)
-- Get all alerts from DB
alerts_table = db:getall('SELECT * FROM alerts where alerttime like %'..mp..'.'..yr..'% ORDER BY id DESC')
-- csv buffer
buffer = {}
-- format csv row
csv = string.format('%q,%q,%q', "ID", "Messaggio", "Data e Ora")
-- add to buffer
table.insert(buffer, csv)
-- add empty line to buffer
table.insert(buffer, "")
-- Loop through alerts_table
for _, alerts in ipairs(alerts_table) do
-- format csv row
csv = string.format('%q,%q,%q', alerts.id, alerts.alert, os.date("%x %X", alerts.alerttime))
-- add to buffer
table.insert(buffer, csv)
end
--Create table to include mail settings
local settings = {
from = from,
rcpt = to,
user = user,
password = password,
server = 'smtps.aruba.it',
port = 465,
secure = 'sslv23',
}
--Create attachment inside FTP server
src = os.date('%Y-%m') .. '.csv'
dst = '/home/ftp/' .. src
io.writefile(dst, buffer)
--Create subject
subject = subjectpart1 .. ": " .. src .. " " .. subjectpart2
--Load required modules to send email with attachment
local smtp = require("socket.smtp")
local mime = require("mime")
local ltn12 = require("ltn12")
--Create e-mail header
settings.source = smtp.message{
headers = {
from = '' .. alias_from .. ' ' .. from .. '',
to = '' .. alias_to .. ' ' .. to .. '',
subject = subject
},
--Load attachment inside body
body = {
preamble = "",
[1] = {
headers = {
["content-type"] = 'text/plain',
["content-disposition"] = 'attachment; filename="'..src..'"',
["content-description"] = '.. src ..',
["content-transfer-encoding"] = "BASE64",
},
body = ltn12.source.chain(
ltn12.source.file(io.open(dst, "rb")),
ltn12.filter.chain(
mime.encode("base64"),
mime.wrap()
)
)
},
epilogue = epilogue
}
}
--Send the email
r, e = smtp.send(settings)
--Create alert when sending gives an error with error message
if (e) then
log (e)
log (r)
alert("Could not send email: ", e, "\n")
end
--Delete created file from ftp folder inside HL
os.remove(dst)taking into account that if month = 1 I have to take the data of month 12 and previous year my problem is the select query I don't know how to filter the column data whose name I don't know (alarm date) grazie RE: filter alarm table - admin - 12.02.2021 Date/time is stored as UNIX timestamp. Check for month number wrap is not needed, it is handled by the os.time() automatically. Code: date = os.date('*t')
date.day, date.hour, date.min, date.sec = 1, 0, 0, 0
ts_end = os.time(date)
date.month = date.month - 1
ts_start = os.time(date)
alerts_table = db:getall('SELECT * FROM alerts where alerttime BETWEEN ? AND ? ORDER BY id DESC', ts_start, ts_end)RE: filter alarm table - Frank68 - 12.02.2021 (12.02.2021, 12:14)admin Wrote: Date/time is stored as UNIX timestamp. Check for month number wrap is not needed, it is handled by the os.time() automatically. i'm trying the code but surely i'm wrong something, the code gives me the following values for the range From 01/01/21 to - 02/01/21 I think there is a problem with the date format , swap day and month , i have a alarm inside but return nothing to export in csv Thank's RE: filter alarm table - admin - 12.02.2021 Replace os.date("%x %X" with os.date("%F %X" RE: filter alarm table - Frank68 - 12.02.2021 (12.02.2021, 13:04)admin Wrote: Replace os.date("%x %X" with os.date("%F %X" I not have this entry in code RE: filter alarm table - admin - 12.02.2021 RE: filter alarm table - Frank68 - 12.02.2021 Hi not work Is possible to log the return valu eof query fir control , or count number of row return ? BR RE: filter alarm table - admin - 12.02.2021 Post you full script listing otherwise it's impossible to find what's wrong with it. You can use log(any_variable_name) to log variable contents into Logs tab. RE: filter alarm table - Frank68 - 12.02.2021 (12.02.2021, 13:45)admin Wrote: Post you full script listing otherwise it's impossible to find what's wrong with it. You can use log(any_variable_name) to log variable contents into Logs tab. This is my complete script Code: --My (smtps) username !IMPORTANT!
user = 'xxxx@xxx.com'
--My (smtps) password !IMPORTANT!
password = 'xxxx.'
--Sender for e-mail
from = '<' .. user .. '>'
alias_from = 'Do not Reply '
--Recipient for e-mail
to = '<xxx@xxx.com>'
alias_to = to
--Subject for e-mail
subjectpart1 = 'Lista Allarmi Mese'
subjectpart2 = 'E-Mail inviata in automatico dal WebServer'
--Message on bottom of email (will only be showed when client don't understand attachment)
epilogue = 'End of message'
date = os.date('*t')
date.day, date.hour, date.min, date.sec = 1, 0, 0, 0
ts_end = os.time(date)
date.month = date.month-1
ts_start = os.time(date)
alerts_table = db:getall('SELECT * FROM alerts where alerttime BETWEEN ? AND ? ORDER BY id DESC', ts_start, ts_end)
---------------------------------------------------------------------------------
log('Dal - ' .. os.date("%x",ts_start) .. ' Al - ' .. os.date("%x",ts_end))
---------------------------------------------------------------------------------
-- csv buffer
buffer = {}
-- format csv row
csv = string.format('%q,%q,%q', "ID", "Messaggio", "Data e Ora")
-- add to buffer
table.insert(buffer, csv)
-- add empty line to buffer
table.insert(buffer, "")
i=0
-- Loop through alerts_table
for _, alerts in ipairs(alerts_table) do
-- format csv row
log(tostring(i+1))
csv = string.format('%q,%q,%q', alerts.id, alerts.alert, os.date("%F %X", alerts.alerttime))
-- add to buffer
table.insert(buffer, csv)
end
--Create table to include mail settings
local settings = {
from = from,
rcpt = to,
user = user,
password = password,
server = 'smtps.aruba.it',
port = 465,
secure = 'sslv23',
}
--Create attachment inside FTP server
src = os.date('%Y-%m') .. '.csv'
dst = '/home/ftp/' .. src
io.writefile(dst, buffer)
--Create subject
subject = subjectpart1 .. ": " .. src .. " " .. subjectpart2
--Load required modules to send email with attachment
local smtp = require("socket.smtp")
local mime = require("mime")
local ltn12 = require("ltn12")
--Create e-mail header
settings.source = smtp.message{
headers = {
from = '' .. alias_from .. ' ' .. from .. '',
to = '' .. alias_to .. ' ' .. to .. '',
subject = subject
},
--Load attachment inside body
body = {
preamble = "",
[1] = {
headers = {
["content-type"] = 'text/plain',
["content-disposition"] = 'attachment; filename="'..src..'"',
["content-description"] = '.. src ..',
["content-transfer-encoding"] = "BASE64",
},
body = ltn12.source.chain(
ltn12.source.file(io.open(dst, "rb")),
ltn12.filter.chain(
mime.encode("base64"),
mime.wrap()
)
)
},
epilogue = epilogue
}
}
--Send the email
r, e = smtp.send(settings)
--Create alert when sending gives an error with error message
if (e) then
log (e)
log (r)
alert("Could not send email: ", e, "\n")
end
--Delete created file from ftp folder inside HL
os.remove(dst)BR RE: filter alarm table - admin - 12.02.2021 The script looks correct. What do you get in logs? Do you actually have alerts for the previous month in Alerts tab? You can try getting alerts for the current month by adding date.month = date.month + 1 after date = os.date('*t') (line 21) Also don't use %x date format because it is MONTH/DAY/YEAR, use %F which is YEAR-MONTH-DAY. RE: filter alarm table - Frank68 - 12.02.2021 (12.02.2021, 14:00)admin Wrote: The script looks correct. What do you get in logs? Do you actually have alerts for the previous month in Alerts tab? tried as recommended changed to% F, the result does not change, could it be an international setting problem? If I look at the alerts they are merited in the format 12.02.2021 hh:mm sRE: filter alarm table - admin - 12.02.2021 If you want this exact data time format then use os.date('%d.%m.%Y %X', alerts.alerttime) RE: filter alarm table - Frank68 - 12.02.2021 (12.02.2021, 14:18)admin Wrote: If you want this exact data time format then use os.date('%d.%m.%Y %X', alerts.alerttime) in the query sintax ? RE: filter alarm table - admin - 12.02.2021 Part of line 45. Don't change the query, it's already correct. RE: filter alarm table - Frank68 - 12.02.2021 (12.02.2021, 14:25)admin Wrote: Part of line 45. Don't change the query, it's already correct. done but nothing to do I always get back files with no line just headers. The problem that with the query does not return anything, if instead I do a select * it returns the alarm, I'm afraid that the problem is the stored date format, how can I see the logicmachine db if possible? in the previous post it was the format I see on the logicmachine Thank you RE: filter alarm table - admin - 12.02.2021 There's no date format in the database, UNIX timestamp (integer) is used to store date/time. Either the query is incorrect or you don't have alerts matching the requested time-frame. Run this script once and post what got get in Logs tab: Code: data = db:getall('SELECT COUNT(1) total, MIN(alerttime) tmin, MAX(alerttime) tmax FROM alerts')
log(data)RE: filter alarm table - Frank68 - 12.02.2021 (12.02.2021, 14:40)admin Wrote: There's no date format in the database, UNIX timestamp (integer) is used to store date/time. Either the query is incorrect or you don't have alerts matching the requested time-frame. RE: filter alarm table - admin - 12.02.2021 You only have 3 alerts in the database and the oldest one is from today. This is why you get an empty CSV when exporting previous month data. RE: filter alarm table - Frank68 - 12.02.2021 (12.02.2021, 15:14)admin Wrote: You only have 3 alerts in the database and the oldest one is from today. This is why you get an empty CSV when exporting previous month data. also use month+1 export nothing RE: filter alarm table - admin - 12.02.2021 Run this script to log alerts for the current month and post the result: Code: date = os.date('*t')
date.month = date.month + 1
date.day, date.hour, date.min, date.sec = 1, 0, 0, 0
ts_end = os.time(date)
date.month = date.month - 1
ts_start = os.time(date)
alerts_table = db:getall('SELECT * FROM alerts where alerttime BETWEEN ? AND ? ORDER BY id DESC', ts_start, ts_end)
-- csv buffer
buffer = {}
-- format csv row
csv = string.format('%q,%q,%q', "ID", "Messaggio", "Data e Ora")
-- add to buffer
table.insert(buffer, csv)
-- add empty line to buffer
table.insert(buffer, "")
-- Loop through alerts_table
for _, alerts in ipairs(alerts_table) do
-- format csv row
csv = string.format('%q,%q,%q', alerts.id, alerts.alert, os.date("%d.%m.%Y %X", alerts.alerttime))
-- add to buffer
table.insert(buffer, csv)
end
res = table.concat(buffer, '\n')
log(res) |