Indicateur pour occupation de salle de réunion 
La salle de réunion du 3ème étage est-elle libre ? Combien de fois avez-vous vous cette question dans votre entreprise ? Sans parler des déplacements vers la-dite salle pour s’apercevoir qu’elle était finalement occupée ! Dans cet article nous vous proposons un système simple à base d’Asterisk afin de gérer l’état d’occupation de la salle et sa supervision sur les téléphones SIP de l’installation.
Principe
Le principe de fonctionnement de notre solution est basé sur l’utilisation de questions/réponses via un menu interactif et de la base de données interne d’Asterisk afin de gérer l’occupation de la salle de réunion. La supervision de l’état de la salle est possible via le menu interactif, mais également par une extension fictive, ainsi, toute personne intéressée par l’état d’occupation de la salle pourra directement avoir celui-ci sur son téléphone, très pratique au secrétariat par exemple.
Fonctionnement
La cinématique de fonctionnement proposée est la suivante:
- une extension du PABX est associée avec la salle de réunion supervisée (la gestion de plusieurs salle serait bien évidemment possible).
- lors de l’appel de cette extension, si la salle de réunion est libre, on demande à l’utilisateur un code de sécurité, permettant de protéger la réservation. Puis on demande pendant combien de temps la salle est réservée (en minutes). Ces deux informations seront stockées dans la base de données interne d’Asterisk.
- la salle est alors réservée, on met à jour l’indicateur fictif permettant la supervision et un appel automatique est crée (dans le spool d’Asterisk) afin de libérer automatiquement la salle en fin de réservation.
- si la réservation doit être modifiée (sortie de la salle ou ajout d’un délai supplémentaire), il est possible de composer de nouveau l’extension, il faudra alors saisir le bon code puis redonner le délai en minute de la réservation. Si on annonce 0 minutes, alors la salle est libre de suite.
- lors d’un appel sur l’extension alors que la salle est occupée, si vous ne disposez pas du code de réservation, l’heure de libération de la salle vous sera annoncée.
- à la fin de la réservation, un appel automatique est déclenché et permet de libérer l’état d’occupation de la salle, ceci afin d’éviter aux occupants d’avoir à libérer celle-ci de façon systématique.
Supervision
Nous avons déjà traité dans un article précédent la supervision des lignes SIP dans Asterisk (voir “Asterisk et la supervision de ligne“). Ici, nous ne supervision pas une ligne au sens téléphonie du terme mais une ressource fictive. Nous utilisons pour cela l’excellent outil développé par Russell Bryant sour la forme d’une fonction nommée DEVSTATE.
Cette fonction n’est pas disponible par défaut (nouvelle fonctionnalité pour la 1.6), il est donc nécessaire de l’installer à partir des sources et de recompiler votre Asterisk. Cette opération est simple et entièrement automatisée à partir du make menuselect. Les sources sont disponibles directement auprès de Digium.
Code
Cette application est principalement basée sur le plan d’appel d’Asterisk, nous avons regroupé les deux fonctions principales que sont le menu interactif et le gestionnaire de libération automatique dans un fichier spécifique.
Plan d’appel
L’insertion de l’application dans votre plan d’appel se fait comme suit:
; ------ MEETING ROOM START
#include conf/meeting-room-status.conf
include => meeting-room
exten => 638,1,Set(_ROOM=room_chicago)
exten => 638,2,Goto(meeting-room,s,1)
; ------ MEETING ROOM END
La variable ROOM contient le nom de la salle qui sera utilisé comme identifiant dans la base de données interne d’Asterisk, mais également pour le positionnement de l’état pour la supervision de la salle sur les téléphones SIP.
Supervision de ligne
La ligne supervisée et représentant l’état d’occupation de la salle de réunion doit être définie comme dans l’exemple suivant:
exten => 638,hint,Custom:room_chicago
Le nom de la salle doit correspondre à celui donné dans la variable ROOM vu précédemment. Dans l’exemple précédent, la ligne a supervisée est la 638, extension que l’on utilisera également pour effectuer les opérations de réservation et de consultation sur cette salle. C’est le numéro qu’il faudra utiliser pour la supervision de la ligne à partir d’un téléphone SIP.
Installation
A partir du package disponible en bas de cette page, procédez à l’installation comme suit:
- copier le répertoire sounds/meeting-room dans /var/lib/asterisk/sounds de votre installation
- copier le répertoire conf dans /etc/asterisk, il contient le fichier du plan d’appel meeting-room-status.conf
- copier le script agi/meeting-clean-at.sh dans le répertoire /var/lib/asterisk/agi-bin de votre installation. Ce script permet de créer l’appel automatique qui libérera la salle à la date fixée lors de la réservation.
Gestionnaire de salle
Si vous êtes intéressé par la technique, voici le détail du fonctionnement basé sur le fichier de configuration (en format Asterisk::Configure). Le code est volontairement épuré, vous trouverez la version complète dans le répertoire src de l’archive.
Réservation
file meeting-room-status.conf {
context meeting-room {
exten s {
Answer()
GotoIf($[${DEVSTATE(Custom:${ROOM})} = BUSY]?%%RESET%%)
Playback(meeting-room/this_room_free)
Playback(meeting-room/enter_code_to_lock)
Read(lock,,8,1)
Set(DB(meeting-room-reservation/${ROOM}/lock)=${lock})
%%RESERVE%% Playback(meeting-room/minutes_room)
Read(min,,3,,1)
GotoIf($[${min} == 0]?%%CLEAN%%)
Set(DB(meeting-room-reservation/${ROOM}/endtime)=
${MATH(${EPOCH}+${MATH(${min}*60,i)},i)})
System(/var/lib/asterisk/agi-bin/meeting-clean-at.sh ${ROOM}
${STRFTIME(${DB(meeting-room-reservation/${ROOM}/endtime)},,%m%d%H%M)}
${lock})
Playback(meeting-room/you_reserve_room_until)
DateTime(${DB(meeting-room-reservation/${ROOM}/endtime)},,R)
Set(DEVSTATE(Custom:${ROOM})=BUSY)
Hangup()
Cette partie permet de réserver la salle. Tout d’abord on vérifie que celle-ci est bien libre, puis on demande le code de sécurité (lock) et enfin le délai de réservation en minutes (min). On stocke dans la base de données le code ainsi que la date de fin de la réservation, celle-ci est calculée à partir de la date actuelle et augmentée du nombre de minute contenue dans min.
On appelle le script meeting-clean-at.sh qui va préparer l’appel de libération de la salle. On utilise pour cela les fichiers .call et prenant soin de changer la date du fichier, ainsi Asterisk n’exécutera cet appel qu’au bon moment.
On annonce à l’utilisateur l’heure de fin de réservation et enfin on positionne l’état de l’indicateur de salle à occupé, ainsi tous les téléphones qui supervisent cet indicateur seront avertis.
Consultation ou modification de la réservation
%%RESET%% Playback(meeting-room/room_busy)
Playback(meeting-room/consult_code)
Playback(beep)
Read(lock,,8,1)
GotoIf($["${lock}" != "${DB(meeting-room-reservation/${ROOM}/lock)}"]
?%%BADCODE%%:%%RESERVE%%)
Hangup()
%%BADCODE%% Playback(meeting-room/room_reserved_until)
DateTime(${DB(meeting-room-reservation/${ROOM}/endtime)},,R)
Hangup()
Si la salle est réservée, alors l’appel aboutit sur l’étape RESET: il est nécessaire de fournir le code de sécurité, si celui-ci est correct, il est alors possible de modifier sa réservation via le menu détaillé précédemment. En revanche, si le code n’est pas correct, on fournira la date de fin de réservation (étape BADCODE).
Libération automatique
exten clean-room {
GotoIf($["${lock}" != "${DB(meeting-room-reservation/${ROOM}/lock)}"]
?%%RCLEAN%%)
GotoIf($[${DEVSTATE(Custom:${ROOM})} != BUSY]?%%RCLEAN%%)
GotoIf($[${MATH(${EPOCH}+60)}>
${DB(meeting-room-reservation/${ROOM}/endtime)}]
?%%CLEAN%%)
Hangup()
%%CLEAN%% Set(DEVSTATE(Custom:${ROOM})=NOT_INUSE)
Set(foo=${DB_DELETE(meeting-room-reservation/${ROOM}/endtime)})
Set(foo=${DB_DELETE(meeting-room-reservation/${ROOM}/lock)})
System(rm -f /var/spool/asterisk/outgoing/call-meetingroom-${ROOM}-${lock}-*)
%%RCLEAN%% Hangup()
}
L’appel automatique est abouté sur le contexte clean-room qui va automatiquement libérer la salle après vérification du code de sécurité et de la date. Si la date de libération n’est pas encore atteinte, cas d’une modification de celle-ci par les occupants de la salle, alors aucune action n’est prise. Si la date et le code sont corrects, alors on supprime les informations dans la base de données et on remet l’état fictif de supervision à une valeur normale, ainsi les postes supervisant cette salle seront informés qu’elle est redevenue libre.
Téléchargement
Le fichier archive de cette application est disponible en téléchargement ici. Si cette application vous à rendu service ou inspiré, faites le nous savoir.
Conclusion
Cette petite application simple permet de mettre en lumière l’utilisation des indicateurs fictifs d’état qui seront inclus dans la version 1.6 d’Asterisk mais également l’utilisation de la base de données interne et des appels automatiques. Son utilisation pourra bien sûr être détournée à des usages différents.
|
Posté par: Alexandre Chauvin-Hameau, le 27/09/2007 Trackback | Popularité: 33% marqué 1.4, 1.6, asterisk, BLF, CTI, database, extensions.conf et SIP |
|






