Alternative source selection on Halo - BLI combination

5 replies
Alternative for choosing sources on a Halo by using one Button and the Wheel_turned. Select device by turning the wheel anti-clockwise Select the source by turning the wheel clockwise Press twice the button to select/confirm the selection. Two macros are needed; one for the event “Wheel_turned” the other for “Button_pressed” for the same Halo button. The matrices in both Macros must exactly the same.
  • Macro 1.
Event: Wheel_turned for a Halo Button (with “your_Halo_button_IDnumber”) function(event, engine) local Ea=event.area() local Ez=event.zone() --Resource selectButton as String local selectButton_query = engine.query(Ea.."/"..Ez.."/VARIABLE/selectButton") local sButton = selectButton_query[1].get_string("VALUE") --Resource SourceNo as Integer local source_query=engine.query(Ea.."/"..Ez.."/VARIABLE/SourceNo") local sourceNr = source_query[1].get_number("VALUE") if sourceNr==nil then sourceNr=1 end local device_query=engine.query("Upstairs/Study/VARIABLE/DeviceNo") local deviceNr = device_query[1].get_number("VALUE") if deviceNr==nil then deviceNr=1 end if deviceNr==0 then deviceNr=1 end local haloName=“you”r_Halo_name_as_string local haloID=“your_Halo_button_IDnumber_as_string” local direction local device local deviceName local deviceMax=5 --set to number of devices programmed local source local sourceMax=14 --set to number of sources programmed local sourceName local sourceID local info local bs9000cd local a={i=sourceMax, j=4} local b={x=deviceMax, y=4} --{"Halo source name", source, origin, x} below are examples change to your system a[0]={"exit","exit","",0} a[1]={"A6 Music","MUSIC", "255aaaaa”,0} a[2]={"A6 TuneIN","TUNEIN", "255aaaaa”,0} a[3]={"BS3000 cd","CD", "240bbbbb”,0} a[4]={"Beogram 4000","LINE IN", "240bbbbb",0} a[5]={"BS7000 cd","CD", "272ccccc"} a[6]={"BS7000 ph","NET RADIO", "272ccccc",0} a[7]={"BeoCenter2cd","CD", "231ddddd",0} a[8]={"BS9000-cd1","CD", "238eeeee",1} a[9]={"BS9000-cd2","CD", "238eeeee",2} a[10]={"BS9000-cd3","CD", "238eeeee",3} a[11]={"BS9000-cd4","CD", "238eeeee",4} a[12]={"BS9000-cd5","CD", "238eeeee",5} a[13]={"BS9000-cd6","CD", "238eeeee",6} a[14]={"BS5 Encore","LINE IN", "238eeeee",0} -- x = cd nummer in case of BS9000 (BLC must be set as ASlave); --{"Device Name", Name on Halo, Area, Zone} note: device areas and device zones are as defined in the BLI b[1]={"BeoPlay A6", "BeoPlay A6”,”your_device_Area”, ”your_device_Zone”} b[2]={"BeoSound 35", "BeoSound 35","your_device_Area","your_device_Zone"} b[3]={"BS Essence - Bath", "BS Essence Bath","your_device_Area","your_device_Zone"} b[4]={"BS Essence - Bed", "BS Essence Bed","your_device_Area","your_device_Zone"} b[5]={"BeoSound Shape", "BS Shape","your_device_Area","your_device_Zone"}   if event.parameters()["OFFSET"] then if tonumber(event.parameters()["OFFSET"])>=1 then direction= true else direction=false end if direction then sourceNr = sourceNr + 1 if sourceNr==sourceMax+1 then sourceNr=0 end if sourceNr==0 then sourceName=a[sourceNr][1] engine.fire(Ea.."/"..Ez.."/VARIABLE/selectButton/SET?VALUE=exitS") else engine.fire(Ea.."/"..Ez.."/VARIABLE/selectButton/SET?VALUE=startS") sourceName=a[sourceNr][1] source=a[sourceNr][2] sourceID=a[sourceNr][3] end info=b[deviceNr][2] engine.fire(Ea.."/"..Ez.."/VARIABLE/SourceNo/SET?VALUE="..tostring(sourceNr)) engine.fire(Ea.."/"..Ez.."/Halo remote/"..haloName.."/SET_TITLE?BUTTON="..haloID.."&TITLE="..tostring(sourceName)) engine.fire(Ea.."/"..Ez.."/Halo remote/"..haloName.."/SET_SUBTITLE?BUTTON="..haloID.."&SUBTITLE="..tostring(info)) engine.fire(Ea.."/"..Ez.."/Halo remote/"..haloName.."/SET_WHEEL_VALUE?BUTTON="..haloID.."&VALUE="..tostring(math.floor(sourceNr*100/sourceMax))) else deviceNr = deviceNr + 1 if deviceNr==deviceMax+1 then deviceNr=1 end device=b[deviceNr][1] deviceName=b[deviceNr][2] info=a[sourceNr][1] engine.fire(Ea.."/"..Ez.."/VARIABLE/DeviceNo/SET?VALUE="..tostring(deviceNr)) engine.fire(Ea.."/"..Ez.."/Halo remote/"..haloName.."/SET_TITLE?BUTTON="..haloID.."&TITLE="..tostring(deviceName)) engine.fire(Ea.."/"..Ez.."/Halo remote/"..haloName.."/SET_SUBTITLE?BUTTON="..haloID.."&SUBTITLE="..tostring(info)) engine.fire(Ea.."/"..Ez.."/Halo remote/"..haloName.."/SET_WHEEL_VALUE?BUTTON="..haloID.."&VALUE="..tostring(math.floor(deviceNr*100/deviceMax))) end end end
  • Macro 2
