module(...,package.seeall) require("xap") require("xap.bsc") require("socket") local class = require("pl.class").class info={ version="1.0", description="MODBUS" } -- This is class is OVER simplified for explanation purposes. -- It might be we need to open/close the socket each time. class.Modbus() function Modbus:_init(ip, port) self.udp = socket.udp() self.udp:setsockname(ip, port) end function Modbus:set(state) self.udp:send(state) end function Modbus:get() return self.udp:receivefrom() end -- Reach out to modbus endpoint and grab state, compare to current xap endpoint value. function pollModbus(t, e) local currentState = e.modbus:get() if currentState ~= e.state then e:setState(currentState) e:sendEvent() end end -- Handling xAPBSC.cmd message to control modbus action function modCmd(e) e.modbus:set(e.state) end function init() local e = bsc.Endpoint{name="dbzoo.livebox.modbus:x.1", direction=bsc.OUTPUT, type=bsc.BINARY, cmdCB=modCmd, modbus=Modbus("1.2.3.4","3001") } xap.Timer(pollModbus, 1, e):start() end