PDO::ERRMODE_EXCEPTION]); return $pdo->query(" SELECT uid, online, blocked, current_broker, last_seen, brightness, heap, rssi, fw_ver, fw_ver, TIMESTAMPDIFF(SECOND, last_seen, NOW()) AS ago_s FROM contadores ORDER BY uid ASC ")->fetchAll(PDO::FETCH_ASSOC); } catch (Throwable $e) { return []; } } function pmx_post(array $data): array { $ch = curl_init(PMX_API); curl_setopt_array($ch,[CURLOPT_RETURNTRANSFER=>true,CURLOPT_POST=>true,CURLOPT_POSTFIELDS=>http_build_query($data),CURLOPT_TIMEOUT=>8]); $r = json_decode(curl_exec($ch),true); curl_close($ch); return $r ?? []; } $msg = ''; $msgOk = true; if ($_SERVER['REQUEST_METHOD'] === 'POST') { $uid = preg_replace('/[^0-9A-Fa-f]/', '', $_POST['uid'] ?? ''); if (!$uid) { $msg = 'UID invalido.'; $msgOk = false; } else { $action = $_POST['action'] ?? ''; try { $pdo = new PDO('mysql:host=localhost;dbname=cagalhao;charset=utf8', 'master', 'master', [PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION]); if ($action === 'approve') { $pdo->prepare("UPDATE contadores SET blocked=0 WHERE uid=?")->execute([$uid]); // sincronizar na VPS $vps = ['http'=>['method'=>'POST','header'=>'Content-Type: application/x-www-form-urlencoded', 'content'=>http_build_query(['action'=>'approve','uid'=>$uid]),'timeout'=>4]]; @file_get_contents('https://web.xpto.ooguy.com/esp_api.php?key=esp_api_xupas_2025', false, stream_context_create($vps)); $msg = "[$uid] aprovado OK"; $msgOk = true; } elseif ($action === 'block') { $pdo->prepare("UPDATE contadores SET blocked=1,online=0 WHERE uid=?")->execute([$uid]); // sincronizar na VPS $vps = ['http'=>['method'=>'POST','header'=>'Content-Type: application/x-www-form-urlencoded', 'content'=>http_build_query(['action'=>'block','uid'=>$uid]),'timeout'=>4]]; @file_get_contents('https://web.xpto.ooguy.com/esp_api.php?key=esp_api_xupas_2025', false, stream_context_create($vps)); $msg = "[$uid] bloqueado OK"; $msgOk = true; } elseif ($action === 'delete') { // CT106 api.py: envia DELETE_CERT via MQTT + apaga CT106 SQLite + apaga VPS SQLite pmx_post(['uid'=>$uid,'action'=>'delete']); // apagar também do CT102 MySQL (esta BD) $pdo->prepare("DELETE FROM contadores WHERE uid=?")->execute([$uid]); $msg = "[$uid] eliminado OK"; $msgOk = true; } else { // cmd, switch_pair, brightness — envia via CT106 api.py (MQTT) $res = pmx_post($_POST); if (!empty($res['ok'])) { $msg = "[$uid] $action OK"; $msgOk = true; } else { $msg = $res['error'] ?? 'Erro'; $msgOk = false; } } } catch (Throwable $e) { $msg = 'Erro BD: '.$e->getMessage(); $msgOk = false; } } $qs = $msg ? ($msgOk ? '?ok='.urlencode($msg) : '?err='.urlencode($msg)) : ''; header("Location: /esp_proxmox.php$qs"); exit; } if (isset($_GET['ok'])) { $msg = htmlspecialchars($_GET['ok']); $msgOk = true; } if (isset($_GET['err'])) { $msg = htmlspecialchars($_GET['err']); $msgOk = false; } $devices = pmx_get(); $title = "ESP Devices — Proxmox"; ob_start(); ?>
Sem dispositivos ou erro a ligar ao broker Proxmox.
| UID | Versão | Versão | Ultimo contacto | Online | Estado | Brilho | Ações | Broker |
|---|---|---|---|---|---|---|---|---|
| = h($uid) ?> | = ($d['fw_ver']??'')!=='' ? h($d['fw_ver']) : '—' ?> | = h($d['fw_ver'] ?? '—') ?> | = h($last) ?> = $ago ?> |
onlineoffline | bloqueadoaprovado |
>
= $bri ?>
|