Ring Groups and Busy Lamp Fields (BLF)

FreePBX: 13.0.163
Asterisk: 11
Phones: Grandstream GXP-2160 with newest firmware.
Trunks: Sangoma A200 card with 4 POTS lines

I’ll start by saying this is my first FreePBX deployment, so I know just enough about linux and asterisk to be dangerous.

I have a really odd edge case I need help in finalizing for a client. I have set up a FreePBX based phone system for them to replace an old proprietary key/PBX ip/analog hybrid system for which they could no longer get replacement parts.

Their old system had a specific feature I’m trying to recreate. Their old phones had BLFs (or whatever the old system might have called them) that represented what I would call a Ring Group. They have eleven phones that are in ring groups that overlap like a Venn diagram, meaning they have a phone here or there that is in multiple ring groups. All the phones had the same BLFs so you could see all the ring group status from all the phones, regardless if your phone was in that ring group.

The old system’s BLFs did all of the following:

  • You can press the BLF from an idle phone and make all the phones in that RG ring.
  • You can see the BLF blink when a call hits the RG from the outside.
  • If a call hits a particular RG to which a phone belongs and that phone happens to belong to other ring groups, only the BLF for the RG actually dialed will blink.
  • You can pickup a ringing call on any RG from any phone by just pressing the BLF.
  • You can transfer any call to any RG by using the BLF.

What I have done to recreate this function as closely as possible is this:

  • I recreated the RGs as necessary.
  • I put all the correct phones in the correct RGs.
  • I programmed the phones MPKs to have BLFs that correspond to each RG’s “extension” number.
  • I created custom hints that correspond to each RG’s “extension” number so they would a) light up and b) be useful as a transfer destination.
    • My custom hints are basically in this format, added to extensions_custom.conf
    • exten => [rgnumber],hint,SIP/[extension]&SIP/[extension]…

Unfortunately, this only gets me about 80% of the way there. This is the functionality I receive:

  • Can you press the BLF from an idle phone and make all the phones in that RG ring? - YES
  • Can you see the BLF blink when a call hits the RG from the outside? - YES
  • If a call hits a particular RG to which a phone belongs and that phone happens to belong to other ring groups, only the BLF for the RG actually dialed will blink. - NO!
  • Can you pickup a ringing call on any RG from any phone by just pressing the BLF? - YES
  • Can you transfer any call to any RG by using the BLF? - YES

Now, as far as this goes, I know why this is happening - it’s the hints. The hints make any light blink for which a specific phone is assigned. If a phone is in more than one ring group, then it blinks all those lights. Therein lies the problem: This client needs to be able to know exactly which and only which ring group the call is hitting for multiple inflexible reasons too complex to explain.

Before you begin giving possible scenarios, let me inform you of what scenarios which have been deemed unacceptable by the client or my circumstances:

  • Adding a sidecar. Of any kind. For any reason.
  • Having any sort of status console/software on their computers.
  • Retraining or changing their workflow to work around the problem.
  • Using Asterisk 13 (Asterisk 13 has what I would consider a show stopping one-way audio problem with multiple phone vendors that I won’t get into at the moment).

Here’s one way I thought of handling the problem that might work:

  • Put all the phones in all ring groups they need to monitor.
  • Use the CID Name Prefix option in each RG to prepend the RG’s name so they see it on their screen.
    This is not the best case, but the client was amenable to this as a last resort.

I usually deploy Grandstream UCM systems but had to deploy FreePBX here to get the option to use Asterisk 11 to resolve the one-way audio problem. The Grandstream UCM system does everything I want it to do with the BLFs. I have found that FreePBX is awesome-er than the Grandstream and I’m glad now I deployed it! But since the GS UCM and FreePBX are both Asterisk based, I would think I could make FreePBX do the same magic, somehow.

Does anyone have anything they can suggest to get me that other 20%? Is there conditional magic in the conf file I can write and I just don’t know how to do it? Is there a commercial module I can purchase that will just make this happen?

What is the maximum number of ring groups that an extension might be in?

