Selaa lähdekoodia

solucion #2 agrupando por dispositivo

EmilianoOrtiz 1 kuukausi sitten
vanhempi
commit
244d7e2db4
1 muutettua tiedostoa jossa 219 lisäystä ja 0 poistoa
  1. 219 0
      sistema-mantenimiento-back/test_prtg_api.php

+ 219 - 0
sistema-mantenimiento-back/test_prtg_api.php

@@ -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";
+
+?>