Skip to main content.

30 Agosto 2007

Google Calendar en Asterisk

Hace no mucho comentábamos el uso de un calendario en webdav para que Asterisk comprobara los días festivos al recibir una llamada y supiera si debía permitir la llamada o saltar directamente al buzón de voz.

En esta entrada vamos a hacer algo parecido pero esta vez usando Google Calendar, el cual nos permite acceder a los eventos mediante una URL que apunta a nuestro calendario en formato Icalendar. Haremos que nuestro Asterisk consulte nuestro Google Calendar para tratar las llamadas entrantes y sepa si debe pasar la llamada, desviarla o saltar al buzón de voz del usuario.

Lo primero que haremos será crear una cuenta en google si no tenemos una. Con esta cuenta podemos crear tantos calendarios como queramos. En este caso crearemos un calendario para marcar los festivos de la empresa. Vamos a obviar los pasos a seguir para crear un calendario y supongamos que ya tenemos un calendario creado para tal efecto.

A la izquierda de la panatalla veremos nuestros calendario entre todos los que tenemos asociados a nuestra cuenta y debajo de ellos un enlace administrar calendarios.

Lista de calendarios

Pinchamos en administrar calendario y en la pantalla que nos sale elegimos el calendario que hayamos creado para marcar los festivos. Ahora tenemos una pantalla en la que podemos editar las propiedades del calendario, compartirlo con otros usuarios…etc. En este caso lo que nos interesa es la sección llamada Dirección Privada.

Dirección Privada

Vemos tres iconos XML ICAL HTML que nos dan acceso a nuestro calendario en diferentes formatos. En este caso lo que nos interesa es el formato ICAL. Guardamos la dirección del enlace al que apunta el icono porque es lo que vamos a usar para leer el calendario.

Una vez creado el calendario solo nos queda marcarlo con diferentes festivos. Podemos simplemente poner Festivo o podemos discriminar más y diferenciar todo lo que queramos. En este howto vamos a diferenciar festivos locales, festivos nacionales y festivos de empresa. Lo que vamos a hacer es crear un evento el día en cuestión, a cualquier hora y de cualquier duración, en el que pongamos estas etiquetas:

festivos

Una vez tenemos el calendario llega el momento de usarlo. Vamos a crear un AGI en ruby que consulte nuestro calendario y devuelva a asterisk una variable SALTO que usaremos en el dialplan.

calendario.rb

  1. #!/usr/bin/ruby
  2. require ‘rubygems’
  3. require ‘icalendar’
  4. require ‘open-uri’
  5. include Icalendar
  6. URL="http://www.google.com/calendar/ical/xxxxxx%40irontec.com/private-XXXXXXXXXXXXXXXXXX/basic.ics"
  7. calendarios = Icalendar.parse(open(URL))
  8. calendario = calendarios[0]
  9. festivo=nil
  10. calendario.events.each do |evento|
  11. if evento.dtstart.yday == Date.today.yday
  12. festivo=evento.summary
  13. break
  14. end
  15. end
  16. #Festivos
  17. if festivo == nil
  18. salto = "laboral"
  19. elsif festivo == "Festivo Irontec"
  20. salto = "festivo-irontec"
  21. elsif festivo == "Festivo Nacional"
  22. salto = "festivo-nacional"
  23. elsif festivo == "Festivo Local"
  24. salto = "festivo-local"
  25. else
  26. salto = "laboral"
  27. end
  28. print("SET VARIABLE SALTO #{salto}")
  29. exit

Una vez hecho esto ya solo tenemos que hacer el tratamiento en el dialplan. Doy por supuesto que ya sabemos hacer esto así que voy a poner una líneas meramente descriptivas:

  1. [entrantes]
  2. exten => 944048182,1,AGI(calendario.rb)
  3. exten =>944048182,n,Goto(${SALTO},s,1)
  4. [laboral]
  5. exten =>  s,1,NoOp(Aqui tratamiento de día laboral)
  6. [festivo-nacional]
  7. exten => s,1,NoOp(Festivo nacional)

Una vez hecho esto ya solo nos queda probarlo para ver que todo esta correcto. Ya tenemos una centralita aún más inteligente que demuestra una vez más que Asterisk está a años luz de las centralitas tradicionales. ¡Bienvenidos a la telefonía del siglo XXI!

Nota -> Siento lo de la indentación y coloreado del código pero wordpress es un mal bicho. Voy a ver si le hago la pelota a uno de mis compañeros del departamento web para que me hackeen un poco el CSS :)

Posted by Iker Sagasti Markina in AGI, Asterisk, Howto

