connect('127.0.0.1', 6379); $mensajes = $redis->hGetAll('mqtt:mensajes'); foreach ($mensajes as $topic => $datosJson) { $datos = json_decode($datosJson, true); if (!is_array($datos) || !array_key_exists('payload', $datos)) { continue; } $parts = explode('/', (string) $topic); if (count($parts) < 3 || $parts[0] !== 'dispositivo') { continue; } $chipid = $parts[1]; $tipo = $parts[2]; $subtipo = $parts[3] ?? null; $payload = $datos['payload']; if (!isset($estadosRealtime[$chipid])) { $estadosRealtime[$chipid] = [ 'estado' => 'offline', 'ip' => null, 'pines' => [], ]; } switch ($tipo) { case 'state': $estado = strtolower(trim((string) $payload)); $estadosRealtime[$chipid]['estado'] = ($estado === 'online') ? 'online' : 'offline'; break; case 'ip': $estadosRealtime[$chipid]['ip'] = trim((string) $payload); break; case 'valores': if ($subtipo !== null) { $pinEstado = null; $decodedPayload = json_decode((string) $payload, true); if (is_array($decodedPayload) && isset($decodedPayload['valor'])) { $pinEstado = $decodedPayload['valor']; } else { $pinEstado = $payload; } $estadosRealtime[$chipid]['pines'][$subtipo] = strtoupper(trim((string) $pinEstado)); } break; case 'comando': $decodedPayload = json_decode((string) $payload, true); if (is_array($decodedPayload) && isset($decodedPayload['alias'], $decodedPayload['valor'])) { $alias = (string) $decodedPayload['alias']; $valor = strtoupper(trim((string) $decodedPayload['valor'])); $estadosRealtime[$chipid]['pines'][$alias] = $valor; } break; } } } catch (Throwable $e) { // Si Redis no est\xC3\xA1 disponible, devolvemos igualmente la estructura base. } $response = ['dispositivos' => []]; foreach ($dispositivosData as $dispositivo) { if (!is_array($dispositivo)) { continue; } $chipid = $dispositivo['chipid'] ?? null; if (!$chipid) { continue; } $estadoRealtime = $estadosRealtime[$chipid] ?? [ 'estado' => 'offline', 'ip' => null, 'pines' => [], ]; if (($estadoRealtime['estado'] ?? 'offline') !== 'online') { continue; } $puertosDispositivo = $puertosData[$chipid] ?? []; $pines = []; foreach ($puertosDispositivo as $alias => $configPin) { if ($alias === 'update' || !is_array($configPin)) { continue; } $pines[$alias] = [ 'modo' => $configPin['modo'] ?? null, 'estado' => $estadoRealtime['pines'][$alias] ?? null, ]; } $response['dispositivos'][] = [ 'chipid' => (string) $chipid, 'tag' => $dispositivo['tag'] ?? null, 'nombre' => $dispositivo['nombre'] ?? null, 'modelo' => $dispositivo['nombre'] ?? null, 'ciudad' => $dispositivo['ciudad'] ?? null, 'sector' => $dispositivo['sector'] ?? null, 'estado' => $estadoRealtime['estado'], 'ip' => $estadoRealtime['ip'], 'firmware' => $dispositivo['firmware'] ?? null, 'pines' => $pines, ]; } echo json_encode($response, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); exit;