369 lines
8.9 KiB
PHP
369 lines
8.9 KiB
PHP
<?php
|
|
require_once __DIR__ . '/../config/database.php';
|
|
|
|
set_time_limit(300);
|
|
|
|
$db = new Database();
|
|
$conn = $db->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<br>";
|
|
continue;
|
|
}
|
|
|
|
echo "✅ SENT $sn | RX:$rx | V:$volt<br>";
|
|
} |