This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

222.100 datatype on 6 bytes
#1
Hello,

I need to handle a 6 bytes value from KNX CIAT heating actuator (3 setpoint in one variable confort/eco/standby).
Then to put it to Bacnet for comptible Bacnet device.

I want to use Spacelynk for that (Schneider project), but this datatype missed !

Can I use bigger datatype ??

Waht solution ?

regards

http://dz.prosyst.com/pdoc/mBS_SH_SDK_7....etF16.html

Code:
DPT_TEMPROOM_SETP_SETF16_MINOR
 
DPT minor type 222.100
Reply
#2
Maybe I can use something like this with dstraw:

Code:
require('genohm-scada.eibdgm')

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

then put decoded 6 byte value to 3 different 2 bytes value (in new varaible) and to check export for bacnet.
However, how can I do from bacnet, then reencode to 6 bytes....
Reply
#3
Hi,

Create a 255 byte object (1/1/1 in this sample) and link it to the address of your 6 byte value that you use in the ETS and attached this script to it:

Code:
if event.src ~= 'local' then
 value = event.getvalue()
 value = lmcore.strtohex(value)
 bytestable = {}
 for i = 2, #value, 2 do
   bytevalue = string.sub(value, (i-1), i)
   table.insert(bytestable, bytevalue)
 end
 value1 = knxdatatype.decode(bytestable[1] .. bytestable[2], dt.float16)
 value2 = knxdatatype.decode(bytestable[3] .. bytestable[4], dt.float16)
 value3 = knxdatatype.decode(bytestable[5] .. bytestable[6], dt.float16)
 grp.update('32/1/1', value1)
 grp.update('32/1/2', value2)
 grp.update('32/1/3', value3)
end

That will give you the 3x 2 byte float objects that you can export to BACnet.

Attach a tag to the 3x 2 byte float objects and create a event based script attached to that tag and paste this script in it:

Code:
if event.src == 'local' then
  value1 = grp.find('32/1/1').datahex
  value2 = grp.find('32/1/2').datahex
  value3 = grp.find('32/1/3').datahex
  sixbytevaluestring = lmcore.hextostr(value1 .. value2 .. value3)
  oldvalue = grp.getvalue('1/1/1')
  if oldvalue ~= sixbytevaluestring then
    grp.write('1/1/1', sixbytevaluestring)
  end
end

This will write the (BACnet side) changed value back to your 6 byte object. Because i added event.src you can use the same 255 byte object for incomming and outgoing telegrams and avoid triggering a loop.

BR,

Erwin
Reply
#4
Ok thank you a lot, your product still has surprise ;-))

First solution (only put the variable without process on Spacelynk)
So if I understand well I could also use the 255 byte object for my 6 bytes knx object from CIAT. Then I just put it as export (for bacnet), the high level supervision could use this variable (and process it self to separate byte) ! What I don't know is when sending on knx bus, we send 256 bytes object, is it not a problem on KNX device Ciat which is waiting for a 6 bytes value ?

Second solution:
use your script then divide in 3 variable exported in bacnet
I don't understand your trick:
This will write the (BACnet side) changed value back to your 6 byte object. Because i added event.src you can use the same 255 byte object for incomming and outgoing telegrams and avoid triggering a loop.
Reply
#5
Hi,

1) No i checked this in the ETS monitor and the value is a 6 byte value like $0C $D2 $0C $D3 $0D $C2 and not like $00 $00 .. $0C $D2 $0C $D3 $0D $C2 so all unused bytes in the 255 bytes are not send at all, making it a valid value (in 222.100 format) for your 6 byte object.

