24.10.2016, 19:09
Hi
I've a visualisation with 157 unique bulbs in one sheet (one big hall). Every single bulb is switchable and dimable individually. On the opposite side there's a "Whole hall on-off" button for the whole hall. These are a requests.
I use 6 Jung DALIs module for controlling the hall lights.
Showed that it's not possible to transfer 157 feedbacks via KNX. Therefore I used DALI's "cumulative feedback". Cumulative feedback is a feedback which sends state of every lamp encoded into byte value. Which means instead of 64 feedbacks per 1 DALI I get only 4 cumulative feedbacks.
On LM side I decode this byte value by bit.lshift() etc. Then I "fake" original switching and brightness feedbacks (using grp.update).
The problem I'm fighting with is I lost some of "faked" feedbacks. Probably for two reasons:
1. I send plenty of changes in a small time. Maybe there's some buffer which gets full? (I changed "Maximum telegrams in queue" parameter in settings to 1000 but it hasn't helped).
2. Events are processed asynchronously not in order they arrive. From time to time I get 2 datagrams from one DALI because DALI is too slow. The first is 00FF (8 bulbs are off and 8 are on). The second is FFFF (which is correct, all 16 bulbs are on). But in LM these two changes are sometimes processed in reverted order. Maybe because the script is too complex. My opinion is grp.getvalue and grp.update are too slow.
So the questions are:
Can I switch object changes processing somehow from paralel to serial with correct time order?
Can I show a global value or a result of a function in visualisation directly without mapping to group object?
Is there anybody who solved this or similar problem?
LM4,firmware from 2016/07/14
Thank you for any idea
FYI my DALI decode function:
I've a visualisation with 157 unique bulbs in one sheet (one big hall). Every single bulb is switchable and dimable individually. On the opposite side there's a "Whole hall on-off" button for the whole hall. These are a requests.
I use 6 Jung DALIs module for controlling the hall lights.
Showed that it's not possible to transfer 157 feedbacks via KNX. Therefore I used DALI's "cumulative feedback". Cumulative feedback is a feedback which sends state of every lamp encoded into byte value. Which means instead of 64 feedbacks per 1 DALI I get only 4 cumulative feedbacks.
On LM side I decode this byte value by bit.lshift() etc. Then I "fake" original switching and brightness feedbacks (using grp.update).
The problem I'm fighting with is I lost some of "faked" feedbacks. Probably for two reasons:
1. I send plenty of changes in a small time. Maybe there's some buffer which gets full? (I changed "Maximum telegrams in queue" parameter in settings to 1000 but it hasn't helped).
2. Events are processed asynchronously not in order they arrive. From time to time I get 2 datagrams from one DALI because DALI is too slow. The first is 00FF (8 bulbs are off and 8 are on). The second is FFFF (which is correct, all 16 bulbs are on). But in LM these two changes are sometimes processed in reverted order. Maybe because the script is too complex. My opinion is grp.getvalue and grp.update are too slow.
So the questions are:
Can I switch object changes processing somehow from paralel to serial with correct time order?
Can I show a global value or a result of a function in visualisation directly without mapping to group object?
Is there anybody who solved this or similar problem?
LM4,firmware from 2016/07/14
Thank you for any idea
FYI my DALI decode function:
Code:
function ecl_fake_on_off_feedbacks(ll_hall_adr_1,ll_dali_nr,ll_event_nr,ll_hex_val)
-- function sends fake feedbacks from collective on-off feedback
-- ll_hall_adr_1 = 1st number of Group Address
-- ll_dali_nr = Number of Dali - Must correspond to Dali table below
-- ll_event_nr = Nr. of Event. Every Dali sends 4 events (1-16,17-32,33-48,49-64)
-- ll_hex_val = Group address value taken from Object
local ll_on_off
local lb_on_off
local ll_addr
local ls_fulladdr
local ll_end
local lb_changed
local dali={
{
{ 1,2,3,4,13,14,15,16,25,26,27,28,37,38,39,40} -- D1 ev 1
,
{ 49,50,51,52,61,64,62,63,73,74,75,76,85,86,87,88 } -- D1 ev 2
,
{97,98,99,100,109,110,111,112} -- D1 ev 3
,
{} -- D1 ev 4
},
{
{ 5,6,7,8,17,18,29,20,29,30,31,32,41,42,43,44} -- D2 ev 1
,
{ 53,54,55,56,65,66,67,68,77,78,79,80,89,90,91,92 } -- D2 ev 2
,
{101,102,103,104,113,114,115,116} -- D2 ev 3
,
{} -- D2 ev 4
},
{
{ 9,10,11,12,21,22,23,24,33,34,35,36,45,46,47,48} -- D3 ev 1
,
{ 57,58,59,60,69,70,71,72,81,82,83,84,93,94,95,96 } -- D3 ev 2
,
{105,106,107,108,117,118,119,120} -- D3 ev 3
,
{} -- D3 ev 4
}
}
if (dali[ll_dali_nr] == nil) then
log("Dali "..ll_dali_nr.." has no record in Dali table")
return
end
if (dali[ll_dali_nr][ll_event_nr] == nil) then
log("Dali "..ll_dali_nr.." Event "..ll_event_nr.." has no record in Dali table")
return
end
ll_end=table.maxn(dali[ll_dali_nr][ll_event_nr])
for i = 1,ll_end , 1 do
ll_on_off=bit.band(ll_hex_val,1)
lb_on_off=toboolean(ll_on_off)
ll_addr=dali[ll_dali_nr][ll_event_nr][i]
ls_fulladdr=ll_hall_adr_1.."/1/"..ll_addr
ls_fulladdr_brightness_fb=ll_hall_adr_1.."/3/"..ll_addr
lb_changed=ecl_update_changed(ls_fulladdr,lb_on_off)
if (lb_on_off) then
if (lb_changed) then
-- we must really read the value
grp.read(ls_fulladdr_brightness_fb)
-- ecl_update_changed(ls_fulladdr_brightness_fb,100)
end
else
-- switched off - brightness = always zero
ecl_update_changed(ls_fulladdr_brightness_fb,0)
end
ll_hex_val=bit.rshift(ll_hex_val,1)
end
end
function ecl_update_changed(ls_addr,la_val)
local la_test =grp.getvalue(ls_addr)
if (not (la_test == la_val)) then
grp.update(ls_addr,la_val)
return true
end
return false
end
LM5Lp, firmware: 2018.08.22 and 2021.12.15, FlashSYS v2, ARMv7 Processor rev 5 (v7l), kernel 4.4.151 and 4.4.259