Maximum number of ring groups that a phone might be in is: all of them. I have one user who needs to be able to see the caller ID of any call that comes in regardless of ring group, so that user’s extension is in every ring group.

If I might (from my own setup) suggest something marginally off-topic - using Queues instead of Ring Groups allows more than 1 incoming call to await its turn to ring the members of the queue (situation like, when 1 call rings, and another one comes in before anyone in the queue/rg answers: with rg, the second call will go to fail-over straight away; with queue, it will wait for set amount of time for next available member to pick it up)
Also you can have the said extension to be member of any (probably) number of queues (and even have them dynamically log on or off a given queue) without need of special hints;
Also if your phones can have more than 1 SIP account you could have them register multiple times and have the different SIP accounts be members of different queues - not sure how desirable would that be, however. (that would IMO be the only way to get around the NO problem, without making special hints)

Thanks for the insight. I thought I had tried queues but received the same issue - that is: I couldn’t get the BLF to light without a manually written hint. I’ll try again if I can and see if it solves the problem.

you still might /not/ achieve the display of which-queue-rang-you without manually written hint, now I think of it…
I suggested queues for handling of multiple calls incoming into same queue only… they greatly increase call receive capacity (depending a bit on how many could be incoming within short periods of time actually) and that’s just about it… they don’t create standard queue status hints, as far as I looked into my setup;
It /would/ however let you dial the ‘queue number’ button (hence let you configure the queue entry button as speed-dial) and that /will/ ring all the members; which the ring group… I don’t remember now - but I think was NOT capable of.

Thanks. I looked into Queues today and a) I had to create a custom hint for the queue to get the BLF to light at all, b) the button doesn’t blink when a call hits the queue and c) If I hit the button to pick up a call for any queue, it won’t pick up the queue, it will just dump me into the queue instead.

So… queues are worse basically, by default anyway.

(the hint I made to make the button light up is like this
exten => 6500,hint,Queue:qOperator
)

I could have made a hint with each extension of course, but that would just do the same thing I’m getting now.

I’m assuming this isn’t really possible, because a Ring Group is really just a string with a set of phones in it instead of a separate instantiated object (think object oriented programming). Anyone know in what configuration file ring groups are stored? I’m having trouble finding it.

Since my original post is basically TL;DR, I’ll reiterate quickly what I’m trying to achieve for other readers of this post.

  1. I have created a Ring Group.
  2. I want to assign a BLF on a phone that shows the free/in-use/ringing status of the Ring Group.
  3. I want to press the BLF from an idle phone and make all the phones in that RG ring.
  4. I want to see the BLF blink when a call hits the RG from the outside and if and only if the RG is hit. (Not when someone dials an extension that is in the RG. Not when another RG is dialed that has a member that is also in this RG. Blink if and only if the intended RG is dialed.)
  5. I want to pick up a ringing call on any RG from any phone by just pressing the BLF while the RG is ringing.
  6. I want to transfer any call to any RG by simply pressing Transfer+BLF.

I lack the knowledge required to even properly research how to do this. I don’t know what magic to search for other than “ring group blf”.

(…)
2. I don’t know how to do that (other than having a custom hint)
3. if you used a queue, you could just speed-dial to it (since it has a number) - your blf buttons if configured for ‘idle’ should just dial the number.
3a. actually if you have your RG assigned with a numerical ID, just dial that number to have them all ring… I reminded myself, I did have that working.
4. that I don’t know if is possible, whether in rg or queue, without multiple phone accounts.
(and even with custom hints, I think not)
5. you can configure phones to subscribe to other extensions’ hints and that will show you they are ringing (without distinction per ring group though) and pressing that BLF button you should be able to pick it up (S500’s can, others may need to have pickup code entered - by default ** I think)
6. I know this works with my queue, attended or blind, I think it should work with rg if it has a numerical ID.

(I should mention, my setup runs in D&U mode - so has 3 tiers rather than 2: incoming calls go to queue, that rings the User ID’s, these in turn ring the ‘devices’ ID’s). Not sure how relevant would that be though, I doubt it.)

(In Reports -> Asterisk Info -> Subscriptions you have a list of hints, maybe that could help?)