Задача
Каждый час формировать CSV файл со списком всех действий над объектами и посылать его на внешний FTP сервер с адресом IP 192.168.0.13, логином ‘ftp‘, паролем ‘ftp123‘.
Запуск по расписанию
Сначала необходимо зайти в System configuration -> Services -> FTP server и включить FTP server (enabled), а также выставить значение пароля (в данном примере ftp123)
В меню Скрипты –> По расписанию (Scripts -> Scheduled) добавить скрипт, который запускается каждый час и добавить следующий код в Редактор (Editor). Файл CSV будет создан только в том случае, если есть данные для передачи (логированные объекты).
require('socket.ftp')
-- ftp файл
ftpfile = string.format('ftp://ftp:ftp123@192.168.0.40/%s.csv',os.date('%Y-%m-%d_%H-%M'))
-- получаем время начала записи за последний час (3600 секунд)
logtime = os.time() - 60 * 60
-- Список объектов по id
objects = {}
-- получаем объекты по которым ведется запись действий
query = 'SELECT address, datatype, name FROM objects WHERE disablelog=0'
for _, object in ipairs(db:getall(query)) do
objects[ tonumber(object.address) ] = {
datatype = tonumber(object.datatype),
name = tostring(object.name or ''),
}
end
-- csv буфер
buffer = { '"date","address","name","value"' }
-- получаем список действий по объектам
query = 'SELECT src, address, datahex, logtime,eventtype FROM objectlog WHERE logtime >= ? ORDER BY id DESC'
qr = db:getall(query, logtime)
for _, row in ipairs(qr) do
object = objects[ tonumber(row.address) ]
-- находим соответствие между объектом и типом события
-- запись по групповому адресу
if object and row.eventtype == 'write' then
datatype = object.datatype
-- проверяем что тип данных установлен
if datatype then
-- раскодируем данные
data = knxdatatype.decode(row.datahex, datatype)
-- удаляем null символы из char/string типов
if datatype == dt.char or datatype == dt.string then
data = data:gsub('%z+', '')
-- конвертируем date в формат DD.MM.YYYY
elseif datatype == dt.date then
data = string.format('%.2d.%.2d.%.2d', data.day, data.month, data.year)
-- time в HH:MM:SS
elseif datatype == dt.time then
data = string.format('%.2d:%.2d:%.2d', data.hour, data.minute, data.second)
end
else
data = ''
end
-- форматируем csv колонки
logdate = os.date('%Y.%m.%d %H:%M:%S', row.logtime)
csv = string.format('%q,%q,%q,%q', logdate, knxlib.decodega(row.address),object.name, tostring(data))
-- добавляем в buffer данные
table.insert(buffer, csv)
end
end
-- загружаем на ftp только если есть данные в буфере buffer
if #buffer > 1 then
result, err = socket.ftp.put(ftpfile, table.concat(buffer, '\r\n'))
else
-- если нет логированных данных для передачи
alert('FTP upload failed: no data')
end
-- оповещаем, если есть ошибки при загрузке
if err then
alert('FTP upload failed: %s', err)
end
-- ftp файл
ftpfile = string.format('ftp://ftp:ftp123@192.168.0.40/%s.csv',os.date('%Y-%m-%d_%H-%M'))
-- получаем время начала записи за последний час (3600 секунд)
logtime = os.time() - 60 * 60
-- Список объектов по id
objects = {}
-- получаем объекты по которым ведется запись действий
query = 'SELECT address, datatype, name FROM objects WHERE disablelog=0'
for _, object in ipairs(db:getall(query)) do
objects[ tonumber(object.address) ] = {
datatype = tonumber(object.datatype),
name = tostring(object.name or ''),
}
end
-- csv буфер
buffer = { '"date","address","name","value"' }
-- получаем список действий по объектам
query = 'SELECT src, address, datahex, logtime,eventtype FROM objectlog WHERE logtime >= ? ORDER BY id DESC'
qr = db:getall(query, logtime)
for _, row in ipairs(qr) do
object = objects[ tonumber(row.address) ]
-- находим соответствие между объектом и типом события
-- запись по групповому адресу
if object and row.eventtype == 'write' then
datatype = object.datatype
-- проверяем что тип данных установлен
if datatype then
-- раскодируем данные
data = knxdatatype.decode(row.datahex, datatype)
-- удаляем null символы из char/string типов
if datatype == dt.char or datatype == dt.string then
data = data:gsub('%z+', '')
-- конвертируем date в формат DD.MM.YYYY
elseif datatype == dt.date then
data = string.format('%.2d.%.2d.%.2d', data.day, data.month, data.year)
-- time в HH:MM:SS
elseif datatype == dt.time then
data = string.format('%.2d:%.2d:%.2d', data.hour, data.minute, data.second)
end
else
data = ''
end
-- форматируем csv колонки
logdate = os.date('%Y.%m.%d %H:%M:%S', row.logtime)
csv = string.format('%q,%q,%q,%q', logdate, knxlib.decodega(row.address),object.name, tostring(data))
-- добавляем в buffer данные
table.insert(buffer, csv)
end
end
-- загружаем на ftp только если есть данные в буфере buffer
if #buffer > 1 then
result, err = socket.ftp.put(ftpfile, table.concat(buffer, '\r\n'))
else
-- если нет логированных данных для передачи
alert('FTP upload failed: no data')
end
-- оповещаем, если есть ошибки при загрузке
if err then
alert('FTP upload failed: %s', err)
end