Denver e-Ribbon Fire control from LogicMachine #
Task #
This example will show how to integrate/control Decoflame’s Denver e-Ribbon bio fireplace system into LogicMachine.
Connection to the Denver e-Ribbon fire system is done over RS-232 port.
Common function for sending data to fireplace burner #
Add the following code to Scripting > Common Functions:
function firesend(dev, req)
local port, b1, b2, cs, data, res, err
-- checksum calculation
function getcs(b1, b2)
return 0xFF - bit.band(b1 + b2, 0xFF)
end
require('serial')
port = serial.open(dev, { baudrate = 19200 })
-- get two bytes from request
b1 = bit.rshift(req, 8)
b1 = bit.band(b1, 0xFF)
b2 = bit.band(req, 0xFF)
-- calculate checksum
cs = getcs(b1, b2)
-- send data
data = string.char(0x01, b1, b2, cs, 0x04)
port:flush()
port:write(data)
-- wait for reply
res, err = port:read(#data, 1)
port:close()
-- valid reply
if type(res) == 'string' and #res == #data then
b1, b2, cs = res:byte(2, 4)
-- verify checksum
if cs == getcs(b1, b2) then
return b1, b2
-- invalid checksum
else
return nil, 'invalid checksum'
end
-- no reply or invalid reply
else
return nil, err
end
end
Send commands to fireplace burner #
Add control objects in LogicMachine and specify separate Event-based scripts for each control grp address. The following example sends the "flame5" command.
firesend('/dev/RS232', 0x0005)
Status of the fireplace burner #
The burner can return statuses based on specific commands e.g. fuel level.
Add the following code to Scripting > Common Functions:
function getfirestatus(port, data)
local b1, b2 = firesend(port, data)
if b1 then
b1 = bit.band(b1, 0x0F)
b1 = bit.lshift(b1, 8)
return bit.bor(b1, b2)
end
end
Add a resident script with necessary sleep time interval to update respective group addresses with the burner status.
-- fuel level status
fuel = getfirestatus('/dev/RS232', 0x9000)
if fuel then
grp.update('1/1/1', fuel)
end