Versión mejorada del mensaje “all circuits are busy” de Elastix (v3)

31 May

Este código se encuentra desactualizado. Hay una versión más reciente disponible en http://asteriskmx.com/2013/04/version-mejorada-del-mensaje-all-circuits-are-busy-de-elastix-v4/

En muchas ocasiones hemos oido el mensaje de “all circuits are busy” (“todos los circuitos se encuentran ocupados” si es que tenemos los sonidos en Español) de Elastix. El problema con este mensaje es que es reproducido ante cualquier falla de nuestro enlace. Esto incluye a números que no existen, números desconectados y cualquier otra causa de error que no siempre es culpa de nuestro conmutador, pero que el usuario final siempre le achaca al sistema que le configuramos.

Con la intención de abrir un poco el panorama y dar más información sobre la causa del error, escribí este código para ayudar a distinguir cual es la verdadera causa del problema. Para ello, es necesario modificar 2 archivos, dentro de /etc/asterisk

// Archivo extensions.ael
macro outmessage(HC) {
        switch(${HC}) {
                case 1:         // Unnalocated or unnasigned number
                                // El numero que marco no existe
                        Set(MSG=no-existe);
                        break;
                case 17:        // User is busy
                                // Tono ocupado
                        Busy;
                        break;
                case 20:        // Subscriber absent
                                // El número celular que usted marcó no está disponible o se encuentra fuera del area
                        Set(MSG=numero-celular-no-disponible);
                        break;
                case 28:        // Address incomplete
                                // Numero mal marcado
                        Set(MSG=cannot-complete-as-dialed&check-number-dial-again);
                        break;
                case 27:        // Destination out of order
                case 38:        // Network out of order
                        // El telefono que marco esta fuera de servicio
                        // El telefono que marco esta descolgado o en reparacion
                        Set(MSG=fuera-servicio);
                        break;
                case 41:        // Temporary failure
                                // Falla temporal en la red
                        Set(MSG=falla-red);
                        break;
                case 42:        // Switching equipment congestion
                                // Congestion por alta cantidad de trafico en la central
                        Set(MSG=alto-trafico);
                        break;
                case 102:       // Recovery timer expired
                                // No se obtuvo una respuesta de la central telefónica
                        Set(MSG=no-respuesta);
                        break;
                case 34:        // Todos los circuitos están ocupados
                default:
                        Set(MSG=all-circuits-busy-now&pls-try-call-later);
        };
        Playback(${MSG},noanswer);
        &hangupcall();
};
; Archivo extensions_override_freepbx.conf
[macro-outisbusy]
exten => s,1,Progress
exten => s,n,Macro(outmessage,${HANGUPCAUSE})

Con estas modificaciones, necesitamos ejecutar dos comandos dentro del *CLI:

ael reload
extensions reload

Y por último, necesitamos extraer el contenido del siguiente archivo de sonidos dentro de la carpeta /var/lib/asterisk/sounds

Con esto, Elastix nos dará un poco más de información indicándonos los siguientes casos:

  1. El número no existe
  2. El número está fuera de servicio o en reparación

Para todos los demás problemas, se entregará el default de “todos los circuitos se encuentran ocupados”

Conforme consiga más grabaciones para diferentes casos, incluiré más códigos de error dentro de este código, a manera de poder diferenciar mejor cada error. Desde la siguiente liga pueden descargar los Sonidos para mejorar el mensaje de error de Elastix

Christian Cabrera

