PDO::ERRMODE_EXCEPTION]); return $pdo->query(" SELECT uid, online, blocked, current_broker, last_seen, brightness, heap, rssi, fw_ver, chip, clock_style, clock_theme, 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') { // ações de frota (broadcast) — não precisam de uid válido $action0 = $_POST['action'] ?? ''; if ($action0 === 'clock_style' || $action0 === 'clock_theme') { $res = pmx_post($_POST); $who = ($_POST['uid'] ?? '') === 'all' ? 'frota toda' : ($_POST['uid'] ?? '?'); if (!empty($res['ok'])) { $msg = "Relógio atualizado ($who)."; $msgOk = true; // guardar estado no MySQL local p/ os dropdowns refletirem try { $pdo = new PDO('mysql:host=localhost;dbname=cagalhao;charset=utf8', 'master', 'master', [PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION]); $col = $action0 === 'clock_style' ? 'clock_style' : 'clock_theme'; $val = $_POST['value'] ?? ''; if (($_POST['uid'] ?? '') === 'all') { $pdo->prepare("UPDATE contadores SET $col=?")->execute([$val]); } else { $pdo->prepare("UPDATE contadores SET $col=? WHERE uid=?")->execute([$val, $_POST['uid']]); } } catch (Throwable $e) { /* estado é cosmético, não falhar por isto */ } } else { $msg = $res['error'] ?? 'Erro'; $msgOk = false; } $qs = $msgOk ? '?ok='.urlencode($msg) : '?err='.urlencode($msg); header("Location: /esp_proxmox.php$qs"); exit; } $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 | Ultimo contacto | Online | Estado | Brilho | Relógio | Ações | Broker |
|---|---|---|---|---|---|---|---|---|
| = h($uid) ?> | = ($d['fw_ver']??'')!=='' ? h($d['fw_ver']) : '—' ?>S3':($ch==='wroom'?' WROOM':''); ?> | = h($last) ?> = $ago ?> |
onlineoffline | bloqueadoaprovado | RBT | V P |