busylight_modular/docs/starface-modul-anleitung.md

346 lines
9.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
1. Starface Admin → **Module****Modulcreator**
2. **Neues Modul erstellen**
3. Tab **Module Settings**:
- **Name**: `Busylight Webhook`
- **Version**: `1`
- **Vendor**: `cynfo GmbH`
---
### Schritt 2: GUI-Tab Einstellungen definieren
1. Tab **GUI** öffnen
2. Ein neues Textfeld anlegen:
- **Variable-Name**: `GUI_WEBHOOK_URL`
- **Typ**: String
- **Standardwert**: `http://100.95.224.14:8081`
- **Label/Beschreibung**: `Busylight Webhook URL`
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.
1. Tab **Development**
2. Links unter **Functions** auf **+** klicken → Name: `CallWebhook`
3. **Function Settings** klicken → **Input-Variablen** anlegen:
| Name | Typ | Beschreibung |
|------|-----|-------------|
| `loginId` | String | Durchwahl des Benutzers |
| `action` | String | `callstart` oder `callend` |
4. Zurück zu **Edit** wechseln
5. 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.
1. Links unter **Functions** auf **+** klicken → Name: `Call`
2. **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 |
3. 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-Status
- `uciCalledNumber` (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 → `CallWebhook` in den case ziehen
- `loginId` = `loginId` → ✅ By Reference (Output von ResolveUserData)
- `action` = `callstart` → ❌ Fester Text
##### case 'OUTGOING'
- Condition: `OUTGOING` (fester Text)
- Innerhalb: **CallWebhook** aufrufen
- `loginId` = `loginId` → ✅ By Reference
- `action` = `callstart` → ❌ Fester Text
##### case 'HANGUP'
- Condition: `HANGUP` (fester Text)
- Innerhalb: **CallWebhook** aufrufen
- `loginId` = `loginId` → ✅ By Reference
- `action` = `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.
1. Links unter **Functions** auf **+** klicken → Name: `Register`
2. 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
1. Links unter **Functions** auf **+** klicken → Name: `Unregister`
2. Einen Baustein einfügen der den Event-Listener wieder abmeldet
---
### Schritt 7: Entry Points setzen
1. Tab **Module Settings** (oder unten im Development-Tab)
2. **Entry Points** / **Lifecycle Events** konfigurieren:
- **InstanceActivated** → Funktion `Register` aufrufen
- **InstanceDeactivated** → Funktion `Unregister` aufrufen
---
### Schritt 8: Speichern und Installieren
1. **Save** klicken
2. **Apply** klicken
3. Modul als `.sfm` exportieren (für Backup)
4. Unter **Module****Modulinstanzen** → Neue Instanz anlegen
5. `GUI_WEBHOOK_URL` = `http://100.95.224.14:8081`
6. **Aktivieren**
---
## Testen
### Schnelltest von der Kommandozeile
```bash
# 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_active` und `phone_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
1. Starface Log File prüfen steht die URL drin?
2. Firewall: Port 8081 vom Starface-Server (192.168.200.251) zum Busylight-Server (100.95.224.14) offen?
3. 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 `callend` gesendet?
- Manuell zurücksetzen: `curl http://100.95.224.14:8081/222/callend`
- Im Busylight-Protokoll prüfen ob `phone_end` ankommt