Example: export last hour CSV object log file to external FTP server from LM2
Task
Once an hour, make CSV file with all objects logs and send to external FTP server with IP 192.168.1.11, login ‘ftplogin‘, password ‘ftppassword‘.
Scheduled program
In Scripting -> Scheduled add the script which will run once an hour and add following code in Script editor.

- require('socket.ftp')
-
- -- ftp file
- ftpfile = string.format('ftp://ftplogin:ftppassword@192.168.1.11/%s.csv', os.date('%Y-%m-%d_%H-%M'))
- -- get past hour data (3600 seconds)
- logtime = os.time() - 60 * 60
-
- -- list of objects by id
- objects = {}
-
- -- objects with logging enabled
- 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
- buffer = { '"date","address","name","value"' }
-
- -- get object logs
- query = 'SELECT src, address, datahex, logtime, eventtype FROM objectlog WHERE logtime >= ? ORDER BY id DESC'
- for _, row in ipairs(db:getall(query, logtime)) do
- object = objects[ tonumber(row.address) ]
-
- -- found matching object and event type is group write
- if object and row.eventtype == 'write' then
- datatype = object.datatype
-
- -- check that object datatype is set
- if datatype then
- -- decode data
- data = knxdatatype.decode(row.datahex, datatype)
-
- -- remove null chars from char/string datatype
- if datatype == dt.char or datatype == dt.string then
- data = data:gsub('%z+', '')
- -- date to DD.MM.YYYY
- elseif datatype == dt.date then
- data = string.format('%.2d.%.2d.%.2d', data.day, data.month, data.year)
- -- time to HH:MM:SS
- elseif datatype == dt.time then
- data = string.format('%.2d:%.2d:%.2d', data.hour, data.minute, data.second)
- end
- else
- data = ''
- end
-
- -- format csv row
- 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))
-
- -- add to buffer
- table.insert(buffer, csv)
- end
- end
-
- -- upload to ftp only when there's data in buffer
- if #buffer > 1 then
- result, err = socket.ftp.put(ftpfile, table.concat(buffer, '\r\n'))
- end
-
- -- error while uploading
- if err then
- alert('FTP upload failed: %s', err)
- end




