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.

  1. require('socket.ftp')
  2.  
  3. -- ftp file
  4. ftpfile = string.format('ftp://ftplogin:ftppassword@192.168.1.11/%s.csv', os.date('%Y-%m-%d_%H-%M'))
  5. -- get past hour data (3600 seconds)
  6. logtime = os.time() - 60 * 60
  7.  
  8. -- list of objects by id
  9. objects = {}
  10.  
  11. -- objects with logging enabled
  12. query = 'SELECT address, datatype, name FROM objects WHERE disablelog=0'
  13. for _, object in ipairs(db:getall(query)) do
  14. objects[ tonumber(object.address) ] = {
  15. datatype = tonumber(object.datatype),
  16. name = tostring(object.name or ''),
  17. }
  18. end
  19.  
  20. -- csv buffer
  21. buffer = { '"date","address","name","value"' }
  22.  
  23. -- get object logs
  24. query = 'SELECT src, address, datahex, logtime, eventtype FROM objectlog WHERE logtime >= ? ORDER BY id DESC'
  25. for _, row in ipairs(db:getall(query, logtime)) do
  26. object = objects[ tonumber(row.address) ]
  27.  
  28. -- found matching object and event type is group write
  29. if object and row.eventtype == 'write' then
  30. datatype = object.datatype
  31.  
  32. -- check that object datatype is set
  33. if datatype then
  34. -- decode data
  35. data = knxdatatype.decode(row.datahex, datatype)
  36.  
  37. -- remove null chars from char/string datatype
  38. if datatype == dt.char or datatype == dt.string then
  39. data = data:gsub('%z+', '')
  40. -- date to DD.MM.YYYY
  41. elseif datatype == dt.date then
  42. data = string.format('%.2d.%.2d.%.2d', data.day, data.month, data.year)
  43. -- time to HH:MM:SS
  44. elseif datatype == dt.time then
  45. data = string.format('%.2d:%.2d:%.2d', data.hour, data.minute, data.second)
  46. end
  47. else
  48. data = ''
  49. end
  50.  
  51. -- format csv row
  52. logdate = os.date('%Y.%m.%d %H:%M:%S', row.logtime)
  53. csv = string.format('%q,%q,%q,%q', logdate, knxlib.decodega(row.address), object.name, tostring(data))
  54.  
  55. -- add to buffer
  56. table.insert(buffer, csv)
  57. end
  58. end
  59.  
  60. -- upload to ftp only when there's data in buffer
  61. if #buffer > 1 then
  62. result, err = socket.ftp.put(ftpfile, table.concat(buffer, '\r\n'))
  63. end
  64.  
  65. -- error while uploading
  66. if err then
  67. alert('FTP upload failed: %s', err)
  68. end