getConnection();
// 🔥 GROUP TEKNISI
$groupTeknisi = "120363427232707228@g.us";
// ======================
// 🔥 FUNCTION WA
// ======================
if (!function_exists('kirimWA')) {
function kirimWA($target, $pesan) {
if (!$target) return;
$token = "XjC9oSr4jECWG93JQRWf";
$data = [
"target" => $target,
"message" => $pesan,
];
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.fonnte.com/send",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query($data),
CURLOPT_HTTPHEADER => [
"Authorization: $token"
],
CURLOPT_TIMEOUT => 10
]);
curl_exec($curl);
curl_close($curl);
}
}
// ======================
// 🔥 TEST MODE (OPSIONAL)
// ======================
$TEST_MODE = false;
// ======================
// 🔥 AMBIL DATA DARI DATABASE (JOIN HISTORY)
// ======================
$stmt = $conn->query("
SELECT
f.id,
f.name,
f.sn_onu,
f.latitude,
f.longitude,
f.customer_phone,
o.rx_power,
o.voltage,
o.updated_at
FROM ftth_items f
LEFT JOIN (
SELECT h1.*
FROM onu_daily_history h1
INNER JOIN (
SELECT sn, MAX(updated_at) AS max_time
FROM onu_daily_history
WHERE DATE(updated_at) = CURDATE()
GROUP BY sn
) h2
ON h1.sn = h2.sn
AND h1.updated_at = h2.max_time
) o
ON o.sn = f.sn_onu
INNER JOIN item_types it
ON it.id = f.item_type_id
WHERE f.sn_onu IS NOT NULL
AND LOWER(it.name) = 'pelanggan'
");
$dataItems = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($dataItems as $item) {
usleep(200000);
$sn = strtoupper(trim($item['sn_onu']));
$nama = $item['name'];
$lat = $item['latitude'];
$lng = $item['longitude'];
$phone = $item['customer_phone'];
// ======================
// 🔥 AMBIL RX & VOLT DARI DB
// ======================
$rx = isset($item['rx_power']) ? floatval($item['rx_power']) : null;
$volt = isset($item['voltage']) ? floatval($item['voltage']) : null;
if ($rx === null && $volt === null) {
continue;
}
// ======================
// 🔥 STATUS DETEKSI
// ======================
// RX NORMAL = -20 s/d -25.99 dBm
$isRxHighLoss = ($rx !== null && $rx < -25.99); // redaman terlalu besar
$isRxLowLoss = ($rx !== null && $rx > -20.00); // redaman terlalu kecil
$isBadRx = $isRxHighLoss || $isRxLowLoss;
// VOLTAGE NORMAL = 3.20 - 3.29 V
$isVoltLow = ($volt !== null && $volt < 3.20);
$isVoltHigh = ($volt !== null && $volt > 3.29);
$isBadVolt = $isVoltLow || $isVoltHigh;
// ======================
// 🔥 KETERANGAN ANALISA
// ======================
$rxKeterangan = '';
if ($isRxHighLoss) {
$rxKeterangan =
"Redaman terlalu besar (High Loss). Sinyal optik berada di bawah standar perusahaan. Kemungkinan terjadi redaman berlebih pada jalur fiber, sambungan, konektor, splitter, atau kabel mengalami kerusakan.";
} elseif ($isRxLowLoss) {
$rxKeterangan =
"Redaman terlalu kecil (Low Loss). Nilai sinyal optik berada di atas standar perusahaan. Diperlukan pengecekan kualitas distribusi jaringan dan konfigurasi perangkat.";
}
$voltKeterangan = '';
if ($isVoltLow) {
$voltKeterangan =
"Tegangan ONU berada di bawah standar 3.20 - 3.29 Volt. Kemungkinan adaptor lemah, kabel power rusak, atau suplai listrik tidak stabil.";
} elseif ($isVoltHigh) {
$voltKeterangan =
"Tegangan ONU berada di atas standar 3.20 - 3.29 Volt. Diperlukan pengecekan adaptor dan sumber daya listrik.";
}
// ======================
// 🔥 CEK ANTI SPAM LOG
// ======================
$cek = $conn->prepare("
SELECT last_rx, last_voltage
FROM notif_device_log
WHERE sn = ?
");
$cek->execute([$sn]);
$last = $cek->fetch(PDO::FETCH_ASSOC);
$lastRx = $last['last_rx'] ?? null;
$lastVolt = $last['last_voltage'] ?? null;
$isChanged =
round((float)$lastRx, 2) != round((float)$rx, 2) ||
round((float)$lastVolt, 2) != round((float)$volt, 2);
if (!$isChanged) {
continue;
}
// ======================
// 🔥 MAPS
// ======================
$maps = ($lat && $lng)
? "https://www.google.com/maps?q={$lat},{$lng}"
: "-";
// ======================
// 🔥 FORMAT NOMOR
// ======================
$phoneFix = null;
if ($phone) {
$phoneFix = preg_replace('/[^0-9]/', '', $phone);
if (substr($phoneFix, 0, 1) == '0') {
$phoneFix = '62' . substr($phoneFix, 1);
}
}
//$isBadVolt = ($volt !== null && $volt < 3.29);
//$isVoltLow = ($volt !== null && $volt < 3.20);
//$isVoltHigh = ($volt !== null && $volt > 3.29);
//$isBadVolt = $isVoltLow || $isVoltHigh;
// ======================
// 🔥 NOTIFIKASI
// ======================
if ($isBadRx && $isBadVolt) {
// ======================
// PELANGGAN
// ======================
kirimWA(
$phoneFix,
"🚨 *Pemberitahuan Gangguan Layanan Internet*\n\n".
"Yth. {$nama},\n\n".
"Sistem monitoring kami mendeteksi kondisi jaringan dan perangkat internet di lokasi Anda berada di luar standar operasional.\n\n".
"📉 Kualitas Sinyal : ".number_format($rx,2)." dBm\n".
"🔌 Tegangan ONU : ".number_format($volt,2)." V\n\n".
"Gangguan ini berpotensi menyebabkan internet lambat, putus-putus, atau tidak dapat digunakan.\n\n".
"Tim teknis kami telah menerima laporan otomatis dan akan melakukan pengecekan lebih lanjut.\n\n".
"Mohon maaf atas ketidaknyamanan ini.\n\n".
"Terima kasih.\n".
"RockNet NOC"
);
// ======================
// TEKNISI
// ======================
kirimWA(
$groupTeknisi,
"🚨 *ANOMALI RX + VOLTAGE*\n\n".
"👤 Pelanggan : {$nama}\n".
"🔢 SN ONU : {$sn}\n\n".
"📉 RX Power : ".number_format($rx,2)." dBm\n".
"🔌 Voltage : ".number_format($volt,2)." V\n\n".
"📋 Analisa RX :\n".
"{$rxKeterangan}\n\n".
"📋 Analisa Voltage :\n".
"{$voltKeterangan}\n\n".
"📍 Lokasi :\n{$maps}\n\n".
"⚠ PRIORITAS TINGGI\n".
"Perlu pengecekan jalur fiber dan perangkat ONU."
);
}
elseif ($isBadRx) {
kirimWA(
$phoneFix,
"🚨 *Pemberitahuan Gangguan Jaringan*\n\n".
"Yth. {$nama},\n\n".
"Sistem monitoring mendeteksi kualitas sinyal fiber optik di lokasi Anda berada di luar standar operasional.\n\n".
"📉 Nilai Sinyal : ".number_format($rx,2)." dBm\n\n".
"Gangguan ini dapat menyebabkan internet tidak stabil, lambat, atau terputus.\n\n".
"Tim teknis kami telah menerima laporan otomatis dan akan melakukan pengecekan.\n\n".
"Mohon maaf atas ketidaknyamanan ini.\n\n".
"RockNet NOC"
);
kirimWA(
$groupTeknisi,
"🚨 *ANOMALI REDAMAN ONU*\n\n".
"👤 Pelanggan : {$nama}\n".
"🔢 SN ONU : {$sn}\n\n".
"📉 RX Power : ".number_format($rx,2)." dBm\n\n".
"📋 Analisa :\n".
"{$rxKeterangan}\n\n".
"📍 Lokasi :\n{$maps}\n\n".
"🔧 Perlu pengecekan jalur fiber, konektor, splitter dan sambungan."
);
}
elseif ($isBadVolt) {
kirimWA(
$phoneFix,
"⚡ *Pemberitahuan Perangkat Internet*\n\n".
"Yth. {$nama},\n\n".
"Sistem monitoring mendeteksi tegangan perangkat ONU berada di luar standar operasional.\n\n".
"🔌 Tegangan ONU : ".number_format($volt,2)." V\n\n".
"Kondisi ini dapat menyebabkan perangkat restart sendiri, koneksi tidak stabil, atau gangguan layanan internet.\n\n".
"Tim teknis kami telah menerima laporan otomatis dan akan melakukan pengecekan lebih lanjut.\n\n".
"Terima kasih.\n".
"RockNet NOC"
);
kirimWA(
$groupTeknisi,
"⚡ *ANOMALI VOLTAGE ONU*\n\n".
"👤 Pelanggan : {$nama}\n".
"🔢 SN ONU : {$sn}\n\n".
"🔌 Voltage : ".number_format($volt,2)." V\n\n".
"📋 Analisa :\n".
"{$voltKeterangan}\n\n".
"📍 Lokasi :\n{$maps}\n\n".
"🔧 Perlu pengecekan adaptor, kabel power, dan sumber listrik pelanggan."
);
}
// ======================
// 🔥 UPDATE LOG ANTI SPAM
// ======================
$update = $conn->prepare("
INSERT INTO notif_device_log (sn, last_rx, last_voltage, last_sent)
VALUES (?, ?, ?, NOW())
ON DUPLICATE KEY UPDATE
last_rx = VALUES(last_rx),
last_voltage = VALUES(last_voltage),
last_sent = NOW()
");
$update->execute([$sn, $rx, $volt]);
if (!$isChanged) {
echo "⏭ SKIP $sn | Tidak ada perubahan
";
continue;
}
echo "✅ SENT $sn | RX:$rx | V:$volt
";
}