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 onu_daily_history 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 // ====================== $isBadRx = ($rx !== null && $rx <= -25.99); $isBadVolt = ($volt !== null && $volt < 3.29); echo "DEBUG $sn | RX:$rx | Volt:$volt
"; if (!$isBadRx && !$isBadVolt) { continue; } // ====================== // 🔥 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 = ($lastRx != $rx || $lastVolt != $volt); 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); } } // ====================== // 🔥 NOTIFIKASI // ====================== if ($isBadRx && $isBadVolt) { kirimWA($phoneFix, "🚨 *Gangguan Jaringan & Perangkat*\n\n" . "Yth. {$nama},\n" . "📉 RX: " . number_format($rx,2) . " dBm\n" . "🔌 Volt: " . number_format($volt,2) . " V\n\n" . "Gangguan pada jaringan & perangkat terdeteksi.\n" . "Estimasi perbaikan ±2 jam.\n\n" . "Mohon maaf 🙏" ); kirimWA($groupTeknisi, "🚨 *DOUBLE ISSUE*\n\n" . "👤 {$nama}\n" . "📉 RX: {$rx} dBm\n" . "🔌 Volt: " . number_format($volt,2) . " V\n\n" . "📡 Gangguan IKR + ONU\n" . "📍 {$maps}\n\n" . "⚠ PRIORITAS TINGGI" ); } elseif ($isBadRx) { kirimWA($phoneFix, "🚨 *Gangguan Jaringan*\n\n" . "Yth. {$nama},\n" . "📉 RX: {$rx} dBm\n\n" . "Terjadi gangguan pada jalur fiber.\n" . "Tim akan segera ke lokasi.\n" ); kirimWA($groupTeknisi, "🚨 *REDAMAN TIDAK NORMAL*\n\n" . "👤 {$nama}\n" . "📉 RX: {$rx} dBm\n" . "📍 {$maps}" ); } elseif ($isBadVolt) { kirimWA($phoneFix, "⚡ *Perangkat Bermasalah*\n\n" . "Yth. {$nama},\n" . "🔌 Volt: " . number_format($volt,2) . " V\n\n" . "Indikasi power tidak stabil.\n" ); kirimWA($groupTeknisi, "⚡ *VOLTAGE TIDAK NORMAL*\n\n" . "👤 {$nama}\n" . "🔌 Volt: " . number_format($volt,2) . " V\n" . "📍 {$maps}" ); } // ====================== // 🔥 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]); echo "✅ SENT $sn | RX:$rx | V:$volt
"; }