23.6. Gezielte Ansteuerung der LEDs

DEVICE_STATE()

Wie man über Hints Extensions mit dem Status von SIP-Benutzern verknüpfen kann, haben Sie schon gelernt. Zur Erinnerung:
extensions.confextensions.ael
exten => 21,hint,SIP/21
hint(SIP/21) 21 => {}
Tabelle 23.6. Hints für SIP-Benutzer

Seit Asterisk 1.6 kann man über Hints aber Extensions auch mit dem Status von MeetMe-Konferenzräumen verbinden:
extensions.confextensions.ael
exten => 881,hint,MeetMe:885
exten => 881,1,MeetMe(885)
hint(MeetMe:885) 881 => {
  MeetMe(885);
}
Tabelle 23.7. Hints für MeetMe-Konferenzräume

Der Hint im Beispiel oben schafft die Verknüpfung zwischen der Extension 881 mit dem Status des MeetMe-Konferenzraums 885. Die Nummern sind hier mit Absicht unterschiedlich gewählt; in Wirklichkeit werden sie häufig gleich sein. Man könnte jetzt am Telefon eine Taste mit der Nebenstelle 881 belegen. Dann würde die LED den Status des Konferenzraums anzeigen.
Das aber nur als kleiner Exkurs, da es gerade thematisch passt. Noch interessanter ist, dass man ab Asterisk 1.6 über Hints Extensions auch mit eigenen, virtuellen Geräten assoziieren kann. Die Schreibweise ist fast genauso:
extensions.confextensions.ael
exten => 99,hint,Custom:mein-status
hint(Custom:mein-status) 99 => {}
Tabelle 23.8. Hints für virtuelle Geräte

Den Status dieser Custom Devices kann man ganz frei mit der Funktion DEVICE_STATE()[136] von einer beliebigen anderen Stelle im Dialplan aus festlegen.
Set(DEVICE_STATE(Custom:mein-status)=INUSE);
An ein Telefon, das den Status der Extension abonniert hat, wird dann die jeweilige Benachrichtigung geschickt. Die möglichen Werte und die übliche Anzeige am Telefon sind:
WertBedeutungLED[a]
UNKNOWNunbekannt, nicht angemeldetaus
UNAVAILABLEnicht erreichbaraus
NOT_INUSEfreiaus
INUSEim Gesprächleuchtet dauerhaft
BUSYim Gespräch bzw. besetztleuchtet dauerhaft
RINGINGklingeltblinkt
RINGINUSEim Gespräch und klingelt (anklopfen)blinkt
ONHOLDauf haltenblinkt langsam
INVALIDungültigaus

[a] Die Anzeige hängt vom jeweiligen Endgerät ab.

Tabelle 23.9. Device States

Nach einem Restart von Asterisk, wenn der Status eines Custom-Devices noch nicht gesetzt wurde, hat das Device initial den Status UNKNOWN.
Nachdem ein Telefon über die obige beispielhafte Extension 99 den Status von Custom:mein-status abonniert hat, kann man, um die Funktionsweise zu testen, den Wählplan z. B. um folgenden Code erweitern:
hint(Custom:mein-status) 99 => {}

*91 => {
  Set(DEVICE_STATE(Custom:mein-status)=RINGING);
}
*92 => {
  Set(DEVICE_STATE(Custom:mein-status)=INUSE);
}
*93 => {
  Set(DEVICE_STATE(Custom:mein-status)=NOT_INUSE);
}
*94 => {
  if ("${DEVICE_STATE(Custom:mein-status)}" = "INUSE") {
    Set(DEVICE_STATE(Custom:mein-status)=NOT_INUSE);
  }
  else {
    Set(DEVICE_STATE(Custom:mein-status)=INUSE);
  }
}
Nun können die verschiedenen Device-States getestet werden, z. B. kann man die LED mit *91 blinken oder mit *92 dauerhaft leuchten lassen sowie mit *93 wieder deaktivieren oder mit *94 abwechselnd an- und ausschalten. Ist die Funktionsweise einmal sichergestellt, sind der sinnvollen (oder unsinnigen) Anwendung dieses Features keine Grenzen mehr gesetzt; man könnte damit z. B. anzeigen, ob man gerade als Mitglied in eine Queue eingeloggt ist oder ob der Rasensprenger gerade läuft.
Natürlich taucht der Hint auch in der Ausgabe von core show hints zusammen mit den anderen Hints auf:
*CLI> core show hints 
    -= Registered Asterisk Dial Plan Hints =-
  99@test              : Custom:mein-status  State:InUse         Watchers  0
  21@interne-benutzer  : SIP/21              State:Unavailable   Watchers  0
  22@interne-benutzer  : SIP/22              State:Unavailable   Watchers  0
----------------
- 1 hints registered
Hilfreich ist auch der CLI-Befehl devstate list, mit dem man den Status aller gesetzten Custom-Hints ausgeben kann:
*CLI> devstate list 
---------------------------------------------------------------------
--- Custom Device States --------------------------------------------
---------------------------------------------------------------------
---
--- Name: 'Custom:mein-status'  State: 'INUSE'
---
---------------------------------------------------------------------
---------------------------------------------------------------------
Mit devstate change device state lässt sich der Status vom CLI aus setzen:
*CLI> devstate change Custom:mein-status RINGING
Changing mein-status to RINGING
*CLI> devstate list 
---------------------------------------------------------------------
--- Custom Device States -------------------------------------------
---------------------------------------------------------------------
---
--- Name: 'Custom:mein-status'  State: 'RINGING'
---
---------------------------------------------------------------------
---------------------------------------------------------------------


[136] Die Funktion hieß zeitweilig DEVSTATE(). Damit ist ebenfalls DEVICE_STATE() gemeint. Sie darf allerdings nicht verwechselt werden mit der Applikation DevState() oder anderen Funktionen oder Applikationen ähnlichen Namens, die in den diversen Internet-Foren usw. herumgeistern, auch wenn sie ungefähr das Gleiche bewirken.