Esta entrada se publicó el Jueves, Agosto 30th, 2007 a las 13:44 y está archivada bajo la categoría AGI, Asterisk, Howto. Puede seguir cualquier comentario a esta entrada a través del feed RSS 2.0 . Puede dejar un comentario, o trackback desde su propio sitio.

5 comentarios to “Google Calendar en Asterisk”

  1. Iñaki Baz says:

    ¡Qué buena! Muy útil y práctica, sip.

    Puestos a ser exageradamente puntillosos se me ocurre que en vez de consultar un único calendario podría consultar también los de cada miembro de la empresa (en caso de que alguien marque su extensión directamente en el IVR).

    Por ejemplo:

    - Un señor llama a la centralita.
    - Se consulta el calendario general de la empresa. Es laboral normal, se continúa.
    - El señor marca (o dice) la extensión o nombre de la persona con la que quiere contactar.
    - Se busca en el calendario personal de esa persona y hoy casualmente tiene una entrada con las etiquetas: “estado:disponible”, “desvio:673123123″.
    - Así que Asterisk en vez de llamar a su extensión SIP le llama al móvil.
    XDDD

    Pero en fin, que es lo que tú dices, ¡¡se puede hacer de tó!!

  2. Jon Bonilla says:

    Iñaki: Eso ya lo tengo pensado y hasta hecho. Hasta un calendario donde se marcan las vacaciones de cada uno y así la centralita te dice que el trabajador esta actualmente de vacaciones y te pasa con otra persona del mismo departamento :)

    Pero como puedes suponer no puedo poner todos los escenarios posibles. A partir de ese script y con un poco de dialplan la imaginación es el límite.

  3. vjr says:

    Muy buenas, ante todo felicitar al personal por el trabajo que está bastante bien. Encontrar buenas guías en castellano es francamente difícil.

    El comentario de Iñaki Baz me parece muy interesante, yo busco algo parecido, os comento.

    La idea sería consultar el calendario en el ldap de la empresa y desviar la llamada al buzón de voz de Asterisk si el destinatario de la llamada no está disponible ya sea por vacaciones, baja o cualquier otra cosa.

    Entiendo que es muy parecido a lo aquí comentáis pero estoy muy verde, no se como se gestiona el buzón de voz, donde se almacenan las grabaciones, en que formato se realizan, etc.

    No se si es mucho pedir pero un howto sobre el tema sería muy interesante. Si estáis muy ocupados os agradecería algún enlace donde se detallen este tipo de cosas preferiblemente en castellano pero si es en inglés no pasa nada.

    Muchas gracias por todo, saludos

  4. ignacio says:

    Hola !
    Estoy intentando implementar pero lo consigo. devuelve “Failed to execute”. Te suena que puede ser?
    un saludo.
    Ignacio

    — Executing [59@via-directa:2] Wait(”IAX2/albir-1″, “2″) in new stack
    — Executing [59@via-directa:3] AGI(”IAX2/albir-1″, “calendario.rb”) in new stack
    — Launched AGI Script /var/lib/asterisk/agi-bin/calendario.rb
    == calendario.rb: Failed to execute ‘/var/lib/asterisk/agi-bin/calendario.rb’: Exec format error
    — AGI Script calendario.rb completed, returning 0
    — Executing [59@via-directa:4] Goto(”IAX2/albir-1″, “$(SALTO)|s|1″) in new stack
    — Goto ($(SALTO),s,1)
    [Nov 18 12:30:49] WARNING[26773]: pbx.c:2450 __ast_pbx_run: Channel ‘IAX2/albir-1′ sent into invalid extension ’s’ in context ‘$(SALTO)’, but no invalid handler
    — Hungup ‘IAX2/albir-1′

  5. Jon Bonilla says:

    ¿Has probado a ejecutar el script desde una línea de comandos?
    ¿Has dado permisos de ejecución al script?
    ¿Has habilitado el AGI debug en asterisk?
    ¿Tienes instalado un intérprete de ruby?

    Aquí estamos para difundir cosas pero este no es el foro adecuado para resolver dudas. Mira un poco el error y si no pregunta en la lista de asterisk-es que estaremos encantados de ayudarte.

    Un saludo

    Jon Bonilla
    Irontec.

Deje un comentario

XHTML: Puede emplear estos tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

2005 © Irontec S.L. :: Powered by Irontec & Wordpress
[ IRONTEC S.L. - C.I.F. B-95274890 ]
[ Ctra. Basurto-Kastrexana nº70 / Enpresaldea ]
[ 48002 - Bilbao - Bizkaia ]