[ 'timeout' => 30, 'method' => 'GET' ] ]); $response = @file_get_contents($fullUrl, false, $context); if ($response === false) { $error = error_get_last(); echo "[ERROR] " . date('Y-m-d H:i:s') . " - Error: " . $error['message'] . "\n"; return false; } echo "[SUCCESS] " . date('Y-m-d H:i:s') . " - Respuesta recibida\n"; return $response; } // Función para obtener sensores del grupo SAM function getSAMSensors($prtgUrl, $username, $password) { echo "\n=== CONSULTANDO SENSORES DEL GRUPO SAM ===\n"; $params = [ 'content' => 'sensors', 'output' => 'json', 'columns' => 'objid,lastvalue,parentid', 'filter_group' => 'SAM', 'username' => $username, 'password' => $password ]; $response = makeRequest($prtgUrl . '/api/table.json', $params); if ($response) { echo "\n=== RESPUESTA SENSORES SAM ===\n"; echo $response . "\n"; echo "=== FIN RESPUESTA SENSORES ===\n\n"; return $response; } return false; } // Función para conectar a BD function connectDB($host, $port, $database, $username, $password) { try { $pdo = new PDO("mysql:host=$host;port=$port;dbname=$database;charset=utf8", $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); echo "[DB] Conexión establecida\n"; return $pdo; } catch (PDOException $e) { echo "[ERROR DB] " . $e->getMessage() . "\n"; return false; } } // Matriz de relación sensor -> contador (hardcodeada) $sensorCounterMap = [ //2098 => 1, 2099 => 13, 2123 => 14 ]; // Función para buscar EQUI_COEQ por parentid function getEquiCoeq($pdo, $parentid) { $stmt = $pdo->prepare("SELECT EQUI_COEQ FROM s002v01tequi WHERE JSON_CONTAINS(EQUI_OTCO, JSON_QUOTE(?))"); $stmt->execute([$parentid]); $result = $stmt->fetchColumn(); return $result ?: null; } // Función para buscar lista de CONA_IDCO por EQUI_COEQ function getConaIdcoList($pdo, $equipCoeq) { $stmt = $pdo->prepare("SELECT CONA_IDCO FROM S002V01TCONA WHERE CONA_COEQ = ?"); $stmt->execute([$equipCoeq]); $results = $stmt->fetchAll(PDO::FETCH_COLUMN); return $results ?: []; } // Función para registrar medición function registerMeasurement($pdo, $mediCore, $lastValue) { $stmt = $pdo->prepare(" INSERT INTO s002v01tmedi (MEDI_NULI, MEDI_CORE, MEDI_VALO, MEDI_WSRE, MEDI_HORE) VALUES (1, ?, ?, 1, NOW()) "); return $stmt->execute([$mediCore, $lastValue]); } // Ejecutar recolección echo "=== RECOLECTOR DE MEDICIONES PRTG ===\n"; echo "Fecha: " . date('Y-m-d H:i:s') . "\n"; echo "Servidor PRTG: $prtgUrl\n"; echo "Grupo: SAM\n"; try { // Conectar BD $pdo = connectDB($host, $port, $database, $dbUsername, $dbPassword); if (!$pdo) { throw new Exception("No se pudo conectar a la base de datos"); } // Consultar sensores del grupo SAM $sensorsResponse = getSAMSensors($prtgUrl, $username, $password); if (!$sensorsResponse) { throw new Exception("No se obtuvieron sensores de PRTG"); } $sensors = json_decode($sensorsResponse, true); if (!$sensors || !isset($sensors['sensors'])) { throw new Exception("No se pudo decodificar respuesta de sensores"); } echo "\n=== PROCESANDO SENSORES ===\n"; $processed = 0; $registered = 0; foreach ($sensors['sensors'] as $sensor) { $objid = $sensor['objid']; $parentid = $sensor['parentid']; $lastValueRaw = $sensor['lastvalue_raw'] ?? ''; // Validar lastvalue_raw - si está vacío, usar 0 $lastValue = (empty($lastValueRaw) || trim($lastValueRaw) === '') ? 0 : $lastValueRaw; echo "[SENSOR] Procesando objid: $objid, parentid: $parentid, valor: $lastValue\n"; // 1. Verificar si el sensor está en la matriz if (!isset($sensorCounterMap[$objid])) { echo "[SKIP] Sensor $objid no está en la matriz de relación\n"; $processed++; continue; } $expectedCounter = $sensorCounterMap[$objid]; echo "[MATRIX] Sensor $objid -> Contador esperado: $expectedCounter\n"; // 2. Buscar EQUI_COEQ usando parentid $equipCoeq = getEquiCoeq($pdo, $parentid); if (!$equipCoeq) { echo "[SKIP] No se encontró EQUI_COEQ para parentid: $parentid\n"; $processed++; continue; } echo "[FOUND] EQUI_COEQ: $equipCoeq\n"; // 3. Buscar lista de CONA_IDCO $conaIdcoList = getConaIdcoList($pdo, $equipCoeq); if (empty($conaIdcoList)) { echo "[SKIP] No se encontraron contadores para EQUI_COEQ: $equipCoeq\n"; $processed++; continue; } echo "[FOUND] Contadores disponibles: " . implode(', ', $conaIdcoList) . "\n"; // 4. Verificar si el contador esperado está en la lista if (!in_array($expectedCounter, $conaIdcoList)) { echo "[SKIP] Contador esperado $expectedCounter no está en la lista de contadores del dispositivo\n"; $processed++; continue; } echo "[MATCH] Contador $expectedCounter encontrado en dispositivo\n"; // 5. Registrar medición if (registerMeasurement($pdo, $expectedCounter, $lastValue)) { echo "[SUCCESS] Medición registrada con contador: $expectedCounter\n"; $registered++; } else { echo "[ERROR] No se pudo registrar medición\n"; } $processed++; echo "\n"; } echo "=== RESUMEN ===\n"; echo "Sensores procesados: $processed\n"; echo "Mediciones registradas: $registered\n"; echo "[INFO] Recolección completada\n"; } catch (Exception $e) { echo "[ERROR FATAL] " . date('Y-m-d H:i:s') . " - " . $e->getMessage() . "\n"; } echo "\n=== FIN RECOLECTOR ===\n"; ?>