Event: Button_pressed for the same Halo Button function(event, engine) local Ea=event.area() local Ez=event.zone() --Resource selectButton as String local selectButton_query = engine.query(Ea.."/"..Ez.."/VARIABLE/selectButton") local sButton = selectButton_query[1].get_string("VALUE") --Resource SourceNo as Integer local sourcenr_query=engine.query(Ea.."/"..Ez.."/VARIABLE/SourceNo") local sourceNr = sourcenr_query[1].get_number("VALUE") if sourceNr==nil then sourceNr=1 end local devicenr_query=engine.query("Upstairs/Study/VARIABLE/DeviceNo") local deviceNr = devicenr_query[1].get_number("VALUE") if deviceNr==nil then deviceNr=1 end if deviceNr==0 then deviceNr=1 end local device local deviceName local Da local Dz local source local sourceMax=14 --set to number of sources programmed local deviceMax=5. --set to number of devices programmed local sourceName local info local bs9000cd local a={i=sourceMax, j=4} local b={x=deviceMax, y=4} local haloName=“you”r_Halo_name_as_string local haloID=“your_Halo_button_IDnumber_as_string” local tst --{"Halo source name", source, origin, x} below are examples change to your system a[0]={"exit","exit","",0} a[1]={"A6 Music","MUSIC", "255aaaaa”,0} a[2]={"A6 TuneIN","TUNEIN", "255aaaaa”,0} a[3]={"BS3000 cd","CD", "240bbbbb”,0} a[4]={"Beogram 4000","LINE IN", "240bbbbb",0} a[5]={"BS7000 cd","CD", "272ccccc"} a[6]={"BS7000 ph","NET RADIO", "272ccccc",0} a[7]={"BeoCenter2cd","CD", "231ddddd",0} a[8]={"BS9000-cd1","CD", "238eeeee",1} a[9]={"BS9000-cd2","CD", "238eeeee",2} a[10]={"BS9000-cd3","CD", "238eeeee",3} a[11]={"BS9000-cd4","CD", "238eeeee",4} a[12]={"BS9000-cd5","CD", "238eeeee",5} a[13]={"BS9000-cd6","CD", "238eeeee",6} a[14]={"BS5 Encore","LINE IN", "238eeeee",0} -- x = cd nummer in case of BS9000 (BLC must be set as ASlave); --{"Device Name", Name on Halo, Area, Zone} note: device areas and device zones are as defined in the BLI b[1]={"BeoPlay A6", "BeoPlay A6”,”your_device_Area”, ”your_device_Zone”} b[2]={"BeoSound 35", "BeoSound 35","your_device_Area","your_device_Zone"} b[3]={"BS Essence - Bath", "BS Essence Bath","your_device_Area","your_device_Zone"} b[4]={"BS Essence - Bed", "BS Essence Bed","your_device_Area","your_device_Zone"} b[5]={"BeoSound Shape", "BS Shape","your_device_Area","your_device_Zone"} if sButton=="exitS" then goto exit else if sButton=="playS" then Da=b[deviceNr][3] Dz=b[deviceNr][4] device=b[deviceNr][1] deviceName=b[deviceNr][2] sourceID=a[sourceNr][3] source=a[sourceNr][2] nr=a[sourceNr][4] bs9000cd=sourceID..source -- ID Cd of BS9000 tst=Da.."/"..Dz.."/AV renderer/"..device.."/Select source?Connector=&Origin="..sourceID.."&Source Type="..source engine.fire(Ea.."/"..Ez.."/Halo remote/"..haloName.."/SET_TITLE?BUTTON="..haloID.."&TITLE="..tostring(deviceName)) engine.fire(Ea.."/"..Ez.."/Halo remote/"..haloName.."/SET_SUBTITLE?BUTTON="..haloID.."&SUBTITLE="..tostring(source)) engine.fire(tst) - the “origin” of the BS9000 BLC must be set in line below correctly (note BLC programmed as ASlave) if bs9000cd=="238eeeeeCD” then engine.fire("*/*/AV renderer/BS9000 BLC/Send digit?Digit="..tostring(nr)) end sButton="exitS" else deviceName=b[deviceNr][2] sourceName=a[sourceNr][1] engine.fire(Ea.."/"..Ez.."/VARIABLE/selectButton/SET?VALUE=playS") engine.fire(Ea.."/"..Ez.."/Halo remote/"..haloName.."/SET_TITLE?BUTTON="..haloID.."&TITLE="..tostring(deviceName)) engine.fire(Ea.."/"..Ez.."/Halo remote/"..haloName.."/SET_SUBTITLE?BUTTON="..haloID.."&SUBTITLE="..tostring(sourceName)) end end ::exit:: if sButton=="exitS" then sourceName="B&o Sources" engine.fire(Ea.."/"..Ez.."/Halo remote/"..haloName.."/SET_TITLE?BUTTON="..haloID.."&TITLE="..tostring(sourceName)) info="Turn to Select" engine.fire(Ea.."/"..Ez.."/Halo remote/"..haloName.."/SET_SUBTITLE?BUTTON="..haloID.."&SUBTITLE="..tostring(info)) engine.fire(Ea.."/"..Ez.."/VARIABLE/selectButton/SET?VALUE=startS") end end
for the interested......... I got similar Macros for Link/Join devices and for setting devices to Standby. Let it know and I will make them accessible.
Amazing stuff Carolpa! Damn I had to postpone BLI acquisition for couple of months, so envious about all cool things you can do with the Halo now. :) Mine still in cupboard waiting for the installation. :/
Trying to find more info on macros. I had no idea it was programmable. Would someone please direct me to more info on this?
you need:
  1. Beoliving blackbox + sw upgrade to Pro (see website of Khimo)
  2. Halo (of course)
this will open doors to extended home automation
or
BeoWorld Gold Membership card
Join BeoWorld

Register to access the forums, reference material, and exclusive member benefits — including our monthly prize draw.

Become a Member

December 2026 Prize Draw

Gold Members Only

As a Gold member you're automatically entered into our exclusive prize draw — your chance to win iconic Bang & Olufsen products. A unique benefit of BeoWorld Gold membership, every draw brings a new opportunity to win something special.

BeoSound Level

1st Prize

BeoConnect Core

2nd Prize

BeoRemote Halo

3rd Prize