9.8 KiB
Starface Modul – Busylight Webhook (Neuaufbau)
Übersicht
Dieses Modul sendet bei jedem Anruf-Event einen HTTP-Request an den Busylight-Server. Damit zeigen die Türschilder automatisch den Telefonstatus an.
Ablauf: Anruf startet → Starface → HTTP GET → Busylight-Server → WLED wird rot Ablauf: Anruf endet → Starface → HTTP GET → Busylight-Server → WLED zurück auf Normal
Voraussetzungen
- Starface mit Modulcreator-Lizenz
- Busylight-Server erreichbar unter
http://100.95.224.14:8081 - Durchwahlen im Busylight-Portal bei den Benutzern eingetragen
Neues Modul erstellen
Schritt 1: Modul anlegen
- Starface Admin → Module → Modulcreator
- Neues Modul erstellen
- Tab Module Settings:
- Name:
Busylight Webhook - Version:
1 - Vendor:
cynfo GmbH
- Name:
Schritt 2: GUI-Tab – Einstellungen definieren
- Tab GUI öffnen
- Ein neues Textfeld anlegen:
- Variable-Name:
GUI_WEBHOOK_URL - Typ: String
- Standardwert:
http://100.95.224.14:8081 - Label/Beschreibung:
Busylight Webhook URL
- Variable-Name:
Das ist die einzige Einstellung die der Admin später pro Instanz konfiguriert.
Schritt 3: Funktion "CallWebhook" erstellen
Diese Funktion baut die URL zusammen und sendet den HTTP-Request.
- Tab Development
- Links unter Functions auf + klicken → Name:
CallWebhook - Function Settings klicken → Input-Variablen anlegen:
| Name | Typ | Beschreibung |
|---|---|---|
loginId |
String | Durchwahl des Benutzers |
action |
String | callstart oder callend |
-
Zurück zu Edit wechseln
-
Folgende 4 Bausteine nacheinander aus der Components-Sidebar (rechts) in den Edit-Bereich ziehen:
Baustein 1: Append (URL zusammenbauen)
Wo: Components → String → Append
In den Edit-Bereich ziehen. Dann konfigurieren:
- Input "Strings" (Klick auf das Feld, dann mehrere Werte hinzufügen):
| Nr | Wert | By Reference |
|---|---|---|
| 1 | GUI_WEBHOOK_URL |
✅ Ja (Referenz auf die Modul-Variable) |
| 2 | / |
❌ Nein (fester Text) |
| 3 | loginId |
✅ Ja (Referenz auf Input-Variable) |
| 4 | / |
❌ Nein (fester Text) |
| 5 | action |
✅ Ja (Referenz auf Input-Variable) |
- Output "result" → wird automatisch erzeugt, z.B.
http://100.95.224.14:8081/222/callstart
Baustein 2: CreateHttpUrlWithParams (URL-Objekt erstellen)
Wo: Components → Net.HTTP → CreateHttpUrlWithParams
In den Edit-Bereich ziehen (unter den Append). Konfigurieren:
- Input "url":
result→ ✅ By Reference (Output vom Append-Baustein) - Alle anderen Inputs leer lassen (keine Query-Parameter nötig)
- Output "httpUrl" → wird automatisch erzeugt
Baustein 3: HttpRequest (HTTP-Request absenden)
Wo: Components → Net.HTTP → HttpRequest
In den Edit-Bereich ziehen (unter CreateHttpUrlWithParams). Konfigurieren:
- Input "httpUrl":
httpUrl→ ✅ By Reference (Output von CreateHttpUrlWithParams) - Input "method":
GET→ ❌ Fester Text - Alle anderen Inputs (body, headers, timeout) leer lassen
- Output brauchen wir nicht
Baustein 4: Log (zum Debuggen)
Wo: Components → System → Log
In den Edit-Bereich ziehen (unter HttpRequest). Konfigurieren:
- Input "Log level":
INFO(fester Text) - Input "Message" (mehrere Werte):
| Nr | Wert | By Reference |
|---|---|---|
| 1 | Busylight: |
❌ Nein (fester Text) |
| 2 | result |
✅ Ja (die URL die aufgerufen wurde) |
Die fertige CallWebhook-Funktion sieht im Editor so aus:
Append([GUI_WEBHOOK_URL, "/", loginId, "/", action]) → result
CreateHttpUrlWithParams(result) → httpUrl
HttpRequest(httpUrl, "GET")
Log("INFO", ["Busylight: ", result])
Schritt 4: Funktion "Call" erstellen
Diese Funktion wird bei jedem Anruf-Event aufgerufen. Sie ermittelt die Durchwahl
und ruft je nach Status CallWebhook mit callstart oder callend auf.
- Links unter Functions auf + klicken → Name:
Call - Function Settings → Input-Variablen anlegen:
| Name | Typ | Beschreibung |
|---|---|---|
UCI_CALL |
UCI_CALL | By Reference ✅ – Das Anruf-Objekt |
USER_ACCOUNT |
STARFACE_USER | By Reference ✅ – Der betroffene User |
- Zurück zu Edit und folgende Bausteine einfügen:
Baustein 1: Call.getCallInformations
Wo: Components → Call → Call.getCallInformations
- Input "call":
UCI_CALL→ ✅ By Reference - Outputs die wir brauchen:
uciCallState(String) – Der Anruf-StatusuciCalledNumber(String) – Die angerufene Nummer
Baustein 2: ResolveUserData (Benutzerdaten holen)
Wo: Components → STARFACE → ResolveUserData
- Input "accountId":
USER_ACCOUNT→ ✅ By Reference - Output den wir brauchen:
loginId(String) – Die Login-ID / Durchwahl des Users
Baustein 3: IsUser (Prüfen ob es ein echter User ist)
Wo: Components → STARFACE → IsUser
- Input "accountId":
USER_ACCOUNT→ ✅ By Reference - Output:
isUser(Boolean)
Baustein 4: if(!isUser) → exit
Wenn es kein User ist (z.B. eine Gruppe oder Queue), abbrechen.
Wo: Components → Basic Components → if
- Bedingung:
isUser→ is not true (isNotTrueExpression) - Innerhalb des if: exit einfügen (Components → Basic Components → exit)
Baustein 5: switch(uciCallState) – Status-Weiche
Wo: Components → Basic Components → switch
- Variable:
uciCallState→ ✅ By Reference
Dann 3 case-Blöcke hinzufügen (Components → Basic Components → case):
case 'INCOMING'
- Condition:
INCOMING(fester Text) - Innerhalb: CallWebhook aufrufen
- Wo: Links unter Functions →
CallWebhookin den case ziehen loginId=loginId→ ✅ By Reference (Output von ResolveUserData)action=callstart→ ❌ Fester Text
- Wo: Links unter Functions →
case 'OUTGOING'
- Condition:
OUTGOING(fester Text) - Innerhalb: CallWebhook aufrufen
loginId=loginId→ ✅ By Referenceaction=callstart→ ❌ Fester Text
case 'HANGUP'
- Condition:
HANGUP(fester Text) - Innerhalb: CallWebhook aufrufen
loginId=loginId→ ✅ By Referenceaction=callend→ ❌ Fester Text
Die fertige Call-Funktion sieht im Editor so aus:
Call.getCallInformations(UCI_CALL) → uciCallState, uciCalledNumber, ...
ResolveUserData(USER_ACCOUNT) → loginId, firstName, familyName, ...
IsUser(USER_ACCOUNT) → isUser
if(!isUser)
exit
switch(uciCallState)
case 'INCOMING':
CallWebhook(loginId, "callstart")
case 'OUTGOING':
CallWebhook(loginId, "callstart")
case 'HANGUP':
CallWebhook(loginId, "callend")
Schritt 5: Funktion "Register" erstellen
Diese Funktion registriert den Call-Event-Listener wenn das Modul aktiviert wird.
- Links unter Functions auf + klicken → Name:
Register - Einen Baustein einfügen:
Wo: Components → Call → RegisterCallEventByUser (oder ähnlich)
- Dieser registriert die
Call-Funktion als Handler für alle Anruf-Events - Target-Funktion:
Call
Hinweis: Der genaue Baustein heißt je nach Starface-Version anders. Im alten Modul steht er unter "Register" und verweist auf die "Call"-Funktion.
Schritt 6: Funktion "Unregister" erstellen
- Links unter Functions auf + klicken → Name:
Unregister - Einen Baustein einfügen der den Event-Listener wieder abmeldet
Schritt 7: Entry Points setzen
- Tab Module Settings (oder unten im Development-Tab)
- Entry Points / Lifecycle Events konfigurieren:
- InstanceActivated → Funktion
Registeraufrufen - InstanceDeactivated → Funktion
Unregisteraufrufen
- InstanceActivated → Funktion
Schritt 8: Speichern und Installieren
- Save klicken
- Apply klicken
- Modul als
.sfmexportieren (für Backup) - Unter Module → Modulinstanzen → Neue Instanz anlegen
GUI_WEBHOOK_URL=http://100.95.224.14:8081- Aktivieren
Testen
Schnelltest von der Kommandozeile
# Anruf simulieren (Durchwahl 222)
curl http://100.95.224.14:8081/222/callstart
# → Dashboard zeigt "Telefoniert" bei Nicklas Janzen
# Anruf beenden
curl http://100.95.224.14:8081/222/callend
# → Dashboard zeigt normalen Status
Im Starface Modulcreator
- Tab Log File öffnen
- Bei einem Testanruf sollte erscheinen:
INFO: Busylight: http://100.95.224.14:8081/222/callstart
Im Busylight-Portal
- Dashboard: Telefon-Badge wechselt auf "Telefoniert" (rot)
- Protokoll: Einträge mit
phone_activeundphone_end
Zusammenfassung – Alle Funktionen
| Funktion | Zweck | Bausteine |
|---|---|---|
CallWebhook |
URL bauen + HTTP GET senden | Append → CreateHttpUrlWithParams → HttpRequest → Log |
Call |
Anruf-Event verarbeiten | getCallInformations → ResolveUserData → IsUser → if/exit → switch/case → CallWebhook |
Register |
Event-Listener anmelden | RegisterCallEventByUser |
Unregister |
Event-Listener abmelden | UnregisterCallEventByUser |
Fehlerbehebung
Webhook kommt nicht an
- Starface Log File prüfen – steht die URL drin?
- Firewall: Port 8081 vom Starface-Server (192.168.200.251) zum Busylight-Server (100.95.224.14) offen?
- Test:
curl http://100.95.224.14:8081/vom Starface-Server
Falscher User wird rot
loginId= Starface Login-ID = Durchwahl (z.B. 222)- Diese muss im Busylight-Portal unter Benutzer → Durchwahl eingetragen sein
Türschild bleibt rot
- HANGUP-case prüfen – wird
callendgesendet? - Manuell zurücksetzen:
curl http://100.95.224.14:8081/222/callend - Im Busylight-Protokoll prüfen ob
phone_endankommt