Posts: 267 
	Threads: 39 
	Joined: Feb 2016
	
 Reputation: 
 1
	 
 
	
		
		
		27.09.2017, 10:15 
(This post was last modified: 27.09.2017, 10:19 by domotiqa.)
		
	 
	
		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
	 
	
	
----------- 
FRANCE SMARTHOME & SMARTBUILDING INTEGRATION 
SE ECO EXPERT
 
	
		
	 
 
 
	
	
	
		
	Posts: 267 
	Threads: 39 
	Joined: Feb 2016
	
 Reputation: 
 1
	 
 
	
	
		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....
	  
	
	
----------- 
FRANCE SMARTHOME & SMARTBUILDING INTEGRATION 
SE ECO EXPERT
 
	
		
	 
 
 
	
	
	
		
	Posts: 1807 
	Threads: 7 
	Joined: Jul 2015
	
 Reputation: 
 121
	 
 
	
		
		
		27.09.2017, 18:02 
(This post was last modified: 27.09.2017, 20:53 by Erwin van der Zwart.)
		
	 
	
		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
	  
	
	
	
		
	 
 
 
	
	
	
		
	Posts: 267 
	Threads: 39 
	Joined: Feb 2016
	
 Reputation: 
 1
	 
 
	
	
		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.
	 
	
	
----------- 
FRANCE SMARTHOME & SMARTBUILDING INTEGRATION 
SE ECO EXPERT
 
	
		
	 
 
 
	
	
	
		
	Posts: 1807 
	Threads: 7 
	Joined: Jul 2015
	
 Reputation: 
 121
	 
 
	
		
		
		28.09.2017, 10:50 
(This post was last modified: 28.09.2017, 10:51 by Erwin van der Zwart.)
		
	 
	
		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
	 
	
	
	
		
	 
 
 
	
	
	
		
	Posts: 267 
	Threads: 39 
	Joined: Feb 2016
	
 Reputation: 
 1
	 
 
	
		
		
		28.09.2017, 11:20 
(This post was last modified: 28.09.2017, 11:20 by domotiqa.)
		
	 
	
		  
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 !   
	 
	
	
----------- 
FRANCE SMARTHOME & SMARTBUILDING INTEGRATION 
SE ECO EXPERT
 
	
		
	 
 
 
	
	
	
		
	Posts: 1807 
	Threads: 7 
	Joined: Jul 2015
	
 Reputation: 
 121
	 
 
	
		
		
		28.09.2017, 17:55 
(This post was last modified: 28.09.2017, 17:56 by Erwin van der Zwart.)
		
	 
	
		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
	 
	
	
	
		
	 
 
 
	
	
	
		
	Posts: 267 
	Threads: 39 
	Joined: Feb 2016
	
 Reputation: 
 1
	 
 
	
	
		good to know... 
 
So I will have to automate script for the 50 CIAT HVAC 
cool lol
	 
	
	
----------- 
FRANCE SMARTHOME & SMARTBUILDING INTEGRATION 
SE ECO EXPERT
 
	
		
	 
 
 
	
	
	
		
	Posts: 8422 
	Threads: 45 
	Joined: Jun 2015
	
 Reputation: 
 481
	 
 
	
	
		If you have some specific addressing rules you only need two scripts mapped to tags
	 
	
	
	
		
	 
 
 
	
	
	
		
	Posts: 267 
	Threads: 39 
	Joined: Feb 2016
	
 Reputation: 
 1
	 
 
	
	
		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)
	 
	
	
----------- 
FRANCE SMARTHOME & SMARTBUILDING INTEGRATION 
SE ECO EXPERT
 
	
		
	 
 
 
	
	
	
		
	Posts: 1807 
	Threads: 7 
	Joined: Jul 2015
	
 Reputation: 
 121
	 
 
	
		
		
		29.09.2017, 06:16 
(This post was last modified: 29.09.2017, 06:32 by Erwin van der Zwart.)
		
	 
	
		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
	 
	
	
	
		
	 
 
 
	
	
	
		
	Posts: 8422 
	Threads: 45 
	Joined: Jun 2015
	
 Reputation: 
 481
	 
 
	
	
		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.
	  
	
	
	
		
	 
 
 
	
	
	
		
	Posts: 267 
	Threads: 39 
	Joined: Feb 2016
	
 Reputation: 
 1
	 
 
	
	
		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. 
	 
	
	
----------- 
FRANCE SMARTHOME & SMARTBUILDING INTEGRATION 
SE ECO EXPERT
 
	
		
	 
 
 
	
	
	
		
	Posts: 8422 
	Threads: 45 
	Joined: Jun 2015
	
 Reputation: 
 481
	 
 
	
	
		You can replace this: 
Code: value = event.getvalue() 
value = lmcore.strtohex(value)
 
With just this:
 Code: value = event.datahex
  
	 
	
	
	
		
	 
 
 
	
	
	
		
	Posts: 267 
	Threads: 39 
	Joined: Feb 2016
	
 Reputation: 
 1
	 
 
	
	
		cool, 
and my script above look's right ?
	 
	
	
----------- 
FRANCE SMARTHOME & SMARTBUILDING INTEGRATION 
SE ECO EXPERT
 
	
		
	 
 
 
	
	
	
		
	Posts: 8422 
	Threads: 45 
	Joined: Jun 2015
	
 Reputation: 
 481
	 
 
	
	
		Yes, but remove log() calls as they are not needed.
	 
	
	
	
		
	 
 
 
	
	
	
		
	Posts: 267 
	Threads: 39 
	Joined: Feb 2016
	
 Reputation: 
 1
	 
 
	
	
		thank for helping
	 
	
	
----------- 
FRANCE SMARTHOME & SMARTBUILDING INTEGRATION 
SE ECO EXPERT
 
	
		
	 
 
 
	
	
	
		
	Posts: 1807 
	Threads: 7 
	Joined: Jul 2015
	
 Reputation: 
 121
	 
 
	
		
		
		29.09.2017, 19:39 
(This post was last modified: 29.09.2017, 19:39 by Erwin van der Zwart.)
		
	 
	
		Nice end result (: 
 
Thanks Admin for filling in the final perfection! 
 
BR, 
 
Erwin
	 
	
	
	
		
	 
 
 
	
	
	
		
	Posts: 267 
	Threads: 39 
	Joined: Feb 2016
	
 Reputation: 
 1
	 
 
	
	
		Thanks both of you. 
LM still is surprising after 5 year I'm using it ;-))
	 
	
	
----------- 
FRANCE SMARTHOME & SMARTBUILDING INTEGRATION 
SE ECO EXPERT
 
	
		
	 
 
 
	
	
	
		
	Posts: 267 
	Threads: 39 
	Joined: Feb 2016
	
 Reputation: 
 1
	 
 
	
	
		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
	 
	
	
----------- 
FRANCE SMARTHOME & SMARTBUILDING INTEGRATION 
SE ECO EXPERT
 
	
		
	 
 
 
	 
 |