Funktion: Custo-Manifest (Rainbow Extensions) – Telefonieereignisse
Lizenz: Alle Lizenzen – Cloud PBX · OmniPCX Enterprise · OXO Connect
Lizenzdetails: PBX-Ereigniserweiterungen sind die einzige „custo-manifest“-Erweiterungsfamilie, die mit einer Essential-Lizenz verfügbar ist.
Anhand dieses Artikels können Sie automatische Aktionen konfigurieren, die durch PBX-Anrufereignisse ausgelöst werden. Sie erfahren, wann die einzelnen Ereignisse ausgelöst werden, welche Felder erforderlich sind und wie Sie den Rainbow-Anrufkontext an Ihren REST-Endpunkt oder Ihr lokales Skript übergeben können.
Übersicht
Mit PBX-Anrufereignissen können Sie automatische Aktionen auslösen, wenn ein Anruf klingelt, angenommen wird oder endet – ganz ohne manuelles Eingreifen. Diese Funktion ist für alle Rainbow-Lizenzen für Unternehmen verfügbar, die mit einer Cloud PBX oder einer Alcatel-Lucent Enterprise-PBX (OmniPCX Enterprise oder OXO Connect) verbunden sind.
Was Sie mit PBX-Anrufereignissen tun können:
- Öffnen Sie automatisch eine CRM-Anwendung (Desktop-App oder Webseite), wenn ein Anruf eingeht oder endet
- Informationen zum Anrufer an eine REST-API übermitteln (Screen-Pop, Anrufprotokollierung, Datenanreicherung)
- Eine Folgeaktion ausführen, wenn der Anruf angenommen oder beendet wird
- Auf ausgehende Anrufe reagieren, um diese zu protokollieren oder einen Workflow auszulösen
Arten von PBX-Anrufereignissen
| Erweiterungspunkt | Wann er ausgelöst wird |
|---|---|
| on-incoming-pbx-call-actions | Ein eingehender Anruf beginnt zu klingeln |
| on-answering-incoming-pbx-call-actions | Der Benutzer nimmt einen eingehenden Anruf entgegen |
| on-releasing-incoming-pbx-call-actions | Ein eingehender oder ausgehender Anruf wird beendet |
| Aktionen bei ausgehenden PBX-Anrufen | Der Benutzer tätigt einen ausgehenden Anruf |
| on-makecall-insert-correlator | Bei jedem Anrufaufbau – fügt einen Korrelator ein (nur OXE) |
Konfiguration einer PBX-Ereignisaktion
Das „custo-manifest“ ist ein JSON-Objekt mit folgender Struktur:
{
"version": "2",
"jsonType": "Rainbow-custo-manifest",
"extension-points": {
"<EXTENSION-POINT-KEY>": [
{
"name": "...",
"command": {
"url": "...",
"params": "...",
"commandType": "rest",
"method": "GET"
},
"icon": "...",
}
]
}
}Globale Regeln:
- Die Version muss „2“ lauten.
- „jsonType“ muss „Rainbow-custo-manifest“ lauten. Innerhalb einer ZIP-Datei gibt dieses Feld an, welche JSON-Datei das Manifest ist.
- Jeder Schlüssel unter „extension-points“ ist ein Array – maximal 3 Aktionen pro Erweiterungspunkt.
- Jede Aktion enthält mindestens einen Namen (bei Ereignissen ist dieser optional) und ein gültiges Befehlsobjekt.
Aktionsfelder
| Feld | Position | Beschreibung |
|---|---|---|
| name | root | Angezeigter Text (Titel der Schaltfläche/des Widgets, Menübezeichnung). Je nach EP obligatorisch. |
| Symbol / Symbol-ID | root | Schaltflächensymbol (URL, ${custo.path}\... oder integriertes Sprite). Obligatorisch für Symbolschaltflächen. |
| Tooltip | root | Tooltip-Text. Optional. |
| Befehl | root | Befehlsobjekt (siehe §3.2). Immer obligatorisch. |
Das Befehlsobjekt
Das Befehlsobjekt ist stets obligatorisch und enthält mindestens eine URL. Je nach gewähltem `commandType` sind zusätzliche Unterfelder zulässig.
"command": {
"url": "{{server}}/your-endpoint",
"params": "user=${localUser.email}",
"commandType": "rest",
"method": "GET",
"header": ["Authorization: Bearer TOKEN"],
"bodyParameters": { "key": "value" }
}| Feld | Wann es verwendet wird |
|---|---|
| url | Obligatorisch. Anwendungspfad, Web-URL, Datei oder REST-API. |
| params | Optional. Wird bei GET hinter dem „?“ angehängt oder als URL-Parameter angegeben. Variablen sind zulässig. |
| commandType | Optional. Standardwert „rest“. Werte: „rest“, „file“ (abhängig vom EP). |
| method | Optional (nur wenn commandType: „rest“). Werte: „GET“, „POST“. |
| header | Optional (bei REST). Array aus Zeichenfolgen im Format „Header-Name: Wert“, die als HTTP-Header eingefügt werden. |
| bodyParameters | Erforderlich, wenn method: „POST“. Als Body gesendetes JSON-Objekt. Variablen sind zulässig. |
Rainbow-Variablen
$Variablen werden zur Laufzeit durch ihren tatsächlichen Wert ersetzt. Sie können in „command.url“, „command.params“, „command.bodyParameters“ sowie in den an die Erweiterung zur Anzeige zurückgegebenen Inhalten vorkommen.
Syntax
${object.attribute}
${object.attribute.regex(pattern)}
${object.attribute.regex(pattern, replacement)}Verfügbare Objekte und Attribute
Rainbow-Benutzer (ME)
${localUser.firstName} ${localUser.lastName}
${localUser.email} ${localUser.canonicalNumber}
${localUser.phoneNumber} ${localUser.internalNumber}
${localUser.phonePbx} ${localUser.nickname}
${localUser.loginEmail} ${localUser.id}Anrufer
${caller.firstName} ${caller.lastName} ${caller.phoneNumber}Angerufener
${called.phoneNumber}Anrufkontext
${call.callId}
${call.globalCallId} (nur OXE)
${call.correlator}Kontakt (sofern identifiziert)
${kontakt.firstName} ${kontakt.lastName}
${kontakt.phoneNumber} ${kontakt.email}
${contact.unternehmen} ${contact.workNumber}
${contact.mobileNumber} ${contact.personalNumber}
${contact.personalMobile}
${contact.tags} (verkettet, durch Kommas getrennt)Kompatibilität – PBX-Anrufereignisse
| Erweiterungspunkt | Zulässige Variablenobjekte |
|---|---|
| Ereignisse bei ausgehenden Anrufen | localUser, called, call, Kontakt |
| Eingehende Anrufereignisse (Eingang / Annahme / Veröffentlichung) | localUser, Anrufer, Angerufener, Anruf, Kontakt |
Regex-Modifikator
Wendet vor der Substitution einen Regex-Ausdruck auf den Wert der Variablen an:
// Eine Nummer normalisieren – +33 oder +1 durch 0 ersetzen
"params": "pbx=${localUser.phonePbx.regex(^\+33|^\+1, 0)}"
// E-Mail-Domäne ersetzen
"params": "byEmail=${localUser.email.regex(alcatel.com, al-enterprise.com)}"
// Die letzten 9 Ziffern extrahieren (kein Ersetzen = Extrahieren)
"params": "${called.phoneNumber.regex(.{0,9}$)}"Variable ${time}
Verfügbar an allen Erweiterungspunkten – wird zum Zeitpunkt der Ausführung der Aktion ersetzt.
| Variable | Wert |
|---|---|
| ${time} | Vollständiges Datums- und Zeitformat (ISO 8601, z. B. 2026-05-18T15:30:45.123Z) |
| ${time.year} | Jahr – 4 Ziffern |
| ${time.month} | Monat – 01–12 |
| ${time.day} | Tag – 01–31 |
| ${time.hour} | Stunde — 00–23 |
| ${time.minute} | Minute – 00–59 |
| ${time.second} | Sekunde – 00–59 |
| ${time.millisec} | Millisekunden – 000–999 |
// Erstellen einer Protokoll-ID
"params": "logId=${time.year}-${time.month}-${time.day}_${time.hour}${time.minute}${time.second}"Lokale Ressourcen — ${custo.path}
So verteilen Sie ein Manifest mit lokalen Dateien (Symbole oder Anzeigedateien):
- Verweisen Sie auf jede Ressource als ${custo.path}\\Dateiname.ext
- Packen Sie die Datei „custo-manifest.json“ und die Ressourcendateien in eine ZIP-Datei (das Manifest im Stammverzeichnis)
{
"icon": "${custo.path}\\basketball.png",
"command": {
"commandType": "file",
"url": "${custo.path}\\FileDisplay.txt"
},
"responseType": "markdown"
}Ereignisspezifische Felder
| Feld | Beschreibung |
|---|---|
| „filter“ | „NoShortNumber“ – wird nicht ausgelöst, wenn es sich bei der Anrufernummer um eine Kurzwahlnummer (interne Nummer) handelt |
| „RaiseChangeCall“ | false = nur direkte Anrufe · true = direkte + weitergeleitete Anrufe · „only“ = nur weitergeleitete Anrufe |
Einbinden lokaler Ressourcen (ZIP-Archiv)
Wenn die Aktion auf lokale Dateien (Symbole oder Anzeigedateien) verweist, packen Sie die Datei „custo-manifest.json“ zusammen mit diesen Dateien vor dem Import in ein ZIP-Archiv.
Erforderliche ZIP-Struktur – das Manifest muss sich im Stammverzeichnis befinden:
my-manifest.zip
├── custo-manifest.json
├── icon.png
└── display-content.txtBereitstellung des Manifests
Sobald das Manifest konfiguriert ist, stellen Sie es über die Rainbow-Verwaltungskonsole oder lokal bereit. Siehe „Bereitstellen eines custo-manifest in Rainbow“.
Beispiele für die Konfiguration
Ausführen einer Anwendung oder eines Skripts mit Parametern
Wird nur von Rainbow Desktop unterstützt.
Beispiel 1 – „on-incoming-pbx-call-actions“ führt eine Desktop-Anwendung (z. B. MicroCRM) mit einem Parameter aus „params“ aus (keine Rückgabe):
{
"version": "2",
"jsonType": "Rainbow-custo-manifest",
"extension-points": {
"on-incoming-pbx-call-actions": [
{
"name": "Exec CRM",
"command": {
"url": "C:\\MyApp\\CustoApp\\MicroCRM.exe",
"params": "-number ${caller.phoneNumber}"
}
}
]
}
}Beispiel 2 – „on-incoming-pbx-call-actions“ führt ein Skript (.bat) mit mehreren Parametern aus „params“ aus (keine Rückgabe):
{
"version": "2",
"jsonType": "Rainbow-custo-manifest",
"extension-points": {
"on-incoming-pbx-call-actions": [
{
"name": "BatScript",
"command": {
"url": "C:\\MyApp\\MyApp.bat",
"params": "IN-COMING canNr:${localUser.canonicalNumber} userIntNr:${localUser.internalNumber}
callerNr:${caller.phoneNumber} FN:${caller.firstName} LN:${caller.lastName}
CorData:${call.correlatorData} Hex:${call.hexCorrelatorData}"
}
}
]
}
}Öffnen Sie eine Webseite mit Parametern
Unterstützt von Rainbow Desktop und Rainbow Web.
Beispiel 1 – „on-incoming-pbx-call-actions“ öffnet eine Webseite mit der Anrufernummer als Abfrageparameter (keine Rückgabe):
{
"version": "2",
"jsonType": "Rainbow-custo-manifest",
"extension-points": {
"on-incoming-pbx-call-actions": [
{
"name": "Gelbe Seiten",
"command": {
"url": "https://www.pagesjaunes.fr/annuaireinverse/recherche",
"params": "quoiqui=${caller.phoneNumber}&proximite=0"
}
}
]
}
}Beispiel 2 – „on-incoming-pbx-call-actions“ öffnet eine Webseite, wobei die Nummer des Anrufers direkt in die URL eingebettet ist (keine Rückmeldung):
{
"version": "2",
"jsonType": "Rainbow-custo-manifest",
"extension-points": {
"on-incoming-pbx-call-actions": [
{
"name": "Kontakt-Popup",
"command": {
"url": "http://localhost:3000/contactShow?phone=${caller.phoneNumber}"
}
}
]
}
}Führen Sie einen REST-API-Aufruf mit Parametern aus
Unterstützt von Rainbow Desktop und Rainbow Web – setzt voraus, dass der API-Server auf CORS-Anfragen reagiert.
Beispiel 1 – Wenn der eingehende Anruf beendet wird, erstellt „on-releasing-incoming-pbx-call-actions“ über einen REST-GET-Aufruf mit Parametern in „params“ ein Anrufprotokoll (keine Rückgabe):
{
"version": "2",
"jsonType": "Rainbow-custo-manifest",
"extension-points": {
"on-releasing-incoming-pbx-call-actions": [
{
"name": "GetRestApi",
"command": {
"commandType": "rest",
"method": "GET",
"url": "http://localhost:3000/IncidentManager/CreateCallLog",
"params": "byEmail=${localUser.email}&CustomerContact=${caller.phoneNumber}"
}
}
]
}
}Beispiel 2 – Wenn der eingehende Anruf beendet wird, erstellt „on-releasing-incoming-pbx-call-actions“ über einen REST-POST-Aufruf mit einem JSON-Body (ohne Rückgabe) ein Anrufprotokoll:
{
"version": "2",
"jsonType": "Rainbow-custo-manifest",
"extension-points": {
"on-releasing-incoming-pbx-call-actions": [
{
"name": "PostRestApi",
"command": {
"commandType": "rest",
"method": "POST",
"url": "http://localhost:3000/IncidentManager/EndCallLog",
"bodyParameters": {
"caller": "${contact.phoneNumber}",
"user": "${localUser.email}"
}
}
}
]
}
}