|
|
@@ -0,0 +1,219 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+// Configuración PRTG
|
|
|
+$prtgUrl = 'http://192.168.2.3';
|
|
|
+$username = 'prtgadmin';
|
|
|
+$password = 'Ittec2025!';
|
|
|
+
|
|
|
+// Configuración BD
|
|
|
+$host = 'localhost';
|
|
|
+$port = 3306;
|
|
|
+$database = 'samqa';
|
|
|
+$dbUsername = 'root';
|
|
|
+$dbPassword = 'root';
|
|
|
+
|
|
|
+// Función para hacer peticiones HTTP
|
|
|
+function makeRequest($url, $params) {
|
|
|
+ $queryString = http_build_query($params);
|
|
|
+ $fullUrl = $url . '?' . $queryString;
|
|
|
+
|
|
|
+ echo "[REQUEST] " . date('Y-m-d H:i:s') . " - $fullUrl\n";
|
|
|
+
|
|
|
+ $context = stream_context_create([
|
|
|
+ 'http' => [
|
|
|
+ '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";
|
|
|
+
|
|
|
+?>
|