Soy un ingenieron en comunicaciones con especial interés en el área de voz sobre IP y tecnologías sobre información. He usado Asterisk de manera diaria desde hace más de 12 años.En el 2011 co-fundé Enlaza Comunicaciones, una empresa que se especializa en brindar servicios profesionales de consultoría sobre voz sobre IP basadas en Asterisk.

  • Sarasa

    Excelente, esto es muy util, a la espera de mas audios.

    • Hola Sarasa,

      De hecho, tengo un audio más que es el que dice “El número que usted marcó está descolgado o en reparación, no es necesario que lo reporte”, que normalmente es el que Telmex entrega para el CC 27. Al probarlo desde casa se escucha la grabación que comento, pero desde la oficina (que es de donde puedo grabarlo), se escucha el mismo mensaje que en el CC 38, así que tuve que repetirlos.

      Si conoces alguna otra grabación adecuada para algún CC en particular, házmela llegar y con gusto la incluyo.

      Saludos,

  • Víctor

    Exactamente lo mismo que me pasa a mi (y me estaba volviendo loco) 🙂

    Lo malo es que he probado la solución y no me funciona. Me aparece esto en el log de asterisk:

    WARNING[5713] app_macro.c: No such context ‘macro-outmessage’
    for macro ‘outmessage’

    ¿A que puede ser debido esto?

    Gracias por adelantado 😉

    • Victor,

      Recuerda que el macro outmessage lo definí en el extensions.ael. Por lo tanto, hay que hacer un ael reload para que sea válido.

      Asegúrate que el contexto exista dentro del archivo extensions.ael, de lo contario, algo está haciéndose mal.

      Saludos,

      • Víctor

        Hola de nuevo Christian:

        Ante todo gracias por responder 🙂

        Como soy algo novato en asterisk no he conseguido determinar cual es la manera correcta de asegurarme de que exista un contexto en el extensions.ael 🙁

        Pero como soy tan cabezón como novato he ido leyendo y leyendo y buscando y buscando y no he parado hasta encontrar una solución implementando lo mismo pero en el extensions_override_freepbx.conf:

        [macro-outisbusy]
        include => macro-outisbusy-custom
        exten => s,1,Progress
        exten => s,n,GotoIf($[“${EMERGENCYROUTE}” = “YES”]?emergency,1)
        exten => s,n,GotoIf($[“${INTRACOMPANYROUTE}” = “YES”]?intracompany,1)
        exten => s,n,GotoIf($[“${HANGUPCAUSE}” = “1”]?numeroInesistente,1)
        exten => s,n,Playback(all-circuits-busy-now&pls-try-call-later, noanswer)
        exten => s,n,Congestion(20)
        exten => s,n,Hangup
        exten => numeroInesistente,1,Playback(noexiste, noanswer)
        exten => numeroInesistente,n,Congestion(20)
        exten => numeroInesistente,n,Hangup
        exten => intracompany,1,Playback(all-circuits-busy-now&pls-try-call-later, noanswer)
        exten => intracompany,n,Congestion(20)
        exten => intracompany,n,Hangup
        exten => emergency,1,Playback(all-circuits-busy-now&pls-try-call-later)
        exten => emergency,n,Congestion(20)
        exten => emergency,n,Hangup

        Esto si que me ha funcionado 🙂

        Me quedo eso si con la duda de como invocar con éxito a una macro en AEL desde el extensions.conf :_(

        Saludos 😉

        • Hector Aguirre

          Saludos Victor:
          Tengo un problema porque aunque modifiqué los archivos, no funcionan los comandos:  ael, la respuesta es  reload ael reload’ failed.
          extensions reload, la respues es :No such command ‘extensions reload’
          Ya  confirmé ‘autoload=yes’ in /etc/asterisk/modules.conf.

          • Marco Zink

            Qué versión de Asterisk tienes? A partir de la 1.6 el extensions reload cambió por dialplan reload.

          • Hector Aguirre

            Muchas gracias Marco por contestar:
            La versión de asterisk es 1.6.2.13 release 0
            La versión de Elastix es  2.2.0 release 11

            El error reportado en el log es:

            Feb 23 10:03:20
            NOTICE
            [29012] pbx_ael.c:

            Starting AEL load process.

             
             
             

            [Feb 23 10:03:20] ERROR[29012] ael.y: ==== File: /etc/asterisk/extensions.ael, Line 456, Cols: 1-5: Error: syntax error, unexpected ‘macro’

             
             
             

            [Feb 23 10:03:20] ERROR[29012] ael.flex: File=/etc/asterisk/extensions.ael, line=460, column=45: Mismatched ‘)’ in expression!

             
             
             

            [Feb 23 10:03:20] ERROR[29012] ael.y: ==== File: /etc/asterisk/extensions.ael, Line 461, Cols: 25-29: Error: syntax error, unexpected ‘break’

             
             
             

            [Feb 23 10:03:20] ERROR[29012] ael.flex: File=/etc/asterisk/extensions.ael, line=468, column=64: Mismatched ‘)’ in expression!

             
             
             

            [Feb 23 10:03:20] ERROR[29012] ael.y: ==== File: /etc/asterisk/extensions.ael, Line 469, Cols: 25-29: Error: syntax error, unexpected ‘break’

             
             
             

            [Feb 23 10:03:20] ERROR[29012] ael.flex: File=/etc/asterisk/extensions.ael, line=472, column=85: Mismatched ‘)’ in expression!

             
             
             

            [Feb 23 10:03:20] ERROR[29012] ael.y: ==== File: /etc/asterisk/extensions.ael, Line 473, Cols: 25-29: Error: syntax error, unexpected ‘break’

             
             
             

            [Feb 23 10:03:20] ERROR[29012] ael.flex: File=/etc/asterisk/extensions.ael, line=478, column=50: Mismatched ‘)’ in expression!

             
             
             

            [Feb 23 10:03:20] ERROR[29012] ael.y: ==== File: /etc/asterisk/extensions.ael, Line 479, Cols: 25-29: Error: syntax error, unexpected ‘break’

             
             
             

            [Feb 23 10:03:20] ERROR[29012] ael.flex: File=/etc/asterisk/extensions.ael, line=482, column=45: Mismatched ‘)’ in expression!

             
             
             

            [Feb 23 10:03:20] ERROR[29012] ael.y: ==== File: /etc/asterisk/extensions.ael, Line 483, Cols: 25-29: Error: syntax error, unexpected ‘break’

             
             
             

            [Feb 23 10:03:20] ERROR[29012] ael.flex: File=/etc/asterisk/extensions.ael, line=486, column=48: Mismatched ‘)’ in expression!

             
             
             

            [Feb 23 10:03:20] ERROR[29012] ael.y: ==== File: /etc/asterisk/extensions.ael, Line 487, Cols: 25-29: Error: syntax error, unexpected ‘break’

             
             
             

            [Feb 23 10:03:20] ERROR[29012] ael.flex: File=/etc/asterisk/extensions.ael, line=490, column=48: Mismatched ‘)’ in expression!

             
             
             

            [Feb 23 10:03:20] ERROR[29012] ael.y: ==== File: /etc/asterisk/extensions.ael, Line 491, Cols: 25-29: Error: syntax error, unexpected ‘break’

             
             
             

            [Feb 23 10:03:20] ERROR[29012] ael.flex: File=/etc/asterisk/extensions.ael, line=494, column=76: Mismatched ‘)’ in expression!

             
             
             

            [Feb 23 10:03:20] ERROR[29012] ael.y: ==== File: /etc/asterisk/extensions.ael, Line 496, Cols: 9-17: Error: syntax error, unexpected word

            Feb 23 10:03:20
            NOTICE
            [29012] pbx_ael.c:

            AEL load process: parsed config file name ‘/etc/asterisk/extensions.ael’.

  • Nrivera

    hola christian yo tambien soy nuevo en esto de asterisk y me gustaria saber si se tiene que reemplazar todo el archivo de extensiones, o solo se agrega al final este codigo? gracias

    • Hola,

      El archivo de override debería estar vacio. Si no lo está, simplemente
      colócalo al final del mismo.

      El override lo que hace es que le da preferencia a los macros y contextos
      sque se llamen igual en los archivos originales. Precisamente, su objetivo
      es “sobreescribir” a los originales sin que te afecte el resto.

      Saludos,

      • Nrivera

        gracias por tu respuesta christian, pero me refiero al que tiene extension .ael

        • Ah, así está más claro. Puedes agregarlo al final del AEL, aunque en Elastix
          el AEL no debería tener nada.

  • Daniel consuegra

    Esto es genial, voy a probarlos y les cuento que tal.

    Gracias.

  • Pingback: Asterisk México» Blog Archive » El carrier no siempre tiene la razón()

  • vlass

    Hola Christian Cabrera, soy nuevo en el foro, molestándote, de casualidad tienes los archivos de audio que publicas para este temas, la liga “Link” que pones en otra publicación ya no funciona, quedo en espera de tu respuesta y agradezco de antemano la atención. 

    • vlass

      Hola de nuevo, perdon los acabo de encontrar al final, sorry. Todo por no terminar de leer, saludos!!

  • Luis Alberto Tapia

    Gracias por esta valiosa aportación Christian. 
    He intentado implementar tu script en un Elastix 2.2 pero en el cli del Elastix no aparece la opción de extension reload. En un comentario anterior veo que dicen que en esta versión ya no existe y lo que se tiene que recargar es el dialplan reload para aplicarlo. ¿Es correcto esto? lo hice de esta forma, pero sin éxito.

    Por otro lado, mencionas que el archivo override debería de estar vacío, pero no lo está puse el script hasta el final del archivo como lo sugieres.

    Sabrás tú si por la versión del Elastix, podría estar faltando algo más?

    Saludos,

    • Luis,

      En efecto, para Elastix 2.2 ya hay mucha diferencia. Dado que ahora se usa Asterisk 1.8 lo correcto es “dialplan reload”. El archivo override ya NO viene vacio porque el propio Elastix lo utiliza para sus propios asuntos, asi que no hay problema.

      Lo que si deberia importar es que cuando consultes el plan de llamadas con “dialplan show”, te aparezca el contexto que acabas de poner para reemplazarlo y no el anterior.

      Saludos,

      • Andres Vargasd

        Hola Chistian,

        tengo elastix 2.3 y cambie los datos que indicas pero no funcion y elastix no trae sus propios asuntos, sigue con e mismo mensaje, sabes que debo hacer?? o como lo debo hacer?

  • Saludos; he probado el código pero no me funciona, tengo Elastix 2.4, alguna sugerencia.

    • Aldo,

      Probablemente el error es que ahora los Macros se manejan con Gosub. Prueba cambiando esta linea:

      exten => s,n,Macro(outmessage,${HANGUPCAUSE})

      Por esta otra:

      exten => s,n,Macro(outmessage,~~s~~,1(${HANGUPCAUSE}))

      A ver si eso resuelve tu problema.

      Hoy implementé esto con un cliente y fue el cambio que tuve que hacerle.

      Saludos,

  • Pingback: Asterisk México» Blog Archive » Versión mejorada del mensaje “all circuits are busy” de Elastix (v4)()

  • ~buenas tardes, me gustaria saber como puedo implementar las grabaciones descargadas en el ultimo enlace en mi central elastix 2.4.0, ya he grabado estos mensajes en espanol latino con voz de mujer (mas adelante comparto el link con los mismos para quienes deseen) gracias de antemano por la respuesta

  • Pingback: Prueba de Post | The IT Blog()

  • Luis Alberto Tapia

    ¿Esta solución también sirve para usarse con un R2 modificado? (E1 de Telmex)

  • Freddy Aburto

    Funciona con versiones anteriores, pero no con Elastix 2.4