Logic Machine Forum
Log all bus traffic - Printable Version

+- Logic Machine 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: Log all bus traffic (/showthread.php?tid=273)



Log all bus traffic - gjniewenhuijse - 12.04.2016

I like to log all the bus traffic to my mysql database.

How to do this with on a resource frendly way?


RE: Log all bus traffic - edgars - 15.04.2016

for now you can mark all objects with Log check-box and use this example to export CSV once hour/day to external server:
http://openrb.com/example-export-last-hour-csv-object-log-file-to-external-ftp-server-from-lm2/

In the future, we will make a real-time example for exporting this data.


RE: Log all bus traffic - gjniewenhuijse - 19.04.2016

maybe something like this?
But how to show the datahex in readable format?

And is it possible to add a general handler, also for groupreads etc?
Code:
if not client then
  require('genohm-scada.eibdgm')

  -- handle group writes
  function eventhandler(event)
    log(event) -- later send this to mysql
    --log(knxdatatype.decode(event.datahex,?))
  end

  -- knx connection
  client = eibdgm:new({ timeout = 1 })
  client:sethandler('groupwrite', eventhandler)

  -- start-up time
  sec, usec = os.microtime()
end

-- handle knx
client:step()



RE: Log all bus traffic - admin - 20.04.2016

Something like this, though it will not work on older FW where grp.all function is not implemented.

Code:
if not client then
  require('genohm-scada.eibdgm')

  objects = grp.all()
  datatypes = {}

  for _, object in ipairs(objects) do
    datatypes[ object.id ] = object.datatype
  end

  function writehandler(event)
    local dpt = datatypes[ event.dstraw ]
    if dpt then
      local value = knxdatatype.decode(event.datahex, dpt)
    end
  end

  function readhandler(event)
    log(event)
  end

  client:sethandler('groupwrite', writehandler)
  client:sethandler('groupresponse', writehandler)
  client:sethandler('groupread', readhandler)
end

-- handle knx
client:step()



RE: Log all bus traffic - Ruslan - 20.04.2016

May be modify script for support sending to SYSLOG collector?


RE: Log all bus traffic - Ruslan - 26.04.2016

My simple variant for sending all data to SYSLOG server

In User Libraries need create function syslog:


Code:
function syslog(message)
 require('socket')

 local client = socket.udp()
 if client then
   client:sendto(message, '192.168.19.254', 514)
   client:close()
 end
end


After this markup all objects with tag "All"

Create new event-based script "Send all messages to SYSLOG" for tag "All"

Code:
name = grp.alias(event.dst)
-- Fix Group name for empty values
if (name == nil or name == '') then
 name = "Noname"
end

value = '"'..name..'" '..event.src..' '..event.dst..' '..event.type..' '..knxdatatype.decode(event.datahex, grp.find(event.dst).datatype)..' 0x'..event.datahex
syslog(value)

Sample of log:
2016-04-26T22:52:34.084297+03:00 192.168.16.200 "Wind speed (m/s)" 1.0.1 5/0/6 groupwrite 2.6 0x0104
2016-04-26T22:52:39.817766+03:00 192.168.16.200 "Wind speed (m/s)" 1.0.1 5/0/6 groupwrite 4.5 0x01C2
2016-04-26T22:52:42.632619+03:00 192.168.16.200 "Wind speed (m/s)" 1.0.1 5/0/6 groupwrite 2.7 0x010E
2016-04-26T22:52:45.231188+03:00 192.168.16.200 "Wind speed (m/s)" 1.0.1 5/0/6 groupwrite 3.3 0x014A
2016-04-26T22:52:50.097556+03:00 192.168.16.200 "Wind speed (m/s)" 1.0.1 5/0/6 groupwrite 1.6 0x00A0
2016-04-26T22:52:51.595747+03:00 192.168.16.200 "Noname" 1.3.2 2/2/3 groupwrite 21.4 0x0C2E
2016-04-26T22:52:57.809525+03:00 192.168.16.200 "Temp in room 37" 1.3.22 2/1/24 groupwrite 24.02 0x0CB1