> ## Documentation Index
> Fetch the complete documentation index at: https://docs.csku.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Device Disconnected

> Event perangkat/channel tidak tersedia

## Pengenalan

Event `device.disconnected` dipicu ketika perangkat atau channel komunikasi menjadi terputus dan tidak tersedia.

<Callout>
  Gunakan event ini untuk mendeteksi downtime channel dan trigger alert.
</Callout>

## Trigger Event

```
Perangkat terputus
       ↓
   Platform CSKU AI
       ↓
   Trigger webhook device.disconnected
       ↓
   HTTP POST → URL Webhook Anda
```

## Struktur Payload

```json theme={null}
{
  "event": "device.disconnected",
  "timestamp": 1738056000,
  "device": {
    "id": "device_abc123",
    "name": "WhatsApp Business Device",
    "channel": {
      "id": "channel_merchant_id",
      "name": "WhatsApp Business",
      "engine": "wa"
    },
    "bisnis": {
      "id": "biz_123",
      "name": "My Business"
    },
    "user": {
      "id": "merchant_456",
      "name": "Merchant Name"
    }
  },
  "status": "disconnected"
}
```

## Deskripsi Field

| Field                   | Tipe    | Deskripsi                               |
| ----------------------- | ------- | --------------------------------------- |
| `event`                 | string  | Identifier event: `device.disconnected` |
| `timestamp`             | integer | Unix timestamp saat event terjadi       |
| `device.id`             | string  | Identifier perangkat unik               |
| `device.name`           | string  | Nama tampilan perangkat                 |
| `device.channel.id`     | string  | Identifier channel                      |
| `device.channel.name`   | string  | Nama channel                            |
| `device.channel.engine` | string  | Tipe engine channel                     |
| `device.bisnis.id`      | string  | ID Bisnis                               |
| `device.bisnis.name`    | string  | Nama bisnis                             |
| `device.user.id`        | string  | ID user merchant                        |
| `device.user.name`      | string  | Nama merchant                           |
| `status`                | string  | Status perangkat: `disconnected`        |

## Use Case

<AccordionGroup>
  <Accordion title="Monitoring Uptime">
    Lacak downtime channel dan hitung metrik ketersediaan.
  </Accordion>

  <Accordion title="Sistem Alert">
    Notifikasi tim segera ketika perangkat menjadi offline.
  </Accordion>

  <Accordion title="Penilaian Dampak">
    Tentukan percakapan mana yang mungkin terpengaruh oleh pemutusan.
  </Accordion>

  <Accordion title="Manajemen Redundansi">
    Otomatis beralih ke channel backup ketika channel utama terputus.
  </Accordion>
</AccordionGroup>

## Implementasi

```javascript theme={null}
app.post('/webhook', async (req, res) => {
  const { event, device } = req.body;
  
  if (event === 'device.disconnected') {
    console.log(`Perangkat ${device.name} sekarang terputus`);
    
    // Update status perangkat
    await db.devices.update(device.id, {
      status: 'disconnected',
      last_disconnected: new Date(req.body.timestamp * 1000)
    });
    
    // Hitung durasi downtime
    const lastConnected = await db.devices.getLastConnected(device.id);
    const downtime = Date.now() - lastConnected;
    
    // Alert tim
    await notifyTeam({
      level: 'critical',
      message: `Perangkat ${device.name} offline`,
      device: device,
      downtime: downtime
    });
    
    // Periksa percakapan aktif
    const activeConvos = await db.conversations.getActiveByChannel(device.channel.id);
    if (activeConvos.length > 0) {
      console.warn(`Peringatan: ${activeConvos.length} percakapan aktif di channel yang terputus`);
    }
  }
  
  res.status(200).send('OK');
});
```

## Strategi Alert

### 1. Notifikasi Segera

```javascript theme={null}
// Kirim alert kritis segera
function notifyTeam(alert) {
  if (alert.level === 'critical') {
    // Kirim ke semua channel
    sendSlack(alert);
    sendEmail(alert);
    sendSMS(alert);
  }
}
```

### 2. Aturan Eskalasi

```javascript theme={null}
// Eskalasi berdasarkan pentingnya perangkat
if (device.channel.engine === 'wa') {
  // WhatsApp itu kritis - eskalasi segera
  await escalateToManagement(alert);
}
```

### 3. Pelacakan Downtime

```javascript theme={null}
// Lacak downtime kumulatif
await db.downtimeLog.create({
  device_id: device.id,
  device_name: device.name,
  disconnected_at: new Date(req.body.timestamp * 1000),
  status: 'ongoing'
});
```

## Praktik Terbaik

<Callout type="warning">
  Pemutusan perangkat dapat berdampak pada pengalaman pelanggan. Bertindak cepat!
</Callout>

1. **Siapkan Alert**
   ```javascript theme={null}
   // Konfigurasi threshold alert
   const ALERT_THRESHOLDS = {
     whatsapp: 'immediate',
     telegram: '5 minutes',
     slack: '15 minutes'
   };
   ```

2. **Monitor Channel Kritis**
   ```javascript theme={null}
   const CRITICAL_CHANNELS = ['wa', 'telegram'];

   if (CRITICAL_CHANNELS.includes(device.channel.engine)) {
     await sendCriticalAlert(device);
   }
   ```

3. **Lacak Dampak**
   ```javascript theme={null}
   // Hitung percakapan yang terpengaruh
   const affectedCount = await db.conversations.countByChannel(device.channel.id);
   console.log(`${affectedCount} percakapan terpengaruh`);
   ```

4. **Dokumentasikan Insiden**
   ```javascript theme={null}
   // Buat record insiden
   await db.incidents.create({
     type: 'device_disconnect',
     device_id: device.id,
     channel: device.channel.name,
     timestamp: new Date(),
     status: 'investigating'
   });
   ```

## Event Terkait

<Card title="Device Connected" icon="wifi" href="/webhooks/events/device-connected">
  Perangkat menjadi online
</Card>
