busylight_modular/docs/starface-modul-umbau.md

235 lines
7.7 KiB
Markdown
Raw 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 2" → Umbau auf HTTP-Webhook
## Übersicht
Das bestehende Modul "Busylight 2" schreibt Telefonstatus in eine MS SQL Datenbank.
Wir bauen es so um, dass es stattdessen HTTP-Requests an den Busylight-Webhook sendet.
**Vorher:** Starface → MS SQL DB → altes Python-Script → WLED
**Nachher:** Starface → HTTP-Webhook → Busylight-Server → WLED
## Was wir ändern
1. Die Funktion `UpdateDB` durch eine neue Funktion `CallWebhook` ersetzen
2. Die GUI-Variablen vereinfachen (kein DB-Server/User/Passwort mehr)
3. Im switch/case nur noch INCOMING/OUTGOING/CONNECTED → callstart und HANGUP → callend
## Schritt-für-Schritt Anleitung
### Schritt 1: Modul im Modulcreator öffnen
1. Starface Admin → Module → Modulcreator
2. Modul "Busylight 2" öffnen
3. Tab **Development** auswählen
---
### Schritt 2: GUI-Tab anpassen
1. Tab **GUI** öffnen
2. Folgende Felder **löschen** (werden nicht mehr gebraucht):
- GUI_SERVER
- GUI_PORT
- GUI_USERNAME
- GUI_PASSWORT
- GUI_RINGING (brauchen wir nicht für Webhook)
- GUI_RINGBACK
- GUI_PARKED
- GUI_CONFERENCE_ACTIVE
- GUI_LOGIN_LOGOUT
- GUI_MUSICONHOLD_TEST
- GUI_VOICEMAIL_MAIN
- GUI_VOICEMAIL_LINKED
- GUI_CONSULT
- GUI_CONFERENCE_CONSULT
- GUI_CONFERENCE_INACTIVE
- GUI_CCBS
3. **Neues Feld hinzufügen:**
- Name: `GUI_WEBHOOK_URL`
- Typ: String
- Standardwert: `http://100.95.224.14:8081`
- Beschreibung: `URL des Busylight Webhook-Servers (ohne / am Ende)`
4. Die verbleibenden Felder behalten:
- `GUI_INCOMING` = `1` (aktiv)
- `GUI_OUTGOING` = `1` (aktiv)
- `GUI_CONNECTED` = leer (nicht nötig, da INCOMING/OUTGOING schon callstart senden)
- `GUI_HANGUP` = `0` (aktiv, sendet callend)
---
### Schritt 3: Neue Funktion "CallWebhook" erstellen
1. Tab **Development** → Links unter "Functions" auf **+** klicken
2. Name: `CallWebhook`
3. **Function Settings** → Input-Variablen anlegen:
- `loginId` (Typ: String) Die Durchwahl des Users
- `action` (Typ: String) "callstart" oder "callend"
4. In den **Edit**-Bereich wechseln und folgende Bausteine nacheinander einfügen:
#### Baustein 1: Append (URL zusammenbauen)
- Aus **Components****String****Append** in den Edit-Bereich ziehen
- Konfiguration der Input-Variable "Strings" (mehrere Werte):
- Wert 1: `GUI_WEBHOOK_URL` (By Reference ✓ auf die Modul-Variable zeigen)
- Wert 2: `/` (By Reference ✗ fester Text)
- Wert 3: `loginId` (By Reference ✓ auf die Input-Variable der Funktion zeigen)
- Wert 4: `/` (By Reference ✗ fester Text)
- Wert 5: `action` (By Reference ✓ auf die Input-Variable der Funktion zeigen)
- Output: `result` → wird die URL z.B. `http://100.95.224.14:8081/222/callstart`
#### Baustein 2: CreateHttpUrlWithParams (URL-Objekt erstellen)
- Aus **Components****Net.HTTP****CreateHttpUrlWithParams** in den Edit-Bereich ziehen
- Input "url": `result` (By Reference ✓ Output vom Append)
- Output: `httpUrl`
#### Baustein 3: HttpRequest (HTTP-Request senden)
- Aus **Components****Net.HTTP****HttpRequest** in den Edit-Bereich ziehen
- Input "httpUrl": `httpUrl` (By Reference ✓ Output von CreateHttpUrlWithParams)
- Input "method": `GET` (By Reference ✗ fester Text)
- Die anderen Inputs (body, headers etc.) leer lassen
#### Baustein 4: Log (optional, zum Debuggen)
- Aus **Components****System****Log** in den Edit-Bereich ziehen
- Log Level: `INFO`
- Message (mehrere Werte):
- `Busylight Webhook: ` (fester Text)
- `result` (By Reference ✓ die URL die aufgerufen wurde)
**Die fertige Funktion sieht so aus:**
```
CallWebhook(loginId, action):
1. Append([GUI_WEBHOOK_URL, "/", loginId, "/", action]) → result
2. CreateHttpUrlWithParams(result) → httpUrl
3. HttpRequest(httpUrl, "GET")
4. Log("INFO", ["Busylight Webhook: ", result])
```
---
### Schritt 4: Funktion "UpdateDB" löschen
1. Links unter "Functions" die Funktion **UpdateDB** auswählen
2. **Löschen** (X-Button)
---
### Schritt 5: Call-Funktion anpassen
In der Funktion **Call** den `switch(_uciCallState)` Block anpassen:
#### case 'INCOMING' ändern:
- Den alten `UpdateDB(_loginId, GUI_INCOMING)` Aufruf **löschen**
- Stattdessen: **CallWebhook** reinziehen
- `loginId` = `_loginId` (By Reference ✓)
- `action` = `callstart` (By Reference ✗, fester Text)
#### case 'OUTGOING' ändern:
- Den alten `UpdateDB(_loginId, GUI_OUTGOING)` Aufruf **löschen**
- Stattdessen: **CallWebhook** reinziehen
- `loginId` = `_loginId` (By Reference ✓)
- `action` = `callstart` (By Reference ✗, fester Text)
#### case 'CONNECTED' ändern:
- Den alten `UpdateDB` Aufruf **löschen**
- Diesen case kann man auch komplett löschen (INCOMING/OUTGOING decken den Start ab)
- ODER: CallWebhook mit `callstart` einsetzen (schadet nicht, ist idempotent)
#### case 'HANGUP' ändern:
- Den alten `UpdateDB(_loginId, GUI_HANGUP)` Aufruf **löschen**
- Stattdessen: **CallWebhook** reinziehen
- `loginId` = `_loginId` (By Reference ✓)
- `action` = `callend` (By Reference ✗, fester Text)
#### Alle anderen cases löschen:
- case 'RINGING' → **löschen** (wird nicht gebraucht)
- case 'RINGBACK' → **löschen**
- case 'PARKED' → **löschen**
- case 'CONFERENCE_ACTIVE' → **löschen**
- case 'LOGIN_LOGOUT' → **löschen**
- case 'MUSICONHOLD_TEST' → **löschen**
- case 'VOICEMAIL_MAIN' → **löschen**
- case 'VOICEMAIL_LINKED' → **löschen**
- case 'CONSULT' → **löschen**
- case 'CONFERENCE_CONSULT' → **löschen**
- case 'CONFERENCE_INACTIVE' → **löschen**
- case 'CCBS' → **löschen**
#### Ergebnis nach Umbau:
```
switch(_uciCallState):
case 'INCOMING':
CallWebhook(_loginId, "callstart")
case 'OUTGOING':
CallWebhook(_loginId, "callstart")
case 'HANGUP':
CallWebhook(_loginId, "callend")
```
---
### Schritt 6: if-Bedingungen in den cases vereinfachen
Im alten Modul steht vor jedem UpdateDB ein `if(!empty(GUI_xxx))`.
Das kann vereinfacht werden zu einem einzigen Check:
```
case 'INCOMING':
CallWebhook(_loginId, "callstart")
```
Die if-Abfrage ist nicht mehr nötig, da wir keine GUI-Variablen mehr pro Status haben.
Wenn du die if-Abfragen drin lassen willst, ändere sie auf `if(!empty(GUI_WEBHOOK_URL))`.
---
### Schritt 7: Register/Unregister Funktionen
Die Funktionen **Register** und **Unregister** (links unter Functions) bleiben **unverändert**.
Sie registrieren den Call-Event-Listener beim Aktivieren/Deaktivieren des Moduls.
---
### Schritt 8: Speichern und Testen
1. **Save** klicken
2. **Apply** klicken
3. Unter **Module****Modulinstanzen** die Instanz öffnen
4. `GUI_WEBHOOK_URL` auf `http://100.95.224.14:8081` setzen
5. **Aktivieren**
6. Testanruf machen und im Busylight-Dashboard prüfen ob der Telefon-Badge erscheint
---
## Zusammenfassung der Änderungen
| Vorher | Nachher |
|--------|---------|
| UpdateDB → MS SQL Server | CallWebhook → HTTP GET |
| GUI_SERVER, GUI_PORT, GUI_USERNAME, GUI_PASSWORT | GUI_WEBHOOK_URL |
| 16 switch-cases | 3 switch-cases (INCOMING, OUTGOING, HANGUP) |
| SQL: `UPDATE [Users] SET [StatusStarface] = ...` | HTTP: `GET /222/callstart` |
## Fehlerbehebung
### Webhook kommt nicht an
- Log File im Modulcreator prüfen (Tab "Log File")
- Die URL im Log muss so aussehen: `http://100.95.224.14:8081/222/callstart`
- Vom Starface-Server testen: `curl http://100.95.224.14:8081/222/callstart`
### Falscher User wird rot
- `_loginId` prüfen - das ist die Starface Login-ID (= Durchwahl)
- Diese muss im Busylight-Portal unter "Benutzer" → "Durchwahl" eingetragen sein
### Türschild bleibt rot nach Anruf
- HANGUP-Event prüfen - wird `callend` aufgerufen?
- Manuell zurücksetzen: `curl http://100.95.224.14:8081/222/callend`