2) Because you send the value from KNX to the 6 byte it will only repond to split it to 3 bytes when it's from KNX and not when comming from local source (not from spaceLYnk), when you update the 255 byte object by the write from BACnet action it normaly would split the values again and create a loop, now it doesn't (:

BR,

Erwin
Reply
#6
Cool

great,
I prefer to use the Spacelynk only as bridge without processing (for maintenance issue), and let Schneider process variable on AS automate server (used in CVC).

I have the second solution with your script as backup if it fail !!

Thank you again ! Angel
Reply
#7
Hi,

I don't think you can do it without my script, there is no way to set the string object (or any other higher then 4 byte object) directly to the AS-P by BACnet as it only supports analog and binary values.

This means you need to use the split to the 2 byte float objects in the spaceLYnk to get them in the Automation Server...

BR,

Erwin
Reply
#8
good to know...

So I will have to automate script for the 50 CIAT HVAC
cool lol
Reply
#9
If you have some specific addressing rules you only need two scripts mapped to tags
Reply
#10
you mean something like this:

ga = event.dst
value = event.getvalue()

then use adress+1 , adress +2, adress +3 for the separate byte ??

With knx->bacnet ok use tag knxBac
and for bacnet->knx use tag bacKnx (but to know the original 6 Byte address, it will be hard)
Reply
#11
Hi,

I think we can do it with a single tag for each thermostat and a smart object structure, or with a triple tag on the object like ‘SPLIT, T1, 6B’ and ‘SPLIT, T1, SP1’ so SPLIT is event, T1 defines thermostat and 6B, SP1, SP2, SP3 defines object , i think we also can merge the 2 scripts to one that way, i will check this later (:

BR,

Erwin
Reply
#12
My idea was to have 6-byte objects addressed starting from 3/1/0 and 2-byte object addressed starting from 3/2/0.

Then you can get 2-byte addresses from 6-byte address like this:
Code:
addr = event.dst
last = tonumber(addr:split('/')[3])
off = last * 3

addr1 = '3/2/' .. (off)
addr2 = '3/2/' .. (off + 1)
addr3 = '3/2/' .. (off + 2)

log(addr1, addr2, addr3)

And get 2-byte addresses and 6-byte address from 2-byte address like this:
Code:
addr = event.dst
last = tonumber(addr:split('/')[3])
off = math.floor(last / 3)

addr1 = '3/2/' .. (off * 3)
addr2 = '3/2/' .. (off * 3 + 1)
addr3 = '3/2/' .. (off * 3 + 2)

out = '3/1/' .. off

log(addr1, addr2, addr3, out)

Then you just map different tags to 2-byte and 6-byte objects and use Erwin's conversion script. It can be simplified a bit by using event.datahex instead of using getvalue/strtohex conversion.
Reply
#13
cool, great idea !

Your a genious !
I would not have this idea at all !!!

So for my script if I tag all 6byte with "knxBacnet"

and a script:

Code:
if event.src ~= 'local' then

  -- get 3 adress from 6bytes adress
  addr = event.dst
    last = tonumber(addr:split('/')[3])
    off = last * 3

    addr1 = '3/2/' .. (off)
    addr2 = '3/2/' .. (off + 1)
    addr3 = '3/2/' .. (off + 2)
    log(addr1, addr2, addr3)
    -- -----
  
  -- decode 3 value from 6bytes value
  value = event.getvalue()
  value = lmcore.strtohex(value)
  bytestable = {}
  for i = 2, #value, 2 do
    bytevalue = string.sub(value, (i-1), i)
    table.insert(bytestable, bytevalue)
  end
  value1 = knxdatatype.decode(bytestable[1] .. bytestable[2], dt.float16)
  value2 = knxdatatype.decode(bytestable[3] .. bytestable[4], dt.float16)
  value3 = knxdatatype.decode(bytestable[5] .. bytestable[6], dt.float16)
  grp.update(addr1 , value1)
  grp.update(addr2 , value2)
  grp.update(addr3, value3)
  
end

and another with tag "bacKnx"

Code:
if event.src == 'local' then

 -- get 3 adress from 2bytes adress
 addr = event.dst
    last = tonumber(addr:split('/')[3])
    off = math.floor(last / 3)

    addr1 = '3/2/' .. (off * 3)
    addr2 = '3/2/' .. (off * 3 + 1)
    addr3 = '3/2/' .. (off * 3 + 2)

    out = '3/1/' .. off
    log(addr1, addr2, addr3, out)
    -- -----

 -- encode 6 bytes value from 3x2bytes value
 value1 = grp.find(addr1).datahex
 value2 = grp.find(addr2).datahex
 value3 = grp.find(addr3).datahex
 sixbytevaluestring = lmcore.hextostr(value1 .. value2 .. value3)
 oldvalue = grp.getvalue(out)
 if oldvalue ~= sixbytevaluestring then
   grp.write(out, sixbytevaluestring)
 end
 
end


But I don't understant your point of view about the "event.datahex"

Quote:It can be simplified a bit by using event.datahex instead of using getvalue/strtohex conversion.
Reply
#14
You can replace this:
Code:
value = event.getvalue()
value = lmcore.strtohex(value)

With just this:
Code:
value = event.datahex
Reply
#15
cool,
and my script above look's right ?
Reply
#16
Yes, but remove log() calls as they are not needed.
Reply
#17
thank for helping
Reply
#18
Nice end result (:

Thanks Admin for filling in the final perfection!

BR,

Erwin
Reply
#19
Thanks both of you.
LM still is surprising after 5 year I'm using it ;-))
Reply
#20
Looks like the import from ESF file of the 6 byte doesn't process.

Do you have idea to import all of them to 256 bytes ?
Should I create another project, put known datatype object tempory to the group adress , thenimport or do you have a trick
Reply


Forum Jump: